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.umd.js CHANGED
@@ -544,11 +544,12 @@
544
544
  var themePalette = {
545
545
  '--will-primary': palette === null || palette === void 0 ? void 0 : palette.primary,
546
546
  '--will-secondary': palette === null || palette === void 0 ? void 0 : palette.secondary,
547
+ '--will-error': palette === null || palette === void 0 ? void 0 : palette.error,
547
548
  };
548
549
  return themePalette;
549
550
  }
550
551
 
551
- 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";
552
+ 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";
552
553
  styleInject(css_248z$c);
553
554
 
554
555
  var useAwaitRender = function () {
@@ -3779,6 +3780,111 @@
3779
3780
  return Math.round((timestampLeft - timestampRight) / MILLISECONDS_IN_WEEK$4);
3780
3781
  }
3781
3782
 
3783
+ // for accurate equality comparisons of UTC timestamps that end up
3784
+ // having the same representation in local time, e.g. one hour before
3785
+ // DST ends vs. the instant that DST ends.
3786
+ function compareLocalAsc(dateLeft, dateRight) {
3787
+ 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();
3788
+ if (diff < 0) {
3789
+ return -1;
3790
+ } else if (diff > 0) {
3791
+ return 1;
3792
+ // Return 0 if diff is 0; return NaN if diff is NaN
3793
+ } else {
3794
+ return diff;
3795
+ }
3796
+ }
3797
+
3798
+ /**
3799
+ * @name differenceInDays
3800
+ * @category Day Helpers
3801
+ * @summary Get the number of full days between the given dates.
3802
+ *
3803
+ * @description
3804
+ * Get the number of full day periods between two dates. Fractional days are
3805
+ * truncated towards zero.
3806
+ *
3807
+ * One "full day" is the distance between a local time in one day to the same
3808
+ * local time on the next or previous day. A full day can sometimes be less than
3809
+ * or more than 24 hours if a daylight savings change happens between two dates.
3810
+ *
3811
+ * To ignore DST and only measure exact 24-hour periods, use this instead:
3812
+ * `Math.floor(differenceInHours(dateLeft, dateRight)/24)|0`.
3813
+ *
3814
+ *
3815
+ * @param {Date|Number} dateLeft - the later date
3816
+ * @param {Date|Number} dateRight - the earlier date
3817
+ * @returns {Number} the number of full days according to the local timezone
3818
+ * @throws {TypeError} 2 arguments required
3819
+ *
3820
+ * @example
3821
+ * // How many full days are between
3822
+ * // 2 July 2011 23:00:00 and 2 July 2012 00:00:00?
3823
+ * const result = differenceInDays(
3824
+ * new Date(2012, 6, 2, 0, 0),
3825
+ * new Date(2011, 6, 2, 23, 0)
3826
+ * )
3827
+ * //=> 365
3828
+ * // How many full days are between
3829
+ * // 2 July 2011 23:59:00 and 3 July 2011 00:01:00?
3830
+ * const result = differenceInDays(
3831
+ * new Date(2011, 6, 3, 0, 1),
3832
+ * new Date(2011, 6, 2, 23, 59)
3833
+ * )
3834
+ * //=> 0
3835
+ * // How many full days are between
3836
+ * // 1 March 2020 0:00 and 1 June 2020 0:00 ?
3837
+ * // Note: because local time is used, the
3838
+ * // result will always be 92 days, even in
3839
+ * // time zones where DST starts and the
3840
+ * // period has only 92*24-1 hours.
3841
+ * const result = differenceInDays(
3842
+ * new Date(2020, 5, 1),
3843
+ * new Date(2020, 2, 1)
3844
+ * )
3845
+ //=> 92
3846
+ */
3847
+ function differenceInDays(dirtyDateLeft, dirtyDateRight) {
3848
+ requiredArgs(2, arguments);
3849
+ var dateLeft = toDate(dirtyDateLeft);
3850
+ var dateRight = toDate(dirtyDateRight);
3851
+ var sign = compareLocalAsc(dateLeft, dateRight);
3852
+ var difference = Math.abs(differenceInCalendarDays(dateLeft, dateRight));
3853
+ dateLeft.setDate(dateLeft.getDate() - sign * difference);
3854
+
3855
+ // Math.abs(diff in full days - diff in calendar days) === 1 if last calendar day is not full
3856
+ // If so, result must be decreased by 1 in absolute value
3857
+ var isLastDayNotFull = Number(compareLocalAsc(dateLeft, dateRight) === -sign);
3858
+ var result = sign * (difference - isLastDayNotFull);
3859
+ // Prevent negative zero
3860
+ return result === 0 ? 0 : result;
3861
+ }
3862
+
3863
+ /**
3864
+ * @name endOfDay
3865
+ * @category Day Helpers
3866
+ * @summary Return the end of a day for the given date.
3867
+ *
3868
+ * @description
3869
+ * Return the end of a day for the given date.
3870
+ * The result will be in the local timezone.
3871
+ *
3872
+ * @param {Date|Number} date - the original date
3873
+ * @returns {Date} the end of a day
3874
+ * @throws {TypeError} 1 argument required
3875
+ *
3876
+ * @example
3877
+ * // The end of a day for 2 September 2014 11:55:00:
3878
+ * const result = endOfDay(new Date(2014, 8, 2, 11, 55, 0))
3879
+ * //=> Tue Sep 02 2014 23:59:59.999
3880
+ */
3881
+ function endOfDay(dirtyDate) {
3882
+ requiredArgs(1, arguments);
3883
+ var date = toDate(dirtyDate);
3884
+ date.setHours(23, 59, 59, 999);
3885
+ return date;
3886
+ }
3887
+
3782
3888
  /**
3783
3889
  * @name endOfMonth
3784
3890
  * @category Month Helpers
@@ -10839,83 +10945,304 @@
10839
10945
 
10840
10946
  var reactResponsiveExports = reactResponsive.exports;
10841
10947
 
10842
- var SpinnerSVG = function (_a) {
10843
- var fill = _a.fill, size = _a.size;
10844
- return (React__default.createElement("svg", { xmlns: "http://www.w3.org/2000/svg", width: "".concat(size || 25), height: "".concat(size || 25), viewBox: "0 0 24 24" },
10845
- React__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 "),
10846
- React__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 }),
10847
- React__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 })));
10948
+ var IconsSvg = function (_a) {
10949
+ var fill = _a.fill, size = _a.size, icon = _a.icon;
10950
+ switch (icon) {
10951
+ case 'spinner':
10952
+ return (React__default.createElement("svg", { xmlns: "http://www.w3.org/2000/svg", width: "".concat(size || 25), height: "".concat(size || 25), viewBox: "0 0 24 24" },
10953
+ React__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 "),
10954
+ React__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 }),
10955
+ React__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 })));
10956
+ case 'warning':
10957
+ return (React__default.createElement("svg", { xmlns: "http://www.w3.org/2000/svg", width: "".concat(size || 25), height: "".concat(size || 25), className: "svg-icon", style: {
10958
+ verticalAlign: 'middle',
10959
+ fill: fill,
10960
+ overflow: 'hidden',
10961
+ }, viewBox: "0 0 1024 1024", version: "1.1" },
10962
+ React__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" })));
10963
+ }
10848
10964
  };
10849
10965
 
10850
- 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}";
10851
- styleInject(css_248z$9);
10966
+ var parseDates = function (_a) {
10967
+ var calendarRange = _a.calendarRange;
10968
+ return (calendarRange === null || calendarRange === void 0 ? void 0 : calendarRange.to) && (calendarRange === null || calendarRange === void 0 ? void 0 : calendarRange.from)
10969
+ ? "".concat(format(calendarRange.from, 'dd.MM.yyyy'), " -\n").concat(format(calendarRange.to, 'dd.MM.yyyy'))
10970
+ : null;
10971
+ };
10852
10972
 
10853
- 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";
10854
- styleInject(css_248z$8);
10973
+ var parseDate = function (_a) {
10974
+ var date = _a.date, _b = _a.dateFormat, dateFormat = _b === void 0 ? 'dd.MM.yyyy' : _b, language = _a.language;
10975
+ return date
10976
+ ? format(date, dateFormat, { locale: language === 'en' ? enUS : fi })
10977
+ : null;
10978
+ };
10855
10979
 
10856
- var Calendar = React__default.forwardRef(function (_a, ref) {
10980
+ var nightsCount = function (_a) {
10981
+ var calendarRange = _a.calendarRange;
10982
+ if (!calendarRange || !calendarRange.from || !calendarRange.to) {
10983
+ return undefined;
10984
+ }
10985
+ var diffDays = differenceInCalendarDays(calendarRange.to, calendarRange.from);
10986
+ return diffDays;
10987
+ };
10988
+
10989
+ var calendarSelectionRules = function (_a) {
10857
10990
  var _b;
10858
- 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;
10859
- // Translations
10860
- var t = useTranslation('common').t;
10861
- var isTablet = reactResponsiveExports.useMediaQuery({ maxWidth: 960 });
10862
- var today = startOfDay(new Date());
10863
- var selectedStartDate = calendarRange === null || calendarRange === void 0 ? void 0 : calendarRange.from;
10864
- // Handle overlapping availableDates.lastCheckOut and disabledDates.start
10865
- var _c = __read(React__default.useState(undefined), 2), overlappingDate = _c[0], setOverlappingDate = _c[1];
10866
- var newDisableCalendarDates = React__default.useMemo(function () {
10867
- if (disableCalendarDates === null || disableCalendarDates === void 0 ? void 0 : disableCalendarDates.availableDates) {
10868
- var dateFormat_1 = 'dd-MM-yyyy';
10869
- var disabledDates_1 = disableCalendarDates.disabledDates;
10870
- var _a = (disabledDates_1 || []).reduce(function (acc, dateRange) {
10871
- var _a, _b;
10872
- var formattedFromDate = format(dateRange.from, dateFormat_1);
10873
- var formattedToDate = format(dateRange.to, dateFormat_1);
10874
- var hasTwoOverlappingDates = (_a = disableCalendarDates.availableDates) === null || _a === void 0 ? void 0 : _a.some(function (item) {
10875
- return format(item.lastCheckOut, dateFormat_1) === formattedFromDate &&
10876
- format(item.lastCheckOut, dateFormat_1) === formattedToDate;
10877
- });
10878
- var hasOneOverlappingDate = (_b = disableCalendarDates.availableDates) === null || _b === void 0 ? void 0 : _b.some(function (item) {
10879
- return format(item.lastCheckOut, dateFormat_1) === formattedFromDate &&
10880
- format(item.lastCheckOut, dateFormat_1) !== formattedToDate;
10881
- });
10882
- if (hasTwoOverlappingDates) {
10883
- acc.newOverlappingDates.push(dateRange);
10884
- }
10885
- else if (hasOneOverlappingDate) {
10886
- acc.newOverlappingDates.push(dateRange);
10887
- acc.updatedDisabledDates.push(__assign$2(__assign$2({}, dateRange), { from: addDays(dateRange.from, 1) }));
10888
- }
10889
- else {
10890
- acc.updatedDisabledDates.push(dateRange);
10891
- }
10892
- return acc;
10893
- }, { updatedDisabledDates: [], newOverlappingDates: [] }), updatedDisabledDates = _a.updatedDisabledDates, newOverlappingDates_1 = _a.newOverlappingDates;
10894
- if (newOverlappingDates_1.length) {
10895
- setOverlappingDate(function (prev) {
10896
- if (prev === void 0) { prev = []; }
10897
- return __spreadArray$1(__spreadArray$1([], __read(prev), false), __read(newOverlappingDates_1), false);
10898
- });
10899
- }
10900
- var newDisableCalendarDates_1 = __assign$2(__assign$2({}, disableCalendarDates), { disabledDates: updatedDisabledDates });
10901
- return newDisableCalendarDates_1;
10902
- }
10903
- return disableCalendarDates;
10904
- }, [
10905
- disableCalendarDates,
10906
- calendarRange,
10907
- updateCalendarMonthNavigation,
10908
- initialCalendarRange,
10909
- updateCalendarDefaultMoth,
10910
- ]);
10911
- // Handle disable dates by page
10912
- var disabledDatesByPage = handleDisabledDatesByPage({
10913
- today: today,
10914
- selectedPath: selectedPath,
10991
+ 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;
10992
+ // Get and parse needed data
10993
+ var dateFormat = 'dd-MM-yyyy';
10994
+ var rangeFrom = (range === null || range === void 0 ? void 0 : range.from) ? format(range.from, dateFormat) : null;
10995
+ var rangeTo = (range === null || range === void 0 ? void 0 : range.to) ? format(range.to, dateFormat) : null;
10996
+ var calendarFrom = (calendarRange === null || calendarRange === void 0 ? void 0 : calendarRange.from)
10997
+ ? format(calendarRange === null || calendarRange === void 0 ? void 0 : calendarRange.from, dateFormat)
10998
+ : null;
10999
+ (calendarRange === null || calendarRange === void 0 ? void 0 : calendarRange.to)
11000
+ ? format(calendarRange === null || calendarRange === void 0 ? void 0 : calendarRange.to, dateFormat)
11001
+ : null;
11002
+ (rangeContext === null || rangeContext === void 0 ? void 0 : rangeContext.from)
11003
+ ? format(rangeContext.from, dateFormat)
11004
+ : null;
11005
+ var overlappingDateFrom = (overlappingDate === null || overlappingDate === void 0 ? void 0 : overlappingDate.length)
11006
+ ? overlappingDate.find(function (date) {
11007
+ return date.from ? format(date.from, dateFormat) === rangeFrom : false;
11008
+ })
11009
+ : null;
11010
+ var checkOutRange = ((_b = newDisableCalendarDates === null || newDisableCalendarDates === void 0 ? void 0 : newDisableCalendarDates.availableDates) === null || _b === void 0 ? void 0 : _b.length)
11011
+ ? newDisableCalendarDates.availableDates.find(function (checkInDate) {
11012
+ return format(checkInDate.checkIn || 1, dateFormat) ===
11013
+ format((range === null || range === void 0 ? void 0 : range.from) || 1, dateFormat);
11014
+ })
11015
+ : null;
11016
+ // On check-in, disable future dates that are unavailable for checkout
11017
+ disableFutureDates({
11018
+ rangeFrom: rangeFrom,
11019
+ checkOutRange: checkOutRange,
11020
+ setDisabledDates: setDisabledDates,
11021
+ dateFormat: dateFormat,
10915
11022
  newDisableCalendarDates: newDisableCalendarDates,
10916
11023
  });
10917
- // Handle tooltip
10918
- React__default.useEffect(function () {
11024
+ // Calendar selection rules
11025
+ switch (true) {
11026
+ case !!overlappingDateFrom:
11027
+ // Clear the selection when overlapping dates are detected
11028
+ return setCalendarRange(undefined);
11029
+ case !!((!rangeTo && !rangeFrom && calendarFrom) || rangeTo === rangeFrom):
11030
+ // Handle double-click on the same date
11031
+ return setCalendarRange({ from: calendarRange === null || calendarRange === void 0 ? void 0 : calendarRange.from, to: undefined });
11032
+ case (range === null || range === void 0 ? void 0 : range.to) &&
11033
+ (calendarRange === null || calendarRange === void 0 ? void 0 : calendarRange.to) &&
11034
+ isAfter(endOfDay(range.to), endOfDay(calendarRange.to)) &&
11035
+ !((range === null || range === void 0 ? void 0 : range.to) &&
11036
+ (rangeContext === null || rangeContext === void 0 ? void 0 : rangeContext.to) &&
11037
+ isAfter(startOfDay(range.to), startOfDay(rangeContext.to))):
11038
+ // Handle checkout selection greater than current checkout
11039
+ return setCalendarRange({ from: range === null || range === void 0 ? void 0 : range.to, to: undefined });
11040
+ case calendarFrom && rangeFrom && rangeFrom !== calendarFrom:
11041
+ // Handle check-in selection prior to current check-in
11042
+ return setCalendarRange({ from: range === null || range === void 0 ? void 0 : range.from, to: undefined });
11043
+ case checkOutRange && (range === null || range === void 0 ? void 0 : range.to) && checkOutRange.lastCheckOut < range.to:
11044
+ return setCalendarRange({ from: range === null || range === void 0 ? void 0 : range.to, to: undefined });
11045
+ // Handle checkout selection between the range context and first passible check-in
11046
+ case (range === null || range === void 0 ? void 0 : range.to) &&
11047
+ (rangeContext === null || rangeContext === void 0 ? void 0 : rangeContext.from) &&
11048
+ isBefore(startOfDay(range.to), startOfDay(rangeContext.from)):
11049
+ return setCalendarRange({ from: range === null || range === void 0 ? void 0 : range.to, to: undefined });
11050
+ case (range === null || range === void 0 ? void 0 : range.from) &&
11051
+ (rangeContext === null || rangeContext === void 0 ? void 0 : rangeContext.to) &&
11052
+ isAfter(startOfDay(range.from), startOfDay(rangeContext.to)):
11053
+ return (setCalendarRange(undefined),
11054
+ setCalendarHasError && setCalendarHasError(true));
11055
+ //
11056
+ default:
11057
+ // Apply the given range
11058
+ return setCalendarRange(range);
11059
+ }
11060
+ };
11061
+ /////////
11062
+ var disableFutureDates = function (_a) {
11063
+ var rangeFrom = _a.rangeFrom, checkOutRange = _a.checkOutRange, setDisabledDates = _a.setDisabledDates, dateFormat = _a.dateFormat, newDisableCalendarDates = _a.newDisableCalendarDates;
11064
+ if (rangeFrom && checkOutRange && setDisabledDates) {
11065
+ // Get and parse data
11066
+ var checkIn = addDays(checkOutRange.checkIn, 1);
11067
+ var firstCheckOut = addDays(checkOutRange.firstCheckOut, -1);
11068
+ var noDatesRange = format(checkIn, dateFormat) ===
11069
+ format(checkOutRange.firstCheckOut, dateFormat);
11070
+ // -------------------
11071
+ setDisabledDates(__spreadArray$1(__spreadArray$1([], __read(((newDisableCalendarDates === null || newDisableCalendarDates === void 0 ? void 0 : newDisableCalendarDates.disabledDates) || [])), false), [
11072
+ {
11073
+ from: noDatesRange ? undefined : checkIn,
11074
+ to: noDatesRange ? undefined : firstCheckOut,
11075
+ },
11076
+ ], false));
11077
+ }
11078
+ };
11079
+
11080
+ var disabledDatesByPage = function (_a) {
11081
+ var _b, _c, _d;
11082
+ var newDisableCalendarDates = _a.newDisableCalendarDates, selectedPath = _a.selectedPath, today = _a.today;
11083
+ var daysToOffsetCalendar = (newDisableCalendarDates === null || newDisableCalendarDates === void 0 ? void 0 : newDisableCalendarDates.disabledDatesByPage) && selectedPath
11084
+ ? [
11085
+ (_b = newDisableCalendarDates === null || newDisableCalendarDates === void 0 ? void 0 : newDisableCalendarDates.disabledDatesByPage) === null || _b === void 0 ? void 0 : _b.find(function (item) { return selectedPath === item.page; }),
11086
+ ]
11087
+ : [];
11088
+ return daysToOffsetCalendar.length
11089
+ ? [
11090
+ {
11091
+ from: addDays(today, daysToOffsetCalendar.length && ((_c = daysToOffsetCalendar[0]) === null || _c === void 0 ? void 0 : _c.offset)
11092
+ ? (_d = daysToOffsetCalendar[0]) === null || _d === void 0 ? void 0 : _d.offset
11093
+ : -2),
11094
+ to: addDays(today, -100),
11095
+ },
11096
+ ]
11097
+ : [];
11098
+ };
11099
+
11100
+ var handleCalendarModifiers = function (_a) {
11101
+ var _b;
11102
+ 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;
11103
+ // Create range for range context middle selection and current overlapping selection
11104
+ var rangeContextMiddleSelection = (rangeContext === null || rangeContext === void 0 ? void 0 : rangeContext.from) && (rangeContext === null || rangeContext === void 0 ? void 0 : rangeContext.to)
11105
+ ? Array.from({ length: differenceInDays(rangeContext.to, rangeContext.from) - 1 }, function (_, i) { return ({
11106
+ from: addDays(rangeContext.from, i + 1),
11107
+ to: addDays(rangeContext.from, i + 1),
11108
+ }); }).filter(function (date) {
11109
+ return !(((calendarRange === null || calendarRange === void 0 ? void 0 : calendarRange.from) &&
11110
+ isEqual(endOfDay(calendarRange.from), endOfDay(date.from))) ||
11111
+ ((calendarRange === null || calendarRange === void 0 ? void 0 : calendarRange.to) &&
11112
+ isEqual(endOfDay(calendarRange.to), endOfDay(date.from))));
11113
+ })
11114
+ : [];
11115
+ return {
11116
+ booked: disabledDatesByPage.length
11117
+ ? disabledDatesByPage
11118
+ : (disabledDates === null || disabledDates === void 0 ? void 0 : disabledDates.length)
11119
+ ? __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)
11120
+ ? __spreadArray$1(__spreadArray$1(__spreadArray$1([], __read(newDisableCalendarDates === null || newDisableCalendarDates === void 0 ? void 0 : newDisableCalendarDates.disabledDates), false), __read(firstPossibleRangeContextCheckIn), false), __read(lastPossibleRangeContextCheckOut), false) : [],
11121
+ disabledAfterCheckIn: (calendarRange === null || calendarRange === void 0 ? void 0 : calendarRange.from)
11122
+ ? [{ after: calendarRange.from }]
11123
+ : [],
11124
+ overlappingDate: __spreadArray$1([], __read((!(calendarRange === null || calendarRange === void 0 ? void 0 : calendarRange.from) && !!(overlappingDate === null || overlappingDate === void 0 ? void 0 : overlappingDate.length) && !rangeContext
11125
+ ? overlappingDate.map(function (date) { return ({ from: date.from }); })
11126
+ : [])), false),
11127
+ noActiveSelectionStart: (rangeContext === null || rangeContext === void 0 ? void 0 : rangeContext.from) &&
11128
+ !((calendarRange === null || calendarRange === void 0 ? void 0 : calendarRange.from) &&
11129
+ (rangeContext === null || rangeContext === void 0 ? void 0 : rangeContext.from) &&
11130
+ isEqual(endOfDay(rangeContext.from), endOfDay(calendarRange.from)))
11131
+ ? rangeContext.from
11132
+ : [],
11133
+ noActiveSelectionMid: __spreadArray$1([], __read((rangeContextMiddleSelection.length
11134
+ ? rangeContextMiddleSelection
11135
+ : [])), false),
11136
+ noActiveSelectionEnd: (rangeContext === null || rangeContext === void 0 ? void 0 : rangeContext.to) &&
11137
+ !((calendarRange === null || calendarRange === void 0 ? void 0 : calendarRange.from) &&
11138
+ (rangeContext === null || rangeContext === void 0 ? void 0 : rangeContext.to) &&
11139
+ isEqual(endOfDay(rangeContext.to), endOfDay(calendarRange.from)))
11140
+ ? rangeContext.to
11141
+ : [],
11142
+ checkoutOptionsMid: __spreadArray$1([], __read(((calendarRange === null || calendarRange === void 0 ? void 0 : calendarRange.from) &&
11143
+ !(calendarRange === null || calendarRange === void 0 ? void 0 : calendarRange.to) &&
11144
+ (currentSelectionLastCheckoutDate === null || currentSelectionLastCheckoutDate === void 0 ? void 0 : currentSelectionLastCheckoutDate.lastCheckOut)
11145
+ ? [
11146
+ {
11147
+ after: calendarRange.from,
11148
+ before: addDays(currentSelectionLastCheckoutDate.lastCheckOut, 1),
11149
+ },
11150
+ ]
11151
+ : [])), false),
11152
+ checkInOnly: __spreadArray$1([], __read(((findFirstPossibleRangeContextCheckIn === null || findFirstPossibleRangeContextCheckIn === void 0 ? void 0 : findFirstPossibleRangeContextCheckIn.checkIn) && rangeContext
11153
+ ? [
11154
+ {
11155
+ from: findFirstPossibleRangeContextCheckIn.checkIn,
11156
+ to: addDays(rangeContext.from, -1),
11157
+ },
11158
+ ]
11159
+ : [])), false),
11160
+ checkOutOnly: __spreadArray$1([], __read(((findLastPossibleRangeContextCheckOut === null || findLastPossibleRangeContextCheckOut === void 0 ? void 0 : findLastPossibleRangeContextCheckOut.checkIn) &&
11161
+ findLastPossibleRangeContextCheckOut.lastCheckOut
11162
+ ? [
11163
+ {
11164
+ from: addDays(findLastPossibleRangeContextCheckOut.checkIn, 1),
11165
+ to: findLastPossibleRangeContextCheckOut.lastCheckOut,
11166
+ },
11167
+ ]
11168
+ : [])), false),
11169
+ };
11170
+ };
11171
+
11172
+ var handleRangeContextDisabledDates = function (_a) {
11173
+ var rangeContext = _a.rangeContext, availableDates = _a.availableDates, calendarRange = _a.calendarRange;
11174
+ var findFirstPossibleRangeContextCheckIn;
11175
+ var findLastPossibleRangeContextCheckOut;
11176
+ var firstPossibleRangeContextCheckIn = [];
11177
+ var lastPossibleRangeContextCheckOut = [];
11178
+ if (rangeContext && (availableDates === null || availableDates === void 0 ? void 0 : availableDates.length)) {
11179
+ // Find the first possible check-in after the last date gap till the range context
11180
+ findFirstPossibleRangeContextCheckIn = availableDates === null || availableDates === void 0 ? void 0 : availableDates.find(function (date) {
11181
+ return date.checkIn < rangeContext.from &&
11182
+ date.lastCheckOut >= rangeContext.from;
11183
+ });
11184
+ if (findFirstPossibleRangeContextCheckIn === null || findFirstPossibleRangeContextCheckIn === void 0 ? void 0 : findFirstPossibleRangeContextCheckIn.checkIn) {
11185
+ firstPossibleRangeContextCheckIn.push({
11186
+ before: findFirstPossibleRangeContextCheckIn.checkIn,
11187
+ });
11188
+ }
11189
+ // Find the last possible checkout before the first date gap till the range context
11190
+ findLastPossibleRangeContextCheckOut = availableDates === null || availableDates === void 0 ? void 0 : availableDates.find(function (date) {
11191
+ return isEqual(rangeContext.to, date.checkIn);
11192
+ });
11193
+ if (findLastPossibleRangeContextCheckOut === null || findLastPossibleRangeContextCheckOut === void 0 ? void 0 : findLastPossibleRangeContextCheckOut.checkIn) {
11194
+ lastPossibleRangeContextCheckOut.push({
11195
+ after: findLastPossibleRangeContextCheckOut.lastCheckOut,
11196
+ });
11197
+ }
11198
+ }
11199
+ // Get last possible check-out dates for current check-in
11200
+ var currentSelectionLastCheckoutDate = availableDates === null || availableDates === void 0 ? void 0 : availableDates.find(function (date) {
11201
+ var calendarCheckIn = (calendarRange === null || calendarRange === void 0 ? void 0 : calendarRange.from)
11202
+ ? format(calendarRange.from, 'dd.MM.yyyy')
11203
+ : null;
11204
+ var itemCheckIn = format(date.checkIn, 'dd.MM.yyyy');
11205
+ return calendarCheckIn ? itemCheckIn === calendarCheckIn : false;
11206
+ });
11207
+ return {
11208
+ findFirstPossibleRangeContextCheckIn: findFirstPossibleRangeContextCheckIn,
11209
+ findLastPossibleRangeContextCheckOut: findLastPossibleRangeContextCheckOut,
11210
+ firstPossibleRangeContextCheckIn: firstPossibleRangeContextCheckIn,
11211
+ lastPossibleRangeContextCheckOut: lastPossibleRangeContextCheckOut,
11212
+ currentSelectionLastCheckoutDate: currentSelectionLastCheckoutDate,
11213
+ };
11214
+ };
11215
+
11216
+ // Case: If the selected dates do not overlap with the rangeContext during continuous selection,
11217
+ // set setCalendarHasError to true. This will display an error message and
11218
+ // prevent the submission of the selected dates.
11219
+ var checkForContinuousSelection = function (_a) {
11220
+ var setCalendarHasError = _a.setCalendarHasError, rangeContext = _a.rangeContext, calendarRange = _a.calendarRange, calendarHasError = _a.calendarHasError;
11221
+ var calendarRangeFrom = (calendarRange === null || calendarRange === void 0 ? void 0 : calendarRange.from) || null;
11222
+ var calendarRangeTo = (calendarRange === null || calendarRange === void 0 ? void 0 : calendarRange.to) || null;
11223
+ var rangeContextFrom = (rangeContext === null || rangeContext === void 0 ? void 0 : rangeContext.from) || null;
11224
+ var rangeContextTo = (rangeContext === null || rangeContext === void 0 ? void 0 : rangeContext.to) || null;
11225
+ // Checking if rangeFrom is equal to or before rangeContextTo
11226
+ var startIsEqualOrBeforeRangeContextEnd = calendarRangeFrom && rangeContextTo
11227
+ ? isBefore(endOfDay(calendarRangeFrom), endOfDay(rangeContextTo)) ||
11228
+ isEqual(endOfDay(calendarRangeFrom), endOfDay(rangeContextTo))
11229
+ : null;
11230
+ // Checking if rangeTo is equal to or after rangeContextFrom
11231
+ var endIsEqualOrAfterRangeContextStart = calendarRangeTo && rangeContextFrom && rangeContextTo
11232
+ ? isAfter(endOfDay(calendarRangeTo), endOfDay(rangeContextFrom)) ||
11233
+ isEqual(endOfDay(calendarRangeTo), endOfDay(rangeContextFrom))
11234
+ : null;
11235
+ if ((rangeContext &&
11236
+ calendarRangeFrom &&
11237
+ !startIsEqualOrBeforeRangeContextEnd) ||
11238
+ (rangeContext && calendarRangeTo && !endIsEqualOrAfterRangeContextStart)) {
11239
+ setCalendarHasError && !calendarHasError && setCalendarHasError(true);
11240
+ }
11241
+ };
11242
+
11243
+ var useCalendarTooltips = function (_a) {
11244
+ var calendarRange = _a.calendarRange, updateCalendarMonthNavigation = _a.updateCalendarMonthNavigation, overlappingDate = _a.overlappingDate, updateCalendarDefaultMoth = _a.updateCalendarDefaultMoth, showFeedback = _a.showFeedback;
11245
+ return React__default.useEffect(function () {
10919
11246
  if (typeof document === 'undefined' || !showFeedback)
10920
11247
  return;
10921
11248
  // Children
@@ -10923,11 +11250,16 @@
10923
11250
  var calendarTooltipCheckOut = document.querySelector('.will-calendar-tooltip-check-out');
10924
11251
  var calendarTooltipOverlappingDate = document.querySelector('.will-calendar-tooltip-overlapping-date');
10925
11252
  var loadingSpinner = document.querySelector('.will-filter-bar-calendar .will-calendar-spinner');
11253
+ var calendarTooltipCheckInOnly = document.querySelector('.will-calendar-tooltip-check-in-only');
11254
+ var calendarTooltipCheckOutOnly = document.querySelector('.will-calendar-tooltip-check-out-only');
10926
11255
  // Parents
10927
11256
  var calendarButtons = document.querySelectorAll('.will-filter-bar-calendar .rdp-cell:has(.booked):not(:has(.disabled-after-check-in))');
10928
11257
  var calendarButtonsCheckOut = document.querySelectorAll('.will-filter-bar-calendar .rdp-cell:has(.booked.disabled-after-check-in)');
10929
11258
  var calendarMonthContainer = document.querySelector('.will-filter-bar-calendar .rdp-months');
10930
11259
  var calendarOverlappingDate = document.querySelectorAll('.will-filter-bar-calendar .rdp-cell:has(.overlapping-date)');
11260
+ var calendarCheckInOnly = document.querySelectorAll('.will-filter-bar-calendar .rdp-cell:has(.check-in-only)');
11261
+ var calendarCheckOutOnly = document.querySelectorAll('.will-filter-bar-calendar .rdp-cell:has(.check-out-only)');
11262
+ // Append children to parents
10931
11263
  var tooltipClonesCheckIn = [];
10932
11264
  var tooltipClonesCheckOut = [];
10933
11265
  var tooltipClonesSpinner = [];
@@ -10946,13 +11278,24 @@
10946
11278
  tooltipClonesCheckOut.push(tooltipClone);
10947
11279
  });
10948
11280
  }
11281
+ if (calendarTooltipCheckOutOnly && calendarCheckOutOnly.length > 0) {
11282
+ calendarCheckOutOnly.forEach(function (element) {
11283
+ var tooltipClone = calendarTooltipCheckOutOnly.cloneNode(true);
11284
+ element.appendChild(tooltipClone);
11285
+ });
11286
+ }
11287
+ if (calendarTooltipCheckInOnly && calendarCheckInOnly.length > 0) {
11288
+ calendarCheckInOnly.forEach(function (element) {
11289
+ var tooltipClone = calendarTooltipCheckInOnly.cloneNode(true);
11290
+ element.appendChild(tooltipClone);
11291
+ });
11292
+ }
10949
11293
  if (loadingSpinner && calendarMonthContainer) {
10950
11294
  var tooltipClone = loadingSpinner.cloneNode(true);
10951
11295
  calendarMonthContainer.appendChild(tooltipClone);
10952
11296
  tooltipClonesSpinner.push(tooltipClone);
10953
11297
  }
10954
- if (calendarTooltipOverlappingDate &&
10955
- calendarOverlappingDate.length > 0) {
11298
+ if (calendarTooltipOverlappingDate && calendarOverlappingDate.length > 0) {
10956
11299
  calendarOverlappingDate.forEach(function (element) {
10957
11300
  var tooltipClone = calendarTooltipOverlappingDate.cloneNode(true);
10958
11301
  element.appendChild(tooltipClone);
@@ -10969,11 +11312,13 @@
10969
11312
  calendarRange,
10970
11313
  updateCalendarMonthNavigation,
10971
11314
  overlappingDate,
10972
- initialCalendarRange,
10973
11315
  updateCalendarDefaultMoth,
10974
11316
  ]);
10975
- // Handle loading spinner
10976
- React__default.useEffect(function () {
11317
+ };
11318
+
11319
+ var useCalendarLoadingSpinner = function (_a) {
11320
+ var loadingData = _a.loadingData, updateCalendarMonthNavigation = _a.updateCalendarMonthNavigation, updateCalendarDefaultMoth = _a.updateCalendarDefaultMoth;
11321
+ return React__default.useEffect(function () {
10977
11322
  if (typeof document === 'undefined')
10978
11323
  return;
10979
11324
  var loadingSpinner = document.querySelector('.will-filter-bar-calendar .rdp-months .will-calendar-spinner');
@@ -10986,195 +11331,186 @@
10986
11331
  loadingSpinner.style.display = 'none';
10987
11332
  }
10988
11333
  }, [loadingData, updateCalendarMonthNavigation, updateCalendarDefaultMoth]);
11334
+ };
11335
+
11336
+ var useUpdateDisabledDates = function (_a) {
11337
+ var disableCalendarDates = _a.disableCalendarDates, calendarRange = _a.calendarRange, updateCalendarMonthNavigation = _a.updateCalendarMonthNavigation, updateCalendarDefaultMoth = _a.updateCalendarDefaultMoth;
11338
+ var _b = __read(React__default.useState(undefined), 2), overlappingDate = _b[0], setOverlappingDate = _b[1];
11339
+ var newDisableCalendarDates = React__default.useMemo(function () {
11340
+ if (disableCalendarDates === null || disableCalendarDates === void 0 ? void 0 : disableCalendarDates.availableDates) {
11341
+ var dateFormat_1 = 'dd-MM-yyyy';
11342
+ var disabledDates = disableCalendarDates.disabledDates;
11343
+ var _a = (disabledDates || []).reduce(function (acc, dateRange) {
11344
+ var _a, _b;
11345
+ var formattedFromDate = format(dateRange.from, dateFormat_1);
11346
+ var formattedToDate = format(dateRange.to, dateFormat_1);
11347
+ var hasTwoOverlappingDates = (_a = disableCalendarDates.availableDates) === null || _a === void 0 ? void 0 : _a.some(function (item) {
11348
+ return format(item.lastCheckOut, dateFormat_1) === formattedFromDate &&
11349
+ format(item.lastCheckOut, dateFormat_1) === formattedToDate;
11350
+ });
11351
+ var hasOneOverlappingDate = (_b = disableCalendarDates.availableDates) === null || _b === void 0 ? void 0 : _b.some(function (item) {
11352
+ return format(item.lastCheckOut, dateFormat_1) === formattedFromDate &&
11353
+ format(item.lastCheckOut, dateFormat_1) !== formattedToDate;
11354
+ });
11355
+ if (hasTwoOverlappingDates) {
11356
+ acc.newOverlappingDates.push(dateRange);
11357
+ }
11358
+ else if (hasOneOverlappingDate) {
11359
+ acc.newOverlappingDates.push(dateRange);
11360
+ acc.updatedDisabledDates.push(__assign$2(__assign$2({}, dateRange), { from: addDays(dateRange.from, 1) }));
11361
+ }
11362
+ else {
11363
+ acc.updatedDisabledDates.push(dateRange);
11364
+ }
11365
+ return acc;
11366
+ }, { updatedDisabledDates: [], newOverlappingDates: [] }), updatedDisabledDates = _a.updatedDisabledDates, newOverlappingDates_1 = _a.newOverlappingDates;
11367
+ if (newOverlappingDates_1.length) {
11368
+ setOverlappingDate(function (prev) {
11369
+ if (prev === void 0) { prev = []; }
11370
+ return __spreadArray$1(__spreadArray$1([], __read(prev), false), __read(newOverlappingDates_1), false);
11371
+ });
11372
+ }
11373
+ var newDisableCalendarDates_1 = __assign$2(__assign$2({}, disableCalendarDates), { disabledDates: updatedDisabledDates });
11374
+ return newDisableCalendarDates_1;
11375
+ }
11376
+ return disableCalendarDates;
11377
+ }, [
11378
+ disableCalendarDates,
11379
+ calendarRange,
11380
+ updateCalendarMonthNavigation,
11381
+ updateCalendarDefaultMoth,
11382
+ ]);
11383
+ return { newDisableCalendarDates: newDisableCalendarDates, overlappingDate: overlappingDate };
11384
+ };
11385
+
11386
+ 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}";
11387
+ styleInject(css_248z$9);
11388
+
11389
+ 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";
11390
+ styleInject(css_248z$8);
11391
+
11392
+ var Calendar = React__default.forwardRef(function (_a, ref) {
11393
+ var _b, _c;
11394
+ 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;
11395
+ // Translations
11396
+ var t = useTranslation('common').t;
11397
+ var isTablet = reactResponsiveExports.useMediaQuery({ maxWidth: 960 });
11398
+ var today = startOfDay(new Date());
11399
+ var selectedStartDate = calendarRange === null || calendarRange === void 0 ? void 0 : calendarRange.from;
11400
+ var rangeContextStartDate = rangeContext === null || rangeContext === void 0 ? void 0 : rangeContext.from;
11401
+ // Handle overlapping availableDates.lastCheckOut and disabledDates.start
11402
+ var _d = useUpdateDisabledDates({
11403
+ disableCalendarDates: disableCalendarDates,
11404
+ calendarRange: calendarRange,
11405
+ updateCalendarMonthNavigation: updateCalendarMonthNavigation,
11406
+ updateCalendarDefaultMoth: updateCalendarDefaultMoth,
11407
+ }), newDisableCalendarDates = _d.newDisableCalendarDates, overlappingDate = _d.overlappingDate;
11408
+ // Handle disable dates by page
11409
+ var disabledDatesByPage$1 = disabledDatesByPage({
11410
+ today: today,
11411
+ selectedPath: selectedPath,
11412
+ newDisableCalendarDates: newDisableCalendarDates,
11413
+ });
11414
+ // Handle tooltip
11415
+ useCalendarTooltips({
11416
+ calendarRange: calendarRange,
11417
+ updateCalendarMonthNavigation: updateCalendarMonthNavigation,
11418
+ overlappingDate: overlappingDate,
11419
+ updateCalendarDefaultMoth: updateCalendarDefaultMoth,
11420
+ showFeedback: showFeedback,
11421
+ });
11422
+ // Handle loading spinner
11423
+ useCalendarLoadingSpinner({
11424
+ loadingData: loadingData,
11425
+ updateCalendarMonthNavigation: updateCalendarMonthNavigation,
11426
+ updateCalendarDefaultMoth: updateCalendarDefaultMoth,
11427
+ });
11428
+ // Handle the date selection and availability for selection logic.
11429
+ var handleOnSelect = function (range) {
11430
+ setCalendarHasError && calendarHasError && setCalendarHasError(false);
11431
+ calendarSelectionRules({
11432
+ range: range,
11433
+ newDisableCalendarDates: newDisableCalendarDates,
11434
+ setCalendarRange: setCalendarRange,
11435
+ setDisabledDates: setDisabledDates,
11436
+ calendarRange: calendarRange,
11437
+ overlappingDate: overlappingDate,
11438
+ setCalendarHasError: setCalendarHasError,
11439
+ rangeContext: rangeContext,
11440
+ });
11441
+ setUpdatedForSubmit && setUpdatedForSubmit(true);
11442
+ };
11443
+ // Handle disabled dates for range context
11444
+ var _e = handleRangeContextDisabledDates({
11445
+ rangeContext: rangeContext,
11446
+ availableDates: newDisableCalendarDates === null || newDisableCalendarDates === void 0 ? void 0 : newDisableCalendarDates.availableDates,
11447
+ calendarRange: calendarRange,
11448
+ }), findFirstPossibleRangeContextCheckIn = _e.findFirstPossibleRangeContextCheckIn, findLastPossibleRangeContextCheckOut = _e.findLastPossibleRangeContextCheckOut, firstPossibleRangeContextCheckIn = _e.firstPossibleRangeContextCheckIn, lastPossibleRangeContextCheckOut = _e.lastPossibleRangeContextCheckOut, currentSelectionLastCheckoutDate = _e.currentSelectionLastCheckoutDate;
11449
+ // Handle check for continuous selection in the range context
11450
+ checkForContinuousSelection({
11451
+ setCalendarHasError: setCalendarHasError,
11452
+ rangeContext: rangeContext,
11453
+ calendarRange: calendarRange,
11454
+ calendarHasError: calendarHasError,
11455
+ });
10989
11456
  return (React__default.createElement("div", { className: "will-filter-bar-calendar", ref: ref },
10990
11457
  React__default.createElement("div", { className: "will-calendar-filter-container" },
10991
- React__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) {
10992
- return handleSelectedCheckIn({
10993
- range: range,
10994
- newDisableCalendarDates: newDisableCalendarDates,
10995
- setCalendarRange: setCalendarRange,
10996
- setDisabledDates: setDisabledDates,
10997
- calendarRange: calendarRange,
10998
- overlappingDate: overlappingDate,
10999
- setOverlappingDates: setOverlappingDates,
11000
- });
11001
- }, captionLayout: "dropdown-buttons", defaultMonth: (initialCalendarRange === null || initialCalendarRange === void 0 ? void 0 : initialCalendarRange.from) ||
11458
+ React__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) ||
11002
11459
  selectedStartDate ||
11460
+ rangeContextStartDate ||
11003
11461
  (((_b = newDisableCalendarDates === null || newDisableCalendarDates === void 0 ? void 0 : newDisableCalendarDates.disabledDates) === null || _b === void 0 ? void 0 : _b.length)
11004
11462
  ? newDisableCalendarDates.disabledDates[0].from
11005
- : today), disabled: disabledDatesByPage.length
11006
- ? disabledDatesByPage
11463
+ : today), disabled: disabledDatesByPage$1.length
11464
+ ? disabledDatesByPage$1
11007
11465
  : (disabledDates === null || disabledDates === void 0 ? void 0 : disabledDates.length)
11008
- ? disabledDates
11009
- : (newDisableCalendarDates === null || newDisableCalendarDates === void 0 ? void 0 : newDisableCalendarDates.disabledDates) || [], fromMonth: today, onMonthChange: function (val) {
11466
+ ? __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)
11467
+ ? __spreadArray$1(__spreadArray$1(__spreadArray$1([], __read(newDisableCalendarDates.disabledDates), false), __read(firstPossibleRangeContextCheckIn), false), __read(lastPossibleRangeContextCheckOut), false) : [], fromMonth: today, onMonthChange: function (val) {
11010
11468
  requestDates && setUpdateCalendarMonthNavigation
11011
11469
  ? (requestDates(val),
11012
11470
  setUpdateCalendarMonthNavigation(function (prev) { return !prev; }))
11013
11471
  : null;
11472
+ }, classNames: {
11473
+ day_range_start: (calendarRange === null || calendarRange === void 0 ? void 0 : calendarRange.from) ? 'rdp-day_range_start' : '',
11474
+ day_range_end: (calendarRange === null || calendarRange === void 0 ? void 0 : calendarRange.to) ? 'rdp-day_range_end' : '',
11014
11475
  }, modifiersClassNames: {
11015
11476
  today: 'my-today',
11016
11477
  booked: 'booked',
11017
11478
  disabledAfterCheckIn: 'disabled-after-check-in',
11018
11479
  overlappingDate: 'overlapping-date',
11019
- noActiveSelectionStart: 'rdp-day_selected rdp-day_range_start no-active-selection ',
11480
+ noActiveSelectionStart: 'rdp-day_selected rdp-day_range_start no-active-selection',
11020
11481
  noActiveSelectionMid: 'rdp-day_selected rdp-day_range_middle no-active-selection',
11021
11482
  noActiveSelectionEnd: 'rdp-day_selected rdp-day_range_end no-active-selection',
11022
- }, modifiers: {
11023
- booked: disabledDatesByPage.length
11024
- ? disabledDatesByPage
11025
- : (disabledDates === null || disabledDates === void 0 ? void 0 : disabledDates.length)
11026
- ? disabledDates
11027
- : (newDisableCalendarDates === null || newDisableCalendarDates === void 0 ? void 0 : newDisableCalendarDates.disabledDates) || [],
11028
- disabledAfterCheckIn: (calendarRange === null || calendarRange === void 0 ? void 0 : calendarRange.from)
11029
- ? [{ after: calendarRange.from }]
11030
- : [],
11031
- noActiveSelectionStart: !calendarRange
11032
- ? (initialCalendarRange === null || initialCalendarRange === void 0 ? void 0 : initialCalendarRange.from) || []
11033
- : [],
11034
- noActiveSelectionMid: !calendarRange &&
11035
- (initialCalendarRange === null || initialCalendarRange === void 0 ? void 0 : initialCalendarRange.from) &&
11036
- (initialCalendarRange === null || initialCalendarRange === void 0 ? void 0 : initialCalendarRange.to)
11037
- ? [
11038
- {
11039
- after: initialCalendarRange === null || initialCalendarRange === void 0 ? void 0 : initialCalendarRange.from,
11040
- before: initialCalendarRange === null || initialCalendarRange === void 0 ? void 0 : initialCalendarRange.to,
11041
- },
11042
- ]
11043
- : [],
11044
- noActiveSelectionEnd: !calendarRange
11045
- ? (initialCalendarRange === null || initialCalendarRange === void 0 ? void 0 : initialCalendarRange.to) || []
11046
- : [],
11047
- overlappingDate: (!(calendarRange === null || calendarRange === void 0 ? void 0 : calendarRange.from) &&
11048
- (overlappingDate === null || overlappingDate === void 0 ? void 0 : overlappingDate.map(function (item) { return ({
11049
- from: item.from,
11050
- }); }))) ||
11051
- [],
11052
- } }),
11483
+ checkoutOptionsMid: 'rdp-day_selected rdp-day_range_middle checkout-option',
11484
+ checkInOnly: 'check-in-only',
11485
+ checkOutOnly: 'check-out-only',
11486
+ }, modifiers:
11487
+ // This function handles conditions for applying the modifiersClassNames
11488
+ handleCalendarModifiers({
11489
+ newDisableCalendarDates: newDisableCalendarDates,
11490
+ calendarRange: calendarRange,
11491
+ disabledDatesByPage: disabledDatesByPage$1,
11492
+ disabledDates: disabledDates,
11493
+ overlappingDate: overlappingDate,
11494
+ rangeContext: rangeContext,
11495
+ findFirstPossibleRangeContextCheckIn: findFirstPossibleRangeContextCheckIn,
11496
+ findLastPossibleRangeContextCheckOut: findLastPossibleRangeContextCheckOut,
11497
+ firstPossibleRangeContextCheckIn: firstPossibleRangeContextCheckIn,
11498
+ lastPossibleRangeContextCheckOut: lastPossibleRangeContextCheckOut,
11499
+ currentSelectionLastCheckoutDate: currentSelectionLastCheckoutDate,
11500
+ }) }),
11053
11501
  React__default.createElement("div", { className: 'will-calendar-tooltip' },
11054
11502
  React__default.createElement("div", null, t('noCheckIn'))),
11055
11503
  React__default.createElement("div", { className: 'will-calendar-tooltip-check-out' },
11056
11504
  React__default.createElement("div", null, t('noCheckOut'))),
11057
11505
  React__default.createElement("div", { className: 'will-calendar-tooltip-overlapping-date' },
11058
11506
  React__default.createElement("div", null, t('checkOutOnly'))),
11507
+ React__default.createElement("div", { className: 'will-calendar-tooltip-check-in-only' },
11508
+ React__default.createElement("div", null, "Check-in Only")),
11509
+ React__default.createElement("div", { className: 'will-calendar-tooltip-check-out-only' },
11510
+ React__default.createElement("div", null, "Checkout Only")),
11059
11511
  React__default.createElement("div", { className: 'will-calendar-spinner' },
11060
- React__default.createElement(SpinnerSVG, { fill: (palette === null || palette === void 0 ? void 0 : palette.primary) || 'inherit', size: 50 })))));
11512
+ React__default.createElement(IconsSvg, { fill: (palette === null || palette === void 0 ? void 0 : palette.primary) || 'inherit', size: 50, icon: "spinner" })))));
11061
11513
  });
11062
- /////////
11063
- var handleSelectedCheckIn = function (_a) {
11064
- var _b, _c, _d;
11065
- var range = _a.range, newDisableCalendarDates = _a.newDisableCalendarDates, setCalendarRange = _a.setCalendarRange, setDisabledDates = _a.setDisabledDates, calendarRange = _a.calendarRange, overlappingDate = _a.overlappingDate, setOverlappingDates = _a.setOverlappingDates;
11066
- // Calendar dates select logic
11067
- var dateFormat = 'dd-MM-yyyy';
11068
- var rangeFrom = (range === null || range === void 0 ? void 0 : range.from) ? format(range.from, dateFormat) : null;
11069
- var rangeTo = (range === null || range === void 0 ? void 0 : range.to) ? format(range.to, dateFormat) : null;
11070
- var calendarFrom = (calendarRange === null || calendarRange === void 0 ? void 0 : calendarRange.from)
11071
- ? format(calendarRange === null || calendarRange === void 0 ? void 0 : calendarRange.from, dateFormat)
11072
- : null;
11073
- var overlappingDateFrom = (overlappingDate === null || overlappingDate === void 0 ? void 0 : overlappingDate.length)
11074
- ? overlappingDate.find(function (date) { return format(date.from || 1, dateFormat) === rangeFrom; })
11075
- : null;
11076
- var checkOutRange = ((_b = newDisableCalendarDates === null || newDisableCalendarDates === void 0 ? void 0 : newDisableCalendarDates.availableDates) === null || _b === void 0 ? void 0 : _b.length)
11077
- ? newDisableCalendarDates.availableDates.find(function (checkInDate) {
11078
- return format(checkInDate.checkIn || 1, dateFormat) ===
11079
- format((range === null || range === void 0 ? void 0 : range.from) || 1, dateFormat);
11080
- })
11081
- : null;
11082
- // Case: Set the calendar range only if it overlaps with the previously selected dates.
11083
- // The selection must remain continuous, meaning no gaps between days are allowed.
11084
- // Whether selecting forwards or backwards from the initially chosen dates,
11085
- // the new range must be directly adjacent to or overlap with the current selection.
11086
- var selectedDates = (newDisableCalendarDates === null || newDisableCalendarDates === void 0 ? void 0 : newDisableCalendarDates.selectedDates) || null;
11087
- var rowRangeFrom = range === null || range === void 0 ? void 0 : range.from;
11088
- var rowRangeTo = range === null || range === void 0 ? void 0 : range.to;
11089
- var selectedDatesFrom = ((_c = newDisableCalendarDates === null || newDisableCalendarDates === void 0 ? void 0 : newDisableCalendarDates.selectedDates) === null || _c === void 0 ? void 0 : _c.from) || null;
11090
- var selectedDatesTo = ((_d = newDisableCalendarDates === null || newDisableCalendarDates === void 0 ? void 0 : newDisableCalendarDates.selectedDates) === null || _d === void 0 ? void 0 : _d.to) || null;
11091
- // Checking if rowRangeFrom is equal to or before selectedDatesTo
11092
- var startIsEqualOrBeforeSelectedEnd = rowRangeFrom && selectedDatesFrom && selectedDatesTo
11093
- ? isBefore(startOfDay(rowRangeFrom), startOfDay(selectedDatesTo)) ||
11094
- isEqual(startOfDay(rowRangeFrom), startOfDay(selectedDatesTo))
11095
- : null;
11096
- // Checking if rowRangeTo is equal to or after selectedDatesFrom
11097
- var endIsEqualOrAfterSelectedStart = rowRangeTo && selectedDatesFrom && selectedDatesTo
11098
- ? isAfter(startOfDay(rowRangeTo), startOfDay(selectedDatesFrom)) ||
11099
- isEqual(startOfDay(rowRangeTo), startOfDay(selectedDatesFrom))
11100
- : null;
11101
- if (rangeFrom && checkOutRange && setDisabledDates) {
11102
- var checkIn = addDays(checkOutRange.checkIn, 1);
11103
- var firstCheckOut = addDays(checkOutRange.firstCheckOut, -1);
11104
- var noDatesRange = format(checkIn, dateFormat) ===
11105
- format(checkOutRange.firstCheckOut, dateFormat);
11106
- setDisabledDates(__spreadArray$1(__spreadArray$1([], __read(((newDisableCalendarDates === null || newDisableCalendarDates === void 0 ? void 0 : newDisableCalendarDates.disabledDates) || [])), false), [
11107
- {
11108
- from: noDatesRange ? undefined : checkIn,
11109
- to: noDatesRange ? undefined : firstCheckOut,
11110
- },
11111
- { after: checkOutRange === null || checkOutRange === void 0 ? void 0 : checkOutRange.lastCheckOut },
11112
- ], false));
11113
- }
11114
- setOverlappingDates(false);
11115
- if ((selectedDates && !startIsEqualOrBeforeSelectedEnd) ||
11116
- (selectedDates && (range === null || range === void 0 ? void 0 : range.to) && !endIsEqualOrAfterSelectedStart)) {
11117
- setCalendarRange(undefined);
11118
- setOverlappingDates(true);
11119
- }
11120
- else if ((rangeTo && rangeFrom && rangeFrom === rangeTo) ||
11121
- (!rangeTo && !rangeFrom) ||
11122
- overlappingDateFrom) {
11123
- setCalendarRange(undefined);
11124
- setDisabledDates && setDisabledDates([]);
11125
- }
11126
- else if (calendarFrom && rangeFrom && rangeFrom !== calendarFrom) {
11127
- setCalendarRange({
11128
- from: range === null || range === void 0 ? void 0 : range.from,
11129
- to: undefined,
11130
- });
11131
- }
11132
- else {
11133
- setCalendarRange(range);
11134
- }
11135
- };
11136
- var handleDisabledDatesByPage = function (_a) {
11137
- var _b, _c, _d;
11138
- var newDisableCalendarDates = _a.newDisableCalendarDates, selectedPath = _a.selectedPath, today = _a.today;
11139
- var daysToOffsetCalendar = (newDisableCalendarDates === null || newDisableCalendarDates === void 0 ? void 0 : newDisableCalendarDates.disabledDatesByPage) && selectedPath
11140
- ? [
11141
- (_b = newDisableCalendarDates === null || newDisableCalendarDates === void 0 ? void 0 : newDisableCalendarDates.disabledDatesByPage) === null || _b === void 0 ? void 0 : _b.find(function (item) { return selectedPath === item.page; }),
11142
- ]
11143
- : [];
11144
- return daysToOffsetCalendar.length
11145
- ? [
11146
- {
11147
- from: addDays(today, daysToOffsetCalendar.length && ((_c = daysToOffsetCalendar[0]) === null || _c === void 0 ? void 0 : _c.offset)
11148
- ? (_d = daysToOffsetCalendar[0]) === null || _d === void 0 ? void 0 : _d.offset
11149
- : -2),
11150
- to: addDays(today, -100),
11151
- },
11152
- ]
11153
- : [];
11154
- };
11155
-
11156
- var parseDates = function (_a) {
11157
- var calendarRange = _a.calendarRange;
11158
- return (calendarRange === null || calendarRange === void 0 ? void 0 : calendarRange.to) && (calendarRange === null || calendarRange === void 0 ? void 0 : calendarRange.from)
11159
- ? "".concat(format(calendarRange.from, 'dd.MM.yyyy'), " -\n").concat(format(calendarRange.to, 'dd.MM.yyyy'))
11160
- : null;
11161
- };
11162
-
11163
- var parseDate = function (_a) {
11164
- var date = _a.date, _b = _a.dateFormat, dateFormat = _b === void 0 ? 'dd.MM.yyyy' : _b, language = _a.language;
11165
- return date
11166
- ? format(date, dateFormat, { locale: language === 'en' ? enUS : fi })
11167
- : null;
11168
- };
11169
-
11170
- var nightsCount = function (_a) {
11171
- var calendarRange = _a.calendarRange;
11172
- if (!calendarRange || !calendarRange.from || !calendarRange.to) {
11173
- return undefined;
11174
- }
11175
- var diffDays = differenceInCalendarDays(calendarRange.to, calendarRange.from);
11176
- return diffDays;
11177
- };
11178
11514
 
11179
11515
  var parseGuests = function (_a) {
11180
11516
  var guestLabel = _a.guestLabel, guestsLabel = _a.guestsLabel, guestsPlaceholder = _a.guestsPlaceholder, ageCategoryCounts = _a.ageCategoryCounts, ageCategories = _a.ageCategories;
@@ -11546,12 +11882,15 @@
11546
11882
 
11547
11883
  var useFilterCalendar = function (_a) {
11548
11884
  var onSubmit = _a.onSubmit, setToggleCalendar = _a.setToggleCalendar, noActiveSelection = _a.noActiveSelection, toggleCalendar = _a.toggleCalendar;
11885
+ // State
11549
11886
  var _b = __read(React__default.useState(), 2), calendarRange = _b[0], setCalendarRange = _b[1];
11550
11887
  var _c = __read(React__default.useState(), 2), initialCalendarRange = _c[0], setInitialCalendarRange = _c[1];
11551
11888
  var _d = __read(React__default.useState([]), 2), disabledDates = _d[0], setDisabledDates = _d[1];
11552
11889
  var _e = __read(React__default.useState(false), 2), updateCalendarMonthNavigation = _e[0], setUpdateCalendarMonthNavigation = _e[1];
11553
11890
  var _f = __read(React__default.useState(0), 2), updateCalendarDefaultMoth = _f[0], setUpdateCalendarDefaultMoth = _f[1];
11554
- var _g = __read(React__default.useState(false), 2), overlappingDates = _g[0], setOverlappingDates = _g[1];
11891
+ var _g = __read(React__default.useState(false), 2), calendarHasError = _g[0], setCalendarHasError = _g[1];
11892
+ var _h = __read(React__default.useState(false), 2), updatedForSubmit = _h[0], setUpdatedForSubmit = _h[1];
11893
+ // Lifecycle
11555
11894
  React__default.useEffect(function () {
11556
11895
  if (typeof window === 'undefined')
11557
11896
  return;
@@ -11562,10 +11901,15 @@
11562
11901
  if (noActiveSelection) {
11563
11902
  handleClearDates();
11564
11903
  setUpdateCalendarDefaultMoth(function (prev) { return prev + 1; });
11904
+ setUpdatedForSubmit(false);
11565
11905
  setInitialCalendarRange({
11566
11906
  from: new Date(startDateParam),
11567
11907
  to: new Date(endDateParam),
11568
11908
  });
11909
+ setCalendarRange({
11910
+ from: new Date(startDateParam),
11911
+ to: new Date(endDateParam),
11912
+ });
11569
11913
  }
11570
11914
  else {
11571
11915
  setCalendarRange({
@@ -11575,6 +11919,31 @@
11575
11919
  }
11576
11920
  }
11577
11921
  }, [toggleCalendar]);
11922
+ React__default.useEffect(function () {
11923
+ var formatString = 'dd.MM.yyyy';
11924
+ var initialRangeTo = (initialCalendarRange === null || initialCalendarRange === void 0 ? void 0 : initialCalendarRange.to)
11925
+ ? format(initialCalendarRange.to, formatString)
11926
+ : null;
11927
+ var initialRangeFrom = (initialCalendarRange === null || initialCalendarRange === void 0 ? void 0 : initialCalendarRange.from)
11928
+ ? format(initialCalendarRange.from, formatString)
11929
+ : null;
11930
+ var calendarRangeTo = (calendarRange === null || calendarRange === void 0 ? void 0 : calendarRange.to)
11931
+ ? format(calendarRange.to, formatString)
11932
+ : null;
11933
+ var calendarRangeFrom = (calendarRange === null || calendarRange === void 0 ? void 0 : calendarRange.from)
11934
+ ? format(calendarRange.from, formatString)
11935
+ : null;
11936
+ if (!!(calendarRangeTo && calendarRangeFrom && updatedForSubmit)) {
11937
+ if (!!(calendarRangeTo !== initialRangeTo) ||
11938
+ !!(calendarRangeFrom !== initialRangeFrom)) {
11939
+ handleSubmit();
11940
+ }
11941
+ else {
11942
+ setToggleCalendar(false);
11943
+ }
11944
+ }
11945
+ }, [calendarRange]);
11946
+ // Methods
11578
11947
  var handleSubmit = function () {
11579
11948
  setToggleCalendar(false);
11580
11949
  return onSubmit(calendarRange);
@@ -11582,6 +11951,8 @@
11582
11951
  var handleClearDates = function () {
11583
11952
  setDisabledDates([]);
11584
11953
  setCalendarRange(undefined);
11954
+ setCalendarHasError(false);
11955
+ setInitialCalendarRange(undefined);
11585
11956
  };
11586
11957
  return {
11587
11958
  handleSubmit: handleSubmit,
@@ -11593,17 +11964,17 @@
11593
11964
  disabledDates: disabledDates,
11594
11965
  updateCalendarMonthNavigation: updateCalendarMonthNavigation,
11595
11966
  updateCalendarDefaultMoth: updateCalendarDefaultMoth,
11596
- initialCalendarRange: initialCalendarRange,
11597
- overlappingDates: overlappingDates,
11598
- setOverlappingDates: setOverlappingDates,
11967
+ calendarHasError: calendarHasError,
11968
+ setCalendarHasError: setCalendarHasError,
11969
+ setUpdatedForSubmit: setUpdatedForSubmit,
11599
11970
  };
11600
11971
  };
11601
11972
 
11602
- 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}";
11973
+ 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}";
11603
11974
  styleInject(css_248z);
11604
11975
 
11605
11976
  function FilterCalendar(_a) {
11606
- 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;
11977
+ 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;
11607
11978
  var themePalette = useTheme({ palette: palette });
11608
11979
  // Translations
11609
11980
  useUpdateTranslations({ language: language });
@@ -11613,7 +11984,7 @@
11613
11984
  setToggleCalendar: setToggleCalendar,
11614
11985
  noActiveSelection: noActiveSelection,
11615
11986
  toggleCalendar: toggleCalendar,
11616
- }), 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;
11987
+ }), 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;
11617
11988
  // Display component after fully loaded
11618
11989
  useAwaitRender();
11619
11990
  // Handle close filter section
@@ -11621,36 +11992,39 @@
11621
11992
  handleSelectedFilter: setToggleCalendar,
11622
11993
  }).filtersRef;
11623
11994
  var nights = nightsCount({
11624
- calendarRange: calendarRange || initialCalendarRange,
11995
+ calendarRange: calendarRange,
11625
11996
  });
11626
11997
  return (React__default.createElement("div", { className: "will-root", style: themePalette }, toggleCalendar && (React__default.createElement("div", { className: "will-calendar-wrapper", ref: filtersRef },
11627
11998
  React__default.createElement("div", { className: "will-calendar-header" },
11628
- React__default.createElement("div", { className: "will-calendar-header-row" },
11629
- React__default.createElement("h2", null, t('filterBar:calendar.title')),
11630
- React__default.createElement(CloseButton, { handleClose: function () { return setToggleCalendar(false); } })),
11631
- overlappingDates && React__default.createElement("div", null, "Chose other dates")),
11999
+ React__default.createElement("h2", null, t('filterBar:calendar.title')),
12000
+ React__default.createElement(CloseButton, { handleClose: function () { return setToggleCalendar(false); } })),
11632
12001
  React__default.createElement("div", { className: "will-calendar-main" },
11633
- React__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 })),
12002
+ React__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 })),
11634
12003
  React__default.createElement("div", { className: "will-calendar-footer" },
11635
- React__default.createElement("div", { className: "will-calendar-footer-dates" },
11636
- React__default.createElement("div", null,
11637
- React__default.createElement("span", null, parseDate({
11638
- date: (calendarRange === null || calendarRange === void 0 ? void 0 : calendarRange.from) || (initialCalendarRange === null || initialCalendarRange === void 0 ? void 0 : initialCalendarRange.from),
11639
- dateFormat: 'EEEEEE d.M.yyyy',
11640
- language: language,
11641
- }) || t('common:checkIn')),
11642
- React__default.createElement("span", { className: "will-calendar-footer-dates-separator" }, "-"),
11643
- React__default.createElement("span", null, parseDate({
11644
- date: (calendarRange === null || calendarRange === void 0 ? void 0 : calendarRange.to) || (initialCalendarRange === null || initialCalendarRange === void 0 ? void 0 : initialCalendarRange.to),
11645
- dateFormat: 'EEEEEE d.M.yyyy',
11646
- language: language,
11647
- }) || t('common:checkOut'))),
11648
- React__default.createElement("span", { className: "will-calendar-footer-booked" }, nights
11649
- ? "".concat(nights, " ").concat(t("common:".concat(nights === 1 ? 'night' : 'nights')))
11650
- : '')),
11651
- React__default.createElement("div", { className: "will-calendar-footer-actions" },
11652
- React__default.createElement(SubmitButton, { onClick: handleClearDates, disabled: !(calendarRange === null || calendarRange === void 0 ? void 0 : calendarRange.from), label: t("common:clearDates") }),
11653
- React__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) })))))));
12004
+ React__default.createElement("div", { className: "will-calendar-footer-actions-wrapper" },
12005
+ React__default.createElement("div", { className: "will-calendar-footer-dates" },
12006
+ calendarHasError ? (React__default.createElement("span", null, "Start or end day need connection for previous reservation")) : (React__default.createElement("div", null,
12007
+ React__default.createElement("span", null, parseDate({
12008
+ date: calendarRange === null || calendarRange === void 0 ? void 0 : calendarRange.from,
12009
+ dateFormat: 'EEEEEE d.M.yyyy',
12010
+ language: language,
12011
+ }) || t('common:checkIn')),
12012
+ React__default.createElement("span", { className: "will-calendar-footer-dates-separator" }, "-"),
12013
+ React__default.createElement("span", null, parseDate({
12014
+ date: calendarRange === null || calendarRange === void 0 ? void 0 : calendarRange.to,
12015
+ dateFormat: 'EEEEEE d.M.yyyy',
12016
+ language: language,
12017
+ }) || t('common:checkOut')))),
12018
+ React__default.createElement("span", { className: "will-calendar-footer-booked" }, calendarHasError
12019
+ ? '2 nights min'
12020
+ : nights
12021
+ ? "".concat(nights, " ").concat(t("common:".concat(nights === 1 ? 'night' : 'nights')))
12022
+ : '')),
12023
+ React__default.createElement("div", { className: "will-calendar-footer-actions" },
12024
+ React__default.createElement(SubmitButton, { onClick: handleClearDates, disabled: !(calendarRange === null || calendarRange === void 0 ? void 0 : calendarRange.from), label: t("common:clearDates") }))),
12025
+ calendarHasError && (React__default.createElement("div", { style: { display: 'flex', alignItems: 'center' } },
12026
+ React__default.createElement(IconsSvg, { fill: (palette === null || palette === void 0 ? void 0 : palette.error) || 'inherit', size: 25, icon: "warning" }),
12027
+ React__default.createElement("span", { style: { marginLeft: '10px' } }, "Check-in available for second room only with connection dates"))))))));
11654
12028
  }
11655
12029
 
11656
12030
  exports.Button = Button$1;