From e101c35c0b285b503b1e5172838897d186589332 Mon Sep 17 00:00:00 2001 From: chanx <1243304602@qq.com> Date: Mon, 21 Jul 2025 10:26:41 +0800 Subject: [PATCH] =?UTF-8?q?Fix=EF=BC=9AAdd=20a=20component=20of=20calendar?= =?UTF-8?q?=20(#8923)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ### What problem does this PR solve? fix:Add a component of calendar [#3221](https://github.com/infiniflow/ragflow/issues/3221) ### Type of change - [x] Bug Fix (non-breaking change which fixes an issue) --- web/package.json | 1 + .../components/originui/calendar/index.less | 19 ++++ .../components/originui/calendar/index.tsx | 95 +++++++++++++++++++ web/src/components/ui/modal.tsx | 24 ++++- 4 files changed, 136 insertions(+), 3 deletions(-) create mode 100644 web/src/components/originui/calendar/index.less create mode 100644 web/src/components/originui/calendar/index.tsx diff --git a/web/package.json b/web/package.json index 7a882019f..e9ffae5ab 100644 --- a/web/package.json +++ b/web/package.json @@ -85,6 +85,7 @@ "rc-tween-one": "^3.0.6", "react": "^18.2.0", "react-copy-to-clipboard": "^5.1.0", + "react-day-picker": "^9.8.0", "react-dom": "^18.2.0", "react-dropzone": "^14.3.5", "react-error-boundary": "^4.0.13", diff --git a/web/src/components/originui/calendar/index.less b/web/src/components/originui/calendar/index.less new file mode 100644 index 000000000..266d1ef3a --- /dev/null +++ b/web/src/components/originui/calendar/index.less @@ -0,0 +1,19 @@ +.rdp-selected { + background-color: #f5f5f529; +} +.range-start { + background-color: #f5f5f5; + border-top-left-radius: 10px; + border-bottom-left-radius: 10px; + button { + color: rgba(0, 0, 0, 0.8); + } +} +.range-end { + background-color: #f5f5f5; + border-top-right-radius: 10px; + border-bottom-right-radius: 10px; + button { + color: rgba(0, 0, 0, 0.8); + } +} diff --git a/web/src/components/originui/calendar/index.tsx b/web/src/components/originui/calendar/index.tsx new file mode 100644 index 000000000..cae720f13 --- /dev/null +++ b/web/src/components/originui/calendar/index.tsx @@ -0,0 +1,95 @@ +'use client'; + +import { cn } from '@/lib/utils'; +import { ChevronLeftIcon, ChevronRightIcon } from 'lucide-react'; +import * as React from 'react'; +import { DayPicker } from 'react-day-picker'; +import { buttonVariants } from '../../ui/button'; +import './index.less'; +type DateRange = { + from: Date; + to?: Date; +}; +function Calendar({ + className, + classNames, + showOutsideDays = true, + components: userComponents, + ...props +}: React.ComponentProps) { + const defaultClassNames = { + months: 'relative flex flex-col sm:flex-row gap-4', + month: 'w-full', + month_caption: + 'relative mx-10 mb-1 flex h-9 items-center justify-center z-20', + caption_label: 'text-sm font-medium', + nav: 'absolute top-0 flex w-full justify-between z-10', + button_previous: cn( + buttonVariants({ variant: 'ghost' }), + 'size-9 text-muted-foreground/80 hover:text-foreground p-0', + ), + button_next: cn( + buttonVariants({ variant: 'ghost' }), + 'size-9 text-muted-foreground/80 hover:text-foreground p-0', + ), + weekday: 'size-9 p-0 text-xs font-medium text-muted-foreground/80', + day_button: + 'relative flex size-9 items-center justify-center whitespace-nowrap rounded-md p-0 text-foreground group-[[data-selected]:not(.range-middle)]:[transition-property:color,background-color,border-radius,box-shadow] group-[[data-selected]:not(.range-middle)]:duration-150 group-data-disabled:pointer-events-none focus-visible:z-10 hover:not-in-data-selected:bg-accent group-data-selected:bg-primary hover:not-in-data-selected:text-foreground group-data-selected:text-primary-foreground group-data-disabled:text-foreground/30 group-data-disabled:line-through group-data-outside:text-foreground/30 group-data-selected:group-data-outside:text-primary-foreground outline-none focus-visible:ring-ring/50 focus-visible:ring-[3px] group-[.range-start:not(.range-end)]:rounded-e-none group-[.range-end:not(.range-start)]:rounded-s-none group-[.range-middle]:rounded-none group-[.range-middle]:group-data-selected:bg-accent group-[.range-middle]:group-data-selected:text-foreground', + day: 'group size-9 px-0 py-px text-sm', + range_start: 'range-start', + range_end: 'range-end', + range_middle: 'range-middle', + today: + '*:after:pointer-events-none *:after:absolute *:after:bottom-1 *:after:start-1/2 *:after:z-10 *:after:size-[3px] *:after:-translate-x-1/2 *:after:rounded-full *:after:bg-primary [&[data-selected]:not(.range-middle)>*]:after:bg-background [&[data-disabled]>*]:after:bg-foreground/30 *:after:transition-colors', + outside: + 'text-muted-foreground data-selected:bg-accent/50 data-selected:text-muted-foreground', + hidden: 'invisible', + week_number: 'size-9 p-0 text-xs font-medium text-muted-foreground/80', + }; + + const mergedClassNames: typeof defaultClassNames = Object.keys( + defaultClassNames, + ).reduce( + (acc, key) => ({ + ...acc, + [key]: classNames?.[key as keyof typeof classNames] + ? cn( + defaultClassNames[key as keyof typeof defaultClassNames], + classNames[key as keyof typeof classNames], + ) + : defaultClassNames[key as keyof typeof defaultClassNames], + }), + {} as typeof defaultClassNames, + ); + + const defaultComponents = { + Chevron: (props: { + className?: string; + size?: number; + disabled?: boolean; + orientation?: 'left' | 'right' | 'up' | 'down'; + }) => { + if (props.orientation === 'left') { + return