@webiny/admin-ui 0.0.0-unstable.a4f3e4ea8b → 0.0.0-unstable.a85ef555b2
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/AutoComplete/primitives/AutoCompletePrimitive.d.ts +6 -0
- package/AutoComplete/primitives/AutoCompletePrimitive.js +1 -0
- package/AutoComplete/primitives/AutoCompletePrimitive.js.map +1 -1
- package/Breadcrumbs/Breadcrumbs.d.ts +54 -0
- package/Breadcrumbs/Breadcrumbs.js +66 -0
- package/Breadcrumbs/Breadcrumbs.js.map +1 -0
- package/Breadcrumbs/Breadcrumbs.stories.d.ts +9 -0
- package/Breadcrumbs/Breadcrumbs.stories.js +71 -0
- package/Breadcrumbs/Breadcrumbs.stories.js.map +1 -0
- package/Breadcrumbs/index.d.ts +1 -0
- package/Breadcrumbs/index.js +1 -0
- package/Button/Button.d.ts +1 -1
- package/Button/Button.js +14 -0
- package/Button/Button.js.map +1 -1
- package/Button/Button.mdx +13 -0
- package/Button/Button.stories.d.ts +1 -0
- package/Button/Button.stories.js +10 -2
- package/Button/Button.stories.js.map +1 -1
- package/Button/Button.test.d.ts +1 -0
- package/Button/Button.test.js +28 -0
- package/Button/Button.test.js.map +1 -0
- package/Checkbox/primitives/presenters/CheckboxPresenter.js +5 -2
- package/Checkbox/primitives/presenters/CheckboxPresenter.js.map +1 -1
- package/Checkbox/primitives/presenters/CheckboxPresenter.jsxLabel.test.d.ts +1 -0
- package/Checkbox/primitives/presenters/CheckboxPresenter.jsxLabel.test.js +61 -0
- package/Checkbox/primitives/presenters/CheckboxPresenter.jsxLabel.test.js.map +1 -0
- package/CheckboxGroup/primitives/presenters/CheckboxGroupPresenter.js +5 -2
- package/CheckboxGroup/primitives/presenters/CheckboxGroupPresenter.js.map +1 -1
- package/CheckboxGroup/primitives/presenters/CheckboxGroupPresenter.jsxLabel.test.d.ts +1 -0
- package/CheckboxGroup/primitives/presenters/CheckboxGroupPresenter.jsxLabel.test.js +108 -0
- package/CheckboxGroup/primitives/presenters/CheckboxGroupPresenter.jsxLabel.test.js.map +1 -0
- package/Command/components/List.d.ts +1 -1
- package/Command/components/List.js +9 -5
- package/Command/components/List.js.map +1 -1
- package/DataTable/DataTable.d.ts +16 -6
- package/DataTable/DataTable.js +12 -4
- package/DataTable/DataTable.js.map +1 -1
- package/DataTable/components/ColumnsVisibility.d.ts +5 -4
- package/DataTable/components/ColumnsVisibility.js +6 -3
- package/DataTable/components/ColumnsVisibility.js.map +1 -1
- package/DatePicker/DatePicker.stories.d.ts +10 -0
- package/DatePicker/DatePicker.stories.js +44 -1
- package/DatePicker/DatePicker.stories.js.map +1 -1
- package/DatePicker/primitives/BirthdayPicker.d.ts +13 -0
- package/DatePicker/primitives/BirthdayPicker.js +355 -0
- package/DatePicker/primitives/BirthdayPicker.js.map +1 -0
- package/DatePicker/primitives/BirthdayPickerCell.d.ts +14 -0
- package/DatePicker/primitives/BirthdayPickerCell.js +19 -0
- package/DatePicker/primitives/BirthdayPickerCell.js.map +1 -0
- package/DatePicker/primitives/BirthdayPickerSegments.d.ts +9 -0
- package/DatePicker/primitives/BirthdayPickerSegments.js +43 -0
- package/DatePicker/primitives/BirthdayPickerSegments.js.map +1 -0
- package/DatePicker/primitives/DateOnlyPicker.d.ts +1 -1
- package/DatePicker/primitives/DateOnlyPicker.js +12 -4
- package/DatePicker/primitives/DateOnlyPicker.js.map +1 -1
- package/DatePicker/primitives/DatePickerPrimitive.js +3 -0
- package/DatePicker/primitives/DatePickerPrimitive.js.map +1 -1
- package/DatePicker/primitives/DateRangePicker.js +3 -3
- package/DatePicker/primitives/DateRangePicker.js.map +1 -1
- package/DatePicker/primitives/DateTimePicker.js +8 -7
- package/DatePicker/primitives/DateTimePicker.js.map +1 -1
- package/DatePicker/primitives/MultipleDatesPicker.js +3 -3
- package/DatePicker/primitives/MultipleDatesPicker.js.map +1 -1
- package/DatePicker/utils/birthdayHelpers.d.ts +77 -0
- package/DatePicker/utils/birthdayHelpers.js +145 -0
- package/DatePicker/utils/birthdayHelpers.js.map +1 -0
- package/DatePicker/utils/birthdayHelpers.test.d.ts +1 -0
- package/DatePicker/utils/birthdayHelpers.test.js +394 -0
- package/DatePicker/utils/birthdayHelpers.test.js.map +1 -0
- package/DatePicker/utils/dateHelpers.d.ts +5 -0
- package/DatePicker/utils/dateHelpers.js +11 -4
- package/DatePicker/utils/dateHelpers.js.map +1 -1
- package/DatePicker/utils/dateHelpers.test.d.ts +1 -0
- package/DatePicker/utils/dateHelpers.test.js +119 -0
- package/DatePicker/utils/dateHelpers.test.js.map +1 -0
- package/DatePicker/utils/index.d.ts +1 -0
- package/DatePicker/utils/index.js +1 -0
- package/DatePicker/utils/types.d.ts +13 -2
- package/Drawer/Drawer.d.ts +10 -6
- package/Drawer/Drawer.js +2 -1
- package/Drawer/Drawer.js.map +1 -1
- package/Drawer/Drawer.stories.d.ts +1 -0
- package/Drawer/Drawer.stories.js +20 -2
- package/Drawer/Drawer.stories.js.map +1 -1
- package/Drawer/components/DrawerHeader.d.ts +2 -2
- package/Drawer/components/DrawerHeader.js +11 -8
- package/Drawer/components/DrawerHeader.js.map +1 -1
- package/Drawer/components/Icon.d.ts +1 -1
- package/Drawer/components/Icon.js +3 -4
- package/Drawer/components/Icon.js.map +1 -1
- package/FilePicker/FilePicker.stories.d.ts +6 -0
- package/FilePicker/FilePicker.stories.js +24 -1
- package/FilePicker/FilePicker.stories.js.map +1 -1
- package/FilePicker/primitives/components/previews/ItemDescription.js +1 -1
- package/FilePicker/primitives/components/previews/ItemDescription.js.map +1 -1
- package/IconPicker/primitives/IconPickerPrimitive.js +1 -2
- package/IconPicker/primitives/IconPickerPrimitive.js.map +1 -1
- package/ImageEditor/types.js +1 -1
- package/ImageEditor/types.js.map +1 -1
- package/Markdown/Markdown.d.ts +47 -0
- package/Markdown/Markdown.js +17 -0
- package/Markdown/Markdown.js.map +1 -0
- package/Markdown/index.d.ts +1 -0
- package/Markdown/index.js +1 -0
- package/MultiAutoComplete/primitives/MultiAutoCompletePrimitive.d.ts +6 -0
- package/MultiAutoComplete/primitives/MultiAutoCompletePrimitive.js +1 -0
- package/MultiAutoComplete/primitives/MultiAutoCompletePrimitive.js.map +1 -1
- package/MultiSelect/primitives/MultiSelectPrimitive.js +12 -5
- package/MultiSelect/primitives/MultiSelectPrimitive.js.map +1 -1
- package/Popover/Popover.stories.d.ts +7 -0
- package/Popover/Popover.stories.js +24 -1
- package/Popover/Popover.stories.js.map +1 -1
- package/Popover/primitives/components/PopoverContent.js +6 -1
- package/Popover/primitives/components/PopoverContent.js.map +1 -1
- package/RadioGroup/primitives/RadioGroupPrimitive.d.ts +1 -1
- package/RadioGroup/primitives/RadioGroupPrimitive.js +4 -2
- package/RadioGroup/primitives/RadioGroupPrimitive.js.map +1 -1
- package/RadioGroup/primitives/presenters/RadioGroupPresenter.js +4 -2
- package/RadioGroup/primitives/presenters/RadioGroupPresenter.js.map +1 -1
- package/RadioGroup/primitives/presenters/RadioGroupPresenter.jsxLabel.test.d.ts +1 -0
- package/RadioGroup/primitives/presenters/RadioGroupPresenter.jsxLabel.test.js +88 -0
- package/RadioGroup/primitives/presenters/RadioGroupPresenter.jsxLabel.test.js.map +1 -0
- package/ScrollArea/ScrollArea.d.ts +16 -2
- package/ScrollArea/ScrollArea.js +19 -5
- package/ScrollArea/ScrollArea.js.map +1 -1
- package/Select/primitives/components/SelectContent.js +4 -6
- package/Select/primitives/components/SelectContent.js.map +1 -1
- package/Switch/Switch.d.ts +4 -4
- package/Switch/Switch.js +21 -7
- package/Switch/Switch.js.map +1 -1
- package/Switch/domains/SwitchItemDto.d.ts +1 -1
- package/Switch/primitives/SwitchPrimitive.js +4 -3
- package/Switch/primitives/SwitchPrimitive.js.map +1 -1
- package/Tabs/Tabs.d.ts +7 -2
- package/Tabs/Tabs.js +29 -11
- package/Tabs/Tabs.js.map +1 -1
- package/Tabs/Tabs.mdx +27 -0
- package/Tabs/Tabs.stories.d.ts +1 -0
- package/Tabs/Tabs.stories.js +19 -1
- package/Tabs/Tabs.stories.js.map +1 -1
- package/Toast/useToast.stories.js.map +1 -1
- package/ToggleGroup/primitives/ToggleGroupPrimitive.js +1 -1
- package/ToggleGroup/primitives/ToggleGroupPrimitive.js.map +1 -1
- package/hooks/index.d.ts +1 -0
- package/hooks/index.js +1 -0
- package/hooks/useEscapeScrollLock.d.ts +13 -0
- package/hooks/useEscapeScrollLock.js +21 -0
- package/hooks/useEscapeScrollLock.js.map +1 -0
- package/index.d.ts +2 -0
- package/index.js +2 -0
- package/package.json +22 -22
- package/theme.css +38 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DatePicker/utils/birthdayHelpers.js","sources":["../../../src/DatePicker/utils/birthdayHelpers.ts"],"sourcesContent":["/**\n * Logic for the step-by-step birthday picker: the date is picked as day, then month, then year.\n * Months are 1-based throughout (1 = January).\n */\n\nexport interface BirthdayParts {\n day?: number;\n month?: number;\n year?: number;\n}\n\nexport type BirthdayStep = \"day\" | \"month\" | \"year\";\n\nexport const DEFAULT_BIRTHDAY_YEARS_BACK = 120;\n\n/** The first and last date the picker may produce. Either may be left open. */\nexport interface BirthdayLimits {\n minDate?: Date;\n maxDate?: Date;\n}\n\n/** The dates the picker may produce: one of the offered years, within the limits. */\nexport interface BirthdayRange extends BirthdayLimits {\n years: number[];\n}\n\nconst ALL_MONTHS = Array.from({ length: 12 }, (_, index) => index + 1);\n\n/**\n * Reads the day, month and year from a `YYYY-MM-DD` value. A value that carries a time\n * (`2026-05-01T00:00:00.000Z`) still yields its date part. Anything else yields no parts.\n */\nexport function parseBirthdayValue(value: string | undefined | null): BirthdayParts {\n if (!value) {\n return {};\n }\n const match = String(value).match(/^(\\d{4})-(\\d{2})-(\\d{2})/);\n if (!match) {\n return {};\n }\n const year = Number(match[1]);\n const month = Number(match[2]);\n const day = Number(match[3]);\n if (month < 1 || month > 12 || day < 1 || day > daysInMonth(month, year)) {\n return {};\n }\n return { day, month, year };\n}\n\n/**\n * Returns the `YYYY-MM-DD` value, or `undefined` while any part is still missing.\n */\nexport function formatBirthdayValue(parts: BirthdayParts): string | undefined {\n const { day, month, year } = parts;\n if (day === undefined || month === undefined || year === undefined) {\n return undefined;\n }\n return `${String(year).padStart(4, \"0\")}-${pad(month)}-${pad(day)}`;\n}\n\nexport function pad(value: number): string {\n return String(value).padStart(2, \"0\");\n}\n\nexport function isLeapYear(year: number): boolean {\n return (year % 4 === 0 && year % 100 !== 0) || year % 400 === 0;\n}\n\n/**\n * Days in a month. Without a year, February counts 29 days, because the year is picked\n * after the month and a leap year may still be chosen.\n */\nexport function daysInMonth(month: number, year?: number): number {\n if (month === 2) {\n return year === undefined || isLeapYear(year) ? 29 : 28;\n }\n return [4, 6, 9, 11].includes(month) ? 30 : 31;\n}\n\nfunction dateKey(year: number, month: number, day: number): number {\n return year * 10000 + month * 100 + day;\n}\n\n/** The calendar day of a limit, in local time, the same day the calendar picker compares. */\nfunction limitKey(date: Date | undefined, open: number): number {\n if (!date || isNaN(date.getTime())) {\n return open;\n }\n return dateKey(date.getFullYear(), date.getMonth() + 1, date.getDate());\n}\n\nfunction limitYear(date: Date | undefined): number | undefined {\n return date && !isNaN(date.getTime()) ? date.getFullYear() : undefined;\n}\n\n/**\n * Whether the range holds a date with every part set in `parts`. An unset year is looked\n * for among the offered years; an unset month or day can be any.\n */\nexport function isInBirthdayRange(parts: BirthdayParts, range: BirthdayRange): boolean {\n const min = limitKey(range.minDate, -Infinity);\n const max = limitKey(range.maxDate, Infinity);\n const years = parts.year !== undefined ? [parts.year] : range.years;\n const months = parts.month !== undefined ? [parts.month] : ALL_MONTHS;\n for (const year of years) {\n if (dateKey(year, 12, 31) < min || dateKey(year, 1, 1) > max) {\n continue;\n }\n for (const month of months) {\n const last = daysInMonth(month, year);\n const first = parts.day ?? 1;\n const final = parts.day ?? last;\n if (final > last) {\n continue;\n }\n if (dateKey(year, month, final) >= min && dateKey(year, month, first) <= max) {\n return true;\n }\n }\n }\n return false;\n}\n\n/** A day is unavailable when no date in the range falls on it. */\nexport function isDayDisabled(day: number, range?: BirthdayRange): boolean {\n return range !== undefined && !isInBirthdayRange({ day }, range);\n}\n\n/**\n * A month is unavailable when it can't hold the chosen day (31 rules out the 30-day months\n * and February), or when no date in the range has the chosen day in that month.\n */\nexport function isMonthDisabled(\n month: number,\n parts: BirthdayParts,\n range?: BirthdayRange\n): boolean {\n if (parts.day !== undefined && parts.day > daysInMonth(month)) {\n return true;\n }\n return range !== undefined && !isInBirthdayRange({ day: parts.day, month }, range);\n}\n\n/**\n * A year is unavailable when it can't hold the chosen day and month (29 February in a\n * non-leap year), or when the date it makes falls outside the range.\n */\nexport function isYearDisabled(year: number, parts: BirthdayParts, range?: BirthdayRange): boolean {\n if (\n parts.day !== undefined &&\n parts.month !== undefined &&\n parts.day > daysInMonth(parts.month, year)\n ) {\n return true;\n }\n return (\n range !== undefined &&\n !isInBirthdayRange({ day: parts.day, month: parts.month, year }, range)\n );\n}\n\n/**\n * Picking a day clears whatever comes after it that can no longer hold it: the month when\n * the month is too short or the range has no such date, otherwise the year when only the\n * year is the problem (29 February, or a date past a limit).\n */\nexport function pickDay(parts: BirthdayParts, day: number, range?: BirthdayRange): BirthdayParts {\n const next: BirthdayParts = { ...parts, day };\n if (next.month !== undefined && isMonthDisabled(next.month, next, range)) {\n next.month = undefined;\n }\n if (next.year !== undefined && isYearDisabled(next.year, next, range)) {\n next.year = undefined;\n }\n return next;\n}\n\n/**\n * Picking a month keeps the day (only months that hold it can be picked) and clears the\n * year when that year can't hold the date.\n */\nexport function pickMonth(\n parts: BirthdayParts,\n month: number,\n range?: BirthdayRange\n): BirthdayParts {\n const next: BirthdayParts = { ...parts, month };\n if (next.year !== undefined && isYearDisabled(next.year, next, range)) {\n next.year = undefined;\n }\n return next;\n}\n\nexport function pickYear(parts: BirthdayParts, year: number): BirthdayParts {\n return { ...parts, year };\n}\n\nconst BIRTHDAY_STEPS: BirthdayStep[] = [\"day\", \"month\", \"year\"];\n\n/**\n * The step to show after a pick, or `undefined` when the picker should close. A missing part\n * comes first. Once the date is complete, the picker walks on to the steps after `current`\n * that weren't picked while it was open, so editing a saved date still goes day, month, year.\n */\nexport function nextBirthdayStep(\n parts: BirthdayParts,\n current: BirthdayStep,\n picked: ReadonlySet<BirthdayStep>\n): BirthdayStep | undefined {\n const missing = BIRTHDAY_STEPS.find(step => parts[step] === undefined);\n if (missing) {\n return missing;\n }\n return BIRTHDAY_STEPS.slice(BIRTHDAY_STEPS.indexOf(current) + 1).find(\n step => !picked.has(step)\n );\n}\n\n/**\n * The years to offer, newest first. The default runs from this year back\n * `DEFAULT_BIRTHDAY_YEARS_BACK` years, moved and cut to fit the limits. A year already set\n * outside the range is added, so an existing value is never hidden.\n */\nexport function birthdayYears(\n yearRange?: [number, number],\n includeYear?: number,\n limits?: BirthdayLimits\n): number[] {\n const [from, to] = yearRange ?? defaultBirthdayYearRange(limits);\n let start = Math.min(from, to);\n let end = Math.max(from, to);\n if (includeYear !== undefined) {\n start = Math.min(start, includeYear);\n end = Math.max(end, includeYear);\n }\n const years: number[] = [];\n for (let year = end; year >= start; year--) {\n years.push(year);\n }\n return years;\n}\n\n/**\n * From the latest allowed year down to the earliest. Without an upper limit the list starts at\n * this year (or the lower limit's year, if that's later); without a lower limit it ends\n * `DEFAULT_BIRTHDAY_YEARS_BACK` years before its start.\n */\nfunction defaultBirthdayYearRange(limits?: BirthdayLimits): [number, number] {\n const minYear = limitYear(limits?.minDate);\n const maxYear = limitYear(limits?.maxDate);\n const to = maxYear ?? Math.max(new Date().getFullYear(), minYear ?? -Infinity);\n const from = minYear ?? to - DEFAULT_BIRTHDAY_YEARS_BACK;\n return [from, to];\n}\n"],"names":["DEFAULT_BIRTHDAY_YEARS_BACK","ALL_MONTHS","Array","_","index","parseBirthdayValue","value","match","String","year","Number","month","day","daysInMonth","formatBirthdayValue","parts","undefined","pad","isLeapYear","dateKey","limitKey","date","open","isNaN","limitYear","isInBirthdayRange","range","min","max","Infinity","years","months","last","first","final","isDayDisabled","isMonthDisabled","isYearDisabled","pickDay","next","pickMonth","pickYear","BIRTHDAY_STEPS","nextBirthdayStep","current","picked","missing","step","birthdayYears","yearRange","includeYear","limits","from","to","defaultBirthdayYearRange","start","Math","end","minYear","maxYear","Date"],"mappings":"AAaO,MAAMA,8BAA8B;AAa3C,MAAMC,aAAaC,MAAM,IAAI,CAAC;IAAE,QAAQ;AAAG,GAAG,CAACC,GAAGC,QAAUA,QAAQ;AAM7D,SAASC,mBAAmBC,KAAgC;IAC/D,IAAI,CAACA,OACD,OAAO,CAAC;IAEZ,MAAMC,QAAQC,OAAOF,OAAO,KAAK,CAAC;IAClC,IAAI,CAACC,OACD,OAAO,CAAC;IAEZ,MAAME,OAAOC,OAAOH,KAAK,CAAC,EAAE;IAC5B,MAAMI,QAAQD,OAAOH,KAAK,CAAC,EAAE;IAC7B,MAAMK,MAAMF,OAAOH,KAAK,CAAC,EAAE;IAC3B,IAAII,QAAQ,KAAKA,QAAQ,MAAMC,MAAM,KAAKA,MAAMC,YAAYF,OAAOF,OAC/D,OAAO,CAAC;IAEZ,OAAO;QAAEG;QAAKD;QAAOF;IAAK;AAC9B;AAKO,SAASK,oBAAoBC,KAAoB;IACpD,MAAM,EAAEH,GAAG,EAAED,KAAK,EAAEF,IAAI,EAAE,GAAGM;IAC7B,IAAIH,AAAQI,WAARJ,OAAqBD,AAAUK,WAAVL,SAAuBF,AAASO,WAATP,MAC5C;IAEJ,OAAO,GAAGD,OAAOC,MAAM,QAAQ,CAAC,GAAG,KAAK,CAAC,EAAEQ,IAAIN,OAAO,CAAC,EAAEM,IAAIL,MAAM;AACvE;AAEO,SAASK,IAAIX,KAAa;IAC7B,OAAOE,OAAOF,OAAO,QAAQ,CAAC,GAAG;AACrC;AAEO,SAASY,WAAWT,IAAY;IACnC,OAAQA,OAAO,MAAM,KAAKA,OAAO,QAAQ,KAAMA,OAAO,QAAQ;AAClE;AAMO,SAASI,YAAYF,KAAa,EAAEF,IAAa;IACpD,IAAIE,AAAU,MAAVA,OACA,OAAOF,AAASO,WAATP,QAAsBS,WAAWT,QAAQ,KAAK;IAEzD,OAAO;QAAC;QAAG;QAAG;QAAG;KAAG,CAAC,QAAQ,CAACE,SAAS,KAAK;AAChD;AAEA,SAASQ,QAAQV,IAAY,EAAEE,KAAa,EAAEC,GAAW;IACrD,OAAOH,AAAO,QAAPA,OAAeE,AAAQ,MAARA,QAAcC;AACxC;AAGA,SAASQ,SAASC,IAAsB,EAAEC,IAAY;IAClD,IAAI,CAACD,QAAQE,MAAMF,KAAK,OAAO,KAC3B,OAAOC;IAEX,OAAOH,QAAQE,KAAK,WAAW,IAAIA,KAAK,QAAQ,KAAK,GAAGA,KAAK,OAAO;AACxE;AAEA,SAASG,UAAUH,IAAsB;IACrC,OAAOA,QAAQ,CAACE,MAAMF,KAAK,OAAO,MAAMA,KAAK,WAAW,KAAKL;AACjE;AAMO,SAASS,kBAAkBV,KAAoB,EAAEW,KAAoB;IACxE,MAAMC,MAAMP,SAASM,MAAM,OAAO,EAAE,MAAS;IAC7C,MAAME,MAAMR,SAASM,MAAM,OAAO,EAAEG,KAAQ;IAC5C,MAAMC,QAAQf,AAAeC,WAAfD,MAAM,IAAI,GAAiB;QAACA,MAAM,IAAI;KAAC,GAAGW,MAAM,KAAK;IACnE,MAAMK,SAAShB,AAAgBC,WAAhBD,MAAM,KAAK,GAAiB;QAACA,MAAM,KAAK;KAAC,GAAGd;IAC3D,KAAK,MAAMQ,QAAQqB,MACf,KAAIX,CAAAA,QAAQV,MAAM,IAAI,MAAMkB,OAAOR,QAAQV,MAAM,GAAG,KAAKmB,GAAE,GAG3D,KAAK,MAAMjB,SAASoB,OAAQ;QACxB,MAAMC,OAAOnB,YAAYF,OAAOF;QAChC,MAAMwB,QAAQlB,MAAM,GAAG,IAAI;QAC3B,MAAMmB,QAAQnB,MAAM,GAAG,IAAIiB;QAC3B,KAAIE,CAAAA,QAAQF,IAAG,GAGf;YAAA,IAAIb,QAAQV,MAAME,OAAOuB,UAAUP,OAAOR,QAAQV,MAAME,OAAOsB,UAAUL,KACrE,OAAO;QACX;IACJ;IAEJ,OAAO;AACX;AAGO,SAASO,cAAcvB,GAAW,EAAEc,KAAqB;IAC5D,OAAOA,AAAUV,WAAVU,SAAuB,CAACD,kBAAkB;QAAEb;IAAI,GAAGc;AAC9D;AAMO,SAASU,gBACZzB,KAAa,EACbI,KAAoB,EACpBW,KAAqB;IAErB,IAAIX,AAAcC,WAAdD,MAAM,GAAG,IAAkBA,MAAM,GAAG,GAAGF,YAAYF,QACnD,OAAO;IAEX,OAAOe,AAAUV,WAAVU,SAAuB,CAACD,kBAAkB;QAAE,KAAKV,MAAM,GAAG;QAAEJ;IAAM,GAAGe;AAChF;AAMO,SAASW,eAAe5B,IAAY,EAAEM,KAAoB,EAAEW,KAAqB;IACpF,IACIX,AAAcC,WAAdD,MAAM,GAAG,IACTA,AAAgBC,WAAhBD,MAAM,KAAK,IACXA,MAAM,GAAG,GAAGF,YAAYE,MAAM,KAAK,EAAEN,OAErC,OAAO;IAEX,OACIiB,AAAUV,WAAVU,SACA,CAACD,kBAAkB;QAAE,KAAKV,MAAM,GAAG;QAAE,OAAOA,MAAM,KAAK;QAAEN;IAAK,GAAGiB;AAEzE;AAOO,SAASY,QAAQvB,KAAoB,EAAEH,GAAW,EAAEc,KAAqB;IAC5E,MAAMa,OAAsB;QAAE,GAAGxB,KAAK;QAAEH;IAAI;IAC5C,IAAI2B,AAAevB,WAAfuB,KAAK,KAAK,IAAkBH,gBAAgBG,KAAK,KAAK,EAAEA,MAAMb,QAC9Da,KAAK,KAAK,GAAGvB;IAEjB,IAAIuB,AAAcvB,WAAduB,KAAK,IAAI,IAAkBF,eAAeE,KAAK,IAAI,EAAEA,MAAMb,QAC3Da,KAAK,IAAI,GAAGvB;IAEhB,OAAOuB;AACX;AAMO,SAASC,UACZzB,KAAoB,EACpBJ,KAAa,EACbe,KAAqB;IAErB,MAAMa,OAAsB;QAAE,GAAGxB,KAAK;QAAEJ;IAAM;IAC9C,IAAI4B,AAAcvB,WAAduB,KAAK,IAAI,IAAkBF,eAAeE,KAAK,IAAI,EAAEA,MAAMb,QAC3Da,KAAK,IAAI,GAAGvB;IAEhB,OAAOuB;AACX;AAEO,SAASE,SAAS1B,KAAoB,EAAEN,IAAY;IACvD,OAAO;QAAE,GAAGM,KAAK;QAAEN;IAAK;AAC5B;AAEA,MAAMiC,iBAAiC;IAAC;IAAO;IAAS;CAAO;AAOxD,SAASC,iBACZ5B,KAAoB,EACpB6B,OAAqB,EACrBC,MAAiC;IAEjC,MAAMC,UAAUJ,eAAe,IAAI,CAACK,CAAAA,OAAQhC,AAAgBC,WAAhBD,KAAK,CAACgC,KAAK;IACvD,IAAID,SACA,OAAOA;IAEX,OAAOJ,eAAe,KAAK,CAACA,eAAe,OAAO,CAACE,WAAW,GAAG,IAAI,CACjEG,CAAAA,OAAQ,CAACF,OAAO,GAAG,CAACE;AAE5B;AAOO,SAASC,cACZC,SAA4B,EAC5BC,WAAoB,EACpBC,MAAuB;IAEvB,MAAM,CAACC,MAAMC,GAAG,GAAGJ,aAAaK,yBAAyBH;IACzD,IAAII,QAAQC,KAAK,GAAG,CAACJ,MAAMC;IAC3B,IAAII,MAAMD,KAAK,GAAG,CAACJ,MAAMC;IACzB,IAAIH,AAAgBlC,WAAhBkC,aAA2B;QAC3BK,QAAQC,KAAK,GAAG,CAACD,OAAOL;QACxBO,MAAMD,KAAK,GAAG,CAACC,KAAKP;IACxB;IACA,MAAMpB,QAAkB,EAAE;IAC1B,IAAK,IAAIrB,OAAOgD,KAAKhD,QAAQ8C,OAAO9C,OAChCqB,MAAM,IAAI,CAACrB;IAEf,OAAOqB;AACX;AAOA,SAASwB,yBAAyBH,MAAuB;IACrD,MAAMO,UAAUlC,UAAU2B,QAAQ;IAClC,MAAMQ,UAAUnC,UAAU2B,QAAQ;IAClC,MAAME,KAAKM,WAAWH,KAAK,GAAG,CAAC,IAAII,OAAO,WAAW,IAAIF,WAAW,MAAS;IAC7E,MAAMN,OAAOM,WAAWL,KAAKrD;IAC7B,OAAO;QAACoD;QAAMC;KAAG;AACrB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,394 @@
|
|
|
1
|
+
import { describe, expect, it } from "vitest";
|
|
2
|
+
import { birthdayYears, daysInMonth, formatBirthdayValue, isDayDisabled, isMonthDisabled, isYearDisabled, nextBirthdayStep, parseBirthdayValue, pickDay, pickMonth, pickYear } from "./birthdayHelpers.js";
|
|
3
|
+
describe("birthdayHelpers", ()=>{
|
|
4
|
+
it("should read the parts of a date-only value", ()=>{
|
|
5
|
+
expect(parseBirthdayValue("1990-02-09")).toEqual({
|
|
6
|
+
day: 9,
|
|
7
|
+
month: 2,
|
|
8
|
+
year: 1990
|
|
9
|
+
});
|
|
10
|
+
});
|
|
11
|
+
it("should read the date part of a value that carries a time", ()=>{
|
|
12
|
+
expect(parseBirthdayValue("1990-02-09T00:00:00.000Z")).toEqual({
|
|
13
|
+
day: 9,
|
|
14
|
+
month: 2,
|
|
15
|
+
year: 1990
|
|
16
|
+
});
|
|
17
|
+
});
|
|
18
|
+
it("should read no parts from an empty or impossible value", ()=>{
|
|
19
|
+
expect(parseBirthdayValue(void 0)).toEqual({});
|
|
20
|
+
expect(parseBirthdayValue("")).toEqual({});
|
|
21
|
+
expect(parseBirthdayValue("not a date")).toEqual({});
|
|
22
|
+
expect(parseBirthdayValue("1990-02-30")).toEqual({});
|
|
23
|
+
});
|
|
24
|
+
it("should write a value only once every part is set", ()=>{
|
|
25
|
+
expect(formatBirthdayValue({
|
|
26
|
+
day: 9,
|
|
27
|
+
month: 2,
|
|
28
|
+
year: 1990
|
|
29
|
+
})).toBe("1990-02-09");
|
|
30
|
+
expect(formatBirthdayValue({
|
|
31
|
+
day: 9,
|
|
32
|
+
month: 2
|
|
33
|
+
})).toBeUndefined();
|
|
34
|
+
});
|
|
35
|
+
it("should give February 29 days until a non-leap year is known", ()=>{
|
|
36
|
+
expect(daysInMonth(2)).toBe(29);
|
|
37
|
+
expect(daysInMonth(2, 2000)).toBe(29);
|
|
38
|
+
expect(daysInMonth(2, 1900)).toBe(28);
|
|
39
|
+
expect(daysInMonth(2, 1990)).toBe(28);
|
|
40
|
+
});
|
|
41
|
+
it("should dim the months that can't hold the 31st", ()=>{
|
|
42
|
+
const dimmed = Array.from({
|
|
43
|
+
length: 12
|
|
44
|
+
}, (_, i)=>i + 1).filter((month)=>isMonthDisabled(month, {
|
|
45
|
+
day: 31
|
|
46
|
+
}));
|
|
47
|
+
expect(dimmed).toEqual([
|
|
48
|
+
2,
|
|
49
|
+
4,
|
|
50
|
+
6,
|
|
51
|
+
9,
|
|
52
|
+
11
|
|
53
|
+
]);
|
|
54
|
+
});
|
|
55
|
+
it("should dim no month before a day is picked", ()=>{
|
|
56
|
+
expect(isMonthDisabled(2, {})).toBe(false);
|
|
57
|
+
});
|
|
58
|
+
it("should clear a month that can't hold the newly picked day and keep the year", ()=>{
|
|
59
|
+
expect(pickDay({
|
|
60
|
+
day: 9,
|
|
61
|
+
month: 2,
|
|
62
|
+
year: 1990
|
|
63
|
+
}, 31)).toEqual({
|
|
64
|
+
day: 31,
|
|
65
|
+
month: void 0,
|
|
66
|
+
year: 1990
|
|
67
|
+
});
|
|
68
|
+
});
|
|
69
|
+
it("should keep a month that holds the newly picked day", ()=>{
|
|
70
|
+
expect(pickDay({
|
|
71
|
+
day: 9,
|
|
72
|
+
month: 8,
|
|
73
|
+
year: 1990
|
|
74
|
+
}, 31)).toEqual({
|
|
75
|
+
day: 31,
|
|
76
|
+
month: 8,
|
|
77
|
+
year: 1990
|
|
78
|
+
});
|
|
79
|
+
});
|
|
80
|
+
it("should clear a non-leap year when 29 February is picked", ()=>{
|
|
81
|
+
expect(pickDay({
|
|
82
|
+
day: 9,
|
|
83
|
+
month: 2,
|
|
84
|
+
year: 1990
|
|
85
|
+
}, 29)).toEqual({
|
|
86
|
+
day: 29,
|
|
87
|
+
month: 2,
|
|
88
|
+
year: void 0
|
|
89
|
+
});
|
|
90
|
+
expect(pickMonth({
|
|
91
|
+
day: 29,
|
|
92
|
+
month: 1,
|
|
93
|
+
year: 1990
|
|
94
|
+
}, 2)).toEqual({
|
|
95
|
+
day: 29,
|
|
96
|
+
month: 2,
|
|
97
|
+
year: void 0
|
|
98
|
+
});
|
|
99
|
+
expect(pickMonth({
|
|
100
|
+
day: 29,
|
|
101
|
+
month: 1,
|
|
102
|
+
year: 1992
|
|
103
|
+
}, 2)).toEqual({
|
|
104
|
+
day: 29,
|
|
105
|
+
month: 2,
|
|
106
|
+
year: 1992
|
|
107
|
+
});
|
|
108
|
+
});
|
|
109
|
+
it("should dim non-leap years for 29 February only", ()=>{
|
|
110
|
+
expect(isYearDisabled(1990, {
|
|
111
|
+
day: 29,
|
|
112
|
+
month: 2
|
|
113
|
+
})).toBe(true);
|
|
114
|
+
expect(isYearDisabled(1992, {
|
|
115
|
+
day: 29,
|
|
116
|
+
month: 2
|
|
117
|
+
})).toBe(false);
|
|
118
|
+
expect(isYearDisabled(1990, {
|
|
119
|
+
day: 28,
|
|
120
|
+
month: 2
|
|
121
|
+
})).toBe(false);
|
|
122
|
+
expect(isYearDisabled(1990, {
|
|
123
|
+
day: 29
|
|
124
|
+
})).toBe(false);
|
|
125
|
+
});
|
|
126
|
+
it("should set the year", ()=>{
|
|
127
|
+
expect(pickYear({
|
|
128
|
+
day: 31,
|
|
129
|
+
month: 8
|
|
130
|
+
}, 1990)).toEqual({
|
|
131
|
+
day: 31,
|
|
132
|
+
month: 8,
|
|
133
|
+
year: 1990
|
|
134
|
+
});
|
|
135
|
+
});
|
|
136
|
+
it("should list years newest first", ()=>{
|
|
137
|
+
expect(birthdayYears([
|
|
138
|
+
1985,
|
|
139
|
+
1990
|
|
140
|
+
])).toEqual([
|
|
141
|
+
1990,
|
|
142
|
+
1989,
|
|
143
|
+
1988,
|
|
144
|
+
1987,
|
|
145
|
+
1986,
|
|
146
|
+
1985
|
|
147
|
+
]);
|
|
148
|
+
expect(birthdayYears([
|
|
149
|
+
1990,
|
|
150
|
+
1985
|
|
151
|
+
])).toEqual([
|
|
152
|
+
1990,
|
|
153
|
+
1989,
|
|
154
|
+
1988,
|
|
155
|
+
1987,
|
|
156
|
+
1986,
|
|
157
|
+
1985
|
|
158
|
+
]);
|
|
159
|
+
});
|
|
160
|
+
it("should default to this year back 120 years", ()=>{
|
|
161
|
+
const currentYear = new Date().getFullYear();
|
|
162
|
+
const years = birthdayYears();
|
|
163
|
+
expect(years[0]).toBe(currentYear);
|
|
164
|
+
expect(years[years.length - 1]).toBe(currentYear - 120);
|
|
165
|
+
});
|
|
166
|
+
it("should include a set year that falls outside the range", ()=>{
|
|
167
|
+
expect(birthdayYears([
|
|
168
|
+
1985,
|
|
169
|
+
1987
|
|
170
|
+
], 1980)).toEqual([
|
|
171
|
+
1987,
|
|
172
|
+
1986,
|
|
173
|
+
1985,
|
|
174
|
+
1984,
|
|
175
|
+
1983,
|
|
176
|
+
1982,
|
|
177
|
+
1981,
|
|
178
|
+
1980
|
|
179
|
+
]);
|
|
180
|
+
});
|
|
181
|
+
describe("within minDate and maxDate", ()=>{
|
|
182
|
+
const range = {
|
|
183
|
+
years: birthdayYears([
|
|
184
|
+
2000,
|
|
185
|
+
2026
|
|
186
|
+
]),
|
|
187
|
+
minDate: new Date(2000, 2, 10),
|
|
188
|
+
maxDate: new Date(2026, 9, 15)
|
|
189
|
+
};
|
|
190
|
+
it("should dim the years outside the limits", ()=>{
|
|
191
|
+
const wide = {
|
|
192
|
+
...range,
|
|
193
|
+
years: birthdayYears([
|
|
194
|
+
1995,
|
|
195
|
+
2030
|
|
196
|
+
])
|
|
197
|
+
};
|
|
198
|
+
expect(isYearDisabled(1999, {}, wide)).toBe(true);
|
|
199
|
+
expect(isYearDisabled(2000, {}, wide)).toBe(false);
|
|
200
|
+
expect(isYearDisabled(2026, {}, wide)).toBe(false);
|
|
201
|
+
expect(isYearDisabled(2027, {}, wide)).toBe(true);
|
|
202
|
+
});
|
|
203
|
+
it("should dim the last year when the picked day and month fall after maxDate", ()=>{
|
|
204
|
+
expect(isYearDisabled(2026, {
|
|
205
|
+
day: 16,
|
|
206
|
+
month: 10
|
|
207
|
+
}, range)).toBe(true);
|
|
208
|
+
expect(isYearDisabled(2026, {
|
|
209
|
+
day: 15,
|
|
210
|
+
month: 10
|
|
211
|
+
}, range)).toBe(false);
|
|
212
|
+
expect(isYearDisabled(2026, {
|
|
213
|
+
day: 1,
|
|
214
|
+
month: 11
|
|
215
|
+
}, range)).toBe(true);
|
|
216
|
+
expect(isYearDisabled(2025, {
|
|
217
|
+
day: 1,
|
|
218
|
+
month: 11
|
|
219
|
+
}, range)).toBe(false);
|
|
220
|
+
});
|
|
221
|
+
it("should dim the first year when the picked day and month fall before minDate", ()=>{
|
|
222
|
+
expect(isYearDisabled(2000, {
|
|
223
|
+
day: 9,
|
|
224
|
+
month: 3
|
|
225
|
+
}, range)).toBe(true);
|
|
226
|
+
expect(isYearDisabled(2000, {
|
|
227
|
+
day: 10,
|
|
228
|
+
month: 3
|
|
229
|
+
}, range)).toBe(false);
|
|
230
|
+
});
|
|
231
|
+
it("should dim the months and days that no date in range has", ()=>{
|
|
232
|
+
const oneYear = {
|
|
233
|
+
...range,
|
|
234
|
+
years: [
|
|
235
|
+
2026
|
|
236
|
+
]
|
|
237
|
+
};
|
|
238
|
+
expect(isMonthDisabled(10, {}, oneYear)).toBe(false);
|
|
239
|
+
expect(isMonthDisabled(11, {}, oneYear)).toBe(true);
|
|
240
|
+
expect(isMonthDisabled(10, {
|
|
241
|
+
day: 16
|
|
242
|
+
}, oneYear)).toBe(true);
|
|
243
|
+
const oneMonth = {
|
|
244
|
+
years: [
|
|
245
|
+
2026
|
|
246
|
+
],
|
|
247
|
+
minDate: new Date(2026, 9, 1),
|
|
248
|
+
maxDate: new Date(2026, 9, 15)
|
|
249
|
+
};
|
|
250
|
+
expect(isDayDisabled(15, oneMonth)).toBe(false);
|
|
251
|
+
expect(isDayDisabled(16, oneMonth)).toBe(true);
|
|
252
|
+
expect(isDayDisabled(16, range)).toBe(false);
|
|
253
|
+
});
|
|
254
|
+
it("should keep 29 February when the range offers a leap year", ()=>{
|
|
255
|
+
expect(isMonthDisabled(2, {
|
|
256
|
+
day: 29
|
|
257
|
+
}, range)).toBe(false);
|
|
258
|
+
expect(isMonthDisabled(2, {
|
|
259
|
+
day: 29
|
|
260
|
+
}, {
|
|
261
|
+
...range,
|
|
262
|
+
years: [
|
|
263
|
+
2025
|
|
264
|
+
]
|
|
265
|
+
})).toBe(true);
|
|
266
|
+
});
|
|
267
|
+
it("should clear a year the newly picked part puts past a limit", ()=>{
|
|
268
|
+
expect(pickDay({
|
|
269
|
+
day: 1,
|
|
270
|
+
month: 10,
|
|
271
|
+
year: 2026
|
|
272
|
+
}, 20, range)).toEqual({
|
|
273
|
+
day: 20,
|
|
274
|
+
month: 10,
|
|
275
|
+
year: void 0
|
|
276
|
+
});
|
|
277
|
+
expect(pickMonth({
|
|
278
|
+
day: 1,
|
|
279
|
+
month: 10,
|
|
280
|
+
year: 2026
|
|
281
|
+
}, 12, range)).toEqual({
|
|
282
|
+
day: 1,
|
|
283
|
+
month: 12,
|
|
284
|
+
year: void 0
|
|
285
|
+
});
|
|
286
|
+
expect(pickDay({
|
|
287
|
+
day: 1,
|
|
288
|
+
month: 10,
|
|
289
|
+
year: 2026
|
|
290
|
+
}, 15, range)).toEqual({
|
|
291
|
+
day: 15,
|
|
292
|
+
month: 10,
|
|
293
|
+
year: 2026
|
|
294
|
+
});
|
|
295
|
+
});
|
|
296
|
+
it("should end the default years at maxDate and start them at minDate", ()=>{
|
|
297
|
+
const years = birthdayYears(void 0, void 0, {
|
|
298
|
+
maxDate: new Date(2000, 0, 1)
|
|
299
|
+
});
|
|
300
|
+
expect(years[0]).toBe(2000);
|
|
301
|
+
expect(years[years.length - 1]).toBe(1880);
|
|
302
|
+
expect(birthdayYears(void 0, void 0, {
|
|
303
|
+
minDate: new Date(1990, 0, 1),
|
|
304
|
+
maxDate: new Date(1995, 0, 1)
|
|
305
|
+
})).toEqual([
|
|
306
|
+
1995,
|
|
307
|
+
1994,
|
|
308
|
+
1993,
|
|
309
|
+
1992,
|
|
310
|
+
1991,
|
|
311
|
+
1990
|
|
312
|
+
]);
|
|
313
|
+
});
|
|
314
|
+
it("should start the default years at a maxDate in the future", ()=>{
|
|
315
|
+
const currentYear = new Date().getFullYear();
|
|
316
|
+
const years = birthdayYears(void 0, void 0, {
|
|
317
|
+
maxDate: new Date(currentYear + 2, 0, 1)
|
|
318
|
+
});
|
|
319
|
+
expect(years[0]).toBe(currentYear + 2);
|
|
320
|
+
expect(years[years.length - 1]).toBe(currentYear + 2 - 120);
|
|
321
|
+
});
|
|
322
|
+
it("should run the default years from this year down to an old minDate", ()=>{
|
|
323
|
+
const currentYear = new Date().getFullYear();
|
|
324
|
+
const years = birthdayYears(void 0, void 0, {
|
|
325
|
+
minDate: new Date(1850, 0, 1)
|
|
326
|
+
});
|
|
327
|
+
expect(years[0]).toBe(currentYear);
|
|
328
|
+
expect(years[years.length - 1]).toBe(1850);
|
|
329
|
+
});
|
|
330
|
+
it("should start the default years at a minDate in the future", ()=>{
|
|
331
|
+
const currentYear = new Date().getFullYear();
|
|
332
|
+
const years = birthdayYears(void 0, void 0, {
|
|
333
|
+
minDate: new Date(currentYear + 3, 0, 1)
|
|
334
|
+
});
|
|
335
|
+
expect(years).toEqual([
|
|
336
|
+
currentYear + 3
|
|
337
|
+
]);
|
|
338
|
+
});
|
|
339
|
+
it("should ignore an invalid limit", ()=>{
|
|
340
|
+
expect(isYearDisabled(2026, {}, {
|
|
341
|
+
years: [
|
|
342
|
+
2026
|
|
343
|
+
],
|
|
344
|
+
maxDate: new Date("nope")
|
|
345
|
+
})).toBe(false);
|
|
346
|
+
});
|
|
347
|
+
});
|
|
348
|
+
it("should go to the next missing part after a pick", ()=>{
|
|
349
|
+
expect(nextBirthdayStep({
|
|
350
|
+
day: 9
|
|
351
|
+
}, "day", new Set([
|
|
352
|
+
"day"
|
|
353
|
+
]))).toBe("month");
|
|
354
|
+
expect(nextBirthdayStep({
|
|
355
|
+
month: 2,
|
|
356
|
+
year: 1990
|
|
357
|
+
}, "year", new Set([
|
|
358
|
+
"year"
|
|
359
|
+
]))).toBe("day");
|
|
360
|
+
});
|
|
361
|
+
it("should close once a pick out of order completes the date", ()=>{
|
|
362
|
+
const picked = new Set([
|
|
363
|
+
"year",
|
|
364
|
+
"day",
|
|
365
|
+
"month"
|
|
366
|
+
]);
|
|
367
|
+
expect(nextBirthdayStep({
|
|
368
|
+
day: 9,
|
|
369
|
+
month: 2,
|
|
370
|
+
year: 1990
|
|
371
|
+
}, "month", picked)).toBe(void 0);
|
|
372
|
+
});
|
|
373
|
+
it("should walk on through the later steps when editing a saved date", ()=>{
|
|
374
|
+
const date = {
|
|
375
|
+
day: 9,
|
|
376
|
+
month: 2,
|
|
377
|
+
year: 1990
|
|
378
|
+
};
|
|
379
|
+
expect(nextBirthdayStep(date, "day", new Set([
|
|
380
|
+
"day"
|
|
381
|
+
]))).toBe("month");
|
|
382
|
+
expect(nextBirthdayStep(date, "month", new Set([
|
|
383
|
+
"day",
|
|
384
|
+
"month"
|
|
385
|
+
]))).toBe("year");
|
|
386
|
+
expect(nextBirthdayStep(date, "year", new Set([
|
|
387
|
+
"day",
|
|
388
|
+
"month",
|
|
389
|
+
"year"
|
|
390
|
+
]))).toBe(void 0);
|
|
391
|
+
});
|
|
392
|
+
});
|
|
393
|
+
|
|
394
|
+
//# sourceMappingURL=birthdayHelpers.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DatePicker/utils/birthdayHelpers.test.js","sources":["../../../src/DatePicker/utils/birthdayHelpers.test.ts"],"sourcesContent":["import { describe, expect, it } from \"vitest\";\nimport {\n birthdayYears,\n daysInMonth,\n formatBirthdayValue,\n isDayDisabled,\n isMonthDisabled,\n isYearDisabled,\n nextBirthdayStep,\n parseBirthdayValue,\n pickDay,\n pickMonth,\n pickYear\n} from \"./birthdayHelpers.js\";\n\ndescribe(\"birthdayHelpers\", () => {\n it(\"should read the parts of a date-only value\", () => {\n expect(parseBirthdayValue(\"1990-02-09\")).toEqual({ day: 9, month: 2, year: 1990 });\n });\n\n it(\"should read the date part of a value that carries a time\", () => {\n expect(parseBirthdayValue(\"1990-02-09T00:00:00.000Z\")).toEqual({\n day: 9,\n month: 2,\n year: 1990\n });\n });\n\n it(\"should read no parts from an empty or impossible value\", () => {\n expect(parseBirthdayValue(undefined)).toEqual({});\n expect(parseBirthdayValue(\"\")).toEqual({});\n expect(parseBirthdayValue(\"not a date\")).toEqual({});\n expect(parseBirthdayValue(\"1990-02-30\")).toEqual({});\n });\n\n it(\"should write a value only once every part is set\", () => {\n expect(formatBirthdayValue({ day: 9, month: 2, year: 1990 })).toBe(\"1990-02-09\");\n expect(formatBirthdayValue({ day: 9, month: 2 })).toBeUndefined();\n });\n\n it(\"should give February 29 days until a non-leap year is known\", () => {\n expect(daysInMonth(2)).toBe(29);\n expect(daysInMonth(2, 2000)).toBe(29);\n expect(daysInMonth(2, 1900)).toBe(28);\n expect(daysInMonth(2, 1990)).toBe(28);\n });\n\n it(\"should dim the months that can't hold the 31st\", () => {\n const dimmed = Array.from({ length: 12 }, (_, i) => i + 1).filter(month =>\n isMonthDisabled(month, { day: 31 })\n );\n expect(dimmed).toEqual([2, 4, 6, 9, 11]);\n });\n\n it(\"should dim no month before a day is picked\", () => {\n expect(isMonthDisabled(2, {})).toBe(false);\n });\n\n it(\"should clear a month that can't hold the newly picked day and keep the year\", () => {\n expect(pickDay({ day: 9, month: 2, year: 1990 }, 31)).toEqual({\n day: 31,\n month: undefined,\n year: 1990\n });\n });\n\n it(\"should keep a month that holds the newly picked day\", () => {\n expect(pickDay({ day: 9, month: 8, year: 1990 }, 31)).toEqual({\n day: 31,\n month: 8,\n year: 1990\n });\n });\n\n it(\"should clear a non-leap year when 29 February is picked\", () => {\n expect(pickDay({ day: 9, month: 2, year: 1990 }, 29)).toEqual({\n day: 29,\n month: 2,\n year: undefined\n });\n expect(pickMonth({ day: 29, month: 1, year: 1990 }, 2)).toEqual({\n day: 29,\n month: 2,\n year: undefined\n });\n expect(pickMonth({ day: 29, month: 1, year: 1992 }, 2)).toEqual({\n day: 29,\n month: 2,\n year: 1992\n });\n });\n\n it(\"should dim non-leap years for 29 February only\", () => {\n expect(isYearDisabled(1990, { day: 29, month: 2 })).toBe(true);\n expect(isYearDisabled(1992, { day: 29, month: 2 })).toBe(false);\n expect(isYearDisabled(1990, { day: 28, month: 2 })).toBe(false);\n expect(isYearDisabled(1990, { day: 29 })).toBe(false);\n });\n\n it(\"should set the year\", () => {\n expect(pickYear({ day: 31, month: 8 }, 1990)).toEqual({ day: 31, month: 8, year: 1990 });\n });\n\n it(\"should list years newest first\", () => {\n expect(birthdayYears([1985, 1990])).toEqual([1990, 1989, 1988, 1987, 1986, 1985]);\n expect(birthdayYears([1990, 1985])).toEqual([1990, 1989, 1988, 1987, 1986, 1985]);\n });\n\n it(\"should default to this year back 120 years\", () => {\n const currentYear = new Date().getFullYear();\n const years = birthdayYears();\n expect(years[0]).toBe(currentYear);\n expect(years[years.length - 1]).toBe(currentYear - 120);\n });\n\n it(\"should include a set year that falls outside the range\", () => {\n expect(birthdayYears([1985, 1987], 1980)).toEqual([\n 1987, 1986, 1985, 1984, 1983, 1982, 1981, 1980\n ]);\n });\n\n describe(\"within minDate and maxDate\", () => {\n const range = {\n years: birthdayYears([2000, 2026]),\n minDate: new Date(2000, 2, 10),\n maxDate: new Date(2026, 9, 15)\n };\n\n it(\"should dim the years outside the limits\", () => {\n const wide = { ...range, years: birthdayYears([1995, 2030]) };\n expect(isYearDisabled(1999, {}, wide)).toBe(true);\n expect(isYearDisabled(2000, {}, wide)).toBe(false);\n expect(isYearDisabled(2026, {}, wide)).toBe(false);\n expect(isYearDisabled(2027, {}, wide)).toBe(true);\n });\n\n it(\"should dim the last year when the picked day and month fall after maxDate\", () => {\n expect(isYearDisabled(2026, { day: 16, month: 10 }, range)).toBe(true);\n expect(isYearDisabled(2026, { day: 15, month: 10 }, range)).toBe(false);\n expect(isYearDisabled(2026, { day: 1, month: 11 }, range)).toBe(true);\n expect(isYearDisabled(2025, { day: 1, month: 11 }, range)).toBe(false);\n });\n\n it(\"should dim the first year when the picked day and month fall before minDate\", () => {\n expect(isYearDisabled(2000, { day: 9, month: 3 }, range)).toBe(true);\n expect(isYearDisabled(2000, { day: 10, month: 3 }, range)).toBe(false);\n });\n\n it(\"should dim the months and days that no date in range has\", () => {\n const oneYear = { ...range, years: [2026] };\n expect(isMonthDisabled(10, {}, oneYear)).toBe(false);\n expect(isMonthDisabled(11, {}, oneYear)).toBe(true);\n expect(isMonthDisabled(10, { day: 16 }, oneYear)).toBe(true);\n\n const oneMonth = {\n years: [2026],\n minDate: new Date(2026, 9, 1),\n maxDate: new Date(2026, 9, 15)\n };\n expect(isDayDisabled(15, oneMonth)).toBe(false);\n expect(isDayDisabled(16, oneMonth)).toBe(true);\n expect(isDayDisabled(16, range)).toBe(false);\n });\n\n it(\"should keep 29 February when the range offers a leap year\", () => {\n expect(isMonthDisabled(2, { day: 29 }, range)).toBe(false);\n expect(isMonthDisabled(2, { day: 29 }, { ...range, years: [2025] })).toBe(true);\n });\n\n it(\"should clear a year the newly picked part puts past a limit\", () => {\n expect(pickDay({ day: 1, month: 10, year: 2026 }, 20, range)).toEqual({\n day: 20,\n month: 10,\n year: undefined\n });\n expect(pickMonth({ day: 1, month: 10, year: 2026 }, 12, range)).toEqual({\n day: 1,\n month: 12,\n year: undefined\n });\n expect(pickDay({ day: 1, month: 10, year: 2026 }, 15, range)).toEqual({\n day: 15,\n month: 10,\n year: 2026\n });\n });\n\n it(\"should end the default years at maxDate and start them at minDate\", () => {\n const years = birthdayYears(undefined, undefined, { maxDate: new Date(2000, 0, 1) });\n expect(years[0]).toBe(2000);\n expect(years[years.length - 1]).toBe(1880);\n expect(\n birthdayYears(undefined, undefined, {\n minDate: new Date(1990, 0, 1),\n maxDate: new Date(1995, 0, 1)\n })\n ).toEqual([1995, 1994, 1993, 1992, 1991, 1990]);\n });\n\n it(\"should start the default years at a maxDate in the future\", () => {\n const currentYear = new Date().getFullYear();\n const years = birthdayYears(undefined, undefined, {\n maxDate: new Date(currentYear + 2, 0, 1)\n });\n expect(years[0]).toBe(currentYear + 2);\n expect(years[years.length - 1]).toBe(currentYear + 2 - 120);\n });\n\n it(\"should run the default years from this year down to an old minDate\", () => {\n const currentYear = new Date().getFullYear();\n const years = birthdayYears(undefined, undefined, { minDate: new Date(1850, 0, 1) });\n expect(years[0]).toBe(currentYear);\n expect(years[years.length - 1]).toBe(1850);\n });\n\n it(\"should start the default years at a minDate in the future\", () => {\n const currentYear = new Date().getFullYear();\n const years = birthdayYears(undefined, undefined, {\n minDate: new Date(currentYear + 3, 0, 1)\n });\n expect(years).toEqual([currentYear + 3]);\n });\n\n it(\"should ignore an invalid limit\", () => {\n expect(isYearDisabled(2026, {}, { years: [2026], maxDate: new Date(\"nope\") })).toBe(\n false\n );\n });\n });\n\n it(\"should go to the next missing part after a pick\", () => {\n expect(nextBirthdayStep({ day: 9 }, \"day\", new Set([\"day\"]))).toBe(\"month\");\n expect(nextBirthdayStep({ month: 2, year: 1990 }, \"year\", new Set([\"year\"]))).toBe(\"day\");\n });\n\n it(\"should close once a pick out of order completes the date\", () => {\n const picked = new Set([\"year\", \"day\", \"month\"] as const);\n expect(nextBirthdayStep({ day: 9, month: 2, year: 1990 }, \"month\", picked)).toBe(undefined);\n });\n\n it(\"should walk on through the later steps when editing a saved date\", () => {\n const date = { day: 9, month: 2, year: 1990 };\n expect(nextBirthdayStep(date, \"day\", new Set([\"day\"]))).toBe(\"month\");\n expect(nextBirthdayStep(date, \"month\", new Set([\"day\", \"month\"]))).toBe(\"year\");\n expect(nextBirthdayStep(date, \"year\", new Set([\"day\", \"month\", \"year\"]))).toBe(undefined);\n });\n});\n"],"names":["describe","it","expect","parseBirthdayValue","undefined","formatBirthdayValue","daysInMonth","dimmed","Array","_","i","month","isMonthDisabled","pickDay","pickMonth","isYearDisabled","pickYear","birthdayYears","currentYear","Date","years","range","wide","oneYear","oneMonth","isDayDisabled","nextBirthdayStep","Set","picked","date"],"mappings":"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"}
|
|
@@ -1,3 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `new Date("2026-10-10")` is UTC midnight, which is the previous day west of UTC.
|
|
3
|
+
* Bare dates are calendar days, so build them at local midnight instead.
|
|
4
|
+
*/
|
|
5
|
+
export declare function parseDateValue(value: string | Date | number): Date;
|
|
1
6
|
export declare function formatDateForDisplay(value: Date | string | number | {
|
|
2
7
|
from?: string;
|
|
3
8
|
to?: string;
|
|
@@ -1,10 +1,17 @@
|
|
|
1
1
|
import { endOfISOWeek, format, getISOWeek, getISOWeekYear, startOfISOWeek } from "date-fns";
|
|
2
2
|
import { DEFAULT_YEAR_RANGE_SIZE, MONTH_NAMES_SHORT } from "./constants.js";
|
|
3
|
+
function parseDateValue(value) {
|
|
4
|
+
if ("string" == typeof value) {
|
|
5
|
+
const match = value.match(/^(\d{4})-(\d{2})-(\d{2})$/);
|
|
6
|
+
if (match) return new Date(Number(match[1]), Number(match[2]) - 1, Number(match[3]));
|
|
7
|
+
}
|
|
8
|
+
return new Date(value);
|
|
9
|
+
}
|
|
3
10
|
function formatDateForDisplay(value, type, displayFormat) {
|
|
4
11
|
if (null == value) return;
|
|
5
12
|
switch(type){
|
|
6
13
|
case "date":
|
|
7
|
-
return format(
|
|
14
|
+
return format(parseDateValue(value), displayFormat ?? "PPP");
|
|
8
15
|
case "time":
|
|
9
16
|
return value;
|
|
10
17
|
case "dateTimeLocal":
|
|
@@ -54,8 +61,8 @@ function formatDateForDisplay(value, type, displayFormat) {
|
|
|
54
61
|
const range = value;
|
|
55
62
|
const fmt = displayFormat ?? "PPP";
|
|
56
63
|
if (!range.from) return;
|
|
57
|
-
if (!range.to) return format(
|
|
58
|
-
return `${format(
|
|
64
|
+
if (!range.to) return format(parseDateValue(range.from), fmt);
|
|
65
|
+
return `${format(parseDateValue(range.from), fmt)} – ${format(parseDateValue(range.to), fmt)}`;
|
|
59
66
|
}
|
|
60
67
|
case "multipleDates":
|
|
61
68
|
{
|
|
@@ -147,6 +154,6 @@ function parseWeekValue(value) {
|
|
|
147
154
|
week: Number(match[2])
|
|
148
155
|
};
|
|
149
156
|
}
|
|
150
|
-
export { defaultYearRange, extractTimezone, formatDateForDisplay, formatMonthValue, formatTimeValue, formatWeekValue, getLocalTimezone, parseMonthValue, parseTimeValue, parseWeekValue, toIsoWithTz, toLocalNaive };
|
|
157
|
+
export { defaultYearRange, extractTimezone, formatDateForDisplay, formatMonthValue, formatTimeValue, formatWeekValue, getLocalTimezone, parseDateValue, parseMonthValue, parseTimeValue, parseWeekValue, toIsoWithTz, toLocalNaive };
|
|
151
158
|
|
|
152
159
|
//# sourceMappingURL=dateHelpers.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DatePicker/utils/dateHelpers.js","sources":["../../../src/DatePicker/utils/dateHelpers.ts"],"sourcesContent":["import { format, getISOWeek, getISOWeekYear, startOfISOWeek, endOfISOWeek } from \"date-fns\";\nimport { DEFAULT_YEAR_RANGE_SIZE, MONTH_NAMES_SHORT } from \"./constants.js\";\n\nexport function formatDateForDisplay(\n value:\n | Date\n | string\n | number\n | { from?: string; to?: string }\n | Date[]\n | string[]\n | number[]\n | undefined,\n type: string,\n displayFormat?: string\n): string | undefined {\n if (value === undefined || value === null) {\n return undefined;\n }\n\n switch (type) {\n case \"date\":\n return format(new Date(value as string), displayFormat ?? \"PPP\");\n case \"time\":\n return value as string;\n case \"dateTimeLocal\":\n return format(new Date(value as string), displayFormat ?? \"PPP p\");\n case \"dateTimeTz\": {\n if (!value) {\n return undefined;\n }\n const isoStr = value instanceof Date ? value.toISOString() : (value as string);\n const tzMatch = isoStr.match(/([+-]\\d{2}:\\d{2})$/);\n const tz = tzMatch ? `UTC${tzMatch[1]}` : \"\";\n const dateWithoutTz = isoStr.replace(/[+-]\\d{2}:\\d{2}$/, \"\");\n const parts = dateWithoutTz.split(\"T\");\n if (parts.length < 2) {\n return isoStr;\n }\n const datePart = new Date(parts[0] + \"T00:00:00\");\n const timeParts = parts[1].split(\":\");\n const hours = Number(timeParts[0]);\n const minutes = timeParts[1] ?? \"00\";\n const ampm = hours >= 12 ? \"PM\" : \"AM\";\n const h12 = hours % 12 || 12;\n if (displayFormat) {\n return `${format(datePart, displayFormat)} ${h12}:${minutes} ${ampm} (${tz})`;\n }\n return `${format(datePart, \"PPP\")} ${h12}:${minutes} ${ampm} (${tz})`;\n }\n case \"month\": {\n if (displayFormat) {\n const parsed = parseMonthValue(value as string);\n if (!parsed) {\n return undefined;\n }\n return format(new Date(parsed.year, parsed.month), displayFormat);\n }\n const parsed = parseMonthValue(value as string);\n if (!parsed) {\n return undefined;\n }\n return `${MONTH_NAMES_SHORT[parsed.month]} ${parsed.year}`;\n }\n case \"week\": {\n const parsed = parseWeekValue(value as string);\n if (!parsed) {\n return undefined;\n }\n const weekStart = startOfISOWeek(new Date(parsed.year, 0, 4 + (parsed.week - 1) * 7));\n const weekEnd = endOfISOWeek(weekStart);\n if (displayFormat) {\n return `${format(weekStart, displayFormat)} – ${format(weekEnd, displayFormat)}`;\n }\n return `Week ${parsed.week}, ${format(weekStart, \"MMM d\")} – ${format(weekEnd, \"MMM d, yyyy\")}`;\n }\n case \"year\":\n return String(value);\n case \"dateRange\": {\n const range = value as { from?: string; to?: string };\n const fmt = displayFormat ?? \"PPP\";\n if (!range.from) {\n return undefined;\n }\n if (!range.to) {\n return format(new Date(range.from), fmt);\n }\n return `${format(new Date(range.from), fmt)} – ${format(new Date(range.to), fmt)}`;\n }\n case \"multipleDates\": {\n const dates = value as string[];\n if (dates.length === 0) {\n return undefined;\n }\n return `${dates.length} date${dates.length > 1 ? \"s\" : \"\"} selected`;\n }\n case \"multipleMonths\": {\n const months = value as string[];\n if (months.length === 0) {\n return undefined;\n }\n return `${months.length} month${months.length > 1 ? \"s\" : \"\"} selected`;\n }\n case \"multipleYears\": {\n const years = value as number[];\n if (years.length === 0) {\n return undefined;\n }\n return `${years.length} year${years.length > 1 ? \"s\" : \"\"} selected`;\n }\n default:\n return undefined;\n }\n}\n\nexport function defaultYearRange(centerYear?: number): [number, number] {\n const center = centerYear ?? new Date().getFullYear();\n const half = Math.floor(DEFAULT_YEAR_RANGE_SIZE / 2);\n return [center - half, center + half - 1];\n}\n\nexport function formatMonthValue(year: number, month: number): string {\n return `${year}-${String(month + 1).padStart(2, \"0\")}`;\n}\n\nexport function parseMonthValue(value: string): { year: number; month: number } | undefined {\n const match = value.match(/^(\\d{4})-(\\d{2})$/);\n if (!match) {\n return undefined;\n }\n return { year: Number(match[1]), month: Number(match[2]) - 1 };\n}\n\nexport function formatTimeValue(date: Date): string {\n return format(date, \"HH:mm\");\n}\n\nexport function parseTimeValue(time: string): { hours: number; minutes: number } | undefined {\n const match = time.match(/^(\\d{2}):(\\d{2})$/);\n if (!match) {\n return undefined;\n }\n return { hours: Number(match[1]), minutes: Number(match[2]) };\n}\n\nexport function toIsoWithTz(date: Date, timezone?: string): string {\n if (timezone) {\n return format(date, \"yyyy-MM-dd'T'HH:mm:ss\") + timezone;\n }\n const offset = -date.getTimezoneOffset();\n const sign = offset >= 0 ? \"+\" : \"-\";\n const absOffset = Math.abs(offset);\n const hours = String(Math.floor(absOffset / 60)).padStart(2, \"0\");\n const minutes = String(absOffset % 60).padStart(2, \"0\");\n return format(date, \"yyyy-MM-dd'T'HH:mm:ss\") + `${sign}${hours}:${minutes}`;\n}\n\nexport function getLocalTimezone(): string {\n const offset = -new Date().getTimezoneOffset();\n const sign = offset >= 0 ? \"+\" : \"-\";\n const absOffset = Math.abs(offset);\n const hours = String(Math.floor(absOffset / 60)).padStart(2, \"0\");\n const minutes = String(absOffset % 60).padStart(2, \"0\");\n return `${sign}${hours}:${minutes}`;\n}\n\nexport function extractTimezone(isoString: string | Date | unknown): string | undefined {\n if (typeof isoString !== \"string\") {\n return undefined;\n }\n const match = isoString.match(/([+-]\\d{2}:\\d{2})$/);\n if (match) {\n return match[1];\n }\n return undefined;\n}\n\nexport function toLocalNaive(isoString: string): Date {\n return new Date(isoString);\n}\n\nexport function formatWeekValue(date: Date): string {\n const week = getISOWeek(date);\n const year = getISOWeekYear(date);\n return `${year}-W${String(week).padStart(2, \"0\")}`;\n}\n\nexport function parseWeekValue(value: string): { year: number; week: number } | undefined {\n const match = value.match(/^(\\d{4})-W(\\d{2})$/);\n if (!match) {\n return undefined;\n }\n return { year: Number(match[1]), week: Number(match[2]) };\n}\n"],"names":["formatDateForDisplay","value","type","displayFormat","format","Date","isoStr","tzMatch","tz","dateWithoutTz","parts","datePart","timeParts","hours","Number","minutes","ampm","h12","parsed","parseMonthValue","MONTH_NAMES_SHORT","parseWeekValue","weekStart","startOfISOWeek","weekEnd","endOfISOWeek","String","range","fmt","dates","months","years","defaultYearRange","centerYear","center","half","Math","DEFAULT_YEAR_RANGE_SIZE","formatMonthValue","year","month","match","formatTimeValue","date","parseTimeValue","time","toIsoWithTz","timezone","offset","sign","absOffset","getLocalTimezone","extractTimezone","isoString","toLocalNaive","formatWeekValue","week","getISOWeek","getISOWeekYear"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"DatePicker/utils/dateHelpers.js","sources":["../../../src/DatePicker/utils/dateHelpers.ts"],"sourcesContent":["import { format, getISOWeek, getISOWeekYear, startOfISOWeek, endOfISOWeek } from \"date-fns\";\nimport { DEFAULT_YEAR_RANGE_SIZE, MONTH_NAMES_SHORT } from \"./constants.js\";\n\n/**\n * `new Date(\"2026-10-10\")` is UTC midnight, which is the previous day west of UTC.\n * Bare dates are calendar days, so build them at local midnight instead.\n */\nexport function parseDateValue(value: string | Date | number): Date {\n if (typeof value === \"string\") {\n const match = value.match(/^(\\d{4})-(\\d{2})-(\\d{2})$/);\n if (match) {\n return new Date(Number(match[1]), Number(match[2]) - 1, Number(match[3]));\n }\n }\n return new Date(value);\n}\n\nexport function formatDateForDisplay(\n value:\n | Date\n | string\n | number\n | { from?: string; to?: string }\n | Date[]\n | string[]\n | number[]\n | undefined,\n type: string,\n displayFormat?: string\n): string | undefined {\n if (value === undefined || value === null) {\n return undefined;\n }\n\n switch (type) {\n case \"date\":\n return format(parseDateValue(value as string), displayFormat ?? \"PPP\");\n case \"time\":\n return value as string;\n case \"dateTimeLocal\":\n return format(new Date(value as string), displayFormat ?? \"PPP p\");\n case \"dateTimeTz\": {\n if (!value) {\n return undefined;\n }\n const isoStr = value instanceof Date ? value.toISOString() : (value as string);\n const tzMatch = isoStr.match(/([+-]\\d{2}:\\d{2})$/);\n const tz = tzMatch ? `UTC${tzMatch[1]}` : \"\";\n const dateWithoutTz = isoStr.replace(/[+-]\\d{2}:\\d{2}$/, \"\");\n const parts = dateWithoutTz.split(\"T\");\n if (parts.length < 2) {\n return isoStr;\n }\n const datePart = new Date(parts[0] + \"T00:00:00\");\n const timeParts = parts[1].split(\":\");\n const hours = Number(timeParts[0]);\n const minutes = timeParts[1] ?? \"00\";\n const ampm = hours >= 12 ? \"PM\" : \"AM\";\n const h12 = hours % 12 || 12;\n if (displayFormat) {\n return `${format(datePart, displayFormat)} ${h12}:${minutes} ${ampm} (${tz})`;\n }\n return `${format(datePart, \"PPP\")} ${h12}:${minutes} ${ampm} (${tz})`;\n }\n case \"month\": {\n if (displayFormat) {\n const parsed = parseMonthValue(value as string);\n if (!parsed) {\n return undefined;\n }\n return format(new Date(parsed.year, parsed.month), displayFormat);\n }\n const parsed = parseMonthValue(value as string);\n if (!parsed) {\n return undefined;\n }\n return `${MONTH_NAMES_SHORT[parsed.month]} ${parsed.year}`;\n }\n case \"week\": {\n const parsed = parseWeekValue(value as string);\n if (!parsed) {\n return undefined;\n }\n const weekStart = startOfISOWeek(new Date(parsed.year, 0, 4 + (parsed.week - 1) * 7));\n const weekEnd = endOfISOWeek(weekStart);\n if (displayFormat) {\n return `${format(weekStart, displayFormat)} – ${format(weekEnd, displayFormat)}`;\n }\n return `Week ${parsed.week}, ${format(weekStart, \"MMM d\")} – ${format(weekEnd, \"MMM d, yyyy\")}`;\n }\n case \"year\":\n return String(value);\n case \"dateRange\": {\n const range = value as { from?: string; to?: string };\n const fmt = displayFormat ?? \"PPP\";\n if (!range.from) {\n return undefined;\n }\n if (!range.to) {\n return format(parseDateValue(range.from), fmt);\n }\n return `${format(parseDateValue(range.from), fmt)} – ${format(parseDateValue(range.to), fmt)}`;\n }\n case \"multipleDates\": {\n const dates = value as string[];\n if (dates.length === 0) {\n return undefined;\n }\n return `${dates.length} date${dates.length > 1 ? \"s\" : \"\"} selected`;\n }\n case \"multipleMonths\": {\n const months = value as string[];\n if (months.length === 0) {\n return undefined;\n }\n return `${months.length} month${months.length > 1 ? \"s\" : \"\"} selected`;\n }\n case \"multipleYears\": {\n const years = value as number[];\n if (years.length === 0) {\n return undefined;\n }\n return `${years.length} year${years.length > 1 ? \"s\" : \"\"} selected`;\n }\n default:\n return undefined;\n }\n}\n\nexport function defaultYearRange(centerYear?: number): [number, number] {\n const center = centerYear ?? new Date().getFullYear();\n const half = Math.floor(DEFAULT_YEAR_RANGE_SIZE / 2);\n return [center - half, center + half - 1];\n}\n\nexport function formatMonthValue(year: number, month: number): string {\n return `${year}-${String(month + 1).padStart(2, \"0\")}`;\n}\n\nexport function parseMonthValue(value: string): { year: number; month: number } | undefined {\n const match = value.match(/^(\\d{4})-(\\d{2})$/);\n if (!match) {\n return undefined;\n }\n return { year: Number(match[1]), month: Number(match[2]) - 1 };\n}\n\nexport function formatTimeValue(date: Date): string {\n return format(date, \"HH:mm\");\n}\n\nexport function parseTimeValue(time: string): { hours: number; minutes: number } | undefined {\n const match = time.match(/^(\\d{2}):(\\d{2})$/);\n if (!match) {\n return undefined;\n }\n return { hours: Number(match[1]), minutes: Number(match[2]) };\n}\n\nexport function toIsoWithTz(date: Date, timezone?: string): string {\n if (timezone) {\n return format(date, \"yyyy-MM-dd'T'HH:mm:ss\") + timezone;\n }\n const offset = -date.getTimezoneOffset();\n const sign = offset >= 0 ? \"+\" : \"-\";\n const absOffset = Math.abs(offset);\n const hours = String(Math.floor(absOffset / 60)).padStart(2, \"0\");\n const minutes = String(absOffset % 60).padStart(2, \"0\");\n return format(date, \"yyyy-MM-dd'T'HH:mm:ss\") + `${sign}${hours}:${minutes}`;\n}\n\nexport function getLocalTimezone(): string {\n const offset = -new Date().getTimezoneOffset();\n const sign = offset >= 0 ? \"+\" : \"-\";\n const absOffset = Math.abs(offset);\n const hours = String(Math.floor(absOffset / 60)).padStart(2, \"0\");\n const minutes = String(absOffset % 60).padStart(2, \"0\");\n return `${sign}${hours}:${minutes}`;\n}\n\nexport function extractTimezone(isoString: string | Date | unknown): string | undefined {\n if (typeof isoString !== \"string\") {\n return undefined;\n }\n const match = isoString.match(/([+-]\\d{2}:\\d{2})$/);\n if (match) {\n return match[1];\n }\n return undefined;\n}\n\nexport function toLocalNaive(isoString: string): Date {\n return new Date(isoString);\n}\n\nexport function formatWeekValue(date: Date): string {\n const week = getISOWeek(date);\n const year = getISOWeekYear(date);\n return `${year}-W${String(week).padStart(2, \"0\")}`;\n}\n\nexport function parseWeekValue(value: string): { year: number; week: number } | undefined {\n const match = value.match(/^(\\d{4})-W(\\d{2})$/);\n if (!match) {\n return undefined;\n }\n return { year: Number(match[1]), week: Number(match[2]) };\n}\n"],"names":["parseDateValue","value","match","Date","Number","formatDateForDisplay","type","displayFormat","format","isoStr","tzMatch","tz","dateWithoutTz","parts","datePart","timeParts","hours","minutes","ampm","h12","parsed","parseMonthValue","MONTH_NAMES_SHORT","parseWeekValue","weekStart","startOfISOWeek","weekEnd","endOfISOWeek","String","range","fmt","dates","months","years","defaultYearRange","centerYear","center","half","Math","DEFAULT_YEAR_RANGE_SIZE","formatMonthValue","year","month","formatTimeValue","date","parseTimeValue","time","toIsoWithTz","timezone","offset","sign","absOffset","getLocalTimezone","extractTimezone","isoString","toLocalNaive","formatWeekValue","week","getISOWeek","getISOWeekYear"],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|