@vchasno/ui-kit 0.4.98 → 0.4.99
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md
CHANGED
|
@@ -7,6 +7,14 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
7
7
|
|
|
8
8
|
## [Unreleased]
|
|
9
9
|
|
|
10
|
+
## [0.4.99] - 2026-04-21
|
|
11
|
+
|
|
12
|
+
### Changed
|
|
13
|
+
|
|
14
|
+
- **DateRangePicker** — extend `DateRangePickerProps` from `ReactDatePickerProps<true>` (with `Omit` of props controlled internally: `selectsRange`, `selectsMultiple`, `startDate`, `endDate`, `onChange`, `value`, `open`, `onInputClick`, `onClickOutside`, `monthsShown`, `shouldCloseOnSelect`, `renderCustomHeader`, `children`)
|
|
15
|
+
- Consumers now inherit the full `react-datepicker` prop surface (e.g. `fixedHeight`, `showPopperArrow`, `filterDate`, `excludeDates`, `calendarStartDay`, etc.)
|
|
16
|
+
- `dateFormat` now accepts `string | string[]` (matches base type); display formatting uses the first format when an array is passed
|
|
17
|
+
|
|
10
18
|
## [0.4.98] - 2026-04-20
|
|
11
19
|
|
|
12
20
|
### Fixed
|
|
@@ -3,30 +3,31 @@ import { ReactDatePickerProps } from 'react-datepicker';
|
|
|
3
3
|
import Select from '../Select/Select.js';
|
|
4
4
|
import { LoadingFeedback, WithHint, ErrorFeedback, DataQa, HideEmptyMeta, WithPulseAnimation } from '../types.js';
|
|
5
5
|
|
|
6
|
-
|
|
6
|
+
type ControlledReactDatePickerProps = 'selectsRange' | 'selectsMultiple' | 'startDate' | 'endDate' | 'onChange' | 'value' | 'open' | 'onInputClick' | 'onClickOutside' | 'monthsShown' | 'shouldCloseOnSelect' | 'renderCustomHeader' | 'children';
|
|
7
|
+
interface DateRangePickerProps extends Omit<ReactDatePickerProps<true>, ControlledReactDatePickerProps>, Partial<LoadingFeedback & WithHint & ErrorFeedback & DataQa & HideEmptyMeta & WithPulseAnimation> {
|
|
7
8
|
startDate: Date | null;
|
|
8
9
|
endDate: Date | null;
|
|
9
10
|
onChange: (dates: [Date | null, Date | null]) => void;
|
|
10
11
|
label?: string;
|
|
11
|
-
disabled?: boolean;
|
|
12
|
-
required?: boolean;
|
|
13
|
-
isClearable?: boolean;
|
|
14
12
|
wide?: boolean;
|
|
15
|
-
minDate?: Date;
|
|
16
|
-
maxDate?: Date;
|
|
17
|
-
dateFormat?: string;
|
|
18
|
-
className?: string;
|
|
19
|
-
popperClassName?: string;
|
|
20
|
-
portalId?: string;
|
|
21
13
|
cancelLabel?: string;
|
|
22
14
|
saveLabel?: string;
|
|
23
|
-
locale?: ReactDatePickerProps['locale'];
|
|
24
15
|
presets?: {
|
|
25
16
|
label: string;
|
|
26
17
|
range: [Date, Date];
|
|
27
18
|
}[];
|
|
28
19
|
presetPlaceholder?: string;
|
|
29
20
|
presetSelectProps?: Omit<React.ComponentProps<typeof Select>, 'options' | 'onChange' | 'value'>;
|
|
21
|
+
disabled?: ReactDatePickerProps<true>['disabled'];
|
|
22
|
+
required?: ReactDatePickerProps<true>['required'];
|
|
23
|
+
isClearable?: ReactDatePickerProps<true>['isClearable'];
|
|
24
|
+
minDate?: ReactDatePickerProps<true>['minDate'];
|
|
25
|
+
maxDate?: ReactDatePickerProps<true>['maxDate'];
|
|
26
|
+
dateFormat?: ReactDatePickerProps<true>['dateFormat'];
|
|
27
|
+
className?: ReactDatePickerProps<true>['className'];
|
|
28
|
+
popperClassName?: ReactDatePickerProps<true>['popperClassName'];
|
|
29
|
+
portalId?: ReactDatePickerProps<true>['portalId'];
|
|
30
|
+
locale?: ReactDatePickerProps<true>['locale'];
|
|
30
31
|
}
|
|
31
32
|
declare const DateRangePicker: React.FC<DateRangePickerProps>;
|
|
32
33
|
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import e from"react";import t from"react-datepicker";import a from"classnames";import{format as
|
|
1
|
+
import e from"react";import t from"react-datepicker";import a from"classnames";import{format as r}from"date-fns";import{uk as n}from"date-fns/locale/uk";import l from"../../icons/arrowLeft.js";import c from"../../icons/arrowRight.js";import o from"../../icons/calendar.js";import i from"../../icons/clear.js";import s from"../InputMeta/InputMeta.js";import u from"../LabelText/LabelText.js";import m from"../Select/Select.js";import"../Select/SelectCreatable.js";import"react-select/async";import"react-select";import p from"../Spinner/Spinner.js";let d=()=>e.createElement("span",{className:"vchasno-ui-date-range-picker__custom-close-icon"},i),h=({startDate:i,endDate:h,onChange:b,label:k,disabled:v,required:_,loading:g,hint:f,error:y,className:E,dateFormat:N="dd/MM/yyyy",dataQa:C,hideEmptyMeta:S=!1,wide:w=!1,pulse:j,isClearable:A=!1,minDate:L,maxDate:x,popperClassName:D,portalId:q,cancelLabel:M="Скасувати",saveLabel:I="Зберегти",locale:R=n,presets:T=[],presetPlaceholder:O="Обрати період",presetSelectProps:P,...F})=>{let[H,$]=e.useState(!1),[K,z]=e.useState(null),[B,G]=e.useState(null),[J,Q]=e.useState(null);e.useEffect(()=>{if(!H)return;let e=()=>{let e=document.querySelector(".vchasno-ui-date-range-picker-popper");e&&e.querySelectorAll(".react-datepicker__day--outside-month").forEach(e=>{if(e.textContent?.trim())return;let t=(e.getAttribute("aria-label")??"").match(/\d+/);t?.[0]&&(e.textContent=t[0])})},t=requestAnimationFrame(e),a=document.querySelector(".vchasno-ui-date-range-picker-popper"),r=new MutationObserver(e);return a&&r.observe(a,{childList:!0,subtree:!0}),()=>{cancelAnimationFrame(t),r.disconnect()}},[H]);let U=()=>{z(i),G(h),Q(null),$(!1)},V=(()=>{if(!i&&!h)return"";let e=Array.isArray(N)?N[0]:N;if(!e)return"";let t=i?r(i,e):"",a=h?r(h,e):"";return t&&a?`${t} - ${a}`:t||""})(),W=!!i||!!h;return e.createElement("label",{onClick:e=>e.preventDefault(),"data-qa":C,className:a("vchasno-ui-date-picker","vchasno-ui-date-range-picker",{"--loading":g,"--required":_,"--disabled":v,"--error":y,"--wide":w,"--not-empty":W,"--is-label":!!k},E),onKeyDown:e=>{"Escape"===e.key&&H&&U()}},e.createElement("span",{className:a("vchasno-ui-date-range-picker__wrapper",{"vchasno-ui-pulse-animation":j&&!v})},k&&e.createElement(u,null,k),e.createElement(t,{fixedHeight:!0,locale:R,disabled:v,placeholderText:"ДД/ММ/РРРР - ДД/ММ/РРРР",showPopperArrow:!1,className:a("vchasno-ui-date-range-picker__picker","vchasno-ui-date-picker__picker"),popperClassName:a("vchasno-ui-date-range-picker-popper",D),selectsRange:!0,startDate:H?K:i,endDate:H?B:h,onChange:e=>{let[t,a]=e;z(t),G(a),Q(null)},monthsShown:2,shouldCloseOnSelect:!1,open:H,onInputClick:()=>{v||(z(i),G(h),$(!0))},onClickOutside:U,enableTabLoop:!1,minDate:L,maxDate:x,portalId:q,value:V,renderCustomHeader:({monthDate:t,decreaseMonth:a,increaseMonth:n,prevMonthButtonDisabled:o,nextMonthButtonDisabled:i})=>e.createElement("div",{className:"vchasno-ui-date-range-picker__header"},e.createElement("button",{type:"button",className:"vchasno-ui-date-range-picker__nav-btn",onClick:a,disabled:o},e.createElement(l,null)),e.createElement("span",{className:"vchasno-ui-date-range-picker__month-title"},r(t,"LLLL, yyyy",{locale:"string"==typeof R?void 0:R})),e.createElement("button",{type:"button",className:"vchasno-ui-date-range-picker__nav-btn",onClick:n,disabled:i},e.createElement(c,null))),...F},T.length>0&&e.createElement("div",{className:"vchasno-ui-date-range-picker__presets"},e.createElement(m,{className:"vchasno-ui-date-range-picker__preset-select",isClearable:!0,options:T.map(e=>({label:e.label,value:e.label})),value:J,placeholder:O,onChange:e=>{let t=Array.isArray(e)?null:e;if(!t){Q(null),z(null),G(null);return}let a=T.find(e=>e.label===t.value);a&&(Q(t),z(a.range[0]),G(a.range[1]))},hideEmptyMeta:!0,wide:!0,...P})),e.createElement("div",{className:"vchasno-ui-date-range-picker__actions"},e.createElement("button",{type:"button",className:"vchasno-ui-date-range-picker__cancel-btn",onClick:U},M),e.createElement("button",{type:"button",className:"vchasno-ui-date-range-picker__save-btn",onClick:()=>{b([K,B]),$(!1)}},I))),g?e.createElement(p,{className:"vchasno-ui-date-range-picker__spinner"}):e.createElement(o,{className:"vchasno-ui-date-range-picker__custom-calendar-icon"}),A&&W&&!v&&e.createElement("button",{type:"button","aria-label":"Очистити",className:"vchasno-ui-date-range-picker__clear-btn",onClick:()=>{b([null,null]),z(null),G(null),Q(null)}},e.createElement(d,null))),!S||y||f?e.createElement(s,{hint:f,error:y}):null)};h.displayName="DateRangePicker";export{h as default};
|
|
2
2
|
//# sourceMappingURL=DateRangePicker.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DateRangePicker.js","sources":["../../../src/components/Datepicker/DateRangePicker.tsx"],"sourcesContent":["import React from 'react';\nimport type { ReactDatePickerProps } from 'react-datepicker';\nimport ReactDatePicker from 'react-datepicker';\n\nimport cn from 'classnames';\nimport { format } from 'date-fns';\nimport { uk } from 'date-fns/locale/uk';\n\nimport ArrowLeftIcon from '../../icons/arrowLeft';\nimport ArrowRightIcon from '../../icons/arrowRight';\nimport CalendarIcon from '../../icons/calendar';\nimport clearRawSvg from '../../icons/clear';\nimport InputMeta from '../InputMeta';\nimport LabelText from '../LabelText';\nimport Select from '../Select';\nimport type { SelectOption } from '../Select';\nimport Spinner from '../Spinner';\nimport type {\n DataQa,\n ErrorFeedback,\n HideEmptyMeta,\n LoadingFeedback,\n WithHint,\n WithPulseAnimation,\n} from '../types';\n\nimport './DatePicker.global.css';\nimport './DateRangePicker.global.css';\n\nconst CloseSvg = () => (\n <span className=\"vchasno-ui-date-range-picker__custom-close-icon\">{clearRawSvg}</span>\n);\n\nexport interface DateRangePickerProps\n extends Partial<\n LoadingFeedback & WithHint & ErrorFeedback & DataQa & HideEmptyMeta & WithPulseAnimation\n > {\n startDate: Date | null;\n endDate: Date | null;\n onChange: (dates: [Date | null, Date | null]) => void;\n label?: string;\n disabled?: boolean;\n required?: boolean;\n isClearable?: boolean;\n wide?: boolean;\n minDate?: Date;\n maxDate?: Date;\n dateFormat?: string;\n className?: string;\n popperClassName?: string;\n portalId?: string;\n cancelLabel?: string;\n saveLabel?: string;\n locale?: ReactDatePickerProps['locale'];\n presets?: { label: string; range: [Date, Date] }[];\n presetPlaceholder?: string;\n presetSelectProps?: Omit<React.ComponentProps<typeof Select>, 'options' | 'onChange' | 'value'>;\n}\n\nconst DateRangePicker: React.FC<DateRangePickerProps> = ({\n startDate,\n endDate,\n onChange,\n label,\n disabled,\n required,\n loading,\n hint,\n error,\n className,\n dateFormat = 'dd/MM/yyyy',\n dataQa,\n hideEmptyMeta = false,\n wide = false,\n pulse,\n isClearable = false,\n minDate,\n maxDate,\n popperClassName,\n portalId,\n cancelLabel = 'Скасувати',\n saveLabel = 'Зберегти',\n locale = uk,\n presets = [],\n presetPlaceholder = 'Обрати період',\n presetSelectProps,\n ...props\n}) => {\n const [isOpen, setIsOpen] = React.useState(false);\n const [tempStartDate, setTempStartDate] = React.useState<Date | null>(null);\n const [tempEndDate, setTempEndDate] = React.useState<Date | null>(null);\n const [selectedPreset, setSelectedPreset] = React.useState<SelectOption | null>(null);\n\n // react-datepicker hides outside-month day text when monthsShown > 1\n // (monthShowsDuplicateDaysStart/End). This effect restores the day numbers\n // by reading each cell's aria-label and extracting the date.\n React.useEffect(() => {\n if (!isOpen) return;\n\n const fillEmptyDays = () => {\n const container = document.querySelector('.vchasno-ui-date-range-picker-popper');\n if (!container) return;\n container.querySelectorAll('.react-datepicker__day--outside-month').forEach((el) => {\n if (el.textContent?.trim()) return;\n const ariaLabel = el.getAttribute('aria-label') ?? '';\n const match = ariaLabel.match(/\\d+/);\n if (match?.[0]) {\n el.textContent = match[0];\n }\n });\n };\n\n const frame = requestAnimationFrame(fillEmptyDays);\n\n const container = document.querySelector('.vchasno-ui-date-range-picker-popper');\n const observer = new MutationObserver(fillEmptyDays);\n if (container) {\n observer.observe(container, { childList: true, subtree: true });\n }\n\n return () => {\n cancelAnimationFrame(frame);\n observer.disconnect();\n };\n }, [isOpen]);\n\n const handleOpen = () => {\n if (disabled) return;\n setTempStartDate(startDate);\n setTempEndDate(endDate);\n setIsOpen(true);\n };\n\n const handleTempChange = (dates: [Date | null, Date | null]) => {\n const [start, end] = dates;\n setTempStartDate(start);\n setTempEndDate(end);\n setSelectedPreset(null);\n };\n\n const handleSave = () => {\n onChange([tempStartDate, tempEndDate]);\n setIsOpen(false);\n };\n\n const handleCancel = () => {\n setTempStartDate(startDate);\n setTempEndDate(endDate);\n setSelectedPreset(null);\n setIsOpen(false);\n };\n\n const handleClear = () => {\n onChange([null, null]);\n setTempStartDate(null);\n setTempEndDate(null);\n setSelectedPreset(null);\n };\n\n const handlePresetChange = (newValue: SelectOption | readonly SelectOption[] | null) => {\n const option = Array.isArray(newValue) ? null : (newValue as SelectOption | null);\n if (!option) {\n setSelectedPreset(null);\n setTempStartDate(null);\n setTempEndDate(null);\n return;\n }\n const preset = presets.find((p) => p.label === option.value);\n if (preset) {\n setSelectedPreset(option);\n setTempStartDate(preset.range[0]);\n setTempEndDate(preset.range[1]);\n }\n };\n\n const handleKeyDown = (e: React.KeyboardEvent) => {\n if (e.key === 'Escape' && isOpen) {\n handleCancel();\n }\n };\n\n const formatDisplayValue = (): string => {\n if (!startDate && !endDate) return '';\n const startStr = startDate ? format(startDate, dateFormat) : '';\n const endStr = endDate ? format(endDate, dateFormat) : '';\n if (startStr && endStr) return `${startStr} - ${endStr}`;\n if (startStr) return startStr;\n return '';\n };\n\n const displayValue = formatDisplayValue();\n const valueExists = !!startDate || !!endDate;\n\n return (\n <label\n onClick={(e) => e.preventDefault()}\n data-qa={dataQa}\n className={cn(\n 'vchasno-ui-date-picker',\n 'vchasno-ui-date-range-picker',\n {\n '--loading': loading,\n '--required': required,\n '--disabled': disabled,\n '--error': error,\n '--wide': wide,\n '--not-empty': valueExists,\n '--is-label': !!label,\n },\n className,\n )}\n onKeyDown={handleKeyDown}\n >\n <span\n className={cn('vchasno-ui-date-range-picker__wrapper', {\n 'vchasno-ui-pulse-animation': pulse && !disabled,\n })}\n >\n {label && <LabelText>{label}</LabelText>}\n <ReactDatePicker\n fixedHeight\n locale={locale}\n disabled={disabled}\n placeholderText=\"ДД/ММ/РРРР - ДД/ММ/РРРР\"\n showPopperArrow={false}\n className={cn(\n 'vchasno-ui-date-range-picker__picker',\n 'vchasno-ui-date-picker__picker',\n )}\n popperClassName={cn('vchasno-ui-date-range-picker-popper', popperClassName)}\n selectsRange\n startDate={isOpen ? tempStartDate : startDate}\n endDate={isOpen ? tempEndDate : endDate}\n onChange={handleTempChange}\n monthsShown={2}\n shouldCloseOnSelect={false}\n open={isOpen}\n onInputClick={handleOpen}\n onClickOutside={handleCancel}\n enableTabLoop={false}\n minDate={minDate}\n maxDate={maxDate}\n portalId={portalId}\n value={displayValue}\n renderCustomHeader={({\n monthDate,\n decreaseMonth,\n increaseMonth,\n prevMonthButtonDisabled,\n nextMonthButtonDisabled,\n }) => (\n <div className=\"vchasno-ui-date-range-picker__header\">\n <button\n type=\"button\"\n className=\"vchasno-ui-date-range-picker__nav-btn\"\n onClick={decreaseMonth}\n disabled={prevMonthButtonDisabled}\n >\n <ArrowLeftIcon />\n </button>\n <span className=\"vchasno-ui-date-range-picker__month-title\">\n {format(monthDate, 'LLLL, yyyy', {\n locale: typeof locale === 'string' ? undefined : locale,\n })}\n </span>\n <button\n type=\"button\"\n className=\"vchasno-ui-date-range-picker__nav-btn\"\n onClick={increaseMonth}\n disabled={nextMonthButtonDisabled}\n >\n <ArrowRightIcon />\n </button>\n </div>\n )}\n {...props}\n >\n {presets.length > 0 && (\n <div className=\"vchasno-ui-date-range-picker__presets\">\n <Select\n className=\"vchasno-ui-date-range-picker__preset-select\"\n isClearable\n options={presets.map((p) => ({\n label: p.label,\n value: p.label,\n }))}\n value={selectedPreset}\n placeholder={presetPlaceholder}\n onChange={handlePresetChange}\n hideEmptyMeta\n wide\n {...presetSelectProps}\n />\n </div>\n )}\n <div className=\"vchasno-ui-date-range-picker__actions\">\n <button\n type=\"button\"\n className=\"vchasno-ui-date-range-picker__cancel-btn\"\n onClick={handleCancel}\n >\n {cancelLabel}\n </button>\n <button\n type=\"button\"\n className=\"vchasno-ui-date-range-picker__save-btn\"\n onClick={handleSave}\n >\n {saveLabel}\n </button>\n </div>\n </ReactDatePicker>\n {loading ? (\n <Spinner className=\"vchasno-ui-date-range-picker__spinner\" />\n ) : (\n <CalendarIcon className=\"vchasno-ui-date-range-picker__custom-calendar-icon\" />\n )}\n {isClearable && valueExists && !disabled && (\n <button\n type=\"button\"\n aria-label=\"Очистити\"\n className=\"vchasno-ui-date-range-picker__clear-btn\"\n onClick={handleClear}\n >\n <CloseSvg />\n </button>\n )}\n </span>\n {hideEmptyMeta && !error && !hint ? null : <InputMeta hint={hint} error={error} />}\n </label>\n );\n};\n\nDateRangePicker.displayName = 'DateRangePicker';\n\nexport default DateRangePicker;\n"],"names":["CloseSvg","React","span","className","clearRawSvg","DateRangePicker","startDate","endDate","onChange","label","disabled","required","loading","hint","error","dateFormat","dataQa","hideEmptyMeta","wide","pulse","isClearable","minDate","maxDate","popperClassName","portalId","cancelLabel","saveLabel","locale","uk","presets","presetPlaceholder","presetSelectProps","props","isOpen","setIsOpen","useState","tempStartDate","setTempStartDate","tempEndDate","setTempEndDate","selectedPreset","setSelectedPreset","useEffect","fillEmptyDays","container","document","querySelector","querySelectorAll","forEach","el","textContent","trim","match","ariaLabel","getAttribute","frame","requestAnimationFrame","observer","MutationObserver","observe","childList","subtree","cancelAnimationFrame","disconnect","handleCancel","displayValue","formatDisplayValue","startStr","format","endStr","valueExists","onClick","e","preventDefault","data-qa","cn","onKeyDown","key","createElement","LabelText","ReactDatePicker","fixedHeight","placeholderText","showPopperArrow","selectsRange","dates","start","end","monthsShown","shouldCloseOnSelect","open","onInputClick","onClickOutside","enableTabLoop","value","renderCustomHeader","monthDate","decreaseMonth","increaseMonth","prevMonthButtonDisabled","nextMonthButtonDisabled","div","button","type","ArrowLeftIcon","undefined","ArrowRightIcon","length","Select","options","map","p","placeholder","newValue","option","Array","isArray","preset","find","range","Spinner","CalendarIcon","aria-label","InputMeta","displayName"],"mappings":"oiBA6BA,IAAMA,EAAW,IACbC,EAACC,aAAAA,CAAAA,OAAAA,CAAKC,UAAU,iDAAmDC,EAAAA,GA6BjEC,EAAkD,CAAC,CACrDC,UAAAA,CAAS,CACTC,QAAAA,CAAO,CACPC,SAAAA,CAAQ,CACRC,MAAAA,CAAK,CACLC,SAAAA,CAAQ,CACRC,SAAAA,CAAQ,CACRC,QAAAA,CAAO,CACPC,KAAAA,CAAI,CACJC,MAAAA,CAAK,CACLX,UAAAA,CAAS,CACTY,WAAAA,EAAa,YAAY,CACzBC,OAAAA,CAAM,CACNC,cAAAA,EAAgB,CAAA,CAAK,CACrBC,KAAAA,EAAO,CAAA,CAAK,CACZC,MAAAA,CAAK,CACLC,YAAAA,EAAc,CAAA,CAAK,CACnBC,QAAAA,CAAO,CACPC,QAAAA,CAAO,CACPC,gBAAAA,CAAe,CACfC,SAAAA,CAAQ,CACRC,YAAAA,EAAc,WAAW,CACzBC,UAAAA,EAAY,UAAU,CACtBC,OAAAA,EAASC,CAAE,CACXC,QAAAA,EAAU,EAAE,CACZC,kBAAAA,EAAoB,eAAe,CACnCC,kBAAAA,CAAiB,CACjB,GAAGC,EACN,IACG,GAAM,CAACC,EAAQC,EAAU,CAAGjC,EAAMkC,QAAQ,CAAC,CAAA,GACrC,CAACC,EAAeC,EAAiB,CAAGpC,EAAMkC,QAAQ,CAAc,MAChE,CAACG,EAAaC,EAAe,CAAGtC,EAAMkC,QAAQ,CAAc,MAC5D,CAACK,EAAgBC,EAAkB,CAAGxC,EAAMkC,QAAQ,CAAsB,MAKhFlC,EAAMyC,SAAS,CAAC,KACZ,GAAI,CAACT,EAAQ,OAEb,IAAMU,EAAgB,KAClB,IAAMC,EAAYC,SAASC,aAAa,CAAC,wCACpCF,GACLA,EAAUG,gBAAgB,CAAC,yCAAyCC,OAAO,CAAC,AAACC,IACzE,GAAIA,EAAGC,WAAW,EAAEC,OAAQ,OAE5B,IAAMC,EAAQC,AADIJ,CAAAA,EAAGK,YAAY,CAAC,eAAiB,EAAA,EAC3BF,KAAK,CAAC,OAC1BA,GAAQ,CAAA,EAAE,EACVH,CAAAA,EAAGC,WAAW,CAAGE,CAAK,CAAC,EAAE,AAAA,CAEjC,EACJ,EAEMG,EAAQC,sBAAsBb,GAE9BC,EAAYC,SAASC,aAAa,CAAC,wCACnCW,EAAW,IAAIC,iBAAiBf,GAKtC,OAJIC,GACAa,EAASE,OAAO,CAACf,EAAW,CAAEgB,UAAW,CAAA,EAAMC,QAAS,CAAA,CAAK,GAG1D,KACHC,qBAAqBP,GACrBE,EAASM,UAAU,EACvB,GACD,CAAC9B,EAAO,EAqBX,IAAM+B,EAAe,KACjB3B,EAAiB/B,GACjBiC,EAAehC,GACfkC,EAAkB,MAClBP,EAAU,CAAA,EACd,EAwCM+B,EAAeC,AATM,CAAA,KACvB,GAAI,CAAC5D,GAAa,CAACC,EAAS,MAAO,GACnC,IAAM4D,EAAW7D,EAAY8D,EAAO9D,EAAWS,GAAc,GACvDsD,EAAS9D,EAAU6D,EAAO7D,EAASQ,GAAc,UACvD,AAAIoD,GAAYE,EAAe,GAAGF,EAAS,GAAG,EAAEE,EAAQ,CAAA,CACpDF,GACG,EACX,CAAA,IAGMG,EAAc,CAAC,CAAChE,GAAa,CAAC,CAACC,EAErC,OACIN,EAACQ,aAAAA,CAAAA,QAAAA,CACG8D,QAAS,AAACC,GAAMA,EAAEC,cAAc,GAChCC,UAAS1D,EACTb,UAAWwE,EACP,yBACA,+BACA,CACI,YAAa/D,EACb,aAAcD,EACd,aAAcD,EACd,UAAWI,EACX,SAAUI,EACV,cAAeoD,EACf,aAAc,CAAC,CAAC7D,CAEpBN,EAAAA,GAEJyE,UApCc,AAACJ,IACL,WAAVA,EAAEK,GAAG,EAAiB5C,GACtB+B,GAER,GAkCQ/D,EAACC,aAAAA,CAAAA,OAAAA,CACGC,UAAWwE,EAAG,wCAAyC,CACnD,6BAA8BxD,GAAS,CAACT,CAC5C,IAECD,GAASR,EAAA6E,aAAA,CAACC,EAAWtE,KAAAA,GACtBR,EAAC+E,aAAAA,CAAAA,EAAAA,CACGC,YAAAA,CAAAA,EACAtD,OAAQA,EACRjB,SAAUA,EACVwE,gBAAgB,0BAChBC,gBAAiB,CAAA,EACjBhF,UAAWwE,EACP,uCACA,kCAEJpD,gBAAiBoD,EAAG,sCAAuCpD,GAC3D6D,aAAAA,CAAAA,EACA9E,UAAW2B,EAASG,EAAgB9B,EACpCC,QAAS0B,EAASK,EAAc/B,EAChCC,SApGS,AAAC6E,IACtB,GAAM,CAACC,EAAOC,EAAI,CAAGF,EACrBhD,EAAiBiD,GACjB/C,EAAegD,GACf9C,EAAkB,KACtB,EAgGgB+C,YAAa,EACbC,oBAAqB,CAAA,EACrBC,KAAMzD,EACN0D,aA/GG,KACXjF,IACJ2B,EAAiB/B,GACjBiC,EAAehC,GACf2B,EAAU,CAAA,GACd,EA2GgB0D,eAAgB5B,EAChB6B,cAAe,CAAA,EACfxE,QAASA,EACTC,QAASA,EACTE,SAAUA,EACVsE,MAAO7B,EACP8B,mBAAoB,CAAC,CACjBC,UAAAA,CAAS,CACTC,cAAAA,CAAa,CACbC,cAAAA,CAAa,CACbC,wBAAAA,CAAuB,CACvBC,wBAAAA,CAAuB,CAC1B,GACGnG,EAACoG,aAAAA,CAAAA,MAAAA,CAAIlG,UAAU,wCACXF,EAACqG,aAAAA,CAAAA,SAAAA,CACGC,KAAK,SACLpG,UAAU,wCACVoE,QAAS0B,EACTvF,SAAUyF,CAEV,EAAAlG,EAAA6E,aAAA,CAAC0B,SAELvG,EAACC,aAAAA,CAAAA,OAAAA,CAAKC,UAAU,2CACXiE,EAAAA,EAAO4B,EAAW,aAAc,CAC7BrE,OAAQ,AAAkB,UAAlB,OAAOA,EAAsB8E,KAAAA,EAAY9E,CACrD,IAEJ1B,EAACqG,aAAAA,CAAAA,SAAAA,CACGC,KAAK,SACLpG,UAAU,wCACVoE,QAAS2B,EACTxF,SAAU0F,GAEVnG,EAACyG,aAAAA,CAAAA,EAAAA,QAIZ,GAAG1E,CAAAA,EAEHH,EAAQ8E,MAAM,CAAG,GACd1G,EAACoG,aAAAA,CAAAA,MAAAA,CAAIlG,UAAU,yCACXF,EAAC2G,aAAAA,CAAAA,EAAAA,CACGzG,UAAU,8CACViB,YAAAA,CAAAA,EACAyF,QAAShF,EAAQiF,GAAG,CAAC,AAACC,GAAO,CAAA,CACzBtG,MAAOsG,EAAEtG,KAAK,CACdqF,MAAOiB,EAAEtG,KAAAA,IAEbqF,MAAOtD,EACPwE,YAAalF,EACbtB,SAjID,AAACyG,IACxB,IAAMC,EAASC,MAAMC,OAAO,CAACH,GAAY,KAAQA,EACjD,GAAI,CAACC,EAAQ,CACTzE,EAAkB,MAClBJ,EAAiB,MACjBE,EAAe,MACf,MACJ,CACA,IAAM8E,EAASxF,EAAQyF,IAAI,CAAC,AAACP,GAAMA,EAAEtG,KAAK,GAAKyG,EAAOpB,KAAK,EACvDuB,IACA5E,EAAkByE,GAClB7E,EAAiBgF,EAAOE,KAAK,CAAC,EAAE,EAChChF,EAAe8E,EAAOE,KAAK,CAAC,EAAE,EAEtC,EAoH4BtG,cAAAA,CAAAA,EACAC,KAAAA,CAAAA,EACC,GAAGa,CAAAA,IAIhB9B,EAACoG,aAAAA,CAAAA,MAAAA,CAAIlG,UAAU,yCACXF,EAACqG,aAAAA,CAAAA,SAAAA,CACGC,KAAK,SACLpG,UAAU,2CACVoE,QAASP,CAERvC,EAAAA,GAELxB,EAACqG,aAAAA,CAAAA,SAAAA,CACGC,KAAK,SACLpG,UAAU,yCACVoE,QAtKL,KACf/D,EAAS,CAAC4B,EAAeE,EAAY,EACrCJ,EAAU,CAAA,EACd,CAqKyBR,EAAAA,KAIZd,EACGX,EAACuH,aAAAA,CAAAA,EAAAA,CAAQrH,UAAU,0CAEnBF,EAACwH,aAAAA,CAAAA,EAAAA,CAAatH,UAAU,uDAE3BiB,GAAekD,GAAe,CAAC5D,GAC5BT,EAACqG,aAAAA,CAAAA,SAAAA,CACGC,KAAK,SACLmB,aAAW,WACXvH,UAAU,0CACVoE,QA1KA,KAChB/D,EAAS,CAAC,KAAM,KAAK,EACrB6B,EAAiB,MACjBE,EAAe,MACfE,EAAkB,KACtB,CAuKoB,EAAAxC,EAAA6E,aAAA,CAAC9E,UAIZiB,CAAAA,GAAkBH,GAAUD,EAAcZ,EAAC0H,aAAAA,CAAAA,EAAAA,CAAU9G,KAAMA,EAAMC,MAAOA,IAArC,KAGhD,CAEAT,CAAAA,EAAgBuH,WAAW,CAAG"}
|
|
1
|
+
{"version":3,"file":"DateRangePicker.js","sources":["../../../src/components/Datepicker/DateRangePicker.tsx"],"sourcesContent":["import React from 'react';\nimport type { ReactDatePickerProps } from 'react-datepicker';\nimport ReactDatePicker from 'react-datepicker';\n\nimport cn from 'classnames';\nimport { format } from 'date-fns';\nimport { uk } from 'date-fns/locale/uk';\n\nimport ArrowLeftIcon from '../../icons/arrowLeft';\nimport ArrowRightIcon from '../../icons/arrowRight';\nimport CalendarIcon from '../../icons/calendar';\nimport clearRawSvg from '../../icons/clear';\nimport InputMeta from '../InputMeta';\nimport LabelText from '../LabelText';\nimport Select from '../Select';\nimport type { SelectOption } from '../Select';\nimport Spinner from '../Spinner';\nimport type {\n DataQa,\n ErrorFeedback,\n HideEmptyMeta,\n LoadingFeedback,\n WithHint,\n WithPulseAnimation,\n} from '../types';\n\nimport './DatePicker.global.css';\nimport './DateRangePicker.global.css';\n\nconst CloseSvg = () => (\n <span className=\"vchasno-ui-date-range-picker__custom-close-icon\">{clearRawSvg}</span>\n);\n\ntype ControlledReactDatePickerProps =\n | 'selectsRange'\n | 'selectsMultiple'\n | 'startDate'\n | 'endDate'\n | 'onChange'\n | 'value'\n | 'open'\n | 'onInputClick'\n | 'onClickOutside'\n | 'monthsShown'\n | 'shouldCloseOnSelect'\n | 'renderCustomHeader'\n | 'children';\n\nexport interface DateRangePickerProps\n extends Omit<ReactDatePickerProps<true>, ControlledReactDatePickerProps>,\n Partial<\n LoadingFeedback & WithHint & ErrorFeedback & DataQa & HideEmptyMeta & WithPulseAnimation\n > {\n // Required controlled props (range-mode contract)\n startDate: Date | null;\n endDate: Date | null;\n onChange: (dates: [Date | null, Date | null]) => void;\n\n // UI-kit additions\n label?: string;\n wide?: boolean;\n cancelLabel?: string;\n saveLabel?: string;\n presets?: { label: string; range: [Date, Date] }[];\n presetPlaceholder?: string;\n presetSelectProps?: Omit<React.ComponentProps<typeof Select>, 'options' | 'onChange' | 'value'>;\n\n // Explicit re-declarations for Storybook Controls visibility\n // (types inherited from ReactDatePickerProps<true> via indexed access — zero drift)\n disabled?: ReactDatePickerProps<true>['disabled'];\n required?: ReactDatePickerProps<true>['required'];\n isClearable?: ReactDatePickerProps<true>['isClearable'];\n minDate?: ReactDatePickerProps<true>['minDate'];\n maxDate?: ReactDatePickerProps<true>['maxDate'];\n dateFormat?: ReactDatePickerProps<true>['dateFormat'];\n className?: ReactDatePickerProps<true>['className'];\n popperClassName?: ReactDatePickerProps<true>['popperClassName'];\n portalId?: ReactDatePickerProps<true>['portalId'];\n locale?: ReactDatePickerProps<true>['locale'];\n}\n\nconst DateRangePicker: React.FC<DateRangePickerProps> = ({\n startDate,\n endDate,\n onChange,\n label,\n disabled,\n required,\n loading,\n hint,\n error,\n className,\n dateFormat = 'dd/MM/yyyy',\n dataQa,\n hideEmptyMeta = false,\n wide = false,\n pulse,\n isClearable = false,\n minDate,\n maxDate,\n popperClassName,\n portalId,\n cancelLabel = 'Скасувати',\n saveLabel = 'Зберегти',\n locale = uk,\n presets = [],\n presetPlaceholder = 'Обрати період',\n presetSelectProps,\n ...props\n}) => {\n const [isOpen, setIsOpen] = React.useState(false);\n const [tempStartDate, setTempStartDate] = React.useState<Date | null>(null);\n const [tempEndDate, setTempEndDate] = React.useState<Date | null>(null);\n const [selectedPreset, setSelectedPreset] = React.useState<SelectOption | null>(null);\n\n // react-datepicker hides outside-month day text when monthsShown > 1\n // (monthShowsDuplicateDaysStart/End). This effect restores the day numbers\n // by reading each cell's aria-label and extracting the date.\n React.useEffect(() => {\n if (!isOpen) return;\n\n const fillEmptyDays = () => {\n const container = document.querySelector('.vchasno-ui-date-range-picker-popper');\n if (!container) return;\n container.querySelectorAll('.react-datepicker__day--outside-month').forEach((el) => {\n if (el.textContent?.trim()) return;\n const ariaLabel = el.getAttribute('aria-label') ?? '';\n const match = ariaLabel.match(/\\d+/);\n if (match?.[0]) {\n el.textContent = match[0];\n }\n });\n };\n\n const frame = requestAnimationFrame(fillEmptyDays);\n\n const container = document.querySelector('.vchasno-ui-date-range-picker-popper');\n const observer = new MutationObserver(fillEmptyDays);\n if (container) {\n observer.observe(container, { childList: true, subtree: true });\n }\n\n return () => {\n cancelAnimationFrame(frame);\n observer.disconnect();\n };\n }, [isOpen]);\n\n const handleOpen = () => {\n if (disabled) return;\n setTempStartDate(startDate);\n setTempEndDate(endDate);\n setIsOpen(true);\n };\n\n const handleTempChange = (dates: [Date | null, Date | null]) => {\n const [start, end] = dates;\n setTempStartDate(start);\n setTempEndDate(end);\n setSelectedPreset(null);\n };\n\n const handleSave = () => {\n onChange([tempStartDate, tempEndDate]);\n setIsOpen(false);\n };\n\n const handleCancel = () => {\n setTempStartDate(startDate);\n setTempEndDate(endDate);\n setSelectedPreset(null);\n setIsOpen(false);\n };\n\n const handleClear = () => {\n onChange([null, null]);\n setTempStartDate(null);\n setTempEndDate(null);\n setSelectedPreset(null);\n };\n\n const handlePresetChange = (newValue: SelectOption | readonly SelectOption[] | null) => {\n const option = Array.isArray(newValue) ? null : (newValue as SelectOption | null);\n if (!option) {\n setSelectedPreset(null);\n setTempStartDate(null);\n setTempEndDate(null);\n return;\n }\n const preset = presets.find((p) => p.label === option.value);\n if (preset) {\n setSelectedPreset(option);\n setTempStartDate(preset.range[0]);\n setTempEndDate(preset.range[1]);\n }\n };\n\n const handleKeyDown = (e: React.KeyboardEvent) => {\n if (e.key === 'Escape' && isOpen) {\n handleCancel();\n }\n };\n\n const formatDisplayValue = (): string => {\n if (!startDate && !endDate) return '';\n const displayFormat = Array.isArray(dateFormat) ? dateFormat[0] : dateFormat;\n if (!displayFormat) return '';\n const startStr = startDate ? format(startDate, displayFormat) : '';\n const endStr = endDate ? format(endDate, displayFormat) : '';\n if (startStr && endStr) return `${startStr} - ${endStr}`;\n if (startStr) return startStr;\n return '';\n };\n\n const displayValue = formatDisplayValue();\n const valueExists = !!startDate || !!endDate;\n\n return (\n <label\n onClick={(e) => e.preventDefault()}\n data-qa={dataQa}\n className={cn(\n 'vchasno-ui-date-picker',\n 'vchasno-ui-date-range-picker',\n {\n '--loading': loading,\n '--required': required,\n '--disabled': disabled,\n '--error': error,\n '--wide': wide,\n '--not-empty': valueExists,\n '--is-label': !!label,\n },\n className,\n )}\n onKeyDown={handleKeyDown}\n >\n <span\n className={cn('vchasno-ui-date-range-picker__wrapper', {\n 'vchasno-ui-pulse-animation': pulse && !disabled,\n })}\n >\n {label && <LabelText>{label}</LabelText>}\n <ReactDatePicker\n fixedHeight\n locale={locale}\n disabled={disabled}\n placeholderText=\"ДД/ММ/РРРР - ДД/ММ/РРРР\"\n showPopperArrow={false}\n className={cn(\n 'vchasno-ui-date-range-picker__picker',\n 'vchasno-ui-date-picker__picker',\n )}\n popperClassName={cn('vchasno-ui-date-range-picker-popper', popperClassName)}\n selectsRange\n startDate={isOpen ? tempStartDate : startDate}\n endDate={isOpen ? tempEndDate : endDate}\n onChange={handleTempChange}\n monthsShown={2}\n shouldCloseOnSelect={false}\n open={isOpen}\n onInputClick={handleOpen}\n onClickOutside={handleCancel}\n enableTabLoop={false}\n minDate={minDate}\n maxDate={maxDate}\n portalId={portalId}\n value={displayValue}\n renderCustomHeader={({\n monthDate,\n decreaseMonth,\n increaseMonth,\n prevMonthButtonDisabled,\n nextMonthButtonDisabled,\n }) => (\n <div className=\"vchasno-ui-date-range-picker__header\">\n <button\n type=\"button\"\n className=\"vchasno-ui-date-range-picker__nav-btn\"\n onClick={decreaseMonth}\n disabled={prevMonthButtonDisabled}\n >\n <ArrowLeftIcon />\n </button>\n <span className=\"vchasno-ui-date-range-picker__month-title\">\n {format(monthDate, 'LLLL, yyyy', {\n locale: typeof locale === 'string' ? undefined : locale,\n })}\n </span>\n <button\n type=\"button\"\n className=\"vchasno-ui-date-range-picker__nav-btn\"\n onClick={increaseMonth}\n disabled={nextMonthButtonDisabled}\n >\n <ArrowRightIcon />\n </button>\n </div>\n )}\n {...props}\n >\n {presets.length > 0 && (\n <div className=\"vchasno-ui-date-range-picker__presets\">\n <Select\n className=\"vchasno-ui-date-range-picker__preset-select\"\n isClearable\n options={presets.map((p) => ({\n label: p.label,\n value: p.label,\n }))}\n value={selectedPreset}\n placeholder={presetPlaceholder}\n onChange={handlePresetChange}\n hideEmptyMeta\n wide\n {...presetSelectProps}\n />\n </div>\n )}\n <div className=\"vchasno-ui-date-range-picker__actions\">\n <button\n type=\"button\"\n className=\"vchasno-ui-date-range-picker__cancel-btn\"\n onClick={handleCancel}\n >\n {cancelLabel}\n </button>\n <button\n type=\"button\"\n className=\"vchasno-ui-date-range-picker__save-btn\"\n onClick={handleSave}\n >\n {saveLabel}\n </button>\n </div>\n </ReactDatePicker>\n {loading ? (\n <Spinner className=\"vchasno-ui-date-range-picker__spinner\" />\n ) : (\n <CalendarIcon className=\"vchasno-ui-date-range-picker__custom-calendar-icon\" />\n )}\n {isClearable && valueExists && !disabled && (\n <button\n type=\"button\"\n aria-label=\"Очистити\"\n className=\"vchasno-ui-date-range-picker__clear-btn\"\n onClick={handleClear}\n >\n <CloseSvg />\n </button>\n )}\n </span>\n {hideEmptyMeta && !error && !hint ? null : <InputMeta hint={hint} error={error} />}\n </label>\n );\n};\n\nDateRangePicker.displayName = 'DateRangePicker';\n\nexport default DateRangePicker;\n"],"names":["CloseSvg","React","span","className","clearRawSvg","DateRangePicker","startDate","endDate","onChange","label","disabled","required","loading","hint","error","dateFormat","dataQa","hideEmptyMeta","wide","pulse","isClearable","minDate","maxDate","popperClassName","portalId","cancelLabel","saveLabel","locale","uk","presets","presetPlaceholder","presetSelectProps","props","isOpen","setIsOpen","useState","tempStartDate","setTempStartDate","tempEndDate","setTempEndDate","selectedPreset","setSelectedPreset","useEffect","fillEmptyDays","container","document","querySelector","querySelectorAll","forEach","el","textContent","trim","match","ariaLabel","getAttribute","frame","requestAnimationFrame","observer","MutationObserver","observe","childList","subtree","cancelAnimationFrame","disconnect","handleCancel","displayValue","formatDisplayValue","displayFormat","Array","isArray","startStr","format","endStr","valueExists","onClick","e","preventDefault","data-qa","cn","onKeyDown","key","createElement","LabelText","ReactDatePicker","fixedHeight","placeholderText","showPopperArrow","selectsRange","dates","start","end","monthsShown","shouldCloseOnSelect","open","onInputClick","onClickOutside","enableTabLoop","value","renderCustomHeader","monthDate","decreaseMonth","increaseMonth","prevMonthButtonDisabled","nextMonthButtonDisabled","div","button","type","ArrowLeftIcon","undefined","ArrowRightIcon","length","Select","options","map","p","placeholder","newValue","option","preset","find","range","Spinner","CalendarIcon","aria-label","InputMeta","displayName"],"mappings":"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"}
|