From ab0a46f5e09750d1efb7c21a5218669e97876ff6 Mon Sep 17 00:00:00 2001 From: Sebastian Date: Tue, 5 May 2026 23:42:27 -0400 Subject: [PATCH] feat: collection delete Signed-off-by: Sebastian --- src/components/DeleteFolderDialog.vue | 149 ++++++++++++++++++++++++++ src/components/FolderPageView.vue | 21 ++++ src/components/FolderTree.vue | 38 +++++++ src/components/FolderTreeNode.vue | 42 +++++--- src/components/FolderTreeView.vue | 3 + src/stores/mailStore.ts | 12 +++ 6 files changed, 253 insertions(+), 12 deletions(-) create mode 100644 src/components/DeleteFolderDialog.vue diff --git a/src/components/DeleteFolderDialog.vue b/src/components/DeleteFolderDialog.vue new file mode 100644 index 0000000..5a5c5c5 --- /dev/null +++ b/src/components/DeleteFolderDialog.vue @@ -0,0 +1,149 @@ + + + + + \ No newline at end of file diff --git a/src/components/FolderPageView.vue b/src/components/FolderPageView.vue index 7e64d9d..03b04bd 100644 --- a/src/components/FolderPageView.vue +++ b/src/components/FolderPageView.vue @@ -23,6 +23,7 @@ const emit = defineEmits<{ select: [folder: CollectionObject] createFolder: [service: ServiceObject, parentFolder: CollectionObject | null] editFolder: [service: ServiceObject, folder: CollectionObject] + deleteFolder: [service: ServiceObject, folder: CollectionObject] }>() // Page-based navigation state per service account @@ -56,6 +57,10 @@ const getServiceFolders = (service: ServiceObject): CollectionObject[] => { return collectionsStore.collectionsForService(service.provider, service.identifier) } +const canDeleteFolder = (folder: CollectionObject): boolean => { + return !folder.properties.role +} + // Get icon for folder based on role const getFolderIcon = (folder: CollectionObject): string => { switch (folder.properties.role) { @@ -271,6 +276,14 @@ const getCurrentParentFolder = (service: ServiceObject): CollectionObject | null > New Subfolder + + Delete Folder + @@ -420,6 +433,14 @@ const getCurrentParentFolder = (service: ServiceObject): CollectionObject | null > New Subfolder + + Delete Folder + diff --git a/src/components/FolderTree.vue b/src/components/FolderTree.vue index 3653533..4f06212 100644 --- a/src/components/FolderTree.vue +++ b/src/components/FolderTree.vue @@ -7,6 +7,7 @@ import { useUser } from '@KTXC' import FolderTreeView from './FolderTreeView.vue' import FolderPageView from './FolderPageView.vue' import CreateFolderDialog from './CreateFolderDialog.vue' +import DeleteFolderDialog from './DeleteFolderDialog.vue' import RenameFolderDialog from './RenameFolderDialog.vue' import type { CollectionObject } from '@MailManager/models/collection' import type { ServiceObject } from '@MailManager/models' @@ -43,6 +44,9 @@ const createDialogParent = ref(null) const renameDialogVisible = ref(false) const renameDialogService = ref(null) const renameDialogFolder = ref(null) +const deleteDialogVisible = ref(false) +const deleteDialogService = ref(null) +const deleteDialogFolder = ref(null) // Handle create folder event from child components const handleCreateFolder = (service: ServiceObject, parentFolder: CollectionObject | null = null) => { @@ -63,10 +67,34 @@ const handleEditFolder = (service: ServiceObject, folder: CollectionObject) => { renameDialogVisible.value = true } +const handleDeleteFolder = (service: ServiceObject, folder: CollectionObject) => { + deleteDialogService.value = service + deleteDialogFolder.value = folder + deleteDialogVisible.value = true +} + const handleFolderRenamed = (updatedFolder: CollectionObject) => { emit('select', updatedFolder) } +const isSameFolder = (left: CollectionObject | null | undefined, right: CollectionObject | null | undefined) => { + if (!left || !right) { + return false + } + + return left.provider === right.provider && + String(left.service) === String(right.service) && + String(left.identifier) === String(right.identifier) +} + +const handleFolderDeleted = (deletedFolder: CollectionObject) => { + if (isSameFolder(props.selectedFolder, deletedFolder)) { + mailStore.clearSelectedFolder() + } + + mailStore.notify(`Folder "${deletedFolder.properties.label || String(deletedFolder.identifier)}" deleted`, 'success') +} + // Computed: all folders for validation const allFolders = computed(() => servicesStore.servicesEnabled.flatMap(service => @@ -106,6 +134,7 @@ const serviceGroups = computed(() => { @select="emit('select', $event)" @create-folder="handleCreateFolder" @edit-folder="handleEditFolder" + @delete-folder="handleDeleteFolder" /> @@ -116,6 +145,7 @@ const serviceGroups = computed(() => { @select="emit('select', $event)" @create-folder="handleCreateFolder" @edit-folder="handleEditFolder" + @delete-folder="handleDeleteFolder" /> @@ -144,6 +174,14 @@ const serviceGroups = computed(() => { :all-folders="allFolders" @updated="handleFolderRenamed" /> + +