|
8 | 8 | } from './date-utils.js' |
9 | 9 | import { getInnerLocale, type Locale } from './locale.js' |
10 | 10 | import { createEventDispatcher } from 'svelte' |
| 11 | + import { cloneDate, toValidDate } from './date-utils.js' |
11 | 12 |
|
12 | 13 | const dispatch = createEventDispatcher<{ |
13 | 14 | /** Fires when the user selects a new value by clicking on a date or by pressing enter */ |
14 | 15 | select: Date |
15 | 16 | }>() |
16 | 17 |
|
17 | | - function cloneDate(d: Date) { |
18 | | - return new Date(d) |
19 | | - } |
20 | | -
|
21 | 18 | /** Date value. It's `null` if no date is selected */ |
22 | 19 | export let value: Date | null = null |
23 | 20 |
|
24 | 21 | function setValue(d: Date) { |
25 | 22 | if (d.getTime() !== value?.getTime()) { |
26 | | - browseDate = toValidDate(value ?? browseDate, d) |
| 23 | + browseDate = toValidDate(value ?? browseDate, d, min, max, isDisabledDate) |
27 | 24 | applyTimePrecision(browseDate, timePrecision) |
28 | 25 | value = cloneDate(browseDate) |
29 | 26 | } |
|
63 | 60 | return isDisabledDate?.(new Date(date.year, date.month, date.number)) |
64 | 61 | } |
65 | 62 |
|
66 | | - function toValidDate(oldDate: Date, newDate: Date): Date { |
67 | | - // Don't mutate the original newDate to avoid unintended side effects |
68 | | - let adjustedDate = cloneDate(newDate) |
69 | | -
|
70 | | - if (oldDate > newDate) { |
71 | | - adjustDate(adjustedDate, -1) |
72 | | - if (adjustedDate < min) { |
73 | | - adjustedDate = cloneDate(min) |
74 | | - // Adjusts the date one more time if the min date is disabled, to ensure a valid, enabled date is selected |
75 | | - adjustDate(adjustedDate, 1) |
76 | | - } |
77 | | - return adjustedDate |
78 | | - } |
79 | | - if (adjustedDate > oldDate) { |
80 | | - adjustDate(adjustedDate, 1) |
81 | | - if (adjustedDate > max) { |
82 | | - adjustedDate = cloneDate(max) |
83 | | - // Adjusts the date one more time if the max date is disabled, to ensure a valid, enabled date is selected |
84 | | - adjustDate(adjustedDate, -1) |
85 | | - } |
86 | | - return adjustedDate |
87 | | - } |
88 | | - return adjustedDate |
89 | | - } |
90 | | -
|
91 | | - function adjustDate(date: Date, increment: number) { |
92 | | - // Prevents accidental infinite loops |
93 | | - const MAXLOOPS = 36525 // ~100 years, should be large enough |
94 | | - let loopCount = 0 |
95 | | -
|
96 | | - while (isDisabledDate?.(date) && date >= min && date <= max && loopCount <= MAXLOOPS) { |
97 | | - date.setDate(date.getDate() + increment) |
98 | | - loopCount++ |
99 | | - } |
100 | | - } |
101 | | -
|
102 | 63 | // Prevents a invalid date from being typed into the Dateinput text box |
103 | 64 | $: if (value && value > max) { |
104 | | - setValue(toValidDate(value, max)) |
| 65 | + setValue(toValidDate(value, max, min, max, isDisabledDate)) |
105 | 66 | } else if (value && value < min) { |
106 | | - setValue(toValidDate(value, min)) |
| 67 | + setValue(toValidDate(value, min, min, max, isDisabledDate)) |
107 | 68 | } else if (value && isDisabledDate?.(value)) { |
108 | | - setValue(toValidDate(browseDate, value)) |
| 69 | + setValue(toValidDate(browseDate, value, min, max, isDisabledDate)) |
109 | 70 | } |
110 | 71 | function clamp(d: Date, min: Date, max: Date) { |
111 | 72 | if (d > max) { |
|
0 commit comments