@mtes-mct/monitor-ui 1.7.2 → 1.7.4
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 +10 -0
- package/fields/Checkbox.d.ts +1 -1
- package/index.js +3440 -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,147 +0,0 @@
|
|
|
1
|
-
import { jsx } from 'react/jsx-runtime';
|
|
2
|
-
import { useRef, useState, useMemo, useCallback, useEffect } from 'react';
|
|
3
|
-
import { DateRangePicker } from 'rsuite';
|
|
4
|
-
import styled from 'styled-components';
|
|
5
|
-
import { capitalizeFirstLetter } from '../../utils/capitalizeFirstLetter.js';
|
|
6
|
-
import '../../utils/dayjs.js';
|
|
7
|
-
import { getUtcDayjs } from '../../utils/getUtcDayjs.js';
|
|
8
|
-
import { getUtcizedDayjs } from '../../utils/getUtcizedDayjs.js';
|
|
9
|
-
import { sortDates } from '../../utils/sortDates.js';
|
|
10
|
-
import { stopMouseEventPropagation } from '../../utils/stopMouseEventPropagation.js';
|
|
11
|
-
import { RSUITE_CALENDAR_LOCALE } from './constants.js';
|
|
12
|
-
import { getDateTupleFromDate } from './utils.js';
|
|
13
|
-
import dayjs_minExports from '../../../_virtual/dayjs.min2.js';
|
|
14
|
-
|
|
15
|
-
function RangeCalendarPicker({ defaultValue, isHistorical, onChange }) {
|
|
16
|
-
const boxRef = useRef();
|
|
17
|
-
const selectedFirstDate = useRef();
|
|
18
|
-
const calendarRef = useRef();
|
|
19
|
-
const [isFirstLoad, setIsFirstLoad] = useState(true);
|
|
20
|
-
const controlledValue = useMemo(() => (defaultValue ? sortDates(defaultValue) : undefined), [defaultValue]);
|
|
21
|
-
const utcTodayAsDayjs = useMemo(() => getUtcDayjs().endOf('day'), []);
|
|
22
|
-
const disabledDate = useMemo(() => (date) => isHistorical ? getUtcizedDayjs(date).isAfter(utcTodayAsDayjs) : false, [isHistorical, utcTodayAsDayjs]);
|
|
23
|
-
const handleSelect = useCallback((nextDate) => {
|
|
24
|
-
if (!selectedFirstDate.current) {
|
|
25
|
-
selectedFirstDate.current = nextDate;
|
|
26
|
-
return;
|
|
27
|
-
}
|
|
28
|
-
const sortedDateRange = sortDates([selectedFirstDate.current, nextDate]);
|
|
29
|
-
const [startDate, endDate] = sortedDateRange;
|
|
30
|
-
const startDateTuple = getDateTupleFromDate(startDate);
|
|
31
|
-
const endDateTuple = getDateTupleFromDate(endDate);
|
|
32
|
-
const nextDateTupleRange = [startDateTuple, endDateTuple];
|
|
33
|
-
onChange(nextDateTupleRange);
|
|
34
|
-
}, [onChange]);
|
|
35
|
-
const renderTitle = useCallback((date) => capitalizeFirstLetter(dayjs_minExports(date).format('MMMM YYYY')), []);
|
|
36
|
-
useEffect(() => {
|
|
37
|
-
// We wait for the <Box /> to render so that `boxRef` is defined
|
|
38
|
-
// and can be used as a container for <RsuiteDateRangePicker />
|
|
39
|
-
setIsFirstLoad(false);
|
|
40
|
-
}, []);
|
|
41
|
-
return (jsx(Box, { ref: boxRef, onClick: stopMouseEventPropagation, children: !isFirstLoad && (jsx(DateRangePicker, { ref: calendarRef, container: boxRef.current, disabledDate: disabledDate, format: "yyyy-MM-dd", locale: RSUITE_CALENDAR_LOCALE, onSelect: handleSelect, open: true, ranges: [], renderTitle: renderTitle,
|
|
42
|
-
// `defaultValue` seems to be immediatly cancelled so we come down to using a controlled `value`
|
|
43
|
-
value: controlledValue })) }));
|
|
44
|
-
}
|
|
45
|
-
const Box = styled.div `
|
|
46
|
-
height: 0;
|
|
47
|
-
position: relative;
|
|
48
|
-
user-select: none;
|
|
49
|
-
|
|
50
|
-
.rs-picker-toggle {
|
|
51
|
-
display: none;
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
.rs-picker-daterange-panel {
|
|
55
|
-
height: 290px;
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
.rs-picker-daterange-menu {
|
|
59
|
-
border: solid 1px ${p => p.theme.color.lightGray};
|
|
60
|
-
border-radius: 0;
|
|
61
|
-
margin-top: 0.25rem;
|
|
62
|
-
|
|
63
|
-
.rs-picker-daterange-header,
|
|
64
|
-
.rs-calendar-header-time-toolbar,
|
|
65
|
-
.rs-picker-toolbar {
|
|
66
|
-
display: none;
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
.rs-calendar {
|
|
70
|
-
height: auto !important;
|
|
71
|
-
padding: 0;
|
|
72
|
-
|
|
73
|
-
:first-child {
|
|
74
|
-
border-right: solid 1px ${p => p.theme.color.lightGray};
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
.rs-calendar-header {
|
|
78
|
-
border-bottom: solid 1px ${p => p.theme.color.lightGray};
|
|
79
|
-
padding: 0.5rem;
|
|
80
|
-
|
|
81
|
-
.rs-calendar-header-month-toolbar {
|
|
82
|
-
align-items: center;
|
|
83
|
-
color: ${p => p.theme.color.slateGray};
|
|
84
|
-
display: flex;
|
|
85
|
-
justify-content: space-between;
|
|
86
|
-
|
|
87
|
-
.rs-calendar-header-title {
|
|
88
|
-
font-size: inherit;
|
|
89
|
-
text-transform: uppercase;
|
|
90
|
-
|
|
91
|
-
&.rs-calendar-header-error {
|
|
92
|
-
color: ${p => p.theme.color.slateGray};
|
|
93
|
-
|
|
94
|
-
:hover {
|
|
95
|
-
color: ${p => p.theme.color.slateGray};
|
|
96
|
-
}
|
|
97
|
-
}
|
|
98
|
-
}
|
|
99
|
-
}
|
|
100
|
-
}
|
|
101
|
-
|
|
102
|
-
.rs-calendar-view {
|
|
103
|
-
padding: 0.75rem 0.5rem 0;
|
|
104
|
-
|
|
105
|
-
.rs-calendar-table-cell {
|
|
106
|
-
padding: 0 0 0.25rem 0;
|
|
107
|
-
width: 33px;
|
|
108
|
-
|
|
109
|
-
&.rs-calendar-table-cell-in-range:before {
|
|
110
|
-
background-color: ${p => p.theme.color.blueGray[25]};
|
|
111
|
-
height: 33px;
|
|
112
|
-
margin-top: 0;
|
|
113
|
-
}
|
|
114
|
-
|
|
115
|
-
> .rs-calendar-table-cell-content {
|
|
116
|
-
align-items: center;
|
|
117
|
-
border-radius: 0 !important;
|
|
118
|
-
display: inline-flex;
|
|
119
|
-
height: 33px;
|
|
120
|
-
justify-content: center;
|
|
121
|
-
padding-bottom: 3px;
|
|
122
|
-
width: 33px;
|
|
123
|
-
}
|
|
124
|
-
:hover .rs-calendar-table-cell-content {
|
|
125
|
-
background-color: ${p => p.theme.color.blueYonder[25]};
|
|
126
|
-
color: ${p => p.theme.color.blueYonder[100]};
|
|
127
|
-
}
|
|
128
|
-
&[role='columnheader'] .rs-calendar-table-cell-content,
|
|
129
|
-
&[role='columnheader']:hover .rs-calendar-table-cell-content {
|
|
130
|
-
background-color: transparent;
|
|
131
|
-
color: ${p => p.theme.color.slateGray};
|
|
132
|
-
}
|
|
133
|
-
&.rs-calendar-table-cell-disabled .rs-calendar-table-cell-content {
|
|
134
|
-
background-color: transparent;
|
|
135
|
-
color: ${p => p.theme.color.lightGray};
|
|
136
|
-
}
|
|
137
|
-
&.rs-calendar-table-cell-selected > .rs-calendar-table-cell-content {
|
|
138
|
-
background-color: ${p => p.theme.color.blueGray[100]};
|
|
139
|
-
}
|
|
140
|
-
}
|
|
141
|
-
}
|
|
142
|
-
}
|
|
143
|
-
}
|
|
144
|
-
`;
|
|
145
|
-
|
|
146
|
-
export { RangeCalendarPicker };
|
|
147
|
-
//# sourceMappingURL=RangeCalendarPicker.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"RangeCalendarPicker.js","sources":["../../../../src/fields/DateRangePicker/RangeCalendarPicker.tsx"],"sourcesContent":["import { useCallback, useEffect, useMemo, useRef, useState } from 'react'\nimport { DateRangePicker as RsuiteDateRangePicker } from 'rsuite'\nimport styled from 'styled-components'\n\nimport { capitalizeFirstLetter } from '../../utils/capitalizeFirstLetter'\nimport { dayjs } from '../../utils/dayjs'\nimport { getUtcDayjs } from '../../utils/getUtcDayjs'\nimport { getUtcizedDayjs } from '../../utils/getUtcizedDayjs'\nimport { sortDates } from '../../utils/sortDates'\nimport { stopMouseEventPropagation } from '../../utils/stopMouseEventPropagation'\nimport { RSUITE_CALENDAR_LOCALE } from './constants'\nimport { getDateTupleFromDate } from './utils'\n\nimport type { DateRange } from '../../types'\nimport type { DateTupleRange } from './types'\nimport type { MutableRefObject } from 'react'\nimport type { Promisable } from 'type-fest'\n\ntype RangeCalendarPickerProps = {\n defaultValue?: DateRange\n isHistorical?: boolean\n onChange: (nextDateTupleRange: DateTupleRange) => Promisable<void>\n}\nexport function RangeCalendarPicker({ defaultValue, isHistorical, onChange }: RangeCalendarPickerProps) {\n const boxRef = useRef() as MutableRefObject<HTMLDivElement>\n const selectedFirstDate = useRef<Date>()\n const calendarRef = useRef<any>()\n\n const [isFirstLoad, setIsFirstLoad] = useState(true)\n\n const controlledValue = useMemo(\n () => (defaultValue ? (sortDates(defaultValue) as DateRange) : undefined),\n [defaultValue]\n )\n const utcTodayAsDayjs = useMemo(() => getUtcDayjs().endOf('day'), [])\n const disabledDate = useMemo(\n () => (date: Date) => isHistorical ? getUtcizedDayjs(date).isAfter(utcTodayAsDayjs) : false,\n [isHistorical, utcTodayAsDayjs]\n )\n\n const handleSelect = useCallback(\n (nextDate: Date) => {\n if (!selectedFirstDate.current) {\n selectedFirstDate.current = nextDate\n\n return\n }\n\n const sortedDateRange = sortDates([selectedFirstDate.current, nextDate]) as DateRange\n const [startDate, endDate] = sortedDateRange\n const startDateTuple = getDateTupleFromDate(startDate)\n const endDateTuple = getDateTupleFromDate(endDate)\n const nextDateTupleRange = [startDateTuple, endDateTuple] as DateTupleRange\n\n onChange(nextDateTupleRange)\n },\n [onChange]\n )\n\n const renderTitle = useCallback((date: Date) => capitalizeFirstLetter(dayjs(date).format('MMMM YYYY')), [])\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 <Box ref={boxRef} onClick={stopMouseEventPropagation}>\n {!isFirstLoad && (\n <RsuiteDateRangePicker\n ref={calendarRef}\n container={boxRef.current}\n disabledDate={disabledDate}\n format=\"yyyy-MM-dd\"\n locale={RSUITE_CALENDAR_LOCALE}\n onSelect={handleSelect}\n open\n ranges={[]}\n renderTitle={renderTitle}\n // `defaultValue` seems to be immediatly cancelled so we come down to using a controlled `value`\n value={controlledValue}\n />\n )}\n </Box>\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-daterange-panel {\n height: 290px;\n }\n\n .rs-picker-daterange-menu {\n border: solid 1px ${p => p.theme.color.lightGray};\n border-radius: 0;\n margin-top: 0.25rem;\n\n .rs-picker-daterange-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":["dayjs","_jsx","RsuiteDateRangePicker"],"mappings":"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"}
|
|
@@ -1,90 +0,0 @@
|
|
|
1
|
-
import { jsx, Fragment } from 'react/jsx-runtime';
|
|
2
|
-
import { useMemo, useState, useCallback, useEffect } from 'react';
|
|
3
|
-
import styled from 'styled-components';
|
|
4
|
-
import { stopMouseEventPropagation } from '../../utils/stopMouseEventPropagation.js';
|
|
5
|
-
import { getRangedTimeOptions } from './utils.js';
|
|
6
|
-
|
|
7
|
-
function RangedTimePicker({ filter, minutesRange, onChange }) {
|
|
8
|
-
const rangedTimeOptions = useMemo(() => getRangedTimeOptions(minutesRange), [minutesRange]);
|
|
9
|
-
const filteredRangedTimeOptions = useMemo(() => rangedTimeOptions.filter(({ label }) => filter.test(label)), [filter, rangedTimeOptions]);
|
|
10
|
-
const [selectedOptionIndex, setSelectedOptionIndex] = useState(0);
|
|
11
|
-
const handleBoxKeyDown = useCallback((event) => {
|
|
12
|
-
if (event.key === 'ArrowDown') {
|
|
13
|
-
event.preventDefault();
|
|
14
|
-
const nextSelectedOptionIndex = selectedOptionIndex < filteredRangedTimeOptions.length - 1 ? selectedOptionIndex + 1 : 0;
|
|
15
|
-
setSelectedOptionIndex(nextSelectedOptionIndex);
|
|
16
|
-
window.document.querySelectorAll('.js-ranged-time-picker-option')[nextSelectedOptionIndex]?.scrollIntoView();
|
|
17
|
-
}
|
|
18
|
-
if (event.key === 'ArrowUp') {
|
|
19
|
-
event.preventDefault();
|
|
20
|
-
const nextSelectedOptionIndex = selectedOptionIndex > 0 ? selectedOptionIndex - 1 : filteredRangedTimeOptions.length - 1;
|
|
21
|
-
setSelectedOptionIndex(nextSelectedOptionIndex);
|
|
22
|
-
window.document.querySelectorAll('.js-ranged-time-picker-option')[nextSelectedOptionIndex]?.scrollIntoView();
|
|
23
|
-
}
|
|
24
|
-
if (['Enter', 'Space', 'Tab'].includes(event.key)) {
|
|
25
|
-
const selectedRangedTimeOption = filteredRangedTimeOptions[selectedOptionIndex];
|
|
26
|
-
if (!selectedRangedTimeOption) {
|
|
27
|
-
return;
|
|
28
|
-
}
|
|
29
|
-
onChange(selectedRangedTimeOption.value);
|
|
30
|
-
}
|
|
31
|
-
}, [filteredRangedTimeOptions, selectedOptionIndex, onChange]);
|
|
32
|
-
useEffect(() => {
|
|
33
|
-
window.addEventListener('keydown', handleBoxKeyDown, {
|
|
34
|
-
// eslint-disable-next-line @typescript-eslint/naming-convention
|
|
35
|
-
once: true
|
|
36
|
-
});
|
|
37
|
-
return () => {
|
|
38
|
-
window.removeEventListener('keydown', handleBoxKeyDown);
|
|
39
|
-
};
|
|
40
|
-
}, [handleBoxKeyDown]);
|
|
41
|
-
useEffect(() => {
|
|
42
|
-
setSelectedOptionIndex(0);
|
|
43
|
-
}, [filteredRangedTimeOptions]);
|
|
44
|
-
if (!filteredRangedTimeOptions.length) {
|
|
45
|
-
return jsx(Fragment, {});
|
|
46
|
-
}
|
|
47
|
-
return (jsx(Box, { onClick: stopMouseEventPropagation, role: "listbox", children: filteredRangedTimeOptions.map(({ label, value }, index) => (jsx(Option, { "aria-selected": false, className: "js-ranged-time-picker-option", isSelected: index === selectedOptionIndex, onClick: () => onChange(value), role: "option", tabIndex: -1, children: label }, label))) }));
|
|
48
|
-
}
|
|
49
|
-
const Box = styled.div `
|
|
50
|
-
background-color: ${p => p.theme.color.gainsboro};
|
|
51
|
-
display: flex;
|
|
52
|
-
flex-direction: column;
|
|
53
|
-
left: -1px;
|
|
54
|
-
max-height: 10rem;
|
|
55
|
-
overflow: auto;
|
|
56
|
-
position: absolute;
|
|
57
|
-
/* Non-WebKit Firefox Compatibility */
|
|
58
|
-
scrollbar-color: ${p => p.theme.color.lightGray};
|
|
59
|
-
scrollbar-width: thin;
|
|
60
|
-
top: 2.25rem;
|
|
61
|
-
z-index: 9999;
|
|
62
|
-
|
|
63
|
-
::-webkit-scrollbar {
|
|
64
|
-
-webkit-appearance: none;
|
|
65
|
-
}
|
|
66
|
-
::-webkit-scrollbar:vertical {
|
|
67
|
-
width: 0.33rem;
|
|
68
|
-
}
|
|
69
|
-
::-webkit-scrollbar-thumb {
|
|
70
|
-
border: 0;
|
|
71
|
-
background-color: ${p => p.theme.color.lightGray};
|
|
72
|
-
}
|
|
73
|
-
::-webkit-scrollbar-track {
|
|
74
|
-
background-color: ${p => p.theme.color.gainsboro};
|
|
75
|
-
}
|
|
76
|
-
`;
|
|
77
|
-
const Option = styled.div `
|
|
78
|
-
background-color: ${p => (p.isSelected ? p.theme.color.blueGray[100] : 'transparent')};
|
|
79
|
-
cursor: pointer;
|
|
80
|
-
line-height: 1;
|
|
81
|
-
padding: 5px 9px 7px 8px;
|
|
82
|
-
text-align: center;
|
|
83
|
-
|
|
84
|
-
:hover {
|
|
85
|
-
background-color: ${p => (p.isSelected ? p.theme.color.blueGray[100] : p.theme.color.blueYonder[25])};
|
|
86
|
-
}
|
|
87
|
-
`;
|
|
88
|
-
|
|
89
|
-
export { RangedTimePicker };
|
|
90
|
-
//# sourceMappingURL=RangedTimePicker.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"RangedTimePicker.js","sources":["../../../../src/fields/DateRangePicker/RangedTimePicker.tsx"],"sourcesContent":["import { Fragment, useCallback, useEffect, useMemo, useState } from 'react'\nimport styled from 'styled-components'\n\nimport { stopMouseEventPropagation } from '../../utils/stopMouseEventPropagation'\nimport { getRangedTimeOptions } from './utils'\n\nimport type { TimeTuple } from './types'\nimport type { Promisable } from 'type-fest'\n\ntype RangedTimePickerProps = {\n filter: RegExp\n minutesRange: number\n onChange: (nextTimeTuple: TimeTuple) => Promisable<void>\n}\nexport function RangedTimePicker({ filter, minutesRange, onChange }: RangedTimePickerProps) {\n const rangedTimeOptions = useMemo(() => getRangedTimeOptions(minutesRange), [minutesRange])\n const filteredRangedTimeOptions = useMemo(\n () => rangedTimeOptions.filter(({ label }) => filter.test(label)),\n [filter, rangedTimeOptions]\n )\n\n const [selectedOptionIndex, setSelectedOptionIndex] = useState(0)\n\n const handleBoxKeyDown = useCallback(\n (event: globalThis.KeyboardEvent) => {\n if (event.key === 'ArrowDown') {\n event.preventDefault()\n\n const nextSelectedOptionIndex =\n selectedOptionIndex < filteredRangedTimeOptions.length - 1 ? selectedOptionIndex + 1 : 0\n\n setSelectedOptionIndex(nextSelectedOptionIndex)\n\n window.document.querySelectorAll('.js-ranged-time-picker-option')[nextSelectedOptionIndex]?.scrollIntoView()\n }\n\n if (event.key === 'ArrowUp') {\n event.preventDefault()\n\n const nextSelectedOptionIndex =\n selectedOptionIndex > 0 ? selectedOptionIndex - 1 : filteredRangedTimeOptions.length - 1\n\n setSelectedOptionIndex(nextSelectedOptionIndex)\n\n window.document.querySelectorAll('.js-ranged-time-picker-option')[nextSelectedOptionIndex]?.scrollIntoView()\n }\n\n if (['Enter', 'Space', 'Tab'].includes(event.key)) {\n const selectedRangedTimeOption = filteredRangedTimeOptions[selectedOptionIndex]\n if (!selectedRangedTimeOption) {\n return\n }\n\n onChange(selectedRangedTimeOption.value)\n }\n },\n [filteredRangedTimeOptions, selectedOptionIndex, onChange]\n )\n\n useEffect(() => {\n window.addEventListener('keydown', handleBoxKeyDown, {\n // eslint-disable-next-line @typescript-eslint/naming-convention\n once: true\n })\n\n return () => {\n window.removeEventListener('keydown', handleBoxKeyDown)\n }\n }, [handleBoxKeyDown])\n\n useEffect(() => {\n setSelectedOptionIndex(0)\n }, [filteredRangedTimeOptions])\n\n if (!filteredRangedTimeOptions.length) {\n return <></>\n }\n\n return (\n <Box onClick={stopMouseEventPropagation} role=\"listbox\">\n {filteredRangedTimeOptions.map(({ label, value }, index) => (\n <Option\n key={label}\n aria-selected={false}\n className=\"js-ranged-time-picker-option\"\n isSelected={index === selectedOptionIndex}\n onClick={() => onChange(value)}\n role=\"option\"\n tabIndex={-1}\n >\n {label}\n </Option>\n ))}\n </Box>\n )\n}\n\nconst Box = styled.div`\n background-color: ${p => p.theme.color.gainsboro};\n display: flex;\n flex-direction: column;\n left: -1px;\n max-height: 10rem;\n overflow: auto;\n position: absolute;\n /* Non-WebKit Firefox Compatibility */\n scrollbar-color: ${p => p.theme.color.lightGray};\n scrollbar-width: thin;\n top: 2.25rem;\n z-index: 9999;\n\n ::-webkit-scrollbar {\n -webkit-appearance: none;\n }\n ::-webkit-scrollbar:vertical {\n width: 0.33rem;\n }\n ::-webkit-scrollbar-thumb {\n border: 0;\n background-color: ${p => p.theme.color.lightGray};\n }\n ::-webkit-scrollbar-track {\n background-color: ${p => p.theme.color.gainsboro};\n }\n`\n\nconst Option = styled.div<{\n isSelected: boolean\n}>`\n background-color: ${p => (p.isSelected ? p.theme.color.blueGray[100] : 'transparent')};\n cursor: pointer;\n line-height: 1;\n padding: 5px 9px 7px 8px;\n text-align: center;\n\n :hover {\n background-color: ${p => (p.isSelected ? p.theme.color.blueGray[100] : p.theme.color.blueYonder[25])};\n }\n`\n"],"names":["_jsx"],"mappings":"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"}
|
|
@@ -1,116 +0,0 @@
|
|
|
1
|
-
import { jsxs, Fragment, jsx } from 'react/jsx-runtime';
|
|
2
|
-
import { forwardRef, useRef, useState, useImperativeHandle, useCallback, useEffect } from 'react';
|
|
3
|
-
import styled from 'styled-components';
|
|
4
|
-
import { useForceUpdate } from '../../hooks/useForceUpdate.js';
|
|
5
|
-
import { NumberInput } from './NumberInput.js';
|
|
6
|
-
import { RangedTimePicker } from './RangedTimePicker.js';
|
|
7
|
-
|
|
8
|
-
function TimeInputWithRef({ defaultValue, isStartDate = false, minutesRange = 15, onBack, onChange, onFocus, onNext, onPrevious }, ref) {
|
|
9
|
-
const boxSpanRef = useRef();
|
|
10
|
-
const hourInputRef = useRef();
|
|
11
|
-
const minuteInputRef = useRef();
|
|
12
|
-
const [controlledDefaultValue, setControlledDefaultValue] = useState(defaultValue);
|
|
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
|
-
minuteInputRef.current.focus();
|
|
21
|
-
}
|
|
22
|
-
else {
|
|
23
|
-
hourInputRef.current.focus();
|
|
24
|
-
}
|
|
25
|
-
}
|
|
26
|
-
}));
|
|
27
|
-
const isRangedTimePickerOpenRef = useRef(false);
|
|
28
|
-
const [rangedTimePickerFilter, setRangedTimePickerFilter] = useState(/.*/);
|
|
29
|
-
const { forceUpdate } = useForceUpdate();
|
|
30
|
-
const closeRangedTimePicker = useCallback(() => {
|
|
31
|
-
isRangedTimePickerOpenRef.current = false;
|
|
32
|
-
forceUpdate();
|
|
33
|
-
}, [forceUpdate]);
|
|
34
|
-
const handleBack = useCallback(() => {
|
|
35
|
-
if (!onBack) {
|
|
36
|
-
return;
|
|
37
|
-
}
|
|
38
|
-
closeRangedTimePicker();
|
|
39
|
-
onBack();
|
|
40
|
-
}, [closeRangedTimePicker, onBack]);
|
|
41
|
-
const handleBlur = useCallback(() => {
|
|
42
|
-
setIsFocused(false);
|
|
43
|
-
}, []);
|
|
44
|
-
const handleClickOutside = useCallback((event) => {
|
|
45
|
-
const target = event.target;
|
|
46
|
-
if (hourInputRef.current.contains(target) || minuteInputRef.current.contains(target)) {
|
|
47
|
-
return;
|
|
48
|
-
}
|
|
49
|
-
closeRangedTimePicker();
|
|
50
|
-
}, [closeRangedTimePicker]);
|
|
51
|
-
const handleFocus = useCallback(() => {
|
|
52
|
-
setIsFocused(true);
|
|
53
|
-
if (onFocus) {
|
|
54
|
-
onFocus();
|
|
55
|
-
}
|
|
56
|
-
}, [onFocus]);
|
|
57
|
-
const handleFormatError = useCallback((hasNextFormatError) => {
|
|
58
|
-
setHasFormatError(hasNextFormatError);
|
|
59
|
-
}, []);
|
|
60
|
-
const handleRangedTimePickedChange = useCallback((nextTimeTuple) => {
|
|
61
|
-
closeRangedTimePicker();
|
|
62
|
-
setControlledDefaultValue(nextTimeTuple);
|
|
63
|
-
onChange(nextTimeTuple);
|
|
64
|
-
}, [closeRangedTimePicker, onChange]);
|
|
65
|
-
const handleHourInput = useCallback((nextValue) => {
|
|
66
|
-
// eslint-disable-next-line no-nested-ternary
|
|
67
|
-
const nextRangedTimePickerFilter = nextValue.length ? new RegExp(`^${nextValue}`) : /.*/;
|
|
68
|
-
setRangedTimePickerFilter(nextRangedTimePickerFilter);
|
|
69
|
-
}, []);
|
|
70
|
-
const openRangedTimePicker = useCallback(() => {
|
|
71
|
-
isRangedTimePickerOpenRef.current = true;
|
|
72
|
-
forceUpdate();
|
|
73
|
-
}, [forceUpdate]);
|
|
74
|
-
useEffect(() => {
|
|
75
|
-
window.document.addEventListener('click', handleClickOutside);
|
|
76
|
-
return () => {
|
|
77
|
-
window.document.removeEventListener('click', handleClickOutside);
|
|
78
|
-
};
|
|
79
|
-
}, [handleClickOutside]);
|
|
80
|
-
const submit = useCallback(() => {
|
|
81
|
-
setHasValidationError(false);
|
|
82
|
-
if (window.document.activeElement === hourInputRef.current) {
|
|
83
|
-
minuteInputRef.current.focus();
|
|
84
|
-
}
|
|
85
|
-
if (!hourInputRef.current.value.length || !minuteInputRef.current.value.length) {
|
|
86
|
-
if (minuteInputRef.current.value.length && !hourInputRef.current.value.length) {
|
|
87
|
-
setHasValidationError(true);
|
|
88
|
-
}
|
|
89
|
-
return;
|
|
90
|
-
}
|
|
91
|
-
closeRangedTimePicker();
|
|
92
|
-
const nextTimeTuple = [hourInputRef.current.value, minuteInputRef.current.value];
|
|
93
|
-
onChange(nextTimeTuple);
|
|
94
|
-
}, [closeRangedTimePicker, onChange]);
|
|
95
|
-
return (jsxs(Box, { ref: boxSpanRef, hasError: hasFormatError || hasValidationError, isFocused: isFocused, children: [jsxs(Fragment, { children: [jsx(NumberInput, { ref: hourInputRef, "data-cy": `date-range-picker-${isStartDate ? 'start' : 'end'}-hour`, defaultValue: controlledDefaultValue && controlledDefaultValue[0], max: 23, min: 0, onBack: handleBack, onBlur: handleBlur, onClick: openRangedTimePicker, onFilled: submit, onFocus: handleFocus, onFormatError: handleFormatError, onInput: handleHourInput, onNext: () => minuteInputRef.current.focus(), onPrevious: onPrevious, size: 2 }), ":", jsx(NumberInput, { ref: minuteInputRef, "data-cy": `date-range-picker-${isStartDate ? 'start' : 'end'}-minute`, defaultValue: controlledDefaultValue && controlledDefaultValue[1], max: 59, min: 0, onBack: () => hourInputRef.current.focus(), onBlur: handleBlur, onClick: openRangedTimePicker, onFilled: submit, onFocus: handleFocus, onFormatError: handleFormatError, onNext: onNext, onPrevious: () => hourInputRef.current.focus(), size: 2 })] }), isRangedTimePickerOpenRef.current && (jsx(RangedTimePicker, { filter: rangedTimePickerFilter, minutesRange: minutesRange, onChange: handleRangedTimePickedChange }))] }));
|
|
96
|
-
}
|
|
97
|
-
const TimeInput = forwardRef(TimeInputWithRef);
|
|
98
|
-
const Box = styled.span `
|
|
99
|
-
background-color: ${p => p.theme.color.gainsboro};
|
|
100
|
-
box-shadow: ${p => p.hasError || p.isFocused
|
|
101
|
-
? `inset 0px 0px 0px 1px ${p.hasError ? p.theme.color.maximumRed : p.theme.color.blueGray[100]}`
|
|
102
|
-
: 'none'};
|
|
103
|
-
color: ${p => p.theme.color.slateGray};
|
|
104
|
-
display: inline-block;
|
|
105
|
-
font-size: inherit;
|
|
106
|
-
padding: 0.3125rem 0.5rem 0.4375rem;
|
|
107
|
-
position: relative;
|
|
108
|
-
user-select: none;
|
|
109
|
-
|
|
110
|
-
:hover {
|
|
111
|
-
box-shadow: ${p => `inset 0px 0px 0px 1px ${p.theme.color.blueYonder[100]}`};
|
|
112
|
-
}
|
|
113
|
-
`;
|
|
114
|
-
|
|
115
|
-
export { TimeInput };
|
|
116
|
-
//# sourceMappingURL=TimeInput.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"TimeInput.js","sources":["../../../../src/fields/DateRangePicker/TimeInput.tsx"],"sourcesContent":["import { forwardRef, useCallback, useEffect, useImperativeHandle, useRef, useState } from 'react'\nimport styled from 'styled-components'\n\nimport { useForceUpdate } from '../../hooks/useForceUpdate'\nimport { NumberInput } from './NumberInput'\nimport { RangedTimePicker } from './RangedTimePicker'\n\nimport type { NumberInputProps } from './NumberInput'\nimport type { DateOrTimeInputRef, TimeTuple } from './types'\nimport type { ForwardedRef, MutableRefObject } from 'react'\nimport type { Promisable } from 'type-fest'\n\nexport type TimeInputProps = Pick<NumberInputProps, 'onBack' | 'onPrevious' | 'onNext'> & {\n defaultValue?: TimeTuple\n isStartDate?: boolean\n minutesRange?: number\n /** Called each time the time input is changed to a new valid value. */\n onChange: (nextTimeTuple: TimeTuple) => Promisable<void>\n onFocus?: () => Promisable<void>\n onNext?: () => Promisable<void>\n onPrevious?: () => Promisable<void>\n}\nfunction TimeInputWithRef(\n {\n defaultValue,\n isStartDate = false,\n minutesRange = 15,\n onBack,\n onChange,\n onFocus,\n onNext,\n onPrevious\n }: TimeInputProps,\n ref: ForwardedRef<DateOrTimeInputRef>\n) {\n const boxSpanRef = useRef() as MutableRefObject<HTMLSpanElement>\n const hourInputRef = useRef() as MutableRefObject<HTMLInputElement>\n const minuteInputRef = useRef() as MutableRefObject<HTMLInputElement>\n\n const [controlledDefaultValue, setControlledDefaultValue] = useState(defaultValue)\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 minuteInputRef.current.focus()\n } else {\n hourInputRef.current.focus()\n }\n }\n }))\n\n const isRangedTimePickerOpenRef = useRef(false)\n\n const [rangedTimePickerFilter, setRangedTimePickerFilter] = useState<RegExp>(/.*/)\n\n const { forceUpdate } = useForceUpdate()\n\n const closeRangedTimePicker = useCallback(() => {\n isRangedTimePickerOpenRef.current = false\n\n forceUpdate()\n }, [forceUpdate])\n\n const handleBack = useCallback(() => {\n if (!onBack) {\n return\n }\n\n closeRangedTimePicker()\n\n onBack()\n }, [closeRangedTimePicker, onBack])\n\n const handleBlur = useCallback(() => {\n setIsFocused(false)\n }, [])\n\n const handleClickOutside = useCallback(\n (event: globalThis.MouseEvent) => {\n const target = event.target as Node | null\n\n if (hourInputRef.current.contains(target) || minuteInputRef.current.contains(target)) {\n return\n }\n\n closeRangedTimePicker()\n },\n [closeRangedTimePicker]\n )\n\n const handleFocus = useCallback(() => {\n setIsFocused(true)\n\n if (onFocus) {\n onFocus()\n }\n }, [onFocus])\n\n const handleFormatError = useCallback((hasNextFormatError: boolean) => {\n setHasFormatError(hasNextFormatError)\n }, [])\n\n const handleRangedTimePickedChange = useCallback(\n (nextTimeTuple: TimeTuple) => {\n closeRangedTimePicker()\n\n setControlledDefaultValue(nextTimeTuple)\n\n onChange(nextTimeTuple)\n },\n [closeRangedTimePicker, onChange]\n )\n\n const handleHourInput = useCallback((nextValue: string) => {\n // eslint-disable-next-line no-nested-ternary\n const nextRangedTimePickerFilter = nextValue.length ? new RegExp(`^${nextValue}`) : /.*/\n\n setRangedTimePickerFilter(nextRangedTimePickerFilter)\n }, [])\n\n const openRangedTimePicker = useCallback(() => {\n isRangedTimePickerOpenRef.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 const submit = useCallback(() => {\n setHasValidationError(false)\n\n if (window.document.activeElement === hourInputRef.current) {\n minuteInputRef.current.focus()\n }\n\n if (!hourInputRef.current.value.length || !minuteInputRef.current.value.length) {\n if (minuteInputRef.current.value.length && !hourInputRef.current.value.length) {\n setHasValidationError(true)\n }\n\n return\n }\n\n closeRangedTimePicker()\n\n const nextTimeTuple: TimeTuple = [hourInputRef.current.value, minuteInputRef.current.value]\n onChange(nextTimeTuple)\n }, [closeRangedTimePicker, onChange])\n\n return (\n <Box ref={boxSpanRef} hasError={hasFormatError || hasValidationError} isFocused={isFocused}>\n <>\n <NumberInput\n ref={hourInputRef}\n data-cy={`date-range-picker-${isStartDate ? 'start' : 'end'}-hour`}\n defaultValue={controlledDefaultValue && controlledDefaultValue[0]}\n max={23}\n min={0}\n onBack={handleBack}\n onBlur={handleBlur}\n onClick={openRangedTimePicker}\n onFilled={submit}\n onFocus={handleFocus}\n onFormatError={handleFormatError}\n onInput={handleHourInput}\n onNext={() => minuteInputRef.current.focus()}\n onPrevious={onPrevious}\n size={2}\n />\n :\n <NumberInput\n ref={minuteInputRef}\n data-cy={`date-range-picker-${isStartDate ? 'start' : 'end'}-minute`}\n defaultValue={controlledDefaultValue && controlledDefaultValue[1]}\n max={59}\n min={0}\n onBack={() => hourInputRef.current.focus()}\n onBlur={handleBlur}\n onClick={openRangedTimePicker}\n onFilled={submit}\n onFocus={handleFocus}\n onFormatError={handleFormatError}\n onNext={onNext}\n onPrevious={() => hourInputRef.current.focus()}\n size={2}\n />\n </>\n\n {isRangedTimePickerOpenRef.current && (\n <RangedTimePicker\n filter={rangedTimePickerFilter}\n minutesRange={minutesRange}\n onChange={handleRangedTimePickedChange}\n />\n )}\n </Box>\n )\n}\n\nexport const TimeInput = forwardRef(TimeInputWithRef)\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 position: relative;\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,34 +0,0 @@
|
|
|
1
|
-
import fr from '../../../.yarn/cache/date-fns-npm-2.29.3-fef7e3c72c-e01cf5b62a.zip/node_modules/date-fns/esm/locale/fr/index.js';
|
|
2
|
-
|
|
3
|
-
new Array(24).fill(undefined).map((_, index) => ({
|
|
4
|
-
label: String(index).padStart(2, '0'),
|
|
5
|
-
value: index
|
|
6
|
-
}));
|
|
7
|
-
const RSUITE_CALENDAR_LOCALE = {
|
|
8
|
-
// TODO Why this doesn't work?
|
|
9
|
-
dateLocale: fr,
|
|
10
|
-
formattedDayPattern: 'dd/MM/yyyy',
|
|
11
|
-
formattedMonthPattern: 'MM/yyyy',
|
|
12
|
-
friday: 'V',
|
|
13
|
-
hours: 'Heures',
|
|
14
|
-
minutes: 'Minutes',
|
|
15
|
-
monday: 'L',
|
|
16
|
-
ok: 'Valider',
|
|
17
|
-
saturday: 'S',
|
|
18
|
-
seconds: 'Secondes',
|
|
19
|
-
sunday: 'D',
|
|
20
|
-
thursday: 'J',
|
|
21
|
-
today: 'Aujourd’hui',
|
|
22
|
-
tuesday: 'M',
|
|
23
|
-
wednesday: 'M',
|
|
24
|
-
yesterday: 'Hier'
|
|
25
|
-
};
|
|
26
|
-
var STATUS;
|
|
27
|
-
(function (STATUS) {
|
|
28
|
-
STATUS["END_DATE"] = "END_DATE";
|
|
29
|
-
STATUS["NO_DATE"] = "NO_DATE";
|
|
30
|
-
STATUS["START_DATE"] = "START_DATE";
|
|
31
|
-
})(STATUS || (STATUS = {}));
|
|
32
|
-
|
|
33
|
-
export { RSUITE_CALENDAR_LOCALE, STATUS };
|
|
34
|
-
//# sourceMappingURL=constants.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"constants.js","sources":["../../../../src/fields/DateRangePicker/constants.ts"],"sourcesContent":["import fr from 'date-fns/locale/fr'\n\nimport type { DateRangePickerLocale } from 'rsuite'\n\nexport const HOURS_AS_OPTIONS = new Array(24).fill(undefined).map((_, index) => ({\n label: String(index).padStart(2, '0'),\n value: index\n}))\n\nexport const RSUITE_CALENDAR_LOCALE: DateRangePickerLocale = {\n // TODO Why this doesn't work?\n dateLocale: fr,\n formattedDayPattern: 'dd/MM/yyyy',\n formattedMonthPattern: 'MM/yyyy',\n friday: 'V',\n hours: 'Heures',\n minutes: 'Minutes',\n monday: 'L',\n ok: 'Valider',\n saturday: 'S',\n seconds: 'Secondes',\n sunday: 'D',\n thursday: 'J',\n today: 'Aujourd’hui',\n tuesday: 'M',\n wednesday: 'M',\n yesterday: 'Hier'\n}\n\nexport enum STATUS {\n 'END_DATE' = 'END_DATE',\n 'NO_DATE' = 'NO_DATE',\n 'START_DATE' = 'START_DATE'\n}\n"],"names":[],"mappings":";;AAIgC,IAAI,KAAK,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,KAAK,MAAM;IAC/E,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC;AACrC,IAAA,KAAK,EAAE,KAAK;AACb,CAAA,CAAC,EAAC;AAEU,MAAA,sBAAsB,GAA0B;;AAE3D,IAAA,UAAU,EAAE,EAAE;AACd,IAAA,mBAAmB,EAAE,YAAY;AACjC,IAAA,qBAAqB,EAAE,SAAS;AAChC,IAAA,MAAM,EAAE,GAAG;AACX,IAAA,KAAK,EAAE,QAAQ;AACf,IAAA,OAAO,EAAE,SAAS;AAClB,IAAA,MAAM,EAAE,GAAG;AACX,IAAA,EAAE,EAAE,SAAS;AACb,IAAA,QAAQ,EAAE,GAAG;AACb,IAAA,OAAO,EAAE,UAAU;AACnB,IAAA,MAAM,EAAE,GAAG;AACX,IAAA,QAAQ,EAAE,GAAG;AACb,IAAA,KAAK,EAAE,aAAa;AACpB,IAAA,OAAO,EAAE,GAAG;AACZ,IAAA,SAAS,EAAE,GAAG;AACd,IAAA,SAAS,EAAE,MAAM;EAClB;IAEW,OAIX;AAJD,CAAA,UAAY,MAAM,EAAA;AAChB,IAAA,MAAA,CAAA,UAAA,CAAA,GAAA,UAAuB,CAAA;AACvB,IAAA,MAAA,CAAA,SAAA,CAAA,GAAA,SAAqB,CAAA;AACrB,IAAA,MAAA,CAAA,YAAA,CAAA,GAAA,YAA2B,CAAA;AAC7B,CAAC,EAJW,MAAM,KAAN,MAAM,GAIjB,EAAA,CAAA,CAAA;;;;"}
|
|
@@ -1,187 +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 './DateInput.js';
|
|
10
|
-
import { RangeCalendarPicker } from './RangeCalendarPicker.js';
|
|
11
|
-
import { TimeInput } from './TimeInput.js';
|
|
12
|
-
import { DateRangePosition } from './types.js';
|
|
13
|
-
import { getDateTupleFromDate, getTimeTupleFromDate, getDateFromDateAndTimeTuple } from './utils.js';
|
|
14
|
-
|
|
15
|
-
function DateRangePicker({ defaultValue, isHistorical = false, isLabelHidden = false, label, minutesRange = 15, onChange, withTime = false }) {
|
|
16
|
-
const startDateInputRef = useRef();
|
|
17
|
-
const startTimeInputRef = useRef();
|
|
18
|
-
const endDateInputRef = useRef();
|
|
19
|
-
const endTimeInputRef = useRef();
|
|
20
|
-
const isRangeCalendarPickerOpenRef = useRef(false);
|
|
21
|
-
const selectedStartDateRef = useRef(defaultValue ? getLocalizedDayjs(defaultValue[0]).toDate() : undefined);
|
|
22
|
-
const selectedEndDateRef = useRef(defaultValue ? getLocalizedDayjs(defaultValue[1]).toDate() : undefined);
|
|
23
|
-
const selectedStartDateTupleRef = useRef(getDateTupleFromDate(selectedStartDateRef.current));
|
|
24
|
-
const selectedEndDateTupleRef = useRef(getDateTupleFromDate(selectedEndDateRef.current));
|
|
25
|
-
const selectedStartTimeTupleRef = useRef(getTimeTupleFromDate(selectedStartDateRef.current));
|
|
26
|
-
const selectedEndTimeTupleRef = useRef(getTimeTupleFromDate(selectedEndDateRef.current));
|
|
27
|
-
const { forceUpdate } = useForceUpdate();
|
|
28
|
-
const rangeCalendarPickerDefaultValue = useMemo(() => selectedStartDateTupleRef.current && selectedEndDateTupleRef.current
|
|
29
|
-
? [
|
|
30
|
-
getDateFromDateAndTimeTuple(selectedStartDateTupleRef.current, ['00', '00']),
|
|
31
|
-
getDateFromDateAndTimeTuple(selectedEndDateTupleRef.current, ['00', '00'], true)
|
|
32
|
-
]
|
|
33
|
-
: undefined,
|
|
34
|
-
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
35
|
-
[selectedEndDateTupleRef.current, selectedStartDateTupleRef.current]);
|
|
36
|
-
const submit = useCallback(() => {
|
|
37
|
-
if (!onChange || !selectedStartDateRef.current || !selectedEndDateRef.current) {
|
|
38
|
-
return;
|
|
39
|
-
}
|
|
40
|
-
const utcizedStartDate = getUtcizedDayjs(selectedStartDateRef.current).toDate();
|
|
41
|
-
const utcizedEndDate = getUtcizedDayjs(selectedEndDateRef.current).toDate();
|
|
42
|
-
const nextDateRange = [utcizedStartDate, utcizedEndDate];
|
|
43
|
-
onChange(nextDateRange);
|
|
44
|
-
}, [onChange]);
|
|
45
|
-
const closeRangeCalendarPicker = useCallback(() => {
|
|
46
|
-
isRangeCalendarPickerOpenRef.current = false;
|
|
47
|
-
forceUpdate();
|
|
48
|
-
}, [forceUpdate]);
|
|
49
|
-
const handleClickOutside = useCallback((event) => {
|
|
50
|
-
const target = event.target;
|
|
51
|
-
if (startDateInputRef.current.boxSpan.contains(target) || endDateInputRef.current.boxSpan.contains(target)) {
|
|
52
|
-
return;
|
|
53
|
-
}
|
|
54
|
-
closeRangeCalendarPicker();
|
|
55
|
-
}, [closeRangeCalendarPicker]);
|
|
56
|
-
const handleEndDateInputNext = useCallback(() => {
|
|
57
|
-
if (!withTime) {
|
|
58
|
-
return;
|
|
59
|
-
}
|
|
60
|
-
endTimeInputRef.current.focus();
|
|
61
|
-
}, [withTime]);
|
|
62
|
-
const handleEndDateInputPrevious = useCallback(() => {
|
|
63
|
-
if (withTime) {
|
|
64
|
-
startTimeInputRef.current.focus(true);
|
|
65
|
-
return;
|
|
66
|
-
}
|
|
67
|
-
startDateInputRef.current.focus(true);
|
|
68
|
-
}, [withTime]);
|
|
69
|
-
const handleStartDateInputNext = useCallback(() => {
|
|
70
|
-
if (withTime) {
|
|
71
|
-
startTimeInputRef.current.focus();
|
|
72
|
-
return;
|
|
73
|
-
}
|
|
74
|
-
endDateInputRef.current.focus();
|
|
75
|
-
}, [withTime]);
|
|
76
|
-
const handleDateInputFilled = useCallback((position, nextDateTuple) => {
|
|
77
|
-
if (position === DateRangePosition.START) {
|
|
78
|
-
selectedStartDateTupleRef.current = nextDateTuple;
|
|
79
|
-
// If there is no time input or a start time has already been selected,
|
|
80
|
-
if (!withTime || selectedStartTimeTupleRef.current) {
|
|
81
|
-
// we must update the selected start date and call onChange()
|
|
82
|
-
const startTimeTuple = (withTime ? selectedStartTimeTupleRef.current : ['00', '00']);
|
|
83
|
-
const nextStartDate = getDateFromDateAndTimeTuple(nextDateTuple, startTimeTuple);
|
|
84
|
-
selectedStartDateRef.current = nextStartDate;
|
|
85
|
-
submit();
|
|
86
|
-
}
|
|
87
|
-
handleStartDateInputNext();
|
|
88
|
-
}
|
|
89
|
-
else {
|
|
90
|
-
selectedEndDateTupleRef.current = nextDateTuple;
|
|
91
|
-
// If there is no time input or an end time has already been selected,
|
|
92
|
-
if (!withTime || selectedEndTimeTupleRef.current) {
|
|
93
|
-
// we must update the selected end date and call onChange()
|
|
94
|
-
const endTimeTuple = (withTime ? selectedEndTimeTupleRef.current : ['23', '59']);
|
|
95
|
-
const nextEndDate = getDateFromDateAndTimeTuple(nextDateTuple, endTimeTuple, true);
|
|
96
|
-
selectedEndDateRef.current = nextEndDate;
|
|
97
|
-
submit();
|
|
98
|
-
}
|
|
99
|
-
handleEndDateInputNext();
|
|
100
|
-
}
|
|
101
|
-
}, [handleEndDateInputNext, handleStartDateInputNext, submit, withTime]);
|
|
102
|
-
const handleRangeCalendarPickerChange = useCallback((nextDateTupleRange) => {
|
|
103
|
-
const [nextStartDateTuple, nextEndDateTuple] = nextDateTupleRange;
|
|
104
|
-
// If this is a date picker without a time input,
|
|
105
|
-
if (!withTime) {
|
|
106
|
-
// we have to fix the start date at the beginning of the day
|
|
107
|
-
const nextStartDate = getDateFromDateAndTimeTuple(nextStartDateTuple, ['00', '00']);
|
|
108
|
-
// and the end date at the end of the day
|
|
109
|
-
const nextEndDate = getDateFromDateAndTimeTuple(nextEndDateTuple, ['23', '59'], true);
|
|
110
|
-
selectedStartDateRef.current = nextStartDate;
|
|
111
|
-
selectedEndDateRef.current = nextEndDate;
|
|
112
|
-
}
|
|
113
|
-
// If this is a date picker with a time input,
|
|
114
|
-
else {
|
|
115
|
-
// we include the selected start time if it exists, set it at the beginning of the day if not
|
|
116
|
-
const nextStartDate = getDateFromDateAndTimeTuple(nextStartDateTuple, selectedStartTimeTupleRef.current || ['00', '00']);
|
|
117
|
-
selectedStartDateRef.current = nextStartDate;
|
|
118
|
-
// we include the selected end time if it exists, set it at the end of the day if not
|
|
119
|
-
const nextEndDate = getDateFromDateAndTimeTuple(nextEndDateTuple, selectedEndTimeTupleRef.current || ['23', '59'], true);
|
|
120
|
-
selectedEndDateRef.current = nextEndDate;
|
|
121
|
-
}
|
|
122
|
-
selectedStartDateTupleRef.current = nextStartDateTuple;
|
|
123
|
-
selectedStartTimeTupleRef.current = getTimeTupleFromDate(selectedStartDateRef.current);
|
|
124
|
-
selectedEndDateTupleRef.current = nextEndDateTuple;
|
|
125
|
-
selectedEndTimeTupleRef.current = getTimeTupleFromDate(selectedEndDateRef.current);
|
|
126
|
-
closeRangeCalendarPicker();
|
|
127
|
-
forceUpdate();
|
|
128
|
-
submit();
|
|
129
|
-
}, [closeRangeCalendarPicker, forceUpdate, submit, withTime]);
|
|
130
|
-
const handleTimeInputFilled = useCallback((position, nextTimeTuple) => {
|
|
131
|
-
if (position === DateRangePosition.START) {
|
|
132
|
-
// If a start date has already been selected
|
|
133
|
-
if (selectedStartDateTupleRef.current) {
|
|
134
|
-
// we must update the selected start date accordingly and submit it
|
|
135
|
-
const nextStartDate = getDateFromDateAndTimeTuple(selectedStartDateTupleRef.current, nextTimeTuple);
|
|
136
|
-
selectedStartDateRef.current = nextStartDate;
|
|
137
|
-
submit();
|
|
138
|
-
}
|
|
139
|
-
selectedStartTimeTupleRef.current = nextTimeTuple;
|
|
140
|
-
endDateInputRef.current.focus();
|
|
141
|
-
}
|
|
142
|
-
else {
|
|
143
|
-
// If an end date has already been selected
|
|
144
|
-
if (selectedEndDateTupleRef.current) {
|
|
145
|
-
// we must update the selected end date accordingly and submit it
|
|
146
|
-
const nextEndDate = getDateFromDateAndTimeTuple(selectedEndDateTupleRef.current, nextTimeTuple, true);
|
|
147
|
-
selectedEndDateRef.current = nextEndDate;
|
|
148
|
-
submit();
|
|
149
|
-
}
|
|
150
|
-
selectedEndTimeTupleRef.current = nextTimeTuple;
|
|
151
|
-
}
|
|
152
|
-
submit();
|
|
153
|
-
}, [submit]);
|
|
154
|
-
const openRangeCalendarPicker = useCallback(() => {
|
|
155
|
-
isRangeCalendarPickerOpenRef.current = true;
|
|
156
|
-
forceUpdate();
|
|
157
|
-
}, [forceUpdate]);
|
|
158
|
-
useEffect(() => {
|
|
159
|
-
window.document.addEventListener('click', handleClickOutside);
|
|
160
|
-
return () => {
|
|
161
|
-
window.document.removeEventListener('click', handleClickOutside);
|
|
162
|
-
};
|
|
163
|
-
}, [handleClickOutside]);
|
|
164
|
-
return (jsxs(Fieldset, { className: "DateRangePicker", children: [jsx(Legend, { isHidden: isLabelHidden, children: label }), jsxs(Box, { children: [jsx(Field, { children: jsx(DateInput, { ref: startDateInputRef, defaultValue: selectedStartDateTupleRef.current, isForcedFocused: isRangeCalendarPickerOpenRef.current, isStartDate: true, onChange: nextDateTuple => handleDateInputFilled(DateRangePosition.START, nextDateTuple), onClick: openRangeCalendarPicker, onNext: handleStartDateInputNext }) }), withTime && (jsx(Field, { isTimeField: true, children: jsx(TimeInput, { ref: startTimeInputRef, defaultValue: selectedStartTimeTupleRef.current, isStartDate: true, minutesRange: minutesRange, onBack: () => startDateInputRef.current.focus(true), onChange: nextTimeTuple => handleTimeInputFilled(DateRangePosition.START, nextTimeTuple), onFocus: closeRangeCalendarPicker, onNext: () => endDateInputRef.current.focus(), onPrevious: () => startDateInputRef.current.focus(true) }) })), jsx(Field, { isEndDateField: true, children: jsx(DateInput, { ref: endDateInputRef, defaultValue: selectedEndDateTupleRef.current, isEndDate: true, isForcedFocused: isRangeCalendarPickerOpenRef.current, onBack: handleEndDateInputPrevious, onChange: nextDateTuple => handleDateInputFilled(DateRangePosition.END, nextDateTuple), onClick: openRangeCalendarPicker, onNext: handleEndDateInputNext, onPrevious: handleEndDateInputPrevious }) }), withTime && (jsx(Field, { isTimeField: true, children: jsx(TimeInput, { ref: endTimeInputRef, defaultValue: selectedEndTimeTupleRef.current, minutesRange: minutesRange, onBack: () => endDateInputRef.current.focus(true), onChange: nextTimeTuple => handleTimeInputFilled(DateRangePosition.END, nextTimeTuple), onFocus: closeRangeCalendarPicker, onPrevious: () => endDateInputRef.current.focus(true) }) }))] }), isRangeCalendarPickerOpenRef.current && (jsx(RangeCalendarPicker, { defaultValue: rangeCalendarPickerDefaultValue, isHistorical: isHistorical, onChange: handleRangeCalendarPickerChange }))] }));
|
|
165
|
-
}
|
|
166
|
-
const Box = styled.div `
|
|
167
|
-
* {
|
|
168
|
-
font-weight: 500;
|
|
169
|
-
line-height: 1;
|
|
170
|
-
}
|
|
171
|
-
|
|
172
|
-
color: ${p => p.theme.color.gunMetal};
|
|
173
|
-
font-size: 13px;
|
|
174
|
-
position: relative;
|
|
175
|
-
`;
|
|
176
|
-
const Field = styled.span `
|
|
177
|
-
font-size: inherit;
|
|
178
|
-
margin-left: ${p => {
|
|
179
|
-
if (p.isEndDateField) {
|
|
180
|
-
return '0.625rem';
|
|
181
|
-
}
|
|
182
|
-
return p.isTimeField ? '0.125rem' : 0;
|
|
183
|
-
}};
|
|
184
|
-
`;
|
|
185
|
-
|
|
186
|
-
export { DateRangePicker };
|
|
187
|
-
//# sourceMappingURL=index.js.map
|