@carbon/ibm-products 2.21.0 → 2.23.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (73) hide show
  1. package/README.md +8 -4
  2. package/css/index-full-carbon.css +559 -357
  3. package/css/index-full-carbon.css.map +1 -1
  4. package/css/index-full-carbon.min.css +1 -1
  5. package/css/index-full-carbon.min.css.map +1 -1
  6. package/css/index-without-carbon-released-only.css +227 -267
  7. package/css/index-without-carbon-released-only.css.map +1 -1
  8. package/css/index-without-carbon-released-only.min.css +1 -1
  9. package/css/index-without-carbon-released-only.min.css.map +1 -1
  10. package/css/index-without-carbon.css +271 -295
  11. package/css/index-without-carbon.css.map +1 -1
  12. package/css/index-without-carbon.min.css +1 -1
  13. package/css/index-without-carbon.min.css.map +1 -1
  14. package/css/index.css +251 -298
  15. package/css/index.css.map +1 -1
  16. package/css/index.min.css +1 -1
  17. package/css/index.min.css.map +1 -1
  18. package/es/components/Datagrid/Datagrid/DatagridContent.js +8 -3
  19. package/es/components/Datagrid/Datagrid/DatagridHeaderRow.js +14 -4
  20. package/es/components/Datagrid/Datagrid/DatagridRow.js +6 -1
  21. package/es/components/Datagrid/Datagrid/addons/Filtering/FilterFlyout.js +6 -3
  22. package/es/components/Datagrid/Datagrid/addons/Filtering/FilterPanel.js +2 -2
  23. package/es/components/Datagrid/Datagrid/addons/Filtering/hooks/useFilters.js +30 -72
  24. package/es/components/Datagrid/Datagrid/addons/Slug/ColumnHeaderSlug.js +26 -0
  25. package/es/components/Datagrid/useDefaultStringRenderer.js +3 -3
  26. package/es/components/Datagrid/useRowIsMouseOver.js +3 -1
  27. package/es/components/Datagrid/useSortableColumns.js +15 -5
  28. package/es/components/DelimitedList/DelimitedList.docs-page.js +15 -0
  29. package/es/components/DelimitedList/DelimitedList.js +73 -0
  30. package/es/components/DelimitedList/index.js +8 -0
  31. package/es/components/FilterSummary/FilterSummary.js +100 -19
  32. package/es/components/SidePanel/SidePanel.js +145 -189
  33. package/es/components/TagSet/TagSet.js +31 -7
  34. package/es/components/TagSet/TagSetOverflow.js +13 -8
  35. package/es/components/index.js +2 -1
  36. package/es/global/js/hooks/useResizeObserver.js +5 -2
  37. package/es/global/js/package-settings.js +1 -0
  38. package/lib/components/Datagrid/Datagrid/DatagridContent.js +8 -3
  39. package/lib/components/Datagrid/Datagrid/DatagridHeaderRow.js +14 -4
  40. package/lib/components/Datagrid/Datagrid/DatagridRow.js +6 -1
  41. package/lib/components/Datagrid/Datagrid/addons/Filtering/FilterFlyout.js +6 -3
  42. package/lib/components/Datagrid/Datagrid/addons/Filtering/FilterPanel.js +2 -2
  43. package/lib/components/Datagrid/Datagrid/addons/Filtering/hooks/useFilters.js +30 -72
  44. package/lib/components/Datagrid/Datagrid/addons/Slug/ColumnHeaderSlug.js +36 -0
  45. package/lib/components/Datagrid/useDefaultStringRenderer.js +3 -3
  46. package/lib/components/Datagrid/useRowIsMouseOver.js +3 -1
  47. package/lib/components/Datagrid/useSortableColumns.js +15 -5
  48. package/lib/components/DelimitedList/DelimitedList.docs-page.js +25 -0
  49. package/lib/components/DelimitedList/DelimitedList.js +78 -0
  50. package/lib/components/DelimitedList/index.js +12 -0
  51. package/lib/components/FilterSummary/FilterSummary.js +103 -23
  52. package/lib/components/SidePanel/SidePanel.js +145 -189
  53. package/lib/components/TagSet/TagSet.js +31 -7
  54. package/lib/components/TagSet/TagSetOverflow.js +12 -7
  55. package/lib/components/index.js +8 -1
  56. package/lib/global/js/hooks/useResizeObserver.js +5 -2
  57. package/lib/global/js/package-settings.js +1 -0
  58. package/package.json +9 -8
  59. package/scss/components/CreateSidePanel/_create-side-panel.scss +1 -38
  60. package/scss/components/Datagrid/_datagrid.scss +4 -0
  61. package/scss/components/Datagrid/styles/_datagrid.scss +24 -1
  62. package/scss/components/Datagrid/styles/_useStickyColumn.scss +2 -0
  63. package/scss/components/DelimitedList/_carbon-imports.scss +9 -0
  64. package/scss/components/DelimitedList/_delimited-list.scss +27 -0
  65. package/scss/components/DelimitedList/_index-with-carbon.scss +9 -0
  66. package/scss/components/DelimitedList/_index.scss +8 -0
  67. package/scss/components/EditSidePanel/_edit-side-panel.scss +0 -18
  68. package/scss/components/FilterSummary/_filter-summary.scss +22 -1
  69. package/scss/components/SidePanel/_side-panel-variables.scss +5 -1
  70. package/scss/components/SidePanel/_side-panel.scss +155 -187
  71. package/scss/components/_index-with-carbon.scss +1 -0
  72. package/scss/components/_index.scss +1 -0
  73. package/telemetry.yml +790 -0
@@ -119,9 +119,9 @@ var useFilters = function useFilters(_ref2) {
119
119
  if (type === DATE && value.length > 0 && !value[1]) {
120
120
  return;
121
121
  }
122
- var filtersObjectArrayCopy = _toConsumableArray(filtersObjectArray);
122
+ var filterCopy = _toConsumableArray(filtersObjectArray);
123
123
  // // check if the filter already exists in the array
124
- var filter = filtersObjectArrayCopy.find(function (item) {
124
+ var filter = filterCopy.find(function (item) {
125
125
  return item.id === column;
126
126
  });
127
127
 
@@ -129,81 +129,39 @@ var useFilters = function useFilters(_ref2) {
129
129
  if (filter) {
130
130
  filter.value = value;
131
131
  } else {
132
- filtersObjectArrayCopy.push({
132
+ filterCopy.push({
133
133
  id: column,
134
134
  value: value,
135
135
  type: type
136
136
  });
137
137
  }
138
-
139
- // ATTENTION: this is where you would reset or remove individual filters from the filters array
140
- if (type === CHECKBOX) {
141
- /**
142
- When all checkboxes of a group are all unselected the value still exists in the filtersObjectArray
143
- This checks if all the checkboxes are selected = false and removes it from the array
144
- */
145
- var index = filtersObjectArrayCopy.findIndex(function (filter) {
146
- return filter.id === column;
147
- });
148
-
149
- // If all the selected state is false remove from array
150
- var shouldRemoveFromArray = filtersObjectArrayCopy[index].value.every(function (val) {
151
- return val.selected === false;
152
- });
153
- if (shouldRemoveFromArray) {
154
- filtersObjectArrayCopy.splice(index, 1);
155
- }
156
- } else if (type === DATE) {
157
- if (value.length === 0) {
158
- /**
159
- Checks to see if the date value is an empty array, if it is that means the user wants
160
- to reset the date filter
161
- */
162
- var _index = filtersObjectArrayCopy.findIndex(function (filter) {
163
- return filter.id === column;
164
- });
165
-
166
- // Remove it from the filters array since there is nothing to filter
167
- filtersObjectArrayCopy.splice(_index, 1);
168
- }
169
- } else if (type === DROPDOWN || type === RADIO) {
170
- if (value === 'Any') {
171
- /**
172
- Checks to see if the selected value is 'Any', that means the user wants
173
- to reset specific filter
174
- */
175
- var _index2 = filtersObjectArrayCopy.findIndex(function (filter) {
176
- return filter.id === column;
177
- });
178
-
179
- // Remove it from the filters array
180
- filtersObjectArrayCopy.splice(_index2, 1);
181
- }
182
- } else if (type === NUMBER) {
183
- // If the value is empty remove it from the filtersObjectArray
184
- if (value === '') {
185
- // Find the column that uses number and displays an empty string
186
- var _index3 = filtersObjectArrayCopy.findIndex(function (filter) {
187
- return filter.id === column;
188
- });
189
-
190
- // Remove it from the filters array
191
- filtersObjectArrayCopy.splice(_index3, 1);
192
- }
138
+ var index = filterCopy.findIndex(function (_ref4) {
139
+ var id = _ref4.id;
140
+ return id === column;
141
+ });
142
+ var clearCheckbox = type === CHECKBOX && filterCopy[index].value.every(function (_ref5) {
143
+ var selected = _ref5.selected;
144
+ return selected === false;
145
+ });
146
+ var clearDate = type === DATE && value.length === 0;
147
+ var clearAny = (type === DROPDOWN || type === RADIO) && value === 'Any';
148
+ var clearNum = type === NUMBER && value === '';
149
+ var shouldClear = clearCheckbox || clearDate || clearAny || clearNum;
150
+ if (shouldClear) {
151
+ filterCopy.splice(index, 1);
193
152
  }
194
- setFiltersObjectArray(filtersObjectArrayCopy);
195
-
196
- // // Automatically apply the filters if the updateMethod is instant
153
+ setFiltersObjectArray(filterCopy);
197
154
  if (updateMethod === INSTANT) {
198
- setAllFilters(filtersObjectArrayCopy);
155
+ setAllFilters(filterCopy);
199
156
  }
200
157
  };
158
+
201
159
  /** Render the individual filter component */
202
- var renderFilter = function renderFilter(_ref4) {
160
+ var renderFilter = function renderFilter(_ref6) {
203
161
  var _filtersState$column3, _filtersState$column4;
204
- var type = _ref4.type,
205
- column = _ref4.column,
206
- components = _ref4.props;
162
+ var type = _ref6.type,
163
+ column = _ref6.column,
164
+ components = _ref6.props;
207
165
  var filter;
208
166
  var isPanel = variation === PANEL;
209
167
  if (!type) {
@@ -224,8 +182,8 @@ var useFilters = function useFilters(_ref2) {
224
182
  return /*#__PURE__*/React.createElement(Checkbox, _extends({
225
183
  key: option.id
226
184
  }, option, {
227
- onChange: function onChange(_, _ref5) {
228
- var checked = _ref5.checked;
185
+ onChange: function onChange(_, _ref7) {
186
+ var checked = _ref7.checked;
229
187
  handleCheckboxChange({
230
188
  checked: checked,
231
189
  filtersState: filtersState,
@@ -316,9 +274,9 @@ var useFilters = function useFilters(_ref2) {
316
274
  labelText: (_components$DefaultRa5 = components === null || components === void 0 || (_components$DefaultRa6 = components.DefaultRadioButton) === null || _components$DefaultRa6 === void 0 ? void 0 : _components$DefaultRa6.labelText) !== null && _components$DefaultRa5 !== void 0 ? _components$DefaultRa5 : 'Any',
317
275
  value: (_components$DefaultRa7 = components === null || components === void 0 || (_components$DefaultRa8 = components.DefaultRadioButton) === null || _components$DefaultRa8 === void 0 ? void 0 : _components$DefaultRa8.value) !== null && _components$DefaultRa7 !== void 0 ? _components$DefaultRa7 : 'Any'
318
276
  }, components.DefaultRadioButton)), components.RadioButton.map(function (radio) {
319
- var _ref6, _radio$id;
277
+ var _ref8, _radio$id;
320
278
  return /*#__PURE__*/React.createElement(RadioButton, _extends({
321
- key: (_ref6 = (_radio$id = radio.id) !== null && _radio$id !== void 0 ? _radio$id : radio.labelText) !== null && _ref6 !== void 0 ? _ref6 : radio.value
279
+ key: (_ref8 = (_radio$id = radio.id) !== null && _radio$id !== void 0 ? _radio$id : radio.labelText) !== null && _ref8 !== void 0 ? _ref8 : radio.value
322
280
  }, radio));
323
281
  })));
324
282
  }
@@ -327,9 +285,9 @@ var useFilters = function useFilters(_ref2) {
327
285
  filter = /*#__PURE__*/React.createElement(Dropdown, _extends({}, components.Dropdown, {
328
286
  selectedItem: ((_filtersState$column3 = filtersState[column]) === null || _filtersState$column3 === void 0 ? void 0 : _filtersState$column3.value) === '' ? 'Any' : (_filtersState$column4 = filtersState[column]) === null || _filtersState$column4 === void 0 ? void 0 : _filtersState$column4.value,
329
287
  items: ['Any'].concat(_toConsumableArray(components.Dropdown.items)),
330
- onChange: function onChange(_ref7) {
288
+ onChange: function onChange(_ref9) {
331
289
  var _components$Dropdown$, _components$Dropdown;
332
- var selectedItem = _ref7.selectedItem;
290
+ var selectedItem = _ref9.selectedItem;
333
291
  setFiltersState(_objectSpread(_objectSpread({}, filtersState), {}, _defineProperty({}, column, {
334
292
  value: selectedItem,
335
293
  type: type
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Copyright IBM Corp. 2024, 2024
3
+ *
4
+ * This source code is licensed under the Apache-2.0 license found in the
5
+ * LICENSE file in the root directory of this source tree.
6
+ */
7
+
8
+ import React, { forwardRef, isValidElement } from 'react';
9
+ import PropTypes from 'prop-types';
10
+ export var ColumnHeaderSlug = /*#__PURE__*/forwardRef(function (_ref, ref) {
11
+ var slug = _ref.slug;
12
+ if (slug && /*#__PURE__*/isValidElement(slug)) {
13
+ var normalizedSlug = /*#__PURE__*/React.cloneElement(slug, {
14
+ size: 'mini',
15
+ ref: ref
16
+ });
17
+ return normalizedSlug;
18
+ }
19
+ return;
20
+ });
21
+ ColumnHeaderSlug.propTypes = {
22
+ /**
23
+ * Specify the AI slug to be displayed
24
+ */
25
+ slug: PropTypes.node
26
+ };
@@ -20,9 +20,9 @@ var useDefaultStringRenderer = function useDefaultStringRenderer(hooks) {
20
20
  className: cx("".concat(blockClass, "__defaultStringRenderer"), _defineProperty({}, "".concat(blockClass, "__defaultStringRenderer--multiline"), ((_tableProps$column = tableProps.column) === null || _tableProps$column === void 0 ? void 0 : _tableProps$column.multiLineWrap) || (tableProps === null || tableProps === void 0 ? void 0 : tableProps.multiLineWrapAll)))
21
21
  }, tableProps.value);
22
22
  };
23
- var HeaderRenderer = function HeaderRenderer(header) {
23
+ var HeaderRenderer = function HeaderRenderer(header, slug) {
24
24
  return /*#__PURE__*/React.createElement("div", {
25
- className: "".concat(blockClass, "__defaultStringRenderer"),
25
+ className: cx("".concat(blockClass, "__defaultStringRenderer"), _defineProperty({}, "".concat(blockClass, "__defaultStringRenderer--slug"), slug && /*#__PURE__*/React.isValidElement(slug))),
26
26
  title: typeof header === 'string' ? header : '',
27
27
  key: typeof header === 'string' ? header : ''
28
28
  }, header);
@@ -32,7 +32,7 @@ var useDefaultStringRenderer = function useDefaultStringRenderer(hooks) {
32
32
  return _objectSpread(_objectSpread({
33
33
  Cell: StringRenderer
34
34
  }, column), {}, {
35
- Header: column.HeaderRenderer || HeaderRenderer(column.Header)
35
+ Header: column.HeaderRenderer || HeaderRenderer(column.Header, column.slug)
36
36
  });
37
37
  });
38
38
  return _toConsumableArray(columnsWithDefaultCells);
@@ -37,7 +37,9 @@ var useRowIsMouseOver = function useRowIsMouseOver(hooks) {
37
37
  });
38
38
  });
39
39
  Object.assign(instance, {
40
- rows: rowsWithMouseOver
40
+ rows: rowsWithMouseOver,
41
+ withMouseHover: true,
42
+ setMouseOverRowIndex: setMouseOverRowIndex
41
43
  });
42
44
  hooks.getRowProps.push(getRowProps);
43
45
  };
@@ -3,7 +3,7 @@ import _defineProperty from "@babel/runtime/helpers/defineProperty";
3
3
  function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
4
4
  function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
5
5
  /**
6
- * Copyright IBM Corp. 2020, 2023
6
+ * Copyright IBM Corp. 2020, 2024
7
7
  *
8
8
  * This source code is licensed under the Apache-2.0 license found in the
9
9
  * LICENSE file in the root directory of this source tree.
@@ -15,6 +15,7 @@ import { pkg, carbon } from '../../settings';
15
15
  import { Button } from '@carbon/react';
16
16
  import { ArrowUp, ArrowDown, ArrowsVertical } from '@carbon/react/icons';
17
17
  import { SelectAll } from './Datagrid/DatagridSelectAll';
18
+ import { ColumnHeaderSlug } from './Datagrid/addons/Slug/ColumnHeaderSlug';
18
19
  var blockClass = "".concat(pkg.prefix, "--datagrid");
19
20
  var ordering = {
20
21
  ASC: 'ASC',
@@ -58,7 +59,13 @@ var useSortableColumns = function useSortableColumns(hooks) {
58
59
  ascendingSortableLabelText = instance.ascendingSortableLabelText,
59
60
  descendingSortableLabelText = instance.descendingSortableLabelText,
60
61
  defaultSortableLabelText = instance.defaultSortableLabelText;
61
- var onSortClick = function onSortClick(column) {
62
+ var onSortClick = function onSortClick(event, column) {
63
+ var slug = event.target.classList.contains("".concat(carbon.prefix, "--slug")) || event.target.closest(".".concat(carbon.prefix, "--slug"));
64
+ // Do not continue with sorting if we find a slug
65
+ if (slug) {
66
+ event.stopPropagation();
67
+ return;
68
+ }
62
69
  var key = column.id;
63
70
  var sortDesc = column.isSortedDesc;
64
71
  var _getNewSortOrder = getNewSortOrder(sortDesc),
@@ -96,12 +103,15 @@ var useSortableColumns = function useSortableColumns(hooks) {
96
103
  defaultSortableLabelText: defaultSortableLabelText
97
104
  }),
98
105
  "aria-pressed": getAriaPressedValue(headerProp === null || headerProp === void 0 ? void 0 : headerProp.column),
99
- onClick: function onClick() {
100
- return onSortClick(headerProp === null || headerProp === void 0 ? void 0 : headerProp.column);
106
+ onClick: function onClick(event) {
107
+ return onSortClick(event, headerProp === null || headerProp === void 0 ? void 0 : headerProp.column);
101
108
  },
102
109
  kind: "ghost",
103
110
  renderIcon: function renderIcon(props) {
104
- return icon(headerProp === null || headerProp === void 0 ? void 0 : headerProp.column, props);
111
+ var _headerProp$column;
112
+ return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(ColumnHeaderSlug, {
113
+ slug: headerProp === null || headerProp === void 0 || (_headerProp$column = headerProp.column) === null || _headerProp$column === void 0 ? void 0 : _headerProp$column.slug
114
+ }), icon(headerProp === null || headerProp === void 0 ? void 0 : headerProp.column, props));
105
115
  },
106
116
  className: cx("".concat(carbon.prefix, "--table-sort ").concat(blockClass, "--table-sort"), _defineProperty(_defineProperty({}, "".concat(blockClass, "--table-sort--desc"), headerProp === null || headerProp === void 0 ? void 0 : headerProp.column.isSortedDesc), "".concat(blockClass, "--table-sort--asc"), (headerProp === null || headerProp === void 0 ? void 0 : headerProp.column.isSortedDesc) === false))
107
117
  }, column.Header);
@@ -0,0 +1,15 @@
1
+ import React from 'react';
2
+ import { StoryDocsPage } from '../../global/js/utils/StoryDocsPage';
3
+ import * as stories from './DelimitedList.stories';
4
+ var DocsPage = function DocsPage() {
5
+ return /*#__PURE__*/React.createElement(StoryDocsPage, {
6
+ blocks: [{
7
+ story: stories.delimited
8
+ }, {
9
+ story: stories.notDelimited
10
+ }, {
11
+ story: stories.empty
12
+ }]
13
+ });
14
+ };
15
+ export default DocsPage;
@@ -0,0 +1,73 @@
1
+ import _extends from "@babel/runtime/helpers/extends";
2
+ import _objectWithoutProperties from "@babel/runtime/helpers/objectWithoutProperties";
3
+ var _excluded = ["className", "delimiter", "items", "truncate"];
4
+ /**
5
+ * Copyright IBM Corp. 2024, 2024
6
+ *
7
+ * This source code is licensed under the Apache-2.0 license found in the
8
+ * LICENSE file in the root directory of this source tree.
9
+ */
10
+
11
+ // Import portions of React that are needed.
12
+ import React from 'react';
13
+
14
+ // Other standard imports.
15
+ import PropTypes from 'prop-types';
16
+ import cx from 'classnames';
17
+ import { getDevtoolsProps } from '../../global/js/utils/devtools';
18
+ import { pkg } from '../../settings';
19
+ var blockClass = "".concat(pkg.prefix, "--delimited-list");
20
+ var componentName = 'DelimitedList';
21
+ var defaults = {
22
+ delimiter: ', ',
23
+ items: [],
24
+ truncate: true
25
+ };
26
+
27
+ /**
28
+ * `DelimitedList` converts an array of items into a single line of
29
+ * comma-separated values.
30
+ */
31
+ export var DelimitedList = /*#__PURE__*/React.forwardRef(function (_ref, ref) {
32
+ var className = _ref.className,
33
+ _ref$delimiter = _ref.delimiter,
34
+ delimiter = _ref$delimiter === void 0 ? defaults.delimiter : _ref$delimiter,
35
+ _ref$items = _ref.items,
36
+ items = _ref$items === void 0 ? defaults.items : _ref$items,
37
+ _ref$truncate = _ref.truncate,
38
+ truncate = _ref$truncate === void 0 ? defaults.truncate : _ref$truncate,
39
+ rest = _objectWithoutProperties(_ref, _excluded);
40
+ return /*#__PURE__*/React.createElement("div", _extends({}, rest, {
41
+ className: cx(blockClass, className, [truncate && "".concat(blockClass, "-truncate")]),
42
+ ref: ref
43
+ }, getDevtoolsProps(componentName)), items.length > 0 ? items.join(delimiter) : '–');
44
+ });
45
+
46
+ // Return a placeholder if not released and not enabled by feature flag
47
+ DelimitedList = pkg.checkComponentEnabled(DelimitedList, componentName);
48
+
49
+ // The display name of the component, used by React. Note that displayName
50
+ // is used in preference to relying on function.name.
51
+ DelimitedList.displayName = componentName;
52
+
53
+ // The types and DocGen commentary for the component props,
54
+ // in alphabetical order (for consistency).
55
+ // See https://www.npmjs.com/package/prop-types#usage.
56
+ DelimitedList.propTypes = {
57
+ /**
58
+ * Provide an optional class to be applied to the containing node.
59
+ */
60
+ className: PropTypes.string,
61
+ /**
62
+ * The character(s) used to separate the items.
63
+ */
64
+ delimiter: PropTypes.string,
65
+ /**
66
+ * Array of items to be listed.
67
+ */
68
+ items: PropTypes.arrayOf(PropTypes.any),
69
+ /**
70
+ * Toggle the component's ability to truncate or not.
71
+ */
72
+ truncate: PropTypes.bool
73
+ };
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Copyright IBM Corp. 2024, 2024
3
+ *
4
+ * This source code is licensed under the Apache-2.0 license found in the
5
+ * LICENSE file in the root directory of this source tree.
6
+ */
7
+
8
+ export { DelimitedList } from './DelimitedList';
@@ -1,4 +1,5 @@
1
1
  import _extends from "@babel/runtime/helpers/extends";
2
+ import _slicedToArray from "@babel/runtime/helpers/slicedToArray";
2
3
  import _defineProperty from "@babel/runtime/helpers/defineProperty";
3
4
  import _objectWithoutProperties from "@babel/runtime/helpers/objectWithoutProperties";
4
5
  var _excluded = ["className", "clearFiltersText", "clearFilters", "filters", "renderLabel", "overflowType", "clearButtonInline"],
@@ -6,22 +7,28 @@ var _excluded = ["className", "clearFiltersText", "clearFilters", "filters", "re
6
7
  function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
7
8
  function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
8
9
  /**
9
- * Copyright IBM Corp. 2022, 2023
10
+ * Copyright IBM Corp. 2022, 2024
10
11
  *
11
12
  * This source code is licensed under the Apache-2.0 license found in the
12
13
  * LICENSE file in the root directory of this source tree.
13
14
  */
14
- import { Button } from '@carbon/react';
15
- import React, { useRef } from 'react';
15
+
16
+ import React, { useRef, useState } from 'react';
17
+ import { Button, IconButton } from '@carbon/react';
18
+ import { AnimatePresence, motion } from 'framer-motion';
19
+ import { ChevronDown } from '@carbon/react/icons';
16
20
  import PropTypes from 'prop-types';
17
21
  import cx from 'classnames';
18
22
  import { TagSet } from '../TagSet';
19
23
  import { pkg } from '../../settings';
20
24
  import uuidv4 from '../../global/js/utils/uuidv4';
25
+ import { DURATIONS, EASINGS } from '../../global/js/utils/motionConstants';
26
+ import { useWindowResize, usePreviousValue } from '../../global/js/hooks';
27
+ import debounce from 'lodash/debounce';
21
28
  import { getDevtoolsProps } from '../../global/js/utils/devtools';
22
29
  var blockClass = "".concat(pkg.prefix, "--filter-summary");
23
30
  var FilterSummary = /*#__PURE__*/React.forwardRef(function (_ref, ref) {
24
- var _filterSummaryClearBu;
31
+ var _viewAllButtonRef$cur, _filterSummaryClearBu;
25
32
  var _ref$className = _ref.className,
26
33
  className = _ref$className === void 0 ? '' : _ref$className,
27
34
  _ref$clearFiltersText = _ref.clearFiltersText,
@@ -47,29 +54,103 @@ var FilterSummary = /*#__PURE__*/React.forwardRef(function (_ref, ref) {
47
54
  });
48
55
  });
49
56
  var filterSummaryClearButton = useRef();
57
+ var viewAllButtonRef = useRef();
50
58
  var filterSummaryRef = useRef();
51
- var localRef = ref || filterSummaryRef;
59
+ var localRef = filterSummaryRef || ref;
60
+ var _useState = useState(0),
61
+ _useState2 = _slicedToArray(_useState, 2),
62
+ overflowCount = _useState2[0],
63
+ setOverflowCount = _useState2[1];
64
+ var _useState3 = useState(false),
65
+ _useState4 = _slicedToArray(_useState3, 2),
66
+ multiline = _useState4[0],
67
+ setMultiline = _useState4[1];
68
+ var previousState = usePreviousValue({
69
+ multiline: multiline
70
+ });
71
+ var handleViewAll = function handleViewAll() {
72
+ if (overflowCount === 0) {
73
+ setMultiline(false);
74
+ return;
75
+ }
76
+ setMultiline(function (prev) {
77
+ return !prev;
78
+ });
79
+ };
80
+ var viewAllWidth = typeof (viewAllButtonRef === null || viewAllButtonRef === void 0 || (_viewAllButtonRef$cur = viewAllButtonRef.current) === null || _viewAllButtonRef$cur === void 0 ? void 0 : _viewAllButtonRef$cur.offsetWidth) === 'undefined' ? 0 : overflowCount > 0 ? 48 : 0;
81
+ var measurementOffset = (filterSummaryClearButton === null || filterSummaryClearButton === void 0 || (_filterSummaryClearBu = filterSummaryClearButton.current) === null || _filterSummaryClearBu === void 0 ? void 0 : _filterSummaryClearBu.offsetWidth) + viewAllWidth;
82
+ var renderTagSet = function renderTagSet(type) {
83
+ return /*#__PURE__*/React.createElement(motion.div, {
84
+ key: type,
85
+ initial: {
86
+ opacity: 0,
87
+ y: -16
88
+ },
89
+ animate: {
90
+ opacity: 1,
91
+ y: 0
92
+ },
93
+ exit: {
94
+ opacity: 0,
95
+ y: -16
96
+ },
97
+ transition: {
98
+ duration: DURATIONS.moderate01,
99
+ ease: EASINGS.productive.entrance
100
+ }
101
+ }, /*#__PURE__*/React.createElement(TagSet, {
102
+ allTagsModalSearchLabel: "Search all tags",
103
+ allTagsModalSearchPlaceholderText: "Search all tags",
104
+ allTagsModalTitle: "All tags",
105
+ showAllTagsLabel: "View all tags",
106
+ tags: tagFilters,
107
+ overflowType: overflowType,
108
+ className: cx(_defineProperty({}, "".concat(blockClass, "__clear-button-inline"), clearButtonInline)),
109
+ containingElementRef: localRef,
110
+ measurementOffset: measurementOffset,
111
+ onOverflowTagChange: function onOverflowTagChange(overflowTags) {
112
+ return setOverflowCount(overflowTags.length);
113
+ },
114
+ multiline: multiline
115
+ }));
116
+ };
117
+ useWindowResize(function () {
118
+ var handleFilterSummaryResize = function handleFilterSummaryResize() {
119
+ var _localRef$current;
120
+ if (multiline && (localRef === null || localRef === void 0 || (_localRef$current = localRef.current) === null || _localRef$current === void 0 ? void 0 : _localRef$current.offsetHeight) <= 50) {
121
+ setMultiline(false);
122
+ }
123
+ };
124
+ var filterResize = debounce(handleFilterSummaryResize, 500);
125
+ filterResize();
126
+ }, [previousState === null || previousState === void 0 ? void 0 : previousState.multiline, multiline]);
52
127
  return /*#__PURE__*/React.createElement("div", _extends({}, getDevtoolsProps(componentName), {
53
128
  id: filterSummaryId
54
129
  }, rest, {
55
130
  ref: localRef,
56
- className: cx([blockClass, className])
57
- }), /*#__PURE__*/React.createElement(TagSet, {
58
- allTagsModalSearchLabel: "Search all tags",
59
- allTagsModalSearchPlaceholderText: "Search all tags",
60
- allTagsModalTitle: "All tags",
61
- showAllTagsLabel: "View all tags",
62
- tags: tagFilters,
63
- overflowType: overflowType,
64
- className: cx(_defineProperty({}, "".concat(blockClass, "__clear-button-inline"), clearButtonInline)),
65
- containingElementRef: localRef,
66
- measurementOffset: filterSummaryClearButton === null || filterSummaryClearButton === void 0 || (_filterSummaryClearBu = filterSummaryClearButton.current) === null || _filterSummaryClearBu === void 0 ? void 0 : _filterSummaryClearBu.offsetWidth
67
- }), /*#__PURE__*/React.createElement(Button, {
131
+ className: cx([blockClass, className], _defineProperty({}, "".concat(blockClass, "__expanded"), multiline))
132
+ }), /*#__PURE__*/React.createElement(AnimatePresence, {
133
+ mode: "wait",
134
+ exitBeforeEnter: true
135
+ }, !multiline && renderTagSet('single'), multiline && renderTagSet('multiline')), /*#__PURE__*/React.createElement(Button, {
68
136
  kind: "ghost",
69
137
  size: "sm",
70
138
  onClick: clearFilters,
71
- ref: filterSummaryClearButton
72
- }, clearFiltersText));
139
+ ref: filterSummaryClearButton,
140
+ className: "".concat(blockClass, "__clear-all-button")
141
+ }, clearFiltersText), (overflowCount > 0 || multiline) && /*#__PURE__*/React.createElement("div", {
142
+ className: "".concat(blockClass, "__view-all--wrapper")
143
+ }, /*#__PURE__*/React.createElement(IconButton, {
144
+ ref: viewAllButtonRef,
145
+ kind: "ghost",
146
+ label: 'View all',
147
+ className: "".concat(blockClass, "__view-all--trigger"),
148
+ align: "left",
149
+ onClick: handleViewAll,
150
+ size: "sm"
151
+ }, /*#__PURE__*/React.createElement(ChevronDown, {
152
+ className: cx("".concat(blockClass, "__view-all--chevron"), _defineProperty({}, "".concat(blockClass, "__view-all--chevron-multiline"), multiline))
153
+ }))));
73
154
  });
74
155
  var componentName = 'FilterSummary';
75
156
  FilterSummary.displayName = componentName;