diff --git a/packages/nc-gui/components/dashboard/TreeView/CreateViewBtn.vue b/packages/nc-gui/components/dashboard/TreeView/CreateViewBtn.vue index 7c3e8a4466..02917ac392 100644 --- a/packages/nc-gui/components/dashboard/TreeView/CreateViewBtn.vue +++ b/packages/nc-gui/components/dashboard/TreeView/CreateViewBtn.vue @@ -9,9 +9,10 @@ const router = useRouter() const { refreshCommandPalette } = useCommandPalette() const viewsStore = useViewsStore() const { views } = storeToRefs(viewsStore) -const { loadViews } = viewsStore +const { loadViews, navigateToView } = viewsStore const table = inject(SidebarTableInj)! +const project = inject(ProjectInj)! const isOpen = ref(false) @@ -46,7 +47,11 @@ function onOpenModal({ await loadViews() - router.push({ params: { viewTitle: view.id || '' } }) + navigateToView({ + view, + tableId: table.value.id!, + projectId: project.value.id!, + }) $e('a:view:create', { view: view.type }) }, diff --git a/packages/nc-gui/components/dashboard/TreeView/ViewsList.vue b/packages/nc-gui/components/dashboard/TreeView/ViewsList.vue index 611b2f3ebe..4551df02b5 100644 --- a/packages/nc-gui/components/dashboard/TreeView/ViewsList.vue +++ b/packages/nc-gui/components/dashboard/TreeView/ViewsList.vue @@ -53,6 +53,8 @@ const { refreshCommandPalette } = useCommandPalette() const { addUndo, defineModelScope } = useUndoRedo() +const { navigateToView } = useViewsStore() + /** Selected view(s) for menu */ const selected = ref([]) @@ -187,31 +189,12 @@ onMounted(() => menuRef.value && initSortable(menuRef.value.$el)) /** Navigate to view by changing url param */ function changeView(view: ViewType) { - const routeName = 'index-typeOrId-projectId-index-index-viewId-viewTitle' - if ( - router.currentRoute.value.query && - router.currentRoute.value.query.page && - router.currentRoute.value.query.page === 'fields' - ) { - router.push({ - name: routeName, - params: { viewTitle: view.id || '', viewId: table.value.id, projectId: project.value.id }, - query: router.currentRoute.value.query, - }) - } else { - router.push({ name: routeName, params: { viewTitle: view.id || '', viewId: table.value.id, projectId: project.value.id } }) - } - - if (view.type === ViewTypes.FORM && selected.value[0] === view.id) { - // reload the page if the same form view is clicked - // router.go(0) - // fix me: router.go(0) reloads entire page. need to reload only the form view - router - .replace({ name: routeName, query: { reload: 'true' }, params: { viewId: table.value.id, projectId: project.value.id } }) - .then(() => { - router.replace({ name: routeName, query: {}, params: { viewId: table.value.id, projectId: project.value.id } }) - }) - } + navigateToView({ + view, + tableId: table.value.id!, + projectId: project.value.id!, + hardReload: view.type === ViewTypes.FORM && selected.value[0] === view.id, + }) } /** Rename a view */ diff --git a/packages/nc-gui/store/views.ts b/packages/nc-gui/store/views.ts index de0fad35c6..104c386dcf 100644 --- a/packages/nc-gui/store/views.ts +++ b/packages/nc-gui/store/views.ts @@ -1,4 +1,4 @@ -import type { ViewType } from 'nocodb-sdk' +import { type ViewType } from 'nocodb-sdk' import { acceptHMRUpdate, defineStore } from 'pinia' import type { ViewPageType } from '~/lib' @@ -136,6 +136,40 @@ export const useViewsStore = defineStore('viewsStore', () => { const isLockedView = computed(() => activeView.value?.lock_type === 'locked') + const navigateToView = async ({ + view, + projectId, + tableId, + hardReload, + }: { + view: ViewType + projectId: string + tableId: string + hardReload?: boolean + }) => { + const routeName = 'index-typeOrId-projectId-index-index-viewId-viewTitle' + + if ( + router.currentRoute.value.query && + router.currentRoute.value.query.page && + router.currentRoute.value.query.page === 'fields' + ) { + await router.push({ + name: routeName, + params: { viewTitle: view.id || '', viewId: tableId, projectId }, + query: router.currentRoute.value.query, + }) + } else { + await router.push({ name: routeName, params: { viewTitle: view.id || '', viewId: tableId, projectId } }) + } + + if (hardReload) { + await router.replace({ name: routeName, query: { reload: 'true' }, params: { viewId: tableId, projectId } }).then(() => { + router.replace({ name: routeName, query: {}, params: { viewId: tableId, projectId } }) + }) + } + } + return { isLockedView, isViewsLoading, @@ -149,6 +183,7 @@ export const useViewsStore = defineStore('viewsStore', () => { sharedView, viewsByTable, activeViewTitleOrId, + navigateToView, } })