@gravity-ui/dynamic-forms 5.13.1 → 5.14.0
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/build/cjs/lib/kit/components/Inputs/RangeInputPicker/RangeInputPicker.css +42 -0
- package/build/cjs/lib/kit/components/Inputs/RangeInputPicker/RangeInputPicker.js +64 -0
- package/build/cjs/lib/kit/components/Inputs/RangeInputPicker/RangeInputPickerNumber.js +43 -0
- package/build/cjs/lib/kit/components/Inputs/RangeInputPicker/index.js +6 -0
- package/build/cjs/lib/kit/components/Inputs/RangeInputPicker/types.js +2 -0
- package/build/cjs/lib/kit/components/Inputs/index.js +1 -0
- package/build/cjs/lib/kit/components/Views/RangeInputPickerView/RangeInputPickerNumberView.js +14 -0
- package/build/cjs/lib/kit/components/Views/RangeInputPickerView/RangeInputPickerView.js +28 -0
- package/build/cjs/lib/kit/components/Views/RangeInputPickerView/index.js +5 -0
- package/build/cjs/lib/kit/components/Views/index.js +1 -0
- package/build/cjs/lib/kit/constants/common.js +8 -1
- package/build/cjs/lib/kit/constants/config.js +4 -0
- package/build/cjs/lib/kit/utils/common.js +23 -7
- package/build/esm/lib/kit/components/Inputs/RangeInputPicker/RangeInputPicker.css +42 -0
- package/build/esm/lib/kit/components/Inputs/RangeInputPicker/RangeInputPicker.d.ts +5 -0
- package/build/esm/lib/kit/components/Inputs/RangeInputPicker/RangeInputPicker.js +60 -0
- package/build/esm/lib/kit/components/Inputs/RangeInputPicker/RangeInputPickerNumber.d.ts +5 -0
- package/build/esm/lib/kit/components/Inputs/RangeInputPicker/RangeInputPickerNumber.js +39 -0
- package/build/esm/lib/kit/components/Inputs/RangeInputPicker/index.d.ts +3 -0
- package/build/esm/lib/kit/components/Inputs/RangeInputPicker/index.js +3 -0
- package/build/esm/lib/kit/components/Inputs/RangeInputPicker/types.d.ts +15 -0
- package/build/esm/lib/kit/components/Inputs/RangeInputPicker/types.js +1 -0
- package/build/esm/lib/kit/components/Inputs/index.d.ts +1 -0
- package/build/esm/lib/kit/components/Inputs/index.js +1 -0
- package/build/esm/lib/kit/components/Views/RangeInputPickerView/RangeInputPickerNumberView.d.ts +2 -0
- package/build/esm/lib/kit/components/Views/RangeInputPickerView/RangeInputPickerNumberView.js +9 -0
- package/build/esm/lib/kit/components/Views/RangeInputPickerView/RangeInputPickerView.d.ts +2 -0
- package/build/esm/lib/kit/components/Views/RangeInputPickerView/RangeInputPickerView.js +23 -0
- package/build/esm/lib/kit/components/Views/RangeInputPickerView/index.d.ts +2 -0
- package/build/esm/lib/kit/components/Views/RangeInputPickerView/index.js +2 -0
- package/build/esm/lib/kit/components/Views/index.d.ts +1 -0
- package/build/esm/lib/kit/components/Views/index.js +1 -0
- package/build/esm/lib/kit/constants/common.d.ts +7 -0
- package/build/esm/lib/kit/constants/common.js +7 -0
- package/build/esm/lib/kit/constants/config.js +5 -1
- package/build/esm/lib/kit/utils/common.d.ts +2 -0
- package/build/esm/lib/kit/utils/common.js +20 -6
- package/package.json +1 -1
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/*
|
|
2
|
+
@mixin variables {
|
|
3
|
+
--g-spacing-base: 4px;
|
|
4
|
+
|
|
5
|
+
--g-spacing-0: calc(var(--g-spacing-base) * 0); //0px
|
|
6
|
+
--g-spacing-half: calc(var(--g-spacing-base) * 0.5); //2px
|
|
7
|
+
--g-spacing-1: var(--g-spacing-base); // 4px
|
|
8
|
+
--g-spacing-2: calc(var(--g-spacing-base) * 2); // 8px
|
|
9
|
+
--g-spacing-3: calc(var(--g-spacing-base) * 3); // 12px
|
|
10
|
+
--g-spacing-4: calc(var(--g-spacing-base) * 4); // 16px
|
|
11
|
+
--g-spacing-5: calc(var(--g-spacing-base) * 5); // 20px
|
|
12
|
+
--g-spacing-6: calc(var(--g-spacing-base) * 6); // 24px
|
|
13
|
+
--g-spacing-7: calc(var(--g-spacing-base) * 7); // 28px
|
|
14
|
+
--g-spacing-8: calc(var(--g-spacing-base) * 8); // 32px
|
|
15
|
+
--g-spacing-9: calc(var(--g-spacing-base) * 9); // 36px
|
|
16
|
+
--g-spacing-10: calc(var(--g-spacing-base) * 10); // 40px
|
|
17
|
+
}
|
|
18
|
+
*/
|
|
19
|
+
/* Border-radius */
|
|
20
|
+
.df-range-input-picker {
|
|
21
|
+
display: flex;
|
|
22
|
+
flex-direction: column;
|
|
23
|
+
gap: var(--g-spacing-3);
|
|
24
|
+
width: 100%;
|
|
25
|
+
}
|
|
26
|
+
.df-range-input-picker__slider {
|
|
27
|
+
padding: 0 var(--g-spacing-2);
|
|
28
|
+
}
|
|
29
|
+
.df-range-input-picker__inputs {
|
|
30
|
+
display: flex;
|
|
31
|
+
flex-direction: row;
|
|
32
|
+
align-items: center;
|
|
33
|
+
gap: var(--g-spacing-2);
|
|
34
|
+
}
|
|
35
|
+
.df-range-input-picker__input {
|
|
36
|
+
flex: 1 1 0;
|
|
37
|
+
min-width: 0;
|
|
38
|
+
}
|
|
39
|
+
.df-range-input-picker__separator {
|
|
40
|
+
flex: 0 0 auto;
|
|
41
|
+
color: var(--g-color-text-secondary);
|
|
42
|
+
}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.RangeInputPicker = void 0;
|
|
4
|
+
const tslib_1 = require("tslib");
|
|
5
|
+
const react_1 = tslib_1.__importDefault(require("react"));
|
|
6
|
+
const uikit_1 = require("@gravity-ui/uikit");
|
|
7
|
+
const isNil_1 = tslib_1.__importDefault(require("lodash/isNil"));
|
|
8
|
+
const set_1 = tslib_1.__importDefault(require("lodash/set"));
|
|
9
|
+
const core_1 = require("../../../../core");
|
|
10
|
+
const common_1 = require("../../../constants/common");
|
|
11
|
+
const utils_1 = require("../../../utils");
|
|
12
|
+
const b = (0, utils_1.block)('range-input-picker');
|
|
13
|
+
const RangeInputPicker = (props) => {
|
|
14
|
+
var _a, _b, _c, _d, _e, _f;
|
|
15
|
+
const { spec, input, name } = props;
|
|
16
|
+
const { disabled, inputProps } = spec.viewSpec;
|
|
17
|
+
const sliderParams = inputProps === null || inputProps === void 0 ? void 0 : inputProps.sliderParams;
|
|
18
|
+
const showSlider = (_a = inputProps === null || inputProps === void 0 ? void 0 : inputProps.showSlider) !== null && _a !== void 0 ? _a : true;
|
|
19
|
+
const showInputs = (_b = inputProps === null || inputProps === void 0 ? void 0 : inputProps.showInputs) !== null && _b !== void 0 ? _b : true;
|
|
20
|
+
const [fromSpec, toSpec] = react_1.default.useMemo(() => [common_1.FROM, common_1.TO].map((key) => {
|
|
21
|
+
var _a, _b;
|
|
22
|
+
return (0, core_1.isNumberSpec)((_a = spec.properties) === null || _a === void 0 ? void 0 : _a[key])
|
|
23
|
+
? (_b = spec.properties) === null || _b === void 0 ? void 0 : _b[key]
|
|
24
|
+
: undefined;
|
|
25
|
+
}), [spec.properties]);
|
|
26
|
+
const sliderMin = (0, utils_1.resolveRangeInputPickerBound)(sliderParams === null || sliderParams === void 0 ? void 0 : sliderParams.min, fromSpec === null || fromSpec === void 0 ? void 0 : fromSpec.minimum, common_1.RANGE_INPUT_PICKER_DEFAULT_MIN);
|
|
27
|
+
const sliderMax = (0, utils_1.resolveRangeInputPickerBound)(sliderParams === null || sliderParams === void 0 ? void 0 : sliderParams.max, toSpec === null || toSpec === void 0 ? void 0 : toSpec.maximum, common_1.RANGE_INPUT_PICKER_DEFAULT_MAX);
|
|
28
|
+
const sliderStep = (_c = sliderParams === null || sliderParams === void 0 ? void 0 : sliderParams.step) !== null && _c !== void 0 ? _c : common_1.RANGE_INPUT_PICKER_DEFAULT_STEP;
|
|
29
|
+
const sliderMarks = (_d = sliderParams === null || sliderParams === void 0 ? void 0 : sliderParams.marks) !== null && _d !== void 0 ? _d : common_1.RANGE_INPUT_PICKER_DEFAULT_MARKS;
|
|
30
|
+
const value = (_e = input.value) !== null && _e !== void 0 ? _e : {};
|
|
31
|
+
const fromValue = (0, isNil_1.default)(value.from) ? undefined : Number(value.from);
|
|
32
|
+
const toValue = (0, isNil_1.default)(value.to) ? undefined : Number(value.to);
|
|
33
|
+
const sliderValue = [
|
|
34
|
+
(0, isNil_1.default)(fromValue) ? sliderMin : fromValue,
|
|
35
|
+
(0, isNil_1.default)(toValue) ? sliderMax : toValue,
|
|
36
|
+
];
|
|
37
|
+
const parentOnChange = react_1.default.useCallback((childName, childValue, childErrors) => input.onChange((currentValue) => (0, set_1.default)(Object.assign({}, currentValue), childName.split(`${name}.`).join(''), childValue), childErrors), [input, name]);
|
|
38
|
+
const handleSliderUpdate = react_1.default.useCallback((next) => {
|
|
39
|
+
if (!Array.isArray(next)) {
|
|
40
|
+
return;
|
|
41
|
+
}
|
|
42
|
+
input.onChange(() => (Object.assign(Object.assign({}, value), { [common_1.FROM]: next[0], [common_1.TO]: next[1] })));
|
|
43
|
+
}, [input, value]);
|
|
44
|
+
const handleFromUpdate = react_1.default.useCallback((next) => {
|
|
45
|
+
const safe = next === null
|
|
46
|
+
? undefined
|
|
47
|
+
: (0, utils_1.clampRangeInputPickerValue)(next, sliderMin, (0, isNil_1.default)(toValue) ? sliderMax : toValue);
|
|
48
|
+
parentOnChange(`${name}.${common_1.FROM}`, safe);
|
|
49
|
+
}, [name, parentOnChange, sliderMin, sliderMax, toValue]);
|
|
50
|
+
const handleToUpdate = react_1.default.useCallback((next) => {
|
|
51
|
+
const safe = next === null
|
|
52
|
+
? undefined
|
|
53
|
+
: (0, utils_1.clampRangeInputPickerValue)(next, (0, isNil_1.default)(fromValue) ? sliderMin : fromValue, sliderMax);
|
|
54
|
+
parentOnChange(`${name}.${common_1.TO}`, safe);
|
|
55
|
+
}, [name, parentOnChange, sliderMin, sliderMax, fromValue]);
|
|
56
|
+
return (react_1.default.createElement("div", { className: b() },
|
|
57
|
+
showSlider ? (react_1.default.createElement("div", { className: b('slider') },
|
|
58
|
+
react_1.default.createElement(uikit_1.Slider, { value: sliderValue, min: sliderMin, max: sliderMax, step: sliderStep, marks: sliderMarks, disabled: disabled, onUpdate: handleSliderUpdate, onBlur: input.onBlur, onFocus: input.onFocus, qa: `${name}-slider`, tooltipDisplay: "off" }))) : null,
|
|
59
|
+
showInputs ? (react_1.default.createElement("div", { className: b('inputs') },
|
|
60
|
+
react_1.default.createElement(uikit_1.NumberInput, { className: b('input'), value: (0, isNil_1.default)(fromValue) ? null : fromValue, min: sliderMin, max: sliderMax, step: sliderStep, disabled: disabled || (fromSpec === null || fromSpec === void 0 ? void 0 : fromSpec.viewSpec.disabled), placeholder: fromSpec === null || fromSpec === void 0 ? void 0 : fromSpec.viewSpec.placeholder, onUpdate: handleFromUpdate, onBlur: input.onBlur, onFocus: input.onFocus, hasClear: true, allowDecimal: true, qa: `${name}-from` }),
|
|
61
|
+
react_1.default.createElement("span", { className: b('separator') }, (_f = inputProps === null || inputProps === void 0 ? void 0 : inputProps.separator) !== null && _f !== void 0 ? _f : common_1.RANGE_INPUT_PICKER_DEFAULT_SEPARATOR),
|
|
62
|
+
react_1.default.createElement(uikit_1.NumberInput, { className: b('input'), value: (0, isNil_1.default)(toValue) ? null : toValue, min: sliderMin, max: sliderMax, step: sliderStep, disabled: disabled || (toSpec === null || toSpec === void 0 ? void 0 : toSpec.viewSpec.disabled), placeholder: toSpec === null || toSpec === void 0 ? void 0 : toSpec.viewSpec.placeholder, onUpdate: handleToUpdate, onBlur: input.onBlur, onFocus: input.onFocus, hasClear: true, allowDecimal: true, qa: `${name}-to` }))) : null));
|
|
63
|
+
};
|
|
64
|
+
exports.RangeInputPicker = RangeInputPicker;
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.RangeInputPickerNumber = void 0;
|
|
4
|
+
const tslib_1 = require("tslib");
|
|
5
|
+
const react_1 = tslib_1.__importDefault(require("react"));
|
|
6
|
+
const uikit_1 = require("@gravity-ui/uikit");
|
|
7
|
+
const isNil_1 = tslib_1.__importDefault(require("lodash/isNil"));
|
|
8
|
+
const common_1 = require("../../../constants/common");
|
|
9
|
+
const utils_1 = require("../../../utils");
|
|
10
|
+
const b = (0, utils_1.block)('range-input-picker');
|
|
11
|
+
const RangeInputPickerNumber = ({ name, input: { value, onBlur, onChange, onFocus }, spec, }) => {
|
|
12
|
+
var _a, _b, _c, _d;
|
|
13
|
+
const { disabled, placeholder, inputProps } = spec.viewSpec;
|
|
14
|
+
const sliderParams = inputProps === null || inputProps === void 0 ? void 0 : inputProps.sliderParams;
|
|
15
|
+
const showSlider = (_a = inputProps === null || inputProps === void 0 ? void 0 : inputProps.showSlider) !== null && _a !== void 0 ? _a : true;
|
|
16
|
+
const showInputs = (_b = inputProps === null || inputProps === void 0 ? void 0 : inputProps.showInputs) !== null && _b !== void 0 ? _b : true;
|
|
17
|
+
const sliderMin = (0, utils_1.resolveRangeInputPickerBound)(sliderParams === null || sliderParams === void 0 ? void 0 : sliderParams.min, spec.minimum, common_1.RANGE_INPUT_PICKER_DEFAULT_MIN);
|
|
18
|
+
const sliderMax = (0, utils_1.resolveRangeInputPickerBound)(sliderParams === null || sliderParams === void 0 ? void 0 : sliderParams.max, spec.maximum, common_1.RANGE_INPUT_PICKER_DEFAULT_MAX);
|
|
19
|
+
const sliderStep = (_c = sliderParams === null || sliderParams === void 0 ? void 0 : sliderParams.step) !== null && _c !== void 0 ? _c : common_1.RANGE_INPUT_PICKER_DEFAULT_STEP;
|
|
20
|
+
const sliderMarks = (_d = sliderParams === null || sliderParams === void 0 ? void 0 : sliderParams.marks) !== null && _d !== void 0 ? _d : common_1.RANGE_INPUT_PICKER_DEFAULT_MARKS;
|
|
21
|
+
const numericValue = (0, isNil_1.default)(value) ? undefined : Number(value);
|
|
22
|
+
const sliderValue = (0, isNil_1.default)(numericValue) ? sliderMin : numericValue;
|
|
23
|
+
const onChangeAllowUndefined = onChange;
|
|
24
|
+
const handleSliderUpdate = react_1.default.useCallback((next) => {
|
|
25
|
+
if (Array.isArray(next)) {
|
|
26
|
+
return;
|
|
27
|
+
}
|
|
28
|
+
onChangeAllowUndefined(next);
|
|
29
|
+
}, [onChangeAllowUndefined]);
|
|
30
|
+
const handleInputUpdate = react_1.default.useCallback((next) => {
|
|
31
|
+
if (next === null) {
|
|
32
|
+
onChangeAllowUndefined(undefined);
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
onChangeAllowUndefined((0, utils_1.clampRangeInputPickerValue)(next, sliderMin, sliderMax));
|
|
36
|
+
}, [onChangeAllowUndefined, sliderMin, sliderMax]);
|
|
37
|
+
return (react_1.default.createElement("div", { className: b() },
|
|
38
|
+
showSlider ? (react_1.default.createElement("div", { className: b('slider') },
|
|
39
|
+
react_1.default.createElement(uikit_1.Slider, { value: sliderValue, min: sliderMin, max: sliderMax, step: sliderStep, marks: sliderMarks, disabled: disabled, onUpdate: handleSliderUpdate, onBlur: onBlur, onFocus: onFocus, qa: `${name}-slider`, tooltipDisplay: "off" }))) : null,
|
|
40
|
+
showInputs ? (react_1.default.createElement("div", { className: b('inputs') },
|
|
41
|
+
react_1.default.createElement(uikit_1.NumberInput, { className: b('input'), value: (0, isNil_1.default)(numericValue) ? null : numericValue, min: sliderMin, max: sliderMax, step: sliderStep, disabled: disabled, placeholder: placeholder, onUpdate: handleInputUpdate, onBlur: onBlur, onFocus: onFocus, hasClear: true, allowDecimal: true, qa: name }))) : null));
|
|
42
|
+
};
|
|
43
|
+
exports.RangeInputPickerNumber = RangeInputPickerNumber;
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const tslib_1 = require("tslib");
|
|
4
|
+
tslib_1.__exportStar(require("./RangeInputPicker"), exports);
|
|
5
|
+
tslib_1.__exportStar(require("./RangeInputPickerNumber"), exports);
|
|
6
|
+
tslib_1.__exportStar(require("./types"), exports);
|
|
@@ -15,6 +15,7 @@ tslib_1.__exportStar(require("./ObjectBase"), exports);
|
|
|
15
15
|
tslib_1.__exportStar(require("./ObjectValueInput"), exports);
|
|
16
16
|
tslib_1.__exportStar(require("./OneOf"), exports);
|
|
17
17
|
tslib_1.__exportStar(require("./RadioGroup"), exports);
|
|
18
|
+
tslib_1.__exportStar(require("./RangeInputPicker"), exports);
|
|
18
19
|
tslib_1.__exportStar(require("./Secret"), exports);
|
|
19
20
|
tslib_1.__exportStar(require("./Select"), exports);
|
|
20
21
|
tslib_1.__exportStar(require("./Switch"), exports);
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.RangeInputPickerNumberView = void 0;
|
|
4
|
+
const tslib_1 = require("tslib");
|
|
5
|
+
const react_1 = tslib_1.__importDefault(require("react"));
|
|
6
|
+
const uikit_1 = require("@gravity-ui/uikit");
|
|
7
|
+
const isNil_1 = tslib_1.__importDefault(require("lodash/isNil"));
|
|
8
|
+
const RangeInputPickerNumberView = ({ value }) => {
|
|
9
|
+
if ((0, isNil_1.default)(value)) {
|
|
10
|
+
return null;
|
|
11
|
+
}
|
|
12
|
+
return react_1.default.createElement(uikit_1.Text, null, String(value));
|
|
13
|
+
};
|
|
14
|
+
exports.RangeInputPickerNumberView = RangeInputPickerNumberView;
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.RangeInputPickerView = void 0;
|
|
4
|
+
const tslib_1 = require("tslib");
|
|
5
|
+
const react_1 = tslib_1.__importDefault(require("react"));
|
|
6
|
+
const uikit_1 = require("@gravity-ui/uikit");
|
|
7
|
+
const isNil_1 = tslib_1.__importDefault(require("lodash/isNil"));
|
|
8
|
+
const common_1 = require("../../../constants/common");
|
|
9
|
+
const RangeInputPickerView = ({ value, spec }) => {
|
|
10
|
+
var _a, _b;
|
|
11
|
+
const separator = (_b = (_a = spec.viewSpec.inputProps) === null || _a === void 0 ? void 0 : _a.separator) !== null && _b !== void 0 ? _b : common_1.RANGE_INPUT_PICKER_DEFAULT_SEPARATOR;
|
|
12
|
+
const from = value === null || value === void 0 ? void 0 : value.from;
|
|
13
|
+
const to = value === null || value === void 0 ? void 0 : value.to;
|
|
14
|
+
const formatted = (() => {
|
|
15
|
+
if ((0, isNil_1.default)(from) && (0, isNil_1.default)(to)) {
|
|
16
|
+
return '';
|
|
17
|
+
}
|
|
18
|
+
if ((0, isNil_1.default)(from)) {
|
|
19
|
+
return `${separator} ${to}`;
|
|
20
|
+
}
|
|
21
|
+
if ((0, isNil_1.default)(to)) {
|
|
22
|
+
return `${from} ${separator}`;
|
|
23
|
+
}
|
|
24
|
+
return `${from} ${separator} ${to}`;
|
|
25
|
+
})();
|
|
26
|
+
return react_1.default.createElement(uikit_1.Text, null, formatted);
|
|
27
|
+
};
|
|
28
|
+
exports.RangeInputPickerView = RangeInputPickerView;
|
|
@@ -13,6 +13,7 @@ tslib_1.__exportStar(require("./NumberWithScaleView"), exports);
|
|
|
13
13
|
tslib_1.__exportStar(require("./ObjectBaseView"), exports);
|
|
14
14
|
tslib_1.__exportStar(require("./ObjectValueInputView"), exports);
|
|
15
15
|
tslib_1.__exportStar(require("./OneOfView"), exports);
|
|
16
|
+
tslib_1.__exportStar(require("./RangeInputPickerView"), exports);
|
|
16
17
|
tslib_1.__exportStar(require("./TableArrayView"), exports);
|
|
17
18
|
tslib_1.__exportStar(require("./TextAreaView"), exports);
|
|
18
19
|
tslib_1.__exportStar(require("./TextContentView"), exports);
|
|
@@ -1,8 +1,15 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.END_TIME = exports.START_TIME = exports.OBJECT_VALUE_PROPERTY_NAME = exports.COMMON_TITLE_MAX_WIDTH = exports.COMMON_POPOVER_PLACEMENT = void 0;
|
|
3
|
+
exports.RANGE_INPUT_PICKER_DEFAULT_SEPARATOR = exports.RANGE_INPUT_PICKER_DEFAULT_MARKS = exports.RANGE_INPUT_PICKER_DEFAULT_STEP = exports.RANGE_INPUT_PICKER_DEFAULT_MAX = exports.RANGE_INPUT_PICKER_DEFAULT_MIN = exports.TO = exports.FROM = exports.END_TIME = exports.START_TIME = exports.OBJECT_VALUE_PROPERTY_NAME = exports.COMMON_TITLE_MAX_WIDTH = exports.COMMON_POPOVER_PLACEMENT = void 0;
|
|
4
4
|
exports.COMMON_POPOVER_PLACEMENT = ['bottom', 'top'];
|
|
5
5
|
exports.COMMON_TITLE_MAX_WIDTH = 523;
|
|
6
6
|
exports.OBJECT_VALUE_PROPERTY_NAME = 'value';
|
|
7
7
|
exports.START_TIME = 'start';
|
|
8
8
|
exports.END_TIME = 'end';
|
|
9
|
+
exports.FROM = 'from';
|
|
10
|
+
exports.TO = 'to';
|
|
11
|
+
exports.RANGE_INPUT_PICKER_DEFAULT_MIN = 0;
|
|
12
|
+
exports.RANGE_INPUT_PICKER_DEFAULT_MAX = 100;
|
|
13
|
+
exports.RANGE_INPUT_PICKER_DEFAULT_STEP = 1;
|
|
14
|
+
exports.RANGE_INPUT_PICKER_DEFAULT_MARKS = 2;
|
|
15
|
+
exports.RANGE_INPUT_PICKER_DEFAULT_SEPARATOR = '–';
|
|
@@ -49,6 +49,7 @@ exports.dynamicConfig = {
|
|
|
49
49
|
number: {
|
|
50
50
|
inputs: {
|
|
51
51
|
base: { Component: components_1.NumInput },
|
|
52
|
+
range_input_picker: { Component: components_1.RangeInputPickerNumber },
|
|
52
53
|
},
|
|
53
54
|
layouts: {
|
|
54
55
|
row: components_1.Row,
|
|
@@ -74,6 +75,7 @@ exports.dynamicConfig = {
|
|
|
74
75
|
multi_oneof_flat: { Component: components_1.MultiOneOfFlat, independent: true },
|
|
75
76
|
inline: { Component: components_1.ObjectInline, independent: true },
|
|
76
77
|
time_range_selector: { Component: components_1.TimeRangeSelector, independent: true },
|
|
78
|
+
range_input_picker: { Component: components_1.RangeInputPicker },
|
|
77
79
|
},
|
|
78
80
|
layouts: {
|
|
79
81
|
row: components_1.Row,
|
|
@@ -164,6 +166,7 @@ exports.dynamicViewConfig = {
|
|
|
164
166
|
number: {
|
|
165
167
|
views: {
|
|
166
168
|
base: { Component: components_1.BaseView },
|
|
169
|
+
range_input_picker: { Component: components_1.RangeInputPickerNumberView },
|
|
167
170
|
},
|
|
168
171
|
layouts: {
|
|
169
172
|
row: components_1.ViewRow,
|
|
@@ -186,6 +189,7 @@ exports.dynamicViewConfig = {
|
|
|
186
189
|
multi_oneof_flat: { Component: components_1.MultiOneOfFlatView, independent: true },
|
|
187
190
|
inline: { Component: components_1.ObjectInlineView, independent: true },
|
|
188
191
|
time_range_selector: { Component: components_1.TimeRangeSelectorView, independent: true },
|
|
192
|
+
range_input_picker: { Component: components_1.RangeInputPickerView },
|
|
189
193
|
},
|
|
190
194
|
layouts: {
|
|
191
195
|
row: components_1.ViewRow,
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.isCorrectSizeParams = exports.prepareSpec = exports.isNotEmptyValue = void 0;
|
|
3
|
+
exports.isCorrectSizeParams = exports.resolveRangeInputPickerBound = exports.clampRangeInputPickerValue = exports.prepareSpec = exports.isNotEmptyValue = void 0;
|
|
4
4
|
const tslib_1 = require("tslib");
|
|
5
5
|
const cloneDeep_1 = tslib_1.__importDefault(require("lodash/cloneDeep"));
|
|
6
6
|
const isArray_1 = tslib_1.__importDefault(require("lodash/isArray"));
|
|
@@ -42,7 +42,7 @@ const isNotEmptyValue = (value, spec) => {
|
|
|
42
42
|
};
|
|
43
43
|
exports.isNotEmptyValue = isNotEmptyValue;
|
|
44
44
|
const prepareSpec = (spec, parseJsonDefaultValue, overridePatternError) => {
|
|
45
|
-
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l;
|
|
45
|
+
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o;
|
|
46
46
|
if ((0, isObjectLike_1.default)(spec)) {
|
|
47
47
|
const result = (0, cloneDeep_1.default)(spec);
|
|
48
48
|
if ((0, isString_1.default)(result.type)) {
|
|
@@ -54,7 +54,7 @@ const prepareSpec = (spec, parseJsonDefaultValue, overridePatternError) => {
|
|
|
54
54
|
try {
|
|
55
55
|
_defaultValue = JSON.parse(result.defaultValue);
|
|
56
56
|
}
|
|
57
|
-
catch (
|
|
57
|
+
catch (_p) {
|
|
58
58
|
_defaultValue = undefined;
|
|
59
59
|
}
|
|
60
60
|
}
|
|
@@ -75,18 +75,22 @@ const prepareSpec = (spec, parseJsonDefaultValue, overridePatternError) => {
|
|
|
75
75
|
if ((0, isString_1.default)((_c = result.viewSpec) === null || _c === void 0 ? void 0 : _c.addButtonPosition)) {
|
|
76
76
|
result.viewSpec.addButtonPosition = result.viewSpec.addButtonPosition.toLowerCase();
|
|
77
77
|
}
|
|
78
|
-
if ((0, isString_1.default)((_e = (_d = result.viewSpec) === null || _d === void 0 ? void 0 : _d.
|
|
78
|
+
if ((0, isString_1.default)((_e = (_d = result.viewSpec) === null || _d === void 0 ? void 0 : _d.radioGroupParams) === null || _e === void 0 ? void 0 : _e.direction)) {
|
|
79
|
+
result.viewSpec.radioGroupParams.direction =
|
|
80
|
+
result.viewSpec.radioGroupParams.direction.toLowerCase();
|
|
81
|
+
}
|
|
82
|
+
if ((0, isString_1.default)((_g = (_f = result.viewSpec) === null || _f === void 0 ? void 0 : _f.oneOfParams) === null || _g === void 0 ? void 0 : _g.toggler)) {
|
|
79
83
|
result.viewSpec.oneOfParams.toggler = result.viewSpec.oneOfParams.toggler.toLowerCase();
|
|
80
84
|
}
|
|
81
|
-
if ((0, isString_1.default)((
|
|
85
|
+
if ((0, isString_1.default)((_j = (_h = result.viewSpec) === null || _h === void 0 ? void 0 : _h.textContentParams) === null || _j === void 0 ? void 0 : _j.themeLabel)) {
|
|
82
86
|
result.viewSpec.textContentParams.themeLabel =
|
|
83
87
|
result.viewSpec.textContentParams.themeLabel.toLowerCase();
|
|
84
88
|
}
|
|
85
|
-
if ((0, isString_1.default)((
|
|
89
|
+
if ((0, isString_1.default)((_l = (_k = result.viewSpec) === null || _k === void 0 ? void 0 : _k.textContentParams) === null || _l === void 0 ? void 0 : _l.themeAlert)) {
|
|
86
90
|
result.viewSpec.textContentParams.themeAlert =
|
|
87
91
|
result.viewSpec.textContentParams.themeAlert.toLowerCase();
|
|
88
92
|
}
|
|
89
|
-
if ((0, isString_1.default)((
|
|
93
|
+
if ((0, isString_1.default)((_o = (_m = result.viewSpec) === null || _m === void 0 ? void 0 : _m.textContentParams) === null || _o === void 0 ? void 0 : _o.viewAlert)) {
|
|
90
94
|
result.viewSpec.textContentParams.viewAlert =
|
|
91
95
|
result.viewSpec.textContentParams.viewAlert.toLowerCase();
|
|
92
96
|
}
|
|
@@ -137,6 +141,18 @@ const prepareSpec = (spec, parseJsonDefaultValue, overridePatternError) => {
|
|
|
137
141
|
return spec;
|
|
138
142
|
};
|
|
139
143
|
exports.prepareSpec = prepareSpec;
|
|
144
|
+
const clampRangeInputPickerValue = (value, min, max) => Math.min(Math.max(value, min), max);
|
|
145
|
+
exports.clampRangeInputPickerValue = clampRangeInputPickerValue;
|
|
146
|
+
const resolveRangeInputPickerBound = (inputBound, specBound, fallback) => {
|
|
147
|
+
if (!(0, isNil_1.default)(inputBound)) {
|
|
148
|
+
return inputBound;
|
|
149
|
+
}
|
|
150
|
+
if (!(0, isNil_1.default)(specBound)) {
|
|
151
|
+
return specBound;
|
|
152
|
+
}
|
|
153
|
+
return fallback;
|
|
154
|
+
};
|
|
155
|
+
exports.resolveRangeInputPickerBound = resolveRangeInputPickerBound;
|
|
140
156
|
const isCorrectSizeParams = (spec) => {
|
|
141
157
|
const { sizeParams } = spec.viewSpec;
|
|
142
158
|
if (!sizeParams ||
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/*
|
|
2
|
+
@mixin variables {
|
|
3
|
+
--g-spacing-base: 4px;
|
|
4
|
+
|
|
5
|
+
--g-spacing-0: calc(var(--g-spacing-base) * 0); //0px
|
|
6
|
+
--g-spacing-half: calc(var(--g-spacing-base) * 0.5); //2px
|
|
7
|
+
--g-spacing-1: var(--g-spacing-base); // 4px
|
|
8
|
+
--g-spacing-2: calc(var(--g-spacing-base) * 2); // 8px
|
|
9
|
+
--g-spacing-3: calc(var(--g-spacing-base) * 3); // 12px
|
|
10
|
+
--g-spacing-4: calc(var(--g-spacing-base) * 4); // 16px
|
|
11
|
+
--g-spacing-5: calc(var(--g-spacing-base) * 5); // 20px
|
|
12
|
+
--g-spacing-6: calc(var(--g-spacing-base) * 6); // 24px
|
|
13
|
+
--g-spacing-7: calc(var(--g-spacing-base) * 7); // 28px
|
|
14
|
+
--g-spacing-8: calc(var(--g-spacing-base) * 8); // 32px
|
|
15
|
+
--g-spacing-9: calc(var(--g-spacing-base) * 9); // 36px
|
|
16
|
+
--g-spacing-10: calc(var(--g-spacing-base) * 10); // 40px
|
|
17
|
+
}
|
|
18
|
+
*/
|
|
19
|
+
/* Border-radius */
|
|
20
|
+
.df-range-input-picker {
|
|
21
|
+
display: flex;
|
|
22
|
+
flex-direction: column;
|
|
23
|
+
gap: var(--g-spacing-3);
|
|
24
|
+
width: 100%;
|
|
25
|
+
}
|
|
26
|
+
.df-range-input-picker__slider {
|
|
27
|
+
padding: 0 var(--g-spacing-2);
|
|
28
|
+
}
|
|
29
|
+
.df-range-input-picker__inputs {
|
|
30
|
+
display: flex;
|
|
31
|
+
flex-direction: row;
|
|
32
|
+
align-items: center;
|
|
33
|
+
gap: var(--g-spacing-2);
|
|
34
|
+
}
|
|
35
|
+
.df-range-input-picker__input {
|
|
36
|
+
flex: 1 1 0;
|
|
37
|
+
min-width: 0;
|
|
38
|
+
}
|
|
39
|
+
.df-range-input-picker__separator {
|
|
40
|
+
flex: 0 0 auto;
|
|
41
|
+
color: var(--g-color-text-secondary);
|
|
42
|
+
}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import type { ObjectInputProps } from '../../../../core';
|
|
3
|
+
import type { RangeInputPickerInputProps } from './types';
|
|
4
|
+
import './RangeInputPicker.css';
|
|
5
|
+
export declare const RangeInputPicker: (props: ObjectInputProps<RangeInputPickerInputProps>) => React.JSX.Element;
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { NumberInput, Slider } from '@gravity-ui/uikit';
|
|
3
|
+
import isNil from 'lodash/isNil';
|
|
4
|
+
import set from 'lodash/set';
|
|
5
|
+
import { isNumberSpec } from '../../../../core';
|
|
6
|
+
import { FROM, RANGE_INPUT_PICKER_DEFAULT_MARKS, RANGE_INPUT_PICKER_DEFAULT_MAX, RANGE_INPUT_PICKER_DEFAULT_MIN, RANGE_INPUT_PICKER_DEFAULT_SEPARATOR, RANGE_INPUT_PICKER_DEFAULT_STEP, TO, } from '../../../constants/common';
|
|
7
|
+
import { block, clampRangeInputPickerValue, resolveRangeInputPickerBound } from '../../../utils';
|
|
8
|
+
import './RangeInputPicker.css';
|
|
9
|
+
const b = block('range-input-picker');
|
|
10
|
+
export const RangeInputPicker = (props) => {
|
|
11
|
+
var _a, _b, _c, _d, _e, _f;
|
|
12
|
+
const { spec, input, name } = props;
|
|
13
|
+
const { disabled, inputProps } = spec.viewSpec;
|
|
14
|
+
const sliderParams = inputProps === null || inputProps === void 0 ? void 0 : inputProps.sliderParams;
|
|
15
|
+
const showSlider = (_a = inputProps === null || inputProps === void 0 ? void 0 : inputProps.showSlider) !== null && _a !== void 0 ? _a : true;
|
|
16
|
+
const showInputs = (_b = inputProps === null || inputProps === void 0 ? void 0 : inputProps.showInputs) !== null && _b !== void 0 ? _b : true;
|
|
17
|
+
const [fromSpec, toSpec] = React.useMemo(() => [FROM, TO].map((key) => {
|
|
18
|
+
var _a, _b;
|
|
19
|
+
return isNumberSpec((_a = spec.properties) === null || _a === void 0 ? void 0 : _a[key])
|
|
20
|
+
? (_b = spec.properties) === null || _b === void 0 ? void 0 : _b[key]
|
|
21
|
+
: undefined;
|
|
22
|
+
}), [spec.properties]);
|
|
23
|
+
const sliderMin = resolveRangeInputPickerBound(sliderParams === null || sliderParams === void 0 ? void 0 : sliderParams.min, fromSpec === null || fromSpec === void 0 ? void 0 : fromSpec.minimum, RANGE_INPUT_PICKER_DEFAULT_MIN);
|
|
24
|
+
const sliderMax = resolveRangeInputPickerBound(sliderParams === null || sliderParams === void 0 ? void 0 : sliderParams.max, toSpec === null || toSpec === void 0 ? void 0 : toSpec.maximum, RANGE_INPUT_PICKER_DEFAULT_MAX);
|
|
25
|
+
const sliderStep = (_c = sliderParams === null || sliderParams === void 0 ? void 0 : sliderParams.step) !== null && _c !== void 0 ? _c : RANGE_INPUT_PICKER_DEFAULT_STEP;
|
|
26
|
+
const sliderMarks = (_d = sliderParams === null || sliderParams === void 0 ? void 0 : sliderParams.marks) !== null && _d !== void 0 ? _d : RANGE_INPUT_PICKER_DEFAULT_MARKS;
|
|
27
|
+
const value = (_e = input.value) !== null && _e !== void 0 ? _e : {};
|
|
28
|
+
const fromValue = isNil(value.from) ? undefined : Number(value.from);
|
|
29
|
+
const toValue = isNil(value.to) ? undefined : Number(value.to);
|
|
30
|
+
const sliderValue = [
|
|
31
|
+
isNil(fromValue) ? sliderMin : fromValue,
|
|
32
|
+
isNil(toValue) ? sliderMax : toValue,
|
|
33
|
+
];
|
|
34
|
+
const parentOnChange = React.useCallback((childName, childValue, childErrors) => input.onChange((currentValue) => set(Object.assign({}, currentValue), childName.split(`${name}.`).join(''), childValue), childErrors), [input, name]);
|
|
35
|
+
const handleSliderUpdate = React.useCallback((next) => {
|
|
36
|
+
if (!Array.isArray(next)) {
|
|
37
|
+
return;
|
|
38
|
+
}
|
|
39
|
+
input.onChange(() => (Object.assign(Object.assign({}, value), { [FROM]: next[0], [TO]: next[1] })));
|
|
40
|
+
}, [input, value]);
|
|
41
|
+
const handleFromUpdate = React.useCallback((next) => {
|
|
42
|
+
const safe = next === null
|
|
43
|
+
? undefined
|
|
44
|
+
: clampRangeInputPickerValue(next, sliderMin, isNil(toValue) ? sliderMax : toValue);
|
|
45
|
+
parentOnChange(`${name}.${FROM}`, safe);
|
|
46
|
+
}, [name, parentOnChange, sliderMin, sliderMax, toValue]);
|
|
47
|
+
const handleToUpdate = React.useCallback((next) => {
|
|
48
|
+
const safe = next === null
|
|
49
|
+
? undefined
|
|
50
|
+
: clampRangeInputPickerValue(next, isNil(fromValue) ? sliderMin : fromValue, sliderMax);
|
|
51
|
+
parentOnChange(`${name}.${TO}`, safe);
|
|
52
|
+
}, [name, parentOnChange, sliderMin, sliderMax, fromValue]);
|
|
53
|
+
return (React.createElement("div", { className: b() },
|
|
54
|
+
showSlider ? (React.createElement("div", { className: b('slider') },
|
|
55
|
+
React.createElement(Slider, { value: sliderValue, min: sliderMin, max: sliderMax, step: sliderStep, marks: sliderMarks, disabled: disabled, onUpdate: handleSliderUpdate, onBlur: input.onBlur, onFocus: input.onFocus, qa: `${name}-slider`, tooltipDisplay: "off" }))) : null,
|
|
56
|
+
showInputs ? (React.createElement("div", { className: b('inputs') },
|
|
57
|
+
React.createElement(NumberInput, { className: b('input'), value: isNil(fromValue) ? null : fromValue, min: sliderMin, max: sliderMax, step: sliderStep, disabled: disabled || (fromSpec === null || fromSpec === void 0 ? void 0 : fromSpec.viewSpec.disabled), placeholder: fromSpec === null || fromSpec === void 0 ? void 0 : fromSpec.viewSpec.placeholder, onUpdate: handleFromUpdate, onBlur: input.onBlur, onFocus: input.onFocus, hasClear: true, allowDecimal: true, qa: `${name}-from` }),
|
|
58
|
+
React.createElement("span", { className: b('separator') }, (_f = inputProps === null || inputProps === void 0 ? void 0 : inputProps.separator) !== null && _f !== void 0 ? _f : RANGE_INPUT_PICKER_DEFAULT_SEPARATOR),
|
|
59
|
+
React.createElement(NumberInput, { className: b('input'), value: isNil(toValue) ? null : toValue, min: sliderMin, max: sliderMax, step: sliderStep, disabled: disabled || (toSpec === null || toSpec === void 0 ? void 0 : toSpec.viewSpec.disabled), placeholder: toSpec === null || toSpec === void 0 ? void 0 : toSpec.viewSpec.placeholder, onUpdate: handleToUpdate, onBlur: input.onBlur, onFocus: input.onFocus, hasClear: true, allowDecimal: true, qa: `${name}-to` }))) : null));
|
|
60
|
+
};
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import type { NumberInputProps } from '../../../../core';
|
|
3
|
+
import type { RangeInputPickerInputProps } from './types';
|
|
4
|
+
import './RangeInputPicker.css';
|
|
5
|
+
export declare const RangeInputPickerNumber: ({ name, input: { value, onBlur, onChange, onFocus }, spec, }: NumberInputProps<RangeInputPickerInputProps>) => React.JSX.Element;
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { NumberInput, Slider } from '@gravity-ui/uikit';
|
|
3
|
+
import isNil from 'lodash/isNil';
|
|
4
|
+
import { RANGE_INPUT_PICKER_DEFAULT_MARKS, RANGE_INPUT_PICKER_DEFAULT_MAX, RANGE_INPUT_PICKER_DEFAULT_MIN, RANGE_INPUT_PICKER_DEFAULT_STEP, } from '../../../constants/common';
|
|
5
|
+
import { block, clampRangeInputPickerValue, resolveRangeInputPickerBound } from '../../../utils';
|
|
6
|
+
import './RangeInputPicker.css';
|
|
7
|
+
const b = block('range-input-picker');
|
|
8
|
+
export const RangeInputPickerNumber = ({ name, input: { value, onBlur, onChange, onFocus }, spec, }) => {
|
|
9
|
+
var _a, _b, _c, _d;
|
|
10
|
+
const { disabled, placeholder, inputProps } = spec.viewSpec;
|
|
11
|
+
const sliderParams = inputProps === null || inputProps === void 0 ? void 0 : inputProps.sliderParams;
|
|
12
|
+
const showSlider = (_a = inputProps === null || inputProps === void 0 ? void 0 : inputProps.showSlider) !== null && _a !== void 0 ? _a : true;
|
|
13
|
+
const showInputs = (_b = inputProps === null || inputProps === void 0 ? void 0 : inputProps.showInputs) !== null && _b !== void 0 ? _b : true;
|
|
14
|
+
const sliderMin = resolveRangeInputPickerBound(sliderParams === null || sliderParams === void 0 ? void 0 : sliderParams.min, spec.minimum, RANGE_INPUT_PICKER_DEFAULT_MIN);
|
|
15
|
+
const sliderMax = resolveRangeInputPickerBound(sliderParams === null || sliderParams === void 0 ? void 0 : sliderParams.max, spec.maximum, RANGE_INPUT_PICKER_DEFAULT_MAX);
|
|
16
|
+
const sliderStep = (_c = sliderParams === null || sliderParams === void 0 ? void 0 : sliderParams.step) !== null && _c !== void 0 ? _c : RANGE_INPUT_PICKER_DEFAULT_STEP;
|
|
17
|
+
const sliderMarks = (_d = sliderParams === null || sliderParams === void 0 ? void 0 : sliderParams.marks) !== null && _d !== void 0 ? _d : RANGE_INPUT_PICKER_DEFAULT_MARKS;
|
|
18
|
+
const numericValue = isNil(value) ? undefined : Number(value);
|
|
19
|
+
const sliderValue = isNil(numericValue) ? sliderMin : numericValue;
|
|
20
|
+
const onChangeAllowUndefined = onChange;
|
|
21
|
+
const handleSliderUpdate = React.useCallback((next) => {
|
|
22
|
+
if (Array.isArray(next)) {
|
|
23
|
+
return;
|
|
24
|
+
}
|
|
25
|
+
onChangeAllowUndefined(next);
|
|
26
|
+
}, [onChangeAllowUndefined]);
|
|
27
|
+
const handleInputUpdate = React.useCallback((next) => {
|
|
28
|
+
if (next === null) {
|
|
29
|
+
onChangeAllowUndefined(undefined);
|
|
30
|
+
return;
|
|
31
|
+
}
|
|
32
|
+
onChangeAllowUndefined(clampRangeInputPickerValue(next, sliderMin, sliderMax));
|
|
33
|
+
}, [onChangeAllowUndefined, sliderMin, sliderMax]);
|
|
34
|
+
return (React.createElement("div", { className: b() },
|
|
35
|
+
showSlider ? (React.createElement("div", { className: b('slider') },
|
|
36
|
+
React.createElement(Slider, { value: sliderValue, min: sliderMin, max: sliderMax, step: sliderStep, marks: sliderMarks, disabled: disabled, onUpdate: handleSliderUpdate, onBlur: onBlur, onFocus: onFocus, qa: `${name}-slider`, tooltipDisplay: "off" }))) : null,
|
|
37
|
+
showInputs ? (React.createElement("div", { className: b('inputs') },
|
|
38
|
+
React.createElement(NumberInput, { className: b('input'), value: isNil(numericValue) ? null : numericValue, min: sliderMin, max: sliderMax, step: sliderStep, disabled: disabled, placeholder: placeholder, onUpdate: handleInputUpdate, onBlur: onBlur, onFocus: onFocus, hasClear: true, allowDecimal: true, qa: name }))) : null));
|
|
39
|
+
};
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export interface RangeInputPickerInputProps {
|
|
2
|
+
sliderParams?: {
|
|
3
|
+
min: number;
|
|
4
|
+
max: number;
|
|
5
|
+
step?: number;
|
|
6
|
+
marks?: number | number[];
|
|
7
|
+
};
|
|
8
|
+
showSlider?: boolean;
|
|
9
|
+
showInputs?: boolean;
|
|
10
|
+
separator?: string;
|
|
11
|
+
}
|
|
12
|
+
export interface RangeInputPickerValue {
|
|
13
|
+
from?: number;
|
|
14
|
+
to?: number;
|
|
15
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { Text } from '@gravity-ui/uikit';
|
|
3
|
+
import isNil from 'lodash/isNil';
|
|
4
|
+
export const RangeInputPickerNumberView = ({ value }) => {
|
|
5
|
+
if (isNil(value)) {
|
|
6
|
+
return null;
|
|
7
|
+
}
|
|
8
|
+
return React.createElement(Text, null, String(value));
|
|
9
|
+
};
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { Text } from '@gravity-ui/uikit';
|
|
3
|
+
import isNil from 'lodash/isNil';
|
|
4
|
+
import { RANGE_INPUT_PICKER_DEFAULT_SEPARATOR } from '../../../constants/common';
|
|
5
|
+
export const RangeInputPickerView = ({ value, spec }) => {
|
|
6
|
+
var _a, _b;
|
|
7
|
+
const separator = (_b = (_a = spec.viewSpec.inputProps) === null || _a === void 0 ? void 0 : _a.separator) !== null && _b !== void 0 ? _b : RANGE_INPUT_PICKER_DEFAULT_SEPARATOR;
|
|
8
|
+
const from = value === null || value === void 0 ? void 0 : value.from;
|
|
9
|
+
const to = value === null || value === void 0 ? void 0 : value.to;
|
|
10
|
+
const formatted = (() => {
|
|
11
|
+
if (isNil(from) && isNil(to)) {
|
|
12
|
+
return '';
|
|
13
|
+
}
|
|
14
|
+
if (isNil(from)) {
|
|
15
|
+
return `${separator} ${to}`;
|
|
16
|
+
}
|
|
17
|
+
if (isNil(to)) {
|
|
18
|
+
return `${from} ${separator}`;
|
|
19
|
+
}
|
|
20
|
+
return `${from} ${separator} ${to}`;
|
|
21
|
+
})();
|
|
22
|
+
return React.createElement(Text, null, formatted);
|
|
23
|
+
};
|
|
@@ -10,6 +10,7 @@ export * from './NumberWithScaleView';
|
|
|
10
10
|
export * from './ObjectBaseView';
|
|
11
11
|
export * from './ObjectValueInputView';
|
|
12
12
|
export * from './OneOfView';
|
|
13
|
+
export * from './RangeInputPickerView';
|
|
13
14
|
export * from './TableArrayView';
|
|
14
15
|
export * from './TextAreaView';
|
|
15
16
|
export * from './TextContentView';
|
|
@@ -10,6 +10,7 @@ export * from './NumberWithScaleView';
|
|
|
10
10
|
export * from './ObjectBaseView';
|
|
11
11
|
export * from './ObjectValueInputView';
|
|
12
12
|
export * from './OneOfView';
|
|
13
|
+
export * from './RangeInputPickerView';
|
|
13
14
|
export * from './TableArrayView';
|
|
14
15
|
export * from './TextAreaView';
|
|
15
16
|
export * from './TextContentView';
|
|
@@ -4,3 +4,10 @@ export declare const COMMON_TITLE_MAX_WIDTH = 523;
|
|
|
4
4
|
export declare const OBJECT_VALUE_PROPERTY_NAME = "value";
|
|
5
5
|
export declare const START_TIME = "start";
|
|
6
6
|
export declare const END_TIME = "end";
|
|
7
|
+
export declare const FROM = "from";
|
|
8
|
+
export declare const TO = "to";
|
|
9
|
+
export declare const RANGE_INPUT_PICKER_DEFAULT_MIN = 0;
|
|
10
|
+
export declare const RANGE_INPUT_PICKER_DEFAULT_MAX = 100;
|
|
11
|
+
export declare const RANGE_INPUT_PICKER_DEFAULT_STEP = 1;
|
|
12
|
+
export declare const RANGE_INPUT_PICKER_DEFAULT_MARKS = 2;
|
|
13
|
+
export declare const RANGE_INPUT_PICKER_DEFAULT_SEPARATOR = "\u2013";
|
|
@@ -3,3 +3,10 @@ export const COMMON_TITLE_MAX_WIDTH = 523;
|
|
|
3
3
|
export const OBJECT_VALUE_PROPERTY_NAME = 'value';
|
|
4
4
|
export const START_TIME = 'start';
|
|
5
5
|
export const END_TIME = 'end';
|
|
6
|
+
export const FROM = 'from';
|
|
7
|
+
export const TO = 'to';
|
|
8
|
+
export const RANGE_INPUT_PICKER_DEFAULT_MIN = 0;
|
|
9
|
+
export const RANGE_INPUT_PICKER_DEFAULT_MAX = 100;
|
|
10
|
+
export const RANGE_INPUT_PICKER_DEFAULT_STEP = 1;
|
|
11
|
+
export const RANGE_INPUT_PICKER_DEFAULT_MARKS = 2;
|
|
12
|
+
export const RANGE_INPUT_PICKER_DEFAULT_SEPARATOR = '–';
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Accordeon, AccordeonCardForm, ArrayBase, ArrayBaseView, BaseView, CardAccordeon, CardOneOf, CardOneOfView, CardSection, Checkbox, CheckboxGroup, CheckboxGroupView, Column, DateInput, DateView, FileInput, FileInputView, Group, Group2, MonacoInput, MonacoView, MultiOneOf, MultiOneOfFlat, MultiOneOfFlatView, MultiOneOfView, MultiSelect, MultiSelectView, NumInput, NumberWithScale, NumberWithScaleView, ObjectBase, ObjectBaseView, ObjectInline, ObjectInlineView, ObjectValueInput, ObjectValueInputView, OneOf, OneOfFlat, OneOfFlatView, OneOfView, RadioGroup, Row, RowVerbose, Secret, Section, Section2, Select, Switch, TableArrayInput, TableArrayView, TableCell, Text, TextArea, TextAreaView, TextContent, TextContentView, TextLink, TextLinkView, TimeRangeSelector, TimeRangeSelectorView, Transparent, ViewAccordeon, ViewAccordeonCard, ViewCardAccordeon, ViewCardSection, ViewColumn, ViewGroup, ViewGroup2, ViewRow, ViewSection, ViewSection2, ViewTableCell, ViewTransparent, } from '../components';
|
|
1
|
+
import { Accordeon, AccordeonCardForm, ArrayBase, ArrayBaseView, BaseView, CardAccordeon, CardOneOf, CardOneOfView, CardSection, Checkbox, CheckboxGroup, CheckboxGroupView, Column, DateInput, DateView, FileInput, FileInputView, Group, Group2, MonacoInput, MonacoView, MultiOneOf, MultiOneOfFlat, MultiOneOfFlatView, MultiOneOfView, MultiSelect, MultiSelectView, NumInput, NumberWithScale, NumberWithScaleView, ObjectBase, ObjectBaseView, ObjectInline, ObjectInlineView, ObjectValueInput, ObjectValueInputView, OneOf, OneOfFlat, OneOfFlatView, OneOfView, RadioGroup, RangeInputPicker, RangeInputPickerNumber, RangeInputPickerNumberView, RangeInputPickerView, Row, RowVerbose, Secret, Section, Section2, Select, Switch, TableArrayInput, TableArrayView, TableCell, Text, TextArea, TextAreaView, TextContent, TextContentView, TextLink, TextLinkView, TimeRangeSelector, TimeRangeSelectorView, Transparent, ViewAccordeon, ViewAccordeonCard, ViewCardAccordeon, ViewCardSection, ViewColumn, ViewGroup, ViewGroup2, ViewRow, ViewSection, ViewSection2, ViewTableCell, ViewTransparent, } from '../components';
|
|
2
2
|
import { getArrayValidator, getBooleanValidator, getNumberValidator, getObjectValidator, getStringValidator, } from '../validators';
|
|
3
3
|
export const dynamicConfig = {
|
|
4
4
|
array: {
|
|
@@ -46,6 +46,7 @@ export const dynamicConfig = {
|
|
|
46
46
|
number: {
|
|
47
47
|
inputs: {
|
|
48
48
|
base: { Component: NumInput },
|
|
49
|
+
range_input_picker: { Component: RangeInputPickerNumber },
|
|
49
50
|
},
|
|
50
51
|
layouts: {
|
|
51
52
|
row: Row,
|
|
@@ -71,6 +72,7 @@ export const dynamicConfig = {
|
|
|
71
72
|
multi_oneof_flat: { Component: MultiOneOfFlat, independent: true },
|
|
72
73
|
inline: { Component: ObjectInline, independent: true },
|
|
73
74
|
time_range_selector: { Component: TimeRangeSelector, independent: true },
|
|
75
|
+
range_input_picker: { Component: RangeInputPicker },
|
|
74
76
|
},
|
|
75
77
|
layouts: {
|
|
76
78
|
row: Row,
|
|
@@ -161,6 +163,7 @@ export const dynamicViewConfig = {
|
|
|
161
163
|
number: {
|
|
162
164
|
views: {
|
|
163
165
|
base: { Component: BaseView },
|
|
166
|
+
range_input_picker: { Component: RangeInputPickerNumberView },
|
|
164
167
|
},
|
|
165
168
|
layouts: {
|
|
166
169
|
row: ViewRow,
|
|
@@ -183,6 +186,7 @@ export const dynamicViewConfig = {
|
|
|
183
186
|
multi_oneof_flat: { Component: MultiOneOfFlatView, independent: true },
|
|
184
187
|
inline: { Component: ObjectInlineView, independent: true },
|
|
185
188
|
time_range_selector: { Component: TimeRangeSelectorView, independent: true },
|
|
189
|
+
range_input_picker: { Component: RangeInputPickerView },
|
|
186
190
|
},
|
|
187
191
|
layouts: {
|
|
188
192
|
row: ViewRow,
|
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
import type { FormValue, Spec, StringSpec } from '../../core';
|
|
2
2
|
export declare const isNotEmptyValue: (value: FormValue | undefined, spec: Spec | undefined) => boolean;
|
|
3
3
|
export declare const prepareSpec: <Type extends Spec>(spec: Type, parseJsonDefaultValue?: boolean, overridePatternError?: (pattern?: string) => string) => Type;
|
|
4
|
+
export declare const clampRangeInputPickerValue: (value: number, min: number, max: number) => number;
|
|
5
|
+
export declare const resolveRangeInputPickerBound: (inputBound: number | undefined, specBound: number | undefined, fallback: number) => number;
|
|
4
6
|
export declare const isCorrectSizeParams: (spec: StringSpec) => boolean;
|
|
@@ -37,7 +37,7 @@ export const isNotEmptyValue = (value, spec) => {
|
|
|
37
37
|
return true;
|
|
38
38
|
};
|
|
39
39
|
export const prepareSpec = (spec, parseJsonDefaultValue, overridePatternError) => {
|
|
40
|
-
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l;
|
|
40
|
+
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o;
|
|
41
41
|
if (isObjectLike(spec)) {
|
|
42
42
|
const result = cloneDeep(spec);
|
|
43
43
|
if (isString(result.type)) {
|
|
@@ -49,7 +49,7 @@ export const prepareSpec = (spec, parseJsonDefaultValue, overridePatternError) =
|
|
|
49
49
|
try {
|
|
50
50
|
_defaultValue = JSON.parse(result.defaultValue);
|
|
51
51
|
}
|
|
52
|
-
catch (
|
|
52
|
+
catch (_p) {
|
|
53
53
|
_defaultValue = undefined;
|
|
54
54
|
}
|
|
55
55
|
}
|
|
@@ -70,18 +70,22 @@ export const prepareSpec = (spec, parseJsonDefaultValue, overridePatternError) =
|
|
|
70
70
|
if (isString((_c = result.viewSpec) === null || _c === void 0 ? void 0 : _c.addButtonPosition)) {
|
|
71
71
|
result.viewSpec.addButtonPosition = result.viewSpec.addButtonPosition.toLowerCase();
|
|
72
72
|
}
|
|
73
|
-
if (isString((_e = (_d = result.viewSpec) === null || _d === void 0 ? void 0 : _d.
|
|
73
|
+
if (isString((_e = (_d = result.viewSpec) === null || _d === void 0 ? void 0 : _d.radioGroupParams) === null || _e === void 0 ? void 0 : _e.direction)) {
|
|
74
|
+
result.viewSpec.radioGroupParams.direction =
|
|
75
|
+
result.viewSpec.radioGroupParams.direction.toLowerCase();
|
|
76
|
+
}
|
|
77
|
+
if (isString((_g = (_f = result.viewSpec) === null || _f === void 0 ? void 0 : _f.oneOfParams) === null || _g === void 0 ? void 0 : _g.toggler)) {
|
|
74
78
|
result.viewSpec.oneOfParams.toggler = result.viewSpec.oneOfParams.toggler.toLowerCase();
|
|
75
79
|
}
|
|
76
|
-
if (isString((
|
|
80
|
+
if (isString((_j = (_h = result.viewSpec) === null || _h === void 0 ? void 0 : _h.textContentParams) === null || _j === void 0 ? void 0 : _j.themeLabel)) {
|
|
77
81
|
result.viewSpec.textContentParams.themeLabel =
|
|
78
82
|
result.viewSpec.textContentParams.themeLabel.toLowerCase();
|
|
79
83
|
}
|
|
80
|
-
if (isString((
|
|
84
|
+
if (isString((_l = (_k = result.viewSpec) === null || _k === void 0 ? void 0 : _k.textContentParams) === null || _l === void 0 ? void 0 : _l.themeAlert)) {
|
|
81
85
|
result.viewSpec.textContentParams.themeAlert =
|
|
82
86
|
result.viewSpec.textContentParams.themeAlert.toLowerCase();
|
|
83
87
|
}
|
|
84
|
-
if (isString((
|
|
88
|
+
if (isString((_o = (_m = result.viewSpec) === null || _m === void 0 ? void 0 : _m.textContentParams) === null || _o === void 0 ? void 0 : _o.viewAlert)) {
|
|
85
89
|
result.viewSpec.textContentParams.viewAlert =
|
|
86
90
|
result.viewSpec.textContentParams.viewAlert.toLowerCase();
|
|
87
91
|
}
|
|
@@ -131,6 +135,16 @@ export const prepareSpec = (spec, parseJsonDefaultValue, overridePatternError) =
|
|
|
131
135
|
}
|
|
132
136
|
return spec;
|
|
133
137
|
};
|
|
138
|
+
export const clampRangeInputPickerValue = (value, min, max) => Math.min(Math.max(value, min), max);
|
|
139
|
+
export const resolveRangeInputPickerBound = (inputBound, specBound, fallback) => {
|
|
140
|
+
if (!isNil(inputBound)) {
|
|
141
|
+
return inputBound;
|
|
142
|
+
}
|
|
143
|
+
if (!isNil(specBound)) {
|
|
144
|
+
return specBound;
|
|
145
|
+
}
|
|
146
|
+
return fallback;
|
|
147
|
+
};
|
|
134
148
|
export const isCorrectSizeParams = (spec) => {
|
|
135
149
|
const { sizeParams } = spec.viewSpec;
|
|
136
150
|
if (!sizeParams ||
|