@carbon/ibm-products 2.11.3 → 2.12.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (108) hide show
  1. package/css/index-full-carbon.css +43 -12
  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 +43 -12
  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 +43 -12
  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/DatagridEmptyBody.js +1 -3
  25. package/es/components/Datagrid/Datagrid/DatagridHeaderRow.js +3 -5
  26. package/es/components/Datagrid/Datagrid/DatagridRefBody.js +1 -3
  27. package/es/components/Datagrid/Datagrid/DatagridRow.js +2 -6
  28. package/es/components/Datagrid/Datagrid/DatagridSelectAll.js +13 -1
  29. package/es/components/Datagrid/Datagrid/DatagridSimpleBody.js +1 -3
  30. package/es/components/Datagrid/Datagrid/DatagridVirtualBody.js +1 -3
  31. package/es/components/Datagrid/Datagrid/DraggableElement.js +1 -0
  32. package/es/components/Datagrid/Datagrid/addons/CustomizeColumns/DraggableItemsList.js +37 -15
  33. package/es/components/Datagrid/Datagrid/addons/Filtering/FilterPanel.js +18 -17
  34. package/es/components/Datagrid/Datagrid/addons/Filtering/FilterProvider.js +104 -18
  35. package/es/components/Datagrid/Datagrid/addons/Filtering/OverflowCheckboxes.js +68 -0
  36. package/es/components/Datagrid/Datagrid/addons/Filtering/constants.js +1 -0
  37. package/es/components/Datagrid/Datagrid/addons/Filtering/hooks/useFilters.js +120 -54
  38. package/es/components/Datagrid/Datagrid/addons/Filtering/utils.js +9 -3
  39. package/es/components/Datagrid/Datagrid/addons/InlineEdit/InlineEditButton/InlineEditButton.js +6 -12
  40. package/es/components/Datagrid/Datagrid/addons/InlineEdit/InlineEditCell/InlineEditCell.js +0 -5
  41. package/es/components/Datagrid/Datagrid.docs-page.js +1 -1
  42. package/es/components/Datagrid/useActionsColumn.js +0 -2
  43. package/es/components/Datagrid/useDisableSelectRows.js +1 -1
  44. package/es/components/Datagrid/useFiltering.js +4 -1
  45. package/es/components/Datagrid/useInlineEdit.js +1 -6
  46. package/es/components/Datagrid/useSelectRows.js +1 -1
  47. package/es/components/Datagrid/useSortableColumns.js +14 -25
  48. package/es/components/Datagrid/utils/DatagridActions.js +2 -3
  49. package/es/components/SimpleHeader/SimpleHeader.docs-page.js +17 -0
  50. package/es/components/SimpleHeader/SimpleHeader.js +92 -0
  51. package/es/components/SimpleHeader/index.js +8 -0
  52. package/es/components/StatusIcon/StatusIcon.js +13 -13
  53. package/es/global/js/hooks/useCreateComponentStepChange.js +14 -20
  54. package/es/global/js/utils/StoryDocsPage.js +3 -3
  55. package/es/global/js/utils/getNodeTextContent.js +4 -0
  56. package/lib/components/Card/Card.js +9 -1
  57. package/lib/components/Card/CardFooter.js +8 -2
  58. package/lib/components/Card/CardHeader.js +8 -2
  59. package/lib/components/CreateFullPage/CreateFullPage.docs-page.js +6 -0
  60. package/lib/components/CreateFullPage/CreateFullPage.js +65 -7
  61. package/lib/components/Datagrid/Datagrid/Datagrid.js +2 -1
  62. package/lib/components/Datagrid/Datagrid/DatagridContent.js +6 -0
  63. package/lib/components/Datagrid/Datagrid/DatagridEmptyBody.js +1 -3
  64. package/lib/components/Datagrid/Datagrid/DatagridHeaderRow.js +3 -5
  65. package/lib/components/Datagrid/Datagrid/DatagridRefBody.js +1 -3
  66. package/lib/components/Datagrid/Datagrid/DatagridRow.js +2 -6
  67. package/lib/components/Datagrid/Datagrid/DatagridSelectAll.js +13 -1
  68. package/lib/components/Datagrid/Datagrid/DatagridSimpleBody.js +1 -3
  69. package/lib/components/Datagrid/Datagrid/DatagridVirtualBody.js +1 -3
  70. package/lib/components/Datagrid/Datagrid/DraggableElement.js +1 -0
  71. package/lib/components/Datagrid/Datagrid/addons/CustomizeColumns/DraggableItemsList.js +37 -15
  72. package/lib/components/Datagrid/Datagrid/addons/Filtering/FilterPanel.js +40 -38
  73. package/lib/components/Datagrid/Datagrid/addons/Filtering/FilterProvider.js +109 -24
  74. package/lib/components/Datagrid/Datagrid/addons/Filtering/OverflowCheckboxes.js +79 -0
  75. package/lib/components/Datagrid/Datagrid/addons/Filtering/constants.js +4 -2
  76. package/lib/components/Datagrid/Datagrid/addons/Filtering/hooks/useFilters.js +136 -70
  77. package/lib/components/Datagrid/Datagrid/addons/Filtering/utils.js +10 -4
  78. package/lib/components/Datagrid/Datagrid/addons/InlineEdit/InlineEditButton/InlineEditButton.js +6 -12
  79. package/lib/components/Datagrid/Datagrid/addons/InlineEdit/InlineEditCell/InlineEditCell.js +0 -5
  80. package/lib/components/Datagrid/Datagrid.docs-page.js +1 -1
  81. package/lib/components/Datagrid/useActionsColumn.js +0 -2
  82. package/lib/components/Datagrid/useDisableSelectRows.js +1 -1
  83. package/lib/components/Datagrid/useFiltering.js +4 -1
  84. package/lib/components/Datagrid/useInlineEdit.js +1 -6
  85. package/lib/components/Datagrid/useSelectRows.js +1 -1
  86. package/lib/components/Datagrid/useSortableColumns.js +14 -25
  87. package/lib/components/Datagrid/utils/DatagridActions.js +2 -3
  88. package/lib/components/SimpleHeader/SimpleHeader.docs-page.js +28 -0
  89. package/lib/components/SimpleHeader/SimpleHeader.js +102 -0
  90. package/lib/components/SimpleHeader/index.js +12 -0
  91. package/lib/components/StatusIcon/StatusIcon.js +12 -12
  92. package/lib/global/js/hooks/useCreateComponentStepChange.js +14 -20
  93. package/lib/global/js/utils/StoryDocsPage.js +3 -3
  94. package/lib/global/js/utils/getNodeTextContent.js +4 -0
  95. package/package.json +2 -2
  96. package/scss/components/Card/_card.scss +1 -1
  97. package/scss/components/CreateFullPage/_create-full-page.scss +11 -2
  98. package/scss/components/Datagrid/styles/_useInlineEdit.scss +8 -11
  99. package/scss/components/Datagrid/styles/addons/_FilterPanel.scss +4 -0
  100. package/scss/components/ProductiveCard/_productive-card.scss +0 -1
  101. package/scss/components/SimpleHeader/_carbon-imports.scss +11 -0
  102. package/scss/components/SimpleHeader/_index-with-carbon.scss +9 -0
  103. package/scss/components/SimpleHeader/_index.scss +10 -0
  104. package/scss/components/SimpleHeader/_simple-header.scss +37 -0
  105. package/scss/components/StatusIcon/_status-icon.scss +0 -1
  106. package/scss/components/_index-with-carbon.scss +1 -0
  107. package/es/components/Datagrid/utils/getColTitle.js +0 -25
  108. package/lib/components/Datagrid/utils/getColTitle.js +0 -32
@@ -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;
@@ -1,7 +1,7 @@
1
1
  import _extends from "@babel/runtime/helpers/extends";
2
- import _defineProperty from "@babel/runtime/helpers/defineProperty";
3
- import _toConsumableArray from "@babel/runtime/helpers/toConsumableArray";
4
2
  import _slicedToArray from "@babel/runtime/helpers/slicedToArray";
3
+ import _toConsumableArray from "@babel/runtime/helpers/toConsumableArray";
4
+ import _defineProperty from "@babel/runtime/helpers/defineProperty";
5
5
  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; }
6
6
  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; }
7
7
  /*
@@ -11,19 +11,48 @@ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t =
11
11
  * US Government Users Restricted Rights - Use, duplication or disclosure
12
12
  * restricted by GSA ADP Schedule Contract with IBM Corp.
13
13
  */
14
- import React, { useState, useRef, useEffect } from 'react';
15
- import { Checkbox, DatePicker, DatePickerInput, Dropdown, FormGroup, NumberInput, RadioButton, RadioButtonGroup, Layer } from '@carbon/react';
16
- import { INSTANT, BATCH, DATE, CHECKBOX, NUMBER, RADIO, DROPDOWN, PANEL } from '../constants';
14
+
15
+ import { BATCH, CHECKBOX, DATE, DROPDOWN, INSTANT, NUMBER, PANEL, RADIO } from '../constants';
16
+ import { Checkbox, DatePicker, DatePickerInput, Dropdown, FormGroup, Layer, NumberInput, RadioButton, RadioButtonGroup } from '@carbon/react';
17
+ import React, { useCallback, useEffect, useRef, useState } from 'react';
18
+ import OverflowCheckboxes from '../OverflowCheckboxes';
17
19
  import { getInitialStateFromFilters } from '../utils';
18
- var useFilters = function useFilters(_ref) {
19
- var updateMethod = _ref.updateMethod,
20
- _ref$filters = _ref.filters,
21
- filters = _ref$filters === void 0 ? [] : _ref$filters,
22
- setAllFilters = _ref.setAllFilters,
23
- variation = _ref.variation,
24
- reactTableFiltersState = _ref.reactTableFiltersState,
25
- _ref$onCancel = _ref.onCancel,
26
- onCancel = _ref$onCancel === void 0 ? function () {} : _ref$onCancel;
20
+ import { usePreviousValue } from '../../../../../../global/js/hooks';
21
+ export var handleCheckboxChange = function handleCheckboxChange(_ref) {
22
+ var _option$onChange;
23
+ var checked = _ref.checked,
24
+ filtersState = _ref.filtersState,
25
+ column = _ref.column,
26
+ option = _ref.option,
27
+ setFiltersState = _ref.setFiltersState,
28
+ applyFilters = _ref.applyFilters,
29
+ type = _ref.type;
30
+ var checkboxCopy = filtersState[column].value;
31
+ var foundCheckbox = checkboxCopy.find(function (checkbox) {
32
+ return checkbox.value === option.value;
33
+ });
34
+ foundCheckbox.selected = checked;
35
+ setFiltersState(_objectSpread(_objectSpread({}, filtersState), {}, _defineProperty({}, column, {
36
+ value: checkboxCopy,
37
+ type: type
38
+ })));
39
+ applyFilters({
40
+ column: column,
41
+ value: _toConsumableArray(filtersState[column].value),
42
+ type: type
43
+ });
44
+ (_option$onChange = option.onChange) === null || _option$onChange === void 0 || _option$onChange.call(option, checked);
45
+ };
46
+ var useFilters = function useFilters(_ref2) {
47
+ var updateMethod = _ref2.updateMethod,
48
+ _ref2$filters = _ref2.filters,
49
+ filters = _ref2$filters === void 0 ? [] : _ref2$filters,
50
+ setAllFilters = _ref2.setAllFilters,
51
+ variation = _ref2.variation,
52
+ reactTableFiltersState = _ref2.reactTableFiltersState,
53
+ _ref2$onCancel = _ref2.onCancel,
54
+ onCancel = _ref2$onCancel === void 0 ? function () {} : _ref2$onCancel,
55
+ panelOpen = _ref2.panelOpen;
27
56
  /** State */
28
57
  var _useState = useState(getInitialStateFromFilters(filters, variation, reactTableFiltersState)),
29
58
  _useState2 = _slicedToArray(_useState, 2),
@@ -33,11 +62,17 @@ var useFilters = function useFilters(_ref) {
33
62
  _useState4 = _slicedToArray(_useState3, 2),
34
63
  filtersObjectArray = _useState4[0],
35
64
  setFiltersObjectArray = _useState4[1];
65
+ var previousState = usePreviousValue({
66
+ panelOpen: panelOpen
67
+ });
36
68
 
37
69
  // When using batch actions we have to store the filters to then apply them later
38
70
  var prevFiltersRef = useRef(JSON.stringify(filtersState));
39
71
  var lastAppliedFilters = useRef(JSON.stringify(reactTableFiltersState));
40
72
  var prevFiltersObjectArrayRef = useRef(JSON.stringify(filtersObjectArray));
73
+ var holdingPrevFiltersRef = useRef();
74
+ var holdingLastAppliedFiltersRef = useRef([]);
75
+ var holdingPrevFiltersObjectArrayRef = useRef([]);
41
76
 
42
77
  /** Methods */
43
78
  // If the user decides to cancel or click outside the flyout, it reverts back to the filters that were
@@ -46,8 +81,14 @@ var useFilters = function useFilters(_ref) {
46
81
  setFiltersState(JSON.parse(prevFiltersRef.current));
47
82
  setFiltersObjectArray(JSON.parse(prevFiltersObjectArrayRef.current));
48
83
  setAllFilters(JSON.parse(lastAppliedFilters.current));
84
+
85
+ // Set the temp prev refs, these will be used to populate the prev values once the
86
+ // panel opens again
87
+ holdingPrevFiltersRef.current = JSON.parse(prevFiltersRef.current);
88
+ holdingLastAppliedFiltersRef.current = JSON.parse(prevFiltersObjectArrayRef.current);
89
+ holdingPrevFiltersObjectArrayRef.current = JSON.parse(lastAppliedFilters.current);
49
90
  };
50
- var reset = function reset() {
91
+ var reset = useCallback(function () {
51
92
  // When we reset we want the "initialFilters" to be an empty array
52
93
  var resetFiltersArray = [];
53
94
 
@@ -63,11 +104,11 @@ var useFilters = function useFilters(_ref) {
63
104
  // Update their respective refs so everything is in sync
64
105
  prevFiltersRef.current = JSON.stringify(initialFiltersState);
65
106
  prevFiltersObjectArrayRef.current = JSON.stringify(initialFiltersObjectArray);
66
- };
67
- var applyFilters = function applyFilters(_ref2) {
68
- var column = _ref2.column,
69
- value = _ref2.value,
70
- type = _ref2.type;
107
+ }, [filters, setAllFilters, variation]);
108
+ var applyFilters = function applyFilters(_ref3) {
109
+ var column = _ref3.column,
110
+ value = _ref3.value,
111
+ type = _ref3.type;
71
112
  // If no end date is selected return because we need the end date to do computations
72
113
  if (type === DATE && value.length > 0 && !value[1]) {
73
114
  return;
@@ -152,16 +193,47 @@ var useFilters = function useFilters(_ref) {
152
193
  }
153
194
  };
154
195
  /** Render the individual filter component */
155
- var renderFilter = function renderFilter(_ref3) {
196
+ var renderFilter = function renderFilter(_ref4) {
156
197
  var _filtersState$column, _filtersState$column2, _filtersState$column3, _filtersState$column4;
157
- var type = _ref3.type,
158
- column = _ref3.column,
159
- components = _ref3.props;
198
+ var type = _ref4.type,
199
+ column = _ref4.column,
200
+ components = _ref4.props;
160
201
  var filter;
161
202
  var isPanel = variation === PANEL;
162
203
  if (!type) {
163
204
  return console.error("type: ".concat(type, "; does not exist as a type of filter."));
164
205
  }
206
+ var renderCheckboxes = function renderCheckboxes() {
207
+ if (variation === PANEL && filtersState[column].value.length > 10) {
208
+ return /*#__PURE__*/React.createElement(OverflowCheckboxes, {
209
+ components: components,
210
+ type: type,
211
+ column: column,
212
+ setFiltersState: setFiltersState,
213
+ filtersState: filtersState,
214
+ applyFilters: applyFilters
215
+ });
216
+ }
217
+ return /*#__PURE__*/React.createElement(FormGroup, components.FormGroup, filtersState[column].value.map(function (option) {
218
+ return /*#__PURE__*/React.createElement(Checkbox, _extends({
219
+ key: option.id
220
+ }, option, {
221
+ onChange: function onChange(_, _ref5) {
222
+ var checked = _ref5.checked;
223
+ handleCheckboxChange({
224
+ checked: checked,
225
+ filtersState: filtersState,
226
+ column: column,
227
+ option: option,
228
+ setFiltersState: setFiltersState,
229
+ applyFilters: applyFilters,
230
+ type: type
231
+ });
232
+ },
233
+ checked: option.selected
234
+ }));
235
+ }));
236
+ };
165
237
  switch (type) {
166
238
  case DATE:
167
239
  filter = /*#__PURE__*/React.createElement(DatePicker, _extends({}, components.DatePicker, {
@@ -211,32 +283,7 @@ var useFilters = function useFilters(_ref) {
211
283
  }));
212
284
  break;
213
285
  case CHECKBOX:
214
- filter = /*#__PURE__*/React.createElement(FormGroup, components.FormGroup, filtersState[column].value.map(function (option) {
215
- return /*#__PURE__*/React.createElement(Checkbox, _extends({
216
- key: option.labelText
217
- }, option, {
218
- onChange: function onChange(_, _ref4) {
219
- var _option$onChange;
220
- var isSelected = _ref4.checked;
221
- var checkboxCopy = filtersState[column].value;
222
- var foundCheckbox = checkboxCopy.find(function (checkbox) {
223
- return checkbox.value === option.value;
224
- });
225
- foundCheckbox.selected = isSelected;
226
- setFiltersState(_objectSpread(_objectSpread({}, filtersState), {}, _defineProperty({}, column, {
227
- value: checkboxCopy,
228
- type: type
229
- })));
230
- applyFilters({
231
- column: column,
232
- value: _toConsumableArray(filtersState[column].value),
233
- type: type
234
- });
235
- (_option$onChange = option.onChange) === null || _option$onChange === void 0 || _option$onChange.call(option, isSelected);
236
- },
237
- checked: option.selected
238
- }));
239
- }));
286
+ filter = renderCheckboxes();
240
287
  break;
241
288
  case RADIO:
242
289
  filter = /*#__PURE__*/React.createElement(FormGroup, components.FormGroup, /*#__PURE__*/React.createElement(RadioButtonGroup, _extends({}, components.RadioButtonGroup, {
@@ -259,9 +306,9 @@ var useFilters = function useFilters(_ref) {
259
306
  labelText: "Any",
260
307
  value: "Any"
261
308
  }), components.RadioButton.map(function (radio) {
262
- var _ref5, _radio$id;
309
+ var _ref6, _radio$id;
263
310
  return /*#__PURE__*/React.createElement(RadioButton, _extends({
264
- key: (_ref5 = (_radio$id = radio.id) !== null && _radio$id !== void 0 ? _radio$id : radio.labelText) !== null && _ref5 !== void 0 ? _ref5 : radio.value
311
+ key: (_ref6 = (_radio$id = radio.id) !== null && _radio$id !== void 0 ? _radio$id : radio.labelText) !== null && _ref6 !== void 0 ? _ref6 : radio.value
265
312
  }, radio));
266
313
  })));
267
314
  break;
@@ -269,9 +316,9 @@ var useFilters = function useFilters(_ref) {
269
316
  filter = /*#__PURE__*/React.createElement(Dropdown, _extends({}, components.Dropdown, {
270
317
  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,
271
318
  items: ['Any'].concat(_toConsumableArray(components.Dropdown.items)),
272
- onChange: function onChange(_ref6) {
319
+ onChange: function onChange(_ref7) {
273
320
  var _components$Dropdown$, _components$Dropdown;
274
- var selectedItem = _ref6.selectedItem;
321
+ var selectedItem = _ref7.selectedItem;
275
322
  setFiltersState(_objectSpread(_objectSpread({}, filtersState), {}, _defineProperty({}, column, {
276
323
  value: selectedItem,
277
324
  type: type
@@ -295,6 +342,25 @@ var useFilters = function useFilters(_ref) {
295
342
  key: column
296
343
  }, filter);
297
344
  };
345
+
346
+ /** This useEffect will properly handle the previous filters when the panel closes
347
+ * 1. If the panel closes we need to call the reset fn but also store the
348
+ * previous filters in a (new) temporary place.
349
+ * 2. When the panel opens again, take the values from the temporary place
350
+ * and populate the filter state with them
351
+ */
352
+ useEffect(function () {
353
+ if (!panelOpen && previousState !== null && previousState !== void 0 && previousState.panelOpen) {
354
+ setAllFilters(holdingLastAppliedFiltersRef.current);
355
+ }
356
+ if (panelOpen && !(previousState !== null && previousState !== void 0 && previousState.panelOpen)) {
357
+ if (holdingPrevFiltersRef.current && holdingLastAppliedFiltersRef.current && holdingPrevFiltersObjectArrayRef.current) {
358
+ setFiltersState(holdingPrevFiltersRef.current);
359
+ setFiltersObjectArray(holdingLastAppliedFiltersRef.current);
360
+ setAllFilters(JSON.parse(prevFiltersObjectArrayRef.current));
361
+ }
362
+ }
363
+ }, [panelOpen, previousState, previousState === null || previousState === void 0 ? void 0 : previousState.panelOpen, reset, setAllFilters]);
298
364
  var cancel = function cancel() {
299
365
  // Reverting to previous filters only applies when using batch actions
300
366
  if (updateMethod === BATCH) {
@@ -1,3 +1,8 @@
1
+ import _defineProperty from "@babel/runtime/helpers/defineProperty";
2
+ import _objectWithoutProperties from "@babel/runtime/helpers/objectWithoutProperties";
3
+ var _excluded = ["id", "labelText", "value"];
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; }
1
6
  /**
2
7
  * Copyright IBM Corp. 2022, 2023
3
8
  *
@@ -31,13 +36,14 @@ export var getInitialStateFromFilters = function getInitialStateFromFilters(filt
31
36
  value: props.Checkbox.map(function (_ref2) {
32
37
  var id = _ref2.id,
33
38
  labelText = _ref2.labelText,
34
- value = _ref2.value;
35
- return {
39
+ value = _ref2.value,
40
+ rest = _objectWithoutProperties(_ref2, _excluded);
41
+ return _objectSpread({
36
42
  id: id,
37
43
  labelText: labelText,
38
44
  value: value,
39
45
  selected: false
40
- };
46
+ }, rest);
41
47
  }),
42
48
  type: type
43
49
  };
@@ -1,10 +1,9 @@
1
1
  import _defineProperty from "@babel/runtime/helpers/defineProperty";
2
- /*
3
- * Licensed Materials - Property of IBM
4
- * 5724-Q36
5
- * (c) Copyright IBM Corp. 2022
6
- * US Government Users Restricted Rights - Use, duplication or disclosure
7
- * restricted by GSA ADP Schedule Contract with IBM Corp.
2
+ /**
3
+ * Copyright IBM Corp. 2022, 2023
4
+ *
5
+ * This source code is licensed under the Apache-2.0 license found in the
6
+ * LICENSE file in the root directory of this source tree.
8
7
  */
9
8
 
10
9
  import React from 'react';
@@ -22,12 +21,9 @@ export var InlineEditButton = function InlineEditButton(_ref) {
22
21
  nonEditCell = _ref.nonEditCell,
23
22
  isActiveCell = _ref.isActiveCell,
24
23
  columnConfig = _ref.columnConfig,
25
- totalInlineEditColumns = _ref.totalInlineEditColumns,
26
- totalColumns = _ref.totalColumns,
27
24
  type = _ref.type;
28
- var inlineEditColsLessThanHalfOfTotal = totalInlineEditColumns < totalColumns / 2;
29
25
  return /*#__PURE__*/React.createElement("div", {
30
- className: cx("".concat(blockClass, "__inline-edit-button"), (_cx = {}, _defineProperty(_cx, "".concat(blockClass, "__inline-edit-button--disabled"), disabled || nonEditCell), _defineProperty(_cx, "".concat(blockClass, "__inline-edit-button--with-label-icon"), LabelIcon), _defineProperty(_cx, "".concat(blockClass, "__inline-edit-button--non-edit"), nonEditCell), _defineProperty(_cx, "".concat(blockClass, "__inline-edit-button--active"), isActiveCell), _defineProperty(_cx, "".concat(blockClass, "__inline-edit-button--edit-less-than-half-of-total-cols"), inlineEditColsLessThanHalfOfTotal), _defineProperty(_cx, "".concat(blockClass, "__inline-edit-button--").concat(type), type === 'date' || type === 'selection'), _cx)),
26
+ className: cx("".concat(blockClass, "__inline-edit-button"), (_cx = {}, _defineProperty(_cx, "".concat(blockClass, "__inline-edit-button--disabled"), disabled || nonEditCell), _defineProperty(_cx, "".concat(blockClass, "__inline-edit-button--with-label-icon"), LabelIcon), _defineProperty(_cx, "".concat(blockClass, "__inline-edit-button--non-edit"), nonEditCell), _defineProperty(_cx, "".concat(blockClass, "__inline-edit-button--active"), isActiveCell), _defineProperty(_cx, "".concat(blockClass, "__inline-edit-button--").concat(type), type === 'date' || type === 'selection'), _cx)),
31
27
  tabIndex: isActiveCell ? 0 : -1,
32
28
  "data-disabled": disabled || nonEditCell,
33
29
  "aria-disabled": disabled || nonEditCell,
@@ -52,8 +48,6 @@ InlineEditButton.propTypes = {
52
48
  nonEditCell: PropTypes.bool,
53
49
  placeholder: PropTypes.string,
54
50
  renderIcon: PropTypes.oneOfType([PropTypes.func, PropTypes.object]),
55
- totalColumns: PropTypes.number,
56
- totalInlineEditColumns: PropTypes.number,
57
51
  type: PropTypes.oneOf(['text', 'number', 'selection', 'date']),
58
52
  value: PropTypes.oneOfType([PropTypes.string, PropTypes.node])
59
53
  };
@@ -33,14 +33,12 @@ export var InlineEditCell = function InlineEditCell(_ref) {
33
33
  value = _ref.value,
34
34
  _ref$nonEditCell = _ref.nonEditCell,
35
35
  nonEditCell = _ref$nonEditCell === void 0 ? false : _ref$nonEditCell,
36
- totalInlineEditColumns = _ref.totalInlineEditColumns,
37
36
  type = _ref.type;
38
37
  var columnId = cell.column.id;
39
38
  var columnIndex = instance.columns.findIndex(function (col) {
40
39
  return col.id === columnId;
41
40
  });
42
41
  var cellId = "column-".concat(columnIndex, "-row-").concat(cell.row.index);
43
- var totalColumns = instance.columns.length;
44
42
  var _useContext = useContext(InlineEditContext),
45
43
  state = _useContext.state,
46
44
  dispatch = _useContext.dispatch;
@@ -450,8 +448,6 @@ export var InlineEditCell = function InlineEditCell(_ref) {
450
448
  tabIndex: tabIndex,
451
449
  nonEditCell: nonEditCell,
452
450
  columnConfig: cell.column,
453
- totalInlineEditColumns: totalInlineEditColumns,
454
- totalColumns: totalColumns,
455
451
  type: type
456
452
  }), !nonEditCell && inEditMode && cellId === activeCellId && /*#__PURE__*/React.createElement(React.Fragment, null, type === 'text' && renderTextInput(), type === 'number' && renderNumberInput(), type === 'selection' && renderSelectCell(), type === 'date' && renderDateCell()))
457
453
  );
@@ -469,7 +465,6 @@ InlineEditCell.propTypes = {
469
465
  nonEditCell: PropTypes.bool,
470
466
  placeholder: PropTypes.string,
471
467
  tabIndex: PropTypes.number,
472
- totalInlineEditColumns: PropTypes.number,
473
468
  type: PropTypes.oneOf(['text', 'number', 'selection', 'date']),
474
469
  value: PropTypes.oneOfType([PropTypes.string, PropTypes.node, PropTypes.object])
475
470
  };
@@ -116,7 +116,7 @@ export var DocsPage = function DocsPage() {
116
116
  title: 'Sortable columns',
117
117
  description: "To add sortable columns to your Datagrid, simply add the `useSortableColumns` hook. This will allow each column header to be clickable and sort each column in either ascending or descending order.\n- Include `useSortableColumns` hook\n ",
118
118
  source: {
119
- code: "\nconst [data] = useState(makeData(10));\nconst columns = React.useMemo(() => getColumns(data), []);\nconst datagridState = useDatagrid(\n {\n columns,\n data,\n },\n useSortableColumns\n);\n\nreturn <Datagrid datagridState={datagridState} />;\n "
119
+ code: "\nconst [data] = useState(makeData(10));\nconst columns = React.useMemo(() => getColumns(data), []);\nconst datagridState = useDatagrid(\n {\n columns,\n data,\n ascendingSortableLabelText: 'none',\n descendingSortableLabelText: 'ascending',\n defaultSortableLabelText: 'descending',\n },\n useSortableColumns\n);\n\nreturn <Datagrid datagridState={datagridState} />;\n "
120
120
  }
121
121
  }, {
122
122
  title: 'Sticky column',
@@ -69,7 +69,6 @@ var useActionsColumn = function useActionsColumn(hooks) {
69
69
  }, /*#__PURE__*/React.createElement(OverflowMenu, _extends({}, rest, {
70
70
  align: align || 'top',
71
71
  renderIcon: icon,
72
- light: true,
73
72
  iconDescription: itemText,
74
73
  kind: "ghost",
75
74
  className: cx(_defineProperty({}, "".concat(blockClass, "__disabled-row-action"), getDisabledState(row.index))),
@@ -85,7 +84,6 @@ var useActionsColumn = function useActionsColumn(hooks) {
85
84
  })), !isFetching && rowActions.length > 2 && /*#__PURE__*/React.createElement("div", null, /*#__PURE__*/React.createElement(OverflowMenu, {
86
85
  align: "top-right",
87
86
  size: "sm",
88
- light: true,
89
87
  flipped: true,
90
88
  onClick: function onClick(e) {
91
89
  e.stopPropagation();
@@ -13,7 +13,7 @@ var useDisableSelectRows = function useDisableSelectRows(hooks) {
13
13
  var row = _ref.row,
14
14
  instance = _ref.instance;
15
15
  return [props, {
16
- selectDisabled: instance.shouldDisableSelectRow && instance.shouldDisableSelectRow(row)
16
+ disabled: instance.shouldDisableSelectRow && instance.shouldDisableSelectRow(row)
17
17
  }];
18
18
  };
19
19
  hooks.getRowProps.push(getRowProps);
@@ -1,4 +1,5 @@
1
1
  import _defineProperty from "@babel/runtime/helpers/defineProperty";
2
+ import _typeof from "@babel/runtime/helpers/typeof";
2
3
  import _slicedToArray from "@babel/runtime/helpers/slicedToArray";
3
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; }
4
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; }
@@ -25,7 +26,9 @@ var useFiltering = function useFiltering(hooks) {
25
26
  endDate = _ref2[1];
26
27
  return rows.filter(function (row) {
27
28
  var rowValue = row.values[id];
28
- if (rowValue.getTime() <= endDate.getTime() && rowValue.getTime() >= startDate.getTime()) {
29
+ var startDateObj = _typeof(startDate) === 'object' ? startDate : new Date(startDate);
30
+ var endDateObj = _typeof(endDate) === 'object' ? endDate : new Date(endDate);
31
+ if (rowValue.getTime() <= endDateObj.getTime() && rowValue.getTime() >= startDateObj.getTime()) {
29
32
  // In date range
30
33
  return true;
31
34
  } else {