@carbon/ibm-products 2.11.3 → 2.12.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (75) hide show
  1. package/css/index-full-carbon.css +40 -7
  2. package/css/index-full-carbon.css.map +1 -1
  3. package/css/index-full-carbon.min.css +3 -3
  4. package/css/index-full-carbon.min.css.map +1 -1
  5. package/css/index-without-carbon-released-only.css +36 -7
  6. package/css/index-without-carbon-released-only.css.map +1 -1
  7. package/css/index-without-carbon-released-only.min.css +2 -2
  8. package/css/index-without-carbon-released-only.min.css.map +1 -1
  9. package/css/index-without-carbon.css +40 -7
  10. package/css/index-without-carbon.css.map +1 -1
  11. package/css/index-without-carbon.min.css +3 -3
  12. package/css/index-without-carbon.min.css.map +1 -1
  13. package/css/index.css +40 -7
  14. package/css/index.css.map +1 -1
  15. package/css/index.min.css +3 -3
  16. package/css/index.min.css.map +1 -1
  17. package/es/components/Card/Card.js +9 -1
  18. package/es/components/Card/CardFooter.js +8 -2
  19. package/es/components/Card/CardHeader.js +8 -2
  20. package/es/components/CreateFullPage/CreateFullPage.docs-page.js +6 -0
  21. package/es/components/CreateFullPage/CreateFullPage.js +66 -8
  22. package/es/components/Datagrid/Datagrid/Datagrid.js +2 -1
  23. package/es/components/Datagrid/Datagrid/DatagridContent.js +7 -1
  24. package/es/components/Datagrid/Datagrid/DatagridSelectAll.js +13 -1
  25. package/es/components/Datagrid/Datagrid/DraggableElement.js +1 -0
  26. package/es/components/Datagrid/Datagrid/addons/CustomizeColumns/DraggableItemsList.js +31 -10
  27. package/es/components/Datagrid/Datagrid/addons/Filtering/FilterPanel.js +18 -17
  28. package/es/components/Datagrid/Datagrid/addons/Filtering/FilterProvider.js +104 -18
  29. package/es/components/Datagrid/Datagrid/addons/Filtering/OverflowCheckboxes.js +68 -0
  30. package/es/components/Datagrid/Datagrid/addons/Filtering/constants.js +1 -0
  31. package/es/components/Datagrid/Datagrid/addons/Filtering/hooks/useFilters.js +120 -54
  32. package/es/components/Datagrid/Datagrid/addons/Filtering/utils.js +9 -3
  33. package/es/components/Datagrid/useActionsColumn.js +0 -2
  34. package/es/components/Datagrid/useFiltering.js +4 -1
  35. package/es/components/Datagrid/utils/DatagridActions.js +2 -3
  36. package/es/components/SimpleHeader/SimpleHeader.docs-page.js +17 -0
  37. package/es/components/SimpleHeader/SimpleHeader.js +92 -0
  38. package/es/components/SimpleHeader/index.js +8 -0
  39. package/es/components/StatusIcon/StatusIcon.js +13 -13
  40. package/es/global/js/utils/StoryDocsPage.js +3 -3
  41. package/lib/components/Card/Card.js +9 -1
  42. package/lib/components/Card/CardFooter.js +8 -2
  43. package/lib/components/Card/CardHeader.js +8 -2
  44. package/lib/components/CreateFullPage/CreateFullPage.docs-page.js +6 -0
  45. package/lib/components/CreateFullPage/CreateFullPage.js +65 -7
  46. package/lib/components/Datagrid/Datagrid/Datagrid.js +2 -1
  47. package/lib/components/Datagrid/Datagrid/DatagridContent.js +6 -0
  48. package/lib/components/Datagrid/Datagrid/DatagridSelectAll.js +13 -1
  49. package/lib/components/Datagrid/Datagrid/DraggableElement.js +1 -0
  50. package/lib/components/Datagrid/Datagrid/addons/CustomizeColumns/DraggableItemsList.js +31 -10
  51. package/lib/components/Datagrid/Datagrid/addons/Filtering/FilterPanel.js +40 -38
  52. package/lib/components/Datagrid/Datagrid/addons/Filtering/FilterProvider.js +109 -24
  53. package/lib/components/Datagrid/Datagrid/addons/Filtering/OverflowCheckboxes.js +79 -0
  54. package/lib/components/Datagrid/Datagrid/addons/Filtering/constants.js +4 -2
  55. package/lib/components/Datagrid/Datagrid/addons/Filtering/hooks/useFilters.js +136 -70
  56. package/lib/components/Datagrid/Datagrid/addons/Filtering/utils.js +10 -4
  57. package/lib/components/Datagrid/useActionsColumn.js +0 -2
  58. package/lib/components/Datagrid/useFiltering.js +4 -1
  59. package/lib/components/Datagrid/utils/DatagridActions.js +2 -3
  60. package/lib/components/SimpleHeader/SimpleHeader.docs-page.js +28 -0
  61. package/lib/components/SimpleHeader/SimpleHeader.js +102 -0
  62. package/lib/components/SimpleHeader/index.js +12 -0
  63. package/lib/components/StatusIcon/StatusIcon.js +12 -12
  64. package/lib/global/js/utils/StoryDocsPage.js +3 -3
  65. package/package.json +2 -2
  66. package/scss/components/Card/_card.scss +1 -1
  67. package/scss/components/CreateFullPage/_create-full-page.scss +11 -2
  68. package/scss/components/Datagrid/styles/addons/_FilterPanel.scss +4 -0
  69. package/scss/components/ProductiveCard/_productive-card.scss +0 -1
  70. package/scss/components/SimpleHeader/_carbon-imports.scss +11 -0
  71. package/scss/components/SimpleHeader/_index-with-carbon.scss +9 -0
  72. package/scss/components/SimpleHeader/_index.scss +10 -0
  73. package/scss/components/SimpleHeader/_simple-header.scss +37 -0
  74. package/scss/components/StatusIcon/_status-icon.scss +0 -1
  75. package/scss/components/_index-with-carbon.scss +1 -0
@@ -1,7 +1,7 @@
1
1
  import _extends from "@babel/runtime/helpers/extends";
2
2
  import _slicedToArray from "@babel/runtime/helpers/slicedToArray";
3
3
  import _objectWithoutProperties from "@babel/runtime/helpers/objectWithoutProperties";
4
- var _excluded = ["backButtonText", "cancelButtonText", "children", "className", "initialStep", "modalDangerButtonText", "modalDescription", "modalSecondaryButtonText", "modalTitle", "nextButtonText", "onClose", "onRequestSubmit", "firstFocusElement", "submitButtonText", "title"];
4
+ var _excluded = ["breadcrumbsOverflowAriaLabel", "breadcrumbs", "backButtonText", "cancelButtonText", "children", "className", "initialStep", "maxVisibleBreadcrumbs", "modalDangerButtonText", "modalDescription", "modalSecondaryButtonText", "modalTitle", "nextButtonText", "onClose", "onRequestSubmit", "firstFocusElement", "submitButtonText", "noTrailingSlash", "title", "secondaryTitle"];
5
5
  /**
6
6
  * Copyright IBM Corp. 2021, 2023
7
7
  *
@@ -10,7 +10,7 @@ var _excluded = ["backButtonText", "cancelButtonText", "children", "className",
10
10
  */
11
11
 
12
12
  // Import portions of React that are needed.
13
- import React, { useEffect, useState, createContext } from 'react';
13
+ import React, { useEffect, useState, createContext, useRef } from 'react';
14
14
 
15
15
  // Other standard imports.
16
16
  import PropTypes from 'prop-types';
@@ -25,6 +25,7 @@ import { ActionSet } from '../ActionSet';
25
25
  import { usePreviousValue, useValidCreateStepCount, useResetCreateComponent, useCreateComponentFocus, useCreateComponentStepChange } from '../../global/js/hooks';
26
26
  import { lastIndexInArray } from '../../global/js/utils/lastIndexInArray';
27
27
  import { getNumberOfHiddenSteps } from '../../global/js/utils/getNumberOfHiddenSteps';
28
+ import { SimpleHeader, overflowAriaLabel_required_if_breadcrumbs_exist } from '../SimpleHeader/SimpleHeader';
28
29
  var blockClass = "".concat(pkg.prefix, "--create-full-page");
29
30
  var componentName = 'CreateFullPage';
30
31
 
@@ -50,11 +51,14 @@ include `<Row>` and `<Column>` components inside of each `CreateFullPageStep`
50
51
  component to get the desired affect.
51
52
  */
52
53
  export var CreateFullPage = /*#__PURE__*/React.forwardRef(function (_ref, ref) {
53
- var backButtonText = _ref.backButtonText,
54
+ var breadcrumbsOverflowAriaLabel = _ref.breadcrumbsOverflowAriaLabel,
55
+ breadcrumbs = _ref.breadcrumbs,
56
+ backButtonText = _ref.backButtonText,
54
57
  cancelButtonText = _ref.cancelButtonText,
55
58
  children = _ref.children,
56
59
  className = _ref.className,
57
60
  initialStep = _ref.initialStep,
61
+ maxVisibleBreadcrumbs = _ref.maxVisibleBreadcrumbs,
58
62
  modalDangerButtonText = _ref.modalDangerButtonText,
59
63
  modalDescription = _ref.modalDescription,
60
64
  modalSecondaryButtonText = _ref.modalSecondaryButtonText,
@@ -64,7 +68,9 @@ export var CreateFullPage = /*#__PURE__*/React.forwardRef(function (_ref, ref) {
64
68
  onRequestSubmit = _ref.onRequestSubmit,
65
69
  firstFocusElement = _ref.firstFocusElement,
66
70
  submitButtonText = _ref.submitButtonText,
71
+ noTrailingSlash = _ref.noTrailingSlash,
67
72
  title = _ref.title,
73
+ secondaryTitle = _ref.secondaryTitle,
68
74
  rest = _objectWithoutProperties(_ref, _excluded);
69
75
  var _useState = useState([]),
70
76
  _useState2 = _slicedToArray(_useState, 2),
@@ -114,6 +120,11 @@ export var CreateFullPage = /*#__PURE__*/React.forwardRef(function (_ref, ref) {
114
120
  _useState22 = _slicedToArray(_useState21, 2),
115
121
  lastIncludedStep = _useState22[0],
116
122
  setLastIncludedStep = _useState22[1];
123
+ var _useState23 = useState(0),
124
+ _useState24 = _slicedToArray(_useState23, 2),
125
+ headerHeight = _useState24[0],
126
+ setHeaderHeight = _useState24[1];
127
+ var headerRef = useRef(null);
117
128
  useEffect(function () {
118
129
  var firstItem = stepData.findIndex(function (item) {
119
130
  return item === null || item === void 0 ? void 0 : item.shouldIncludeStep;
@@ -130,6 +141,13 @@ export var CreateFullPage = /*#__PURE__*/React.forwardRef(function (_ref, ref) {
130
141
  setCurrentStep(Number(initialStep + numberOfHiddenSteps));
131
142
  }
132
143
  }, [stepData, firstIncludedStep, lastIncludedStep, initialStep]);
144
+ useEffect(function () {
145
+ var headerHeight = 0;
146
+ if (title || (breadcrumbs === null || breadcrumbs === void 0 ? void 0 : breadcrumbs.length) > 0) {
147
+ headerHeight = headerRef.current.getBoundingClientRect().height;
148
+ }
149
+ setHeaderHeight(headerHeight);
150
+ }, [title, breadcrumbs]);
133
151
  useCreateComponentFocus({
134
152
  previousState: previousState,
135
153
  currentStep: currentStep,
@@ -171,18 +189,31 @@ export var CreateFullPage = /*#__PURE__*/React.forwardRef(function (_ref, ref) {
171
189
  setCreateComponentActions: setCreateFullPageActions,
172
190
  setModalIsOpen: setModalIsOpen
173
191
  });
174
-
175
192
  // currently, we are not supporting the use of 'view all' toggle state
176
193
  /* istanbul ignore next */
177
194
  return /*#__PURE__*/React.createElement("div", _extends({}, rest, {
178
195
  ref: ref,
179
196
  className: cx(blockClass, className)
180
- }, getDevtoolsProps(componentName)), /*#__PURE__*/React.createElement("div", {
197
+ }, getDevtoolsProps(componentName)), (title || (breadcrumbs === null || breadcrumbs === void 0 ? void 0 : breadcrumbs.length) > 0) && /*#__PURE__*/React.createElement("div", {
198
+ className: "".concat(blockClass, "__header"),
199
+ ref: headerRef
200
+ }, /*#__PURE__*/React.createElement(SimpleHeader, {
201
+ title: title,
202
+ breadcrumbs: breadcrumbs,
203
+ noTrailingSlash: noTrailingSlash,
204
+ overflowAriaLabel: breadcrumbsOverflowAriaLabel,
205
+ maxVisible: maxVisibleBreadcrumbs
206
+ })), /*#__PURE__*/React.createElement("div", {
207
+ className: "".concat(blockClass, "__influencer-and-body-container"),
208
+ style: {
209
+ height: "calc(100vh - ".concat(headerHeight, "px)")
210
+ }
211
+ }, /*#__PURE__*/React.createElement("div", {
181
212
  className: "".concat(blockClass, "__influencer")
182
213
  }, /*#__PURE__*/React.createElement(CreateInfluencer, {
183
214
  stepData: stepData,
184
215
  currentStep: currentStep,
185
- title: title
216
+ title: secondaryTitle
186
217
  })), /*#__PURE__*/React.createElement("div", {
187
218
  className: "".concat(blockClass, "__body")
188
219
  }, /*#__PURE__*/React.createElement("div", {
@@ -239,7 +270,7 @@ export var CreateFullPage = /*#__PURE__*/React.forwardRef(function (_ref, ref) {
239
270
  type: "button",
240
271
  kind: "danger",
241
272
  onClick: onClose
242
- }, modalDangerButtonText))));
273
+ }, modalDangerButtonText)))));
243
274
  });
244
275
 
245
276
  // Return a placeholder if not released and not enabled by feature flag.
@@ -257,6 +288,23 @@ CreateFullPage.propTypes = {
257
288
  * The back button text
258
289
  */
259
290
  backButtonText: PropTypes.string.isRequired,
291
+ /** The header breadcrumbs */
292
+ breadcrumbs: PropTypes.arrayOf(PropTypes.shape({
293
+ /** breadcrumb item key */
294
+ key: PropTypes.string.isRequired,
295
+ /** breadcrumb item label */
296
+ label: PropTypes.string.isRequired,
297
+ /** breadcrumb item link */
298
+ href: PropTypes.string,
299
+ /** breadcrumb item title tooltip */
300
+ title: PropTypes.string,
301
+ /** Provide if this breadcrumb item represents the current page */
302
+ isCurrentPage: PropTypes.bool
303
+ })),
304
+ /**
305
+ * Label for open/close overflow button used for breadcrumb items that do not fit
306
+ */
307
+ breadcrumbsOverflowAriaLabel: overflowAriaLabel_required_if_breadcrumbs_exist,
260
308
  /**
261
309
  * The cancel button text
262
310
  */
@@ -279,6 +327,8 @@ CreateFullPage.propTypes = {
279
327
  * is now being completed.
280
328
  */
281
329
  initialStep: PropTypes.number,
330
+ /** Maximum visible breadcrumb-items before overflow is used (values less than 1 are treated as 1) */
331
+ maxVisibleBreadcrumbs: PropTypes.number,
282
332
  /**
283
333
  * The primary 'danger' button text in the modal
284
334
  */
@@ -299,6 +349,10 @@ CreateFullPage.propTypes = {
299
349
  * The next button text
300
350
  */
301
351
  nextButtonText: PropTypes.string.isRequired,
352
+ /**
353
+ * A prop to omit the trailing slash for the breadcrumbs
354
+ */
355
+ noTrailingSlash: PropTypes.bool,
302
356
  /**
303
357
  * An optional handler that is called when the user closes the full page (by
304
358
  * clicking the secondary button, located in the modal, which triggers after
@@ -310,6 +364,10 @@ CreateFullPage.propTypes = {
310
364
  * This function can _optionally_ return a promise that is either resolved or rejected and the CreateFullPage will handle the submitting state of the create button.
311
365
  */
312
366
  onRequestSubmit: PropTypes.func.isRequired,
367
+ /**
368
+ * A secondary title of the full page, displayed in the influencer area
369
+ */
370
+ secondaryTitle: PropTypes.string,
313
371
  /**
314
372
  * @ignore
315
373
  * The aria label to be used for the UI Shell SideNav Carbon component
@@ -320,7 +378,7 @@ CreateFullPage.propTypes = {
320
378
  */
321
379
  submitButtonText: PropTypes.string.isRequired,
322
380
  /**
323
- * The main title of the full page, displayed in the influencer area.
381
+ * The main title of the full page, displayed in the header area
324
382
  */
325
383
  title: PropTypes.string
326
384
  };
@@ -44,7 +44,8 @@ export var Datagrid = /*#__PURE__*/React.forwardRef(function (_ref, ref) {
44
44
  datagridState: datagridState
45
45
  };
46
46
  return /*#__PURE__*/React.createElement(FilterProvider, {
47
- filters: filters
47
+ filters: filters,
48
+ filterProps: filterProps
48
49
  }, /*#__PURE__*/React.createElement(InlineEditProvider, null, /*#__PURE__*/React.createElement("div", _extends({}, rest, {
49
50
  id: tableId,
50
51
  ref: ref,
@@ -11,7 +11,7 @@ import { FilterContext, FilterPanel } from './addons/Filtering';
11
11
  import React, { useContext, useEffect, useRef } from 'react';
12
12
  import { Table, TableContainer } from '@carbon/react';
13
13
  import { carbon, pkg } from '../../../settings';
14
- import { CLEAR_FILTERS } from './addons/Filtering/constants';
14
+ import { CLEAR_FILTERS, CLEAR_SINGLE_FILTER } from './addons/Filtering/constants';
15
15
  import DatagridBody from './DatagridBody';
16
16
  import DatagridHead from './DatagridHead';
17
17
  import DatagridToolbar from './DatagridToolbar';
@@ -24,6 +24,8 @@ import { handleGridKeyPress } from './addons/InlineEdit/handleGridKeyPress';
24
24
  import { px } from '@carbon/layout';
25
25
  import { useClickOutside } from '../../../global/js/hooks';
26
26
  import { useMultipleKeyTracking } from '../../DataSpreadsheet/hooks';
27
+ import { useSubscribeToEventEmitter } from './addons/Filtering/hooks';
28
+ import { clearSingleFilter } from './addons/Filtering/FilterProvider';
27
29
  var blockClass = "".concat(pkg.prefix, "--datagrid");
28
30
  export var DatagridContent = function DatagridContent(_ref) {
29
31
  var _cx4;
@@ -59,6 +61,7 @@ export var DatagridContent = function DatagridContent(_ref) {
59
61
  DatagridActions = datagridState.DatagridActions,
60
62
  totalColumnsWidth = datagridState.totalColumnsWidth,
61
63
  gridRef = datagridState.gridRef,
64
+ setAllFilters = datagridState.setAllFilters,
62
65
  state = datagridState.state,
63
66
  page = datagridState.page,
64
67
  rows = datagridState.rows;
@@ -124,6 +127,9 @@ export var DatagridContent = function DatagridContent(_ref) {
124
127
  gridElement.style.setProperty("--".concat(blockClass, "--grid-header-height"), px((tableHeader === null || tableHeader === void 0 ? void 0 : tableHeader.clientHeight) || 0));
125
128
  }
126
129
  }, [withInlineEdit, tableId, totalColumnsWidth, datagridState, gridActive]);
130
+ useSubscribeToEventEmitter(CLEAR_SINGLE_FILTER, function (id) {
131
+ return clearSingleFilter(id, setAllFilters, state);
132
+ });
127
133
  var renderFilterSummary = function renderFilterSummary() {
128
134
  return state.filters.length > 0 && /*#__PURE__*/React.createElement(FilterSummary, {
129
135
  className: "".concat(blockClass, "__filter-summary"),
@@ -50,11 +50,23 @@ var SelectAll = function SelectAll(datagridState) {
50
50
  var _getProps = getProps(),
51
51
  onChange = _getProps.onChange,
52
52
  selectProps = _objectWithoutProperties(_getProps, _excluded);
53
+ var _ref = selectProps || {},
54
+ indeterminate = _ref.indeterminate;
55
+ var handleSelectAllChange = function handleSelectAllChange(event) {
56
+ if (indeterminate) {
57
+ return onChange === null || onChange === void 0 ? void 0 : onChange({
58
+ target: {
59
+ checked: false
60
+ }
61
+ });
62
+ }
63
+ return onChange === null || onChange === void 0 ? void 0 : onChange(event);
64
+ };
53
65
  return /*#__PURE__*/React.createElement("div", {
54
66
  className: cx("".concat(blockClass, "__head-select-all"), "".concat(blockClass, "__checkbox-cell"), _defineProperty({}, "".concat(blockClass, "__checkbox-cell-sticky-left"), isFirstColumnStickyLeft && windowSize > 671))
55
67
  }, /*#__PURE__*/React.createElement(TableSelectAll, _extends({}, selectProps, {
56
68
  name: "".concat(tableId, "-select-all-checkbox-name"),
57
- onSelect: onChange,
69
+ onSelect: handleSelectAllChange,
58
70
  disabled: isFetching || selectProps.disabled,
59
71
  id: "".concat(tableId, "-select-all-checkbox-id")
60
72
  })));
@@ -26,6 +26,7 @@ var DraggableElement = function DraggableElement(_ref) {
26
26
  isSticky = _ref.isSticky,
27
27
  selected = _ref.selected;
28
28
  var _useSortable = useSortable({
29
+ disabled: disabled,
29
30
  id: id
30
31
  }),
31
32
  attributes = _useSortable.attributes,
@@ -1,4 +1,5 @@
1
1
  import _defineProperty from "@babel/runtime/helpers/defineProperty";
2
+ import _toConsumableArray from "@babel/runtime/helpers/toConsumableArray";
2
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; }
3
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; }
4
5
  /**
@@ -39,19 +40,39 @@ export var DraggableItemsList = function DraggableItemsList(_ref) {
39
40
  var _getColTitle;
40
41
  return filterString.length === 0 || ((_getColTitle = getColTitle(colDef)) === null || _getColTitle === void 0 ? void 0 : _getColTitle.toLowerCase().includes(filterString)) && colDef.id !== 'spacer';
41
42
  });
43
+ var getUpdatedDragCols = function getUpdatedDragCols() {
44
+ var tempCols = _toConsumableArray(visibleCols);
45
+ tempCols.forEach(function (col) {
46
+ if (col.sticky) {
47
+ col.disabled = true;
48
+ }
49
+ });
50
+ return tempCols;
51
+ };
52
+ var updatedDragCols = getUpdatedDragCols();
42
53
 
43
54
  // let localRefCopy;
44
55
  var handleDragEnd = function handleDragEnd(event) {
56
+ var _destOverCol$;
45
57
  var active = event.active,
46
58
  over = event.over;
59
+
60
+ // Stop any re-ordering updates if the destination column is disabled
61
+ // ie: it is a frozen column.
62
+ var destOverCol = updatedDragCols.filter(function (item) {
63
+ return item.id === over.id;
64
+ });
65
+ if (destOverCol !== null && destOverCol !== void 0 && destOverCol.length && (_destOverCol$ = destOverCol[0]) !== null && _destOverCol$ !== void 0 && _destOverCol$.disabled) {
66
+ return;
67
+ }
47
68
  var fromVisibleIndex = columns.findIndex(function (col) {
48
69
  return matchedColsById(col, active);
49
70
  });
50
71
  var toVisibleIndex = columns.findIndex(function (col) {
51
72
  return matchedColsById(col, over);
52
73
  });
53
- var colTitle = getColTitle(visibleCols[fromVisibleIndex]);
54
- setAriaRegionText("".concat(colTitle, " dropped. New position ").concat(toVisibleIndex + 1, " of ").concat(visibleCols.length, "."));
74
+ var colTitle = getColTitle(updatedDragCols[fromVisibleIndex]);
75
+ setAriaRegionText("".concat(colTitle, " dropped. New position ").concat(toVisibleIndex + 1, " of ").concat(updatedDragCols.length, "."));
55
76
  var fromIndex = columns.findIndex(function (col) {
56
77
  return matchedColsById(col, active);
57
78
  });
@@ -62,23 +83,23 @@ export var DraggableItemsList = function DraggableItemsList(_ref) {
62
83
  };
63
84
  var handleDragStart = function handleDragStart(event) {
64
85
  var active = event.active;
65
- var fromIndex = visibleCols.findIndex(function (col) {
86
+ var fromIndex = updatedDragCols.findIndex(function (col) {
66
87
  return matchedColsById(col, active);
67
88
  });
68
- var colTitle = getColTitle(visibleCols[fromIndex]);
69
- setAriaRegionText("".concat(colTitle, " grabbed. Current position ").concat(fromIndex + 1, " of ").concat(visibleCols.length, "."));
89
+ var colTitle = getColTitle(updatedDragCols[fromIndex]);
90
+ setAriaRegionText("".concat(colTitle, " grabbed. Current position ").concat(fromIndex + 1, " of ").concat(updatedDragCols.length, "."));
70
91
  };
71
92
  var handleDragUpdate = function handleDragUpdate(event) {
72
93
  var active = event.active,
73
94
  over = event.over;
74
- var fromIndex = visibleCols.findIndex(function (col) {
95
+ var fromIndex = updatedDragCols.findIndex(function (col) {
75
96
  return matchedColsById(col, active);
76
97
  });
77
- var toIndex = visibleCols.findIndex(function (col) {
98
+ var toIndex = updatedDragCols.findIndex(function (col) {
78
99
  return matchedColsById(col, over);
79
100
  });
80
- var colTitle = getColTitle(visibleCols[fromIndex]);
81
- setAriaRegionText("".concat(colTitle, " grabbed. Original position ").concat(fromIndex + 1, ", new position ").concat(toIndex + 1, " of ").concat(visibleCols.length, "."));
101
+ var colTitle = getColTitle(updatedDragCols[fromIndex]);
102
+ setAriaRegionText("".concat(colTitle, " grabbed. Original position ").concat(fromIndex + 1, ", new position ").concat(toIndex + 1, " of ").concat(updatedDragCols.length, "."));
82
103
  };
83
104
  var pointerSensor = useSensor(PointerSensor, {
84
105
  // Require the mouse to move by 10 pixels before activating
@@ -137,7 +158,7 @@ export var DraggableItemsList = function DraggableItemsList(_ref) {
137
158
  key: colDef.id
138
159
  });
139
160
  })), /*#__PURE__*/React.createElement(SortableContext, {
140
- items: visibleCols,
161
+ items: updatedDragCols,
141
162
  strategy: verticalListSortingStrategy
142
163
  }, visibleCols.map(function (colDef) {
143
164
  var colHeaderTitle = getColTitle(colDef);
@@ -10,21 +10,21 @@ import _slicedToArray from "@babel/runtime/helpers/slicedToArray";
10
10
 
11
11
  /* eslint-disable react/jsx-key */
12
12
 
13
- import React, { useRef, useMemo, useContext, useState, useEffect } from 'react';
14
- import PropTypes from 'prop-types';
15
- import { Accordion, AccordionItem, Button, Search, Layer } from '@carbon/react';
16
- import { rem } from '@carbon/layout';
17
- import { pkg } from '../../../../../settings';
13
+ import { Accordion, AccordionItem, Button, Layer, Search } from '@carbon/react';
18
14
  import { BATCH, CLEAR_FILTERS, INSTANT, PANEL } from './constants';
19
- import cx from 'classnames';
20
- import { motion } from 'framer-motion';
21
- import { panelVariants, innerContainerVariants, actionSetVariants } from './motion/variants';
22
- import { Close } from '@carbon/react/icons';
15
+ import React, { useContext, useEffect, useMemo, useRef, useState } from 'react';
16
+ import { actionSetVariants, innerContainerVariants, panelVariants } from './motion/variants';
17
+ import { useFilters, useShouldDisableButtons, useSubscribeToEventEmitter } from './hooks';
23
18
  import { ActionSet } from '../../../../ActionSet';
19
+ import { Close } from '@carbon/react/icons';
24
20
  import { FilterContext } from '.';
25
- import { useFilters, useSubscribeToEventEmitter, useShouldDisableButtons } from './hooks';
21
+ import PropTypes from 'prop-types';
22
+ import cx from 'classnames';
23
+ import { motion } from 'framer-motion';
24
+ import { pkg } from '../../../../../settings';
25
+ import { rem } from '@carbon/layout';
26
26
  var blockClass = "".concat(pkg.prefix, "--datagrid");
27
- var componentClass = "".concat(blockClass, "-filter-panel");
27
+ export var componentClass = "".concat(blockClass, "-filter-panel");
28
28
  var MotionActionSet = motion(ActionSet);
29
29
  var FilterPanel = function FilterPanel(_ref) {
30
30
  var _cx;
@@ -63,13 +63,19 @@ var FilterPanel = function FilterPanel(_ref) {
63
63
  _useState2 = _slicedToArray(_useState, 2),
64
64
  showDividerLine = _useState2[0],
65
65
  setShowDividerLine = _useState2[1];
66
+
67
+ /** Context */
68
+ var _useContext = useContext(FilterContext),
69
+ panelOpen = _useContext.panelOpen,
70
+ setPanelOpen = _useContext.setPanelOpen;
66
71
  var _useFilters = useFilters({
67
72
  updateMethod: updateMethod,
68
73
  filters: filterSections,
69
74
  setAllFilters: setAllFilters,
70
75
  variation: PANEL,
71
76
  reactTableFiltersState: reactTableFiltersState,
72
- onCancel: onCancel
77
+ onCancel: onCancel,
78
+ panelOpen: panelOpen
73
79
  }),
74
80
  filtersState = _useFilters.filtersState,
75
81
  prevFiltersObjectArrayRef = _useFilters.prevFiltersObjectArrayRef,
@@ -101,11 +107,6 @@ var FilterPanel = function FilterPanel(_ref) {
101
107
  return updateMethod === BATCH;
102
108
  }, [updateMethod]);
103
109
 
104
- /** Context */
105
- var _useContext = useContext(FilterContext),
106
- panelOpen = _useContext.panelOpen,
107
- setPanelOpen = _useContext.setPanelOpen;
108
-
109
110
  /** Methods */
110
111
  var closePanel = function closePanel() {
111
112
  cancel();
@@ -1,13 +1,17 @@
1
1
  import _slicedToArray from "@babel/runtime/helpers/slicedToArray";
2
+ import _defineProperty from "@babel/runtime/helpers/defineProperty";
3
+ import _toConsumableArray from "@babel/runtime/helpers/toConsumableArray";
4
+ 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; }
5
+ 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; }
2
6
  /**
3
- * Copyright IBM Corp. 2022, 2022
7
+ * Copyright IBM Corp. 2022, 2023
4
8
  *
5
9
  * This source code is licensed under the Apache-2.0 license found in the
6
10
  * LICENSE file in the root directory of this source tree.
7
11
  */
8
12
  import React, { createContext, useState } from 'react';
9
13
  import PropTypes from 'prop-types';
10
- import { DATE, DROPDOWN, NUMBER, RADIO, CHECKBOX } from './constants';
14
+ import { DATE, DROPDOWN, NUMBER, RADIO, CHECKBOX, CLEAR_SINGLE_FILTER } from './constants';
11
15
  export var FilterContext = /*#__PURE__*/createContext();
12
16
  var EventEmitter = {
13
17
  events: {},
@@ -27,42 +31,123 @@ var EventEmitter = {
27
31
  }
28
32
  }
29
33
  };
30
- var prepareFiltersForTags = function prepareFiltersForTags(filters) {
34
+ var removeFilterItem = function removeFilterItem(state, index) {
35
+ return state.splice(index, 1);
36
+ };
37
+ var updateFilterState = function updateFilterState(state, type, value) {
38
+ if (type === CHECKBOX) {
39
+ return;
40
+ }
41
+ if (type === DATE) {
42
+ var _filterTagIndex = state.findIndex(function (val) {
43
+ return formatDateRange(val.value[0], val.value[1]) === formatDateRange(value[0], value[1]);
44
+ });
45
+ return removeFilterItem(state, _filterTagIndex);
46
+ }
47
+ var filterTagIndex = state.findIndex(function (val) {
48
+ return val.value === value;
49
+ });
50
+ return removeFilterItem(state, filterTagIndex);
51
+ };
52
+ export var clearSingleFilter = function clearSingleFilter(_ref, setAllFilters, state) {
53
+ var key = _ref.key,
54
+ value = _ref.value;
55
+ var tempState = _toConsumableArray(state.filters);
56
+ tempState.forEach(function (f, filterIndex) {
57
+ if (f.id === key) {
58
+ var filterValues = f.value;
59
+ var filterType = f.type;
60
+ updateFilterState(tempState, filterType, value);
61
+ if (filterType === CHECKBOX) {
62
+ /**
63
+ When all checkboxes of a group are all unselected the value still exists in the filtersObjectArray
64
+ This checks if all the checkboxes are selected = false and removes it from the array
65
+ */
66
+ var valueIndex = filterValues.findIndex(function (val) {
67
+ return val.id === value;
68
+ });
69
+ filterValues[valueIndex].selected = false;
70
+ var updatedFilterObject = _objectSpread(_objectSpread({}, f), {}, {
71
+ value: _toConsumableArray(filterValues)
72
+ });
73
+ tempState[filterIndex] = updatedFilterObject;
74
+ var index = tempState.findIndex(function (filter) {
75
+ return filter.id === key;
76
+ });
77
+
78
+ // If all the selected state is false remove from array
79
+ var shouldRemoveFromArray = tempState[index].value.every(function (val) {
80
+ return val.selected === false;
81
+ });
82
+ if (shouldRemoveFromArray) {
83
+ removeFilterItem(tempState, index);
84
+ }
85
+ }
86
+ }
87
+ });
88
+ setAllFilters(tempState);
89
+ };
90
+ var handleSingleFilterRemoval = function handleSingleFilterRemoval(key, value) {
91
+ EventEmitter.dispatch(CLEAR_SINGLE_FILTER, {
92
+ key: key,
93
+ value: value
94
+ });
95
+ };
96
+ var formatDateRange = function formatDateRange(startDate, endDate) {
97
+ var startDateObj = new Date(startDate);
98
+ var endDateObj = new Date(endDate);
99
+ return "".concat(startDateObj.toLocaleDateString(), " - ").concat(endDateObj.toLocaleDateString());
100
+ };
101
+ var prepareFiltersForTags = function prepareFiltersForTags(filters, renderDateLabel) {
31
102
  var tags = [];
32
- filters.forEach(function (_ref) {
33
- var id = _ref.id,
34
- type = _ref.type,
35
- value = _ref.value;
103
+ filters.forEach(function (_ref2) {
104
+ var id = _ref2.id,
105
+ type = _ref2.type,
106
+ value = _ref2.value;
107
+ var sharedFilterProps = {
108
+ filter: true,
109
+ onClose: function onClose() {
110
+ return handleSingleFilterRemoval(id, value);
111
+ }
112
+ };
36
113
  if (type === DROPDOWN || type === RADIO || type === NUMBER) {
37
- tags.push({
114
+ tags.push(_objectSpread({
38
115
  key: id,
39
116
  value: value
40
- });
117
+ }, sharedFilterProps));
41
118
  } else if (type === DATE) {
119
+ var _renderDateLabel;
42
120
  var _value = _slicedToArray(value, 2),
43
121
  startDate = _value[0],
44
122
  endDate = _value[1];
45
- tags.push({
123
+ tags.push(_objectSpread({
46
124
  key: id,
47
- value: "".concat(startDate.toLocaleDateString(), " - ").concat(endDate.toLocaleDateString())
48
- });
125
+ value: (_renderDateLabel = renderDateLabel === null || renderDateLabel === void 0 ? void 0 : renderDateLabel(startDate, endDate)) !== null && _renderDateLabel !== void 0 ? _renderDateLabel : formatDateRange(startDate, endDate)
126
+ }, sharedFilterProps));
49
127
  } else if (type === CHECKBOX) {
50
128
  value.forEach(function (checkbox) {
51
129
  if (checkbox.selected) {
52
- tags.push({
130
+ tags.push(_objectSpread(_objectSpread({
53
131
  key: id,
54
132
  value: checkbox.value
55
- });
133
+ }, sharedFilterProps), {}, {
134
+ onClose: function onClose() {
135
+ return handleSingleFilterRemoval(id, checkbox.value);
136
+ }
137
+ }));
56
138
  }
57
139
  });
58
140
  }
59
141
  });
60
142
  return tags;
61
143
  };
62
- export var FilterProvider = function FilterProvider(_ref2) {
63
- var children = _ref2.children,
64
- filters = _ref2.filters;
65
- var filterTags = prepareFiltersForTags(filters);
144
+ export var FilterProvider = function FilterProvider(_ref3) {
145
+ var children = _ref3.children,
146
+ filters = _ref3.filters,
147
+ filterProps = _ref3.filterProps;
148
+ var _ref4 = filterProps || {},
149
+ renderDateLabel = _ref4.renderDateLabel;
150
+ var filterTags = prepareFiltersForTags(filters, renderDateLabel);
66
151
  var _useState = useState(false),
67
152
  _useState2 = _slicedToArray(_useState, 2),
68
153
  panelOpen = _useState2[0],
@@ -79,5 +164,6 @@ export var FilterProvider = function FilterProvider(_ref2) {
79
164
  };
80
165
  FilterProvider.propTypes = {
81
166
  children: PropTypes.oneOfType([PropTypes.arrayOf(PropTypes.node), PropTypes.node]).isRequired,
167
+ filterProps: PropTypes.object,
82
168
  filters: PropTypes.arrayOf(PropTypes.object).isRequired
83
169
  };
@@ -0,0 +1,68 @@
1
+ import _extends from "@babel/runtime/helpers/extends";
2
+ import _slicedToArray from "@babel/runtime/helpers/slicedToArray";
3
+ import { Button, Checkbox, FormGroup } from '@carbon/react';
4
+ import React, { useState } from 'react';
5
+ import PropTypes from 'prop-types';
6
+ import { componentClass } from './FilterPanel';
7
+ import { handleCheckboxChange } from './hooks/useFilters';
8
+ var OverflowCheckboxes = function OverflowCheckboxes(_ref) {
9
+ var components = _ref.components,
10
+ filtersState = _ref.filtersState,
11
+ column = _ref.column,
12
+ setFiltersState = _ref.setFiltersState,
13
+ type = _ref.type,
14
+ applyFilters = _ref.applyFilters,
15
+ _ref$viewAllLabel = _ref.viewAllLabel,
16
+ viewAllLabel = _ref$viewAllLabel === void 0 ? 'View all' : _ref$viewAllLabel,
17
+ _ref$viewLessLabel = _ref.viewLessLabel,
18
+ viewLessLabel = _ref$viewLessLabel === void 0 ? 'View less' : _ref$viewLessLabel;
19
+ var _useState = useState(false),
20
+ _useState2 = _slicedToArray(_useState, 2),
21
+ showAllItems = _useState2[0],
22
+ setShowAllItems = _useState2[1];
23
+ var firstFiveItems = filtersState[column].value.slice(0, 5);
24
+ var restOfTheItems = filtersState[column].value.slice(5, filtersState[column].value.length - 1);
25
+ var renderCheckbox = function renderCheckbox(option) {
26
+ return /*#__PURE__*/React.createElement(Checkbox, _extends({
27
+ key: option.labelText
28
+ }, option, {
29
+ onChange: function onChange(_, _ref2) {
30
+ var checked = _ref2.checked;
31
+ return handleCheckboxChange({
32
+ checked: checked,
33
+ filtersState: filtersState,
34
+ column: column,
35
+ option: option,
36
+ setFiltersState: setFiltersState,
37
+ applyFilters: applyFilters,
38
+ type: type
39
+ });
40
+ },
41
+ checked: option.selected,
42
+ disabled: option.disabled
43
+ }));
44
+ };
45
+ var renderViewAllButtonText = function renderViewAllButtonText() {
46
+ /** This should render the text "View all ([amount of checkboxes])" or "View less" */
47
+ return showAllItems ? viewLessLabel : "".concat(viewAllLabel, " (").concat(filtersState[column].value.length, ")");
48
+ };
49
+ return /*#__PURE__*/React.createElement(FormGroup, components.FormGroup, firstFiveItems.map(renderCheckbox), showAllItems && restOfTheItems.map(renderCheckbox), /*#__PURE__*/React.createElement(Button, {
50
+ className: "".concat(componentClass, "__view-all-button"),
51
+ kind: "ghost",
52
+ size: "sm",
53
+ onClick: function onClick() {
54
+ return setShowAllItems(!showAllItems);
55
+ }
56
+ }, renderViewAllButtonText()));
57
+ };
58
+ OverflowCheckboxes.propTypes = {
59
+ applyFilters: PropTypes.func,
60
+ column: PropTypes.string,
61
+ components: PropTypes.object,
62
+ filtersState: PropTypes.object,
63
+ setFiltersState: PropTypes.func,
64
+ type: PropTypes.string,
65
+ viewAllLabel: PropTypes.string,
66
+ viewLessLabel: PropTypes.string
67
+ };
68
+ export default OverflowCheckboxes;
@@ -21,6 +21,7 @@ export var DROPDOWN = 'dropdown';
21
21
 
22
22
  /** Constants for event emitters */
23
23
  export var CLEAR_FILTERS = 'clearFilters';
24
+ export var CLEAR_SINGLE_FILTER = 'clearSingleFilter';
24
25
 
25
26
  /** Constants for panel dimensions */
26
27
  export var PANEL_WIDTH = 320;