From ed6d999ffb3b728767096b13b9d4abca0c21d016 Mon Sep 17 00:00:00 2001 From: bboysoul Date: Wed, 16 Sep 2026 10:46:28 +0800 Subject: [PATCH] feat: add explicit reorder modes --- frontend/src/App.vue | 17 +++++++++++----- frontend/src/MvpPanel.vue | 12 ++++++++--- frontend/src/style.css | 4 ++-- frontend/src/style.test.ts | 41 +++++++++++++++++++++++++++++++++++++- 4 files changed, 63 insertions(+), 11 deletions(-) diff --git a/frontend/src/App.vue b/frontend/src/App.vue index effdcfb..20133f0 100644 --- a/frontend/src/App.vue +++ b/frontend/src/App.vue @@ -109,6 +109,7 @@ const todayTaskCompleted = ref(0) const todayHabitTotal = ref(0) const todayHabitCompleted = ref(0) const totalPages = computed(() => Math.max(1, Math.ceil(totalTasks.value / pageSize))) +const taskReorderAvailable = computed(() => activeView.value === 'tasks' && !query.value && totalPages.value === 1 && taskTree.value.length > 1) const expandedFolders = ref(new Set()) const justCompletedTaskIds = ref(new Set()) const completionExitingTaskIds = ref(new Set()) @@ -128,6 +129,7 @@ const taskSwipeOffsets = ref>({}) const taskReorder = ref<{ id: string; startY: number; offsetY: number } | null>(null) const taskReorderTarget = ref('') const taskReorderBlocked = ref(false) +const taskReorderMode = ref(false) const taskComposeOpen = ref(false) const composeTitle = ref('') const composeTitleError = ref('') @@ -387,6 +389,9 @@ watch(query, () => { page.value = 1 searchTimer = window.setTimeout(() => loadAll(), 250) }) +watch(taskReorderAvailable, () => { + if (!taskReorderAvailable.value) taskReorderMode.value = false +}) watch(showCompleted, (value) => { writeStoredBoolean(window.localStorage, SHOW_COMPLETED_STORAGE_KEY, value) if (isTaskView(activeView.value)) { page.value = 1; loadAll() } @@ -648,6 +653,8 @@ async function loadTrash() { async function switchView(view: View, listId?: string) { if (activeView.value === 'memos' && view !== 'memos' && memoPanel.value?.dirty && !window.confirm('有未保存的更改,确定离开吗?')) return taskMutationNavigation.value += 1 + taskReorderMode.value = false + cancelTaskReorder() activeView.value = view if (!query.value) mobileSearchOpen.value = false searchPullDistance.value = 0 @@ -724,7 +731,7 @@ function isInteractiveTarget(target: EventTarget | null) { return target instanceof Element && Boolean(target.closest('button,input,select,textarea,a,label')) } function startTaskReorder(task: Task, event: PointerEvent) { - if (activeView.value === 'trash' || loading.value || query.value || totalPages.value > 1) return + if (!taskReorderMode.value || !taskReorderAvailable.value || loading.value) return taskReorder.value = { id: task.id, startY: event.clientY, offsetY: 0 } taskReorderTarget.value = task.id taskReorderBlocked.value = false @@ -1504,12 +1511,12 @@ onUnmounted(() => { -
{{ totalPages > 1 ? `第 ${page} / ${totalPages} 页 · ` : '' }}共 {{totalTasks}} 项
+
{{ totalPages > 1 ? `第 ${page} / ${totalPages} 页 · ` : '' }}共 {{totalTasks}} 项
{{page}} / {{totalPages}}