From 633da7b296ab4b83510cc8db38b719fbfab2f14d Mon Sep 17 00:00:00 2001 From: Pranav C Date: Thu, 21 Jul 2022 17:58:28 +0530 Subject: [PATCH 1/7] feat(gui-v2): Load project specific role and use it in ui permission composable Signed-off-by: Pranav C --- packages/nc-gui-v2/composables/useProject.ts | 16 ++++++++++++--- .../composables/useUIPermission/index.ts | 20 ++++++++++++++++--- packages/nc-gui-v2/lib/constants.ts | 1 + 3 files changed, 31 insertions(+), 6 deletions(-) diff --git a/packages/nc-gui-v2/composables/useProject.ts b/packages/nc-gui-v2/composables/useProject.ts index 9ea67b69f7..1df977267a 100644 --- a/packages/nc-gui-v2/composables/useProject.ts +++ b/packages/nc-gui-v2/composables/useProject.ts @@ -1,28 +1,38 @@ import { SqlUiFactory } from 'nocodb-sdk' import type { ProjectType, TableType } from 'nocodb-sdk' -import { useNuxtApp } from '#app' +import { useNuxtApp, useState } from '#app' +import { USER_PROJECT_ROLES } from '~/lib/constants' export default () => { + const projectRoles = useState>(USER_PROJECT_ROLES, () => ({})) + const { $api } = useNuxtApp() const project = useState('project') const tables = useState('tables') + const loadProjectRoles = async () => { + projectRoles.value = {} + + if (project.value.id) { + const user = await $api.auth.me({ project_id: project.value.id }) + projectRoles.value = user.roles + } + } const loadTables = async () => { if (project.value.id) { const tablesResponse = await $api.dbTable.list(project.value.id) - if (tablesResponse.list) tables.value = tablesResponse.list } } const loadProject = async (projectId: string) => { project.value = await $api.project.read(projectId) + await loadProjectRoles() } const isMysql = computed(() => ['mysql', 'mysql2'].includes(project.value?.bases?.[0]?.type || '')) const isPg = computed(() => project.value?.bases?.[0]?.type === 'pg') - const sqlUi = computed(() => SqlUiFactory.create({ client: project.value?.bases?.[0]?.type || '' })) return { project, tables, loadProject, loadTables, isMysql, isPg, sqlUi } diff --git a/packages/nc-gui-v2/composables/useUIPermission/index.ts b/packages/nc-gui-v2/composables/useUIPermission/index.ts index ff2cf98b3e..e8fa8e6b5b 100644 --- a/packages/nc-gui-v2/composables/useUIPermission/index.ts +++ b/packages/nc-gui-v2/composables/useUIPermission/index.ts @@ -1,14 +1,27 @@ import rolePermissions from './rolePermissions' +import { useState } from '#app' +import { USER_PROJECT_ROLES } from '~/lib/constants' export default () => { const { $state } = useNuxtApp() + const projectRoles = useState>(USER_PROJECT_ROLES, () => ({})) const isUIAllowed = (permission: keyof typeof rolePermissions[keyof typeof rolePermissions], _skipPreviewAs = false) => { const user = $state.user + let userRoles = user?.value?.roles || {} + + // if string populate key-value paired object + if (typeof userRoles === 'string') { + userRoles = userRoles.split(',').reduce>((acc, role) => { + acc[role] = true + return acc + }, {}) + } + + // merge user role and project specific user roles const roles = { - ...(user?.value?.roles || {}), - // todo: load project specific roles - // ...(state.projectRole || {}), + ...userRoles, + ...(projectRoles?.value || {}), } // todo: handle preview as @@ -17,6 +30,7 @@ export default () => { // [state.previewAs]: true // }; // } + return Object.entries(roles).some(([role, hasRole]) => { return ( hasRole && diff --git a/packages/nc-gui-v2/lib/constants.ts b/packages/nc-gui-v2/lib/constants.ts index fdb8f08d49..21806b0541 100644 --- a/packages/nc-gui-v2/lib/constants.ts +++ b/packages/nc-gui-v2/lib/constants.ts @@ -1 +1,2 @@ export const NOCO = 'noco' +export const USER_PROJECT_ROLES = 'user_project_roles' From f0826d46208c279bdc7a86f41e2d8eb565e9a2a7 Mon Sep 17 00:00:00 2001 From: Muhammed Mustafa Date: Tue, 19 Jul 2022 11:27:10 +0530 Subject: [PATCH 2/7] refactor/gui-v2-audit-added --- packages/nc-gui-v2/components.d.ts | 2 + .../dashboard/settings/AuditTab.vue | 91 +++++++++++++++++++ packages/nc-gui-v2/helpers/index.js | 10 ++ 3 files changed, 103 insertions(+) create mode 100644 packages/nc-gui-v2/components/dashboard/settings/AuditTab.vue create mode 100644 packages/nc-gui-v2/helpers/index.js diff --git a/packages/nc-gui-v2/components.d.ts b/packages/nc-gui-v2/components.d.ts index 18c354d703..4d8b506ac2 100644 --- a/packages/nc-gui-v2/components.d.ts +++ b/packages/nc-gui-v2/components.d.ts @@ -29,10 +29,12 @@ declare module '@vue/runtime-core' { AMenuDivider: typeof import('ant-design-vue/es')['MenuDivider'] AMenuItem: typeof import('ant-design-vue/es')['MenuItem'] AModal: typeof import('ant-design-vue/es')['Modal'] + APagination: typeof import('ant-design-vue/es')['Pagination'] ARow: typeof import('ant-design-vue/es')['Row'] ASelect: typeof import('ant-design-vue/es')['Select'] ASelectOption: typeof import('ant-design-vue/es')['SelectOption'] ASkeleton: typeof import('ant-design-vue/es')['Skeleton'] + ASpin: typeof import('ant-design-vue/es')['Spin'] ASubMenu: typeof import('ant-design-vue/es')['SubMenu'] ATable: typeof import('ant-design-vue/es')['Table'] ATableColumn: typeof import('ant-design-vue/es')['TableColumn'] diff --git a/packages/nc-gui-v2/components/dashboard/settings/AuditTab.vue b/packages/nc-gui-v2/components/dashboard/settings/AuditTab.vue new file mode 100644 index 0000000000..0f34b0f38f --- /dev/null +++ b/packages/nc-gui-v2/components/dashboard/settings/AuditTab.vue @@ -0,0 +1,91 @@ + + + + + diff --git a/packages/nc-gui-v2/helpers/index.js b/packages/nc-gui-v2/helpers/index.js new file mode 100644 index 0000000000..6afd9c4c9d --- /dev/null +++ b/packages/nc-gui-v2/helpers/index.js @@ -0,0 +1,10 @@ +import dayjs from 'dayjs' + +import * as relativeTime from 'dayjs/plugin/relativeTime' +import * as utc from 'dayjs/plugin/utc' +dayjs.extend(utc) +dayjs.extend(relativeTime) + +export function calculateDiff(date) { + return dayjs.utc(date).fromNow() +} From 189bc5bbaafc0dea12f6532a9fad399ff97628ed Mon Sep 17 00:00:00 2001 From: Muhammed Mustafa Date: Tue, 19 Jul 2022 18:54:53 +0530 Subject: [PATCH 3/7] fix/moved calculateDiff to date utils --- .../components/dashboard/settings/AuditTab.vue | 2 +- packages/nc-gui-v2/helpers/index.js | 10 ---------- packages/nc-gui-v2/utils/dateTimeUtils.ts | 9 +++++++++ 3 files changed, 10 insertions(+), 11 deletions(-) delete mode 100644 packages/nc-gui-v2/helpers/index.js diff --git a/packages/nc-gui-v2/components/dashboard/settings/AuditTab.vue b/packages/nc-gui-v2/components/dashboard/settings/AuditTab.vue index 0f34b0f38f..4ae6cd9365 100644 --- a/packages/nc-gui-v2/components/dashboard/settings/AuditTab.vue +++ b/packages/nc-gui-v2/components/dashboard/settings/AuditTab.vue @@ -2,7 +2,7 @@ import { Tooltip as ATooltip } from 'ant-design-vue' import { h, ref } from 'vue' import type { AuditType } from 'nocodb-sdk' -import { calculateDiff } from '~/helpers' +import { calculateDiff } from '~/utils/dateTimeUtils' const { $api } = useNuxtApp() const { project } = useProject() diff --git a/packages/nc-gui-v2/helpers/index.js b/packages/nc-gui-v2/helpers/index.js deleted file mode 100644 index 6afd9c4c9d..0000000000 --- a/packages/nc-gui-v2/helpers/index.js +++ /dev/null @@ -1,10 +0,0 @@ -import dayjs from 'dayjs' - -import * as relativeTime from 'dayjs/plugin/relativeTime' -import * as utc from 'dayjs/plugin/utc' -dayjs.extend(utc) -dayjs.extend(relativeTime) - -export function calculateDiff(date) { - return dayjs.utc(date).fromNow() -} diff --git a/packages/nc-gui-v2/utils/dateTimeUtils.ts b/packages/nc-gui-v2/utils/dateTimeUtils.ts index 0b0d5a5264..146d70a9c8 100644 --- a/packages/nc-gui-v2/utils/dateTimeUtils.ts +++ b/packages/nc-gui-v2/utils/dateTimeUtils.ts @@ -1,5 +1,14 @@ import dayjs from 'dayjs' +import relativeTime from 'dayjs/plugin/relativeTime' +import utc from 'dayjs/plugin/utc' +dayjs.extend(utc) +dayjs.extend(relativeTime) + +export const calculateDiff = (date: any) => { + return dayjs.utc(date).fromNow() +} + export const handleTZ = (val: any) => { if (!val) { return From 9c1f214c8de768ec729207615ad1beb46fa63097 Mon Sep 17 00:00:00 2001 From: braks <78412429+bcakmakoglu@users.noreply.github.com> Date: Thu, 21 Jul 2022 19:07:00 +0200 Subject: [PATCH 4/7] refactor(gui-v2): cleanup audit tab issues and styles # What's changed? * load project before loading audits * properly align pagination * move reload button to pagination * wrap elements * prevent warnings of ant design by using functions as children * add icon to reload --- .../dashboard/settings/AuditTab.vue | 88 +++++++++++-------- packages/nc-gui-v2/utils/dateTimeUtils.ts | 2 +- 2 files changed, 53 insertions(+), 37 deletions(-) diff --git a/packages/nc-gui-v2/components/dashboard/settings/AuditTab.vue b/packages/nc-gui-v2/components/dashboard/settings/AuditTab.vue index 4ae6cd9365..e43f07860f 100644 --- a/packages/nc-gui-v2/components/dashboard/settings/AuditTab.vue +++ b/packages/nc-gui-v2/components/dashboard/settings/AuditTab.vue @@ -1,38 +1,52 @@ - - diff --git a/packages/nc-gui-v2/utils/dateTimeUtils.ts b/packages/nc-gui-v2/utils/dateTimeUtils.ts index 146d70a9c8..e545ee290c 100644 --- a/packages/nc-gui-v2/utils/dateTimeUtils.ts +++ b/packages/nc-gui-v2/utils/dateTimeUtils.ts @@ -5,7 +5,7 @@ import utc from 'dayjs/plugin/utc' dayjs.extend(utc) dayjs.extend(relativeTime) -export const calculateDiff = (date: any) => { +export const timeAgo = (date: any) => { return dayjs.utc(date).fromNow() } From 3c4bc9ebf7f3451c23a95f469e32fb3628e6eea4 Mon Sep 17 00:00:00 2001 From: braks <78412429+bcakmakoglu@users.noreply.github.com> Date: Thu, 21 Jul 2022 19:13:21 +0200 Subject: [PATCH 5/7] chore(gui-v2): add full width to audit tab --- packages/nc-gui-v2/components/dashboard/settings/AuditTab.vue | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/nc-gui-v2/components/dashboard/settings/AuditTab.vue b/packages/nc-gui-v2/components/dashboard/settings/AuditTab.vue index e43f07860f..55c2abdc45 100644 --- a/packages/nc-gui-v2/components/dashboard/settings/AuditTab.vue +++ b/packages/nc-gui-v2/components/dashboard/settings/AuditTab.vue @@ -84,8 +84,8 @@ const columns = [