UNPKG

@undp/design-system-react

Version:

React based design system for UNDP

1 lines 10 kB
{"version":3,"file":"DateTimePicker.cjs","names":[],"sources":["../src/components/ui/date-time-picker.tsx"],"sourcesContent":["import { cva, type VariantProps } from 'class-variance-authority';\nimport { format } from 'date-fns';\nimport { CalendarIcon } from 'lucide-react';\nimport { useEffect, useState } from 'react';\nimport type { Matcher, PropsSingle } from 'react-day-picker';\nimport { cn } from '@/lib/utils';\nimport { Calendar } from './calendar-card';\nimport { Popover, PopoverContent, PopoverTrigger } from './popover';\nimport { Separator } from './separator';\n\ntype SingleCalendarProps = Omit<PropsSingle, 'mode'>;\n\nconst dateTimePickerVariants = cva(\n 'w-full h-auto bg-background rounded-base text-content-primary text-base transition-colors focus-visible:outline-hidden focus-visible:ring-1 disabled:cursor-not-allowed disabled:opacity-disabled placeholder:text-content-placeholder',\n {\n variants: {\n variant: {\n light: 'border border-stroke',\n normal: 'border-2 border-foreground',\n },\n rounded: {\n base: 'rounded',\n sm: 'rounded-sm',\n md: 'rounded-md',\n lg: 'rounded-lg',\n xl: 'rounded-xl',\n '2xl': 'rounded-2xl',\n full: 'rounded-full',\n },\n inputSize: {\n sm: 'px-2.5 py-1',\n base: 'p-2.5',\n },\n },\n defaultVariants: {\n inputSize: 'base',\n variant: 'normal',\n rounded: 'base',\n },\n },\n);\n\nexport function DateTimePicker({\n selected,\n onSelect,\n disablePopover,\n disabled,\n classNames,\n variant,\n inputSize,\n onValueChange,\n disabledHours = [],\n disabledMinutes = [],\n placeHolder = 'Pick a date and time',\n ...props\n}: SingleCalendarProps &\n VariantProps<typeof dateTimePickerVariants> & {\n disablePopover?: boolean;\n classNames?: {\n popOverTrigger?: string;\n popOverContent?: string;\n popOverTriggerIcon?: string;\n popOverTriggerButton?: string;\n };\n onValueChange?: (date?: Date) => void;\n disabledHours?: number[];\n disabledMinutes?: number[];\n disabled?: Matcher | Matcher[];\n placeHolder?: string;\n }) {\n const [date, setDate] = useState<Date>();\n const [hour, setHour] = useState(0);\n const [minute, setMinute] = useState(0);\n useEffect(() => {\n onValueChange?.(date);\n }, [date, onValueChange]);\n return (\n <Popover>\n <PopoverTrigger\n className={cn(dateTimePickerVariants({ inputSize, variant }), classNames?.popOverTrigger)}\n >\n <CalendarIcon\n className={cn('size-4 text-content-placeholder', classNames?.popOverTriggerIcon)}\n />\n {date ? (\n <p className='mt-1 p-0 font-body text-content-primary'>\n {format(date, 'MMM d, yyyy HH:mm')}\n </p>\n ) : (\n <p className='mt-1 p-0 font-body text-content-placeholder'>{placeHolder}</p>\n )}\n </PopoverTrigger>\n <PopoverContent className={cn('w-auto p-0', classNames?.popOverContent)} align='start'>\n <div className='flex items-start gap-0'>\n <Calendar\n mode='single'\n selected={selected || date}\n onSelect={(selectedDate, triggerDate, modifiers, event) => {\n if (!selectedDate) return;\n const newDate = new Date(selectedDate);\n const currentHour = date?.getHours() ?? hour;\n const currentMinute = date?.getMinutes() ?? minute;\n newDate.setHours(currentHour, currentMinute);\n setHour(currentHour);\n setMinute(currentMinute);\n setDate(newDate);\n onSelect?.(selectedDate, triggerDate, modifiers, event);\n }}\n disabled={disabled}\n {...props}\n />\n <Separator orientation='vertical' color='surface-lg' />\n <div className='flex flex-col gap-4 px-2 pt-2'>\n <p className='mb-0 flex h-7 items-center justify-center text-content-primary text-sm'>\n {String(hour).padStart(2, '0')}:{String(minute).padStart(2, '0')}\n </p>\n <div className='flex max-h-[204px]'>\n <div className='undp-scrollbar flex flex-col items-center gap-1.5 overflow-y-auto overflow-x-hidden px-4'>\n <p className='sticky top-0 mb-0 bg-surface font-bold text-[14px] text-content-primary'>\n HH\n </p>\n {Array.from({ length: 24 }, (_, i) => (\n <button\n // biome-ignore lint/suspicious/noArrayIndexKey: This array is not expected to change\n key={i}\n type='button'\n className={cn(\n 'mb-0 cursor-pointer rounded-sm p-1 text-content-primary text-sm hover:bg-surface hover:text-content-primary disabled:pointer-events-none disabled:opacity-disabled',\n i === hour &&\n 'bg-surface-hard font-bold text-content-primary hover:bg-surface-hard-hover',\n )}\n onClick={() => {\n setHour(i);\n setDate((prev) => {\n const updated = new Date(prev ?? new Date());\n updated.setHours(i);\n return updated;\n });\n }}\n disabled={disabledHours.includes(i)}\n >\n {String(i).padStart(2, '0')}\n </button>\n ))}\n </div>\n <Separator orientation='vertical' />\n <div className='overflow-x-hidden! undp-scrollbar flex flex-col items-center gap-1.5 overflow-y-auto px-4'>\n <p className='sticky top-0 mb-0 bg-surface font-bold text-[14px] text-content-primary'>\n MM\n </p>\n {Array.from({ length: 60 }, (_, i) => (\n <button\n // biome-ignore lint/suspicious/noArrayIndexKey: This array is not expected to change\n key={i}\n type='button'\n className={cn(\n 'mb-0 cursor-pointer rounded-sm p-1 text-content-primary text-sm hover:bg-surface hover:text-content-primary disabled:pointer-events-none disabled:opacity-disabled',\n i === minute &&\n 'bg-surface-hard font-bold text-content-primary hover:bg-surface-hard-hover',\n )}\n onClick={() => {\n setMinute(i);\n setDate((prev) => {\n const updated = new Date(prev ?? new Date());\n updated.setMinutes(i);\n return updated;\n });\n }}\n disabled={disabledMinutes.includes(i)}\n >\n {String(i).padStart(2, '0')}\n </button>\n ))}\n </div>\n </div>\n </div>\n </div>\n </PopoverContent>\n </Popover>\n );\n}\n"],"mappings":"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"}