diff --git a/frontend/src/App.vue b/frontend/src/App.vue index 7b5a7d7..ded6582 100644 --- a/frontend/src/App.vue +++ b/frontend/src/App.vue @@ -2,7 +2,7 @@ import { computed, nextTick, onMounted, ref, watch } from 'vue' import { ArchiveRestore, CalendarDays, CalendarHeart, Check, ChevronDown, ChevronRight, Folder, - GripVertical, Inbox, ListChecks, ListTodo, Menu, MoreHorizontal, Pencil, Plus, Search, + GripVertical, Inbox, ListChecks, ListTodo, Menu, Pencil, Plus, Search, Settings, Trash2, X, Repeat2, } from 'lucide-vue-next' import { filterTasks, fromDateTimeLocal, groupTaskTree, renderMarkdown, toDateTimeLocal } from './lib/task-utils' @@ -37,6 +37,7 @@ const loading = ref(false) const mobileSidebar = ref(false) const sidebarCollapsed = ref(false) const mobileDetail = ref(false) +const mobileMore = ref(false) const moreSettingsOpen = ref(false) const markdownPreview = ref(false) const showCompleted = ref(true) @@ -50,8 +51,6 @@ const taskSwipeStart = ref<{ id: string; x: number; y: number } | null>(null) const taskPointerStart = ref<{ id: string; x: number; y: number } | null>(null) const taskSwipeOffsets = ref>({}) const taskComposeOpen = ref(false) -const sidebarActionMenu = ref('') -const archivedListsOpen = ref(false) const composeTitle = ref('') const composeListId = ref('') const composeDueAt = ref('') @@ -296,7 +295,7 @@ async function switchView(view: View, listId?: string) { activeView.value = view if (listId) activeList.value = listId page.value = 1 - selectedTask.value = null; mobileSidebar.value = false; mobileDetail.value = false; taskComposeOpen.value = false + selectedTask.value = null; mobileSidebar.value = false; mobileDetail.value = false; mobileMore.value = false; taskComposeOpen.value = false if (view === 'trash') await loadTrash() else if (view === 'today') await loadTodayView() else if (!isTaskView(view)) tasks.value = [] @@ -460,8 +459,6 @@ async function restoreList(item: TaskList) { try { await api(`/lists/${item.id}/restore`, { method: 'POST' }); await loadArchivedLists(); await refreshAll(); toast('清单已恢复') } catch (reason) { fail(reason) } } function toggleFolder(id: string) { const next = new Set(expandedFolders.value); next.has(id) ? next.delete(id) : next.add(id); expandedFolders.value = next } -function toggleSidebarActionMenu(id: string) { sidebarActionMenu.value = sidebarActionMenu.value === id ? '' : id } -function closeSidebarActionMenu() { sidebarActionMenu.value = '' } function formatDue(value: string | null) { return value ? new Intl.DateTimeFormat('zh-CN', { month: 'short', day: 'numeric', hour: '2-digit', minute: '2-digit' }).format(new Date(value)) : '' } function previousPage() { if (page.value <= 1 || loading.value) return @@ -490,7 +487,7 @@ onMounted(bootstrap)
-