From 60f3ee00bc4fc2dbbbbaafac68259866836aa8fb Mon Sep 17 00:00:00 2001 From: Dominik Pschenitschni Date: Thu, 7 Nov 2024 17:26:06 +0100 Subject: [PATCH] feat: unify project.view & project.index --- frontend/src/components/home/ContentAuth.vue | 2 +- .../home/ProjectsNavigationItem.vue | 2 +- .../misc/keyboard-shortcuts/shortcuts.ts | 2 +- .../src/components/project/ProjectWrapper.vue | 2 +- .../project/partials/ProjectCard.vue | 2 +- .../components/quick-actions/QuickActions.vue | 2 +- .../tasks/partials/SingleTaskInProject.vue | 4 +-- frontend/src/composables/useGanttFilters.ts | 4 +-- frontend/src/composables/useRouteWithModal.ts | 2 +- .../pages/projects/[projectId]/[[viewId]].vue | 30 +++++++++++++++++-- frontend/src/pages/share/[share]/auth.vue | 2 +- frontend/src/pages/task/[id].vue | 4 +-- frontend/src/router/index.ts | 20 ------------- frontend/src/services/savedFilter.ts | 2 +- frontend/src/stores/projects.ts | 4 +-- frontend/typed-router.d.ts | 2 +- 16 files changed, 46 insertions(+), 40 deletions(-) diff --git a/frontend/src/components/home/ContentAuth.vue b/frontend/src/components/home/ContentAuth.vue index 8362803a5..c0ee62e9c 100644 --- a/frontend/src/components/home/ContentAuth.vue +++ b/frontend/src/components/home/ContentAuth.vue @@ -37,7 +37,7 @@ v-slot="{ Component }" :route="routeWithModal" > - + diff --git a/frontend/src/components/home/ProjectsNavigationItem.vue b/frontend/src/components/home/ProjectsNavigationItem.vue index 68d0757cb..91fe2cfdb 100644 --- a/frontend/src/components/home/ProjectsNavigationItem.vue +++ b/frontend/src/components/home/ProjectsNavigationItem.vue @@ -15,7 +15,7 @@ /> diff --git a/frontend/src/components/misc/keyboard-shortcuts/shortcuts.ts b/frontend/src/components/misc/keyboard-shortcuts/shortcuts.ts index d41b13679..53b33625d 100644 --- a/frontend/src/components/misc/keyboard-shortcuts/shortcuts.ts +++ b/frontend/src/components/misc/keyboard-shortcuts/shortcuts.ts @@ -62,7 +62,7 @@ export const KEYBOARD_SHORTCUTS : ShortcutGroup[] = [ }, { title: 'project.kanban.title', - available: (route) => route.name === 'project.view', + available: (route) => route.name === 'project', shortcuts: [ { title: 'keyboardShortcuts.task.done', diff --git a/frontend/src/components/project/ProjectWrapper.vue b/frontend/src/components/project/ProjectWrapper.vue index fba840101..190ce82d7 100644 --- a/frontend/src/components/project/ProjectWrapper.vue +++ b/frontend/src/components/project/ProjectWrapper.vue @@ -23,7 +23,7 @@ :key="view.id" class="switch-view-button" :class="{'is-active': view.id === viewId}" - :to="{ name: 'project.view', params: { projectId, viewId: view.id } }" + :to="{ name: 'project', params: { projectId, viewId: view.id } }" > {{ getViewTitle(view) }} diff --git a/frontend/src/components/project/partials/ProjectCard.vue b/frontend/src/components/project/partials/ProjectCard.vue index fdd14839c..7f836b883 100644 --- a/frontend/src/components/project/partials/ProjectCard.vue +++ b/frontend/src/components/project/partials/ProjectCard.vue @@ -37,7 +37,7 @@ :aria-label="project.title" :title="textOnlyDescription" :to="{ - name: 'project.index', + name: 'project', params: { projectId: project.id} }" /> diff --git a/frontend/src/components/quick-actions/QuickActions.vue b/frontend/src/components/quick-actions/QuickActions.vue index bfa3b2762..da1428e58 100644 --- a/frontend/src/components/quick-actions/QuickActions.vue +++ b/frontend/src/components/quick-actions/QuickActions.vue @@ -449,7 +449,7 @@ async function doAction(type: ACTION_TYPE, item: DoAction) { case ACTION_TYPE.PROJECT: closeQuickActions() await router.push({ - name: 'project.index', + name: 'project', params: {projectId: (item as DoAction).id}, }) break diff --git a/frontend/src/components/tasks/partials/SingleTaskInProject.vue b/frontend/src/components/tasks/partials/SingleTaskInProject.vue index 63aac98d9..8a2b59104 100644 --- a/frontend/src/components/tasks/partials/SingleTaskInProject.vue +++ b/frontend/src/components/tasks/partials/SingleTaskInProject.vue @@ -28,7 +28,7 @@ diff --git a/frontend/src/composables/useGanttFilters.ts b/frontend/src/composables/useGanttFilters.ts index bd2079f23..bcda0e1f8 100644 --- a/frontend/src/composables/useGanttFilters.ts +++ b/frontend/src/composables/useGanttFilters.ts @@ -72,7 +72,7 @@ function ganttFiltersToRoute(filters: GanttFilters): RouteLocationRaw { } return { - name: 'project.view', + name: 'project', params: { projectId: filters.projectId, viewId: filters.viewId, @@ -104,7 +104,7 @@ export function useGanttFilters(route: Ref, viewId: Ref ganttGetDefaultFilters, ganttRouteToFilters, ganttFiltersToRoute, - ['project.view'], + ['project'], ) const { diff --git a/frontend/src/composables/useRouteWithModal.ts b/frontend/src/composables/useRouteWithModal.ts index 4857b3c67..58b35d910 100644 --- a/frontend/src/composables/useRouteWithModal.ts +++ b/frontend/src/composables/useRouteWithModal.ts @@ -72,7 +72,7 @@ export function useRouteWithModal() { } const newRoute = { - name: 'project.view', + name: 'project', params: { projectId: baseStore.currentProject?.id, viewId, diff --git a/frontend/src/pages/projects/[projectId]/[[viewId]].vue b/frontend/src/pages/projects/[projectId]/[[viewId]].vue index a81041807..94dd096a9 100644 --- a/frontend/src/pages/projects/[projectId]/[[viewId]].vue +++ b/frontend/src/pages/projects/[projectId]/[[viewId]].vue @@ -6,7 +6,7 @@ import {useBaseStore} from '@/stores/base' import {useProjectStore} from '@/stores/projects' import {useAuthStore} from '@/stores/auth' -import {saveProjectView} from '@/helpers/projectView' +import {getProjectViewId, saveProjectView} from '@/helpers/projectView' import ProjectService from '@/services/project' import ProjectList from '@/components/project/views/ProjectList.vue' @@ -17,6 +17,32 @@ import ProjectKanban from '@/components/project/views/ProjectKanban.vue' import {DEFAULT_PROJECT_VIEW_SETTINGS} from '@/modelTypes/IProjectView' import {saveProjectToHistory} from '@/modules/projectHistory' +definePage({ + name: 'project', + beforeEnter(to) { + if (to.name !== 'project') { + throw new Error() + } + + const viewIdFromRoute = Number(to.params?.viewId) + + if (!viewIdFromRoute) { + return { + name: 'project', + replace: true, + params: { + projectId: to.params.projectId, + viewId: getProjectViewId(Number(to.params?.projectId)) ?? 0, + }, + } + } + }, + props: route => ({ + projectId: parseInt(route.params.projectId as string), + viewId: route.params.viewId ? parseInt(route.params.viewId as string): undefined, + }), +}) + const props = defineProps<{ projectId: number, viewId: number, @@ -100,7 +126,7 @@ function redirectToDefaultViewIfNecessary() { if (view) { router.replace({ - name: 'project.view', + name: 'project', params: { projectId: props.projectId, viewId: view.id, diff --git a/frontend/src/pages/share/[share]/auth.vue b/frontend/src/pages/share/[share]/auth.vue index 0ef17b45e..a75c52418 100644 --- a/frontend/src/pages/share/[share]/auth.vue +++ b/frontend/src/pages/share/[share]/auth.vue @@ -108,7 +108,7 @@ function useAuth() { } return router.push({ - name: 'project.index', + name: 'project', params: { projectId, }, diff --git a/frontend/src/pages/task/[id].vue b/frontend/src/pages/task/[id].vue index 7a45e0f8f..90b100a65 100644 --- a/frontend/src/pages/task/[id].vue +++ b/frontend/src/pages/task/[id].vue @@ -35,7 +35,7 @@ {{ getProjectTitle(p) }} @@ -881,7 +881,7 @@ const showDeleteModal = ref(false) async function deleteTask() { await taskStore.delete(task.value) success({message: t('task.detail.deleteSuccess')}) - router.push({name: 'project.index', params: {projectId: task.value.projectId}}) + router.push({name: 'project', params: {projectId: task.value.projectId}}) } async function toggleTaskDone() { diff --git a/frontend/src/router/index.ts b/frontend/src/router/index.ts index 486adaf5f..45591ddd2 100644 --- a/frontend/src/router/index.ts +++ b/frontend/src/router/index.ts @@ -3,7 +3,6 @@ import { routes, handleHotUpdate } from 'vue-router/auto-routes' import {saveLastVisited} from '@/helpers/saveLastVisited' -import {getProjectViewId} from '@/helpers/projectView' import {LINK_SHARE_HASH_PREFIX} from '@/constants/linkShareHash' import {useAuthStore} from '@/stores/auth' @@ -40,25 +39,6 @@ const router = createRouter({ } }, }, - { - path: '/projects/:projectId', - name: 'project.index', - redirect(to) { - const viewId = getProjectViewId(Number(to.params.projectId as string)) - - if (viewId) { - console.debug('Replaced list view with', viewId) - } - - return { - name: 'project.view', - params: { - projectId: parseInt(to.params.projectId as string), - viewId: viewId ?? 0, - }, - } - }, - }, ], }) diff --git a/frontend/src/services/savedFilter.ts b/frontend/src/services/savedFilter.ts index 41a047fef..44ebff6e9 100644 --- a/frontend/src/services/savedFilter.ts +++ b/frontend/src/services/savedFilter.ts @@ -87,7 +87,7 @@ export function useSavedFilter(projectId?: MaybeRefOrGetter) { async function createFilter() { filter.value = await filterService.create(filter.value) await projectStore.loadAllProjects() - router.push({name: 'project.index', params: {projectId: getProjectId(filter.value)}}) + router.push({name: 'project', params: {projectId: getProjectId(filter.value)}}) } async function saveFilter() { diff --git a/frontend/src/stores/projects.ts b/frontend/src/stores/projects.ts index 9e929d1d9..7e0cf3cae 100644 --- a/frontend/src/stores/projects.ts +++ b/frontend/src/stores/projects.ts @@ -150,7 +150,7 @@ export const useProjectStore = defineStore('project', () => { const createdProject = await projectService.create(project) setProject(createdProject) router.push({ - name: 'project.index', + name: 'project', params: { projectId: createdProject.id }, }) return createdProject @@ -315,7 +315,7 @@ export function useProject(projectId: MaybeRefOrGetter) { projectStore.setProject(duplicate.duplicatedProject) success({message: t('project.duplicate.success')}) - router.push({name: 'project.index', params: {projectId: duplicate.duplicatedProject.id}}) + router.push({name: 'project', params: {projectId: duplicate.duplicatedProject.id}}) } return { diff --git a/frontend/typed-router.d.ts b/frontend/typed-router.d.ts index 78f73390a..4cf62be02 100644 --- a/frontend/typed-router.d.ts +++ b/frontend/typed-router.d.ts @@ -33,7 +33,7 @@ declare module 'vue-router/auto-routes' { 'labels.create': RouteRecordInfo<'labels.create', '/labels/new', Record, Record>, 'migrate.service': RouteRecordInfo<'migrate.service', '/migrate/:service', { service: ParamValue }, { service: ParamValue }>, 'project.create': RouteRecordInfo<'project.create', '/projects/:parentProjectId?/new', { parentProjectId?: ParamValueZeroOrOne }, { parentProjectId?: ParamValueZeroOrOne }>, - '/projects/[projectId]/[[viewId]]': RouteRecordInfo<'/projects/[projectId]/[[viewId]]', '/projects/:projectId/:viewId?', { projectId: ParamValue, viewId?: ParamValueZeroOrOne }, { projectId: ParamValue, viewId?: ParamValueZeroOrOne }>, + 'project': RouteRecordInfo<'project', '/projects/:projectId/:viewId?', { projectId: ParamValue, viewId?: ParamValueZeroOrOne }, { projectId: ParamValue, viewId?: ParamValueZeroOrOne }>, 'project.info': RouteRecordInfo<'project.info', '/projects/:projectId/info', { projectId: ParamValue }, { projectId: ParamValue }>, 'project.settings.archive': RouteRecordInfo<'project.settings.archive', '/projects/:projectId/settings/archive', { projectId: ParamValue }, { projectId: ParamValue }>, 'project.settings.background': RouteRecordInfo<'project.settings.background', '/projects/:projectId/settings/background', { projectId: ParamValue }, { projectId: ParamValue }>,