From 7953923a28c56816059ad185392892bd278d3bb5 Mon Sep 17 00:00:00 2001 From: Pranav C Date: Tue, 19 Jul 2022 12:05:36 +0530 Subject: [PATCH] feat: add isUIAllowed composable Signed-off-by: Pranav C --- .../composables/useUIPermission/index.ts | 30 +++++++++++++++ .../useUIPermission/rolePermissions.ts | 37 +++++++++++++++++++ packages/nc-gui-v2/lib/enums.ts | 2 + packages/nc-gui-v2/lib/types.ts | 4 +- packages/nc-gui/helpers/rolePermissions.js | 30 --------------- 5 files changed, 71 insertions(+), 32 deletions(-) create mode 100644 packages/nc-gui-v2/composables/useUIPermission/index.ts create mode 100644 packages/nc-gui-v2/composables/useUIPermission/rolePermissions.ts delete mode 100644 packages/nc-gui/helpers/rolePermissions.js diff --git a/packages/nc-gui-v2/composables/useUIPermission/index.ts b/packages/nc-gui-v2/composables/useUIPermission/index.ts new file mode 100644 index 0000000000..ff2cf98b3e --- /dev/null +++ b/packages/nc-gui-v2/composables/useUIPermission/index.ts @@ -0,0 +1,30 @@ +import rolePermissions from './rolePermissions' + +export default () => { + const { $state } = useNuxtApp() + + const isUIAllowed = (permission: keyof typeof rolePermissions[keyof typeof rolePermissions], _skipPreviewAs = false) => { + const user = $state.user + const roles = { + ...(user?.value?.roles || {}), + // todo: load project specific roles + // ...(state.projectRole || {}), + } + + // todo: handle preview as + // if (state.previewAs && !skipPreviewAs) { + // roles = { + // [state.previewAs]: true + // }; + // } + return Object.entries(roles).some(([role, hasRole]) => { + return ( + hasRole && + (rolePermissions[role as keyof typeof rolePermissions] === '*' || + rolePermissions[role as keyof typeof rolePermissions]?.[permission]) + ) + }) + } + + return { isUIAllowed } +} diff --git a/packages/nc-gui-v2/composables/useUIPermission/rolePermissions.ts b/packages/nc-gui-v2/composables/useUIPermission/rolePermissions.ts new file mode 100644 index 0000000000..cd717b3278 --- /dev/null +++ b/packages/nc-gui-v2/composables/useUIPermission/rolePermissions.ts @@ -0,0 +1,37 @@ +export default { + creator: '*', + owner: '*', + guest: {}, + editor: { + smartSheet: true, + xcDatatableEditable: true, + column: true, + tableAttachment: true, + tableRowUpdate: true, + rowComments: true, + gridViewOptions: true, + sortSync: true, + fieldsSync: true, + gridColUpdate: true, + filterSync: true, + csvImport: true, + apiDocs: true, + projectSettings: true, + }, + commenter: { + smartSheet: true, + column: true, + rowComments: true, + projectSettings: true, + }, + viewer: { + smartSheet: true, + column: true, + projectSettings: true, + }, + user: { + projectCreate: true, + projectActions: true, + projectSettings: true, + }, +} diff --git a/packages/nc-gui-v2/lib/enums.ts b/packages/nc-gui-v2/lib/enums.ts index c6751a3f47..7b6f97e542 100644 --- a/packages/nc-gui-v2/lib/enums.ts +++ b/packages/nc-gui-v2/lib/enums.ts @@ -4,6 +4,8 @@ export enum Role { User = 'user', } +export type Roles = Record + export enum Language { de = 'Deutsch', en = 'English', diff --git a/packages/nc-gui-v2/lib/types.ts b/packages/nc-gui-v2/lib/types.ts index 08a4c7036e..e9b38a4351 100644 --- a/packages/nc-gui-v2/lib/types.ts +++ b/packages/nc-gui-v2/lib/types.ts @@ -1,12 +1,12 @@ import type { ComputedRef, ToRefs } from 'vue' -import type { Role } from '~/lib/enums' +import type { Roles } from '~/lib/enums' export interface User { id: string email: string firstname: string | null lastname: string | null - roles: (Role | string)[] + roles: Roles } export interface StoredState { diff --git a/packages/nc-gui/helpers/rolePermissions.js b/packages/nc-gui/helpers/rolePermissions.js deleted file mode 100644 index 4ce59c5f9d..0000000000 --- a/packages/nc-gui/helpers/rolePermissions.js +++ /dev/null @@ -1,30 +0,0 @@ -export default { - creator: '*', - owner: '*', - guest: {}, - user: { - projectCreate: true - } -} -/** - * @copyright Copyright (c) 2021, Xgene Cloud Ltd - * - * @author Naveen MR - * @author Pranav C Balan - * - * @license GNU AGPL version 3 or any later version - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - * - */