@transferwise/components 0.0.0-experimental-2371aee → 0.0.0-experimental-d6d5b6e
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/build/Calendar/Calendar.js +6 -12
- package/build/Calendar/Calendar.js.map +1 -1
- package/build/Calendar/Calendar.mjs +6 -12
- package/build/Calendar/Calendar.mjs.map +1 -1
- package/build/common/DateUtils/isDateDisabled/isDateDisabled.js +1 -1
- package/build/common/DateUtils/isDateDisabled/isDateDisabled.js.map +1 -1
- package/build/common/DateUtils/isDateDisabled/isDateDisabled.mjs +1 -1
- package/build/common/DateUtils/isDateDisabled/isDateDisabled.mjs.map +1 -1
- package/build/types/Calendar/Calendar.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/Calendar/Calendar.tsx +8 -14
- package/src/common/DateUtils/isDateDisabled/isDateDisabled.ts +1 -1
|
@@ -4,6 +4,7 @@ Object.defineProperty(exports, '__esModule', { value: true });
|
|
|
4
4
|
|
|
5
5
|
var React = require('react');
|
|
6
6
|
var reactIntl = require('react-intl');
|
|
7
|
+
var formatting = require('@transferwise/formatting');
|
|
7
8
|
require('../common/theme.js');
|
|
8
9
|
require('../common/direction.js');
|
|
9
10
|
require('@transferwise/neptune-tokens');
|
|
@@ -23,7 +24,6 @@ require('../common/PropsValues/variant.js');
|
|
|
23
24
|
require('../common/PropsValues/scroll.js');
|
|
24
25
|
require('../common/PropsValues/markdownNodeType.js');
|
|
25
26
|
require('../common/fileType.js');
|
|
26
|
-
require('@transferwise/formatting');
|
|
27
27
|
require('@transferwise/icons');
|
|
28
28
|
require('clsx');
|
|
29
29
|
require('../common/CloseButton/CloseButton.messages.js');
|
|
@@ -64,11 +64,11 @@ const Calendar = ({
|
|
|
64
64
|
// eslint-disable-next-line react-hooks/set-state-in-effect
|
|
65
65
|
setFocusedDate(selectedDate);
|
|
66
66
|
}, [selectedDate?.getTime()]); // eslint-disable-line react-hooks/exhaustive-deps
|
|
67
|
-
const focusedDateDisabled = focusedDate ? !isWithinRange.isWithinRange(focusedDate, min, max) || isDateDisabled.isDateDisabled(focusedDate, disabledRules) : false;
|
|
68
67
|
const checkIsEnabled = date => {
|
|
69
68
|
if (!date) return true;
|
|
70
69
|
return isWithinRange.isWithinRange(date, min, max) && !isDateDisabled.isDateDisabled(date, disabledRulesRef.current);
|
|
71
70
|
};
|
|
71
|
+
const focusedDateDisabled = focusedDate ? !isWithinRange.isWithinRange(focusedDate, min, max) || isDateDisabled.isDateDisabled(focusedDate, disabledRules) : false;
|
|
72
72
|
React.useEffect(() => {
|
|
73
73
|
if (selectedDate && !isWithinRange.isWithinRange(selectedDate, min, max)) {
|
|
74
74
|
const clamped = moveToWithinRange.moveToWithinRange(selectedDate, min, max);
|
|
@@ -154,24 +154,18 @@ const Calendar = ({
|
|
|
154
154
|
case 'Enter':
|
|
155
155
|
case ' ':
|
|
156
156
|
if (mode === 'day' && focusedDate && event.target.hasAttribute('data-calendar-cell')) {
|
|
157
|
-
|
|
158
|
-
onDateFocus?.(focusedDate, {
|
|
159
|
-
isEnabled
|
|
160
|
-
});
|
|
161
|
-
if (isEnabled && onChange) {
|
|
162
|
-
onChange(focusedDate);
|
|
163
|
-
}
|
|
157
|
+
handleSelectedDateUpdate(focusedDate);
|
|
164
158
|
event.preventDefault();
|
|
165
159
|
}
|
|
166
160
|
break;
|
|
167
161
|
}
|
|
168
|
-
}, [adjustDate, focusedDate, mode,
|
|
162
|
+
}, [adjustDate, focusedDate, mode, handleSelectedDateUpdate]);
|
|
169
163
|
const focusedDateOutOfRange = focusedDate ? !isWithinRange.isWithinRange(focusedDate, min, max) : false;
|
|
170
|
-
const formatDateForPrompt = date =>
|
|
164
|
+
const formatDateForPrompt = date => formatting.formatDate(date, intl.locale, {
|
|
171
165
|
day: 'numeric',
|
|
172
166
|
month: 'long',
|
|
173
167
|
year: 'numeric'
|
|
174
|
-
})
|
|
168
|
+
});
|
|
175
169
|
const outOfRangePromptText = min && max ? intl.formatMessage(Calendar_messages.default.outOfRangeBetween, {
|
|
176
170
|
min: formatDateForPrompt(min),
|
|
177
171
|
max: formatDateForPrompt(max)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Calendar.js","sources":["../../src/Calendar/Calendar.tsx"],"sourcesContent":["import { useState, useCallback, useEffect, useId, useRef, KeyboardEvent } from 'react';\nimport { useIntl } from 'react-intl';\n\nimport { MonthFormat } from '../common';\nimport {\n isWithinRange,\n moveToWithinRange,\n returnDateView,\n isDateDisabled,\n hasDisabledDatesInMonth,\n} from '../common/DateUtils';\nimport { InlinePrompt } from '../Prompt/InlinePrompt';\nimport type { DateChangeMeta, DisabledRules } from './Calendar.types';\nimport DayCalendar from './DayCalendar';\nimport { getStartOfDay } from './GetStartOfDay';\nimport messages from './Calendar.messages';\nimport MonthCalendar from './MonthCalendar';\nimport YearCalendar from './YearCalendar';\n\nexport interface CalendarProps {\n /** The currently selected date, or `null` for no selection. */\n value: Date | null;\n /** Earliest selectable date (inclusive). Dates before this are interactive but not selectable, and show a boundary prompt. */\n min?: Date | null;\n /** Latest selectable date (inclusive). Dates after this are interactive but not selectable, and show a boundary prompt. */\n max?: Date | null;\n /** Month name format in the header. Defaults to `'long'` (e.g. \"January\"). */\n monthFormat?: `${MonthFormat}`;\n /** Placeholder text shown in the month/year cells when no date is selected. */\n placeholder?: string;\n /** Rules for disabling specific weekdays, individual dates, or date ranges. The required `reason` is shown in an inline prompt and linked to disabled cells via `aria-describedby` for screen reader accessibility. */\n disabledRules?: DisabledRules;\n /** Called whenever the focused date changes — including disabled and out-of-range dates. `meta.isEnabled` is `false` when the date is not selectable. */\n onDateFocus?: (date: Date | null, meta: DateChangeMeta) => void;\n /** Called when a date is confirmed (click or Enter). Only fires for enabled dates. */\n onChange?: (date: Date) => void;\n}\n\n\n/**\n * Inline calendar for selecting a single date. Powers [DateLookup](?path=/docs/forms-datelookup--docs).\n */\nconst Calendar = ({\n value,\n min: minProp = null,\n max: maxProp = null,\n monthFormat = MonthFormat.LONG,\n placeholder,\n disabledRules,\n onDateFocus,\n onChange,\n}: CalendarProps) => {\n const intl = useIntl();\n const selectedDate = getStartOfDay(value);\n const min = getStartOfDay(minProp);\n const max = getStartOfDay(maxProp);\n const disabledReasonId = useId();\n const disabledRulesRef = useRef(disabledRules);\n useEffect(() => {\n disabledRulesRef.current = disabledRules;\n });\n\n const [focusedDate, setFocusedDate] = useState<Date | null>(selectedDate);\n\n useEffect(() => {\n // eslint-disable-next-line react-hooks/set-state-in-effect\n setFocusedDate(selectedDate);\n }, [selectedDate?.getTime()]); // eslint-disable-line react-hooks/exhaustive-deps\n\n const focusedDateDisabled = focusedDate\n ? !isWithinRange(focusedDate, min, max) || isDateDisabled(focusedDate, disabledRules)\n : false;\n\n const checkIsEnabled = (date: Date | null) => {\n if (!date) return true;\n return isWithinRange(date, min, max) && !isDateDisabled(date, disabledRulesRef.current);\n };\n\n useEffect(() => {\n if (selectedDate && !isWithinRange(selectedDate, min, max)) {\n const clamped = moveToWithinRange(selectedDate, min, max);\n setFocusedDate(clamped); // eslint-disable-line react-hooks/set-state-in-effect\n onDateFocus?.(clamped, { isEnabled: checkIsEnabled(clamped) });\n }\n }, [selectedDate?.getTime(), min?.getTime(), max?.getTime(), onDateFocus]); // eslint-disable-line react-hooks/exhaustive-deps\n\n const dateView = returnDateView(selectedDate, min, max);\n const [viewMonth, setViewMonth] = useState(dateView.getMonth());\n const [viewYear, setViewYear] = useState(dateView.getFullYear());\n const [mode, setMode] = useState<'day' | 'month' | 'year'>('day');\n\n useEffect(() => {\n const view = returnDateView(selectedDate, min, max);\n // eslint-disable-next-line react-hooks/set-state-in-effect\n setViewMonth(view.getMonth());\n\n setViewYear(view.getFullYear());\n }, [selectedDate?.getTime(), min?.getTime(), max?.getTime()]); // eslint-disable-line react-hooks/exhaustive-deps\n\n useEffect(() => {\n if (focusedDate) {\n // eslint-disable-next-line react-hooks/set-state-in-effect\n setViewMonth(focusedDate.getMonth());\n setViewYear(focusedDate.getFullYear());\n }\n }, [focusedDate?.getTime()]); // eslint-disable-line react-hooks/exhaustive-deps\n\n const handleViewDateUpdate = useCallback(\n // eslint-disable-next-line react-hooks/preserve-manual-memoization\n ({ month, year }: { month?: number; year?: number }) => {\n if (month !== undefined) setViewMonth(month);\n if (year !== undefined) setViewYear(year);\n },\n [],\n );\n\n const switchToDays = useCallback(() => setMode('day'), []);\n const switchToMonths = useCallback(() => setMode('month'), []);\n const switchToYears = useCallback(() => setMode('year'), []);\n\n const handleSelectedDateUpdate = useCallback(\n (date: Date) => {\n const isEnabled = checkIsEnabled(date);\n setFocusedDate(date);\n onDateFocus?.(date, { isEnabled });\n if (isEnabled && onChange) {\n onChange(date);\n }\n },\n [onDateFocus, onChange], // eslint-disable-line react-hooks/exhaustive-deps\n );\n\n const adjustDate = useCallback(\n (daysToAdd: number, monthsToAdd: number, yearsToAdd: number) => {\n const base = focusedDate ?? selectedDate;\n let date: Date | null;\n if (base) {\n date = new Date(\n mode === 'year' ? base.getFullYear() + yearsToAdd : base.getFullYear(),\n mode === 'month' ? base.getMonth() + monthsToAdd : base.getMonth(),\n mode === 'day' ? base.getDate() + daysToAdd : base.getDate(),\n );\n } else {\n date = getStartOfDay(new Date());\n }\n date &&= moveToWithinRange(date, min, max);\n if (date?.getTime() !== focusedDate?.getTime()) {\n setFocusedDate(date);\n onDateFocus?.(date, { isEnabled: checkIsEnabled(date) });\n }\n },\n [focusedDate, selectedDate, min, max, mode, onDateFocus], // eslint-disable-line react-hooks/exhaustive-deps\n );\n\n const handleKeyDown = useCallback(\n (event: KeyboardEvent<HTMLDivElement>) => {\n switch (event.key) {\n case 'ArrowLeft':\n adjustDate(-1, -1, -1);\n event.preventDefault();\n break;\n case 'ArrowUp':\n adjustDate(-7, -4, -4);\n event.preventDefault();\n break;\n case 'ArrowRight':\n adjustDate(1, 1, 1);\n event.preventDefault();\n break;\n case 'ArrowDown':\n adjustDate(7, 4, 4);\n event.preventDefault();\n break;\n case 'Enter':\n case ' ':\n if (\n mode === 'day' &&\n focusedDate &&\n (event.target as HTMLElement).hasAttribute('data-calendar-cell')\n ) {\n const isEnabled = checkIsEnabled(focusedDate);\n onDateFocus?.(focusedDate, { isEnabled });\n if (isEnabled && onChange) {\n onChange(focusedDate);\n }\n event.preventDefault();\n }\n break;\n default:\n break;\n }\n },\n [adjustDate, focusedDate, mode, onDateFocus, onChange], // eslint-disable-line react-hooks/exhaustive-deps\n );\n\n const focusedDateOutOfRange = focusedDate ? !isWithinRange(focusedDate, min, max) : false;\n\n const formatDateForPrompt = (date: Date) =>\n new Intl.DateTimeFormat(intl.locale, { day: 'numeric', month: 'long', year: 'numeric' }).format(\n date,\n );\n\n const outOfRangePromptText =\n min && max\n ? intl.formatMessage(messages.outOfRangeBetween, {\n min: formatDateForPrompt(min),\n max: formatDateForPrompt(max),\n })\n : min\n ? intl.formatMessage(messages.outOfRangeAfter, { min: formatDateForPrompt(min) })\n : max\n ? intl.formatMessage(messages.outOfRangeBefore, { max: formatDateForPrompt(max) })\n : '';\n\n const hasOutOfRangeDates = mode === 'day' && !!(min || max);\n const showRulesPrompt =\n mode === 'day' &&\n !!disabledRules &&\n hasDisabledDatesInMonth(viewMonth, viewYear, disabledRules, min, max);\n const showOutOfRangePrompt = mode === 'day' && focusedDateOutOfRange;\n const showPrompt = hasOutOfRangeDates || showRulesPrompt;\n\n const promptText = showOutOfRangePrompt\n ? outOfRangePromptText\n : (disabledRules?.reason ?? outOfRangePromptText);\n const promptSentiment = showOutOfRangePrompt || focusedDateDisabled ? 'negative' : 'neutral';\n const promptClassName =\n showOutOfRangePrompt || (showRulesPrompt && !showOutOfRangePrompt) ? 'm-t-1' : 'sr-only';\n\n return (\n // eslint-disable-next-line jsx-a11y/no-static-element-interactions\n <div onKeyDown={handleKeyDown}>\n {mode === 'day' && (\n <DayCalendar\n selectedDate={selectedDate}\n focusedDate={focusedDate}\n min={min}\n max={max}\n viewMonth={viewMonth}\n viewYear={viewYear}\n monthFormat={monthFormat}\n disabledRules={disabledRules}\n disabledReasonId={showPrompt ? disabledReasonId : undefined}\n onSelect={handleSelectedDateUpdate}\n onLabelClick={switchToYears}\n onViewDateUpdate={handleViewDateUpdate}\n />\n )}\n {mode === 'month' && (\n <MonthCalendar\n selectedDate={selectedDate}\n focusedDate={focusedDate}\n min={min}\n max={max}\n viewYear={viewYear}\n {...(placeholder != null && { placeholder })}\n onSelect={switchToDays}\n onLabelClick={switchToYears}\n onViewDateUpdate={handleViewDateUpdate}\n />\n )}\n {mode === 'year' && (\n <YearCalendar\n selectedDate={selectedDate}\n focusedDate={focusedDate}\n min={min}\n max={max}\n viewYear={viewYear}\n {...(placeholder != null && { placeholder })}\n onSelect={switchToMonths}\n onViewDateUpdate={handleViewDateUpdate}\n />\n )}\n {showPrompt && (\n <InlinePrompt\n sentiment={promptSentiment}\n width=\"full\"\n id={disabledReasonId}\n className={promptClassName}\n >\n {promptText}\n </InlinePrompt>\n )}\n </div>\n );\n};\n\nexport default Calendar;\n"],"names":["Calendar","value","min","minProp","max","maxProp","monthFormat","MonthFormat","LONG","placeholder","disabledRules","onDateFocus","onChange","intl","useIntl","selectedDate","getStartOfDay","disabledReasonId","useId","disabledRulesRef","useRef","useEffect","current","focusedDate","setFocusedDate","useState","getTime","focusedDateDisabled","isWithinRange","isDateDisabled","checkIsEnabled","date","clamped","moveToWithinRange","isEnabled","dateView","returnDateView","viewMonth","setViewMonth","getMonth","viewYear","setViewYear","getFullYear","mode","setMode","view","handleViewDateUpdate","useCallback","month","year","undefined","switchToDays","switchToMonths","switchToYears","handleSelectedDateUpdate","adjustDate","daysToAdd","monthsToAdd","yearsToAdd","base","Date","getDate","handleKeyDown","event","key","preventDefault","target","hasAttribute","focusedDateOutOfRange","formatDateForPrompt","Intl","DateTimeFormat","locale","day","format","outOfRangePromptText","formatMessage","messages","outOfRangeBetween","outOfRangeAfter","outOfRangeBefore","hasOutOfRangeDates","showRulesPrompt","hasDisabledDatesInMonth","showOutOfRangePrompt","showPrompt","promptText","reason","promptSentiment","promptClassName","_jsxs","onKeyDown","children","_jsx","DayCalendar","onSelect","onLabelClick","onViewDateUpdate","MonthCalendar","YearCalendar","InlinePrompt","sentiment","width","id","className"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Calendar.js","sources":["../../src/Calendar/Calendar.tsx"],"sourcesContent":["import { useState, useCallback, useEffect, useId, useRef, KeyboardEvent } from 'react';\nimport { useIntl } from 'react-intl';\nimport { formatDate } from '@transferwise/formatting';\n\nimport { MonthFormat } from '../common';\nimport {\n isWithinRange,\n moveToWithinRange,\n returnDateView,\n isDateDisabled,\n hasDisabledDatesInMonth,\n} from '../common/DateUtils';\nimport { InlinePrompt } from '../Prompt/InlinePrompt';\nimport type { DateChangeMeta, DisabledRules } from './Calendar.types';\nimport DayCalendar from './DayCalendar';\nimport { getStartOfDay } from './GetStartOfDay';\nimport messages from './Calendar.messages';\nimport MonthCalendar from './MonthCalendar';\nimport YearCalendar from './YearCalendar';\n\nexport interface CalendarProps {\n /** The currently selected date, or `null` for no selection. */\n value: Date | null;\n /** Earliest selectable date (inclusive). Dates before this are interactive but not selectable, and show a boundary prompt. */\n min?: Date | null;\n /** Latest selectable date (inclusive). Dates after this are interactive but not selectable, and show a boundary prompt. */\n max?: Date | null;\n /** Month name format in the header. Defaults to `'long'` (e.g. \"January\"). */\n monthFormat?: `${MonthFormat}`;\n /** Placeholder text shown in the month/year cells when no date is selected. */\n placeholder?: string;\n /** Rules for disabling specific weekdays, individual dates, or date ranges. The required `reason` is shown in an inline prompt and linked to disabled cells via `aria-describedby` for screen reader accessibility. */\n disabledRules?: DisabledRules;\n /** Called whenever the focused date changes — including disabled and out-of-range dates. `meta.isEnabled` is `false` when the date is not selectable. */\n onDateFocus?: (date: Date | null, meta: DateChangeMeta) => void;\n /** Called when a date is confirmed (click or Enter). Only fires for enabled dates. */\n onChange?: (date: Date) => void;\n}\n\n/**\n * Inline calendar for selecting a single date. Powers [DateLookup](?path=/docs/forms-datelookup--docs).\n */\nconst Calendar = ({\n value,\n min: minProp = null,\n max: maxProp = null,\n monthFormat = MonthFormat.LONG,\n placeholder,\n disabledRules,\n onDateFocus,\n onChange,\n}: CalendarProps) => {\n const intl = useIntl();\n const selectedDate = getStartOfDay(value);\n const min = getStartOfDay(minProp);\n const max = getStartOfDay(maxProp);\n const disabledReasonId = useId();\n const disabledRulesRef = useRef(disabledRules);\n useEffect(() => {\n disabledRulesRef.current = disabledRules;\n });\n\n const [focusedDate, setFocusedDate] = useState<Date | null>(selectedDate);\n\n useEffect(() => {\n // eslint-disable-next-line react-hooks/set-state-in-effect\n setFocusedDate(selectedDate);\n }, [selectedDate?.getTime()]); // eslint-disable-line react-hooks/exhaustive-deps\n\n const checkIsEnabled = (date: Date | null) => {\n if (!date) return true;\n return isWithinRange(date, min, max) && !isDateDisabled(date, disabledRulesRef.current);\n };\n\n const focusedDateDisabled = focusedDate\n ? !isWithinRange(focusedDate, min, max) || isDateDisabled(focusedDate, disabledRules)\n : false;\n\n useEffect(() => {\n if (selectedDate && !isWithinRange(selectedDate, min, max)) {\n const clamped = moveToWithinRange(selectedDate, min, max);\n setFocusedDate(clamped); // eslint-disable-line react-hooks/set-state-in-effect\n onDateFocus?.(clamped, { isEnabled: checkIsEnabled(clamped) });\n }\n }, [selectedDate?.getTime(), min?.getTime(), max?.getTime(), onDateFocus]); // eslint-disable-line react-hooks/exhaustive-deps\n\n const dateView = returnDateView(selectedDate, min, max);\n const [viewMonth, setViewMonth] = useState(dateView.getMonth());\n const [viewYear, setViewYear] = useState(dateView.getFullYear());\n const [mode, setMode] = useState<'day' | 'month' | 'year'>('day');\n\n useEffect(() => {\n const view = returnDateView(selectedDate, min, max);\n // eslint-disable-next-line react-hooks/set-state-in-effect\n setViewMonth(view.getMonth());\n\n setViewYear(view.getFullYear());\n }, [selectedDate?.getTime(), min?.getTime(), max?.getTime()]); // eslint-disable-line react-hooks/exhaustive-deps\n\n useEffect(() => {\n if (focusedDate) {\n // eslint-disable-next-line react-hooks/set-state-in-effect\n setViewMonth(focusedDate.getMonth());\n setViewYear(focusedDate.getFullYear());\n }\n }, [focusedDate?.getTime()]); // eslint-disable-line react-hooks/exhaustive-deps\n\n const handleViewDateUpdate = useCallback(\n // eslint-disable-next-line react-hooks/preserve-manual-memoization\n ({ month, year }: { month?: number; year?: number }) => {\n if (month !== undefined) setViewMonth(month);\n if (year !== undefined) setViewYear(year);\n },\n [],\n );\n\n const switchToDays = useCallback(() => setMode('day'), []);\n const switchToMonths = useCallback(() => setMode('month'), []);\n const switchToYears = useCallback(() => setMode('year'), []);\n\n const handleSelectedDateUpdate = useCallback(\n (date: Date) => {\n const isEnabled = checkIsEnabled(date);\n setFocusedDate(date);\n onDateFocus?.(date, { isEnabled });\n if (isEnabled && onChange) {\n onChange(date);\n }\n },\n [onDateFocus, onChange], // eslint-disable-line react-hooks/exhaustive-deps\n );\n\n const adjustDate = useCallback(\n (daysToAdd: number, monthsToAdd: number, yearsToAdd: number) => {\n const base = focusedDate ?? selectedDate;\n let date: Date | null;\n if (base) {\n date = new Date(\n mode === 'year' ? base.getFullYear() + yearsToAdd : base.getFullYear(),\n mode === 'month' ? base.getMonth() + monthsToAdd : base.getMonth(),\n mode === 'day' ? base.getDate() + daysToAdd : base.getDate(),\n );\n } else {\n date = getStartOfDay(new Date());\n }\n date &&= moveToWithinRange(date, min, max);\n if (date?.getTime() !== focusedDate?.getTime()) {\n setFocusedDate(date);\n onDateFocus?.(date, { isEnabled: checkIsEnabled(date) });\n }\n },\n [focusedDate, selectedDate, min, max, mode, onDateFocus], // eslint-disable-line react-hooks/exhaustive-deps\n );\n\n const handleKeyDown = useCallback(\n (event: KeyboardEvent<HTMLDivElement>) => {\n switch (event.key) {\n case 'ArrowLeft':\n adjustDate(-1, -1, -1);\n event.preventDefault();\n break;\n case 'ArrowUp':\n adjustDate(-7, -4, -4);\n event.preventDefault();\n break;\n case 'ArrowRight':\n adjustDate(1, 1, 1);\n event.preventDefault();\n break;\n case 'ArrowDown':\n adjustDate(7, 4, 4);\n event.preventDefault();\n break;\n case 'Enter':\n case ' ':\n if (\n mode === 'day' &&\n focusedDate &&\n (event.target as HTMLElement).hasAttribute('data-calendar-cell')\n ) {\n handleSelectedDateUpdate(focusedDate);\n event.preventDefault();\n }\n break;\n default:\n break;\n }\n },\n [adjustDate, focusedDate, mode, handleSelectedDateUpdate], \n );\n\n const focusedDateOutOfRange = focusedDate ? !isWithinRange(focusedDate, min, max) : false;\n\n const formatDateForPrompt = (date: Date) =>\n formatDate(date, intl.locale, { day: 'numeric', month: 'long', year: 'numeric' });\n\n const outOfRangePromptText =\n min && max\n ? intl.formatMessage(messages.outOfRangeBetween, {\n min: formatDateForPrompt(min),\n max: formatDateForPrompt(max),\n })\n : min\n ? intl.formatMessage(messages.outOfRangeAfter, { min: formatDateForPrompt(min) })\n : max\n ? intl.formatMessage(messages.outOfRangeBefore, { max: formatDateForPrompt(max) })\n : '';\n\n const hasOutOfRangeDates = mode === 'day' && !!(min || max);\n const showRulesPrompt =\n mode === 'day' &&\n !!disabledRules &&\n hasDisabledDatesInMonth(viewMonth, viewYear, disabledRules, min, max);\n const showOutOfRangePrompt = mode === 'day' && focusedDateOutOfRange;\n const showPrompt = hasOutOfRangeDates || showRulesPrompt;\n\n const promptText = showOutOfRangePrompt\n ? outOfRangePromptText\n : (disabledRules?.reason ?? outOfRangePromptText);\n const promptSentiment = showOutOfRangePrompt || focusedDateDisabled ? 'negative' : 'neutral';\n const promptClassName =\n showOutOfRangePrompt || (showRulesPrompt && !showOutOfRangePrompt) ? 'm-t-1' : 'sr-only';\n\n return (\n // eslint-disable-next-line jsx-a11y/no-static-element-interactions\n <div onKeyDown={handleKeyDown}>\n {mode === 'day' && (\n <DayCalendar\n selectedDate={selectedDate}\n focusedDate={focusedDate}\n min={min}\n max={max}\n viewMonth={viewMonth}\n viewYear={viewYear}\n monthFormat={monthFormat}\n disabledRules={disabledRules}\n disabledReasonId={showPrompt ? disabledReasonId : undefined}\n onSelect={handleSelectedDateUpdate}\n onLabelClick={switchToYears}\n onViewDateUpdate={handleViewDateUpdate}\n />\n )}\n {mode === 'month' && (\n <MonthCalendar\n selectedDate={selectedDate}\n focusedDate={focusedDate}\n min={min}\n max={max}\n viewYear={viewYear}\n {...(placeholder != null && { placeholder })}\n onSelect={switchToDays}\n onLabelClick={switchToYears}\n onViewDateUpdate={handleViewDateUpdate}\n />\n )}\n {mode === 'year' && (\n <YearCalendar\n selectedDate={selectedDate}\n focusedDate={focusedDate}\n min={min}\n max={max}\n viewYear={viewYear}\n {...(placeholder != null && { placeholder })}\n onSelect={switchToMonths}\n onViewDateUpdate={handleViewDateUpdate}\n />\n )}\n {showPrompt && (\n <InlinePrompt\n sentiment={promptSentiment}\n width=\"full\"\n id={disabledReasonId}\n className={promptClassName}\n >\n {promptText}\n </InlinePrompt>\n )}\n </div>\n );\n};\n\nexport default Calendar;\n"],"names":["Calendar","value","min","minProp","max","maxProp","monthFormat","MonthFormat","LONG","placeholder","disabledRules","onDateFocus","onChange","intl","useIntl","selectedDate","getStartOfDay","disabledReasonId","useId","disabledRulesRef","useRef","useEffect","current","focusedDate","setFocusedDate","useState","getTime","checkIsEnabled","date","isWithinRange","isDateDisabled","focusedDateDisabled","clamped","moveToWithinRange","isEnabled","dateView","returnDateView","viewMonth","setViewMonth","getMonth","viewYear","setViewYear","getFullYear","mode","setMode","view","handleViewDateUpdate","useCallback","month","year","undefined","switchToDays","switchToMonths","switchToYears","handleSelectedDateUpdate","adjustDate","daysToAdd","monthsToAdd","yearsToAdd","base","Date","getDate","handleKeyDown","event","key","preventDefault","target","hasAttribute","focusedDateOutOfRange","formatDateForPrompt","formatDate","locale","day","outOfRangePromptText","formatMessage","messages","outOfRangeBetween","outOfRangeAfter","outOfRangeBefore","hasOutOfRangeDates","showRulesPrompt","hasDisabledDatesInMonth","showOutOfRangePrompt","showPrompt","promptText","reason","promptSentiment","promptClassName","_jsxs","onKeyDown","children","_jsx","DayCalendar","onSelect","onLabelClick","onViewDateUpdate","MonthCalendar","YearCalendar","InlinePrompt","sentiment","width","id","className"],"mappings":"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"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { useId, useRef, useEffect, useState, useCallback } from 'react';
|
|
2
2
|
import { useIntl } from 'react-intl';
|
|
3
|
+
import { formatDate } from '@transferwise/formatting';
|
|
3
4
|
import '../common/theme.mjs';
|
|
4
5
|
import '../common/direction.mjs';
|
|
5
6
|
import '@transferwise/neptune-tokens';
|
|
@@ -19,7 +20,6 @@ import '../common/PropsValues/variant.mjs';
|
|
|
19
20
|
import '../common/PropsValues/scroll.mjs';
|
|
20
21
|
import '../common/PropsValues/markdownNodeType.mjs';
|
|
21
22
|
import '../common/fileType.mjs';
|
|
22
|
-
import '@transferwise/formatting';
|
|
23
23
|
import '@transferwise/icons';
|
|
24
24
|
import 'clsx';
|
|
25
25
|
import '../common/CloseButton/CloseButton.messages.mjs';
|
|
@@ -60,11 +60,11 @@ const Calendar = ({
|
|
|
60
60
|
// eslint-disable-next-line react-hooks/set-state-in-effect
|
|
61
61
|
setFocusedDate(selectedDate);
|
|
62
62
|
}, [selectedDate?.getTime()]); // eslint-disable-line react-hooks/exhaustive-deps
|
|
63
|
-
const focusedDateDisabled = focusedDate ? !isWithinRange(focusedDate, min, max) || isDateDisabled(focusedDate, disabledRules) : false;
|
|
64
63
|
const checkIsEnabled = date => {
|
|
65
64
|
if (!date) return true;
|
|
66
65
|
return isWithinRange(date, min, max) && !isDateDisabled(date, disabledRulesRef.current);
|
|
67
66
|
};
|
|
67
|
+
const focusedDateDisabled = focusedDate ? !isWithinRange(focusedDate, min, max) || isDateDisabled(focusedDate, disabledRules) : false;
|
|
68
68
|
useEffect(() => {
|
|
69
69
|
if (selectedDate && !isWithinRange(selectedDate, min, max)) {
|
|
70
70
|
const clamped = moveToWithinRange(selectedDate, min, max);
|
|
@@ -150,24 +150,18 @@ const Calendar = ({
|
|
|
150
150
|
case 'Enter':
|
|
151
151
|
case ' ':
|
|
152
152
|
if (mode === 'day' && focusedDate && event.target.hasAttribute('data-calendar-cell')) {
|
|
153
|
-
|
|
154
|
-
onDateFocus?.(focusedDate, {
|
|
155
|
-
isEnabled
|
|
156
|
-
});
|
|
157
|
-
if (isEnabled && onChange) {
|
|
158
|
-
onChange(focusedDate);
|
|
159
|
-
}
|
|
153
|
+
handleSelectedDateUpdate(focusedDate);
|
|
160
154
|
event.preventDefault();
|
|
161
155
|
}
|
|
162
156
|
break;
|
|
163
157
|
}
|
|
164
|
-
}, [adjustDate, focusedDate, mode,
|
|
158
|
+
}, [adjustDate, focusedDate, mode, handleSelectedDateUpdate]);
|
|
165
159
|
const focusedDateOutOfRange = focusedDate ? !isWithinRange(focusedDate, min, max) : false;
|
|
166
|
-
const formatDateForPrompt = date =>
|
|
160
|
+
const formatDateForPrompt = date => formatDate(date, intl.locale, {
|
|
167
161
|
day: 'numeric',
|
|
168
162
|
month: 'long',
|
|
169
163
|
year: 'numeric'
|
|
170
|
-
})
|
|
164
|
+
});
|
|
171
165
|
const outOfRangePromptText = min && max ? intl.formatMessage(messages.outOfRangeBetween, {
|
|
172
166
|
min: formatDateForPrompt(min),
|
|
173
167
|
max: formatDateForPrompt(max)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Calendar.mjs","sources":["../../src/Calendar/Calendar.tsx"],"sourcesContent":["import { useState, useCallback, useEffect, useId, useRef, KeyboardEvent } from 'react';\nimport { useIntl } from 'react-intl';\n\nimport { MonthFormat } from '../common';\nimport {\n isWithinRange,\n moveToWithinRange,\n returnDateView,\n isDateDisabled,\n hasDisabledDatesInMonth,\n} from '../common/DateUtils';\nimport { InlinePrompt } from '../Prompt/InlinePrompt';\nimport type { DateChangeMeta, DisabledRules } from './Calendar.types';\nimport DayCalendar from './DayCalendar';\nimport { getStartOfDay } from './GetStartOfDay';\nimport messages from './Calendar.messages';\nimport MonthCalendar from './MonthCalendar';\nimport YearCalendar from './YearCalendar';\n\nexport interface CalendarProps {\n /** The currently selected date, or `null` for no selection. */\n value: Date | null;\n /** Earliest selectable date (inclusive). Dates before this are interactive but not selectable, and show a boundary prompt. */\n min?: Date | null;\n /** Latest selectable date (inclusive). Dates after this are interactive but not selectable, and show a boundary prompt. */\n max?: Date | null;\n /** Month name format in the header. Defaults to `'long'` (e.g. \"January\"). */\n monthFormat?: `${MonthFormat}`;\n /** Placeholder text shown in the month/year cells when no date is selected. */\n placeholder?: string;\n /** Rules for disabling specific weekdays, individual dates, or date ranges. The required `reason` is shown in an inline prompt and linked to disabled cells via `aria-describedby` for screen reader accessibility. */\n disabledRules?: DisabledRules;\n /** Called whenever the focused date changes — including disabled and out-of-range dates. `meta.isEnabled` is `false` when the date is not selectable. */\n onDateFocus?: (date: Date | null, meta: DateChangeMeta) => void;\n /** Called when a date is confirmed (click or Enter). Only fires for enabled dates. */\n onChange?: (date: Date) => void;\n}\n\n\n/**\n * Inline calendar for selecting a single date. Powers [DateLookup](?path=/docs/forms-datelookup--docs).\n */\nconst Calendar = ({\n value,\n min: minProp = null,\n max: maxProp = null,\n monthFormat = MonthFormat.LONG,\n placeholder,\n disabledRules,\n onDateFocus,\n onChange,\n}: CalendarProps) => {\n const intl = useIntl();\n const selectedDate = getStartOfDay(value);\n const min = getStartOfDay(minProp);\n const max = getStartOfDay(maxProp);\n const disabledReasonId = useId();\n const disabledRulesRef = useRef(disabledRules);\n useEffect(() => {\n disabledRulesRef.current = disabledRules;\n });\n\n const [focusedDate, setFocusedDate] = useState<Date | null>(selectedDate);\n\n useEffect(() => {\n // eslint-disable-next-line react-hooks/set-state-in-effect\n setFocusedDate(selectedDate);\n }, [selectedDate?.getTime()]); // eslint-disable-line react-hooks/exhaustive-deps\n\n const focusedDateDisabled = focusedDate\n ? !isWithinRange(focusedDate, min, max) || isDateDisabled(focusedDate, disabledRules)\n : false;\n\n const checkIsEnabled = (date: Date | null) => {\n if (!date) return true;\n return isWithinRange(date, min, max) && !isDateDisabled(date, disabledRulesRef.current);\n };\n\n useEffect(() => {\n if (selectedDate && !isWithinRange(selectedDate, min, max)) {\n const clamped = moveToWithinRange(selectedDate, min, max);\n setFocusedDate(clamped); // eslint-disable-line react-hooks/set-state-in-effect\n onDateFocus?.(clamped, { isEnabled: checkIsEnabled(clamped) });\n }\n }, [selectedDate?.getTime(), min?.getTime(), max?.getTime(), onDateFocus]); // eslint-disable-line react-hooks/exhaustive-deps\n\n const dateView = returnDateView(selectedDate, min, max);\n const [viewMonth, setViewMonth] = useState(dateView.getMonth());\n const [viewYear, setViewYear] = useState(dateView.getFullYear());\n const [mode, setMode] = useState<'day' | 'month' | 'year'>('day');\n\n useEffect(() => {\n const view = returnDateView(selectedDate, min, max);\n // eslint-disable-next-line react-hooks/set-state-in-effect\n setViewMonth(view.getMonth());\n\n setViewYear(view.getFullYear());\n }, [selectedDate?.getTime(), min?.getTime(), max?.getTime()]); // eslint-disable-line react-hooks/exhaustive-deps\n\n useEffect(() => {\n if (focusedDate) {\n // eslint-disable-next-line react-hooks/set-state-in-effect\n setViewMonth(focusedDate.getMonth());\n setViewYear(focusedDate.getFullYear());\n }\n }, [focusedDate?.getTime()]); // eslint-disable-line react-hooks/exhaustive-deps\n\n const handleViewDateUpdate = useCallback(\n // eslint-disable-next-line react-hooks/preserve-manual-memoization\n ({ month, year }: { month?: number; year?: number }) => {\n if (month !== undefined) setViewMonth(month);\n if (year !== undefined) setViewYear(year);\n },\n [],\n );\n\n const switchToDays = useCallback(() => setMode('day'), []);\n const switchToMonths = useCallback(() => setMode('month'), []);\n const switchToYears = useCallback(() => setMode('year'), []);\n\n const handleSelectedDateUpdate = useCallback(\n (date: Date) => {\n const isEnabled = checkIsEnabled(date);\n setFocusedDate(date);\n onDateFocus?.(date, { isEnabled });\n if (isEnabled && onChange) {\n onChange(date);\n }\n },\n [onDateFocus, onChange], // eslint-disable-line react-hooks/exhaustive-deps\n );\n\n const adjustDate = useCallback(\n (daysToAdd: number, monthsToAdd: number, yearsToAdd: number) => {\n const base = focusedDate ?? selectedDate;\n let date: Date | null;\n if (base) {\n date = new Date(\n mode === 'year' ? base.getFullYear() + yearsToAdd : base.getFullYear(),\n mode === 'month' ? base.getMonth() + monthsToAdd : base.getMonth(),\n mode === 'day' ? base.getDate() + daysToAdd : base.getDate(),\n );\n } else {\n date = getStartOfDay(new Date());\n }\n date &&= moveToWithinRange(date, min, max);\n if (date?.getTime() !== focusedDate?.getTime()) {\n setFocusedDate(date);\n onDateFocus?.(date, { isEnabled: checkIsEnabled(date) });\n }\n },\n [focusedDate, selectedDate, min, max, mode, onDateFocus], // eslint-disable-line react-hooks/exhaustive-deps\n );\n\n const handleKeyDown = useCallback(\n (event: KeyboardEvent<HTMLDivElement>) => {\n switch (event.key) {\n case 'ArrowLeft':\n adjustDate(-1, -1, -1);\n event.preventDefault();\n break;\n case 'ArrowUp':\n adjustDate(-7, -4, -4);\n event.preventDefault();\n break;\n case 'ArrowRight':\n adjustDate(1, 1, 1);\n event.preventDefault();\n break;\n case 'ArrowDown':\n adjustDate(7, 4, 4);\n event.preventDefault();\n break;\n case 'Enter':\n case ' ':\n if (\n mode === 'day' &&\n focusedDate &&\n (event.target as HTMLElement).hasAttribute('data-calendar-cell')\n ) {\n const isEnabled = checkIsEnabled(focusedDate);\n onDateFocus?.(focusedDate, { isEnabled });\n if (isEnabled && onChange) {\n onChange(focusedDate);\n }\n event.preventDefault();\n }\n break;\n default:\n break;\n }\n },\n [adjustDate, focusedDate, mode, onDateFocus, onChange], // eslint-disable-line react-hooks/exhaustive-deps\n );\n\n const focusedDateOutOfRange = focusedDate ? !isWithinRange(focusedDate, min, max) : false;\n\n const formatDateForPrompt = (date: Date) =>\n new Intl.DateTimeFormat(intl.locale, { day: 'numeric', month: 'long', year: 'numeric' }).format(\n date,\n );\n\n const outOfRangePromptText =\n min && max\n ? intl.formatMessage(messages.outOfRangeBetween, {\n min: formatDateForPrompt(min),\n max: formatDateForPrompt(max),\n })\n : min\n ? intl.formatMessage(messages.outOfRangeAfter, { min: formatDateForPrompt(min) })\n : max\n ? intl.formatMessage(messages.outOfRangeBefore, { max: formatDateForPrompt(max) })\n : '';\n\n const hasOutOfRangeDates = mode === 'day' && !!(min || max);\n const showRulesPrompt =\n mode === 'day' &&\n !!disabledRules &&\n hasDisabledDatesInMonth(viewMonth, viewYear, disabledRules, min, max);\n const showOutOfRangePrompt = mode === 'day' && focusedDateOutOfRange;\n const showPrompt = hasOutOfRangeDates || showRulesPrompt;\n\n const promptText = showOutOfRangePrompt\n ? outOfRangePromptText\n : (disabledRules?.reason ?? outOfRangePromptText);\n const promptSentiment = showOutOfRangePrompt || focusedDateDisabled ? 'negative' : 'neutral';\n const promptClassName =\n showOutOfRangePrompt || (showRulesPrompt && !showOutOfRangePrompt) ? 'm-t-1' : 'sr-only';\n\n return (\n // eslint-disable-next-line jsx-a11y/no-static-element-interactions\n <div onKeyDown={handleKeyDown}>\n {mode === 'day' && (\n <DayCalendar\n selectedDate={selectedDate}\n focusedDate={focusedDate}\n min={min}\n max={max}\n viewMonth={viewMonth}\n viewYear={viewYear}\n monthFormat={monthFormat}\n disabledRules={disabledRules}\n disabledReasonId={showPrompt ? disabledReasonId : undefined}\n onSelect={handleSelectedDateUpdate}\n onLabelClick={switchToYears}\n onViewDateUpdate={handleViewDateUpdate}\n />\n )}\n {mode === 'month' && (\n <MonthCalendar\n selectedDate={selectedDate}\n focusedDate={focusedDate}\n min={min}\n max={max}\n viewYear={viewYear}\n {...(placeholder != null && { placeholder })}\n onSelect={switchToDays}\n onLabelClick={switchToYears}\n onViewDateUpdate={handleViewDateUpdate}\n />\n )}\n {mode === 'year' && (\n <YearCalendar\n selectedDate={selectedDate}\n focusedDate={focusedDate}\n min={min}\n max={max}\n viewYear={viewYear}\n {...(placeholder != null && { placeholder })}\n onSelect={switchToMonths}\n onViewDateUpdate={handleViewDateUpdate}\n />\n )}\n {showPrompt && (\n <InlinePrompt\n sentiment={promptSentiment}\n width=\"full\"\n id={disabledReasonId}\n className={promptClassName}\n >\n {promptText}\n </InlinePrompt>\n )}\n </div>\n );\n};\n\nexport default Calendar;\n"],"names":["Calendar","value","min","minProp","max","maxProp","monthFormat","MonthFormat","LONG","placeholder","disabledRules","onDateFocus","onChange","intl","useIntl","selectedDate","getStartOfDay","disabledReasonId","useId","disabledRulesRef","useRef","useEffect","current","focusedDate","setFocusedDate","useState","getTime","focusedDateDisabled","isWithinRange","isDateDisabled","checkIsEnabled","date","clamped","moveToWithinRange","isEnabled","dateView","returnDateView","viewMonth","setViewMonth","getMonth","viewYear","setViewYear","getFullYear","mode","setMode","view","handleViewDateUpdate","useCallback","month","year","undefined","switchToDays","switchToMonths","switchToYears","handleSelectedDateUpdate","adjustDate","daysToAdd","monthsToAdd","yearsToAdd","base","Date","getDate","handleKeyDown","event","key","preventDefault","target","hasAttribute","focusedDateOutOfRange","formatDateForPrompt","Intl","DateTimeFormat","locale","day","format","outOfRangePromptText","formatMessage","messages","outOfRangeBetween","outOfRangeAfter","outOfRangeBefore","hasOutOfRangeDates","showRulesPrompt","hasDisabledDatesInMonth","showOutOfRangePrompt","showPrompt","promptText","reason","promptSentiment","promptClassName","_jsxs","onKeyDown","children","_jsx","DayCalendar","onSelect","onLabelClick","onViewDateUpdate","MonthCalendar","YearCalendar","InlinePrompt","sentiment","width","id","className"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Calendar.mjs","sources":["../../src/Calendar/Calendar.tsx"],"sourcesContent":["import { useState, useCallback, useEffect, useId, useRef, KeyboardEvent } from 'react';\nimport { useIntl } from 'react-intl';\nimport { formatDate } from '@transferwise/formatting';\n\nimport { MonthFormat } from '../common';\nimport {\n isWithinRange,\n moveToWithinRange,\n returnDateView,\n isDateDisabled,\n hasDisabledDatesInMonth,\n} from '../common/DateUtils';\nimport { InlinePrompt } from '../Prompt/InlinePrompt';\nimport type { DateChangeMeta, DisabledRules } from './Calendar.types';\nimport DayCalendar from './DayCalendar';\nimport { getStartOfDay } from './GetStartOfDay';\nimport messages from './Calendar.messages';\nimport MonthCalendar from './MonthCalendar';\nimport YearCalendar from './YearCalendar';\n\nexport interface CalendarProps {\n /** The currently selected date, or `null` for no selection. */\n value: Date | null;\n /** Earliest selectable date (inclusive). Dates before this are interactive but not selectable, and show a boundary prompt. */\n min?: Date | null;\n /** Latest selectable date (inclusive). Dates after this are interactive but not selectable, and show a boundary prompt. */\n max?: Date | null;\n /** Month name format in the header. Defaults to `'long'` (e.g. \"January\"). */\n monthFormat?: `${MonthFormat}`;\n /** Placeholder text shown in the month/year cells when no date is selected. */\n placeholder?: string;\n /** Rules for disabling specific weekdays, individual dates, or date ranges. The required `reason` is shown in an inline prompt and linked to disabled cells via `aria-describedby` for screen reader accessibility. */\n disabledRules?: DisabledRules;\n /** Called whenever the focused date changes — including disabled and out-of-range dates. `meta.isEnabled` is `false` when the date is not selectable. */\n onDateFocus?: (date: Date | null, meta: DateChangeMeta) => void;\n /** Called when a date is confirmed (click or Enter). Only fires for enabled dates. */\n onChange?: (date: Date) => void;\n}\n\n/**\n * Inline calendar for selecting a single date. Powers [DateLookup](?path=/docs/forms-datelookup--docs).\n */\nconst Calendar = ({\n value,\n min: minProp = null,\n max: maxProp = null,\n monthFormat = MonthFormat.LONG,\n placeholder,\n disabledRules,\n onDateFocus,\n onChange,\n}: CalendarProps) => {\n const intl = useIntl();\n const selectedDate = getStartOfDay(value);\n const min = getStartOfDay(minProp);\n const max = getStartOfDay(maxProp);\n const disabledReasonId = useId();\n const disabledRulesRef = useRef(disabledRules);\n useEffect(() => {\n disabledRulesRef.current = disabledRules;\n });\n\n const [focusedDate, setFocusedDate] = useState<Date | null>(selectedDate);\n\n useEffect(() => {\n // eslint-disable-next-line react-hooks/set-state-in-effect\n setFocusedDate(selectedDate);\n }, [selectedDate?.getTime()]); // eslint-disable-line react-hooks/exhaustive-deps\n\n const checkIsEnabled = (date: Date | null) => {\n if (!date) return true;\n return isWithinRange(date, min, max) && !isDateDisabled(date, disabledRulesRef.current);\n };\n\n const focusedDateDisabled = focusedDate\n ? !isWithinRange(focusedDate, min, max) || isDateDisabled(focusedDate, disabledRules)\n : false;\n\n useEffect(() => {\n if (selectedDate && !isWithinRange(selectedDate, min, max)) {\n const clamped = moveToWithinRange(selectedDate, min, max);\n setFocusedDate(clamped); // eslint-disable-line react-hooks/set-state-in-effect\n onDateFocus?.(clamped, { isEnabled: checkIsEnabled(clamped) });\n }\n }, [selectedDate?.getTime(), min?.getTime(), max?.getTime(), onDateFocus]); // eslint-disable-line react-hooks/exhaustive-deps\n\n const dateView = returnDateView(selectedDate, min, max);\n const [viewMonth, setViewMonth] = useState(dateView.getMonth());\n const [viewYear, setViewYear] = useState(dateView.getFullYear());\n const [mode, setMode] = useState<'day' | 'month' | 'year'>('day');\n\n useEffect(() => {\n const view = returnDateView(selectedDate, min, max);\n // eslint-disable-next-line react-hooks/set-state-in-effect\n setViewMonth(view.getMonth());\n\n setViewYear(view.getFullYear());\n }, [selectedDate?.getTime(), min?.getTime(), max?.getTime()]); // eslint-disable-line react-hooks/exhaustive-deps\n\n useEffect(() => {\n if (focusedDate) {\n // eslint-disable-next-line react-hooks/set-state-in-effect\n setViewMonth(focusedDate.getMonth());\n setViewYear(focusedDate.getFullYear());\n }\n }, [focusedDate?.getTime()]); // eslint-disable-line react-hooks/exhaustive-deps\n\n const handleViewDateUpdate = useCallback(\n // eslint-disable-next-line react-hooks/preserve-manual-memoization\n ({ month, year }: { month?: number; year?: number }) => {\n if (month !== undefined) setViewMonth(month);\n if (year !== undefined) setViewYear(year);\n },\n [],\n );\n\n const switchToDays = useCallback(() => setMode('day'), []);\n const switchToMonths = useCallback(() => setMode('month'), []);\n const switchToYears = useCallback(() => setMode('year'), []);\n\n const handleSelectedDateUpdate = useCallback(\n (date: Date) => {\n const isEnabled = checkIsEnabled(date);\n setFocusedDate(date);\n onDateFocus?.(date, { isEnabled });\n if (isEnabled && onChange) {\n onChange(date);\n }\n },\n [onDateFocus, onChange], // eslint-disable-line react-hooks/exhaustive-deps\n );\n\n const adjustDate = useCallback(\n (daysToAdd: number, monthsToAdd: number, yearsToAdd: number) => {\n const base = focusedDate ?? selectedDate;\n let date: Date | null;\n if (base) {\n date = new Date(\n mode === 'year' ? base.getFullYear() + yearsToAdd : base.getFullYear(),\n mode === 'month' ? base.getMonth() + monthsToAdd : base.getMonth(),\n mode === 'day' ? base.getDate() + daysToAdd : base.getDate(),\n );\n } else {\n date = getStartOfDay(new Date());\n }\n date &&= moveToWithinRange(date, min, max);\n if (date?.getTime() !== focusedDate?.getTime()) {\n setFocusedDate(date);\n onDateFocus?.(date, { isEnabled: checkIsEnabled(date) });\n }\n },\n [focusedDate, selectedDate, min, max, mode, onDateFocus], // eslint-disable-line react-hooks/exhaustive-deps\n );\n\n const handleKeyDown = useCallback(\n (event: KeyboardEvent<HTMLDivElement>) => {\n switch (event.key) {\n case 'ArrowLeft':\n adjustDate(-1, -1, -1);\n event.preventDefault();\n break;\n case 'ArrowUp':\n adjustDate(-7, -4, -4);\n event.preventDefault();\n break;\n case 'ArrowRight':\n adjustDate(1, 1, 1);\n event.preventDefault();\n break;\n case 'ArrowDown':\n adjustDate(7, 4, 4);\n event.preventDefault();\n break;\n case 'Enter':\n case ' ':\n if (\n mode === 'day' &&\n focusedDate &&\n (event.target as HTMLElement).hasAttribute('data-calendar-cell')\n ) {\n handleSelectedDateUpdate(focusedDate);\n event.preventDefault();\n }\n break;\n default:\n break;\n }\n },\n [adjustDate, focusedDate, mode, handleSelectedDateUpdate], \n );\n\n const focusedDateOutOfRange = focusedDate ? !isWithinRange(focusedDate, min, max) : false;\n\n const formatDateForPrompt = (date: Date) =>\n formatDate(date, intl.locale, { day: 'numeric', month: 'long', year: 'numeric' });\n\n const outOfRangePromptText =\n min && max\n ? intl.formatMessage(messages.outOfRangeBetween, {\n min: formatDateForPrompt(min),\n max: formatDateForPrompt(max),\n })\n : min\n ? intl.formatMessage(messages.outOfRangeAfter, { min: formatDateForPrompt(min) })\n : max\n ? intl.formatMessage(messages.outOfRangeBefore, { max: formatDateForPrompt(max) })\n : '';\n\n const hasOutOfRangeDates = mode === 'day' && !!(min || max);\n const showRulesPrompt =\n mode === 'day' &&\n !!disabledRules &&\n hasDisabledDatesInMonth(viewMonth, viewYear, disabledRules, min, max);\n const showOutOfRangePrompt = mode === 'day' && focusedDateOutOfRange;\n const showPrompt = hasOutOfRangeDates || showRulesPrompt;\n\n const promptText = showOutOfRangePrompt\n ? outOfRangePromptText\n : (disabledRules?.reason ?? outOfRangePromptText);\n const promptSentiment = showOutOfRangePrompt || focusedDateDisabled ? 'negative' : 'neutral';\n const promptClassName =\n showOutOfRangePrompt || (showRulesPrompt && !showOutOfRangePrompt) ? 'm-t-1' : 'sr-only';\n\n return (\n // eslint-disable-next-line jsx-a11y/no-static-element-interactions\n <div onKeyDown={handleKeyDown}>\n {mode === 'day' && (\n <DayCalendar\n selectedDate={selectedDate}\n focusedDate={focusedDate}\n min={min}\n max={max}\n viewMonth={viewMonth}\n viewYear={viewYear}\n monthFormat={monthFormat}\n disabledRules={disabledRules}\n disabledReasonId={showPrompt ? disabledReasonId : undefined}\n onSelect={handleSelectedDateUpdate}\n onLabelClick={switchToYears}\n onViewDateUpdate={handleViewDateUpdate}\n />\n )}\n {mode === 'month' && (\n <MonthCalendar\n selectedDate={selectedDate}\n focusedDate={focusedDate}\n min={min}\n max={max}\n viewYear={viewYear}\n {...(placeholder != null && { placeholder })}\n onSelect={switchToDays}\n onLabelClick={switchToYears}\n onViewDateUpdate={handleViewDateUpdate}\n />\n )}\n {mode === 'year' && (\n <YearCalendar\n selectedDate={selectedDate}\n focusedDate={focusedDate}\n min={min}\n max={max}\n viewYear={viewYear}\n {...(placeholder != null && { placeholder })}\n onSelect={switchToMonths}\n onViewDateUpdate={handleViewDateUpdate}\n />\n )}\n {showPrompt && (\n <InlinePrompt\n sentiment={promptSentiment}\n width=\"full\"\n id={disabledReasonId}\n className={promptClassName}\n >\n {promptText}\n </InlinePrompt>\n )}\n </div>\n );\n};\n\nexport default Calendar;\n"],"names":["Calendar","value","min","minProp","max","maxProp","monthFormat","MonthFormat","LONG","placeholder","disabledRules","onDateFocus","onChange","intl","useIntl","selectedDate","getStartOfDay","disabledReasonId","useId","disabledRulesRef","useRef","useEffect","current","focusedDate","setFocusedDate","useState","getTime","checkIsEnabled","date","isWithinRange","isDateDisabled","focusedDateDisabled","clamped","moveToWithinRange","isEnabled","dateView","returnDateView","viewMonth","setViewMonth","getMonth","viewYear","setViewYear","getFullYear","mode","setMode","view","handleViewDateUpdate","useCallback","month","year","undefined","switchToDays","switchToMonths","switchToYears","handleSelectedDateUpdate","adjustDate","daysToAdd","monthsToAdd","yearsToAdd","base","Date","getDate","handleKeyDown","event","key","preventDefault","target","hasAttribute","focusedDateOutOfRange","formatDateForPrompt","formatDate","locale","day","outOfRangePromptText","formatMessage","messages","outOfRangeBetween","outOfRangeAfter","outOfRangeBefore","hasOutOfRangeDates","showRulesPrompt","hasDisabledDatesInMonth","showOutOfRangePrompt","showPrompt","promptText","reason","promptSentiment","promptClassName","_jsxs","onKeyDown","children","_jsx","DayCalendar","onSelect","onLabelClick","onViewDateUpdate","MonthCalendar","YearCalendar","InlinePrompt","sentiment","width","id","className"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA0CA,MAAMA,QAAQ,GAAGA,CAAC;EAChBC,KAAK;EACLC,GAAG,EAAEC,OAAO,GAAG,IAAI;EACnBC,GAAG,EAAEC,OAAO,GAAG,IAAI;EACnBC,WAAW,GAAGC,WAAW,CAACC,IAAI;EAC9BC,WAAW;EACXC,aAAa;EACbC,WAAW;AACXC,EAAAA;AAAQ,CACM,KAAI;AAClB,EAAA,MAAMC,IAAI,GAAGC,OAAO,EAAE;AACtB,EAAA,MAAMC,YAAY,GAAGC,aAAa,CAACf,KAAK,CAAC;AACzC,EAAA,MAAMC,GAAG,GAAGc,aAAa,CAACb,OAAO,CAAC;AAClC,EAAA,MAAMC,GAAG,GAAGY,aAAa,CAACX,OAAO,CAAC;AAClC,EAAA,MAAMY,gBAAgB,GAAGC,KAAK,EAAE;AAChC,EAAA,MAAMC,gBAAgB,GAAGC,MAAM,CAACV,aAAa,CAAC;AAC9CW,EAAAA,SAAS,CAAC,MAAK;IACbF,gBAAgB,CAACG,OAAO,GAAGZ,aAAa;AAC1C,EAAA,CAAC,CAAC;EAEF,MAAM,CAACa,WAAW,EAAEC,cAAc,CAAC,GAAGC,QAAQ,CAAcV,YAAY,CAAC;AAEzEM,EAAAA,SAAS,CAAC,MAAK;AACb;IACAG,cAAc,CAACT,YAAY,CAAC;EAC9B,CAAC,EAAE,CAACA,YAAY,EAAEW,OAAO,EAAE,CAAC,CAAC,CAAC;EAE9B,MAAMC,cAAc,GAAIC,IAAiB,IAAI;AAC3C,IAAA,IAAI,CAACA,IAAI,EAAE,OAAO,IAAI;AACtB,IAAA,OAAOC,aAAa,CAACD,IAAI,EAAE1B,GAAG,EAAEE,GAAG,CAAC,IAAI,CAAC0B,cAAc,CAACF,IAAI,EAAET,gBAAgB,CAACG,OAAO,CAAC;EACzF,CAAC;EAED,MAAMS,mBAAmB,GAAGR,WAAW,GACnC,CAACM,aAAa,CAACN,WAAW,EAAErB,GAAG,EAAEE,GAAG,CAAC,IAAI0B,cAAc,CAACP,WAAW,EAAEb,aAAa,CAAC,GACnF,KAAK;AAETW,EAAAA,SAAS,CAAC,MAAK;IACb,IAAIN,YAAY,IAAI,CAACc,aAAa,CAACd,YAAY,EAAEb,GAAG,EAAEE,GAAG,CAAC,EAAE;MAC1D,MAAM4B,OAAO,GAAGC,iBAAiB,CAAClB,YAAY,EAAEb,GAAG,EAAEE,GAAG,CAAC;AACzDoB,MAAAA,cAAc,CAACQ,OAAO,CAAC,CAAC;MACxBrB,WAAW,GAAGqB,OAAO,EAAE;QAAEE,SAAS,EAAEP,cAAc,CAACK,OAAO;AAAC,OAAE,CAAC;AAChE,IAAA;EACF,CAAC,EAAE,CAACjB,YAAY,EAAEW,OAAO,EAAE,EAAExB,GAAG,EAAEwB,OAAO,EAAE,EAAEtB,GAAG,EAAEsB,OAAO,EAAE,EAAEf,WAAW,CAAC,CAAC,CAAC;EAE3E,MAAMwB,QAAQ,GAAGC,cAAc,CAACrB,YAAY,EAAEb,GAAG,EAAEE,GAAG,CAAC;AACvD,EAAA,MAAM,CAACiC,SAAS,EAAEC,YAAY,CAAC,GAAGb,QAAQ,CAACU,QAAQ,CAACI,QAAQ,EAAE,CAAC;AAC/D,EAAA,MAAM,CAACC,QAAQ,EAAEC,WAAW,CAAC,GAAGhB,QAAQ,CAACU,QAAQ,CAACO,WAAW,EAAE,CAAC;EAChE,MAAM,CAACC,IAAI,EAAEC,OAAO,CAAC,GAAGnB,QAAQ,CAA2B,KAAK,CAAC;AAEjEJ,EAAAA,SAAS,CAAC,MAAK;IACb,MAAMwB,IAAI,GAAGT,cAAc,CAACrB,YAAY,EAAEb,GAAG,EAAEE,GAAG,CAAC;AACnD;AACAkC,IAAAA,YAAY,CAACO,IAAI,CAACN,QAAQ,EAAE,CAAC;AAE7BE,IAAAA,WAAW,CAACI,IAAI,CAACH,WAAW,EAAE,CAAC;EACjC,CAAC,EAAE,CAAC3B,YAAY,EAAEW,OAAO,EAAE,EAAExB,GAAG,EAAEwB,OAAO,EAAE,EAAEtB,GAAG,EAAEsB,OAAO,EAAE,CAAC,CAAC,CAAC;AAE9DL,EAAAA,SAAS,CAAC,MAAK;AACb,IAAA,IAAIE,WAAW,EAAE;AACf;AACAe,MAAAA,YAAY,CAACf,WAAW,CAACgB,QAAQ,EAAE,CAAC;AACpCE,MAAAA,WAAW,CAAClB,WAAW,CAACmB,WAAW,EAAE,CAAC;AACxC,IAAA;EACF,CAAC,EAAE,CAACnB,WAAW,EAAEG,OAAO,EAAE,CAAC,CAAC,CAAC;EAE7B,MAAMoB,oBAAoB,GAAGC,WAAW;AACtC;EACA,CAAC;IAAEC,KAAK;AAAEC,IAAAA;AAAI,GAAqC,KAAI;AACrD,IAAA,IAAID,KAAK,KAAKE,SAAS,EAAEZ,YAAY,CAACU,KAAK,CAAC;AAC5C,IAAA,IAAIC,IAAI,KAAKC,SAAS,EAAET,WAAW,CAACQ,IAAI,CAAC;EAC3C,CAAC,EACD,EAAE,CACH;EAED,MAAME,YAAY,GAAGJ,WAAW,CAAC,MAAMH,OAAO,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC;EAC1D,MAAMQ,cAAc,GAAGL,WAAW,CAAC,MAAMH,OAAO,CAAC,OAAO,CAAC,EAAE,EAAE,CAAC;EAC9D,MAAMS,aAAa,GAAGN,WAAW,CAAC,MAAMH,OAAO,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;AAE5D,EAAA,MAAMU,wBAAwB,GAAGP,WAAW,CACzCnB,IAAU,IAAI;AACb,IAAA,MAAMM,SAAS,GAAGP,cAAc,CAACC,IAAI,CAAC;IACtCJ,cAAc,CAACI,IAAI,CAAC;IACpBjB,WAAW,GAAGiB,IAAI,EAAE;AAAEM,MAAAA;AAAS,KAAE,CAAC;IAClC,IAAIA,SAAS,IAAItB,QAAQ,EAAE;MACzBA,QAAQ,CAACgB,IAAI,CAAC;AAChB,IAAA;AACF,EAAA,CAAC,EACD,CAACjB,WAAW,EAAEC,QAAQ,CAAC,CACxB;EAED,MAAM2C,UAAU,GAAGR,WAAW,CAC5B,CAACS,SAAiB,EAAEC,WAAmB,EAAEC,UAAkB,KAAI;AAC7D,IAAA,MAAMC,IAAI,GAAGpC,WAAW,IAAIR,YAAY;AACxC,IAAA,IAAIa,IAAiB;AACrB,IAAA,IAAI+B,IAAI,EAAE;MACR/B,IAAI,GAAG,IAAIgC,IAAI,CACbjB,IAAI,KAAK,MAAM,GAAGgB,IAAI,CAACjB,WAAW,EAAE,GAAGgB,UAAU,GAAGC,IAAI,CAACjB,WAAW,EAAE,EACtEC,IAAI,KAAK,OAAO,GAAGgB,IAAI,CAACpB,QAAQ,EAAE,GAAGkB,WAAW,GAAGE,IAAI,CAACpB,QAAQ,EAAE,EAClEI,IAAI,KAAK,KAAK,GAAGgB,IAAI,CAACE,OAAO,EAAE,GAAGL,SAAS,GAAGG,IAAI,CAACE,OAAO,EAAE,CAC7D;AACH,IAAA,CAAC,MAAM;AACLjC,MAAAA,IAAI,GAAGZ,aAAa,CAAC,IAAI4C,IAAI,EAAE,CAAC;AAClC,IAAA;IACAhC,IAAI,KAAKK,iBAAiB,CAACL,IAAI,EAAE1B,GAAG,EAAEE,GAAG,CAAC;IAC1C,IAAIwB,IAAI,EAAEF,OAAO,EAAE,KAAKH,WAAW,EAAEG,OAAO,EAAE,EAAE;MAC9CF,cAAc,CAACI,IAAI,CAAC;MACpBjB,WAAW,GAAGiB,IAAI,EAAE;QAAEM,SAAS,EAAEP,cAAc,CAACC,IAAI;AAAC,OAAE,CAAC;AAC1D,IAAA;AACF,EAAA,CAAC,EACD,CAACL,WAAW,EAAER,YAAY,EAAEb,GAAG,EAAEE,GAAG,EAAEuC,IAAI,EAAEhC,WAAW,CAAC,CACzD;AAED,EAAA,MAAMmD,aAAa,GAAGf,WAAW,CAC9BgB,KAAoC,IAAI;IACvC,QAAQA,KAAK,CAACC,GAAG;AACf,MAAA,KAAK,WAAW;QACdT,UAAU,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC;QACtBQ,KAAK,CAACE,cAAc,EAAE;AACtB,QAAA;AACF,MAAA,KAAK,SAAS;QACZV,UAAU,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC;QACtBQ,KAAK,CAACE,cAAc,EAAE;AACtB,QAAA;AACF,MAAA,KAAK,YAAY;AACfV,QAAAA,UAAU,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;QACnBQ,KAAK,CAACE,cAAc,EAAE;AACtB,QAAA;AACF,MAAA,KAAK,WAAW;AACdV,QAAAA,UAAU,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;QACnBQ,KAAK,CAACE,cAAc,EAAE;AACtB,QAAA;AACF,MAAA,KAAK,OAAO;AACZ,MAAA,KAAK,GAAG;AACN,QAAA,IACEtB,IAAI,KAAK,KAAK,IACdpB,WAAW,IACVwC,KAAK,CAACG,MAAsB,CAACC,YAAY,CAAC,oBAAoB,CAAC,EAChE;UACAb,wBAAwB,CAAC/B,WAAW,CAAC;UACrCwC,KAAK,CAACE,cAAc,EAAE;AACxB,QAAA;AACA,QAAA;AAGJ;EACF,CAAC,EACD,CAACV,UAAU,EAAEhC,WAAW,EAAEoB,IAAI,EAAEW,wBAAwB,CAAC,CAC1D;AAED,EAAA,MAAMc,qBAAqB,GAAG7C,WAAW,GAAG,CAACM,aAAa,CAACN,WAAW,EAAErB,GAAG,EAAEE,GAAG,CAAC,GAAG,KAAK;EAEzF,MAAMiE,mBAAmB,GAAIzC,IAAU,IACrC0C,UAAU,CAAC1C,IAAI,EAAEf,IAAI,CAAC0D,MAAM,EAAE;AAAEC,IAAAA,GAAG,EAAE,SAAS;AAAExB,IAAAA,KAAK,EAAE,MAAM;AAAEC,IAAAA,IAAI,EAAE;AAAS,GAAE,CAAC;AAEnF,EAAA,MAAMwB,oBAAoB,GACxBvE,GAAG,IAAIE,GAAG,GACNS,IAAI,CAAC6D,aAAa,CAACC,QAAQ,CAACC,iBAAiB,EAAE;AAC7C1E,IAAAA,GAAG,EAAEmE,mBAAmB,CAACnE,GAAG,CAAC;IAC7BE,GAAG,EAAEiE,mBAAmB,CAACjE,GAAG;GAC7B,CAAC,GACFF,GAAG,GACDW,IAAI,CAAC6D,aAAa,CAACC,QAAQ,CAACE,eAAe,EAAE;IAAE3E,GAAG,EAAEmE,mBAAmB,CAACnE,GAAG;GAAG,CAAC,GAC/EE,GAAG,GACDS,IAAI,CAAC6D,aAAa,CAACC,QAAQ,CAACG,gBAAgB,EAAE;IAAE1E,GAAG,EAAEiE,mBAAmB,CAACjE,GAAG;GAAG,CAAC,GAChF,EAAE;EAEZ,MAAM2E,kBAAkB,GAAGpC,IAAI,KAAK,KAAK,IAAI,CAAC,EAAEzC,GAAG,IAAIE,GAAG,CAAC;EAC3D,MAAM4E,eAAe,GACnBrC,IAAI,KAAK,KAAK,IACd,CAAC,CAACjC,aAAa,IACfuE,uBAAuB,CAAC5C,SAAS,EAAEG,QAAQ,EAAE9B,aAAa,EAAER,GAAG,EAAEE,GAAG,CAAC;AACvE,EAAA,MAAM8E,oBAAoB,GAAGvC,IAAI,KAAK,KAAK,IAAIyB,qBAAqB;AACpE,EAAA,MAAMe,UAAU,GAAGJ,kBAAkB,IAAIC,eAAe;EAExD,MAAMI,UAAU,GAAGF,oBAAoB,GACnCT,oBAAoB,GACnB/D,aAAa,EAAE2E,MAAM,IAAIZ,oBAAqB;EACnD,MAAMa,eAAe,GAAGJ,oBAAoB,IAAInD,mBAAmB,GAAG,UAAU,GAAG,SAAS;EAC5F,MAAMwD,eAAe,GACnBL,oBAAoB,IAAKF,eAAe,IAAI,CAACE,oBAAqB,GAAG,OAAO,GAAG,SAAS;AAE1F,EAAA;AAAA;AACE;IACAM,IAAA,CAAA,KAAA,EAAA;AAAKC,MAAAA,SAAS,EAAE3B,aAAc;AAAA4B,MAAAA,QAAA,GAC3B/C,IAAI,KAAK,KAAK,iBACbgD,GAAA,CAACC,WAAW,EAAA;AACV7E,QAAAA,YAAY,EAAEA,YAAa;AAC3BQ,QAAAA,WAAW,EAAEA,WAAY;AACzBrB,QAAAA,GAAG,EAAEA,GAAI;AACTE,QAAAA,GAAG,EAAEA,GAAI;AACTiC,QAAAA,SAAS,EAAEA,SAAU;AACrBG,QAAAA,QAAQ,EAAEA,QAAS;AACnBlC,QAAAA,WAAW,EAAEA,WAAY;AACzBI,QAAAA,aAAa,EAAEA,aAAc;AAC7BO,QAAAA,gBAAgB,EAAEkE,UAAU,GAAGlE,gBAAgB,GAAGiC,SAAU;AAC5D2C,QAAAA,QAAQ,EAAEvC,wBAAyB;AACnCwC,QAAAA,YAAY,EAAEzC,aAAc;AAC5B0C,QAAAA,gBAAgB,EAAEjD;OAAqB,CAE1C,EACAH,IAAI,KAAK,OAAO,iBACfgD,GAAA,CAACK,aAAa,EAAA;AACZjF,QAAAA,YAAY,EAAEA,YAAa;AAC3BQ,QAAAA,WAAW,EAAEA,WAAY;AACzBrB,QAAAA,GAAG,EAAEA,GAAI;AACTE,QAAAA,GAAG,EAAEA,GAAI;AACToC,QAAAA,QAAQ,EAAEA,QAAS;QAAA,IACd/B,WAAW,IAAI,IAAI,IAAI;AAAEA,UAAAA;SAAa,CAAA;AAC3CoF,QAAAA,QAAQ,EAAE1C,YAAa;AACvB2C,QAAAA,YAAY,EAAEzC,aAAc;AAC5B0C,QAAAA,gBAAgB,EAAEjD;OAAqB,CAE1C,EACAH,IAAI,KAAK,MAAM,iBACdgD,GAAA,CAACM,YAAY,EAAA;AACXlF,QAAAA,YAAY,EAAEA,YAAa;AAC3BQ,QAAAA,WAAW,EAAEA,WAAY;AACzBrB,QAAAA,GAAG,EAAEA,GAAI;AACTE,QAAAA,GAAG,EAAEA,GAAI;AACToC,QAAAA,QAAQ,EAAEA,QAAS;QAAA,IACd/B,WAAW,IAAI,IAAI,IAAI;AAAEA,UAAAA;SAAa,CAAA;AAC3CoF,QAAAA,QAAQ,EAAEzC,cAAe;AACzB2C,QAAAA,gBAAgB,EAAEjD;AAAqB,OAAA,CAE1C,EACAqC,UAAU,iBACTQ,GAAA,CAACO,YAAY,EAAA;AACXC,QAAAA,SAAS,EAAEb,eAAgB;AAC3Bc,QAAAA,KAAK,EAAC,MAAM;AACZC,QAAAA,EAAE,EAAEpF,gBAAiB;AACrBqF,QAAAA,SAAS,EAAEf,eAAgB;AAAAG,QAAAA,QAAA,EAE1BN;AAAU,OACC,CACf;KACE;AAAC;AAEV;;;;"}
|
|
@@ -24,7 +24,7 @@ function isDateDisabled(date, disabledRules) {
|
|
|
24
24
|
}
|
|
25
25
|
}
|
|
26
26
|
if (disabledRules.ranges?.length) {
|
|
27
|
-
const dateStart =
|
|
27
|
+
const dateStart = date.getTime();
|
|
28
28
|
if (disabledRules.ranges.some(range => {
|
|
29
29
|
const rangeStart = new Date(range.start.getFullYear(), range.start.getMonth(), range.start.getDate()).getTime();
|
|
30
30
|
const rangeEnd = new Date(range.end.getFullYear(), range.end.getMonth(), range.end.getDate()).getTime();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"isDateDisabled.js","sources":["../../../../src/common/DateUtils/isDateDisabled/isDateDisabled.ts"],"sourcesContent":["import type { DisabledRules, WeekDayType } from '../../../Calendar/Calendar.types';\n\nconst DAY_INDEX_TO_WEEKDAY: Record<number, WeekDayType> = {\n 0: 'sun',\n 1: 'mon',\n 2: 'tue',\n 3: 'wed',\n 4: 'thu',\n 5: 'fri',\n 6: 'sat',\n};\n\nexport function isDateDisabled(date: Date, disabledRules?: DisabledRules): boolean {\n if (!disabledRules) return false;\n\n if (disabledRules.weekdays?.length) {\n const weekday = DAY_INDEX_TO_WEEKDAY[date.getDay()];\n if (disabledRules.weekdays.includes(weekday)) return true;\n }\n\n if (disabledRules.dates?.length) {\n const year = date.getFullYear();\n const month = date.getMonth();\n const day = date.getDate();\n if (\n disabledRules.dates.some(\n (disabledDate) =>\n disabledDate.getFullYear() === year &&\n disabledDate.getMonth() === month &&\n disabledDate.getDate() === day,\n )\n ) {\n return true;\n }\n }\n\n if (disabledRules.ranges?.length) {\n const dateStart =
|
|
1
|
+
{"version":3,"file":"isDateDisabled.js","sources":["../../../../src/common/DateUtils/isDateDisabled/isDateDisabled.ts"],"sourcesContent":["import type { DisabledRules, WeekDayType } from '../../../Calendar/Calendar.types';\n\nconst DAY_INDEX_TO_WEEKDAY: Record<number, WeekDayType> = {\n 0: 'sun',\n 1: 'mon',\n 2: 'tue',\n 3: 'wed',\n 4: 'thu',\n 5: 'fri',\n 6: 'sat',\n};\n\nexport function isDateDisabled(date: Date, disabledRules?: DisabledRules): boolean {\n if (!disabledRules) return false;\n\n if (disabledRules.weekdays?.length) {\n const weekday = DAY_INDEX_TO_WEEKDAY[date.getDay()];\n if (disabledRules.weekdays.includes(weekday)) return true;\n }\n\n if (disabledRules.dates?.length) {\n const year = date.getFullYear();\n const month = date.getMonth();\n const day = date.getDate();\n if (\n disabledRules.dates.some(\n (disabledDate) =>\n disabledDate.getFullYear() === year &&\n disabledDate.getMonth() === month &&\n disabledDate.getDate() === day,\n )\n ) {\n return true;\n }\n }\n\n if (disabledRules.ranges?.length) {\n const dateStart = date.getTime();\n if (\n disabledRules.ranges.some((range) => {\n const rangeStart = new Date(\n range.start.getFullYear(),\n range.start.getMonth(),\n range.start.getDate(),\n ).getTime();\n const rangeEnd = new Date(\n range.end.getFullYear(),\n range.end.getMonth(),\n range.end.getDate(),\n ).getTime();\n return dateStart >= rangeStart && dateStart <= rangeEnd;\n })\n ) {\n return true;\n }\n }\n\n return false;\n}\n"],"names":["DAY_INDEX_TO_WEEKDAY","isDateDisabled","date","disabledRules","weekdays","length","weekday","getDay","includes","dates","year","getFullYear","month","getMonth","day","getDate","some","disabledDate","ranges","dateStart","getTime","range","rangeStart","Date","start","rangeEnd","end"],"mappings":";;AAEA,MAAMA,oBAAoB,GAAgC;AACxD,EAAA,CAAC,EAAE,KAAK;AACR,EAAA,CAAC,EAAE,KAAK;AACR,EAAA,CAAC,EAAE,KAAK;AACR,EAAA,CAAC,EAAE,KAAK;AACR,EAAA,CAAC,EAAE,KAAK;AACR,EAAA,CAAC,EAAE,KAAK;AACR,EAAA,CAAC,EAAE;CACJ;AAEK,SAAUC,cAAcA,CAACC,IAAU,EAAEC,aAA6B,EAAA;AACtE,EAAA,IAAI,CAACA,aAAa,EAAE,OAAO,KAAK;AAEhC,EAAA,IAAIA,aAAa,CAACC,QAAQ,EAAEC,MAAM,EAAE;IAClC,MAAMC,OAAO,GAAGN,oBAAoB,CAACE,IAAI,CAACK,MAAM,EAAE,CAAC;IACnD,IAAIJ,aAAa,CAACC,QAAQ,CAACI,QAAQ,CAACF,OAAO,CAAC,EAAE,OAAO,IAAI;AAC3D,EAAA;AAEA,EAAA,IAAIH,aAAa,CAACM,KAAK,EAAEJ,MAAM,EAAE;AAC/B,IAAA,MAAMK,IAAI,GAAGR,IAAI,CAACS,WAAW,EAAE;AAC/B,IAAA,MAAMC,KAAK,GAAGV,IAAI,CAACW,QAAQ,EAAE;AAC7B,IAAA,MAAMC,GAAG,GAAGZ,IAAI,CAACa,OAAO,EAAE;AAC1B,IAAA,IACEZ,aAAa,CAACM,KAAK,CAACO,IAAI,CACrBC,YAAY,IACXA,YAAY,CAACN,WAAW,EAAE,KAAKD,IAAI,IACnCO,YAAY,CAACJ,QAAQ,EAAE,KAAKD,KAAK,IACjCK,YAAY,CAACF,OAAO,EAAE,KAAKD,GAAG,CACjC,EACD;AACA,MAAA,OAAO,IAAI;AACb,IAAA;AACF,EAAA;AAEA,EAAA,IAAIX,aAAa,CAACe,MAAM,EAAEb,MAAM,EAAE;AAChC,IAAA,MAAMc,SAAS,GAAGjB,IAAI,CAACkB,OAAO,EAAE;AAChC,IAAA,IACEjB,aAAa,CAACe,MAAM,CAACF,IAAI,CAAEK,KAAK,IAAI;AAClC,MAAA,MAAMC,UAAU,GAAG,IAAIC,IAAI,CACzBF,KAAK,CAACG,KAAK,CAACb,WAAW,EAAE,EACzBU,KAAK,CAACG,KAAK,CAACX,QAAQ,EAAE,EACtBQ,KAAK,CAACG,KAAK,CAACT,OAAO,EAAE,CACtB,CAACK,OAAO,EAAE;AACX,MAAA,MAAMK,QAAQ,GAAG,IAAIF,IAAI,CACvBF,KAAK,CAACK,GAAG,CAACf,WAAW,EAAE,EACvBU,KAAK,CAACK,GAAG,CAACb,QAAQ,EAAE,EACpBQ,KAAK,CAACK,GAAG,CAACX,OAAO,EAAE,CACpB,CAACK,OAAO,EAAE;AACX,MAAA,OAAOD,SAAS,IAAIG,UAAU,IAAIH,SAAS,IAAIM,QAAQ;AACzD,IAAA,CAAC,CAAC,EACF;AACA,MAAA,OAAO,IAAI;AACb,IAAA;AACF,EAAA;AAEA,EAAA,OAAO,KAAK;AACd;;;;"}
|
|
@@ -22,7 +22,7 @@ function isDateDisabled(date, disabledRules) {
|
|
|
22
22
|
}
|
|
23
23
|
}
|
|
24
24
|
if (disabledRules.ranges?.length) {
|
|
25
|
-
const dateStart =
|
|
25
|
+
const dateStart = date.getTime();
|
|
26
26
|
if (disabledRules.ranges.some(range => {
|
|
27
27
|
const rangeStart = new Date(range.start.getFullYear(), range.start.getMonth(), range.start.getDate()).getTime();
|
|
28
28
|
const rangeEnd = new Date(range.end.getFullYear(), range.end.getMonth(), range.end.getDate()).getTime();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"isDateDisabled.mjs","sources":["../../../../src/common/DateUtils/isDateDisabled/isDateDisabled.ts"],"sourcesContent":["import type { DisabledRules, WeekDayType } from '../../../Calendar/Calendar.types';\n\nconst DAY_INDEX_TO_WEEKDAY: Record<number, WeekDayType> = {\n 0: 'sun',\n 1: 'mon',\n 2: 'tue',\n 3: 'wed',\n 4: 'thu',\n 5: 'fri',\n 6: 'sat',\n};\n\nexport function isDateDisabled(date: Date, disabledRules?: DisabledRules): boolean {\n if (!disabledRules) return false;\n\n if (disabledRules.weekdays?.length) {\n const weekday = DAY_INDEX_TO_WEEKDAY[date.getDay()];\n if (disabledRules.weekdays.includes(weekday)) return true;\n }\n\n if (disabledRules.dates?.length) {\n const year = date.getFullYear();\n const month = date.getMonth();\n const day = date.getDate();\n if (\n disabledRules.dates.some(\n (disabledDate) =>\n disabledDate.getFullYear() === year &&\n disabledDate.getMonth() === month &&\n disabledDate.getDate() === day,\n )\n ) {\n return true;\n }\n }\n\n if (disabledRules.ranges?.length) {\n const dateStart =
|
|
1
|
+
{"version":3,"file":"isDateDisabled.mjs","sources":["../../../../src/common/DateUtils/isDateDisabled/isDateDisabled.ts"],"sourcesContent":["import type { DisabledRules, WeekDayType } from '../../../Calendar/Calendar.types';\n\nconst DAY_INDEX_TO_WEEKDAY: Record<number, WeekDayType> = {\n 0: 'sun',\n 1: 'mon',\n 2: 'tue',\n 3: 'wed',\n 4: 'thu',\n 5: 'fri',\n 6: 'sat',\n};\n\nexport function isDateDisabled(date: Date, disabledRules?: DisabledRules): boolean {\n if (!disabledRules) return false;\n\n if (disabledRules.weekdays?.length) {\n const weekday = DAY_INDEX_TO_WEEKDAY[date.getDay()];\n if (disabledRules.weekdays.includes(weekday)) return true;\n }\n\n if (disabledRules.dates?.length) {\n const year = date.getFullYear();\n const month = date.getMonth();\n const day = date.getDate();\n if (\n disabledRules.dates.some(\n (disabledDate) =>\n disabledDate.getFullYear() === year &&\n disabledDate.getMonth() === month &&\n disabledDate.getDate() === day,\n )\n ) {\n return true;\n }\n }\n\n if (disabledRules.ranges?.length) {\n const dateStart = date.getTime();\n if (\n disabledRules.ranges.some((range) => {\n const rangeStart = new Date(\n range.start.getFullYear(),\n range.start.getMonth(),\n range.start.getDate(),\n ).getTime();\n const rangeEnd = new Date(\n range.end.getFullYear(),\n range.end.getMonth(),\n range.end.getDate(),\n ).getTime();\n return dateStart >= rangeStart && dateStart <= rangeEnd;\n })\n ) {\n return true;\n }\n }\n\n return false;\n}\n"],"names":["DAY_INDEX_TO_WEEKDAY","isDateDisabled","date","disabledRules","weekdays","length","weekday","getDay","includes","dates","year","getFullYear","month","getMonth","day","getDate","some","disabledDate","ranges","dateStart","getTime","range","rangeStart","Date","start","rangeEnd","end"],"mappings":"AAEA,MAAMA,oBAAoB,GAAgC;AACxD,EAAA,CAAC,EAAE,KAAK;AACR,EAAA,CAAC,EAAE,KAAK;AACR,EAAA,CAAC,EAAE,KAAK;AACR,EAAA,CAAC,EAAE,KAAK;AACR,EAAA,CAAC,EAAE,KAAK;AACR,EAAA,CAAC,EAAE,KAAK;AACR,EAAA,CAAC,EAAE;CACJ;AAEK,SAAUC,cAAcA,CAACC,IAAU,EAAEC,aAA6B,EAAA;AACtE,EAAA,IAAI,CAACA,aAAa,EAAE,OAAO,KAAK;AAEhC,EAAA,IAAIA,aAAa,CAACC,QAAQ,EAAEC,MAAM,EAAE;IAClC,MAAMC,OAAO,GAAGN,oBAAoB,CAACE,IAAI,CAACK,MAAM,EAAE,CAAC;IACnD,IAAIJ,aAAa,CAACC,QAAQ,CAACI,QAAQ,CAACF,OAAO,CAAC,EAAE,OAAO,IAAI;AAC3D,EAAA;AAEA,EAAA,IAAIH,aAAa,CAACM,KAAK,EAAEJ,MAAM,EAAE;AAC/B,IAAA,MAAMK,IAAI,GAAGR,IAAI,CAACS,WAAW,EAAE;AAC/B,IAAA,MAAMC,KAAK,GAAGV,IAAI,CAACW,QAAQ,EAAE;AAC7B,IAAA,MAAMC,GAAG,GAAGZ,IAAI,CAACa,OAAO,EAAE;AAC1B,IAAA,IACEZ,aAAa,CAACM,KAAK,CAACO,IAAI,CACrBC,YAAY,IACXA,YAAY,CAACN,WAAW,EAAE,KAAKD,IAAI,IACnCO,YAAY,CAACJ,QAAQ,EAAE,KAAKD,KAAK,IACjCK,YAAY,CAACF,OAAO,EAAE,KAAKD,GAAG,CACjC,EACD;AACA,MAAA,OAAO,IAAI;AACb,IAAA;AACF,EAAA;AAEA,EAAA,IAAIX,aAAa,CAACe,MAAM,EAAEb,MAAM,EAAE;AAChC,IAAA,MAAMc,SAAS,GAAGjB,IAAI,CAACkB,OAAO,EAAE;AAChC,IAAA,IACEjB,aAAa,CAACe,MAAM,CAACF,IAAI,CAAEK,KAAK,IAAI;AAClC,MAAA,MAAMC,UAAU,GAAG,IAAIC,IAAI,CACzBF,KAAK,CAACG,KAAK,CAACb,WAAW,EAAE,EACzBU,KAAK,CAACG,KAAK,CAACX,QAAQ,EAAE,EACtBQ,KAAK,CAACG,KAAK,CAACT,OAAO,EAAE,CACtB,CAACK,OAAO,EAAE;AACX,MAAA,MAAMK,QAAQ,GAAG,IAAIF,IAAI,CACvBF,KAAK,CAACK,GAAG,CAACf,WAAW,EAAE,EACvBU,KAAK,CAACK,GAAG,CAACb,QAAQ,EAAE,EACpBQ,KAAK,CAACK,GAAG,CAACX,OAAO,EAAE,CACpB,CAACK,OAAO,EAAE;AACX,MAAA,OAAOD,SAAS,IAAIG,UAAU,IAAIH,SAAS,IAAIM,QAAQ;AACzD,IAAA,CAAC,CAAC,EACF;AACA,MAAA,OAAO,IAAI;AACb,IAAA;AACF,EAAA;AAEA,EAAA,OAAO,KAAK;AACd;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Calendar.d.ts","sourceRoot":"","sources":["../../../src/Calendar/Calendar.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"Calendar.d.ts","sourceRoot":"","sources":["../../../src/Calendar/Calendar.tsx"],"names":[],"mappings":"AAIA,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AASxC,OAAO,KAAK,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAOtE,MAAM,WAAW,aAAa;IAC5B,+DAA+D;IAC/D,KAAK,EAAE,IAAI,GAAG,IAAI,CAAC;IACnB,8HAA8H;IAC9H,GAAG,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC;IAClB,2HAA2H;IAC3H,GAAG,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC;IAClB,8EAA8E;IAC9E,WAAW,CAAC,EAAE,GAAG,WAAW,EAAE,CAAC;IAC/B,+EAA+E;IAC/E,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,uNAAuN;IACvN,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B,yJAAyJ;IACzJ,WAAW,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI,EAAE,IAAI,EAAE,cAAc,KAAK,IAAI,CAAC;IAChE,sFAAsF;IACtF,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,IAAI,CAAC;CACjC;AAED;;GAEG;AACH,QAAA,MAAM,QAAQ,GAAI,wGASf,aAAa,gCAoOf,CAAC;AAEF,eAAe,QAAQ,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { useState, useCallback, useEffect, useId, useRef, KeyboardEvent } from 'react';
|
|
2
2
|
import { useIntl } from 'react-intl';
|
|
3
|
+
import { formatDate } from '@transferwise/formatting';
|
|
3
4
|
|
|
4
5
|
import { MonthFormat } from '../common';
|
|
5
6
|
import {
|
|
@@ -36,7 +37,6 @@ export interface CalendarProps {
|
|
|
36
37
|
onChange?: (date: Date) => void;
|
|
37
38
|
}
|
|
38
39
|
|
|
39
|
-
|
|
40
40
|
/**
|
|
41
41
|
* Inline calendar for selecting a single date. Powers [DateLookup](?path=/docs/forms-datelookup--docs).
|
|
42
42
|
*/
|
|
@@ -67,15 +67,15 @@ const Calendar = ({
|
|
|
67
67
|
setFocusedDate(selectedDate);
|
|
68
68
|
}, [selectedDate?.getTime()]); // eslint-disable-line react-hooks/exhaustive-deps
|
|
69
69
|
|
|
70
|
-
const focusedDateDisabled = focusedDate
|
|
71
|
-
? !isWithinRange(focusedDate, min, max) || isDateDisabled(focusedDate, disabledRules)
|
|
72
|
-
: false;
|
|
73
|
-
|
|
74
70
|
const checkIsEnabled = (date: Date | null) => {
|
|
75
71
|
if (!date) return true;
|
|
76
72
|
return isWithinRange(date, min, max) && !isDateDisabled(date, disabledRulesRef.current);
|
|
77
73
|
};
|
|
78
74
|
|
|
75
|
+
const focusedDateDisabled = focusedDate
|
|
76
|
+
? !isWithinRange(focusedDate, min, max) || isDateDisabled(focusedDate, disabledRules)
|
|
77
|
+
: false;
|
|
78
|
+
|
|
79
79
|
useEffect(() => {
|
|
80
80
|
if (selectedDate && !isWithinRange(selectedDate, min, max)) {
|
|
81
81
|
const clamped = moveToWithinRange(selectedDate, min, max);
|
|
@@ -178,11 +178,7 @@ const Calendar = ({
|
|
|
178
178
|
focusedDate &&
|
|
179
179
|
(event.target as HTMLElement).hasAttribute('data-calendar-cell')
|
|
180
180
|
) {
|
|
181
|
-
|
|
182
|
-
onDateFocus?.(focusedDate, { isEnabled });
|
|
183
|
-
if (isEnabled && onChange) {
|
|
184
|
-
onChange(focusedDate);
|
|
185
|
-
}
|
|
181
|
+
handleSelectedDateUpdate(focusedDate);
|
|
186
182
|
event.preventDefault();
|
|
187
183
|
}
|
|
188
184
|
break;
|
|
@@ -190,15 +186,13 @@ const Calendar = ({
|
|
|
190
186
|
break;
|
|
191
187
|
}
|
|
192
188
|
},
|
|
193
|
-
[adjustDate, focusedDate, mode,
|
|
189
|
+
[adjustDate, focusedDate, mode, handleSelectedDateUpdate],
|
|
194
190
|
);
|
|
195
191
|
|
|
196
192
|
const focusedDateOutOfRange = focusedDate ? !isWithinRange(focusedDate, min, max) : false;
|
|
197
193
|
|
|
198
194
|
const formatDateForPrompt = (date: Date) =>
|
|
199
|
-
|
|
200
|
-
date,
|
|
201
|
-
);
|
|
195
|
+
formatDate(date, intl.locale, { day: 'numeric', month: 'long', year: 'numeric' });
|
|
202
196
|
|
|
203
197
|
const outOfRangePromptText =
|
|
204
198
|
min && max
|
|
@@ -35,7 +35,7 @@ export function isDateDisabled(date: Date, disabledRules?: DisabledRules): boole
|
|
|
35
35
|
}
|
|
36
36
|
|
|
37
37
|
if (disabledRules.ranges?.length) {
|
|
38
|
-
const dateStart =
|
|
38
|
+
const dateStart = date.getTime();
|
|
39
39
|
if (
|
|
40
40
|
disabledRules.ranges.some((range) => {
|
|
41
41
|
const rangeStart = new Date(
|