From c6f38293871d314cabc2e8b976924f61d339931f Mon Sep 17 00:00:00 2001 From: kolaente Date: Mon, 27 Mar 2023 13:21:47 +0200 Subject: [PATCH] feat(navigation): make dragging a project to a parent work --- src/components/home/ProjectsNavigation.vue | 17 ++++++++++++----- src/components/home/navigation.vue | 6 ++++-- src/modelTypes/IProject.ts | 1 + src/models/project.ts | 1 + src/stores/projects.ts | 7 +++---- 5 files changed, 21 insertions(+), 11 deletions(-) diff --git a/src/components/home/ProjectsNavigation.vue b/src/components/home/ProjectsNavigation.vue index 9408924f3..a0b95ea3e 100644 --- a/src/components/home/ProjectsNavigation.vue +++ b/src/components/home/ProjectsNavigation.vue @@ -5,7 +5,6 @@ -
@@ -98,8 +98,10 @@ import {useBaseStore} from '@/stores/base' import {useProjectStore} from '@/stores/projects' const props = defineProps<{ - projects: IProject[], + modelValue: IProject[], }>() +const emit = defineEmits(['update:modelValue']) + const drag = ref(false) const dragOptions = { animation: 100, @@ -117,7 +119,7 @@ const currentProject = computed(() => baseStore.currentProject) const collapsedProjects = ref<{ [id: IProject['id']]: boolean }>({}) const availableProjects = ref([]) watch( - () => props.projects, + () => props.modelValue, projects => { availableProjects.value = projects projects.forEach(p => collapsedProjects.value[p.id] = false) @@ -136,7 +138,10 @@ async function saveProjectPosition(e: SortableEvent) { // To work around that we're explicitly checking that case here and decrease the index. const newIndex = e.newIndex === projectsActive.length ? e.newIndex - 1 : e.newIndex - const project = projectsActive[newIndex] + const projectId = parseInt(e.item.dataset.projectId) + const project = projectStore.getProjectById(projectId) + + const parentProjectId = e.to.parentNode.dataset.projectId ? parseInt(e.to.parentNode.dataset.projectId) : 0 const projectBefore = projectsActive[newIndex - 1] ?? null const projectAfter = projectsActive[newIndex + 1] ?? null projectUpdating.value[project.id] = true @@ -159,7 +164,9 @@ async function saveProjectPosition(e: SortableEvent) { await projectStore.updateProject({ ...project, position, + parentProjectId, }) + emit('update:modelValue', availableProjects.value) } finally { projectUpdating.value[project.id] = false } diff --git a/src/components/home/navigation.vue b/src/components/home/navigation.vue index 629a945a9..41156b399 100644 --- a/src/components/home/navigation.vue +++ b/src/components/home/navigation.vue @@ -49,7 +49,7 @@ @@ -146,7 +146,9 @@ onBeforeMount(async () => { await projectStore.loadProjects() }) -const projects = computed(() => Object.values(projectStore.projects).sort((a, b) => a.position < b.position ? -1 : 1)) +const projects = computed(() => Object.values(projectStore.projects) + .filter(p => p.parentProjectId === 0) + .sort((a, b) => a.position < b.position ? -1 : 1)) function updateActiveProjects(namespace: INamespace, activeProjects: IProject[]) { // This is a bit hacky: since we do have to filter out the archived items from the list diff --git a/src/modelTypes/IProject.ts b/src/modelTypes/IProject.ts index 13a3138db..8655f0f8d 100644 --- a/src/modelTypes/IProject.ts +++ b/src/modelTypes/IProject.ts @@ -19,6 +19,7 @@ export interface IProject extends IAbstract { position: number backgroundBlurHash: string childProjects: IProject[] | null + parentProjectId: number created: Date updated: Date diff --git a/src/models/project.ts b/src/models/project.ts index 87143d992..c672f2468 100644 --- a/src/models/project.ts +++ b/src/models/project.ts @@ -23,6 +23,7 @@ export default class ProjectModel extends AbstractModel implements IPr position = 0 backgroundBlurHash = '' childProjects = [] + parentProjectId = 0 created: Date = null updated: Date = null diff --git a/src/stores/projects.ts b/src/stores/projects.ts index 0ebac7e81..7d1fa5202 100644 --- a/src/stores/projects.ts +++ b/src/stores/projects.ts @@ -62,6 +62,8 @@ export const useProjectStore = defineStore('project', () => { function setProject(project: IProject) { projects.value[project.id] = project update(project) + + project.childProjects?.forEach(setProject) if (baseStore.currentProject?.id === project.id) { baseStore.setCurrentProject(project) @@ -69,10 +71,7 @@ export const useProjectStore = defineStore('project', () => { } function setProjects(newProjects: IProject[]) { - newProjects.forEach(l => { - projects.value[l.id] = l - add(l) - }) + newProjects.forEach(setProject) } function removeProjectById(project: IProject) {