@ozen-ui/kit 0.75.0 → 0.76.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/StepperVertical/package.json +5 -0
- package/__inner__/cjs/components/Autocomplete/helper.d.ts +1 -1
- package/__inner__/cjs/components/Autocomplete/types.d.ts +1 -1
- package/__inner__/cjs/components/DataList/types.d.ts +1 -1
- package/__inner__/cjs/components/Select/Select.css +10 -1
- package/__inner__/cjs/components/Select/Select.d.ts +0 -1
- package/__inner__/cjs/components/Select/Select.js +40 -10
- package/__inner__/cjs/components/Select/SelectContext.d.ts +21 -0
- package/__inner__/cjs/components/Select/SelectContext.js +29 -0
- package/__inner__/cjs/components/Select/classNames.d.ts +1 -0
- package/__inner__/cjs/components/Select/classNames.js +5 -0
- package/__inner__/cjs/components/Select/components/SelectInput/SelectInput.js +14 -15
- package/__inner__/cjs/components/Select/components/SelectInput/types.d.ts +0 -22
- package/__inner__/cjs/components/Select/components/SelectInputContextConsumer/SelectInputContextConsumer.js +3 -3
- package/__inner__/cjs/components/Select/components/SelectInputRenderRight/SelectInputRenderRight.d.ts +2 -0
- package/__inner__/cjs/components/Select/components/SelectInputRenderRight/SelectInputRenderRight.js +42 -0
- package/__inner__/cjs/components/Select/components/SelectInputRenderRight/index.d.ts +1 -0
- package/__inner__/cjs/components/Select/components/SelectInputRenderRight/index.js +4 -0
- package/__inner__/cjs/components/Select/components/index.d.ts +1 -0
- package/__inner__/cjs/components/Select/components/index.js +1 -0
- package/__inner__/cjs/components/Select/constants.d.ts +3 -0
- package/__inner__/cjs/components/Select/constants.js +8 -1
- package/__inner__/cjs/components/Select/entities/index.d.ts +2 -0
- package/__inner__/cjs/components/Select/entities/index.js +5 -0
- package/__inner__/cjs/components/Select/entities/onClear.d.ts +2 -0
- package/__inner__/cjs/components/Select/entities/onClear.js +2 -0
- package/__inner__/cjs/components/Select/entities/render.d.ts +6 -0
- package/__inner__/cjs/components/Select/entities/render.js +4 -0
- package/__inner__/cjs/components/Select/index.d.ts +1 -0
- package/__inner__/cjs/components/Select/index.js +1 -0
- package/__inner__/cjs/components/Select/types.d.ts +30 -5
- package/__inner__/cjs/components/Select/types.js +3 -0
- package/__inner__/cjs/locale/locale.js +9 -0
- package/__inner__/cjs/utils/array/generatePermutations/generatePermutations.d.ts +1 -0
- package/__inner__/cjs/utils/array/generatePermutations/generatePermutations.js +47 -0
- package/__inner__/cjs/utils/array/generatePermutations/index.d.ts +1 -0
- package/__inner__/cjs/utils/array/generatePermutations/index.js +4 -0
- package/__inner__/cjs/utils/array/index.d.ts +1 -0
- package/__inner__/cjs/utils/array/index.js +1 -0
- package/__inner__/esm/components/Autocomplete/helper.d.ts +1 -1
- package/__inner__/esm/components/Autocomplete/types.d.ts +1 -1
- package/__inner__/esm/components/DataList/types.d.ts +1 -1
- package/__inner__/esm/components/Select/Select.css +10 -1
- package/__inner__/esm/components/Select/Select.d.ts +0 -1
- package/__inner__/esm/components/Select/Select.js +40 -10
- package/__inner__/esm/components/Select/SelectContext.d.ts +21 -0
- package/__inner__/esm/components/Select/SelectContext.js +25 -0
- package/__inner__/esm/components/Select/classNames.d.ts +1 -0
- package/__inner__/esm/components/Select/classNames.js +2 -0
- package/__inner__/esm/components/Select/components/SelectInput/SelectInput.js +7 -8
- package/__inner__/esm/components/Select/components/SelectInput/types.d.ts +0 -22
- package/__inner__/esm/components/Select/components/SelectInputContextConsumer/SelectInputContextConsumer.js +1 -1
- package/__inner__/esm/components/Select/components/SelectInputRenderRight/SelectInputRenderRight.d.ts +2 -0
- package/__inner__/esm/components/Select/components/SelectInputRenderRight/SelectInputRenderRight.js +38 -0
- package/__inner__/esm/components/Select/components/SelectInputRenderRight/index.d.ts +1 -0
- package/__inner__/esm/components/Select/components/SelectInputRenderRight/index.js +1 -0
- package/__inner__/esm/components/Select/components/index.d.ts +1 -0
- package/__inner__/esm/components/Select/components/index.js +1 -0
- package/__inner__/esm/components/Select/constants.d.ts +3 -0
- package/__inner__/esm/components/Select/constants.js +7 -0
- package/__inner__/esm/components/Select/entities/index.d.ts +2 -0
- package/__inner__/esm/components/Select/entities/index.js +2 -0
- package/__inner__/esm/components/Select/entities/onClear.d.ts +2 -0
- package/__inner__/esm/components/Select/entities/onClear.js +1 -0
- package/__inner__/esm/components/Select/entities/render.d.ts +6 -0
- package/__inner__/esm/components/Select/entities/render.js +1 -0
- package/__inner__/esm/components/Select/index.d.ts +1 -0
- package/__inner__/esm/components/Select/index.js +1 -0
- package/__inner__/esm/components/Select/types.d.ts +30 -5
- package/__inner__/esm/components/Select/types.js +2 -1
- package/__inner__/esm/locale/locale.js +9 -0
- package/__inner__/esm/utils/array/generatePermutations/generatePermutations.d.ts +1 -0
- package/__inner__/esm/utils/array/generatePermutations/generatePermutations.js +43 -0
- package/__inner__/esm/utils/array/generatePermutations/index.d.ts +1 -0
- package/__inner__/esm/utils/array/generatePermutations/index.js +1 -0
- package/__inner__/esm/utils/array/index.d.ts +1 -0
- package/__inner__/esm/utils/array/index.js +1 -0
- package/package.json +4 -4
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.generatePermutations = void 0;
|
|
4
|
+
var tslib_1 = require("tslib");
|
|
5
|
+
var lodash_isequal_1 = tslib_1.__importDefault(require("lodash.isequal"));
|
|
6
|
+
var generatePermutations = function (array, withSubsetSizes) {
|
|
7
|
+
if (withSubsetSizes === void 0) { withSubsetSizes = false; }
|
|
8
|
+
var result = [];
|
|
9
|
+
var permute = function (array, current) {
|
|
10
|
+
if (current === void 0) { current = []; }
|
|
11
|
+
if (array.length === 0) {
|
|
12
|
+
if (!result.some(function (r) { return (0, lodash_isequal_1.default)(r, current); })) {
|
|
13
|
+
result.push(tslib_1.__spreadArray([], tslib_1.__read(current), false));
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
else {
|
|
17
|
+
for (var i = 0; i < array.length; i++) {
|
|
18
|
+
var newArray = tslib_1.__spreadArray([], tslib_1.__read(array), false);
|
|
19
|
+
var next = newArray.splice(i, 1);
|
|
20
|
+
permute(newArray, current.concat(next));
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
};
|
|
24
|
+
var subsetsOfSize = function (array, k, start, subset) {
|
|
25
|
+
if (start === void 0) { start = 0; }
|
|
26
|
+
if (subset === void 0) { subset = []; }
|
|
27
|
+
if (subset.length === k) {
|
|
28
|
+
permute(subset);
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
for (var i = start; i < array.length; i++) {
|
|
32
|
+
subset.push(array[i]);
|
|
33
|
+
subsetsOfSize(array, k, i + 1, subset);
|
|
34
|
+
subset.pop();
|
|
35
|
+
}
|
|
36
|
+
};
|
|
37
|
+
if (withSubsetSizes) {
|
|
38
|
+
for (var size = array.length; size >= 1; size--) {
|
|
39
|
+
subsetsOfSize(array, size);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
else {
|
|
43
|
+
permute(array);
|
|
44
|
+
}
|
|
45
|
+
return result;
|
|
46
|
+
};
|
|
47
|
+
exports.generatePermutations = generatePermutations;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './generatePermutations';
|
|
@@ -3,4 +3,5 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
var tslib_1 = require("tslib");
|
|
4
4
|
tslib_1.__exportStar(require("./createEmpty"), exports);
|
|
5
5
|
tslib_1.__exportStar(require("./createFilled"), exports);
|
|
6
|
+
tslib_1.__exportStar(require("./generatePermutations"), exports);
|
|
6
7
|
tslib_1.__exportStar(require("./isArray"), exports);
|
|
@@ -9,7 +9,7 @@ export declare function withDefaultGetters<OPTION>(props: AutocompleteProps<OPTI
|
|
|
9
9
|
defaultValue?: import("./types").AutocompletePropValue<OPTION>;
|
|
10
10
|
open?: boolean;
|
|
11
11
|
defaultOpen?: boolean;
|
|
12
|
-
onChange?: ((e: import("react").SyntheticEvent | KeyboardEvent, value: OPTION | null) => void) | undefined;
|
|
12
|
+
onChange?: ((e: import("react").SyntheticEvent | KeyboardEvent | MouseEvent, value: OPTION | null) => void) | undefined;
|
|
13
13
|
inputValue?: string;
|
|
14
14
|
onInputChange?: (e: import("react").ChangeEvent<HTMLInputElement> | null, value: string) => void;
|
|
15
15
|
renderInput?: import("./types").AutocompleteRenderInput;
|
|
@@ -35,7 +35,7 @@ export type AutocompleteProps<OPTION = AutocompleteDefaultOption> = {
|
|
|
35
35
|
/** Состояние открытие по умолчанию (неконтролируемый компонент) */
|
|
36
36
|
defaultOpen?: boolean;
|
|
37
37
|
/** Функция обратного вызова, которая будет вызвана при выборе значения */
|
|
38
|
-
onChange?: (e: SyntheticEvent | KeyboardEvent, value: OPTION | null) => void;
|
|
38
|
+
onChange?: (e: SyntheticEvent | KeyboardEvent | MouseEvent, value: OPTION | null) => void;
|
|
39
39
|
/** Введённое значение в текстовом поле */
|
|
40
40
|
inputValue?: string;
|
|
41
41
|
/** Функция обратного вызова, которая будет вызвана при вводе значения с клавиатуры */
|
|
@@ -12,7 +12,7 @@ export type DataListPayload<MULTIPLE extends boolean> = {
|
|
|
12
12
|
name?: string;
|
|
13
13
|
value: DataListSelected<MULTIPLE>;
|
|
14
14
|
};
|
|
15
|
-
export type DataListOnSelect<MULTIPLE extends boolean> = (event: SyntheticEvent | KeyboardEvent, payload: DataListPayload<MULTIPLE>) => void;
|
|
15
|
+
export type DataListOnSelect<MULTIPLE extends boolean> = (event: SyntheticEvent | KeyboardEvent | MouseEvent, payload: DataListPayload<MULTIPLE>) => void;
|
|
16
16
|
export type DataListBaseProps<MULTIPLE extends boolean = false> = {
|
|
17
17
|
/** Имя списка */
|
|
18
18
|
name?: string;
|
|
@@ -79,10 +79,19 @@
|
|
|
79
79
|
}
|
|
80
80
|
|
|
81
81
|
.Select-RenderLeft,
|
|
82
|
-
.Select-
|
|
82
|
+
.Select-RenderRight_nonInteractive {
|
|
83
83
|
pointer-events: none;
|
|
84
84
|
}
|
|
85
85
|
|
|
86
|
+
.Select-ClearIcon {
|
|
87
|
+
visibility: hidden;
|
|
88
|
+
transition: visibility var(--transition-default);
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
.Select-ClearIcon_visibility {
|
|
92
|
+
visibility: visible;
|
|
93
|
+
}
|
|
94
|
+
|
|
86
95
|
.Select-DropDownIcon {
|
|
87
96
|
display: flex;
|
|
88
97
|
align-items: center;
|
|
@@ -1,39 +1,46 @@
|
|
|
1
1
|
import { __assign, __read, __rest, __spreadArray } from "tslib";
|
|
2
2
|
import './Select.css';
|
|
3
3
|
import React, { Children, forwardRef, isValidElement, useEffect, useRef, } from 'react';
|
|
4
|
+
import { logger } from '@ozen-ui/logger';
|
|
4
5
|
import { isFragment } from 'react-is';
|
|
5
6
|
import { useControlled } from '../../hooks/useControlled';
|
|
7
|
+
import { useDevEffect } from '../../hooks/useDevEffect';
|
|
6
8
|
import { useMultiRef } from '../../hooks/useMultiRef';
|
|
7
9
|
import { useThemeProps } from '../../hooks/useThemeProps';
|
|
8
|
-
import {
|
|
10
|
+
import { isArray, isNotNil } from '../../utils';
|
|
9
11
|
import { isKeys } from '../../utils/isKeys';
|
|
10
12
|
import { isString } from '../../utils/isString';
|
|
11
13
|
import { DataList, DataListOption } from '../DataList';
|
|
12
14
|
import { SelectInput } from './components';
|
|
13
|
-
import { SELECT_DEFAULT_AUTO_FOCUS, SELECT_DEFAULT_DEFAULT_OPEN, SELECT_DEFAULT_DISABLED, SELECT_DEFAULT_FULL_WIDTH, SELECT_DEFAULT_MULTILINE, SELECT_DEFAULT_REQUIRED, SELECT_DEFAULT_SIZE, } from './constants';
|
|
15
|
+
import { SELECT_DEFAULT_AUTO_FOCUS, SELECT_DEFAULT_DEFAULT_OPEN, SELECT_DEFAULT_DISABLED, SELECT_DEFAULT_FULL_WIDTH, SELECT_DEFAULT_RENDER_RIGHT_LAYOUT, SELECT_DEFAULT_MULTILINE, SELECT_DEFAULT_REQUIRED, SELECT_DEFAULT_SIZE, SELECT_DEFAULT_SHOW_CLEAR_BUTTON, SELECT_DEFAULT_ERROR, } from './constants';
|
|
14
16
|
import { isMultipleLabel, isMultipleParams, isNotMultipleLabel, isNotMultipleParams, } from './helpers';
|
|
15
|
-
|
|
17
|
+
import { SelectContext } from './SelectContext';
|
|
16
18
|
var SelectRender = function (inProps, ref) {
|
|
17
19
|
var props = useThemeProps({
|
|
18
20
|
props: inProps,
|
|
19
21
|
name: 'Select',
|
|
20
22
|
});
|
|
21
|
-
var _a = props.size, size = _a === void 0 ? SELECT_DEFAULT_SIZE : _a, _b = props.autoFocus, autoFocus = _b === void 0 ? SELECT_DEFAULT_AUTO_FOCUS : _b, _c = props.fullWidth, fullWidth = _c === void 0 ? SELECT_DEFAULT_FULL_WIDTH : _c, _d = props.disabled, disabled = _d === void 0 ? SELECT_DEFAULT_DISABLED : _d, _e = props.required, required = _e === void 0 ? SELECT_DEFAULT_REQUIRED : _e, _f = props.multiline, multiline = _f === void 0 ? SELECT_DEFAULT_MULTILINE : _f, _g = props.defaultOpen, defaultOpen = _g === void 0 ? SELECT_DEFAULT_DEFAULT_OPEN : _g, valueProp = props.value, defaultValue = props.defaultValue, onChange = props.onChange, renderValueProp = props.renderValue, children = props.children, onClick = props.onClick, onKeyDown = props.onKeyDown, menuProps = props.menuProps, dataListPropsProp = props.dataListProps, bodyProps = props.bodyProps, bodyRefProp = props.bodyRef, onCloseProp = props.onClose, onOpenProp = props.onOpen, openProp = props.open, multiple = props.multiple, other = __rest(props, ["size", "autoFocus", "fullWidth", "disabled", "required", "multiline", "defaultOpen", "value", "defaultValue", "onChange", "renderValue", "children", "onClick", "onKeyDown", "menuProps", "dataListProps", "bodyProps", "bodyRef", "onClose", "onOpen", "open", "multiple"]);
|
|
23
|
+
var _a = props.size, size = _a === void 0 ? SELECT_DEFAULT_SIZE : _a, _b = props.autoFocus, autoFocus = _b === void 0 ? SELECT_DEFAULT_AUTO_FOCUS : _b, _c = props.fullWidth, fullWidth = _c === void 0 ? SELECT_DEFAULT_FULL_WIDTH : _c, _d = props.disabled, disabled = _d === void 0 ? SELECT_DEFAULT_DISABLED : _d, _e = props.required, required = _e === void 0 ? SELECT_DEFAULT_REQUIRED : _e, _f = props.multiline, multiline = _f === void 0 ? SELECT_DEFAULT_MULTILINE : _f, _g = props.defaultOpen, defaultOpen = _g === void 0 ? SELECT_DEFAULT_DEFAULT_OPEN : _g, _h = props.renderRightLayout, renderRightLayout = _h === void 0 ? SELECT_DEFAULT_RENDER_RIGHT_LAYOUT : _h, valueProp = props.value, defaultValue = props.defaultValue, onChange = props.onChange, renderValueProp = props.renderValue, children = props.children, onClick = props.onClick, onKeyDown = props.onKeyDown, menuProps = props.menuProps, dataListPropsProp = props.dataListProps, bodyProps = props.bodyProps, bodyRefProp = props.bodyRef, onCloseProp = props.onClose, onOpenProp = props.onOpen, openProp = props.open, multiple = props.multiple, _j = props.showClearButton, showClearButton = _j === void 0 ? SELECT_DEFAULT_SHOW_CLEAR_BUTTON : _j, renderLeft = props.renderLeft, renderRight = props.renderRight, onClearProp = props.onClear, clearText = props.clearText, _k = props.error, error = _k === void 0 ? SELECT_DEFAULT_ERROR : _k, other = __rest(props, ["size", "autoFocus", "fullWidth", "disabled", "required", "multiline", "defaultOpen", "renderRightLayout", "value", "defaultValue", "onChange", "renderValue", "children", "onClick", "onKeyDown", "menuProps", "dataListProps", "bodyProps", "bodyRef", "onClose", "onOpen", "open", "multiple", "showClearButton", "renderLeft", "renderRight", "onClear", "clearText", "error"]);
|
|
24
|
+
useDevEffect(function () {
|
|
25
|
+
if (renderRightLayout.length !== new Set(renderRightLayout).size) {
|
|
26
|
+
logger.error("\u0412 renderRightLayout [".concat(renderRightLayout.map(function (element) { return "\"".concat(element, "\""); }).join(', '), "] \u0435\u0441\u0442\u044C \u0434\u0443\u0431\u043B\u0438\u0440\u0443\u044E\u0449\u0438\u0435 \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u044B, \u043F\u0435\u0440\u0435\u043F\u0440\u043E\u0432\u0435\u0440\u044C\u0442\u0435 \u043F\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0435\u043C\u044B\u0435 \u0434\u0430\u043D\u043D\u044B\u0435."));
|
|
27
|
+
}
|
|
28
|
+
}, [renderRightLayout]);
|
|
22
29
|
var bodyInnerRef = useRef(null);
|
|
23
30
|
var bodyRef = useMultiRef([(bodyProps === null || bodyProps === void 0 ? void 0 : bodyProps.ref) || bodyRefProp, bodyInnerRef]);
|
|
24
31
|
var dataListProps = dataListPropsProp || menuProps;
|
|
25
|
-
var
|
|
32
|
+
var _l = __read(useControlled({
|
|
26
33
|
value: valueProp,
|
|
27
34
|
defaultValue: defaultValue,
|
|
28
35
|
name: 'Select',
|
|
29
36
|
state: 'value',
|
|
30
|
-
}), 2), valueState =
|
|
31
|
-
var
|
|
37
|
+
}), 2), valueState = _l[0], setValueState = _l[1];
|
|
38
|
+
var _m = __read(useControlled({
|
|
32
39
|
value: openProp,
|
|
33
40
|
defaultValue: defaultOpen,
|
|
34
41
|
name: 'Select',
|
|
35
42
|
state: 'open',
|
|
36
|
-
}), 2), open =
|
|
43
|
+
}), 2), open = _m[0], setOpen = _m[1];
|
|
37
44
|
var currentLabel;
|
|
38
45
|
var isNotSelectOption = function (child) { return !isValidElement(child) || child.type !== DataListOption; };
|
|
39
46
|
var resolvedChildren = isFragment(children)
|
|
@@ -122,8 +129,16 @@ var SelectRender = function (inProps, ref) {
|
|
|
122
129
|
return (params === null || params === void 0 ? void 0 : params.value) || '';
|
|
123
130
|
return '';
|
|
124
131
|
};
|
|
132
|
+
var onClear = function (event) {
|
|
133
|
+
setValueState(undefined);
|
|
134
|
+
onChange === null || onChange === void 0 ? void 0 : onChange(undefined, event);
|
|
135
|
+
onClearProp === null || onClearProp === void 0 ? void 0 : onClearProp(event);
|
|
136
|
+
};
|
|
125
137
|
/** Представление значение элемента контроля */
|
|
126
138
|
var renderValue = renderValueProp || renderDefaultValue;
|
|
139
|
+
var hasValue = isArray(valueState)
|
|
140
|
+
? valueState.length > 0
|
|
141
|
+
: isNotNil(valueState);
|
|
127
142
|
useEffect(function () {
|
|
128
143
|
var _a;
|
|
129
144
|
/** Устанавливает фокус на элементе контроля
|
|
@@ -138,8 +153,23 @@ var SelectRender = function (inProps, ref) {
|
|
|
138
153
|
if (autoFocus)
|
|
139
154
|
(_a = bodyInnerRef.current) === null || _a === void 0 ? void 0 : _a.focus();
|
|
140
155
|
}, [autoFocus]);
|
|
141
|
-
return (React.createElement(
|
|
142
|
-
|
|
156
|
+
return (React.createElement(SelectContext.Provider, { value: {
|
|
157
|
+
open: open !== null && open !== void 0 ? open : false,
|
|
158
|
+
hasValue: hasValue,
|
|
159
|
+
size: size,
|
|
160
|
+
disabled: disabled,
|
|
161
|
+
renderRightLayout: renderRightLayout,
|
|
162
|
+
showClearButton: showClearButton,
|
|
163
|
+
fullWidth: fullWidth,
|
|
164
|
+
required: required,
|
|
165
|
+
multiline: multiline,
|
|
166
|
+
onClear: onClear,
|
|
167
|
+
clearText: clearText !== null && clearText !== void 0 ? clearText : '',
|
|
168
|
+
renderRight: renderRight,
|
|
169
|
+
renderLeft: renderLeft,
|
|
170
|
+
error: error,
|
|
171
|
+
} },
|
|
172
|
+
React.createElement(SelectInput, __assign({}, other, { value: inputValue(), onClick: handleClick, onKeyDown: handleKeyDown, renderedValue: renderValue({
|
|
143
173
|
label: currentLabel,
|
|
144
174
|
value: valueState,
|
|
145
175
|
}), bodyProps: __assign(__assign({}, bodyProps), { ref: bodyRef }), ref: ref })),
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { SelectOnClear, SelectRenderLeft, SelectRenderRight, SelectRenderRightLayout } from './entities';
|
|
2
|
+
import type { SelectPropSize } from './types';
|
|
3
|
+
export type SelectContextValue = {
|
|
4
|
+
renderRightLayout: SelectRenderRightLayout;
|
|
5
|
+
size: SelectPropSize;
|
|
6
|
+
open: boolean;
|
|
7
|
+
disabled: boolean;
|
|
8
|
+
hasValue: boolean;
|
|
9
|
+
onClear: SelectOnClear;
|
|
10
|
+
renderLeft: SelectRenderLeft;
|
|
11
|
+
renderRight: SelectRenderRight;
|
|
12
|
+
clearText: string;
|
|
13
|
+
showClearButton: boolean;
|
|
14
|
+
required: boolean;
|
|
15
|
+
multiline: boolean;
|
|
16
|
+
fullWidth: boolean;
|
|
17
|
+
error: boolean;
|
|
18
|
+
};
|
|
19
|
+
export declare const SelectContextDefaultValue: SelectContextValue;
|
|
20
|
+
export declare const SelectContext: import("react").Context<SelectContextValue>;
|
|
21
|
+
export declare const useSelectContext: () => SelectContextValue;
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { useContext, createContext } from 'react';
|
|
2
|
+
import { isDev } from '../../constants/environment';
|
|
3
|
+
import { SELECT_DEFAULT_RENDER_RIGHT_LAYOUT, SELECT_DEFAULT_SIZE, SELECT_DEFAULT_DEFAULT_OPEN, SELECT_DEFAULT_DISABLED, SELECT_DEFAULT_SHOW_CLEAR_BUTTON, SELECT_DEFAULT_REQUIRED, SELECT_DEFAULT_MULTILINE, SELECT_DEFAULT_FULL_WIDTH, } from './constants';
|
|
4
|
+
export var SelectContextDefaultValue = {
|
|
5
|
+
renderRightLayout: SELECT_DEFAULT_RENDER_RIGHT_LAYOUT,
|
|
6
|
+
disabled: SELECT_DEFAULT_DISABLED,
|
|
7
|
+
size: SELECT_DEFAULT_SIZE,
|
|
8
|
+
open: SELECT_DEFAULT_DEFAULT_OPEN,
|
|
9
|
+
hasValue: false,
|
|
10
|
+
onClear: function () { },
|
|
11
|
+
clearText: '',
|
|
12
|
+
renderLeft: undefined,
|
|
13
|
+
renderRight: undefined,
|
|
14
|
+
showClearButton: SELECT_DEFAULT_SHOW_CLEAR_BUTTON,
|
|
15
|
+
required: SELECT_DEFAULT_REQUIRED,
|
|
16
|
+
multiline: SELECT_DEFAULT_MULTILINE,
|
|
17
|
+
fullWidth: SELECT_DEFAULT_FULL_WIDTH,
|
|
18
|
+
error: false,
|
|
19
|
+
};
|
|
20
|
+
export var SelectContext = createContext(SelectContextDefaultValue);
|
|
21
|
+
export var useSelectContext = function () { return useContext(SelectContext); };
|
|
22
|
+
// Именованный провайдер
|
|
23
|
+
if (isDev) {
|
|
24
|
+
SelectContext.displayName = 'SelectContext';
|
|
25
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const cnSelect: import("@bem-react/classname").ClassNameFormatter;
|
|
@@ -1,20 +1,20 @@
|
|
|
1
1
|
import { __assign, __read, __rest } from "tslib";
|
|
2
2
|
import '../../Select.css';
|
|
3
3
|
import React, { forwardRef, useCallback } from 'react';
|
|
4
|
-
import { classnames } from '@bem-react/classnames';
|
|
5
|
-
import { ChevronDownIcon } from '@ozen-ui/icons';
|
|
6
4
|
import { useBoolean } from '../../../../hooks/useBoolean';
|
|
7
5
|
import { FieldControl } from '../../../FieldControl';
|
|
8
6
|
import { FieldHint } from '../../../FieldHint';
|
|
9
7
|
import { FieldIcon } from '../../../FieldIcon';
|
|
10
8
|
import { FieldLabel } from '../../../FieldLabel';
|
|
11
9
|
import { Fieldset } from '../../../Fieldset';
|
|
12
|
-
import {
|
|
13
|
-
import {
|
|
10
|
+
import { cnSelect } from '../../classNames';
|
|
11
|
+
import { useSelectContext } from '../../SelectContext';
|
|
14
12
|
import { SelectInputContextConsumer } from '../SelectInputContextConsumer';
|
|
13
|
+
import { SelectInputRenderRight } from '../SelectInputRenderRight';
|
|
15
14
|
export var SelectInput = forwardRef(function (_a, ref) {
|
|
16
|
-
var
|
|
17
|
-
var
|
|
15
|
+
var label = _a.label, id = _a.id, name = _a.name, renderedValue = _a.renderedValue, hint = _a.hint, className = _a.className, inputProps = _a.inputProps, valueProp = _a.value, placeholderProp = _a.placeholder, defaultValue = _a.defaultValue, onFocus = _a.onFocus, onBlur = _a.onBlur, onClick = _a.onClick, onKeyDown = _a.onKeyDown, labelProps = _a.labelProps, fieldProps = _a.fieldProps, hintProps = _a.hintProps, labelRef = _a.labelRef, inputRef = _a.inputRef, fieldRef = _a.fieldRef, bodyProps = _a.bodyProps, other = __rest(_a, ["label", "id", "name", "renderedValue", "hint", "className", "inputProps", "value", "placeholder", "defaultValue", "onFocus", "onBlur", "onClick", "onKeyDown", "labelProps", "fieldProps", "hintProps", "labelRef", "inputRef", "fieldRef", "bodyProps"]);
|
|
16
|
+
var _b = useSelectContext(), open = _b.open, required = _b.required, disabled = _b.disabled, fullWidth = _b.fullWidth, renderLeft = _b.renderLeft, multiline = _b.multiline, size = _b.size, error = _b.error;
|
|
17
|
+
var _c = __read(useBoolean(), 2), focused = _c[0], _d = _c[1], on = _d.on, off = _d.off;
|
|
18
18
|
var filled = !!valueProp || valueProp === 0;
|
|
19
19
|
var handleFocus = useCallback(function (e) {
|
|
20
20
|
on();
|
|
@@ -31,8 +31,7 @@ export var SelectInput = forwardRef(function (_a, ref) {
|
|
|
31
31
|
React.createElement("div", { className: cnSelect('HiddenLabel'), "aria-hidden": true }, label),
|
|
32
32
|
React.createElement(FieldLabel, __assign({}, labelProps, { className: cnSelect('Label', [labelProps === null || labelProps === void 0 ? void 0 : labelProps.className]), ref: (labelProps === null || labelProps === void 0 ? void 0 : labelProps.ref) || labelRef }), label),
|
|
33
33
|
React.createElement(SelectInputContextConsumer, { id: id, name: name, value: valueProp, fieldProps: fieldProps, inputProps: inputProps, defaultValue: defaultValue, renderedValue: renderedValue, placeholder: placeholderProp, fieldRef: (fieldProps === null || fieldProps === void 0 ? void 0 : fieldProps.ref) || fieldRef, inputRef: (inputProps === null || inputProps === void 0 ? void 0 : inputProps.ref) || inputRef })),
|
|
34
|
-
React.createElement(
|
|
35
|
-
React.createElement(FieldIcon, { icon: ChevronDownIcon, className: classnames(cnSelect('RenderRight'), cnSelect('DropDownIcon', { open: open })) }),
|
|
34
|
+
React.createElement(SelectInputRenderRight, null),
|
|
36
35
|
React.createElement(Fieldset, { className: cnSelect('Fieldset') })),
|
|
37
36
|
React.createElement(FieldHint, __assign({}, hintProps), hint)));
|
|
38
37
|
});
|
|
@@ -1,10 +1,7 @@
|
|
|
1
1
|
import type { ComponentPropsWithRef, ComponentRef, ReactNode, Ref } from 'react';
|
|
2
2
|
import type { ExtendableComponentPropsWithRef } from '../../../../types/ExtendableComponentPropsWithRef';
|
|
3
|
-
import type { FormElementSizeVariant } from '../../../../types/FormElementSizeVariant';
|
|
4
3
|
import type { FieldHintProps } from '../../../FieldHint';
|
|
5
|
-
import type { FieldIconProps } from '../../../FieldIcon';
|
|
6
4
|
import type { FieldLabelProps } from '../../../FieldLabel';
|
|
7
|
-
export type SelectInputSizeVariant = FormElementSizeVariant;
|
|
8
5
|
type LabelProps = FieldLabelProps;
|
|
9
6
|
type HintProps = FieldHintProps;
|
|
10
7
|
type InputProps = ComponentPropsWithRef<'input'> & {
|
|
@@ -46,31 +43,14 @@ export type SelectInputProps = ExtendableComponentPropsWithRef<{
|
|
|
46
43
|
name?: string;
|
|
47
44
|
/** Лейбл */
|
|
48
45
|
label?: string;
|
|
49
|
-
/** Размер компонента */
|
|
50
|
-
size?: SelectInputSizeVariant;
|
|
51
46
|
/** Подсказка. Отображается, когда вариант не выбран */
|
|
52
47
|
placeholder?: string;
|
|
53
48
|
/** Если `true` устанавливает автофокус */
|
|
54
49
|
autoFocus?: boolean;
|
|
55
|
-
/** Если `true` переводит поле в состояние ошибки */
|
|
56
|
-
error?: boolean;
|
|
57
|
-
/** Если `true` растягивает поле на всю ширину */
|
|
58
|
-
fullWidth?: boolean;
|
|
59
50
|
/** Дополнительное описание к полю */
|
|
60
51
|
hint?: string | null | undefined;
|
|
61
|
-
/** Если `true` делает элемент неактивным */
|
|
62
|
-
disabled?: boolean;
|
|
63
|
-
/** Если `true` делает элемент обязательным к заполнению */
|
|
64
|
-
required?: boolean;
|
|
65
52
|
/** Если `true` отключает обводку */
|
|
66
53
|
disableStroke?: boolean;
|
|
67
|
-
/** Если `true` предотвращает сокращение текста в значении и
|
|
68
|
-
* задает гибкую высоту контейнера компонента */
|
|
69
|
-
multiline?: boolean;
|
|
70
|
-
/** Текст или иконка слева */
|
|
71
|
-
renderLeft?: FieldIconProps['icon'];
|
|
72
|
-
/** Текст или иконка справа */
|
|
73
|
-
renderRight?: FieldIconProps['icon'];
|
|
74
54
|
/** Значение для отображения */
|
|
75
55
|
renderedValue?: ReactNode;
|
|
76
56
|
/** Выбранное значение */
|
|
@@ -87,8 +67,6 @@ export type SelectInputProps = ExtendableComponentPropsWithRef<{
|
|
|
87
67
|
bodyProps?: BodyProps;
|
|
88
68
|
/** Cвойства FieldHint */
|
|
89
69
|
hintProps?: Omit<HintProps, 'children'>;
|
|
90
|
-
/** Признак раскрытого списка */
|
|
91
|
-
open?: boolean;
|
|
92
70
|
/** Идентификатор компонента для тестов */
|
|
93
71
|
'data-testid'?: string;
|
|
94
72
|
/** Содержимое компонента */
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { __assign, __read } from "tslib";
|
|
2
2
|
import React from 'react';
|
|
3
3
|
import { useFieldControl } from '../../../FieldControl';
|
|
4
|
-
import { cnSelect } from '../../
|
|
4
|
+
import { cnSelect } from '../../classNames';
|
|
5
5
|
export var SelectInputContextConsumer = function (_a) {
|
|
6
6
|
var id = _a.id, name = _a.name, _b = _a.value, valueProp = _b === void 0 ? '' : _b, placeholderProp = _a.placeholder, defaultValue = _a.defaultValue, inputProps = _a.inputProps, inputRef = _a.inputRef, fieldRef = _a.fieldRef, fieldProps = _a.fieldProps, renderedValue = _a.renderedValue;
|
|
7
7
|
var context = useFieldControl();
|
package/__inner__/esm/components/Select/components/SelectInputRenderRight/SelectInputRenderRight.js
ADDED
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { __read } from "tslib";
|
|
2
|
+
import React from 'react';
|
|
3
|
+
import { classnames } from '@bem-react/classnames';
|
|
4
|
+
import { ChevronDownIcon, CrossIcon } from '@ozen-ui/icons';
|
|
5
|
+
import { useFieldControl } from '../../../FieldControl';
|
|
6
|
+
import { FieldIcon } from '../../../FieldIcon';
|
|
7
|
+
import { IconButton } from '../../../IconButtonNext';
|
|
8
|
+
import { cnSelect } from '../../classNames';
|
|
9
|
+
import { useSelectContext } from '../../SelectContext';
|
|
10
|
+
export var SelectInputRenderRight = function () {
|
|
11
|
+
var _a = __read(useFieldControl(), 1), _b = _a[0], focused = _b.focused, hovered = _b.hovered;
|
|
12
|
+
var _c = useSelectContext(), hasValue = _c.hasValue, open = _c.open, onClear = _c.onClear, renderRight = _c.renderRight, clearText = _c.clearText, renderRightLayout = _c.renderRightLayout, showClearButton = _c.showClearButton, size = _c.size;
|
|
13
|
+
var isVisibleClearButton = !!(hovered || open || focused) && hasValue;
|
|
14
|
+
var clearButton = (React.createElement(IconButton, { key: "clear", tabIndex: -1, size: size, variant: "function", icon: CrossIcon, title: clearText, "aria-label": clearText, onClick: function (event) {
|
|
15
|
+
event.preventDefault();
|
|
16
|
+
event.stopPropagation();
|
|
17
|
+
onClear === null || onClear === void 0 ? void 0 : onClear(event);
|
|
18
|
+
}, className: classnames(cnSelect('RenderRight'), cnSelect('ClearIcon', {
|
|
19
|
+
visibility: isVisibleClearButton,
|
|
20
|
+
})), compressed: true }));
|
|
21
|
+
return (React.createElement(React.Fragment, null,
|
|
22
|
+
showClearButton && !isVisibleClearButton && clearButton,
|
|
23
|
+
renderRightLayout.map(function (element) {
|
|
24
|
+
if (element === 'suffix') {
|
|
25
|
+
return (React.createElement(FieldIcon, { key: element, icon: renderRight, className: classnames(cnSelect('RenderRight', { nonInteractive: true }), cnSelect('Suffix')) }));
|
|
26
|
+
}
|
|
27
|
+
if (element === 'clear') {
|
|
28
|
+
if (!isVisibleClearButton || !showClearButton) {
|
|
29
|
+
return null;
|
|
30
|
+
}
|
|
31
|
+
return clearButton;
|
|
32
|
+
}
|
|
33
|
+
if (element === 'chevron') {
|
|
34
|
+
return (React.createElement(FieldIcon, { key: element, icon: ChevronDownIcon, className: classnames(cnSelect('RenderRight', { nonInteractive: true }), cnSelect('DropDownIcon', { open: open })) }));
|
|
35
|
+
}
|
|
36
|
+
throw new Error("\u042D\u043B\u0435\u043C\u0435\u043D\u0442 \"".concat(element, "\" \u043D\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u0432 renderRight."));
|
|
37
|
+
})));
|
|
38
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './SelectInputRenderRight';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './SelectInputRenderRight';
|
|
@@ -5,3 +5,6 @@ export declare const SELECT_DEFAULT_REQUIRED = false;
|
|
|
5
5
|
export declare const SELECT_DEFAULT_MULTILINE = false;
|
|
6
6
|
export declare const SELECT_DEFAULT_DEFAULT_OPEN = false;
|
|
7
7
|
export declare const SELECT_DEFAULT_SIZE = "m";
|
|
8
|
+
export declare const SELECT_DEFAULT_ERROR = false;
|
|
9
|
+
export declare const SELECT_DEFAULT_RENDER_RIGHT_LAYOUT: ("clear" | "suffix" | "chevron")[];
|
|
10
|
+
export declare const SELECT_DEFAULT_SHOW_CLEAR_BUTTON = false;
|
|
@@ -5,3 +5,10 @@ export var SELECT_DEFAULT_REQUIRED = false;
|
|
|
5
5
|
export var SELECT_DEFAULT_MULTILINE = false;
|
|
6
6
|
export var SELECT_DEFAULT_DEFAULT_OPEN = false;
|
|
7
7
|
export var SELECT_DEFAULT_SIZE = 'm';
|
|
8
|
+
export var SELECT_DEFAULT_ERROR = false;
|
|
9
|
+
export var SELECT_DEFAULT_RENDER_RIGHT_LAYOUT = [
|
|
10
|
+
'suffix',
|
|
11
|
+
'clear',
|
|
12
|
+
'chevron',
|
|
13
|
+
];
|
|
14
|
+
export var SELECT_DEFAULT_SHOW_CLEAR_BUTTON = false;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { FieldIconProps } from '../../FieldIcon';
|
|
2
|
+
export declare const selectRenderRightElement: readonly ["suffix", "clear", "chevron"];
|
|
3
|
+
export type SelectRenderRightElement = (typeof selectRenderRightElement)[number];
|
|
4
|
+
export type SelectRenderRightLayout = SelectRenderRightElement[];
|
|
5
|
+
export type SelectRenderLeft = FieldIconProps['icon'];
|
|
6
|
+
export type SelectRenderRight = FieldIconProps['icon'];
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export var selectRenderRightElement = ['suffix', 'clear', 'chevron'];
|
|
@@ -1,13 +1,14 @@
|
|
|
1
1
|
import type { ReactElement, ReactNode, SyntheticEvent } from 'react';
|
|
2
|
-
import type { ExtendableComponentPropsWithRef } from '../../types
|
|
3
|
-
import type { FormElementSizeVariant } from '../../types/FormElementSizeVariant';
|
|
2
|
+
import type { ExtendableComponentPropsWithRef } from '../../types';
|
|
4
3
|
import type { WithDisplayName } from '../../types/react';
|
|
5
4
|
import type { DataListBaseProps, DataListOptionProps, DataListSelected } from '../DataList';
|
|
6
5
|
import type { SelectInputProps, SelectInputRef } from './components';
|
|
7
|
-
|
|
6
|
+
import type { SelectOnClear, SelectRenderLeft, SelectRenderRight, SelectRenderRightLayout } from './entities';
|
|
7
|
+
export declare const selectSizeVariant: readonly ["2xs", "xs", "s", "m", "l"];
|
|
8
|
+
export type SelectPropSize = (typeof selectSizeVariant)[number];
|
|
8
9
|
export type SelectLabel<MULTIPLE extends boolean = false> = (MULTIPLE extends true ? DataListOptionProps['label'][] : DataListOptionProps['label']) | undefined;
|
|
9
10
|
export type SelectPropValue<MULTIPLE extends boolean = false> = DataListSelected<MULTIPLE>;
|
|
10
|
-
export type SelectPropOnChange<MULTIPLE extends boolean = false> = (value: SelectPropValue<MULTIPLE>, e: SyntheticEvent | KeyboardEvent) => void;
|
|
11
|
+
export type SelectPropOnChange<MULTIPLE extends boolean = false> = (value: SelectPropValue<MULTIPLE>, e: SyntheticEvent | KeyboardEvent | MouseEvent) => void;
|
|
11
12
|
export type SelectedOption<MULTIPLE extends boolean = false> = {
|
|
12
13
|
label?: SelectLabel<MULTIPLE>;
|
|
13
14
|
value?: SelectPropValue<MULTIPLE>;
|
|
@@ -60,6 +61,30 @@ export type SelectProps<MULTIPLE extends boolean = false> = ExtendableComponentP
|
|
|
60
61
|
renderValue?: SelectPropRenderValue<MULTIPLE>;
|
|
61
62
|
/** Содержимое компонента */
|
|
62
63
|
children?: ReactNode;
|
|
64
|
+
/** Layout правой части инпута.
|
|
65
|
+
* Определяет порядок и наличие элементов */
|
|
66
|
+
renderRightLayout?: SelectRenderRightLayout;
|
|
67
|
+
/** Функция обратного вызова, которая вызывается при очистке значения поля */
|
|
68
|
+
onClear?: SelectOnClear;
|
|
69
|
+
/** Текст для кнопки очистки поля */
|
|
70
|
+
clearText?: string;
|
|
71
|
+
/** Если `true`, то отображает кнопку закрытия */
|
|
72
|
+
showClearButton?: boolean;
|
|
73
|
+
/** Текст или иконка слева */
|
|
74
|
+
renderLeft?: SelectRenderLeft;
|
|
75
|
+
/** Текст или иконка справа */
|
|
76
|
+
renderRight?: SelectRenderRight;
|
|
77
|
+
/** Если `true` растягивает поле на всю ширину */
|
|
78
|
+
fullWidth?: boolean;
|
|
79
|
+
/** Если `true` предотвращает сокращение текста в значении и
|
|
80
|
+
* задает гибкую высоту контейнера компонента */
|
|
81
|
+
multiline?: boolean;
|
|
82
|
+
/** Если `true` делает элемент неактивным */
|
|
83
|
+
disabled?: boolean;
|
|
84
|
+
/** Если `true` делает элемент обязательным к заполнению */
|
|
85
|
+
required?: boolean;
|
|
86
|
+
/** Если `true` переводит поле в состояние ошибки */
|
|
87
|
+
error?: boolean;
|
|
63
88
|
/** Свойства компонента DataList */
|
|
64
89
|
dataListProps?: Partial<Omit<DataListBaseProps<MULTIPLE>, 'onClose' | 'open' | 'anchorRef' | 'multiple' | 'selected' | 'onSelect'>>;
|
|
65
90
|
/** Функция обратного вызова, которая будет вызвана когда компонент запрашивает закрытие */
|
|
@@ -70,6 +95,6 @@ export type SelectProps<MULTIPLE extends boolean = false> = ExtendableComponentP
|
|
|
70
95
|
multiple?: MULTIPLE;
|
|
71
96
|
/** Идентификатор компонента для тестов */
|
|
72
97
|
'data-testid'?: string;
|
|
73
|
-
} & Pick<SelectInputProps, 'id' | 'name' | 'label' | 'placeholder' | '
|
|
98
|
+
} & Pick<SelectInputProps, 'id' | 'name' | 'label' | 'placeholder' | 'disableStroke' | 'hint' | 'inputProps' | 'labelProps' | 'hintProps' | 'bodyProps' | 'inputRef' | 'labelRef' | 'bodyRef'> & SelectPropsDeprecated<MULTIPLE>, 'div'>;
|
|
74
99
|
export type SelectComponent = WithDisplayName<(<MULTIPLE extends boolean = false>(props: SelectProps<MULTIPLE>) => ReactElement | null)>;
|
|
75
100
|
export {};
|
|
@@ -1 +1,2 @@
|
|
|
1
|
-
|
|
1
|
+
import { formElementSizeVariant } from '../../types';
|
|
2
|
+
export var selectSizeVariant = formElementSizeVariant;
|
|
@@ -101,6 +101,9 @@ export var ruRU = {
|
|
|
101
101
|
return parts.join('.');
|
|
102
102
|
},
|
|
103
103
|
},
|
|
104
|
+
Select: {
|
|
105
|
+
clearText: 'Очистить',
|
|
106
|
+
},
|
|
104
107
|
},
|
|
105
108
|
};
|
|
106
109
|
export var kkKZ = {
|
|
@@ -205,6 +208,9 @@ export var kkKZ = {
|
|
|
205
208
|
return parts.join('.');
|
|
206
209
|
},
|
|
207
210
|
},
|
|
211
|
+
Select: {
|
|
212
|
+
clearText: 'Тазалау',
|
|
213
|
+
},
|
|
208
214
|
},
|
|
209
215
|
};
|
|
210
216
|
export var enUS = {
|
|
@@ -310,5 +316,8 @@ export var enUS = {
|
|
|
310
316
|
return parts.join('.');
|
|
311
317
|
},
|
|
312
318
|
},
|
|
319
|
+
Select: {
|
|
320
|
+
clearText: 'Clear',
|
|
321
|
+
},
|
|
313
322
|
},
|
|
314
323
|
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const generatePermutations: <Item>(array: Item[] | Readonly<Item[]>, withSubsetSizes?: boolean) => Item[][];
|