@steroidsjs/core 3.0.0-beta.81 → 3.0.0-beta.83

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 (53) hide show
  1. package/docs-autogen-result.json +398 -43
  2. package/en.json +24 -2
  3. package/hooks/index.d.ts +2 -1
  4. package/hooks/index.js +3 -1
  5. package/hooks/useAbsolutePositioning.d.ts +56 -7
  6. package/hooks/useAbsolutePositioning.js +39 -131
  7. package/hooks/useApplication.js +2 -0
  8. package/hooks/useDataSelect.js +3 -0
  9. package/hooks/useList.d.ts +10 -4
  10. package/hooks/useList.js +59 -14
  11. package/hooks/useSaveCursorPosition.d.ts +6 -0
  12. package/hooks/useSaveCursorPosition.js +29 -0
  13. package/package.json +1 -1
  14. package/ui/content/Chart/Chart.d.ts +37 -0
  15. package/ui/content/Chart/Chart.js +19 -0
  16. package/ui/content/Chart/index.d.ts +2 -0
  17. package/ui/content/Chart/index.js +7 -0
  18. package/ui/content/DropDown/DropDown.d.ts +1 -1
  19. package/ui/content/DropDown/DropDown.js +1 -1
  20. package/ui/content/index.d.ts +2 -1
  21. package/ui/content/index.js +3 -1
  22. package/ui/form/CheckboxListField/CheckboxListField.d.ts +1 -1
  23. package/ui/form/CheckboxListField/CheckboxListField.js +1 -1
  24. package/ui/form/DateField/useDateRange.d.ts +2 -1
  25. package/ui/form/DateField/useDateRange.js +23 -0
  26. package/ui/form/DateRangeField/DateRangeField.js +3 -1
  27. package/ui/form/DateTimeRangeField/DateTimeRangeField.js +3 -1
  28. package/ui/form/Field/fieldWrapper.d.ts +6 -5
  29. package/ui/form/InputField/InputField.d.ts +1 -2
  30. package/ui/form/InputField/InputField.js +9 -4
  31. package/ui/form/NumberField/NumberField.d.ts +6 -2
  32. package/ui/form/NumberField/NumberField.js +32 -4
  33. package/ui/form/NumberField/hooks/useInputTypeNumber.d.ts +10 -0
  34. package/ui/form/NumberField/hooks/useInputTypeNumber.js +45 -0
  35. package/ui/form/PasswordField/PasswordField.js +3 -2
  36. package/ui/form/RadioListField/RadioListField.js +1 -1
  37. package/ui/form/TextField/TextField.js +4 -3
  38. package/ui/layout/Sidebar/Sidebar.d.ts +0 -5
  39. package/ui/layout/Sidebar/Sidebar.js +1 -4
  40. package/ui/layout/Tooltip/Tooltip.d.ts +3 -7
  41. package/ui/layout/Tooltip/Tooltip.js +17 -49
  42. package/ui/list/Grid/Grid.js +2 -1
  43. package/ui/list/TreeTable/TreeTable.d.ts +35 -0
  44. package/ui/list/TreeTable/TreeTable.js +69 -0
  45. package/ui/list/TreeTable/index.d.ts +2 -0
  46. package/ui/list/TreeTable/index.js +7 -0
  47. package/ui/nav/Tree/Tree.js +4 -4
  48. package/utils/calculateComponentAbsolutePosition.d.ts +6 -0
  49. package/{ui/layout/Tooltip/calculate.js → utils/calculateComponentAbsolutePosition.js} +64 -58
  50. package/utils/calendar.js +2 -0
  51. package/utils/list.d.ts +1 -0
  52. package/utils/list.js +5 -0
  53. package/ui/layout/Tooltip/calculate.d.ts +0 -6
@@ -0,0 +1,37 @@
1
+ /// <reference types="react" />
2
+ /**
3
+ * Chart
4
+ * Этот компонент позволяет создавать в проекте графики разных типов. Под капотом для графиков используется библиотека nivo.
5
+ * Для работы этого компонента необходимо установить в проекте зависимости @nivo/core и пакет конкретного графика nivo, например @nivo/line.
6
+ * Компонент графика nivo нужно передать в пропс chartComponent
7
+ */
8
+ export interface IChartProps extends IUiComponent {
9
+ /**
10
+ * Компонент графика из библиотеки nivo
11
+ * @example ResponsiveLine
12
+ */
13
+ chartComponent: any;
14
+ /**
15
+ * Данные для графика
16
+ * @example [{id: 1, value: 15}, {id: 2, value: 30}]
17
+ */
18
+ data: Record<string, any>[];
19
+ /**
20
+ * Конфигурация, настройки отображения графика
21
+ * @example {lineWidth: 3, pointSize: 10}
22
+ */
23
+ config?: Record<string, any>;
24
+ /**
25
+ * Фиксированная высота графика в пикселях
26
+ * @example 500
27
+ */
28
+ height?: number;
29
+ /**
30
+ * Использовать ли дефолтную конфигурацию для графика типа line
31
+ * @example ResponsiveLine
32
+ */
33
+ useDefaultLineChartConfig?: boolean;
34
+ [key: string]: any;
35
+ }
36
+ export type IChartViewProps = IChartProps;
37
+ export default function Chart(props: IChartProps): JSX.Element;
@@ -0,0 +1,19 @@
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
+ var hooks_1 = require("../../../hooks");
15
+ function Chart(props) {
16
+ var components = (0, hooks_1.useComponents)();
17
+ return components.ui.renderView(props.view || 'content.ChartView', __assign({}, props));
18
+ }
19
+ exports["default"] = Chart;
@@ -0,0 +1,2 @@
1
+ import Chart from './Chart';
2
+ export default Chart;
@@ -0,0 +1,7 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ exports.__esModule = true;
6
+ var Chart_1 = __importDefault(require("./Chart"));
7
+ exports["default"] = Chart_1["default"];
@@ -16,7 +16,7 @@ export interface IDropDownProps extends IAbsolutePositioningInputProps {
16
16
  * В каком случае закрывать DropDown. По-умолчанию - `click-away`
17
17
  * @example click-any
18
18
  */
19
- closeMode?: 'click-away' | 'click-any';
19
+ closeMode?: 'click-away' | 'click-any' | string;
20
20
  /**
21
21
  * Позволяет управлять отображением указателя
22
22
  * @example true
@@ -96,7 +96,7 @@ function DropDown(props) {
96
96
  React.createElement(DropDownView, __assign({}, props, { className: props.className, forwardedRef: forwardedRef, content: props.content, position: position, style: style, calculatePosition: calculatePosition, isComponentVisible: isComponentVisible, onClose: onHide }))))));
97
97
  }
98
98
  DropDown.defaultProps = {
99
- autoPositioning: false,
99
+ autoPositioning: true,
100
100
  componentDestroyDelay: 300,
101
101
  defaultVisible: false,
102
102
  gap: 15,
@@ -8,5 +8,6 @@ import { Detail, DetailItem } from './Detail';
8
8
  import Icon from './Icon';
9
9
  import Menu from './Menu';
10
10
  import CopyToClipboard from './CopyToClipboard';
11
+ import Chart from './Chart';
11
12
  import Slider from './Slider';
12
- export { Avatar, AvatarGroup, Accordion, AccordionItem, Alert, Card, DropDown, Badge, Detail, DetailItem, Icon, Menu, CopyToClipboard, Slider, };
13
+ export { Avatar, AvatarGroup, Accordion, AccordionItem, Alert, Card, DropDown, Badge, Detail, DetailItem, Icon, Menu, CopyToClipboard, Chart, Slider, };
@@ -3,7 +3,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
4
  };
5
5
  exports.__esModule = true;
6
- exports.Slider = exports.CopyToClipboard = exports.Menu = exports.Icon = exports.DetailItem = exports.Detail = exports.Badge = exports.DropDown = exports.Card = exports.Alert = exports.AccordionItem = exports.Accordion = exports.AvatarGroup = exports.Avatar = void 0;
6
+ exports.Slider = exports.Chart = exports.CopyToClipboard = exports.Menu = exports.Icon = exports.DetailItem = exports.Detail = exports.Badge = exports.DropDown = exports.Card = exports.Alert = exports.AccordionItem = exports.Accordion = exports.AvatarGroup = exports.Avatar = void 0;
7
7
  var Avatar_1 = require("./Avatar");
8
8
  exports.Avatar = Avatar_1.Avatar;
9
9
  exports.AvatarGroup = Avatar_1.AvatarGroup;
@@ -27,5 +27,7 @@ var Menu_1 = __importDefault(require("./Menu"));
27
27
  exports.Menu = Menu_1["default"];
28
28
  var CopyToClipboard_1 = __importDefault(require("./CopyToClipboard"));
29
29
  exports.CopyToClipboard = CopyToClipboard_1["default"];
30
+ var Chart_1 = __importDefault(require("./Chart"));
31
+ exports.Chart = Chart_1["default"];
30
32
  var Slider_1 = __importDefault(require("./Slider"));
31
33
  exports.Slider = Slider_1["default"];
@@ -7,7 +7,6 @@ import { ICheckboxFieldViewProps } from '../CheckboxField/CheckboxField';
7
7
  * CheckboxListField
8
8
  *
9
9
  * Список с чекбоксами. Используется в формах для выбора нескольких значений.
10
- *
11
10
  */
12
11
  export interface ICheckboxListFieldProps extends IFieldWrapperInputProps, IDataProviderConfig, Omit<IDataSelectConfig, 'items'>, IUiComponent {
13
12
  /**
@@ -39,6 +38,7 @@ export interface ICheckboxListFieldViewProps extends IFieldWrapperOutputProps {
39
38
  orientation?: Orientation;
40
39
  disabled?: boolean;
41
40
  renderCheckbox: (checkboxProps: ICheckboxFieldViewProps) => JSX.Element;
41
+ size?: Size;
42
42
  }
43
43
  declare const _default: import("../../../ui/form/Field/fieldWrapper").FieldWrapperComponent<ICheckboxListFieldProps>;
44
44
  export default _default;
@@ -77,7 +77,7 @@ function CheckboxListField(props) {
77
77
  }
78
78
  }, [onReset, prevInputValue, props.input.value, selectedIds.length]);
79
79
  var CheckboxFieldView = components.ui.getView('form.CheckboxFieldView');
80
- var renderCheckbox = function (checkboxProps) { return React.createElement(CheckboxFieldView, __assign({}, checkboxProps)); };
80
+ var renderCheckbox = function (checkboxProps) { return (React.createElement(CheckboxFieldView, __assign({}, checkboxProps))); };
81
81
  return components.ui.renderView(props.view || 'form.CheckboxListFieldView', __assign(__assign({}, props), { items: items, inputProps: inputProps, onItemSelect: onItemSelect, selectedIds: selectedIds, renderCheckbox: renderCheckbox }));
82
82
  }
83
83
  CheckboxListField.defaultProps = {
@@ -1,4 +1,5 @@
1
- interface IUseDateRangeProps {
1
+ import { IDateInputStateInput } from '@steroidsjs/core/ui/form/DateField/useDateInputState';
2
+ interface IUseDateRangeProps extends Pick<IDateInputStateInput, 'displayFormat' | 'valueFormat' | 'useUTC' | 'dateInUTC'> {
2
3
  onCloseFrom: any;
3
4
  onCloseTo: any;
4
5
  onClearFrom: any;
@@ -10,9 +10,14 @@ var __assign = (this && this.__assign) || function () {
10
10
  };
11
11
  return __assign.apply(this, arguments);
12
12
  };
13
+ var __importDefault = (this && this.__importDefault) || function (mod) {
14
+ return (mod && mod.__esModule) ? mod : { "default": mod };
15
+ };
13
16
  exports.__esModule = true;
14
17
  var react_1 = require("react");
15
18
  var react_use_1 = require("react-use");
19
+ var dayjs_1 = __importDefault(require("dayjs"));
20
+ var calendar_1 = require("@steroidsjs/core/utils/calendar");
16
21
  function useDateRange(props) {
17
22
  // Tracking focus for input being edited
18
23
  var _a = (0, react_1.useState)('from'), focus = _a[0], setFocus = _a[1];
@@ -64,6 +69,24 @@ function useDateRange(props) {
64
69
  }
65
70
  // eslint-disable-next-line max-len
66
71
  }, [focus, onClose, prevValueFrom, prevValueTo, props, props.inputFrom.onChange, props.inputFrom.value, props.inputTo.onChange, props.inputTo.value]);
72
+ // Swap start and end dates if start date is later than end date
73
+ (0, react_1.useEffect)(function () {
74
+ if (props.inputFrom.value
75
+ && props.inputTo.value
76
+ && ((0, dayjs_1["default"])(props.inputTo.value).isBefore((0, dayjs_1["default"])(props.inputFrom.value)))) {
77
+ var convertedDateFrom = (0, calendar_1.convertDate)(props.inputFrom.value, props.valueFormat, props.valueFormat, props.useUTC, props.dateInUTC);
78
+ var convertedDateTo = (0, calendar_1.convertDate)(props.inputTo.value, props.valueFormat, props.valueFormat, props.useUTC, props.dateInUTC);
79
+ props.inputFrom.onChange.call(null, convertedDateTo);
80
+ props.inputTo.onChange.call(null, convertedDateFrom);
81
+ }
82
+ }, [props.dateInUTC,
83
+ props.inputFrom.onChange,
84
+ props.inputFrom.value,
85
+ props.inputTo.onChange,
86
+ props.inputTo.value,
87
+ props.useUTC,
88
+ props.valueFormat,
89
+ ]);
67
90
  return {
68
91
  focus: focus,
69
92
  onClose: onClose,
@@ -62,7 +62,9 @@ function DateRangeField(props) {
62
62
  inputPropsTo: inputPropsTo,
63
63
  inputFrom: props.inputFrom,
64
64
  inputTo: props.inputTo,
65
- useSmartFocus: true
65
+ useSmartFocus: true,
66
+ displayFormat: props.displayFormat,
67
+ valueFormat: props.valueFormat
66
68
  }), focus = _c.focus, onClose = _c.onClose, onClear = _c.onClear, extendedInputPropsFrom = _c.extendedInputPropsFrom, extendedInputPropsTo = _c.extendedInputPropsTo;
67
69
  // Calendar props
68
70
  var calendarProps = (0, react_1.useMemo)(function () { return ({
@@ -76,7 +76,9 @@ function DateTimeRangeField(props) {
76
76
  inputPropsTo: inputPropsTo,
77
77
  inputFrom: props.inputFrom,
78
78
  inputTo: props.inputTo,
79
- useSmartFocus: false
79
+ useSmartFocus: false,
80
+ displayFormat: props.displayFormat,
81
+ valueFormat: props.valueFormat
80
82
  }), focus = _e.focus, onClose = _e.onClose, onClear = _e.onClear, extendedInputPropsFrom = _e.extendedInputPropsFrom, extendedInputPropsTo = _e.extendedInputPropsTo;
81
83
  // Calendar props
82
84
  var calendarProps = (0, react_1.useMemo)(function () { return (__assign({ value: [dateValueFrom, dateValueTo], onChange: focus === 'from' ? onDateFromSelect : onDateToSelect, valueFormat: dateValueFormat }, props.calendarProps)); }, [dateValueFormat, dateValueFrom, dateValueTo, focus, onDateFromSelect, onDateToSelect, props.calendarProps]);
@@ -72,6 +72,11 @@ export interface IFieldWrapperInputProps {
72
72
  isRenderWithoutFieldLayout?: boolean;
73
73
  [key: string]: any;
74
74
  }
75
+ export interface IInputParams {
76
+ name?: string;
77
+ value?: any;
78
+ onChange: (value: any) => void;
79
+ }
75
80
  export interface IFieldWrapperOutputProps {
76
81
  /**
77
82
  * Id формы
@@ -88,11 +93,7 @@ export interface IFieldWrapperOutputProps {
88
93
  /**
89
94
  * Параметры для input элемента
90
95
  */
91
- input?: {
92
- name?: string;
93
- value?: any;
94
- onChange: (value: any) => void;
95
- };
96
+ input?: IInputParams;
96
97
  }
97
98
  interface IFieldWrapperOptions {
98
99
  label?: boolean;
@@ -85,7 +85,7 @@ export interface IInputFieldViewProps extends IInputFieldProps, IFieldWrapperOut
85
85
  inputProps: {
86
86
  type: string;
87
87
  name: string;
88
- onChange: (value: any) => void;
88
+ onInput: (event: any, value?: string) => void;
89
89
  value: string | number;
90
90
  placeholder: string;
91
91
  disabled: boolean;
@@ -94,7 +94,6 @@ export interface IInputFieldViewProps extends IInputFieldProps, IFieldWrapperOut
94
94
  onFocus?: (e: Event | React.FocusEvent) => void;
95
95
  onBlur?: (e: Event | React.FocusEvent) => void;
96
96
  onMouseDown?: (e: Event | React.MouseEvent) => void;
97
- maskedInputRef?: React.RefCallback<HTMLElement>;
98
97
  defaultValue?: string;
99
98
  }
100
99
  declare const _default: import("../Field/fieldWrapper").FieldWrapperComponent<IInputFieldProps>;
@@ -87,17 +87,22 @@ function InputField(props) {
87
87
  var maskedInputRef = (0, react_2.useMaskito)({
88
88
  options: props.maskOptions
89
89
  });
90
+ var _a = (0, hooks_1.useSaveCursorPosition)(props.input), inputRef = _a.inputRef, onChange = _a.onChange;
91
+ React.useEffect(function () {
92
+ if (inputRef.current) {
93
+ maskedInputRef(inputRef.current);
94
+ }
95
+ }, [inputRef, maskedInputRef]);
90
96
  var onClear = React.useCallback(function () { return props.input.onChange(''); }, [props.input]);
91
- props.onClear = onClear;
92
97
  var inputProps = (0, react_1.useMemo)(function () {
93
98
  var _a;
94
- return (__assign({ type: props.type, name: props.input.name, defaultValue: (_a = props.input.value) !== null && _a !== void 0 ? _a : '', onChange: function (value) { return props.input.onChange(value); }, placeholder: props.placeholder, disabled: props.disabled }, props.inputProps));
95
- }, [props.disabled, props.input, props.inputProps, props.placeholder, props.type]);
99
+ return (__assign({ type: props.type, name: props.input.name, value: (_a = props.input.value) !== null && _a !== void 0 ? _a : '', onInput: onChange, placeholder: props.placeholder, disabled: props.disabled }, props.inputProps));
100
+ }, [onChange, props.disabled, props.input.name, props.input.value, props.inputProps, props.placeholder, props.type]);
96
101
  // No render for hidden input
97
102
  if (props.type === 'hidden') {
98
103
  return null;
99
104
  }
100
- return components.ui.renderView(props.view || 'form.InputFieldView', __assign(__assign(__assign({}, props), props.viewProps), { inputProps: inputProps, maskedInputRef: maskedInputRef }));
105
+ return components.ui.renderView(props.view || 'form.InputFieldView', __assign(__assign(__assign({}, props), props.viewProps), { inputProps: inputProps, inputRef: inputRef, onClear: onClear }));
101
106
  }
102
107
  InputField.defaultProps = {
103
108
  type: 'text',
@@ -1,4 +1,4 @@
1
- import { ChangeEvent } from 'react';
1
+ import React, { ChangeEvent } from 'react';
2
2
  import { IBaseFieldProps } from '../InputField/InputField';
3
3
  import { IFieldWrapperOutputProps } from '../Field/fieldWrapper';
4
4
  /**
@@ -21,7 +21,7 @@ export interface INumberFieldProps extends IBaseFieldProps {
21
21
  * Шаг увеличения/уменьшения значения
22
22
  * @example 5
23
23
  */
24
- step?: string | number;
24
+ step?: number;
25
25
  }
26
26
  export interface INumberFieldViewProps extends INumberFieldProps, IFieldWrapperOutputProps {
27
27
  inputProps: {
@@ -35,6 +35,10 @@ export interface INumberFieldViewProps extends INumberFieldProps, IFieldWrapperO
35
35
  max: number;
36
36
  step: string | number;
37
37
  };
38
+ inputRef: React.MutableRefObject<any>;
39
+ onStepUp: VoidFunction;
40
+ onStepDown: VoidFunction;
41
+ onKeyDown: VoidFunction;
38
42
  }
39
43
  declare const _default: import("../Field/fieldWrapper").FieldWrapperComponent<INumberFieldProps>;
40
44
  export default _default;
@@ -14,16 +14,44 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
14
14
  return (mod && mod.__esModule) ? mod : { "default": mod };
15
15
  };
16
16
  exports.__esModule = true;
17
+ /* eslint-disable max-len */
17
18
  var react_1 = require("react");
18
19
  var hooks_1 = require("../../../hooks");
19
20
  var fieldWrapper_1 = __importDefault(require("../Field/fieldWrapper"));
21
+ var useInputTypeNumber_1 = __importDefault(require("./hooks/useInputTypeNumber"));
22
+ var DEFAULT_STEP = 1;
20
23
  function NumberField(props) {
21
24
  var components = (0, hooks_1.useComponents)();
22
- props.inputProps = (0, react_1.useMemo)(function () {
25
+ var _a = (0, hooks_1.useSaveCursorPosition)(props.input), currentInputRef = _a.inputRef, onChange = _a.onChange;
26
+ var onInputChange = (0, useInputTypeNumber_1["default"])(currentInputRef, {
27
+ max: props.max,
28
+ min: props.min,
29
+ value: props.input.value
30
+ }, onChange).onInputChange;
31
+ var onStep = (0, react_1.useCallback)(function (isIncrement) {
23
32
  var _a;
24
- return (__assign({ name: props.input.name, defaultValue: (_a = props.input.value) !== null && _a !== void 0 ? _a : '', onChange: function (value) { return props.input.onChange(value); }, type: 'number', min: props.min, max: props.max, step: props.step, placeholder: props.placeholder, disabled: props.disabled }, props.inputProps));
25
- }, [props.disabled, props.input, props.inputProps, props.placeholder, props.min, props.max, props.step]);
26
- return components.ui.renderView(props.view || 'form.NumberFieldView', props);
33
+ var step = props.step || DEFAULT_STEP;
34
+ onChange(null, String(Number((_a = currentInputRef === null || currentInputRef === void 0 ? void 0 : currentInputRef.current) === null || _a === void 0 ? void 0 : _a.value) + (isIncrement ? step : -step)));
35
+ }, [currentInputRef, onChange, props.step]);
36
+ var onStepUp = (0, react_1.useCallback)(function () {
37
+ onStep(true);
38
+ }, [onStep]);
39
+ var onStepDown = (0, react_1.useCallback)(function () {
40
+ onStep(false);
41
+ }, [onStep]);
42
+ var onKeyDown = (0, react_1.useCallback)(function (event) {
43
+ if (event.key === 'ArrowUp') {
44
+ onStepUp();
45
+ }
46
+ else if (event.key === 'ArrowDown') {
47
+ onStepDown();
48
+ }
49
+ }, [onStepDown, onStepUp]);
50
+ var inputProps = (0, react_1.useMemo)(function () {
51
+ var _a;
52
+ return (__assign({ name: props.input.name, value: (_a = props.input.value) !== null && _a !== void 0 ? _a : '', onChange: onInputChange, type: 'text', min: props.min, max: props.max, step: props.step, placeholder: props.placeholder, disabled: props.disabled, autoComplete: 'off', onKeyDown: onKeyDown }, props.inputProps));
53
+ }, [props.input.name, props.input.value, props.min, props.max, props.step, props.placeholder, props.disabled, props.inputProps, onInputChange, onKeyDown]);
54
+ return components.ui.renderView(props.view || 'form.NumberFieldView', __assign(__assign({}, props), { inputProps: inputProps, onStepUp: onStepUp, onStepDown: onStepDown, inputRef: currentInputRef }));
27
55
  }
28
56
  NumberField.defaultProps = {
29
57
  disabled: false,
@@ -0,0 +1,10 @@
1
+ import React from 'react';
2
+ interface IInputTypeNumberProps {
3
+ max: any;
4
+ min: any;
5
+ value: any;
6
+ }
7
+ declare const useInputTypeNumber: (currentInputRef: React.MutableRefObject<HTMLInputElement>, inputTypeNumberProps: IInputTypeNumberProps, onChange: (event: React.ChangeEvent<HTMLInputElement>, value?: any) => void) => {
8
+ onInputChange: (event: React.ChangeEvent<HTMLInputElement>) => void;
9
+ };
10
+ export default useInputTypeNumber;
@@ -0,0 +1,45 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ exports.__esModule = true;
6
+ var react_1 = __importDefault(require("react"));
7
+ var useInputTypeNumber = function (currentInputRef, inputTypeNumberProps, onChange) {
8
+ var setValidity = react_1["default"].useCallback(function (message) {
9
+ var _a;
10
+ (_a = currentInputRef.current) === null || _a === void 0 ? void 0 : _a.setCustomValidity(message);
11
+ }, [currentInputRef]);
12
+ var checkIsValueFalsy = function (value) { return value === '' || value === null || value === undefined; };
13
+ react_1["default"].useEffect(function () {
14
+ var defaultValidity = 'The number is not included in the range';
15
+ // eslint-disable-next-line no-unused-expressions
16
+ inputTypeNumberProps.value > inputTypeNumberProps.max
17
+ || inputTypeNumberProps.value < inputTypeNumberProps.min
18
+ || checkIsValueFalsy(inputTypeNumberProps.value)
19
+ ? setValidity(__(defaultValidity) + " ".concat(inputTypeNumberProps.min, " \u2014 ").concat(inputTypeNumberProps.max))
20
+ : setValidity('');
21
+ }, [currentInputRef, inputTypeNumberProps.value, inputTypeNumberProps.max, inputTypeNumberProps.min, setValidity]);
22
+ var isValueNumeric = function (value) {
23
+ if (checkIsValueFalsy(value)) {
24
+ return true;
25
+ }
26
+ /**
27
+ * Подходят как отрицательные так и положительные числа
28
+ * @example -1
29
+ * @example 1
30
+ */
31
+ var numericRegex = /^-?\d*\.?\d+$/;
32
+ return numericRegex.test(value);
33
+ };
34
+ var onInputChange = function (event) {
35
+ var _a;
36
+ var value = (_a = event === null || event === void 0 ? void 0 : event.target) === null || _a === void 0 ? void 0 : _a.value;
37
+ if (isValueNumeric(value)) {
38
+ onChange(event);
39
+ }
40
+ };
41
+ return {
42
+ onInputChange: onInputChange
43
+ };
44
+ };
45
+ exports["default"] = useInputTypeNumber;
@@ -55,14 +55,15 @@ exports.checkPassword = checkPassword;
55
55
  function PasswordField(props) {
56
56
  var _a = (0, react_1.useState)(InputType.PASSWORD), type = _a[0], setType = _a[1];
57
57
  var components = (0, hooks_1.useComponents)();
58
+ var _b = (0, hooks_1.useSaveCursorPosition)(props.input), inputRef = _b.inputRef, onChange = _b.onChange;
58
59
  var onClear = (0, react_1.useCallback)(function () { return props.input.onChange(''); }, [props.input]);
59
60
  var onShowButtonClick = (0, react_1.useCallback)(function () {
60
61
  type === InputType.PASSWORD ? setType(InputType.TEXT) : setType(InputType.PASSWORD);
61
62
  }, [type]);
62
63
  var inputProps = (0, react_1.useMemo)(function () {
63
64
  var _a;
64
- return (__assign({ name: props.input.name, defaultValue: (_a = props.input.value) !== null && _a !== void 0 ? _a : '', onChange: function (value) { return props.input.onChange(value); }, type: type, placeholder: props.placeholder, disabled: props.disabled }, props.inputProps));
65
- }, [props.disabled, props.input, props.inputProps, props.placeholder, type]);
65
+ return (__assign({ name: props.input.name, defaultValue: (_a = props.input.value) !== null && _a !== void 0 ? _a : '', onChange: onChange, type: type, placeholder: props.placeholder, disabled: props.disabled, ref: inputRef }, props.inputProps));
66
+ }, [inputRef, onChange, props.disabled, props.input.name, props.input.value, props.inputProps, props.placeholder, type]);
66
67
  return components.ui.renderView(props.view || 'form.PasswordFieldView' || 'form.InputFieldView', __assign(__assign({}, props), { inputProps: inputProps, securityLevel: props.showSecurityBar ? (0, exports.checkPassword)(props.input.value) : null, onClear: onClear, onShowButtonClick: onShowButtonClick }));
67
68
  }
68
69
  PasswordField.defaultProps = {
@@ -82,7 +82,7 @@ RadioListField.defaultProps = {
82
82
  disabled: false,
83
83
  required: false,
84
84
  className: '',
85
- multiple: false,
85
+ multiple: true,
86
86
  errors: null,
87
87
  size: 'md',
88
88
  orientation: 'vertical'
@@ -20,6 +20,7 @@ var fieldWrapper_1 = __importDefault(require("../Field/fieldWrapper"));
20
20
  function TextField(props) {
21
21
  // const dispatch = useDispatch();
22
22
  var components = (0, hooks_1.useComponents)();
23
+ var _a = (0, hooks_1.useSaveCursorPosition)(props.input), inputRef = _a.inputRef, onChange = _a.onChange;
23
24
  var onKeyUp = (0, react_1.useCallback)(function (e) {
24
25
  if (props.submitOnEnter
25
26
  && props.formId
@@ -30,12 +31,12 @@ function TextField(props) {
30
31
  // dispatch(submit(props.formId));
31
32
  }
32
33
  }, [props.formId, props.submitOnEnter]);
33
- var onChange = (0, react_1.useCallback)(function (e) { return props.input.onChange.call(null, e.target ? e.target.value : e.nativeEvent.text); }, [props.input.onChange]);
34
+ var handleChange = (0, react_1.useCallback)(function (event) { return onChange(event, event.target ? event.target.value : event.nativeEvent.text); }, [onChange]);
34
35
  var onClear = (0, react_1.useCallback)(function () { return props.input.onChange(''); }, [props.input]);
35
36
  var inputProps = (0, react_1.useMemo)(function () {
36
37
  var _a;
37
- return (__assign({ name: props.input.name, defaultValue: (_a = props.input.value) !== null && _a !== void 0 ? _a : '', onChange: onChange, onKeyUp: onKeyUp, placeholder: props.placeholder, disabled: props.disabled }, props.inputProps));
38
- }, [onKeyUp, onChange, props.disabled, props.input.name, props.input.value, props.inputProps, props.placeholder]);
38
+ return (__assign({ name: props.input.name, value: (_a = props.input.value) !== null && _a !== void 0 ? _a : '', onChange: handleChange, onKeyUp: onKeyUp, placeholder: props.placeholder, disabled: props.disabled, ref: inputRef }, props.inputProps));
39
+ }, [props.input.name, props.input.value, props.placeholder, props.disabled, props.inputProps, handleChange, onKeyUp, inputRef]);
39
40
  return components.ui.renderView(props.view || 'form.TextFieldView', __assign(__assign({}, props), { inputProps: inputProps, onClear: onClear }));
40
41
  }
41
42
  TextField.defaultProps = {
@@ -60,11 +60,6 @@ export interface ISidebarProps extends IUiComponent {
60
60
  * Флаг, определяющий, будет ли сайдбар открытым по умолчанию.
61
61
  */
62
62
  isOpenedByDefault?: boolean;
63
- /**
64
- * Callback-функция, вызывается при переключении сайдбара.
65
- * @param toggleState - текущее состояние сайдбара (открыт или закрыт).
66
- */
67
- onToggleSidebar?: (toggleState: boolean) => void;
68
63
  /**
69
64
  * Callback-функция, вызывается при клике на элемент навигации.
70
65
  * @param itemId - идентификатор элемента навигации, по которому произошел клик.
@@ -42,10 +42,7 @@ function Sidebar(props) {
42
42
  var toggleSidebar = (0, react_1.useCallback)(function () {
43
43
  var newState = !isOpened;
44
44
  setIsOpened(newState);
45
- if (props === null || props === void 0 ? void 0 : props.onToggleSidebar) {
46
- props.onToggleSidebar(newState);
47
- }
48
- }, [isOpened, props]);
45
+ }, [isOpened]);
49
46
  var onClickNav = react_1["default"].useCallback(function (itemId) {
50
47
  if (props === null || props === void 0 ? void 0 : props.onClickItem) {
51
48
  props.onClickItem(itemId);
@@ -1,9 +1,5 @@
1
1
  /// <reference types="react" />
2
- /**
3
- * Варианты позиций всплывающей подсказки
4
- * @example 'top'
5
- */
6
- type TooltipPosition = 'top' | 'topLeft' | 'topRight' | 'bottom' | 'bottomLeft' | 'bottomRight' | 'left' | 'leftTop' | 'leftBottom' | 'right' | 'rightTop' | 'rightBottom' | string;
2
+ import { PositionType } from '../../../hooks/useAbsolutePositioning';
7
3
  export interface ITooltipArrowPosition {
8
4
  /**
9
5
  * Позиция стрелки слева
@@ -54,7 +50,7 @@ export interface ITooltipProps {
54
50
  /**
55
51
  * Позиционирование подсказки, относительно целевого элемента
56
52
  */
57
- position?: TooltipPosition;
53
+ position?: PositionType;
58
54
  /**
59
55
  * Показывать ли подсказку сразу после рендера страницы
60
56
  * @example true
@@ -88,7 +84,7 @@ export interface ITooltipProps {
88
84
  export interface ITooltipViewProps extends ITooltipProps {
89
85
  isTooltipVisible: boolean;
90
86
  content: string | any;
91
- position: TooltipPosition;
87
+ position: PositionType;
92
88
  style: ITooltipStylePosition;
93
89
  }
94
90
  declare function Tooltip(props: ITooltipProps): JSX.Element;
@@ -29,8 +29,8 @@ exports.__esModule = true;
29
29
  var React = __importStar(require("react"));
30
30
  var react_1 = require("react");
31
31
  var react_use_1 = require("react-use");
32
- var calculate_1 = __importDefault(require("../Tooltip/calculate"));
33
32
  var hooks_1 = require("../../../hooks");
33
+ var useAbsolutePositioning_1 = __importDefault(require("../../../hooks/useAbsolutePositioning"));
34
34
  var TooltipPortalInner_1 = __importDefault(require("./TooltipPortalInner"));
35
35
  /*
36
36
  * @Todo + check all calculations + describe
@@ -44,53 +44,21 @@ var TooltipPortalInner_1 = __importDefault(require("./TooltipPortalInner"));
44
44
  * */
45
45
  function Tooltip(props) {
46
46
  var components = (0, hooks_1.useComponents)();
47
- var _a = (0, react_1.useState)(false), isComponentExist = _a[0], setIsComponentExist = _a[1];
48
- var _b = (0, react_1.useState)(props.defaultVisible), isTooltipVisible = _b[0], setIsTooltipVisible = _b[1];
49
- var _c = (0, react_1.useState)({
50
- left: null,
51
- right: null,
52
- top: null
53
- }), style = _c[0], setStyle = _c[1];
54
- var _d = (0, react_1.useState)({
55
- left: null,
56
- right: null,
57
- top: null,
58
- bottom: null
59
- }), arrowPosition = _d[0], setArrowPosition = _d[1];
60
- var timerRef = (0, react_1.useRef)(null);
61
- var positionRef = (0, react_1.useRef)(props.position);
47
+ var _a = (0, useAbsolutePositioning_1["default"])({
48
+ componentDestroyDelay: props.animationMs,
49
+ position: props.position,
50
+ children: props.children,
51
+ gap: props.gap,
52
+ defaultVisible: props.defaultVisible
53
+ }), isComponentExist = _a.isComponentExist, isComponentVisible = _a.isComponentVisible, calculateAbsolutePosition = _a.calculateAbsolutePosition, onShow = _a.onShow, onHide = _a.onHide, position = _a.position, arrowPosition = _a.arrowPosition, style = _a.style;
62
54
  var childRef = (0, react_1.useRef)(null);
63
- var onShowTooltip = (0, react_1.useCallback)(function () {
64
- if (timerRef.current) {
65
- clearTimeout(timerRef.current);
66
- }
67
- setIsComponentExist(true);
68
- setIsTooltipVisible(false);
69
- // TODO: How to wait setState callback?
70
- setTimeout(function () { return setIsTooltipVisible(true); });
71
- }, []);
72
- var onHideTooltip = (0, react_1.useCallback)(function () {
73
- setIsTooltipVisible(false);
74
- if (timerRef.current) {
75
- clearTimeout(timerRef.current);
76
- }
77
- timerRef.current = setTimeout(function () { return setIsComponentExist(false); }, props.animationMs);
78
- }, [props.animationMs]);
79
- // Основная функция расчета позиции
80
55
  var calculatePosition = (0, react_1.useCallback)(function (tooltipSize, arrowSize) {
81
- var result = (0, calculate_1["default"])(props.gap, positionRef.current, childRef.current, tooltipSize, arrowSize);
82
- if (!result) {
83
- return;
84
- }
85
- positionRef.current = result.position;
86
- setStyle(result.style);
87
- if (result.arrowPosition) {
88
- setArrowPosition(result.arrowPosition);
89
- }
90
- }, [props.gap]);
56
+ calculateAbsolutePosition(position, childRef.current, tooltipSize, arrowSize);
57
+ // eslint-disable-next-line react-hooks/exhaustive-deps
58
+ }, []);
91
59
  (0, react_use_1.useMount)(function () {
92
- if (isTooltipVisible) {
93
- onShowTooltip();
60
+ if (isComponentVisible) {
61
+ onShow();
94
62
  }
95
63
  });
96
64
  if (!props.content) {
@@ -104,12 +72,12 @@ function Tooltip(props) {
104
72
  childrenElement
105
73
  ? React.cloneElement(childrenElement, {
106
74
  ref: childRef,
107
- onMouseOver: onShowTooltip,
108
- onMouseOut: onHideTooltip
75
+ onMouseOver: onShow,
76
+ onMouseOut: onHide
109
77
  })
110
- : (React.createElement("span", { ref: childRef, onFocus: onShowTooltip, onMouseOver: onShowTooltip, onBlur: onHideTooltip, onMouseOut: onHideTooltip }, props.children)),
78
+ : (React.createElement("span", { ref: childRef, onFocus: onShow, onMouseOver: onShow, onBlur: onHide, onMouseOut: onHide }, props.children)),
111
79
  isComponentExist && (React.createElement(TooltipPortalInner_1["default"], null,
112
- React.createElement(TooltipView, { isTooltipVisible: isTooltipVisible, content: props.content, position: positionRef.current, style: style, arrowPosition: arrowPosition, calculatePosition: calculatePosition })))));
80
+ React.createElement(TooltipView, { isTooltipVisible: isComponentVisible, content: props.content, position: position, style: style, arrowPosition: arrowPosition, calculatePosition: calculatePosition })))));
113
81
  }
114
82
  Tooltip.defaultProps = {
115
83
  content: '',