diff --git a/web/src/components/ActivityCalendar/MonthCalendar.tsx b/web/src/components/ActivityCalendar/MonthCalendar.tsx index 891a285be..f16354fcf 100644 --- a/web/src/components/ActivityCalendar/MonthCalendar.tsx +++ b/web/src/components/ActivityCalendar/MonthCalendar.tsx @@ -1,3 +1,4 @@ +import dayjs from "dayjs"; import { memo, useMemo } from "react"; import { useInstance } from "@/contexts/InstanceContext"; import { cn } from "@/lib/utils"; @@ -35,11 +36,15 @@ const WeekdayHeader = memo(({ weekDays, size }: WeekdayHeaderProps) => ( WeekdayHeader.displayName = "WeekdayHeader"; export const MonthCalendar = memo((props: MonthCalendarProps) => { - const { month, data, maxCount, size = "default", onClick, className, disableTooltips = false } = props; + const { month, selectedDate, data, maxCount, size = "default", onClick, className, disableTooltips = false } = props; const t = useTranslate(); const { generalSetting } = useInstance(); const today = useTodayDate(); const weekDays = useWeekdayLabels(); + const selectedDateFormatted = useMemo(() => { + if (!selectedDate) return null; + return dayjs(selectedDate).format("YYYY-MM-DD"); + }, [selectedDate]); const { weeks, weekDays: rotatedWeekDays } = useCalendarMatrix({ month, @@ -47,7 +52,7 @@ export const MonthCalendar = memo((props: MonthCalendarProps) => { weekDays, weekStartDayOffset: generalSetting.weekStartDayOffset, today, - selectedDate: "", + selectedDate: selectedDateFormatted, }); const flatDays = useMemo(() => weeks.flatMap((week) => week.days), [weeks]); diff --git a/web/src/components/ActivityCalendar/YearCalendar.tsx b/web/src/components/ActivityCalendar/YearCalendar.tsx index e8b8f91f9..d03f10840 100644 --- a/web/src/components/ActivityCalendar/YearCalendar.tsx +++ b/web/src/components/ActivityCalendar/YearCalendar.tsx @@ -73,12 +73,21 @@ interface MonthCardProps { data: Record; maxCount: number; onDateClick: (date: string) => void; + selectedDate: string | null; } -const MonthCard = memo(({ month, data, maxCount, onDateClick }: MonthCardProps) => ( +const MonthCard = memo(({ month, data, maxCount, onDateClick, selectedDate }: MonthCardProps) => (
{getMonthLabel(month)}
- +
)); MonthCard.displayName = "MonthCard"; @@ -106,7 +115,7 @@ export const YearCalendar = memo(({ selectedYear, data, onYearChange, onDateClic
{months.map((month) => ( - + ))}
diff --git a/web/src/components/ActivityCalendar/types.ts b/web/src/components/ActivityCalendar/types.ts index 306b21b9b..98dc7c2aa 100644 --- a/web/src/components/ActivityCalendar/types.ts +++ b/web/src/components/ActivityCalendar/types.ts @@ -22,6 +22,7 @@ export interface CalendarMatrixResult { export interface MonthCalendarProps { month: string; + selectedDate: string | null; data: Record; maxCount: number; size?: CalendarSize; diff --git a/web/src/components/ActivityCalendar/useCalendar.ts b/web/src/components/ActivityCalendar/useCalendar.ts index 783767e44..91ba23fd4 100644 --- a/web/src/components/ActivityCalendar/useCalendar.ts +++ b/web/src/components/ActivityCalendar/useCalendar.ts @@ -9,7 +9,7 @@ export interface UseCalendarMatrixParams { weekDays: string[]; weekStartDayOffset: number; today: string; - selectedDate: string; + selectedDate: string | null; } const createCalendarDayCell = ( @@ -17,7 +17,7 @@ const createCalendarDayCell = ( monthKey: string, data: Record, today: string, - selectedDate: string, + selectedDate: string | null, ): CalendarDayCell => { const isoDate = current.format("YYYY-MM-DD"); const isCurrentMonth = current.format("YYYY-MM") === monthKey; diff --git a/web/src/components/StatisticsView/StatisticsView.tsx b/web/src/components/StatisticsView/StatisticsView.tsx index 62e135186..f88d18174 100644 --- a/web/src/components/StatisticsView/StatisticsView.tsx +++ b/web/src/components/StatisticsView/StatisticsView.tsx @@ -1,7 +1,7 @@ import dayjs from "dayjs"; import { useMemo, useState } from "react"; import { MonthCalendar } from "@/components/ActivityCalendar"; -import { useDateFilterNavigation } from "@/hooks"; +import { type MemoFilter, useMemoFilterContext } from "@/contexts/MemoFilterContext"; import type { StatisticsData } from "@/types/statistics"; import { MonthNavigator } from "./MonthNavigator"; @@ -12,20 +12,44 @@ interface Props { const StatisticsView = (props: Props) => { const { statisticsData } = props; const { activityStats } = statisticsData; - const navigateToDateFilter = useDateFilterNavigation(); const [visibleMonthString, setVisibleMonthString] = useState(dayjs().format("YYYY-MM")); + const { getFiltersByFactor, addFilter, removeFilter } = useMemoFilterContext(); + const displayTimeFilter = getFiltersByFactor("displayTime").length > 0 ? getFiltersByFactor("displayTime") : []; + const selectedDate = useMemo(() => { + if (!displayTimeFilter.length) return null; + return new Date(displayTimeFilter[0].value); + }, [displayTimeFilter]); const maxCount = useMemo(() => { const counts = Object.values(activityStats); return Math.max(...counts, 1); }, [activityStats]); + const handleDateCellClick = (date: string) => { + if (displayTimeFilter.length > 0 && displayTimeFilter[0].value === date) { + removeFilter((f: MemoFilter) => f.factor === "displayTime" && f.value === date); + } else { + // Remove all existing tag filters first, then add the new one + removeFilter((f: MemoFilter) => f.factor === "displayTime"); + addFilter({ + factor: "displayTime", + value: date, + }); + } + }; + return (
- +
);