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.
- package/lib/components/FilterCalendar/FilterCalendar.d.ts +1 -1
- package/lib/components/FilterCalendar/hooks/useFilterCalendar.d.ts +5 -2
- package/lib/core/components/calendar/CalendarTypes.d.ts +1 -1
- package/lib/core/components/calendar/hooks/useCalendarLoadingSpinner.d.ts +1 -3
- package/lib/core/components/calendar/hooks/useCalendarTooltips.d.ts +1 -6
- package/lib/core/components/calendar/hooks/useUpdateDisabledDates.d.ts +2 -2
- package/lib/index.d.ts +2 -2
- package/lib/index.esm.js +39 -33
- package/lib/index.esm.js.map +1 -1
- package/lib/index.js +39 -33
- package/lib/index.js.map +1 -1
- package/lib/index.umd.js +39 -33
- package/lib/index.umd.js.map +1 -1
- package/package.json +1 -1
- package/src/components/FilterCalendar/FilterCalendar.stories.tsx +411 -364
- package/src/components/FilterCalendar/FilterCalendar.tsx +6 -4
- package/src/components/FilterCalendar/hooks/useFilterCalendar.ts +11 -3
- package/src/core/components/calendar/Calendar.tsx +6 -10
- package/src/core/components/calendar/CalendarTypes.ts +1 -1
- package/src/core/components/calendar/hooks/useCalendarLoadingSpinner.tsx +2 -8
- package/src/core/components/calendar/hooks/useCalendarTooltips.tsx +3 -18
- package/src/core/components/calendar/hooks/useUpdateDisabledDates.tsx +3 -3
- package/src/core/components/calendar/utils/calendarSelectionRules.tsx +14 -2
|
@@ -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
|
-
|
|
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
|
-
|
|
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 [
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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={
|
|
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
|
-
|
|
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
|
-
}
|
|
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
|
-
|
|
11
|
+
updateCalendarDefaultMonth?: number
|
|
12
12
|
}
|
|
13
13
|
|
|
14
14
|
export const useUpdateDisabledDates = ({
|
|
15
15
|
disableCalendarDates,
|
|
16
16
|
calendarRange,
|
|
17
17
|
updateCalendarMonthNavigation,
|
|
18
|
-
|
|
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
|
-
|
|
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 (
|
|
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
|
}
|