willba-component-library 0.2.53 → 0.2.55
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/hooks/useFilterCalendar.d.ts +2 -0
- package/lib/core/components/calendar/CalendarTypes.d.ts +5 -0
- package/lib/core/utils/handleOverlappingDates.d.ts +1 -0
- package/lib/index.d.ts +5 -0
- package/lib/index.esm.js +70 -10
- package/lib/index.esm.js.map +1 -1
- package/lib/index.js +70 -10
- package/lib/index.js.map +1 -1
- package/lib/index.umd.js +70 -10
- package/lib/index.umd.js.map +1 -1
- package/package.json +1 -1
- package/src/components/FilterBar/hooks/useFilterBar.tsx +1 -1
- package/src/components/FilterCalendar/FilterCalendar.css +4 -1
- package/src/components/FilterCalendar/FilterCalendar.stories.tsx +4 -0
- package/src/components/FilterCalendar/FilterCalendar.tsx +9 -2
- package/src/components/FilterCalendar/hooks/useFilterCalendar.ts +4 -0
- package/src/core/components/calendar/Calendar.tsx +50 -1
- package/src/core/components/calendar/CalendarTypes.ts +2 -0
- package/src/core/utils/handleOverlappingDates.tsx +3 -0
package/package.json
CHANGED
|
@@ -16,9 +16,12 @@
|
|
|
16
16
|
/* Header */
|
|
17
17
|
|
|
18
18
|
.will-root .will-calendar-wrapper .will-calendar-header {
|
|
19
|
+
border-bottom: 1px solid var(--will-grey);
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
.will-root .will-calendar-wrapper .will-calendar-header-row {
|
|
19
23
|
display: flex;
|
|
20
24
|
justify-content: space-between;
|
|
21
|
-
border-bottom: 1px solid var(--will-grey);
|
|
22
25
|
align-items: center;
|
|
23
26
|
}
|
|
24
27
|
|
|
@@ -46,6 +46,8 @@ export default function FilterCalendar({
|
|
|
46
46
|
updateCalendarDefaultMoth,
|
|
47
47
|
setUpdateCalendarMonthNavigation,
|
|
48
48
|
initialCalendarRange,
|
|
49
|
+
overlappingDates,
|
|
50
|
+
setOverlappingDates,
|
|
49
51
|
} = useFilterCalendar({
|
|
50
52
|
onSubmit,
|
|
51
53
|
setToggleCalendar,
|
|
@@ -70,9 +72,13 @@ export default function FilterCalendar({
|
|
|
70
72
|
{toggleCalendar && (
|
|
71
73
|
<div className={`will-calendar-wrapper`} ref={filtersRef}>
|
|
72
74
|
<div className={`will-calendar-header`}>
|
|
73
|
-
<
|
|
74
|
-
|
|
75
|
+
<div className={`will-calendar-header-row`}>
|
|
76
|
+
<h2>{t('filterBar:calendar.title')}</h2>
|
|
77
|
+
<CloseButton handleClose={() => setToggleCalendar(false)} />
|
|
78
|
+
</div>
|
|
79
|
+
{overlappingDates && <div>Chose other dates</div>}
|
|
75
80
|
</div>
|
|
81
|
+
|
|
76
82
|
<div className={`will-calendar-main`}>
|
|
77
83
|
<Calendar
|
|
78
84
|
calendarRange={calendarRange}
|
|
@@ -94,6 +100,7 @@ export default function FilterCalendar({
|
|
|
94
100
|
showFeedback={showFeedback}
|
|
95
101
|
noActiveSelection={noActiveSelection}
|
|
96
102
|
palette={palette}
|
|
103
|
+
setOverlappingDates={setOverlappingDates}
|
|
97
104
|
/>
|
|
98
105
|
</div>
|
|
99
106
|
<div className={`will-calendar-footer`}>
|
|
@@ -24,6 +24,8 @@ export const useFilterCalendar = ({
|
|
|
24
24
|
const [updateCalendarDefaultMoth, setUpdateCalendarDefaultMoth] =
|
|
25
25
|
useState<number>(0)
|
|
26
26
|
|
|
27
|
+
const [overlappingDates, setOverlappingDates] = useState<boolean>(false)
|
|
28
|
+
|
|
27
29
|
useEffect(() => {
|
|
28
30
|
if (typeof window === 'undefined') return
|
|
29
31
|
|
|
@@ -70,5 +72,7 @@ export const useFilterCalendar = ({
|
|
|
70
72
|
updateCalendarMonthNavigation,
|
|
71
73
|
updateCalendarDefaultMoth,
|
|
72
74
|
initialCalendarRange,
|
|
75
|
+
overlappingDates,
|
|
76
|
+
setOverlappingDates,
|
|
73
77
|
}
|
|
74
78
|
}
|
|
@@ -1,5 +1,12 @@
|
|
|
1
1
|
import React, { forwardRef, useEffect, useMemo, useState } from 'react'
|
|
2
|
-
import {
|
|
2
|
+
import {
|
|
3
|
+
addDays,
|
|
4
|
+
startOfDay,
|
|
5
|
+
format,
|
|
6
|
+
isAfter,
|
|
7
|
+
isEqual,
|
|
8
|
+
isBefore,
|
|
9
|
+
} from 'date-fns'
|
|
3
10
|
import { fi, enUS } from 'date-fns/locale'
|
|
4
11
|
import { useTranslation } from 'react-i18next'
|
|
5
12
|
import { DateRange, DayPicker, Matcher } from 'react-day-picker'
|
|
@@ -29,6 +36,7 @@ export const Calendar = forwardRef<HTMLDivElement, CalendarTypes>(
|
|
|
29
36
|
initialCalendarRange,
|
|
30
37
|
showFeedback,
|
|
31
38
|
palette,
|
|
39
|
+
setOverlappingDates,
|
|
32
40
|
}: CalendarTypes,
|
|
33
41
|
ref
|
|
34
42
|
) => {
|
|
@@ -242,6 +250,7 @@ export const Calendar = forwardRef<HTMLDivElement, CalendarTypes>(
|
|
|
242
250
|
setDisabledDates,
|
|
243
251
|
calendarRange,
|
|
244
252
|
overlappingDate,
|
|
253
|
+
setOverlappingDates,
|
|
245
254
|
})
|
|
246
255
|
}
|
|
247
256
|
captionLayout="dropdown-buttons"
|
|
@@ -344,11 +353,13 @@ const handleSelectedCheckIn = ({
|
|
|
344
353
|
setDisabledDates,
|
|
345
354
|
calendarRange,
|
|
346
355
|
overlappingDate,
|
|
356
|
+
setOverlappingDates,
|
|
347
357
|
}: {
|
|
348
358
|
range: DateRange | undefined
|
|
349
359
|
newDisableCalendarDates?: DisableCalendarDates
|
|
350
360
|
setCalendarRange: (range: DateRange | undefined) => void
|
|
351
361
|
setDisabledDates: ((arg: Matcher[]) => void) | undefined
|
|
362
|
+
setOverlappingDates: (arg: boolean) => void
|
|
352
363
|
calendarRange?: DateRange
|
|
353
364
|
overlappingDate?: DateRange[]
|
|
354
365
|
}) => {
|
|
@@ -374,6 +385,30 @@ const handleSelectedCheckIn = ({
|
|
|
374
385
|
)
|
|
375
386
|
: null
|
|
376
387
|
|
|
388
|
+
// Case: Set the calendar range only if it overlaps with the previously selected dates.
|
|
389
|
+
// The selection must remain continuous, meaning no gaps between days are allowed.
|
|
390
|
+
// Whether selecting forwards or backwards from the initially chosen dates,
|
|
391
|
+
// the new range must be directly adjacent to or overlap with the current selection.
|
|
392
|
+
const selectedDates = newDisableCalendarDates?.selectedDates || null
|
|
393
|
+
const rowRangeFrom = range?.from
|
|
394
|
+
const rowRangeTo = range?.to
|
|
395
|
+
const selectedDatesFrom = newDisableCalendarDates?.selectedDates?.from || null
|
|
396
|
+
const selectedDatesTo = newDisableCalendarDates?.selectedDates?.to || null
|
|
397
|
+
|
|
398
|
+
// Checking if rowRangeFrom is equal to or before selectedDatesTo
|
|
399
|
+
const startIsEqualOrBeforeSelectedEnd =
|
|
400
|
+
rowRangeFrom && selectedDatesFrom && selectedDatesTo
|
|
401
|
+
? isBefore(startOfDay(rowRangeFrom), startOfDay(selectedDatesTo)) ||
|
|
402
|
+
isEqual(startOfDay(rowRangeFrom), startOfDay(selectedDatesTo))
|
|
403
|
+
: null
|
|
404
|
+
|
|
405
|
+
// Checking if rowRangeTo is equal to or after selectedDatesFrom
|
|
406
|
+
const endIsEqualOrAfterSelectedStart =
|
|
407
|
+
rowRangeTo && selectedDatesFrom && selectedDatesTo
|
|
408
|
+
? isAfter(startOfDay(rowRangeTo), startOfDay(selectedDatesFrom)) ||
|
|
409
|
+
isEqual(startOfDay(rowRangeTo), startOfDay(selectedDatesFrom))
|
|
410
|
+
: null
|
|
411
|
+
|
|
377
412
|
if (rangeFrom && checkOutRange && setDisabledDates) {
|
|
378
413
|
const checkIn = addDays(checkOutRange.checkIn, 1)
|
|
379
414
|
const firstCheckOut = addDays(checkOutRange.firstCheckOut, -1)
|
|
@@ -395,7 +430,21 @@ const handleSelectedCheckIn = ({
|
|
|
395
430
|
])
|
|
396
431
|
}
|
|
397
432
|
|
|
433
|
+
console.log(
|
|
434
|
+
selectedDates,
|
|
435
|
+
startIsEqualOrBeforeSelectedEnd,
|
|
436
|
+
endIsEqualOrAfterSelectedStart
|
|
437
|
+
)
|
|
438
|
+
|
|
439
|
+
setOverlappingDates && setOverlappingDates(false)
|
|
440
|
+
|
|
398
441
|
if (
|
|
442
|
+
(selectedDates && !startIsEqualOrBeforeSelectedEnd) ||
|
|
443
|
+
(selectedDates && range?.to && !endIsEqualOrAfterSelectedStart)
|
|
444
|
+
) {
|
|
445
|
+
setCalendarRange(undefined)
|
|
446
|
+
setOverlappingDates && setOverlappingDates(true)
|
|
447
|
+
} else if (
|
|
399
448
|
(rangeTo && rangeFrom && rangeFrom === rangeTo) ||
|
|
400
449
|
(!rangeTo && !rangeFrom) ||
|
|
401
450
|
overlappingDateFrom
|
|
@@ -16,6 +16,7 @@ export type DisableCalendarDates = {
|
|
|
16
16
|
page: string
|
|
17
17
|
offset: number
|
|
18
18
|
}[]
|
|
19
|
+
selectedDates?: { to: Date; from: Date }
|
|
19
20
|
}
|
|
20
21
|
|
|
21
22
|
export type CalendarTypes = {
|
|
@@ -37,4 +38,5 @@ export type CalendarTypes = {
|
|
|
37
38
|
updateCalendarMonthNavigation?: boolean
|
|
38
39
|
setUpdateCalendarMonthNavigation?: (arg: (prev: boolean) => boolean) => void
|
|
39
40
|
updateCalendarDefaultMoth?: number
|
|
41
|
+
setOverlappingDates: (arg: boolean) => void
|
|
40
42
|
}
|