@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.
- package/README.md +8 -4
- package/css/index-full-carbon.css +559 -357
- package/css/index-full-carbon.css.map +1 -1
- package/css/index-full-carbon.min.css +1 -1
- package/css/index-full-carbon.min.css.map +1 -1
- package/css/index-without-carbon-released-only.css +227 -267
- package/css/index-without-carbon-released-only.css.map +1 -1
- package/css/index-without-carbon-released-only.min.css +1 -1
- package/css/index-without-carbon-released-only.min.css.map +1 -1
- package/css/index-without-carbon.css +271 -295
- package/css/index-without-carbon.css.map +1 -1
- package/css/index-without-carbon.min.css +1 -1
- package/css/index-without-carbon.min.css.map +1 -1
- package/css/index.css +251 -298
- package/css/index.css.map +1 -1
- package/css/index.min.css +1 -1
- package/css/index.min.css.map +1 -1
- package/es/components/Datagrid/Datagrid/DatagridContent.js +8 -3
- package/es/components/Datagrid/Datagrid/DatagridHeaderRow.js +14 -4
- package/es/components/Datagrid/Datagrid/DatagridRow.js +6 -1
- package/es/components/Datagrid/Datagrid/addons/Filtering/FilterFlyout.js +6 -3
- package/es/components/Datagrid/Datagrid/addons/Filtering/FilterPanel.js +2 -2
- package/es/components/Datagrid/Datagrid/addons/Filtering/hooks/useFilters.js +30 -72
- package/es/components/Datagrid/Datagrid/addons/Slug/ColumnHeaderSlug.js +26 -0
- package/es/components/Datagrid/useDefaultStringRenderer.js +3 -3
- package/es/components/Datagrid/useRowIsMouseOver.js +3 -1
- package/es/components/Datagrid/useSortableColumns.js +15 -5
- package/es/components/DelimitedList/DelimitedList.docs-page.js +15 -0
- package/es/components/DelimitedList/DelimitedList.js +73 -0
- package/es/components/DelimitedList/index.js +8 -0
- package/es/components/FilterSummary/FilterSummary.js +100 -19
- package/es/components/SidePanel/SidePanel.js +145 -189
- package/es/components/TagSet/TagSet.js +31 -7
- package/es/components/TagSet/TagSetOverflow.js +13 -8
- package/es/components/index.js +2 -1
- package/es/global/js/hooks/useResizeObserver.js +5 -2
- package/es/global/js/package-settings.js +1 -0
- package/lib/components/Datagrid/Datagrid/DatagridContent.js +8 -3
- package/lib/components/Datagrid/Datagrid/DatagridHeaderRow.js +14 -4
- package/lib/components/Datagrid/Datagrid/DatagridRow.js +6 -1
- package/lib/components/Datagrid/Datagrid/addons/Filtering/FilterFlyout.js +6 -3
- package/lib/components/Datagrid/Datagrid/addons/Filtering/FilterPanel.js +2 -2
- package/lib/components/Datagrid/Datagrid/addons/Filtering/hooks/useFilters.js +30 -72
- package/lib/components/Datagrid/Datagrid/addons/Slug/ColumnHeaderSlug.js +36 -0
- package/lib/components/Datagrid/useDefaultStringRenderer.js +3 -3
- package/lib/components/Datagrid/useRowIsMouseOver.js +3 -1
- package/lib/components/Datagrid/useSortableColumns.js +15 -5
- package/lib/components/DelimitedList/DelimitedList.docs-page.js +25 -0
- package/lib/components/DelimitedList/DelimitedList.js +78 -0
- package/lib/components/DelimitedList/index.js +12 -0
- package/lib/components/FilterSummary/FilterSummary.js +103 -23
- package/lib/components/SidePanel/SidePanel.js +145 -189
- package/lib/components/TagSet/TagSet.js +31 -7
- package/lib/components/TagSet/TagSetOverflow.js +12 -7
- package/lib/components/index.js +8 -1
- package/lib/global/js/hooks/useResizeObserver.js +5 -2
- package/lib/global/js/package-settings.js +1 -0
- package/package.json +9 -8
- package/scss/components/CreateSidePanel/_create-side-panel.scss +1 -38
- package/scss/components/Datagrid/_datagrid.scss +4 -0
- package/scss/components/Datagrid/styles/_datagrid.scss +24 -1
- package/scss/components/Datagrid/styles/_useStickyColumn.scss +2 -0
- package/scss/components/DelimitedList/_carbon-imports.scss +9 -0
- package/scss/components/DelimitedList/_delimited-list.scss +27 -0
- package/scss/components/DelimitedList/_index-with-carbon.scss +9 -0
- package/scss/components/DelimitedList/_index.scss +8 -0
- package/scss/components/EditSidePanel/_edit-side-panel.scss +0 -18
- package/scss/components/FilterSummary/_filter-summary.scss +22 -1
- package/scss/components/SidePanel/_side-panel-variables.scss +5 -1
- package/scss/components/SidePanel/_side-panel.scss +155 -187
- package/scss/components/_index-with-carbon.scss +1 -0
- package/scss/components/_index.scss +1 -0
- 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
|
122
|
+
var filterCopy = _toConsumableArray(filtersObjectArray);
|
123
123
|
// // check if the filter already exists in the array
|
124
|
-
var filter =
|
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
|
-
|
132
|
+
filterCopy.push({
|
133
133
|
id: column,
|
134
134
|
value: value,
|
135
135
|
type: type
|
136
136
|
});
|
137
137
|
}
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
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(
|
195
|
-
|
196
|
-
// // Automatically apply the filters if the updateMethod is instant
|
153
|
+
setFiltersObjectArray(filterCopy);
|
197
154
|
if (updateMethod === INSTANT) {
|
198
|
-
setAllFilters(
|
155
|
+
setAllFilters(filterCopy);
|
199
156
|
}
|
200
157
|
};
|
158
|
+
|
201
159
|
/** Render the individual filter component */
|
202
|
-
var renderFilter = function renderFilter(
|
160
|
+
var renderFilter = function renderFilter(_ref6) {
|
203
161
|
var _filtersState$column3, _filtersState$column4;
|
204
|
-
var type =
|
205
|
-
column =
|
206
|
-
components =
|
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(_,
|
228
|
-
var 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
|
277
|
+
var _ref8, _radio$id;
|
320
278
|
return /*#__PURE__*/React.createElement(RadioButton, _extends({
|
321
|
-
key: (
|
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(
|
288
|
+
onChange: function onChange(_ref9) {
|
331
289
|
var _components$Dropdown$, _components$Dropdown;
|
332
|
-
var 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,
|
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
|
-
|
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
|
+
};
|
@@ -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,
|
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
|
-
|
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 =
|
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(
|
58
|
-
|
59
|
-
|
60
|
-
|
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
|
-
|
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;
|