@steroidsjs/core 3.0.82 → 3.0.84

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.
@@ -15,13 +15,23 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
15
15
  };
16
16
  exports.__esModule = true;
17
17
  var react_1 = require("react");
18
+ var react_2 = require("@maskito/react");
18
19
  var useDateInputState_1 = __importDefault(require("../../form/DateField/useDateInputState"));
19
20
  var hooks_1 = require("../../../hooks");
20
21
  var fieldWrapper_1 = __importDefault(require("../Field/fieldWrapper"));
21
22
  var enums_1 = require("../../../enums");
23
+ var utils_1 = require("./utils");
22
24
  function TimeField(props) {
25
+ var _a, _b, _c;
23
26
  var components = (0, hooks_1.useComponents)();
24
- var _a = (0, useDateInputState_1["default"])({
27
+ var maskRef = (0, react_2.useMaskito)({
28
+ options: (_a = props.maskOptions) !== null && _a !== void 0 ? _a : (0, utils_1.createTimeMask)({
29
+ from: (_b = props.availableTime) === null || _b === void 0 ? void 0 : _b.from,
30
+ to: (_c = props.availableTime) === null || _c === void 0 ? void 0 : _c.to,
31
+ minuteStep: props.minuteStep
32
+ })
33
+ });
34
+ var _d = (0, useDateInputState_1["default"])({
25
35
  input: props.input,
26
36
  disabled: props.disabled,
27
37
  onChange: props.onChange,
@@ -32,10 +42,9 @@ function TimeField(props) {
32
42
  displayFormat: props.displayFormat,
33
43
  useUTC: props.useUTC,
34
44
  dateInUTC: props.dateInUTC
35
- }), onNow = _a.onNow, onClear = _a.onClear, onClose = _a.onClose, isOpened = _a.isOpened, inputProps = _a.inputProps;
36
- var timePanelViewProps = (0, react_1.useMemo)(function () { return (__assign({ onNow: onNow, onClose: onClose, value: inputProps.value, onSelect: inputProps.onChange }, props.timePanelViewProps)); }, [inputProps.onChange, inputProps.value, onClose, onNow, props.timePanelViewProps]);
37
- var viewProps = (0, react_1.useMemo)(function () { return (__assign(__assign({}, props.viewProps), { onNow: onNow, onClear: onClear, onClose: onClose, isOpened: isOpened, inputProps: inputProps, timePanelViewProps: timePanelViewProps, size: props.size, icon: props.icon, errors: props.errors, noBorder: props.noBorder, disabled: props.disabled, className: props.className, style: props.style, showRemove: props.showRemove, id: props.id })); }, [inputProps, isOpened, onClear, onClose, onNow, props.className, props.disabled, props.errors, props.icon, props.id, props.noBorder,
38
- props.showRemove, props.size, props.style, props.viewProps, timePanelViewProps]);
45
+ }), onNow = _d.onNow, onClear = _d.onClear, onClose = _d.onClose, isOpened = _d.isOpened, inputProps = _d.inputProps;
46
+ var timePanelViewProps = (0, react_1.useMemo)(function () { return (__assign({ onNow: onNow, onClose: onClose, value: inputProps.value, onSelect: inputProps.onChange, availableTime: props.availableTime, minuteStep: props.minuteStep }, props.timePanelViewProps)); }, [inputProps.onChange, inputProps.value, onClose, onNow, props.availableTime, props.minuteStep, props.timePanelViewProps]);
47
+ var viewProps = (0, react_1.useMemo)(function () { return (__assign(__assign({}, props.viewProps), { onNow: onNow, onClear: onClear, onClose: onClose, isOpened: isOpened, inputProps: inputProps, timePanelViewProps: timePanelViewProps, size: props.size, icon: props.icon, errors: props.errors, noBorder: props.noBorder, disabled: props.disabled, className: props.className, style: props.style, showRemove: props.showRemove, id: props.id, maskRef: maskRef })); }, [inputProps, isOpened, maskRef, onClear, onClose, onNow, props.className, props.disabled, props.errors, props.icon, props.id, props.noBorder, props.showRemove, props.size, props.style, props.viewProps, timePanelViewProps]);
39
48
  return components.ui.renderView(props.view || 'form.TimeFieldView', viewProps);
40
49
  }
41
50
  TimeField.defaultProps = {
@@ -48,6 +57,7 @@ TimeField.defaultProps = {
48
57
  valueFormat: 'HH:mm',
49
58
  useUTC: false,
50
59
  dateInUTC: false,
51
- icon: true
60
+ icon: true,
61
+ minuteStep: 1
52
62
  };
53
63
  exports["default"] = (0, fieldWrapper_1["default"])(enums_1.FieldEnum.TIME_FIELD, TimeField);
@@ -0,0 +1,9 @@
1
+ import { MaskitoOptions, MaskitoPlugin } from '@maskito/core';
2
+ export declare const timeToMinutes: (value: string) => number;
3
+ export declare const minutesToTime: (minutes: number) => string;
4
+ export declare const createTimeRangePlugin: (from?: string, to?: string) => MaskitoPlugin;
5
+ export declare const createTimeMask: (options?: {
6
+ from?: string;
7
+ to?: string;
8
+ minuteStep?: number;
9
+ }) => MaskitoOptions;
@@ -0,0 +1,100 @@
1
+ "use strict";
2
+ var __assign = (this && this.__assign) || function () {
3
+ __assign = Object.assign || function(t) {
4
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
5
+ s = arguments[i];
6
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
7
+ t[p] = s[p];
8
+ }
9
+ return t;
10
+ };
11
+ return __assign.apply(this, arguments);
12
+ };
13
+ exports.__esModule = true;
14
+ exports.createTimeMask = exports.createTimeRangePlugin = exports.minutesToTime = exports.timeToMinutes = void 0;
15
+ var timeToMinutes = function (value) {
16
+ var _a = value.split(':').map(Number), h = _a[0], m = _a[1];
17
+ return h * 60 + m;
18
+ };
19
+ exports.timeToMinutes = timeToMinutes;
20
+ var isCompleteTime = function (value) { return /^\d{2}:\d{2}$/.test(value); };
21
+ var minutesToTime = function (minutes) {
22
+ var h = Math.floor(minutes / 60);
23
+ var m = minutes % 60;
24
+ return "".concat(String(h).padStart(2, '0'), ":").concat(String(m).padStart(2, '0'));
25
+ };
26
+ exports.minutesToTime = minutesToTime;
27
+ var createTimeRangePlugin = function (from, to) {
28
+ var fromMin = from ? (0, exports.timeToMinutes)(/^\d:\d{2}$/.test(from) ? "0".concat(from) : from) : 0;
29
+ var toMin = to ? (0, exports.timeToMinutes)(/^\d:\d{2}$/.test(to) ? "0".concat(to) : to) : 24 * 60 - 1;
30
+ return function (element) {
31
+ element.addEventListener('input', function () {
32
+ var value = element.value;
33
+ if (!isCompleteTime(value)) {
34
+ return;
35
+ }
36
+ var minutes = (0, exports.timeToMinutes)(value);
37
+ if (minutes < fromMin) {
38
+ minutes = fromMin;
39
+ }
40
+ if (minutes > toMin) {
41
+ minutes = toMin;
42
+ }
43
+ var normalized = (0, exports.minutesToTime)(minutes);
44
+ if (normalized !== value) {
45
+ element.value = normalized;
46
+ }
47
+ });
48
+ };
49
+ };
50
+ exports.createTimeRangePlugin = createTimeRangePlugin;
51
+ var createTimeMask = function (options) { return ({
52
+ mask: [/\d/, /\d/, ':', /\d/, /\d/],
53
+ preprocessors: [
54
+ function (_a) {
55
+ var elementState = _a.elementState;
56
+ var value = elementState.value;
57
+ // авто-добавление ведущего нуля
58
+ if (/^\d:\d\d$/.test(value)) {
59
+ value = "0".concat(value);
60
+ }
61
+ return {
62
+ elementState: __assign(__assign({}, elementState), { value: value })
63
+ };
64
+ },
65
+ ],
66
+ postprocessors: [
67
+ function (_a) {
68
+ var value = _a.value, selection = _a.selection;
69
+ if (!/^\d{2}:\d{2}$/.test(value)) {
70
+ return { value: value, selection: selection };
71
+ }
72
+ var _b = value.split(':').map(Number), h = _b[0], m = _b[1];
73
+ if (Number.isNaN(h) || Number.isNaN(m)) {
74
+ return { value: value, selection: selection };
75
+ }
76
+ // Ограничение часов
77
+ if (h > 23) {
78
+ h = 23;
79
+ }
80
+ // Ограничение минут
81
+ if (m > 59) {
82
+ m = 59;
83
+ }
84
+ // Шаг минут
85
+ if ((options === null || options === void 0 ? void 0 : options.minuteStep) && options.minuteStep > 1) {
86
+ m = Math.floor(m / options.minuteStep)
87
+ * options.minuteStep;
88
+ }
89
+ var nextValue = "".concat(String(h).padStart(2, '0'), ":").concat(String(m).padStart(2, '0'));
90
+ return {
91
+ value: nextValue,
92
+ selection: selection
93
+ };
94
+ },
95
+ ],
96
+ plugins: [
97
+ (0, exports.createTimeRangePlugin)(options === null || options === void 0 ? void 0 : options.from, options === null || options === void 0 ? void 0 : options.to),
98
+ ]
99
+ }); };
100
+ exports.createTimeMask = createTimeMask;
@@ -1,3 +1,4 @@
1
+ import { MaskitoOptions } from '@maskito/core';
1
2
  import { IDateInputStateInput, IDateInputStateOutput } from '../DateField/useDateInputState';
2
3
  import { IFieldWrapperInputProps, IFieldWrapperOutputProps } from '../Field/fieldWrapper';
3
4
  import { ITimePanelViewProps } from '../TimeField/TimeField';
@@ -52,6 +53,31 @@ export interface ITimeRangeFieldProps extends IDateInputStateInput, Omit<IFieldW
52
53
  * @example true
53
54
  */
54
55
  hasInitialFocus?: boolean;
56
+ /**
57
+ * Опции маски для полей
58
+ */
59
+ maskOptions?: {
60
+ /**
61
+ * Опции маски для поля from
62
+ */
63
+ from: MaskitoOptions;
64
+ /**
65
+ * Опции маски для поля to
66
+ */
67
+ to: MaskitoOptions;
68
+ };
69
+ /**
70
+ * Ограничение доступного времени.
71
+ */
72
+ availableTime?: {
73
+ from: string;
74
+ to: string;
75
+ };
76
+ /**
77
+ * Шаг минут
78
+ * @example 15
79
+ */
80
+ minuteStep?: number;
55
81
  [key: string]: any;
56
82
  }
57
83
  export interface ITimeRangeFieldViewProps extends IDateInputStateOutput, Pick<ITimeRangeFieldProps, 'size' | 'errors' | 'showRemove' | 'className' | 'timePanelViewProps' | 'disabled' | 'style' | 'icon'>, Omit<IFieldWrapperOutputProps, 'input'> {
@@ -15,13 +15,30 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
15
15
  };
16
16
  exports.__esModule = true;
17
17
  var react_1 = require("react");
18
+ var react_2 = require("@maskito/react");
19
+ var utils_1 = require("../TimeField/utils");
18
20
  var hooks_1 = require("../../../hooks");
19
21
  var useDateInputState_1 = __importDefault(require("../DateField/useDateInputState"));
20
22
  var fieldWrapper_1 = __importDefault(require("../Field/fieldWrapper"));
21
23
  var useDateRange_1 = __importDefault(require("../DateField/useDateRange"));
22
24
  var enums_1 = require("../../../enums");
23
25
  function TimeRangeField(props) {
26
+ var _a, _b, _c, _d, _e, _f, _g, _h;
24
27
  var components = (0, hooks_1.useComponents)();
28
+ var maskFromRef = (0, react_2.useMaskito)({
29
+ options: (_b = (_a = props.maskOptions) === null || _a === void 0 ? void 0 : _a.from) !== null && _b !== void 0 ? _b : (0, utils_1.createTimeMask)({
30
+ from: (_c = props.availableTime) === null || _c === void 0 ? void 0 : _c.from,
31
+ to: (_d = props.availableTime) === null || _d === void 0 ? void 0 : _d.to,
32
+ minuteStep: props.minuteStep
33
+ })
34
+ });
35
+ var maskToRef = (0, react_2.useMaskito)({
36
+ options: (_f = (_e = props.maskOptions) === null || _e === void 0 ? void 0 : _e.to) !== null && _f !== void 0 ? _f : (0, utils_1.createTimeMask)({
37
+ from: (_g = props.availableTime) === null || _g === void 0 ? void 0 : _g.from,
38
+ to: (_h = props.availableTime) === null || _h === void 0 ? void 0 : _h.to,
39
+ minuteStep: props.minuteStep
40
+ })
41
+ });
25
42
  // Global onChange (from props)
26
43
  var onChange = (0, react_1.useCallback)(function () {
27
44
  var _a;
@@ -33,7 +50,7 @@ function TimeRangeField(props) {
33
50
  }
34
51
  }, [props.attributeFrom, props.attributeTo, props.inputFrom.value, props.inputTo.value, props.onChange]);
35
52
  // Input 'from'
36
- var _a = (0, useDateInputState_1["default"])({
53
+ var _j = (0, useDateInputState_1["default"])({
37
54
  input: props.inputFrom,
38
55
  disabled: props.disabled,
39
56
  onChange: onChange,
@@ -44,9 +61,9 @@ function TimeRangeField(props) {
44
61
  displayFormat: props.displayFormat,
45
62
  useUTC: props.useUTC,
46
63
  dateInUTC: props.dateInUTC
47
- }), onNowFrom = _a.onNow, onCloseFrom = _a.onClose, inputPropsFrom = _a.inputProps, onClearFrom = _a.onClear, isOpenedFrom = _a.isOpened;
64
+ }), onNowFrom = _j.onNow, onCloseFrom = _j.onClose, inputPropsFrom = _j.inputProps, onClearFrom = _j.onClear, isOpenedFrom = _j.isOpened;
48
65
  // Input 'to'
49
- var _b = (0, useDateInputState_1["default"])({
66
+ var _k = (0, useDateInputState_1["default"])({
50
67
  input: props.inputTo,
51
68
  disabled: props.disabled,
52
69
  onChange: onChange,
@@ -57,8 +74,8 @@ function TimeRangeField(props) {
57
74
  displayFormat: props.displayFormat,
58
75
  useUTC: props.useUTC,
59
76
  dateInUTC: props.dateInUTC
60
- }), onNowTo = _b.onNow, onCloseTo = _b.onClose, inputPropsTo = _b.inputProps, onClearTo = _b.onClear, isOpenedTo = _b.isOpened;
61
- var _c = (0, useDateRange_1["default"])({
77
+ }), onNowTo = _k.onNow, onCloseTo = _k.onClose, inputPropsTo = _k.inputProps, onClearTo = _k.onClear, isOpenedTo = _k.isOpened;
78
+ var _l = (0, useDateRange_1["default"])({
62
79
  onClearFrom: onClearFrom,
63
80
  onCloseTo: onCloseTo,
64
81
  onCloseFrom: onCloseFrom,
@@ -69,12 +86,10 @@ function TimeRangeField(props) {
69
86
  inputTo: props.inputTo,
70
87
  useSmartFocus: false,
71
88
  hasInitialFocus: props.hasInitialFocus
72
- }), focus = _c.focus, onClose = _c.onClose, onClear = _c.onClear, extendedInputPropsFrom = _c.extendedInputPropsFrom, extendedInputPropsTo = _c.extendedInputPropsTo;
73
- var timePanelFromViewProps = (0, react_1.useMemo)(function () { return (__assign({ onNow: onNowFrom, onClose: onCloseFrom, value: inputPropsFrom.value, onSelect: inputPropsFrom.onChange }, props.timePanelViewProps)); }, [inputPropsFrom.onChange, inputPropsFrom.value, onCloseFrom, onNowFrom, props.timePanelViewProps]);
74
- var timePanelToViewProps = (0, react_1.useMemo)(function () { return (__assign({ onNow: onNowTo, onClose: onCloseTo, value: inputPropsTo.value, onSelect: inputPropsTo.onChange }, props.timePanelViewProps)); }, [inputPropsTo.onChange, inputPropsTo.value, onCloseTo, onNowTo, props.timePanelViewProps]);
75
- var viewProps = (0, react_1.useMemo)(function () { return (__assign(__assign({}, props.viewProps), { onClear: onClear, onClose: onClose, inputPropsFrom: extendedInputPropsFrom, inputPropsTo: extendedInputPropsTo, isOpened: focus === 'from' ? isOpenedFrom : isOpenedTo, style: props.style, errorsFrom: props.errorsFrom, errorsTo: props.errorsTo, errors: props.errors, timePanelFromViewProps: timePanelFromViewProps, timePanelToViewProps: timePanelToViewProps, size: props.size, icon: props.icon, disabled: props.disabled, showRemove: props.showRemove, className: props.className, id: props.id })); }, [extendedInputPropsFrom, extendedInputPropsTo, focus, isOpenedFrom, isOpenedTo, onClear, onClose, props.className,
76
- props.disabled, props.errors, props.errorsFrom, props.errorsTo, props.icon, props.id, props.showRemove, props.size,
77
- props.style, props.viewProps, timePanelFromViewProps, timePanelToViewProps]);
89
+ }), focus = _l.focus, onClose = _l.onClose, onClear = _l.onClear, extendedInputPropsFrom = _l.extendedInputPropsFrom, extendedInputPropsTo = _l.extendedInputPropsTo;
90
+ var timePanelFromViewProps = (0, react_1.useMemo)(function () { return (__assign({ onNow: onNowFrom, onClose: onCloseFrom, value: inputPropsFrom.value, onSelect: inputPropsFrom.onChange, availableTime: props.availableTime, minuteStep: props.minuteStep }, props.timePanelViewProps)); }, [inputPropsFrom.onChange, inputPropsFrom.value, onCloseFrom, onNowFrom, props.availableTime, props.minuteStep, props.timePanelViewProps]);
91
+ var timePanelToViewProps = (0, react_1.useMemo)(function () { return (__assign({ onNow: onNowTo, onClose: onCloseTo, value: inputPropsTo.value, onSelect: inputPropsTo.onChange, availableTime: props.availableTime, minuteStep: props.minuteStep }, props.timePanelViewProps)); }, [inputPropsTo.onChange, inputPropsTo.value, onCloseTo, onNowTo, props.availableTime, props.minuteStep, props.timePanelViewProps]);
92
+ var viewProps = (0, react_1.useMemo)(function () { return (__assign(__assign({}, props.viewProps), { onClear: onClear, onClose: onClose, inputPropsFrom: extendedInputPropsFrom, inputPropsTo: extendedInputPropsTo, isOpened: focus === 'from' ? isOpenedFrom : isOpenedTo, style: props.style, errorsFrom: props.errorsFrom, errorsTo: props.errorsTo, errors: props.errors, timePanelFromViewProps: timePanelFromViewProps, timePanelToViewProps: timePanelToViewProps, size: props.size, icon: props.icon, disabled: props.disabled, showRemove: props.showRemove, className: props.className, id: props.id, maskFromRef: maskFromRef, maskToRef: maskToRef })); }, [extendedInputPropsFrom, extendedInputPropsTo, focus, isOpenedFrom, isOpenedTo, maskFromRef, maskToRef, onClear, onClose, props.className, props.disabled, props.errors, props.errorsFrom, props.errorsTo, props.icon, props.id, props.showRemove, props.size, props.style, props.viewProps, timePanelFromViewProps, timePanelToViewProps]);
78
93
  return components.ui.renderView(props.view || 'form.TimeRangeFieldView', viewProps);
79
94
  }
80
95
  TimeRangeField.defaultProps = {
@@ -87,7 +102,8 @@ TimeRangeField.defaultProps = {
87
102
  valueFormat: 'HH:mm',
88
103
  useUTC: false,
89
104
  dateInUTC: false,
90
- icon: true
105
+ icon: true,
106
+ minuteStep: 1
91
107
  };
92
108
  exports["default"] = (0, fieldWrapper_1["default"])(enums_1.FieldEnum.TIME_RANGE_FIELD, TimeRangeField, {
93
109
  attributeSuffixes: ['from', 'to']