diff --git a/src/components/FolderPageView.vue b/src/components/FolderPageView.vue index 02ebfcc..73b108d 100644 --- a/src/components/FolderPageView.vue +++ b/src/components/FolderPageView.vue @@ -1,5 +1,5 @@ - + - + @@ -150,7 +176,7 @@ const allFolders = computed(() => props.serviceGroups.flatMap(g => g.folders)) variant="text" size="small" density="compact" - @click.stop="emit('createFolder', group.service, getCurrentParentFolder(allFolders))" + @click.stop="emit('createFolder', group.service, getCurrentParentFolder(group.service, group.folders))" > mdi-folder-plus New Folder @@ -159,32 +185,34 @@ const allFolders = computed(() => props.serviceGroups.flatMap(g => g.folders)) - - - - - {{ getCurrentBreadcrumb(group.folders) }} + + {{ getCurrentBreadcrumb(group.service, group.folders) }} mdi-folder-plus New Subfolder + + + props.serviceGroups.flatMap(g => g.folders)) variant="text" size="small" density="compact" - @click.stop="handleNavigateInto(folder.identifier)" + @click.stop="handleNavigateInto(group.service, folder.identifier)" /> - + props.serviceGroups.flatMap(g => g.folders)) + + Edit Folder Name + props.serviceGroups.flatMap(g => g.folders)) - {{ currentPageLevel.length > 1 ? getCurrentBreadcrumb(group.folders) : 'FOLDERS' }} + {{ getCurrentPageLevel(group.service).length > 1 ? getCurrentBreadcrumb(group.service, group.folders) : 'FOLDERS' }} mdi-folder-plus - {{ currentPageLevel.length > 1 ? 'New Subfolder' : 'New Folder' }} + {{ getCurrentPageLevel(group.service).length > 1 ? 'New Subfolder' : 'New Folder' }} props.serviceGroups.flatMap(g => g.folders)) variant="text" size="small" density="compact" - @click.stop="handleNavigateInto(folder.identifier)" + @click.stop="handleNavigateInto(group.service, folder.identifier)" /> - + props.serviceGroups.flatMap(g => g.folders)) + + Edit Folder Name + props.serviceGroups.flatMap(g => g.folders)) .v-list-item--active { background-color: rgba(var(--v-theme-primary), 0.12); } + +/* Keep folder rows left-aligned inside multi-account groups */ +.folder-page-item { + --indent-padding: 0 !important; +} + +.no-indent :deep(.v-list-group__items) { + --indent-padding: 0; +} + +.account-group-spaced { + margin-bottom: 16px; +} + +.account-header-item { + background-color: rgba(var(--v-theme-primary), 0.1); + border-radius: 6px; +} + +.folder-row-item, +.back-row-item, +.account-header-item { + --v-list-item-prepend-size: 22px; +} + +.folder-row-item :deep(.v-list-item__prepend), +.back-row-item :deep(.v-list-item__prepend), +.account-header-item :deep(.v-list-item__prepend) { + padding-inline-start: 4px; + margin-inline-end: 2px; +} diff --git a/src/components/FolderTree.vue b/src/components/FolderTree.vue index ea7f037..6f11720 100644 --- a/src/components/FolderTree.vue +++ b/src/components/FolderTree.vue @@ -6,6 +6,7 @@ import { useUser } from '@KTXC/composables/useUser' import FolderTreeView from './FolderTreeView.vue' import FolderPageView from './FolderPageView.vue' import CreateFolderDialog from './CreateFolderDialog.vue' +import RenameFolderDialog from './RenameFolderDialog.vue' import type { CollectionObject } from '@MailManager/models/collection' import type { ServiceInterface } from '@MailManager/types/service' @@ -40,6 +41,9 @@ const folderViewMode = computed(() => { const createDialogVisible = ref(false) const createDialogService = ref(null) const createDialogParent = ref(null) +const renameDialogVisible = ref(false) +const renameDialogService = ref(null) +const renameDialogFolder = ref(null) // Handle create folder event from child components const handleCreateFolder = (service: ServiceInterface, parentFolder: CollectionObject | null = null) => { @@ -54,6 +58,16 @@ const handleFolderCreated = (newFolder: CollectionObject) => { emit('select', newFolder) } +const handleEditFolder = (service: ServiceInterface, folder: CollectionObject) => { + renameDialogService.value = service + renameDialogFolder.value = folder + renameDialogVisible.value = true +} + +const handleFolderRenamed = (updatedFolder: CollectionObject) => { + emit('select', updatedFolder) +} + // Computed: all folders for validation const allFolders = computed(() => serviceGroups.value.flatMap(g => g.folders) @@ -136,6 +150,7 @@ const serviceGroups = computed(() => { :service-groups="serviceGroups" @select="emit('select', $event)" @create-folder="handleCreateFolder" + @edit-folder="handleEditFolder" /> @@ -145,6 +160,7 @@ const serviceGroups = computed(() => { :service-groups="serviceGroups" @select="emit('select', $event)" @create-folder="handleCreateFolder" + @edit-folder="handleEditFolder" /> @@ -164,6 +180,15 @@ const serviceGroups = computed(() => { :all-folders="allFolders" @created="handleFolderCreated" /> + + diff --git a/src/components/RenameFolderDialog.vue b/src/components/RenameFolderDialog.vue new file mode 100644 index 0000000..ec26b45 --- /dev/null +++ b/src/components/RenameFolderDialog.vue @@ -0,0 +1,247 @@ + + + + + + + Rename Folder + + + + + Account + + {{ service.label || service.primaryAddress || 'Mail Account' }} + + + + + Location + + {{ parentFolderLabel }} + + + + + + + {{ errorMessage }} + + + + + + + + Cancel + + + + Save + + + + + + +