From 3c75ebc4eaa0a76e1a5800f1081742aa72aae20a Mon Sep 17 00:00:00 2001 From: Varsha Kumari Date: Wed, 7 Oct 2026 16:04:07 +0530 Subject: [PATCH 1/6] made kyb widget configurable --- Changelog.md | 6 +++++ package.json | 2 +- .../playground/KybWidgetConfig/Index.vue | 26 ++++++++++++++++--- 3 files changed, 30 insertions(+), 4 deletions(-) diff --git a/Changelog.md b/Changelog.md index d7d08209..243ddf31 100644 --- a/Changelog.md +++ b/Changelog.md @@ -1,6 +1,12 @@ # Changelog ## [Unreleased] +## [3.16.0] - 2026-10-07 +### Changed + +- Added new document type `TaxRegistrationDocument`in kyb widget +- Made all document relatedf ield configurable + ## [3.15.6] - 2026-10-2 diff --git a/package.json b/package.json index 604ef83f..a01b305c 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "entity-developer-dashboard", - "version": "3.15.6", + "version": "3.16.0", "private": true, "scripts": { "serve": "vue-cli-service serve --mode production", diff --git a/src/views/playground/KybWidgetConfig/Index.vue b/src/views/playground/KybWidgetConfig/Index.vue index f3d35cb9..cf217165 100644 --- a/src/views/playground/KybWidgetConfig/Index.vue +++ b/src/views/playground/KybWidgetConfig/Index.vue @@ -63,7 +63,7 @@
- +
@@ -72,7 +72,7 @@
- +
@@ -81,11 +81,20 @@
- +
+
+
+
+ + +
+ {{ kybWidgetConfigUI.collectTaxRegistrationDoc.description }} +
+
@@ -300,6 +309,10 @@ export default { label: "Collect Address Proof Document", description: 'Enable collection of business address verification documents.' }, + collectTaxRegistrationDoc: { + label: "Collect Tax Registration Document", + description: 'Enable collection of the company’s tax registration certificate or equivalent tax document.' + }, collectZkProof: { label: "Enable Zero Knowledge Proof", description: 'Enable businesses to share only proof of their data for enhanced privacy and compliance.' @@ -361,6 +374,7 @@ export default { collectCertOfIncorporationDoc: true, collectPowerOfAttorneyDoc: true, collectAddressProofDoc: true, + collectTaxRegistrationDoc: false, collectZkProof: { enable: false, proofType: "", @@ -409,6 +423,12 @@ export default { throw new Error('Issuer DID is required') } + if (!this.kybWidgetConfigTemp.collectCertOfIncorporationDoc && + !this.kybWidgetConfigTemp.collectAddressProofDoc && + !this.kybWidgetConfigTemp.collectTaxRegistrationDoc) { + throw new Error('Enable at least one company document: Certificate of Incorporation, Address Proof, or Tax Registration Document') + } + if (this.kybWidgetConfigTemp.collectZkProof.enable) { if (!this.kybWidgetConfigTemp.collectZkProof.proofType) { throw new Error('ZK Proof type is required when ZK Proof is enabled') From 60439354822f6089c92a5c77ebdb49cdcc037e82 Mon Sep 17 00:00:00 2001 From: Varsha Kumari Date: Fri, 9 Oct 2026 10:53:38 +0530 Subject: [PATCH 2/6] added configurable company field --- .../playground/KybWidgetConfig/Index.vue | 146 +++++++++++++++++- 1 file changed, 145 insertions(+), 1 deletion(-) diff --git a/src/views/playground/KybWidgetConfig/Index.vue b/src/views/playground/KybWidgetConfig/Index.vue index cf217165..4b5277f2 100644 --- a/src/views/playground/KybWidgetConfig/Index.vue +++ b/src/views/playground/KybWidgetConfig/Index.vue @@ -137,6 +137,39 @@ +
  • +
    + Choose the company information to collect + Select each field you want businesses to provide, then choose whether it is required. +
    +
    +
    +
    +
    +
    + + {{ field.description }} +
    + +
    +
    + Required +
    +
    +
    +
    +
  • + @@ -192,6 +225,19 @@ padding: 15px; } +.company-fields-intro { + padding: 4px 10px; +} + +.company-field-card { + min-height: 145px; +} + +.field-required-control { + align-items: center; + display: flex; +} + .sanction-badge-row { display: flex; flex-wrap: wrap; @@ -365,7 +411,18 @@ export default { accessDenied: false, accessDeniedMsg: '', activeTab: 'Branding', - tabs: ['Branding', 'Document Collection', 'Compliance Checks'], + tabs: ['Branding', 'Document Collection', 'Company Fields', 'Compliance Checks'], + companyFieldDefinitions: [ + { fieldName: 'name', label: 'Company Name', description: 'Registered or legal name of the company.', type: 'text', required: true }, + { fieldName: 'domain', label: 'Company Domain', description: 'Website domain associated with the company.', type: 'text', required: true }, + { fieldName: 'region', label: 'Region', description: 'Region where the company operates.', type: 'text', required: true }, + { fieldName: 'countryOfRegistration', label: 'Country of Registration', description: 'Country where the company is registered.', type: 'country', required: true }, + { fieldName: 'registrationNumberType', label: 'Registration Number Type', description: 'Type of company registration number.', type: 'registration-type' }, + { fieldName: 'registrationNumber', label: 'Registration Number', description: 'Company registration or incorporation number.', type: 'text' }, + { fieldName: 'taxIdType', label: 'Tax ID Type', description: 'Type of company tax identifier.', type: 'tax-id-type' }, + { fieldName: 'taxIdNumber', label: 'Tax ID Number', description: 'Company tax identification number.', type: 'text' }, + { fieldName: 'address', label: 'Company Address', description: 'Registered or operating business address.', type: 'address' } + ], appId: "", app: {}, kybWidgetConfigTemp: { @@ -375,6 +432,14 @@ export default { collectPowerOfAttorneyDoc: true, collectAddressProofDoc: true, collectTaxRegistrationDoc: false, + companyFields: [ + { fieldName: 'name', type: 'text', isMandatory: true }, + { fieldName: 'domain', type: 'text', isMandatory: true }, + { fieldName: 'region', type: 'text', isMandatory: true }, + { fieldName: 'countryOfRegistration', type: 'country', isMandatory: true }, + { fieldName: 'registrationNumber', type: 'text', isMandatory: true }, + { fieldName: 'registrationNumberType', type: 'registration-type', isMandatory: true } + ], collectZkProof: { enable: false, proofType: "", @@ -407,6 +472,56 @@ export default { ...mapMutations('mainStore', ['setKybWidgetConfig']), ...mapActions('mainStore', ['createAppsKybWidgetConfig', 'fetchAppsKybWidgetConfig', 'updateAppsKybWidgetConfig']), + isCompanyFieldSelected(fieldName) { + return this.kybWidgetConfigTemp.companyFields.some(field => field.fieldName === fieldName) + }, + + isCompanyFieldMandatory(fieldName) { + const field = this.kybWidgetConfigTemp.companyFields.find(item => item.fieldName === fieldName) + return Boolean(field && field.isMandatory) + }, + + isCompanyFieldRequiredByDocument(fieldName) { + return (this.kybWidgetConfigTemp.collectCertOfIncorporationDoc && ['registrationNumber', 'registrationNumberType'].includes(fieldName)) || + (this.kybWidgetConfigTemp.collectTaxRegistrationDoc && ['taxIdNumber', 'taxIdType'].includes(fieldName)) + }, + + setCompanyFieldSelected(definition, selected) { + const fields = this.kybWidgetConfigTemp.companyFields.filter(field => field.fieldName !== definition.fieldName) + if (selected) { + const pair = definition.fieldName === 'registrationNumber' ? 'registrationNumberType' : + definition.fieldName === 'registrationNumberType' ? 'registrationNumber' : + definition.fieldName === 'taxIdNumber' ? 'taxIdType' : + definition.fieldName === 'taxIdType' ? 'taxIdNumber' : null + fields.push({ fieldName: definition.fieldName, type: definition.type, isMandatory: this.isCompanyFieldRequiredByDocument(definition.fieldName) }) + if (pair && !fields.some(field => field.fieldName === pair)) { + const pairDefinition = this.companyFieldDefinitions.find(field => field.fieldName === pair) + fields.push({ fieldName: pair, type: pairDefinition.type, isMandatory: this.isCompanyFieldRequiredByDocument(definition.fieldName) }) + } + } else { + const pair = definition.fieldName === 'registrationNumber' ? 'registrationNumberType' : + definition.fieldName === 'registrationNumberType' ? 'registrationNumber' : + definition.fieldName === 'taxIdNumber' ? 'taxIdType' : + definition.fieldName === 'taxIdType' ? 'taxIdNumber' : null + this.kybWidgetConfigTemp.companyFields = fields.filter(field => field.fieldName !== pair) + return + } + this.kybWidgetConfigTemp.companyFields = fields + }, + + setCompanyFieldMandatory(definition, mandatory) { + const fields = this.kybWidgetConfigTemp.companyFields + const pair = definition.fieldName === 'registrationNumber' ? 'registrationNumberType' : + definition.fieldName === 'registrationNumberType' ? 'registrationNumber' : + definition.fieldName === 'taxIdNumber' ? 'taxIdType' : + definition.fieldName === 'taxIdType' ? 'taxIdNumber' : null + fields.forEach(field => { + if (field.fieldName === definition.fieldName || (pair && field.fieldName === pair)) { + field.isMandatory = mandatory + } + }) + }, + handleApiError(error, method = 'GET') { const message = typeof error === 'string' ? error : error?.message || 'Something went wrong'; if (method.toUpperCase() === 'GET' && isAccessDeniedError(error)) { @@ -423,6 +538,35 @@ export default { throw new Error('Issuer DID is required') } + const fields = this.kybWidgetConfigTemp.companyFields || [] + const fieldNames = new Set(fields.map(field => field.fieldName)) + const requiredNames = this.companyFieldDefinitions.filter(field => field.required).map(field => field.fieldName) + if (requiredNames.some(name => !fieldNames.has(name) || !fields.find(field => field.fieldName === name).isMandatory)) { + throw new Error('Company name, domain, region, and country of registration must be collected as required fields') + } + for (const [numberField, typeField] of [['registrationNumber', 'registrationNumberType'], ['taxIdNumber', 'taxIdType']]) { + const number = fields.find(field => field.fieldName === numberField) + const type = fields.find(field => field.fieldName === typeField) + if (Boolean(number) !== Boolean(type) || (number && number.isMandatory !== type.isMandatory)) { + throw new Error(`${numberField} and ${typeField} must be selected together with the same required setting`) + } + } + if (this.kybWidgetConfigTemp.collectCertOfIncorporationDoc && + (!fieldNames.has('registrationNumber') || !fieldNames.has('registrationNumberType') || + !fields.find(field => field.fieldName === 'registrationNumber').isMandatory || + !fields.find(field => field.fieldName === 'registrationNumberType').isMandatory)) { + throw new Error('Certificate of Incorporation collection requires Registration Number and Registration Number Type as required fields') + } + if (this.kybWidgetConfigTemp.collectTaxRegistrationDoc && + (!fieldNames.has('taxIdNumber') || !fieldNames.has('taxIdType') || + !fields.find(field => field.fieldName === 'taxIdNumber').isMandatory || + !fields.find(field => field.fieldName === 'taxIdType').isMandatory)) { + throw new Error('Tax Registration collection requires Tax ID Number and Tax ID Type as required fields') + } + if (!fields.some(field => ['registrationNumber', 'taxIdNumber'].includes(field.fieldName) && field.isMandatory)) { + throw new Error('At least one registration number or tax ID pair must be required') + } + if (!this.kybWidgetConfigTemp.collectCertOfIncorporationDoc && !this.kybWidgetConfigTemp.collectAddressProofDoc && !this.kybWidgetConfigTemp.collectTaxRegistrationDoc) { From 94dd46e50a1e1f1983565bdc10536be70fb8582b Mon Sep 17 00:00:00 2001 From: Varsha Kumari Date: Fri, 9 Oct 2026 10:54:41 +0530 Subject: [PATCH 3/6] updated chnage log --- Changelog.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Changelog.md b/Changelog.md index 243ddf31..f2069205 100644 --- a/Changelog.md +++ b/Changelog.md @@ -6,7 +6,7 @@ - Added new document type `TaxRegistrationDocument`in kyb widget - Made all document relatedf ield configurable - +- Added configurable company fields so businesses are asked to provide only the information selected for verification. ## [3.15.6] - 2026-10-2 From e7761f23fd2cd0375d23fb2848e903cc08e73067 Mon Sep 17 00:00:00 2001 From: Varsha Kumari Date: Sun, 11 Oct 2026 03:41:19 +0530 Subject: [PATCH 4/6] updated the code --- Changelog.md | 3 +- src/views/playground/BusinessDetails.vue | 1 - .../playground/KybWidgetConfig/Index.vue | 37 +++++++++++++++++-- 3 files changed, 35 insertions(+), 6 deletions(-) diff --git a/Changelog.md b/Changelog.md index f2069205..2b1879ee 100644 --- a/Changelog.md +++ b/Changelog.md @@ -7,7 +7,8 @@ - Added new document type `TaxRegistrationDocument`in kyb widget - Made all document relatedf ield configurable - Added configurable company fields so businesses are asked to provide only the information selected for verification. - +- Made compliance check configurable +- Approve and reject button is always visible ## [3.15.6] - 2026-10-2 ### Changed diff --git a/src/views/playground/BusinessDetails.vue b/src/views/playground/BusinessDetails.vue index 3b773021..6eee97f8 100644 --- a/src/views/playground/BusinessDetails.vue +++ b/src/views/playground/BusinessDetails.vue @@ -23,7 +23,6 @@
    diff --git a/src/views/playground/KybWidgetConfig/Index.vue b/src/views/playground/KybWidgetConfig/Index.vue index 4b5277f2..9394c79b 100644 --- a/src/views/playground/KybWidgetConfig/Index.vue +++ b/src/views/playground/KybWidgetConfig/Index.vue @@ -100,11 +100,21 @@
  • +
    +
    +
    + + +
    + +
    +
    +
    - +
    @@ -119,7 +129,7 @@
    - +
    @@ -129,7 +139,7 @@
    - +
    @@ -317,6 +327,7 @@ export default { ...this.kybWidgetConfigTemp, ...this.kybWidgetConfig } + this.normalizeCompanyFields() } this.appId = this.$route.params.appId; @@ -472,8 +483,24 @@ export default { ...mapMutations('mainStore', ['setKybWidgetConfig']), ...mapActions('mainStore', ['createAppsKybWidgetConfig', 'fetchAppsKybWidgetConfig', 'updateAppsKybWidgetConfig']), + normalizeCompanyFields() { + // Older KYB widget configs predate companyFields. An empty array is also + // treated as legacy data because the editor requires the core company + // fields and otherwise presents an unusable all-off configuration. + if (!Array.isArray(this.kybWidgetConfigTemp.companyFields) || this.kybWidgetConfigTemp.companyFields.length === 0) { + this.kybWidgetConfigTemp.companyFields = [ + { fieldName: 'name', type: 'text', isMandatory: true }, + { fieldName: 'domain', type: 'text', isMandatory: true }, + { fieldName: 'region', type: 'text', isMandatory: true }, + { fieldName: 'countryOfRegistration', type: 'country', isMandatory: true }, + { fieldName: 'registrationNumber', type: 'text', isMandatory: true }, + { fieldName: 'registrationNumberType', type: 'registration-type', isMandatory: true } + ] + } + }, + isCompanyFieldSelected(fieldName) { - return this.kybWidgetConfigTemp.companyFields.some(field => field.fieldName === fieldName) + return (this.kybWidgetConfigTemp.companyFields || []).some(field => field.fieldName === fieldName) }, isCompanyFieldMandatory(fieldName) { @@ -588,6 +615,7 @@ export default { async saveConfiguration() { try { this.isLoading = true; + this.normalizeCompanyFields() this.validateField() this.setKybWidgetConfig(this.kybWidgetConfigTemp) await this.createAppsKybWidgetConfig() @@ -604,6 +632,7 @@ export default { async updateConfiguration() { try { this.isLoading = true; + this.normalizeCompanyFields() this.validateField() this.setKybWidgetConfig(this.kybWidgetConfigTemp) await this.updateAppsKybWidgetConfig() From bce98deaaa764f6868ae0d1db6315e4aec26a916 Mon Sep 17 00:00:00 2001 From: Varsha Kumari Date: Sun, 11 Oct 2026 13:05:59 +0530 Subject: [PATCH 5/6] fixed typo error --- Changelog.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Changelog.md b/Changelog.md index 2b1879ee..f8e91ca0 100644 --- a/Changelog.md +++ b/Changelog.md @@ -5,7 +5,7 @@ ### Changed - Added new document type `TaxRegistrationDocument`in kyb widget -- Made all document relatedf ield configurable +- Made all document related field configurable - Added configurable company fields so businesses are asked to provide only the information selected for verification. - Made compliance check configurable - Approve and reject button is always visible From 36f3fd853d61c1813b9df06b39b3b9d0b9db9088 Mon Sep 17 00:00:00 2001 From: vishwas1 Date: Tue, 13 Oct 2026 12:08:17 +0530 Subject: [PATCH 6/6] design fixes of busines widget page --- .../playground/KybWidgetConfig/Index.vue | 642 +++++++++++++----- 1 file changed, 487 insertions(+), 155 deletions(-) diff --git a/src/views/playground/KybWidgetConfig/Index.vue b/src/views/playground/KybWidgetConfig/Index.vue index 9394c79b..f377afc3 100644 --- a/src/views/playground/KybWidgetConfig/Index.vue +++ b/src/views/playground/KybWidgetConfig/Index.vue @@ -16,16 +16,19 @@
    -