feat: unify project.view & project.index

This commit is contained in:
Dominik Pschenitschni 2024-11-07 17:26:06 +01:00
parent 1803135c17
commit 60f3ee00bc
16 changed files with 46 additions and 40 deletions

View File

@ -37,7 +37,7 @@
v-slot="{ Component }"
:route="routeWithModal"
>
<keep-alive :include="['project.view']">
<keep-alive :include="['project']">
<component :is="Component" />
</keep-alive>
</RouterView>

View File

@ -15,7 +15,7 @@
/>
</BaseButton>
<BaseButton
:to="{ name: 'project.index', params: { projectId: project.id} }"
:to="{ name: 'project', params: { projectId: project.id} }"
class="list-menu-link"
:class="{'router-link-exact-active': currentProject?.id === project.id}"
>

View File

@ -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',

View File

@ -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) }}
</BaseButton>

View File

@ -37,7 +37,7 @@
:aria-label="project.title"
:title="textOnlyDescription"
:to="{
name: 'project.index',
name: 'project',
params: { projectId: project.id}
}"
/>

View File

@ -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<IProject>).id},
})
break

View File

@ -28,7 +28,7 @@
<RouterLink
v-if="showProject && typeof project !== 'undefined'"
v-tooltip="$t('task.detail.belongsToProject', {project: project.title})"
:to="{ name: 'project.index', params: { projectId: task.projectId } }"
:to="{ name: 'project', params: { projectId: task.projectId } }"
class="task-project mr-1"
:class="{'mr-2': task.hexColor !== ''}"
@click.stop
@ -139,7 +139,7 @@
<RouterLink
v-if="showProjectSeparately"
v-tooltip="$t('task.detail.belongsToProject', {project: project.title})"
:to="{ name: 'project.index', params: { projectId: task.projectId } }"
:to="{ name: 'project', params: { projectId: task.projectId } }"
class="task-project"
@click.stop
>

View File

@ -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<RouteLocationNormalized>, viewId: Ref
ganttGetDefaultFilters,
ganttRouteToFilters,
ganttFiltersToRoute,
['project.view'],
['project'],
)
const {

View File

@ -72,7 +72,7 @@ export function useRouteWithModal() {
}
const newRoute = {
name: 'project.view',
name: 'project',
params: {
projectId: baseStore.currentProject?.id,
viewId,

View File

@ -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,

View File

@ -108,7 +108,7 @@ function useAuth() {
}
return router.push({
name: 'project.index',
name: 'project',
params: {
projectId,
},

View File

@ -35,7 +35,7 @@
</a>
<RouterLink
v-else
:to="{ name: 'project.index', params: { projectId: p.id } }"
:to="{ name: 'project', params: { projectId: p.id } }"
>
{{ getProjectTitle(p) }}
</RouterLink>
@ -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() {

View File

@ -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,
},
}
},
},
],
})

View File

@ -87,7 +87,7 @@ export function useSavedFilter(projectId?: MaybeRefOrGetter<IProject['id']>) {
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() {

View File

@ -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<IProject['id']>) {
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 {

View File

@ -33,7 +33,7 @@ declare module 'vue-router/auto-routes' {
'labels.create': RouteRecordInfo<'labels.create', '/labels/new', Record<never, never>, Record<never, never>>,
'migrate.service': RouteRecordInfo<'migrate.service', '/migrate/:service', { service: ParamValue<true> }, { service: ParamValue<false> }>,
'project.create': RouteRecordInfo<'project.create', '/projects/:parentProjectId?/new', { parentProjectId?: ParamValueZeroOrOne<true> }, { parentProjectId?: ParamValueZeroOrOne<false> }>,
'/projects/[projectId]/[[viewId]]': RouteRecordInfo<'/projects/[projectId]/[[viewId]]', '/projects/:projectId/:viewId?', { projectId: ParamValue<true>, viewId?: ParamValueZeroOrOne<true> }, { projectId: ParamValue<false>, viewId?: ParamValueZeroOrOne<false> }>,
'project': RouteRecordInfo<'project', '/projects/:projectId/:viewId?', { projectId: ParamValue<true>, viewId?: ParamValueZeroOrOne<true> }, { projectId: ParamValue<false>, viewId?: ParamValueZeroOrOne<false> }>,
'project.info': RouteRecordInfo<'project.info', '/projects/:projectId/info', { projectId: ParamValue<true> }, { projectId: ParamValue<false> }>,
'project.settings.archive': RouteRecordInfo<'project.settings.archive', '/projects/:projectId/settings/archive', { projectId: ParamValue<true> }, { projectId: ParamValue<false> }>,
'project.settings.background': RouteRecordInfo<'project.settings.background', '/projects/:projectId/settings/background', { projectId: ParamValue<true> }, { projectId: ParamValue<false> }>,