diff --git a/packages/nc-gui/composables/useUIPermission/index.ts b/packages/nc-gui/composables/useUIPermission/index.ts index 212bf23355..9d1015edc0 100644 --- a/packages/nc-gui/composables/useUIPermission/index.ts +++ b/packages/nc-gui/composables/useUIPermission/index.ts @@ -2,19 +2,19 @@ import { isString } from '@vueuse/core' import type { Permission } from './rolePermissions' import rolePermissions from './rolePermissions' import { USER_PROJECT_ROLES, computed, useGlobal, useState } from '#imports' -import type { Role, Roles } from '~/lib' +import type { Roles } from '~/lib' export function useUIPermission() { const { user, previewAs } = useGlobal() - const projectRoles = useState>(USER_PROJECT_ROLES, () => ({})) + const projectRoles = useState(USER_PROJECT_ROLES, () => ({})) - const baseRoles = computed(() => { - let userRoles = isString(user.value?.roles) ? user.value?.roles : ({ ...(user.value?.roles || {}) } as Roles) + const baseRoles = computed(() => { + let userRoles = user.value?.roles // if string populate key-value paired object - if (typeof userRoles === 'string') { - userRoles = userRoles.split(',').reduce>((acc, role) => { + if (isString(userRoles)) { + userRoles = userRoles.split(',').reduce((acc, role) => { acc[role] = true return acc }, {}) @@ -27,18 +27,19 @@ export function useUIPermission() { } }) - const isUIAllowed = (permission: Permission | string, skipPreviewAs = false) => { - let roles = baseRoles.value as Record + const isUIAllowed = (permission: Permission, skipPreviewAs = false) => { + let roles = baseRoles.value if (previewAs.value && !skipPreviewAs) { roles = { - [previewAs.value as Role]: true, + [previewAs.value]: true, } } - return Object.entries(roles).some(([role, hasRole]) => { - const rolePermission = rolePermissions[role as keyof typeof rolePermissions] as '*' | Record - return hasRole && (rolePermission === '*' || rolePermission?.[permission as Permission]) + return Object.entries(roles).some(([role, hasRole]) => { + const rolePermission = rolePermissions[role as keyof typeof rolePermissions] + + return hasRole && (rolePermission === '*' || rolePermission?.[permission as keyof typeof rolePermission]) }) } diff --git a/packages/nc-gui/composables/useUIPermission/rolePermissions.ts b/packages/nc-gui/composables/useUIPermission/rolePermissions.ts index 0754afbcbf..fcc46c7031 100644 --- a/packages/nc-gui/composables/useUIPermission/rolePermissions.ts +++ b/packages/nc-gui/composables/useUIPermission/rolePermissions.ts @@ -43,14 +43,10 @@ const rolePermissions = { }, } as const -export default rolePermissions +type GetKeys = T extends Record ? keyof T : never -type GetKeys = T extends Record ? keyof T : never +export type Permission = + | (K extends 'creator' | 'owner' ? T[K] : never | T[K] extends Record ? GetKeys : never) + | string -export type Permission = K extends - | 'creator' - | 'owner' - ? T[K] - : never | T[K] extends Record - ? GetKeys - : never +export default rolePermissions diff --git a/packages/nc-gui/lib/enums.ts b/packages/nc-gui/lib/enums.ts index ef6ad54540..5c9e856508 100644 --- a/packages/nc-gui/lib/enums.ts +++ b/packages/nc-gui/lib/enums.ts @@ -2,6 +2,7 @@ export enum Role { Super = 'super', Admin = 'admin', User = 'user', + Guest = 'guest', } export enum ProjectRole { diff --git a/packages/nc-gui/lib/types.ts b/packages/nc-gui/lib/types.ts index ac8d3fc562..c7d1859424 100644 --- a/packages/nc-gui/lib/types.ts +++ b/packages/nc-gui/lib/types.ts @@ -1,13 +1,13 @@ import type { FilterType } from 'nocodb-sdk' import type { I18n } from 'vue-i18n' -import type { Role } from './enums' +import type { ProjectRole, Role } from './enums' export interface User { id: string email: string firstname: string | null lastname: string | null - roles: Roles + roles: Roles | string invite_token?: string project_id?: string } @@ -31,7 +31,7 @@ export interface Field { system?: boolean } -export type Roles = Record | string +export type Roles = Record export type Filter = FilterType & { status?: 'update' | 'delete' | 'create'; parentId?: string; readOnly?: boolean }