From 0bbb30f5023e558a21541c510284deed772a6b60 Mon Sep 17 00:00:00 2001 From: Varsha Kumari Date: Tue, 2 Jun 2026 19:24:19 +0530 Subject: [PATCH 1/3] 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/3] 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/3] 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) {