From 5259cba36499ec01a85d319594f44cb463db7a76 Mon Sep 17 00:00:00 2001 From: braks <78412429+bcakmakoglu@users.noreply.github.com> Date: Sun, 18 Sep 2022 01:06:28 +0200 Subject: [PATCH 01/26] chore(nc-gui): add components.d.ts to eslint ignore patterns --- packages/nc-gui/.eslintrc.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/nc-gui/.eslintrc.js b/packages/nc-gui/.eslintrc.js index f7291c452f..8780df770e 100644 --- a/packages/nc-gui/.eslintrc.js +++ b/packages/nc-gui/.eslintrc.js @@ -14,5 +14,5 @@ module.exports = { extends: ['@antfu', 'plugin:prettier/recommended'], plugins: ['prettier'], rules: baseRules, - ignorePatterns: ['!*.d.ts'], + ignorePatterns: ['!*.d.ts', 'components.d.ts'], } From e19b0a79ca8a337ca70bfd65ccf34018b7685c93 Mon Sep 17 00:00:00 2001 From: braks <78412429+bcakmakoglu@users.noreply.github.com> Date: Sun, 18 Sep 2022 11:05:41 +0200 Subject: [PATCH 02/26] chore(nc-gui): update previewAs type --- packages/nc-gui/composables/useGlobal/types.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/nc-gui/composables/useGlobal/types.ts b/packages/nc-gui/composables/useGlobal/types.ts index 18939fb7df..8a232b6d65 100644 --- a/packages/nc-gui/composables/useGlobal/types.ts +++ b/packages/nc-gui/composables/useGlobal/types.ts @@ -1,7 +1,7 @@ import type { ComputedRef, Ref, ToRefs } from 'vue' import type { WritableComputedRef } from '@vue/reactivity' import type { JwtPayload } from 'jwt-decode' -import type { Language, User } from '~/lib' +import type { Language, Role, User } from '~/lib' import type { useCounter } from '#imports' export interface FeedbackForm { @@ -33,7 +33,7 @@ export interface StoredState { darkMode: boolean feedbackForm: FeedbackForm filterAutoSave: boolean - previewAs: string | null + previewAs: Role | null includeM2M: boolean currentVersion: string | null latestRelease: string | null From 27791f505430fd9ec88ff76eb6b68711efe9dec5 Mon Sep 17 00:00:00 2001 From: braks <78412429+bcakmakoglu@users.noreply.github.com> Date: Sun, 18 Sep 2022 11:25:26 +0200 Subject: [PATCH 03/26] refactor(nc-gui): clean up permission types --- .../composables/useUIPermission/index.ts | 25 ++++++++++--------- .../useUIPermission/rolePermissions.ts | 14 ++++------- packages/nc-gui/lib/enums.ts | 1 + packages/nc-gui/lib/types.ts | 6 ++--- 4 files changed, 22 insertions(+), 24 deletions(-) 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 } From ea946edd871ac0c53a095872601f14b7b54c97dd Mon Sep 17 00:00:00 2001 From: braks <78412429+bcakmakoglu@users.noreply.github.com> Date: Sun, 18 Sep 2022 13:28:41 +0200 Subject: [PATCH 04/26] chore(nc-gui): cleanup types --- packages/nc-gui/components/smartsheet/sidebar/MenuTop.vue | 2 -- .../components/smartsheet/sidebar/RenameableMenuItem.vue | 4 ++-- packages/nc-gui/components/smartsheet/sidebar/index.vue | 3 ++- packages/nc-gui/composables/useSharedFormViewStore.ts | 2 +- .../nc-gui/composables/useUIPermission/rolePermissions.ts | 2 +- 5 files changed, 6 insertions(+), 7 deletions(-) diff --git a/packages/nc-gui/components/smartsheet/sidebar/MenuTop.vue b/packages/nc-gui/components/smartsheet/sidebar/MenuTop.vue index cec93e16d2..e32063c96c 100644 --- a/packages/nc-gui/components/smartsheet/sidebar/MenuTop.vue +++ b/packages/nc-gui/components/smartsheet/sidebar/MenuTop.vue @@ -32,8 +32,6 @@ interface Emits { (event: 'openModal', data: { type: ViewTypes; title?: string; copyViewId?: string }): void (event: 'deleted'): void - - (event: 'sorted'): void } const { $e } = useNuxtApp() diff --git a/packages/nc-gui/components/smartsheet/sidebar/RenameableMenuItem.vue b/packages/nc-gui/components/smartsheet/sidebar/RenameableMenuItem.vue index 2602e742a7..6501be738d 100644 --- a/packages/nc-gui/components/smartsheet/sidebar/RenameableMenuItem.vue +++ b/packages/nc-gui/components/smartsheet/sidebar/RenameableMenuItem.vue @@ -2,7 +2,7 @@ import type { ViewType, ViewTypes } from 'nocodb-sdk' import { message } from 'ant-design-vue' import type { WritableComputedRef } from '@vue/reactivity' -import { IsLockedInj, onKeyStroke, useDebounceFn, useNuxtApp, useUIPermission, useVModel, viewIcons } from '#imports' +import { IsLockedInj, inject, onKeyStroke, useDebounceFn, useNuxtApp, useUIPermission, useVModel, viewIcons } from '#imports' interface Props { view: ViewType @@ -21,7 +21,7 @@ const props = defineProps() const emits = defineEmits() -const vModel = useVModel(props, 'view', emits) as WritableComputedRef +const vModel = useVModel(props, 'view', emits) as WritableComputedRef const { $e } = useNuxtApp() diff --git a/packages/nc-gui/components/smartsheet/sidebar/index.vue b/packages/nc-gui/components/smartsheet/sidebar/index.vue index ec45026669..7964bf4337 100644 --- a/packages/nc-gui/components/smartsheet/sidebar/index.vue +++ b/packages/nc-gui/components/smartsheet/sidebar/index.vue @@ -14,6 +14,7 @@ import { useRoute, useRouter, useSidebar, + useUIPermission, useViews, watch, } from '#imports' @@ -114,7 +115,7 @@ function onCreate(view: ViewType) { class="min-h-[var(--toolbar-height)] max-h-[var(--toolbar-height)] flex items-center py-3 px-3 justify-between border-b-1" />
- +
diff --git a/packages/nc-gui/composables/useSharedFormViewStore.ts b/packages/nc-gui/composables/useSharedFormViewStore.ts index 6bc3e54499..a64b2365d0 100644 --- a/packages/nc-gui/composables/useSharedFormViewStore.ts +++ b/packages/nc-gui/composables/useSharedFormViewStore.ts @@ -30,7 +30,7 @@ const [useProvideSharedFormStore, useSharedFormStore] = useInjectionState((share const sharedView = ref() const sharedFormView = ref() const meta = ref() - const columns = ref<(ColumnType & { required?: boolean; show?: boolean })[]>() + const columns = ref<(ColumnType & { required?: boolean; show?: boolean; label?: string })[]>() const { api, isLoading } = useApi() diff --git a/packages/nc-gui/composables/useUIPermission/rolePermissions.ts b/packages/nc-gui/composables/useUIPermission/rolePermissions.ts index fcc46c7031..997799c704 100644 --- a/packages/nc-gui/composables/useUIPermission/rolePermissions.ts +++ b/packages/nc-gui/composables/useUIPermission/rolePermissions.ts @@ -47,6 +47,6 @@ 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 + | T[K] export default rolePermissions From 26ca9dcf1afd8c9720724aeadb442715a5a51084 Mon Sep 17 00:00:00 2001 From: braks <78412429+bcakmakoglu@users.noreply.github.com> Date: Mon, 19 Sep 2022 00:48:42 +0200 Subject: [PATCH 05/26] chore(nc-gui): remove unused composable --- packages/nc-gui/composables/index.ts | 1 - packages/nc-gui/composables/useAttachment.ts | 9 --------- packages/nc-gui/plugins/tele.ts | 9 --------- 3 files changed, 19 deletions(-) delete mode 100644 packages/nc-gui/composables/useAttachment.ts diff --git a/packages/nc-gui/composables/index.ts b/packages/nc-gui/composables/index.ts index 149bbff61d..5fd560cb5c 100644 --- a/packages/nc-gui/composables/index.ts +++ b/packages/nc-gui/composables/index.ts @@ -5,7 +5,6 @@ export * from './useInjectionState' export * from './useSidebar' export * from './useTheme' export * from './useUIPermission' -export * from './useAttachment' export * from './useColors' export * from './useColumn' export * from './useGridViewColumnWidth' diff --git a/packages/nc-gui/composables/useAttachment.ts b/packages/nc-gui/composables/useAttachment.ts deleted file mode 100644 index 3aee3b2798..0000000000 --- a/packages/nc-gui/composables/useAttachment.ts +++ /dev/null @@ -1,9 +0,0 @@ -// todo: implement useAttachment -export function useAttachment() { - const localFilesState = reactive([]) - const attachments = ref([]) - - const uploadFile = () => {} - - return { uploadFile, localFilesState, attachments } -} diff --git a/packages/nc-gui/plugins/tele.ts b/packages/nc-gui/plugins/tele.ts index 4970f32bd1..481dd133f3 100644 --- a/packages/nc-gui/plugins/tele.ts +++ b/packages/nc-gui/plugins/tele.ts @@ -41,15 +41,6 @@ export default defineNuxtPlugin(async (nuxtApp) => { }) }) - /** - * unreachable code? - if (socket) { - socket.emit('page', { - path: route.matched[0].path + (route.query && route.query.type ? `?type=${route.query.type}` : ''), - }) - } - */ - const tele = { emit(evt: string, data: Record) { // debugger From 9a43bfa787311859b82cf4099bf994479fae789d Mon Sep 17 00:00:00 2001 From: braks <78412429+bcakmakoglu@users.noreply.github.com> Date: Mon, 19 Sep 2022 10:53:18 +0200 Subject: [PATCH 06/26] refactor(nc-gui): use enum for role permission keys --- .../nc-gui/components/general/PreviewAs.vue | 28 +++++++------ .../nc-gui/composables/useGlobal/types.ts | 4 +- .../composables/useUIPermission/index.ts | 12 ++++-- .../useUIPermission/rolePermissions.ts | 40 +++++++++++-------- 4 files changed, 49 insertions(+), 35 deletions(-) diff --git a/packages/nc-gui/components/general/PreviewAs.vue b/packages/nc-gui/components/general/PreviewAs.vue index c4f6ee36bd..b99623b256 100644 --- a/packages/nc-gui/components/general/PreviewAs.vue +++ b/packages/nc-gui/components/general/PreviewAs.vue @@ -1,29 +1,26 @@ From 69475f86aefbceca938957096fa26008f1a19651 Mon Sep 17 00:00:00 2001 From: braks <78412429+bcakmakoglu@users.noreply.github.com> Date: Mon, 19 Sep 2022 20:55:17 +0200 Subject: [PATCH 24/26] chore(nc-gui): add comments to `useRoles` --- packages/nc-gui/composables/useRoles/index.ts | 23 +++++++++++++++---- 1 file changed, 18 insertions(+), 5 deletions(-) diff --git a/packages/nc-gui/composables/useRoles/index.ts b/packages/nc-gui/composables/useRoles/index.ts index 3a8e0cd101..eaa3711fb3 100644 --- a/packages/nc-gui/composables/useRoles/index.ts +++ b/packages/nc-gui/composables/useRoles/index.ts @@ -2,6 +2,15 @@ import { isString } from '@vueuse/core' import { computed, createSharedComposable, ref, useApi, useGlobal } from '#imports' import type { ProjectRole, Role, Roles } from '~/lib' +/** + * Provides the roles a user currently has + * + * * `userRoles` - the roles a user has outside of projects + * * `projectRoles` - the roles a user has in the current project (if one was loaded) + * * `allRoles` - all roles a user has (userRoles + projectRoles) + * * `hasRole` - a function to check if a user has a specific role + * * `loadProjectRoles` - a function to load the project roles for a specific project (by id) + */ export const useRoles = createSharedComposable(() => { const { user } = useGlobal() @@ -23,6 +32,11 @@ export const useRoles = createSharedComposable(() => { return roles }) + const allRoles = computed(() => ({ + ...userRoles.value, + ...projectRoles.value, + })) + async function loadProjectRoles(projectId: string, isSharedBase: boolean) { projectRoles.value = {} @@ -43,10 +57,9 @@ export const useRoles = createSharedComposable(() => { } } - const allRoles = computed(() => ({ - ...userRoles.value, - ...projectRoles.value, - })) + function hasRole(role: Role | ProjectRole | string) { + return allRoles.value[role] + } - return { allRoles, userRoles, projectRoles, loadProjectRoles } + return { allRoles, userRoles, projectRoles, loadProjectRoles, hasRole } }) From 043443322bf3180ab23690f25444bc093861f5f3 Mon Sep 17 00:00:00 2001 From: braks <78412429+bcakmakoglu@users.noreply.github.com> Date: Mon, 19 Sep 2022 21:18:40 +0200 Subject: [PATCH 25/26] refactor(nc-gui): use global state for useTheme --- packages/nc-gui/app.vue | 4 +--- packages/nc-gui/composables/useTheme/index.ts | 20 +++---------------- 2 files changed, 4 insertions(+), 20 deletions(-) diff --git a/packages/nc-gui/app.vue b/packages/nc-gui/app.vue index 46c1784d71..933ebfc3d6 100644 --- a/packages/nc-gui/app.vue +++ b/packages/nc-gui/app.vue @@ -1,11 +1,9 @@