@carbon/ibm-products 2.22.0 → 2.23.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (36) hide show
  1. package/README.md +2 -1
  2. package/css/index-full-carbon.css +32 -110
  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 +32 -94
  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 +32 -110
  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 +32 -110
  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/DatagridHeaderRow.js +14 -4
  19. package/es/components/Datagrid/Datagrid/addons/Slug/ColumnHeaderSlug.js +26 -0
  20. package/es/components/Datagrid/useDefaultStringRenderer.js +3 -3
  21. package/es/components/Datagrid/useSortableColumns.js +15 -5
  22. package/es/components/FilterSummary/FilterSummary.js +100 -19
  23. package/es/components/TagSet/TagSet.js +11 -3
  24. package/es/global/js/hooks/useResizeObserver.js +2 -2
  25. package/lib/components/Datagrid/Datagrid/DatagridHeaderRow.js +14 -4
  26. package/lib/components/Datagrid/Datagrid/addons/Slug/ColumnHeaderSlug.js +36 -0
  27. package/lib/components/Datagrid/useDefaultStringRenderer.js +3 -3
  28. package/lib/components/Datagrid/useSortableColumns.js +15 -5
  29. package/lib/components/FilterSummary/FilterSummary.js +103 -23
  30. package/lib/components/TagSet/TagSet.js +11 -3
  31. package/lib/global/js/hooks/useResizeObserver.js +2 -2
  32. package/package.json +3 -3
  33. package/scss/components/CreateSidePanel/_create-side-panel.scss +1 -38
  34. package/scss/components/Datagrid/styles/_datagrid.scss +15 -0
  35. package/scss/components/EditSidePanel/_edit-side-panel.scss +0 -18
  36. package/scss/components/FilterSummary/_filter-summary.scss +22 -1
@@ -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;
@@ -2,7 +2,7 @@ import _defineProperty from "@babel/runtime/helpers/defineProperty";
2
2
  import _extends from "@babel/runtime/helpers/extends";
3
3
  import _slicedToArray from "@babel/runtime/helpers/slicedToArray";
4
4
  import _objectWithoutProperties from "@babel/runtime/helpers/objectWithoutProperties";
5
- var _excluded = ["align", "allTagsModalTarget", "className", "maxVisible", "multiline", "overflowAlign", "overflowClassName", "overflowType", "allTagsModalTitle", "allTagsModalSearchLabel", "allTagsModalSearchPlaceholderText", "showAllTagsLabel", "tags", "containingElementRef", "measurementOffset"],
5
+ var _excluded = ["align", "allTagsModalTarget", "className", "maxVisible", "multiline", "overflowAlign", "overflowClassName", "overflowType", "allTagsModalTitle", "allTagsModalSearchLabel", "allTagsModalSearchPlaceholderText", "showAllTagsLabel", "tags", "containingElementRef", "measurementOffset", "onOverflowTagChange"],
6
6
  _excluded2 = ["label", "id"],
7
7
  _excluded3 = ["label", "onClose"];
8
8
  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; }
@@ -33,7 +33,8 @@ var defaults = {
33
33
  align: 'start',
34
34
  measurementOffset: 0,
35
35
  overflowAlign: 'bottom',
36
- overflowType: 'default'
36
+ overflowType: 'default',
37
+ onOverflowTagChange: function onOverflowTagChange() {}
37
38
  };
38
39
  export var TagSet = /*#__PURE__*/React.forwardRef(function (_ref, ref) {
39
40
  var _ref$align = _ref.align,
@@ -55,6 +56,8 @@ export var TagSet = /*#__PURE__*/React.forwardRef(function (_ref, ref) {
55
56
  containingElementRef = _ref.containingElementRef,
56
57
  _ref$measurementOffse = _ref.measurementOffset,
57
58
  measurementOffset = _ref$measurementOffse === void 0 ? defaults.measurementOffset : _ref$measurementOffse,
59
+ _ref$onOverflowTagCha = _ref.onOverflowTagChange,
60
+ onOverflowTagChange = _ref$onOverflowTagCha === void 0 ? defaults.onOverflowTagChange : _ref$onOverflowTagCha,
58
61
  rest = _objectWithoutProperties(_ref, _excluded);
59
62
  var _useState = useState(3),
60
63
  _useState2 = _slicedToArray(_useState, 2),
@@ -151,8 +154,9 @@ export var TagSet = /*#__PURE__*/React.forwardRef(function (_ref, ref) {
151
154
  popoverOpen: popoverOpen,
152
155
  setPopoverOpen: setPopoverOpen
153
156
  }));
157
+ onOverflowTagChange === null || onOverflowTagChange === void 0 || onOverflowTagChange(newOverflowTags);
154
158
  setDisplayedTags(newDisplayedTags);
155
- }, [displayCount, overflowAlign, overflowClassName, overflowType, showAllTagsLabel, tags, popoverOpen, handleTagOnClose]);
159
+ }, [displayCount, overflowAlign, overflowClassName, overflowType, showAllTagsLabel, tags, onOverflowTagChange, popoverOpen, handleTagOnClose]);
156
160
  var checkFullyVisibleTags = useCallback(function () {
157
161
  if (multiline) {
158
162
  return setDisplayCount(maxVisible);
@@ -306,6 +310,10 @@ TagSet.propTypes = {
306
310
  * display tags in multiple lines
307
311
  */
308
312
  multiline: PropTypes.bool,
313
+ /**
314
+ * Handler to get overflow tags
315
+ */
316
+ onOverflowTagChange: PropTypes.func,
309
317
  /**
310
318
  * overflowAlign from the standard tooltip. Default center.
311
319
  */
@@ -41,7 +41,7 @@ export var useResizeObserver = function useResizeObserver(ref, callback) {
41
41
  }
42
42
  getInitialSize();
43
43
  // eslint-disable-next-line react-hooks/exhaustive-deps
44
- }, [width, height, ref].concat(_toConsumableArray(deps)));
44
+ }, [width, height, ref.current].concat(_toConsumableArray(deps)));
45
45
  useLayoutEffect(function () {
46
46
  if (!(ref !== null && ref !== void 0 && ref.current)) {
47
47
  return;
@@ -71,7 +71,7 @@ export var useResizeObserver = function useResizeObserver(ref, callback) {
71
71
  observer = null;
72
72
  };
73
73
  // eslint-disable-next-line react-hooks/exhaustive-deps
74
- }, [ref].concat(_toConsumableArray(deps)));
74
+ }, [ref.current].concat(_toConsumableArray(deps)));
75
75
  return {
76
76
  width: width,
77
77
  height: height
@@ -18,12 +18,13 @@ var _commonColumnIds = require("../common-column-ids");
18
18
  var _settings = require("../../../settings");
19
19
  var _stateReducer = require("./addons/stateReducer");
20
20
  var _getNodeTextContent = require("../../../global/js/utils/getNodeTextContent");
21
+ var _ColumnHeaderSlug = require("./addons/Slug/ColumnHeaderSlug");
21
22
  var _excluded = ["role"],
22
23
  _excluded2 = ["className", "role"],
23
24
  _excluded3 = ["role", "className"];
24
25
  /* eslint-disable react/prop-types */
25
26
  /**
26
- * Copyright IBM Corp. 2020, 2023
27
+ * Copyright IBM Corp. 2020, 2024
27
28
  *
28
29
  * This source code is licensed under the Apache-2.0 license found in the
29
30
  * LICENSE file in the root directory of this source tree.
@@ -94,7 +95,8 @@ var ResizeHeader = function ResizeHeader(_ref) {
94
95
  }));
95
96
  };
96
97
  var HeaderRow = function HeaderRow(datagridState, headRef, headerGroup) {
97
- var resizerAriaLabel = datagridState.resizerAriaLabel;
98
+ var resizerAriaLabel = datagridState.resizerAriaLabel,
99
+ isTableSortable = datagridState.isTableSortable;
98
100
  // Used to measure the height of the table and uses that value
99
101
  // to display a vertical line to indicate the column you are resizing
100
102
  (0, _react.useEffect)(function () {
@@ -136,6 +138,14 @@ var HeaderRow = function HeaderRow(datagridState, headRef, headerGroup) {
136
138
  headerGroupClassName = _headerGroup$getHeade.className,
137
139
  role = _headerGroup$getHeade.role,
138
140
  headerGroupProps = (0, _objectWithoutProperties2.default)(_headerGroup$getHeade, _excluded2);
141
+ var renderSlug = function renderSlug(slug) {
142
+ if (isTableSortable) {
143
+ return;
144
+ }
145
+ return /*#__PURE__*/_react.default.createElement(_ColumnHeaderSlug.ColumnHeaderSlug, {
146
+ slug: slug
147
+ });
148
+ };
139
149
  return /*#__PURE__*/_react.default.createElement(_react2.TableRow, (0, _extends2.default)({}, headerGroupProps, {
140
150
  className: (0, _classnames.default)("".concat(blockClass, "__head"), headerGroupClassName),
141
151
  ref: headRef
@@ -166,10 +176,10 @@ var HeaderRow = function HeaderRow(datagridState, headRef, headerGroup) {
166
176
  headerProps = (0, _objectWithoutProperties2.default)(_header$getHeaderProp, _excluded3);
167
177
  var resizerProps = header === null || header === void 0 || (_header$getResizerPro = header.getResizerProps) === null || _header$getResizerPro === void 0 ? void 0 : _header$getResizerPro.call(header);
168
178
  return /*#__PURE__*/_react.default.createElement(_react2.TableHeader, (0, _extends2.default)({}, headerProps, {
169
- className: (0, _classnames.default)(headerClassName, (0, _defineProperty2.default)((0, _defineProperty2.default)((0, _defineProperty2.default)((0, _defineProperty2.default)((0, _defineProperty2.default)({}, "".concat(blockClass, "__resizableColumn"), resizerProps), "".concat(blockClass, "__isResizing"), header.isResizing), "".concat(blockClass, "__sortableColumn"), datagridState.isTableSortable && header.id !== 'spacer'), "".concat(blockClass, "__isSorted"), header.isSorted), "".concat(blockClass, "__header-actions-column"), header.isAction)),
179
+ className: (0, _classnames.default)(headerClassName, (0, _defineProperty2.default)((0, _defineProperty2.default)((0, _defineProperty2.default)((0, _defineProperty2.default)((0, _defineProperty2.default)((0, _defineProperty2.default)({}, "".concat(blockClass, "__resizableColumn"), resizerProps), "".concat(blockClass, "__isResizing"), header.isResizing), "".concat(blockClass, "__sortableColumn"), datagridState.isTableSortable && header.id !== 'spacer'), "".concat(blockClass, "__isSorted"), header.isSorted), "".concat(blockClass, "__header-actions-column"), header.isAction), "".concat(blockClass, "__with-slug"), header.slug && /*#__PURE__*/_react.default.isValidElement(header.slug))),
170
180
  key: header.id,
171
181
  "aria-hidden": header.id === 'spacer' && 'true'
172
- }, getAccessibilityProps(header)), header.render('Header'), resizerProps && !header.isAction && /*#__PURE__*/_react.default.createElement(ResizeHeader, {
182
+ }, getAccessibilityProps(header)), header.render('Header'), renderSlug(header.slug), resizerProps && !header.isAction && /*#__PURE__*/_react.default.createElement(ResizeHeader, {
173
183
  resizerProps: resizerProps,
174
184
  header: header,
175
185
  handleOnMouseDownResize: handleOnMouseDownResize,
@@ -0,0 +1,36 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ var _typeof = require("@babel/runtime/helpers/typeof");
5
+ Object.defineProperty(exports, "__esModule", {
6
+ value: true
7
+ });
8
+ exports.ColumnHeaderSlug = void 0;
9
+ var _react = _interopRequireWildcard(require("react"));
10
+ var _propTypes = _interopRequireDefault(require("prop-types"));
11
+ function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(e) { return e ? t : r; })(e); }
12
+ function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != _typeof(e) && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && Object.prototype.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
13
+ /**
14
+ * Copyright IBM Corp. 2024, 2024
15
+ *
16
+ * This source code is licensed under the Apache-2.0 license found in the
17
+ * LICENSE file in the root directory of this source tree.
18
+ */
19
+
20
+ var ColumnHeaderSlug = exports.ColumnHeaderSlug = /*#__PURE__*/(0, _react.forwardRef)(function (_ref, ref) {
21
+ var slug = _ref.slug;
22
+ if (slug && /*#__PURE__*/(0, _react.isValidElement)(slug)) {
23
+ var normalizedSlug = /*#__PURE__*/_react.default.cloneElement(slug, {
24
+ size: 'mini',
25
+ ref: ref
26
+ });
27
+ return normalizedSlug;
28
+ }
29
+ return;
30
+ });
31
+ ColumnHeaderSlug.propTypes = {
32
+ /**
33
+ * Specify the AI slug to be displayed
34
+ */
35
+ slug: _propTypes.default.node
36
+ };
@@ -26,9 +26,9 @@ var useDefaultStringRenderer = function useDefaultStringRenderer(hooks) {
26
26
  className: (0, _classnames.default)("".concat(blockClass, "__defaultStringRenderer"), (0, _defineProperty2.default)({}, "".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)))
27
27
  }, tableProps.value);
28
28
  };
29
- var HeaderRenderer = function HeaderRenderer(header) {
29
+ var HeaderRenderer = function HeaderRenderer(header, slug) {
30
30
  return /*#__PURE__*/_react.default.createElement("div", {
31
- className: "".concat(blockClass, "__defaultStringRenderer"),
31
+ className: (0, _classnames.default)("".concat(blockClass, "__defaultStringRenderer"), (0, _defineProperty2.default)({}, "".concat(blockClass, "__defaultStringRenderer--slug"), slug && /*#__PURE__*/_react.default.isValidElement(slug))),
32
32
  title: typeof header === 'string' ? header : '',
33
33
  key: typeof header === 'string' ? header : ''
34
34
  }, header);
@@ -38,7 +38,7 @@ var useDefaultStringRenderer = function useDefaultStringRenderer(hooks) {
38
38
  return _objectSpread(_objectSpread({
39
39
  Cell: StringRenderer
40
40
  }, column), {}, {
41
- Header: column.HeaderRenderer || HeaderRenderer(column.Header)
41
+ Header: column.HeaderRenderer || HeaderRenderer(column.Header, column.slug)
42
42
  });
43
43
  });
44
44
  return (0, _toConsumableArray2.default)(columnsWithDefaultCells);
@@ -13,9 +13,10 @@ var _settings = require("../../settings");
13
13
  var _react2 = require("@carbon/react");
14
14
  var _icons = require("@carbon/react/icons");
15
15
  var _DatagridSelectAll = require("./Datagrid/DatagridSelectAll");
16
+ var _ColumnHeaderSlug = require("./Datagrid/addons/Slug/ColumnHeaderSlug");
16
17
  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; }
17
18
  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) { (0, _defineProperty2.default)(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; } /**
18
- * Copyright IBM Corp. 2020, 2023
19
+ * Copyright IBM Corp. 2020, 2024
19
20
  *
20
21
  * This source code is licensed under the Apache-2.0 license found in the
21
22
  * LICENSE file in the root directory of this source tree.
@@ -63,7 +64,13 @@ var useSortableColumns = function useSortableColumns(hooks) {
63
64
  ascendingSortableLabelText = instance.ascendingSortableLabelText,
64
65
  descendingSortableLabelText = instance.descendingSortableLabelText,
65
66
  defaultSortableLabelText = instance.defaultSortableLabelText;
66
- var onSortClick = function onSortClick(column) {
67
+ var onSortClick = function onSortClick(event, column) {
68
+ var slug = event.target.classList.contains("".concat(_settings.carbon.prefix, "--slug")) || event.target.closest(".".concat(_settings.carbon.prefix, "--slug"));
69
+ // Do not continue with sorting if we find a slug
70
+ if (slug) {
71
+ event.stopPropagation();
72
+ return;
73
+ }
67
74
  var key = column.id;
68
75
  var sortDesc = column.isSortedDesc;
69
76
  var _getNewSortOrder = getNewSortOrder(sortDesc),
@@ -101,12 +108,15 @@ var useSortableColumns = function useSortableColumns(hooks) {
101
108
  defaultSortableLabelText: defaultSortableLabelText
102
109
  }),
103
110
  "aria-pressed": getAriaPressedValue(headerProp === null || headerProp === void 0 ? void 0 : headerProp.column),
104
- onClick: function onClick() {
105
- return onSortClick(headerProp === null || headerProp === void 0 ? void 0 : headerProp.column);
111
+ onClick: function onClick(event) {
112
+ return onSortClick(event, headerProp === null || headerProp === void 0 ? void 0 : headerProp.column);
106
113
  },
107
114
  kind: "ghost",
108
115
  renderIcon: function renderIcon(props) {
109
- return icon(headerProp === null || headerProp === void 0 ? void 0 : headerProp.column, props);
116
+ var _headerProp$column;
117
+ return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement(_ColumnHeaderSlug.ColumnHeaderSlug, {
118
+ slug: headerProp === null || headerProp === void 0 || (_headerProp$column = headerProp.column) === null || _headerProp$column === void 0 ? void 0 : _headerProp$column.slug
119
+ }), icon(headerProp === null || headerProp === void 0 ? void 0 : headerProp.column, props));
110
120
  },
111
121
  className: (0, _classnames.default)("".concat(_settings.carbon.prefix, "--table-sort ").concat(blockClass, "--table-sort"), (0, _defineProperty2.default)((0, _defineProperty2.default)({}, "".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))
112
122
  }, column.Header);
@@ -7,20 +7,26 @@ Object.defineProperty(exports, "__esModule", {
7
7
  });
8
8
  exports.default = void 0;
9
9
  var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
10
+ var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
10
11
  var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
11
12
  var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties"));
12
- var _react = require("@carbon/react");
13
- var _react2 = _interopRequireWildcard(require("react"));
13
+ var _react = _interopRequireWildcard(require("react"));
14
+ var _react2 = require("@carbon/react");
15
+ var _framerMotion = require("framer-motion");
16
+ var _icons = require("@carbon/react/icons");
14
17
  var _propTypes = _interopRequireDefault(require("prop-types"));
15
18
  var _classnames = _interopRequireDefault(require("classnames"));
16
19
  var _TagSet = require("../TagSet");
17
20
  var _settings = require("../../settings");
18
21
  var _uuidv = _interopRequireDefault(require("../../global/js/utils/uuidv4"));
22
+ var _motionConstants = require("../../global/js/utils/motionConstants");
23
+ var _hooks = require("../../global/js/hooks");
24
+ var _debounce = _interopRequireDefault(require("lodash/debounce"));
19
25
  var _devtools = require("../../global/js/utils/devtools");
20
26
  var _excluded = ["className", "clearFiltersText", "clearFilters", "filters", "renderLabel", "overflowType", "clearButtonInline"],
21
27
  _excluded2 = ["key", "value"];
22
28
  /**
23
- * Copyright IBM Corp. 2022, 2023
29
+ * Copyright IBM Corp. 2022, 2024
24
30
  *
25
31
  * This source code is licensed under the Apache-2.0 license found in the
26
32
  * LICENSE file in the root directory of this source tree.
@@ -30,8 +36,8 @@ function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e;
30
36
  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; }
31
37
  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) { (0, _defineProperty2.default)(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; }
32
38
  var blockClass = "".concat(_settings.pkg.prefix, "--filter-summary");
33
- var FilterSummary = /*#__PURE__*/_react2.default.forwardRef(function (_ref, ref) {
34
- var _filterSummaryClearBu;
39
+ var FilterSummary = /*#__PURE__*/_react.default.forwardRef(function (_ref, ref) {
40
+ var _viewAllButtonRef$cur, _filterSummaryClearBu;
35
41
  var _ref$className = _ref.className,
36
42
  className = _ref$className === void 0 ? '' : _ref$className,
37
43
  _ref$clearFiltersText = _ref.clearFiltersText,
@@ -56,30 +62,104 @@ var FilterSummary = /*#__PURE__*/_react2.default.forwardRef(function (_ref, ref)
56
62
  label: (_renderLabel = renderLabel === null || renderLabel === void 0 ? void 0 : renderLabel(key, value)) !== null && _renderLabel !== void 0 ? _renderLabel : "".concat(key, ": ").concat(value)
57
63
  });
58
64
  });
59
- var filterSummaryClearButton = (0, _react2.useRef)();
60
- var filterSummaryRef = (0, _react2.useRef)();
61
- var localRef = ref || filterSummaryRef;
62
- return /*#__PURE__*/_react2.default.createElement("div", (0, _extends2.default)({}, (0, _devtools.getDevtoolsProps)(componentName), {
65
+ var filterSummaryClearButton = (0, _react.useRef)();
66
+ var viewAllButtonRef = (0, _react.useRef)();
67
+ var filterSummaryRef = (0, _react.useRef)();
68
+ var localRef = filterSummaryRef || ref;
69
+ var _useState = (0, _react.useState)(0),
70
+ _useState2 = (0, _slicedToArray2.default)(_useState, 2),
71
+ overflowCount = _useState2[0],
72
+ setOverflowCount = _useState2[1];
73
+ var _useState3 = (0, _react.useState)(false),
74
+ _useState4 = (0, _slicedToArray2.default)(_useState3, 2),
75
+ multiline = _useState4[0],
76
+ setMultiline = _useState4[1];
77
+ var previousState = (0, _hooks.usePreviousValue)({
78
+ multiline: multiline
79
+ });
80
+ var handleViewAll = function handleViewAll() {
81
+ if (overflowCount === 0) {
82
+ setMultiline(false);
83
+ return;
84
+ }
85
+ setMultiline(function (prev) {
86
+ return !prev;
87
+ });
88
+ };
89
+ 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;
90
+ var measurementOffset = (filterSummaryClearButton === null || filterSummaryClearButton === void 0 || (_filterSummaryClearBu = filterSummaryClearButton.current) === null || _filterSummaryClearBu === void 0 ? void 0 : _filterSummaryClearBu.offsetWidth) + viewAllWidth;
91
+ var renderTagSet = function renderTagSet(type) {
92
+ return /*#__PURE__*/_react.default.createElement(_framerMotion.motion.div, {
93
+ key: type,
94
+ initial: {
95
+ opacity: 0,
96
+ y: -16
97
+ },
98
+ animate: {
99
+ opacity: 1,
100
+ y: 0
101
+ },
102
+ exit: {
103
+ opacity: 0,
104
+ y: -16
105
+ },
106
+ transition: {
107
+ duration: _motionConstants.DURATIONS.moderate01,
108
+ ease: _motionConstants.EASINGS.productive.entrance
109
+ }
110
+ }, /*#__PURE__*/_react.default.createElement(_TagSet.TagSet, {
111
+ allTagsModalSearchLabel: "Search all tags",
112
+ allTagsModalSearchPlaceholderText: "Search all tags",
113
+ allTagsModalTitle: "All tags",
114
+ showAllTagsLabel: "View all tags",
115
+ tags: tagFilters,
116
+ overflowType: overflowType,
117
+ className: (0, _classnames.default)((0, _defineProperty2.default)({}, "".concat(blockClass, "__clear-button-inline"), clearButtonInline)),
118
+ containingElementRef: localRef,
119
+ measurementOffset: measurementOffset,
120
+ onOverflowTagChange: function onOverflowTagChange(overflowTags) {
121
+ return setOverflowCount(overflowTags.length);
122
+ },
123
+ multiline: multiline
124
+ }));
125
+ };
126
+ (0, _hooks.useWindowResize)(function () {
127
+ var handleFilterSummaryResize = function handleFilterSummaryResize() {
128
+ var _localRef$current;
129
+ if (multiline && (localRef === null || localRef === void 0 || (_localRef$current = localRef.current) === null || _localRef$current === void 0 ? void 0 : _localRef$current.offsetHeight) <= 50) {
130
+ setMultiline(false);
131
+ }
132
+ };
133
+ var filterResize = (0, _debounce.default)(handleFilterSummaryResize, 500);
134
+ filterResize();
135
+ }, [previousState === null || previousState === void 0 ? void 0 : previousState.multiline, multiline]);
136
+ return /*#__PURE__*/_react.default.createElement("div", (0, _extends2.default)({}, (0, _devtools.getDevtoolsProps)(componentName), {
63
137
  id: filterSummaryId
64
138
  }, rest, {
65
139
  ref: localRef,
66
- className: (0, _classnames.default)([blockClass, className])
67
- }), /*#__PURE__*/_react2.default.createElement(_TagSet.TagSet, {
68
- allTagsModalSearchLabel: "Search all tags",
69
- allTagsModalSearchPlaceholderText: "Search all tags",
70
- allTagsModalTitle: "All tags",
71
- showAllTagsLabel: "View all tags",
72
- tags: tagFilters,
73
- overflowType: overflowType,
74
- className: (0, _classnames.default)((0, _defineProperty2.default)({}, "".concat(blockClass, "__clear-button-inline"), clearButtonInline)),
75
- containingElementRef: localRef,
76
- measurementOffset: filterSummaryClearButton === null || filterSummaryClearButton === void 0 || (_filterSummaryClearBu = filterSummaryClearButton.current) === null || _filterSummaryClearBu === void 0 ? void 0 : _filterSummaryClearBu.offsetWidth
77
- }), /*#__PURE__*/_react2.default.createElement(_react.Button, {
140
+ className: (0, _classnames.default)([blockClass, className], (0, _defineProperty2.default)({}, "".concat(blockClass, "__expanded"), multiline))
141
+ }), /*#__PURE__*/_react.default.createElement(_framerMotion.AnimatePresence, {
142
+ mode: "wait",
143
+ exitBeforeEnter: true
144
+ }, !multiline && renderTagSet('single'), multiline && renderTagSet('multiline')), /*#__PURE__*/_react.default.createElement(_react2.Button, {
78
145
  kind: "ghost",
79
146
  size: "sm",
80
147
  onClick: clearFilters,
81
- ref: filterSummaryClearButton
82
- }, clearFiltersText));
148
+ ref: filterSummaryClearButton,
149
+ className: "".concat(blockClass, "__clear-all-button")
150
+ }, clearFiltersText), (overflowCount > 0 || multiline) && /*#__PURE__*/_react.default.createElement("div", {
151
+ className: "".concat(blockClass, "__view-all--wrapper")
152
+ }, /*#__PURE__*/_react.default.createElement(_react2.IconButton, {
153
+ ref: viewAllButtonRef,
154
+ kind: "ghost",
155
+ label: 'View all',
156
+ className: "".concat(blockClass, "__view-all--trigger"),
157
+ align: "left",
158
+ onClick: handleViewAll,
159
+ size: "sm"
160
+ }, /*#__PURE__*/_react.default.createElement(_icons.ChevronDown, {
161
+ className: (0, _classnames.default)("".concat(blockClass, "__view-all--chevron"), (0, _defineProperty2.default)({}, "".concat(blockClass, "__view-all--chevron-multiline"), multiline))
162
+ }))));
83
163
  });
84
164
  var componentName = 'FilterSummary';
85
165
  FilterSummary.displayName = componentName;
@@ -20,7 +20,7 @@ var _useResizeObserver = require("../../global/js/hooks/useResizeObserver");
20
20
  var _devtools = require("../../global/js/utils/devtools");
21
21
  var _propsHelper = require("../../global/js/utils/props-helper");
22
22
  var _settings = require("../../settings");
23
- var _excluded = ["align", "allTagsModalTarget", "className", "maxVisible", "multiline", "overflowAlign", "overflowClassName", "overflowType", "allTagsModalTitle", "allTagsModalSearchLabel", "allTagsModalSearchPlaceholderText", "showAllTagsLabel", "tags", "containingElementRef", "measurementOffset"],
23
+ var _excluded = ["align", "allTagsModalTarget", "className", "maxVisible", "multiline", "overflowAlign", "overflowClassName", "overflowType", "allTagsModalTitle", "allTagsModalSearchLabel", "allTagsModalSearchPlaceholderText", "showAllTagsLabel", "tags", "containingElementRef", "measurementOffset", "onOverflowTagChange"],
24
24
  _excluded2 = ["label", "id"],
25
25
  _excluded3 = ["label", "onClose"]; //
26
26
  // Copyright IBM Corp. 2020, 2024
@@ -41,7 +41,8 @@ var defaults = {
41
41
  align: 'start',
42
42
  measurementOffset: 0,
43
43
  overflowAlign: 'bottom',
44
- overflowType: 'default'
44
+ overflowType: 'default',
45
+ onOverflowTagChange: function onOverflowTagChange() {}
45
46
  };
46
47
  var TagSet = exports.TagSet = /*#__PURE__*/_react.default.forwardRef(function (_ref, ref) {
47
48
  var _ref$align = _ref.align,
@@ -63,6 +64,8 @@ var TagSet = exports.TagSet = /*#__PURE__*/_react.default.forwardRef(function (_
63
64
  containingElementRef = _ref.containingElementRef,
64
65
  _ref$measurementOffse = _ref.measurementOffset,
65
66
  measurementOffset = _ref$measurementOffse === void 0 ? defaults.measurementOffset : _ref$measurementOffse,
67
+ _ref$onOverflowTagCha = _ref.onOverflowTagChange,
68
+ onOverflowTagChange = _ref$onOverflowTagCha === void 0 ? defaults.onOverflowTagChange : _ref$onOverflowTagCha,
66
69
  rest = (0, _objectWithoutProperties2.default)(_ref, _excluded);
67
70
  var _useState = (0, _react.useState)(3),
68
71
  _useState2 = (0, _slicedToArray2.default)(_useState, 2),
@@ -159,8 +162,9 @@ var TagSet = exports.TagSet = /*#__PURE__*/_react.default.forwardRef(function (_
159
162
  popoverOpen: popoverOpen,
160
163
  setPopoverOpen: setPopoverOpen
161
164
  }));
165
+ onOverflowTagChange === null || onOverflowTagChange === void 0 || onOverflowTagChange(newOverflowTags);
162
166
  setDisplayedTags(newDisplayedTags);
163
- }, [displayCount, overflowAlign, overflowClassName, overflowType, showAllTagsLabel, tags, popoverOpen, handleTagOnClose]);
167
+ }, [displayCount, overflowAlign, overflowClassName, overflowType, showAllTagsLabel, tags, onOverflowTagChange, popoverOpen, handleTagOnClose]);
164
168
  var checkFullyVisibleTags = (0, _react.useCallback)(function () {
165
169
  if (multiline) {
166
170
  return setDisplayCount(maxVisible);
@@ -314,6 +318,10 @@ TagSet.propTypes = {
314
318
  * display tags in multiple lines
315
319
  */
316
320
  multiline: _propTypes.default.bool,
321
+ /**
322
+ * Handler to get overflow tags
323
+ */
324
+ onOverflowTagChange: _propTypes.default.func,
317
325
  /**
318
326
  * overflowAlign from the standard tooltip. Default center.
319
327
  */
@@ -49,7 +49,7 @@ var useResizeObserver = exports.useResizeObserver = function useResizeObserver(r
49
49
  }
50
50
  getInitialSize();
51
51
  // eslint-disable-next-line react-hooks/exhaustive-deps
52
- }, [width, height, ref].concat((0, _toConsumableArray2.default)(deps)));
52
+ }, [width, height, ref.current].concat((0, _toConsumableArray2.default)(deps)));
53
53
  (0, _react.useLayoutEffect)(function () {
54
54
  if (!(ref !== null && ref !== void 0 && ref.current)) {
55
55
  return;
@@ -79,7 +79,7 @@ var useResizeObserver = exports.useResizeObserver = function useResizeObserver(r
79
79
  observer = null;
80
80
  };
81
81
  // eslint-disable-next-line react-hooks/exhaustive-deps
82
- }, [ref].concat((0, _toConsumableArray2.default)(deps)));
82
+ }, [ref.current].concat((0, _toConsumableArray2.default)(deps)));
83
83
  return {
84
84
  width: width,
85
85
  height: height