@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.
- package/docs-autogen-result.json +398 -43
- package/en.json +24 -2
- package/hooks/index.d.ts +2 -1
- package/hooks/index.js +3 -1
- package/hooks/useAbsolutePositioning.d.ts +56 -7
- package/hooks/useAbsolutePositioning.js +39 -131
- package/hooks/useApplication.js +2 -0
- package/hooks/useDataSelect.js +3 -0
- package/hooks/useList.d.ts +10 -4
- package/hooks/useList.js +59 -14
- package/hooks/useSaveCursorPosition.d.ts +6 -0
- package/hooks/useSaveCursorPosition.js +29 -0
- package/package.json +1 -1
- package/ui/content/Chart/Chart.d.ts +37 -0
- package/ui/content/Chart/Chart.js +19 -0
- package/ui/content/Chart/index.d.ts +2 -0
- package/ui/content/Chart/index.js +7 -0
- package/ui/content/DropDown/DropDown.d.ts +1 -1
- package/ui/content/DropDown/DropDown.js +1 -1
- package/ui/content/index.d.ts +2 -1
- package/ui/content/index.js +3 -1
- package/ui/form/CheckboxListField/CheckboxListField.d.ts +1 -1
- package/ui/form/CheckboxListField/CheckboxListField.js +1 -1
- package/ui/form/DateField/useDateRange.d.ts +2 -1
- package/ui/form/DateField/useDateRange.js +23 -0
- package/ui/form/DateRangeField/DateRangeField.js +3 -1
- package/ui/form/DateTimeRangeField/DateTimeRangeField.js +3 -1
- package/ui/form/Field/fieldWrapper.d.ts +6 -5
- package/ui/form/InputField/InputField.d.ts +1 -2
- package/ui/form/InputField/InputField.js +9 -4
- package/ui/form/NumberField/NumberField.d.ts +6 -2
- package/ui/form/NumberField/NumberField.js +32 -4
- package/ui/form/NumberField/hooks/useInputTypeNumber.d.ts +10 -0
- package/ui/form/NumberField/hooks/useInputTypeNumber.js +45 -0
- package/ui/form/PasswordField/PasswordField.js +3 -2
- package/ui/form/RadioListField/RadioListField.js +1 -1
- package/ui/form/TextField/TextField.js +4 -3
- package/ui/layout/Sidebar/Sidebar.d.ts +0 -5
- package/ui/layout/Sidebar/Sidebar.js +1 -4
- package/ui/layout/Tooltip/Tooltip.d.ts +3 -7
- package/ui/layout/Tooltip/Tooltip.js +17 -49
- package/ui/list/Grid/Grid.js +2 -1
- package/ui/list/TreeTable/TreeTable.d.ts +35 -0
- package/ui/list/TreeTable/TreeTable.js +69 -0
- package/ui/list/TreeTable/index.d.ts +2 -0
- package/ui/list/TreeTable/index.js +7 -0
- package/ui/nav/Tree/Tree.js +4 -4
- package/utils/calculateComponentAbsolutePosition.d.ts +6 -0
- package/{ui/layout/Tooltip/calculate.js → utils/calculateComponentAbsolutePosition.js} +64 -58
- package/utils/calendar.js +2 -0
- package/utils/list.d.ts +1 -0
- package/utils/list.js +5 -0
- 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,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:
|
|
99
|
+
autoPositioning: true,
|
|
100
100
|
componentDestroyDelay: 300,
|
|
101
101
|
defaultVisible: false,
|
|
102
102
|
gap: 15,
|
package/ui/content/index.d.ts
CHANGED
|
@@ -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, };
|
package/ui/content/index.js
CHANGED
|
@@ -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
|
-
|
|
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
|
-
|
|
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,
|
|
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,
|
|
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?:
|
|
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
|
-
|
|
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
|
-
|
|
25
|
-
|
|
26
|
-
|
|
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:
|
|
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 = {
|
|
@@ -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
|
|
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,
|
|
38
|
-
}, [
|
|
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
|
-
|
|
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?:
|
|
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:
|
|
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,
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
}),
|
|
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
|
-
|
|
82
|
-
|
|
83
|
-
|
|
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 (
|
|
93
|
-
|
|
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:
|
|
108
|
-
onMouseOut:
|
|
75
|
+
onMouseOver: onShow,
|
|
76
|
+
onMouseOut: onHide
|
|
109
77
|
})
|
|
110
|
-
: (React.createElement("span", { ref: childRef, onFocus:
|
|
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:
|
|
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: '',
|