@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.
Files changed (84) hide show
  1. package/cjs/components/Combobox/ComboboxNew/ui/Inner/Inner.js +1 -1
  2. package/cjs/components/Combobox/ComboboxNew/ui/Inner/Inner.js.map +1 -1
  3. package/cjs/components/DatePicker/RangeDate/RangeDate.js +21 -66
  4. package/cjs/components/DatePicker/RangeDate/RangeDate.js.map +1 -1
  5. package/cjs/components/Dropdown/ui/DropdownInner/DropdownInner.js +2 -1
  6. package/cjs/components/Dropdown/ui/DropdownInner/DropdownInner.js.map +1 -1
  7. package/cjs/components/Select/ui/Inner/Inner.js +1 -1
  8. package/cjs/components/Select/ui/Inner/Inner.js.map +1 -1
  9. package/emotion/cjs/components/Combobox/Combobox.template-doc.mdx +5 -0
  10. package/emotion/cjs/components/Combobox/ComboboxNew/ui/Inner/Inner.js +1 -1
  11. package/emotion/cjs/components/DatePicker/RangeDate/RangeDate.js +21 -66
  12. package/emotion/cjs/components/Dropdown/Dropdown.template-doc.mdx +4 -0
  13. package/emotion/cjs/components/Dropdown/ui/DropdownInner/DropdownInner.js +2 -1
  14. package/emotion/cjs/components/Select/Select.template-doc.mdx +441 -0
  15. package/emotion/cjs/components/Select/ui/Inner/Inner.js +1 -1
  16. package/emotion/cjs/examples/plasma_b2c/components/DatePicker/DatePicker.stories.tsx +7 -1
  17. package/emotion/cjs/examples/plasma_web/components/DatePicker/DatePicker.stories.tsx +7 -3
  18. package/emotion/es/components/Combobox/Combobox.template-doc.mdx +5 -0
  19. package/emotion/es/components/Combobox/ComboboxNew/ui/Inner/Inner.js +1 -1
  20. package/emotion/es/components/DatePicker/RangeDate/RangeDate.js +21 -66
  21. package/emotion/es/components/Dropdown/Dropdown.template-doc.mdx +4 -0
  22. package/emotion/es/components/Dropdown/ui/DropdownInner/DropdownInner.js +2 -1
  23. package/emotion/es/components/Select/Select.template-doc.mdx +441 -0
  24. package/emotion/es/components/Select/ui/Inner/Inner.js +1 -1
  25. package/emotion/es/examples/plasma_b2c/components/DatePicker/DatePicker.stories.tsx +7 -1
  26. package/emotion/es/examples/plasma_web/components/DatePicker/DatePicker.stories.tsx +7 -3
  27. package/es/components/Combobox/ComboboxNew/ui/Inner/Inner.js +1 -1
  28. package/es/components/Combobox/ComboboxNew/ui/Inner/Inner.js.map +1 -1
  29. package/es/components/DatePicker/RangeDate/RangeDate.js +21 -66
  30. package/es/components/DatePicker/RangeDate/RangeDate.js.map +1 -1
  31. package/es/components/Dropdown/ui/DropdownInner/DropdownInner.js +2 -1
  32. package/es/components/Dropdown/ui/DropdownInner/DropdownInner.js.map +1 -1
  33. package/es/components/Select/ui/Inner/Inner.js +1 -1
  34. package/es/components/Select/ui/Inner/Inner.js.map +1 -1
  35. package/package.json +2 -2
  36. package/styled-components/cjs/components/Combobox/Combobox.template-doc.mdx +5 -0
  37. package/styled-components/cjs/components/Combobox/ComboboxNew/ui/Inner/Inner.js +1 -1
  38. package/styled-components/cjs/components/DatePicker/RangeDate/RangeDate.js +21 -66
  39. package/styled-components/cjs/components/Dropdown/Dropdown.template-doc.mdx +4 -0
  40. package/styled-components/cjs/components/Dropdown/ui/DropdownInner/DropdownInner.js +2 -1
  41. package/styled-components/cjs/components/Select/Select.template-doc.mdx +441 -0
  42. package/styled-components/cjs/components/Select/ui/Inner/Inner.js +1 -1
  43. package/styled-components/cjs/examples/plasma_b2c/components/DatePicker/DatePicker.stories.tsx +7 -1
  44. package/styled-components/cjs/examples/plasma_web/components/DatePicker/DatePicker.stories.tsx +7 -3
  45. package/styled-components/es/components/Combobox/Combobox.template-doc.mdx +5 -0
  46. package/styled-components/es/components/Combobox/ComboboxNew/ui/Inner/Inner.js +1 -1
  47. package/styled-components/es/components/DatePicker/RangeDate/RangeDate.js +21 -66
  48. package/styled-components/es/components/Dropdown/Dropdown.template-doc.mdx +4 -0
  49. package/styled-components/es/components/Dropdown/ui/DropdownInner/DropdownInner.js +2 -1
  50. package/styled-components/es/components/Select/Select.template-doc.mdx +441 -0
  51. package/styled-components/es/components/Select/ui/Inner/Inner.js +1 -1
  52. package/styled-components/es/examples/plasma_b2c/components/DatePicker/DatePicker.stories.tsx +7 -1
  53. package/styled-components/es/examples/plasma_web/components/DatePicker/DatePicker.stories.tsx +7 -3
  54. package/types/components/Combobox/ComboboxNew/Combobox.types.d.ts +1 -1
  55. package/types/components/Combobox/ComboboxNew/Combobox.types.d.ts.map +1 -1
  56. package/types/components/Combobox/ComboboxNew/ui/Inner/ui/Item/Item.types.d.ts +6 -0
  57. package/types/components/Combobox/ComboboxNew/ui/Inner/ui/Item/Item.types.d.ts.map +1 -1
  58. package/types/components/DatePicker/RangeDate/RangeDate.d.ts +8 -10
  59. package/types/components/DatePicker/RangeDate/RangeDate.d.ts.map +1 -1
  60. package/types/components/DatePicker/RangeDate/RangeDate.styles.d.ts +12 -12
  61. package/types/components/DatePicker/RangeDate/RangeDate.types.d.ts +0 -4
  62. package/types/components/DatePicker/RangeDate/RangeDate.types.d.ts.map +1 -1
  63. package/types/components/DatePicker/SingleDate/SingleDate.types.d.ts +1 -1
  64. package/types/components/DatePicker/SingleDate/SingleDate.types.d.ts.map +1 -1
  65. package/types/components/Dropdown/ui/DropdownInner/DropdownInner.d.ts.map +1 -1
  66. package/types/components/Dropdown/ui/DropdownItem/DropdownItem.type.d.ts +5 -0
  67. package/types/components/Dropdown/ui/DropdownItem/DropdownItem.type.d.ts.map +1 -1
  68. package/types/components/Pagination/ui/PaginationSelectPerPage/PaginationSelectPerPage.styles.d.ts +4 -4
  69. package/types/components/Range/Range.types.d.ts +5 -5
  70. package/types/components/Range/Range.types.d.ts.map +1 -1
  71. package/types/components/Select/Select.types.d.ts +2 -2
  72. package/types/components/Select/Select.types.d.ts.map +1 -1
  73. package/types/components/Select/ui/Inner/ui/Item/Item.types.d.ts +11 -0
  74. package/types/components/Select/ui/Inner/ui/Item/Item.types.d.ts.map +1 -1
  75. package/types/examples/plasma_b2c/components/Combobox/Combobox.d.ts +24 -24
  76. package/types/examples/plasma_b2c/components/DatePicker/DatePicker.d.ts +4 -5
  77. package/types/examples/plasma_b2c/components/DatePicker/DatePicker.d.ts.map +1 -1
  78. package/types/examples/plasma_b2c/components/Range/Range.d.ts +12 -12
  79. package/types/examples/plasma_b2c/components/Select/Select.d.ts +4 -4
  80. package/types/examples/plasma_web/components/Combobox/Combobox.d.ts +24 -24
  81. package/types/examples/plasma_web/components/DatePicker/DatePicker.d.ts +4 -5
  82. package/types/examples/plasma_web/components/DatePicker/DatePicker.d.ts.map +1 -1
  83. package/types/examples/plasma_web/components/Range/Range.d.ts +12 -12
  84. 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", "closeAfterDateSelect", "offset", "onToggle", "onChange", "onChangeFirstValue", "onChangeSecondValue", "onCommitFirstDate", "onCommitSecondDate", "onFocusFirstTextfield", "onFocusSecondTextfield", "onBlurFirstTextfield", "onBlurSecondTextfield"];
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(currentOpened, event) {
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((event === null || event === void 0 ? void 0 : event.target) || null) || secondInputRef !== null && secondInputRef !== void 0 && (_secondInputRef$curre = secondInputRef.current) !== null && _secondInputRef$curre !== void 0 && _secondInputRef$curre.contains((event === null || event === void 0 ? void 0 : event.target) || null)) && (event === null || event === void 0 ? void 0 : event.code) !== _useKeyboardNavigation.keys.Escape ? true : currentOpened;
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: handleFocusFirstTextField,
377
- onFocusSecondTextfield: handleFocusSecondTextField,
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.useEffect)(function () {
427
- if (calendarFirstValue && calendarSecondValue) {
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: handleChangeStartOfRange,
475
- onChangeValue: handleChangeCalendarValue
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",
@@ -29,6 +29,10 @@ type Items = Array<{
29
29
  * Метка-подпись к item
30
30
  */
31
31
  label: string;
32
+ /**
33
+ * Сторона открытия вложенного дропдауна относительно текущего элемента;
34
+ */
35
+ placement: DropdownPlacement;
32
36
  /**
33
37
  * Список дочерних items.
34
38
  */
@@ -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: "right-start",
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: "right",
42
+ placement: (item === null || item === void 0 ? void 0 : item.placement) || 'right',
43
43
  opened: isCurrentListOpen,
44
44
  onToggle: handleToggle,
45
45
  offset: 2,