{"version":3,"sources":["../components/form/date-picker.tsx"],"sourcesContent":["\"use client\";\nimport React, { useEffect, useState } from 'react';\nimport { addDays, format, isEqual } from 'date-fns';\nimport { CalendarIcon } from 'lucide-react';\nimport _kebabCase from 'lodash-es/kebabCase';\nimport _isNil from 'lodash-es/isNil';\nimport _isUndefined from 'lodash-es/isUndefined';\nimport _isString from 'lodash-es/isString';\n\nimport { isEqualDate } from '../../utils/date';\nimport { cn } from '../../utils/ui';\nimport { Button } from '../ui/button';\nimport { Label } from '../ui/label';\nimport { Calendar } from '../ui/calendar';\nimport { Popover, PopoverContent, PopoverTrigger } from '../ui/popover';\nimport { Matcher } from 'react-day-picker';\n\nfunction formatDate(date: Date) {\n  return format(date, 'LLL dd, y');\n}\n\nfunction getStartOfDay(date: Date) {\n  const startOfDay = new Date(date.getFullYear(), date.getMonth(), date.getDate());\n  return startOfDay;\n}\n\nexport interface FormDatePickerProps {\n  id?: string;\n  name: string;\n  label?: string;\n  required?: boolean;\n  disabled?: Matcher | Matcher[];\n  initialValue?: Date | string;\n  closeOnSelect?: boolean;\n  value?: Date | string;\n  onChange: (value?: Date) => void;\n  classNames?: {\n    wrapper?: string;\n    label?: string;\n    button?: string;\n  };\n}\n\nexport function FormDatePicker({\n  id,\n  name,\n  label,\n  required = false,\n  closeOnSelect = true,\n  disabled,\n  initialValue,\n  value,\n  onChange,\n  classNames,\n}: FormDatePickerProps) {\n  const [date, setDate] = useState<Date | undefined>(undefined);\n  const [initialized, setInitialized] = useState(false);\n  const [isOpen, setIsOpen] = useState(false);\n\n  useEffect(() => {\n    if (!initialized) {\n      const dt = initialValue ? getStartOfDay(new Date(initialValue)) : getStartOfDay(new Date());\n\n      setDate(dt);\n      setInitialized(true);\n    }\n  }, [initialized, initialValue]);\n\n  useEffect(() => {\n    if (_isUndefined(value)) {\n      if (!_isUndefined(date)) {\n        setDate(undefined);\n      }\n    } else {\n      const dt = _isString(value) ? new Date(value) : value;\n      if (!isEqualDate(date, dt)) {\n        setDate(getStartOfDay(dt));\n      }\n    }\n  }, [value]);\n\n  useEffect(() => {\n    if (initialized) {\n      onChange(date);\n    }\n  }, [date, initialized]);\n\n  if (!id) id = _kebabCase(name);\n\n  const display = !initialized ? <span></span> : date ? <>{formatDate(date)}</> : <span>Pick a date</span>;\n\n  return (\n    <div className={cn('$form-date-picker space-y-1', classNames?.wrapper)}>\n      {label && (\n        <Label htmlFor={id} className={classNames?.label} required={required}>\n          {label}\n        </Label>\n      )}\n\n      <div className={cn('grid gap-2')}>\n        <Popover open={isOpen} onOpenChange={setIsOpen}>\n          <PopoverTrigger asChild>\n            <Button\n              variant={date ? 'secondary' : 'muted'}\n              appearance=\"outline\"\n              className={cn('min-w-[145px] justify-start text-left font-normal', classNames?.button)}\n            >\n              <CalendarIcon />\n              {display}\n            </Button>\n          </PopoverTrigger>\n\n          <PopoverContent className=\"w-auto p-0\" align=\"start\">\n            <Calendar\n              mode=\"single\"\n              defaultMonth={date}\n              selected={date}\n              onSelect={(newdate) => {\n                if (!isEqualDate(date, newdate)) {\n                  setDate(newdate);\n                }\n                if (closeOnSelect) setIsOpen(false);\n              }}\n              disabled={disabled}\n            />\n          </PopoverContent>\n        </Popover>\n      </div>\n    </div>\n  );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;AACA,OAAO,SAAS,WAAW,gBAAgB;AAC3C,SAAkB,cAAuB;AACzC,SAAS,oBAAoB;AAC7B,OAAO,gBAAgB;AAEvB,OAAO,kBAAkB;AACzB,OAAO,eAAe;AAUtB,SAAS,WAAW,MAAY;AAC9B,SAAO,OAAO,MAAM,WAAW;AACjC;AAEA,SAAS,cAAc,MAAY;AACjC,QAAM,aAAa,IAAI,KAAK,KAAK,YAAY,GAAG,KAAK,SAAS,GAAG,KAAK,QAAQ,CAAC;AAC/E,SAAO;AACT;AAmBO,SAAS,eAAe;AAAA,EAC7B;AAAA,EACA;AAAA,EACA;AAAA,EACA,WAAW;AAAA,EACX,gBAAgB;AAAA,EAChB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAwB;AACtB,QAAM,CAAC,MAAM,OAAO,IAAI,SAA2B,MAAS;AAC5D,QAAM,CAAC,aAAa,cAAc,IAAI,SAAS,KAAK;AACpD,QAAM,CAAC,QAAQ,SAAS,IAAI,SAAS,KAAK;AAE1C,YAAU,MAAM;AACd,QAAI,CAAC,aAAa;AAChB,YAAM,KAAK,eAAe,cAAc,IAAI,KAAK,YAAY,CAAC,IAAI,cAAc,oBAAI,KAAK,CAAC;AAE1F,cAAQ,EAAE;AACV,qBAAe,IAAI;AAAA,IACrB;AAAA,EACF,GAAG,CAAC,aAAa,YAAY,CAAC;AAE9B,YAAU,MAAM;AACd,QAAI,aAAa,KAAK,GAAG;AACvB,UAAI,CAAC,aAAa,IAAI,GAAG;AACvB,gBAAQ,MAAS;AAAA,MACnB;AAAA,IACF,OAAO;AACL,YAAM,KAAK,UAAU,KAAK,IAAI,IAAI,KAAK,KAAK,IAAI;AAChD,UAAI,CAAC,YAAY,MAAM,EAAE,GAAG;AAC1B,gBAAQ,cAAc,EAAE,CAAC;AAAA,MAC3B;AAAA,IACF;AAAA,EACF,GAAG,CAAC,KAAK,CAAC;AAEV,YAAU,MAAM;AACd,QAAI,aAAa;AACf,eAAS,IAAI;AAAA,IACf;AAAA,EACF,GAAG,CAAC,MAAM,WAAW,CAAC;AAEtB,MAAI,CAAC,GAAI,MAAK,WAAW,IAAI;AAE7B,QAAM,UAAU,CAAC,cAAc,oCAAC,YAAK,IAAU,OAAO,0DAAG,WAAW,IAAI,CAAE,IAAM,oCAAC,cAAK,aAAW;AAEjG,SACE,oCAAC,SAAI,WAAW,GAAG,+BAA+B,yCAAY,OAAO,KAClE,SACC,oCAAC,SAAM,SAAS,IAAI,WAAW,yCAAY,OAAO,YAC/C,KACH,GAGF,oCAAC,SAAI,WAAW,GAAG,YAAY,KAC7B,oCAAC,WAAQ,MAAM,QAAQ,cAAc,aACnC,oCAAC,kBAAe,SAAO,QACrB;AAAA,IAAC;AAAA;AAAA,MACC,SAAS,OAAO,cAAc;AAAA,MAC9B,YAAW;AAAA,MACX,WAAW,GAAG,qDAAqD,yCAAY,MAAM;AAAA;AAAA,IAErF,oCAAC,kBAAa;AAAA,IACb;AAAA,EACH,CACF,GAEA,oCAAC,kBAAe,WAAU,cAAa,OAAM,WAC3C;AAAA,IAAC;AAAA;AAAA,MACC,MAAK;AAAA,MACL,cAAc;AAAA,MACd,UAAU;AAAA,MACV,UAAU,CAAC,YAAY;AACrB,YAAI,CAAC,YAAY,MAAM,OAAO,GAAG;AAC/B,kBAAQ,OAAO;AAAA,QACjB;AACA,YAAI,cAAe,WAAU,KAAK;AAAA,MACpC;AAAA,MACA;AAAA;AAAA,EACF,CACF,CACF,CACF,CACF;AAEJ;","names":[]}