@carbon/ibm-products 2.22.0 → 2.23.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (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