willba-component-library 0.2.58 → 0.2.59

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.
@@ -29,14 +29,14 @@ export default function FilterCalendar({
29
29
  requestDates,
30
30
  showFeedback,
31
31
  noActiveSelection,
32
- rangeContext,
32
+ rangeContext: outerRangeContext,
33
33
  }: FilterCalendarTypes) {
34
34
  const themePalette = useTheme({ palette })
35
35
 
36
36
  // Translations
37
37
  useUpdateTranslations({ language })
38
38
  const { t } = useTranslation()
39
-
39
+ console.log('1', t('noCheckIn'))
40
40
  const {
41
41
  setCalendarRange,
42
42
  handleClearDates,
@@ -44,16 +44,18 @@ export default function FilterCalendar({
44
44
  disabledDates,
45
45
  setDisabledDates,
46
46
  updateCalendarMonthNavigation,
47
- updateCalendarDefaultMoth,
47
+ updateCalendarDefaultMonth,
48
48
  setUpdateCalendarMonthNavigation,
49
49
  calendarHasError,
50
50
  setCalendarHasError,
51
51
  setUpdatedForSubmit,
52
+ rangeContext,
52
53
  } = useFilterCalendar({
53
54
  onSubmit,
54
55
  setToggleCalendar,
55
56
  noActiveSelection,
56
57
  toggleCalendar,
58
+ outerRangeContext,
57
59
  })
58
60
 
59
61
  // Display component after fully loaded
@@ -91,7 +93,7 @@ export default function FilterCalendar({
91
93
  setUpdateCalendarMonthNavigation={
92
94
  setUpdateCalendarMonthNavigation
93
95
  }
94
- updateCalendarDefaultMoth={updateCalendarDefaultMoth}
96
+ updateCalendarDefaultMonth={updateCalendarDefaultMonth}
95
97
  loadingData={loadingData}
96
98
  showFeedback={showFeedback}
97
99
  noActiveSelection={noActiveSelection}
@@ -1,12 +1,14 @@
1
1
  import { useEffect, useState } from 'react'
2
2
  import { DateRange, Matcher } from 'react-day-picker'
3
3
  import { format } from 'date-fns'
4
+ import { RangeContext } from 'src/core/components/calendar/CalendarTypes'
4
5
 
5
6
  type Props = {
6
7
  onSubmit: (val: any) => void
7
8
  setToggleCalendar: (val: boolean) => void
8
9
  noActiveSelection?: boolean
9
10
  toggleCalendar?: boolean
11
+ outerRangeContext?: RangeContext
10
12
  }
11
13
 
12
14
  export const useFilterCalendar = ({
@@ -14,16 +16,20 @@ export const useFilterCalendar = ({
14
16
  setToggleCalendar,
15
17
  noActiveSelection,
16
18
  toggleCalendar,
19
+ outerRangeContext,
17
20
  }: Props) => {
18
21
  // State
19
22
  const [calendarRange, setCalendarRange] = useState<DateRange | undefined>()
23
+ const [rangeContext, setRangeContext] = useState<RangeContext | undefined>(
24
+ outerRangeContext
25
+ )
20
26
  const [initialCalendarRange, setInitialCalendarRange] = useState<
21
27
  DateRange | undefined
22
28
  >()
23
29
  const [disabledDates, setDisabledDates] = useState<Matcher[]>([])
24
30
  const [updateCalendarMonthNavigation, setUpdateCalendarMonthNavigation] =
25
31
  useState<boolean>(false)
26
- const [updateCalendarDefaultMoth, setUpdateCalendarDefaultMoth] =
32
+ const [updateCalendarDefaultMonth, setUpdateCalendarDefaultMonth] =
27
33
  useState<number>(0)
28
34
 
29
35
  const [calendarHasError, setCalendarHasError] = useState<boolean>(false)
@@ -42,8 +48,9 @@ export const useFilterCalendar = ({
42
48
  if (startDateParam && endDateParam) {
43
49
  if (noActiveSelection) {
44
50
  handleClearDates()
45
- setUpdateCalendarDefaultMoth((prev) => prev + 1)
51
+ setUpdateCalendarDefaultMonth((prev) => prev + 1)
46
52
  setUpdatedForSubmit(false)
53
+ setRangeContext(outerRangeContext)
47
54
  setInitialCalendarRange({
48
55
  from: new Date(startDateParam),
49
56
  to: new Date(endDateParam),
@@ -110,9 +117,10 @@ export const useFilterCalendar = ({
110
117
  calendarRange,
111
118
  disabledDates,
112
119
  updateCalendarMonthNavigation,
113
- updateCalendarDefaultMoth,
120
+ updateCalendarDefaultMonth,
114
121
  calendarHasError,
115
122
  setCalendarHasError,
116
123
  setUpdatedForSubmit,
124
+ rangeContext,
117
125
  }
118
126
  }
@@ -1,5 +1,5 @@
1
1
  import React, { forwardRef } from 'react'
2
- import { startOfDay, isBefore, endOfDay, isEqual, isAfter } from 'date-fns'
2
+ import { startOfDay } from 'date-fns'
3
3
  import { fi, enUS } from 'date-fns/locale'
4
4
  import { useTranslation } from 'react-i18next'
5
5
  import { DateRange, DayPicker } from 'react-day-picker'
@@ -36,7 +36,7 @@ export const Calendar = forwardRef<HTMLDivElement, CalendarTypes>(
36
36
  setDisabledDates,
37
37
  updateCalendarMonthNavigation,
38
38
  setUpdateCalendarMonthNavigation,
39
- updateCalendarDefaultMoth,
39
+ updateCalendarDefaultMonth,
40
40
  loadingData,
41
41
  showFeedback,
42
42
  palette,
@@ -61,7 +61,7 @@ export const Calendar = forwardRef<HTMLDivElement, CalendarTypes>(
61
61
  disableCalendarDates,
62
62
  calendarRange,
63
63
  updateCalendarMonthNavigation,
64
- updateCalendarDefaultMoth,
64
+ updateCalendarDefaultMonth,
65
65
  }
66
66
  )
67
67
 
@@ -72,20 +72,16 @@ export const Calendar = forwardRef<HTMLDivElement, CalendarTypes>(
72
72
  newDisableCalendarDates,
73
73
  })
74
74
 
75
+ console.log('2', t('noCheckIn'))
76
+
75
77
  // Handle tooltip
76
78
  useCalendarTooltips({
77
- calendarRange,
78
- updateCalendarMonthNavigation,
79
- overlappingDate,
80
- updateCalendarDefaultMoth,
81
79
  showFeedback,
82
80
  })
83
81
 
84
82
  // Handle loading spinner
85
83
  useCalendarLoadingSpinner({
86
84
  loadingData,
87
- updateCalendarMonthNavigation,
88
- updateCalendarDefaultMoth,
89
85
  })
90
86
 
91
87
  // Handle the date selection and availability for selection logic.
@@ -131,7 +127,7 @@ export const Calendar = forwardRef<HTMLDivElement, CalendarTypes>(
131
127
  <div className="will-filter-bar-calendar" ref={ref}>
132
128
  <div className="will-calendar-filter-container">
133
129
  <DayPicker
134
- key={updateCalendarDefaultMoth}
130
+ key={updateCalendarDefaultMonth}
135
131
  id="will-calendar"
136
132
  mode="range"
137
133
  locale={language === 'en' ? enUS : fi}
@@ -39,7 +39,7 @@ export type CalendarTypes = {
39
39
  palette?: Palette
40
40
  updateCalendarMonthNavigation?: boolean
41
41
  setUpdateCalendarMonthNavigation?: (arg: (prev: boolean) => boolean) => void
42
- updateCalendarDefaultMoth?: number
42
+ updateCalendarDefaultMonth?: number
43
43
  setCalendarHasError?: (arg: boolean) => void
44
44
  setUpdatedForSubmit?: (arg: boolean) => void
45
45
  rangeContext?: RangeContext
@@ -2,15 +2,9 @@ import { useEffect } from 'react'
2
2
 
3
3
  type Props = {
4
4
  loadingData?: boolean
5
- updateCalendarMonthNavigation?: boolean
6
- updateCalendarDefaultMoth?: number
7
5
  }
8
6
 
9
- export const useCalendarLoadingSpinner = ({
10
- loadingData,
11
- updateCalendarMonthNavigation,
12
- updateCalendarDefaultMoth,
13
- }: Props) =>
7
+ export const useCalendarLoadingSpinner = ({ loadingData }: Props) =>
14
8
  useEffect(() => {
15
9
  if (typeof document === 'undefined') return
16
10
 
@@ -22,4 +16,4 @@ export const useCalendarLoadingSpinner = ({
22
16
  } else {
23
17
  if (loadingSpinner) loadingSpinner.style.display = 'none'
24
18
  }
25
- }, [loadingData, updateCalendarMonthNavigation, updateCalendarDefaultMoth])
19
+ })
@@ -1,22 +1,12 @@
1
1
  import { useEffect } from 'react'
2
- import { DateRange } from 'react-day-picker'
3
2
 
4
3
  type Props = {
5
- calendarRange?: DateRange
6
- updateCalendarMonthNavigation?: boolean
7
- overlappingDate?: DateRange[]
8
- updateCalendarDefaultMoth?: number
9
4
  showFeedback?: boolean
10
5
  }
11
6
 
12
- export const useCalendarTooltips = ({
13
- calendarRange,
14
- updateCalendarMonthNavigation,
15
- overlappingDate,
16
- updateCalendarDefaultMoth,
17
- showFeedback,
18
- }: Props) =>
7
+ export const useCalendarTooltips = ({ showFeedback }: Props) =>
19
8
  useEffect(() => {
9
+ console.log('3')
20
10
  if (typeof document === 'undefined' || !showFeedback) return
21
11
 
22
12
  // Children
@@ -131,9 +121,4 @@ export const useCalendarTooltips = ({
131
121
  tooltipClonesSpinner.forEach((clone) => clone.remove())
132
122
  tooltipClonesOverlappingDates.forEach((clone) => clone.remove())
133
123
  }
134
- }, [
135
- calendarRange,
136
- updateCalendarMonthNavigation,
137
- overlappingDate,
138
- updateCalendarDefaultMoth,
139
- ])
124
+ })
@@ -8,14 +8,14 @@ type Props = {
8
8
  disableCalendarDates?: DisableCalendarDates
9
9
  calendarRange?: DateRange
10
10
  updateCalendarMonthNavigation?: boolean
11
- updateCalendarDefaultMoth?: number
11
+ updateCalendarDefaultMonth?: number
12
12
  }
13
13
 
14
14
  export const useUpdateDisabledDates = ({
15
15
  disableCalendarDates,
16
16
  calendarRange,
17
17
  updateCalendarMonthNavigation,
18
- updateCalendarDefaultMoth,
18
+ updateCalendarDefaultMonth,
19
19
  }: Props) => {
20
20
  const [overlappingDate, setOverlappingDate] = useState<
21
21
  DateRange[] | undefined
@@ -87,7 +87,7 @@ export const useUpdateDisabledDates = ({
87
87
  disableCalendarDates,
88
88
  calendarRange,
89
89
  updateCalendarMonthNavigation,
90
- updateCalendarDefaultMoth,
90
+ updateCalendarDefaultMonth,
91
91
  ])
92
92
 
93
93
  return { newDisableCalendarDates, overlappingDate }
@@ -38,6 +38,8 @@ export const calendarSelectionRules = ({
38
38
  : null
39
39
  const rangeContextTo = rangeContext?.to ? endOfDay(rangeContext.to) : null
40
40
 
41
+ // When some dates are not available for selection, the earliest date will be available only for "end"
42
+ // and the latest date will only be available for "start"
41
43
  const overlappingDateFrom = overlappingDate?.length
42
44
  ? overlappingDate.find((date) =>
43
45
  !!(date.from && rangeFrom)
@@ -46,6 +48,13 @@ export const calendarSelectionRules = ({
46
48
  )
47
49
  : null
48
50
 
51
+ const overlappingDateTo = overlappingDate?.length
52
+ ? overlappingDate.find((date) =>
53
+ !!(date.from && rangeTo) ? isEqual(endOfDay(date.from), rangeTo) : false
54
+ )
55
+ : null
56
+ //----------
57
+
49
58
  const checkOutRange = newDisableCalendarDates?.availableDates?.length
50
59
  ? newDisableCalendarDates.availableDates.find((checkInDate) =>
51
60
  !!(checkInDate.checkIn && rangeFrom)
@@ -65,8 +74,11 @@ export const calendarSelectionRules = ({
65
74
  // Calendar selection rules: The cases are handled sequentially, starting from simple selections to more complex contextual selections.
66
75
  // The rules are processed in a specific order, so one case is handled before another.
67
76
  // Changing the order will cause the rules to break or not work properly.
68
-
69
- if (!!overlappingDateFrom) {
77
+ console.log(overlappingDateTo)
78
+ if (
79
+ !!overlappingDateFrom ||
80
+ (calendarRangeFrom && calendarRangeTo && overlappingDateTo)
81
+ ) {
70
82
  // 1. If dates overlap, clear the selection.
71
83
  return setCalendarRange(undefined)
72
84
  }