From e1bdabc8d670f7342f4f0777a30a961e3fd4601d Mon Sep 17 00:00:00 2001 From: kolaente Date: Sat, 25 Mar 2023 14:27:19 +0100 Subject: [PATCH 001/123] feat: move namespaces list to projects list --- src/components/home/contentAuth.vue | 2 +- src/components/home/navigation.vue | 207 ++++++++++++------------ src/i18n/lang/en.json | 2 +- src/router/index.ts | 12 +- src/services/savedFilter.ts | 2 +- src/stores/projects.ts | 15 ++ src/views/namespaces/ListNamespaces.vue | 139 ---------------- src/views/project/ListProjects.vue | 144 +++++++++++++++++ 8 files changed, 273 insertions(+), 250 deletions(-) delete mode 100644 src/views/namespaces/ListNamespaces.vue create mode 100644 src/views/project/ListProjects.vue diff --git a/src/components/home/contentAuth.vue b/src/components/home/contentAuth.vue index 4ee1f2e8b..a5b481dd2 100644 --- a/src/components/home/contentAuth.vue +++ b/src/components/home/contentAuth.vue @@ -101,7 +101,7 @@ watch(() => route.name as string, (routeName) => { 'labels.index', 'migrate.start', 'migrate.wunderlist', - 'namespaces.index', + 'projects.index', ].includes(routeName) || routeName.startsWith('user.settings') ) diff --git a/src/components/home/navigation.vue b/src/components/home/navigation.vue index 76f92abd3..66a0d7e46 100644 --- a/src/components/home/navigation.vue +++ b/src/components/home/navigation.vue @@ -22,11 +22,11 @@
  • - + - {{ $t('namespace.title') }} + {{ $t('project.projects') }}
  • @@ -47,101 +47,107 @@
  • - - + + @@ -78,6 +82,13 @@ onBeforeMount(async () => { const projects = computed(() => Object.values(projectStore.projects) .filter(p => p.parentProjectId === 0 && !p.isArchived) .sort((a, b) => a.position < b.position ? -1 : 1)) +const favoriteProjects = computed(() => Object.values(projectStore.projects) + .filter(p => !p.isArchived && p.isFavorite) + .map(p => ({ + ...p, + childProjects: [], + })) + .sort((a, b) => a.position < b.position ? -1 : 1)) \ No newline at end of file diff --git a/src/components/home/contentAuth.vue b/src/components/home/contentAuth.vue index 5f5bb2799..06fcdfaba 100644 --- a/src/components/home/contentAuth.vue +++ b/src/components/home/contentAuth.vue @@ -16,7 +16,12 @@ :class="{'is-visible': background}" class="app-container-background background-fade-in d-print-none" :style="{'background-image': background && `url(${background})`}"> - + + + +
    - - + + - + + -- 2.45.1 From a95014dc5d819da2329fbb45f292ee3730938173 Mon Sep 17 00:00:00 2001 From: kolaente Date: Tue, 28 Mar 2023 16:27:07 +0200 Subject: [PATCH 037/123] feat(projects): move hasProjects check to store --- src/stores/projects.ts | 2 ++ src/views/Home.vue | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/stores/projects.ts b/src/stores/projects.ts index dd3b4cbe4..32578b768 100644 --- a/src/stores/projects.ts +++ b/src/stores/projects.ts @@ -29,6 +29,7 @@ export const useProjectStore = defineStore('project', () => { // The projects are stored as an object which has the project ids as keys. const projects = ref({}) const projectsArray = computed(() => Object.values(projects.value)) + const hasProjects = computed(() => projects.value ? true : false) const getProjectById = computed(() => { return (id: IProject['id']) => typeof projects.value[id] !== 'undefined' ? projects.value[id] : null @@ -181,6 +182,7 @@ export const useProjectStore = defineStore('project', () => { isLoading: readonly(isLoading), projects: readonly(projects), projectsArray: readonly(projectsArray), + hasProjects: readonly(hasProjects), getProjectById, findProjectByExactname, diff --git a/src/views/Home.vue b/src/views/Home.vue index 0efcb326e..478010fc1 100644 --- a/src/views/Home.vue +++ b/src/views/Home.vue @@ -80,7 +80,7 @@ const projectHistory = computed(() => { const migratorsEnabled = computed(() => configStore.availableMigrators?.length > 0) const hasTasks = computed(() => baseStore.hasTasks) -const hasProjects = computed(() => projectStore.projects ? true : false) +const hasProjects = computed(() => projectStore.hasProjects) const loading = computed(() => taskStore.isLoading) const deletionScheduledAt = computed(() => parseDateOrNull(authStore.info?.deletionScheduledAt)) -- 2.45.1 From 36bec9e64f14d0f8d2ce0cda29dbd661d2928bc1 Mon Sep 17 00:00:00 2001 From: kolaente Date: Tue, 28 Mar 2023 16:31:33 +0200 Subject: [PATCH 038/123] chore(task): move toggleFavorite to store --- src/components/tasks/partials/singleTaskInProject.vue | 4 +--- src/stores/tasks.ts | 11 +++++++++++ src/views/tasks/TaskDetailView.vue | 3 +-- 3 files changed, 13 insertions(+), 5 deletions(-) diff --git a/src/components/tasks/partials/singleTaskInProject.vue b/src/components/tasks/partials/singleTaskInProject.vue index 6dcd2591d..cec565c60 100644 --- a/src/components/tasks/partials/singleTaskInProject.vue +++ b/src/components/tasks/partials/singleTaskInProject.vue @@ -255,9 +255,7 @@ function undoDone(checked: boolean) { } async function toggleFavorite() { - task.value.isFavorite = !task.value.isFavorite - task.value = await taskService.update(task.value) - await projectStore.loadProjects() // reloading the projects list so that the Favorites project shows up or is hidden when there are (or are not) favorite tasks + task.value = taskStore.toggleFavorite(task.value) emit('task-updated', task.value) } diff --git a/src/stores/tasks.ts b/src/stores/tasks.ts index 9f26ad40b..0e4c2ee55 100644 --- a/src/stores/tasks.ts +++ b/src/stores/tasks.ts @@ -432,6 +432,17 @@ export const useTaskStore = defineStore('task', () => { coverImageAttachmentId: attachment ? attachment.id : 0, }) } + + async function toggleFavorite(task: ITask) { + const taskService = new TaskService() + task.isFavorite = !task.isFavorite + task = await taskService.update(task) + + // reloading the projects list so that the Favorites project shows up or is hidden when there are (or are not) favorite tasks + await projectStore.loadProjects() + + return task + } return { tasks, diff --git a/src/views/tasks/TaskDetailView.vue b/src/views/tasks/TaskDetailView.vue index 093d7b528..c1f988ca1 100644 --- a/src/views/tasks/TaskDetailView.vue +++ b/src/views/tasks/TaskDetailView.vue @@ -756,8 +756,7 @@ async function changeProject(project: IProject) { } async function toggleFavorite() { - task.isFavorite = !task.isFavorite - const newTask = await taskService.update(task) + const newTask = taskStore.toggleFavorite(task.value) Object.assign(task, newTask) } -- 2.45.1 From 5ea450844c88cd45a634c663969c884e0e8f0ea3 Mon Sep 17 00:00:00 2001 From: kolaente Date: Tue, 28 Mar 2023 16:44:20 +0200 Subject: [PATCH 039/123] fix(filters): load projects after creating a filter --- src/services/savedFilter.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/services/savedFilter.ts b/src/services/savedFilter.ts index eaee321da..3cd01d361 100644 --- a/src/services/savedFilter.ts +++ b/src/services/savedFilter.ts @@ -12,6 +12,7 @@ import AbstractService from '@/services/abstractService' import SavedFilterModel from '@/models/savedFilter' import {useBaseStore} from '@/stores/base' +import {useProjectStore} from '@/stores/projects' import {objectToSnakeCase, objectToCamelCase} from '@/helpers/case' import {success} from '@/message' @@ -80,6 +81,7 @@ export default class SavedFilterService extends AbstractService { export function useSavedFilter(projectId?: MaybeRef) { const router = useRouter() const {t} = useI18n({useScope:'global'}) + const projectStore = useProjectStore() const filterService = shallowReactive(new SavedFilterService()) @@ -108,6 +110,7 @@ export function useSavedFilter(projectId?: MaybeRef) { async function createFilter() { filter.value = await filterService.create(filter.value) + await projectStore.loadProjects() router.push({name: 'project.index', params: {projectId: getProjectId(filter.value)}}) } -- 2.45.1 From bfb40c91669f733498146945fa64cc5483bccef5 Mon Sep 17 00:00:00 2001 From: kolaente Date: Tue, 28 Mar 2023 16:44:48 +0200 Subject: [PATCH 040/123] fix(filters): load projects after deleting a filter --- src/services/savedFilter.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/services/savedFilter.ts b/src/services/savedFilter.ts index 3cd01d361..cb01969f9 100644 --- a/src/services/savedFilter.ts +++ b/src/services/savedFilter.ts @@ -128,6 +128,7 @@ export function useSavedFilter(projectId?: MaybeRef) { async function deleteFilter() { await filterService.delete(filter.value) + await projectStore.loadProjects() success({message: t('filters.delete.success')}) router.push({name: 'projects.index'}) } -- 2.45.1 From 8ed201c83f9c1110e640fbb2d021eb1241962233 Mon Sep 17 00:00:00 2001 From: kolaente Date: Tue, 28 Mar 2023 16:45:08 +0200 Subject: [PATCH 041/123] fix(filters): load projects after updating a filter --- src/services/savedFilter.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/services/savedFilter.ts b/src/services/savedFilter.ts index cb01969f9..83da3e155 100644 --- a/src/services/savedFilter.ts +++ b/src/services/savedFilter.ts @@ -116,6 +116,7 @@ export function useSavedFilter(projectId?: MaybeRef) { async function saveFilter() { const response = await filterService.update(filter.value) + await projectStore.loadProjects() success({message: t('filters.edit.success')}) response.filters = objectToSnakeCase(response.filters) filter.value = response -- 2.45.1 From 9d9fb959d8f1c4a12110f1a988115116085b6aaf Mon Sep 17 00:00:00 2001 From: kolaente Date: Tue, 28 Mar 2023 17:25:34 +0200 Subject: [PATCH 042/123] fix: add await --- src/views/tasks/TaskDetailView.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/views/tasks/TaskDetailView.vue b/src/views/tasks/TaskDetailView.vue index c1f988ca1..2dda3a906 100644 --- a/src/views/tasks/TaskDetailView.vue +++ b/src/views/tasks/TaskDetailView.vue @@ -756,7 +756,7 @@ async function changeProject(project: IProject) { } async function toggleFavorite() { - const newTask = taskStore.toggleFavorite(task.value) + const newTask = await taskStore.toggleFavorite(task.value) Object.assign(task, newTask) } -- 2.45.1 From 63ba2982c92d495de6c7e3526c3693dcfe0e3fba Mon Sep 17 00:00:00 2001 From: kolaente Date: Tue, 28 Mar 2023 17:48:26 +0200 Subject: [PATCH 043/123] feat: show all parent projects in task detail view --- src/views/tasks/TaskDetailView.vue | 22 +++++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) diff --git a/src/views/tasks/TaskDetailView.vue b/src/views/tasks/TaskDetailView.vue index 2dda3a906..41d964842 100644 --- a/src/views/tasks/TaskDetailView.vue +++ b/src/views/tasks/TaskDetailView.vue @@ -14,9 +14,12 @@ ref="heading" />
    - - {{ getProjectTitle(project) }} - +
    @@ -781,6 +784,19 @@ async function setPercentDone(percentDone: number) { task: newTask, }) } + +function getAllParentProjects(project: IProject): IProject[] { + let parents = [] + if (project.parentProjectId) { + const parentProject = projectStore.getProjectById(project.parentProjectId) + parents = getAllParentProjects(parentProject) + } + + return [ + ...parents, + project, + ] +} \ No newline at end of file -- 2.45.1 From b5d9afd0f72aaf28b89f4877ce3ad2eabe6c3d7b Mon Sep 17 00:00:00 2001 From: kolaente Date: Sat, 1 Apr 2023 11:15:12 +0200 Subject: [PATCH 053/123] chore: export not archived root projects --- src/components/home/ProjectsNavigationWrapper.vue | 3 +-- src/stores/projects.ts | 5 ++++- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/src/components/home/ProjectsNavigationWrapper.vue b/src/components/home/ProjectsNavigationWrapper.vue index de74de2e6..00615be93 100644 --- a/src/components/home/ProjectsNavigationWrapper.vue +++ b/src/components/home/ProjectsNavigationWrapper.vue @@ -19,8 +19,7 @@ await projectStore.loadProjects() const projects = computed({ get() { - return projectStore.projectsArray - .filter(p => p.parentProjectId === 0 && !p.isArchived) + return projectStore.notArchivedRootProjects .sort((a, b) => a.position - b.position) }, set() { }, // Vue will complain about the component not being writable - but we never need to write here. The setter is only here to silence the warning. diff --git a/src/stores/projects.ts b/src/stores/projects.ts index d5126dadc..cfe610ff5 100644 --- a/src/stores/projects.ts +++ b/src/stores/projects.ts @@ -29,6 +29,8 @@ export const useProjectStore = defineStore('project', () => { // The projects are stored as an object which has the project ids as keys. const projects = ref({}) const projectsArray = computed(() => Object.values(projects.value)) + const notArchivedRootProjects = computed(() => projectsArray.value + .filter(p => p.parentProjectId === 0 && !p.isArchived)) const hasProjects = computed(() => projects.value ? true : false) const getProjectById = computed(() => { @@ -200,6 +202,7 @@ export const useProjectStore = defineStore('project', () => { isLoading: readonly(isLoading), projects: readonly(projects), projectsArray: readonly(projectsArray), + notArchivedRootProjects: readonly(notArchivedRootProjects), hasProjects: readonly(hasProjects), getProjectById, @@ -235,7 +238,7 @@ export function useProject(projectId: MaybeRef) { ) const projectStore = useProjectStore() - + const parentProject = ref(null) watch( () => project.parentProjectId, -- 2.45.1 From 336db56316dec7aeacf2174f5945764dc350769c Mon Sep 17 00:00:00 2001 From: kolaente Date: Sat, 1 Apr 2023 11:15:28 +0200 Subject: [PATCH 054/123] chore: remove unnecessary map --- src/components/home/ProjectsNavigationWrapper.vue | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/components/home/ProjectsNavigationWrapper.vue b/src/components/home/ProjectsNavigationWrapper.vue index 00615be93..90a1f6ad6 100644 --- a/src/components/home/ProjectsNavigationWrapper.vue +++ b/src/components/home/ProjectsNavigationWrapper.vue @@ -26,9 +26,6 @@ const projects = computed({ }) const favoriteProjects = computed(() => projectStore.projectsArray .filter(p => !p.isArchived && p.isFavorite) - .map(p => ({ - ...p, - })) .sort((a, b) => a.position - b.position)) -- 2.45.1 From 131022da427616765f8109ca8ac8f6bad1bdcbbb Mon Sep 17 00:00:00 2001 From: kolaente Date: Sat, 1 Apr 2023 11:18:11 +0200 Subject: [PATCH 055/123] chore: export favorite projects from store --- src/components/home/ProjectsNavigationWrapper.vue | 3 +-- src/stores/projects.ts | 3 +++ 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/components/home/ProjectsNavigationWrapper.vue b/src/components/home/ProjectsNavigationWrapper.vue index 90a1f6ad6..0d3b6c9b5 100644 --- a/src/components/home/ProjectsNavigationWrapper.vue +++ b/src/components/home/ProjectsNavigationWrapper.vue @@ -24,8 +24,7 @@ const projects = computed({ }, set() { }, // Vue will complain about the component not being writable - but we never need to write here. The setter is only here to silence the warning. }) -const favoriteProjects = computed(() => projectStore.projectsArray - .filter(p => !p.isArchived && p.isFavorite) +const favoriteProjects = computed(() => projectStore.favoriteProjects .sort((a, b) => a.position - b.position)) diff --git a/src/stores/projects.ts b/src/stores/projects.ts index cfe610ff5..0f31f3601 100644 --- a/src/stores/projects.ts +++ b/src/stores/projects.ts @@ -31,6 +31,8 @@ export const useProjectStore = defineStore('project', () => { const projectsArray = computed(() => Object.values(projects.value)) const notArchivedRootProjects = computed(() => projectsArray.value .filter(p => p.parentProjectId === 0 && !p.isArchived)) + const favoriteProjects = computed(() => projectsArray.value + .filter(p => !p.isArchived && p.isFavorite)) const hasProjects = computed(() => projects.value ? true : false) const getProjectById = computed(() => { @@ -203,6 +205,7 @@ export const useProjectStore = defineStore('project', () => { projects: readonly(projects), projectsArray: readonly(projectsArray), notArchivedRootProjects: readonly(notArchivedRootProjects), + favoriteProjects: readonly(favoriteProjects), hasProjects: readonly(hasProjects), getProjectById, -- 2.45.1 From ac78e85e1726b6d7047db72ccbbaf29ac11d1696 Mon Sep 17 00:00:00 2001 From: kolaente Date: Sat, 1 Apr 2023 11:20:28 +0200 Subject: [PATCH 056/123] chore: move loader class --- src/components/home/navigation.vue | 4 ++-- src/components/misc/loading.vue | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/components/home/navigation.vue b/src/components/home/navigation.vue index df6b38c6d..1d70bc404 100644 --- a/src/components/home/navigation.vue +++ b/src/components/home/navigation.vue @@ -52,7 +52,7 @@ @@ -133,7 +133,7 @@ const menuActive = computed(() => baseStore.menuActive) } } -.loader-container { +.navigation-loader { min-width: 100%; height: 150px; diff --git a/src/components/misc/loading.vue b/src/components/misc/loading.vue index 9607ca3cf..65f56448f 100644 --- a/src/components/misc/loading.vue +++ b/src/components/misc/loading.vue @@ -4,7 +4,7 @@ -- 2.45.1 From d85be26761240164b6bdcbe0601b46585b74fafa Mon Sep 17 00:00:00 2001 From: kolaente Date: Sat, 1 Apr 2023 11:23:08 +0200 Subject: [PATCH 057/123] fix: passing readonly projects data to navigation --- src/components/home/ProjectsNavigationWrapper.vue | 13 ++++--------- 1 file changed, 4 insertions(+), 9 deletions(-) diff --git a/src/components/home/ProjectsNavigationWrapper.vue b/src/components/home/ProjectsNavigationWrapper.vue index 0d3b6c9b5..6eafd15f3 100644 --- a/src/components/home/ProjectsNavigationWrapper.vue +++ b/src/components/home/ProjectsNavigationWrapper.vue @@ -1,10 +1,10 @@ @@ -17,13 +17,8 @@ const projectStore = useProjectStore() await projectStore.loadProjects() -const projects = computed({ - get() { - return projectStore.notArchivedRootProjects - .sort((a, b) => a.position - b.position) - }, - set() { }, // Vue will complain about the component not being writable - but we never need to write here. The setter is only here to silence the warning. -}) +const projects = computed(() => projectStore.notArchivedRootProjects + .sort((a, b) => a.position - b.position)) const favoriteProjects = computed(() => projectStore.favoriteProjects .sort((a, b) => a.position - b.position)) -- 2.45.1 From 55e912221be4b4765cdb3a7bd0e3dc693478ac81 Mon Sep 17 00:00:00 2001 From: kolaente Date: Sat, 1 Apr 2023 15:20:00 +0200 Subject: [PATCH 058/123] chore: use klona to clone project objet --- src/stores/projects.ts | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/stores/projects.ts b/src/stores/projects.ts index 0f31f3601..caec75e84 100644 --- a/src/stores/projects.ts +++ b/src/stores/projects.ts @@ -1,6 +1,7 @@ import {watch, reactive, shallowReactive, unref, toRefs, readonly, ref, computed} from 'vue' import {acceptHMRUpdate, defineStore} from 'pinia' import {useI18n} from 'vue-i18n' +import {klona} from 'klona/lite' import ProjectService from '@/services/project' import {setModuleLoading} from '@/stores/helper' @@ -144,9 +145,7 @@ export const useProjectStore = defineStore('project', () => { // the returned project from projectService.update is the same! // in order to not create a manipulation in pinia store we have to create a new copy - return { - ...project, - } + return klona(project) } catch (e) { // Reset the project state to the initial one to avoid confusion for the user setProject({ -- 2.45.1 From 9d73ac661fbf9315995c8a1f633708021591d2db Mon Sep 17 00:00:00 2001 From: kolaente Date: Sat, 1 Apr 2023 16:48:15 +0200 Subject: [PATCH 059/123] fix: remove leftover suspense --- src/components/home/contentAuth.vue | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/src/components/home/contentAuth.vue b/src/components/home/contentAuth.vue index 06fcdfaba..5f5bb2799 100644 --- a/src/components/home/contentAuth.vue +++ b/src/components/home/contentAuth.vue @@ -16,12 +16,7 @@ :class="{'is-visible': background}" class="app-container-background background-fade-in d-print-none" :style="{'background-image': background && `url(${background})`}"> - - - - +
    -- 2.45.1 From a0d39e6081f35e4ba6589b7840168b0c69b3210f Mon Sep 17 00:00:00 2001 From: kolaente Date: Sat, 1 Apr 2023 21:31:03 +0200 Subject: [PATCH 062/123] chore: use long variable name --- src/components/home/ProjectsNavigation.vue | 36 +++++++++++----------- 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/src/components/home/ProjectsNavigation.vue b/src/components/home/ProjectsNavigation.vue index 2896e0072..1dea7f87e 100644 --- a/src/components/home/ProjectsNavigation.vue +++ b/src/components/home/ProjectsNavigation.vue @@ -18,45 +18,45 @@ ] }" > -