@kyndryl-design-system/shidoka-applications 2.86.4 → 2.87.0
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/common/helpers/flatpickr/flatpickr.js.map +1 -1
- package/common/helpers/flatpickr/langs.js.map +1 -1
- package/common/helpers/flatpickr/overlay.js.map +1 -1
- package/common/helpers/flatpickr/utils.js.map +1 -1
- package/common/helpers/flatpickr/utils.test.js +1 -1
- package/common/helpers/flatpickr/utils.test.js.map +1 -1
- package/common/helpers/helpers.js.map +1 -1
- package/common/helpers/multiInputValidationsHelper.js.map +1 -1
- package/common/helpers/popoverHelper.js.map +1 -1
- package/common/helpers/swiper.js.map +1 -1
- package/common/mixins/form-input.js.map +1 -1
- package/components/ai/aiLaunchButton/aiLaunchButton.js.map +1 -1
- package/components/ai/sourcesFeedback/aiSourcesFeedback.js.map +1 -1
- package/components/global/footer/footer.js.map +1 -1
- package/components/global/header/header.d.ts.map +1 -1
- package/components/global/header/header.js +14 -28
- package/components/global/header/header.js.map +1 -1
- package/components/global/header/headerCategories.js.map +1 -1
- package/components/global/header/headerCategory.js.map +1 -1
- package/components/global/header/headerDivider.js.map +1 -1
- package/components/global/header/headerFlyout.js +3 -3
- package/components/global/header/headerFlyout.js.map +1 -1
- package/components/global/header/headerFlyouts.js +3 -3
- package/components/global/header/headerFlyouts.js.map +1 -1
- package/components/global/header/headerLink.js +3 -3
- package/components/global/header/headerLink.js.map +1 -1
- package/components/global/header/headerNav.js +3 -3
- package/components/global/header/headerNav.js.map +1 -1
- package/components/global/header/headerNotificationPanel.js.map +1 -1
- package/components/global/header/headerPanelLink.js.map +1 -1
- package/components/global/header/headerUserProfile.js.map +1 -1
- package/components/global/localNav/localNav.js.map +1 -1
- package/components/global/localNav/localNavDivider.js.map +1 -1
- package/components/global/localNav/localNavLink.js.map +1 -1
- package/components/global/uiShell/uiShell.js.map +1 -1
- package/components/global/workspaceSwitcher/workspaceSwitcher.js.map +1 -1
- package/components/global/workspaceSwitcher/workspaceSwitcherMenuItem.js.map +1 -1
- package/components/reusable/accordion/accordion.js.map +1 -1
- package/components/reusable/accordion/accordionItem.js.map +1 -1
- package/components/reusable/avatar/avatar.js.map +1 -1
- package/components/reusable/badge/badge.js.map +1 -1
- package/components/reusable/blockCodeView/blockCodeView.js.map +1 -1
- package/components/reusable/breadcrumbs/breadcrumbs.js.map +1 -1
- package/components/reusable/button/button.js +9 -0
- package/components/reusable/button/button.js.map +1 -1
- package/components/reusable/buttonGroup/buttonGroup.d.ts +2 -0
- package/components/reusable/buttonGroup/buttonGroup.d.ts.map +1 -1
- package/components/reusable/buttonGroup/buttonGroup.js +10 -7
- package/components/reusable/buttonGroup/buttonGroup.js.map +1 -1
- package/components/reusable/card/card.js.map +1 -1
- package/components/reusable/card/informationalCard.skeleton.js.map +1 -1
- package/components/reusable/card/vitalCard.skeleton.js.map +1 -1
- package/components/reusable/checkbox/checkbox.js.map +1 -1
- package/components/reusable/checkbox/checkboxGroup.js.map +1 -1
- package/components/reusable/checkbox/checkboxSubgroup.js.map +1 -1
- package/components/reusable/colorInput/colorInput.js.map +1 -1
- package/components/reusable/datePicker/datepicker.js.map +1 -1
- package/components/reusable/daterangepicker/daterangepicker.js.map +1 -1
- package/components/reusable/divider/divider.js.map +1 -1
- package/components/reusable/dropdown/dropdown.js.map +1 -1
- package/components/reusable/dropdown/dropdownCategory.js.map +1 -1
- package/components/reusable/dropdown/dropdownOption.js.map +1 -1
- package/components/reusable/dropdown/enhancedDropdownOption.js.map +1 -1
- package/components/reusable/errorBlock/errorBlock.js.map +1 -1
- package/components/reusable/fileUploader/fileUploader.js.map +1 -1
- package/components/reusable/fileUploader/fileUploaderListContainer.js.map +1 -1
- package/components/reusable/floatingContainer/floatingContainer.js.map +1 -1
- package/components/reusable/globalFilter/globalFilter.js.map +1 -1
- package/components/reusable/iconSelector/iconSelector.js.map +1 -1
- package/components/reusable/iconSelector/iconSelectorGroup.js.map +1 -1
- package/components/reusable/inlineCodeView/inlineCodeView.js.map +1 -1
- package/components/reusable/inlineConfirm/inlineConfirm.js.map +1 -1
- package/components/reusable/link/link.js.map +1 -1
- package/components/reusable/loaders/aiLoader.js.map +1 -1
- package/components/reusable/loaders/inline.js.map +1 -1
- package/components/reusable/loaders/loader.js.map +1 -1
- package/components/reusable/loaders/skeleton.js.map +1 -1
- package/components/reusable/loaders/spinner.js.map +1 -1
- package/components/reusable/metaData/metaData.js.map +1 -1
- package/components/reusable/modal/modal.js.map +1 -1
- package/components/reusable/multiInputField/multiInputField.js.map +1 -1
- package/components/reusable/notification/notification.js.map +1 -1
- package/components/reusable/notification/notificationContainer.js.map +1 -1
- package/components/reusable/numberInput/numberInput.js.map +1 -1
- package/components/reusable/overflowMenu/overflowMenu.js.map +1 -1
- package/components/reusable/overflowMenu/overflowMenuItem.js.map +1 -1
- package/components/reusable/pagetitle/pageTitle.js.map +1 -1
- package/components/reusable/pagination/Pagination.js.map +1 -1
- package/components/reusable/pagination/pagination-items-range.js.map +1 -1
- package/components/reusable/pagination/pagination-navigation-buttons.js.map +1 -1
- package/components/reusable/pagination/pagination-page-size-dropdown.js.map +1 -1
- package/components/reusable/pagination/pagination.skeleton.js.map +1 -1
- package/components/reusable/popover/popover.js.map +1 -1
- package/components/reusable/progressBar/progressBar.js.map +1 -1
- package/components/reusable/queryBuilder/queryBuilder.js.map +1 -1
- package/components/reusable/queryBuilder/queryBuilderGroup.js.map +1 -1
- package/components/reusable/queryBuilder/queryBuilderRule.js.map +1 -1
- package/components/reusable/radioButton/radioButton.js.map +1 -1
- package/components/reusable/radioButton/radioButtonGroup.js.map +1 -1
- package/components/reusable/search/search.js.map +1 -1
- package/components/reusable/sideDrawer/sideDrawer.js.map +1 -1
- package/components/reusable/sliderInput/sliderInput.js.map +1 -1
- package/components/reusable/splitButton/splitButton.js.map +1 -1
- package/components/reusable/splitButton/splitButtonOption.js.map +1 -1
- package/components/reusable/statusButton/statusButton.js.map +1 -1
- package/components/reusable/stepper/stepper.js.map +1 -1
- package/components/reusable/stepper/stepperItem.js.map +1 -1
- package/components/reusable/stepper/stepperItemChild.js.map +1 -1
- package/components/reusable/table/table-body.js.map +1 -1
- package/components/reusable/table/table-cell.js.map +1 -1
- package/components/reusable/table/table-container.js.map +1 -1
- package/components/reusable/table/table-expanded-row.js.map +1 -1
- package/components/reusable/table/table-foot.js.map +1 -1
- package/components/reusable/table/table-footer.js.map +1 -1
- package/components/reusable/table/table-head.js.map +1 -1
- package/components/reusable/table/table-header-group.js.map +1 -1
- package/components/reusable/table/table-header-row.js.map +1 -1
- package/components/reusable/table/table-legend-item.js.map +1 -1
- package/components/reusable/table/table-legend.js.map +1 -1
- package/components/reusable/table/table-row.js.map +1 -1
- package/components/reusable/table/table-toolbar.js.map +1 -1
- package/components/reusable/tabs/tab.d.ts +20 -0
- package/components/reusable/tabs/tab.d.ts.map +1 -1
- package/components/reusable/tabs/tab.js.map +1 -1
- package/components/reusable/tabs/tabPanel.js.map +1 -1
- package/components/reusable/tabs/tabs.js.map +1 -1
- package/components/reusable/tag/tag.js.map +1 -1
- package/components/reusable/tag/tag.skeleton.js.map +1 -1
- package/components/reusable/tag/tagGroup.js.map +1 -1
- package/components/reusable/textArea/textArea.js.map +1 -1
- package/components/reusable/textInput/textInput.js.map +1 -1
- package/components/reusable/timepicker/timepicker.js.map +1 -1
- package/components/reusable/toggleButton/toggleButton.js.map +1 -1
- package/components/reusable/tooltip/tooltip.js.map +1 -1
- package/components/reusable/widget/widget.js.map +1 -1
- package/components/reusable/widget/widgetDragHandle.js.map +1 -1
- package/components/reusable/widget/widgetGridstack.js.map +1 -1
- package/package.json +10 -10
- package/table-C4fpukCi.js.map +1 -1
- package/table.skeleton-BCXNrSo8.js.map +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"flatpickr.js","sources":["../../../../src/common/helpers/flatpickr/flatpickr.ts"],"sourcesContent":["import flatpickr from 'flatpickr';\nimport rangePlugin from 'flatpickr/dist/esm/plugins/rangePlugin.js';\nimport { Instance } from 'flatpickr/dist/types/instance';\nimport { BaseOptions, Hook } from 'flatpickr/dist/types/options';\nimport { Locale } from 'flatpickr/dist/types/locale';\nimport { default as English } from 'flatpickr/dist/esm/l10n/default.js';\nimport { loadLocale as loadLocaleFromLangs } from './langs';\nimport { fixedOverlayPositionPlugin } from './overlay';\n\nlet flatpickrStylesInjected = false;\n\nexport const _defaultCalendarTooltipStrings = {\n lockedStartDate: 'Start date is locked',\n lockedEndDate: 'End date is locked',\n dateLocked: 'Date is locked',\n dateNotAvailable: 'Date is not available',\n dateInSelectedRange: 'Date is in selected range',\n};\n\nexport type FlatpickrTextStrings = Partial<\n typeof _defaultCalendarTooltipStrings\n>;\n\nlet currentTooltipStrings = { ..._defaultCalendarTooltipStrings };\n\nexport function setTooltipStrings(\n customTextStrings: FlatpickrTextStrings = {}\n): void {\n currentTooltipStrings = {\n ..._defaultCalendarTooltipStrings,\n ...customTextStrings,\n };\n}\n\nexport function getTextStrings(\n customTextStrings: FlatpickrTextStrings = {}\n): typeof _defaultCalendarTooltipStrings {\n return { ...currentTooltipStrings, ...customTextStrings };\n}\n\ninterface BaseFlatpickrContext {\n getFlatpickrOptions: () => Promise<Partial<BaseOptions>>;\n setCalendarAttributes: (instance: Instance) => void;\n setInitialDates?: (instance: Instance) => void;\n}\n\ninterface SingleFlatpickrContext extends BaseFlatpickrContext {\n inputEl: HTMLElement;\n}\n\ninterface RangeFlatpickrContext extends BaseFlatpickrContext {\n inputEl: HTMLElement;\n endinputEl?: HTMLElement;\n}\n\nconst DATE_FORMAT_OPTIONS = {\n 'Y-m-d': 'yyyy-mm-dd',\n 'm-d-Y': 'mm-dd-yyyy',\n 'd-m-Y': 'dd-mm-yyyy',\n 'Y-m-d H:i': 'yyyy-mm-dd —— : ——',\n 'Y-m-d h:i K': 'yyyy-mm-dd —— : ——',\n 'm-d-Y H:i': 'mm-dd-yyyy —— : ——',\n 'm-d-Y h:i K': 'mm-dd-yyyy —— : ——',\n 'd-m-Y H:i': 'dd-mm-yyyy —— : ——',\n 'd-m-Y h:i K': 'dd-mm-yyyy —— : ——',\n 'Y-m-d H:i:s': 'yyyy-mm-dd —— : —— ——',\n 'Y-m-d H:i:S': 'yyyy-mm-dd —— : —— ——',\n 'm-d-Y H:i:s': 'mm-dd-yyyy —— : —— ——',\n 'm-d-Y H:i:S': 'mm-dd-yyyy —— : —— ——',\n 'd-m-Y H:i:s': 'dd-mm-yyyy —— : —— ——',\n 'd-m-Y H:i:S': 'dd-mm-yyyy —— : —— ——',\n} as const;\n\ntype DateFormatOption = keyof typeof DATE_FORMAT_OPTIONS;\n\ninterface FlatpickrOptionsContext {\n locale: string;\n dateFormat?: string;\n /** @deprecated Prefer passing pre-normalized `value` and using setInitialDates in the component. */\n defaultDate?: string | Date | string[] | Date[];\n defaultHour?: number;\n defaultMinute?: number;\n enableTime: boolean;\n twentyFourHourFormat?: boolean;\n endinputEl?: HTMLElement;\n inputEl: HTMLElement;\n allowInput?: boolean;\n minDate?: string | number | Date;\n maxDate?: string | number | Date;\n minTime?: string | number | Date;\n maxTime?: string | number | Date;\n enable?: (string | number | Date)[];\n disable?: (string | number | Date)[];\n onChange?: Hook;\n onClose?: Hook;\n onOpen?: Hook;\n onReady?: Hook;\n loadLocale: (locale: string) => Promise<Partial<Locale>>;\n mode?: 'single' | 'multiple' | 'range' | 'time';\n closeOnSelect?: boolean;\n wrap?: boolean;\n noCalendar?: boolean;\n appendTo?: HTMLElement;\n static?: boolean;\n}\n\nexport function preventFlatpickrOpen(\n event: Event,\n setShouldFlatpickrOpen: (value: boolean) => void\n): void {\n event.preventDefault();\n event.stopPropagation();\n event.stopImmediatePropagation();\n setShouldFlatpickrOpen(false);\n}\n\nexport function handleInputClick(\n setShouldFlatpickrOpen: (value: boolean) => void\n): void {\n setShouldFlatpickrOpen(true);\n}\n\nexport function handleInputFocus(\n shouldFlatpickrOpen: boolean,\n closeFlatpickr: () => void,\n setShouldFlatpickrOpen: (value: boolean) => void\n): void {\n if (!shouldFlatpickrOpen) {\n closeFlatpickr();\n setShouldFlatpickrOpen(true);\n }\n}\n\nexport function modifyWeekdayShorthands(localeOptions: Partial<Locale>): void {\n if (localeOptions.weekdays?.shorthand) {\n localeOptions.weekdays.shorthand = localeOptions.weekdays.shorthand.map(\n (day) => day.charAt(0)\n ) as [string, string, string, string, string, string, string];\n }\n}\n\nexport function injectFlatpickrStyles(customStyle: string): void {\n if (!flatpickrStylesInjected) {\n const styleElement = document.createElement('style');\n styleElement.id = 'flatpickr-custom-styles';\n styleElement.textContent = customStyle;\n document.head.appendChild(styleElement);\n flatpickrStylesInjected = true;\n }\n}\n\nexport async function initializeMultiAnchorFlatpickr(\n context: RangeFlatpickrContext\n): Promise<Instance | undefined> {\n const {\n inputEl,\n endinputEl,\n getFlatpickrOptions,\n setCalendarAttributes,\n setInitialDates,\n } = context;\n\n if (!inputEl) {\n console.error('Cannot initialize Flatpickr: inputEl is undefined');\n return undefined;\n }\n\n try {\n const options = await getFlatpickrOptions();\n\n const getInputElement = (el: HTMLElement): HTMLInputElement => {\n if (el instanceof HTMLInputElement) {\n return el;\n } else {\n try {\n let input = el.querySelector('input') as HTMLInputElement | null;\n if (!input) {\n input = document.createElement('input');\n input.type = 'text';\n input.style.display = 'none';\n if (!el.isConnected) {\n throw new Error('Element is not connected to the DOM');\n }\n el.appendChild(input);\n }\n return input;\n } catch (error) {\n console.error('Error creating or appending input element:', error);\n throw error;\n }\n }\n };\n\n const inputElement = getInputElement(inputEl);\n if (endinputEl) {\n const endInputElement = getInputElement(endinputEl);\n options.plugins = [\n ...(options.plugins || []),\n rangePlugin({ input: endInputElement }),\n ];\n }\n\n const flatpickrInstance = flatpickr(inputElement, options) as Instance;\n\n if (flatpickrInstance) {\n setTimeout(() => {\n if (setCalendarAttributes) {\n setCalendarAttributes(flatpickrInstance);\n }\n }, 0);\n\n if (setInitialDates) {\n setInitialDates(flatpickrInstance);\n }\n\n const __anchorClickHandlers: { el: HTMLElement; fn: EventListener }[] =\n [];\n\n if (!(inputEl instanceof HTMLInputElement)) {\n const handler = () => {\n flatpickrInstance.open();\n };\n inputEl.addEventListener('click', handler);\n __anchorClickHandlers.push({ el: inputEl, fn: handler });\n }\n\n if (endinputEl && !(endinputEl instanceof HTMLInputElement)) {\n const handler = () => {\n flatpickrInstance.open();\n };\n endinputEl.addEventListener('click', handler);\n __anchorClickHandlers.push({ el: endinputEl, fn: handler });\n }\n\n (flatpickrInstance as any).__anchorClickHandlers = __anchorClickHandlers;\n\n return flatpickrInstance;\n } else {\n console.error('Failed to initialize Flatpickr');\n return undefined;\n }\n } catch (error) {\n console.error('Error initializing Flatpickr:', error);\n return undefined;\n }\n}\n\nexport async function initializeSingleAnchorFlatpickr(\n context: SingleFlatpickrContext & { appendTo?: HTMLElement }\n): Promise<Instance | undefined> {\n const {\n inputEl,\n getFlatpickrOptions,\n setCalendarAttributes,\n setInitialDates,\n appendTo,\n } = context;\n if (!inputEl) {\n console.error('Cannot initialize Flatpickr: inputEl is undefined');\n return undefined;\n }\n try {\n const options = await getFlatpickrOptions();\n const effectiveDateFormat =\n options.dateFormat || (options.mode === 'time' ? 'H:i' : 'Y-m-d');\n options.dateFormat = effectiveDateFormat;\n\n let inputElement: HTMLInputElement;\n if (inputEl instanceof HTMLInputElement) {\n inputElement = inputEl;\n options.clickOpens = true;\n } else {\n try {\n inputElement = document.createElement('input');\n inputElement.type = 'text';\n inputElement.style.display = 'none';\n\n const targetElement = appendTo || inputEl;\n if (!targetElement) {\n throw new Error('No valid element to append input to');\n }\n\n targetElement.appendChild(inputElement);\n options.clickOpens = false;\n options.positionElement = inputEl;\n } catch (error) {\n console.error('Error creating input element:', error);\n throw error;\n }\n }\n const flatpickrInstance = flatpickr(inputElement, options) as Instance;\n if (flatpickrInstance) {\n setTimeout(() => {\n if (setCalendarAttributes) {\n setCalendarAttributes(flatpickrInstance);\n }\n }, 0);\n if (setInitialDates) {\n setInitialDates(flatpickrInstance);\n }\n\n if (!(inputEl instanceof HTMLInputElement)) {\n const handler = () => flatpickrInstance.open();\n inputEl.addEventListener('click', handler);\n (flatpickrInstance as any).__anchorClickHandlers = [\n { el: inputEl, fn: handler },\n ];\n }\n\n return flatpickrInstance;\n } else {\n console.error('Failed to initialize Flatpickr');\n return undefined;\n }\n } catch (error) {\n console.error('Error initializing Flatpickr:', error);\n return undefined;\n }\n}\n\nexport function isValidDateFormat(format: string): format is DateFormatOption {\n return format in DATE_FORMAT_OPTIONS;\n}\n\nexport function getPlaceholder(\n dateFormat: string,\n isDateRange?: boolean\n): string {\n if (!dateFormat) {\n return isDateRange ? 'yyyy-mm-dd to yyyy-mm-dd' : 'yyyy-mm-dd';\n }\n\n if (isValidDateFormat(dateFormat)) {\n const placeholder = isDateRange\n ? `${DATE_FORMAT_OPTIONS[dateFormat]} to ${DATE_FORMAT_OPTIONS[dateFormat]}`\n : DATE_FORMAT_OPTIONS[dateFormat];\n return placeholder;\n }\n return 'Select date';\n}\n\nexport function loadLocale(locale: string): Promise<Partial<Locale>> {\n return loadLocaleFromLangs(locale);\n}\n\nexport function getModalContainer(element: HTMLElement): HTMLElement {\n let node: Node | null = element;\n\n while (node) {\n if (node instanceof ShadowRoot) {\n node = node.host;\n continue;\n }\n\n if (node instanceof Element) {\n const tag = node.tagName.toLowerCase();\n if (tag === 'kyn-modal' || tag === 'kyn-side-drawer') {\n return node as HTMLElement;\n }\n node = node.parentNode;\n continue;\n }\n\n break;\n }\n\n return document.body;\n}\n\nexport async function getFlatpickrOptions(\n context: FlatpickrOptionsContext\n): Promise<Partial<BaseOptions>> {\n if (!context) {\n console.error('Context is required for getFlatpickrOptions');\n return {};\n }\n\n const {\n locale,\n dateFormat,\n enableTime,\n twentyFourHourFormat,\n inputEl,\n allowInput,\n minDate,\n maxDate,\n minTime,\n maxTime,\n defaultDate,\n defaultHour,\n defaultMinute,\n enable,\n disable,\n mode = 'single',\n closeOnSelect,\n wrap = false,\n noCalendar = false,\n appendTo,\n onChange,\n onClose,\n onOpen,\n loadLocale,\n } = context;\n\n if (!locale) {\n console.warn('Locale not provided. Falling back to default.');\n }\n\n if (!dateFormat) {\n console.warn('Date format not provided. Using default format.');\n }\n\n let localeOptions;\n try {\n localeOptions = await loadLocale(locale);\n modifyWeekdayShorthands(localeOptions);\n } catch (error) {\n console.warn('Error loading locale, falling back to default:', error);\n localeOptions = English;\n }\n\n const baseLocale = locale.split('-')[0].toLowerCase();\n const isEnglishOr12HourLocale = ['en', 'es'].includes(baseLocale);\n\n const isWideScreen =\n typeof window !== 'undefined' && window.innerWidth >= 767;\n\n const effectiveDateFormat =\n dateFormat ||\n (mode === 'time' ? (twentyFourHourFormat ? 'H:i' : 'h:i K') : 'Y-m-d');\n\n const modalContainer = getModalContainer(context.inputEl);\n const inOverlay = modalContainer !== document.body;\n\n const options: Partial<BaseOptions> = {\n dateFormat: effectiveDateFormat,\n mode: mode === 'time' ? 'single' : mode,\n enableTime: mode === 'time' ? true : enableTime,\n noCalendar: mode === 'time' ? true : noCalendar,\n defaultDate: defaultDate,\n enableSeconds: effectiveDateFormat.toLowerCase().includes(':s'),\n allowInput: allowInput || false,\n clickOpens: true,\n time_24hr:\n typeof twentyFourHourFormat === 'boolean'\n ? twentyFourHourFormat\n : !isEnglishOr12HourLocale,\n weekNumbers: false,\n static: context.static ?? false,\n wrap,\n showMonths: mode === 'range' && isWideScreen ? 2 : 1,\n monthSelectorType: 'static',\n locale: localeOptions,\n closeOnSelect: closeOnSelect ?? !(mode === 'multiple' || enableTime),\n onChange: (selectedDates, dateStr, instance) => {\n onChange && onChange(selectedDates, dateStr, instance);\n },\n onClose: (selectedDates, dateStr, instance) => {\n if (mode === 'range' && instance.calendarContainer) {\n const timeContainer =\n instance.calendarContainer.querySelector('.flatpickr-time');\n if (selectedDates.length === 0) {\n timeContainer?.classList.add('default-time-select');\n timeContainer?.classList.remove('start-date', 'end-date');\n }\n }\n onClose && onClose(selectedDates, dateStr, instance);\n },\n onOpen: (selectedDates, dateStr, instance) => {\n onOpen && onOpen(selectedDates, dateStr, instance);\n },\n };\n\n if (inOverlay) {\n options.appendTo = modalContainer;\n options.static = false;\n (options.plugins ||= []).push(\n fixedOverlayPositionPlugin({\n offset: 6,\n minViewportMargin: 8,\n preferTop: false,\n }) as any\n );\n }\n\n if (mode === 'range') {\n options.onReady = (_, __, instance) => {\n if (instance.calendarContainer) {\n const timeContainer =\n instance.calendarContainer.querySelector('.flatpickr-time');\n timeContainer?.classList.add('default-time-select');\n }\n };\n }\n\n if (!(inputEl instanceof HTMLInputElement)) {\n options.positionElement = inputEl;\n }\n\n if (minDate) options.minDate = minDate;\n if (maxDate) options.maxDate = maxDate;\n if (minTime) options.minTime = minTime;\n if (maxTime) options.maxTime = maxTime;\n\n if (defaultDate) {\n if (\n Array.isArray(defaultDate) &&\n (mode === 'range' || mode === 'multiple')\n ) {\n options.defaultDate = defaultDate;\n } else if (!Array.isArray(defaultDate)) {\n if (typeof defaultDate === 'string') {\n let parsedDate: Date | null = null;\n switch (effectiveDateFormat) {\n case 'Y-m-d': {\n const [year, month, day] = defaultDate.split('-').map(Number);\n parsedDate =\n !isNaN(year) && !isNaN(month) && !isNaN(day)\n ? new Date(year, month - 1, day, 12)\n : null;\n break;\n }\n case 'd-m-Y': {\n const [day, month, year] = defaultDate.split('-').map(Number);\n parsedDate =\n !isNaN(day) && !isNaN(month) && !isNaN(year)\n ? new Date(year, month - 1, day, 12)\n : null;\n break;\n }\n case 'm-d-Y': {\n const [month, day, year] = defaultDate.split('-').map(Number);\n parsedDate =\n !isNaN(month) && !isNaN(day) && !isNaN(year)\n ? new Date(year, month - 1, day, 12)\n : null;\n break;\n }\n default:\n parsedDate = new Date(defaultDate);\n break;\n }\n options.defaultDate = parsedDate || defaultDate;\n }\n }\n }\n if (defaultHour !== undefined && defaultHour !== null)\n options.defaultHour = defaultHour;\n if (defaultMinute !== undefined && defaultMinute !== null)\n options.defaultMinute = defaultMinute;\n if (enable && enable.length > 0) options.enable = enable;\n if (disable && disable.length > 0) {\n options.disable = disable.map((date) => {\n if (date instanceof Date) return date;\n if (typeof date === 'number') return new Date(date);\n if (typeof date === 'string') {\n const parsed = flatpickr.parseDate(date, effectiveDateFormat);\n return parsed || date;\n }\n return date;\n });\n }\n if (appendTo) options.appendTo = appendTo;\n\n return options;\n}\n\nexport function updateEnableTime(dateFormat: string): boolean {\n const df = dateFormat || '';\n return (\n df.includes('H:') || df.includes('h:') || df.toLowerCase().includes(':s')\n );\n}\n\nexport function setCalendarAttributes(\n instance: Instance,\n modalDetected = false\n): void {\n if (!instance || !instance.config) {\n return;\n }\n\n const container = instance.calendarContainer;\n if (!container) return;\n\n const { minDate, maxDate } = instance.config;\n if (minDate && maxDate) {\n const minY = new Date(minDate).getFullYear();\n const maxY = new Date(maxDate).getFullYear();\n if (minY === maxY) {\n container.classList.add('single-year');\n } else {\n container.classList.remove('single-year');\n }\n }\n\n requestAnimationFrame(() => {\n if (!instance || !instance.config) {\n return;\n }\n\n const mode = instance.config.mode as\n | 'single'\n | 'multiple'\n | 'range'\n | 'time';\n\n container.setAttribute('role', 'application');\n container.setAttribute('aria-label', 'Calendar');\n container.classList.remove(\n 'container-modal',\n 'container-body',\n 'container-default'\n );\n container.classList.add(\n modalDetected ? 'container-modal' : 'container-default'\n );\n\n const monthsEl = container.querySelector<HTMLElement>('.flatpickr-months');\n monthsEl?.setAttribute('tabindex', '0');\n monthsEl?.setAttribute('role', 'group');\n monthsEl?.setAttribute('aria-label', 'Month and year navigation');\n\n const prevBtn = container.querySelector<HTMLElement>(\n '.flatpickr-prev-month'\n );\n prevBtn?.setAttribute('tabindex', '0');\n prevBtn?.setAttribute('role', 'button');\n prevBtn?.setAttribute('aria-label', 'Previous month');\n if (prevBtn) {\n const anyPrev = prevBtn as any;\n if (anyPrev._kynKeydown) {\n prevBtn.removeEventListener('keydown', anyPrev._kynKeydown);\n }\n const prevKeydown = (e: KeyboardEvent) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n instance.changeMonth(-1);\n }\n };\n prevBtn.addEventListener('keydown', prevKeydown);\n anyPrev._kynKeydown = prevKeydown;\n }\n\n const nextBtn = container.querySelector<HTMLElement>(\n '.flatpickr-next-month'\n );\n nextBtn?.setAttribute('tabindex', '0');\n nextBtn?.setAttribute('role', 'button');\n nextBtn?.setAttribute('aria-label', 'Next month');\n if (nextBtn) {\n const anyNext = nextBtn as any;\n if (anyNext._kynKeydown) {\n nextBtn.removeEventListener('keydown', anyNext._kynKeydown);\n }\n const nextKeydown = (e: KeyboardEvent) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n instance.changeMonth(1);\n }\n };\n nextBtn.addEventListener('keydown', nextKeydown);\n anyNext._kynKeydown = nextKeydown;\n }\n\n const firstMonth = container.querySelector<HTMLElement>('.flatpickr-month');\n const yearInput = firstMonth?.querySelector<HTMLInputElement>(\n 'input.numInput.cur-year'\n );\n if (yearInput) {\n yearInput.tabIndex = 0;\n yearInput.setAttribute('role', 'spinbutton');\n yearInput.setAttribute('aria-label', 'Year');\n if (instance.config.minDate) {\n yearInput.setAttribute(\n 'aria-valuemin',\n String(new Date(instance.config.minDate!).getFullYear())\n );\n }\n if (instance.config.maxDate) {\n yearInput.setAttribute(\n 'aria-valuemax',\n String(new Date(instance.config.maxDate!).getFullYear())\n );\n }\n const updateNow = () =>\n yearInput.setAttribute('aria-valuenow', yearInput.value);\n\n const anyYear = yearInput as any;\n if (anyYear._kynKeydown) {\n yearInput.removeEventListener('keydown', anyYear._kynKeydown);\n }\n\n const yearKeydown = (e: KeyboardEvent) => {\n if (e.key === 'ArrowUp') {\n e.preventDefault();\n instance.changeYear(1);\n setTimeout(updateNow, 0);\n }\n if (e.key === 'ArrowDown') {\n e.preventDefault();\n instance.changeYear(-1);\n setTimeout(updateNow, 0);\n }\n };\n\n yearInput.addEventListener('keydown', yearKeydown);\n anyYear._kynKeydown = yearKeydown;\n setTimeout(updateNow, 0);\n }\n\n const daysGrid = container.querySelector<HTMLElement>('.flatpickr-days');\n daysGrid?.removeAttribute('tabindex');\n daysGrid?.setAttribute('role', 'grid');\n daysGrid?.setAttribute(\n 'aria-multiselectable',\n mode === 'multiple' ? 'true' : 'false'\n );\n\n const enabledDays = Array.from(\n container.querySelectorAll<HTMLElement>(\n '.flatpickr-day:not(.flatpickr-disabled)'\n )\n );\n enabledDays.forEach((day) => {\n day.tabIndex = 0;\n day.setAttribute('role', mode === 'range' ? 'gridcell' : 'button');\n });\n\n const oldNav = (container as any)._keyboardNav as EventListener | undefined;\n if (oldNav) container.removeEventListener('keydown', oldNav);\n\n const keyboardNav = (e: KeyboardEvent) => {\n const targetDay = (e.target as HTMLElement).closest<HTMLElement>(\n '.flatpickr-day:not(.flatpickr-disabled)'\n );\n if (!targetDay) return;\n\n switch (e.key) {\n case 'Enter':\n case ' ':\n e.preventDefault();\n targetDay.click();\n return;\n case 'ArrowRight':\n case 'ArrowLeft':\n case 'ArrowDown':\n case 'ArrowUp': {\n e.preventDefault();\n const idx = enabledDays.indexOf(targetDay);\n let nextIdx: number;\n switch (e.key) {\n case 'ArrowRight':\n nextIdx = idx + 1;\n break;\n case 'ArrowLeft':\n nextIdx = idx - 1;\n break;\n case 'ArrowDown':\n nextIdx = idx + 7;\n break;\n case 'ArrowUp':\n nextIdx = idx - 7;\n break;\n default:\n return;\n }\n const next = enabledDays[nextIdx];\n if (next) next.focus();\n return;\n }\n }\n };\n container.addEventListener('keydown', keyboardNav);\n (container as any)._keyboardNav = keyboardNav;\n\n const hourInput = container.querySelector<HTMLInputElement>(\n 'input.flatpickr-hour'\n );\n if (hourInput) {\n hourInput.tabIndex = 0;\n hourInput.setAttribute('role', 'spinbutton');\n hourInput.setAttribute('aria-label', 'Hour');\n hourInput.setAttribute('aria-valuemin', hourInput.min);\n hourInput.setAttribute('aria-valuemax', hourInput.max);\n hourInput.setAttribute('aria-valuenow', hourInput.value);\n\n const anyHour = hourInput as any;\n if (anyHour._kynKeydown) {\n hourInput.removeEventListener('keydown', anyHour._kynKeydown);\n }\n\n const hourKeydown = (e: KeyboardEvent) => {\n if (e.key === 'ArrowUp') {\n e.preventDefault();\n hourInput.stepUp();\n }\n if (e.key === 'ArrowDown') {\n e.preventDefault();\n hourInput.stepDown();\n }\n setTimeout(\n () => hourInput.setAttribute('aria-valuenow', hourInput.value),\n 0\n );\n };\n\n hourInput.addEventListener('keydown', hourKeydown);\n anyHour._kynKeydown = hourKeydown;\n\n // add click handlers for hour arrow buttons\n const hourWrapper = hourInput.closest('.numInputWrapper');\n if (hourWrapper) {\n const hourArrowUp = hourWrapper.querySelector<HTMLElement>('.arrowUp');\n const hourArrowDown =\n hourWrapper.querySelector<HTMLElement>('.arrowDown');\n\n if (hourArrowUp) {\n const anyArrowUp = hourArrowUp as any;\n if (anyArrowUp._kynClick) {\n hourArrowUp.removeEventListener('click', anyArrowUp._kynClick);\n }\n const arrowUpClick = () => {\n hourInput.stepUp();\n hourInput.dispatchEvent(new Event('input', { bubbles: true }));\n setTimeout(\n () => hourInput.setAttribute('aria-valuenow', hourInput.value),\n 0\n );\n };\n hourArrowUp.addEventListener('click', arrowUpClick);\n anyArrowUp._kynClick = arrowUpClick;\n }\n\n if (hourArrowDown) {\n const anyArrowDown = hourArrowDown as any;\n if (anyArrowDown._kynClick) {\n hourArrowDown.removeEventListener('click', anyArrowDown._kynClick);\n }\n const arrowDownClick = () => {\n hourInput.stepDown();\n hourInput.dispatchEvent(new Event('input', { bubbles: true }));\n setTimeout(\n () => hourInput.setAttribute('aria-valuenow', hourInput.value),\n 0\n );\n };\n hourArrowDown.addEventListener('click', arrowDownClick);\n anyArrowDown._kynClick = arrowDownClick;\n }\n }\n }\n\n const minuteInput = container.querySelector<HTMLInputElement>(\n 'input.flatpickr-minute'\n );\n if (minuteInput) {\n minuteInput.tabIndex = 0;\n minuteInput.setAttribute('role', 'spinbutton');\n minuteInput.setAttribute('aria-label', 'Minute');\n minuteInput.setAttribute('aria-valuemin', minuteInput.min);\n minuteInput.setAttribute('aria-valuemax', minuteInput.max);\n minuteInput.setAttribute('aria-valuenow', minuteInput.value);\n\n const anyMinute = minuteInput as any;\n if (anyMinute._kynKeydown) {\n minuteInput.removeEventListener('keydown', anyMinute._kynKeydown);\n }\n\n const minuteKeydown = (e: KeyboardEvent) => {\n if (e.key === 'ArrowUp') {\n e.preventDefault();\n minuteInput.stepUp();\n }\n if (e.key === 'ArrowDown') {\n e.preventDefault();\n minuteInput.stepDown();\n }\n setTimeout(\n () => minuteInput.setAttribute('aria-valuenow', minuteInput.value),\n 0\n );\n };\n\n minuteInput.addEventListener('keydown', minuteKeydown);\n anyMinute._kynKeydown = minuteKeydown;\n\n // add click handlers for minute arrow buttons\n const minuteWrapper = minuteInput.closest('.numInputWrapper');\n if (minuteWrapper) {\n const minuteArrowUp =\n minuteWrapper.querySelector<HTMLElement>('.arrowUp');\n const minuteArrowDown =\n minuteWrapper.querySelector<HTMLElement>('.arrowDown');\n\n if (minuteArrowUp) {\n const anyArrowUp = minuteArrowUp as any;\n if (anyArrowUp._kynClick) {\n minuteArrowUp.removeEventListener('click', anyArrowUp._kynClick);\n }\n const arrowUpClick = () => {\n minuteInput.stepUp();\n minuteInput.dispatchEvent(new Event('input', { bubbles: true }));\n setTimeout(\n () =>\n minuteInput.setAttribute('aria-valuenow', minuteInput.value),\n 0\n );\n };\n minuteArrowUp.addEventListener('click', arrowUpClick);\n anyArrowUp._kynClick = arrowUpClick;\n }\n\n if (minuteArrowDown) {\n const anyArrowDown = minuteArrowDown as any;\n if (anyArrowDown._kynClick) {\n minuteArrowDown.removeEventListener(\n 'click',\n anyArrowDown._kynClick\n );\n }\n const arrowDownClick = () => {\n minuteInput.stepDown();\n minuteInput.dispatchEvent(new Event('input', { bubbles: true }));\n setTimeout(\n () =>\n minuteInput.setAttribute('aria-valuenow', minuteInput.value),\n 0\n );\n };\n minuteArrowDown.addEventListener('click', arrowDownClick);\n anyArrowDown._kynClick = arrowDownClick;\n }\n }\n }\n\n // add seconds input handling if present\n const secondInput = container.querySelector<HTMLInputElement>(\n 'input.flatpickr-second'\n );\n if (secondInput) {\n secondInput.tabIndex = 0;\n secondInput.setAttribute('role', 'spinbutton');\n secondInput.setAttribute('aria-label', 'Second');\n secondInput.setAttribute('aria-valuemin', secondInput.min);\n secondInput.setAttribute('aria-valuemax', secondInput.max);\n secondInput.setAttribute('aria-valuenow', secondInput.value);\n\n const anySecond = secondInput as any;\n if (anySecond._kynKeydown) {\n secondInput.removeEventListener('keydown', anySecond._kynKeydown);\n }\n\n const secondKeydown = (e: KeyboardEvent) => {\n if (e.key === 'ArrowUp') {\n e.preventDefault();\n secondInput.stepUp();\n }\n if (e.key === 'ArrowDown') {\n e.preventDefault();\n secondInput.stepDown();\n }\n setTimeout(\n () => secondInput.setAttribute('aria-valuenow', secondInput.value),\n 0\n );\n };\n\n secondInput.addEventListener('keydown', secondKeydown);\n anySecond._kynKeydown = secondKeydown;\n\n // add click handlers for second arrow buttons\n const secondWrapper = secondInput.closest('.numInputWrapper');\n if (secondWrapper) {\n const secondArrowUp =\n secondWrapper.querySelector<HTMLElement>('.arrowUp');\n const secondArrowDown =\n secondWrapper.querySelector<HTMLElement>('.arrowDown');\n\n if (secondArrowUp) {\n const anyArrowUp = secondArrowUp as any;\n if (anyArrowUp._kynClick) {\n secondArrowUp.removeEventListener('click', anyArrowUp._kynClick);\n }\n const arrowUpClick = () => {\n secondInput.stepUp();\n secondInput.dispatchEvent(new Event('input', { bubbles: true }));\n setTimeout(\n () =>\n secondInput.setAttribute('aria-valuenow', secondInput.value),\n 0\n );\n };\n secondArrowUp.addEventListener('click', arrowUpClick);\n anyArrowUp._kynClick = arrowUpClick;\n }\n\n if (secondArrowDown) {\n const anyArrowDown = secondArrowDown as any;\n if (anyArrowDown._kynClick) {\n secondArrowDown.removeEventListener(\n 'click',\n anyArrowDown._kynClick\n );\n }\n const arrowDownClick = () => {\n secondInput.stepDown();\n secondInput.dispatchEvent(new Event('input', { bubbles: true }));\n setTimeout(\n () =>\n secondInput.setAttribute('aria-valuenow', secondInput.value),\n 0\n );\n };\n secondArrowDown.addEventListener('click', arrowDownClick);\n anyArrowDown._kynClick = arrowDownClick;\n }\n }\n }\n\n const ampmToggle = container.querySelector<HTMLElement>('.flatpickr-am-pm');\n if (ampmToggle) {\n ampmToggle.tabIndex = 0;\n ampmToggle.setAttribute('role', 'button');\n ampmToggle.setAttribute('aria-label', 'Toggle AM/PM');\n\n const anyAmPm = ampmToggle as any;\n if (anyAmPm._kynKeydown) {\n ampmToggle.removeEventListener('keydown', anyAmPm._kynKeydown);\n }\n const ampmKeydown = (e: KeyboardEvent) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n ampmToggle.click();\n }\n };\n ampmToggle.addEventListener('keydown', ampmKeydown);\n anyAmPm._kynKeydown = ampmKeydown;\n }\n });\n}\n\nexport function hideEmptyYear(): void {\n // force year input to always be visible - don't hide it even when min === max\n document.querySelectorAll('.numInputWrapper').forEach((wrapper) => {\n const yearInput = wrapper.querySelector(\n '.numInput.cur-year'\n ) as HTMLInputElement;\n if (yearInput) {\n (wrapper as HTMLElement).style.display = '';\n\n yearInput.style.display = '';\n yearInput.disabled = false;\n\n if (!yearInput.hasAttribute('tabindex')) {\n yearInput.tabIndex = 0;\n }\n }\n });\n}\n\nexport function emitValue(\n element: HTMLElement,\n eventName: string,\n detail: any\n): void {\n element.dispatchEvent(\n new CustomEvent(eventName, {\n detail,\n bubbles: true,\n composed: true,\n })\n );\n}\n\nexport async function clearFlatpickrInput(\n flatpickrInstance: Instance | undefined,\n inputEl: HTMLInputElement | undefined,\n updateCallback?: () => void\n): Promise<void> {\n if (flatpickrInstance) {\n flatpickrInstance.clear();\n }\n\n if (inputEl) {\n inputEl.value = '';\n }\n\n if (updateCallback) {\n await updateCallback();\n }\n}\n\nexport enum DateRangeEditableMode {\n BOTH = 'both',\n START = 'start',\n END = 'end',\n NONE = 'none',\n}\n\nexport function createDateRangeDayLockHandler(\n editableMode: DateRangeEditableMode,\n currentValue: [Date | null, Date | null]\n): (\n dObj: Date,\n dStr: string,\n fp: Instance,\n dayElem: HTMLElement & { dateObj: Date }\n) => void {\n return (_dObj, _dStr, _fp, dayElem: HTMLElement & { dateObj: Date }) => {\n const currentDate = dayElem.dateObj;\n\n if (\n editableMode === DateRangeEditableMode.END &&\n currentValue[0] !== null\n ) {\n if (currentDate.getTime() <= currentValue[0].getTime()) {\n if (currentDate.getTime() === currentValue[0].getTime()) {\n dayElem.classList.add('flatpickr-locked-date');\n dayElem.setAttribute('title', getTextStrings().dateNotAvailable);\n dayElem.setAttribute('locked', 'start');\n dayElem.setAttribute('aria-disabled', 'true');\n } else {\n dayElem.classList.add('flatpickr-locked-date', 'flatpickr-disabled');\n dayElem.setAttribute('title', getTextStrings().lockedStartDate);\n }\n }\n } else if (\n editableMode === DateRangeEditableMode.START &&\n currentValue[1] !== null\n ) {\n if (currentDate.getTime() >= currentValue[1].getTime()) {\n if (currentDate.getTime() === currentValue[1].getTime()) {\n dayElem.classList.add('flatpickr-locked-date');\n dayElem.setAttribute('title', getTextStrings().lockedEndDate);\n dayElem.setAttribute('locked', 'end');\n dayElem.setAttribute('aria-disabled', 'true');\n } else {\n dayElem.classList.add('flatpickr-locked-date', 'flatpickr-disabled');\n dayElem.setAttribute('title', getTextStrings().dateNotAvailable);\n }\n }\n } else if (\n editableMode === DateRangeEditableMode.NONE &&\n currentValue[0] !== null &&\n currentValue[1] !== null\n ) {\n if (currentDate.getTime() === currentValue[0].getTime()) {\n dayElem.classList.add('flatpickr-locked-date');\n dayElem.setAttribute('title', getTextStrings().dateLocked);\n dayElem.setAttribute('locked', 'start');\n dayElem.setAttribute('aria-disabled', 'true');\n } else if (currentDate.getTime() === currentValue[1].getTime()) {\n dayElem.classList.add('flatpickr-locked-date');\n dayElem.setAttribute('title', getTextStrings().dateLocked);\n dayElem.setAttribute('locked', 'end');\n dayElem.setAttribute('aria-disabled', 'true');\n } else if (\n currentDate.getTime() > currentValue[0].getTime() &&\n currentDate.getTime() < currentValue[1].getTime()\n ) {\n dayElem.classList.add('flatpickr-locked-date');\n dayElem.setAttribute('title', getTextStrings().dateInSelectedRange);\n } else {\n dayElem.classList.add('flatpickr-locked-date', 'flatpickr-disabled');\n dayElem.setAttribute('title', getTextStrings().dateNotAvailable);\n }\n }\n\n if (\n dayElem.classList.contains('flatpickr-disabled') &&\n !dayElem.classList.contains('flatpickr-locked-date')\n ) {\n dayElem.classList.add('flatpickr-locked-date');\n }\n };\n}\n\nexport function createDateRangeChangeLockHandler(\n editableMode: DateRangeEditableMode,\n currentValue: [Date | null, Date | null],\n originalOnChange: Hook | Hook[]\n): (selectedDates: Date[], dateStr: string, instance: Instance) => void {\n return (selectedDates, dateStr, instance) => {\n let lockedStartDate: Date | null = null;\n let lockedEndDate: Date | null = null;\n\n if (\n editableMode === DateRangeEditableMode.END &&\n currentValue[0] !== null\n ) {\n lockedStartDate = currentValue[0];\n }\n if (\n editableMode === DateRangeEditableMode.START &&\n currentValue[1] !== null\n ) {\n lockedEndDate = currentValue[1];\n }\n\n if (editableMode === DateRangeEditableMode.NONE) {\n if (currentValue[0] !== null && currentValue[1] !== null) {\n instance.setDate([currentValue[0], currentValue[1]], false);\n return;\n }\n }\n\n if (currentValue[0] === null && currentValue[1] === null) {\n callOriginalOnChange(originalOnChange, selectedDates, dateStr, instance);\n return;\n }\n\n if (\n editableMode === DateRangeEditableMode.END &&\n lockedStartDate !== null\n ) {\n let modified = false;\n const newDates = [...selectedDates];\n\n if (\n selectedDates.length === 2 &&\n selectedDates[0].getTime() !== lockedStartDate.getTime()\n ) {\n newDates[0] = lockedStartDate;\n modified = true;\n } else if (selectedDates.length === 1) {\n newDates.splice(0, 0, lockedStartDate);\n modified = true;\n }\n\n if (modified) {\n instance.setDate(newDates, false);\n callOriginalOnChange(\n originalOnChange,\n newDates,\n instance.input.value,\n instance\n );\n return;\n }\n }\n\n if (\n editableMode === DateRangeEditableMode.START &&\n lockedEndDate !== null\n ) {\n let modified = false;\n const newDates = [...selectedDates];\n\n if (\n selectedDates.length === 2 &&\n selectedDates[1].getTime() !== lockedEndDate.getTime()\n ) {\n newDates[1] = lockedEndDate;\n modified = true;\n } else if (selectedDates.length === 1) {\n newDates.push(lockedEndDate);\n modified = true;\n }\n\n if (modified) {\n instance.setDate(newDates, false);\n callOriginalOnChange(\n originalOnChange,\n newDates,\n instance.input.value,\n instance\n );\n return;\n }\n }\n\n callOriginalOnChange(originalOnChange, selectedDates, dateStr, instance);\n };\n}\n\nfunction callOriginalOnChange(\n originalOnChange: Hook | Hook[],\n selectedDates: Date[],\n dateStr: string,\n instance: Instance\n): void {\n try {\n if (typeof originalOnChange === 'function') {\n originalOnChange(selectedDates, dateStr, instance);\n } else if (Array.isArray(originalOnChange)) {\n originalOnChange.forEach((hook) => {\n if (typeof hook === 'function') {\n try {\n hook(selectedDates, dateStr, instance);\n } catch (e) {\n console.warn('Error in onChange hook:', e);\n }\n }\n });\n }\n } catch (e) {\n console.warn('Error calling original onChange handler:', e);\n }\n}\n\nexport function applyDateRangeEditingRestrictions(\n options: Partial<BaseOptions>,\n editableMode: DateRangeEditableMode,\n currentValue: [Date | null, Date | null],\n tooltipStrings?: FlatpickrTextStrings\n): Partial<BaseOptions> {\n if (tooltipStrings) {\n setTooltipStrings(tooltipStrings);\n }\n const newOptions = { ...options };\n\n if (editableMode === DateRangeEditableMode.BOTH) {\n return newOptions;\n }\n\n const originalOnChange = newOptions.onChange;\n\n newOptions.clickOpens = true;\n\n try {\n newOptions.onDayCreate = createDateRangeDayLockHandler(\n editableMode,\n currentValue\n ) as any;\n\n newOptions.onChange = createDateRangeChangeLockHandler(\n editableMode,\n currentValue,\n originalOnChange || (() => {})\n );\n } catch (e) {\n console.warn('Error setting up date range editing restrictions:', e);\n }\n\n return newOptions;\n}\n"],"names":["flatpickrStylesInjected","_defaultCalendarTooltipStrings","lockedStartDate","lockedEndDate","dateLocked","dateNotAvailable","dateInSelectedRange","currentTooltipStrings","setTooltipStrings","customTextStrings","getTextStrings","DATE_FORMAT_OPTIONS","preventFlatpickrOpen","event","setShouldFlatpickrOpen","preventDefault","stopPropagation","stopImmediatePropagation","handleInputClick","handleInputFocus","shouldFlatpickrOpen","closeFlatpickr","modifyWeekdayShorthands","localeOptions","weekdays","_a","shorthand","map","day","charAt","injectFlatpickrStyles","customStyle","styleElement","document","createElement","id","textContent","head","appendChild","async","initializeMultiAnchorFlatpickr","context","inputEl","endinputEl","getFlatpickrOptions","setCalendarAttributes","setInitialDates","options","getInputElement","el","HTMLInputElement","input","querySelector","type","style","display","isConnected","Error","error","console","inputElement","endInputElement","plugins","rangePlugin","flatpickrInstance","flatpickr","setTimeout","__anchorClickHandlers","handler","open","addEventListener","push","fn","initializeSingleAnchorFlatpickr","appendTo","effectiveDateFormat","dateFormat","mode","clickOpens","targetElement","positionElement","isValidDateFormat","format","getPlaceholder","isDateRange","loadLocale","locale","loadLocaleFromLangs","getModalContainer","element","node","ShadowRoot","host","Element","tag","tagName","toLowerCase","parentNode","body","enableTime","twentyFourHourFormat","allowInput","minDate","maxDate","minTime","maxTime","defaultDate","defaultHour","defaultMinute","enable","disable","closeOnSelect","wrap","noCalendar","onChange","onClose","onOpen","warn","English","baseLocale","split","isEnglishOr12HourLocale","includes","isWideScreen","window","innerWidth","modalContainer","inOverlay","enableSeconds","time_24hr","weekNumbers","static","showMonths","monthSelectorType","selectedDates","dateStr","instance","calendarContainer","timeContainer","length","classList","add","remove","fixedOverlayPositionPlugin","offset","minViewportMargin","preferTop","onReady","_","__","Array","isArray","parsedDate","year","month","Number","isNaN","Date","date","parseDate","updateEnableTime","df","modalDetected","config","container","getFullYear","requestAnimationFrame","setAttribute","monthsEl","prevBtn","anyPrev","_kynKeydown","removeEventListener","prevKeydown","e","key","changeMonth","nextBtn","anyNext","nextKeydown","firstMonth","yearInput","tabIndex","String","updateNow","value","anyYear","yearKeydown","changeYear","daysGrid","removeAttribute","enabledDays","from","querySelectorAll","forEach","oldNav","_keyboardNav","keyboardNav","targetDay","target","closest","click","idx","indexOf","nextIdx","next","focus","hourInput","min","max","anyHour","hourKeydown","stepUp","stepDown","hourWrapper","hourArrowUp","hourArrowDown","anyArrowUp","_kynClick","arrowUpClick","dispatchEvent","Event","bubbles","anyArrowDown","arrowDownClick","minuteInput","anyMinute","minuteKeydown","minuteWrapper","minuteArrowUp","minuteArrowDown","secondInput","anySecond","secondKeydown","secondWrapper","secondArrowUp","secondArrowDown","ampmToggle","anyAmPm","ampmKeydown","hideEmptyYear","wrapper","disabled","hasAttribute","emitValue","eventName","detail","CustomEvent","composed","clearFlatpickrInput","updateCallback","clear","DateRangeEditableMode","createDateRangeDayLockHandler","editableMode","currentValue","_dObj","_dStr","_fp","dayElem","currentDate","dateObj","END","getTime","START","NONE","contains","createDateRangeChangeLockHandler","originalOnChange","modified","newDates","splice","setDate","callOriginalOnChange","hook","applyDateRangeEditingRestrictions","tooltipStrings","newOptions","BOTH","onDayCreate"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"flatpickr.js","sources":["../../../../src/common/helpers/flatpickr/flatpickr.ts"],"sourcesContent":["import flatpickr from 'flatpickr';\nimport rangePlugin from 'flatpickr/dist/esm/plugins/rangePlugin.js';\nimport { Instance } from 'flatpickr/dist/types/instance';\nimport { BaseOptions, Hook } from 'flatpickr/dist/types/options';\nimport { Locale } from 'flatpickr/dist/types/locale';\nimport { default as English } from 'flatpickr/dist/esm/l10n/default.js';\nimport { loadLocale as loadLocaleFromLangs } from './langs';\nimport { fixedOverlayPositionPlugin } from './overlay';\n\nlet flatpickrStylesInjected = false;\n\nexport const _defaultCalendarTooltipStrings = {\n lockedStartDate: 'Start date is locked',\n lockedEndDate: 'End date is locked',\n dateLocked: 'Date is locked',\n dateNotAvailable: 'Date is not available',\n dateInSelectedRange: 'Date is in selected range',\n};\n\nexport type FlatpickrTextStrings = Partial<\n typeof _defaultCalendarTooltipStrings\n>;\n\nlet currentTooltipStrings = { ..._defaultCalendarTooltipStrings };\n\nexport function setTooltipStrings(\n customTextStrings: FlatpickrTextStrings = {}\n): void {\n currentTooltipStrings = {\n ..._defaultCalendarTooltipStrings,\n ...customTextStrings,\n };\n}\n\nexport function getTextStrings(\n customTextStrings: FlatpickrTextStrings = {}\n): typeof _defaultCalendarTooltipStrings {\n return { ...currentTooltipStrings, ...customTextStrings };\n}\n\ninterface BaseFlatpickrContext {\n getFlatpickrOptions: () => Promise<Partial<BaseOptions>>;\n setCalendarAttributes: (instance: Instance) => void;\n setInitialDates?: (instance: Instance) => void;\n}\n\ninterface SingleFlatpickrContext extends BaseFlatpickrContext {\n inputEl: HTMLElement;\n}\n\ninterface RangeFlatpickrContext extends BaseFlatpickrContext {\n inputEl: HTMLElement;\n endinputEl?: HTMLElement;\n}\n\nconst DATE_FORMAT_OPTIONS = {\n 'Y-m-d': 'yyyy-mm-dd',\n 'm-d-Y': 'mm-dd-yyyy',\n 'd-m-Y': 'dd-mm-yyyy',\n 'Y-m-d H:i': 'yyyy-mm-dd —— : ——',\n 'Y-m-d h:i K': 'yyyy-mm-dd —— : ——',\n 'm-d-Y H:i': 'mm-dd-yyyy —— : ——',\n 'm-d-Y h:i K': 'mm-dd-yyyy —— : ——',\n 'd-m-Y H:i': 'dd-mm-yyyy —— : ——',\n 'd-m-Y h:i K': 'dd-mm-yyyy —— : ——',\n 'Y-m-d H:i:s': 'yyyy-mm-dd —— : —— ——',\n 'Y-m-d H:i:S': 'yyyy-mm-dd —— : —— ——',\n 'm-d-Y H:i:s': 'mm-dd-yyyy —— : —— ——',\n 'm-d-Y H:i:S': 'mm-dd-yyyy —— : —— ——',\n 'd-m-Y H:i:s': 'dd-mm-yyyy —— : —— ——',\n 'd-m-Y H:i:S': 'dd-mm-yyyy —— : —— ——',\n} as const;\n\ntype DateFormatOption = keyof typeof DATE_FORMAT_OPTIONS;\n\ninterface FlatpickrOptionsContext {\n locale: string;\n dateFormat?: string;\n /** @deprecated Prefer passing pre-normalized `value` and using setInitialDates in the component. */\n defaultDate?: string | Date | string[] | Date[];\n defaultHour?: number;\n defaultMinute?: number;\n enableTime: boolean;\n twentyFourHourFormat?: boolean;\n endinputEl?: HTMLElement;\n inputEl: HTMLElement;\n allowInput?: boolean;\n minDate?: string | number | Date;\n maxDate?: string | number | Date;\n minTime?: string | number | Date;\n maxTime?: string | number | Date;\n enable?: (string | number | Date)[];\n disable?: (string | number | Date)[];\n onChange?: Hook;\n onClose?: Hook;\n onOpen?: Hook;\n onReady?: Hook;\n loadLocale: (locale: string) => Promise<Partial<Locale>>;\n mode?: 'single' | 'multiple' | 'range' | 'time';\n closeOnSelect?: boolean;\n wrap?: boolean;\n noCalendar?: boolean;\n appendTo?: HTMLElement;\n static?: boolean;\n}\n\nexport function preventFlatpickrOpen(\n event: Event,\n setShouldFlatpickrOpen: (value: boolean) => void\n): void {\n event.preventDefault();\n event.stopPropagation();\n event.stopImmediatePropagation();\n setShouldFlatpickrOpen(false);\n}\n\nexport function handleInputClick(\n setShouldFlatpickrOpen: (value: boolean) => void\n): void {\n setShouldFlatpickrOpen(true);\n}\n\nexport function handleInputFocus(\n shouldFlatpickrOpen: boolean,\n closeFlatpickr: () => void,\n setShouldFlatpickrOpen: (value: boolean) => void\n): void {\n if (!shouldFlatpickrOpen) {\n closeFlatpickr();\n setShouldFlatpickrOpen(true);\n }\n}\n\nexport function modifyWeekdayShorthands(localeOptions: Partial<Locale>): void {\n if (localeOptions.weekdays?.shorthand) {\n localeOptions.weekdays.shorthand = localeOptions.weekdays.shorthand.map(\n (day) => day.charAt(0)\n ) as [string, string, string, string, string, string, string];\n }\n}\n\nexport function injectFlatpickrStyles(customStyle: string): void {\n if (!flatpickrStylesInjected) {\n const styleElement = document.createElement('style');\n styleElement.id = 'flatpickr-custom-styles';\n styleElement.textContent = customStyle;\n document.head.appendChild(styleElement);\n flatpickrStylesInjected = true;\n }\n}\n\nexport async function initializeMultiAnchorFlatpickr(\n context: RangeFlatpickrContext\n): Promise<Instance | undefined> {\n const {\n inputEl,\n endinputEl,\n getFlatpickrOptions,\n setCalendarAttributes,\n setInitialDates,\n } = context;\n\n if (!inputEl) {\n console.error('Cannot initialize Flatpickr: inputEl is undefined');\n return undefined;\n }\n\n try {\n const options = await getFlatpickrOptions();\n\n const getInputElement = (el: HTMLElement): HTMLInputElement => {\n if (el instanceof HTMLInputElement) {\n return el;\n } else {\n try {\n let input = el.querySelector('input') as HTMLInputElement | null;\n if (!input) {\n input = document.createElement('input');\n input.type = 'text';\n input.style.display = 'none';\n if (!el.isConnected) {\n throw new Error('Element is not connected to the DOM');\n }\n el.appendChild(input);\n }\n return input;\n } catch (error) {\n console.error('Error creating or appending input element:', error);\n throw error;\n }\n }\n };\n\n const inputElement = getInputElement(inputEl);\n if (endinputEl) {\n const endInputElement = getInputElement(endinputEl);\n options.plugins = [\n ...(options.plugins || []),\n rangePlugin({ input: endInputElement }),\n ];\n }\n\n const flatpickrInstance = flatpickr(inputElement, options) as Instance;\n\n if (flatpickrInstance) {\n setTimeout(() => {\n if (setCalendarAttributes) {\n setCalendarAttributes(flatpickrInstance);\n }\n }, 0);\n\n if (setInitialDates) {\n setInitialDates(flatpickrInstance);\n }\n\n const __anchorClickHandlers: { el: HTMLElement; fn: EventListener }[] =\n [];\n\n if (!(inputEl instanceof HTMLInputElement)) {\n const handler = () => {\n flatpickrInstance.open();\n };\n inputEl.addEventListener('click', handler);\n __anchorClickHandlers.push({ el: inputEl, fn: handler });\n }\n\n if (endinputEl && !(endinputEl instanceof HTMLInputElement)) {\n const handler = () => {\n flatpickrInstance.open();\n };\n endinputEl.addEventListener('click', handler);\n __anchorClickHandlers.push({ el: endinputEl, fn: handler });\n }\n\n (flatpickrInstance as any).__anchorClickHandlers = __anchorClickHandlers;\n\n return flatpickrInstance;\n } else {\n console.error('Failed to initialize Flatpickr');\n return undefined;\n }\n } catch (error) {\n console.error('Error initializing Flatpickr:', error);\n return undefined;\n }\n}\n\nexport async function initializeSingleAnchorFlatpickr(\n context: SingleFlatpickrContext & { appendTo?: HTMLElement }\n): Promise<Instance | undefined> {\n const {\n inputEl,\n getFlatpickrOptions,\n setCalendarAttributes,\n setInitialDates,\n appendTo,\n } = context;\n if (!inputEl) {\n console.error('Cannot initialize Flatpickr: inputEl is undefined');\n return undefined;\n }\n try {\n const options = await getFlatpickrOptions();\n const effectiveDateFormat =\n options.dateFormat || (options.mode === 'time' ? 'H:i' : 'Y-m-d');\n options.dateFormat = effectiveDateFormat;\n\n let inputElement: HTMLInputElement;\n if (inputEl instanceof HTMLInputElement) {\n inputElement = inputEl;\n options.clickOpens = true;\n } else {\n try {\n inputElement = document.createElement('input');\n inputElement.type = 'text';\n inputElement.style.display = 'none';\n\n const targetElement = appendTo || inputEl;\n if (!targetElement) {\n throw new Error('No valid element to append input to');\n }\n\n targetElement.appendChild(inputElement);\n options.clickOpens = false;\n options.positionElement = inputEl;\n } catch (error) {\n console.error('Error creating input element:', error);\n throw error;\n }\n }\n const flatpickrInstance = flatpickr(inputElement, options) as Instance;\n if (flatpickrInstance) {\n setTimeout(() => {\n if (setCalendarAttributes) {\n setCalendarAttributes(flatpickrInstance);\n }\n }, 0);\n if (setInitialDates) {\n setInitialDates(flatpickrInstance);\n }\n\n if (!(inputEl instanceof HTMLInputElement)) {\n const handler = () => flatpickrInstance.open();\n inputEl.addEventListener('click', handler);\n (flatpickrInstance as any).__anchorClickHandlers = [\n { el: inputEl, fn: handler },\n ];\n }\n\n return flatpickrInstance;\n } else {\n console.error('Failed to initialize Flatpickr');\n return undefined;\n }\n } catch (error) {\n console.error('Error initializing Flatpickr:', error);\n return undefined;\n }\n}\n\nexport function isValidDateFormat(format: string): format is DateFormatOption {\n return format in DATE_FORMAT_OPTIONS;\n}\n\nexport function getPlaceholder(\n dateFormat: string,\n isDateRange?: boolean\n): string {\n if (!dateFormat) {\n return isDateRange ? 'yyyy-mm-dd to yyyy-mm-dd' : 'yyyy-mm-dd';\n }\n\n if (isValidDateFormat(dateFormat)) {\n const placeholder = isDateRange\n ? `${DATE_FORMAT_OPTIONS[dateFormat]} to ${DATE_FORMAT_OPTIONS[dateFormat]}`\n : DATE_FORMAT_OPTIONS[dateFormat];\n return placeholder;\n }\n return 'Select date';\n}\n\nexport function loadLocale(locale: string): Promise<Partial<Locale>> {\n return loadLocaleFromLangs(locale);\n}\n\nexport function getModalContainer(element: HTMLElement): HTMLElement {\n let node: Node | null = element;\n\n while (node) {\n if (node instanceof ShadowRoot) {\n node = node.host;\n continue;\n }\n\n if (node instanceof Element) {\n const tag = node.tagName.toLowerCase();\n if (tag === 'kyn-modal' || tag === 'kyn-side-drawer') {\n return node as HTMLElement;\n }\n node = node.parentNode;\n continue;\n }\n\n break;\n }\n\n return document.body;\n}\n\nexport async function getFlatpickrOptions(\n context: FlatpickrOptionsContext\n): Promise<Partial<BaseOptions>> {\n if (!context) {\n console.error('Context is required for getFlatpickrOptions');\n return {};\n }\n\n const {\n locale,\n dateFormat,\n enableTime,\n twentyFourHourFormat,\n inputEl,\n allowInput,\n minDate,\n maxDate,\n minTime,\n maxTime,\n defaultDate,\n defaultHour,\n defaultMinute,\n enable,\n disable,\n mode = 'single',\n closeOnSelect,\n wrap = false,\n noCalendar = false,\n appendTo,\n onChange,\n onClose,\n onOpen,\n loadLocale,\n } = context;\n\n if (!locale) {\n console.warn('Locale not provided. Falling back to default.');\n }\n\n if (!dateFormat) {\n console.warn('Date format not provided. Using default format.');\n }\n\n let localeOptions;\n try {\n localeOptions = await loadLocale(locale);\n modifyWeekdayShorthands(localeOptions);\n } catch (error) {\n console.warn('Error loading locale, falling back to default:', error);\n localeOptions = English;\n }\n\n const baseLocale = locale.split('-')[0].toLowerCase();\n const isEnglishOr12HourLocale = ['en', 'es'].includes(baseLocale);\n\n const isWideScreen =\n typeof window !== 'undefined' && window.innerWidth >= 767;\n\n const effectiveDateFormat =\n dateFormat ||\n (mode === 'time' ? (twentyFourHourFormat ? 'H:i' : 'h:i K') : 'Y-m-d');\n\n const modalContainer = getModalContainer(context.inputEl);\n const inOverlay = modalContainer !== document.body;\n\n const options: Partial<BaseOptions> = {\n dateFormat: effectiveDateFormat,\n mode: mode === 'time' ? 'single' : mode,\n enableTime: mode === 'time' ? true : enableTime,\n noCalendar: mode === 'time' ? true : noCalendar,\n defaultDate: defaultDate,\n enableSeconds: effectiveDateFormat.toLowerCase().includes(':s'),\n allowInput: allowInput || false,\n clickOpens: true,\n time_24hr:\n typeof twentyFourHourFormat === 'boolean'\n ? twentyFourHourFormat\n : !isEnglishOr12HourLocale,\n weekNumbers: false,\n static: context.static ?? false,\n wrap,\n showMonths: mode === 'range' && isWideScreen ? 2 : 1,\n monthSelectorType: 'static',\n locale: localeOptions,\n closeOnSelect: closeOnSelect ?? !(mode === 'multiple' || enableTime),\n onChange: (selectedDates, dateStr, instance) => {\n onChange && onChange(selectedDates, dateStr, instance);\n },\n onClose: (selectedDates, dateStr, instance) => {\n if (mode === 'range' && instance.calendarContainer) {\n const timeContainer =\n instance.calendarContainer.querySelector('.flatpickr-time');\n if (selectedDates.length === 0) {\n timeContainer?.classList.add('default-time-select');\n timeContainer?.classList.remove('start-date', 'end-date');\n }\n }\n onClose && onClose(selectedDates, dateStr, instance);\n },\n onOpen: (selectedDates, dateStr, instance) => {\n onOpen && onOpen(selectedDates, dateStr, instance);\n },\n };\n\n if (inOverlay) {\n options.appendTo = modalContainer;\n options.static = false;\n (options.plugins ||= []).push(\n fixedOverlayPositionPlugin({\n offset: 6,\n minViewportMargin: 8,\n preferTop: false,\n }) as any\n );\n }\n\n if (mode === 'range') {\n options.onReady = (_, __, instance) => {\n if (instance.calendarContainer) {\n const timeContainer =\n instance.calendarContainer.querySelector('.flatpickr-time');\n timeContainer?.classList.add('default-time-select');\n }\n };\n }\n\n if (!(inputEl instanceof HTMLInputElement)) {\n options.positionElement = inputEl;\n }\n\n if (minDate) options.minDate = minDate;\n if (maxDate) options.maxDate = maxDate;\n if (minTime) options.minTime = minTime;\n if (maxTime) options.maxTime = maxTime;\n\n if (defaultDate) {\n if (\n Array.isArray(defaultDate) &&\n (mode === 'range' || mode === 'multiple')\n ) {\n options.defaultDate = defaultDate;\n } else if (!Array.isArray(defaultDate)) {\n if (typeof defaultDate === 'string') {\n let parsedDate: Date | null = null;\n switch (effectiveDateFormat) {\n case 'Y-m-d': {\n const [year, month, day] = defaultDate.split('-').map(Number);\n parsedDate =\n !isNaN(year) && !isNaN(month) && !isNaN(day)\n ? new Date(year, month - 1, day, 12)\n : null;\n break;\n }\n case 'd-m-Y': {\n const [day, month, year] = defaultDate.split('-').map(Number);\n parsedDate =\n !isNaN(day) && !isNaN(month) && !isNaN(year)\n ? new Date(year, month - 1, day, 12)\n : null;\n break;\n }\n case 'm-d-Y': {\n const [month, day, year] = defaultDate.split('-').map(Number);\n parsedDate =\n !isNaN(month) && !isNaN(day) && !isNaN(year)\n ? new Date(year, month - 1, day, 12)\n : null;\n break;\n }\n default:\n parsedDate = new Date(defaultDate);\n break;\n }\n options.defaultDate = parsedDate || defaultDate;\n }\n }\n }\n if (defaultHour !== undefined && defaultHour !== null)\n options.defaultHour = defaultHour;\n if (defaultMinute !== undefined && defaultMinute !== null)\n options.defaultMinute = defaultMinute;\n if (enable && enable.length > 0) options.enable = enable;\n if (disable && disable.length > 0) {\n options.disable = disable.map((date) => {\n if (date instanceof Date) return date;\n if (typeof date === 'number') return new Date(date);\n if (typeof date === 'string') {\n const parsed = flatpickr.parseDate(date, effectiveDateFormat);\n return parsed || date;\n }\n return date;\n });\n }\n if (appendTo) options.appendTo = appendTo;\n\n return options;\n}\n\nexport function updateEnableTime(dateFormat: string): boolean {\n const df = dateFormat || '';\n return (\n df.includes('H:') || df.includes('h:') || df.toLowerCase().includes(':s')\n );\n}\n\nexport function setCalendarAttributes(\n instance: Instance,\n modalDetected = false\n): void {\n if (!instance || !instance.config) {\n return;\n }\n\n const container = instance.calendarContainer;\n if (!container) return;\n\n const { minDate, maxDate } = instance.config;\n if (minDate && maxDate) {\n const minY = new Date(minDate).getFullYear();\n const maxY = new Date(maxDate).getFullYear();\n if (minY === maxY) {\n container.classList.add('single-year');\n } else {\n container.classList.remove('single-year');\n }\n }\n\n requestAnimationFrame(() => {\n if (!instance || !instance.config) {\n return;\n }\n\n const mode = instance.config.mode as\n | 'single'\n | 'multiple'\n | 'range'\n | 'time';\n\n container.setAttribute('role', 'application');\n container.setAttribute('aria-label', 'Calendar');\n container.classList.remove(\n 'container-modal',\n 'container-body',\n 'container-default'\n );\n container.classList.add(\n modalDetected ? 'container-modal' : 'container-default'\n );\n\n const monthsEl = container.querySelector<HTMLElement>('.flatpickr-months');\n monthsEl?.setAttribute('tabindex', '0');\n monthsEl?.setAttribute('role', 'group');\n monthsEl?.setAttribute('aria-label', 'Month and year navigation');\n\n const prevBtn = container.querySelector<HTMLElement>(\n '.flatpickr-prev-month'\n );\n prevBtn?.setAttribute('tabindex', '0');\n prevBtn?.setAttribute('role', 'button');\n prevBtn?.setAttribute('aria-label', 'Previous month');\n if (prevBtn) {\n const anyPrev = prevBtn as any;\n if (anyPrev._kynKeydown) {\n prevBtn.removeEventListener('keydown', anyPrev._kynKeydown);\n }\n const prevKeydown = (e: KeyboardEvent) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n instance.changeMonth(-1);\n }\n };\n prevBtn.addEventListener('keydown', prevKeydown);\n anyPrev._kynKeydown = prevKeydown;\n }\n\n const nextBtn = container.querySelector<HTMLElement>(\n '.flatpickr-next-month'\n );\n nextBtn?.setAttribute('tabindex', '0');\n nextBtn?.setAttribute('role', 'button');\n nextBtn?.setAttribute('aria-label', 'Next month');\n if (nextBtn) {\n const anyNext = nextBtn as any;\n if (anyNext._kynKeydown) {\n nextBtn.removeEventListener('keydown', anyNext._kynKeydown);\n }\n const nextKeydown = (e: KeyboardEvent) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n instance.changeMonth(1);\n }\n };\n nextBtn.addEventListener('keydown', nextKeydown);\n anyNext._kynKeydown = nextKeydown;\n }\n\n const firstMonth = container.querySelector<HTMLElement>('.flatpickr-month');\n const yearInput = firstMonth?.querySelector<HTMLInputElement>(\n 'input.numInput.cur-year'\n );\n if (yearInput) {\n yearInput.tabIndex = 0;\n yearInput.setAttribute('role', 'spinbutton');\n yearInput.setAttribute('aria-label', 'Year');\n if (instance.config.minDate) {\n yearInput.setAttribute(\n 'aria-valuemin',\n String(new Date(instance.config.minDate!).getFullYear())\n );\n }\n if (instance.config.maxDate) {\n yearInput.setAttribute(\n 'aria-valuemax',\n String(new Date(instance.config.maxDate!).getFullYear())\n );\n }\n const updateNow = () =>\n yearInput.setAttribute('aria-valuenow', yearInput.value);\n\n const anyYear = yearInput as any;\n if (anyYear._kynKeydown) {\n yearInput.removeEventListener('keydown', anyYear._kynKeydown);\n }\n\n const yearKeydown = (e: KeyboardEvent) => {\n if (e.key === 'ArrowUp') {\n e.preventDefault();\n instance.changeYear(1);\n setTimeout(updateNow, 0);\n }\n if (e.key === 'ArrowDown') {\n e.preventDefault();\n instance.changeYear(-1);\n setTimeout(updateNow, 0);\n }\n };\n\n yearInput.addEventListener('keydown', yearKeydown);\n anyYear._kynKeydown = yearKeydown;\n setTimeout(updateNow, 0);\n }\n\n const daysGrid = container.querySelector<HTMLElement>('.flatpickr-days');\n daysGrid?.removeAttribute('tabindex');\n daysGrid?.setAttribute('role', 'grid');\n daysGrid?.setAttribute(\n 'aria-multiselectable',\n mode === 'multiple' ? 'true' : 'false'\n );\n\n const enabledDays = Array.from(\n container.querySelectorAll<HTMLElement>(\n '.flatpickr-day:not(.flatpickr-disabled)'\n )\n );\n enabledDays.forEach((day) => {\n day.tabIndex = 0;\n day.setAttribute('role', mode === 'range' ? 'gridcell' : 'button');\n });\n\n const oldNav = (container as any)._keyboardNav as EventListener | undefined;\n if (oldNav) container.removeEventListener('keydown', oldNav);\n\n const keyboardNav = (e: KeyboardEvent) => {\n const targetDay = (e.target as HTMLElement).closest<HTMLElement>(\n '.flatpickr-day:not(.flatpickr-disabled)'\n );\n if (!targetDay) return;\n\n switch (e.key) {\n case 'Enter':\n case ' ':\n e.preventDefault();\n targetDay.click();\n return;\n case 'ArrowRight':\n case 'ArrowLeft':\n case 'ArrowDown':\n case 'ArrowUp': {\n e.preventDefault();\n const idx = enabledDays.indexOf(targetDay);\n let nextIdx: number;\n switch (e.key) {\n case 'ArrowRight':\n nextIdx = idx + 1;\n break;\n case 'ArrowLeft':\n nextIdx = idx - 1;\n break;\n case 'ArrowDown':\n nextIdx = idx + 7;\n break;\n case 'ArrowUp':\n nextIdx = idx - 7;\n break;\n default:\n return;\n }\n const next = enabledDays[nextIdx];\n if (next) next.focus();\n return;\n }\n }\n };\n container.addEventListener('keydown', keyboardNav);\n (container as any)._keyboardNav = keyboardNav;\n\n const hourInput = container.querySelector<HTMLInputElement>(\n 'input.flatpickr-hour'\n );\n if (hourInput) {\n hourInput.tabIndex = 0;\n hourInput.setAttribute('role', 'spinbutton');\n hourInput.setAttribute('aria-label', 'Hour');\n hourInput.setAttribute('aria-valuemin', hourInput.min);\n hourInput.setAttribute('aria-valuemax', hourInput.max);\n hourInput.setAttribute('aria-valuenow', hourInput.value);\n\n const anyHour = hourInput as any;\n if (anyHour._kynKeydown) {\n hourInput.removeEventListener('keydown', anyHour._kynKeydown);\n }\n\n const hourKeydown = (e: KeyboardEvent) => {\n if (e.key === 'ArrowUp') {\n e.preventDefault();\n hourInput.stepUp();\n }\n if (e.key === 'ArrowDown') {\n e.preventDefault();\n hourInput.stepDown();\n }\n setTimeout(\n () => hourInput.setAttribute('aria-valuenow', hourInput.value),\n 0\n );\n };\n\n hourInput.addEventListener('keydown', hourKeydown);\n anyHour._kynKeydown = hourKeydown;\n\n // add click handlers for hour arrow buttons\n const hourWrapper = hourInput.closest('.numInputWrapper');\n if (hourWrapper) {\n const hourArrowUp = hourWrapper.querySelector<HTMLElement>('.arrowUp');\n const hourArrowDown =\n hourWrapper.querySelector<HTMLElement>('.arrowDown');\n\n if (hourArrowUp) {\n const anyArrowUp = hourArrowUp as any;\n if (anyArrowUp._kynClick) {\n hourArrowUp.removeEventListener('click', anyArrowUp._kynClick);\n }\n const arrowUpClick = () => {\n hourInput.stepUp();\n hourInput.dispatchEvent(new Event('input', { bubbles: true }));\n setTimeout(\n () => hourInput.setAttribute('aria-valuenow', hourInput.value),\n 0\n );\n };\n hourArrowUp.addEventListener('click', arrowUpClick);\n anyArrowUp._kynClick = arrowUpClick;\n }\n\n if (hourArrowDown) {\n const anyArrowDown = hourArrowDown as any;\n if (anyArrowDown._kynClick) {\n hourArrowDown.removeEventListener('click', anyArrowDown._kynClick);\n }\n const arrowDownClick = () => {\n hourInput.stepDown();\n hourInput.dispatchEvent(new Event('input', { bubbles: true }));\n setTimeout(\n () => hourInput.setAttribute('aria-valuenow', hourInput.value),\n 0\n );\n };\n hourArrowDown.addEventListener('click', arrowDownClick);\n anyArrowDown._kynClick = arrowDownClick;\n }\n }\n }\n\n const minuteInput = container.querySelector<HTMLInputElement>(\n 'input.flatpickr-minute'\n );\n if (minuteInput) {\n minuteInput.tabIndex = 0;\n minuteInput.setAttribute('role', 'spinbutton');\n minuteInput.setAttribute('aria-label', 'Minute');\n minuteInput.setAttribute('aria-valuemin', minuteInput.min);\n minuteInput.setAttribute('aria-valuemax', minuteInput.max);\n minuteInput.setAttribute('aria-valuenow', minuteInput.value);\n\n const anyMinute = minuteInput as any;\n if (anyMinute._kynKeydown) {\n minuteInput.removeEventListener('keydown', anyMinute._kynKeydown);\n }\n\n const minuteKeydown = (e: KeyboardEvent) => {\n if (e.key === 'ArrowUp') {\n e.preventDefault();\n minuteInput.stepUp();\n }\n if (e.key === 'ArrowDown') {\n e.preventDefault();\n minuteInput.stepDown();\n }\n setTimeout(\n () => minuteInput.setAttribute('aria-valuenow', minuteInput.value),\n 0\n );\n };\n\n minuteInput.addEventListener('keydown', minuteKeydown);\n anyMinute._kynKeydown = minuteKeydown;\n\n // add click handlers for minute arrow buttons\n const minuteWrapper = minuteInput.closest('.numInputWrapper');\n if (minuteWrapper) {\n const minuteArrowUp =\n minuteWrapper.querySelector<HTMLElement>('.arrowUp');\n const minuteArrowDown =\n minuteWrapper.querySelector<HTMLElement>('.arrowDown');\n\n if (minuteArrowUp) {\n const anyArrowUp = minuteArrowUp as any;\n if (anyArrowUp._kynClick) {\n minuteArrowUp.removeEventListener('click', anyArrowUp._kynClick);\n }\n const arrowUpClick = () => {\n minuteInput.stepUp();\n minuteInput.dispatchEvent(new Event('input', { bubbles: true }));\n setTimeout(\n () =>\n minuteInput.setAttribute('aria-valuenow', minuteInput.value),\n 0\n );\n };\n minuteArrowUp.addEventListener('click', arrowUpClick);\n anyArrowUp._kynClick = arrowUpClick;\n }\n\n if (minuteArrowDown) {\n const anyArrowDown = minuteArrowDown as any;\n if (anyArrowDown._kynClick) {\n minuteArrowDown.removeEventListener(\n 'click',\n anyArrowDown._kynClick\n );\n }\n const arrowDownClick = () => {\n minuteInput.stepDown();\n minuteInput.dispatchEvent(new Event('input', { bubbles: true }));\n setTimeout(\n () =>\n minuteInput.setAttribute('aria-valuenow', minuteInput.value),\n 0\n );\n };\n minuteArrowDown.addEventListener('click', arrowDownClick);\n anyArrowDown._kynClick = arrowDownClick;\n }\n }\n }\n\n // add seconds input handling if present\n const secondInput = container.querySelector<HTMLInputElement>(\n 'input.flatpickr-second'\n );\n if (secondInput) {\n secondInput.tabIndex = 0;\n secondInput.setAttribute('role', 'spinbutton');\n secondInput.setAttribute('aria-label', 'Second');\n secondInput.setAttribute('aria-valuemin', secondInput.min);\n secondInput.setAttribute('aria-valuemax', secondInput.max);\n secondInput.setAttribute('aria-valuenow', secondInput.value);\n\n const anySecond = secondInput as any;\n if (anySecond._kynKeydown) {\n secondInput.removeEventListener('keydown', anySecond._kynKeydown);\n }\n\n const secondKeydown = (e: KeyboardEvent) => {\n if (e.key === 'ArrowUp') {\n e.preventDefault();\n secondInput.stepUp();\n }\n if (e.key === 'ArrowDown') {\n e.preventDefault();\n secondInput.stepDown();\n }\n setTimeout(\n () => secondInput.setAttribute('aria-valuenow', secondInput.value),\n 0\n );\n };\n\n secondInput.addEventListener('keydown', secondKeydown);\n anySecond._kynKeydown = secondKeydown;\n\n // add click handlers for second arrow buttons\n const secondWrapper = secondInput.closest('.numInputWrapper');\n if (secondWrapper) {\n const secondArrowUp =\n secondWrapper.querySelector<HTMLElement>('.arrowUp');\n const secondArrowDown =\n secondWrapper.querySelector<HTMLElement>('.arrowDown');\n\n if (secondArrowUp) {\n const anyArrowUp = secondArrowUp as any;\n if (anyArrowUp._kynClick) {\n secondArrowUp.removeEventListener('click', anyArrowUp._kynClick);\n }\n const arrowUpClick = () => {\n secondInput.stepUp();\n secondInput.dispatchEvent(new Event('input', { bubbles: true }));\n setTimeout(\n () =>\n secondInput.setAttribute('aria-valuenow', secondInput.value),\n 0\n );\n };\n secondArrowUp.addEventListener('click', arrowUpClick);\n anyArrowUp._kynClick = arrowUpClick;\n }\n\n if (secondArrowDown) {\n const anyArrowDown = secondArrowDown as any;\n if (anyArrowDown._kynClick) {\n secondArrowDown.removeEventListener(\n 'click',\n anyArrowDown._kynClick\n );\n }\n const arrowDownClick = () => {\n secondInput.stepDown();\n secondInput.dispatchEvent(new Event('input', { bubbles: true }));\n setTimeout(\n () =>\n secondInput.setAttribute('aria-valuenow', secondInput.value),\n 0\n );\n };\n secondArrowDown.addEventListener('click', arrowDownClick);\n anyArrowDown._kynClick = arrowDownClick;\n }\n }\n }\n\n const ampmToggle = container.querySelector<HTMLElement>('.flatpickr-am-pm');\n if (ampmToggle) {\n ampmToggle.tabIndex = 0;\n ampmToggle.setAttribute('role', 'button');\n ampmToggle.setAttribute('aria-label', 'Toggle AM/PM');\n\n const anyAmPm = ampmToggle as any;\n if (anyAmPm._kynKeydown) {\n ampmToggle.removeEventListener('keydown', anyAmPm._kynKeydown);\n }\n const ampmKeydown = (e: KeyboardEvent) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n ampmToggle.click();\n }\n };\n ampmToggle.addEventListener('keydown', ampmKeydown);\n anyAmPm._kynKeydown = ampmKeydown;\n }\n });\n}\n\nexport function hideEmptyYear(): void {\n // force year input to always be visible - don't hide it even when min === max\n document.querySelectorAll('.numInputWrapper').forEach((wrapper) => {\n const yearInput = wrapper.querySelector(\n '.numInput.cur-year'\n ) as HTMLInputElement;\n if (yearInput) {\n (wrapper as HTMLElement).style.display = '';\n\n yearInput.style.display = '';\n yearInput.disabled = false;\n\n if (!yearInput.hasAttribute('tabindex')) {\n yearInput.tabIndex = 0;\n }\n }\n });\n}\n\nexport function emitValue(\n element: HTMLElement,\n eventName: string,\n detail: any\n): void {\n element.dispatchEvent(\n new CustomEvent(eventName, {\n detail,\n bubbles: true,\n composed: true,\n })\n );\n}\n\nexport async function clearFlatpickrInput(\n flatpickrInstance: Instance | undefined,\n inputEl: HTMLInputElement | undefined,\n updateCallback?: () => void\n): Promise<void> {\n if (flatpickrInstance) {\n flatpickrInstance.clear();\n }\n\n if (inputEl) {\n inputEl.value = '';\n }\n\n if (updateCallback) {\n await updateCallback();\n }\n}\n\nexport enum DateRangeEditableMode {\n BOTH = 'both',\n START = 'start',\n END = 'end',\n NONE = 'none',\n}\n\nexport function createDateRangeDayLockHandler(\n editableMode: DateRangeEditableMode,\n currentValue: [Date | null, Date | null]\n): (\n dObj: Date,\n dStr: string,\n fp: Instance,\n dayElem: HTMLElement & { dateObj: Date }\n) => void {\n return (_dObj, _dStr, _fp, dayElem: HTMLElement & { dateObj: Date }) => {\n const currentDate = dayElem.dateObj;\n\n if (\n editableMode === DateRangeEditableMode.END &&\n currentValue[0] !== null\n ) {\n if (currentDate.getTime() <= currentValue[0].getTime()) {\n if (currentDate.getTime() === currentValue[0].getTime()) {\n dayElem.classList.add('flatpickr-locked-date');\n dayElem.setAttribute('title', getTextStrings().dateNotAvailable);\n dayElem.setAttribute('locked', 'start');\n dayElem.setAttribute('aria-disabled', 'true');\n } else {\n dayElem.classList.add('flatpickr-locked-date', 'flatpickr-disabled');\n dayElem.setAttribute('title', getTextStrings().lockedStartDate);\n }\n }\n } else if (\n editableMode === DateRangeEditableMode.START &&\n currentValue[1] !== null\n ) {\n if (currentDate.getTime() >= currentValue[1].getTime()) {\n if (currentDate.getTime() === currentValue[1].getTime()) {\n dayElem.classList.add('flatpickr-locked-date');\n dayElem.setAttribute('title', getTextStrings().lockedEndDate);\n dayElem.setAttribute('locked', 'end');\n dayElem.setAttribute('aria-disabled', 'true');\n } else {\n dayElem.classList.add('flatpickr-locked-date', 'flatpickr-disabled');\n dayElem.setAttribute('title', getTextStrings().dateNotAvailable);\n }\n }\n } else if (\n editableMode === DateRangeEditableMode.NONE &&\n currentValue[0] !== null &&\n currentValue[1] !== null\n ) {\n if (currentDate.getTime() === currentValue[0].getTime()) {\n dayElem.classList.add('flatpickr-locked-date');\n dayElem.setAttribute('title', getTextStrings().dateLocked);\n dayElem.setAttribute('locked', 'start');\n dayElem.setAttribute('aria-disabled', 'true');\n } else if (currentDate.getTime() === currentValue[1].getTime()) {\n dayElem.classList.add('flatpickr-locked-date');\n dayElem.setAttribute('title', getTextStrings().dateLocked);\n dayElem.setAttribute('locked', 'end');\n dayElem.setAttribute('aria-disabled', 'true');\n } else if (\n currentDate.getTime() > currentValue[0].getTime() &&\n currentDate.getTime() < currentValue[1].getTime()\n ) {\n dayElem.classList.add('flatpickr-locked-date');\n dayElem.setAttribute('title', getTextStrings().dateInSelectedRange);\n } else {\n dayElem.classList.add('flatpickr-locked-date', 'flatpickr-disabled');\n dayElem.setAttribute('title', getTextStrings().dateNotAvailable);\n }\n }\n\n if (\n dayElem.classList.contains('flatpickr-disabled') &&\n !dayElem.classList.contains('flatpickr-locked-date')\n ) {\n dayElem.classList.add('flatpickr-locked-date');\n }\n };\n}\n\nexport function createDateRangeChangeLockHandler(\n editableMode: DateRangeEditableMode,\n currentValue: [Date | null, Date | null],\n originalOnChange: Hook | Hook[]\n): (selectedDates: Date[], dateStr: string, instance: Instance) => void {\n return (selectedDates, dateStr, instance) => {\n let lockedStartDate: Date | null = null;\n let lockedEndDate: Date | null = null;\n\n if (\n editableMode === DateRangeEditableMode.END &&\n currentValue[0] !== null\n ) {\n lockedStartDate = currentValue[0];\n }\n if (\n editableMode === DateRangeEditableMode.START &&\n currentValue[1] !== null\n ) {\n lockedEndDate = currentValue[1];\n }\n\n if (editableMode === DateRangeEditableMode.NONE) {\n if (currentValue[0] !== null && currentValue[1] !== null) {\n instance.setDate([currentValue[0], currentValue[1]], false);\n return;\n }\n }\n\n if (currentValue[0] === null && currentValue[1] === null) {\n callOriginalOnChange(originalOnChange, selectedDates, dateStr, instance);\n return;\n }\n\n if (\n editableMode === DateRangeEditableMode.END &&\n lockedStartDate !== null\n ) {\n let modified = false;\n const newDates = [...selectedDates];\n\n if (\n selectedDates.length === 2 &&\n selectedDates[0].getTime() !== lockedStartDate.getTime()\n ) {\n newDates[0] = lockedStartDate;\n modified = true;\n } else if (selectedDates.length === 1) {\n newDates.splice(0, 0, lockedStartDate);\n modified = true;\n }\n\n if (modified) {\n instance.setDate(newDates, false);\n callOriginalOnChange(\n originalOnChange,\n newDates,\n instance.input.value,\n instance\n );\n return;\n }\n }\n\n if (\n editableMode === DateRangeEditableMode.START &&\n lockedEndDate !== null\n ) {\n let modified = false;\n const newDates = [...selectedDates];\n\n if (\n selectedDates.length === 2 &&\n selectedDates[1].getTime() !== lockedEndDate.getTime()\n ) {\n newDates[1] = lockedEndDate;\n modified = true;\n } else if (selectedDates.length === 1) {\n newDates.push(lockedEndDate);\n modified = true;\n }\n\n if (modified) {\n instance.setDate(newDates, false);\n callOriginalOnChange(\n originalOnChange,\n newDates,\n instance.input.value,\n instance\n );\n return;\n }\n }\n\n callOriginalOnChange(originalOnChange, selectedDates, dateStr, instance);\n };\n}\n\nfunction callOriginalOnChange(\n originalOnChange: Hook | Hook[],\n selectedDates: Date[],\n dateStr: string,\n instance: Instance\n): void {\n try {\n if (typeof originalOnChange === 'function') {\n originalOnChange(selectedDates, dateStr, instance);\n } else if (Array.isArray(originalOnChange)) {\n originalOnChange.forEach((hook) => {\n if (typeof hook === 'function') {\n try {\n hook(selectedDates, dateStr, instance);\n } catch (e) {\n console.warn('Error in onChange hook:', e);\n }\n }\n });\n }\n } catch (e) {\n console.warn('Error calling original onChange handler:', e);\n }\n}\n\nexport function applyDateRangeEditingRestrictions(\n options: Partial<BaseOptions>,\n editableMode: DateRangeEditableMode,\n currentValue: [Date | null, Date | null],\n tooltipStrings?: FlatpickrTextStrings\n): Partial<BaseOptions> {\n if (tooltipStrings) {\n setTooltipStrings(tooltipStrings);\n }\n const newOptions = { ...options };\n\n if (editableMode === DateRangeEditableMode.BOTH) {\n return newOptions;\n }\n\n const originalOnChange = newOptions.onChange;\n\n newOptions.clickOpens = true;\n\n try {\n newOptions.onDayCreate = createDateRangeDayLockHandler(\n editableMode,\n currentValue\n ) as any;\n\n newOptions.onChange = createDateRangeChangeLockHandler(\n editableMode,\n currentValue,\n originalOnChange || (() => {})\n );\n } catch (e) {\n console.warn('Error setting up date range editing restrictions:', e);\n }\n\n return newOptions;\n}\n"],"names":["flatpickrStylesInjected","_defaultCalendarTooltipStrings","lockedStartDate","lockedEndDate","dateLocked","dateNotAvailable","dateInSelectedRange","currentTooltipStrings","setTooltipStrings","customTextStrings","getTextStrings","DATE_FORMAT_OPTIONS","preventFlatpickrOpen","event","setShouldFlatpickrOpen","preventDefault","stopPropagation","stopImmediatePropagation","handleInputClick","handleInputFocus","shouldFlatpickrOpen","closeFlatpickr","modifyWeekdayShorthands","localeOptions","weekdays","_a","shorthand","map","day","charAt","injectFlatpickrStyles","customStyle","styleElement","document","createElement","id","textContent","head","appendChild","async","initializeMultiAnchorFlatpickr","context","inputEl","endinputEl","getFlatpickrOptions","setCalendarAttributes","setInitialDates","options","getInputElement","el","HTMLInputElement","input","querySelector","type","style","display","isConnected","Error","error","console","inputElement","endInputElement","plugins","rangePlugin","flatpickrInstance","flatpickr","setTimeout","__anchorClickHandlers","handler","open","addEventListener","push","fn","initializeSingleAnchorFlatpickr","appendTo","effectiveDateFormat","dateFormat","mode","clickOpens","targetElement","positionElement","isValidDateFormat","format","getPlaceholder","isDateRange","loadLocale","locale","loadLocaleFromLangs","getModalContainer","element","node","ShadowRoot","host","Element","tag","tagName","toLowerCase","parentNode","body","enableTime","twentyFourHourFormat","allowInput","minDate","maxDate","minTime","maxTime","defaultDate","defaultHour","defaultMinute","enable","disable","closeOnSelect","wrap","noCalendar","onChange","onClose","onOpen","warn","English","baseLocale","split","isEnglishOr12HourLocale","includes","isWideScreen","window","innerWidth","modalContainer","inOverlay","enableSeconds","time_24hr","weekNumbers","static","showMonths","monthSelectorType","selectedDates","dateStr","instance","calendarContainer","timeContainer","length","classList","add","remove","fixedOverlayPositionPlugin","offset","minViewportMargin","preferTop","onReady","_","__","Array","isArray","parsedDate","year","month","Number","isNaN","Date","date","parseDate","updateEnableTime","df","modalDetected","config","container","getFullYear","requestAnimationFrame","setAttribute","monthsEl","prevBtn","anyPrev","_kynKeydown","removeEventListener","prevKeydown","e","key","changeMonth","nextBtn","anyNext","nextKeydown","firstMonth","yearInput","tabIndex","String","updateNow","value","anyYear","yearKeydown","changeYear","daysGrid","removeAttribute","enabledDays","from","querySelectorAll","forEach","oldNav","_keyboardNav","keyboardNav","targetDay","target","closest","click","idx","indexOf","nextIdx","next","focus","hourInput","min","max","anyHour","hourKeydown","stepUp","stepDown","hourWrapper","hourArrowUp","hourArrowDown","anyArrowUp","_kynClick","arrowUpClick","dispatchEvent","Event","bubbles","anyArrowDown","arrowDownClick","minuteInput","anyMinute","minuteKeydown","minuteWrapper","minuteArrowUp","minuteArrowDown","secondInput","anySecond","secondKeydown","secondWrapper","secondArrowUp","secondArrowDown","ampmToggle","anyAmPm","ampmKeydown","hideEmptyYear","wrapper","disabled","hasAttribute","emitValue","eventName","detail","CustomEvent","composed","clearFlatpickrInput","updateCallback","clear","DateRangeEditableMode","createDateRangeDayLockHandler","editableMode","currentValue","_dObj","_dStr","_fp","dayElem","currentDate","dateObj","END","getTime","START","NONE","contains","createDateRangeChangeLockHandler","originalOnChange","modified","newDates","splice","setDate","callOriginalOnChange","hook","applyDateRangeEditingRestrictions","tooltipStrings","newOptions","BOTH","onDayCreate"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"langs.js","sources":["../../../../src/common/helpers/flatpickr/langs.ts"],"sourcesContent":["import type { CustomLocale } from 'flatpickr/dist/types/locale';\nimport English from 'flatpickr/dist/esm/l10n/default.js';\n\nexport const langsArray = [\n 'ar', // Arabic\n 'at', // Austria\n 'az', // Azerbaijan\n 'be', // Belarusian\n 'bg', // Bulgarian\n 'bn', // Bangla\n 'bs', // Bosnia\n 'cat', // Catalan\n 'cs', // Czech\n 'cy', // Welsh\n 'da', // Danish\n 'de', // German\n 'en', // English\n 'eo', // Esperanto\n 'es', // Spanish\n 'et', // Estonian\n 'fa', // Persian\n 'fi', // Finnish\n 'fo', // Faroese\n 'fr', // French\n 'ga', // Gaelic\n 'gr', // Greek\n 'he', // Hebrew\n 'hi', // Hindi\n 'hr', // Croatian\n 'hu', // Hungarian\n 'id', // Indonesian\n 'is', // Icelandic\n 'it', // Italian\n 'ja', // Japanese\n 'ka', // Georgian\n 'km', // Khmer\n 'ko', // Korean\n 'kz', // Kazakh\n 'lt', // Lithuanian\n 'lv', // Latvian\n 'mk', // Macedonian\n 'mn', // Mongolian\n 'ms', // Malaysian\n 'my', // Burmese\n 'nl', // Dutch\n 'no', // Norwegian\n 'pa', // Punjabi\n 'pl', // Polish\n 'pt', // Portuguese\n 'ro', // Romanian\n 'ru', // Russian\n 'si', // Sinhala\n 'sk', // Slovak\n 'sl', // Slovenian\n 'sq', // Albanian\n 'sr', // Serbian\n 'sv', // Swedish\n 'th', // Thai\n 'tr', // Turkish\n 'uk', // Ukrainian\n 'uz', // Uzbek\n 'uz_latn', // Uzbek Latin\n 'vn', // Vietnamese\n 'zh_tw', // Mandarin Traditional\n 'zh', // Mandarin\n] as const;\nexport type SupportedLocale = (typeof langsArray)[number];\n\nconst alias = (code: SupportedLocale) => (code === 'zh_tw' ? 'zh-tw' : code);\n\ntype Loader = () => Promise<any>;\n\nconst loaders: Record<SupportedLocale, Loader> = {\n ar: () => import('flatpickr/dist/esm/l10n/ar.js'),\n at: () => import('flatpickr/dist/esm/l10n/at.js'),\n az: () => import('flatpickr/dist/esm/l10n/az.js'),\n be: () => import('flatpickr/dist/esm/l10n/be.js'),\n bg: () => import('flatpickr/dist/esm/l10n/bg.js'),\n bn: () => import('flatpickr/dist/esm/l10n/bn.js'),\n bs: () => import('flatpickr/dist/esm/l10n/bs.js'),\n cat: () => import('flatpickr/dist/esm/l10n/cat.js'),\n cs: () => import('flatpickr/dist/esm/l10n/cs.js'),\n cy: () => import('flatpickr/dist/esm/l10n/cy.js'),\n da: () => import('flatpickr/dist/esm/l10n/da.js'),\n de: () => import('flatpickr/dist/esm/l10n/de.js'),\n en: () => import('flatpickr/dist/esm/l10n/default.js'),\n eo: () => import('flatpickr/dist/esm/l10n/eo.js'),\n es: () => import('flatpickr/dist/esm/l10n/es.js'),\n et: () => import('flatpickr/dist/esm/l10n/et.js'),\n fa: () => import('flatpickr/dist/esm/l10n/fa.js'),\n fi: () => import('flatpickr/dist/esm/l10n/fi.js'),\n fo: () => import('flatpickr/dist/esm/l10n/fo.js'),\n fr: () => import('flatpickr/dist/esm/l10n/fr.js'),\n ga: () => import('flatpickr/dist/esm/l10n/ga.js'),\n gr: () => import('flatpickr/dist/esm/l10n/gr.js'),\n he: () => import('flatpickr/dist/esm/l10n/he.js'),\n hi: () => import('flatpickr/dist/esm/l10n/hi.js'),\n hr: () => import('flatpickr/dist/esm/l10n/hr.js'),\n hu: () => import('flatpickr/dist/esm/l10n/hu.js'),\n id: () => import('flatpickr/dist/esm/l10n/id.js'),\n is: () => import('flatpickr/dist/esm/l10n/is.js'),\n it: () => import('flatpickr/dist/esm/l10n/it.js'),\n ja: () => import('flatpickr/dist/esm/l10n/ja.js'),\n ka: () => import('flatpickr/dist/esm/l10n/ka.js'),\n km: () => import('flatpickr/dist/esm/l10n/km.js'),\n ko: () => import('flatpickr/dist/esm/l10n/ko.js'),\n kz: () => import('flatpickr/dist/esm/l10n/kz.js'),\n lt: () => import('flatpickr/dist/esm/l10n/lt.js'),\n lv: () => import('flatpickr/dist/esm/l10n/lv.js'),\n mk: () => import('flatpickr/dist/esm/l10n/mk.js'),\n mn: () => import('flatpickr/dist/esm/l10n/mn.js'),\n ms: () => import('flatpickr/dist/esm/l10n/ms.js'),\n my: () => import('flatpickr/dist/esm/l10n/my.js'),\n nl: () => import('flatpickr/dist/esm/l10n/nl.js'),\n no: () => import('flatpickr/dist/esm/l10n/no.js'),\n pa: () => import('flatpickr/dist/esm/l10n/pa.js'),\n pl: () => import('flatpickr/dist/esm/l10n/pl.js'),\n pt: () => import('flatpickr/dist/esm/l10n/pt.js'),\n ro: () => import('flatpickr/dist/esm/l10n/ro.js'),\n ru: () => import('flatpickr/dist/esm/l10n/ru.js'),\n si: () => import('flatpickr/dist/esm/l10n/si.js'),\n sk: () => import('flatpickr/dist/esm/l10n/sk.js'),\n sl: () => import('flatpickr/dist/esm/l10n/sl.js'),\n sq: () => import('flatpickr/dist/esm/l10n/sq.js'),\n sr: () => import('flatpickr/dist/esm/l10n/sr.js'),\n sv: () => import('flatpickr/dist/esm/l10n/sv.js'),\n th: () => import('flatpickr/dist/esm/l10n/th.js'),\n tr: () => import('flatpickr/dist/esm/l10n/tr.js'),\n uk: () => import('flatpickr/dist/esm/l10n/uk.js'),\n uz: () => import('flatpickr/dist/esm/l10n/uz.js'),\n uz_latn: () => import('flatpickr/dist/esm/l10n/uz_latn.js'),\n vn: () => import('flatpickr/dist/esm/l10n/vn.js'),\n zh: () => import('flatpickr/dist/esm/l10n/zh.js'),\n zh_tw: () => import('flatpickr/dist/esm/l10n/zh-tw.js'),\n};\n\nconst cache: Partial<Record<SupportedLocale, CustomLocale>> = {};\n\nconst resolveLocaleFromModule = (mod: any, key: string): CustomLocale => {\n const pick =\n mod?.default?.[key] ??\n mod?.default ??\n mod?.[key] ??\n Object.values(mod ?? {}).find((v) => v && typeof v === 'object');\n return (\n pick ? { ...(English as object), ...(pick as object) } : English\n ) as CustomLocale;\n};\n\nexport const isSupportedLocale = (\n locale: string\n): locale is SupportedLocale => {\n const base = locale.split('-')[0].toLowerCase();\n return (langsArray as readonly string[]).includes(base);\n};\n\nexport async function loadLocale(locale: string): Promise<CustomLocale> {\n const base = locale.split('-')[0].toLowerCase() as SupportedLocale;\n if (base === 'en') return English as CustomLocale;\n if (!isSupportedLocale(base)) return English as CustomLocale;\n if (cache[base]) return cache[base]!;\n const mod = await loaders[base]();\n const merged = Object.freeze(resolveLocaleFromModule(mod, alias(base)));\n cache[base] = merged;\n return merged;\n}\n\nexport async function preloadAllLocales(): Promise<void> {\n await Promise.all(\n (langsArray as readonly SupportedLocale[]).map(async (code) => {\n if (!cache[code]) {\n const mod = await loaders[code]();\n cache[code] = Object.freeze(resolveLocaleFromModule(mod, alias(code)));\n }\n return null;\n })\n );\n}\n"],"names":["langsArray","alias","code","loaders","ar","import","at","az","be","bg","bn","bs","cat","cs","cy","da","de","en","eo","es","et","fa","fi","fo","fr","ga","gr","he","hi","hr","hu","id","is","it","ja","ka","km","ko","kz","lt","lv","mk","mn","ms","my","nl","no","pa","pl","pt","ro","ru","si","sk","sl","sq","sr","sv","th","tr","uk","uz","uz_latn","vn","zh","zh_tw","cache","resolveLocaleFromModule","mod","key","pick","_d","_c","_b","_a","default","Object","values","find","v","English","isSupportedLocale","locale","base","split","toLowerCase","includes","async","loadLocale","merged","freeze","preloadAllLocales","Promise","all","map"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"langs.js","sources":["../../../../src/common/helpers/flatpickr/langs.ts"],"sourcesContent":["import type { CustomLocale } from 'flatpickr/dist/types/locale';\nimport English from 'flatpickr/dist/esm/l10n/default.js';\n\nexport const langsArray = [\n 'ar', // Arabic\n 'at', // Austria\n 'az', // Azerbaijan\n 'be', // Belarusian\n 'bg', // Bulgarian\n 'bn', // Bangla\n 'bs', // Bosnia\n 'cat', // Catalan\n 'cs', // Czech\n 'cy', // Welsh\n 'da', // Danish\n 'de', // German\n 'en', // English\n 'eo', // Esperanto\n 'es', // Spanish\n 'et', // Estonian\n 'fa', // Persian\n 'fi', // Finnish\n 'fo', // Faroese\n 'fr', // French\n 'ga', // Gaelic\n 'gr', // Greek\n 'he', // Hebrew\n 'hi', // Hindi\n 'hr', // Croatian\n 'hu', // Hungarian\n 'id', // Indonesian\n 'is', // Icelandic\n 'it', // Italian\n 'ja', // Japanese\n 'ka', // Georgian\n 'km', // Khmer\n 'ko', // Korean\n 'kz', // Kazakh\n 'lt', // Lithuanian\n 'lv', // Latvian\n 'mk', // Macedonian\n 'mn', // Mongolian\n 'ms', // Malaysian\n 'my', // Burmese\n 'nl', // Dutch\n 'no', // Norwegian\n 'pa', // Punjabi\n 'pl', // Polish\n 'pt', // Portuguese\n 'ro', // Romanian\n 'ru', // Russian\n 'si', // Sinhala\n 'sk', // Slovak\n 'sl', // Slovenian\n 'sq', // Albanian\n 'sr', // Serbian\n 'sv', // Swedish\n 'th', // Thai\n 'tr', // Turkish\n 'uk', // Ukrainian\n 'uz', // Uzbek\n 'uz_latn', // Uzbek Latin\n 'vn', // Vietnamese\n 'zh_tw', // Mandarin Traditional\n 'zh', // Mandarin\n] as const;\nexport type SupportedLocale = (typeof langsArray)[number];\n\nconst alias = (code: SupportedLocale) => (code === 'zh_tw' ? 'zh-tw' : code);\n\ntype Loader = () => Promise<any>;\n\nconst loaders: Record<SupportedLocale, Loader> = {\n ar: () => import('flatpickr/dist/esm/l10n/ar.js'),\n at: () => import('flatpickr/dist/esm/l10n/at.js'),\n az: () => import('flatpickr/dist/esm/l10n/az.js'),\n be: () => import('flatpickr/dist/esm/l10n/be.js'),\n bg: () => import('flatpickr/dist/esm/l10n/bg.js'),\n bn: () => import('flatpickr/dist/esm/l10n/bn.js'),\n bs: () => import('flatpickr/dist/esm/l10n/bs.js'),\n cat: () => import('flatpickr/dist/esm/l10n/cat.js'),\n cs: () => import('flatpickr/dist/esm/l10n/cs.js'),\n cy: () => import('flatpickr/dist/esm/l10n/cy.js'),\n da: () => import('flatpickr/dist/esm/l10n/da.js'),\n de: () => import('flatpickr/dist/esm/l10n/de.js'),\n en: () => import('flatpickr/dist/esm/l10n/default.js'),\n eo: () => import('flatpickr/dist/esm/l10n/eo.js'),\n es: () => import('flatpickr/dist/esm/l10n/es.js'),\n et: () => import('flatpickr/dist/esm/l10n/et.js'),\n fa: () => import('flatpickr/dist/esm/l10n/fa.js'),\n fi: () => import('flatpickr/dist/esm/l10n/fi.js'),\n fo: () => import('flatpickr/dist/esm/l10n/fo.js'),\n fr: () => import('flatpickr/dist/esm/l10n/fr.js'),\n ga: () => import('flatpickr/dist/esm/l10n/ga.js'),\n gr: () => import('flatpickr/dist/esm/l10n/gr.js'),\n he: () => import('flatpickr/dist/esm/l10n/he.js'),\n hi: () => import('flatpickr/dist/esm/l10n/hi.js'),\n hr: () => import('flatpickr/dist/esm/l10n/hr.js'),\n hu: () => import('flatpickr/dist/esm/l10n/hu.js'),\n id: () => import('flatpickr/dist/esm/l10n/id.js'),\n is: () => import('flatpickr/dist/esm/l10n/is.js'),\n it: () => import('flatpickr/dist/esm/l10n/it.js'),\n ja: () => import('flatpickr/dist/esm/l10n/ja.js'),\n ka: () => import('flatpickr/dist/esm/l10n/ka.js'),\n km: () => import('flatpickr/dist/esm/l10n/km.js'),\n ko: () => import('flatpickr/dist/esm/l10n/ko.js'),\n kz: () => import('flatpickr/dist/esm/l10n/kz.js'),\n lt: () => import('flatpickr/dist/esm/l10n/lt.js'),\n lv: () => import('flatpickr/dist/esm/l10n/lv.js'),\n mk: () => import('flatpickr/dist/esm/l10n/mk.js'),\n mn: () => import('flatpickr/dist/esm/l10n/mn.js'),\n ms: () => import('flatpickr/dist/esm/l10n/ms.js'),\n my: () => import('flatpickr/dist/esm/l10n/my.js'),\n nl: () => import('flatpickr/dist/esm/l10n/nl.js'),\n no: () => import('flatpickr/dist/esm/l10n/no.js'),\n pa: () => import('flatpickr/dist/esm/l10n/pa.js'),\n pl: () => import('flatpickr/dist/esm/l10n/pl.js'),\n pt: () => import('flatpickr/dist/esm/l10n/pt.js'),\n ro: () => import('flatpickr/dist/esm/l10n/ro.js'),\n ru: () => import('flatpickr/dist/esm/l10n/ru.js'),\n si: () => import('flatpickr/dist/esm/l10n/si.js'),\n sk: () => import('flatpickr/dist/esm/l10n/sk.js'),\n sl: () => import('flatpickr/dist/esm/l10n/sl.js'),\n sq: () => import('flatpickr/dist/esm/l10n/sq.js'),\n sr: () => import('flatpickr/dist/esm/l10n/sr.js'),\n sv: () => import('flatpickr/dist/esm/l10n/sv.js'),\n th: () => import('flatpickr/dist/esm/l10n/th.js'),\n tr: () => import('flatpickr/dist/esm/l10n/tr.js'),\n uk: () => import('flatpickr/dist/esm/l10n/uk.js'),\n uz: () => import('flatpickr/dist/esm/l10n/uz.js'),\n uz_latn: () => import('flatpickr/dist/esm/l10n/uz_latn.js'),\n vn: () => import('flatpickr/dist/esm/l10n/vn.js'),\n zh: () => import('flatpickr/dist/esm/l10n/zh.js'),\n zh_tw: () => import('flatpickr/dist/esm/l10n/zh-tw.js'),\n};\n\nconst cache: Partial<Record<SupportedLocale, CustomLocale>> = {};\n\nconst resolveLocaleFromModule = (mod: any, key: string): CustomLocale => {\n const pick =\n mod?.default?.[key] ??\n mod?.default ??\n mod?.[key] ??\n Object.values(mod ?? {}).find((v) => v && typeof v === 'object');\n return (\n pick ? { ...(English as object), ...(pick as object) } : English\n ) as CustomLocale;\n};\n\nexport const isSupportedLocale = (\n locale: string\n): locale is SupportedLocale => {\n const base = locale.split('-')[0].toLowerCase();\n return (langsArray as readonly string[]).includes(base);\n};\n\nexport async function loadLocale(locale: string): Promise<CustomLocale> {\n const base = locale.split('-')[0].toLowerCase() as SupportedLocale;\n if (base === 'en') return English as CustomLocale;\n if (!isSupportedLocale(base)) return English as CustomLocale;\n if (cache[base]) return cache[base]!;\n const mod = await loaders[base]();\n const merged = Object.freeze(resolveLocaleFromModule(mod, alias(base)));\n cache[base] = merged;\n return merged;\n}\n\nexport async function preloadAllLocales(): Promise<void> {\n await Promise.all(\n (langsArray as readonly SupportedLocale[]).map(async (code) => {\n if (!cache[code]) {\n const mod = await loaders[code]();\n cache[code] = Object.freeze(resolveLocaleFromModule(mod, alias(code)));\n }\n return null;\n })\n );\n}\n"],"names":["langsArray","alias","code","loaders","ar","import","at","az","be","bg","bn","bs","cat","cs","cy","da","de","en","eo","es","et","fa","fi","fo","fr","ga","gr","he","hi","hr","hu","id","is","it","ja","ka","km","ko","kz","lt","lv","mk","mn","ms","my","nl","no","pa","pl","pt","ro","ru","si","sk","sl","sq","sr","sv","th","tr","uk","uz","uz_latn","vn","zh","zh_tw","cache","resolveLocaleFromModule","mod","key","pick","_d","_c","_b","_a","default","Object","values","find","v","English","isSupportedLocale","locale","base","split","toLowerCase","includes","async","loadLocale","merged","freeze","preloadAllLocales","Promise","all","map"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"overlay.js","sources":["../../../../src/common/helpers/flatpickr/overlay.ts"],"sourcesContent":["import type { Instance } from 'flatpickr/dist/types/instance';\nimport type { Hook } from 'flatpickr/dist/types/options';\n\n/**\n * - offset: gap between input and calendar\n * - minViewportMargin: padding from viewport edges\n * - preferTop: bias toward opening upward when space is tight\n */\ntype FixedOverlayPositionOpts = {\n offset?: number;\n minViewportMargin?: number;\n preferTop?: boolean;\n};\n\ntype PositionPrivates = {\n _positionCalendar: () => void;\n _positionElement?: HTMLElement | null;\n};\n\ntype FPPlugin = (fp: Instance) => { onReady?: Hook };\n\n/**\n * Flatpickr plugin that positions the calendar using viewport-fixed coordinates.\n * - detects modal/overlay contexts\n * - tracks scroll/resize sources (including shadow DOM hosts) and repositions.\n * - flips above the input when space below is insufficient.\n */\nexport function fixedOverlayPositionPlugin(\n opts: FixedOverlayPositionOpts = {}\n): FPPlugin {\n const { offset = 6, minViewportMargin = 8, preferTop = false } = opts;\n\n return (fp: Instance) => {\n const fpp = fp as Instance & PositionPrivates;\n\n // active scroll containers + observers attach to while open\n let scrollParents: (Element | Document | Window)[] = [];\n let ro: ResizeObserver | null = null;\n\n let queued = false;\n\n // don’t force fixed positioning when flatpickr is configured as static/inline\n const isStaticOrInline = () =>\n !!(fp.config.static || (fp.config as any).inline);\n\n const schedule = () => {\n if (queued) return;\n queued = true;\n requestAnimationFrame(() => {\n queued = false;\n recalc();\n });\n };\n\n // if inside shadow DOM, target the host to continue traversal\n const getRootHost = (node: Node): Element | null => {\n const root = (node as any).getRootNode?.();\n return root && root.host ? (root.host as Element) : null;\n };\n\n // initial check for scrollable containers\n const isScrollable = (el: Element) => {\n const cs = getComputedStyle(el);\n const oy = cs.overflowY;\n const ox = cs.overflowX;\n return (\n oy === 'auto' ||\n oy === 'scroll' ||\n oy === 'overlay' ||\n ox === 'auto' ||\n ox === 'scroll' ||\n ox === 'overlay'\n );\n };\n\n // parse DOM to collect elements that can scroll\n const collectScrollParents = (start: Element | null) => {\n const parents: (Element | Document | Window)[] = [];\n let node: Element | null = start;\n const visited = new Set<Element>();\n while (node && !visited.has(node)) {\n visited.add(node);\n if (isScrollable(node)) parents.push(node);\n const host = getRootHost(node);\n node = (node.parentElement as Element | null) ?? host;\n }\n if (document.scrollingElement) parents.push(document);\n parents.push(window);\n return parents;\n };\n\n // attach scroll/resize observers when the picker opens\n const addListeners = () => {\n if (isStaticOrInline()) return; // ignore for inline/static\n removeListeners();\n\n const pe =\n (fp.config.positionElement as HTMLElement | null) ??\n fpp._positionElement ??\n (fp.input as HTMLElement | null);\n\n scrollParents = collectScrollParents(pe ?? null);\n scrollParents.forEach((t) => {\n (t as any).addEventListener?.('scroll', schedule, { passive: true });\n });\n\n window.addEventListener('resize', schedule, { passive: true });\n window.addEventListener('orientationchange', schedule, { passive: true });\n\n // resizeObserver to catch content-driven size changes\n ro = new ResizeObserver(() => schedule());\n const cal = fp.calendarContainer;\n if (cal) ro.observe(cal);\n if (pe) ro.observe(pe);\n };\n\n // clean up listeners/observers when the picker closes\n const removeListeners = () => {\n scrollParents.forEach((t) => {\n (t as any).removeEventListener?.('scroll', schedule);\n });\n scrollParents = [];\n window.removeEventListener('resize', schedule);\n window.removeEventListener('orientationchange', schedule);\n if (ro) {\n ro.disconnect();\n ro = null;\n }\n };\n\n // core positioning\n const recalc = () => {\n const cal = fp.calendarContainer;\n const pe =\n (fp.config.positionElement as HTMLElement | null) ??\n fpp._positionElement ??\n (fp.input as HTMLElement | null);\n if (!cal || !pe) return;\n\n // inline/static => let Flatpickr manage layout styles\n if (isStaticOrInline()) {\n cal.style.position = '';\n cal.style.top = '';\n cal.style.left = '';\n cal.style.right = '';\n cal.style.bottom = '';\n cal.classList.remove('fp-flipped');\n return;\n }\n\n // viewport-fixed coordinates so modal/body scrolls do not desync\n cal.style.position = 'fixed';\n\n const r = pe.getBoundingClientRect();\n\n const prevVis = cal.style.visibility;\n const prevDisp = cal.style.display;\n if (getComputedStyle(cal).display === 'none') {\n cal.style.visibility = 'hidden';\n cal.style.display = 'block';\n }\n const calW = cal.offsetWidth;\n const calH = cal.offsetHeight;\n cal.style.visibility = prevVis;\n cal.style.display = prevDisp;\n\n // fix within viewport\n const vw = window.innerWidth;\n const vh = window.innerHeight;\n\n let left = Math.max(minViewportMargin, r.left);\n if (left + calW + minViewportMargin > vw) {\n left = Math.max(minViewportMargin, vw - calW - minViewportMargin);\n }\n\n // flip above the input if necessary\n const spaceBelow = vh - r.bottom;\n const spaceAbove = r.top;\n const shouldFlip = preferTop\n ? calH + offset > spaceBelow && spaceAbove > spaceBelow\n : calH + offset > spaceBelow && spaceAbove > calH + offset;\n\n let top = shouldFlip ? r.top - calH - offset : r.bottom + offset;\n top = Math.max(\n minViewportMargin,\n Math.min(top, vh - calH - minViewportMargin)\n );\n\n // apply final position\n cal.style.top = `${top}px`;\n cal.style.left = `${left}px`;\n cal.style.right = '';\n cal.style.bottom = '';\n cal.classList.toggle('fp-flipped', shouldFlip);\n };\n\n fpp._positionCalendar = () => recalc();\n\n // wire into open/close\n const onOpen: Hook = () => {\n if (isStaticOrInline()) {\n removeListeners();\n recalc();\n return;\n }\n recalc();\n addListeners();\n };\n\n const onClose: Hook = () => {\n removeListeners();\n };\n\n // Append (don’t clobber) any existing hooks\n fp.config.onOpen = ([] as Hook[]).concat(fp.config.onOpen || [], onOpen);\n fp.config.onClose = ([] as Hook[]).concat(fp.config.onClose || [], onClose);\n\n return { onReady: () => recalc() };\n };\n}\n"],"names":["fixedOverlayPositionPlugin","opts","offset","minViewportMargin","preferTop","fp","fpp","scrollParents","ro","queued","isStaticOrInline","config","static","inline","schedule","requestAnimationFrame","recalc","getRootHost","node","root","_b","_a","getRootNode","host","isScrollable","el","cs","getComputedStyle","oy","overflowY","ox","overflowX","addListeners","removeListeners","pe","positionElement","_positionElement","input","start","parents","visited","Set","has","add","push","parentElement","document","scrollingElement","window","collectScrollParents","forEach","t","addEventListener","passive","ResizeObserver","cal","calendarContainer","observe","removeEventListener","disconnect","style","position","top","left","right","bottom","classList","remove","r","getBoundingClientRect","prevVis","visibility","prevDisp","display","calW","offsetWidth","calH","offsetHeight","vw","innerWidth","vh","innerHeight","Math","max","spaceBelow","spaceAbove","shouldFlip","min","toggle","_positionCalendar","onOpen","concat","onClose","onReady"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"overlay.js","sources":["../../../../src/common/helpers/flatpickr/overlay.ts"],"sourcesContent":["import type { Instance } from 'flatpickr/dist/types/instance';\nimport type { Hook } from 'flatpickr/dist/types/options';\n\n/**\n * - offset: gap between input and calendar\n * - minViewportMargin: padding from viewport edges\n * - preferTop: bias toward opening upward when space is tight\n */\ntype FixedOverlayPositionOpts = {\n offset?: number;\n minViewportMargin?: number;\n preferTop?: boolean;\n};\n\ntype PositionPrivates = {\n _positionCalendar: () => void;\n _positionElement?: HTMLElement | null;\n};\n\ntype FPPlugin = (fp: Instance) => { onReady?: Hook };\n\n/**\n * Flatpickr plugin that positions the calendar using viewport-fixed coordinates.\n * - detects modal/overlay contexts\n * - tracks scroll/resize sources (including shadow DOM hosts) and repositions.\n * - flips above the input when space below is insufficient.\n */\nexport function fixedOverlayPositionPlugin(\n opts: FixedOverlayPositionOpts = {}\n): FPPlugin {\n const { offset = 6, minViewportMargin = 8, preferTop = false } = opts;\n\n return (fp: Instance) => {\n const fpp = fp as Instance & PositionPrivates;\n\n // active scroll containers + observers attach to while open\n let scrollParents: (Element | Document | Window)[] = [];\n let ro: ResizeObserver | null = null;\n\n let queued = false;\n\n // don’t force fixed positioning when flatpickr is configured as static/inline\n const isStaticOrInline = () =>\n !!(fp.config.static || (fp.config as any).inline);\n\n const schedule = () => {\n if (queued) return;\n queued = true;\n requestAnimationFrame(() => {\n queued = false;\n recalc();\n });\n };\n\n // if inside shadow DOM, target the host to continue traversal\n const getRootHost = (node: Node): Element | null => {\n const root = (node as any).getRootNode?.();\n return root && root.host ? (root.host as Element) : null;\n };\n\n // initial check for scrollable containers\n const isScrollable = (el: Element) => {\n const cs = getComputedStyle(el);\n const oy = cs.overflowY;\n const ox = cs.overflowX;\n return (\n oy === 'auto' ||\n oy === 'scroll' ||\n oy === 'overlay' ||\n ox === 'auto' ||\n ox === 'scroll' ||\n ox === 'overlay'\n );\n };\n\n // parse DOM to collect elements that can scroll\n const collectScrollParents = (start: Element | null) => {\n const parents: (Element | Document | Window)[] = [];\n let node: Element | null = start;\n const visited = new Set<Element>();\n while (node && !visited.has(node)) {\n visited.add(node);\n if (isScrollable(node)) parents.push(node);\n const host = getRootHost(node);\n node = (node.parentElement as Element | null) ?? host;\n }\n if (document.scrollingElement) parents.push(document);\n parents.push(window);\n return parents;\n };\n\n // attach scroll/resize observers when the picker opens\n const addListeners = () => {\n if (isStaticOrInline()) return; // ignore for inline/static\n removeListeners();\n\n const pe =\n (fp.config.positionElement as HTMLElement | null) ??\n fpp._positionElement ??\n (fp.input as HTMLElement | null);\n\n scrollParents = collectScrollParents(pe ?? null);\n scrollParents.forEach((t) => {\n (t as any).addEventListener?.('scroll', schedule, { passive: true });\n });\n\n window.addEventListener('resize', schedule, { passive: true });\n window.addEventListener('orientationchange', schedule, { passive: true });\n\n // resizeObserver to catch content-driven size changes\n ro = new ResizeObserver(() => schedule());\n const cal = fp.calendarContainer;\n if (cal) ro.observe(cal);\n if (pe) ro.observe(pe);\n };\n\n // clean up listeners/observers when the picker closes\n const removeListeners = () => {\n scrollParents.forEach((t) => {\n (t as any).removeEventListener?.('scroll', schedule);\n });\n scrollParents = [];\n window.removeEventListener('resize', schedule);\n window.removeEventListener('orientationchange', schedule);\n if (ro) {\n ro.disconnect();\n ro = null;\n }\n };\n\n // core positioning\n const recalc = () => {\n const cal = fp.calendarContainer;\n const pe =\n (fp.config.positionElement as HTMLElement | null) ??\n fpp._positionElement ??\n (fp.input as HTMLElement | null);\n if (!cal || !pe) return;\n\n // inline/static => let Flatpickr manage layout styles\n if (isStaticOrInline()) {\n cal.style.position = '';\n cal.style.top = '';\n cal.style.left = '';\n cal.style.right = '';\n cal.style.bottom = '';\n cal.classList.remove('fp-flipped');\n return;\n }\n\n // viewport-fixed coordinates so modal/body scrolls do not desync\n cal.style.position = 'fixed';\n\n const r = pe.getBoundingClientRect();\n\n const prevVis = cal.style.visibility;\n const prevDisp = cal.style.display;\n if (getComputedStyle(cal).display === 'none') {\n cal.style.visibility = 'hidden';\n cal.style.display = 'block';\n }\n const calW = cal.offsetWidth;\n const calH = cal.offsetHeight;\n cal.style.visibility = prevVis;\n cal.style.display = prevDisp;\n\n // fix within viewport\n const vw = window.innerWidth;\n const vh = window.innerHeight;\n\n let left = Math.max(minViewportMargin, r.left);\n if (left + calW + minViewportMargin > vw) {\n left = Math.max(minViewportMargin, vw - calW - minViewportMargin);\n }\n\n // flip above the input if necessary\n const spaceBelow = vh - r.bottom;\n const spaceAbove = r.top;\n const shouldFlip = preferTop\n ? calH + offset > spaceBelow && spaceAbove > spaceBelow\n : calH + offset > spaceBelow && spaceAbove > calH + offset;\n\n let top = shouldFlip ? r.top - calH - offset : r.bottom + offset;\n top = Math.max(\n minViewportMargin,\n Math.min(top, vh - calH - minViewportMargin)\n );\n\n // apply final position\n cal.style.top = `${top}px`;\n cal.style.left = `${left}px`;\n cal.style.right = '';\n cal.style.bottom = '';\n cal.classList.toggle('fp-flipped', shouldFlip);\n };\n\n fpp._positionCalendar = () => recalc();\n\n // wire into open/close\n const onOpen: Hook = () => {\n if (isStaticOrInline()) {\n removeListeners();\n recalc();\n return;\n }\n recalc();\n addListeners();\n };\n\n const onClose: Hook = () => {\n removeListeners();\n };\n\n // Append (don’t clobber) any existing hooks\n fp.config.onOpen = ([] as Hook[]).concat(fp.config.onOpen || [], onOpen);\n fp.config.onClose = ([] as Hook[]).concat(fp.config.onClose || [], onClose);\n\n return { onReady: () => recalc() };\n };\n}\n"],"names":["fixedOverlayPositionPlugin","opts","offset","minViewportMargin","preferTop","fp","fpp","scrollParents","ro","queued","isStaticOrInline","config","static","inline","schedule","requestAnimationFrame","recalc","getRootHost","node","root","_b","_a","getRootNode","host","isScrollable","el","cs","getComputedStyle","oy","overflowY","ox","overflowX","addListeners","removeListeners","pe","positionElement","_positionElement","input","start","parents","visited","Set","has","add","push","parentElement","document","scrollingElement","window","collectScrollParents","forEach","t","addEventListener","passive","ResizeObserver","cal","calendarContainer","observe","removeEventListener","disconnect","style","position","top","left","right","bottom","classList","remove","r","getBoundingClientRect","prevVis","visibility","prevDisp","display","calW","offsetWidth","calH","offsetHeight","vw","innerWidth","vh","innerHeight","Math","max","spaceBelow","spaceAbove","shouldFlip","min","toggle","_positionCalendar","onOpen","concat","onClose","onReady"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.js","sources":["../../../../src/common/helpers/flatpickr/utils.ts"],"sourcesContent":["/**\n * Shared utilities for flatpickr-based date/time picker components.\n * Extracts common patterns used across datepicker, daterangepicker, and timepicker.\n */\n\nimport type { Instance } from 'flatpickr/dist/types/instance';\n\n// ============================================================================\n// DEBOUNCE UTILITY\n// ============================================================================\n\n/**\n * Creates a debounced version of a function that delays execution until\n * after `wait` milliseconds have elapsed since the last call.\n */\nexport function debounce<T extends (...args: unknown[]) => unknown>(\n func: T,\n wait: number\n): (...args: Parameters<T>) => void {\n let timeout: number | null = null;\n\n return (...args: Parameters<T>) => {\n if (timeout !== null) {\n window.clearTimeout(timeout);\n }\n timeout = window.setTimeout(() => {\n void func(...args);\n timeout = null;\n }, wait);\n };\n}\n\n// ============================================================================\n// ID GENERATION\n// ============================================================================\n\n/**\n * Generates a random ID with a given prefix.\n * Used for creating unique IDs for inputs and their associated elements.\n */\nexport function generateRandomId(prefix: string): string {\n return `${prefix}-${Math.random().toString(36).slice(2, 11)}`;\n}\n\n// ============================================================================\n// DATE PARSING UTILITIES\n// ============================================================================\n\n/**\n * Parses a date string in Y-m-d format, validating month/day ranges\n * and rejecting rollover dates (e.g., 2024-02-31 becoming Mar 2).\n */\nexport function parseDateOnly(dateStr: string): Date | null {\n const match = /^(\\d{4})-(\\d{2})-(\\d{2})$/.exec(dateStr);\n if (!match) return null;\n\n const y = Number(match[1]);\n const m = Number(match[2]);\n const d = Number(match[3]);\n\n // Reject impossible month/day values\n if (m < 1 || m > 12 || d < 1 || d > 31) return null;\n\n const date = new Date(y, m - 1, d);\n\n // Reject rollover dates\n if (\n date.getFullYear() !== y ||\n date.getMonth() !== m - 1 ||\n date.getDate() !== d\n ) {\n return null;\n }\n\n return isNaN(date.getTime()) ? null : date;\n}\n\n/**\n * Parses a datetime string in Y-m-d H:i or Y-m-d H:i:s format.\n */\nexport function parseDateTime(dateStr: string): Date | null {\n const dtMatch =\n /^(\\d{4})-(\\d{2})-(\\d{2})[ T](\\d{2}):(\\d{2})(?::(\\d{2}))?$/.exec(dateStr);\n if (!dtMatch) return null;\n\n const y = Number(dtMatch[1]);\n const mo = Number(dtMatch[2]);\n const da = Number(dtMatch[3]);\n const hh = Number(dtMatch[4]);\n const mm = Number(dtMatch[5]);\n const ss = dtMatch[6] !== undefined ? Number(dtMatch[6]) : 0;\n\n if (mo < 1 || mo > 12 || da < 1 || da > 31) return null;\n if (hh < 0 || hh > 23 || mm < 0 || mm > 59 || ss < 0 || ss > 59) return null;\n\n const dt = new Date(y, mo - 1, da, hh, mm, ss);\n\n if (\n dt.getFullYear() !== y ||\n dt.getMonth() !== mo - 1 ||\n dt.getDate() !== da\n ) {\n return null;\n }\n\n return isNaN(dt.getTime()) ? null : dt;\n}\n\n/**\n * Parses a time string (e.g., \"14:30\", \"2:30 PM\", \"02:30:45\") into a Date\n * object anchored to today.\n */\nexport function parseTimeString(time: string | number | Date): Date | null {\n if (time instanceof Date) return time;\n\n if (typeof time === 'number') {\n const d = new Date(time);\n return Number.isNaN(d.getTime()) ? null : d;\n }\n\n if (typeof time === 'string') {\n const str = time.trim();\n\n // Accept formats like '14:30', '2:30 PM', '02:30:45', etc.\n const ampmMatch = /^(\\d{1,2}):(\\d{2})(?::(\\d{2}))?\\s*([ap]m)?$/i.exec(str);\n if (!ampmMatch) return null;\n\n let hours = Number(ampmMatch[1]);\n const minutes = Number(ampmMatch[2]);\n const seconds = ampmMatch[3] !== undefined ? Number(ampmMatch[3]) : 0;\n const ampm = ampmMatch[4];\n\n if (Number.isNaN(hours) || Number.isNaN(minutes) || Number.isNaN(seconds)) {\n return null;\n }\n\n if (ampm) {\n const a = ampm.toLowerCase();\n if (a === 'pm' && hours < 12) hours += 12;\n if (a === 'am' && hours === 12) hours = 0;\n }\n\n if (\n hours < 0 ||\n hours > 23 ||\n minutes < 0 ||\n minutes > 59 ||\n seconds < 0 ||\n seconds > 59\n ) {\n return null;\n }\n\n const d = new Date();\n d.setHours(hours, minutes, seconds, 0);\n return d;\n }\n\n return null;\n}\n\n/**\n * Normalizes a value to a Date object.\n * Handles Date objects, timestamps, and strings.\n */\nexport function normalizeToDate(\n value: string | number | Date | '' | null | undefined,\n parseDateString?: (str: string) => Date | null\n): Date | null {\n if (!value) return null;\n\n if (value instanceof Date) {\n return isNaN(value.getTime()) ? null : value;\n }\n\n if (typeof value === 'number') {\n const d = new Date(value);\n return isNaN(d.getTime()) ? null : d;\n }\n\n if (typeof value === 'string') {\n // Use provided parser or fall back to basic parsing\n if (parseDateString) {\n return parseDateString(value);\n }\n\n // Try ISO format first\n if (value.includes('T')) {\n const d = new Date(value);\n return isNaN(d.getTime()) ? null : d;\n }\n\n // Try datetime format\n const dt = parseDateTime(value);\n if (dt) return dt;\n\n // Try date-only format\n return parseDateOnly(value);\n }\n\n return null;\n}\n\n// ============================================================================\n// VALUE CHECKING UTILITIES\n// ============================================================================\n\n/**\n * Type guard that checks if a value is a valid Date object.\n * Returns true only if the value is a Date instance with a valid time value.\n */\nexport function isValidDate(value: unknown): value is Date {\n return value instanceof Date && !isNaN(value.getTime());\n}\n\n/**\n * Filters an array to only include valid Date objects.\n * Useful for defensive handling of flatpickr callbacks which may occasionally\n * pass non-Date values during certain interactions (e.g., time input changes).\n */\nexport function filterValidDates(dates: unknown[]): Date[] {\n return dates.filter((d): d is Date => isValidDate(d));\n}\n\n/**\n * Checks if a value is empty (null, undefined, empty string, or empty array).\n */\nexport function isEmptyValue(\n value: unknown\n): value is null | undefined | '' | [] {\n if (value == null) return true;\n\n if (typeof value === 'string') return value.trim() === '';\n\n if (Array.isArray(value)) {\n return (\n value.length === 0 ||\n value.every((v) => {\n if (v == null) return true;\n return typeof v === 'string' ? v.trim() === '' : false;\n })\n );\n }\n\n return false;\n}\n\n/**\n * Checks if two Date objects represent the same time (hours, minutes, seconds).\n */\nexport function timesEqual(\n a: Date | null | undefined,\n b: Date | null | undefined\n): boolean {\n if (!a && !b) return true;\n if (!a || !b) return false;\n return (\n a.getHours() === b.getHours() &&\n a.getMinutes() === b.getMinutes() &&\n a.getSeconds() === b.getSeconds()\n );\n}\n\n/**\n * Checks if two Date objects represent the same date (year, month, day).\n */\nexport function datesEqual(\n a: Date | null | undefined,\n b: Date | null | undefined\n): boolean {\n if (!a && !b) return true;\n if (!a || !b) return false;\n return (\n a.getFullYear() === b.getFullYear() &&\n a.getMonth() === b.getMonth() &&\n a.getDate() === b.getDate()\n );\n}\n\n// ============================================================================\n// FLATPICKR INSTANCE UTILITIES\n// ============================================================================\n\n/**\n * Cleans up a flatpickr instance, removing event handlers and destroying it.\n */\nexport function cleanupFlatpickrInstance(instance: Instance | undefined): void {\n if (!instance) return;\n\n // Remove any anchor click handlers that were attached\n const __handlers = (instance as any).__anchorClickHandlers;\n if (Array.isArray(__handlers)) {\n __handlers.forEach((h: { el: HTMLElement; fn: EventListener }) => {\n try {\n h.el.removeEventListener('click', h.fn as EventListener);\n } catch {\n // ignore cleanup errors\n }\n });\n }\n\n instance.destroy();\n}\n\n/**\n * Type for anchor click handlers stored on flatpickr instance.\n */\nexport type AnchorClickHandler = {\n el: HTMLElement;\n fn: EventListener;\n};\n\n// ============================================================================\n// FORM INTEGRATION UTILITIES\n// ============================================================================\n\n/**\n * Updates the form value for a picker component.\n */\nexport function updateFormValue(\n internals: ElementInternals | undefined,\n inputEl: HTMLInputElement | null\n): void {\n if (internals && inputEl) {\n internals.setFormValue(inputEl.value);\n }\n}\n\n/**\n * Creates a submit listener for form validation.\n */\nexport function createFormSubmitListener(\n validateFn: (interacted: boolean, report: boolean) => void,\n checkValidityFn: () => boolean,\n requiredCheck: () => boolean\n): (e: SubmitEvent) => void {\n return (e: SubmitEvent) => {\n validateFn(true, true);\n if (!checkValidityFn() || requiredCheck()) {\n e.preventDefault();\n }\n };\n}\n\n// ============================================================================\n// VALIDATION UTILITIES\n// ============================================================================\n\nexport interface ValidationResult {\n isValid: boolean;\n validity: ValidityState;\n validationMessage: string;\n}\n\nexport interface ValidationOptions {\n inputEl: HTMLInputElement;\n required: boolean;\n isEmpty: boolean;\n invalidText: string;\n defaultErrorMessage: string;\n hasInteracted: boolean;\n customValidation?: () => { valid: boolean; message?: string };\n}\n\n/**\n * Performs validation for a picker input.\n * Returns validation state without modifying component state.\n */\nexport function validatePickerInput(\n options: ValidationOptions\n): ValidationResult {\n const {\n inputEl,\n required,\n isEmpty,\n invalidText,\n defaultErrorMessage,\n customValidation,\n } = options;\n\n let validity = inputEl.validity;\n let validationMessage = inputEl.validationMessage;\n\n // Check required\n if (required && isEmpty) {\n validity = { ...validity, valueMissing: true };\n validationMessage = defaultErrorMessage || 'This field is required';\n }\n\n // Check custom validation\n if (customValidation) {\n const { valid, message } = customValidation();\n if (!valid) {\n validity = { ...validity, customError: true };\n if (message) validationMessage = message;\n }\n }\n\n // Check invalidText (external validation)\n if (invalidText) {\n validity = { ...validity, customError: true };\n validationMessage = invalidText;\n }\n\n const isValid = !validity.valueMissing && !validity.customError;\n\n return { isValid, validity, validationMessage };\n}\n\n// ============================================================================\n// TEXT STRINGS UTILITIES\n// ============================================================================\n\n/**\n * Merges default text strings with custom overrides.\n */\nexport function mergeTextStrings<T extends Record<string, string>>(\n defaults: T,\n custom?: Partial<T>\n): T {\n return { ...defaults, ...custom };\n}\n\n// ============================================================================\n// CONSTANTS\n// ============================================================================\n\n/** Delay before re-initializing flatpickr after config changes (ms) */\nexport const CONFIG_DEBOUNCE_DELAY = 100;\n\n/** Delay before re-initializing flatpickr after window resize (ms) */\nexport const RESIZE_DEBOUNCE_DELAY = 250;\n\n/** Interval for checking if a hidden picker becomes visible (ms) */\nexport const VISIBILITY_CHECK_INTERVAL = 250;\n"],"names":["debounce","func","wait","timeout","args","window","clearTimeout","setTimeout","generateRandomId","prefix","Math","random","toString","slice","parseDateOnly","dateStr","match","exec","y","Number","m","d","date","Date","getFullYear","getMonth","getDate","isNaN","getTime","parseDateTime","dtMatch","mo","da","hh","mm","ss","undefined","dt","parseTimeString","time","str","trim","ampmMatch","hours","minutes","seconds","ampm","a","toLowerCase","setHours","normalizeToDate","value","parseDateString","includes","isValidDate","filterValidDates","dates","filter","isEmptyValue","Array","isArray","length","every","v","timesEqual","b","getHours","getMinutes","getSeconds","datesEqual","cleanupFlatpickrInstance","instance","__handlers","__anchorClickHandlers","forEach","h","el","removeEventListener","fn","destroy","updateFormValue","internals","inputEl","setFormValue","createFormSubmitListener","validateFn","checkValidityFn","requiredCheck","e","preventDefault","validatePickerInput","options","required","isEmpty","invalidText","defaultErrorMessage","customValidation","validity","validationMessage","valueMissing","valid","message","customError","isValid","mergeTextStrings","defaults","custom","CONFIG_DEBOUNCE_DELAY","RESIZE_DEBOUNCE_DELAY","VISIBILITY_CHECK_INTERVAL"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"utils.js","sources":["../../../../src/common/helpers/flatpickr/utils.ts"],"sourcesContent":["/**\n * Shared utilities for flatpickr-based date/time picker components.\n * Extracts common patterns used across datepicker, daterangepicker, and timepicker.\n */\n\nimport type { Instance } from 'flatpickr/dist/types/instance';\n\n// ============================================================================\n// DEBOUNCE UTILITY\n// ============================================================================\n\n/**\n * Creates a debounced version of a function that delays execution until\n * after `wait` milliseconds have elapsed since the last call.\n */\nexport function debounce<T extends (...args: unknown[]) => unknown>(\n func: T,\n wait: number\n): (...args: Parameters<T>) => void {\n let timeout: number | null = null;\n\n return (...args: Parameters<T>) => {\n if (timeout !== null) {\n window.clearTimeout(timeout);\n }\n timeout = window.setTimeout(() => {\n void func(...args);\n timeout = null;\n }, wait);\n };\n}\n\n// ============================================================================\n// ID GENERATION\n// ============================================================================\n\n/**\n * Generates a random ID with a given prefix.\n * Used for creating unique IDs for inputs and their associated elements.\n */\nexport function generateRandomId(prefix: string): string {\n return `${prefix}-${Math.random().toString(36).slice(2, 11)}`;\n}\n\n// ============================================================================\n// DATE PARSING UTILITIES\n// ============================================================================\n\n/**\n * Parses a date string in Y-m-d format, validating month/day ranges\n * and rejecting rollover dates (e.g., 2024-02-31 becoming Mar 2).\n */\nexport function parseDateOnly(dateStr: string): Date | null {\n const match = /^(\\d{4})-(\\d{2})-(\\d{2})$/.exec(dateStr);\n if (!match) return null;\n\n const y = Number(match[1]);\n const m = Number(match[2]);\n const d = Number(match[3]);\n\n // Reject impossible month/day values\n if (m < 1 || m > 12 || d < 1 || d > 31) return null;\n\n const date = new Date(y, m - 1, d);\n\n // Reject rollover dates\n if (\n date.getFullYear() !== y ||\n date.getMonth() !== m - 1 ||\n date.getDate() !== d\n ) {\n return null;\n }\n\n return isNaN(date.getTime()) ? null : date;\n}\n\n/**\n * Parses a datetime string in Y-m-d H:i or Y-m-d H:i:s format.\n */\nexport function parseDateTime(dateStr: string): Date | null {\n const dtMatch =\n /^(\\d{4})-(\\d{2})-(\\d{2})[ T](\\d{2}):(\\d{2})(?::(\\d{2}))?$/.exec(dateStr);\n if (!dtMatch) return null;\n\n const y = Number(dtMatch[1]);\n const mo = Number(dtMatch[2]);\n const da = Number(dtMatch[3]);\n const hh = Number(dtMatch[4]);\n const mm = Number(dtMatch[5]);\n const ss = dtMatch[6] !== undefined ? Number(dtMatch[6]) : 0;\n\n if (mo < 1 || mo > 12 || da < 1 || da > 31) return null;\n if (hh < 0 || hh > 23 || mm < 0 || mm > 59 || ss < 0 || ss > 59) return null;\n\n const dt = new Date(y, mo - 1, da, hh, mm, ss);\n\n if (\n dt.getFullYear() !== y ||\n dt.getMonth() !== mo - 1 ||\n dt.getDate() !== da\n ) {\n return null;\n }\n\n return isNaN(dt.getTime()) ? null : dt;\n}\n\n/**\n * Parses a time string (e.g., \"14:30\", \"2:30 PM\", \"02:30:45\") into a Date\n * object anchored to today.\n */\nexport function parseTimeString(time: string | number | Date): Date | null {\n if (time instanceof Date) return time;\n\n if (typeof time === 'number') {\n const d = new Date(time);\n return Number.isNaN(d.getTime()) ? null : d;\n }\n\n if (typeof time === 'string') {\n const str = time.trim();\n\n // Accept formats like '14:30', '2:30 PM', '02:30:45', etc.\n const ampmMatch = /^(\\d{1,2}):(\\d{2})(?::(\\d{2}))?\\s*([ap]m)?$/i.exec(str);\n if (!ampmMatch) return null;\n\n let hours = Number(ampmMatch[1]);\n const minutes = Number(ampmMatch[2]);\n const seconds = ampmMatch[3] !== undefined ? Number(ampmMatch[3]) : 0;\n const ampm = ampmMatch[4];\n\n if (Number.isNaN(hours) || Number.isNaN(minutes) || Number.isNaN(seconds)) {\n return null;\n }\n\n if (ampm) {\n const a = ampm.toLowerCase();\n if (a === 'pm' && hours < 12) hours += 12;\n if (a === 'am' && hours === 12) hours = 0;\n }\n\n if (\n hours < 0 ||\n hours > 23 ||\n minutes < 0 ||\n minutes > 59 ||\n seconds < 0 ||\n seconds > 59\n ) {\n return null;\n }\n\n const d = new Date();\n d.setHours(hours, minutes, seconds, 0);\n return d;\n }\n\n return null;\n}\n\n/**\n * Normalizes a value to a Date object.\n * Handles Date objects, timestamps, and strings.\n */\nexport function normalizeToDate(\n value: string | number | Date | '' | null | undefined,\n parseDateString?: (str: string) => Date | null\n): Date | null {\n if (!value) return null;\n\n if (value instanceof Date) {\n return isNaN(value.getTime()) ? null : value;\n }\n\n if (typeof value === 'number') {\n const d = new Date(value);\n return isNaN(d.getTime()) ? null : d;\n }\n\n if (typeof value === 'string') {\n // Use provided parser or fall back to basic parsing\n if (parseDateString) {\n return parseDateString(value);\n }\n\n // Try ISO format first\n if (value.includes('T')) {\n const d = new Date(value);\n return isNaN(d.getTime()) ? null : d;\n }\n\n // Try datetime format\n const dt = parseDateTime(value);\n if (dt) return dt;\n\n // Try date-only format\n return parseDateOnly(value);\n }\n\n return null;\n}\n\n// ============================================================================\n// VALUE CHECKING UTILITIES\n// ============================================================================\n\n/**\n * Type guard that checks if a value is a valid Date object.\n * Returns true only if the value is a Date instance with a valid time value.\n */\nexport function isValidDate(value: unknown): value is Date {\n return value instanceof Date && !isNaN(value.getTime());\n}\n\n/**\n * Filters an array to only include valid Date objects.\n * Useful for defensive handling of flatpickr callbacks which may occasionally\n * pass non-Date values during certain interactions (e.g., time input changes).\n */\nexport function filterValidDates(dates: unknown[]): Date[] {\n return dates.filter((d): d is Date => isValidDate(d));\n}\n\n/**\n * Checks if a value is empty (null, undefined, empty string, or empty array).\n */\nexport function isEmptyValue(\n value: unknown\n): value is null | undefined | '' | [] {\n if (value == null) return true;\n\n if (typeof value === 'string') return value.trim() === '';\n\n if (Array.isArray(value)) {\n return (\n value.length === 0 ||\n value.every((v) => {\n if (v == null) return true;\n return typeof v === 'string' ? v.trim() === '' : false;\n })\n );\n }\n\n return false;\n}\n\n/**\n * Checks if two Date objects represent the same time (hours, minutes, seconds).\n */\nexport function timesEqual(\n a: Date | null | undefined,\n b: Date | null | undefined\n): boolean {\n if (!a && !b) return true;\n if (!a || !b) return false;\n return (\n a.getHours() === b.getHours() &&\n a.getMinutes() === b.getMinutes() &&\n a.getSeconds() === b.getSeconds()\n );\n}\n\n/**\n * Checks if two Date objects represent the same date (year, month, day).\n */\nexport function datesEqual(\n a: Date | null | undefined,\n b: Date | null | undefined\n): boolean {\n if (!a && !b) return true;\n if (!a || !b) return false;\n return (\n a.getFullYear() === b.getFullYear() &&\n a.getMonth() === b.getMonth() &&\n a.getDate() === b.getDate()\n );\n}\n\n// ============================================================================\n// FLATPICKR INSTANCE UTILITIES\n// ============================================================================\n\n/**\n * Cleans up a flatpickr instance, removing event handlers and destroying it.\n */\nexport function cleanupFlatpickrInstance(instance: Instance | undefined): void {\n if (!instance) return;\n\n // Remove any anchor click handlers that were attached\n const __handlers = (instance as any).__anchorClickHandlers;\n if (Array.isArray(__handlers)) {\n __handlers.forEach((h: { el: HTMLElement; fn: EventListener }) => {\n try {\n h.el.removeEventListener('click', h.fn as EventListener);\n } catch {\n // ignore cleanup errors\n }\n });\n }\n\n instance.destroy();\n}\n\n/**\n * Type for anchor click handlers stored on flatpickr instance.\n */\nexport type AnchorClickHandler = {\n el: HTMLElement;\n fn: EventListener;\n};\n\n// ============================================================================\n// FORM INTEGRATION UTILITIES\n// ============================================================================\n\n/**\n * Updates the form value for a picker component.\n */\nexport function updateFormValue(\n internals: ElementInternals | undefined,\n inputEl: HTMLInputElement | null\n): void {\n if (internals && inputEl) {\n internals.setFormValue(inputEl.value);\n }\n}\n\n/**\n * Creates a submit listener for form validation.\n */\nexport function createFormSubmitListener(\n validateFn: (interacted: boolean, report: boolean) => void,\n checkValidityFn: () => boolean,\n requiredCheck: () => boolean\n): (e: SubmitEvent) => void {\n return (e: SubmitEvent) => {\n validateFn(true, true);\n if (!checkValidityFn() || requiredCheck()) {\n e.preventDefault();\n }\n };\n}\n\n// ============================================================================\n// VALIDATION UTILITIES\n// ============================================================================\n\nexport interface ValidationResult {\n isValid: boolean;\n validity: ValidityState;\n validationMessage: string;\n}\n\nexport interface ValidationOptions {\n inputEl: HTMLInputElement;\n required: boolean;\n isEmpty: boolean;\n invalidText: string;\n defaultErrorMessage: string;\n hasInteracted: boolean;\n customValidation?: () => { valid: boolean; message?: string };\n}\n\n/**\n * Performs validation for a picker input.\n * Returns validation state without modifying component state.\n */\nexport function validatePickerInput(\n options: ValidationOptions\n): ValidationResult {\n const {\n inputEl,\n required,\n isEmpty,\n invalidText,\n defaultErrorMessage,\n customValidation,\n } = options;\n\n let validity = inputEl.validity;\n let validationMessage = inputEl.validationMessage;\n\n // Check required\n if (required && isEmpty) {\n validity = { ...validity, valueMissing: true };\n validationMessage = defaultErrorMessage || 'This field is required';\n }\n\n // Check custom validation\n if (customValidation) {\n const { valid, message } = customValidation();\n if (!valid) {\n validity = { ...validity, customError: true };\n if (message) validationMessage = message;\n }\n }\n\n // Check invalidText (external validation)\n if (invalidText) {\n validity = { ...validity, customError: true };\n validationMessage = invalidText;\n }\n\n const isValid = !validity.valueMissing && !validity.customError;\n\n return { isValid, validity, validationMessage };\n}\n\n// ============================================================================\n// TEXT STRINGS UTILITIES\n// ============================================================================\n\n/**\n * Merges default text strings with custom overrides.\n */\nexport function mergeTextStrings<T extends Record<string, string>>(\n defaults: T,\n custom?: Partial<T>\n): T {\n return { ...defaults, ...custom };\n}\n\n// ============================================================================\n// CONSTANTS\n// ============================================================================\n\n/** Delay before re-initializing flatpickr after config changes (ms) */\nexport const CONFIG_DEBOUNCE_DELAY = 100;\n\n/** Delay before re-initializing flatpickr after window resize (ms) */\nexport const RESIZE_DEBOUNCE_DELAY = 250;\n\n/** Interval for checking if a hidden picker becomes visible (ms) */\nexport const VISIBILITY_CHECK_INTERVAL = 250;\n"],"names":["debounce","func","wait","timeout","args","window","clearTimeout","setTimeout","generateRandomId","prefix","Math","random","toString","slice","parseDateOnly","dateStr","match","exec","y","Number","m","d","date","Date","getFullYear","getMonth","getDate","isNaN","getTime","parseDateTime","dtMatch","mo","da","hh","mm","ss","undefined","dt","parseTimeString","time","str","trim","ampmMatch","hours","minutes","seconds","ampm","a","toLowerCase","setHours","normalizeToDate","value","parseDateString","includes","isValidDate","filterValidDates","dates","filter","isEmptyValue","Array","isArray","length","every","v","timesEqual","b","getHours","getMinutes","getSeconds","datesEqual","cleanupFlatpickrInstance","instance","__handlers","__anchorClickHandlers","forEach","h","el","removeEventListener","fn","destroy","updateFormValue","internals","inputEl","setFormValue","createFormSubmitListener","validateFn","checkValidityFn","requiredCheck","e","preventDefault","validatePickerInput","options","required","isEmpty","invalidText","defaultErrorMessage","customValidation","validity","validationMessage","valueMissing","valid","message","customError","isValid","mergeTextStrings","defaults","custom","CONFIG_DEBOUNCE_DELAY","RESIZE_DEBOUNCE_DELAY","VISIBILITY_CHECK_INTERVAL"],"mappings":"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"}
|