@carbon/ibm-products 1.22.0 → 1.24.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (114) hide show
  1. package/css/components/Datagrid/styles/datagrid.css +87 -11
  2. package/css/components/Datagrid/styles/datagrid.css.map +1 -1
  3. package/css/components/Datagrid/styles/index.css +94 -11
  4. package/css/components/Datagrid/styles/index.css.map +1 -1
  5. package/css/components/Datagrid/styles/useExpandedRow.css +9 -0
  6. package/css/components/Datagrid/styles/useExpandedRow.css.map +1 -0
  7. package/css/index-full-carbon.css +276 -181
  8. package/css/index-full-carbon.css.map +1 -1
  9. package/css/index-full-carbon.min.css +2 -8
  10. package/css/index-full-carbon.min.css.map +1 -1
  11. package/css/index-without-carbon-released-only.css +37 -41
  12. package/css/index-without-carbon-released-only.css.map +1 -1
  13. package/css/index-without-carbon-released-only.min.css +1 -7
  14. package/css/index-without-carbon-released-only.min.css.map +1 -1
  15. package/css/index-without-carbon.css +271 -54
  16. package/css/index-without-carbon.css.map +1 -1
  17. package/css/index-without-carbon.min.css +1 -7
  18. package/css/index-without-carbon.min.css.map +1 -1
  19. package/css/index.css +274 -177
  20. package/css/index.css.map +1 -1
  21. package/css/index.min.css +2 -8
  22. package/css/index.min.css.map +1 -1
  23. package/es/components/AddSelect/AddSelect.js +56 -423
  24. package/es/components/AddSelect/AddSelectBody.js +345 -0
  25. package/es/components/AddSelect/AddSelectBreadcrumbs.js +11 -31
  26. package/es/components/AddSelect/AddSelectColumn.js +95 -42
  27. package/es/components/AddSelect/AddSelectFilter.js +2 -3
  28. package/es/components/AddSelect/AddSelectList.js +11 -62
  29. package/es/components/AddSelect/AddSelectMetaPanel.js +9 -8
  30. package/es/components/AddSelect/AddSelectSidebar.js +24 -39
  31. package/es/components/AddSelect/AddSelectSort.js +4 -2
  32. package/es/components/AddSelect/add-select-utils.js +85 -59
  33. package/es/components/AddSelect/hooks/useParentSelect.js +16 -0
  34. package/es/components/AddSelect/hooks/usePath.js +66 -0
  35. package/es/components/Card/Card.js +1 -1
  36. package/es/components/CreateTearsheet/preview-components/MultiStepTearsheet.js +1 -5
  37. package/es/components/CreateTearsheet/preview-components/MultiStepWithIntro.js +1 -5
  38. package/es/components/Datagrid/Datagrid/Datagrid.js +17 -12
  39. package/es/components/Datagrid/Datagrid/DatagridRow.js +4 -2
  40. package/es/components/Datagrid/useExpandedRow.js +1 -0
  41. package/es/components/Datagrid/useOnRowClick.js +10 -3
  42. package/es/components/EditFullPage/EditFullPage.js +79 -0
  43. package/es/components/EditFullPage/index.js +7 -0
  44. package/es/components/EditTearsheet/EditTearsheet.js +205 -0
  45. package/es/components/EditTearsheet/EditTearsheetForm.js +103 -0
  46. package/es/components/EditTearsheet/index.js +8 -0
  47. package/es/components/EditTearsheet/preview-components/MultiFormEditTearsheet.js +230 -0
  48. package/es/components/EditTearsheetNarrow/EditTearsheetNarrow.js +79 -0
  49. package/es/components/EditTearsheetNarrow/index.js +7 -0
  50. package/es/components/PageHeader/PageHeaderUtils.js +5 -0
  51. package/es/components/TagSet/TagSet.js +15 -5
  52. package/es/components/WebTerminal/WebTerminal.js +5 -3
  53. package/es/components/index.js +4 -1
  54. package/es/global/js/package-settings.js +4 -1
  55. package/lib/components/AddSelect/AddSelect.js +53 -431
  56. package/lib/components/AddSelect/AddSelectBody.js +380 -0
  57. package/lib/components/AddSelect/AddSelectBreadcrumbs.js +11 -30
  58. package/lib/components/AddSelect/AddSelectColumn.js +93 -40
  59. package/lib/components/AddSelect/AddSelectFilter.js +2 -3
  60. package/lib/components/AddSelect/AddSelectList.js +12 -61
  61. package/lib/components/AddSelect/AddSelectMetaPanel.js +9 -8
  62. package/lib/components/AddSelect/AddSelectSidebar.js +22 -38
  63. package/lib/components/AddSelect/AddSelectSort.js +4 -2
  64. package/lib/components/AddSelect/add-select-utils.js +88 -64
  65. package/lib/components/AddSelect/hooks/useParentSelect.js +27 -0
  66. package/lib/components/AddSelect/hooks/usePath.js +75 -0
  67. package/lib/components/Card/Card.js +1 -1
  68. package/lib/components/CreateTearsheet/preview-components/MultiStepTearsheet.js +1 -5
  69. package/lib/components/CreateTearsheet/preview-components/MultiStepWithIntro.js +1 -5
  70. package/lib/components/Datagrid/Datagrid/Datagrid.js +17 -12
  71. package/lib/components/Datagrid/Datagrid/DatagridRow.js +3 -1
  72. package/lib/components/Datagrid/useExpandedRow.js +1 -0
  73. package/lib/components/Datagrid/useOnRowClick.js +10 -3
  74. package/lib/components/EditFullPage/EditFullPage.js +85 -0
  75. package/lib/components/EditFullPage/index.js +13 -0
  76. package/lib/components/EditTearsheet/EditTearsheet.js +229 -0
  77. package/lib/components/EditTearsheet/EditTearsheetForm.js +122 -0
  78. package/lib/components/EditTearsheet/index.js +21 -0
  79. package/lib/components/EditTearsheet/preview-components/MultiFormEditTearsheet.js +254 -0
  80. package/lib/components/EditTearsheetNarrow/EditTearsheetNarrow.js +85 -0
  81. package/lib/components/EditTearsheetNarrow/index.js +13 -0
  82. package/lib/components/PageHeader/PageHeaderUtils.js +5 -0
  83. package/lib/components/TagSet/TagSet.js +15 -5
  84. package/lib/components/WebTerminal/WebTerminal.js +5 -2
  85. package/lib/components/index.js +25 -1
  86. package/lib/global/js/package-settings.js +4 -1
  87. package/package.json +16 -16
  88. package/scss/components/Cascade/_cascade.scss +2 -1
  89. package/scss/components/CreateInfluencer/_create-influencer.scss +2 -2
  90. package/scss/components/CreateTearsheet/_create-tearsheet.scss +1 -1
  91. package/scss/components/Datagrid/_datagrid.scss +0 -1
  92. package/scss/components/Datagrid/_storybook-styles.scss +57 -0
  93. package/scss/components/Datagrid/styles/datagrid.scss +97 -12
  94. package/scss/components/Datagrid/styles/index.scss +1 -0
  95. package/scss/components/Datagrid/styles/useExpandedRow.scss +7 -0
  96. package/scss/components/EditFullPage/_edit-full-page.scss +34 -0
  97. package/scss/components/EditFullPage/_index.scss +8 -0
  98. package/scss/components/EditFullPage/_storybook-styles.scss +10 -0
  99. package/scss/components/EditTearsheet/_edit-tearsheet.scss +132 -0
  100. package/scss/components/EditTearsheet/_index.scss +8 -0
  101. package/scss/components/EditTearsheet/_storybook-styles.scss +55 -0
  102. package/scss/components/EditTearsheetNarrow/_edit-tearsheet-narrow.scss +34 -0
  103. package/scss/components/EditTearsheetNarrow/_index.scss +8 -0
  104. package/scss/components/EditTearsheetNarrow/_storybook-styles.scss +10 -0
  105. package/scss/components/InlineEdit/_inline-edit.scss +10 -21
  106. package/scss/components/NotificationsPanel/_notifications-panel.scss +1 -0
  107. package/scss/components/OptionsTile/_options-tile.scss +1 -0
  108. package/scss/components/PageHeader/_page-header.scss +11 -4
  109. package/scss/components/SidePanel/_side-panel.scss +1 -2
  110. package/scss/components/StatusIcon/_status-icon.scss +1 -1
  111. package/scss/components/TagSet/_tag-set.scss +4 -0
  112. package/scss/components/Tearsheet/_tearsheet.scss +2 -2
  113. package/scss/components/WebTerminal/_web-terminal.scss +2 -1
  114. package/scss/components/_index.scss +3 -0
@@ -0,0 +1,345 @@
1
+ import _extends from "@babel/runtime/helpers/extends";
2
+ import _defineProperty from "@babel/runtime/helpers/defineProperty";
3
+ import _slicedToArray from "@babel/runtime/helpers/slicedToArray";
4
+ import _objectWithoutProperties from "@babel/runtime/helpers/objectWithoutProperties";
5
+ var _excluded = ["className", "clearFiltersText", "closeIconDescription", "columnInputPlaceholder", "defaultModifiers", "description", "globalFilterOpts", "globalFiltersIconDescription", "globalFiltersPlaceholderText", "globalFiltersPrimaryButtonText", "globalFiltersSecondaryButtonText", "globalSearchLabel", "globalSearchPlaceholder", "globalSortBy", "influencerTitle", "items", "itemsLabel", "metaIconDescription", "metaPanelTitle", "multi", "navIconDescription", "noResultsDescription", "noResultsTitle", "noSelectionDescription", "noSelectionTitle", "normalizedItems", "onClose", "onCloseButtonText", "onSubmit", "onSubmitButtonText", "open", "portalTarget", "searchResultsLabel", "title", "useNormalizedItems"];
6
+ //
7
+ // Copyright IBM Corp. 2022
8
+ //
9
+ // This source code is licensed under the Apache-2.0 license found in the
10
+ // LICENSE file in the root directory of this source tree.
11
+ //
12
+ import React, { useState } from 'react';
13
+ import PropTypes from 'prop-types';
14
+ import cx from 'classnames';
15
+ import { Tag } from 'carbon-components-react';
16
+ import { Tearsheet, TearsheetNarrow } from '../../components/Tearsheet';
17
+ import { NoDataEmptyState } from '../../components/EmptyStates/NoDataEmptyState';
18
+ import { AddSelectSidebar } from './AddSelectSidebar';
19
+ import { AddSelectBreadcrumbs } from './AddSelectBreadcrumbs';
20
+ import { AddSelectList } from './AddSelectList';
21
+ import { AddSelectColumn } from './AddSelectColumn';
22
+ import { AddSelectFilter } from './AddSelectFilter';
23
+ import { AddSelectSort } from './AddSelectSort';
24
+ import { sortItems, getFilteredItems } from './add-select-utils';
25
+ import { useItemSort } from './hooks/useItemSort';
26
+ import useParentSelect from './hooks/useParentSelect';
27
+ import usePath from './hooks/usePath';
28
+ import { pkg } from '../../settings';
29
+ var blockClass = "".concat(pkg.prefix, "--add-select");
30
+ var componentName = 'AddSelectBody';
31
+ export var AddSelectBody = function AddSelectBody(_ref) {
32
+ var _cx, _path$;
33
+
34
+ var className = _ref.className,
35
+ clearFiltersText = _ref.clearFiltersText,
36
+ closeIconDescription = _ref.closeIconDescription,
37
+ columnInputPlaceholder = _ref.columnInputPlaceholder,
38
+ defaultModifiers = _ref.defaultModifiers,
39
+ description = _ref.description,
40
+ globalFilterOpts = _ref.globalFilterOpts,
41
+ globalFiltersIconDescription = _ref.globalFiltersIconDescription,
42
+ globalFiltersPlaceholderText = _ref.globalFiltersPlaceholderText,
43
+ globalFiltersPrimaryButtonText = _ref.globalFiltersPrimaryButtonText,
44
+ globalFiltersSecondaryButtonText = _ref.globalFiltersSecondaryButtonText,
45
+ globalSearchLabel = _ref.globalSearchLabel,
46
+ globalSearchPlaceholder = _ref.globalSearchPlaceholder,
47
+ globalSortBy = _ref.globalSortBy,
48
+ influencerTitle = _ref.influencerTitle,
49
+ items = _ref.items,
50
+ itemsLabel = _ref.itemsLabel,
51
+ metaIconDescription = _ref.metaIconDescription,
52
+ metaPanelTitle = _ref.metaPanelTitle,
53
+ multi = _ref.multi,
54
+ navIconDescription = _ref.navIconDescription,
55
+ noResultsDescription = _ref.noResultsDescription,
56
+ noResultsTitle = _ref.noResultsTitle,
57
+ noSelectionDescription = _ref.noSelectionDescription,
58
+ noSelectionTitle = _ref.noSelectionTitle,
59
+ normalizedItems = _ref.normalizedItems,
60
+ onClose = _ref.onClose,
61
+ onCloseButtonText = _ref.onCloseButtonText,
62
+ onSubmit = _ref.onSubmit,
63
+ onSubmitButtonText = _ref.onSubmitButtonText,
64
+ open = _ref.open,
65
+ portalTarget = _ref.portalTarget,
66
+ searchResultsLabel = _ref.searchResultsLabel,
67
+ title = _ref.title,
68
+ useNormalizedItems = _ref.useNormalizedItems,
69
+ rest = _objectWithoutProperties(_ref, _excluded);
70
+
71
+ // hooks
72
+ var _useState = useState(''),
73
+ _useState2 = _slicedToArray(_useState, 2),
74
+ singleSelection = _useState2[0],
75
+ setSingleSelection = _useState2[1];
76
+
77
+ var _useState3 = useState([]),
78
+ _useState4 = _slicedToArray(_useState3, 2),
79
+ multiSelection = _useState4[0],
80
+ setMultiSelection = _useState4[1];
81
+
82
+ var _useState5 = useState(''),
83
+ _useState6 = _slicedToArray(_useState5, 2),
84
+ searchTerm = _useState6[0],
85
+ setSearchTerm = _useState6[1];
86
+
87
+ var _useState7 = useState({}),
88
+ _useState8 = _slicedToArray(_useState7, 2),
89
+ appliedGlobalFilters = _useState8[0],
90
+ setAppliedGlobalFilters = _useState8[1];
91
+
92
+ var _useState9 = useState({}),
93
+ _useState10 = _slicedToArray(_useState9, 2),
94
+ displayMetalPanel = _useState10[0],
95
+ setDisplayMetaPanel = _useState10[1];
96
+
97
+ var _useState11 = useState(defaultModifiers),
98
+ _useState12 = _slicedToArray(_useState11, 2),
99
+ appliedModifiers = _useState12[0],
100
+ setAppliedModifiers = _useState12[1];
101
+
102
+ var _useItemSort = useItemSort(),
103
+ sortDirection = _useItemSort.sortDirection,
104
+ setSortDirection = _useItemSort.setSortDirection,
105
+ sortAttribute = _useItemSort.sortAttribute,
106
+ setSortAttribute = _useItemSort.setSortAttribute;
107
+
108
+ var _useParentSelect = useParentSelect(),
109
+ parentSelected = _useParentSelect.parentSelected,
110
+ setParentSelected = _useParentSelect.setParentSelected;
111
+
112
+ var _usePath = usePath(itemsLabel),
113
+ path = _usePath.path,
114
+ setPath = _usePath.setPath,
115
+ pathOnclick = _usePath.pathOnclick;
116
+
117
+ var classNames = cx(className, blockClass, (_cx = {}, _defineProperty(_cx, "".concat(blockClass, "__single"), !multi), _defineProperty(_cx, "".concat(blockClass, "__multi"), multi), _cx));
118
+ var globalFilterKeys = Object.keys(appliedGlobalFilters);
119
+ var globalFiltersApplied = globalFilterKeys.length > 0; // handlers
120
+
121
+ var handleSearch = function handleSearch(term) {
122
+ setSearchTerm(term);
123
+ };
124
+
125
+ var handleFilter = function handleFilter(filters) {
126
+ setAppliedGlobalFilters(filters);
127
+ };
128
+
129
+ var submitHandler = function submitHandler() {
130
+ if (multi && appliedModifiers.length > 0) {
131
+ var selections = multiSelection.map(function (item) {
132
+ return appliedModifiers.find(function (mod) {
133
+ return mod.id === item;
134
+ });
135
+ });
136
+ onSubmit(selections);
137
+ } else if (multi && appliedModifiers.length === 0) {
138
+ onSubmit(multiSelection);
139
+ } else {
140
+ onSubmit(singleSelection);
141
+ }
142
+ };
143
+
144
+ var setShowBreadsCrumbs = function setShowBreadsCrumbs() {
145
+ if (searchTerm || globalFiltersApplied || !path || path.length === 0) {
146
+ return false;
147
+ }
148
+
149
+ return true;
150
+ };
151
+
152
+ var setShowTags = function setShowTags() {
153
+ if (searchTerm) {
154
+ return true;
155
+ }
156
+
157
+ if (useNormalizedItems) {
158
+ return false;
159
+ }
160
+
161
+ return true;
162
+ };
163
+
164
+ var parentSelectionHandler = function parentSelectionHandler(id, title, parentId) {
165
+ setParentSelected(id);
166
+ setPath(id, title, parentId);
167
+ };
168
+
169
+ var sortFn = sortItems(sortAttribute, sortDirection);
170
+ var itemsToDisplay = getFilteredItems(useNormalizedItems, normalizedItems, searchTerm, globalFiltersApplied, globalFilterKeys, appliedGlobalFilters, sortFn, multi, items, path);
171
+ var hasResults = itemsToDisplay.length > 0;
172
+ var showBreadsCrumbs = setShowBreadsCrumbs();
173
+ var showSort = (searchTerm || globalFiltersApplied) && hasResults;
174
+ var showTags = setShowTags();
175
+ var commonListProps = {
176
+ metaIconDescription: metaIconDescription,
177
+ multi: multi,
178
+ multiSelection: multiSelection,
179
+ navIconDescription: navIconDescription,
180
+ path: path,
181
+ setMultiSelection: setMultiSelection,
182
+ setPath: setPath,
183
+ setSingleSelection: setSingleSelection,
184
+ singleSelection: singleSelection,
185
+ setDisplayMetaPanel: setDisplayMetaPanel,
186
+ parentId: path[0].id
187
+ };
188
+ var commonTearsheetProps = {
189
+ className: classNames,
190
+ open: open,
191
+ title: title,
192
+ description: description,
193
+ closeIconDescription: 'temp description',
194
+ actions: [{
195
+ label: onCloseButtonText,
196
+ kind: 'secondary',
197
+ onClick: onClose
198
+ }, {
199
+ label: onSubmitButtonText,
200
+ kind: 'primary',
201
+ onClick: submitHandler,
202
+ disabled: multi ? multiSelection.length === 0 : !singleSelection
203
+ }],
204
+ portalTarget: portalTarget
205
+ };
206
+ var sidebarProps = {
207
+ appliedModifiers: appliedModifiers,
208
+ closeIconDescription: closeIconDescription,
209
+ displayMetalPanel: displayMetalPanel,
210
+ influencerTitle: influencerTitle,
211
+ items: useNormalizedItems ? normalizedItems : items.entries,
212
+ metaPanelTitle: metaPanelTitle,
213
+ modifiers: items.modifiers,
214
+ multiSelection: multiSelection,
215
+ noSelectionDescription: noSelectionDescription,
216
+ noSelectionTitle: noSelectionTitle,
217
+ setDisplayMetaPanel: setDisplayMetaPanel
218
+ };
219
+ var displayColumnView = multi && useNormalizedItems && !searchTerm && !globalFiltersApplied; // main content
220
+
221
+ var body = /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement("div", {
222
+ className: "".concat(blockClass, "__header")
223
+ }, /*#__PURE__*/React.createElement(AddSelectFilter, {
224
+ inputLabel: globalSearchLabel,
225
+ inputPlaceholder: globalSearchPlaceholder,
226
+ searchTerm: searchTerm,
227
+ handleSearch: handleSearch,
228
+ multi: multi,
229
+ filterOpts: globalFilterOpts,
230
+ handleFilter: handleFilter,
231
+ primaryButtonText: globalFiltersPrimaryButtonText,
232
+ secondaryButtonText: globalFiltersSecondaryButtonText,
233
+ placeholder: globalFiltersPlaceholderText,
234
+ iconDescription: globalFiltersIconDescription,
235
+ appliedFilters: appliedGlobalFilters,
236
+ hasFiltersApplied: globalFiltersApplied,
237
+ clearFiltersText: clearFiltersText
238
+ }), /*#__PURE__*/React.createElement("div", {
239
+ className: "".concat(blockClass, "__sub-header")
240
+ }, /*#__PURE__*/React.createElement("div", {
241
+ className: "".concat(blockClass, "__tag-container")
242
+ }, showBreadsCrumbs ? /*#__PURE__*/React.createElement(AddSelectBreadcrumbs, {
243
+ path: path,
244
+ onClick: pathOnclick
245
+ }) : /*#__PURE__*/React.createElement("p", {
246
+ className: "".concat(blockClass, "__tag-container-label")
247
+ }, searchTerm ? searchResultsLabel : itemsLabel), showTags && /*#__PURE__*/React.createElement(Tag, {
248
+ type: "gray",
249
+ size: "sm"
250
+ }, itemsToDisplay.length)), showSort && /*#__PURE__*/React.createElement(AddSelectSort, {
251
+ items: itemsToDisplay,
252
+ setSortAttribute: setSortAttribute,
253
+ setSortDirection: setSortDirection,
254
+ sortAttribute: sortAttribute,
255
+ sortDirection: sortDirection,
256
+ sortBy: globalSortBy
257
+ }))), displayColumnView ? /*#__PURE__*/React.createElement("div", {
258
+ className: "".concat(blockClass, "__columns")
259
+ }, /*#__PURE__*/React.createElement(AddSelectColumn, _extends({}, commonListProps, {
260
+ items: itemsToDisplay,
261
+ columnInputPlaceholder: columnInputPlaceholder,
262
+ header: (_path$ = path[0]) === null || _path$ === void 0 ? void 0 : _path$.title
263
+ }))) : /*#__PURE__*/React.createElement("div", null, hasResults ? /*#__PURE__*/React.createElement(AddSelectList, _extends({}, commonListProps, {
264
+ filteredItems: itemsToDisplay,
265
+ modifiers: items.modifiers,
266
+ appliedModifiers: appliedModifiers,
267
+ setAppliedModifiers: setAppliedModifiers,
268
+ setParentSelected: parentSelectionHandler,
269
+ parentSelected: parentSelected,
270
+ parentId: parentSelected || path[0].id
271
+ })) : /*#__PURE__*/React.createElement("div", {
272
+ className: "".concat(blockClass, "__body")
273
+ }, /*#__PURE__*/React.createElement(NoDataEmptyState, {
274
+ subtitle: noResultsDescription,
275
+ title: noResultsTitle
276
+ }))));
277
+ return /*#__PURE__*/React.createElement("div", rest, multi ? /*#__PURE__*/React.createElement(Tearsheet, _extends({}, commonTearsheetProps, {
278
+ influencer: multi && /*#__PURE__*/React.createElement(AddSelectSidebar, sidebarProps),
279
+ influencerPosition: "right"
280
+ }), body) : /*#__PURE__*/React.createElement(TearsheetNarrow, commonTearsheetProps, body));
281
+ };
282
+ AddSelectBody.propTypes = {
283
+ className: PropTypes.string,
284
+ clearFiltersText: PropTypes.string,
285
+ closeIconDescription: PropTypes.string,
286
+ columnInputPlaceholder: PropTypes.string,
287
+ defaultModifiers: PropTypes.array,
288
+ description: PropTypes.string,
289
+ globalFilterOpts: PropTypes.array,
290
+ globalFiltersIconDescription: PropTypes.string,
291
+ globalFiltersPlaceholderText: PropTypes.string,
292
+ globalFiltersPrimaryButtonText: PropTypes.string,
293
+ globalFiltersSecondaryButtonText: PropTypes.string,
294
+ globalSearchLabel: PropTypes.string.isRequired,
295
+ globalSearchPlaceholder: PropTypes.string,
296
+ globalSortBy: PropTypes.array,
297
+ influencerTitle: PropTypes.string,
298
+ items: PropTypes.shape({
299
+ modifiers: PropTypes.shape({
300
+ id: PropTypes.string,
301
+ label: PropTypes.string,
302
+ options: PropTypes.array
303
+ }),
304
+ sortBy: PropTypes.array,
305
+ filterBy: PropTypes.array,
306
+ entries: PropTypes.arrayOf(PropTypes.shape({
307
+ avatar: PropTypes.shape({
308
+ alt: PropTypes.string,
309
+ icon: PropTypes.object,
310
+ src: PropTypes.string
311
+ }),
312
+ children: PropTypes.object,
313
+ icon: PropTypes.object,
314
+ id: PropTypes.string.isRequired,
315
+ meta: PropTypes.oneOfType([PropTypes.arrayOf(PropTypes.shape({
316
+ id: PropTypes.string,
317
+ title: PropTypes.string,
318
+ value: PropTypes.string
319
+ })), PropTypes.node]),
320
+ subtitle: PropTypes.string,
321
+ title: PropTypes.string.isRequired,
322
+ value: PropTypes.string.isRequired
323
+ }))
324
+ }),
325
+ itemsLabel: PropTypes.string,
326
+ metaIconDescription: PropTypes.string,
327
+ metaPanelTitle: PropTypes.string,
328
+ multi: PropTypes.bool,
329
+ navIconDescription: PropTypes.string,
330
+ noResultsDescription: PropTypes.string,
331
+ noResultsTitle: PropTypes.string,
332
+ noSelectionDescription: PropTypes.string,
333
+ noSelectionTitle: PropTypes.string,
334
+ normalizedItems: PropTypes.object,
335
+ onClose: PropTypes.func,
336
+ onCloseButtonText: PropTypes.string,
337
+ onSubmit: PropTypes.func,
338
+ onSubmitButtonText: PropTypes.string,
339
+ open: PropTypes.bool,
340
+ portalTarget: PropTypes.node,
341
+ searchResultsLabel: PropTypes.string,
342
+ title: PropTypes.string,
343
+ useNormalizedItems: PropTypes.bool
344
+ };
345
+ AddSelectBreadcrumbs.displayName = componentName;
@@ -1,4 +1,3 @@
1
- import _toConsumableArray from "@babel/runtime/helpers/toConsumableArray";
2
1
  //
3
2
  // Copyright IBM Corp. 2022
4
3
  //
@@ -10,47 +9,28 @@ import { Breadcrumb, BreadcrumbItem } from 'carbon-components-react';
10
9
  import PropTypes from 'prop-types';
11
10
  var componentName = 'AddSelectBreadcrumbs';
12
11
  export var AddSelectBreadcrumbs = function AddSelectBreadcrumbs(_ref) {
13
- var itemsLabel = _ref.itemsLabel,
14
- path = _ref.path,
15
- setPath = _ref.setPath;
12
+ var path = _ref.path,
13
+ onClick = _ref.onClick;
16
14
 
17
- var clickHandler = function clickHandler(id) {
18
- var pathIdx = path.findIndex(function (entry) {
19
- return entry.id === id;
20
- });
21
-
22
- var finalPath = _toConsumableArray(path).splice(0, pathIdx + 1);
23
-
24
- setPath(finalPath);
25
- };
26
-
27
- var resetPath = function resetPath() {
28
- setPath([]);
15
+ var clickHandler = function clickHandler(idx) {
16
+ onClick(idx);
29
17
  };
30
18
 
31
19
  return /*#__PURE__*/React.createElement(Breadcrumb, {
32
20
  noTrailingSlash: true
33
- }, /*#__PURE__*/React.createElement(BreadcrumbItem, {
34
- onClick: resetPath
35
- }, itemsLabel), path.map(function (entry, idx, arr) {
36
- var isCurrentPage = idx === arr.length - 1;
37
-
38
- var crumbHandler = function crumbHandler() {
39
- if (!isCurrentPage) {
40
- clickHandler(entry.id);
41
- }
42
- };
43
-
21
+ }, path.map(function (entry, idx) {
22
+ var isCurrentPage = idx === path.length - 1;
44
23
  return /*#__PURE__*/React.createElement(BreadcrumbItem, {
45
24
  key: entry.id,
46
25
  isCurrentPage: isCurrentPage,
47
- onClick: crumbHandler
26
+ onClick: function onClick() {
27
+ return clickHandler(idx);
28
+ }
48
29
  }, entry.title);
49
30
  }));
50
31
  };
51
32
  AddSelectBreadcrumbs.propTypes = {
52
- itemsLabel: PropTypes.string,
53
- path: PropTypes.array,
54
- setPath: PropTypes.func
33
+ onClick: PropTypes.func,
34
+ path: PropTypes.array
55
35
  };
56
36
  AddSelectBreadcrumbs.displayName = componentName;
@@ -2,43 +2,46 @@ import _extends from "@babel/runtime/helpers/extends";
2
2
  import _toConsumableArray from "@babel/runtime/helpers/toConsumableArray";
3
3
  import _slicedToArray from "@babel/runtime/helpers/slicedToArray";
4
4
  import _objectWithoutProperties from "@babel/runtime/helpers/objectWithoutProperties";
5
- var _excluded = ["columnInputPlaceholder", "filteredItems", "header", "multiSelection", "setMultiSelection"];
5
+ var _excluded = ["columnInputPlaceholder", "header", "items", "multiSelection", "parentId", "path", "setMultiSelection", "setPath"];
6
6
  //
7
7
  // Copyright IBM Corp. 2022
8
8
  //
9
9
  // This source code is licensed under the Apache-2.0 license found in the
10
10
  // LICENSE file in the root directory of this source tree.
11
11
  //
12
- import React, { useState, useEffect } from 'react';
12
+ import React, { useState } from 'react';
13
13
  import PropTypes from 'prop-types';
14
14
  import { TextInput, Tag, OverflowMenu, Checkbox } from 'carbon-components-react';
15
15
  import { Filter32 } from '@carbon/icons-react';
16
16
  import { pkg, carbon } from '../../settings';
17
17
  import { AddSelectList } from './AddSelectList';
18
18
  import { AddSelectSort } from './AddSelectSort';
19
- import { sortItems, getSortBy } from './add-select-utils';
19
+ import { sortItems } from './add-select-utils';
20
20
  import { useItemSort } from './hooks/useItemSort';
21
21
  import uuidv4 from '../../global/js/utils/uuidv4';
22
- var componentName = 'AddSelect';
22
+ import useParentSelect from './hooks/useParentSelect';
23
+ var blockClass = "".concat(pkg.prefix, "--add-select");
24
+ var colClass = "".concat(blockClass, "__column");
25
+ var componentName = 'AddSelectColumn';
23
26
  export var AddSelectColumn = function AddSelectColumn(_ref) {
24
- var _filteredItems$find;
25
-
26
27
  var columnInputPlaceholder = _ref.columnInputPlaceholder,
27
- filteredItems = _ref.filteredItems,
28
28
  header = _ref.header,
29
+ items = _ref.items,
29
30
  multiSelection = _ref.multiSelection,
31
+ parentId = _ref.parentId,
32
+ path = _ref.path,
30
33
  setMultiSelection = _ref.setMultiSelection,
34
+ setPath = _ref.setPath,
31
35
  props = _objectWithoutProperties(_ref, _excluded);
32
36
 
33
- var _useState = useState(false),
34
- _useState2 = _slicedToArray(_useState, 2),
35
- allSelected = _useState2[0],
36
- setAllSelected = _useState2[1];
37
+ var _useParentSelect = useParentSelect(),
38
+ parentSelected = _useParentSelect.parentSelected,
39
+ setParentSelected = _useParentSelect.setParentSelected;
37
40
 
38
- var _useState3 = useState(''),
39
- _useState4 = _slicedToArray(_useState3, 2),
40
- searchTerm = _useState4[0],
41
- setSearchTerm = _useState4[1];
41
+ var _useState = useState(''),
42
+ _useState2 = _slicedToArray(_useState, 2),
43
+ searchTerm = _useState2[0],
44
+ setSearchTerm = _useState2[1];
42
45
 
43
46
  var _useItemSort = useItemSort(),
44
47
  sortDirection = _useItemSort.sortDirection,
@@ -46,34 +49,66 @@ export var AddSelectColumn = function AddSelectColumn(_ref) {
46
49
  sortAttribute = _useItemSort.sortAttribute,
47
50
  setSortAttribute = _useItemSort.setSortAttribute;
48
51
 
49
- var _useState5 = useState([]),
50
- _useState6 = _slicedToArray(_useState5, 2),
51
- filters = _useState6[0],
52
- setFilters = _useState6[1];
52
+ var _useState3 = useState([]),
53
+ _useState4 = _slicedToArray(_useState3, 2),
54
+ filters = _useState4[0],
55
+ setFilters = _useState4[1];
56
+
57
+ var entries = items.entries,
58
+ filterBy = items.filterBy,
59
+ sortBy = items.sortBy;
53
60
 
54
- var blockClass = "".concat(pkg.prefix, "--add-select");
55
- var colClass = "".concat(blockClass, "__column");
56
- useEffect(function () {
57
- var isAllSelected = filteredItems.every(function (item) {
58
- return multiSelection.includes(item.id);
61
+ var getSelectedItem = function getSelectedItem() {
62
+ var _entries$find;
63
+
64
+ var parentInPath = path.find(function (entry) {
65
+ return entry.parentId === parentId;
59
66
  });
60
- setAllSelected(isAllSelected);
61
- }, [filteredItems, multiSelection]); // filtering
62
-
63
- var colFilterBy = (_filteredItems$find = filteredItems.find(function (item) {
64
- return item.filterBy;
65
- })) === null || _filteredItems$find === void 0 ? void 0 : _filteredItems$find.filterBy;
66
- var filterByOpts = colFilterBy ? filteredItems.map(function (item) {
67
- return item[colFilterBy];
67
+ /**
68
+ * this check helps ensure that when the state of the open columns is cleared by global search
69
+ * that the columns are rebuilt from the data in the path array
70
+ */
71
+
72
+ if (parentInPath && !parentSelected) {
73
+ return entries.find(function (item) {
74
+ return item.id === parentInPath.id;
75
+ });
76
+ }
77
+
78
+ return (_entries$find = entries.find(function (item) {
79
+ return item.id === parentSelected;
80
+ })) !== null && _entries$find !== void 0 ? _entries$find : null;
81
+ };
82
+
83
+ var selectedItem = getSelectedItem();
84
+ /**
85
+ * this check helps prevent children from already being open when you switch from parents
86
+ * on the same level. for example- using the storybook example, if you click on folder 1,
87
+ * file 1, folder 2, and then folder 1 again file 1 children shouldn't be expanded. this
88
+ * check ensures that when a user navigates to parents on the same level that the open state
89
+ * of their children is cleared by referencing the path array.
90
+ */
91
+
92
+ var itemInPath = selectedItem && path.find(function (entry) {
93
+ return entry.id === selectedItem.id;
94
+ });
95
+ var allSelected = entries.every(function (item) {
96
+ return multiSelection.includes(item.id);
97
+ }); // filtering
98
+
99
+ var filterByOpts = filterBy ? entries.map(function (item) {
100
+ return item[filterBy];
68
101
  }) : [];
69
102
 
70
103
  var selectAllHandler = function selectAllHandler(checked) {
71
- var itemIds = filteredItems.map(function (item) {
104
+ var itemIds = entries.map(function (item) {
72
105
  return item.id;
73
106
  });
74
107
 
75
108
  if (checked) {
76
- setMultiSelection([].concat(_toConsumableArray(multiSelection), _toConsumableArray(itemIds)));
109
+ var newSelections = _toConsumableArray(new Set([].concat(_toConsumableArray(multiSelection), _toConsumableArray(itemIds))));
110
+
111
+ setMultiSelection(newSelections);
77
112
  } else {
78
113
  var newItems = multiSelection.filter(function (i) {
79
114
  return !itemIds.includes(i);
@@ -113,12 +148,16 @@ export var AddSelectColumn = function AddSelectColumn(_ref) {
113
148
  };
114
149
 
115
150
  var sortFn = sortItems(sortAttribute, sortDirection);
116
- var sortBy = getSortBy(filteredItems);
117
- var colItems = filteredItems.filter(filterBySearch) // first check if the item meets the search
151
+ var colItems = entries.filter(filterBySearch) // first check if the item meets the search
118
152
  .filter(filterByAttribute) // then check if the item is included in the filter
119
153
  .sort(sortFn); // then sort the items by whatever criteria
120
154
 
121
- return /*#__PURE__*/React.createElement("div", {
155
+ var parentSelectionHandler = function parentSelectionHandler(id, title) {
156
+ setParentSelected(id);
157
+ setPath(id, title, parentId);
158
+ };
159
+
160
+ return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement("div", {
122
161
  className: colClass
123
162
  }, /*#__PURE__*/React.createElement("div", {
124
163
  className: "".concat(colClass, "-search-bar")
@@ -135,7 +174,7 @@ export var AddSelectColumn = function AddSelectColumn(_ref) {
135
174
  }), /*#__PURE__*/React.createElement("div", {
136
175
  className: "".concat(colClass, "-sort-filter")
137
176
  }, /*#__PURE__*/React.createElement(AddSelectSort, {
138
- items: filteredItems,
177
+ items: entries,
139
178
  setSortAttribute: setSortAttribute,
140
179
  setSortDirection: setSortDirection,
141
180
  sortAttribute: sortAttribute,
@@ -165,6 +204,7 @@ export var AddSelectColumn = function AddSelectColumn(_ref) {
165
204
  className: "".concat(blockClass, "__tag-container")
166
205
  }, /*#__PURE__*/React.createElement(Checkbox, {
167
206
  id: "".concat(uuidv4(), "-select-all"),
207
+ className: "".concat(colClass, "__select-all"),
168
208
  checked: allSelected,
169
209
  onChange: selectAllHandler,
170
210
  labelText: /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement("span", {
@@ -176,14 +216,27 @@ export var AddSelectColumn = function AddSelectColumn(_ref) {
176
216
  })), /*#__PURE__*/React.createElement(AddSelectList, _extends({}, props, {
177
217
  filteredItems: colItems,
178
218
  setMultiSelection: setMultiSelection,
179
- multiSelection: multiSelection
180
- })));
219
+ multiSelection: multiSelection,
220
+ setParentSelected: parentSelectionHandler
221
+ }))), selectedItem && itemInPath && /*#__PURE__*/React.createElement(AddSelectColumn, _extends({
222
+ columnInputPlaceholder: columnInputPlaceholder,
223
+ header: selectedItem.title,
224
+ items: selectedItem.children,
225
+ multiSelection: multiSelection,
226
+ setMultiSelection: setMultiSelection,
227
+ parentId: selectedItem.id,
228
+ setPath: setPath,
229
+ path: path
230
+ }, props)));
181
231
  };
182
232
  AddSelectColumn.propTypes = {
183
233
  columnInputPlaceholder: PropTypes.string,
184
- filteredItems: PropTypes.array,
185
234
  header: PropTypes.string,
235
+ items: PropTypes.object,
186
236
  multiSelection: PropTypes.array,
187
- setMultiSelection: PropTypes.func
237
+ parentId: PropTypes.string,
238
+ path: PropTypes.array,
239
+ setMultiSelection: PropTypes.func,
240
+ setPath: PropTypes.func
188
241
  };
189
242
  AddSelectColumn.displayName = componentName;
@@ -17,6 +17,7 @@ import cx from 'classnames';
17
17
  import PropTypes from 'prop-types';
18
18
  import { Filter16 } from '@carbon/icons-react';
19
19
  import { pkg } from '../../settings';
20
+ var blockClass = "".concat(pkg.prefix, "--add-select__global-filter");
20
21
  var componentName = 'AddSelectFilter';
21
22
  export var AddSelectFilter = function AddSelectFilter(_ref) {
22
23
  var appliedFilters = _ref.appliedFilters,
@@ -44,8 +45,6 @@ export var AddSelectFilter = function AddSelectFilter(_ref) {
44
45
  open = _useState4[0],
45
46
  setOpen = _useState4[1];
46
47
 
47
- var blockClass = "".concat(pkg.prefix, "--add-select__global-filter");
48
-
49
48
  var searchHandler = function searchHandler(e) {
50
49
  handleSearch(e.target.value);
51
50
  };
@@ -167,7 +166,7 @@ AddSelectFilter.propTypes = {
167
166
  handleSearch: PropTypes.func,
168
167
  hasFiltersApplied: PropTypes.bool,
169
168
  iconDescription: PropTypes.string,
170
- inputLabel: PropTypes.string,
169
+ inputLabel: PropTypes.string.isRequired,
171
170
  inputPlaceholder: PropTypes.string,
172
171
  multi: PropTypes.bool,
173
172
  placeholder: PropTypes.string,