@bundle-stats/ui 4.0.0-rc.5 → 4.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (29) hide show
  1. package/lib/components/bundle-assets/bundle-assets.js +64 -49
  2. package/lib/components/bundle-modules/bundle-modules.js +94 -79
  3. package/lib/components/bundle-packages/bundle-packages.js +60 -45
  4. package/lib/components/metrics-table-title/metrics-table-title.js +10 -7
  5. package/lib/components/metrics-table-title/metrics-table-title.module.css +9 -3
  6. package/lib/ui/filters/filters.js +5 -7
  7. package/lib/ui/filters/filters.utils.js +40 -2
  8. package/lib/ui/filters/index.js +96 -3
  9. package/lib-esm/components/bundle-assets/bundle-assets.js +63 -50
  10. package/lib-esm/components/bundle-modules/bundle-modules.js +78 -64
  11. package/lib-esm/components/bundle-packages/bundle-packages.js +44 -31
  12. package/lib-esm/components/metrics-table-title/metrics-table-title.js +10 -7
  13. package/lib-esm/components/metrics-table-title/metrics-table-title.module.css +9 -3
  14. package/lib-esm/ui/filters/filters.js +3 -4
  15. package/lib-esm/ui/filters/filters.utils.js +18 -0
  16. package/lib-esm/ui/filters/index.js +65 -3
  17. package/package.json +5 -5
  18. package/src/components/bundle-assets/bundle-assets.jsx +54 -45
  19. package/src/components/bundle-modules/bundle-modules.jsx +72 -65
  20. package/src/components/bundle-packages/bundle-packages.jsx +36 -26
  21. package/src/components/metrics-table-title/metrics-table-title.jsx +20 -18
  22. package/src/components/metrics-table-title/metrics-table-title.module.css +9 -3
  23. package/src/ui/filters/filters.jsx +4 -4
  24. package/src/ui/filters/filters.utils.js +21 -0
  25. package/src/ui/filters/index.jsx +72 -0
  26. package/lib/ui/filters/filters.container.js +0 -187
  27. package/lib-esm/ui/filters/filters.container.js +0 -111
  28. package/src/ui/filters/filters.container.jsx +0 -108
  29. package/src/ui/filters/index.js +0 -4
@@ -27,6 +27,19 @@ import { MetricsTableOptions } from '../metrics-table-options';
27
27
  import { MetricsTableTitle } from '../metrics-table-title';
28
28
  import css from './bundle-packages.module.css';
29
29
 
30
+ const getDropdownFilters = ({ compareMode, filters }) => ({
31
+ [PACKAGE_FILTERS.CHANGED]: {
32
+ label: 'Changed',
33
+ defaultValue: filters[PACKAGE_FILTERS.CHANGED],
34
+ disabled: !compareMode,
35
+ },
36
+ [PACKAGE_FILTERS.DUPLICATE]: {
37
+ label: 'Duplicate',
38
+ defaultValue: filters[PACKAGE_FILTERS.DUPLICATE],
39
+ },
40
+ });
41
+
42
+
30
43
  const PackagePopoverContent = ({ name, fullName, path, duplicate, CustomComponentLink }) => {
31
44
  const fallbackPackagePath = `node_modules/${fullName.split(PACKAGES_SEPARATOR).join('/node_modules/')}`;
32
45
  const normalizedPackagePath = `${path || fallbackPackagePath}/`;
@@ -208,20 +221,34 @@ export const BundlePackages = (props) => {
208
221
  customComponentLink: CustomComponentLink,
209
222
  } = props;
210
223
 
211
- const emptyMessage = (
212
- <EmptySet
213
- resources="packages"
214
- filtered={totalRowCount !== 0}
215
- handleResetFilters={resetFilters}
216
- handleViewAll={resetAllFilters}
217
- />
224
+ const dropdownFilters = useMemo(
225
+ () => getDropdownFilters({ compareMode: jobs?.length > 1, filters }),
226
+ [jobs, filters],
218
227
  );
219
228
 
229
+ const metricsTableTitle = useMemo(() => (
230
+ <MetricsTableTitle
231
+ title={I18N.PACKAGES}
232
+ info={`${items.length}/${totalRowCount}`}
233
+ popoverInfo={I18N.PACKAGES_INFO}
234
+ popoverHref={config.documentation.packages}
235
+ />
236
+ ), [items, totalRowCount]);
237
+
220
238
  const renderRowHeader = useCallback(
221
239
  (row) => <RowHeader row={row} CustomComponentLink={CustomComponentLink} />,
222
240
  [CustomComponentLink],
223
241
  );
224
242
 
243
+ const emptyMessage = useMemo(() => (
244
+ <EmptySet
245
+ resources="packages"
246
+ filtered={totalRowCount !== 0}
247
+ handleResetFilters={resetFilters}
248
+ handleViewAll={resetAllFilters}
249
+ />
250
+ ), [totalRowCount, resetFilters, resetAllFilters]);
251
+
225
252
  return (
226
253
  <section className={cx(css.root, className)}>
227
254
  <Toolbar
@@ -244,17 +271,7 @@ export const BundlePackages = (props) => {
244
271
  updateSearch={updateSearch}
245
272
  />
246
273
  <Filters
247
- filters={{
248
- [PACKAGE_FILTERS.CHANGED]: {
249
- label: 'Changed',
250
- defaultValue: filters[PACKAGE_FILTERS.CHANGED],
251
- disabled: jobs.length <= 1,
252
- },
253
- [PACKAGE_FILTERS.DUPLICATE]: {
254
- label: 'Duplicate',
255
- defaultValue: filters[PACKAGE_FILTERS.DUPLICATE],
256
- },
257
- }}
274
+ filters={dropdownFilters}
258
275
  label={`Filters (${items.length}/${totalRowCount})`}
259
276
  onChange={updateFilters}
260
277
  hasActiveFilters={hasActiveFilters}
@@ -268,14 +285,7 @@ export const BundlePackages = (props) => {
268
285
  emptyMessage={emptyMessage}
269
286
  renderRowHeader={renderRowHeader}
270
287
  showHeaderSum
271
- title={
272
- <MetricsTableTitle
273
- title={I18N.PACKAGES}
274
- info={`(${items.length}/${totalRowCount})`}
275
- popoverInfo={I18N.PACKAGES_INFO}
276
- popoverHref={config.documentation.packages}
277
- />
278
- }
288
+ title={metricsTableTitle}
279
289
  />
280
290
  </main>
281
291
  </section>
@@ -14,24 +14,26 @@ export const MetricsTableTitle = (props) => {
14
14
  const rootClassName = cx(css.root, className);
15
15
 
16
16
  return (
17
- <FlexStack space="xxxsmall" className={rootClassName}>
18
- <span>{title}</span>
19
- {info && <span className={css.info}>{info}</span>}
20
- {(popoverInfo || popoverHref) && (
21
- <HoverCard label={<Icon glyph="help" />}>
22
- <Stack space="xxxsmall">
23
- {popoverInfo && <p>{popoverInfo}</p>}
24
- {popoverHref && (
25
- <p>
26
- <button type="button" onClick={() => window.open(popoverHref)} className={css.readMoreLink}>
27
- {I18N.READ_MORE}
28
- </button>
29
- </p>
30
- )}
31
- </Stack>
32
- </HoverCard>
33
- )}
34
- </FlexStack>
17
+ <Stack className={rootClassName}>
18
+ <FlexStack space="xxxsmall" className={css.title}>
19
+ <span>{title}</span>
20
+ {(popoverInfo || popoverHref) && (
21
+ <HoverCard label={<Icon glyph="help" />} className={css.hoverCard}>
22
+ <Stack space="xxxsmall">
23
+ {popoverInfo && <p>{popoverInfo}</p>}
24
+ {popoverHref && (
25
+ <p>
26
+ <button type="button" onClick={() => window.open(popoverHref)} className={css.readMoreLink}>
27
+ {I18N.READ_MORE}
28
+ </button>
29
+ </p>
30
+ )}
31
+ </Stack>
32
+ </HoverCard>
33
+ )}
34
+ </FlexStack>
35
+ {info && <p className={css.info}>{info}</p>}
36
+ </Stack>
35
37
  );
36
38
  };
37
39
 
@@ -1,14 +1,20 @@
1
1
  .root {
2
+ }
3
+
4
+ .title {
5
+ color: var(--color-text-light);
2
6
  align-items: center;
3
7
  font-weight: bold;
4
- line-height: var(--space-small);
5
8
  text-transform: uppercase;
6
- color: var(--color-text-light);
9
+ }
10
+
11
+ .hoverCard {
12
+ line-height: 1;
7
13
  }
8
14
 
9
15
  .info {
16
+ font-size: var(--size-xsmall);
10
17
  font-weight: normal;
11
- text-transform: none;
12
18
  }
13
19
 
14
20
  .readMoreLink {
@@ -1,7 +1,7 @@
1
1
  import React, { useCallback } from 'react';
2
2
  import PropTypes from 'prop-types';
3
3
  import cx from 'classnames';
4
- import { get, map } from 'lodash';
4
+ import { get } from 'lodash';
5
5
 
6
6
  import { FlexStack } from '../../layout/flex-stack';
7
7
  import { Dropdown } from '../dropdown';
@@ -58,8 +58,8 @@ const FilterGroup = (props) => {
58
58
  const groupCheckboxes = groupItems.filter(
59
59
  ([itemKey, item]) => typeof item?.defaultValue !== 'undefined',
60
60
  );
61
- const isGroupChecked = groupCheckboxes
62
- .map(([itemKey]) => get(values, `${groupKey}.${itemKey}`))
61
+ const areAllGroupItemsChecked = groupCheckboxes
62
+ .map(([itemKey]) => values?.[`${groupKey}.${itemKey}`])
63
63
  .reduce((agg, val) => agg && val, true);
64
64
 
65
65
  const filterSuffix = getGroupFiltersLabelSuffix(groupItems);
@@ -123,7 +123,7 @@ const FilterGroup = (props) => {
123
123
  })}
124
124
  </div>
125
125
  <div className={css.filterGroupActions}>
126
- {isGroupChecked ? (
126
+ {areAllGroupItemsChecked ? (
127
127
  <MenuItem
128
128
  id="clear-all"
129
129
  as="button"
@@ -64,3 +64,24 @@ export const getGroupFiltersLabelSuffix = (filters) => {
64
64
 
65
65
  return `${suffix}${skippedLabels > 0 ? ` +${skippedLabels}` : ''}`;
66
66
  };
67
+
68
+ export const getInitialValues = (key, filters) => {
69
+ if (typeof filters?.defaultValue !== 'undefined') {
70
+ return {
71
+ [key]: filters.defaultValue,
72
+ };
73
+ }
74
+
75
+ if (typeof filters === 'object') {
76
+ return Object.entries(filters).map(([groupKey, groupFilters]) => getInitialValues(
77
+ [...key ? [key] : [], groupKey].join('.'),
78
+ groupFilters,
79
+ )).reduce((agg, current) => ({
80
+ ...agg,
81
+ ...current,
82
+ }), {});
83
+ }
84
+
85
+ return {};
86
+ };
87
+
@@ -0,0 +1,72 @@
1
+ import React, { useCallback, useEffect, useState } from 'react';
2
+ import PropTypes from 'prop-types';
3
+ import { isEqual, merge } from 'lodash';
4
+
5
+ import { getInitialValues } from './filters.utils';
6
+ import { Filters as BaseComponent } from './filters';
7
+
8
+ export const Filters = (props) => {
9
+ const { onChange, filters, ...restProps } = props;
10
+ const [values, setValues] = useState(getInitialValues('', filters));
11
+
12
+ // Update values when the parent filters are changing (route with query string change)
13
+ useEffect(
14
+ () => {
15
+ const parentValues = getInitialValues('', filters);
16
+
17
+ if (isEqual(parentValues, values)) {
18
+ return;
19
+ }
20
+
21
+ setValues(parentValues);
22
+ },
23
+ // Do not trigger effect when the values are changing locally
24
+ [filters, setValues],
25
+ );
26
+
27
+ const toggleFilter = useCallback(
28
+ (key, value) => {
29
+ const nextValues = merge({}, values, { [key]: value });
30
+ setValues(nextValues);
31
+
32
+ if (onChange) {
33
+ onChange(nextValues);
34
+ }
35
+ },
36
+ [onChange, setValues, values]
37
+ );
38
+
39
+ const toggleFilters = useCallback(
40
+ (newFilters) => {
41
+ const nextValues = merge({}, values, newFilters);
42
+ setValues(nextValues);
43
+
44
+ if (onChange) {
45
+ onChange(nextValues);
46
+ }
47
+ },
48
+ [onChange, setValues, values],
49
+ );
50
+
51
+ return (
52
+ <BaseComponent
53
+ {...restProps}
54
+ filters={filters}
55
+ values={values}
56
+ toggleFilter={toggleFilter}
57
+ toggleFilters={toggleFilters}
58
+ />
59
+ );
60
+ };
61
+
62
+ Filters.defaultProps = {
63
+ onChange: null,
64
+ };
65
+
66
+ Filters.propTypes = {
67
+ /** Filter config */
68
+ filters: PropTypes.object.isRequired, // eslint-disable-line react/forbid-prop-types
69
+
70
+ /** OnChange handler */
71
+ onChange: PropTypes.func,
72
+ };
@@ -1,187 +0,0 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.filtersDropdownContainer = void 0;
7
-
8
- var _isEqual2 = _interopRequireDefault(require("lodash/isEqual"));
9
-
10
- var _react = _interopRequireDefault(require("react"));
11
-
12
- var _propTypes = _interopRequireDefault(require("prop-types"));
13
-
14
- var _excluded = ["values"];
15
-
16
- function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
17
-
18
- function _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
19
-
20
- function _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }
21
-
22
- function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }
23
-
24
- function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
25
-
26
- function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
27
-
28
- function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; }
29
-
30
- function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) _setPrototypeOf(subClass, superClass); }
31
-
32
- function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }
33
-
34
- function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }
35
-
36
- function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return _assertThisInitialized(self); }
37
-
38
- function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; }
39
-
40
- function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
41
-
42
- function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }
43
-
44
- function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
45
-
46
- function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
47
-
48
- function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); }
49
-
50
- function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
51
-
52
- function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter); }
53
-
54
- function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); }
55
-
56
- function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
57
-
58
- function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
59
-
60
- function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
61
-
62
- function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
63
-
64
- function _iterableToArrayLimit(arr, i) { var _i = arr == null ? null : typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"]; if (_i == null) return; var _arr = []; var _n = true; var _d = false; var _s, _e; try { for (_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }
65
-
66
- function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
67
-
68
- function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof(obj); }
69
-
70
- function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
71
-
72
- var getInitialValues = function getInitialValues(key, filters) {
73
- if (typeof (filters === null || filters === void 0 ? void 0 : filters.defaultValue) !== 'undefined') {
74
- return _defineProperty({}, key, filters.defaultValue);
75
- }
76
-
77
- if (_typeof(filters) === 'object') {
78
- return Object.entries(filters).map(function (_ref2) {
79
- var _ref3 = _slicedToArray(_ref2, 2),
80
- groupKey = _ref3[0],
81
- groupFilters = _ref3[1];
82
-
83
- return getInitialValues([].concat(_toConsumableArray(key ? [key] : []), [groupKey]).join('.'), groupFilters);
84
- }).reduce(function (agg, current) {
85
- return _objectSpread(_objectSpread({}, agg), current);
86
- }, {});
87
- }
88
-
89
- return {};
90
- };
91
-
92
- var filtersDropdownContainer = function filtersDropdownContainer(BaseComponent) {
93
- var FiltersContainer = /*#__PURE__*/function (_React$Component) {
94
- _inherits(FiltersContainer, _React$Component);
95
-
96
- var _super = _createSuper(FiltersContainer);
97
-
98
- function FiltersContainer(props) {
99
- var _this;
100
-
101
- _classCallCheck(this, FiltersContainer);
102
-
103
- _this = _super.call(this, props);
104
-
105
- _defineProperty(_assertThisInitialized(_this), "toggleFilter", function (key, value) {
106
- return _this.setState(function (_ref4) {
107
- var values = _ref4.values,
108
- state = _objectWithoutProperties(_ref4, _excluded);
109
-
110
- var newState = _objectSpread(_objectSpread({}, state), {}, {
111
- values: _objectSpread(_objectSpread({}, values), {}, _defineProperty({}, key, value))
112
- });
113
-
114
- var onChange = _this.props.onChange;
115
-
116
- if (onChange) {
117
- onChange(newState.values);
118
- }
119
-
120
- return newState;
121
- });
122
- });
123
-
124
- _defineProperty(_assertThisInitialized(_this), "toggleFilters", function (newFilters) {
125
- return _this.setState(function (prevState) {
126
- var newState = _objectSpread(_objectSpread({}, prevState), {}, {
127
- values: _objectSpread(_objectSpread({}, prevState.values), newFilters)
128
- });
129
-
130
- var onChange = _this.props.onChange;
131
-
132
- if (onChange) {
133
- onChange(newState.values);
134
- }
135
-
136
- return newState;
137
- });
138
- });
139
-
140
- var filters = _this.props.filters;
141
- _this.state = {
142
- values: getInitialValues('', filters)
143
- };
144
- return _this;
145
- }
146
-
147
- _createClass(FiltersContainer, [{
148
- key: "render",
149
- value: function render() {
150
- return /*#__PURE__*/_react["default"].createElement(BaseComponent, _extends({}, this.props, this.state, {
151
- toggleFilter: this.toggleFilter,
152
- toggleFilters: this.toggleFilters
153
- }));
154
- }
155
- }], [{
156
- key: "getDerivedStateFromProps",
157
- value: function getDerivedStateFromProps(_ref5, state) {
158
- var filters = _ref5.filters;
159
-
160
- if ((0, _isEqual2["default"])(filters, state.values)) {
161
- return null;
162
- }
163
-
164
- return {
165
- values: getInitialValues('', filters)
166
- };
167
- }
168
- }]);
169
-
170
- return FiltersContainer;
171
- }(_react["default"].Component);
172
-
173
- FiltersContainer.defaultProps = {
174
- onChange: null
175
- };
176
- FiltersContainer.propTypes = {
177
- /** Filter config */
178
- filters: _propTypes["default"].object.isRequired,
179
- // eslint-disable-line react/forbid-prop-types
180
-
181
- /** OnChange handler */
182
- onChange: _propTypes["default"].func
183
- };
184
- return FiltersContainer;
185
- };
186
-
187
- exports.filtersDropdownContainer = filtersDropdownContainer;
@@ -1,111 +0,0 @@
1
- import _isEqual from "lodash/isEqual";
2
-
3
- function _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
4
-
5
- import React from 'react';
6
- import PropTypes from 'prop-types';
7
-
8
- const getInitialValues = (key, filters) => {
9
- if (typeof (filters == null ? void 0 : filters.defaultValue) !== 'undefined') {
10
- return {
11
- [key]: filters.defaultValue
12
- };
13
- }
14
-
15
- if (typeof filters === 'object') {
16
- return Object.entries(filters).map(_ref => {
17
- let [groupKey, groupFilters] = _ref;
18
- return getInitialValues([...(key ? [key] : []), groupKey].join('.'), groupFilters);
19
- }).reduce((agg, current) => ({ ...agg,
20
- ...current
21
- }), {});
22
- }
23
-
24
- return {};
25
- };
26
-
27
- export const filtersDropdownContainer = BaseComponent => {
28
- class FiltersContainer extends React.Component {
29
- constructor(props) {
30
- super(props);
31
- const {
32
- filters
33
- } = this.props;
34
- this.state = {
35
- values: getInitialValues('', filters)
36
- };
37
- }
38
-
39
- static getDerivedStateFromProps(_ref2, state) {
40
- let {
41
- filters
42
- } = _ref2;
43
-
44
- if (_isEqual(filters, state.values)) {
45
- return null;
46
- }
47
-
48
- return {
49
- values: getInitialValues('', filters)
50
- };
51
- }
52
-
53
- toggleFilter = (key, value) => this.setState(_ref3 => {
54
- let {
55
- values,
56
- ...state
57
- } = _ref3;
58
- const newState = { ...state,
59
- values: { ...values,
60
- [key]: value
61
- }
62
- };
63
- const {
64
- onChange
65
- } = this.props;
66
-
67
- if (onChange) {
68
- onChange(newState.values);
69
- }
70
-
71
- return newState;
72
- });
73
- toggleFilters = newFilters => this.setState(prevState => {
74
- const newState = { ...prevState,
75
- values: { ...prevState.values,
76
- ...newFilters
77
- }
78
- };
79
- const {
80
- onChange
81
- } = this.props;
82
-
83
- if (onChange) {
84
- onChange(newState.values);
85
- }
86
-
87
- return newState;
88
- });
89
-
90
- render() {
91
- return /*#__PURE__*/React.createElement(BaseComponent, _extends({}, this.props, this.state, {
92
- toggleFilter: this.toggleFilter,
93
- toggleFilters: this.toggleFilters
94
- }));
95
- }
96
-
97
- }
98
-
99
- FiltersContainer.defaultProps = {
100
- onChange: null
101
- };
102
- FiltersContainer.propTypes = {
103
- /** Filter config */
104
- filters: PropTypes.object.isRequired,
105
- // eslint-disable-line react/forbid-prop-types
106
-
107
- /** OnChange handler */
108
- onChange: PropTypes.func
109
- };
110
- return FiltersContainer;
111
- };