From 0bbb30f5023e558a21541c510284deed772a6b60 Mon Sep 17 00:00:00 2001 From: Varsha Kumari Date: Tue, 2 Jun 2026 19:24:19 +0530 Subject: [PATCH 1/6] updated version --- Changelog.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Changelog.md b/Changelog.md index a4b1f59..b2fe1d6 100644 --- a/Changelog.md +++ b/Changelog.md @@ -1,7 +1,7 @@ # Changelog ## [Unreleased] -## [3.9.2] - 2026-06-02 +## [3.10.0] - 2026-06-02 ### Added - Implemetned new role for dashboard access permission From 8ac3c978b6e2170ac237b8f67c720e2835131dfb Mon Sep 17 00:00:00 2001 From: Varsha Kumari Date: Wed, 3 Jun 2026 12:25:52 +0530 Subject: [PATCH 2/6] reverted recent changes --- src/components/settings/UserProfile.vue | 4 - src/components/teams/AdminTeams.vue | 171 +++--------------------- src/config.js | 9 -- src/store/mainStore.js | 1 + 4 files changed, 21 insertions(+), 164 deletions(-) diff --git a/src/components/settings/UserProfile.vue b/src/components/settings/UserProfile.vue index a2f469d..8712f29 100644 --- a/src/components/settings/UserProfile.vue +++ b/src/components/settings/UserProfile.vue @@ -539,10 +539,6 @@ export default { text = "ID Service"; break; } - case config.SERVICE_TYPES.DASHBOARD: { - text = "Dashboard Service"; - break; - } case config.SERVICE_TYPES.QUEST: { text = "Quest Service"; break; diff --git a/src/components/teams/AdminTeams.vue b/src/components/teams/AdminTeams.vue index c95f535..431fac7 100644 --- a/src/components/teams/AdminTeams.vue +++ b/src/components/teams/AdminTeams.vue @@ -180,52 +180,6 @@ - -
- -
-
-
-
{{ eachService.name }}
-
-
{{ group.label }}
-
- - -
-
-
-
-
@@ -384,44 +338,7 @@ const SSI_PREDEFINED_ROLES = [ } ]; -const DASHBOARD_PREDEFINED_ROLES = [ - { - key: "dashboard_viewer", - name: "Viewer", - icon: "mdi-eye-outline", - description: "Read-only access to Dashboard service operations.", - badge: "Read-only", - recommendedFor: "Stakeholders who need Dashboard visibility", - permissions: ["READ_SERVICE"] - }, - { - key: "dashboard_editor", - name: "Editor", - icon: "mdi-pencil-outline", - description: "Access to read and modify Dashboard service configuration.", - badge: "Edit access", - recommendedFor: "Operations or product teams", - permissions: ["READ_SERVICE", "WRITE_SERVICE", "UPDATE_SERVICE", "DELETE_SERVICE"] - }, - { - key: "dashboard_admin", - name: "Admin", - icon: "mdi-shield-star-outline", - description: "Full Dashboard service access.", - badge: "Full access", - recommendedFor: "Dashboard administrators", - permissions: ["ALL"] - }, - { - key: "custom", - name: "Custom Role", - icon: "mdi-tune-variant", - description: "Start with no permissions and configure manually.", - badge: "Advanced", - recommendedFor: "Custom enterprise setups", - permissions: [] - } -]; + export default { name: "AdminTeams", @@ -437,9 +354,6 @@ export default { SSI_PREDEFINED_ROLES() { return SSI_PREDEFINED_ROLES; }, - DASHBOARD_PREDEFINED_ROLES() { - return DASHBOARD_PREDEFINED_ROLES; - }, categorizedServices() { const ssiServices = this.localAllServices.filter(s => s.id === config.SERVICE_TYPES.SSI_API); const idServices = this.localAllServices.filter( @@ -459,25 +373,22 @@ export default { hasSSIService() { return this.localAllServices.some(s => s.id === config.SERVICE_TYPES.SSI_API); }, - hasDashboardService() { - return this.localAllServices.some(s => s.id === config.SERVICE_TYPES.DASHBOARD); - }, + hasIDService() { return this.localAllServices.some( - s => s.id !== config.SERVICE_TYPES.SSI_API && s.id !== config.SERVICE_TYPES.QUEST && s.id !== config.SERVICE_TYPES.DASHBOARD + s => s.id !== + config.SERVICE_TYPES.SSI_API && s.id !== + config.SERVICE_TYPES.QUEST ); }, ssiServices() { return this.localAllServices.filter(s => s.id === config.SERVICE_TYPES.SSI_API); }, - dashboardServices() { - return this.localAllServices.filter(s => s.id === config.SERVICE_TYPES.DASHBOARD); - }, idServices() { return this.localAllServices.filter( - s => s.id !== config.SERVICE_TYPES.SSI_API && - s.id !== config.SERVICE_TYPES.QUEST && - s.id !== config.SERVICE_TYPES.DASHBOARD + s => s.id !== + config.SERVICE_TYPES.SSI_API && s.id !== + config.SERVICE_TYPES.QUEST ); } }, @@ -508,7 +419,6 @@ export default { selectedRoles: { id: 'viewer', ssi: 'auditor', - dashboard: 'custom' } } }, @@ -547,15 +457,7 @@ export default { { label: 'Document', icon: 'mdi-file-document-outline', iconColor: '#92400e', keys: ['READ_DOCUMENT', 'VERIFY_DOCUMENT'] }, { label: 'Compliance', icon: 'mdi-shield-check-outline', iconColor: '#1d4ed8', keys: ['READ_COMPLIANCE'] }, ]; - const DASHBOARD_GROUPS = [ - { label: 'General', icon: 'mdi-star-outline', iconColor: '#6366f1', keys: ['ALL'] }, - { label: 'Dashboard Controls', icon: 'mdi-view-dashboard-outline', iconColor: '#0f766e', keys: ['READ_SERVICE', 'WRITE_SERVICE', 'UPDATE_SERVICE', 'DELETE_SERVICE'] } - ]; - const groupDefs = serviceId === config.SERVICE_TYPES.SSI_API - ? SSI_GROUPS - : serviceId === config.SERVICE_TYPES.DASHBOARD - ? DASHBOARD_GROUPS - : ID_GROUPS; + const groupDefs = serviceId === config.SERVICE_TYPES.SSI_API ? SSI_GROUPS : ID_GROUPS; const assignedKeys = new Set(); const result = []; for (const group of groupDefs) { @@ -596,10 +498,6 @@ export default { const ssiDefault = SSI_PREDEFINED_ROLES.find(r => r.key === 'auditor'); if (ssiDefault) this.selectPredefinedRole(ssiDefault, 'ssi'); } - if (this.hasDashboardService) { - const dashboardDefault = DASHBOARD_PREDEFINED_ROLES.find(r => r.key === 'dashboard_viewer'); - if (dashboardDefault) this.selectPredefinedRole(dashboardDefault, 'dashboard'); - } }, @@ -618,45 +516,25 @@ export default { this.roleModel = { ...role }; this.selectedRoles.id = this.detectSelectedPredefinedRole('id'); this.selectedRoles.ssi = this.detectSelectedPredefinedRole('ssi'); - this.selectedRoles.dashboard = this.detectSelectedPredefinedRole('dashboard'); this.$root.$emit("bv::toggle::collapse", "sidebar-right"); }, - getServiceIdsByType(serviceType) { - if (serviceType === 'ssi') return this.ssiServices.map(s => s.id); - if (serviceType === 'dashboard') return this.dashboardServices.map(s => s.id); - return this.idServices.map(s => s.id); - }, - getAllPermissionKeysForServiceType(serviceType) { - const targetServices = serviceType === 'ssi' - ? this.ssiServices - : serviceType === 'dashboard' - ? this.dashboardServices - : this.idServices; - const keys = new Set(); - targetServices.forEach(service => { - if (!service?.accessList) return; - Object.keys(service.accessList).forEach(key => keys.add(key)); - }); - return Array.from(keys); + getServiceIdsByType(serviceType) { + return (serviceType === 'ssi' ? this.ssiServices : this.idServices).map(s => s.id); }, + detectSelectedPredefinedRole(serviceType) { const serviceIds = new Set(this.getServiceIdsByType(serviceType)); const currentPermissions = (this.roleModel.permissions || []) .filter(p => serviceIds.has(p.serviceType)) .map(p => p.access); const currentSet = new Set(currentPermissions); - const allServicePermissions = new Set(this.getAllPermissionKeysForServiceType(serviceType)); - const roles = serviceType === 'ssi' + const roles = (serviceType === 'ssi' ? SSI_PREDEFINED_ROLES - : serviceType === 'dashboard' - ? DASHBOARD_PREDEFINED_ROLES - : PREDEFINED_ROLES; - const filteredRoles = roles.filter(r => r.key !== 'custom'); + : PREDEFINED_ROLES).filter(r=>r.key !=='custom') if (!currentSet.size) return 'custom'; - const matched = filteredRoles.find(role => { + const matched = roles.find(role => { if (role.permissions.includes('ALL')) { - if (currentSet.has('ALL')) return true; - return Array.from(allServicePermissions).every(access => currentSet.has(access)); + return currentSet.has('ALL'); } if (role.permissions.length !== currentSet.size) return false; return role.permissions.every(p => currentSet.has(p)); @@ -677,20 +555,11 @@ export default { }, buildPermissionsForRole(role, serviceType) { const permissions = []; - const targetServices = serviceType === 'ssi' - ? this.ssiServices - : serviceType === 'dashboard' - ? this.dashboardServices - : this.idServices; + const targetServices = serviceType === 'ssi' ? this.ssiServices : this.idServices; targetServices.forEach(service => { - if (!service?.accessList) return; - if (role.permissions.includes('ALL')) { - Object.keys(service.accessList).forEach(access => { - if (service.accessList[access] !== undefined) { - permissions.push({ serviceType: service.id, access }); - } - }); + if (role.permissions.includes('ALL') && service.accessList.ALL !== undefined) { + permissions.push({ serviceType: service.id, access: 'ALL' }); return; } role.permissions.forEach(access => { @@ -866,7 +735,7 @@ export default { ], "servicePermissions": [] } - this.selectedRoles = { id: 'viewer', ssi: 'auditor', dashboard: 'custom' }; + this.selectedRoles = { id: 'viewer', ssi: 'auditor' }; this.edit = false; }, }, diff --git a/src/config.js b/src/config.js index 3c8f575..fe0f207 100644 --- a/src/config.js +++ b/src/config.js @@ -104,17 +104,8 @@ config['SERVICE_TYPES'] = Object.freeze({ SSI_API: 'SSI_API', CAVACH_API: 'CAVACH_API', QUEST: 'QUEST', - DASHBOARD: 'DASHBOARD', }) -config['DASHBOARD_ACCESS'] = Object.freeze({ - ALL: 'ALL', - READ_SERVICE: 'READ_SERVICE', - WRITE_SERVICE: 'WRITE_SERVICE', - UPDATE_SERVICE: 'UPDATE_SERVICE', - DELETE_SERVICE: 'DELETE_SERVICE', - -}) config['GRANT_TYPES_ENUM'] = Object.freeze({ 'SSI_API': 'access_service_ssi', diff --git a/src/store/mainStore.js b/src/store/mainStore.js index 78464ce..25fd41e 100644 --- a/src/store/mainStore.js +++ b/src/store/mainStore.js @@ -1050,6 +1050,7 @@ const mainStore = { let resp = await RequestHandler(url, 'GET', {}, headers) if (resp) { + resp = resp.filter(x => !(x.id == 'DASHBOARD')) commit('insertAllServices', resp); } else { return null From dbfb3d23f4655122f5ffb34d5f59e954948ff768 Mon Sep 17 00:00:00 2001 From: Varsha Kumari Date: Wed, 3 Jun 2026 13:45:53 +0530 Subject: [PATCH 3/6] added role as sub section --- src/components/teams/AdminTeams.vue | 78 +++++++++++++++++++++++++---- 1 file changed, 68 insertions(+), 10 deletions(-) diff --git a/src/components/teams/AdminTeams.vue b/src/components/teams/AdminTeams.vue index 431fac7..e98e533 100644 --- a/src/components/teams/AdminTeams.vue +++ b/src/components/teams/AdminTeams.vue @@ -114,8 +114,8 @@
{{ eachService.name }}
-
-
{{ group.label }}
+
+
{{ group.label }}
+
+
Dashboard
+
+ + +
+
@@ -161,8 +177,8 @@
{{ eachService.name }}
-
-
{{ group.label }}
+
+
{{ group.label }}
+
+
Dashboard
+
+ + +
+
@@ -197,6 +229,18 @@ import StudioSideBar from "../element/StudioSideBar.vue"; import UtilsMixin from "../../mixins/utils"; import config from "../../config"; +const DASHBOARD_ROLE_SERVICE = { + id: "DASHBOARD", + name: "Dashboard", + accessList: { + ALL: "ALL", + READ_SERVICE: "READ_SERVICE", + WRITE_SERVICE: "WRITE_SERVICE", + UPDATE_SERVICE: "UPDATE_SERVICE", + DELETE_SERVICE: "DELETE_SERVICE" + } +}; + const PREDEFINED_ROLES = [ { key: "viewer", @@ -205,7 +249,7 @@ const PREDEFINED_ROLES = [ description: "Minimal read-only access for business stakeholders.", badge: "Limited view", recommendedFor: "Founders, management, or external auditors", - permissions: ["READ_ANALYTICS", "READ_USAGE", "READ_COMPANY", "READ_COMPLIANCE"] + permissions: ["READ_ANALYTICS", "READ_USAGE", "READ_COMPANY", "READ_COMPLIANCE", "READ_SERVICE"] }, { key: "analyst", @@ -250,7 +294,7 @@ const PREDEFINED_ROLES = [ description: "Full access to manage team, settings, verification, billing, and company account.", badge: "Full access", recommendedFor: "Organization owners / super admins", - permissions: ["READ_VERIFIED_USER", "READ_WIDGET_CONFIG", "WRITE_WIDGET_CONFIG", "UPDATE_WIDGET_CONFIG", "READ_WEBHOOK_CONFIG", "WRITE_WEBHOOK_CONFIG", "UPDATE_WEBHOOK_CONFIG", "DELETE_WEBHOOK_CONFIG", "READ_ANALYTICS", "READ_USAGE", "READ_CREDIT", "READ_COMPANY", "DELETE_COMPANY", "UPDATE_COMPANY_STATUS", "READ_COMPANY_EXECUTIVES", "READ_DOCUMENT", "VERIFY_DOCUMENT", "READ_COMPLIANCE"] + permissions: ["READ_VERIFIED_USER", "READ_WIDGET_CONFIG", "WRITE_WIDGET_CONFIG", "UPDATE_WIDGET_CONFIG", "READ_WEBHOOK_CONFIG", "WRITE_WEBHOOK_CONFIG", "UPDATE_WEBHOOK_CONFIG", "DELETE_WEBHOOK_CONFIG", "READ_ANALYTICS", "READ_USAGE", "READ_CREDIT", "READ_COMPANY", "DELETE_COMPANY", "UPDATE_COMPANY_STATUS", "READ_COMPANY_EXECUTIVES", "READ_DOCUMENT", "VERIFY_DOCUMENT", "READ_COMPLIANCE", "READ_SERVICE", "WRITE_SERVICE", "UPDATE_SERVICE", "DELETE_SERVICE"] }, { key: "custom", @@ -354,6 +398,12 @@ export default { SSI_PREDEFINED_ROLES() { return SSI_PREDEFINED_ROLES; }, + dashboardRoleService() { + return DASHBOARD_ROLE_SERVICE; + }, + dashboardPermissions() { + return ['ALL', 'READ_SERVICE', 'WRITE_SERVICE', 'UPDATE_SERVICE', 'DELETE_SERVICE']; + }, categorizedServices() { const ssiServices = this.localAllServices.filter(s => s.id === config.SERVICE_TYPES.SSI_API); const idServices = this.localAllServices.filter( @@ -378,7 +428,8 @@ export default { return this.localAllServices.some( s => s.id !== config.SERVICE_TYPES.SSI_API && s.id !== - config.SERVICE_TYPES.QUEST + config.SERVICE_TYPES.QUEST && s.id !== + DASHBOARD_ROLE_SERVICE.id ); }, ssiServices() { @@ -388,7 +439,8 @@ export default { return this.localAllServices.filter( s => s.id !== config.SERVICE_TYPES.SSI_API && s.id !== - config.SERVICE_TYPES.QUEST + config.SERVICE_TYPES.QUEST && s.id !== + DASHBOARD_ROLE_SERVICE.id ); } }, @@ -519,7 +571,11 @@ export default { this.$root.$emit("bv::toggle::collapse", "sidebar-right"); }, getServiceIdsByType(serviceType) { - return (serviceType === 'ssi' ? this.ssiServices : this.idServices).map(s => s.id); + const services = serviceType === 'ssi' + ? this.ssiServices + : this.idServices; + const serviceIds = services.map(s => s.id); + return serviceType === 'id' ? [...serviceIds, DASHBOARD_ROLE_SERVICE.id] : serviceIds; }, detectSelectedPredefinedRole(serviceType) { @@ -555,7 +611,9 @@ export default { }, buildPermissionsForRole(role, serviceType) { const permissions = []; - const targetServices = serviceType === 'ssi' ? this.ssiServices : this.idServices; + const targetServices = serviceType === 'ssi' + ? this.ssiServices + : [...this.idServices, DASHBOARD_ROLE_SERVICE]; targetServices.forEach(service => { if (role.permissions.includes('ALL') && service.accessList.ALL !== undefined) { From 02932ca9566f6c2e6e86b0dc47eb2460af65a4c6 Mon Sep 17 00:00:00 2001 From: Varsha Kumari Date: Wed, 3 Jun 2026 18:34:52 +0530 Subject: [PATCH 4/6] fixed issue of getting error while updating did --- src/store/mainStore.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/store/mainStore.js b/src/store/mainStore.js index 25fd41e..c29c624 100644 --- a/src/store/mainStore.js +++ b/src/store/mainStore.js @@ -1877,7 +1877,7 @@ const mainStore = { .then(response => response.json()).then(json => { if (json) { if (json.error) { - return reject(new Error(json.error?.details.join(' ') || json.error.join(' '))) + return reject(new Error(JWTExpiredErrorMessageHandling(json))) } else { commit('setKybWidgetConfig', json.data); return resolve() @@ -3105,7 +3105,7 @@ const mainStore = { "Origin": '*' } } - fetch(url, { + return fetch(url, { ...options }) }) From a381487757ee9d1028bf34e7b13cdb5fe63b3cab Mon Sep 17 00:00:00 2001 From: Varsha Kumari Date: Wed, 3 Jun 2026 18:36:29 +0530 Subject: [PATCH 5/6] added change log --- Changelog.md | 4 ++++ package.json | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/Changelog.md b/Changelog.md index b2fe1d6..8f9f610 100644 --- a/Changelog.md +++ b/Changelog.md @@ -1,6 +1,10 @@ # Changelog ## [Unreleased] +## [3.10.2] - 2026-06-03 + +### Fixed +- Fixed error occuring while registering did using update ## [3.10.0] - 2026-06-02 ### Added diff --git a/package.json b/package.json index 1f3ae8c..4f190ae 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "entity-developer-dashboard", - "version": "3.10.0", + "version": "3.10.2", "private": true, "scripts": { "serve": "vue-cli-service serve --mode production", From ed79054c25e4c7b5983dd7974c51e883994933f9 Mon Sep 17 00:00:00 2001 From: varsha <91577031+varsha766@users.noreply.github.com> Date: Thu, 4 Jun 2026 11:39:25 +0530 Subject: [PATCH 6/6] Fix bug (#188) * fixed usage page bug * updated chnage log --- Changelog.md | 2 ++ src/store/mainStore.js | 20 +++++++++++++++----- 2 files changed, 17 insertions(+), 5 deletions(-) diff --git a/Changelog.md b/Changelog.md index cabd5c4..c1dabc2 100644 --- a/Changelog.md +++ b/Changelog.md @@ -6,6 +6,8 @@ ### Fixed - Fixed error occuring while registering did using update +- Fixed issue of undefined getting passed as appId +- Fixed issue of token is not getting re-generated in usage page ## [3.10.0] - 2026-06-02 ### Added diff --git a/src/store/mainStore.js b/src/store/mainStore.js index c29c624..2b521ee 100644 --- a/src/store/mainStore.js +++ b/src/store/mainStore.js @@ -2393,7 +2393,7 @@ const mainStore = { }) }) }, - async fetchUsageForASSIService({ getters }, payload) { + async fetchUsageForASSIService({ getters, dispatch }, payload) { const { startDate, endDate } = payload if (!getters.getSelectedService || !getters.getSelectedService.tenantUrl) { throw new Error('Tenant url is null or empty, service is not selected') @@ -2401,7 +2401,12 @@ const mainStore = { const url = `${sanitizeUrl(getters.getSelectedService.tenantUrl)}/api/v1/usage?serviceId=${getters.getSelectedService.appId}&startDate=${startDate}&endDate=${endDate}`; // const url = `http://localhost:3008/api/v1/usage?serviceId=${getters.getSelectedService.appId}&startDate=${startDate}&endDate=${endDate}`; const authToken = getters.getSelectedService.access_token - const headers = UtilsMixin.methods.getHeader(authToken); + const token = await dispatch('getValidToken', { + serviceId: getters.getSelectedService.appId, + grant_type: config.GRANT_TYPES_ENUM.SSI_API, + tokenStorageKey: "access_token" + }); + const headers = UtilsMixin.methods.getHeader(token); const resp = await fetch(url, { method: 'GET', headers @@ -2447,7 +2452,7 @@ const mainStore = { return json } }, - async fetchUsageDetailsForASSIService({ getters, commit }, payload) { + async fetchUsageDetailsForASSIService({ getters, commit, dispatch }, payload) { const { startDate, endDate } = payload if (!getters.getSelectedService || !getters.getSelectedService.tenantUrl) { throw new Error('Tenant url is null or empty, service is not selected') @@ -2455,7 +2460,12 @@ const mainStore = { const url = `${sanitizeUrl(getters.getSelectedService.tenantUrl)}/api/v1/usage/detail?serviceId=${getters.getSelectedService.appId}&startDate=${startDate}&endDate=${endDate}`; // const url = `http://localhost:3008/api/v1/usage/detail?serviceId=${getters.getSelectedService.appId}&startDate=${startDate}&endDate=${endDate}`; const authToken = getters.getSelectedService.access_token - const headers = UtilsMixin.methods.getHeader(authToken); + const token = await dispatch('getValidToken', { + serviceId: getters.getSelectedService.appId, + grant_type: config.GRANT_TYPES_ENUM.SSI_API, + tokenStorageKey: "access_token" + }); + const headers = UtilsMixin.methods.getHeader(token); const resp = await fetch(url, { method: 'GET', headers @@ -3600,7 +3610,7 @@ const mainStore = { } else if (getters.getSelectedService && getters.getSelectedService.tenantUrl && getters.getSelectedService.access_token) { tenantUrl = getters.getSelectedService.tenantUrl; accessToken = getters.getSelectedService.access_token - serviceId = getters.getSelectedService.serviceId + serviceId = getters.getSelectedService.appId } else { return reject(new Error('Tenant url is null or empty, service is not selected')) }