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