@mtes-mct/monitor-ui 1.7.2 → 1.7.3
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/CHANGELOG.md +2 -0
- package/index.js +3424 -0
- package/index.js.map +1 -0
- package/package.json +3 -3
- package/.yarn/cache/date-fns-npm-2.29.3-fef7e3c72c-e01cf5b62a.zip/node_modules/date-fns/esm/locale/_lib/buildFormatLongFn/index.js +0 -12
- package/.yarn/cache/date-fns-npm-2.29.3-fef7e3c72c-e01cf5b62a.zip/node_modules/date-fns/esm/locale/_lib/buildFormatLongFn/index.js.map +0 -1
- package/.yarn/cache/date-fns-npm-2.29.3-fef7e3c72c-e01cf5b62a.zip/node_modules/date-fns/esm/locale/_lib/buildLocalizeFn/index.js +0 -25
- package/.yarn/cache/date-fns-npm-2.29.3-fef7e3c72c-e01cf5b62a.zip/node_modules/date-fns/esm/locale/_lib/buildLocalizeFn/index.js.map +0 -1
- package/.yarn/cache/date-fns-npm-2.29.3-fef7e3c72c-e01cf5b62a.zip/node_modules/date-fns/esm/locale/_lib/buildMatchFn/index.js +0 -51
- package/.yarn/cache/date-fns-npm-2.29.3-fef7e3c72c-e01cf5b62a.zip/node_modules/date-fns/esm/locale/_lib/buildMatchFn/index.js.map +0 -1
- package/.yarn/cache/date-fns-npm-2.29.3-fef7e3c72c-e01cf5b62a.zip/node_modules/date-fns/esm/locale/_lib/buildMatchPatternFn/index.js +0 -20
- package/.yarn/cache/date-fns-npm-2.29.3-fef7e3c72c-e01cf5b62a.zip/node_modules/date-fns/esm/locale/_lib/buildMatchPatternFn/index.js.map +0 -1
- package/.yarn/cache/date-fns-npm-2.29.3-fef7e3c72c-e01cf5b62a.zip/node_modules/date-fns/esm/locale/fr/_lib/formatDistance/index.js +0 -89
- package/.yarn/cache/date-fns-npm-2.29.3-fef7e3c72c-e01cf5b62a.zip/node_modules/date-fns/esm/locale/fr/_lib/formatDistance/index.js.map +0 -1
- package/.yarn/cache/date-fns-npm-2.29.3-fef7e3c72c-e01cf5b62a.zip/node_modules/date-fns/esm/locale/fr/_lib/formatLong/index.js +0 -37
- package/.yarn/cache/date-fns-npm-2.29.3-fef7e3c72c-e01cf5b62a.zip/node_modules/date-fns/esm/locale/fr/_lib/formatLong/index.js.map +0 -1
- package/.yarn/cache/date-fns-npm-2.29.3-fef7e3c72c-e01cf5b62a.zip/node_modules/date-fns/esm/locale/fr/_lib/formatRelative/index.js +0 -15
- package/.yarn/cache/date-fns-npm-2.29.3-fef7e3c72c-e01cf5b62a.zip/node_modules/date-fns/esm/locale/fr/_lib/formatRelative/index.js.map +0 -1
- package/.yarn/cache/date-fns-npm-2.29.3-fef7e3c72c-e01cf5b62a.zip/node_modules/date-fns/esm/locale/fr/_lib/localize/index.js +0 -101
- package/.yarn/cache/date-fns-npm-2.29.3-fef7e3c72c-e01cf5b62a.zip/node_modules/date-fns/esm/locale/fr/_lib/localize/index.js.map +0 -1
- package/.yarn/cache/date-fns-npm-2.29.3-fef7e3c72c-e01cf5b62a.zip/node_modules/date-fns/esm/locale/fr/_lib/match/index.js +0 -101
- package/.yarn/cache/date-fns-npm-2.29.3-fef7e3c72c-e01cf5b62a.zip/node_modules/date-fns/esm/locale/fr/_lib/match/index.js.map +0 -1
- package/.yarn/cache/date-fns-npm-2.29.3-fef7e3c72c-e01cf5b62a.zip/node_modules/date-fns/esm/locale/fr/index.js +0 -34
- package/.yarn/cache/date-fns-npm-2.29.3-fef7e3c72c-e01cf5b62a.zip/node_modules/date-fns/esm/locale/fr/index.js.map +0 -1
- package/.yarn/cache/dayjs-npm-1.11.5-a825142dc5-e3bbaa7b48.zip/node_modules/dayjs/dayjs.min.js +0 -16
- package/.yarn/cache/dayjs-npm-1.11.5-a825142dc5-e3bbaa7b48.zip/node_modules/dayjs/dayjs.min.js.map +0 -1
- package/.yarn/cache/dayjs-npm-1.11.5-a825142dc5-e3bbaa7b48.zip/node_modules/dayjs/locale/fr.js +0 -8
- package/.yarn/cache/dayjs-npm-1.11.5-a825142dc5-e3bbaa7b48.zip/node_modules/dayjs/locale/fr.js.map +0 -1
- package/.yarn/cache/dayjs-npm-1.11.5-a825142dc5-e3bbaa7b48.zip/node_modules/dayjs/plugin/timezone.js +0 -11
- package/.yarn/cache/dayjs-npm-1.11.5-a825142dc5-e3bbaa7b48.zip/node_modules/dayjs/plugin/timezone.js.map +0 -1
- package/.yarn/cache/dayjs-npm-1.11.5-a825142dc5-e3bbaa7b48.zip/node_modules/dayjs/plugin/utc.js +0 -11
- package/.yarn/cache/dayjs-npm-1.11.5-a825142dc5-e3bbaa7b48.zip/node_modules/dayjs/plugin/utc.js.map +0 -1
- package/.yarn/cache/lodash.throttle-npm-4.1.1-856641af92-129c0a28ce.zip/node_modules/lodash.throttle/index.js +0 -444
- package/.yarn/cache/lodash.throttle-npm-4.1.1-856641af92-129c0a28ce.zip/node_modules/lodash.throttle/index.js.map +0 -1
- package/.yarn/cache/ramda-npm-0.28.0-6a5fe8f6cc-44ea6e5010.zip/node_modules/ramda/es/bind.js +0 -36
- package/.yarn/cache/ramda-npm-0.28.0-6a5fe8f6cc-44ea6e5010.zip/node_modules/ramda/es/bind.js.map +0 -1
- package/.yarn/cache/ramda-npm-0.28.0-6a5fe8f6cc-44ea6e5010.zip/node_modules/ramda/es/equals.js +0 -37
- package/.yarn/cache/ramda-npm-0.28.0-6a5fe8f6cc-44ea6e5010.zip/node_modules/ramda/es/equals.js.map +0 -1
- package/.yarn/cache/ramda-npm-0.28.0-6a5fe8f6cc-44ea6e5010.zip/node_modules/ramda/es/filter.js +0 -53
- package/.yarn/cache/ramda-npm-0.28.0-6a5fe8f6cc-44ea6e5010.zip/node_modules/ramda/es/filter.js.map +0 -1
- package/.yarn/cache/ramda-npm-0.28.0-6a5fe8f6cc-44ea6e5010.zip/node_modules/ramda/es/internal/_arity.js +0 -65
- package/.yarn/cache/ramda-npm-0.28.0-6a5fe8f6cc-44ea6e5010.zip/node_modules/ramda/es/internal/_arity.js.map +0 -1
- package/.yarn/cache/ramda-npm-0.28.0-6a5fe8f6cc-44ea6e5010.zip/node_modules/ramda/es/internal/_arrayFromIterator.js +0 -13
- package/.yarn/cache/ramda-npm-0.28.0-6a5fe8f6cc-44ea6e5010.zip/node_modules/ramda/es/internal/_arrayFromIterator.js.map +0 -1
- package/.yarn/cache/ramda-npm-0.28.0-6a5fe8f6cc-44ea6e5010.zip/node_modules/ramda/es/internal/_complement.js +0 -8
- package/.yarn/cache/ramda-npm-0.28.0-6a5fe8f6cc-44ea6e5010.zip/node_modules/ramda/es/internal/_complement.js.map +0 -1
- package/.yarn/cache/ramda-npm-0.28.0-6a5fe8f6cc-44ea6e5010.zip/node_modules/ramda/es/internal/_curry1.js +0 -23
- package/.yarn/cache/ramda-npm-0.28.0-6a5fe8f6cc-44ea6e5010.zip/node_modules/ramda/es/internal/_curry1.js.map +0 -1
- package/.yarn/cache/ramda-npm-0.28.0-6a5fe8f6cc-44ea6e5010.zip/node_modules/ramda/es/internal/_curry2.js +0 -35
- package/.yarn/cache/ramda-npm-0.28.0-6a5fe8f6cc-44ea6e5010.zip/node_modules/ramda/es/internal/_curry2.js.map +0 -1
- package/.yarn/cache/ramda-npm-0.28.0-6a5fe8f6cc-44ea6e5010.zip/node_modules/ramda/es/internal/_curry3.js +0 -53
- package/.yarn/cache/ramda-npm-0.28.0-6a5fe8f6cc-44ea6e5010.zip/node_modules/ramda/es/internal/_curry3.js.map +0 -1
- package/.yarn/cache/ramda-npm-0.28.0-6a5fe8f6cc-44ea6e5010.zip/node_modules/ramda/es/internal/_dispatchable.js +0 -50
- package/.yarn/cache/ramda-npm-0.28.0-6a5fe8f6cc-44ea6e5010.zip/node_modules/ramda/es/internal/_dispatchable.js.map +0 -1
- package/.yarn/cache/ramda-npm-0.28.0-6a5fe8f6cc-44ea6e5010.zip/node_modules/ramda/es/internal/_equals.js +0 -166
- package/.yarn/cache/ramda-npm-0.28.0-6a5fe8f6cc-44ea6e5010.zip/node_modules/ramda/es/internal/_equals.js.map +0 -1
- package/.yarn/cache/ramda-npm-0.28.0-6a5fe8f6cc-44ea6e5010.zip/node_modules/ramda/es/internal/_filter.js +0 -18
- package/.yarn/cache/ramda-npm-0.28.0-6a5fe8f6cc-44ea6e5010.zip/node_modules/ramda/es/internal/_filter.js.map +0 -1
- package/.yarn/cache/ramda-npm-0.28.0-6a5fe8f6cc-44ea6e5010.zip/node_modules/ramda/es/internal/_functionName.js +0 -8
- package/.yarn/cache/ramda-npm-0.28.0-6a5fe8f6cc-44ea6e5010.zip/node_modules/ramda/es/internal/_functionName.js.map +0 -1
- package/.yarn/cache/ramda-npm-0.28.0-6a5fe8f6cc-44ea6e5010.zip/node_modules/ramda/es/internal/_has.js +0 -6
- package/.yarn/cache/ramda-npm-0.28.0-6a5fe8f6cc-44ea6e5010.zip/node_modules/ramda/es/internal/_has.js.map +0 -1
- package/.yarn/cache/ramda-npm-0.28.0-6a5fe8f6cc-44ea6e5010.zip/node_modules/ramda/es/internal/_includesWith.js +0 -17
- package/.yarn/cache/ramda-npm-0.28.0-6a5fe8f6cc-44ea6e5010.zip/node_modules/ramda/es/internal/_includesWith.js.map +0 -1
- package/.yarn/cache/ramda-npm-0.28.0-6a5fe8f6cc-44ea6e5010.zip/node_modules/ramda/es/internal/_isArguments.js +0 -16
- package/.yarn/cache/ramda-npm-0.28.0-6a5fe8f6cc-44ea6e5010.zip/node_modules/ramda/es/internal/_isArguments.js.map +0 -1
- package/.yarn/cache/ramda-npm-0.28.0-6a5fe8f6cc-44ea6e5010.zip/node_modules/ramda/es/internal/_isArray.js +0 -18
- package/.yarn/cache/ramda-npm-0.28.0-6a5fe8f6cc-44ea6e5010.zip/node_modules/ramda/es/internal/_isArray.js.map +0 -1
- package/.yarn/cache/ramda-npm-0.28.0-6a5fe8f6cc-44ea6e5010.zip/node_modules/ramda/es/internal/_isArrayLike.js +0 -55
- package/.yarn/cache/ramda-npm-0.28.0-6a5fe8f6cc-44ea6e5010.zip/node_modules/ramda/es/internal/_isArrayLike.js.map +0 -1
- package/.yarn/cache/ramda-npm-0.28.0-6a5fe8f6cc-44ea6e5010.zip/node_modules/ramda/es/internal/_isObject.js +0 -6
- package/.yarn/cache/ramda-npm-0.28.0-6a5fe8f6cc-44ea6e5010.zip/node_modules/ramda/es/internal/_isObject.js.map +0 -1
- package/.yarn/cache/ramda-npm-0.28.0-6a5fe8f6cc-44ea6e5010.zip/node_modules/ramda/es/internal/_isPlaceholder.js +0 -6
- package/.yarn/cache/ramda-npm-0.28.0-6a5fe8f6cc-44ea6e5010.zip/node_modules/ramda/es/internal/_isPlaceholder.js.map +0 -1
- package/.yarn/cache/ramda-npm-0.28.0-6a5fe8f6cc-44ea6e5010.zip/node_modules/ramda/es/internal/_isString.js +0 -6
- package/.yarn/cache/ramda-npm-0.28.0-6a5fe8f6cc-44ea6e5010.zip/node_modules/ramda/es/internal/_isString.js.map +0 -1
- package/.yarn/cache/ramda-npm-0.28.0-6a5fe8f6cc-44ea6e5010.zip/node_modules/ramda/es/internal/_isTransformer.js +0 -6
- package/.yarn/cache/ramda-npm-0.28.0-6a5fe8f6cc-44ea6e5010.zip/node_modules/ramda/es/internal/_isTransformer.js.map +0 -1
- package/.yarn/cache/ramda-npm-0.28.0-6a5fe8f6cc-44ea6e5010.zip/node_modules/ramda/es/internal/_objectIs.js +0 -17
- package/.yarn/cache/ramda-npm-0.28.0-6a5fe8f6cc-44ea6e5010.zip/node_modules/ramda/es/internal/_objectIs.js.map +0 -1
- package/.yarn/cache/ramda-npm-0.28.0-6a5fe8f6cc-44ea6e5010.zip/node_modules/ramda/es/internal/_reduce.js +0 -74
- package/.yarn/cache/ramda-npm-0.28.0-6a5fe8f6cc-44ea6e5010.zip/node_modules/ramda/es/internal/_reduce.js.map +0 -1
- package/.yarn/cache/ramda-npm-0.28.0-6a5fe8f6cc-44ea6e5010.zip/node_modules/ramda/es/internal/_xfBase.js +0 -11
- package/.yarn/cache/ramda-npm-0.28.0-6a5fe8f6cc-44ea6e5010.zip/node_modules/ramda/es/internal/_xfBase.js.map +0 -1
- package/.yarn/cache/ramda-npm-0.28.0-6a5fe8f6cc-44ea6e5010.zip/node_modules/ramda/es/internal/_xfilter.js +0 -29
- package/.yarn/cache/ramda-npm-0.28.0-6a5fe8f6cc-44ea6e5010.zip/node_modules/ramda/es/internal/_xfilter.js.map +0 -1
- package/.yarn/cache/ramda-npm-0.28.0-6a5fe8f6cc-44ea6e5010.zip/node_modules/ramda/es/internal/_xwrap.js +0 -28
- package/.yarn/cache/ramda-npm-0.28.0-6a5fe8f6cc-44ea6e5010.zip/node_modules/ramda/es/internal/_xwrap.js.map +0 -1
- package/.yarn/cache/ramda-npm-0.28.0-6a5fe8f6cc-44ea6e5010.zip/node_modules/ramda/es/keys.js +0 -92
- package/.yarn/cache/ramda-npm-0.28.0-6a5fe8f6cc-44ea6e5010.zip/node_modules/ramda/es/keys.js.map +0 -1
- package/.yarn/cache/ramda-npm-0.28.0-6a5fe8f6cc-44ea6e5010.zip/node_modules/ramda/es/mergeDeepRight.js +0 -35
- package/.yarn/cache/ramda-npm-0.28.0-6a5fe8f6cc-44ea6e5010.zip/node_modules/ramda/es/mergeDeepRight.js.map +0 -1
- package/.yarn/cache/ramda-npm-0.28.0-6a5fe8f6cc-44ea6e5010.zip/node_modules/ramda/es/mergeDeepWithKey.js +0 -47
- package/.yarn/cache/ramda-npm-0.28.0-6a5fe8f6cc-44ea6e5010.zip/node_modules/ramda/es/mergeDeepWithKey.js.map +0 -1
- package/.yarn/cache/ramda-npm-0.28.0-6a5fe8f6cc-44ea6e5010.zip/node_modules/ramda/es/mergeWithKey.js +0 -52
- package/.yarn/cache/ramda-npm-0.28.0-6a5fe8f6cc-44ea6e5010.zip/node_modules/ramda/es/mergeWithKey.js.map +0 -1
- package/.yarn/cache/ramda-npm-0.28.0-6a5fe8f6cc-44ea6e5010.zip/node_modules/ramda/es/reject.js +0 -37
- package/.yarn/cache/ramda-npm-0.28.0-6a5fe8f6cc-44ea6e5010.zip/node_modules/ramda/es/reject.js.map +0 -1
- package/.yarn/cache/ramda-npm-0.28.0-6a5fe8f6cc-44ea6e5010.zip/node_modules/ramda/es/type.js +0 -36
- package/.yarn/cache/ramda-npm-0.28.0-6a5fe8f6cc-44ea6e5010.zip/node_modules/ramda/es/type.js.map +0 -1
- package/_virtual/_commonjsHelpers.js +0 -4
- package/_virtual/_commonjsHelpers.js.map +0 -1
- package/_virtual/dayjs.min.js +0 -4
- package/_virtual/dayjs.min.js.map +0 -1
- package/_virtual/dayjs.min2.js +0 -6
- package/_virtual/dayjs.min2.js.map +0 -1
- package/_virtual/fr.js +0 -4
- package/_virtual/fr.js.map +0 -1
- package/_virtual/timezone.js +0 -4
- package/_virtual/timezone.js.map +0 -1
- package/_virtual/utc.js +0 -4
- package/_virtual/utc.js.map +0 -1
- package/src/ThemeProvider.js +0 -13
- package/src/ThemeProvider.js.map +0 -1
- package/src/constants.js +0 -2
- package/src/constants.js.map +0 -1
- package/src/elements/Field.js +0 -9
- package/src/elements/Field.js.map +0 -1
- package/src/elements/Fieldset.js +0 -15
- package/src/elements/Fieldset.js.map +0 -1
- package/src/elements/Label.js +0 -12
- package/src/elements/Label.js.map +0 -1
- package/src/elements/Legend.js +0 -9
- package/src/elements/Legend.js.map +0 -1
- package/src/fields/Checkbox.js +0 -17
- package/src/fields/Checkbox.js.map +0 -1
- package/src/fields/DatePicker/CalendarPicker.js +0 -137
- package/src/fields/DatePicker/CalendarPicker.js.map +0 -1
- package/src/fields/DatePicker/index.js +0 -126
- package/src/fields/DatePicker/index.js.map +0 -1
- package/src/fields/DateRangePicker/DateInput.js +0 -84
- package/src/fields/DateRangePicker/DateInput.js.map +0 -1
- package/src/fields/DateRangePicker/NumberInput.js +0 -82
- package/src/fields/DateRangePicker/NumberInput.js.map +0 -1
- package/src/fields/DateRangePicker/RangeCalendarPicker.js +0 -147
- package/src/fields/DateRangePicker/RangeCalendarPicker.js.map +0 -1
- package/src/fields/DateRangePicker/RangedTimePicker.js +0 -90
- package/src/fields/DateRangePicker/RangedTimePicker.js.map +0 -1
- package/src/fields/DateRangePicker/TimeInput.js +0 -116
- package/src/fields/DateRangePicker/TimeInput.js.map +0 -1
- package/src/fields/DateRangePicker/constants.js +0 -34
- package/src/fields/DateRangePicker/constants.js.map +0 -1
- package/src/fields/DateRangePicker/index.js +0 -187
- package/src/fields/DateRangePicker/index.js.map +0 -1
- package/src/fields/DateRangePicker/types.js +0 -8
- package/src/fields/DateRangePicker/types.js.map +0 -1
- package/src/fields/DateRangePicker/utils.js +0 -73
- package/src/fields/DateRangePicker/utils.js.map +0 -1
- package/src/fields/MultiCheckbox.js +0 -52
- package/src/fields/MultiCheckbox.js.map +0 -1
- package/src/fields/MultiRadio.js +0 -54
- package/src/fields/MultiRadio.js.map +0 -1
- package/src/fields/MultiSelect.js +0 -33
- package/src/fields/MultiSelect.js.map +0 -1
- package/src/fields/Select.js +0 -27
- package/src/fields/Select.js.map +0 -1
- package/src/fields/TextInput.js +0 -25
- package/src/fields/TextInput.js.map +0 -1
- package/src/fields/Textarea.js +0 -28
- package/src/fields/Textarea.js.map +0 -1
- package/src/formiks/FormikCheckbox.js +0 -22
- package/src/formiks/FormikCheckbox.js.map +0 -1
- package/src/formiks/FormikDatePicker.js +0 -17
- package/src/formiks/FormikDatePicker.js.map +0 -1
- package/src/formiks/FormikDateRangePicker.js +0 -17
- package/src/formiks/FormikDateRangePicker.js.map +0 -1
- package/src/formiks/FormikEffect.js +0 -14
- package/src/formiks/FormikEffect.js.map +0 -1
- package/src/formiks/FormikMultiCheckbox.js +0 -21
- package/src/formiks/FormikMultiCheckbox.js.map +0 -1
- package/src/formiks/FormikMultiRadio.js +0 -21
- package/src/formiks/FormikMultiRadio.js.map +0 -1
- package/src/formiks/FormikMultiSelect.js +0 -21
- package/src/formiks/FormikMultiSelect.js.map +0 -1
- package/src/formiks/FormikSelect.js +0 -21
- package/src/formiks/FormikSelect.js.map +0 -1
- package/src/formiks/FormikTextInput.js +0 -21
- package/src/formiks/FormikTextInput.js.map +0 -1
- package/src/formiks/FormikTextarea.js +0 -21
- package/src/formiks/FormikTextarea.js.map +0 -1
- package/src/hooks/useForceUpdate.js +0 -17
- package/src/hooks/useForceUpdate.js.map +0 -1
- package/src/index.js +0 -28
- package/src/index.js.map +0 -1
- package/src/theme.js +0 -68
- package/src/theme.js.map +0 -1
- package/src/utils/capitalizeFirstLetter.js +0 -9
- package/src/utils/capitalizeFirstLetter.js.map +0 -1
- package/src/utils/dayjs.js +0 -11
- package/src/utils/dayjs.js.map +0 -1
- package/src/utils/getLocalizedDayjs.js +0 -19
- package/src/utils/getLocalizedDayjs.js.map +0 -1
- package/src/utils/getUtcDayjs.js +0 -9
- package/src/utils/getUtcDayjs.js.map +0 -1
- package/src/utils/getUtcizedDayjs.js +0 -20
- package/src/utils/getUtcizedDayjs.js.map +0 -1
- package/src/utils/sortDates.js +0 -12
- package/src/utils/sortDates.js.map +0 -1
- package/src/utils/stopMouseEventPropagation.js +0 -6
- package/src/utils/stopMouseEventPropagation.js.map +0 -1
|
@@ -1,137 +0,0 @@
|
|
|
1
|
-
import { jsxs, Fragment, jsx } from 'react/jsx-runtime';
|
|
2
|
-
import { useRef, useState, useMemo, useCallback, useEffect } from 'react';
|
|
3
|
-
import { DatePicker } from 'rsuite';
|
|
4
|
-
import styled, { createGlobalStyle } from 'styled-components';
|
|
5
|
-
import { getUtcDayjs } from '../../utils/getUtcDayjs.js';
|
|
6
|
-
import { getUtcizedDayjs } from '../../utils/getUtcizedDayjs.js';
|
|
7
|
-
import { stopMouseEventPropagation } from '../../utils/stopMouseEventPropagation.js';
|
|
8
|
-
import { RSUITE_CALENDAR_LOCALE } from '../DateRangePicker/constants.js';
|
|
9
|
-
import { getDateTupleFromDate } from '../DateRangePicker/utils.js';
|
|
10
|
-
|
|
11
|
-
function CalendarPicker({ defaultValue, isHistorical, onChange }) {
|
|
12
|
-
const boxRef = useRef();
|
|
13
|
-
const calendarRef = useRef();
|
|
14
|
-
const [isFirstLoad, setIsFirstLoad] = useState(true);
|
|
15
|
-
const utcTodayAsDayjs = useMemo(() => getUtcDayjs().endOf('day'), []);
|
|
16
|
-
const disabledDate = useMemo(() => (date) => date && isHistorical ? getUtcizedDayjs(date).isAfter(utcTodayAsDayjs) : false, [isHistorical, utcTodayAsDayjs]);
|
|
17
|
-
const handleSelect = useCallback((nextDate) => {
|
|
18
|
-
const nextDateTuple = getDateTupleFromDate(nextDate);
|
|
19
|
-
onChange(nextDateTuple);
|
|
20
|
-
}, [onChange]);
|
|
21
|
-
useEffect(() => {
|
|
22
|
-
// We wait for the <Box /> to render so that `boxRef` is defined
|
|
23
|
-
// and can be used as a container for <RsuiteDateRangePicker />
|
|
24
|
-
setIsFirstLoad(false);
|
|
25
|
-
}, []);
|
|
26
|
-
return (jsxs(Fragment, { children: [jsx(GlobalStyleToHideBodyDialog, {}), jsx(Box, { ref: boxRef, onClick: stopMouseEventPropagation, children: !isFirstLoad && (jsx(DatePicker, { ref: calendarRef, container: boxRef.current, disabledDate: disabledDate, format: "yyyy-MM-dd", locale: RSUITE_CALENDAR_LOCALE, oneTap: true, onSelect: handleSelect, open: true, ranges: [],
|
|
27
|
-
// `defaultValue` seems to be immediatly cancelled so we come down to using a controlled `value`
|
|
28
|
-
value: defaultValue })) })] }));
|
|
29
|
-
}
|
|
30
|
-
const GlobalStyleToHideBodyDialog = createGlobalStyle `
|
|
31
|
-
body > div[role="dialog"].rs-picker-date-menu {
|
|
32
|
-
display: none;
|
|
33
|
-
}
|
|
34
|
-
`;
|
|
35
|
-
const Box = styled.div `
|
|
36
|
-
height: 0;
|
|
37
|
-
position: relative;
|
|
38
|
-
user-select: none;
|
|
39
|
-
|
|
40
|
-
.rs-picker-toggle {
|
|
41
|
-
display: none;
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
.rs-picker-date-panel {
|
|
45
|
-
height: 290px;
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
.rs-picker-date-menu {
|
|
49
|
-
border: solid 1px ${p => p.theme.color.lightGray};
|
|
50
|
-
border-radius: 0;
|
|
51
|
-
margin-top: 0.25rem;
|
|
52
|
-
|
|
53
|
-
.rs-picker-date-header,
|
|
54
|
-
.rs-calendar-header-time-toolbar,
|
|
55
|
-
.rs-picker-toolbar {
|
|
56
|
-
display: none;
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
.rs-calendar {
|
|
60
|
-
height: auto !important;
|
|
61
|
-
padding: 0;
|
|
62
|
-
|
|
63
|
-
:first-child {
|
|
64
|
-
border-right: solid 1px ${p => p.theme.color.lightGray};
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
.rs-calendar-header {
|
|
68
|
-
border-bottom: solid 1px ${p => p.theme.color.lightGray};
|
|
69
|
-
padding: 0.5rem;
|
|
70
|
-
|
|
71
|
-
.rs-calendar-header-month-toolbar {
|
|
72
|
-
align-items: center;
|
|
73
|
-
color: ${p => p.theme.color.slateGray};
|
|
74
|
-
display: flex;
|
|
75
|
-
justify-content: space-between;
|
|
76
|
-
|
|
77
|
-
.rs-calendar-header-title {
|
|
78
|
-
font-size: inherit;
|
|
79
|
-
text-transform: uppercase;
|
|
80
|
-
|
|
81
|
-
&.rs-calendar-header-error {
|
|
82
|
-
color: ${p => p.theme.color.slateGray};
|
|
83
|
-
|
|
84
|
-
:hover {
|
|
85
|
-
color: ${p => p.theme.color.slateGray};
|
|
86
|
-
}
|
|
87
|
-
}
|
|
88
|
-
}
|
|
89
|
-
}
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
.rs-calendar-view {
|
|
93
|
-
padding: 0.75rem 0.5rem 0;
|
|
94
|
-
|
|
95
|
-
.rs-calendar-table-cell {
|
|
96
|
-
padding: 0 0 0.25rem 0;
|
|
97
|
-
width: 33px;
|
|
98
|
-
|
|
99
|
-
&.rs-calendar-table-cell-in-range:before {
|
|
100
|
-
background-color: ${p => p.theme.color.blueGray[25]};
|
|
101
|
-
height: 33px;
|
|
102
|
-
margin-top: 0;
|
|
103
|
-
}
|
|
104
|
-
|
|
105
|
-
> .rs-calendar-table-cell-content {
|
|
106
|
-
align-items: center;
|
|
107
|
-
border-radius: 0 !important;
|
|
108
|
-
display: inline-flex;
|
|
109
|
-
height: 33px;
|
|
110
|
-
justify-content: center;
|
|
111
|
-
padding-bottom: 3px;
|
|
112
|
-
width: 33px;
|
|
113
|
-
}
|
|
114
|
-
:hover .rs-calendar-table-cell-content {
|
|
115
|
-
background-color: ${p => p.theme.color.blueYonder[25]};
|
|
116
|
-
color: ${p => p.theme.color.blueYonder[100]};
|
|
117
|
-
}
|
|
118
|
-
&[role='columnheader'] .rs-calendar-table-cell-content,
|
|
119
|
-
&[role='columnheader']:hover .rs-calendar-table-cell-content {
|
|
120
|
-
background-color: transparent;
|
|
121
|
-
color: ${p => p.theme.color.slateGray};
|
|
122
|
-
}
|
|
123
|
-
&.rs-calendar-table-cell-disabled .rs-calendar-table-cell-content {
|
|
124
|
-
background-color: transparent;
|
|
125
|
-
color: ${p => p.theme.color.lightGray};
|
|
126
|
-
}
|
|
127
|
-
&.rs-calendar-table-cell-selected > .rs-calendar-table-cell-content {
|
|
128
|
-
background-color: ${p => p.theme.color.blueGray[100]};
|
|
129
|
-
}
|
|
130
|
-
}
|
|
131
|
-
}
|
|
132
|
-
}
|
|
133
|
-
}
|
|
134
|
-
`;
|
|
135
|
-
|
|
136
|
-
export { CalendarPicker };
|
|
137
|
-
//# sourceMappingURL=CalendarPicker.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"CalendarPicker.js","sources":["../../../../src/fields/DatePicker/CalendarPicker.tsx"],"sourcesContent":["import { useCallback, useEffect, useMemo, useRef, useState } from 'react'\nimport { DatePicker as RsuiteDatePicker } from 'rsuite'\nimport styled, { createGlobalStyle } from 'styled-components'\n\nimport { getUtcDayjs } from '../../utils/getUtcDayjs'\nimport { getUtcizedDayjs } from '../../utils/getUtcizedDayjs'\nimport { stopMouseEventPropagation } from '../../utils/stopMouseEventPropagation'\nimport { RSUITE_CALENDAR_LOCALE } from '../DateRangePicker/constants'\nimport { getDateTupleFromDate } from '../DateRangePicker/utils'\n\nimport type { DateTuple } from '../DateRangePicker/types'\nimport type { MutableRefObject } from 'react'\nimport type { Promisable } from 'type-fest'\n\ntype CalendarPickerProps = {\n defaultValue?: Date\n isHistorical?: boolean\n onChange: (nextDateTuple: DateTuple) => Promisable<void>\n}\nexport function CalendarPicker({ defaultValue, isHistorical, onChange }: CalendarPickerProps) {\n const boxRef = useRef() as MutableRefObject<HTMLDivElement>\n const calendarRef = useRef<any>()\n\n const [isFirstLoad, setIsFirstLoad] = useState(true)\n\n const utcTodayAsDayjs = useMemo(() => getUtcDayjs().endOf('day'), [])\n const disabledDate = useMemo(\n () => (date?: Date) => date && isHistorical ? getUtcizedDayjs(date).isAfter(utcTodayAsDayjs) : false,\n [isHistorical, utcTodayAsDayjs]\n )\n\n const handleSelect = useCallback(\n (nextDate: Date) => {\n const nextDateTuple = getDateTupleFromDate(nextDate)\n\n onChange(nextDateTuple)\n },\n [onChange]\n )\n\n useEffect(() => {\n // We wait for the <Box /> to render so that `boxRef` is defined\n // and can be used as a container for <RsuiteDateRangePicker />\n setIsFirstLoad(false)\n }, [])\n\n return (\n <>\n <GlobalStyleToHideBodyDialog />\n\n <Box ref={boxRef} onClick={stopMouseEventPropagation}>\n {!isFirstLoad && (\n <RsuiteDatePicker\n ref={calendarRef}\n container={boxRef.current}\n disabledDate={disabledDate}\n format=\"yyyy-MM-dd\"\n locale={RSUITE_CALENDAR_LOCALE}\n oneTap\n onSelect={handleSelect}\n open\n ranges={[]}\n // `defaultValue` seems to be immediatly cancelled so we come down to using a controlled `value`\n value={defaultValue}\n />\n )}\n </Box>\n </>\n )\n}\n\nconst GlobalStyleToHideBodyDialog: any = createGlobalStyle`\n body > div[role=\"dialog\"].rs-picker-date-menu {\n display: none;\n }\n`\n\nconst Box = styled.div`\n height: 0;\n position: relative;\n user-select: none;\n\n .rs-picker-toggle {\n display: none;\n }\n\n .rs-picker-date-panel {\n height: 290px;\n }\n\n .rs-picker-date-menu {\n border: solid 1px ${p => p.theme.color.lightGray};\n border-radius: 0;\n margin-top: 0.25rem;\n\n .rs-picker-date-header,\n .rs-calendar-header-time-toolbar,\n .rs-picker-toolbar {\n display: none;\n }\n\n .rs-calendar {\n height: auto !important;\n padding: 0;\n\n :first-child {\n border-right: solid 1px ${p => p.theme.color.lightGray};\n }\n\n .rs-calendar-header {\n border-bottom: solid 1px ${p => p.theme.color.lightGray};\n padding: 0.5rem;\n\n .rs-calendar-header-month-toolbar {\n align-items: center;\n color: ${p => p.theme.color.slateGray};\n display: flex;\n justify-content: space-between;\n\n .rs-calendar-header-title {\n font-size: inherit;\n text-transform: uppercase;\n\n &.rs-calendar-header-error {\n color: ${p => p.theme.color.slateGray};\n\n :hover {\n color: ${p => p.theme.color.slateGray};\n }\n }\n }\n }\n }\n\n .rs-calendar-view {\n padding: 0.75rem 0.5rem 0;\n\n .rs-calendar-table-cell {\n padding: 0 0 0.25rem 0;\n width: 33px;\n\n &.rs-calendar-table-cell-in-range:before {\n background-color: ${p => p.theme.color.blueGray[25]};\n height: 33px;\n margin-top: 0;\n }\n\n > .rs-calendar-table-cell-content {\n align-items: center;\n border-radius: 0 !important;\n display: inline-flex;\n height: 33px;\n justify-content: center;\n padding-bottom: 3px;\n width: 33px;\n }\n :hover .rs-calendar-table-cell-content {\n background-color: ${p => p.theme.color.blueYonder[25]};\n color: ${p => p.theme.color.blueYonder[100]};\n }\n &[role='columnheader'] .rs-calendar-table-cell-content,\n &[role='columnheader']:hover .rs-calendar-table-cell-content {\n background-color: transparent;\n color: ${p => p.theme.color.slateGray};\n }\n &.rs-calendar-table-cell-disabled .rs-calendar-table-cell-content {\n background-color: transparent;\n color: ${p => p.theme.color.lightGray};\n }\n &.rs-calendar-table-cell-selected > .rs-calendar-table-cell-content {\n background-color: ${p => p.theme.color.blueGray[100]};\n }\n }\n }\n }\n }\n`\n"],"names":["_jsxs","_Fragment","_jsx","RsuiteDatePicker"],"mappings":"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"}
|
|
@@ -1,126 +0,0 @@
|
|
|
1
|
-
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
2
|
-
import { useRef, useMemo, useCallback, useEffect } from 'react';
|
|
3
|
-
import styled from 'styled-components';
|
|
4
|
-
import { Fieldset } from '../../elements/Fieldset.js';
|
|
5
|
-
import { Legend } from '../../elements/Legend.js';
|
|
6
|
-
import { useForceUpdate } from '../../hooks/useForceUpdate.js';
|
|
7
|
-
import { getLocalizedDayjs } from '../../utils/getLocalizedDayjs.js';
|
|
8
|
-
import { getUtcizedDayjs } from '../../utils/getUtcizedDayjs.js';
|
|
9
|
-
import { DateInput } from '../DateRangePicker/DateInput.js';
|
|
10
|
-
import { TimeInput } from '../DateRangePicker/TimeInput.js';
|
|
11
|
-
import { getDateTupleFromDate, getTimeTupleFromDate, getDateFromDateAndTimeTuple } from '../DateRangePicker/utils.js';
|
|
12
|
-
import { CalendarPicker } from './CalendarPicker.js';
|
|
13
|
-
|
|
14
|
-
function DatePicker({ defaultValue, isHistorical = false, isLabelHidden = false, label, minutesRange = 15, onChange, withTime = false }) {
|
|
15
|
-
const dateInputRef = useRef();
|
|
16
|
-
const timeInputRef = useRef();
|
|
17
|
-
const isCalendarPickerOpenRef = useRef(false);
|
|
18
|
-
const selectedDateRef = useRef(defaultValue ? getLocalizedDayjs(defaultValue).toDate() : undefined);
|
|
19
|
-
const selectedDateTupleRef = useRef(getDateTupleFromDate(selectedDateRef.current));
|
|
20
|
-
const selectedTimeTupleRef = useRef(getTimeTupleFromDate(selectedDateRef.current));
|
|
21
|
-
const { forceUpdate } = useForceUpdate();
|
|
22
|
-
const rangeCalendarPickerDefaultValue = useMemo(() => selectedDateTupleRef.current
|
|
23
|
-
? getDateFromDateAndTimeTuple(selectedDateTupleRef.current, ['00', '00'])
|
|
24
|
-
: undefined,
|
|
25
|
-
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
26
|
-
[selectedDateTupleRef.current]);
|
|
27
|
-
const submit = useCallback(() => {
|
|
28
|
-
if (!onChange || !selectedDateRef.current) {
|
|
29
|
-
return;
|
|
30
|
-
}
|
|
31
|
-
const nextDate = getUtcizedDayjs(selectedDateRef.current).toDate();
|
|
32
|
-
onChange(nextDate);
|
|
33
|
-
}, [onChange]);
|
|
34
|
-
const closeCalendarPicker = useCallback(() => {
|
|
35
|
-
isCalendarPickerOpenRef.current = false;
|
|
36
|
-
forceUpdate();
|
|
37
|
-
}, [forceUpdate]);
|
|
38
|
-
const handleClickOutside = useCallback((event) => {
|
|
39
|
-
const target = event.target;
|
|
40
|
-
if (dateInputRef.current.boxSpan.contains(target)) {
|
|
41
|
-
return;
|
|
42
|
-
}
|
|
43
|
-
closeCalendarPicker();
|
|
44
|
-
}, [closeCalendarPicker]);
|
|
45
|
-
const handleDateInputNext = useCallback(() => {
|
|
46
|
-
if (!withTime) {
|
|
47
|
-
return;
|
|
48
|
-
}
|
|
49
|
-
timeInputRef.current.focus();
|
|
50
|
-
}, [withTime]);
|
|
51
|
-
const handleDateInputFilled = useCallback((nextDateTuple) => {
|
|
52
|
-
selectedDateTupleRef.current = nextDateTuple;
|
|
53
|
-
// If there is no time input or a time has already been selected,
|
|
54
|
-
if (!withTime || selectedTimeTupleRef.current) {
|
|
55
|
-
// we must update the selected date and call onChange()
|
|
56
|
-
const timeTuple = (withTime ? selectedTimeTupleRef.current : ['00', '00']);
|
|
57
|
-
const nextDate = getDateFromDateAndTimeTuple(nextDateTuple, timeTuple);
|
|
58
|
-
selectedDateRef.current = nextDate;
|
|
59
|
-
submit();
|
|
60
|
-
}
|
|
61
|
-
handleDateInputNext();
|
|
62
|
-
}, [handleDateInputNext, submit, withTime]);
|
|
63
|
-
const handleCalendarPickerChange = useCallback((nextDateTuple) => {
|
|
64
|
-
// If this is a date picker without a time input,
|
|
65
|
-
if (!withTime) {
|
|
66
|
-
// we have to fix the date at the beginning of the day
|
|
67
|
-
const nextDate = getDateFromDateAndTimeTuple(nextDateTuple, ['00', '00']);
|
|
68
|
-
selectedDateRef.current = nextDate;
|
|
69
|
-
}
|
|
70
|
-
// If this is a date picker with a time input,
|
|
71
|
-
else {
|
|
72
|
-
// we include the selected time if it exists, set it at the beginning of the day if not
|
|
73
|
-
const nextDate = getDateFromDateAndTimeTuple(nextDateTuple, selectedTimeTupleRef.current || ['00', '00']);
|
|
74
|
-
selectedDateRef.current = nextDate;
|
|
75
|
-
}
|
|
76
|
-
selectedDateTupleRef.current = nextDateTuple;
|
|
77
|
-
selectedTimeTupleRef.current = getTimeTupleFromDate(selectedDateRef.current);
|
|
78
|
-
closeCalendarPicker();
|
|
79
|
-
forceUpdate();
|
|
80
|
-
submit();
|
|
81
|
-
}, [closeCalendarPicker, forceUpdate, submit, withTime]);
|
|
82
|
-
const handleTimeInputFilled = useCallback((nextTimeTuple) => {
|
|
83
|
-
// If a date has already been selected
|
|
84
|
-
if (selectedDateTupleRef.current) {
|
|
85
|
-
// we must update the selected date accordingly and submit it
|
|
86
|
-
const nextDate = getDateFromDateAndTimeTuple(selectedDateTupleRef.current, nextTimeTuple);
|
|
87
|
-
selectedDateRef.current = nextDate;
|
|
88
|
-
submit();
|
|
89
|
-
}
|
|
90
|
-
selectedTimeTupleRef.current = nextTimeTuple;
|
|
91
|
-
submit();
|
|
92
|
-
}, [submit]);
|
|
93
|
-
const openCalendarPicker = useCallback(() => {
|
|
94
|
-
isCalendarPickerOpenRef.current = true;
|
|
95
|
-
forceUpdate();
|
|
96
|
-
}, [forceUpdate]);
|
|
97
|
-
useEffect(() => {
|
|
98
|
-
window.document.addEventListener('click', handleClickOutside);
|
|
99
|
-
return () => {
|
|
100
|
-
window.document.removeEventListener('click', handleClickOutside);
|
|
101
|
-
};
|
|
102
|
-
}, [handleClickOutside]);
|
|
103
|
-
return (jsxs(Fieldset, { className: "DateRangePicker", children: [jsx(Legend, { isHidden: isLabelHidden, children: label }), jsxs(Box, { children: [jsx(Field, { children: jsx(DateInput, { ref: dateInputRef, defaultValue: selectedDateTupleRef.current, isForcedFocused: isCalendarPickerOpenRef.current, onChange: handleDateInputFilled, onClick: openCalendarPicker, onNext: handleDateInputNext }) }), withTime && (jsx(Field, { isTimeField: true, children: jsx(TimeInput, { ref: timeInputRef, defaultValue: selectedTimeTupleRef.current, minutesRange: minutesRange, onBack: () => dateInputRef.current.focus(true), onChange: handleTimeInputFilled, onFocus: closeCalendarPicker, onPrevious: () => dateInputRef.current.focus(true) }) }))] }), isCalendarPickerOpenRef.current && (jsx(CalendarPicker, { defaultValue: rangeCalendarPickerDefaultValue, isHistorical: isHistorical, onChange: handleCalendarPickerChange }))] }));
|
|
104
|
-
}
|
|
105
|
-
const Box = styled.div `
|
|
106
|
-
* {
|
|
107
|
-
font-weight: 500;
|
|
108
|
-
line-height: 1;
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
color: ${p => p.theme.color.gunMetal};
|
|
112
|
-
font-size: 13px;
|
|
113
|
-
position: relative;
|
|
114
|
-
`;
|
|
115
|
-
const Field = styled.span `
|
|
116
|
-
font-size: inherit;
|
|
117
|
-
margin-left: ${p => {
|
|
118
|
-
if (p.isEndDateField) {
|
|
119
|
-
return '0.625rem';
|
|
120
|
-
}
|
|
121
|
-
return p.isTimeField ? '0.125rem' : 0;
|
|
122
|
-
}};
|
|
123
|
-
`;
|
|
124
|
-
|
|
125
|
-
export { DatePicker };
|
|
126
|
-
//# sourceMappingURL=index.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../../../src/fields/DatePicker/index.tsx"],"sourcesContent":["// TODO We should make this component both form- & a11y-compliant with a `name` and proper (aria-)labels.\n\nimport { useCallback, useEffect, useMemo, useRef } from 'react'\nimport styled from 'styled-components'\n\nimport { Fieldset } from '../../elements/Fieldset'\nimport { Legend } from '../../elements/Legend'\nimport { useForceUpdate } from '../../hooks/useForceUpdate'\nimport { getLocalizedDayjs } from '../../utils/getLocalizedDayjs'\nimport { getUtcizedDayjs } from '../../utils/getUtcizedDayjs'\nimport { DateInput } from '../DateRangePicker/DateInput'\nimport { TimeInput } from '../DateRangePicker/TimeInput'\nimport { getDateFromDateAndTimeTuple, getDateTupleFromDate, getTimeTupleFromDate } from '../DateRangePicker/utils'\nimport { CalendarPicker } from './CalendarPicker'\n\nimport type { DateOrTimeInputRef, DateTuple, TimeTuple } from '../DateRangePicker/types'\nimport type { MutableRefObject } from 'react'\nimport type { Promisable } from 'type-fest'\n\nexport type DatePickerProps = {\n defaultValue?: Date\n /** Only allow past dates until today. */\n isHistorical?: boolean\n isLabelHidden?: boolean\n label: string\n /**\n * Range of minutes used to generate the time picker list.\n *\n * @example\n * `15` would produce a list with `..., 10:45, 11:00, 11:15, ...`.\n */\n minutesRange?: number\n /**\n * Called each time the date range picker is changed to a new valid value.\n *\n * @param nextUtcDateRange - A utcized date to be used as is to interact with the API.\n */\n onChange?: (nextUtcDate: Date) => Promisable<void>\n withTime?: boolean\n}\nexport function DatePicker({\n defaultValue,\n isHistorical = false,\n isLabelHidden = false,\n label,\n minutesRange = 15,\n onChange,\n withTime = false\n}: DatePickerProps) {\n const dateInputRef = useRef() as MutableRefObject<DateOrTimeInputRef>\n const timeInputRef = useRef() as MutableRefObject<DateOrTimeInputRef>\n\n const isCalendarPickerOpenRef = useRef(false)\n\n const selectedDateRef = useRef<Date | undefined>(defaultValue ? getLocalizedDayjs(defaultValue).toDate() : undefined)\n const selectedDateTupleRef = useRef<DateTuple | undefined>(getDateTupleFromDate(selectedDateRef.current))\n const selectedTimeTupleRef = useRef<TimeTuple | undefined>(getTimeTupleFromDate(selectedDateRef.current))\n\n const { forceUpdate } = useForceUpdate()\n\n const rangeCalendarPickerDefaultValue = useMemo(\n () =>\n selectedDateTupleRef.current\n ? getDateFromDateAndTimeTuple(selectedDateTupleRef.current, ['00', '00'])\n : undefined,\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [selectedDateTupleRef.current]\n )\n\n const submit = useCallback(() => {\n if (!onChange || !selectedDateRef.current) {\n return\n }\n\n const nextDate = getUtcizedDayjs(selectedDateRef.current).toDate()\n\n onChange(nextDate)\n }, [onChange])\n\n const closeCalendarPicker = useCallback(() => {\n isCalendarPickerOpenRef.current = false\n\n forceUpdate()\n }, [forceUpdate])\n\n const handleClickOutside = useCallback(\n (event: globalThis.MouseEvent) => {\n const target = event.target as Node | null\n\n if (dateInputRef.current.boxSpan.contains(target)) {\n return\n }\n\n closeCalendarPicker()\n },\n [closeCalendarPicker]\n )\n\n const handleDateInputNext = useCallback(() => {\n if (!withTime) {\n return\n }\n\n timeInputRef.current.focus()\n }, [withTime])\n\n const handleDateInputFilled = useCallback(\n (nextDateTuple: DateTuple) => {\n selectedDateTupleRef.current = nextDateTuple\n\n // If there is no time input or a time has already been selected,\n if (!withTime || selectedTimeTupleRef.current) {\n // we must update the selected date and call onChange()\n const timeTuple = (withTime ? selectedTimeTupleRef.current : ['00', '00']) as TimeTuple\n const nextDate = getDateFromDateAndTimeTuple(nextDateTuple, timeTuple)\n\n selectedDateRef.current = nextDate\n\n submit()\n }\n\n handleDateInputNext()\n },\n [handleDateInputNext, submit, withTime]\n )\n\n const handleCalendarPickerChange = useCallback(\n (nextDateTuple: DateTuple) => {\n // If this is a date picker without a time input,\n if (!withTime) {\n // we have to fix the date at the beginning of the day\n const nextDate = getDateFromDateAndTimeTuple(nextDateTuple, ['00', '00'])\n\n selectedDateRef.current = nextDate\n }\n\n // If this is a date picker with a time input,\n else {\n // we include the selected time if it exists, set it at the beginning of the day if not\n const nextDate = getDateFromDateAndTimeTuple(nextDateTuple, selectedTimeTupleRef.current || ['00', '00'])\n selectedDateRef.current = nextDate\n }\n\n selectedDateTupleRef.current = nextDateTuple\n selectedTimeTupleRef.current = getTimeTupleFromDate(selectedDateRef.current)\n\n closeCalendarPicker()\n forceUpdate()\n\n submit()\n },\n [closeCalendarPicker, forceUpdate, submit, withTime]\n )\n\n const handleTimeInputFilled = useCallback(\n (nextTimeTuple: TimeTuple) => {\n // If a date has already been selected\n if (selectedDateTupleRef.current) {\n // we must update the selected date accordingly and submit it\n const nextDate = getDateFromDateAndTimeTuple(selectedDateTupleRef.current, nextTimeTuple)\n\n selectedDateRef.current = nextDate\n\n submit()\n }\n\n selectedTimeTupleRef.current = nextTimeTuple\n\n submit()\n },\n [submit]\n )\n\n const openCalendarPicker = useCallback(() => {\n isCalendarPickerOpenRef.current = true\n\n forceUpdate()\n }, [forceUpdate])\n\n useEffect(() => {\n window.document.addEventListener('click', handleClickOutside)\n\n return () => {\n window.document.removeEventListener('click', handleClickOutside)\n }\n }, [handleClickOutside])\n\n return (\n <Fieldset className=\"DateRangePicker\">\n <Legend isHidden={isLabelHidden}>{label}</Legend>\n\n <Box>\n <Field>\n <DateInput\n ref={dateInputRef}\n defaultValue={selectedDateTupleRef.current}\n isForcedFocused={isCalendarPickerOpenRef.current}\n onChange={handleDateInputFilled}\n onClick={openCalendarPicker}\n onNext={handleDateInputNext}\n />\n </Field>\n\n {withTime && (\n <Field isTimeField>\n <TimeInput\n ref={timeInputRef}\n defaultValue={selectedTimeTupleRef.current}\n minutesRange={minutesRange}\n onBack={() => dateInputRef.current.focus(true)}\n onChange={handleTimeInputFilled}\n onFocus={closeCalendarPicker}\n onPrevious={() => dateInputRef.current.focus(true)}\n />\n </Field>\n )}\n </Box>\n\n {isCalendarPickerOpenRef.current && (\n <CalendarPicker\n defaultValue={rangeCalendarPickerDefaultValue}\n isHistorical={isHistorical}\n onChange={handleCalendarPickerChange}\n />\n )}\n </Fieldset>\n )\n}\n\nconst Box = styled.div`\n * {\n font-weight: 500;\n line-height: 1;\n }\n\n color: ${p => p.theme.color.gunMetal};\n font-size: 13px;\n position: relative;\n`\n\nconst Field = styled.span<{\n isEndDateField?: boolean\n isTimeField?: boolean\n}>`\n font-size: inherit;\n margin-left: ${p => {\n if (p.isEndDateField) {\n return '0.625rem'\n }\n\n return p.isTimeField ? '0.125rem' : 0\n }};\n`\n"],"names":["_jsxs","_jsx"],"mappings":"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"}
|
|
@@ -1,84 +0,0 @@
|
|
|
1
|
-
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
2
|
-
import { forwardRef, useRef, useState, useImperativeHandle, useMemo, useCallback } from 'react';
|
|
3
|
-
import styled from 'styled-components';
|
|
4
|
-
import { getUtcizedDayjs } from '../../utils/getUtcizedDayjs.js';
|
|
5
|
-
import { NumberInput } from './NumberInput.js';
|
|
6
|
-
import { formatNumberAsDoubleDigit } from './utils.js';
|
|
7
|
-
|
|
8
|
-
function DateInputWithRef({ defaultValue, isEndDate = false, isForcedFocused, isStartDate = false, onBack, onChange, onClick, onNext, onPrevious }, ref) {
|
|
9
|
-
const boxSpanRef = useRef();
|
|
10
|
-
const dayInputRef = useRef();
|
|
11
|
-
const monthInputRef = useRef();
|
|
12
|
-
const yearInputRef = useRef();
|
|
13
|
-
const [hasFormatError, setHasFormatError] = useState(false);
|
|
14
|
-
const [hasValidationError, setHasValidationError] = useState(false);
|
|
15
|
-
const [isFocused, setIsFocused] = useState(false);
|
|
16
|
-
useImperativeHandle(ref, () => ({
|
|
17
|
-
boxSpan: boxSpanRef.current,
|
|
18
|
-
focus: (isInLastInputOfTheGroup = false) => {
|
|
19
|
-
if (isInLastInputOfTheGroup) {
|
|
20
|
-
yearInputRef.current.focus();
|
|
21
|
-
}
|
|
22
|
-
else {
|
|
23
|
-
dayInputRef.current.focus();
|
|
24
|
-
}
|
|
25
|
-
}
|
|
26
|
-
}));
|
|
27
|
-
const currentUtcYear = useMemo(() => getUtcizedDayjs().year(), []);
|
|
28
|
-
const handleBlur = useCallback(() => {
|
|
29
|
-
setIsFocused(false);
|
|
30
|
-
}, []);
|
|
31
|
-
const handleFocus = useCallback(() => {
|
|
32
|
-
setIsFocused(true);
|
|
33
|
-
}, []);
|
|
34
|
-
const handleFormatError = useCallback((hasNextFormatError) => {
|
|
35
|
-
setHasFormatError(hasNextFormatError);
|
|
36
|
-
}, []);
|
|
37
|
-
const submit = useCallback(() => {
|
|
38
|
-
setHasValidationError(false);
|
|
39
|
-
switch (window.document.activeElement) {
|
|
40
|
-
case dayInputRef.current:
|
|
41
|
-
monthInputRef.current.focus();
|
|
42
|
-
break;
|
|
43
|
-
case monthInputRef.current:
|
|
44
|
-
yearInputRef.current.focus();
|
|
45
|
-
break;
|
|
46
|
-
}
|
|
47
|
-
if (!yearInputRef.current.value.length ||
|
|
48
|
-
!monthInputRef.current.value.length ||
|
|
49
|
-
!dayInputRef.current.value.length) {
|
|
50
|
-
if ((monthInputRef.current.value.length && !dayInputRef.current.value.length) ||
|
|
51
|
-
(yearInputRef.current.value.length &&
|
|
52
|
-
(!dayInputRef.current.value.length || !monthInputRef.current.value.length))) {
|
|
53
|
-
setHasValidationError(true);
|
|
54
|
-
}
|
|
55
|
-
return;
|
|
56
|
-
}
|
|
57
|
-
const nextDateTuple = [
|
|
58
|
-
String(yearInputRef.current.value),
|
|
59
|
-
formatNumberAsDoubleDigit(monthInputRef.current.value),
|
|
60
|
-
formatNumberAsDoubleDigit(dayInputRef.current.value)
|
|
61
|
-
];
|
|
62
|
-
onChange(nextDateTuple);
|
|
63
|
-
}, [onChange]);
|
|
64
|
-
return (jsxs(Box, { ref: boxSpanRef, hasError: hasFormatError || hasValidationError, isFocused: isForcedFocused || isFocused, children: [isStartDate && 'Du ', isEndDate && 'Au ', jsx(NumberInput, { ref: dayInputRef, "data-cy": `date-range-picker-${isStartDate ? 'start' : 'end'}-day`, defaultValue: defaultValue && formatNumberAsDoubleDigit(defaultValue[2]), max: 31, min: 1, onBack: onBack, onBlur: handleBlur, onClick: onClick, onFilled: submit, onFocus: handleFocus, onFormatError: handleFormatError, onNext: () => monthInputRef.current.focus(), onPrevious: onPrevious, size: 2 }), "/", jsx(NumberInput, { ref: monthInputRef, "data-cy": `date-range-picker-${isStartDate ? 'start' : 'end'}-month`, defaultValue: defaultValue && formatNumberAsDoubleDigit(defaultValue[1]), max: 12, min: 1, onBack: () => dayInputRef.current.focus(), onBlur: handleBlur, onClick: onClick, onFilled: submit, onFocus: handleFocus, onFormatError: handleFormatError, onNext: () => yearInputRef.current.focus(), onPrevious: () => dayInputRef.current.focus(), size: 2 }), "/", jsx(NumberInput, { ref: yearInputRef, "data-cy": `date-range-picker-${isStartDate ? 'start' : 'end'}-year`, defaultValue: defaultValue && defaultValue[0], max: currentUtcYear, min: 2020, onBack: () => monthInputRef.current.focus(), onBlur: handleBlur, onClick: onClick, onFilled: submit, onFocus: handleFocus, onFormatError: handleFormatError, onNext: onNext, onPrevious: () => monthInputRef.current.focus(), size: 4 })] }));
|
|
65
|
-
}
|
|
66
|
-
const DateInput = forwardRef(DateInputWithRef);
|
|
67
|
-
const Box = styled.span `
|
|
68
|
-
background-color: ${p => p.theme.color.gainsboro};
|
|
69
|
-
box-shadow: ${p => p.hasError || p.isFocused
|
|
70
|
-
? `inset 0px 0px 0px 1px ${p.hasError ? p.theme.color.maximumRed : p.theme.color.blueGray[100]}`
|
|
71
|
-
: 'none'};
|
|
72
|
-
color: ${p => p.theme.color.slateGray};
|
|
73
|
-
display: inline-block;
|
|
74
|
-
font-size: inherit;
|
|
75
|
-
padding: 0.3125rem 0.5rem 0.4375rem;
|
|
76
|
-
user-select: none;
|
|
77
|
-
|
|
78
|
-
:hover {
|
|
79
|
-
box-shadow: ${p => `inset 0px 0px 0px 1px ${p.theme.color.blueYonder[100]}`};
|
|
80
|
-
}
|
|
81
|
-
`;
|
|
82
|
-
|
|
83
|
-
export { DateInput };
|
|
84
|
-
//# sourceMappingURL=DateInput.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"DateInput.js","sources":["../../../../src/fields/DateRangePicker/DateInput.tsx"],"sourcesContent":["import { forwardRef, useCallback, useImperativeHandle, useMemo, useRef, useState } from 'react'\nimport styled from 'styled-components'\n\nimport { getUtcizedDayjs } from '../../utils/getUtcizedDayjs'\nimport { NumberInput } from './NumberInput'\nimport { formatNumberAsDoubleDigit } from './utils'\n\nimport type { NumberInputProps } from './NumberInput'\nimport type { DateTuple, DateOrTimeInputRef } from './types'\nimport type { ForwardedRef, MutableRefObject } from 'react'\nimport type { Promisable } from 'type-fest'\n\nexport type DateInputProps = Pick<NumberInputProps, 'onBack' | 'onPrevious' | 'onNext'> & {\n defaultValue?: DateTuple\n isEndDate?: boolean\n isForcedFocused: boolean\n isStartDate?: boolean\n /** Called each time the date input is changed to a new valid value. */\n onChange: (nextDateTuple: DateTuple) => Promisable<void>\n onClick: () => Promisable<void>\n}\nfunction DateInputWithRef(\n {\n defaultValue,\n isEndDate = false,\n isForcedFocused,\n isStartDate = false,\n onBack,\n onChange,\n onClick,\n onNext,\n onPrevious\n }: DateInputProps,\n ref: ForwardedRef<DateOrTimeInputRef>\n) {\n const boxSpanRef = useRef() as MutableRefObject<HTMLSpanElement>\n const dayInputRef = useRef() as MutableRefObject<HTMLInputElement>\n const monthInputRef = useRef() as MutableRefObject<HTMLInputElement>\n const yearInputRef = useRef() as MutableRefObject<HTMLInputElement>\n\n const [hasFormatError, setHasFormatError] = useState(false)\n const [hasValidationError, setHasValidationError] = useState(false)\n const [isFocused, setIsFocused] = useState(false)\n\n useImperativeHandle<DateOrTimeInputRef, DateOrTimeInputRef>(ref, () => ({\n boxSpan: boxSpanRef.current,\n focus: (isInLastInputOfTheGroup = false) => {\n if (isInLastInputOfTheGroup) {\n yearInputRef.current.focus()\n } else {\n dayInputRef.current.focus()\n }\n }\n }))\n\n const currentUtcYear = useMemo(() => getUtcizedDayjs().year(), [])\n\n const handleBlur = useCallback(() => {\n setIsFocused(false)\n }, [])\n\n const handleFocus = useCallback(() => {\n setIsFocused(true)\n }, [])\n\n const handleFormatError = useCallback((hasNextFormatError: boolean) => {\n setHasFormatError(hasNextFormatError)\n }, [])\n\n const submit = useCallback(() => {\n setHasValidationError(false)\n\n switch (window.document.activeElement) {\n case dayInputRef.current:\n monthInputRef.current.focus()\n break\n\n case monthInputRef.current:\n yearInputRef.current.focus()\n break\n\n default:\n break\n }\n\n if (\n !yearInputRef.current.value.length ||\n !monthInputRef.current.value.length ||\n !dayInputRef.current.value.length\n ) {\n if (\n (monthInputRef.current.value.length && !dayInputRef.current.value.length) ||\n (yearInputRef.current.value.length &&\n (!dayInputRef.current.value.length || !monthInputRef.current.value.length))\n ) {\n setHasValidationError(true)\n }\n\n return\n }\n\n const nextDateTuple: DateTuple = [\n String(yearInputRef.current.value),\n formatNumberAsDoubleDigit(monthInputRef.current.value),\n formatNumberAsDoubleDigit(dayInputRef.current.value)\n ]\n\n onChange(nextDateTuple)\n }, [onChange])\n\n return (\n <Box ref={boxSpanRef} hasError={hasFormatError || hasValidationError} isFocused={isForcedFocused || isFocused}>\n {isStartDate && 'Du '}\n {isEndDate && 'Au '}\n <NumberInput\n ref={dayInputRef}\n data-cy={`date-range-picker-${isStartDate ? 'start' : 'end'}-day`}\n defaultValue={defaultValue && formatNumberAsDoubleDigit(defaultValue[2])}\n max={31}\n min={1}\n onBack={onBack}\n onBlur={handleBlur}\n onClick={onClick}\n onFilled={submit}\n onFocus={handleFocus}\n onFormatError={handleFormatError}\n onNext={() => monthInputRef.current.focus()}\n onPrevious={onPrevious}\n size={2}\n />\n /\n <NumberInput\n ref={monthInputRef}\n data-cy={`date-range-picker-${isStartDate ? 'start' : 'end'}-month`}\n defaultValue={defaultValue && formatNumberAsDoubleDigit(defaultValue[1])}\n max={12}\n min={1}\n onBack={() => dayInputRef.current.focus()}\n onBlur={handleBlur}\n onClick={onClick}\n onFilled={submit}\n onFocus={handleFocus}\n onFormatError={handleFormatError}\n onNext={() => yearInputRef.current.focus()}\n onPrevious={() => dayInputRef.current.focus()}\n size={2}\n />\n /\n <NumberInput\n ref={yearInputRef}\n data-cy={`date-range-picker-${isStartDate ? 'start' : 'end'}-year`}\n defaultValue={defaultValue && defaultValue[0]}\n max={currentUtcYear}\n min={2020}\n onBack={() => monthInputRef.current.focus()}\n onBlur={handleBlur}\n onClick={onClick}\n onFilled={submit}\n onFocus={handleFocus}\n onFormatError={handleFormatError}\n onNext={onNext}\n onPrevious={() => monthInputRef.current.focus()}\n size={4}\n />\n </Box>\n )\n}\n\nexport const DateInput = forwardRef(DateInputWithRef)\n\nconst Box = styled.span<{\n hasError: boolean\n isFocused: boolean\n}>`\n background-color: ${p => p.theme.color.gainsboro};\n box-shadow: ${p =>\n p.hasError || p.isFocused\n ? `inset 0px 0px 0px 1px ${p.hasError ? p.theme.color.maximumRed : p.theme.color.blueGray[100]}`\n : 'none'};\n color: ${p => p.theme.color.slateGray};\n display: inline-block;\n font-size: inherit;\n padding: 0.3125rem 0.5rem 0.4375rem;\n user-select: none;\n\n :hover {\n box-shadow: ${p => `inset 0px 0px 0px 1px ${p.theme.color.blueYonder[100]}`};\n }\n`\n"],"names":["_jsxs","_jsx"],"mappings":"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"}
|
|
@@ -1,82 +0,0 @@
|
|
|
1
|
-
import { jsx } from 'react/jsx-runtime';
|
|
2
|
-
import { forwardRef, useRef, useMemo, useImperativeHandle, useCallback } from 'react';
|
|
3
|
-
import styled from 'styled-components';
|
|
4
|
-
|
|
5
|
-
function NumberInputWithRef({ defaultValue, max, min, onBack, onClick, onFilled, onFocus, onFormatError, onInput, onNext, onPrevious, size, ...nativeProps }, ref) {
|
|
6
|
-
const inputRef = useRef();
|
|
7
|
-
const placeholder = useMemo(() => '-'.repeat(size), [size]);
|
|
8
|
-
useImperativeHandle(ref, () => inputRef.current);
|
|
9
|
-
const handleClick = useCallback((event) => {
|
|
10
|
-
// event.stopPropagation()
|
|
11
|
-
if (onClick) {
|
|
12
|
-
onClick(event);
|
|
13
|
-
}
|
|
14
|
-
}, [onClick]);
|
|
15
|
-
const handleFocus = useCallback((event) => {
|
|
16
|
-
inputRef.current.select();
|
|
17
|
-
if (onFocus) {
|
|
18
|
-
onFocus(event);
|
|
19
|
-
}
|
|
20
|
-
}, [onFocus]);
|
|
21
|
-
const handleInput = useCallback(() => {
|
|
22
|
-
onFormatError(false);
|
|
23
|
-
const { value } = inputRef.current;
|
|
24
|
-
if (onInput) {
|
|
25
|
-
onInput(value);
|
|
26
|
-
}
|
|
27
|
-
if (value.length !== size) {
|
|
28
|
-
return;
|
|
29
|
-
}
|
|
30
|
-
const valueAsNumber = Number(inputRef.current.value);
|
|
31
|
-
if (Number.isNaN(valueAsNumber) || valueAsNumber < min || valueAsNumber > max) {
|
|
32
|
-
onFormatError(true);
|
|
33
|
-
return;
|
|
34
|
-
}
|
|
35
|
-
if (onFilled && value.length === size) {
|
|
36
|
-
onFilled();
|
|
37
|
-
}
|
|
38
|
-
}, [max, min, onFilled, onFormatError, onInput, size]);
|
|
39
|
-
const handleKeyDown = useCallback((event) => {
|
|
40
|
-
if (onPrevious &&
|
|
41
|
-
event.key === 'ArrowLeft' &&
|
|
42
|
-
inputRef.current.selectionStart === 0 &&
|
|
43
|
-
// We don't want to call that function when the user is selecting the input text
|
|
44
|
-
inputRef.current.selectionEnd === inputRef.current.selectionStart) {
|
|
45
|
-
event.preventDefault();
|
|
46
|
-
onPrevious();
|
|
47
|
-
return;
|
|
48
|
-
}
|
|
49
|
-
if (onNext &&
|
|
50
|
-
event.key === 'ArrowRight' &&
|
|
51
|
-
inputRef.current.selectionStart === inputRef.current.value.length &&
|
|
52
|
-
// We don't want to call that function when the user is selecting the input text
|
|
53
|
-
inputRef.current.selectionEnd === inputRef.current.selectionStart) {
|
|
54
|
-
event.preventDefault();
|
|
55
|
-
onNext();
|
|
56
|
-
return;
|
|
57
|
-
}
|
|
58
|
-
if (onBack && event.key === 'Backspace' && !inputRef.current.value.length) {
|
|
59
|
-
event.preventDefault();
|
|
60
|
-
onBack();
|
|
61
|
-
}
|
|
62
|
-
}, [onBack, onNext, onPrevious]);
|
|
63
|
-
return (jsx(StyledNumberInput, { ref: inputRef, defaultValue: defaultValue, maxLength: size, onClick: handleClick, onFocus: handleFocus, onInput: handleInput, onKeyDown: handleKeyDown, pattern: "\\d*", placeholder: placeholder, size: size, type: "text", ...nativeProps }, String(defaultValue)));
|
|
64
|
-
}
|
|
65
|
-
const NumberInput = forwardRef(NumberInputWithRef);
|
|
66
|
-
const StyledNumberInput = styled.input `
|
|
67
|
-
background-color: transparent;
|
|
68
|
-
border: 0;
|
|
69
|
-
font-size: inherit;
|
|
70
|
-
outline: none;
|
|
71
|
-
padding: 0;
|
|
72
|
-
text-align: center;
|
|
73
|
-
/* 1 digit = 0.5rem */
|
|
74
|
-
width: ${p => p.size * 0.5}rem;
|
|
75
|
-
|
|
76
|
-
::placeholder {
|
|
77
|
-
color: ${p => p.theme.color.slateGray};
|
|
78
|
-
}
|
|
79
|
-
`;
|
|
80
|
-
|
|
81
|
-
export { NumberInput };
|
|
82
|
-
//# sourceMappingURL=NumberInput.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"NumberInput.js","sources":["../../../../src/fields/DateRangePicker/NumberInput.tsx"],"sourcesContent":["import { forwardRef, KeyboardEvent, useCallback, useImperativeHandle, useMemo, useRef } from 'react'\nimport styled from 'styled-components'\n\nimport type { FocusEvent, ForwardedRef, InputHTMLAttributes, MouseEvent, MutableRefObject } from 'react'\nimport type { Promisable } from 'type-fest'\n\nexport type NumberInputProps = Omit<\n InputHTMLAttributes<HTMLInputElement>,\n 'maxLength' | 'onInput' | 'pattern' | 'type'\n> & {\n max: number\n min: number\n /** Called when the use press backspace key while the input is empty. */\n onBack?: () => Promisable<void>\n /** Called when the input value reaches the size property. */\n onFilled?: () => Promisable<void>\n onFormatError: (hasNextFormatError: boolean) => Promisable<void>\n onInput?: (nextValue: string) => Promisable<void>\n /** Called when the right arrow is pressed while the cursor is positionned at the input end. */\n onNext?: () => Promisable<void>\n /** Called when the left arrow is pressed while the cursor is positionned at the input start. */\n onPrevious?: () => Promisable<void>\n size: number\n}\nfunction NumberInputWithRef(\n {\n defaultValue,\n max,\n min,\n onBack,\n onClick,\n onFilled,\n onFocus,\n onFormatError,\n onInput,\n onNext,\n onPrevious,\n size,\n ...nativeProps\n }: NumberInputProps,\n ref: ForwardedRef<HTMLInputElement>\n) {\n const inputRef = useRef<HTMLInputElement>() as MutableRefObject<HTMLInputElement>\n\n const placeholder = useMemo(() => '-'.repeat(size), [size])\n\n useImperativeHandle(ref, () => inputRef.current as HTMLInputElement)\n\n const handleClick = useCallback(\n (event: MouseEvent<HTMLInputElement>) => {\n // event.stopPropagation()\n\n if (onClick) {\n onClick(event)\n }\n },\n [onClick]\n )\n\n const handleFocus = useCallback(\n (event: FocusEvent<HTMLInputElement>) => {\n inputRef.current.select()\n\n if (onFocus) {\n onFocus(event)\n }\n },\n [onFocus]\n )\n\n const handleInput = useCallback(() => {\n onFormatError(false)\n\n const { value } = inputRef.current\n if (onInput) {\n onInput(value)\n }\n if (value.length !== size) {\n return\n }\n\n const valueAsNumber = Number(inputRef.current.value)\n if (Number.isNaN(valueAsNumber) || valueAsNumber < min || valueAsNumber > max) {\n onFormatError(true)\n\n return\n }\n\n if (onFilled && value.length === size) {\n onFilled()\n }\n }, [max, min, onFilled, onFormatError, onInput, size])\n\n const handleKeyDown = useCallback(\n (event: KeyboardEvent<HTMLInputElement>) => {\n if (\n onPrevious &&\n event.key === 'ArrowLeft' &&\n inputRef.current.selectionStart === 0 &&\n // We don't want to call that function when the user is selecting the input text\n inputRef.current.selectionEnd === inputRef.current.selectionStart\n ) {\n event.preventDefault()\n\n onPrevious()\n\n return\n }\n\n if (\n onNext &&\n event.key === 'ArrowRight' &&\n inputRef.current.selectionStart === inputRef.current.value.length &&\n // We don't want to call that function when the user is selecting the input text\n inputRef.current.selectionEnd === inputRef.current.selectionStart\n ) {\n event.preventDefault()\n\n onNext()\n\n return\n }\n\n if (onBack && event.key === 'Backspace' && !inputRef.current.value.length) {\n event.preventDefault()\n\n onBack()\n }\n },\n [onBack, onNext, onPrevious]\n )\n\n return (\n <StyledNumberInput\n key={String(defaultValue)}\n ref={inputRef}\n defaultValue={defaultValue}\n maxLength={size}\n onClick={handleClick}\n onFocus={handleFocus}\n onInput={handleInput}\n onKeyDown={handleKeyDown}\n pattern=\"\\d*\"\n placeholder={placeholder}\n size={size}\n type=\"text\"\n {...nativeProps}\n />\n )\n}\n\nexport const NumberInput = forwardRef(NumberInputWithRef)\n\nconst StyledNumberInput = styled.input<{\n size: number\n}>`\n background-color: transparent;\n border: 0;\n font-size: inherit;\n outline: none;\n padding: 0;\n text-align: center;\n /* 1 digit = 0.5rem */\n width: ${p => p.size * 0.5}rem;\n\n ::placeholder {\n color: ${p => p.theme.color.slateGray};\n }\n`\n"],"names":["_jsx"],"mappings":";;;;AAwBA,SAAS,kBAAkB,CACzB,EACE,YAAY,EACZ,GAAG,EACH,GAAG,EACH,MAAM,EACN,OAAO,EACP,QAAQ,EACR,OAAO,EACP,aAAa,EACb,OAAO,EACP,MAAM,EACN,UAAU,EACV,IAAI,EACJ,GAAG,WAAW,EACG,EACnB,GAAmC,EAAA;AAEnC,IAAA,MAAM,QAAQ,GAAG,MAAM,EAA0D,CAAA;AAEjF,IAAA,MAAM,WAAW,GAAG,OAAO,CAAC,MAAM,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAA;IAE3D,mBAAmB,CAAC,GAAG,EAAE,MAAM,QAAQ,CAAC,OAA2B,CAAC,CAAA;AAEpE,IAAA,MAAM,WAAW,GAAG,WAAW,CAC7B,CAAC,KAAmC,KAAI;;AAGtC,QAAA,IAAI,OAAO,EAAE;YACX,OAAO,CAAC,KAAK,CAAC,CAAA;AACf,SAAA;AACH,KAAC,EACD,CAAC,OAAO,CAAC,CACV,CAAA;AAED,IAAA,MAAM,WAAW,GAAG,WAAW,CAC7B,CAAC,KAAmC,KAAI;AACtC,QAAA,QAAQ,CAAC,OAAO,CAAC,MAAM,EAAE,CAAA;AAEzB,QAAA,IAAI,OAAO,EAAE;YACX,OAAO,CAAC,KAAK,CAAC,CAAA;AACf,SAAA;AACH,KAAC,EACD,CAAC,OAAO,CAAC,CACV,CAAA;AAED,IAAA,MAAM,WAAW,GAAG,WAAW,CAAC,MAAK;QACnC,aAAa,CAAC,KAAK,CAAC,CAAA;AAEpB,QAAA,MAAM,EAAE,KAAK,EAAE,GAAG,QAAQ,CAAC,OAAO,CAAA;AAClC,QAAA,IAAI,OAAO,EAAE;YACX,OAAO,CAAC,KAAK,CAAC,CAAA;AACf,SAAA;AACD,QAAA,IAAI,KAAK,CAAC,MAAM,KAAK,IAAI,EAAE;YACzB,OAAM;AACP,SAAA;QAED,MAAM,aAAa,GAAG,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;AACpD,QAAA,IAAI,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,IAAI,aAAa,GAAG,GAAG,IAAI,aAAa,GAAG,GAAG,EAAE;YAC7E,aAAa,CAAC,IAAI,CAAC,CAAA;YAEnB,OAAM;AACP,SAAA;AAED,QAAA,IAAI,QAAQ,IAAI,KAAK,CAAC,MAAM,KAAK,IAAI,EAAE;AACrC,YAAA,QAAQ,EAAE,CAAA;AACX,SAAA;AACH,KAAC,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,QAAQ,EAAE,aAAa,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC,CAAA;AAEtD,IAAA,MAAM,aAAa,GAAG,WAAW,CAC/B,CAAC,KAAsC,KAAI;AACzC,QAAA,IACE,UAAU;YACV,KAAK,CAAC,GAAG,KAAK,WAAW;AACzB,YAAA,QAAQ,CAAC,OAAO,CAAC,cAAc,KAAK,CAAC;;YAErC,QAAQ,CAAC,OAAO,CAAC,YAAY,KAAK,QAAQ,CAAC,OAAO,CAAC,cAAc,EACjE;YACA,KAAK,CAAC,cAAc,EAAE,CAAA;AAEtB,YAAA,UAAU,EAAE,CAAA;YAEZ,OAAM;AACP,SAAA;AAED,QAAA,IACE,MAAM;YACN,KAAK,CAAC,GAAG,KAAK,YAAY;YAC1B,QAAQ,CAAC,OAAO,CAAC,cAAc,KAAK,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM;;YAEjE,QAAQ,CAAC,OAAO,CAAC,YAAY,KAAK,QAAQ,CAAC,OAAO,CAAC,cAAc,EACjE;YACA,KAAK,CAAC,cAAc,EAAE,CAAA;AAEtB,YAAA,MAAM,EAAE,CAAA;YAER,OAAM;AACP,SAAA;AAED,QAAA,IAAI,MAAM,IAAI,KAAK,CAAC,GAAG,KAAK,WAAW,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,EAAE;YACzE,KAAK,CAAC,cAAc,EAAE,CAAA;AAEtB,YAAA,MAAM,EAAE,CAAA;AACT,SAAA;KACF,EACD,CAAC,MAAM,EAAE,MAAM,EAAE,UAAU,CAAC,CAC7B,CAAA;IAED,QACEA,GAAC,CAAA,iBAAiB,EAEhB,EAAA,GAAG,EAAE,QAAQ,EACb,YAAY,EAAE,YAAY,EAC1B,SAAS,EAAE,IAAI,EACf,OAAO,EAAE,WAAW,EACpB,OAAO,EAAE,WAAW,EACpB,OAAO,EAAE,WAAW,EACpB,SAAS,EAAE,aAAa,EACxB,OAAO,EAAC,MAAK,EACb,WAAW,EAAE,WAAW,EACxB,IAAI,EAAE,IAAI,EACV,IAAI,EAAC,MAAM,EAAA,GACP,WAAW,EAAA,EAZV,MAAM,CAAC,YAAY,CAAC,CAazB,EACH;AACH,CAAC;MAEY,WAAW,GAAG,UAAU,CAAC,kBAAkB,EAAC;AAEzD,MAAM,iBAAiB,GAAG,MAAM,CAAC,KAAK,CAEpC,CAAA;;;;;;;;AAQS,SAAA,EAAA,CAAC,IAAI,CAAC,CAAC,IAAI,GAAG,GAAG,CAAA;;;aAGf,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,SAAS,CAAA;;CAExC;;;;"}
|