willba-component-library 0.2.54 → 0.2.56

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.
Files changed (58) hide show
  1. package/lib/assets/IconsSvg.d.ts +9 -0
  2. package/lib/components/FilterBar/FilterBar.stories.d.ts +1 -1
  3. package/lib/components/FilterCalendar/FilterCalendar.d.ts +1 -1
  4. package/lib/components/FilterCalendar/FilterCalendar.stories.d.ts +2 -1
  5. package/lib/components/FilterCalendar/hooks/useFilterCalendar.d.ts +3 -3
  6. package/lib/core/components/calendar/CalendarTypes.d.ts +8 -6
  7. package/lib/core/components/calendar/hooks/index.d.ts +3 -0
  8. package/lib/core/components/calendar/hooks/useCalendarLoadingSpinner.d.ts +7 -0
  9. package/lib/core/components/calendar/hooks/useCalendarTooltips.d.ts +10 -0
  10. package/lib/core/components/calendar/hooks/useUpdateDisabledDates.d.ts +13 -0
  11. package/lib/core/components/calendar/utils/calendarSelectionRules.d.ts +15 -0
  12. package/lib/core/components/calendar/utils/checkForContinuousSelection.d.ts +10 -0
  13. package/lib/core/components/calendar/utils/disabledDatesByPage.d.ts +9 -0
  14. package/lib/core/components/calendar/utils/handleCalendarModifiers.d.ts +46 -0
  15. package/lib/core/components/calendar/utils/handleRangeContextDisabledDates.d.ts +27 -0
  16. package/lib/core/components/calendar/utils/index.d.ts +8 -0
  17. package/lib/core/components/calendar/utils/nightsCount.d.ts +6 -0
  18. package/lib/core/components/calendar/utils/parseDate.d.ts +7 -0
  19. package/lib/core/components/calendar/utils/parseDates.d.ts +6 -0
  20. package/lib/index.d.ts +10 -7
  21. package/lib/index.esm.js +646 -272
  22. package/lib/index.esm.js.map +1 -1
  23. package/lib/index.js +646 -272
  24. package/lib/index.js.map +1 -1
  25. package/lib/index.umd.js +646 -272
  26. package/lib/index.umd.js.map +1 -1
  27. package/lib/themes/useTheme.d.ts +2 -0
  28. package/package.json +1 -1
  29. package/src/assets/IconsSvg.tsx +66 -0
  30. package/src/components/FilterBar/FilterBar.stories.tsx +2 -1
  31. package/src/components/FilterBar/FilterBar.tsx +1 -1
  32. package/src/components/FilterCalendar/FilterCalendar.css +8 -9
  33. package/src/components/FilterCalendar/FilterCalendar.stories.tsx +345 -158
  34. package/src/components/FilterCalendar/FilterCalendar.tsx +69 -52
  35. package/src/components/FilterCalendar/FilterCalendarTypes.ts +0 -1
  36. package/src/components/FilterCalendar/hooks/useFilterCalendar.ts +44 -4
  37. package/src/core/components/buttons/submit-button/SubmitButton.tsx +1 -4
  38. package/src/core/components/calendar/Calendar.css +24 -6
  39. package/src/core/components/calendar/Calendar.tsx +127 -376
  40. package/src/core/components/calendar/CalendarTypes.ts +9 -4
  41. package/src/core/components/calendar/hooks/index.ts +3 -0
  42. package/src/core/components/calendar/hooks/useCalendarLoadingSpinner.tsx +25 -0
  43. package/src/core/components/calendar/hooks/useCalendarTooltips.tsx +139 -0
  44. package/src/core/components/calendar/hooks/useUpdateDisabledDates.tsx +94 -0
  45. package/src/core/components/calendar/utils/calendarSelectionRules.tsx +163 -0
  46. package/src/core/components/calendar/utils/checkForContinuousSelection.tsx +50 -0
  47. package/src/core/components/calendar/utils/disabledDatesByPage.tsx +36 -0
  48. package/src/core/components/calendar/utils/handleCalendarModifiers.tsx +151 -0
  49. package/src/core/components/calendar/utils/handleRangeContextDisabledDates.tsx +70 -0
  50. package/src/core/components/calendar/utils/index.ts +8 -0
  51. package/src/themes/Default.css +6 -0
  52. package/src/themes/useTheme.tsx +3 -0
  53. package/src/assets/SpinnerSvg.tsx +0 -40
  54. package/src/core/utils/handleOverlappingDates.tsx +0 -3
  55. package/src/core/utils/index.ts +0 -3
  56. /package/src/core/{utils → components/calendar/utils}/nightsCount.tsx +0 -0
  57. /package/src/core/{utils → components/calendar/utils}/parseDate.tsx +0 -0
  58. /package/src/core/{utils → components/calendar/utils}/parseDates.tsx +0 -0
package/lib/index.esm.js CHANGED
@@ -522,11 +522,12 @@ function useTheme(_a) {
522
522
  var themePalette = {
523
523
  '--will-primary': palette === null || palette === void 0 ? void 0 : palette.primary,
524
524
  '--will-secondary': palette === null || palette === void 0 ? void 0 : palette.secondary,
525
+ '--will-error': palette === null || palette === void 0 ? void 0 : palette.error,
525
526
  };
526
527
  return themePalette;
527
528
  }
528
529
 
529
- var css_248z$c = "@import url('https://fonts.googleapis.com/css2?family=Montserrat:wght@300;400;500;600;700&display=swap');\n\n.will-root * {\n font-family: 'Montserrat', sans-serif;\n}\n\n.will-root {\n \n box-sizing: border-box;\n font-size: 14px;\n \n color: #1E1E1E;\n \n /* Palette */\n --will-primary: #374269;\n --will-secondary: #374269;\n --will-grey: #ABA7AF;\n --will-white: #fff;\n --will-white-transparent: #ffffffcf;\n --will-black: #000;\n --will-onahau: #CDEEFF;\n --will-text: #5A5959;\n --will-charcoal-blue: #384265;\n --will-transparent-white: rgba(255, 255, 255, 0.30);\n --will-transparent-black: rgba(171, 167, 175, 0.30);\n\n /* Confines */\n --will-box-shadow-dark: 0px 2px 12px 2px #a1a1a180;\n --will-box-shadow-light: 0px 2px 12px 2px #bcb9b980;\n\n /* Breakpoints */\n\n --will-lg: 1140px;\n --will-md: 960px;\n --will-sm: 600px;\n --will-xl: 1280px;\n --will-xs: 0px;\n}\n\n/* Typography */\n\n.will-root h1, h2, h3, h4, h5, h6 {\n font-weight: 700;\n} \n\n.will-root p, h1, h2, h3, h4, h5, h6, span {\n margin: 0;\n padding: 0;\n}\n\n\n/* Integration fixes */\n\n.will-root p {\n margin: 0 !important;\n}\n\n.will-root button {\n line-height: normal !important;\n}\n";
530
+ var css_248z$c = "@import url('https://fonts.googleapis.com/css2?family=Montserrat:wght@300;400;500;600;700&display=swap');\n\n.will-root * {\n font-family: 'Montserrat', sans-serif;\n}\n\n.will-root {\n \n box-sizing: border-box;\n font-size: 14px;\n \n color: #1E1E1E;\n \n /* Palette */\n --will-primary: #374269;\n --will-secondary: #374269;\n --will-grey: #ABA7AF;\n --will-white: #fff;\n --will-white-transparent: #ffffffcf;\n --will-black: #000;\n --will-onahau: #CDEEFF;\n --will-text: #5A5959;\n --will-charcoal-blue: #384265;\n --will-transparent-white: rgba(255, 255, 255, 0.30);\n --will-transparent-black: rgba(171, 167, 175, 0.30);\n --will-error: #d32f2f;\n\n /*Color mix*/\n --will-primary-lighter: color-mix(in srgb, var(--will-primary), white 20%);\n --will-primary-lightest: color-mix(in srgb, var(--will-primary), white 80%);\n\n\n /* Confines */\n --will-box-shadow-dark: 0px 2px 12px 2px #a1a1a180;\n --will-box-shadow-light: 0px 2px 12px 2px #bcb9b980;\n\n /* Breakpoints */\n\n --will-lg: 1140px;\n --will-md: 960px;\n --will-sm: 600px;\n --will-xl: 1280px;\n --will-xs: 0px;\n}\n\n/* Typography */\n\n.will-root h1, h2, h3, h4, h5, h6 {\n font-weight: 700;\n} \n\n.will-root p, h1, h2, h3, h4, h5, h6, span {\n margin: 0;\n padding: 0;\n}\n\n\n/* Integration fixes */\n\n.will-root p {\n margin: 0 !important;\n}\n\n.will-root button {\n line-height: normal !important;\n}\n";
530
531
  styleInject(css_248z$c);
531
532
 
532
533
  var useAwaitRender = function () {
@@ -3757,6 +3758,111 @@ function differenceInCalendarWeeks(dirtyDateLeft, dirtyDateRight, options) {
3757
3758
  return Math.round((timestampLeft - timestampRight) / MILLISECONDS_IN_WEEK$4);
3758
3759
  }
3759
3760
 
3761
+ // for accurate equality comparisons of UTC timestamps that end up
3762
+ // having the same representation in local time, e.g. one hour before
3763
+ // DST ends vs. the instant that DST ends.
3764
+ function compareLocalAsc(dateLeft, dateRight) {
3765
+ var diff = dateLeft.getFullYear() - dateRight.getFullYear() || dateLeft.getMonth() - dateRight.getMonth() || dateLeft.getDate() - dateRight.getDate() || dateLeft.getHours() - dateRight.getHours() || dateLeft.getMinutes() - dateRight.getMinutes() || dateLeft.getSeconds() - dateRight.getSeconds() || dateLeft.getMilliseconds() - dateRight.getMilliseconds();
3766
+ if (diff < 0) {
3767
+ return -1;
3768
+ } else if (diff > 0) {
3769
+ return 1;
3770
+ // Return 0 if diff is 0; return NaN if diff is NaN
3771
+ } else {
3772
+ return diff;
3773
+ }
3774
+ }
3775
+
3776
+ /**
3777
+ * @name differenceInDays
3778
+ * @category Day Helpers
3779
+ * @summary Get the number of full days between the given dates.
3780
+ *
3781
+ * @description
3782
+ * Get the number of full day periods between two dates. Fractional days are
3783
+ * truncated towards zero.
3784
+ *
3785
+ * One "full day" is the distance between a local time in one day to the same
3786
+ * local time on the next or previous day. A full day can sometimes be less than
3787
+ * or more than 24 hours if a daylight savings change happens between two dates.
3788
+ *
3789
+ * To ignore DST and only measure exact 24-hour periods, use this instead:
3790
+ * `Math.floor(differenceInHours(dateLeft, dateRight)/24)|0`.
3791
+ *
3792
+ *
3793
+ * @param {Date|Number} dateLeft - the later date
3794
+ * @param {Date|Number} dateRight - the earlier date
3795
+ * @returns {Number} the number of full days according to the local timezone
3796
+ * @throws {TypeError} 2 arguments required
3797
+ *
3798
+ * @example
3799
+ * // How many full days are between
3800
+ * // 2 July 2011 23:00:00 and 2 July 2012 00:00:00?
3801
+ * const result = differenceInDays(
3802
+ * new Date(2012, 6, 2, 0, 0),
3803
+ * new Date(2011, 6, 2, 23, 0)
3804
+ * )
3805
+ * //=> 365
3806
+ * // How many full days are between
3807
+ * // 2 July 2011 23:59:00 and 3 July 2011 00:01:00?
3808
+ * const result = differenceInDays(
3809
+ * new Date(2011, 6, 3, 0, 1),
3810
+ * new Date(2011, 6, 2, 23, 59)
3811
+ * )
3812
+ * //=> 0
3813
+ * // How many full days are between
3814
+ * // 1 March 2020 0:00 and 1 June 2020 0:00 ?
3815
+ * // Note: because local time is used, the
3816
+ * // result will always be 92 days, even in
3817
+ * // time zones where DST starts and the
3818
+ * // period has only 92*24-1 hours.
3819
+ * const result = differenceInDays(
3820
+ * new Date(2020, 5, 1),
3821
+ * new Date(2020, 2, 1)
3822
+ * )
3823
+ //=> 92
3824
+ */
3825
+ function differenceInDays(dirtyDateLeft, dirtyDateRight) {
3826
+ requiredArgs(2, arguments);
3827
+ var dateLeft = toDate(dirtyDateLeft);
3828
+ var dateRight = toDate(dirtyDateRight);
3829
+ var sign = compareLocalAsc(dateLeft, dateRight);
3830
+ var difference = Math.abs(differenceInCalendarDays(dateLeft, dateRight));
3831
+ dateLeft.setDate(dateLeft.getDate() - sign * difference);
3832
+
3833
+ // Math.abs(diff in full days - diff in calendar days) === 1 if last calendar day is not full
3834
+ // If so, result must be decreased by 1 in absolute value
3835
+ var isLastDayNotFull = Number(compareLocalAsc(dateLeft, dateRight) === -sign);
3836
+ var result = sign * (difference - isLastDayNotFull);
3837
+ // Prevent negative zero
3838
+ return result === 0 ? 0 : result;
3839
+ }
3840
+
3841
+ /**
3842
+ * @name endOfDay
3843
+ * @category Day Helpers
3844
+ * @summary Return the end of a day for the given date.
3845
+ *
3846
+ * @description
3847
+ * Return the end of a day for the given date.
3848
+ * The result will be in the local timezone.
3849
+ *
3850
+ * @param {Date|Number} date - the original date
3851
+ * @returns {Date} the end of a day
3852
+ * @throws {TypeError} 1 argument required
3853
+ *
3854
+ * @example
3855
+ * // The end of a day for 2 September 2014 11:55:00:
3856
+ * const result = endOfDay(new Date(2014, 8, 2, 11, 55, 0))
3857
+ * //=> Tue Sep 02 2014 23:59:59.999
3858
+ */
3859
+ function endOfDay(dirtyDate) {
3860
+ requiredArgs(1, arguments);
3861
+ var date = toDate(dirtyDate);
3862
+ date.setHours(23, 59, 59, 999);
3863
+ return date;
3864
+ }
3865
+
3760
3866
  /**
3761
3867
  * @name endOfMonth
3762
3868
  * @category Month Helpers
@@ -10817,83 +10923,304 @@ var reactResponsive = {exports: {}};
10817
10923
 
10818
10924
  var reactResponsiveExports = reactResponsive.exports;
10819
10925
 
10820
- var SpinnerSVG = function (_a) {
10821
- var fill = _a.fill, size = _a.size;
10822
- return (React__default__default.createElement("svg", { xmlns: "http://www.w3.org/2000/svg", width: "".concat(size || 25), height: "".concat(size || 25), viewBox: "0 0 24 24" },
10823
- React__default__default.createElement("style", null, "\n .spinner_z9k8 {\n transform-origin: center;\n animation: spinner_StKS .75s infinite linear;\n }\n @keyframes spinner_StKS {\n 100% {\n transform: rotate(360deg);\n }\n }\n "),
10824
- React__default__default.createElement("path", { d: "M12,1A11,11,0,1,0,23,12,11,11,0,0,0,12,1Zm0,19a8,8,0,1,1,8-8A8,8,0,0,1,12,20Z", opacity: ".25", fill: fill }),
10825
- React__default__default.createElement("path", { d: "M12,4a8,8,0,0,1,7.89,6.7A1.53,1.53,0,0,0,21.38,12h0a1.5,1.5,0,0,0,1.48-1.75,11,11,0,0,0-21.72,0A1.5,1.5,0,0,0,2.62,12h0a1.53,1.53,0,0,0,1.49-1.3A8,8,0,0,1,12,4Z", className: "spinner_z9k8", fill: fill })));
10926
+ var IconsSvg = function (_a) {
10927
+ var fill = _a.fill, size = _a.size, icon = _a.icon;
10928
+ switch (icon) {
10929
+ case 'spinner':
10930
+ return (React__default__default.createElement("svg", { xmlns: "http://www.w3.org/2000/svg", width: "".concat(size || 25), height: "".concat(size || 25), viewBox: "0 0 24 24" },
10931
+ React__default__default.createElement("style", null, "\n .spinner_z9k8 {\n transform-origin: center;\n animation: spinner_StKS .75s infinite linear;\n }\n @keyframes spinner_StKS {\n 100% {\n transform: rotate(360deg);\n }\n }\n "),
10932
+ React__default__default.createElement("path", { d: "M12,1A11,11,0,1,0,23,12,11,11,0,0,0,12,1Zm0,19a8,8,0,1,1,8-8A8,8,0,0,1,12,20Z", opacity: ".25", fill: fill }),
10933
+ React__default__default.createElement("path", { d: "M12,4a8,8,0,0,1,7.89,6.7A1.53,1.53,0,0,0,21.38,12h0a1.5,1.5,0,0,0,1.48-1.75,11,11,0,0,0-21.72,0A1.5,1.5,0,0,0,2.62,12h0a1.53,1.53,0,0,0,1.49-1.3A8,8,0,0,1,12,4Z", className: "spinner_z9k8", fill: fill })));
10934
+ case 'warning':
10935
+ return (React__default__default.createElement("svg", { xmlns: "http://www.w3.org/2000/svg", width: "".concat(size || 25), height: "".concat(size || 25), className: "svg-icon", style: {
10936
+ verticalAlign: 'middle',
10937
+ fill: fill,
10938
+ overflow: 'hidden',
10939
+ }, viewBox: "0 0 1024 1024", version: "1.1" },
10940
+ React__default__default.createElement("path", { d: "M42.666667 896h938.666666L512 85.333333 42.666667 896z m512-128h-85.333334v-85.333333h85.333334v85.333333z m0-170.666667h-85.333334v-170.666666h85.333334v170.666666z" })));
10941
+ }
10826
10942
  };
10827
10943
 
10828
- var css_248z$9 = ".rdp {\n --rdp-cell-size: 40px;\n --rdp-caption-font-size: 18px;\n --rdp-accent-color: #0000ff;\n --rdp-background-color: #e7edff;\n --rdp-accent-color-dark: #3003e1;\n --rdp-background-color-dark: #180270;\n --rdp-outline: 2px solid var(--rdp-accent-color); /* Outline border for focused elements */\n --rdp-outline-selected: 3px solid var(--rdp-accent-color); /* Outline border for focused _and_ selected elements */\n\n margin: 1em;\n}\n\n/* Hide elements for devices that are not screen readers */\n.rdp-vhidden {\n box-sizing: border-box;\n padding: 0;\n margin: 0;\n background: transparent;\n border: 0;\n -moz-appearance: none;\n -webkit-appearance: none;\n appearance: none;\n position: absolute !important;\n top: 0;\n width: 1px !important;\n height: 1px !important;\n padding: 0 !important;\n overflow: hidden !important;\n clip: rect(1px, 1px, 1px, 1px) !important;\n border: 0 !important;\n}\n\n/* Buttons */\n.rdp-button_reset {\n appearance: none;\n position: relative;\n margin: 0;\n padding: 0;\n cursor: default;\n color: inherit;\n background: none;\n font: inherit;\n\n -moz-appearance: none;\n -webkit-appearance: none;\n}\n\n.rdp-button_reset:focus-visible {\n /* Make sure to reset outline only when :focus-visible is supported */\n outline: none;\n}\n\n.rdp-button {\n border: 2px solid transparent;\n}\n\n.rdp-button[disabled]:not(.rdp-day_selected) {\n opacity: 0.25;\n}\n\n.rdp-button:not([disabled]) {\n cursor: pointer;\n}\n\n.rdp-button:focus-visible:not([disabled]) {\n color: inherit;\n background-color: var(--rdp-background-color);\n border: var(--rdp-outline);\n}\n\n.rdp-button:hover:not([disabled]):not(.rdp-day_selected) {\n background-color: var(--rdp-background-color);\n}\n\n.rdp-months {\n display: flex;\n}\n\n.rdp-month {\n margin: 0 1em;\n}\n\n.rdp-month:first-child {\n margin-left: 0;\n}\n\n.rdp-month:last-child {\n margin-right: 0;\n}\n\n.rdp-table {\n margin: 0;\n max-width: calc(var(--rdp-cell-size) * 7);\n border-collapse: collapse;\n}\n\n.rdp-with_weeknumber .rdp-table {\n max-width: calc(var(--rdp-cell-size) * 8);\n border-collapse: collapse;\n}\n\n.rdp-caption {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 0;\n text-align: left;\n}\n\n.rdp-multiple_months .rdp-caption {\n position: relative;\n display: block;\n text-align: center;\n}\n\n.rdp-caption_dropdowns {\n position: relative;\n display: inline-flex;\n}\n\n.rdp-caption_label {\n position: relative;\n z-index: 1;\n display: inline-flex;\n align-items: center;\n margin: 0;\n padding: 0 0.25em;\n white-space: nowrap;\n color: currentColor;\n border: 0;\n border: 2px solid transparent;\n font-family: inherit;\n font-size: var(--rdp-caption-font-size);\n font-weight: bold;\n}\n\n.rdp-nav {\n white-space: nowrap;\n}\n\n.rdp-multiple_months .rdp-caption_start .rdp-nav {\n position: absolute;\n top: 50%;\n left: 0;\n transform: translateY(-50%);\n}\n\n.rdp-multiple_months .rdp-caption_end .rdp-nav {\n position: absolute;\n top: 50%;\n right: 0;\n transform: translateY(-50%);\n}\n\n.rdp-nav_button {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: var(--rdp-cell-size);\n height: var(--rdp-cell-size);\n padding: 0.25em;\n border-radius: 100%;\n}\n\n/* ---------- */\n/* Dropdowns */\n/* ---------- */\n\n.rdp-dropdown_year,\n.rdp-dropdown_month {\n position: relative;\n display: inline-flex;\n align-items: center;\n}\n\n.rdp-dropdown {\n appearance: none;\n position: absolute;\n z-index: 2;\n top: 0;\n bottom: 0;\n left: 0;\n width: 100%;\n margin: 0;\n padding: 0;\n cursor: inherit;\n opacity: 0;\n border: none;\n background-color: transparent;\n font-family: inherit;\n font-size: inherit;\n line-height: inherit;\n}\n\n.rdp-dropdown[disabled] {\n opacity: unset;\n color: unset;\n}\n\n.rdp-dropdown:focus-visible:not([disabled]) + .rdp-caption_label {\n background-color: var(--rdp-background-color);\n border: var(--rdp-outline);\n border-radius: 6px;\n}\n\n.rdp-dropdown_icon {\n margin: 0 0 0 5px;\n}\n\n.rdp-head {\n border: 0;\n}\n\n.rdp-head_row,\n.rdp-row {\n height: 100%;\n}\n\n.rdp-head_cell {\n vertical-align: middle;\n font-size: 0.75em;\n font-weight: 700;\n text-align: center;\n height: 100%;\n height: var(--rdp-cell-size);\n padding: 0;\n text-transform: uppercase;\n}\n\n.rdp-tbody {\n border: 0;\n}\n\n.rdp-tfoot {\n margin: 0.5em;\n}\n\n.rdp-cell {\n width: var(--rdp-cell-size);\n height: 100%;\n height: var(--rdp-cell-size);\n padding: 0;\n text-align: center;\n}\n\n.rdp-weeknumber {\n font-size: 0.75em;\n}\n\n.rdp-weeknumber,\n.rdp-day {\n display: flex;\n overflow: hidden;\n align-items: center;\n justify-content: center;\n box-sizing: border-box;\n width: var(--rdp-cell-size);\n max-width: var(--rdp-cell-size);\n height: var(--rdp-cell-size);\n margin: 0;\n border: 2px solid transparent;\n border-radius: 100%;\n}\n\n.rdp-day_today:not(.rdp-day_outside) {\n font-weight: bold;\n}\n\n.rdp-day_selected,\n.rdp-day_selected:focus-visible,\n.rdp-day_selected:hover {\n color: white;\n opacity: 1;\n background-color: var(--rdp-accent-color);\n}\n\n.rdp-day_outside {\n opacity: 0.5;\n}\n\n.rdp-day_selected:focus-visible {\n /* Since the background is the same use again the outline */\n outline: var(--rdp-outline);\n outline-offset: 2px;\n z-index: 1;\n}\n\n.rdp:not([dir='rtl']) .rdp-day_range_start:not(.rdp-day_range_end) {\n border-top-right-radius: 0;\n border-bottom-right-radius: 0;\n}\n\n.rdp:not([dir='rtl']) .rdp-day_range_end:not(.rdp-day_range_start) {\n border-top-left-radius: 0;\n border-bottom-left-radius: 0;\n}\n\n.rdp[dir='rtl'] .rdp-day_range_start:not(.rdp-day_range_end) {\n border-top-left-radius: 0;\n border-bottom-left-radius: 0;\n}\n\n.rdp[dir='rtl'] .rdp-day_range_end:not(.rdp-day_range_start) {\n border-top-right-radius: 0;\n border-bottom-right-radius: 0;\n}\n\n.rdp-day_range_end.rdp-day_range_start {\n border-radius: 100%;\n}\n\n.rdp-day_range_middle {\n border-radius: 0;\n}";
10829
- styleInject(css_248z$9);
10944
+ var parseDates = function (_a) {
10945
+ var calendarRange = _a.calendarRange;
10946
+ return (calendarRange === null || calendarRange === void 0 ? void 0 : calendarRange.to) && (calendarRange === null || calendarRange === void 0 ? void 0 : calendarRange.from)
10947
+ ? "".concat(format(calendarRange.from, 'dd.MM.yyyy'), " -\n").concat(format(calendarRange.to, 'dd.MM.yyyy'))
10948
+ : null;
10949
+ };
10830
10950
 
10831
- var css_248z$8 = ".will-calendar-filter-container {\n display: flex;\n justify-content: center;\n user-select: none;\n}\n\n/* Calendar overrides */\n\n\n.will-calendar-filter-container .DayPicker {\n font-size: 25px; /* Adjust this value to make the DayPicker bigger */\n}\n\n.will-calendar-filter-container .rdp-month {\n position: relative;\n}\n\n.will-calendar-filter-container .rdp-month.rdp-caption_start {\n padding-left: 70px;\n}\n\n.will-calendar-filter-container .rdp-month.rdp-caption_end {\n padding-right: 70px;\n}\n\n.will-calendar-filter-container .rdp-month .rdp-nav {\n border: 1px solid var(--will-primary);\n border-radius: 50%;\n}\n\n.will-calendar-filter-container .rdp-month .rdp-nav svg {\n color: var(--will-primary);\n}\n\n\n.will-calendar-filter-container .rdp-month .rdp-caption {\n position: initial;\n}\n\n.will-calendar-filter-container .rdp-month .rdp-caption > .rdp-caption_label,\n.will-calendar-filter-container .rdp-table .rdp-head {\n opacity: .6;\n}\n\n.will-calendar-filter-container .rdp-button_reset.rdp-button.rdp-day.rdp-day_selected {\n background-color: var(--will-primary);\n opacity: 1;\n}\n\n.will-calendar-filter-container .my-today:not(.rdp-day_selected) { \n font-weight: 700;\n opacity: 1;\n color: var(--will-primary);\n}\n\n.will-calendar-filter-container .rdp-cell {\n position: relative;\n}\n\n.will-calendar-filter-container .rdp-cell button {\n font-weight: 500;\n}\n\n.will-calendar-filter-container .rdp-cell button.booked {\n font-weight: 400;\n cursor: not-allowed;\n}\n\n.will-calendar-filter-container .rdp-cell .rdp-button[disabled] {\n opacity: 0.5;\n}\n\n@media (max-width: 960px) {\n .will-calendar-filter-container .rdp-month .rdp-nav {\n border: none;\n border-radius: initial;\n }\n\n .will-calendar-filter-container .rdp-month.rdp-caption_start {\n padding-left: 10px;\n }\n \n .will-calendar-filter-container .rdp-month.rdp-caption_end {\n padding-right: 10px;\n }\n}\n\n/* Tooltip */\n.will-root .will-calendar-filter-container .will-calendar-tooltip,\n.will-root .will-calendar-filter-container .will-calendar-tooltip-check-out,\n.will-root .will-calendar-filter-container .will-calendar-tooltip-overlapping-date {\n position: absolute;\n top: -42px;\n transform: translateX(calc(-50% + 20px));\n display: none;\n white-space: nowrap;\n z-index: 2;\n}\n.will-root .will-calendar-filter-container .will-calendar-tooltip > div,\n.will-root .will-calendar-filter-container .will-calendar-tooltip-check-out > div,\n.will-root .will-calendar-filter-container .will-calendar-tooltip-overlapping-date > div {\n background-color: white;\n position: relative;\n padding: 5px 10px;\n border: 1px solid var(--will-primary);\n border-radius: 5px;\n}\n\n.will-root .will-calendar-filter-container .will-calendar-tooltip::before,\n.will-root .will-calendar-filter-container .will-calendar-tooltip-check-out::before,\n.will-root .will-calendar-filter-container .will-calendar-tooltip-overlapping-date::before {\n content: \"\";\n width: 10px;\n height: 10px;\n border: 1px solid var(--will-primary);\n position: absolute;\n bottom: -4px;\n left:calc(50% - 5.555px);\n rotate: 45deg;\n z-index: 0;\n background-color: var(--will-white);\n}\n\n.will-root .will-calendar-filter-container .rdp-cell:hover .will-calendar-tooltip,\n.will-root .will-calendar-filter-container .rdp-cell:hover .will-calendar-tooltip-check-out,\n.will-root .will-calendar-filter-container .rdp-cell:hover .will-calendar-tooltip-overlapping-date {\n display: block;\n}\n\n/* Loading spinner */\n\n.will-root .will-calendar-filter-container .rdp-months {\n position: relative;\n}\n\n.will-root .will-calendar-filter-container .will-calendar-spinner {\n position: absolute;\n top:0;\n bottom:0;\n left: 0;\n right: 0;\n background-color: var(--will-white-transparent);\n z-index: 3;\n display: none;\n justify-content: center;\n align-items: center;\n font-weight: 600;\n}\n\n/* No active selection */\n\n.will-root .will-calendar-filter-container .rdp-day_selected.rdp-day_range_start.no-active-selection,\n.will-root .will-calendar-filter-container .rdp-day_selected.rdp-day_range_middle.no-active-selection,\n.will-root .will-calendar-filter-container .rdp-day_selected.rdp-day_range_end.no-active-selection {\n background-color: var(--will-onahau);\n color: inherit;\n}\n\n.will-root .will-calendar-filter-container .rdp-day_selected.rdp-day_range_start.no-active-selection:hover,\n.will-root .will-calendar-filter-container .rdp-day_selected.rdp-day_range_middle.no-active-selection:hover,\n.will-root .will-calendar-filter-container .rdp-day_selected.rdp-day_range_end.no-active-selection:hover {\n background-color: var(--rdp-background-color);\n}\n\n/* Overlapping date */\n\n.will-root .will-calendar-filter-container .overlapping-date {\n user-select: none;\n pointer-events: none;\n \n}\n\n.will-root .will-calendar-filter-container .overlapping-date:hover {\n cursor: not-allowed;\n}\n\n\n";
10832
- styleInject(css_248z$8);
10951
+ var parseDate = function (_a) {
10952
+ var date = _a.date, _b = _a.dateFormat, dateFormat = _b === void 0 ? 'dd.MM.yyyy' : _b, language = _a.language;
10953
+ return date
10954
+ ? format(date, dateFormat, { locale: language === 'en' ? enUS : fi })
10955
+ : null;
10956
+ };
10833
10957
 
10834
- var Calendar = forwardRef(function (_a, ref) {
10958
+ var nightsCount = function (_a) {
10959
+ var calendarRange = _a.calendarRange;
10960
+ if (!calendarRange || !calendarRange.from || !calendarRange.to) {
10961
+ return undefined;
10962
+ }
10963
+ var diffDays = differenceInCalendarDays(calendarRange.to, calendarRange.from);
10964
+ return diffDays;
10965
+ };
10966
+
10967
+ var calendarSelectionRules = function (_a) {
10835
10968
  var _b;
10836
- var selectedPath = _a.selectedPath, calendarRange = _a.calendarRange, setCalendarRange = _a.setCalendarRange, language = _a.language, disableCalendarDates = _a.disableCalendarDates, requestDates = _a.requestDates, disabledDates = _a.disabledDates, setDisabledDates = _a.setDisabledDates, updateCalendarMonthNavigation = _a.updateCalendarMonthNavigation, setUpdateCalendarMonthNavigation = _a.setUpdateCalendarMonthNavigation, updateCalendarDefaultMoth = _a.updateCalendarDefaultMoth, loadingData = _a.loadingData, initialCalendarRange = _a.initialCalendarRange, showFeedback = _a.showFeedback, palette = _a.palette, setOverlappingDates = _a.setOverlappingDates;
10837
- // Translations
10838
- var t = useTranslation('common').t;
10839
- var isTablet = reactResponsiveExports.useMediaQuery({ maxWidth: 960 });
10840
- var today = startOfDay(new Date());
10841
- var selectedStartDate = calendarRange === null || calendarRange === void 0 ? void 0 : calendarRange.from;
10842
- // Handle overlapping availableDates.lastCheckOut and disabledDates.start
10843
- var _c = __read(useState(undefined), 2), overlappingDate = _c[0], setOverlappingDate = _c[1];
10844
- var newDisableCalendarDates = useMemo(function () {
10845
- if (disableCalendarDates === null || disableCalendarDates === void 0 ? void 0 : disableCalendarDates.availableDates) {
10846
- var dateFormat_1 = 'dd-MM-yyyy';
10847
- var disabledDates_1 = disableCalendarDates.disabledDates;
10848
- var _a = (disabledDates_1 || []).reduce(function (acc, dateRange) {
10849
- var _a, _b;
10850
- var formattedFromDate = format(dateRange.from, dateFormat_1);
10851
- var formattedToDate = format(dateRange.to, dateFormat_1);
10852
- var hasTwoOverlappingDates = (_a = disableCalendarDates.availableDates) === null || _a === void 0 ? void 0 : _a.some(function (item) {
10853
- return format(item.lastCheckOut, dateFormat_1) === formattedFromDate &&
10854
- format(item.lastCheckOut, dateFormat_1) === formattedToDate;
10855
- });
10856
- var hasOneOverlappingDate = (_b = disableCalendarDates.availableDates) === null || _b === void 0 ? void 0 : _b.some(function (item) {
10857
- return format(item.lastCheckOut, dateFormat_1) === formattedFromDate &&
10858
- format(item.lastCheckOut, dateFormat_1) !== formattedToDate;
10859
- });
10860
- if (hasTwoOverlappingDates) {
10861
- acc.newOverlappingDates.push(dateRange);
10862
- }
10863
- else if (hasOneOverlappingDate) {
10864
- acc.newOverlappingDates.push(dateRange);
10865
- acc.updatedDisabledDates.push(__assign$2(__assign$2({}, dateRange), { from: addDays(dateRange.from, 1) }));
10866
- }
10867
- else {
10868
- acc.updatedDisabledDates.push(dateRange);
10869
- }
10870
- return acc;
10871
- }, { updatedDisabledDates: [], newOverlappingDates: [] }), updatedDisabledDates = _a.updatedDisabledDates, newOverlappingDates_1 = _a.newOverlappingDates;
10872
- if (newOverlappingDates_1.length) {
10873
- setOverlappingDate(function (prev) {
10874
- if (prev === void 0) { prev = []; }
10875
- return __spreadArray$1(__spreadArray$1([], __read(prev), false), __read(newOverlappingDates_1), false);
10876
- });
10877
- }
10878
- var newDisableCalendarDates_1 = __assign$2(__assign$2({}, disableCalendarDates), { disabledDates: updatedDisabledDates });
10879
- return newDisableCalendarDates_1;
10880
- }
10881
- return disableCalendarDates;
10882
- }, [
10883
- disableCalendarDates,
10884
- calendarRange,
10885
- updateCalendarMonthNavigation,
10886
- initialCalendarRange,
10887
- updateCalendarDefaultMoth,
10888
- ]);
10889
- // Handle disable dates by page
10890
- var disabledDatesByPage = handleDisabledDatesByPage({
10891
- today: today,
10892
- selectedPath: selectedPath,
10969
+ var range = _a.range, newDisableCalendarDates = _a.newDisableCalendarDates, setCalendarRange = _a.setCalendarRange, setDisabledDates = _a.setDisabledDates, calendarRange = _a.calendarRange, overlappingDate = _a.overlappingDate, setCalendarHasError = _a.setCalendarHasError, rangeContext = _a.rangeContext;
10970
+ // Get and parse needed data
10971
+ var dateFormat = 'dd-MM-yyyy';
10972
+ var rangeFrom = (range === null || range === void 0 ? void 0 : range.from) ? format(range.from, dateFormat) : null;
10973
+ var rangeTo = (range === null || range === void 0 ? void 0 : range.to) ? format(range.to, dateFormat) : null;
10974
+ var calendarFrom = (calendarRange === null || calendarRange === void 0 ? void 0 : calendarRange.from)
10975
+ ? format(calendarRange === null || calendarRange === void 0 ? void 0 : calendarRange.from, dateFormat)
10976
+ : null;
10977
+ (calendarRange === null || calendarRange === void 0 ? void 0 : calendarRange.to)
10978
+ ? format(calendarRange === null || calendarRange === void 0 ? void 0 : calendarRange.to, dateFormat)
10979
+ : null;
10980
+ (rangeContext === null || rangeContext === void 0 ? void 0 : rangeContext.from)
10981
+ ? format(rangeContext.from, dateFormat)
10982
+ : null;
10983
+ var overlappingDateFrom = (overlappingDate === null || overlappingDate === void 0 ? void 0 : overlappingDate.length)
10984
+ ? overlappingDate.find(function (date) {
10985
+ return date.from ? format(date.from, dateFormat) === rangeFrom : false;
10986
+ })
10987
+ : null;
10988
+ var checkOutRange = ((_b = newDisableCalendarDates === null || newDisableCalendarDates === void 0 ? void 0 : newDisableCalendarDates.availableDates) === null || _b === void 0 ? void 0 : _b.length)
10989
+ ? newDisableCalendarDates.availableDates.find(function (checkInDate) {
10990
+ return format(checkInDate.checkIn || 1, dateFormat) ===
10991
+ format((range === null || range === void 0 ? void 0 : range.from) || 1, dateFormat);
10992
+ })
10993
+ : null;
10994
+ // On check-in, disable future dates that are unavailable for checkout
10995
+ disableFutureDates({
10996
+ rangeFrom: rangeFrom,
10997
+ checkOutRange: checkOutRange,
10998
+ setDisabledDates: setDisabledDates,
10999
+ dateFormat: dateFormat,
10893
11000
  newDisableCalendarDates: newDisableCalendarDates,
10894
11001
  });
10895
- // Handle tooltip
10896
- useEffect(function () {
11002
+ // Calendar selection rules
11003
+ switch (true) {
11004
+ case !!overlappingDateFrom:
11005
+ // Clear the selection when overlapping dates are detected
11006
+ return setCalendarRange(undefined);
11007
+ case !!((!rangeTo && !rangeFrom && calendarFrom) || rangeTo === rangeFrom):
11008
+ // Handle double-click on the same date
11009
+ return setCalendarRange({ from: calendarRange === null || calendarRange === void 0 ? void 0 : calendarRange.from, to: undefined });
11010
+ case (range === null || range === void 0 ? void 0 : range.to) &&
11011
+ (calendarRange === null || calendarRange === void 0 ? void 0 : calendarRange.to) &&
11012
+ isAfter(endOfDay(range.to), endOfDay(calendarRange.to)) &&
11013
+ !((range === null || range === void 0 ? void 0 : range.to) &&
11014
+ (rangeContext === null || rangeContext === void 0 ? void 0 : rangeContext.to) &&
11015
+ isAfter(startOfDay(range.to), startOfDay(rangeContext.to))):
11016
+ // Handle checkout selection greater than current checkout
11017
+ return setCalendarRange({ from: range === null || range === void 0 ? void 0 : range.to, to: undefined });
11018
+ case calendarFrom && rangeFrom && rangeFrom !== calendarFrom:
11019
+ // Handle check-in selection prior to current check-in
11020
+ return setCalendarRange({ from: range === null || range === void 0 ? void 0 : range.from, to: undefined });
11021
+ case checkOutRange && (range === null || range === void 0 ? void 0 : range.to) && checkOutRange.lastCheckOut < range.to:
11022
+ return setCalendarRange({ from: range === null || range === void 0 ? void 0 : range.to, to: undefined });
11023
+ // Handle checkout selection between the range context and first passible check-in
11024
+ case (range === null || range === void 0 ? void 0 : range.to) &&
11025
+ (rangeContext === null || rangeContext === void 0 ? void 0 : rangeContext.from) &&
11026
+ isBefore(startOfDay(range.to), startOfDay(rangeContext.from)):
11027
+ return setCalendarRange({ from: range === null || range === void 0 ? void 0 : range.to, to: undefined });
11028
+ case (range === null || range === void 0 ? void 0 : range.from) &&
11029
+ (rangeContext === null || rangeContext === void 0 ? void 0 : rangeContext.to) &&
11030
+ isAfter(startOfDay(range.from), startOfDay(rangeContext.to)):
11031
+ return (setCalendarRange(undefined),
11032
+ setCalendarHasError && setCalendarHasError(true));
11033
+ //
11034
+ default:
11035
+ // Apply the given range
11036
+ return setCalendarRange(range);
11037
+ }
11038
+ };
11039
+ /////////
11040
+ var disableFutureDates = function (_a) {
11041
+ var rangeFrom = _a.rangeFrom, checkOutRange = _a.checkOutRange, setDisabledDates = _a.setDisabledDates, dateFormat = _a.dateFormat, newDisableCalendarDates = _a.newDisableCalendarDates;
11042
+ if (rangeFrom && checkOutRange && setDisabledDates) {
11043
+ // Get and parse data
11044
+ var checkIn = addDays(checkOutRange.checkIn, 1);
11045
+ var firstCheckOut = addDays(checkOutRange.firstCheckOut, -1);
11046
+ var noDatesRange = format(checkIn, dateFormat) ===
11047
+ format(checkOutRange.firstCheckOut, dateFormat);
11048
+ // -------------------
11049
+ setDisabledDates(__spreadArray$1(__spreadArray$1([], __read(((newDisableCalendarDates === null || newDisableCalendarDates === void 0 ? void 0 : newDisableCalendarDates.disabledDates) || [])), false), [
11050
+ {
11051
+ from: noDatesRange ? undefined : checkIn,
11052
+ to: noDatesRange ? undefined : firstCheckOut,
11053
+ },
11054
+ ], false));
11055
+ }
11056
+ };
11057
+
11058
+ var disabledDatesByPage = function (_a) {
11059
+ var _b, _c, _d;
11060
+ var newDisableCalendarDates = _a.newDisableCalendarDates, selectedPath = _a.selectedPath, today = _a.today;
11061
+ var daysToOffsetCalendar = (newDisableCalendarDates === null || newDisableCalendarDates === void 0 ? void 0 : newDisableCalendarDates.disabledDatesByPage) && selectedPath
11062
+ ? [
11063
+ (_b = newDisableCalendarDates === null || newDisableCalendarDates === void 0 ? void 0 : newDisableCalendarDates.disabledDatesByPage) === null || _b === void 0 ? void 0 : _b.find(function (item) { return selectedPath === item.page; }),
11064
+ ]
11065
+ : [];
11066
+ return daysToOffsetCalendar.length
11067
+ ? [
11068
+ {
11069
+ from: addDays(today, daysToOffsetCalendar.length && ((_c = daysToOffsetCalendar[0]) === null || _c === void 0 ? void 0 : _c.offset)
11070
+ ? (_d = daysToOffsetCalendar[0]) === null || _d === void 0 ? void 0 : _d.offset
11071
+ : -2),
11072
+ to: addDays(today, -100),
11073
+ },
11074
+ ]
11075
+ : [];
11076
+ };
11077
+
11078
+ var handleCalendarModifiers = function (_a) {
11079
+ var _b;
11080
+ var newDisableCalendarDates = _a.newDisableCalendarDates, calendarRange = _a.calendarRange, disabledDatesByPage = _a.disabledDatesByPage, disabledDates = _a.disabledDates, overlappingDate = _a.overlappingDate, rangeContext = _a.rangeContext, firstPossibleRangeContextCheckIn = _a.firstPossibleRangeContextCheckIn, lastPossibleRangeContextCheckOut = _a.lastPossibleRangeContextCheckOut, findFirstPossibleRangeContextCheckIn = _a.findFirstPossibleRangeContextCheckIn, findLastPossibleRangeContextCheckOut = _a.findLastPossibleRangeContextCheckOut, currentSelectionLastCheckoutDate = _a.currentSelectionLastCheckoutDate;
11081
+ // Create range for range context middle selection and current overlapping selection
11082
+ var rangeContextMiddleSelection = (rangeContext === null || rangeContext === void 0 ? void 0 : rangeContext.from) && (rangeContext === null || rangeContext === void 0 ? void 0 : rangeContext.to)
11083
+ ? Array.from({ length: differenceInDays(rangeContext.to, rangeContext.from) - 1 }, function (_, i) { return ({
11084
+ from: addDays(rangeContext.from, i + 1),
11085
+ to: addDays(rangeContext.from, i + 1),
11086
+ }); }).filter(function (date) {
11087
+ return !(((calendarRange === null || calendarRange === void 0 ? void 0 : calendarRange.from) &&
11088
+ isEqual(endOfDay(calendarRange.from), endOfDay(date.from))) ||
11089
+ ((calendarRange === null || calendarRange === void 0 ? void 0 : calendarRange.to) &&
11090
+ isEqual(endOfDay(calendarRange.to), endOfDay(date.from))));
11091
+ })
11092
+ : [];
11093
+ return {
11094
+ booked: disabledDatesByPage.length
11095
+ ? disabledDatesByPage
11096
+ : (disabledDates === null || disabledDates === void 0 ? void 0 : disabledDates.length)
11097
+ ? __spreadArray$1(__spreadArray$1(__spreadArray$1([], __read(disabledDates), false), __read(firstPossibleRangeContextCheckIn), false), __read(lastPossibleRangeContextCheckOut), false) : ((_b = newDisableCalendarDates === null || newDisableCalendarDates === void 0 ? void 0 : newDisableCalendarDates.disabledDates) === null || _b === void 0 ? void 0 : _b.length)
11098
+ ? __spreadArray$1(__spreadArray$1(__spreadArray$1([], __read(newDisableCalendarDates === null || newDisableCalendarDates === void 0 ? void 0 : newDisableCalendarDates.disabledDates), false), __read(firstPossibleRangeContextCheckIn), false), __read(lastPossibleRangeContextCheckOut), false) : [],
11099
+ disabledAfterCheckIn: (calendarRange === null || calendarRange === void 0 ? void 0 : calendarRange.from)
11100
+ ? [{ after: calendarRange.from }]
11101
+ : [],
11102
+ overlappingDate: __spreadArray$1([], __read((!(calendarRange === null || calendarRange === void 0 ? void 0 : calendarRange.from) && !!(overlappingDate === null || overlappingDate === void 0 ? void 0 : overlappingDate.length) && !rangeContext
11103
+ ? overlappingDate.map(function (date) { return ({ from: date.from }); })
11104
+ : [])), false),
11105
+ noActiveSelectionStart: (rangeContext === null || rangeContext === void 0 ? void 0 : rangeContext.from) &&
11106
+ !((calendarRange === null || calendarRange === void 0 ? void 0 : calendarRange.from) &&
11107
+ (rangeContext === null || rangeContext === void 0 ? void 0 : rangeContext.from) &&
11108
+ isEqual(endOfDay(rangeContext.from), endOfDay(calendarRange.from)))
11109
+ ? rangeContext.from
11110
+ : [],
11111
+ noActiveSelectionMid: __spreadArray$1([], __read((rangeContextMiddleSelection.length
11112
+ ? rangeContextMiddleSelection
11113
+ : [])), false),
11114
+ noActiveSelectionEnd: (rangeContext === null || rangeContext === void 0 ? void 0 : rangeContext.to) &&
11115
+ !((calendarRange === null || calendarRange === void 0 ? void 0 : calendarRange.from) &&
11116
+ (rangeContext === null || rangeContext === void 0 ? void 0 : rangeContext.to) &&
11117
+ isEqual(endOfDay(rangeContext.to), endOfDay(calendarRange.from)))
11118
+ ? rangeContext.to
11119
+ : [],
11120
+ checkoutOptionsMid: __spreadArray$1([], __read(((calendarRange === null || calendarRange === void 0 ? void 0 : calendarRange.from) &&
11121
+ !(calendarRange === null || calendarRange === void 0 ? void 0 : calendarRange.to) &&
11122
+ (currentSelectionLastCheckoutDate === null || currentSelectionLastCheckoutDate === void 0 ? void 0 : currentSelectionLastCheckoutDate.lastCheckOut)
11123
+ ? [
11124
+ {
11125
+ after: calendarRange.from,
11126
+ before: addDays(currentSelectionLastCheckoutDate.lastCheckOut, 1),
11127
+ },
11128
+ ]
11129
+ : [])), false),
11130
+ checkInOnly: __spreadArray$1([], __read(((findFirstPossibleRangeContextCheckIn === null || findFirstPossibleRangeContextCheckIn === void 0 ? void 0 : findFirstPossibleRangeContextCheckIn.checkIn) && rangeContext
11131
+ ? [
11132
+ {
11133
+ from: findFirstPossibleRangeContextCheckIn.checkIn,
11134
+ to: addDays(rangeContext.from, -1),
11135
+ },
11136
+ ]
11137
+ : [])), false),
11138
+ checkOutOnly: __spreadArray$1([], __read(((findLastPossibleRangeContextCheckOut === null || findLastPossibleRangeContextCheckOut === void 0 ? void 0 : findLastPossibleRangeContextCheckOut.checkIn) &&
11139
+ findLastPossibleRangeContextCheckOut.lastCheckOut
11140
+ ? [
11141
+ {
11142
+ from: addDays(findLastPossibleRangeContextCheckOut.checkIn, 1),
11143
+ to: findLastPossibleRangeContextCheckOut.lastCheckOut,
11144
+ },
11145
+ ]
11146
+ : [])), false),
11147
+ };
11148
+ };
11149
+
11150
+ var handleRangeContextDisabledDates = function (_a) {
11151
+ var rangeContext = _a.rangeContext, availableDates = _a.availableDates, calendarRange = _a.calendarRange;
11152
+ var findFirstPossibleRangeContextCheckIn;
11153
+ var findLastPossibleRangeContextCheckOut;
11154
+ var firstPossibleRangeContextCheckIn = [];
11155
+ var lastPossibleRangeContextCheckOut = [];
11156
+ if (rangeContext && (availableDates === null || availableDates === void 0 ? void 0 : availableDates.length)) {
11157
+ // Find the first possible check-in after the last date gap till the range context
11158
+ findFirstPossibleRangeContextCheckIn = availableDates === null || availableDates === void 0 ? void 0 : availableDates.find(function (date) {
11159
+ return date.checkIn < rangeContext.from &&
11160
+ date.lastCheckOut >= rangeContext.from;
11161
+ });
11162
+ if (findFirstPossibleRangeContextCheckIn === null || findFirstPossibleRangeContextCheckIn === void 0 ? void 0 : findFirstPossibleRangeContextCheckIn.checkIn) {
11163
+ firstPossibleRangeContextCheckIn.push({
11164
+ before: findFirstPossibleRangeContextCheckIn.checkIn,
11165
+ });
11166
+ }
11167
+ // Find the last possible checkout before the first date gap till the range context
11168
+ findLastPossibleRangeContextCheckOut = availableDates === null || availableDates === void 0 ? void 0 : availableDates.find(function (date) {
11169
+ return isEqual(rangeContext.to, date.checkIn);
11170
+ });
11171
+ if (findLastPossibleRangeContextCheckOut === null || findLastPossibleRangeContextCheckOut === void 0 ? void 0 : findLastPossibleRangeContextCheckOut.checkIn) {
11172
+ lastPossibleRangeContextCheckOut.push({
11173
+ after: findLastPossibleRangeContextCheckOut.lastCheckOut,
11174
+ });
11175
+ }
11176
+ }
11177
+ // Get last possible check-out dates for current check-in
11178
+ var currentSelectionLastCheckoutDate = availableDates === null || availableDates === void 0 ? void 0 : availableDates.find(function (date) {
11179
+ var calendarCheckIn = (calendarRange === null || calendarRange === void 0 ? void 0 : calendarRange.from)
11180
+ ? format(calendarRange.from, 'dd.MM.yyyy')
11181
+ : null;
11182
+ var itemCheckIn = format(date.checkIn, 'dd.MM.yyyy');
11183
+ return calendarCheckIn ? itemCheckIn === calendarCheckIn : false;
11184
+ });
11185
+ return {
11186
+ findFirstPossibleRangeContextCheckIn: findFirstPossibleRangeContextCheckIn,
11187
+ findLastPossibleRangeContextCheckOut: findLastPossibleRangeContextCheckOut,
11188
+ firstPossibleRangeContextCheckIn: firstPossibleRangeContextCheckIn,
11189
+ lastPossibleRangeContextCheckOut: lastPossibleRangeContextCheckOut,
11190
+ currentSelectionLastCheckoutDate: currentSelectionLastCheckoutDate,
11191
+ };
11192
+ };
11193
+
11194
+ // Case: If the selected dates do not overlap with the rangeContext during continuous selection,
11195
+ // set setCalendarHasError to true. This will display an error message and
11196
+ // prevent the submission of the selected dates.
11197
+ var checkForContinuousSelection = function (_a) {
11198
+ var setCalendarHasError = _a.setCalendarHasError, rangeContext = _a.rangeContext, calendarRange = _a.calendarRange, calendarHasError = _a.calendarHasError;
11199
+ var calendarRangeFrom = (calendarRange === null || calendarRange === void 0 ? void 0 : calendarRange.from) || null;
11200
+ var calendarRangeTo = (calendarRange === null || calendarRange === void 0 ? void 0 : calendarRange.to) || null;
11201
+ var rangeContextFrom = (rangeContext === null || rangeContext === void 0 ? void 0 : rangeContext.from) || null;
11202
+ var rangeContextTo = (rangeContext === null || rangeContext === void 0 ? void 0 : rangeContext.to) || null;
11203
+ // Checking if rangeFrom is equal to or before rangeContextTo
11204
+ var startIsEqualOrBeforeRangeContextEnd = calendarRangeFrom && rangeContextTo
11205
+ ? isBefore(endOfDay(calendarRangeFrom), endOfDay(rangeContextTo)) ||
11206
+ isEqual(endOfDay(calendarRangeFrom), endOfDay(rangeContextTo))
11207
+ : null;
11208
+ // Checking if rangeTo is equal to or after rangeContextFrom
11209
+ var endIsEqualOrAfterRangeContextStart = calendarRangeTo && rangeContextFrom && rangeContextTo
11210
+ ? isAfter(endOfDay(calendarRangeTo), endOfDay(rangeContextFrom)) ||
11211
+ isEqual(endOfDay(calendarRangeTo), endOfDay(rangeContextFrom))
11212
+ : null;
11213
+ if ((rangeContext &&
11214
+ calendarRangeFrom &&
11215
+ !startIsEqualOrBeforeRangeContextEnd) ||
11216
+ (rangeContext && calendarRangeTo && !endIsEqualOrAfterRangeContextStart)) {
11217
+ setCalendarHasError && !calendarHasError && setCalendarHasError(true);
11218
+ }
11219
+ };
11220
+
11221
+ var useCalendarTooltips = function (_a) {
11222
+ var calendarRange = _a.calendarRange, updateCalendarMonthNavigation = _a.updateCalendarMonthNavigation, overlappingDate = _a.overlappingDate, updateCalendarDefaultMoth = _a.updateCalendarDefaultMoth, showFeedback = _a.showFeedback;
11223
+ return useEffect(function () {
10897
11224
  if (typeof document === 'undefined' || !showFeedback)
10898
11225
  return;
10899
11226
  // Children
@@ -10901,11 +11228,16 @@ var Calendar = forwardRef(function (_a, ref) {
10901
11228
  var calendarTooltipCheckOut = document.querySelector('.will-calendar-tooltip-check-out');
10902
11229
  var calendarTooltipOverlappingDate = document.querySelector('.will-calendar-tooltip-overlapping-date');
10903
11230
  var loadingSpinner = document.querySelector('.will-filter-bar-calendar .will-calendar-spinner');
11231
+ var calendarTooltipCheckInOnly = document.querySelector('.will-calendar-tooltip-check-in-only');
11232
+ var calendarTooltipCheckOutOnly = document.querySelector('.will-calendar-tooltip-check-out-only');
10904
11233
  // Parents
10905
11234
  var calendarButtons = document.querySelectorAll('.will-filter-bar-calendar .rdp-cell:has(.booked):not(:has(.disabled-after-check-in))');
10906
11235
  var calendarButtonsCheckOut = document.querySelectorAll('.will-filter-bar-calendar .rdp-cell:has(.booked.disabled-after-check-in)');
10907
11236
  var calendarMonthContainer = document.querySelector('.will-filter-bar-calendar .rdp-months');
10908
11237
  var calendarOverlappingDate = document.querySelectorAll('.will-filter-bar-calendar .rdp-cell:has(.overlapping-date)');
11238
+ var calendarCheckInOnly = document.querySelectorAll('.will-filter-bar-calendar .rdp-cell:has(.check-in-only)');
11239
+ var calendarCheckOutOnly = document.querySelectorAll('.will-filter-bar-calendar .rdp-cell:has(.check-out-only)');
11240
+ // Append children to parents
10909
11241
  var tooltipClonesCheckIn = [];
10910
11242
  var tooltipClonesCheckOut = [];
10911
11243
  var tooltipClonesSpinner = [];
@@ -10924,13 +11256,24 @@ var Calendar = forwardRef(function (_a, ref) {
10924
11256
  tooltipClonesCheckOut.push(tooltipClone);
10925
11257
  });
10926
11258
  }
11259
+ if (calendarTooltipCheckOutOnly && calendarCheckOutOnly.length > 0) {
11260
+ calendarCheckOutOnly.forEach(function (element) {
11261
+ var tooltipClone = calendarTooltipCheckOutOnly.cloneNode(true);
11262
+ element.appendChild(tooltipClone);
11263
+ });
11264
+ }
11265
+ if (calendarTooltipCheckInOnly && calendarCheckInOnly.length > 0) {
11266
+ calendarCheckInOnly.forEach(function (element) {
11267
+ var tooltipClone = calendarTooltipCheckInOnly.cloneNode(true);
11268
+ element.appendChild(tooltipClone);
11269
+ });
11270
+ }
10927
11271
  if (loadingSpinner && calendarMonthContainer) {
10928
11272
  var tooltipClone = loadingSpinner.cloneNode(true);
10929
11273
  calendarMonthContainer.appendChild(tooltipClone);
10930
11274
  tooltipClonesSpinner.push(tooltipClone);
10931
11275
  }
10932
- if (calendarTooltipOverlappingDate &&
10933
- calendarOverlappingDate.length > 0) {
11276
+ if (calendarTooltipOverlappingDate && calendarOverlappingDate.length > 0) {
10934
11277
  calendarOverlappingDate.forEach(function (element) {
10935
11278
  var tooltipClone = calendarTooltipOverlappingDate.cloneNode(true);
10936
11279
  element.appendChild(tooltipClone);
@@ -10947,11 +11290,13 @@ var Calendar = forwardRef(function (_a, ref) {
10947
11290
  calendarRange,
10948
11291
  updateCalendarMonthNavigation,
10949
11292
  overlappingDate,
10950
- initialCalendarRange,
10951
11293
  updateCalendarDefaultMoth,
10952
11294
  ]);
10953
- // Handle loading spinner
10954
- useEffect(function () {
11295
+ };
11296
+
11297
+ var useCalendarLoadingSpinner = function (_a) {
11298
+ var loadingData = _a.loadingData, updateCalendarMonthNavigation = _a.updateCalendarMonthNavigation, updateCalendarDefaultMoth = _a.updateCalendarDefaultMoth;
11299
+ return useEffect(function () {
10955
11300
  if (typeof document === 'undefined')
10956
11301
  return;
10957
11302
  var loadingSpinner = document.querySelector('.will-filter-bar-calendar .rdp-months .will-calendar-spinner');
@@ -10964,195 +11309,186 @@ var Calendar = forwardRef(function (_a, ref) {
10964
11309
  loadingSpinner.style.display = 'none';
10965
11310
  }
10966
11311
  }, [loadingData, updateCalendarMonthNavigation, updateCalendarDefaultMoth]);
11312
+ };
11313
+
11314
+ var useUpdateDisabledDates = function (_a) {
11315
+ var disableCalendarDates = _a.disableCalendarDates, calendarRange = _a.calendarRange, updateCalendarMonthNavigation = _a.updateCalendarMonthNavigation, updateCalendarDefaultMoth = _a.updateCalendarDefaultMoth;
11316
+ var _b = __read(useState(undefined), 2), overlappingDate = _b[0], setOverlappingDate = _b[1];
11317
+ var newDisableCalendarDates = useMemo(function () {
11318
+ if (disableCalendarDates === null || disableCalendarDates === void 0 ? void 0 : disableCalendarDates.availableDates) {
11319
+ var dateFormat_1 = 'dd-MM-yyyy';
11320
+ var disabledDates = disableCalendarDates.disabledDates;
11321
+ var _a = (disabledDates || []).reduce(function (acc, dateRange) {
11322
+ var _a, _b;
11323
+ var formattedFromDate = format(dateRange.from, dateFormat_1);
11324
+ var formattedToDate = format(dateRange.to, dateFormat_1);
11325
+ var hasTwoOverlappingDates = (_a = disableCalendarDates.availableDates) === null || _a === void 0 ? void 0 : _a.some(function (item) {
11326
+ return format(item.lastCheckOut, dateFormat_1) === formattedFromDate &&
11327
+ format(item.lastCheckOut, dateFormat_1) === formattedToDate;
11328
+ });
11329
+ var hasOneOverlappingDate = (_b = disableCalendarDates.availableDates) === null || _b === void 0 ? void 0 : _b.some(function (item) {
11330
+ return format(item.lastCheckOut, dateFormat_1) === formattedFromDate &&
11331
+ format(item.lastCheckOut, dateFormat_1) !== formattedToDate;
11332
+ });
11333
+ if (hasTwoOverlappingDates) {
11334
+ acc.newOverlappingDates.push(dateRange);
11335
+ }
11336
+ else if (hasOneOverlappingDate) {
11337
+ acc.newOverlappingDates.push(dateRange);
11338
+ acc.updatedDisabledDates.push(__assign$2(__assign$2({}, dateRange), { from: addDays(dateRange.from, 1) }));
11339
+ }
11340
+ else {
11341
+ acc.updatedDisabledDates.push(dateRange);
11342
+ }
11343
+ return acc;
11344
+ }, { updatedDisabledDates: [], newOverlappingDates: [] }), updatedDisabledDates = _a.updatedDisabledDates, newOverlappingDates_1 = _a.newOverlappingDates;
11345
+ if (newOverlappingDates_1.length) {
11346
+ setOverlappingDate(function (prev) {
11347
+ if (prev === void 0) { prev = []; }
11348
+ return __spreadArray$1(__spreadArray$1([], __read(prev), false), __read(newOverlappingDates_1), false);
11349
+ });
11350
+ }
11351
+ var newDisableCalendarDates_1 = __assign$2(__assign$2({}, disableCalendarDates), { disabledDates: updatedDisabledDates });
11352
+ return newDisableCalendarDates_1;
11353
+ }
11354
+ return disableCalendarDates;
11355
+ }, [
11356
+ disableCalendarDates,
11357
+ calendarRange,
11358
+ updateCalendarMonthNavigation,
11359
+ updateCalendarDefaultMoth,
11360
+ ]);
11361
+ return { newDisableCalendarDates: newDisableCalendarDates, overlappingDate: overlappingDate };
11362
+ };
11363
+
11364
+ var css_248z$9 = ".rdp {\n --rdp-cell-size: 40px;\n --rdp-caption-font-size: 18px;\n --rdp-accent-color: #0000ff;\n --rdp-background-color: #e7edff;\n --rdp-accent-color-dark: #3003e1;\n --rdp-background-color-dark: #180270;\n --rdp-outline: 2px solid var(--rdp-accent-color); /* Outline border for focused elements */\n --rdp-outline-selected: 3px solid var(--rdp-accent-color); /* Outline border for focused _and_ selected elements */\n\n margin: 1em;\n}\n\n/* Hide elements for devices that are not screen readers */\n.rdp-vhidden {\n box-sizing: border-box;\n padding: 0;\n margin: 0;\n background: transparent;\n border: 0;\n -moz-appearance: none;\n -webkit-appearance: none;\n appearance: none;\n position: absolute !important;\n top: 0;\n width: 1px !important;\n height: 1px !important;\n padding: 0 !important;\n overflow: hidden !important;\n clip: rect(1px, 1px, 1px, 1px) !important;\n border: 0 !important;\n}\n\n/* Buttons */\n.rdp-button_reset {\n appearance: none;\n position: relative;\n margin: 0;\n padding: 0;\n cursor: default;\n color: inherit;\n background: none;\n font: inherit;\n\n -moz-appearance: none;\n -webkit-appearance: none;\n}\n\n.rdp-button_reset:focus-visible {\n /* Make sure to reset outline only when :focus-visible is supported */\n outline: none;\n}\n\n.rdp-button {\n border: 2px solid transparent;\n}\n\n.rdp-button[disabled]:not(.rdp-day_selected) {\n opacity: 0.25;\n}\n\n.rdp-button:not([disabled]) {\n cursor: pointer;\n}\n\n.rdp-button:focus-visible:not([disabled]) {\n color: inherit;\n background-color: var(--rdp-background-color);\n border: var(--rdp-outline);\n}\n\n.rdp-button:hover:not([disabled]):not(.rdp-day_selected) {\n background-color: var(--rdp-background-color);\n}\n\n.rdp-months {\n display: flex;\n}\n\n.rdp-month {\n margin: 0 1em;\n}\n\n.rdp-month:first-child {\n margin-left: 0;\n}\n\n.rdp-month:last-child {\n margin-right: 0;\n}\n\n.rdp-table {\n margin: 0;\n max-width: calc(var(--rdp-cell-size) * 7);\n border-collapse: collapse;\n}\n\n.rdp-with_weeknumber .rdp-table {\n max-width: calc(var(--rdp-cell-size) * 8);\n border-collapse: collapse;\n}\n\n.rdp-caption {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 0;\n text-align: left;\n}\n\n.rdp-multiple_months .rdp-caption {\n position: relative;\n display: block;\n text-align: center;\n}\n\n.rdp-caption_dropdowns {\n position: relative;\n display: inline-flex;\n}\n\n.rdp-caption_label {\n position: relative;\n z-index: 1;\n display: inline-flex;\n align-items: center;\n margin: 0;\n padding: 0 0.25em;\n white-space: nowrap;\n color: currentColor;\n border: 0;\n border: 2px solid transparent;\n font-family: inherit;\n font-size: var(--rdp-caption-font-size);\n font-weight: bold;\n}\n\n.rdp-nav {\n white-space: nowrap;\n}\n\n.rdp-multiple_months .rdp-caption_start .rdp-nav {\n position: absolute;\n top: 50%;\n left: 0;\n transform: translateY(-50%);\n}\n\n.rdp-multiple_months .rdp-caption_end .rdp-nav {\n position: absolute;\n top: 50%;\n right: 0;\n transform: translateY(-50%);\n}\n\n.rdp-nav_button {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: var(--rdp-cell-size);\n height: var(--rdp-cell-size);\n padding: 0.25em;\n border-radius: 100%;\n}\n\n/* ---------- */\n/* Dropdowns */\n/* ---------- */\n\n.rdp-dropdown_year,\n.rdp-dropdown_month {\n position: relative;\n display: inline-flex;\n align-items: center;\n}\n\n.rdp-dropdown {\n appearance: none;\n position: absolute;\n z-index: 2;\n top: 0;\n bottom: 0;\n left: 0;\n width: 100%;\n margin: 0;\n padding: 0;\n cursor: inherit;\n opacity: 0;\n border: none;\n background-color: transparent;\n font-family: inherit;\n font-size: inherit;\n line-height: inherit;\n}\n\n.rdp-dropdown[disabled] {\n opacity: unset;\n color: unset;\n}\n\n.rdp-dropdown:focus-visible:not([disabled]) + .rdp-caption_label {\n background-color: var(--rdp-background-color);\n border: var(--rdp-outline);\n border-radius: 6px;\n}\n\n.rdp-dropdown_icon {\n margin: 0 0 0 5px;\n}\n\n.rdp-head {\n border: 0;\n}\n\n.rdp-head_row,\n.rdp-row {\n height: 100%;\n}\n\n.rdp-head_cell {\n vertical-align: middle;\n font-size: 0.75em;\n font-weight: 700;\n text-align: center;\n height: 100%;\n height: var(--rdp-cell-size);\n padding: 0;\n text-transform: uppercase;\n}\n\n.rdp-tbody {\n border: 0;\n}\n\n.rdp-tfoot {\n margin: 0.5em;\n}\n\n.rdp-cell {\n width: var(--rdp-cell-size);\n height: 100%;\n height: var(--rdp-cell-size);\n padding: 0;\n text-align: center;\n}\n\n.rdp-weeknumber {\n font-size: 0.75em;\n}\n\n.rdp-weeknumber,\n.rdp-day {\n display: flex;\n overflow: hidden;\n align-items: center;\n justify-content: center;\n box-sizing: border-box;\n width: var(--rdp-cell-size);\n max-width: var(--rdp-cell-size);\n height: var(--rdp-cell-size);\n margin: 0;\n border: 2px solid transparent;\n border-radius: 100%;\n}\n\n.rdp-day_today:not(.rdp-day_outside) {\n font-weight: bold;\n}\n\n.rdp-day_selected,\n.rdp-day_selected:focus-visible,\n.rdp-day_selected:hover {\n color: white;\n opacity: 1;\n background-color: var(--rdp-accent-color);\n}\n\n.rdp-day_outside {\n opacity: 0.5;\n}\n\n.rdp-day_selected:focus-visible {\n /* Since the background is the same use again the outline */\n outline: var(--rdp-outline);\n outline-offset: 2px;\n z-index: 1;\n}\n\n.rdp:not([dir='rtl']) .rdp-day_range_start:not(.rdp-day_range_end) {\n border-top-right-radius: 0;\n border-bottom-right-radius: 0;\n}\n\n.rdp:not([dir='rtl']) .rdp-day_range_end:not(.rdp-day_range_start) {\n border-top-left-radius: 0;\n border-bottom-left-radius: 0;\n}\n\n.rdp[dir='rtl'] .rdp-day_range_start:not(.rdp-day_range_end) {\n border-top-left-radius: 0;\n border-bottom-left-radius: 0;\n}\n\n.rdp[dir='rtl'] .rdp-day_range_end:not(.rdp-day_range_start) {\n border-top-right-radius: 0;\n border-bottom-right-radius: 0;\n}\n\n.rdp-day_range_end.rdp-day_range_start {\n border-radius: 100%;\n}\n\n.rdp-day_range_middle {\n border-radius: 0;\n}";
11365
+ styleInject(css_248z$9);
11366
+
11367
+ var css_248z$8 = ".will-calendar-filter-container {\n display: flex;\n justify-content: center;\n user-select: none;\n}\n\n/* Calendar overrides */\n\n\n.will-calendar-filter-container .DayPicker {\n font-size: 25px; /* Adjust this value to make the DayPicker bigger */\n}\n\n.will-calendar-filter-container .rdp-month {\n position: relative;\n}\n\n.will-calendar-filter-container .rdp-month.rdp-caption_start {\n padding-left: 70px;\n}\n\n.will-calendar-filter-container .rdp-month.rdp-caption_end {\n padding-right: 70px;\n}\n\n.will-calendar-filter-container .rdp-month .rdp-nav {\n border: 1px solid var(--will-primary);\n border-radius: 50%;\n}\n\n.will-calendar-filter-container .rdp-month .rdp-nav svg {\n color: var(--will-primary);\n}\n\n\n.will-calendar-filter-container .rdp-month .rdp-caption {\n position: initial;\n}\n\n.will-calendar-filter-container .rdp-month .rdp-caption > .rdp-caption_label,\n.will-calendar-filter-container .rdp-table .rdp-head {\n opacity: .6;\n}\n\n.will-calendar-filter-container .rdp-button_reset.rdp-button.rdp-day.rdp-day_selected {\n background-color: var(--will-primary);\n opacity: 1;\n}\n\n.will-calendar-filter-container .my-today:not(.rdp-day_selected) { \n font-weight: 700;\n opacity: 1;\n color: var(--will-primary);\n}\n\n.will-calendar-filter-container .rdp-cell {\n position: relative;\n}\n\n.will-calendar-filter-container .rdp-cell button {\n font-weight: 500;\n}\n\n.will-calendar-filter-container .rdp-cell button.booked {\n font-weight: 400;\n cursor: not-allowed;\n}\n\n.will-calendar-filter-container .rdp-cell .rdp-button[disabled] {\n opacity: 0.5;\n}\n\n@media (max-width: 960px) {\n .will-calendar-filter-container .rdp-month .rdp-nav {\n border: none;\n border-radius: initial;\n }\n\n .will-calendar-filter-container .rdp-month.rdp-caption_start {\n padding-left: 10px;\n }\n \n .will-calendar-filter-container .rdp-month.rdp-caption_end {\n padding-right: 10px;\n }\n}\n\n/* Tooltip */\n.will-root .will-calendar-filter-container .will-calendar-tooltip,\n.will-root .will-calendar-filter-container .will-calendar-tooltip-check-out,\n.will-root .will-calendar-filter-container .will-calendar-tooltip-overlapping-date,\n.will-root .will-calendar-filter-container .will-calendar-tooltip-check-out-only,\n.will-root .will-calendar-filter-container .will-calendar-tooltip-check-in-only {\n position: absolute;\n top: -42px;\n transform: translateX(calc(-50% + 20px));\n display: none;\n white-space: nowrap;\n z-index: 2;\n}\n\n.will-root .will-calendar-filter-container .will-calendar-tooltip > div,\n.will-root .will-calendar-filter-container .will-calendar-tooltip-check-out > div,\n.will-root .will-calendar-filter-container .will-calendar-tooltip-overlapping-date > div,\n.will-root .will-calendar-filter-container .will-calendar-tooltip-check-out-only > div,\n.will-root .will-calendar-filter-container .will-calendar-tooltip-check-in-only > div {\n background-color: white;\n position: relative;\n padding: 5px 10px;\n border: 1px solid var(--will-primary);\n border-radius: 5px;\n}\n\n.will-root .will-calendar-filter-container .will-calendar-tooltip::before,\n.will-root .will-calendar-filter-container .will-calendar-tooltip-check-out::before,\n.will-root .will-calendar-filter-container .will-calendar-tooltip-overlapping-date::before,\n.will-root .will-calendar-filter-container .will-calendar-tooltip-check-out-only::before,\n.will-root .will-calendar-filter-container .will-calendar-tooltip-check-in-only::before {\n content: \"\";\n width: 10px;\n height: 10px;\n border: 1px solid var(--will-primary);\n position: absolute;\n bottom: -4px;\n left:calc(50% - 5.555px);\n rotate: 45deg;\n z-index: 0;\n background-color: var(--will-white);\n}\n\n.will-root .will-calendar-filter-container .rdp-cell:hover .will-calendar-tooltip,\n.will-root .will-calendar-filter-container .rdp-cell:hover .will-calendar-tooltip-check-out,\n.will-root .will-calendar-filter-container .rdp-cell:hover .will-calendar-tooltip-overlapping-date,\n.will-root .will-calendar-filter-container .rdp-cell:hover .will-calendar-tooltip-check-out-only,\n.will-root .will-calendar-filter-container .rdp-cell:hover .will-calendar-tooltip-check-in-only {\n display: block;\n}\n\n/* Loading spinner */\n\n.will-root .will-calendar-filter-container .rdp-months {\n position: relative;\n}\n\n.will-root .will-calendar-filter-container .will-calendar-spinner {\n position: absolute;\n top:0;\n bottom:0;\n left: 0;\n right: 0;\n background-color: var(--will-white-transparent);\n z-index: 3;\n display: none;\n justify-content: center;\n align-items: center;\n font-weight: 600;\n}\n\n/* No active selection */\n\n.will-root .will-calendar-filter-container .rdp-day_selected.rdp-day_range_start.no-active-selection,\n.will-root .will-calendar-filter-container .rdp-day_selected.rdp-day_range_middle.no-active-selection,\n.will-root .will-calendar-filter-container .rdp-day_selected.rdp-day_range_end.no-active-selection,\n.will-root .will-calendar-filter-container .rdp-day_selected.rdp-day_range_start.no-active-selection.checkout-option,\n.will-root .will-calendar-filter-container .rdp-day_selected.rdp-day_range_middle.no-active-selection.checkout-option,\n.will-root .will-calendar-filter-container .rdp-day_selected.rdp-day_range_end.no-active-selection.checkout-option {\n background-color: var(--rdp-background-color);\n color: inherit;\n}\n\n.will-root .will-calendar-filter-container .rdp-day_selected.rdp-day_range_start.no-active-selection:hover,\n.will-root .will-calendar-filter-container .rdp-day_selected.rdp-day_range_middle.no-active-selection:hover,\n.will-root .will-calendar-filter-container .rdp-day_selected.rdp-day_range_end.no-active-selection:hover {\n background-color: var(--rdp-background-color);\n}\n\n.will-root .will-calendar-filter-container .rdp-day_selected.rdp-day_range_middle.checkout-option {\n background-color: var(--will-primary-lightest);\n color: inherit;\n}\n\n\n/* Overlapping date */\n\n.will-root .will-calendar-filter-container .overlapping-date {\n user-select: none;\n pointer-events: none;\n \n}\n\n.will-root .will-calendar-filter-container .overlapping-date:hover {\n cursor: not-allowed;\n}\n\n\n";
11368
+ styleInject(css_248z$8);
11369
+
11370
+ var Calendar = forwardRef(function (_a, ref) {
11371
+ var _b, _c;
11372
+ var selectedPath = _a.selectedPath, calendarRange = _a.calendarRange, setCalendarRange = _a.setCalendarRange, language = _a.language, disableCalendarDates = _a.disableCalendarDates, requestDates = _a.requestDates, disabledDates = _a.disabledDates, setDisabledDates = _a.setDisabledDates, updateCalendarMonthNavigation = _a.updateCalendarMonthNavigation, setUpdateCalendarMonthNavigation = _a.setUpdateCalendarMonthNavigation, updateCalendarDefaultMoth = _a.updateCalendarDefaultMoth, loadingData = _a.loadingData, showFeedback = _a.showFeedback, palette = _a.palette, setCalendarHasError = _a.setCalendarHasError, setUpdatedForSubmit = _a.setUpdatedForSubmit, rangeContext = _a.rangeContext, calendarHasError = _a.calendarHasError;
11373
+ // Translations
11374
+ var t = useTranslation('common').t;
11375
+ var isTablet = reactResponsiveExports.useMediaQuery({ maxWidth: 960 });
11376
+ var today = startOfDay(new Date());
11377
+ var selectedStartDate = calendarRange === null || calendarRange === void 0 ? void 0 : calendarRange.from;
11378
+ var rangeContextStartDate = rangeContext === null || rangeContext === void 0 ? void 0 : rangeContext.from;
11379
+ // Handle overlapping availableDates.lastCheckOut and disabledDates.start
11380
+ var _d = useUpdateDisabledDates({
11381
+ disableCalendarDates: disableCalendarDates,
11382
+ calendarRange: calendarRange,
11383
+ updateCalendarMonthNavigation: updateCalendarMonthNavigation,
11384
+ updateCalendarDefaultMoth: updateCalendarDefaultMoth,
11385
+ }), newDisableCalendarDates = _d.newDisableCalendarDates, overlappingDate = _d.overlappingDate;
11386
+ // Handle disable dates by page
11387
+ var disabledDatesByPage$1 = disabledDatesByPage({
11388
+ today: today,
11389
+ selectedPath: selectedPath,
11390
+ newDisableCalendarDates: newDisableCalendarDates,
11391
+ });
11392
+ // Handle tooltip
11393
+ useCalendarTooltips({
11394
+ calendarRange: calendarRange,
11395
+ updateCalendarMonthNavigation: updateCalendarMonthNavigation,
11396
+ overlappingDate: overlappingDate,
11397
+ updateCalendarDefaultMoth: updateCalendarDefaultMoth,
11398
+ showFeedback: showFeedback,
11399
+ });
11400
+ // Handle loading spinner
11401
+ useCalendarLoadingSpinner({
11402
+ loadingData: loadingData,
11403
+ updateCalendarMonthNavigation: updateCalendarMonthNavigation,
11404
+ updateCalendarDefaultMoth: updateCalendarDefaultMoth,
11405
+ });
11406
+ // Handle the date selection and availability for selection logic.
11407
+ var handleOnSelect = function (range) {
11408
+ setCalendarHasError && calendarHasError && setCalendarHasError(false);
11409
+ calendarSelectionRules({
11410
+ range: range,
11411
+ newDisableCalendarDates: newDisableCalendarDates,
11412
+ setCalendarRange: setCalendarRange,
11413
+ setDisabledDates: setDisabledDates,
11414
+ calendarRange: calendarRange,
11415
+ overlappingDate: overlappingDate,
11416
+ setCalendarHasError: setCalendarHasError,
11417
+ rangeContext: rangeContext,
11418
+ });
11419
+ setUpdatedForSubmit && setUpdatedForSubmit(true);
11420
+ };
11421
+ // Handle disabled dates for range context
11422
+ var _e = handleRangeContextDisabledDates({
11423
+ rangeContext: rangeContext,
11424
+ availableDates: newDisableCalendarDates === null || newDisableCalendarDates === void 0 ? void 0 : newDisableCalendarDates.availableDates,
11425
+ calendarRange: calendarRange,
11426
+ }), findFirstPossibleRangeContextCheckIn = _e.findFirstPossibleRangeContextCheckIn, findLastPossibleRangeContextCheckOut = _e.findLastPossibleRangeContextCheckOut, firstPossibleRangeContextCheckIn = _e.firstPossibleRangeContextCheckIn, lastPossibleRangeContextCheckOut = _e.lastPossibleRangeContextCheckOut, currentSelectionLastCheckoutDate = _e.currentSelectionLastCheckoutDate;
11427
+ // Handle check for continuous selection in the range context
11428
+ checkForContinuousSelection({
11429
+ setCalendarHasError: setCalendarHasError,
11430
+ rangeContext: rangeContext,
11431
+ calendarRange: calendarRange,
11432
+ calendarHasError: calendarHasError,
11433
+ });
10967
11434
  return (React__default__default.createElement("div", { className: "will-filter-bar-calendar", ref: ref },
10968
11435
  React__default__default.createElement("div", { className: "will-calendar-filter-container" },
10969
- React__default__default.createElement(DayPicker, { key: updateCalendarDefaultMoth, id: "will-calendar", mode: "range", locale: language === 'en' ? enUS : fi, numberOfMonths: !isTablet ? 2 : 1, weekStartsOn: 1, selected: calendarRange, onSelect: function (range) {
10970
- return handleSelectedCheckIn({
10971
- range: range,
10972
- newDisableCalendarDates: newDisableCalendarDates,
10973
- setCalendarRange: setCalendarRange,
10974
- setDisabledDates: setDisabledDates,
10975
- calendarRange: calendarRange,
10976
- overlappingDate: overlappingDate,
10977
- setOverlappingDates: setOverlappingDates,
10978
- });
10979
- }, captionLayout: "dropdown-buttons", defaultMonth: (initialCalendarRange === null || initialCalendarRange === void 0 ? void 0 : initialCalendarRange.from) ||
11436
+ React__default__default.createElement(DayPicker, { key: updateCalendarDefaultMoth, id: "will-calendar", mode: "range", locale: language === 'en' ? enUS : fi, numberOfMonths: !isTablet ? 2 : 1, weekStartsOn: 1, selected: calendarRange, onSelect: function (range) { return handleOnSelect(range); }, captionLayout: "dropdown-buttons", defaultMonth: (calendarRange === null || calendarRange === void 0 ? void 0 : calendarRange.from) ||
10980
11437
  selectedStartDate ||
11438
+ rangeContextStartDate ||
10981
11439
  (((_b = newDisableCalendarDates === null || newDisableCalendarDates === void 0 ? void 0 : newDisableCalendarDates.disabledDates) === null || _b === void 0 ? void 0 : _b.length)
10982
11440
  ? newDisableCalendarDates.disabledDates[0].from
10983
- : today), disabled: disabledDatesByPage.length
10984
- ? disabledDatesByPage
11441
+ : today), disabled: disabledDatesByPage$1.length
11442
+ ? disabledDatesByPage$1
10985
11443
  : (disabledDates === null || disabledDates === void 0 ? void 0 : disabledDates.length)
10986
- ? disabledDates
10987
- : (newDisableCalendarDates === null || newDisableCalendarDates === void 0 ? void 0 : newDisableCalendarDates.disabledDates) || [], fromMonth: today, onMonthChange: function (val) {
11444
+ ? __spreadArray$1(__spreadArray$1(__spreadArray$1([], __read(disabledDates), false), __read(firstPossibleRangeContextCheckIn), false), __read(lastPossibleRangeContextCheckOut), false) : ((_c = newDisableCalendarDates === null || newDisableCalendarDates === void 0 ? void 0 : newDisableCalendarDates.disabledDates) === null || _c === void 0 ? void 0 : _c.length)
11445
+ ? __spreadArray$1(__spreadArray$1(__spreadArray$1([], __read(newDisableCalendarDates.disabledDates), false), __read(firstPossibleRangeContextCheckIn), false), __read(lastPossibleRangeContextCheckOut), false) : [], fromMonth: today, onMonthChange: function (val) {
10988
11446
  requestDates && setUpdateCalendarMonthNavigation
10989
11447
  ? (requestDates(val),
10990
11448
  setUpdateCalendarMonthNavigation(function (prev) { return !prev; }))
10991
11449
  : null;
11450
+ }, classNames: {
11451
+ day_range_start: (calendarRange === null || calendarRange === void 0 ? void 0 : calendarRange.from) ? 'rdp-day_range_start' : '',
11452
+ day_range_end: (calendarRange === null || calendarRange === void 0 ? void 0 : calendarRange.to) ? 'rdp-day_range_end' : '',
10992
11453
  }, modifiersClassNames: {
10993
11454
  today: 'my-today',
10994
11455
  booked: 'booked',
10995
11456
  disabledAfterCheckIn: 'disabled-after-check-in',
10996
11457
  overlappingDate: 'overlapping-date',
10997
- noActiveSelectionStart: 'rdp-day_selected rdp-day_range_start no-active-selection ',
11458
+ noActiveSelectionStart: 'rdp-day_selected rdp-day_range_start no-active-selection',
10998
11459
  noActiveSelectionMid: 'rdp-day_selected rdp-day_range_middle no-active-selection',
10999
11460
  noActiveSelectionEnd: 'rdp-day_selected rdp-day_range_end no-active-selection',
11000
- }, modifiers: {
11001
- booked: disabledDatesByPage.length
11002
- ? disabledDatesByPage
11003
- : (disabledDates === null || disabledDates === void 0 ? void 0 : disabledDates.length)
11004
- ? disabledDates
11005
- : (newDisableCalendarDates === null || newDisableCalendarDates === void 0 ? void 0 : newDisableCalendarDates.disabledDates) || [],
11006
- disabledAfterCheckIn: (calendarRange === null || calendarRange === void 0 ? void 0 : calendarRange.from)
11007
- ? [{ after: calendarRange.from }]
11008
- : [],
11009
- noActiveSelectionStart: !calendarRange
11010
- ? (initialCalendarRange === null || initialCalendarRange === void 0 ? void 0 : initialCalendarRange.from) || []
11011
- : [],
11012
- noActiveSelectionMid: !calendarRange &&
11013
- (initialCalendarRange === null || initialCalendarRange === void 0 ? void 0 : initialCalendarRange.from) &&
11014
- (initialCalendarRange === null || initialCalendarRange === void 0 ? void 0 : initialCalendarRange.to)
11015
- ? [
11016
- {
11017
- after: initialCalendarRange === null || initialCalendarRange === void 0 ? void 0 : initialCalendarRange.from,
11018
- before: initialCalendarRange === null || initialCalendarRange === void 0 ? void 0 : initialCalendarRange.to,
11019
- },
11020
- ]
11021
- : [],
11022
- noActiveSelectionEnd: !calendarRange
11023
- ? (initialCalendarRange === null || initialCalendarRange === void 0 ? void 0 : initialCalendarRange.to) || []
11024
- : [],
11025
- overlappingDate: (!(calendarRange === null || calendarRange === void 0 ? void 0 : calendarRange.from) &&
11026
- (overlappingDate === null || overlappingDate === void 0 ? void 0 : overlappingDate.map(function (item) { return ({
11027
- from: item.from,
11028
- }); }))) ||
11029
- [],
11030
- } }),
11461
+ checkoutOptionsMid: 'rdp-day_selected rdp-day_range_middle checkout-option',
11462
+ checkInOnly: 'check-in-only',
11463
+ checkOutOnly: 'check-out-only',
11464
+ }, modifiers:
11465
+ // This function handles conditions for applying the modifiersClassNames
11466
+ handleCalendarModifiers({
11467
+ newDisableCalendarDates: newDisableCalendarDates,
11468
+ calendarRange: calendarRange,
11469
+ disabledDatesByPage: disabledDatesByPage$1,
11470
+ disabledDates: disabledDates,
11471
+ overlappingDate: overlappingDate,
11472
+ rangeContext: rangeContext,
11473
+ findFirstPossibleRangeContextCheckIn: findFirstPossibleRangeContextCheckIn,
11474
+ findLastPossibleRangeContextCheckOut: findLastPossibleRangeContextCheckOut,
11475
+ firstPossibleRangeContextCheckIn: firstPossibleRangeContextCheckIn,
11476
+ lastPossibleRangeContextCheckOut: lastPossibleRangeContextCheckOut,
11477
+ currentSelectionLastCheckoutDate: currentSelectionLastCheckoutDate,
11478
+ }) }),
11031
11479
  React__default__default.createElement("div", { className: 'will-calendar-tooltip' },
11032
11480
  React__default__default.createElement("div", null, t('noCheckIn'))),
11033
11481
  React__default__default.createElement("div", { className: 'will-calendar-tooltip-check-out' },
11034
11482
  React__default__default.createElement("div", null, t('noCheckOut'))),
11035
11483
  React__default__default.createElement("div", { className: 'will-calendar-tooltip-overlapping-date' },
11036
11484
  React__default__default.createElement("div", null, t('checkOutOnly'))),
11485
+ React__default__default.createElement("div", { className: 'will-calendar-tooltip-check-in-only' },
11486
+ React__default__default.createElement("div", null, "Check-in Only")),
11487
+ React__default__default.createElement("div", { className: 'will-calendar-tooltip-check-out-only' },
11488
+ React__default__default.createElement("div", null, "Checkout Only")),
11037
11489
  React__default__default.createElement("div", { className: 'will-calendar-spinner' },
11038
- React__default__default.createElement(SpinnerSVG, { fill: (palette === null || palette === void 0 ? void 0 : palette.primary) || 'inherit', size: 50 })))));
11490
+ React__default__default.createElement(IconsSvg, { fill: (palette === null || palette === void 0 ? void 0 : palette.primary) || 'inherit', size: 50, icon: "spinner" })))));
11039
11491
  });
11040
- /////////
11041
- var handleSelectedCheckIn = function (_a) {
11042
- var _b, _c, _d;
11043
- var range = _a.range, newDisableCalendarDates = _a.newDisableCalendarDates, setCalendarRange = _a.setCalendarRange, setDisabledDates = _a.setDisabledDates, calendarRange = _a.calendarRange, overlappingDate = _a.overlappingDate, setOverlappingDates = _a.setOverlappingDates;
11044
- // Calendar dates select logic
11045
- var dateFormat = 'dd-MM-yyyy';
11046
- var rangeFrom = (range === null || range === void 0 ? void 0 : range.from) ? format(range.from, dateFormat) : null;
11047
- var rangeTo = (range === null || range === void 0 ? void 0 : range.to) ? format(range.to, dateFormat) : null;
11048
- var calendarFrom = (calendarRange === null || calendarRange === void 0 ? void 0 : calendarRange.from)
11049
- ? format(calendarRange === null || calendarRange === void 0 ? void 0 : calendarRange.from, dateFormat)
11050
- : null;
11051
- var overlappingDateFrom = (overlappingDate === null || overlappingDate === void 0 ? void 0 : overlappingDate.length)
11052
- ? overlappingDate.find(function (date) { return format(date.from || 1, dateFormat) === rangeFrom; })
11053
- : null;
11054
- var checkOutRange = ((_b = newDisableCalendarDates === null || newDisableCalendarDates === void 0 ? void 0 : newDisableCalendarDates.availableDates) === null || _b === void 0 ? void 0 : _b.length)
11055
- ? newDisableCalendarDates.availableDates.find(function (checkInDate) {
11056
- return format(checkInDate.checkIn || 1, dateFormat) ===
11057
- format((range === null || range === void 0 ? void 0 : range.from) || 1, dateFormat);
11058
- })
11059
- : null;
11060
- // Case: Set the calendar range only if it overlaps with the previously selected dates.
11061
- // The selection must remain continuous, meaning no gaps between days are allowed.
11062
- // Whether selecting forwards or backwards from the initially chosen dates,
11063
- // the new range must be directly adjacent to or overlap with the current selection.
11064
- var selectedDates = (newDisableCalendarDates === null || newDisableCalendarDates === void 0 ? void 0 : newDisableCalendarDates.selectedDates) || null;
11065
- var rowRangeFrom = range === null || range === void 0 ? void 0 : range.from;
11066
- var rowRangeTo = range === null || range === void 0 ? void 0 : range.to;
11067
- var selectedDatesFrom = ((_c = newDisableCalendarDates === null || newDisableCalendarDates === void 0 ? void 0 : newDisableCalendarDates.selectedDates) === null || _c === void 0 ? void 0 : _c.from) || null;
11068
- var selectedDatesTo = ((_d = newDisableCalendarDates === null || newDisableCalendarDates === void 0 ? void 0 : newDisableCalendarDates.selectedDates) === null || _d === void 0 ? void 0 : _d.to) || null;
11069
- // Checking if rowRangeFrom is equal to or before selectedDatesTo
11070
- var startIsEqualOrBeforeSelectedEnd = rowRangeFrom && selectedDatesFrom && selectedDatesTo
11071
- ? isBefore(startOfDay(rowRangeFrom), startOfDay(selectedDatesTo)) ||
11072
- isEqual(startOfDay(rowRangeFrom), startOfDay(selectedDatesTo))
11073
- : null;
11074
- // Checking if rowRangeTo is equal to or after selectedDatesFrom
11075
- var endIsEqualOrAfterSelectedStart = rowRangeTo && selectedDatesFrom && selectedDatesTo
11076
- ? isAfter(startOfDay(rowRangeTo), startOfDay(selectedDatesFrom)) ||
11077
- isEqual(startOfDay(rowRangeTo), startOfDay(selectedDatesFrom))
11078
- : null;
11079
- if (rangeFrom && checkOutRange && setDisabledDates) {
11080
- var checkIn = addDays(checkOutRange.checkIn, 1);
11081
- var firstCheckOut = addDays(checkOutRange.firstCheckOut, -1);
11082
- var noDatesRange = format(checkIn, dateFormat) ===
11083
- format(checkOutRange.firstCheckOut, dateFormat);
11084
- setDisabledDates(__spreadArray$1(__spreadArray$1([], __read(((newDisableCalendarDates === null || newDisableCalendarDates === void 0 ? void 0 : newDisableCalendarDates.disabledDates) || [])), false), [
11085
- {
11086
- from: noDatesRange ? undefined : checkIn,
11087
- to: noDatesRange ? undefined : firstCheckOut,
11088
- },
11089
- { after: checkOutRange === null || checkOutRange === void 0 ? void 0 : checkOutRange.lastCheckOut },
11090
- ], false));
11091
- }
11092
- setOverlappingDates(false);
11093
- if ((selectedDates && !startIsEqualOrBeforeSelectedEnd) ||
11094
- (selectedDates && (range === null || range === void 0 ? void 0 : range.to) && !endIsEqualOrAfterSelectedStart)) {
11095
- setCalendarRange(undefined);
11096
- setOverlappingDates(true);
11097
- }
11098
- else if ((rangeTo && rangeFrom && rangeFrom === rangeTo) ||
11099
- (!rangeTo && !rangeFrom) ||
11100
- overlappingDateFrom) {
11101
- setCalendarRange(undefined);
11102
- setDisabledDates && setDisabledDates([]);
11103
- }
11104
- else if (calendarFrom && rangeFrom && rangeFrom !== calendarFrom) {
11105
- setCalendarRange({
11106
- from: range === null || range === void 0 ? void 0 : range.from,
11107
- to: undefined,
11108
- });
11109
- }
11110
- else {
11111
- setCalendarRange(range);
11112
- }
11113
- };
11114
- var handleDisabledDatesByPage = function (_a) {
11115
- var _b, _c, _d;
11116
- var newDisableCalendarDates = _a.newDisableCalendarDates, selectedPath = _a.selectedPath, today = _a.today;
11117
- var daysToOffsetCalendar = (newDisableCalendarDates === null || newDisableCalendarDates === void 0 ? void 0 : newDisableCalendarDates.disabledDatesByPage) && selectedPath
11118
- ? [
11119
- (_b = newDisableCalendarDates === null || newDisableCalendarDates === void 0 ? void 0 : newDisableCalendarDates.disabledDatesByPage) === null || _b === void 0 ? void 0 : _b.find(function (item) { return selectedPath === item.page; }),
11120
- ]
11121
- : [];
11122
- return daysToOffsetCalendar.length
11123
- ? [
11124
- {
11125
- from: addDays(today, daysToOffsetCalendar.length && ((_c = daysToOffsetCalendar[0]) === null || _c === void 0 ? void 0 : _c.offset)
11126
- ? (_d = daysToOffsetCalendar[0]) === null || _d === void 0 ? void 0 : _d.offset
11127
- : -2),
11128
- to: addDays(today, -100),
11129
- },
11130
- ]
11131
- : [];
11132
- };
11133
-
11134
- var parseDates = function (_a) {
11135
- var calendarRange = _a.calendarRange;
11136
- return (calendarRange === null || calendarRange === void 0 ? void 0 : calendarRange.to) && (calendarRange === null || calendarRange === void 0 ? void 0 : calendarRange.from)
11137
- ? "".concat(format(calendarRange.from, 'dd.MM.yyyy'), " -\n").concat(format(calendarRange.to, 'dd.MM.yyyy'))
11138
- : null;
11139
- };
11140
-
11141
- var parseDate = function (_a) {
11142
- var date = _a.date, _b = _a.dateFormat, dateFormat = _b === void 0 ? 'dd.MM.yyyy' : _b, language = _a.language;
11143
- return date
11144
- ? format(date, dateFormat, { locale: language === 'en' ? enUS : fi })
11145
- : null;
11146
- };
11147
-
11148
- var nightsCount = function (_a) {
11149
- var calendarRange = _a.calendarRange;
11150
- if (!calendarRange || !calendarRange.from || !calendarRange.to) {
11151
- return undefined;
11152
- }
11153
- var diffDays = differenceInCalendarDays(calendarRange.to, calendarRange.from);
11154
- return diffDays;
11155
- };
11156
11492
 
11157
11493
  var parseGuests = function (_a) {
11158
11494
  var guestLabel = _a.guestLabel, guestsLabel = _a.guestsLabel, guestsPlaceholder = _a.guestsPlaceholder, ageCategoryCounts = _a.ageCategoryCounts, ageCategories = _a.ageCategories;
@@ -11524,12 +11860,15 @@ var REDIRECT_URL_FALLBACK = 'http://localhost:3000/';
11524
11860
 
11525
11861
  var useFilterCalendar = function (_a) {
11526
11862
  var onSubmit = _a.onSubmit, setToggleCalendar = _a.setToggleCalendar, noActiveSelection = _a.noActiveSelection, toggleCalendar = _a.toggleCalendar;
11863
+ // State
11527
11864
  var _b = __read(useState(), 2), calendarRange = _b[0], setCalendarRange = _b[1];
11528
11865
  var _c = __read(useState(), 2), initialCalendarRange = _c[0], setInitialCalendarRange = _c[1];
11529
11866
  var _d = __read(useState([]), 2), disabledDates = _d[0], setDisabledDates = _d[1];
11530
11867
  var _e = __read(useState(false), 2), updateCalendarMonthNavigation = _e[0], setUpdateCalendarMonthNavigation = _e[1];
11531
11868
  var _f = __read(useState(0), 2), updateCalendarDefaultMoth = _f[0], setUpdateCalendarDefaultMoth = _f[1];
11532
- var _g = __read(useState(false), 2), overlappingDates = _g[0], setOverlappingDates = _g[1];
11869
+ var _g = __read(useState(false), 2), calendarHasError = _g[0], setCalendarHasError = _g[1];
11870
+ var _h = __read(useState(false), 2), updatedForSubmit = _h[0], setUpdatedForSubmit = _h[1];
11871
+ // Lifecycle
11533
11872
  useEffect(function () {
11534
11873
  if (typeof window === 'undefined')
11535
11874
  return;
@@ -11540,10 +11879,15 @@ var useFilterCalendar = function (_a) {
11540
11879
  if (noActiveSelection) {
11541
11880
  handleClearDates();
11542
11881
  setUpdateCalendarDefaultMoth(function (prev) { return prev + 1; });
11882
+ setUpdatedForSubmit(false);
11543
11883
  setInitialCalendarRange({
11544
11884
  from: new Date(startDateParam),
11545
11885
  to: new Date(endDateParam),
11546
11886
  });
11887
+ setCalendarRange({
11888
+ from: new Date(startDateParam),
11889
+ to: new Date(endDateParam),
11890
+ });
11547
11891
  }
11548
11892
  else {
11549
11893
  setCalendarRange({
@@ -11553,6 +11897,31 @@ var useFilterCalendar = function (_a) {
11553
11897
  }
11554
11898
  }
11555
11899
  }, [toggleCalendar]);
11900
+ useEffect(function () {
11901
+ var formatString = 'dd.MM.yyyy';
11902
+ var initialRangeTo = (initialCalendarRange === null || initialCalendarRange === void 0 ? void 0 : initialCalendarRange.to)
11903
+ ? format(initialCalendarRange.to, formatString)
11904
+ : null;
11905
+ var initialRangeFrom = (initialCalendarRange === null || initialCalendarRange === void 0 ? void 0 : initialCalendarRange.from)
11906
+ ? format(initialCalendarRange.from, formatString)
11907
+ : null;
11908
+ var calendarRangeTo = (calendarRange === null || calendarRange === void 0 ? void 0 : calendarRange.to)
11909
+ ? format(calendarRange.to, formatString)
11910
+ : null;
11911
+ var calendarRangeFrom = (calendarRange === null || calendarRange === void 0 ? void 0 : calendarRange.from)
11912
+ ? format(calendarRange.from, formatString)
11913
+ : null;
11914
+ if (!!(calendarRangeTo && calendarRangeFrom && updatedForSubmit)) {
11915
+ if (!!(calendarRangeTo !== initialRangeTo) ||
11916
+ !!(calendarRangeFrom !== initialRangeFrom)) {
11917
+ handleSubmit();
11918
+ }
11919
+ else {
11920
+ setToggleCalendar(false);
11921
+ }
11922
+ }
11923
+ }, [calendarRange]);
11924
+ // Methods
11556
11925
  var handleSubmit = function () {
11557
11926
  setToggleCalendar(false);
11558
11927
  return onSubmit(calendarRange);
@@ -11560,6 +11929,8 @@ var useFilterCalendar = function (_a) {
11560
11929
  var handleClearDates = function () {
11561
11930
  setDisabledDates([]);
11562
11931
  setCalendarRange(undefined);
11932
+ setCalendarHasError(false);
11933
+ setInitialCalendarRange(undefined);
11563
11934
  };
11564
11935
  return {
11565
11936
  handleSubmit: handleSubmit,
@@ -11571,17 +11942,17 @@ var useFilterCalendar = function (_a) {
11571
11942
  disabledDates: disabledDates,
11572
11943
  updateCalendarMonthNavigation: updateCalendarMonthNavigation,
11573
11944
  updateCalendarDefaultMoth: updateCalendarDefaultMoth,
11574
- initialCalendarRange: initialCalendarRange,
11575
- overlappingDates: overlappingDates,
11576
- setOverlappingDates: setOverlappingDates,
11945
+ calendarHasError: calendarHasError,
11946
+ setCalendarHasError: setCalendarHasError,
11947
+ setUpdatedForSubmit: setUpdatedForSubmit,
11577
11948
  };
11578
11949
  };
11579
11950
 
11580
- var css_248z = ".will-root .will-calendar-wrapper {\n box-shadow: var(--will-box-shadow-dark);\n border-radius: 20px;\n background-color: var(--will-white);\n position: absolute;\n top: 0;\n left: 0;\n}\n\n.will-root .will-calendar-wrapper .will-calendar-header,\n.will-root .will-calendar-wrapper .will-calendar-main,\n.will-root .will-calendar-wrapper .will-calendar-footer {\n padding: 20px;\n}\n\n/* Header */\n\n.will-root .will-calendar-wrapper .will-calendar-header {\n border-bottom: 1px solid var(--will-grey);\n}\n\n.will-root .will-calendar-wrapper .will-calendar-header-row {\n display: flex;\n justify-content: space-between;\n align-items: center;\n}\n\n/* Footer */\n\n.will-root .will-calendar-wrapper .will-calendar-footer {\n display: flex;\n justify-content: space-between;\n align-items: center;\n border-top: 1px solid var(--will-grey);\n}\n\n.will-root .will-calendar-wrapper .will-calendar-footer-dates > div {\n margin-bottom: 5px;\n}\n\n.will-root .will-calendar-wrapper .will-calendar-footer-dates-separator {\n margin: 0 15px;\n}\n\n.will-root .will-calendar-wrapper .will-calendar-footer-dates .will-calendar-footer-booked {\n display: flex;\n min-height: 20.5px;\n}\n\n.will-root .will-calendar-wrapper .will-calendar-footer-actions {\n display: flex;\n align-items: center;\n gap: 10px;\n}\n\n\n\n@media (max-width: 960px) {\n .will-root .will-calendar-wrapper {\n width: -webkit-fill-available;\n }\n\n .will-root .will-calendar-wrapper .will-calendar-header,\n .will-root .will-calendar-wrapper .will-calendar-main,\n .will-root .will-calendar-wrapper .will-calendar-footer {\n padding: 20px 10px;\n }\n\n .will-root .will-calendar-wrapper .will-calendar-footer {\n flex-direction: column;\n }\n\n .will-root .will-calendar-wrapper .will-calendar-footer-dates {\n margin-bottom: 12px;\n text-align: center;\n }\n\n .will-root .will-calendar-wrapper .will-calendar-footer-dates .will-calendar-footer-booked {\n justify-content: center;\n }\n\n .will-root .will-calendar-wrapper .will-calendar-footer-actions {\n flex-direction: column;\n width: 100%;\n }\n\n .will-root .will-calendar-wrapper .will-calendar-footer-actions button{\n width: 100%;\n }\n }\n\n/**/\n\n.will-root .will-calendar-wrapper .will-calendar-header .will-filter-bar-close-button {\n position: initial;\n}";
11951
+ var css_248z = ".will-root .will-calendar-wrapper {\n box-shadow: var(--will-box-shadow-dark);\n border-radius: 20px;\n background-color: var(--will-white);\n position: absolute;\n top: 0;\n left: 0;\n}\n\n.will-root .will-calendar-wrapper .will-calendar-header,\n.will-root .will-calendar-wrapper .will-calendar-main,\n.will-root .will-calendar-wrapper .will-calendar-footer {\n padding: 20px;\n}\n\n/* Header */\n\n.will-root .will-calendar-wrapper .will-calendar-header {\n display: flex;\n justify-content: space-between;\n border-bottom: 1px solid var(--will-grey);\n align-items: center;\n}\n\n/* Footer */\n\n.will-root .will-calendar-wrapper .will-calendar-footer {\n border-top: 1px solid var(--will-grey);\n}\n\n/* Footer actions */\n\n.will-root .will-calendar-wrapper .will-calendar-footer-actions-wrapper {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 10px;\n}\n\n.will-root .will-calendar-wrapper .will-calendar-footer-dates > div {\n margin-bottom: 5px;\n}\n\n.will-root .will-calendar-wrapper .will-calendar-footer-dates-separator {\n margin: 0 15px;\n}\n\n.will-root .will-calendar-wrapper .will-calendar-footer-dates .will-calendar-footer-booked {\n display: flex;\n min-height: 20.5px;\n}\n\n.will-root .will-calendar-wrapper .will-calendar-footer-actions {\n display: flex;\n align-items: center;\n gap: 10px;\n}\n\n@media (max-width: 960px) {\n .will-root .will-calendar-wrapper {\n width: -webkit-fill-available;\n }\n\n .will-root .will-calendar-wrapper .will-calendar-header,\n .will-root .will-calendar-wrapper .will-calendar-main,\n .will-root .will-calendar-wrapper .will-calendar-footer {\n padding: 20px 10px;\n }\n\n .will-root .will-calendar-wrapper .will-calendar-footer {\n flex-direction: column;\n }\n\n .will-root .will-calendar-wrapper .will-calendar-footer-dates {\n margin-bottom: 12px;\n text-align: center;\n }\n\n .will-root .will-calendar-wrapper .will-calendar-footer-dates .will-calendar-footer-booked {\n justify-content: center;\n }\n\n .will-root .will-calendar-wrapper .will-calendar-footer-actions {\n flex-direction: column;\n width: 100%;\n }\n\n .will-root .will-calendar-wrapper .will-calendar-footer-actions button{\n width: 100%;\n }\n }\n\n.will-root .will-calendar-wrapper .will-calendar-header .will-filter-bar-close-button {\n position: initial;\n}";
11581
11952
  styleInject(css_248z);
11582
11953
 
11583
11954
  function FilterCalendar(_a) {
11584
- var calendarOffset = _a.calendarOffset, language = _a.language, palette = _a.palette, onSubmit = _a.onSubmit, disableCalendarDates = _a.disableCalendarDates, toggleCalendar = _a.toggleCalendar, loadingData = _a.loadingData, setToggleCalendar = _a.setToggleCalendar, requestDates = _a.requestDates, showFeedback = _a.showFeedback, noActiveSelection = _a.noActiveSelection;
11955
+ var calendarOffset = _a.calendarOffset, language = _a.language, palette = _a.palette, onSubmit = _a.onSubmit, disableCalendarDates = _a.disableCalendarDates, toggleCalendar = _a.toggleCalendar, loadingData = _a.loadingData, setToggleCalendar = _a.setToggleCalendar, requestDates = _a.requestDates, showFeedback = _a.showFeedback, noActiveSelection = _a.noActiveSelection, rangeContext = _a.rangeContext;
11585
11956
  var themePalette = useTheme({ palette: palette });
11586
11957
  // Translations
11587
11958
  useUpdateTranslations({ language: language });
@@ -11591,7 +11962,7 @@ function FilterCalendar(_a) {
11591
11962
  setToggleCalendar: setToggleCalendar,
11592
11963
  noActiveSelection: noActiveSelection,
11593
11964
  toggleCalendar: toggleCalendar,
11594
- }), handleSubmit = _b.handleSubmit, setCalendarRange = _b.setCalendarRange, handleClearDates = _b.handleClearDates, calendarRange = _b.calendarRange, disabledDates = _b.disabledDates, setDisabledDates = _b.setDisabledDates, updateCalendarMonthNavigation = _b.updateCalendarMonthNavigation, updateCalendarDefaultMoth = _b.updateCalendarDefaultMoth, setUpdateCalendarMonthNavigation = _b.setUpdateCalendarMonthNavigation, initialCalendarRange = _b.initialCalendarRange, overlappingDates = _b.overlappingDates, setOverlappingDates = _b.setOverlappingDates;
11965
+ }), setCalendarRange = _b.setCalendarRange, handleClearDates = _b.handleClearDates, calendarRange = _b.calendarRange, disabledDates = _b.disabledDates, setDisabledDates = _b.setDisabledDates, updateCalendarMonthNavigation = _b.updateCalendarMonthNavigation, updateCalendarDefaultMoth = _b.updateCalendarDefaultMoth, setUpdateCalendarMonthNavigation = _b.setUpdateCalendarMonthNavigation, calendarHasError = _b.calendarHasError, setCalendarHasError = _b.setCalendarHasError, setUpdatedForSubmit = _b.setUpdatedForSubmit;
11595
11966
  // Display component after fully loaded
11596
11967
  useAwaitRender();
11597
11968
  // Handle close filter section
@@ -11599,36 +11970,39 @@ function FilterCalendar(_a) {
11599
11970
  handleSelectedFilter: setToggleCalendar,
11600
11971
  }).filtersRef;
11601
11972
  var nights = nightsCount({
11602
- calendarRange: calendarRange || initialCalendarRange,
11973
+ calendarRange: calendarRange,
11603
11974
  });
11604
11975
  return (React__default__default.createElement("div", { className: "will-root", style: themePalette }, toggleCalendar && (React__default__default.createElement("div", { className: "will-calendar-wrapper", ref: filtersRef },
11605
11976
  React__default__default.createElement("div", { className: "will-calendar-header" },
11606
- React__default__default.createElement("div", { className: "will-calendar-header-row" },
11607
- React__default__default.createElement("h2", null, t('filterBar:calendar.title')),
11608
- React__default__default.createElement(CloseButton, { handleClose: function () { return setToggleCalendar(false); } })),
11609
- overlappingDates && React__default__default.createElement("div", null, "Chose other dates")),
11977
+ React__default__default.createElement("h2", null, t('filterBar:calendar.title')),
11978
+ React__default__default.createElement(CloseButton, { handleClose: function () { return setToggleCalendar(false); } })),
11610
11979
  React__default__default.createElement("div", { className: "will-calendar-main" },
11611
- React__default__default.createElement(Calendar, { calendarRange: calendarRange, setCalendarRange: setCalendarRange, calendarOffset: calendarOffset, selectedPath: '/rooms', language: language, disableCalendarDates: disableCalendarDates, requestDates: requestDates, disabledDates: disabledDates, setDisabledDates: setDisabledDates, updateCalendarMonthNavigation: updateCalendarMonthNavigation, setUpdateCalendarMonthNavigation: setUpdateCalendarMonthNavigation, updateCalendarDefaultMoth: updateCalendarDefaultMoth, loadingData: loadingData, initialCalendarRange: initialCalendarRange, showFeedback: showFeedback, noActiveSelection: noActiveSelection, palette: palette, setOverlappingDates: setOverlappingDates })),
11980
+ React__default__default.createElement(Calendar, { calendarRange: calendarRange, setCalendarRange: setCalendarRange, calendarOffset: calendarOffset, selectedPath: '/rooms', language: language, disableCalendarDates: disableCalendarDates, requestDates: requestDates, disabledDates: disabledDates, setDisabledDates: setDisabledDates, updateCalendarMonthNavigation: updateCalendarMonthNavigation, setUpdateCalendarMonthNavigation: setUpdateCalendarMonthNavigation, updateCalendarDefaultMoth: updateCalendarDefaultMoth, loadingData: loadingData, showFeedback: showFeedback, noActiveSelection: noActiveSelection, palette: palette, setCalendarHasError: setCalendarHasError, setUpdatedForSubmit: setUpdatedForSubmit, rangeContext: rangeContext, calendarHasError: calendarHasError })),
11612
11981
  React__default__default.createElement("div", { className: "will-calendar-footer" },
11613
- React__default__default.createElement("div", { className: "will-calendar-footer-dates" },
11614
- React__default__default.createElement("div", null,
11615
- React__default__default.createElement("span", null, parseDate({
11616
- date: (calendarRange === null || calendarRange === void 0 ? void 0 : calendarRange.from) || (initialCalendarRange === null || initialCalendarRange === void 0 ? void 0 : initialCalendarRange.from),
11617
- dateFormat: 'EEEEEE d.M.yyyy',
11618
- language: language,
11619
- }) || t('common:checkIn')),
11620
- React__default__default.createElement("span", { className: "will-calendar-footer-dates-separator" }, "-"),
11621
- React__default__default.createElement("span", null, parseDate({
11622
- date: (calendarRange === null || calendarRange === void 0 ? void 0 : calendarRange.to) || (initialCalendarRange === null || initialCalendarRange === void 0 ? void 0 : initialCalendarRange.to),
11623
- dateFormat: 'EEEEEE d.M.yyyy',
11624
- language: language,
11625
- }) || t('common:checkOut'))),
11626
- React__default__default.createElement("span", { className: "will-calendar-footer-booked" }, nights
11627
- ? "".concat(nights, " ").concat(t("common:".concat(nights === 1 ? 'night' : 'nights')))
11628
- : '')),
11629
- React__default__default.createElement("div", { className: "will-calendar-footer-actions" },
11630
- React__default__default.createElement(SubmitButton, { onClick: handleClearDates, disabled: !(calendarRange === null || calendarRange === void 0 ? void 0 : calendarRange.from), label: t("common:clearDates") }),
11631
- React__default__default.createElement(SubmitButton, { onClick: function () { return handleSubmit(); }, label: t("common:apply"), disabled: !(calendarRange === null || calendarRange === void 0 ? void 0 : calendarRange.from) || !(calendarRange === null || calendarRange === void 0 ? void 0 : calendarRange.to) })))))));
11982
+ React__default__default.createElement("div", { className: "will-calendar-footer-actions-wrapper" },
11983
+ React__default__default.createElement("div", { className: "will-calendar-footer-dates" },
11984
+ calendarHasError ? (React__default__default.createElement("span", null, "Start or end day need connection for previous reservation")) : (React__default__default.createElement("div", null,
11985
+ React__default__default.createElement("span", null, parseDate({
11986
+ date: calendarRange === null || calendarRange === void 0 ? void 0 : calendarRange.from,
11987
+ dateFormat: 'EEEEEE d.M.yyyy',
11988
+ language: language,
11989
+ }) || t('common:checkIn')),
11990
+ React__default__default.createElement("span", { className: "will-calendar-footer-dates-separator" }, "-"),
11991
+ React__default__default.createElement("span", null, parseDate({
11992
+ date: calendarRange === null || calendarRange === void 0 ? void 0 : calendarRange.to,
11993
+ dateFormat: 'EEEEEE d.M.yyyy',
11994
+ language: language,
11995
+ }) || t('common:checkOut')))),
11996
+ React__default__default.createElement("span", { className: "will-calendar-footer-booked" }, calendarHasError
11997
+ ? '2 nights min'
11998
+ : nights
11999
+ ? "".concat(nights, " ").concat(t("common:".concat(nights === 1 ? 'night' : 'nights')))
12000
+ : '')),
12001
+ React__default__default.createElement("div", { className: "will-calendar-footer-actions" },
12002
+ React__default__default.createElement(SubmitButton, { onClick: handleClearDates, disabled: !(calendarRange === null || calendarRange === void 0 ? void 0 : calendarRange.from), label: t("common:clearDates") }))),
12003
+ calendarHasError && (React__default__default.createElement("div", { style: { display: 'flex', alignItems: 'center' } },
12004
+ React__default__default.createElement(IconsSvg, { fill: (palette === null || palette === void 0 ? void 0 : palette.error) || 'inherit', size: 25, icon: "warning" }),
12005
+ React__default__default.createElement("span", { style: { marginLeft: '10px' } }, "Check-in available for second room only with connection dates"))))))));
11632
12006
  }
11633
12007
 
11634
12008
  export { Button$1 as Button, FilterBar, FilterCalendar };