diff --git a/packages/nc-gui/components/dashboard/BackToBase/BreadcrumbVariant.vue b/packages/nc-gui/components/dashboard/BackToBase/BreadcrumbVariant.vue index f010ea40b9..756d09ce9a 100644 --- a/packages/nc-gui/components/dashboard/BackToBase/BreadcrumbVariant.vue +++ b/packages/nc-gui/components/dashboard/BackToBase/BreadcrumbVariant.vue @@ -2,11 +2,19 @@ Full-width bar rendered between the breadcrumb row and the page tabs. Only visible when shouldShow is true and variant is 'breadcrumb'. --> diff --git a/packages/nc-gui/components/workspace/View.vue b/packages/nc-gui/components/workspace/View.vue index 821dfbffe7..06dd9925c6 100644 --- a/packages/nc-gui/components/workspace/View.vue +++ b/packages/nc-gui/components/workspace/View.vue @@ -4,6 +4,7 @@ import { PlanFeatureTypes, PlanTitles } from 'nocodb-sdk' const props = defineProps<{ workspaceId?: string + isNewWsPage?: boolean }>() const router = useRouter() @@ -35,6 +36,13 @@ const { isEEFeatureBlocked, } = useEeConfig() +const { isFromIntegrationPage, integrationPaginationData, loadIntegrations } = useProvideIntegrationViewStore() + +// Local ref for inner integrations sub-tabs in settings sidebar mode. +// Cannot use activeViewTab (which writes to route.query.tab) because the outer NcTabs +// also reads route.query.tab — changing it to 'connections' makes the outer pane blank. +const integrationsSubTab = ref('integrations') + const hasTeamsEditPermission = computed(() => { return isEeUI && isTeamsEnabled.value && isUIAllowed('teamCreate') }) @@ -55,9 +63,25 @@ const currentWorkspace = computedAsync(async () => { return ws }) +const routeNameToWsTab: Record = { + 'index-typeOrId-index': 'bases', + 'index-typeOrId': 'bases', + 'index-typeOrId-members': 'collaborators', + 'index-typeOrId-teams': 'teams', + 'index-typeOrId-integrations': 'integrations', + 'index-typeOrId-audits': 'audits', + 'index-typeOrId-billing': 'billing', + 'index-typeOrId-sso': 'sso', + 'index-typeOrId-settings': 'settings', +} + +const wsTabToRouteName: Record = Object.fromEntries(Object.entries(routeNameToWsTab).map(([k, v]) => [v, k])) + const tab = computed({ get() { - return route.value.query?.tab ?? 'collaborators' + return props.isNewWsPage + ? routeNameToWsTab[route.value.name as string] || 'collaborators' + : route.value.query?.tab ?? 'collaborators' }, set(tab: string) { if (!isWsAuditEnabled.value && tab === 'audits') { @@ -76,7 +100,11 @@ const tab = computed({ loadCollaborators({} as any, props.workspaceId) } - router.push({ query: { ...route.value.query, tab } }) + if (props.isNewWsPage) { + router.push({ name: wsTabToRouteName[tab] || 'index-typeOrId' }) + } else { + router.push({ query: { ...route.value.query, tab } }) + } }, }) @@ -113,7 +141,12 @@ onMounted(() => { watch( () => route.value.query?.tab, - async (newTab) => { + async (newTab, oldTab) => { + if (oldTab === 'integrations') { + isFromIntegrationPage.value = false + integrationsSubTab.value = 'integrations' + } + await until(() => isBaseRolesLoaded.value).toBeTruthy() if (!isUIAllowed('workspaceCollaborators') && !isEEFeatureBlocked.value) { @@ -130,19 +163,21 @@ watch( }, ) -onMounted(() => { - hideSidebar.value = true -}) +if (!props.isNewWsPage) { + onMounted(() => { + hideSidebar.value = true + }) -onBeforeUnmount(() => { - hideSidebar.value = false -}) + onBeforeUnmount(() => { + hideSidebar.value = false + }) +}