Browse Source

feat: add isUIAllowed composable

Signed-off-by: Pranav C <pranavxc@gmail.com>
pull/2735/head
Pranav C 2 years ago
parent
commit
7953923a28
  1. 30
      packages/nc-gui-v2/composables/useUIPermission/index.ts
  2. 37
      packages/nc-gui-v2/composables/useUIPermission/rolePermissions.ts
  3. 2
      packages/nc-gui-v2/lib/enums.ts
  4. 4
      packages/nc-gui-v2/lib/types.ts
  5. 30
      packages/nc-gui/helpers/rolePermissions.js

30
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 }
}

37
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,
},
}

2
packages/nc-gui-v2/lib/enums.ts

@ -4,6 +4,8 @@ export enum Role {
User = 'user', User = 'user',
} }
export type Roles = Record<Role, boolean>
export enum Language { export enum Language {
de = 'Deutsch', de = 'Deutsch',
en = 'English', en = 'English',

4
packages/nc-gui-v2/lib/types.ts

@ -1,12 +1,12 @@
import type { ComputedRef, ToRefs } from 'vue' import type { ComputedRef, ToRefs } from 'vue'
import type { Role } from '~/lib/enums' import type { Roles } from '~/lib/enums'
export interface User { export interface User {
id: string id: string
email: string email: string
firstname: string | null firstname: string | null
lastname: string | null lastname: string | null
roles: (Role | string)[] roles: Roles
} }
export interface StoredState { export interface StoredState {

30
packages/nc-gui/helpers/rolePermissions.js

@ -1,30 +0,0 @@
export default {
creator: '*',
owner: '*',
guest: {},
user: {
projectCreate: true
}
}
/**
* @copyright Copyright (c) 2021, Xgene Cloud Ltd
*
* @author Naveen MR <oof1lab@gmail.com>
* @author Pranav C Balan <pranavxc@gmail.com>
*
* @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 <http://www.gnu.org/licenses/>.
*
*/
Loading…
Cancel
Save