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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "willba-component-library",
3
- "version": "0.2.53",
3
+ "version": "0.2.55",
4
4
  "description": "A custom UI component library",
5
5
  "main": "lib/index.js",
6
6
  "module": "lib/index.esm.js",
@@ -124,7 +124,7 @@ export const useFilterBar = ({
124
124
 
125
125
  handleSelectedFilter(false)
126
126
 
127
- if (onSubmit) {
127
+ if (onSubmit && selectedPath === Pages.ROOMS) {
128
128
  onSubmit(newParams)
129
129
  } else {
130
130
  setInnerLoading(true),
@@ -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
 
@@ -155,6 +155,10 @@ export const Primary: Story = {
155
155
  to: new Date('2024-08-23'),
156
156
  },
157
157
  ],
158
+ selectedDates: {
159
+ from: new Date('2024-09-05'),
160
+ to: new Date('2024-09-10'),
161
+ },
158
162
  },
159
163
  language: 'en',
160
164
  palette: {
@@ -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
- <h2>{t('filterBar:calendar.title')}</h2>
74
- <CloseButton handleClose={() => setToggleCalendar(false)} />
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 { addDays, startOfDay, format } from 'date-fns'
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
  }
@@ -0,0 +1,3 @@
1
+ export const handleOverlappingDates = () => {
2
+ return
3
+ }