@steroidsjs/core 3.0.56 → 3.0.59

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.
Files changed (69) hide show
  1. package/actions/router.d.ts +1 -0
  2. package/actions/router.js +3 -2
  3. package/components/MetaComponent.js +17 -16
  4. package/docs-autogen-result.json +707 -1612
  5. package/en.json +6 -0
  6. package/enums/FieldEnum.d.ts +68 -0
  7. package/enums/FieldEnum.js +96 -0
  8. package/enums/index.d.ts +3 -0
  9. package/enums/index.js +8 -0
  10. package/hooks/index.d.ts +2 -1
  11. package/hooks/index.js +3 -1
  12. package/hooks/useDataSelect.js +1 -0
  13. package/hooks/useListField.d.ts +32 -0
  14. package/hooks/useListField.js +103 -0
  15. package/package.json +1 -1
  16. package/ui/content/Calendar/Calendar.d.ts +6 -2
  17. package/ui/content/Calendar/Calendar.js +5 -3
  18. package/ui/form/AutoCompleteField/AutoCompleteField.js +2 -1
  19. package/ui/form/BlankField/BlankField.js +2 -1
  20. package/ui/form/Button/Button.js +13 -4
  21. package/ui/form/CheckboxField/CheckboxField.d.ts +5 -5
  22. package/ui/form/CheckboxField/CheckboxField.js +11 -5
  23. package/ui/form/CheckboxListField/CheckboxListField.d.ts +2 -1
  24. package/ui/form/CheckboxListField/CheckboxListField.js +16 -93
  25. package/ui/form/CheckboxTreeField/CheckboxTreeField.js +2 -1
  26. package/ui/form/DateField/DateField.js +7 -4
  27. package/ui/form/DateField/useDateRange.js +2 -0
  28. package/ui/form/DateRangeField/DateRangeField.d.ts +27 -11
  29. package/ui/form/DateRangeField/DateRangeField.js +33 -13
  30. package/ui/form/DateRangeField/useOnDayClick.d.ts +10 -0
  31. package/ui/form/DateRangeField/useOnDayClick.js +41 -0
  32. package/ui/form/DateTimeField/DateTimeField.js +6 -3
  33. package/ui/form/DateTimeRangeField/DateTimeRangeField.d.ts +15 -12
  34. package/ui/form/DateTimeRangeField/DateTimeRangeField.js +10 -5
  35. package/ui/form/DropDownField/DropDownField.d.ts +10 -1
  36. package/ui/form/DropDownField/DropDownField.js +14 -12
  37. package/ui/form/EmailField/EmailField.js +2 -1
  38. package/ui/form/Field/Field.js +2 -1
  39. package/ui/form/Field/fieldWrapper.d.ts +2 -1
  40. package/ui/form/FieldList/FieldList.js +4 -3
  41. package/ui/form/FileField/FileField.js +2 -1
  42. package/ui/form/Form/Form.js +37 -22
  43. package/ui/form/HtmlField/HtmlField.js +2 -1
  44. package/ui/form/ImageField/ImageField.js +2 -1
  45. package/ui/form/InputField/InputField.js +2 -1
  46. package/ui/form/InputField/hooks/useInputFieldWarningByType.js +16 -14
  47. package/ui/form/NavField/NavField.js +2 -1
  48. package/ui/form/NumberField/NumberField.js +10 -19
  49. package/ui/form/NumberField/hooks/useInputTypeNumber.d.ts +1 -1
  50. package/ui/form/NumberField/hooks/useInputTypeNumber.js +12 -3
  51. package/ui/form/PasswordField/PasswordField.js +2 -1
  52. package/ui/form/RadioField/RadioField.d.ts +3 -26
  53. package/ui/form/RadioField/RadioField.js +9 -53
  54. package/ui/form/RadioListField/RadioListField.d.ts +3 -42
  55. package/ui/form/RadioListField/RadioListField.js +8 -83
  56. package/ui/form/RateField/RateField.js +2 -1
  57. package/ui/form/ReCaptchaField/ReCaptchaField.js +2 -1
  58. package/ui/form/SliderField/SliderField.js +2 -1
  59. package/ui/form/SwitcherField/SwitcherField.d.ts +3 -39
  60. package/ui/form/SwitcherField/SwitcherField.js +4 -80
  61. package/ui/form/SwitcherListField/SwitcherListField.d.ts +3 -0
  62. package/ui/form/SwitcherListField/SwitcherListField.js +22 -0
  63. package/ui/form/SwitcherListField/index.d.ts +2 -0
  64. package/ui/form/SwitcherListField/index.js +7 -0
  65. package/ui/form/TextField/TextField.js +2 -1
  66. package/ui/form/TimeField/TimeField.js +2 -1
  67. package/ui/form/TimeRangeField/TimeRangeField.js +2 -1
  68. package/ui/form/index.d.ts +7 -5
  69. package/ui/form/index.js +8 -5
@@ -1,118 +1,41 @@
1
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
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
14
- if (k2 === undefined) k2 = k;
15
- var desc = Object.getOwnPropertyDescriptor(m, k);
16
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
17
- desc = { enumerable: true, get: function() { return m[k]; } };
18
- }
19
- Object.defineProperty(o, k2, desc);
20
- }) : (function(o, m, k, k2) {
21
- if (k2 === undefined) k2 = k;
22
- o[k2] = m[k];
23
- }));
24
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
25
- Object.defineProperty(o, "default", { enumerable: true, value: v });
26
- }) : function(o, v) {
27
- o["default"] = v;
28
- });
29
- var __importStar = (this && this.__importStar) || function (mod) {
30
- if (mod && mod.__esModule) return mod;
31
- var result = {};
32
- if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
33
- __setModuleDefault(result, mod);
34
- return result;
35
- };
36
2
  var __importDefault = (this && this.__importDefault) || function (mod) {
37
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
38
4
  };
39
5
  exports.__esModule = true;
40
- var react_1 = __importStar(require("react"));
41
- var react_use_1 = require("react-use");
42
- var isEqual_1 = __importDefault(require("lodash-es/isEqual"));
6
+ var react_1 = require("react");
43
7
  var hooks_1 = require("../../../hooks");
44
8
  var fieldWrapper_1 = __importDefault(require("../../../ui/form/Field/fieldWrapper"));
9
+ var enums_1 = require("../../../enums");
45
10
  function CheckboxListField(props) {
46
11
  var components = (0, hooks_1.useComponents)();
47
- var inputSelectedIds = (0, react_1.useMemo)(function () { return props.selectedIds || [].concat(props.input.value || []); }, [props.input.value, props.selectedIds]);
48
- // Data Provider
49
- var items = (0, hooks_1.useDataProvider)({
12
+ var _a = (0, hooks_1.useListField)({
13
+ inputType: props.multiple ? 'checkbox' : 'radio',
14
+ defaultItemView: props.multiple ? 'form.CheckboxFieldView' : 'form.RadioFieldView',
15
+ selectedIds: props.selectedIds,
16
+ input: props.input,
50
17
  items: props.items,
51
- initialSelectedIds: inputSelectedIds,
52
- dataProvider: props.dataProvider
53
- }).items;
54
- // Data select
55
- var _a = (0, hooks_1.useDataSelect)({
56
- selectedIds: inputSelectedIds,
18
+ dataProvider: props.dataProvider,
57
19
  multiple: props.multiple,
58
- primaryKey: props.primaryKey,
59
20
  selectFirst: props.selectFirst,
60
- items: items,
61
- inputValue: props.input.value
62
- }), selectedIds = _a.selectedIds, setSelectedIds = _a.setSelectedIds;
63
- var onItemSelect = (0, react_1.useCallback)(function (id) {
64
- setSelectedIds(id);
65
- }, [setSelectedIds]);
66
- var inputProps = (0, react_1.useMemo)(function () { return (__assign(__assign({}, props.inputProps), { type: 'checkbox', name: props.input.name, disabled: props.disabled })); }, [props.disabled, props.input, props.inputProps]);
67
- // Sync with form
68
- var prevSelectedIds = (0, react_use_1.usePrevious)(selectedIds);
69
- (0, react_1.useEffect)(function () {
70
- if (!(0, isEqual_1["default"])(prevSelectedIds || [], selectedIds)) {
71
- props.input.onChange.call(null, selectedIds);
72
- if (props.onChange) {
73
- props.onChange.call(null, selectedIds);
74
- }
75
- }
76
- // eslint-disable-next-line react-hooks/exhaustive-deps
77
- }, [props.input.onChange, selectedIds]);
78
- var onReset = (0, react_1.useCallback)(function () {
79
- setSelectedIds([]);
80
- }, [setSelectedIds]);
81
- // Reset selected ids on form reset
82
- var prevInputValue = (0, react_use_1.usePrevious)(props.input.value);
83
- (0, react_use_1.useUpdateEffect)(function () {
84
- // if form reset
85
- if (prevInputValue && props.input.value === undefined && selectedIds.length > 0) {
86
- onReset();
87
- }
88
- }, [onReset, prevInputValue, props.input.value, selectedIds.length]);
89
- var CheckboxFieldView = props.itemView || components.ui.getView('form.CheckboxFieldView');
90
- var renderCheckbox = (0, react_1.useCallback)(function (checkboxProps) { return (react_1["default"].createElement(CheckboxFieldView, __assign({}, checkboxProps, props.itemViewProps))); }, [CheckboxFieldView, props.itemViewProps]);
21
+ primaryKey: props.primaryKey,
22
+ inputProps: props.inputProps,
23
+ disabled: props.disabled
24
+ }), selectedIds = _a.selectedIds, items = _a.items, inputProps = _a.inputProps, onItemSelect = _a.onItemSelect, renderItem = _a.renderItem;
91
25
  var viewProps = (0, react_1.useMemo)(function () { return ({
92
26
  items: items,
93
27
  inputProps: inputProps,
94
28
  onItemSelect: onItemSelect,
95
29
  selectedIds: selectedIds,
96
- renderCheckbox: renderCheckbox,
30
+ renderItem: renderItem,
97
31
  orientation: props.orientation,
98
32
  size: props.size,
99
33
  disabled: props.disabled,
100
34
  className: props.className,
101
35
  style: props.style,
102
36
  viewProps: props.viewProps
103
- }); }, [
104
- inputProps,
105
- items,
106
- onItemSelect,
107
- props.className,
108
- props.disabled,
109
- props.orientation,
110
- props.size,
111
- props.style,
112
- props.viewProps,
113
- renderCheckbox,
114
- selectedIds,
115
- ]);
37
+ }); }, [inputProps, items, onItemSelect, props.className, props.disabled,
38
+ props.orientation, props.size, props.style, props.viewProps, renderItem, selectedIds]);
116
39
  return components.ui.renderView(props.view || 'form.CheckboxListFieldView', viewProps);
117
40
  }
118
41
  CheckboxListField.defaultProps = {
@@ -122,4 +45,4 @@ CheckboxListField.defaultProps = {
122
45
  multiple: true,
123
46
  orientation: 'vertical'
124
47
  };
125
- exports["default"] = (0, fieldWrapper_1["default"])('CheckboxListField', CheckboxListField);
48
+ exports["default"] = (0, fieldWrapper_1["default"])(enums_1.FieldEnum.CHECKBOX_LIST_FIELD, CheckboxListField);
@@ -44,6 +44,7 @@ var isArray_1 = __importDefault(require("lodash-es/isArray"));
44
44
  var isEqual_1 = __importDefault(require("lodash-es/isEqual"));
45
45
  var hooks_1 = require("../../../hooks");
46
46
  var fieldWrapper_1 = __importDefault(require("../../../ui/form/Field/fieldWrapper"));
47
+ var enums_1 = require("../../../enums");
47
48
  var getNestedItemsIds = function (item, groupAttribute, hasOnlyLeafCheckboxes) {
48
49
  if (hasOnlyLeafCheckboxes === void 0) { hasOnlyLeafCheckboxes = false; }
49
50
  if (item.disabled) {
@@ -149,4 +150,4 @@ CheckboxTreeField.defaultProps = {
149
150
  saveInClientStorage: false,
150
151
  collapseChildItems: false
151
152
  };
152
- exports["default"] = (0, fieldWrapper_1["default"])('CheckboxTreeField', CheckboxTreeField);
153
+ exports["default"] = (0, fieldWrapper_1["default"])(enums_1.FieldEnum.CHECKBOX_TREE_FIELD, CheckboxTreeField);
@@ -20,6 +20,7 @@ var kit_1 = require("@maskito/kit");
20
20
  var hooks_1 = require("../../../hooks");
21
21
  var useDateInputState_1 = __importDefault(require("./useDateInputState"));
22
22
  var fieldWrapper_1 = __importDefault(require("../../form/Field/fieldWrapper"));
23
+ var enums_1 = require("../../../enums");
23
24
  /**
24
25
  * DateField
25
26
  * Поле ввода с выпадающим календарём для выбора даты
@@ -39,9 +40,11 @@ function DateField(props) {
39
40
  }), onClear = _a.onClear, onClose = _a.onClose, isOpened = _a.isOpened, inputProps = _a.inputProps;
40
41
  // Calendar props
41
42
  var calendarProps = (0, react_1.useMemo)(function () { return (__assign({ value: props.input.value, onChange: props.input.onChange, valueFormat: props.valueFormat }, props.calendarProps)); }, [props.calendarProps, props.input.onChange, props.input.value, props.valueFormat]);
42
- var viewProps = (0, react_1.useMemo)(function () { return (__assign(__assign({}, props.viewProps), { calendarProps: calendarProps, onClear: onClear, onClose: onClose, isOpened: isOpened, inputProps: inputProps, size: props.size, icon: props.icon, errors: props.errors, label: props.label, disabled: props.disabled, className: props.className, showRemove: props.showRemove, style: props.style, autoPositioning: props.autoPositioning, maskInputRef: maskInputRef, id: props.id })); }, [props.viewProps, props.size, props.icon, props.errors, props.label, props.disabled,
43
- props.className, props.showRemove, props.style, props.autoPositioning, props.id,
44
- calendarProps, onClear, onClose, isOpened, inputProps, maskInputRef]);
43
+ var viewProps = (0, react_1.useMemo)(function () { return (__assign(__assign({}, props.viewProps), { calendarProps: calendarProps, onClear: onClear, onClose: onClose, isOpened: isOpened, inputProps: inputProps, size: props.size, icon: props.icon, errors: props.errors, label: props.label, disabled: props.disabled, className: props.className, showRemove: props.showRemove, style: props.style, autoPositioning: props.autoPositioning, maskInputRef: maskInputRef, id: props.id })); }, [
44
+ props.viewProps, props.size, props.icon, props.errors, props.label, props.disabled,
45
+ props.className, props.showRemove, props.style, props.autoPositioning, props.id, calendarProps,
46
+ onClear, onClose, isOpened, inputProps, maskInputRef,
47
+ ]);
45
48
  return components.ui.renderView(props.view || 'form.DateFieldView', viewProps);
46
49
  }
47
50
  DateField.defaultProps = {
@@ -57,4 +60,4 @@ DateField.defaultProps = {
57
60
  separator: '.'
58
61
  })
59
62
  };
60
- exports["default"] = (0, fieldWrapper_1["default"])('DateField', DateField);
63
+ exports["default"] = (0, fieldWrapper_1["default"])(enums_1.FieldEnum.DATE_FIELD, DateField);
@@ -42,6 +42,8 @@ function useDateRange(props) {
42
42
  var onClear = (0, react_1.useCallback)(function () {
43
43
  props.onClearFrom();
44
44
  props.onClearTo();
45
+ valueFromRef.current = '';
46
+ valueToRef.current = '';
45
47
  }, [props]);
46
48
  // Custom onFocus for inputFrom
47
49
  var inputFromRef = (0, react_1.useRef)(null);
@@ -1,8 +1,13 @@
1
1
  import React from 'react';
2
2
  import { MaskitoOptions } from '@maskito/core';
3
+ import { ILocaleComponent } from '../../../components/LocaleComponent';
3
4
  import { ICalendarProps } from '../../content/Calendar/Calendar';
4
5
  import { IDateInputStateInput, IDateInputStateOutput } from '../DateField/useDateInputState';
5
6
  import { IFieldWrapperInputProps, IFieldWrapperOutputProps } from '../../form/Field/fieldWrapper';
7
+ export interface IDateRangeButton {
8
+ label: string;
9
+ onClick: (locale: ILocaleComponent, changeFrom: (value: string) => void, changeTo: (value: string) => void) => void;
10
+ }
6
11
  /**
7
12
  * DateRangeField
8
13
  *
@@ -22,16 +27,6 @@ export interface IDateRangeFieldProps extends IDateInputStateInput, Omit<IFieldW
22
27
  * @example 'toTime'
23
28
  */
24
29
  attributeTo?: string;
25
- /**
26
- * Свойства для компонента DayPickerInput
27
- * @example
28
- * {
29
- * dayPickerProps: {
30
- * showWeekNumbers: true
31
- * }
32
- * }
33
- */
34
- pickerProps?: any;
35
30
  /**
36
31
  * Формат даты показываемый пользователю
37
32
  * @example DD.MM.YYYY
@@ -92,9 +87,30 @@ export interface IDateRangeFieldProps extends IDateInputStateInput, Omit<IFieldW
92
87
  */
93
88
  to: MaskitoOptions;
94
89
  };
90
+ /**
91
+ * Активирует логику:
92
+ * - Если кликнули по дате начала или конца диапазона, то позволяем её изменить следующим кликом
93
+ * - Если клик не на дату конца или начала диапазона, а диапазон есть, то сбрасываем его
94
+ * - Если клик не на дату конца или начала диапазона, а диапазона нет, то устанавливаем кликнутую дату в поле from
95
+ * @example true
96
+ */
97
+ useSmartRangeReset?: boolean;
98
+ /**
99
+ * Добавляет дополнительные кнопки к календарю
100
+ * true - будут отображены кнопки по-умолчанию
101
+ * список:
102
+ * string - одна из кнопок по-умолчанию
103
+ * object - кастомная кнопка
104
+ */
105
+ withRangeButtons?: boolean | IDateRangeButton[];
106
+ /**
107
+ * Положение дополнительных кнопок (сегодня, вчера и прочие)
108
+ * Если указано в формате 'position1-position2', то 'position1' будет на устройствах > $tablet-width, а 'position2' на остальных.
109
+ */
110
+ rangeButtonsPosition?: 'top' | 'bottom' | 'left' | 'right' | 'top-left' | 'top-right' | 'top-bottom' | 'bottom-left' | 'bottom-right' | 'bottom-top' | 'left-top' | 'left-bottom' | 'left-right' | 'right-top' | 'right-bottom' | 'right-left';
95
111
  [key: string]: any;
96
112
  }
97
- export interface IDateRangeFieldViewProps extends IDateInputStateOutput, Omit<IFieldWrapperOutputProps, 'input'>, Pick<IDateRangeFieldProps, 'size' | 'icon' | 'errors' | 'showRemove' | 'calendarProps' | 'className' | 'disabled' | 'noBorder' | 'style'> {
113
+ export interface IDateRangeFieldViewProps extends IDateInputStateOutput, Omit<IFieldWrapperOutputProps, 'input'>, Pick<IDateRangeFieldProps, 'size' | 'icon' | 'errors' | 'showRemove' | 'calendarProps' | 'className' | 'disabled' | 'noBorder' | 'style' | 'withRangeButtons' | 'rangeButtonsPosition' | 'displayFormat'> {
98
114
  inputPropsFrom?: any;
99
115
  inputPropsTo?: any;
100
116
  errorsFrom?: string[];
@@ -1,4 +1,15 @@
1
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
+ };
2
13
  var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
14
  if (k2 === undefined) k2 = k;
4
15
  var desc = Object.getOwnPropertyDescriptor(m, k);
@@ -33,6 +44,8 @@ var useDateRange_1 = __importDefault(require("../../form/DateField/useDateRange"
33
44
  var hooks_1 = require("../../../hooks");
34
45
  var useDateInputState_1 = __importDefault(require("../DateField/useDateInputState"));
35
46
  var fieldWrapper_1 = __importDefault(require("../../form/Field/fieldWrapper"));
47
+ var enums_1 = require("../../../enums");
48
+ var useOnDayClick_1 = __importDefault(require("./useOnDayClick"));
36
49
  function DateRangeField(props) {
37
50
  var _a, _b;
38
51
  var components = (0, hooks_1.useComponents)();
@@ -95,15 +108,16 @@ function DateRangeField(props) {
95
108
  maskInputFromRef,
96
109
  maskInputToRef,
97
110
  ]);
111
+ var onDayClick = (0, useOnDayClick_1["default"])({
112
+ focus: focus,
113
+ useSmartRangeReset: props.useSmartRangeReset,
114
+ fromValue: props.inputFrom.value,
115
+ toValue: props.inputTo.value,
116
+ onFromChange: props.inputFrom.onChange,
117
+ onToChange: props.inputTo.onChange
118
+ });
98
119
  // Calendar props
99
- var calendarProps = (0, react_1.useMemo)(function () { return ({
100
- value: [props.inputFrom.value, props.inputTo.value],
101
- onChange: focus === 'from' ? props.inputFrom.onChange : props.inputTo.onChange,
102
- valueFormat: props.valueFormat,
103
- numberOfMonths: 2,
104
- showFooter: false
105
- }); }, [focus, props.inputFrom.onChange, props.inputFrom.value, props.inputTo.onChange,
106
- props.inputTo.value, props.valueFormat]);
120
+ var calendarProps = (0, react_1.useMemo)(function () { return (__assign({ value: [props.inputFrom.value, props.inputTo.value], onChange: onDayClick, valueFormat: props.valueFormat, numberOfMonths: 2, showFooter: false }, props.calendarProps)); }, [onDayClick, props.calendarProps, props.inputFrom.value, props.inputTo.value, props.valueFormat]);
107
121
  var viewProps = (0, react_1.useMemo)(function () { return ({
108
122
  onClear: onClear,
109
123
  onClose: onClose,
@@ -119,9 +133,13 @@ function DateRangeField(props) {
119
133
  inputPropsFrom: extendedInputPropsFrom,
120
134
  isOpened: focus === 'from' ? isOpenedFrom : isOpenedTo,
121
135
  style: props.style,
122
- id: props.id
123
- }); }, [calendarProps, extendedInputPropsFrom, extendedInputPropsTo, focus, isOpenedFrom, isOpenedTo, onClear, onClose,
124
- props.className, props.disabled, props.errorsFrom, props.errorsTo, props.icon, props.id, props.showRemove, props.size, props.style]);
136
+ id: props.id,
137
+ withRangeButtons: props.withRangeButtons,
138
+ rangeButtonsPosition: props.rangeButtonsPosition,
139
+ displayFormat: props.displayFormat
140
+ }); }, [calendarProps, extendedInputPropsFrom, extendedInputPropsTo, focus, isOpenedFrom, isOpenedTo, onClear,
141
+ onClose, props.className, props.disabled, props.errorsFrom, props.errorsTo, props.icon, props.id, props.showRemove,
142
+ props.size, props.style, props.withRangeButtons, props.rangeButtonsPosition, props.displayFormat]);
125
143
  return components.ui.renderView(props.view || 'form.DateRangeFieldView', viewProps);
126
144
  }
127
145
  DateRangeField.defaultProps = {
@@ -134,6 +152,7 @@ DateRangeField.defaultProps = {
134
152
  useSmartFocus: true,
135
153
  hasInitialFocus: false,
136
154
  icon: true,
155
+ useSmartRangeReset: true,
137
156
  maskOptions: {
138
157
  from: (0, kit_1.maskitoDateOptionsGenerator)({
139
158
  mode: 'dd/mm/yyyy',
@@ -143,6 +162,7 @@ DateRangeField.defaultProps = {
143
162
  mode: 'dd/mm/yyyy',
144
163
  separator: '.'
145
164
  })
146
- }
165
+ },
166
+ rangeButtonsPosition: 'left-bottom'
147
167
  };
148
- exports["default"] = (0, fieldWrapper_1["default"])('DateRangeField', DateRangeField, { attributeSuffixes: ['from', 'to'] });
168
+ exports["default"] = (0, fieldWrapper_1["default"])(enums_1.FieldEnum.DATE_RANGE_FIELD, DateRangeField, { attributeSuffixes: ['from', 'to'] });
@@ -0,0 +1,10 @@
1
+ interface IUseOnDayClickProps {
2
+ useSmartRangeReset?: boolean;
3
+ focus: 'from' | 'to';
4
+ fromValue: string;
5
+ toValue: string;
6
+ onFromChange: (value: string) => void;
7
+ onToChange: (value: string) => void;
8
+ }
9
+ export default function useOnDayClick(props: IUseOnDayClickProps): (value: any) => void;
10
+ export {};
@@ -0,0 +1,41 @@
1
+ "use strict";
2
+ exports.__esModule = true;
3
+ var react_1 = require("react");
4
+ function useOnDayClick(props) {
5
+ var useSmartRangeReset = props.useSmartRangeReset, focus = props.focus, fromValue = props.fromValue, toValue = props.toValue, onFromChange = props.onFromChange, onToChange = props.onToChange;
6
+ var onDayClick = (0, react_1.useCallback)(function (value) {
7
+ if (useSmartRangeReset) {
8
+ // Если кликнули по дате начала или конца диапазона, то позволяем её изменить следующим кликом
9
+ // Если клик не на дату конца или начала диапазона, а диапазон есть, то сбрасываем его
10
+ if (value === fromValue) {
11
+ onFromChange(toValue);
12
+ onToChange(null);
13
+ return;
14
+ }
15
+ if (value === toValue) {
16
+ onFromChange(fromValue);
17
+ onToChange(null);
18
+ return;
19
+ }
20
+ if (fromValue && toValue) {
21
+ onToChange(null);
22
+ onFromChange(value);
23
+ return;
24
+ }
25
+ if (fromValue) {
26
+ onToChange(value);
27
+ return;
28
+ }
29
+ onFromChange(value);
30
+ return;
31
+ }
32
+ if (focus === 'from') {
33
+ onFromChange(value);
34
+ }
35
+ else {
36
+ onToChange(value);
37
+ }
38
+ }, [focus, fromValue, onFromChange, onToChange, toValue, useSmartRangeReset]);
39
+ return onDayClick;
40
+ }
41
+ exports["default"] = useOnDayClick;
@@ -21,6 +21,7 @@ var useDateTime_1 = __importDefault(require("../DateField/useDateTime"));
21
21
  var useDateInputState_1 = __importDefault(require("../../form/DateField/useDateInputState"));
22
22
  var fieldWrapper_1 = __importDefault(require("../../form/Field/fieldWrapper"));
23
23
  var hooks_1 = require("../../../hooks");
24
+ var enums_1 = require("../../../enums");
24
25
  var DATE_TIME_SEPARATOR = ', ';
25
26
  /**
26
27
  * DateTimeField
@@ -77,8 +78,10 @@ function DateTimeField(props) {
77
78
  disabled: props.disabled,
78
79
  style: props.style,
79
80
  id: props.id
80
- }); }, [calendarProps, inputProps, isOpened, maskInputRef, onClear, onClose, props.className, props.disabled, props.errors, props.icon,
81
- props.id, props.placeholder, props.showRemove, props.size, props.style, timePanelViewProps]);
81
+ }); }, [
82
+ calendarProps, inputProps, isOpened, maskInputRef, onClear, onClose, props.className, props.disabled, props.errors,
83
+ props.icon, props.id, props.placeholder, props.showRemove, props.size, props.style, timePanelViewProps,
84
+ ]);
82
85
  return components.ui.renderView(props.view || 'form.DateTimeFieldView', viewProps);
83
86
  }
84
87
  DateTimeField.defaultProps = {
@@ -97,4 +100,4 @@ DateTimeField.defaultProps = {
97
100
  dateTimeSeparator: DATE_TIME_SEPARATOR
98
101
  })
99
102
  };
100
- exports["default"] = (0, fieldWrapper_1["default"])('DateTimeField', DateTimeField);
103
+ exports["default"] = (0, fieldWrapper_1["default"])(enums_1.FieldEnum.DATE_TIME_FIELD, DateTimeField);
@@ -1,6 +1,6 @@
1
1
  import { MaskitoOptions } from '@maskito/core';
2
2
  import { ICalendarProps } from '../../content/Calendar/Calendar';
3
- import { IDateRangeFieldProps } from '../../form/DateRangeField/DateRangeField';
3
+ import { IDateRangeButton, IDateRangeFieldProps } from '../../form/DateRangeField/DateRangeField';
4
4
  import { IDateInputStateInput, IDateInputStateOutput } from '../../form/DateField/useDateInputState';
5
5
  import { IFieldWrapperInputProps, IFieldWrapperOutputProps } from '../../form/Field/fieldWrapper';
6
6
  /**
@@ -23,16 +23,6 @@ export interface IDateTimeRangeFieldProps extends Omit<IDateInputStateInput, 'in
23
23
  * @example 'toTime'
24
24
  */
25
25
  attributeTo?: string;
26
- /**
27
- * Свойства для компонента DayPickerInput
28
- * @example
29
- * {
30
- * dayPickerProps: {
31
- * showWeekNumbers: true
32
- * }
33
- * }
34
- */
35
- pickerProps?: any;
36
26
  /**
37
27
  * Свойства для поля 'from'
38
28
  */
@@ -67,9 +57,22 @@ export interface IDateTimeRangeFieldProps extends Omit<IDateInputStateInput, 'in
67
57
  */
68
58
  to: MaskitoOptions;
69
59
  };
60
+ /**
61
+ * Добавляет дополнительные кнопки к календарю
62
+ * true - будут отображены кнопки по-умолчанию
63
+ * список:
64
+ * string - одна из кнопок по-умолчанию
65
+ * object - кастомная кнопка
66
+ */
67
+ withRangeButtons?: boolean | IDateRangeButton[];
68
+ /**
69
+ * Положение дополнительных кнопок (сегодня, вчера и прочие)
70
+ * Если указано в формате 'position1-position2', то 'position1' будет на устройствах > $tablet-width, а 'position2' на остальных.
71
+ */
72
+ rangeButtonsPosition?: 'top' | 'bottom' | 'left' | 'right' | 'top-left' | 'top-right' | 'top-bottom' | 'bottom-left' | 'bottom-right' | 'bottom-top' | 'left-top' | 'left-bottom' | 'left-right' | 'right-top' | 'right-bottom' | 'right-left';
70
73
  [key: string]: any;
71
74
  }
72
- export interface IDateTimeRangeFieldViewProps extends IDateInputStateOutput, Omit<IFieldWrapperOutputProps, 'input'>, Pick<IDateRangeFieldProps, 'size' | 'icon' | 'errors' | 'showRemove' | 'calendarProps' | 'className' | 'disabled' | 'noBorder' | 'style'> {
75
+ export interface IDateTimeRangeFieldViewProps extends IDateInputStateOutput, Omit<IFieldWrapperOutputProps, 'input'>, Pick<IDateRangeFieldProps, 'size' | 'icon' | 'errors' | 'showRemove' | 'calendarProps' | 'className' | 'disabled' | 'withRangeButtons' | 'rangeButtonsPosition' | 'noBorder' | 'style' | 'displayFormat'> {
73
76
  timePanelViewProps?: any;
74
77
  calendarProps?: ICalendarProps;
75
78
  inputPropsFrom?: any;
@@ -45,6 +45,7 @@ var useDateTime_1 = __importDefault(require("../../form/DateField/useDateTime"))
45
45
  var useDateInputState_1 = __importDefault(require("../../form/DateField/useDateInputState"));
46
46
  var fieldWrapper_1 = __importDefault(require("../../form/Field/fieldWrapper"));
47
47
  var hooks_1 = require("../../../hooks");
48
+ var enums_1 = require("../../../enums");
48
49
  var DATE_TIME_SEPARATOR = ', ';
49
50
  function DateTimeRangeField(props) {
50
51
  var _a, _b;
@@ -157,10 +158,13 @@ function DateTimeRangeField(props) {
157
158
  isOpened: focus === 'from' ? isOpenedFrom : isOpenedTo,
158
159
  disabled: props.disabled,
159
160
  style: props.style,
160
- id: props.id
161
+ id: props.id,
162
+ withRangeButtons: props.withRangeButtons,
163
+ rangeButtonsPosition: props.rangeButtonsPosition,
164
+ displayFormat: props.displayFormat
161
165
  }); }, [calendarProps, extendedInputPropsFrom, extendedInputPropsTo, focus, isOpenedFrom,
162
- isOpenedTo, onClear, onClose, props.className, props.disabled, props.errorsFrom,
163
- props.errorsTo, props.icon, props.id, props.showRemove, props.size, props.style, timePanelViewProps]);
166
+ isOpenedTo, onClear, onClose, props.className, props.disabled, props.errorsFrom, props.withRangeButtons, props.rangeButtonsPosition,
167
+ props.errorsTo, props.icon, props.id, props.showRemove, props.size, props.style, timePanelViewProps, props.displayFormat]);
164
168
  return components.ui.renderView(props.view || 'form.DateTimeRangeFieldView', viewProps);
165
169
  }
166
170
  DateTimeRangeField.defaultProps = {
@@ -185,6 +189,7 @@ DateTimeRangeField.defaultProps = {
185
189
  timeMode: 'HH:MM',
186
190
  dateSeparator: '.'
187
191
  })
188
- }
192
+ },
193
+ rangeButtonsPosition: 'left-bottom'
189
194
  };
190
- exports["default"] = (0, fieldWrapper_1["default"])('DateTimeRangeField', DateTimeRangeField, { attributeSuffixes: ['from', 'to'] });
195
+ exports["default"] = (0, fieldWrapper_1["default"])(enums_1.FieldEnum.DATE_TIME_RANGE_FIELD, DateTimeRangeField, { attributeSuffixes: ['from', 'to'] });
@@ -3,6 +3,7 @@ import { IAccordionItemViewProps } from '../../../ui/content/Accordion/Accordion
3
3
  import { DataProviderItems, IDataProviderConfig } from '../../../hooks/useDataProvider';
4
4
  import { IDataSelectConfig } from '../../../hooks/useDataSelect';
5
5
  import { IFieldWrapperInputProps } from '../../form/Field/fieldWrapper';
6
+ import { IDropDownProps } from '../../content/DropDown/DropDown';
6
7
  export declare const GROUP_CONTENT_TYPE = "group";
7
8
  export declare const CHECKBOX_CONTENT_TYPE = "checkbox";
8
9
  export declare const RADIO_CONTENT_TYPE = "radio";
@@ -140,6 +141,10 @@ export interface IDropDownFieldProps extends IFieldWrapperInputProps, Omit<IData
140
141
  viewProps?: {
141
142
  [key: string]: any;
142
143
  };
144
+ /**
145
+ * Свойства, которые напрямую передаются в DropDown компонент
146
+ */
147
+ dropDownProps?: IDropDownProps;
143
148
  /**
144
149
  * Callback-функция, которая вызывается при выборе элемента DropDown
145
150
  */
@@ -157,6 +162,10 @@ export interface IDropDownFieldProps extends IFieldWrapperInputProps, Omit<IData
157
162
  * @example true
158
163
  */
159
164
  isFetchOnClose?: boolean;
165
+ /**
166
+ * Число в пикселях, больше которого не может быть выпадающее меню
167
+ */
168
+ maxHeight?: number;
160
169
  [key: string]: any;
161
170
  }
162
171
  export interface IDropDownFieldViewProps extends IDropDownFieldProps {
@@ -164,7 +173,6 @@ export interface IDropDownFieldViewProps extends IDropDownFieldProps {
164
173
  selectedItems: Record<string, unknown>[];
165
174
  hoveredId: PrimaryKey | any;
166
175
  selectedIds: (PrimaryKey | any)[];
167
- forwardedRef: any;
168
176
  autoCompleteInputForwardedRef: MutableRefObject<HTMLInputElement>;
169
177
  inputRef: MutableRefObject<HTMLInputElement>;
170
178
  searchInputProps: {
@@ -180,6 +188,7 @@ export interface IDropDownFieldViewProps extends IDropDownFieldProps {
180
188
  isLoading?: boolean;
181
189
  onReset: () => void;
182
190
  onOpen: () => void;
191
+ onClose: () => void;
183
192
  renderItem: (item: IDropDownFieldItem) => JSX.Element;
184
193
  onItemRemove: (id: PrimaryKey | any) => void;
185
194
  isAutoComplete?: boolean;
@@ -64,8 +64,10 @@ var isEqual_1 = __importDefault(require("lodash-es/isEqual"));
64
64
  var isEmpty_1 = __importDefault(require("lodash-es/isEmpty"));
65
65
  var includes_1 = __importDefault(require("lodash-es/includes"));
66
66
  var isPlainObject_1 = __importDefault(require("lodash-es/isPlainObject"));
67
+ var merge_1 = __importDefault(require("lodash-es/merge"));
67
68
  var hooks_1 = require("../../../hooks");
68
69
  var fieldWrapper_1 = __importDefault(require("../../form/Field/fieldWrapper"));
70
+ var enums_1 = require("../../../enums");
69
71
  exports.GROUP_CONTENT_TYPE = 'group';
70
72
  exports.CHECKBOX_CONTENT_TYPE = 'checkbox';
71
73
  exports.RADIO_CONTENT_TYPE = 'radio';
@@ -83,6 +85,10 @@ var normalizeItemToSelectAll = function (itemToSelectAll) {
83
85
  label: __('Все')
84
86
  };
85
87
  };
88
+ var DEFAULT_DROP_DOWN_PROPS = {
89
+ position: 'bottom',
90
+ autoPositioning: true
91
+ };
86
92
  function DropDownField(props) {
87
93
  var components = (0, hooks_1.useComponents)();
88
94
  // Query state
@@ -168,12 +174,6 @@ function DropDownField(props) {
168
174
  setIsFocused(false);
169
175
  setIsOpened(false);
170
176
  }, [fetchRemote, isOpened, props, selectedIds, setIsFocused, setIsOpened]);
171
- // Outside click -> close
172
- var forwardedRef = (0, react_1.useRef)(null);
173
- if (process.env.PLATFORM !== 'mobile') {
174
- // eslint-disable-next-line react-hooks/rules-of-hooks
175
- (0, react_use_1.useClickAway)(forwardedRef, onClose);
176
- }
177
177
  // Search input props
178
178
  var searchInputProps = (0, react_1.useMemo)(function () { return ({
179
179
  type: 'search',
@@ -236,13 +236,15 @@ function DropDownField(props) {
236
236
  }
237
237
  return renderItemView(item, 'default', null);
238
238
  }, [hasGroup, props.groupAttribute, props.itemsContent, renderItemView]);
239
- var viewProps = (0, react_1.useMemo)(function () { return (__assign({ isAutoComplete: isAutoComplete, items: items, hoveredId: hoveredId, selectedIds: selectedIds, forwardedRef: forwardedRef, inputRef: inputRef, autoCompleteInputForwardedRef: autoCompleteInputForwardedRef, searchInputProps: searchInputProps, isOpened: isOpened, isLoading: isLoading, onOpen: onOpen, selectedItems: selectedItems,
239
+ var dropDownProps = (0, react_1.useMemo)(function () { return (0, merge_1["default"])(DEFAULT_DROP_DOWN_PROPS, props.dropDownProps); }, [props.dropDownProps]);
240
+ var viewProps = (0, react_1.useMemo)(function () { return (__assign({ isAutoComplete: isAutoComplete, items: items, hoveredId: hoveredId, selectedIds: selectedIds, inputRef: inputRef, autoCompleteInputForwardedRef: autoCompleteInputForwardedRef, searchInputProps: searchInputProps, isOpened: isOpened, isLoading: isLoading, onOpen: onOpen, selectedItems: selectedItems,
240
241
  // TODO onFocus
241
242
  // TODO onBlur
242
- onReset: onReset, onClose: onClose, renderItem: renderItem, onItemRemove: onItemRemove, hasGroup: hasGroup, multiple: props.multiple, isSearchAutoFocus: props.isSearchAutoFocus, itemToSelectAll: normalizedItemToSelectAll, className: props.className, viewProps: props.viewProps, style: props.style, size: props.size, color: props.color, outline: props.outline, placeholder: props.placeholder, showReset: props.showReset, showEllipses: props.showEllipses, errors: props.errors, disabled: props.disabled }, dataProvider)); }, [isAutoComplete, items, hoveredId, selectedIds, searchInputProps, isOpened, isLoading, onOpen, selectedItems, onReset, onClose,
243
- renderItem, onItemRemove, hasGroup, props.multiple, props.isSearchAutoFocus, props.className, props.viewProps, props.style, props.size,
244
- props.color, props.outline, props.placeholder, props.showReset, props.showEllipses, props.errors, props.disabled,
245
- normalizedItemToSelectAll, dataProvider, inputRef, autoCompleteInputForwardedRef, forwardedRef]);
243
+ onReset: onReset, onClose: onClose, renderItem: renderItem, onItemRemove: onItemRemove, hasGroup: hasGroup, multiple: props.multiple, isSearchAutoFocus: props.isSearchAutoFocus, itemToSelectAll: normalizedItemToSelectAll, className: props.className, viewProps: props.viewProps, dropDownProps: dropDownProps, style: props.style, size: props.size, color: props.color, outline: props.outline, placeholder: props.placeholder, showReset: props.showReset, showEllipses: props.showEllipses, errors: props.errors, disabled: props.disabled, maxHeight: props.maxHeight }, dataProvider)); }, [isAutoComplete, items, hoveredId, selectedIds, searchInputProps,
244
+ isOpened, isLoading, onOpen, selectedItems, onReset, onClose, renderItem, dropDownProps,
245
+ onItemRemove, hasGroup, props.multiple, props.isSearchAutoFocus, props.className,
246
+ props.style, props.size, props.color, props.outline, props.placeholder, props.showReset,
247
+ props.showEllipses, props.errors, props.disabled, normalizedItemToSelectAll, props.viewProps, dataProvider, props.maxHeight]);
246
248
  return components.ui.renderView(props.view || 'form.DropDownFieldView', viewProps);
247
249
  }
248
250
  DropDownField.defaultProps = {
@@ -259,4 +261,4 @@ DropDownField.defaultProps = {
259
261
  itemToSelectAll: false,
260
262
  isFetchOnClose: false
261
263
  };
262
- exports["default"] = (0, fieldWrapper_1["default"])('DropDownField', DropDownField);
264
+ exports["default"] = (0, fieldWrapper_1["default"])(enums_1.FieldEnum.DROPDOWN_FIELD, DropDownField);
@@ -41,6 +41,7 @@ var react_1 = __importStar(require("react"));
41
41
  var hooks_1 = require("../../../hooks");
42
42
  var fieldWrapper_1 = __importDefault(require("../Field/fieldWrapper"));
43
43
  var useInputTypeEmail_1 = __importDefault(require("./hooks/useInputTypeEmail"));
44
+ var enums_1 = require("../../../enums");
44
45
  function EmailField(props) {
45
46
  var components = (0, hooks_1.useComponents)();
46
47
  var _a = (0, hooks_1.useSaveCursorPosition)({
@@ -89,4 +90,4 @@ EmailField.defaultProps = {
89
90
  showClear: false,
90
91
  maskOptions: null
91
92
  };
92
- exports["default"] = (0, fieldWrapper_1["default"])('EmailField', EmailField);
93
+ exports["default"] = (0, fieldWrapper_1["default"])(enums_1.FieldEnum.EMAIL_FIELD, EmailField);