@carbon/ibm-products 2.0.0-rc.25 → 2.0.0-rc.26

Sign up to get free protection for your applications and to get access to all the features.
Files changed (74) hide show
  1. package/README.md +10 -4
  2. package/css/index-full-carbon.css +69 -97
  3. package/css/index-full-carbon.css.map +1 -1
  4. package/css/index-full-carbon.min.css +3 -3
  5. package/css/index-full-carbon.min.css.map +1 -1
  6. package/css/index-without-carbon-released-only.css +9 -88
  7. package/css/index-without-carbon-released-only.css.map +1 -1
  8. package/css/index-without-carbon-released-only.min.css +2 -2
  9. package/css/index-without-carbon-released-only.min.css.map +1 -1
  10. package/css/index-without-carbon.css +69 -97
  11. package/css/index-without-carbon.css.map +1 -1
  12. package/css/index-without-carbon.min.css +3 -3
  13. package/css/index-without-carbon.min.css.map +1 -1
  14. package/css/index.css +69 -97
  15. package/css/index.css.map +1 -1
  16. package/css/index.min.css +3 -3
  17. package/css/index.min.css.map +1 -1
  18. package/es/components/AddSelect/AddSelectBody.js +1 -0
  19. package/es/components/AddSelect/AddSelectFormControl.js +92 -0
  20. package/es/components/AddSelect/AddSelectList.js +26 -195
  21. package/es/components/AddSelect/AddSelectRow.js +220 -0
  22. package/es/components/AddSelect/hooks/useFocus.js +35 -0
  23. package/es/components/Datagrid/Datagrid/DatagridToolbar.js +1 -1
  24. package/es/components/Datagrid/Datagrid/addons/CustomizeColumns/Columns.js +15 -65
  25. package/es/components/Datagrid/Datagrid/addons/CustomizeColumns/CustomizeColumnsTearsheet.js +5 -2
  26. package/es/components/Datagrid/Datagrid/addons/CustomizeColumns/DraggableItemsList.js +112 -0
  27. package/es/components/Datagrid/Datagrid/addons/CustomizeColumns/TearsheetWrapper.js +1 -0
  28. package/es/components/Datagrid/Datagrid/addons/RowSize/RowSizeDropdown.js +29 -23
  29. package/es/components/Datagrid/Datagrid/addons/RowSize/RowSizeRadioGroup.js +1 -0
  30. package/es/components/Datagrid/index.js +7 -7
  31. package/es/components/Datagrid/useInfiniteScroll.js +5 -1
  32. package/es/components/Datagrid/useOnRowClick.js +3 -3
  33. package/es/components/Datagrid/useSortableColumns.js +7 -5
  34. package/es/components/Datagrid/utils/getAutoSizedColumnWidth.js +29 -0
  35. package/es/components/ExampleComponent/ExampleComponent.js +39 -5
  36. package/es/components/ExampleComponent/useExample.js +51 -0
  37. package/es/components/InlineEditV1/InlineEditV1.js +15 -20
  38. package/es/components/InlineEditV2/InlineEditV2.js +21 -31
  39. package/es/components/index.js +1 -1
  40. package/es/global/js/package-settings.js +24 -3
  41. package/es/global/js/utils/story-helper.js +9 -0
  42. package/es/global/js/utils/test-helper.js +38 -6
  43. package/lib/components/AddSelect/AddSelectBody.js +1 -0
  44. package/lib/components/AddSelect/AddSelectFormControl.js +110 -0
  45. package/lib/components/AddSelect/AddSelectList.js +29 -203
  46. package/lib/components/AddSelect/AddSelectRow.js +247 -0
  47. package/lib/components/AddSelect/hooks/useFocus.js +46 -0
  48. package/lib/components/Datagrid/Datagrid/DatagridToolbar.js +1 -1
  49. package/lib/components/Datagrid/Datagrid/addons/CustomizeColumns/Columns.js +16 -69
  50. package/lib/components/Datagrid/Datagrid/addons/CustomizeColumns/CustomizeColumnsTearsheet.js +5 -2
  51. package/lib/components/Datagrid/Datagrid/addons/CustomizeColumns/DraggableItemsList.js +132 -0
  52. package/lib/components/Datagrid/Datagrid/addons/CustomizeColumns/TearsheetWrapper.js +1 -0
  53. package/lib/components/Datagrid/Datagrid/addons/RowSize/RowSizeDropdown.js +23 -16
  54. package/lib/components/Datagrid/Datagrid/addons/RowSize/RowSizeRadioGroup.js +1 -0
  55. package/lib/components/Datagrid/index.js +9 -1
  56. package/lib/components/Datagrid/useInfiniteScroll.js +5 -0
  57. package/lib/components/Datagrid/useOnRowClick.js +3 -3
  58. package/lib/components/Datagrid/useSortableColumns.js +7 -5
  59. package/lib/components/Datagrid/utils/getAutoSizedColumnWidth.js +40 -0
  60. package/lib/components/ExampleComponent/ExampleComponent.js +47 -4
  61. package/lib/components/ExampleComponent/useExample.js +63 -0
  62. package/lib/components/InlineEditV1/InlineEditV1.js +14 -19
  63. package/lib/components/InlineEditV2/InlineEditV2.js +20 -30
  64. package/lib/components/index.js +6 -0
  65. package/lib/global/js/package-settings.js +24 -3
  66. package/lib/global/js/utils/story-helper.js +13 -2
  67. package/lib/global/js/utils/test-helper.js +42 -8
  68. package/package.json +2 -2
  69. package/scss/components/AddSelect/_add-select.scss +4 -16
  70. package/scss/components/Datagrid/styles/addons/_CustomizeColumnsTearsheet.scss +15 -2
  71. package/scss/components/Datagrid/styles/addons/_RowSizeDropdown.scss +18 -6
  72. package/scss/components/InlineEditV1/_inline-edit-v1.scss +5 -89
  73. package/scss/components/InlineEditV2/_inline-edit-v2.scss +42 -3
  74. package/scss/components/SidePanel/_side-panel.scss +2 -1
@@ -11,7 +11,7 @@ var _excluded = ["cancelLabel", "editLabel", "id", "invalid", "invalidLabel", "l
11
11
  * LICENSE file in the root directory of this source tree.
12
12
  */
13
13
  import React, { useState, useEffect, forwardRef, useRef } from 'react';
14
- import { Button } from '@carbon/react';
14
+ import { IconButton } from '@carbon/react';
15
15
  import cx from 'classnames';
16
16
  import PropTypes from 'prop-types';
17
17
  import { Edit, Checkmark, Close, // EditOff,
@@ -21,6 +21,8 @@ import { getDevtoolsProps } from '../../global/js/utils/devtools';
21
21
  var componentName = 'InlineEditV2';
22
22
  var blockClass = "".concat(pkg.prefix, "--inline-edit-v2");
23
23
  export var InlineEditV2 = /*#__PURE__*/forwardRef(function (_ref, ref) {
24
+ var _cx;
25
+
24
26
  var cancelLabel = _ref.cancelLabel,
25
27
  editLabel = _ref.editLabel,
26
28
  id = _ref.id,
@@ -147,7 +149,7 @@ export var InlineEditV2 = /*#__PURE__*/forwardRef(function (_ref, ref) {
147
149
  return /*#__PURE__*/React.createElement("div", _extends({}, rest, {
148
150
  ref: ref
149
151
  }, getDevtoolsProps(componentName)), /*#__PURE__*/React.createElement("div", {
150
- className: cx(blockClass, _defineProperty({}, "".concat(blockClass, "-focused"), focused)),
152
+ className: cx(blockClass, (_cx = {}, _defineProperty(_cx, "".concat(blockClass, "--focused"), focused), _defineProperty(_cx, "".concat(blockClass, "--invalid"), invalid), _cx)),
151
153
  onFocus: onFocusHandler,
152
154
  onBlur: onBlurHandler
153
155
  }, /*#__PURE__*/React.createElement("label", {
@@ -162,55 +164,43 @@ export var InlineEditV2 = /*#__PURE__*/forwardRef(function (_ref, ref) {
162
164
  ref: inputRef // readOnly={readOnly}
163
165
  ,
164
166
  onKeyDown: onKeyHandler
165
- }), focused ? /*#__PURE__*/React.createElement(React.Fragment, null, invalid && /*#__PURE__*/React.createElement(WarningFilled, {
167
+ }), /*#__PURE__*/React.createElement("div", {
168
+ className: "".concat(blockClass, "__toolbar")
169
+ }, focused ? /*#__PURE__*/React.createElement(React.Fragment, null, invalid && /*#__PURE__*/React.createElement(WarningFilled, {
166
170
  size: 16,
167
171
  className: "".concat(blockClass, "__warning-icon")
168
- }), /*#__PURE__*/React.createElement(Button, {
169
- hasIconOnly: true,
170
- renderIcon: function renderIcon() {
171
- return /*#__PURE__*/React.createElement(Close, {
172
- size: 24
173
- });
174
- },
172
+ }), /*#__PURE__*/React.createElement(IconButton, {
175
173
  size: "sm",
176
- iconDescription: cancelLabel,
174
+ label: cancelLabel,
177
175
  onClick: onCancelHandler,
178
176
  kind: "ghost",
179
177
  tabIndex: 0,
180
178
  key: "cancel",
181
179
  className: "".concat(blockClass, "__btn ").concat(blockClass, "__btn-cancel")
182
- }), /*#__PURE__*/React.createElement(Button, {
183
- hasIconOnly: true,
184
- renderIcon: function renderIcon() {
185
- return /*#__PURE__*/React.createElement(Checkmark, {
186
- size: 24
187
- });
188
- },
180
+ }, /*#__PURE__*/React.createElement(Close, {
181
+ size: 16
182
+ })), /*#__PURE__*/React.createElement(IconButton, {
189
183
  size: "sm",
190
- iconDescription: saveLabel,
184
+ label: saveLabel,
191
185
  onClick: onSaveHandler,
192
186
  kind: "ghost",
193
187
  tabIndex: 0,
194
188
  key: "save",
195
189
  className: "".concat(blockClass, "__btn ").concat(blockClass, "__btn-save"),
196
190
  disabled: !canSave
197
- })) : /*#__PURE__*/React.createElement(Button, {
191
+ }, /*#__PURE__*/React.createElement(Checkmark, {
192
+ size: 16
193
+ }))) : /*#__PURE__*/React.createElement(IconButton, {
198
194
  className: "".concat(blockClass, "__btn ").concat(blockClass, "__btn-edit"),
199
- hasIconOnly: true // renderIcon={readOnly ? EditOff24 : Edit24}
200
- ,
201
- renderIcon: function renderIcon() {
202
- return /*#__PURE__*/React.createElement(Edit, {
203
- size: 24
204
- });
205
- },
206
- size: "sm" // iconDescription={readOnly ? readOnlyLabel : editLabel}
207
- ,
208
- iconDescription: editLabel,
195
+ size: "sm",
196
+ label: editLabel,
209
197
  onClick: onFocusHandler,
210
198
  kind: "ghost",
211
199
  tabIndex: 0,
212
200
  key: "edit"
213
- })), focused && invalid && /*#__PURE__*/React.createElement("p", {
201
+ }, /*#__PURE__*/React.createElement(Edit, {
202
+ size: 16
203
+ })))), focused && invalid && /*#__PURE__*/React.createElement("p", {
214
204
  className: "".concat(blockClass, "__warning-text")
215
205
  }, invalidLabel));
216
206
  });
@@ -37,7 +37,7 @@ export { EditSidePanel } from './EditSidePanel';
37
37
  export { OptionsTile } from './OptionsTile';
38
38
  export { InlineEdit } from './InlineEdit';
39
39
  export { DataSpreadsheet } from './DataSpreadsheet';
40
- export { Datagrid, useDatagrid, useInfiniteScroll, useNestedRows, useSelectRows, useExpandedRow, useOnRowClick, useSortableColumns, useRowIsMouseOver, useColumnCenterAlign, useColumnRightAlign, useDisableSelectRows, useStickyColumn, useActionsColumn, useCustomizeColumns, useSelectAllWithToggle, useColumnOrder, useInlineEdit, useFiltering } from './Datagrid';
40
+ export { Datagrid, useDatagrid, useInfiniteScroll, useNestedRows, useSelectRows, useExpandedRow, useOnRowClick, useSortableColumns, useRowIsMouseOver, useColumnCenterAlign, useColumnRightAlign, useDisableSelectRows, useStickyColumn, useActionsColumn, useCustomizeColumns, useSelectAllWithToggle, useColumnOrder, useInlineEdit, useFiltering, getAutoSizedColumnWidth } from './Datagrid';
41
41
  export { EditTearsheet } from './EditTearsheet';
42
42
  export { EditTearsheetNarrow } from './EditTearsheetNarrow';
43
43
  export { EditFullPage } from './EditFullPage';
@@ -79,7 +79,8 @@ var defaults = {
79
79
  // feature level flags
80
80
  feature: {
81
81
  'a-new-feature': false,
82
- 'default-portal-target-body': true
82
+ 'default-portal-target-body': true,
83
+ 'Datagrid.useInfiniteScroll': false
83
84
  }
84
85
  };
85
86
 
@@ -91,6 +92,10 @@ var warningMessageFeature = function warningMessageFeature(property) {
91
92
  return "Carbon for IBM Products (WARNING): Feature \"".concat(property, "\" enabled via feature flags.");
92
93
  };
93
94
 
95
+ var errorMessageFeature = function errorMessageFeature(property) {
96
+ return "Carbon for IBM Products (Error): Feature \"".concat(property, "\" not enabled. To enable see the notes on feature flags in the README.");
97
+ };
98
+
94
99
  var warningMessageAllComponents = 'Carbon for IBM Products (WARNING): All components enabled through use of setAllComponents. This includes components that have not yet completed their review process.';
95
100
  var warningMessageAllFeatures = 'Carbon for IBM Products (WARNING): All features enabled through use of setAllFeatures'; // Values to represent overrides for component or feature settings.
96
101
  // Each value maps the initial value to the value that should be returned.
@@ -111,7 +116,11 @@ var allFeatures = all.INITIAL;
111
116
  var silent = false;
112
117
  var component = new Proxy(_objectSpread({}, defaults.component), {
113
118
  set: function set(target, property, value) {
114
- value && !silent && console.warn(warningMessageComponent(property));
119
+ if (target[property] !== true && !silent && value) {
120
+ // not already true, not silent, and now true
121
+ console.warn(warningMessageComponent(property));
122
+ }
123
+
115
124
  target[property] = value;
116
125
  return true; // value set
117
126
  },
@@ -123,7 +132,11 @@ var component = new Proxy(_objectSpread({}, defaults.component), {
123
132
  });
124
133
  var feature = new Proxy(_objectSpread({}, defaults.feature), {
125
134
  set: function set(target, property, value) {
126
- value && !silent && console.warn(warningMessageFeature(property));
135
+ if (target[property] !== true && !silent && value) {
136
+ // not already true, not silent, and now true
137
+ console.warn(warningMessageFeature(property));
138
+ }
139
+
127
140
  target[property] = value;
128
141
  return true; // value set
129
142
  },
@@ -153,6 +166,14 @@ export default {
153
166
  var byDefault = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
154
167
  return byDefault ? defaults.feature[featureName] : feature[featureName];
155
168
  },
169
+ checkReportFeatureEnabled: function checkReportFeatureEnabled(featureName) {
170
+ if (feature[featureName]) {
171
+ // NOTE: Warning emitted if feature flag is enabled (see Proxy above)
172
+ return true;
173
+ } else {
174
+ console.error(errorMessageFeature(featureName));
175
+ }
176
+ },
156
177
  isFeaturePublic: function isFeaturePublic(featureName) {
157
178
  var byDefault = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
158
179
  return Object.prototype.hasOwnProperty.call(byDefault ? defaults.feature : feature, featureName);
@@ -76,4 +76,13 @@ CodesandboxLink.propTypes = {
76
76
  * directory withing examples codesandbox will be found
77
77
  */
78
78
  exampleDirectory: PropTypes.string
79
+ };
80
+ /**
81
+ * A helper function that finds the designated theme on the Storybook canvas.
82
+ * @returns "dark" or "light"
83
+ */
84
+
85
+ export var getSelectedCarbonTheme = function getSelectedCarbonTheme() {
86
+ var themeId = document.querySelector('html').getAttribute('storybook-carbon-theme');
87
+ return themeId === 'g90' || themeId === 'g100' ? 'dark' : 'light';
79
88
  };
@@ -198,6 +198,43 @@ export var expectMultipleWarn = function expectMultipleWarn(messages, test) {
198
198
  warn.mockRestore();
199
199
  return result;
200
200
  };
201
+
202
+ var checkLogging = function checkLogging(mock, message) {
203
+ if (message) {
204
+ var _expect4;
205
+
206
+ expect(mock).toBeCalled();
207
+
208
+ (_expect4 = expect(mock)).toHaveBeenCalledWith.apply(_expect4, _toConsumableArray(makeMatcherArray(message)));
209
+ }
210
+ };
211
+ /**
212
+ * A helper function to enable a test to expect a single call to
213
+ * console.error, for example when intentionally omitting a required prop
214
+ * or supplying an invalid prop type or value for the purposes of the test.
215
+ * @param {errors: {string|regex|function|[]}, warnings: {string|regex|function|[]}} messages the expected parameters for the call to
216
+ * console.error or console.warn, which must be called exactly once. A single string or regex or an
217
+ * expect matcher can be used to match a single-argument call to console.error (most common),
218
+ * while an array of strings and/or regex and/or expect matchers can be used to match a
219
+ * multiple-argument call. Strings can be full or substring matches to the corresponding
220
+ * argument.
221
+ * @param {Function} test the test function to call, during which the call to
222
+ * console.error will be expected.
223
+ */
224
+
225
+
226
+ export var expectLogging = function expectLogging(_ref2, test) {
227
+ var errors = _ref2.errors,
228
+ warnings = _ref2.warnings;
229
+ var error = jest.spyOn(console, 'error').mockImplementation(jest.fn());
230
+ var warn = jest.spyOn(console, 'warn').mockImplementation(jest.fn());
231
+ var result = test();
232
+ checkLogging(error, errors);
233
+ checkLogging(warn, warnings);
234
+ error.mockRestore();
235
+ warn.mockRestore();
236
+ return result;
237
+ };
201
238
  /**
202
239
  * A helper function to enable a test to expect a single call to
203
240
  * console.error, for example when intentionally omitting a required prop
@@ -213,14 +250,9 @@ export var expectMultipleWarn = function expectMultipleWarn(messages, test) {
213
250
  */
214
251
 
215
252
  export var expectError = function expectError(message, test) {
216
- var _expect4;
217
-
218
253
  var error = jest.spyOn(console, 'error').mockImplementation(jest.fn());
219
254
  var result = test();
220
- expect(error).toBeCalledTimes(1);
221
-
222
- (_expect4 = expect(error)).toHaveBeenCalledWith.apply(_expect4, _toConsumableArray(makeMatcherArray(message)));
223
-
255
+ checkLogging(error, message);
224
256
  error.mockRestore();
225
257
  return result;
226
258
  };
@@ -282,6 +282,7 @@ var AddSelectBody = /*#__PURE__*/(0, _react.forwardRef)(function (_ref, ref) {
282
282
  var displayColumnView = multi && useNormalizedItems && !searchTerm && !globalFiltersApplied; // main content
283
283
 
284
284
  var body = /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement("div", {
285
+ id: "add-select",
285
286
  className: "".concat(blockClass, "__header")
286
287
  }, /*#__PURE__*/_react.default.createElement(_AddSelectFilter.AddSelectFilter, {
287
288
  inputLabel: globalSearchLabel,
@@ -0,0 +1,110 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+
5
+ Object.defineProperty(exports, "__esModule", {
6
+ value: true
7
+ });
8
+ exports.AddSelectFormControl = void 0;
9
+
10
+ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
11
+
12
+ var _react = _interopRequireDefault(require("react"));
13
+
14
+ var _icons = require("@carbon/react/icons");
15
+
16
+ var _propTypes = _interopRequireDefault(require("prop-types"));
17
+
18
+ var _settings = require("../../settings");
19
+
20
+ var _UserProfileImage = require("../UserProfileImage");
21
+
22
+ var componentName = 'AddSelectFormControl';
23
+ var blockClass = "".concat(_settings.pkg.prefix, "--add-select__selections");
24
+
25
+ var AddSelectFormControl = function AddSelectFormControl(_ref) {
26
+ var _controlProps;
27
+
28
+ var item = _ref.item,
29
+ onClick = _ref.onClick,
30
+ selected = _ref.selected,
31
+ type = _ref.type;
32
+ var controlProps = (_controlProps = {
33
+ onClick: onClick,
34
+ id: item.id,
35
+ className: "".concat(blockClass, "-form-control-wrapper")
36
+ }, (0, _defineProperty2.default)(_controlProps, "aria-label", item.title), (0, _defineProperty2.default)(_controlProps, "size", 20), _controlProps);
37
+
38
+ var getCheckbox = function getCheckbox() {
39
+ if (selected) {
40
+ return /*#__PURE__*/_react.default.createElement(_icons.CheckboxCheckedFilled, controlProps);
41
+ }
42
+
43
+ return /*#__PURE__*/_react.default.createElement(_icons.Checkbox, controlProps);
44
+ };
45
+
46
+ var getRadio = function getRadio() {
47
+ if (selected) {
48
+ return /*#__PURE__*/_react.default.createElement(_icons.RadioButtonChecked, controlProps);
49
+ }
50
+
51
+ return /*#__PURE__*/_react.default.createElement(_icons.RadioButton, controlProps);
52
+ };
53
+
54
+ var getFormControl = function getFormControl() {
55
+ if (!item) {
56
+ return;
57
+ }
58
+
59
+ if (type === 'checkbox') {
60
+ return getCheckbox();
61
+ } else {
62
+ return getRadio();
63
+ }
64
+ };
65
+
66
+ var getAvatarProps = function getAvatarProps(_ref2) {
67
+ var src = _ref2.src,
68
+ alt = _ref2.alt,
69
+ icon = _ref2.icon,
70
+ backgroundColor = _ref2.backgroundColor,
71
+ theme = _ref2.theme;
72
+ return {
73
+ className: "".concat(blockClass, "-cell-avatar"),
74
+ size: 'lg',
75
+ theme: theme,
76
+ image: src,
77
+ imageDescription: alt,
78
+ icon: icon,
79
+ backgroundColor: backgroundColor
80
+ };
81
+ };
82
+
83
+ var getItemIcon = function getItemIcon(_ref3) {
84
+ var Icon = _ref3.icon;
85
+ return /*#__PURE__*/_react.default.createElement(Icon, null);
86
+ };
87
+
88
+ return /*#__PURE__*/_react.default.createElement("div", {
89
+ className: "".concat(blockClass, "-form-control")
90
+ }, getFormControl(), /*#__PURE__*/_react.default.createElement("div", {
91
+ className: "".concat(blockClass, "-form-control-label-wrapper")
92
+ }, item.avatar && /*#__PURE__*/_react.default.createElement(_UserProfileImage.UserProfileImage, getAvatarProps(item.avatar)), item.icon && /*#__PURE__*/_react.default.createElement("div", {
93
+ className: "".concat(blockClass, "-cell-icon")
94
+ }, getItemIcon(item)), /*#__PURE__*/_react.default.createElement("div", {
95
+ className: "".concat(blockClass, "-form-control-label-text")
96
+ }, /*#__PURE__*/_react.default.createElement("span", {
97
+ className: "".concat(blockClass, "-cell-title")
98
+ }, item.title), item.subtitle && /*#__PURE__*/_react.default.createElement("span", {
99
+ className: "".concat(blockClass, "-cell-subtitle")
100
+ }, item.subtitle))));
101
+ };
102
+
103
+ exports.AddSelectFormControl = AddSelectFormControl;
104
+ AddSelectFormControl.propTypes = {
105
+ item: _propTypes.default.object,
106
+ onClick: _propTypes.default.func,
107
+ selected: _propTypes.default.bool,
108
+ type: _propTypes.default.oneOf(['checkbox', 'radio'])
109
+ };
110
+ AddSelectFormControl.displayName = componentName;
@@ -11,13 +11,11 @@ var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")
11
11
 
12
12
  var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
13
13
 
14
- var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
14
+ var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
15
15
 
16
- var _react = _interopRequireDefault(require("react"));
17
-
18
- var _react2 = require("@carbon/react");
16
+ var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties"));
19
17
 
20
- var _icons = require("@carbon/react/icons");
18
+ var _react = _interopRequireDefault(require("react"));
21
19
 
22
20
  var _propTypes = _interopRequireDefault(require("prop-types"));
23
21
 
@@ -25,222 +23,50 @@ var _classnames = _interopRequireDefault(require("classnames"));
25
23
 
26
24
  var _settings = require("../../settings");
27
25
 
28
- var _UserProfileImage = require("../UserProfileImage");
26
+ var _AddSelectRow = require("./AddSelectRow");
27
+
28
+ var _useFocus3 = _interopRequireDefault(require("./hooks/useFocus"));
29
29
 
30
- //
31
- // Copyright IBM Corp. 2022, 2022
32
- //
33
- // This source code is licensed under the Apache-2.0 license found in the
34
- // LICENSE file in the root directory of this source tree.
35
- //
30
+ var _excluded = ["filteredItems", "multi"];
36
31
  var blockClass = "".concat(_settings.pkg.prefix, "--add-select__selections");
37
32
  var componentName = 'AddSelectList';
38
33
 
39
34
  var AddSelectList = function AddSelectList(_ref) {
40
- var _modifiers$options;
41
-
42
- var appliedModifiers = _ref.appliedModifiers,
43
- displayMetalPanel = _ref.displayMetalPanel,
44
- filteredItems = _ref.filteredItems,
45
- metaIconDescription = _ref.metaIconDescription,
46
- modifiers = _ref.modifiers,
35
+ var filteredItems = _ref.filteredItems,
47
36
  multi = _ref.multi,
48
- multiSelection = _ref.multiSelection,
49
- navIconDescription = _ref.navIconDescription,
50
- parentId = _ref.parentId,
51
- setAppliedModifiers = _ref.setAppliedModifiers,
52
- setDisplayMetaPanel = _ref.setDisplayMetaPanel,
53
- setMultiSelection = _ref.setMultiSelection,
54
- setParentSelected = _ref.setParentSelected,
55
- setSingleSelection = _ref.setSingleSelection,
56
- singleSelection = _ref.singleSelection;
57
- var hasModifiers = (modifiers === null || modifiers === void 0 ? void 0 : (_modifiers$options = modifiers.options) === null || _modifiers$options === void 0 ? void 0 : _modifiers$options.length) > 0;
58
-
59
- var handleSingleSelection = function handleSingleSelection(value) {
60
- setSingleSelection(value);
61
- };
62
-
63
- var handleMultiSelection = function handleMultiSelection(event, _ref2) {
64
- var checked = _ref2.checked,
65
- id = _ref2.id;
66
-
67
- if (checked) {
68
- var newValues = [].concat((0, _toConsumableArray2.default)(multiSelection), [id]);
69
- setMultiSelection(newValues);
70
- } else {
71
- var _newValues = multiSelection.filter(function (v) {
72
- return v !== id;
73
- });
74
-
75
- setMultiSelection(_newValues);
76
- }
77
- };
78
-
79
- var onNavigateItem = function onNavigateItem(_ref3) {
80
- var id = _ref3.id,
81
- title = _ref3.title;
82
- setParentSelected(id, title, parentId);
83
- };
84
-
85
- var isSelected = function isSelected(id) {
86
- if (multi) {
87
- return multiSelection.includes(id);
88
- }
89
-
90
- return id === singleSelection;
91
- };
92
-
93
- var getAvatarProps = function getAvatarProps(_ref4) {
94
- var src = _ref4.src,
95
- alt = _ref4.alt,
96
- icon = _ref4.icon,
97
- backgroundColor = _ref4.backgroundColor,
98
- theme = _ref4.theme;
99
- return {
100
- className: "".concat(blockClass, "-cell-avatar"),
101
- size: 'lg',
102
- theme: theme,
103
- image: src,
104
- imageDescription: alt,
105
- icon: icon,
106
- backgroundColor: backgroundColor
107
- };
108
- };
109
-
110
- var getItemIcon = function getItemIcon(_ref5) {
111
- var Icon = _ref5.icon;
112
- return /*#__PURE__*/_react.default.createElement(Icon, null);
113
- };
114
-
115
- var modifierHandler = function modifierHandler(id, selectedItem) {
116
- var modifiersClone = (0, _toConsumableArray2.default)(appliedModifiers);
117
- var modifierIdx = modifiersClone.findIndex(function (item) {
118
- return item.id === id;
119
- });
120
- modifiersClone[modifierIdx] = (0, _defineProperty2.default)({
121
- id: id
122
- }, modifiers.id, selectedItem);
123
- setAppliedModifiers(modifiersClone);
124
- };
125
-
126
- var metaPanelHandler = function metaPanelHandler(item) {
127
- if (item.meta) {
128
- setDisplayMetaPanel(item);
129
- }
130
- };
131
-
132
- var isInMetaPanel = function isInMetaPanel(id) {
133
- return id === (displayMetalPanel === null || displayMetalPanel === void 0 ? void 0 : displayMetalPanel.id);
134
- };
37
+ rest = (0, _objectWithoutProperties2.default)(_ref, _excluded);
38
+
39
+ var _useFocus = (0, _useFocus3.default)(filteredItems.length),
40
+ _useFocus2 = (0, _slicedToArray2.default)(_useFocus, 2),
41
+ focus = _useFocus2[0],
42
+ setFocus = _useFocus2[1];
135
43
 
136
44
  return /*#__PURE__*/_react.default.createElement("div", {
45
+ id: "add-select-focus",
137
46
  className: (0, _classnames.default)("".concat(blockClass, "-wrapper"), (0, _defineProperty2.default)({}, "".concat(blockClass, "-wrapper-multi"), multi))
138
47
  }, /*#__PURE__*/_react.default.createElement("div", {
139
48
  className: "".concat(blockClass)
140
49
  }, /*#__PURE__*/_react.default.createElement("div", {
141
- className: "".concat(blockClass, "-body")
142
- }, filteredItems.map(function (item) {
143
- var _cx2;
144
-
145
- return /*#__PURE__*/_react.default.createElement("div", {
50
+ className: "".concat(blockClass, "-body"),
51
+ role: "treegrid",
52
+ "aria-label": "add select tree label"
53
+ }, filteredItems.map(function (item, index) {
54
+ return /*#__PURE__*/_react.default.createElement(_AddSelectRow.AddSelectRow, (0, _extends2.default)({
146
55
  key: item.id,
147
- className: (0, _classnames.default)("".concat(blockClass, "-row"), (_cx2 = {}, (0, _defineProperty2.default)(_cx2, "".concat(blockClass, "-row--selected"), isSelected(item.id)), (0, _defineProperty2.default)(_cx2, "".concat(blockClass, "-row-meta--selected"), isInMetaPanel(item.id)), _cx2))
148
- }, /*#__PURE__*/_react.default.createElement("div", {
149
- className: "".concat(blockClass, "-cell")
150
- }, /*#__PURE__*/_react.default.createElement("div", {
151
- className: "".concat(blockClass, "-cell-wrapper")
152
- }, multi ? /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement("div", {
153
- className: "".concat(blockClass, "-checkbox")
154
- }, /*#__PURE__*/_react.default.createElement("div", null, /*#__PURE__*/_react.default.createElement(_react2.Checkbox, {
155
- onChange: handleMultiSelection,
156
- labelText: item.title,
157
- id: item.id,
158
- checked: isSelected(item.id),
159
- className: "".concat(blockClass, "-checkbox-wrapper")
160
- })), /*#__PURE__*/_react.default.createElement("div", {
161
- className: "".concat(blockClass, "-checkbox-label-wrapper")
162
- }, item.avatar && /*#__PURE__*/_react.default.createElement(_UserProfileImage.UserProfileImage, getAvatarProps(item.avatar)), item.icon && /*#__PURE__*/_react.default.createElement("div", {
163
- className: "".concat(blockClass, "-cell-icon")
164
- }, getItemIcon(item)), /*#__PURE__*/_react.default.createElement("div", {
165
- className: "".concat(blockClass, "-checkbox-label-text")
166
- }, /*#__PURE__*/_react.default.createElement("span", {
167
- className: "".concat(blockClass, "-cell-title")
168
- }, item.title), item.subtitle && /*#__PURE__*/_react.default.createElement("span", {
169
- className: "".concat(blockClass, "-cell-subtitle")
170
- }, item.subtitle)))), hasModifiers && /*#__PURE__*/_react.default.createElement(_react2.Dropdown, {
171
- id: "add-select-modifier-".concat(item.id),
172
- type: "inline",
173
- items: modifiers.options,
174
- label: modifiers.label,
175
- disabled: !isSelected(item.id),
176
- className: "".concat(blockClass, "-dropdown"),
177
- initialSelectedItem: item[modifiers.id],
178
- onChange: function onChange(_ref6) {
179
- var selectedItem = _ref6.selectedItem;
180
- return modifierHandler(item.id, selectedItem);
181
- }
182
- })) : /*#__PURE__*/_react.default.createElement(_react2.RadioButton, {
183
- className: "".concat(blockClass, "-radio"),
184
- name: "add-select-selections",
185
- id: item.id,
186
- value: item.value,
187
- labelText: item.title,
188
- onChange: function onChange() {
189
- return handleSingleSelection(item.id);
190
- },
191
- checked: isSelected(item.id)
192
- }), item.children && /*#__PURE__*/_react.default.createElement(_react2.Button, {
193
- className: "".concat(blockClass, "-view-children"),
194
- renderIcon: function renderIcon(props) {
195
- return /*#__PURE__*/_react.default.createElement(_icons.ChevronRight, (0, _extends2.default)({
196
- size: 16
197
- }, props));
198
- },
199
- iconDescription: navIconDescription,
200
- tooltipPosition: "left",
201
- tooltipAlignment: "center",
202
- hasIconOnly: true,
203
- onClick: function onClick() {
204
- return onNavigateItem(item);
205
- },
206
- kind: "ghost",
207
- size: "sm"
208
- }), item.meta && /*#__PURE__*/_react.default.createElement(_react2.Button, {
209
- className: "".concat(blockClass, "-view-meta"),
210
- renderIcon: function renderIcon(props) {
211
- return /*#__PURE__*/_react.default.createElement(_icons.View, (0, _extends2.default)({
212
- size: 16
213
- }, props));
214
- },
215
- iconDescription: metaIconDescription,
216
- tooltipPosition: "left",
217
- tooltipAlignment: "center",
218
- hasIconOnly: true,
219
- kind: "ghost",
220
- size: "sm",
221
- onClick: function onClick() {
222
- return metaPanelHandler(item);
223
- }
224
- }))));
56
+ index: index,
57
+ focus: focus,
58
+ setSize: filteredItems.length,
59
+ item: item,
60
+ multi: multi,
61
+ setFocus: setFocus
62
+ }, rest));
225
63
  }))));
226
64
  };
227
65
 
228
66
  exports.AddSelectList = AddSelectList;
229
67
  AddSelectList.propTypes = {
230
- appliedModifiers: _propTypes.default.array,
231
- displayMetalPanel: _propTypes.default.object,
232
68
  filteredItems: _propTypes.default.array,
233
- metaIconDescription: _propTypes.default.string,
234
- modifiers: _propTypes.default.object,
235
- multi: _propTypes.default.bool,
236
- multiSelection: _propTypes.default.array,
237
- navIconDescription: _propTypes.default.string,
238
- parentId: _propTypes.default.string,
239
- setAppliedModifiers: _propTypes.default.func,
240
- setDisplayMetaPanel: _propTypes.default.func,
241
- setMultiSelection: _propTypes.default.func,
242
- setParentSelected: _propTypes.default.func,
243
- setSingleSelection: _propTypes.default.func,
244
- singleSelection: _propTypes.default.string
69
+ focus: _propTypes.default.oneOfType([_propTypes.default.number, _propTypes.default.string]),
70
+ multi: _propTypes.default.bool
245
71
  };
246
72
  AddSelectList.displayName = componentName;