UNPKG

@loke/design-system

Version:

A design system with individually importable components

2 lines (1 loc) 7.52 kB
import{Button}from"@loke/design-system/button";import{Calendar}from"@loke/design-system/calendar";import{cn}from"@loke/design-system/cn";import{Popover,PopoverContent,PopoverTrigger}from"@loke/design-system/popover";import{Calendar as CalendarIcon}from"@loke/icons";import{forwardRef,useState}from"react";import{jsx,jsxs}from"react/jsx-runtime";function formatDateForDisplay(date){return date.toLocaleDateString("en-US",{day:"numeric",month:"short",year:"numeric"})}function formatDateRangeForDisplay(range){if(!range.from)return"";let fromFormatted=formatDateForDisplay(range.from);if(!range.to)return fromFormatted;let toFormatted=formatDateForDisplay(range.to);return`${fromFormatted} - ${toFormatted}`}function getDisplayText(selected,mode,placeholder){if(!selected)return placeholder;if(mode==="single"&&selected instanceof Date)return formatDateForDisplay(selected);if(mode==="multiple"&&Array.isArray(selected)){if(selected.length===0)return placeholder;if(selected.length===1)return formatDateForDisplay(selected[0]);return`${selected.length} dates selected`}if(mode==="range"&&selected&&typeof selected==="object"&&"from"in selected)return formatDateRangeForDisplay(selected);return placeholder}var DatePicker=forwardRef(({placeholder="Select date",className,...calendarProps},ref)=>{let[open,setOpen]=useState(!1),displayText=getDisplayText(calendarProps.selected,calendarProps.mode||"single",placeholder);return jsx("div",{className:cn("grid gap-2",className),ref,children:jsxs(Popover,{onOpenChange:setOpen,open,children:[jsx(PopoverTrigger,{asChild:!0,children:jsxs(Button,{className:cn("w-full justify-start text-left font-normal",!calendarProps.selected&&"text-muted-foreground"),variant:"outline",children:[jsx(CalendarIcon,{className:"mr-2 h-4 w-4"}),displayText]})}),jsx(PopoverContent,{align:"start",className:"w-auto p-0",children:jsx(Calendar,{...calendarProps})})]})})});DatePicker.displayName="DatePicker";import{Button as Button2}from"@loke/design-system/button";import{Calendar as Calendar2}from"@loke/design-system/calendar";import{cn as cn2}from"@loke/design-system/cn";import{Input}from"@loke/design-system/input";import{Label}from"@loke/design-system/label";import{Popover as Popover2,PopoverContent as PopoverContent2,PopoverTrigger as PopoverTrigger2}from"@loke/design-system/popover";import{Calendar as CalendarIcon2}from"@loke/icons";import{useId}from"@loke/ui/use-id";import{forwardRef as forwardRef2,useEffect,useMemo,useState as useState2}from"react";import{jsx as jsx2,jsxs as jsxs2,Fragment}from"react/jsx-runtime";function formatDateTimeForDisplay(date){return date.toLocaleString("en-US",{day:"numeric",hour:"numeric",hour12:!0,minute:"2-digit",month:"short",year:"numeric"})}function formatDateTimeRangeForDisplay(range){if(!range.from)return"";let fromFormatted=formatDateTimeForDisplay(range.from);if(!range.to)return fromFormatted;let toFormatted=formatDateTimeForDisplay(range.to);return`${fromFormatted} - ${toFormatted}`}function getDisplayText2(selected,mode,placeholder){if(!selected)return placeholder;if(mode==="single"&&selected instanceof Date)return formatDateTimeForDisplay(selected);if(mode==="range"&&selected&&typeof selected==="object"&&"from"in selected)return formatDateTimeRangeForDisplay(selected);return placeholder}function formatTime(date){return date.toTimeString().slice(0,5)}function setTimeOnDate(date,timeString){let[hours,minutes]=timeString.split(":").map(Number),newDate=new Date(date);return newDate.setHours(hours,minutes,0,0),newDate}function getCurrentTime(){return formatTime(new Date)}var DateTimePicker=forwardRef2(({placeholder="Select date and time",className,triggerDisplay,...props},ref)=>{let[open,setOpen]=useState2(!1),{selected,onSelect,mode="single",...calendarProps}=props,[singleTime,setSingleTime]=useState2(getCurrentTime()),[fromTime,setFromTime]=useState2(getCurrentTime()),[toTime,setToTime]=useState2(getCurrentTime()),handleDateSelect=(date)=>{if(mode==="single")if(date instanceof Date){let dateWithTime=setTimeOnDate(date,singleTime);onSelect?.(dateWithTime)}else onSelect?.(date);else if(mode==="range")if(date&&typeof date==="object"&&"from"in date){let range=date,newRange={from:setTimeOnDate(range.from,fromTime),to:range.to?setTimeOnDate(range.to,toTime):void 0};onSelect?.(newRange)}else onSelect?.(date)},handleSingleTimeChange=(event)=>{if(setSingleTime(event.target.value),selected instanceof Date){let dateWithTime=setTimeOnDate(selected,event.target.value);onSelect?.(dateWithTime)}},handleFromTimeChange=(event)=>{if(setFromTime(event.target.value),selected&&typeof selected==="object"&&"from"in selected&&selected.from){let range=selected,newRange={from:setTimeOnDate(range.from,event.target.value),to:range.to?setTimeOnDate(range.to,toTime):void 0};onSelect?.(newRange)}},handleToTimeChange=(event)=>{if(setToTime(event.target.value),selected&&typeof selected==="object"&&"from"in selected&&selected.to){let range=selected,newRange={from:setTimeOnDate(range.from,fromTime),to:range.to?setTimeOnDate(range.to,event.target.value):void 0};onSelect?.(newRange)}};useEffect(()=>{if(mode==="single"&&selected instanceof Date)setSingleTime(formatTime(selected));else if(mode==="range"&&selected&&typeof selected==="object"&&"from"in selected){let range=selected;if(range.from)setFromTime(formatTime(range.from));if(range.to)setToTime(formatTime(range.to))}},[selected,mode]);let calendarSelected=useMemo(()=>{if(mode==="single"&&selected instanceof Date)return new Date(selected.getFullYear(),selected.getMonth(),selected.getDate());if(mode==="range"&&selected&&typeof selected==="object"&&"from"in selected){let range=selected;return{from:new Date(range.from.getFullYear(),range.from.getMonth(),range.from.getDate()),to:range.to?new Date(range.to.getFullYear(),range.to.getMonth(),range.to.getDate()):void 0}}return},[selected,mode]),displayText=getDisplayText2(selected,mode,placeholder),timeId=`time-${useId()}`;return jsx2("div",{className:cn2("grid gap-2",className),ref,children:jsxs2(Popover2,{onOpenChange:setOpen,open,children:[jsx2(PopoverTrigger2,{asChild:!0,children:jsx2(Button2,{className:cn2("w-full justify-start text-left font-normal",!selected&&"text-muted-foreground"),variant:"outline",children:triggerDisplay||jsxs2(Fragment,{children:[jsx2(CalendarIcon2,{className:"mr-2 h-4 w-4"}),displayText]})})}),jsx2(PopoverContent2,{align:"start",className:"w-auto p-0",children:jsxs2("div",{className:"space-y-4 p-4",children:[mode==="single"?jsx2(Calendar2,{initialFocus:!0,mode:"single",onSelect:handleDateSelect,selected:calendarSelected,...calendarProps}):jsx2(Calendar2,{initialFocus:!0,mode:"range",onSelect:handleDateSelect,selected:calendarSelected,...calendarProps}),jsxs2("div",{className:"border-t pt-4",children:[mode==="single"&&jsxs2("div",{className:"space-y-2",children:[jsx2(Label,{htmlFor:timeId,children:"Time"}),jsx2(Input,{id:timeId,onChange:(e)=>handleSingleTimeChange(e),type:"time",value:singleTime})]}),mode==="range"&&jsxs2("div",{className:"grid grid-cols-2 gap-4",children:[jsxs2("div",{className:"space-y-2",children:[jsx2(Label,{htmlFor:`${timeId}-from`,children:"From Time"}),jsx2(Input,{id:`${timeId}-from`,onChange:(e)=>handleFromTimeChange(e),type:"time",value:fromTime})]}),jsxs2("div",{className:"space-y-2",children:[jsx2(Label,{htmlFor:`${timeId}-to`,children:"To Time"}),jsx2(Input,{id:`${timeId}-to`,onChange:(e)=>handleToTimeChange(e),type:"time",value:toTime})]})]})]})]})})]})})});DateTimePicker.displayName="DateTimePicker";export{DateTimePicker,DatePicker};