@salutejs/plasma-new-hope 0.242.0-canary.1702.12829190112.0 → 0.242.0-canary.1709.12829247465.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/cjs/components/Combobox/ComboboxNew/ui/Inner/Inner.js +1 -1
- package/cjs/components/Combobox/ComboboxNew/ui/Inner/Inner.js.map +1 -1
- package/cjs/components/DatePicker/RangeDate/RangeDate.js +21 -66
- package/cjs/components/DatePicker/RangeDate/RangeDate.js.map +1 -1
- package/cjs/components/Dropdown/ui/DropdownInner/DropdownInner.js +2 -1
- package/cjs/components/Dropdown/ui/DropdownInner/DropdownInner.js.map +1 -1
- package/cjs/components/Select/ui/Inner/Inner.js +1 -1
- package/cjs/components/Select/ui/Inner/Inner.js.map +1 -1
- package/emotion/cjs/components/Combobox/Combobox.template-doc.mdx +5 -0
- package/emotion/cjs/components/Combobox/ComboboxNew/ui/Inner/Inner.js +1 -1
- package/emotion/cjs/components/DatePicker/RangeDate/RangeDate.js +21 -66
- package/emotion/cjs/components/Dropdown/Dropdown.template-doc.mdx +4 -0
- package/emotion/cjs/components/Dropdown/ui/DropdownInner/DropdownInner.js +2 -1
- package/emotion/cjs/components/Select/Select.template-doc.mdx +441 -0
- package/emotion/cjs/components/Select/ui/Inner/Inner.js +1 -1
- package/emotion/cjs/examples/plasma_b2c/components/DatePicker/DatePicker.stories.tsx +7 -1
- package/emotion/cjs/examples/plasma_web/components/DatePicker/DatePicker.stories.tsx +7 -3
- package/emotion/es/components/Combobox/Combobox.template-doc.mdx +5 -0
- package/emotion/es/components/Combobox/ComboboxNew/ui/Inner/Inner.js +1 -1
- package/emotion/es/components/DatePicker/RangeDate/RangeDate.js +21 -66
- package/emotion/es/components/Dropdown/Dropdown.template-doc.mdx +4 -0
- package/emotion/es/components/Dropdown/ui/DropdownInner/DropdownInner.js +2 -1
- package/emotion/es/components/Select/Select.template-doc.mdx +441 -0
- package/emotion/es/components/Select/ui/Inner/Inner.js +1 -1
- package/emotion/es/examples/plasma_b2c/components/DatePicker/DatePicker.stories.tsx +7 -1
- package/emotion/es/examples/plasma_web/components/DatePicker/DatePicker.stories.tsx +7 -3
- package/es/components/Combobox/ComboboxNew/ui/Inner/Inner.js +1 -1
- package/es/components/Combobox/ComboboxNew/ui/Inner/Inner.js.map +1 -1
- package/es/components/DatePicker/RangeDate/RangeDate.js +21 -66
- package/es/components/DatePicker/RangeDate/RangeDate.js.map +1 -1
- package/es/components/Dropdown/ui/DropdownInner/DropdownInner.js +2 -1
- package/es/components/Dropdown/ui/DropdownInner/DropdownInner.js.map +1 -1
- package/es/components/Select/ui/Inner/Inner.js +1 -1
- package/es/components/Select/ui/Inner/Inner.js.map +1 -1
- package/package.json +2 -2
- package/styled-components/cjs/components/Combobox/Combobox.template-doc.mdx +5 -0
- package/styled-components/cjs/components/Combobox/ComboboxNew/ui/Inner/Inner.js +1 -1
- package/styled-components/cjs/components/DatePicker/RangeDate/RangeDate.js +21 -66
- package/styled-components/cjs/components/Dropdown/Dropdown.template-doc.mdx +4 -0
- package/styled-components/cjs/components/Dropdown/ui/DropdownInner/DropdownInner.js +2 -1
- package/styled-components/cjs/components/Select/Select.template-doc.mdx +441 -0
- package/styled-components/cjs/components/Select/ui/Inner/Inner.js +1 -1
- package/styled-components/cjs/examples/plasma_b2c/components/DatePicker/DatePicker.stories.tsx +7 -1
- package/styled-components/cjs/examples/plasma_web/components/DatePicker/DatePicker.stories.tsx +7 -3
- package/styled-components/es/components/Combobox/Combobox.template-doc.mdx +5 -0
- package/styled-components/es/components/Combobox/ComboboxNew/ui/Inner/Inner.js +1 -1
- package/styled-components/es/components/DatePicker/RangeDate/RangeDate.js +21 -66
- package/styled-components/es/components/Dropdown/Dropdown.template-doc.mdx +4 -0
- package/styled-components/es/components/Dropdown/ui/DropdownInner/DropdownInner.js +2 -1
- package/styled-components/es/components/Select/Select.template-doc.mdx +441 -0
- package/styled-components/es/components/Select/ui/Inner/Inner.js +1 -1
- package/styled-components/es/examples/plasma_b2c/components/DatePicker/DatePicker.stories.tsx +7 -1
- package/styled-components/es/examples/plasma_web/components/DatePicker/DatePicker.stories.tsx +7 -3
- package/types/components/Combobox/ComboboxNew/Combobox.types.d.ts +1 -1
- package/types/components/Combobox/ComboboxNew/Combobox.types.d.ts.map +1 -1
- package/types/components/Combobox/ComboboxNew/ui/Inner/ui/Item/Item.types.d.ts +6 -0
- package/types/components/Combobox/ComboboxNew/ui/Inner/ui/Item/Item.types.d.ts.map +1 -1
- package/types/components/DatePicker/RangeDate/RangeDate.d.ts +8 -10
- package/types/components/DatePicker/RangeDate/RangeDate.d.ts.map +1 -1
- package/types/components/DatePicker/RangeDate/RangeDate.styles.d.ts +12 -12
- package/types/components/DatePicker/RangeDate/RangeDate.types.d.ts +0 -4
- package/types/components/DatePicker/RangeDate/RangeDate.types.d.ts.map +1 -1
- package/types/components/DatePicker/SingleDate/SingleDate.types.d.ts +1 -1
- package/types/components/DatePicker/SingleDate/SingleDate.types.d.ts.map +1 -1
- package/types/components/Dropdown/ui/DropdownInner/DropdownInner.d.ts.map +1 -1
- package/types/components/Dropdown/ui/DropdownItem/DropdownItem.type.d.ts +5 -0
- package/types/components/Dropdown/ui/DropdownItem/DropdownItem.type.d.ts.map +1 -1
- package/types/components/Pagination/ui/PaginationSelectPerPage/PaginationSelectPerPage.styles.d.ts +4 -4
- package/types/components/Range/Range.types.d.ts +5 -5
- package/types/components/Range/Range.types.d.ts.map +1 -1
- package/types/components/Select/Select.types.d.ts +2 -2
- package/types/components/Select/Select.types.d.ts.map +1 -1
- package/types/components/Select/ui/Inner/ui/Item/Item.types.d.ts +11 -0
- package/types/components/Select/ui/Inner/ui/Item/Item.types.d.ts.map +1 -1
- package/types/examples/plasma_b2c/components/Combobox/Combobox.d.ts +24 -24
- package/types/examples/plasma_b2c/components/DatePicker/DatePicker.d.ts +4 -5
- package/types/examples/plasma_b2c/components/DatePicker/DatePicker.d.ts.map +1 -1
- package/types/examples/plasma_b2c/components/Range/Range.d.ts +12 -12
- package/types/examples/plasma_b2c/components/Select/Select.d.ts +4 -4
- package/types/examples/plasma_web/components/Combobox/Combobox.d.ts +24 -24
- package/types/examples/plasma_web/components/DatePicker/DatePicker.d.ts +4 -5
- package/types/examples/plasma_web/components/DatePicker/DatePicker.d.ts.map +1 -1
- package/types/examples/plasma_web/components/Range/Range.d.ts +12 -12
- package/types/examples/plasma_web/components/Select/Select.d.ts +4 -4
@@ -19,7 +19,7 @@ var _base3 = /*#__PURE__*/require("./variations/_disabled/base");
|
|
19
19
|
var _base4 = /*#__PURE__*/require("./variations/_readonly/base");
|
20
20
|
var _RangeDate = /*#__PURE__*/require("./RangeDate.styles");
|
21
21
|
var _RangeDatePopover = /*#__PURE__*/require("./RangeDatePopover/RangeDatePopover");
|
22
|
-
var _excluded = ["className", "autoComplete", "isDoubleCalendar", "opened", "label", "leftHelper", "contentLeft", "contentRight", "view", "size", "readOnly", "disabled", "name", "dividerVariant", "dividerIcon", "defaultFirstDate", "defaultSecondDate", "firstValueError", "secondValueError", "firstValueSuccess", "secondValueSuccess", "firstPlaceholder", "secondPlaceholder", "firstTextfieldContentLeft", "firstTextfieldContentRight", "secondTextfieldContentLeft", "secondTextfieldContentRight", "firstTextfieldTextBefore", "secondTextfieldTextBefore", "firstTextfieldTextAfter", "secondTextfieldTextAfter", "required", "requiredPlacement", "format", "lang", "maskWithFormat", "min", "max", "includeEdgeDates", "eventList", "disabledList", "eventMonthList", "disabledMonthList", "eventQuarterList", "disabledQuarterList", "eventYearList", "disabledYearList", "type", "frame", "usePortal", "placement", "closeOnOverlayClick", "closeOnEsc", "
|
22
|
+
var _excluded = ["className", "autoComplete", "isDoubleCalendar", "opened", "label", "leftHelper", "contentLeft", "contentRight", "view", "size", "readOnly", "disabled", "name", "dividerVariant", "dividerIcon", "defaultFirstDate", "defaultSecondDate", "firstValueError", "secondValueError", "firstValueSuccess", "secondValueSuccess", "firstPlaceholder", "secondPlaceholder", "firstTextfieldContentLeft", "firstTextfieldContentRight", "secondTextfieldContentLeft", "secondTextfieldContentRight", "firstTextfieldTextBefore", "secondTextfieldTextBefore", "firstTextfieldTextAfter", "secondTextfieldTextAfter", "required", "requiredPlacement", "format", "lang", "maskWithFormat", "min", "max", "includeEdgeDates", "eventList", "disabledList", "eventMonthList", "disabledMonthList", "eventQuarterList", "disabledQuarterList", "eventYearList", "disabledYearList", "type", "frame", "usePortal", "placement", "closeOnOverlayClick", "closeOnEsc", "offset", "onToggle", "onChange", "onChangeFirstValue", "onChangeSecondValue", "onCommitFirstDate", "onCommitSecondDate", "onFocusFirstTextfield", "onFocusSecondTextfield", "onBlurFirstTextfield", "onBlurSecondTextfield"];
|
23
23
|
function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(e) { return e ? t : r; })(e); }
|
24
24
|
function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != _typeof(e) && "function" != typeof e) return { "default": e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n["default"] = e, t && t.set(e, n), n; }
|
25
25
|
function _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
|
@@ -104,8 +104,6 @@ var datePickerRangeRoot = exports.datePickerRangeRoot = function datePickerRange
|
|
104
104
|
closeOnOverlayClick = _ref$closeOnOverlayCl === void 0 ? true : _ref$closeOnOverlayCl,
|
105
105
|
_ref$closeOnEsc = _ref.closeOnEsc,
|
106
106
|
closeOnEsc = _ref$closeOnEsc === void 0 ? true : _ref$closeOnEsc,
|
107
|
-
_ref$closeAfterDateSe = _ref.closeAfterDateSelect,
|
108
|
-
closeAfterDateSelect = _ref$closeAfterDateSe === void 0 ? true : _ref$closeAfterDateSe,
|
109
107
|
offset = _ref.offset,
|
110
108
|
onToggle = _ref.onToggle,
|
111
109
|
onChange = _ref.onChange,
|
@@ -158,14 +156,6 @@ var datePickerRangeRoot = exports.datePickerRangeRoot = function datePickerRange
|
|
158
156
|
_useState14 = _slicedToArray(_useState13, 2),
|
159
157
|
inputSecondValue = _useState14[0],
|
160
158
|
setInputSecondValue = _useState14[1];
|
161
|
-
var _useState15 = (0, _react.useState)(Boolean(calendarFirstValue && calendarSecondValue)),
|
162
|
-
_useState16 = _slicedToArray(_useState15, 2),
|
163
|
-
fullDateEntered = _useState16[0],
|
164
|
-
setFullDateEntered = _useState16[1];
|
165
|
-
var _useState17 = (0, _react.useState)(false),
|
166
|
-
_useState18 = _slicedToArray(_useState17, 2),
|
167
|
-
secondTextFieldClicked = _useState18[0],
|
168
|
-
setSecondTextFieldClicked = _useState18[1];
|
169
159
|
var setFirstInputValue = function setFirstInputValue(value) {
|
170
160
|
setInputFirstValue(value);
|
171
161
|
if (onChange) {
|
@@ -226,12 +216,12 @@ var datePickerRangeRoot = exports.datePickerRangeRoot = function datePickerRange
|
|
226
216
|
}),
|
227
217
|
handleChangeSecondValue = _useDatePicker2.handleChangeValue,
|
228
218
|
handleCommitSecondDate = _useDatePicker2.handleCommitDate;
|
229
|
-
var handleToggle = function handleToggle(
|
219
|
+
var handleToggle = function handleToggle(opened, event) {
|
230
220
|
var _firstInputRef$curren, _secondInputRef$curre;
|
231
221
|
if (disabled || readOnly) {
|
232
222
|
return;
|
233
223
|
}
|
234
|
-
var isCalendarOpen = (firstInputRef !== null && firstInputRef !== void 0 && (_firstInputRef$curren = firstInputRef.current) !== null && _firstInputRef$curren !== void 0 && _firstInputRef$curren.contains(
|
224
|
+
var isCalendarOpen = (firstInputRef !== null && firstInputRef !== void 0 && (_firstInputRef$curren = firstInputRef.current) !== null && _firstInputRef$curren !== void 0 && _firstInputRef$curren.contains(event.target || null) || secondInputRef !== null && secondInputRef !== void 0 && (_secondInputRef$curre = secondInputRef.current) !== null && _secondInputRef$curre !== void 0 && _secondInputRef$curre.contains(event.target || null)) && event.code !== _useKeyboardNavigation.keys.Escape ? true : opened;
|
235
225
|
if (!isCalendarOpen) {
|
236
226
|
if (calendarFirstValue && !calendarSecondValue) {
|
237
227
|
var _secondInputRef$curre2;
|
@@ -242,22 +232,11 @@ var datePickerRangeRoot = exports.datePickerRangeRoot = function datePickerRange
|
|
242
232
|
firstInputRef === null || firstInputRef === void 0 || (_firstInputRef$curren2 = firstInputRef.current) === null || _firstInputRef$curren2 === void 0 || _firstInputRef$curren2.focus();
|
243
233
|
}
|
244
234
|
}
|
245
|
-
if (!isCalendarOpen) {
|
246
|
-
setSecondTextFieldClicked(false);
|
247
|
-
}
|
248
235
|
if (onToggle) {
|
249
236
|
return onToggle(isCalendarOpen, event);
|
250
237
|
}
|
251
238
|
setIsInnerOpen(isCalendarOpen);
|
252
239
|
};
|
253
|
-
var handleFocusFirstTextField = function handleFocusFirstTextField(event) {
|
254
|
-
onFocusFirstTextfield === null || onFocusFirstTextfield === void 0 || onFocusFirstTextfield(event);
|
255
|
-
setSecondTextFieldClicked(false);
|
256
|
-
};
|
257
|
-
var handleFocusSecondTextField = function handleFocusSecondTextField(event) {
|
258
|
-
onFocusSecondTextfield === null || onFocusSecondTextfield === void 0 || onFocusSecondTextfield(event);
|
259
|
-
setSecondTextFieldClicked(true);
|
260
|
-
};
|
261
240
|
var handleBlur = function handleBlur(event, outerHandler) {
|
262
241
|
if (!inputFirstValue || !inputSecondValue) {
|
263
242
|
outerHandler === null || outerHandler === void 0 || outerHandler(event);
|
@@ -297,37 +276,6 @@ var datePickerRangeRoot = exports.datePickerRangeRoot = function datePickerRange
|
|
297
276
|
closeOnEsc: closeOnEsc
|
298
277
|
}),
|
299
278
|
onKeyDown = _useKeyNavigation.onKeyDown;
|
300
|
-
var handleChangeStartOfRange = function handleChangeStartOfRange(chosenDate, dateInfo) {
|
301
|
-
if (!fullDateEntered) {
|
302
|
-
handleCommitFirstDate(chosenDate, false, true, dateInfo);
|
303
|
-
handleCommitSecondDate('');
|
304
|
-
return;
|
305
|
-
}
|
306
|
-
var prevValue = secondTextFieldClicked ? calendarFirstValue : calendarSecondValue;
|
307
|
-
var _getSortedValues3 = (0, _utils2.getSortedValues)([prevValue, chosenDate]),
|
308
|
-
_getSortedValues4 = _slicedToArray(_getSortedValues3, 2),
|
309
|
-
first = _getSortedValues4[0],
|
310
|
-
second = _getSortedValues4[1];
|
311
|
-
handleCommitFirstDate(first, false, true, dateInfo);
|
312
|
-
handleCommitSecondDate(second, false, true, dateInfo);
|
313
|
-
if (!firstValueError && !secondValueError && closeAfterDateSelect) {
|
314
|
-
handleToggle(false);
|
315
|
-
}
|
316
|
-
};
|
317
|
-
var handleChangeCalendarValue = function handleChangeCalendarValue(_ref2, dateInfo) {
|
318
|
-
var _ref3 = _slicedToArray(_ref2, 2),
|
319
|
-
firstDate = _ref3[0],
|
320
|
-
secondDate = _ref3[1];
|
321
|
-
if (firstDate) {
|
322
|
-
handleCommitFirstDate(firstDate, false, true, dateInfo);
|
323
|
-
}
|
324
|
-
if (secondDate) {
|
325
|
-
handleCommitSecondDate(secondDate, false, true, dateInfo);
|
326
|
-
}
|
327
|
-
if (firstDate && secondDate && !firstValueError && !secondValueError && closeAfterDateSelect) {
|
328
|
-
handleToggle(false);
|
329
|
-
}
|
330
|
-
};
|
331
279
|
var RangeComponent = /*#__PURE__*/_react["default"].createElement(_react["default"].Fragment, null, /*#__PURE__*/_react["default"].createElement(_RangeDate.StyledRange, {
|
332
280
|
ref: rangeRef,
|
333
281
|
autoComplete: autoComplete,
|
@@ -373,8 +321,8 @@ var datePickerRangeRoot = exports.datePickerRangeRoot = function datePickerRange
|
|
373
321
|
rangeRef === null || rangeRef === void 0 || (_rangeRef$current4 = rangeRef.current) === null || _rangeRef$current4 === void 0 || (_rangeRef$current4 = _rangeRef$current4.firstTextField()) === null || _rangeRef$current4 === void 0 || (_rangeRef$current4 = _rangeRef$current4.current) === null || _rangeRef$current4 === void 0 || _rangeRef$current4.focus();
|
374
322
|
}
|
375
323
|
},
|
376
|
-
onFocusFirstTextfield:
|
377
|
-
onFocusSecondTextfield:
|
324
|
+
onFocusFirstTextfield: onFocusFirstTextfield,
|
325
|
+
onFocusSecondTextfield: onFocusSecondTextfield,
|
378
326
|
onBlurFirstTextfield: function onBlurFirstTextfield(event) {
|
379
327
|
return handleBlur(event, _onBlurFirstTextfield);
|
380
328
|
},
|
@@ -423,13 +371,8 @@ var datePickerRangeRoot = exports.datePickerRangeRoot = function datePickerRange
|
|
423
371
|
lang: lang
|
424
372
|
}));
|
425
373
|
}, [format, lang]);
|
426
|
-
(0, _react.
|
427
|
-
|
428
|
-
setFullDateEntered(true);
|
429
|
-
}
|
430
|
-
}, [calendarFirstValue, calendarSecondValue]);
|
431
|
-
var RootWrapper = (0, _react.useCallback)(function (_ref4) {
|
432
|
-
var children = _ref4.children;
|
374
|
+
var RootWrapper = (0, _react.useCallback)(function (_ref2) {
|
375
|
+
var children = _ref2.children;
|
433
376
|
return /*#__PURE__*/_react["default"].createElement(Root, {
|
434
377
|
view: view,
|
435
378
|
size: size,
|
@@ -471,8 +414,20 @@ var datePickerRangeRoot = exports.datePickerRangeRoot = function datePickerRange
|
|
471
414
|
lang: lang,
|
472
415
|
isDoubleCalendar: isDoubleCalendar,
|
473
416
|
rootWrapper: RootWrapper,
|
474
|
-
onChangeStartOfRange:
|
475
|
-
|
417
|
+
onChangeStartOfRange: function onChangeStartOfRange(firstDate, dateInfo) {
|
418
|
+
handleCommitFirstDate(firstDate, false, true, dateInfo);
|
419
|
+
handleCommitSecondDate('');
|
420
|
+
},
|
421
|
+
onChangeValue: function onChangeValue(_ref3, dateInfo) {
|
422
|
+
var _ref4 = _slicedToArray(_ref3, 2),
|
423
|
+
firstDate = _ref4[0],
|
424
|
+
secondDate = _ref4[1];
|
425
|
+
firstDate && handleCommitFirstDate(firstDate, false, true, dateInfo);
|
426
|
+
secondDate && handleCommitSecondDate(secondDate, false, true, dateInfo);
|
427
|
+
if (firstDate && secondDate && !firstValueError && !secondValueError) {
|
428
|
+
setIsInnerOpen(false);
|
429
|
+
}
|
430
|
+
}
|
476
431
|
}), leftHelper && /*#__PURE__*/_react["default"].createElement(_RangeDate.LeftHelper, null, leftHelper), /*#__PURE__*/_react["default"].createElement(_DatePickerBase.InputHidden, _extends({
|
477
432
|
name: name,
|
478
433
|
type: "hidden",
|
@@ -9,6 +9,7 @@ var _plasmaCore = /*#__PURE__*/require("@salutejs/plasma-core");
|
|
9
9
|
var _DropdownItem = /*#__PURE__*/require("../DropdownItem/DropdownItem");
|
10
10
|
var _Dropdown = /*#__PURE__*/require("../../Dropdown.styles");
|
11
11
|
var _FloatingPopover = /*#__PURE__*/require("../../FloatingPopover");
|
12
|
+
var _utils = /*#__PURE__*/require("../../utils");
|
12
13
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
|
13
14
|
var DropdownInner = exports.DropdownInner = function DropdownInner(_ref) {
|
14
15
|
var item = _ref.item,
|
@@ -40,7 +41,7 @@ var DropdownInner = exports.DropdownInner = function DropdownInner(_ref) {
|
|
40
41
|
var nextLevel = currentLevel + 1;
|
41
42
|
if (item !== null && item !== void 0 && item.items) {
|
42
43
|
return /*#__PURE__*/_react["default"].createElement(_FloatingPopover.FloatingPopover, {
|
43
|
-
placement:
|
44
|
+
placement: (0, _utils.getPlacement)((item === null || item === void 0 ? void 0 : item.placement) || 'right'),
|
44
45
|
opened: isCurrentListOpen,
|
45
46
|
onToggle: handleToggle,
|
46
47
|
trigger: trigger,
|
@@ -0,0 +1,441 @@
|
|
1
|
+
---
|
2
|
+
id: select
|
3
|
+
title: Select
|
4
|
+
---
|
5
|
+
|
6
|
+
import { PropsTable, Description, StorybookLink } from '@site/src/components';
|
7
|
+
import Tabs from '@theme/Tabs';
|
8
|
+
import TabItem from '@theme/TabItem';
|
9
|
+
|
10
|
+
# Select
|
11
|
+
|
12
|
+
<Description name="Select" />
|
13
|
+
<PropsTable name="Select" />
|
14
|
+
|
15
|
+
## Использование
|
16
|
+
Обязательным параметром являются: `items`, `value` и `onChange`. Внутри items может быть такой же вложенный массив items. Формат следующий:
|
17
|
+
|
18
|
+
```tsx
|
19
|
+
type Items = Array<{
|
20
|
+
/**
|
21
|
+
* Значение у item
|
22
|
+
*/
|
23
|
+
value: string;
|
24
|
+
/**
|
25
|
+
* Метка-подпись к item
|
26
|
+
*/
|
27
|
+
label: string;
|
28
|
+
/**
|
29
|
+
* Сторона открытия вложенного дропдауна относительно текущего элемента;
|
30
|
+
*/
|
31
|
+
placement: SelectPlacement | Array<SelectPlacementBasic>;
|
32
|
+
/**
|
33
|
+
* Список дочерних items.
|
34
|
+
*/
|
35
|
+
items?: Array<ItemOption>;
|
36
|
+
/**
|
37
|
+
* Item не активен
|
38
|
+
*/
|
39
|
+
disabled?: boolean;
|
40
|
+
/**
|
41
|
+
* Слот для контента слева
|
42
|
+
*/
|
43
|
+
contentLeft?: ReactNode;
|
44
|
+
/**
|
45
|
+
* Слот для контента справа
|
46
|
+
*/
|
47
|
+
contentRight?: ReactNode;
|
48
|
+
/**
|
49
|
+
* Выбранный item.
|
50
|
+
* @deprecated
|
51
|
+
*/
|
52
|
+
isActive?: boolean;
|
53
|
+
/**
|
54
|
+
* Кастомный цвет текста
|
55
|
+
* @deprecated
|
56
|
+
*/
|
57
|
+
color?: string;
|
58
|
+
/**
|
59
|
+
* Айтем не активен
|
60
|
+
* @deprecated использовать disabled
|
61
|
+
*/
|
62
|
+
isDisabled?: boolean;
|
63
|
+
}>;
|
64
|
+
```
|
65
|
+
|
66
|
+
Тип выбора селекта - одиночный или множественный зависит от типа `value` и `onChange`. В одиночном value - `string`, в множественном - `Array<string>`.
|
67
|
+
Select может выглядеть как Button и как Textfield. За это отвечает пропс - `target`.\
|
68
|
+
Есть возможность прокидывать компонент `EmptyState` в пропс `renderList` для изменения содержимого выпадающего окна.\
|
69
|
+
Это нужно в случаях, когда произошла ошибка при загрузке `items`, либо когда `items` пустой. Более подробно в примерах.
|
70
|
+
|
71
|
+
## Примеры
|
72
|
+
|
73
|
+
<Tabs>
|
74
|
+
<TabItem value="textfield" label="Textfield" default>
|
75
|
+
В режиме `textfield` доступны только следующие варианты `view`: `default`, `warning`, `positive` и `negative`.
|
76
|
+
|
77
|
+
```tsx live
|
78
|
+
import React from 'react';
|
79
|
+
import { Select } from '@salutejs/{{ package }}';
|
80
|
+
|
81
|
+
export function App() {
|
82
|
+
const [singleValue, setSingleValue] = useState('');
|
83
|
+
const [multipleValue, setMultipleValue] = useState([]);
|
84
|
+
|
85
|
+
const items = [
|
86
|
+
{
|
87
|
+
value: 'north_america',
|
88
|
+
label: 'Северная Америка',
|
89
|
+
},
|
90
|
+
{
|
91
|
+
value: 'south_america',
|
92
|
+
label: 'Южная Америка',
|
93
|
+
items: [
|
94
|
+
{
|
95
|
+
value: 'brazil',
|
96
|
+
label: 'Бразилия',
|
97
|
+
},
|
98
|
+
{
|
99
|
+
value: 'argentina',
|
100
|
+
label: 'Аргентина',
|
101
|
+
},
|
102
|
+
],
|
103
|
+
},
|
104
|
+
];
|
105
|
+
|
106
|
+
return (
|
107
|
+
<div style=\{{ display: 'flex', gap: '30px', height: '300px' }}>
|
108
|
+
<div style=\{{width: '300px'}}>
|
109
|
+
<Select items={items} value={singleValue} onChange={setSingleValue} label="Label" placeholder="Placeholder" helperText="Helper text" />
|
110
|
+
</div>
|
111
|
+
|
112
|
+
<div style=\{{width: '300px'}}>
|
113
|
+
<Select multiselect items={items} value={multipleValue} onChange={setMultipleValue} label="Label" placeholder="Placeholder" helperText="Helper text" />
|
114
|
+
</div>
|
115
|
+
</div>
|
116
|
+
);
|
117
|
+
}
|
118
|
+
```
|
119
|
+
</TabItem>
|
120
|
+
<TabItem value="button" label="Button">
|
121
|
+
В режиме `button` недоступны следующие пропсы: `contentLeft`, `label`, `labelPlacement`, `placeholder` и `helperText`.
|
122
|
+
|
123
|
+
```tsx live
|
124
|
+
import React from 'react';
|
125
|
+
import { Select } from '@salutejs/{{ package }}';
|
126
|
+
|
127
|
+
export function App() {
|
128
|
+
const [singleValue, setSingleValue] = useState('');
|
129
|
+
const [multipleValue, setMultipleValue] = useState([]);
|
130
|
+
|
131
|
+
const items = [
|
132
|
+
{
|
133
|
+
value: 'north_america',
|
134
|
+
label: 'Северная Америка',
|
135
|
+
},
|
136
|
+
{
|
137
|
+
value: 'south_america',
|
138
|
+
label: 'Южная Америка',
|
139
|
+
items: [
|
140
|
+
{
|
141
|
+
value: 'brazil',
|
142
|
+
label: 'Бразилия',
|
143
|
+
},
|
144
|
+
{
|
145
|
+
value: 'argentina',
|
146
|
+
label: 'Аргентина',
|
147
|
+
},
|
148
|
+
],
|
149
|
+
},
|
150
|
+
];
|
151
|
+
|
152
|
+
return (
|
153
|
+
<div style=\{{ display: 'flex', gap: '30px', height: '300px' }}>
|
154
|
+
<div style=\{{width: '300px'}}>
|
155
|
+
<Select items={items} label="Single" target="button-like" value={singleValue} onChange={setSingleValue} />
|
156
|
+
</div>
|
157
|
+
|
158
|
+
<div style=\{{width: '300px'}}>
|
159
|
+
<Select multiselect items={items} label="Multiple" target="button-like" value={multipleValue} onChange={setMultipleValue} />
|
160
|
+
</div>
|
161
|
+
</div>
|
162
|
+
);
|
163
|
+
}
|
164
|
+
```
|
165
|
+
</TabItem>
|
166
|
+
<TabItem value="predefined" label="Predefined">
|
167
|
+
Есть возможность задать значения по дефолту (главное, чтобы они находились в `items`). Также можно управлять состоянием снаружи селекта.
|
168
|
+
|
169
|
+
```tsx live
|
170
|
+
import React from 'react';
|
171
|
+
import { Select, Button } from '@salutejs/{{ package }}';
|
172
|
+
|
173
|
+
export function App() {
|
174
|
+
const [multipleValue, setMultipleValue] = useState(['brazil', 'north_america']);
|
175
|
+
|
176
|
+
const items = [
|
177
|
+
{
|
178
|
+
value: 'north_america',
|
179
|
+
label: 'Северная Америка',
|
180
|
+
},
|
181
|
+
{
|
182
|
+
value: 'south_america',
|
183
|
+
label: 'Южная Америка',
|
184
|
+
items: [
|
185
|
+
{
|
186
|
+
value: 'brazil',
|
187
|
+
label: 'Бразилия',
|
188
|
+
},
|
189
|
+
{
|
190
|
+
value: 'argentina',
|
191
|
+
label: 'Аргентина',
|
192
|
+
},
|
193
|
+
],
|
194
|
+
},
|
195
|
+
];
|
196
|
+
|
197
|
+
return (
|
198
|
+
<div style=\{{ display: 'flex', gap: '30px', height: '300px' }}>
|
199
|
+
<div style=\{{width: '300px'}}>
|
200
|
+
<Select multiselect items={items} label="Label" placeholder="Placeholder" value={multipleValue} onChange={setMultipleValue} />
|
201
|
+
</div>
|
202
|
+
|
203
|
+
<Button onClick={() => setMultipleValue([])}>Очистить</Button>
|
204
|
+
</div>
|
205
|
+
);
|
206
|
+
}
|
207
|
+
```
|
208
|
+
</TabItem>
|
209
|
+
<TabItem value="renderValue" label="Render value">
|
210
|
+
Пропс `renderValue` для кастомной настройки `value` внутри таргета. Принимает коллбэк с двумя параметрами: `value` и `label`.
|
211
|
+
|
212
|
+
```tsx live
|
213
|
+
import React from 'react';
|
214
|
+
import { Select } from '@salutejs/{{ package }}';
|
215
|
+
|
216
|
+
export function App() {
|
217
|
+
const [singleValue, setSingleValue] = useState('');
|
218
|
+
|
219
|
+
const items = [
|
220
|
+
{
|
221
|
+
value: 'north_america',
|
222
|
+
label: 'Северная Америка',
|
223
|
+
},
|
224
|
+
{
|
225
|
+
value: 'south_america',
|
226
|
+
label: 'Южная Америка',
|
227
|
+
items: [
|
228
|
+
{
|
229
|
+
value: 'brazil',
|
230
|
+
label: 'Бразилия',
|
231
|
+
},
|
232
|
+
{
|
233
|
+
value: 'argentina',
|
234
|
+
label: 'Аргентина',
|
235
|
+
},
|
236
|
+
],
|
237
|
+
},
|
238
|
+
];
|
239
|
+
|
240
|
+
const renderValue = (itemData): string => {
|
241
|
+
if (!Array.isArray(itemData)) {
|
242
|
+
return `${itemData.value} - ${itemData.label}`;
|
243
|
+
}
|
244
|
+
|
245
|
+
return '';
|
246
|
+
};
|
247
|
+
|
248
|
+
return (
|
249
|
+
<div style=\{{ height: '300px' }}>
|
250
|
+
<div style=\{{ width: '300px' }}>
|
251
|
+
<Select
|
252
|
+
items={items}
|
253
|
+
label="Label"
|
254
|
+
placeholder="Placeholder"
|
255
|
+
value={singleValue}
|
256
|
+
onChange={setSingleValue}
|
257
|
+
renderValue={renderValue}
|
258
|
+
/>
|
259
|
+
</div>
|
260
|
+
</div>
|
261
|
+
);
|
262
|
+
}
|
263
|
+
```
|
264
|
+
</TabItem>
|
265
|
+
<TabItem value="renderItem" label="Render item">
|
266
|
+
`renderTarget` - для кастомной настройки таргета в Select. Принимает коллбэк с один параметром: `value`.
|
267
|
+
Пропс `renderItem` для кастомной настройки айтема в выпадающем списке. Принимает коллбэк с двумя параметрами: `value` и `label`.
|
268
|
+
В примере использован другой наш компонент - Cell.
|
269
|
+
|
270
|
+
```tsx live
|
271
|
+
import React from 'react';
|
272
|
+
import { Select, Cell } from '@salutejs/{{ package }}';
|
273
|
+
|
274
|
+
export function App() {
|
275
|
+
const [multipleValue, setMultipleValue] = useState([]);
|
276
|
+
|
277
|
+
const items = [
|
278
|
+
{
|
279
|
+
value: 'north_america',
|
280
|
+
label: 'Северная Америка',
|
281
|
+
},
|
282
|
+
{
|
283
|
+
value: 'south_america',
|
284
|
+
label: 'Южная Америка',
|
285
|
+
},
|
286
|
+
];
|
287
|
+
|
288
|
+
const renderTarget = (itemData) => {
|
289
|
+
if (Array.isArray(itemData)) {
|
290
|
+
if (itemData.length === 0) {
|
291
|
+
return (
|
292
|
+
<div style=\{{ padding: '0.5rem 0' }}>
|
293
|
+
<Cell
|
294
|
+
view="default"
|
295
|
+
title="Выберите страну"
|
296
|
+
subtitle="Subtitle"
|
297
|
+
label="Label"
|
298
|
+
/>
|
299
|
+
</div>
|
300
|
+
);
|
301
|
+
}
|
302
|
+
|
303
|
+
const title = itemData.map((item) => item.label).join(', ');
|
304
|
+
|
305
|
+
return (
|
306
|
+
<div style=\{{ padding: '0.5rem 0.75rem' }}>
|
307
|
+
<Cell view="default" title={title} subtitle="Subtitle" label="Label" />
|
308
|
+
</div>
|
309
|
+
);
|
310
|
+
}
|
311
|
+
}
|
312
|
+
|
313
|
+
const renderItem = ({ value, label }) => (
|
314
|
+
<Cell
|
315
|
+
view="default"
|
316
|
+
title={label}
|
317
|
+
label="Top left"
|
318
|
+
contentRight={<Cell view="default" title="Bottom right" label="Top right" />}
|
319
|
+
/>
|
320
|
+
)
|
321
|
+
|
322
|
+
return (
|
323
|
+
<div style=\{{ height: '300px' }}>
|
324
|
+
<div style=\{{ width: '400px' }}>
|
325
|
+
<Select
|
326
|
+
items={items}
|
327
|
+
value={multipleValue}
|
328
|
+
onChange={setMultipleValue}
|
329
|
+
multiselect
|
330
|
+
renderTarget={renderTarget}
|
331
|
+
renderItem={renderItem}
|
332
|
+
/>
|
333
|
+
</div>
|
334
|
+
</div>
|
335
|
+
);
|
336
|
+
}
|
337
|
+
```
|
338
|
+
</TabItem>
|
339
|
+
<TabItem value="portal" label="Portal">
|
340
|
+
Иногда возникает необходимость вынесения выпадающего списка на уровни выше в DOM. К примеру, когда у родительского блока имеется скролл, и список будет обрезаться, чего хотелось бы избежать.\
|
341
|
+
Для такой реализации имеется пропс `portal`, который принимает либо `ref` либо `id` html-тега.\
|
342
|
+
Также нужно прокинуть проп `listWidth`, чтобы явно задать ширину списку. Если этого не сделать, то будет взята ширина 100% от блока, на который ведет ссылка портала.
|
343
|
+
|
344
|
+
```tsx live
|
345
|
+
import React, { useRef } from 'react';
|
346
|
+
import { Select } from '@salutejs/{{ package }}';
|
347
|
+
|
348
|
+
export function App() {
|
349
|
+
const [value, setValue] = useState('');
|
350
|
+
|
351
|
+
const items = [
|
352
|
+
{
|
353
|
+
value: 'north_america',
|
354
|
+
label: 'Северная Америка',
|
355
|
+
},
|
356
|
+
{
|
357
|
+
value: 'south_america',
|
358
|
+
label: 'Южная Америка',
|
359
|
+
items: [
|
360
|
+
{
|
361
|
+
value: 'brazil',
|
362
|
+
label: 'Бразилия',
|
363
|
+
},
|
364
|
+
{
|
365
|
+
value: 'argentina',
|
366
|
+
label: 'Аргентина',
|
367
|
+
},
|
368
|
+
],
|
369
|
+
},
|
370
|
+
];
|
371
|
+
|
372
|
+
const ref = useRef(null)
|
373
|
+
|
374
|
+
return (
|
375
|
+
<div style=\{{ position: "relative", height: "300px" }} ref={ref}>
|
376
|
+
<div style=\{{width: '300px'}}>
|
377
|
+
<Select items={items} label="Label" placeholder="Placeholder" value={value} onChange={setValue} portal={ref} listWidth="300px" />
|
378
|
+
</div>
|
379
|
+
</div>
|
380
|
+
);
|
381
|
+
}
|
382
|
+
```
|
383
|
+
</TabItem>
|
384
|
+
<TabItem value="uncontrolled" label="Uncontrolled">
|
385
|
+
`value` и `onChange` - опциональные параметры. Если вы хотите `uncontrolled` вариант компонента - их пробрасывать необязательно.
|
386
|
+
|
387
|
+
```tsx live
|
388
|
+
import React from 'react';
|
389
|
+
import { Select } from '@salutejs/{{ package }}';
|
390
|
+
|
391
|
+
export function App() {
|
392
|
+
const items = [
|
393
|
+
{
|
394
|
+
value: 'north_america',
|
395
|
+
label: 'Северная Америка',
|
396
|
+
},
|
397
|
+
{
|
398
|
+
value: 'south_america',
|
399
|
+
label: 'Южная Америка',
|
400
|
+
items: [
|
401
|
+
{
|
402
|
+
value: 'brazil',
|
403
|
+
label: 'Бразилия',
|
404
|
+
},
|
405
|
+
{
|
406
|
+
value: 'argentina',
|
407
|
+
label: 'Аргентина',
|
408
|
+
},
|
409
|
+
],
|
410
|
+
},
|
411
|
+
];
|
412
|
+
|
413
|
+
return (
|
414
|
+
<div style=\{{ height: '300px' }}>
|
415
|
+
<div style=\{{width: '300px'}}>
|
416
|
+
<Select items={items} label="Label" placeholder="Placeholder" />
|
417
|
+
</div>
|
418
|
+
</div>
|
419
|
+
);
|
420
|
+
}
|
421
|
+
```
|
422
|
+
</TabItem>
|
423
|
+
</Tabs>
|
424
|
+
|
425
|
+
## Клавиатурная навигация
|
426
|
+
|
427
|
+
Данный компонент соответствует требования W3C: [Combobox](https://www.w3.org/WAI/ARIA/apg/patterns/combobox/) и частично [TreeView](https://www.w3.org/WAI/ARIA/apg/patterns/treeview/).
|
428
|
+
|
429
|
+
- `Tab` - закрывает дропдаун. Перемещает фокус на следующий элемент на странице;
|
430
|
+
- `Enter` - открывает/закрывает дропдаун. Если на элементе - выбирает его. Если у элемента есть дочерний дропдаун - открывает его, выбор элемента не происходит;
|
431
|
+
- `Space` - открывает/закрывает дропдаун. Если на элементе - выбирает его и все дочерние элементы.
|
432
|
+
- `Home` - открывает дропдаун и перемещает фокус на первый элемент;
|
433
|
+
- `End` - открывает дропдаун и перемещает фокус на последний элемент;
|
434
|
+
- `PageUp` - перемещает фокус на 10 элементов выше либо в начало списка;
|
435
|
+
- `PageDown` - перемещает фокус на 10 элементов ниже либо в конце списка;
|
436
|
+
- `ArrowUp` - открывает дропдаун и перемещает фокус на первый элемент. Перемещает фокус на один элемент выше;
|
437
|
+
- `ArrowDown` - открывает дропдаун и перемещает фокус на первый элемент. Перемещает фокус на один элемент ниже;
|
438
|
+
- `ArrowRight` - если фокус на элементе вложенного списка - открывает его и перемещает фокус на первый элемент; Если фокус на таргете - переходит в режим выбора чипа.
|
439
|
+
- `ArrowLeft` - закрывает текущий список и перемещает фокус на предыдущий; Если фокус на таргете - переходит в режим выбора чипа.
|
440
|
+
- `Backspace` - только если фокус на чипе - снимает выбор с текущего значения;
|
441
|
+
|
@@ -39,7 +39,7 @@ var Inner = exports.Inner = function Inner(_ref) {
|
|
39
39
|
if (!(0, _utils.isEmpty)(item === null || item === void 0 ? void 0 : item.items)) {
|
40
40
|
var _item$items;
|
41
41
|
return /*#__PURE__*/_react["default"].createElement(_FloatingPopover.FloatingPopover, {
|
42
|
-
placement:
|
42
|
+
placement: (item === null || item === void 0 ? void 0 : item.placement) || 'right',
|
43
43
|
opened: isCurrentListOpen,
|
44
44
|
onToggle: handleToggle,
|
45
45
|
offset: 2,
|