diff --git a/src/components/WeekPreview.vue b/src/components/WeekPreview.vue index 774ebf9..938bcea 100644 --- a/src/components/WeekPreview.vue +++ b/src/components/WeekPreview.vue @@ -15,8 +15,10 @@ const headers = DOW.slice(1).concat(DOW[0]) // 周一..周日 const hours = Array.from({ length: 24 }, function (_, i) { return i }) // 非工作时段: 8:00 前 (0-7) 与 22:00 后 (22-23) 置淡灰 +const OFF_HOUR_START = 8 // 8:00 起为工作时段 +const OFF_HOUR_END = 22 // 22:00 起为非工作时段 function isOffHour(h) { - return h < 8 || h >= 22 + return h < OFF_HOUR_START || h >= OFF_HOUR_END } // 当前周的 7 天日期 (周一~周日) @@ -95,21 +97,55 @@ const hasEvents = computed(function () { return false }) -// 折叠状态: 本周无日程时自动折叠; 按钮可强制切换 -const collapsed = ref(false) +// 非工作时段 (8:00 前 / 22:00 后) 是否有事件落入 +// 事件开始 < 8:00 或 结束 > 22:00 即视为占用非工作时段 +const offHoursHaveEvents = computed(function () { + const offStart = OFF_HOUR_START * 60 + const offEnd = OFF_HOUR_END * 60 + for (const items of laidOutByDate.value.values()) { + for (const it of items) { + if (it.startMin < offStart || it.endMin > offEnd) return true + } + } + return false +}) + +// 折叠状态: 折叠的是非工作时段 (浅灰区域), 不是整个网格。 +// 默认: 非工作时段无事件 -> 折叠; 有事件 -> 展开。按钮可强制切换。 +const offHoursCollapsed = ref(false) watch(weekLabel, function () { - // 切换周时, 若新周无日程则自动折叠 - collapsed.value = !hasEvents.value + // 切换周时, 按非工作时段是否有事件重置折叠状态 + offHoursCollapsed.value = !offHoursHaveEvents.value }, { immediate: true }) function toggleCollapse() { - collapsed.value = !collapsed.value + offHoursCollapsed.value = !offHoursCollapsed.value } +// 渲染的小时列表: 折叠时仅显示工作时段 (8-21), 展开时显示全天 (0-23) +const displayHours = computed(function () { + if (offHoursCollapsed.value) { + return hours.filter(function (h) { return !isOffHour(h) }) + } + return hours +}) + +// 网格起始分钟: 折叠时从 8:00 (480) 起, 展开时从 0:00 起。 +// 事件与 hour-line 的 top 均相对于此基准。 +const gridStartMin = computed(function () { + return offHoursCollapsed.value ? OFF_HOUR_START * 60 : 0 +}) + +// 折叠时 day-body 的高度 (仅工作时段) 与展开时 (全天) 不同 +const dayBodyHeight = computed(function () { + return displayHours.value.length * HOUR_HEIGHT +}) + function eventStyle(occ) { const c = eventColor(occ.event.uid) - const top = occ.startMin * (HOUR_HEIGHT / 60) - const height = Math.max((occ.endMin - occ.startMin) * (HOUR_HEIGHT / 60), 18) + const pxPerMin = HOUR_HEIGHT / 60 + const top = (occ.startMin - gridStartMin.value) * pxPerMin + const height = Math.max((occ.endMin - occ.startMin) * pxPerMin, 18) const widthPct = 100 / occ.totalCols return { top: top + 'px', @@ -139,17 +175,17 @@ function tooltip(ev) { 本周无日程 -