From 56dd17cdaad5fe186c5ee963db241ae988d5b1e1 Mon Sep 17 00:00:00 2001 From: Joel Date: Wed, 5 Nov 2025 16:55:39 +0800 Subject: [PATCH] feat: range picker --- .../[appId]/overview/time-range-picker.tsx | 40 ++++++++++++--- .../date-and-time-picker/calendar/index.tsx | 4 +- .../date-and-time-picker/calendar/item.tsx | 4 +- .../date-picker/index.tsx | 2 + .../base/date-and-time-picker/types.ts | 3 ++ web/i18n/ja-JP/app-log.ts | 1 + web/utils/format.ts | 51 +++++++++++++++++++ 7 files changed, 97 insertions(+), 8 deletions(-) diff --git a/web/app/(commonLayout)/app/(appDetailLayout)/[appId]/overview/time-range-picker.tsx b/web/app/(commonLayout)/app/(appDetailLayout)/[appId]/overview/time-range-picker.tsx index fc6b70e8a0..a51d377d6f 100644 --- a/web/app/(commonLayout)/app/(appDetailLayout)/[appId]/overview/time-range-picker.tsx +++ b/web/app/(commonLayout)/app/(appDetailLayout)/[appId]/overview/time-range-picker.tsx @@ -4,13 +4,17 @@ import type { FC } from 'react' import React, { useCallback } from 'react' import { SimpleSelect } from '@/app/components/base/select' import type { Item } from '@/app/components/base/select' +import type { Dayjs } from 'dayjs' import dayjs from 'dayjs' import { HourglassShape } from '@/app/components/base/icons/src/vender/other' -import TimePicker from '@/app/components/base/date-and-time-picker/time-picker' import { noop } from 'lodash-es' import { useTranslation } from 'react-i18next' import cn from '@/utils/classnames' -import { RiArrowDownSLine, RiCheckLine } from '@remixicon/react' +import { RiArrowDownSLine, RiCalendarLine, RiCheckLine } from '@remixicon/react' +import DatePicker from '@/app/components/base/date-and-time-picker/date-picker' +import 'dayjs/locale/zh-cn' +import { formatToLocalTime } from '@/utils/format' +import { useI18N } from '@/context/i18n' const today = dayjs() @@ -68,6 +72,17 @@ const TimeRangePicker: FC = ({ } onSelect({ query: period!, name }) }, [onSelect]) + + const { locale } = useI18N() + + const renderDate = useCallback(({ value, handleClickTrigger, isOpen }: { value?: Dayjs, handleClickTrigger: () => void, isOpen: boolean }) => { + return ( +
+ {value ? formatToLocalTime(value, locale, 'MMM D') : ''} +
+ ) + }, [locale]) + return (
= ({ renderOption={renderOption} /> - +
+ + + - + +
+
) } diff --git a/web/app/components/base/date-and-time-picker/calendar/index.tsx b/web/app/components/base/date-and-time-picker/calendar/index.tsx index 00612fcb37..03dcb0eda3 100644 --- a/web/app/components/base/date-and-time-picker/calendar/index.tsx +++ b/web/app/components/base/date-and-time-picker/calendar/index.tsx @@ -8,9 +8,10 @@ const Calendar: FC = ({ selectedDate, onDateClick, wrapperClassName, + getIsDateDisabled, }) => { return
- +
{ days.map(day => = ({ day={day} selectedDate={selectedDate} onClick={onDateClick} + isDisabled={getIsDateDisabled ? getIsDateDisabled(day.date) : false} />) }
diff --git a/web/app/components/base/date-and-time-picker/calendar/item.tsx b/web/app/components/base/date-and-time-picker/calendar/item.tsx index 1da8b9b3b5..7132d7bdfb 100644 --- a/web/app/components/base/date-and-time-picker/calendar/item.tsx +++ b/web/app/components/base/date-and-time-picker/calendar/item.tsx @@ -7,6 +7,7 @@ const Item: FC = ({ day, selectedDate, onClick, + isDisabled, }) => { const { date, isCurrentMonth } = day const isSelected = selectedDate?.isSame(date, 'date') @@ -14,11 +15,12 @@ const Item: FC = ({ return (