From b80994d114184be5093165256b7f78ae7702e3b3 Mon Sep 17 00:00:00 2001 From: zenn Date: Thu, 23 Apr 2026 15:32:48 +0900 Subject: [PATCH] =?UTF-8?q?v0.1.52=20-=20=EC=9D=B4=EC=9B=94=20=EB=B0=B0?= =?UTF-8?q?=EC=A7=80=EC=99=80=20=ED=86=B5=EA=B3=84=20=EC=84=A4=EB=AA=85=20?= =?UTF-8?q?=ED=8C=9D=EC=97=85=20=EC=A0=95=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- HANDOFF.md | 2 ++ src/App.vue | 39 +++++++------------------------ src/components/GuideTooltip.vue | 11 ++++++++- src/components/PlannerPage.vue | 15 ++++++------ src/components/StatsDashboard.vue | 26 ++++++++++++++------- 5 files changed, 46 insertions(+), 47 deletions(-) diff --git a/HANDOFF.md b/HANDOFF.md index 48a0152..d667629 100644 --- a/HANDOFF.md +++ b/HANDOFF.md @@ -234,6 +234,8 @@ - 오른쪽 플래너 사이드바의 중복 `STATS` 카드는 제거했다. 미완료 항목 이월 버튼은 `READ NEXT` 카드 아래로 이동했다. - 통계 화면은 진입 시 END DATE를 오늘로 보정한다. `최근 1주`, `최근 1달` 빠른 선택을 추가했고, 기존 `WEEKLY FLOW`는 선택 범위 안에서 기록이 있는 날짜별 집중 흐름을 보여주는 `RANGE FLOW`로 이름과 라벨을 정리했다. - `BEST DAY`는 선택 기간 안에서 집중 시간이 가장 긴 날짜를 고르고, `RECENT RECORDS`는 선택 기간 안의 기록을 날짜 내림차순으로 최대 5개 보여준다. +- `CARRYOVER TASK` 선택 모달은 ESC로 닫힌다. 이월 배지의 시작일 안내는 오른쪽 패널 메시지 대신 배지 옆 팝업으로 표시한다. +- 통계의 `BEST DAY`, `RECENT RECORDS` 기준 설명은 본문 문장 대신 물음표 가이드 팝업으로 제공한다. ## 갱신 규칙 diff --git a/src/App.vue b/src/App.vue index d7a7253..2b767f5 100644 --- a/src/App.vue +++ b/src/App.vue @@ -85,7 +85,6 @@ const passwordBusy = ref(false) const profileMessage = ref('') const passwordMessage = ref('') const carryoverMessage = ref('') -const carryoverInspectMessage = ref('') const carryoverCheckPolicy = ref(readCarryoverCheckPolicy()) const carryoverCheckPrompt = ref(null) const guideTooltipResetMessage = ref('') @@ -665,7 +664,6 @@ function shiftDate(amount) { selectedDate.value = next calendarViewDate.value = new Date(next) carryoverMessage.value = '' - carryoverInspectMessage.value = '' } function shiftCalendarMonth(amount) { @@ -684,7 +682,6 @@ function selectDate(date) { selectedDate.value = new Date(date) calendarViewDate.value = new Date(date) carryoverMessage.value = '' - carryoverInspectMessage.value = '' } function updateComment(record, value) { @@ -803,6 +800,13 @@ function closeCarryoverCheckPrompt() { carryoverCheckPrompt.value = null } +function handleGlobalKeydown(event) { + if (event.key === 'Escape' && carryoverCheckPrompt.value) { + event.preventDefault() + closeCarryoverCheckPrompt() + } +} + function clearTasks(record, indexes) { indexes.forEach((index) => { if (!record.tasks[index]) { @@ -858,15 +862,6 @@ function carryIncompleteTasksToNextDay() { : `${nextDateLabel} 빈칸 ${copyCount}개까지만 이월했습니다.` } -function inspectCarryoverTask(task) { - if (!task.carryoverFrom) { - carryoverInspectMessage.value = '' - return - } - - carryoverInspectMessage.value = `"${task.title}" 항목은 ${createDateLabel(task.carryoverFrom)}부터 이월된 할 일입니다.` -} - function updateMemo(record, { index, value }) { record.memo[index].text = value schedulePlannerSyncForRecord(record) @@ -1853,11 +1848,13 @@ onMounted(() => { }) updateWindowWidth() window.addEventListener('resize', updateWindowWidth) + window.addEventListener('keydown', handleGlobalKeydown) restoreAuthSession() }) onBeforeUnmount(() => { window.removeEventListener('resize', updateWindowWidth) + window.removeEventListener('keydown', handleGlobalKeydown) }) @@ -2414,7 +2411,6 @@ onBeforeUnmount(() => { @update:task-title="updateTaskTitle(planner, $event)" @toggle:task="toggleTask(planner, $event)" @clear:tasks="clearTasks(planner, $event)" - @inspect:carryover="inspectCarryoverTask" @update:memo-label="updateMemoLabel(planner, $event)" @update:memo="updateMemo(planner, $event)" @update:timetable="updateTimetable(planner, $event)" @@ -2545,12 +2541,6 @@ onBeforeUnmount(() => { > {{ carryoverMessage }}

-

- {{ carryoverInspectMessage }} -

@@ -2695,12 +2685,6 @@ onBeforeUnmount(() => { > {{ carryoverMessage }}

-

- {{ carryoverInspectMessage }} -

@@ -2747,7 +2731,6 @@ onBeforeUnmount(() => { @update:task-title="updateTaskTitle(planner, $event)" @toggle:task="toggleTask(planner, $event)" @clear:tasks="clearTasks(planner, $event)" - @inspect:carryover="inspectCarryoverTask" @update:memo-label="updateMemoLabel(planner, $event)" @update:memo="updateMemo(planner, $event)" @update:timetable="updateTimetable(planner, $event)" @@ -2772,7 +2755,6 @@ onBeforeUnmount(() => { @update:task-title="updateTaskTitle(secondaryPlanner, $event)" @toggle:task="toggleTask(secondaryPlanner, $event)" @clear:tasks="clearTasks(secondaryPlanner, $event)" - @inspect:carryover="inspectCarryoverTask" @update:memo-label="updateMemoLabel(secondaryPlanner, $event)" @update:memo="updateMemo(secondaryPlanner, $event)" @update:timetable="updateTimetable(secondaryPlanner, $event)" @@ -2865,7 +2847,6 @@ onBeforeUnmount(() => { @update:task-title="updateTaskTitle(planner, $event)" @toggle:task="toggleTask(planner, $event)" @clear:tasks="clearTasks(planner, $event)" - @inspect:carryover="inspectCarryoverTask" @update:memo-label="updateMemoLabel(planner, $event)" @update:memo="updateMemo(planner, $event)" @update:timetable="updateTimetable(planner, $event)" @@ -2892,7 +2873,6 @@ onBeforeUnmount(() => { @update:task-title="updateTaskTitle(planner, $event)" @toggle:task="toggleTask(planner, $event)" @clear:tasks="clearTasks(planner, $event)" - @inspect:carryover="inspectCarryoverTask" @update:memo-label="updateMemoLabel(planner, $event)" @update:memo="updateMemo(planner, $event)" @update:timetable="updateTimetable(planner, $event)" @@ -2916,7 +2896,6 @@ onBeforeUnmount(() => { @update:task-title="updateTaskTitle(secondaryPlanner, $event)" @toggle:task="toggleTask(secondaryPlanner, $event)" @clear:tasks="clearTasks(secondaryPlanner, $event)" - @inspect:carryover="inspectCarryoverTask" @update:memo-label="updateMemoLabel(secondaryPlanner, $event)" @update:memo="updateMemo(secondaryPlanner, $event)" @update:timetable="updateTimetable(secondaryPlanner, $event)" diff --git a/src/components/GuideTooltip.vue b/src/components/GuideTooltip.vue index a74807f..202f145 100644 --- a/src/components/GuideTooltip.vue +++ b/src/components/GuideTooltip.vue @@ -14,6 +14,14 @@ const props = defineProps({ type: Boolean, default: true, }, + dismissible: { + type: Boolean, + default: true, + }, + buttonLabel: { + type: String, + default: '?', + }, }) const emit = defineEmits(['dismiss']) @@ -68,7 +76,7 @@ onBeforeUnmount(() => { :aria-expanded="open" @click.stop="toggle" > - ? + {{ buttonLabel }} { {{ title }} {{ description }} + :title="'이월된 할 일'" + :description="`이 항목은 ${task.carryoverFrom}부터 이월된 할 일입니다.`" + :dismissible="false" + button-label="이월" + />