diff --git a/packages/nc-gui/components/dlg/share-and-collaborate/SharePage.vue b/packages/nc-gui/components/dlg/share-and-collaborate/SharePage.vue index 51198ff83b..324731fb2e 100644 --- a/packages/nc-gui/components/dlg/share-and-collaborate/SharePage.vue +++ b/packages/nc-gui/components/dlg/share-and-collaborate/SharePage.vue @@ -16,6 +16,8 @@ const workspaceStore = useWorkspace() const isLocked = inject(IsLockedInj, ref(false)) +const { copy } = useCopy() + const isUpdating = ref({ public: false, password: false, @@ -104,16 +106,37 @@ const togglePasswordProtected = async () => { const isOpenCustomUrlLocal = ref(false) const isOpenCustomUrl = computed(() => { - return !!activeView.value?.password || isOpenCustomUrlLocal.value + return !!activeView.value?.custom_url_path || isOpenCustomUrlLocal.value }) -const customUrl = computed({ - get: () => (isOpenCustomUrl.value ? activeView.value?.custom_url_path ?? '' : ''), - set: async (value) => { - if (!activeView.value) return +const customUrl = ref() - activeView.value = { ...(activeView.value as any), custom_url_path: isOpenCustomUrl.value ? value : null } - }, +// const customUrl = computed({ +// get: () => (isOpenCustomUrl.value ? activeView.value?.custom_url_path ?? '' : ''), +// set: async (value) => { +// if (!activeView.value) return + +// activeView.value = { ...(activeView.value as any), custom_url_path: isOpenCustomUrl.value ? value : null } +// }, +// }) + +const dashboardUrl1 = computed(() => { + // get base url for workspace + const baseUrl = getBaseUrl(workspaceStore.activeWorkspaceId) + + if (baseUrl) { + return `${baseUrl}${appInfo.value?.dashboardPath}` + } + + return dashboardUrl.value +}) + +const copyCustomUrl = () => { + copy(`${dashboardUrl1.value}}#/shared/${customUrl.value}`) +} + +onMounted(() => { + customUrl.value = activeView.value?.custom_url_path }) const toggleCustomUrl = async () => { @@ -121,17 +144,17 @@ const toggleCustomUrl = async () => { if (!activeView.value) return if (isUpdating.value.customUrl) return - isUpdating.value.password = true + isUpdating.value.customUrl = true try { - if (passwordProtected.value) { - activeView.value = { ...(activeView.value as any), custom_url_path: null } + if (isOpenCustomUrl.value) { + customUrl.value = null } else { - activeView.value = { ...(activeView.value as any), custom_url_path: '' } + customUrl.value = null } await updateSharedView() } finally { - isUpdating.value.password = false + isUpdating.value.customUrl = false } } @@ -251,17 +274,6 @@ function sharedViewUrl() { }` } -const dashboardUrl1 = computed(() => { - // get base url for workspace - const baseUrl = getBaseUrl(workspaceStore.activeWorkspaceId) - - if (baseUrl) { - return `${baseUrl}${appInfo.value?.dashboardPath}` - } - - return dashboardUrl.value -}) - const toggleViewShare = async () => { if (!activeView.value?.id) return @@ -328,8 +340,9 @@ async function updateSharedView() { await $api.dbViewShare.update(activeView.value.id!, { meta, password: activeView.value.password, - custom_url_path: activeView.value?.custom_url_path ?? null, + custom_url_path: customUrl.value ?? null, }) + activeView.value.custom_url_path = customUrl.value ?? null } catch (e: any) { message.error(await extractSdkResponseErrorMsg(e)) } @@ -396,10 +409,20 @@ async function savePreFilledMode() { size="small" :bordered="false" autocomplete="off" - @update:value="updateSharedViewWithDebounce" />
- + + + {{ $t('general.copy') }} + + {{ $t('general.save') }}
diff --git a/packages/nocodb/src/controllers/custom-urls.controller.ts b/packages/nocodb/src/controllers/custom-urls.controller.ts index eb23cc7bc5..e93295eec4 100644 --- a/packages/nocodb/src/controllers/custom-urls.controller.ts +++ b/packages/nocodb/src/controllers/custom-urls.controller.ts @@ -9,8 +9,6 @@ import { } from '@nestjs/common'; import { GlobalGuard } from '~/guards/global/global.guard'; import { MetaApiLimiterGuard } from '~/guards/meta-api-limiter.guard'; -import { TenantContext } from '~/decorators/tenant-context.decorator'; -import { NcContext } from '~/interface/config'; import { CustomUrlsService } from 'src/services/custom-urls.service'; @Controller() @@ -22,23 +20,19 @@ export class CustomUrlsController { '/api/v1/db/meta/custom-url/:customPath', '/api/v2/meta/custom-url/:customPath', ]) - async getOriginalPath( - @TenantContext() context: NcContext, - @Param('customPath') customPath: string, - ) { - await this.customUrlsService.getOriginalPath(context, customPath); + async getOriginalPath(@Param('customPath') customPath: string) { + return await this.customUrlsService.getOriginalPath(customPath); } @Post(['/api/v1/db/meta/custom-url/check-path', '/api/v2/meta/check-path']) @HttpCode(200) async checkAvailability( - @TenantContext() context: NcContext, @Body() body: { id?: string; custom_path?: string; }, ) { - await this.customUrlsService.checkAvailability(context, body); + return await this.customUrlsService.checkAvailability(body); } } diff --git a/packages/nocodb/src/models/CustomUrl.ts b/packages/nocodb/src/models/CustomUrl.ts index 40a0111b62..2906c12fc6 100644 --- a/packages/nocodb/src/models/CustomUrl.ts +++ b/packages/nocodb/src/models/CustomUrl.ts @@ -7,7 +7,7 @@ import { RootScopes, } from '~/utils/globals'; import NocoCache from '~/cache/NocoCache'; -import { NcContext } from 'src/interface/config'; +import { NcError } from 'src/helpers/catchError'; export default class CustomUrl { id?: string; @@ -23,7 +23,6 @@ export default class CustomUrl { } public static async get( - _context: NcContext, params: Pick, ncMeta = Noco.ncMeta, ) { @@ -40,7 +39,6 @@ export default class CustomUrl { } public static async getOriginUrlByCustomPath( - _context: NcContext, customPath: string, ncMeta = Noco.ncMeta, ) { @@ -64,13 +62,14 @@ export default class CustomUrl { } } - console.log('custom url', customUrl); + if (!customUrl) { + NcError.notFound(); + } - return customUrl && new CustomUrl(customUrl); + return customUrl?.original_path; } public static async insert( - _context: NcContext, customUrl: Partial, ncMeta = Noco.ncMeta, ) { @@ -94,7 +93,6 @@ export default class CustomUrl { } public static async list( - _context: NcContext, params: Pick, ncMeta = Noco.ncMeta, ) { @@ -117,7 +115,6 @@ export default class CustomUrl { } public static async update( - _context: NcContext, id: string, customUrl: Partial, ncMeta = Noco.ncMeta, @@ -137,7 +134,6 @@ export default class CustomUrl { } public static async checkAvailability( - _context: NcContext, params: Pick, ncMeta = Noco.ncMeta, ) { @@ -165,7 +161,6 @@ export default class CustomUrl { } static async delete( - _context: NcContext, customUrl: Pick, ncMeta = Noco.ncMeta, ) { diff --git a/packages/nocodb/src/models/View.ts b/packages/nocodb/src/models/View.ts index cf50866d74..375fd6d769 100644 --- a/packages/nocodb/src/models/View.ts +++ b/packages/nocodb/src/models/View.ts @@ -131,7 +131,7 @@ export default class View implements ViewType { view.meta = parseMetaProp(view); if (view.fk_custom_url_id) { - const customUrl = await CustomUrl.get(context, { + const customUrl = await CustomUrl.get({ id: view.fk_custom_url_id, }); @@ -181,7 +181,7 @@ export default class View implements ViewType { if (view) { if (view.fk_custom_url_id) { - const customUrl = await CustomUrl.get(context, { + const customUrl = await CustomUrl.get({ id: view.fk_custom_url_id, }); @@ -229,7 +229,7 @@ export default class View implements ViewType { if (view) { view.meta = parseMetaProp(view); if (view.fk_custom_url_id) { - const customUrl = await CustomUrl.get(context, { + const customUrl = await CustomUrl.get({ id: view.fk_custom_url_id, }); @@ -268,7 +268,7 @@ export default class View implements ViewType { view.meta = parseMetaProp(view); if (view.fk_custom_url_id) { - const customUrl = await CustomUrl.get(context, { + const customUrl = await CustomUrl.get({ id: view.fk_custom_url_id, }); @@ -1283,7 +1283,7 @@ export default class View implements ViewType { viewId, ); - await CustomUrl.delete(context, { view_id: viewId }); + await CustomUrl.delete({ view_id: viewId }); await NocoCache.update(`${CacheScope.VIEW}:${viewId}`, { uuid: null, @@ -1448,7 +1448,7 @@ export default class View implements ViewType { } if (view.fk_custom_url_id) { - await CustomUrl.delete(context, { id: view.fk_custom_url_id }); + await CustomUrl.delete({ id: view.fk_custom_url_id }); } // on update, delete any optimised single query cache diff --git a/packages/nocodb/src/modules/noco.module.ts b/packages/nocodb/src/modules/noco.module.ts index fd0dde746e..fea94f19d6 100644 --- a/packages/nocodb/src/modules/noco.module.ts +++ b/packages/nocodb/src/modules/noco.module.ts @@ -16,6 +16,8 @@ import { AppHooksService } from '~/services/app-hooks/app-hooks.service'; import { TelemetryService } from '~/services/telemetry.service'; import { AppHooksListenerService } from '~/services/app-hooks-listener.service'; import { HookHandlerService } from '~/services/hook-handler.service'; +import { CustomUrlsController } from '~/controllers/custom-urls.controller'; +import { CustomUrlsService } from '~/services/custom-urls.service'; /* User */ import { UsersController } from '~/controllers/users/users.controller'; @@ -145,6 +147,8 @@ export const nocoModuleMetadata = { controllers: [ ...(process.env.NC_WORKER_CONTAINER !== 'true' ? [ + CustomUrlsController, + /* Users */ UsersController, @@ -215,6 +219,7 @@ export const nocoModuleMetadata = { AppHooksListenerService, TelemetryService, HookHandlerService, + CustomUrlsService, /* Users */ UsersService, @@ -277,6 +282,7 @@ export const nocoModuleMetadata = { TelemetryService, HookHandlerService, JwtStrategy, + CustomUrlsService, /* Users */ UsersService, diff --git a/packages/nocodb/src/services/custom-urls.service.ts b/packages/nocodb/src/services/custom-urls.service.ts index b5c1338715..02e55402f8 100644 --- a/packages/nocodb/src/services/custom-urls.service.ts +++ b/packages/nocodb/src/services/custom-urls.service.ts @@ -7,14 +7,11 @@ import CustomUrl from 'src/models/CustomUrl'; export class CustomUrlsService { constructor(private readonly appHooksService: AppHooksService) {} - async checkAvailability( - context: NcContext, - params: Pick, - ) { - return await CustomUrl.checkAvailability(context, params); + async checkAvailability(params: Pick) { + return await CustomUrl.checkAvailability(params); } - async getOriginalPath(context: NcContext, custom_path: string) { - return await CustomUrl.getOriginUrlByCustomPath(context, custom_path); + async getOriginalPath(custom_path: string) { + return await CustomUrl.getOriginUrlByCustomPath(custom_path); } } diff --git a/packages/nocodb/src/services/views.service.ts b/packages/nocodb/src/services/views.service.ts index 1fd3cbce5b..4a4fd42ec1 100644 --- a/packages/nocodb/src/services/views.service.ts +++ b/packages/nocodb/src/services/views.service.ts @@ -273,22 +273,22 @@ export class ViewsService { NcError.viewNotFound(param.viewId); } - let customUrl: CustomUrl | undefined = await CustomUrl.get(context, { + let customUrl: CustomUrl | undefined = await CustomUrl.get({ view_id: view.id, id: view.fk_custom_url_id, }); if (customUrl?.id) { if (param.sharedView.custom_url_path) { - await CustomUrl.update(context, view.fk_custom_url_id, { + await CustomUrl.update(view.fk_custom_url_id, { custom_path: param.sharedView.custom_url_path, }); } else { - await CustomUrl.delete(context, { id: view.fk_custom_url_id }); + await CustomUrl.delete({ id: view.fk_custom_url_id }); customUrl = undefined; } } else { - customUrl = await CustomUrl.insert(context, { + customUrl = await CustomUrl.insert({ fk_workspace_id: view.fk_workspace_id, base_id: view.base_id, fk_model_id: view.fk_model_id,