From 8c0ccb10fbc21a75db52d544c6bc07e20afdae35 Mon Sep 17 00:00:00 2001 From: cstns Date: Tue, 12 Nov 2024 17:37:59 +0200 Subject: [PATCH 01/21] add uns scaffolding --- .../Clients}/components/BrokerAclRule.vue | 0 .../Clients}/components/BrokerClient.vue | 8 ++-- .../Clients}/dialogs/AclItem.vue | 4 +- .../Clients}/dialogs/ClientDialog.vue | 6 +-- .../team/{Broker => UNS/Clients}/index.vue | 42 +++++++------------ .../src/pages/team/UNS/Hierarchy/index.vue | 16 +++++++ frontend/src/pages/team/UNS/index.vue | 40 ++++++++++++++++++ frontend/src/pages/team/routes.js | 34 +++++++++++---- frontend/src/store/ux.js | 4 +- 9 files changed, 108 insertions(+), 46 deletions(-) rename frontend/src/pages/team/{Broker => UNS/Clients}/components/BrokerAclRule.vue (100%) rename frontend/src/pages/team/{Broker => UNS/Clients}/components/BrokerClient.vue (94%) rename frontend/src/pages/team/{Broker => UNS/Clients}/dialogs/AclItem.vue (95%) rename frontend/src/pages/team/{Broker => UNS/Clients}/dialogs/ClientDialog.vue (98%) rename frontend/src/pages/team/{Broker => UNS/Clients}/index.vue (81%) create mode 100644 frontend/src/pages/team/UNS/Hierarchy/index.vue create mode 100644 frontend/src/pages/team/UNS/index.vue diff --git a/frontend/src/pages/team/Broker/components/BrokerAclRule.vue b/frontend/src/pages/team/UNS/Clients/components/BrokerAclRule.vue similarity index 100% rename from frontend/src/pages/team/Broker/components/BrokerAclRule.vue rename to frontend/src/pages/team/UNS/Clients/components/BrokerAclRule.vue diff --git a/frontend/src/pages/team/Broker/components/BrokerClient.vue b/frontend/src/pages/team/UNS/Clients/components/BrokerClient.vue similarity index 94% rename from frontend/src/pages/team/Broker/components/BrokerClient.vue rename to frontend/src/pages/team/UNS/Clients/components/BrokerClient.vue index c41b264c33..a3717e4f3a 100644 --- a/frontend/src/pages/team/Broker/components/BrokerClient.vue +++ b/frontend/src/pages/team/UNS/Clients/components/BrokerClient.vue @@ -48,10 +48,10 @@ + + diff --git a/frontend/src/pages/team/UNS/index.vue b/frontend/src/pages/team/UNS/index.vue new file mode 100644 index 0000000000..1b10183d9c --- /dev/null +++ b/frontend/src/pages/team/UNS/index.vue @@ -0,0 +1,40 @@ + + + + + diff --git a/frontend/src/pages/team/routes.js b/frontend/src/pages/team/routes.js index a38971579c..5366ef5287 100644 --- a/frontend/src/pages/team/routes.js +++ b/frontend/src/pages/team/routes.js @@ -3,7 +3,6 @@ import ensurePermission from '../../utils/ensurePermission.js' import TeamApplications from './Applications/index.vue' import TeamAuditLog from './AuditLog.vue' import TeamBilling from './Billing.vue' -import Broker from './Broker/index.vue' import TeamDevices from './Devices/index.vue' import TeamInstances from './Instances.vue' import Library from './Library/index.vue' @@ -15,6 +14,9 @@ import TeamSettingsDanger from './Settings/Danger.vue' import TeamSettingsDevices from './Settings/Devices.vue' import TeamSettingsGeneral from './Settings/General.vue' import TeamSettings from './Settings/index.vue' +import UNSClients from './UNS/Clients/index.vue' +import UNSHierarchy from './UNS/Hierarchy/index.vue' +import UnifiedNameSpace from './UNS/index.vue' import ChangeTeamType from './changeType.vue' import CreateTeam from './create.vue' import CreateApplication from './createApplication.vue' @@ -84,7 +86,6 @@ export default [ } ] }, - { name: 'TeamDevices', path: 'devices', @@ -104,12 +105,31 @@ export default [ children: [...LibraryRoutes] }, { - name: 'TeamBroker', - path: 'broker', - component: Broker, + name: 'team-unified-namespace', + path: 'unified-namespace', + component: UnifiedNameSpace, + redirect: { name: 'team-namespace-hierarchy' }, meta: { - title: 'Team - Broker' - } + title: 'Team - Unified Namespace' + }, + children: [ + { + name: 'team-namespace-hierarchy', + path: 'hierarchy', + component: UNSHierarchy, + meta: { + title: 'Team - Unified Namespace Hierarchy' + } + }, + { + name: 'team-namespace-clients', + path: 'clients', + component: UNSClients, + meta: { + title: 'Team - Unified Namespace Clients' + } + } + ] }, { name: 'team-members', diff --git a/frontend/src/store/ux.js b/frontend/src/store/ux.js index 833626f4ad..33eaa97ca6 100644 --- a/frontend/src/store/ux.js +++ b/frontend/src/store/ux.js @@ -82,8 +82,8 @@ const getters = { hidden: !hasAMinimumTeamRoleOf(Roles.Viewer, teamMembership), entries: [ { - label: 'Broker', - to: { name: 'TeamBroker', params: { team_slug: team.slug } }, + label: 'UNS', + to: { name: 'team-unified-namespace', params: { team_slug: team.slug } }, tag: 'team-broker', icon: RssIcon, disabled: noBilling, From 1159131f7edbac494779a00291828cd27a38ceb1 Mon Sep 17 00:00:00 2001 From: cstns Date: Wed, 13 Nov 2024 17:06:17 +0200 Subject: [PATCH 02/21] address useStore utility reactivity in composables --- frontend/src/composables/Permissions.js | 84 ++++++++++--------- frontend/src/mixins/Permissions.js | 17 ++-- .../UNS/Clients/components/BrokerClient.vue | 12 ++- frontend/src/store/account.js | 4 +- frontend/src/store/ux.js | 20 ++--- 5 files changed, 72 insertions(+), 65 deletions(-) diff --git a/frontend/src/composables/Permissions.js b/frontend/src/composables/Permissions.js index ea55d2f6e5..601489b793 100644 --- a/frontend/src/composables/Permissions.js +++ b/frontend/src/composables/Permissions.js @@ -1,36 +1,44 @@ -// import { useStore } from 'vuex' +import { useStore } from 'vuex' import { Permissions } from '../../../forge/lib/permissions.js' import { Roles } from '../utils/roles.js' + +/** + * Fixes reactivity issue with the useStore utility but throws a warning while in dev mode + * [Vue warn]: inject() can only be used inside setup() or functional components + * Since teamMembership is defined outside the composable function and updated conditionally in usePermissions() + * + * The initialized store returns undefined upon switching teams and looses reactivity afterward. This should + * warrant more investigations, as this usually happens when the entire store is re-written. + * + * @type {{role: number}} + */ +let teamMembership = { role: 0 } + /** * @typedef {0 | 5 | 10 | 30 | 50 | 99} Role * Enum for roles with specific numeric values. */ - export default function usePermissions () { - // todo There's a reactivity problem I can't figure out with the useStore utility and our account store when switching - // teams. The initialized store returns undefined upon switching teams and looses reactivity afterwards. This should - // warrant more investigations, as this usually happens when the entire store is re-written. The teamMembership arguments - // should be disposed asap + const store = useStore() - // const store = useStore() - // const teamMembership = store.state.account.teamMembership + if (store && store?.state?.account?.teamMembership) { + teamMembership = store?.state?.account?.teamMembership + } /** - * @param teamMembership - * @returns {boolean} - */ - const isVisitingAdmin = (teamMembership) => { - return teamMembership === Roles.Admin + * @returns {boolean} + */ + const isVisitingAdmin = () => { + return teamMembership.role === Roles.Admin } /** - * - * @param scope - * @param teamMembership - * @returns {boolean} - */ - const hasPermission = (scope, teamMembership) => { + * + * @param scope + * @returns {boolean} + */ + const hasPermission = (scope) => { if (!Permissions[scope]) { throw new Error(`Unrecognised scope requested: '${scope}'`) } @@ -48,16 +56,15 @@ export default function usePermissions () { } /** - * Check if the user has the minimum required role. - * @param {Role} role - The role to check against. - * @param teamMembership - * @returns {boolean} True if the user has the minimum required role, otherwise false. - * @example - * // Check if the user has at least the 'Member' role - * const isMemberOrHigher = hasAMinimumTeamRoleOf(Roles.Member) - */ - const hasAMinimumTeamRoleOf = (role, teamMembership) => { - if (isVisitingAdmin(teamMembership?.role)) { + * Check if the user has the minimum required role. + * @param {Role} role - The role to check against. + * @returns {boolean} True if the user has the minimum required role, otherwise false. + * @example + * // Check if the user has at least the 'Member' role + * const isMemberOrHigher = hasAMinimumTeamRoleOf(Roles.Member) + */ + const hasAMinimumTeamRoleOf = (role) => { + if (isVisitingAdmin()) { return true } @@ -65,16 +72,15 @@ export default function usePermissions () { } /** - * Check if the user has a lower role than given role. - * @param {Role} role - The role to check against. - * @param teamMembership - * @returns {boolean} True if the user has a lower role than the given one, otherwise false. - * @example - * // Check if the user has role lower than 'Member' role - * const isMemberOrHigher = hasALowerTeamRoleThan(Roles.Member) - */ - const hasALowerOrEqualTeamRoleThan = (role, teamMembership) => { - if (isVisitingAdmin(teamMembership?.role)) { + * Check if the user has a lower role than given role. + * @param {Role} role - The role to check against. + * @returns {boolean} True if the user has a lower role than the given one, otherwise false. + * @example + * // Check if the user has role lower than 'Member' role + * const isMemberOrHigher = hasALowerTeamRoleThan(Roles.Member) + */ + const hasALowerOrEqualTeamRoleThan = (role) => { + if (isVisitingAdmin()) { return true } diff --git a/frontend/src/mixins/Permissions.js b/frontend/src/mixins/Permissions.js index 5192ba4ae3..0d7357f82e 100644 --- a/frontend/src/mixins/Permissions.js +++ b/frontend/src/mixins/Permissions.js @@ -6,25 +6,20 @@ import usePermissions from '../composables/Permissions.js' * @typedef {0 | 5 | 10 | 30 | 50 | 99} Role * Enum for roles with specific numeric values. */ - -/** - * @typedef {0 | 5 | 10 | 30 | 50 | 99} Role - * Enum for roles with specific numeric values. - */ - +// todo in an attempt to sunset the wide use of mixins, the permissions composable should be used instead export default { computed: { + // todo to be removed. A lot of components that use this mixin rely on the state imported here ...mapState('account', ['team', 'teamMembership']), - isVisitingAdmin () { const { isVisitingAdmin } = usePermissions() - return isVisitingAdmin(this.teamMembership?.role) + return isVisitingAdmin() } }, methods: { hasPermission (scope) { const { hasPermission } = usePermissions() - return hasPermission(scope, this.teamMembership) + return hasPermission(scope) }, /** @@ -37,7 +32,7 @@ export default { */ hasAMinimumTeamRoleOf (role) { const { hasAMinimumTeamRoleOf } = usePermissions() - return hasAMinimumTeamRoleOf(role, this.teamMembership) + return hasAMinimumTeamRoleOf(role) }, /** @@ -50,7 +45,7 @@ export default { */ hasALowerOrEqualTeamRoleThan (role) { const { hasALowerOrEqualTeamRoleThan } = usePermissions() - return hasALowerOrEqualTeamRoleThan(role, this.teamMembership) + return hasALowerOrEqualTeamRoleThan(role) } } } diff --git a/frontend/src/pages/team/UNS/Clients/components/BrokerClient.vue b/frontend/src/pages/team/UNS/Clients/components/BrokerClient.vue index a3717e4f3a..538c822edc 100644 --- a/frontend/src/pages/team/UNS/Clients/components/BrokerClient.vue +++ b/frontend/src/pages/team/UNS/Clients/components/BrokerClient.vue @@ -47,10 +47,11 @@ + + diff --git a/frontend/src/pages/team/UNS/Hierarchy/index.vue b/frontend/src/pages/team/UNS/Hierarchy/index.vue index 771bb375d3..68f2d4b3fb 100644 --- a/frontend/src/pages/team/UNS/Hierarchy/index.vue +++ b/frontend/src/pages/team/UNS/Hierarchy/index.vue @@ -4,16 +4,120 @@ tree-icon

Topic Hierarchy

+ + + + + + + + - From 276817fff1a16e9cba1dccf0c9101fe7af8744e2 Mon Sep 17 00:00:00 2001 From: cstns Date: Fri, 15 Nov 2024 18:45:29 +0200 Subject: [PATCH 06/21] add hierarchy styling --- .../pages/team/UNS/Hierarchy/TopicSegment.vue | 122 +++++++++++++++++- .../src/pages/team/UNS/Hierarchy/index.vue | 5 +- 2 files changed, 121 insertions(+), 6 deletions(-) diff --git a/frontend/src/pages/team/UNS/Hierarchy/TopicSegment.vue b/frontend/src/pages/team/UNS/Hierarchy/TopicSegment.vue index 242e7ab81d..6b4a42b184 100644 --- a/frontend/src/pages/team/UNS/Hierarchy/TopicSegment.vue +++ b/frontend/src/pages/team/UNS/Hierarchy/TopicSegment.vue @@ -1,20 +1,37 @@ diff --git a/frontend/src/pages/team/UNS/Hierarchy/index.vue b/frontend/src/pages/team/UNS/Hierarchy/index.vue index 68f2d4b3fb..9354c40a20 100644 --- a/frontend/src/pages/team/UNS/Hierarchy/index.vue +++ b/frontend/src/pages/team/UNS/Hierarchy/index.vue @@ -28,10 +28,13 @@