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 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..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 }}
-
- - -
- -
-
-
-
{{ eachService.name }}
-
-
{{ group.label }}
-
- - -
+
+
Dashboard
+
+ +
@@ -243,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", @@ -251,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", @@ -296,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", @@ -384,44 +382,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,8 +398,11 @@ export default { SSI_PREDEFINED_ROLES() { return SSI_PREDEFINED_ROLES; }, - DASHBOARD_PREDEFINED_ROLES() { - return DASHBOARD_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); @@ -459,25 +423,24 @@ 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 && s.id !== + DASHBOARD_ROLE_SERVICE.id ); }, 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 && s.id !== + DASHBOARD_ROLE_SERVICE.id ); } }, @@ -508,7 +471,6 @@ export default { selectedRoles: { id: 'viewer', ssi: 'auditor', - dashboard: 'custom' } } }, @@ -547,15 +509,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 +550,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 +568,29 @@ 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' + getServiceIdsByType(serviceType) { + const services = 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); + : this.idServices; + const serviceIds = services.map(s => s.id); + return serviceType === 'id' ? [...serviceIds, DASHBOARD_ROLE_SERVICE.id] : serviceIds; }, + 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)); @@ -679,18 +613,11 @@ export default { const permissions = []; const targetServices = serviceType === 'ssi' ? this.ssiServices - : serviceType === 'dashboard' - ? this.dashboardServices - : this.idServices; + : [...this.idServices, DASHBOARD_ROLE_SERVICE]; 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 +793,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