@bundle-stats/ui 4.0.0-rc.6 → 4.0.1

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 (35) hide show
  1. package/lib/components/bundle-assets/bundle-assets.js +64 -49
  2. package/lib/components/bundle-assets/bundle-assets.utils.js +1 -1
  3. package/lib/components/bundle-modules/bundle-modules.js +94 -79
  4. package/lib/components/bundle-packages/bundle-packages.js +60 -45
  5. package/lib/components/metrics-table-title/metrics-table-title.js +10 -7
  6. package/lib/components/metrics-table-title/metrics-table-title.module.css +9 -3
  7. package/lib/ui/filters/filters.js +5 -7
  8. package/lib/ui/filters/filters.utils.js +40 -2
  9. package/lib/ui/filters/index.js +96 -3
  10. package/lib/ui/index.js +8 -0
  11. package/lib-esm/components/bundle-assets/bundle-assets.js +63 -50
  12. package/lib-esm/components/bundle-assets/bundle-assets.utils.js +1 -1
  13. package/lib-esm/components/bundle-modules/bundle-modules.js +78 -64
  14. package/lib-esm/components/bundle-packages/bundle-packages.js +44 -31
  15. package/lib-esm/components/metrics-table-title/metrics-table-title.js +10 -7
  16. package/lib-esm/components/metrics-table-title/metrics-table-title.module.css +9 -3
  17. package/lib-esm/ui/filters/filters.js +3 -4
  18. package/lib-esm/ui/filters/filters.utils.js +18 -0
  19. package/lib-esm/ui/filters/index.js +65 -3
  20. package/lib-esm/ui/index.js +1 -0
  21. package/package.json +8 -8
  22. package/src/components/bundle-assets/bundle-assets.jsx +54 -45
  23. package/src/components/bundle-assets/bundle-assets.utils.js +1 -1
  24. package/src/components/bundle-modules/bundle-modules.jsx +72 -65
  25. package/src/components/bundle-packages/bundle-packages.jsx +36 -26
  26. package/src/components/metrics-table-title/metrics-table-title.jsx +20 -18
  27. package/src/components/metrics-table-title/metrics-table-title.module.css +9 -3
  28. package/src/ui/filters/filters.jsx +4 -4
  29. package/src/ui/filters/filters.utils.js +21 -0
  30. package/src/ui/filters/index.jsx +72 -0
  31. package/src/ui/index.js +1 -0
  32. package/lib/ui/filters/filters.container.js +0 -187
  33. package/lib-esm/ui/filters/filters.container.js +0 -111
  34. package/src/ui/filters/filters.container.jsx +0 -108
  35. package/src/ui/filters/index.js +0 -4
@@ -29,6 +29,61 @@ import { MetricsTableTitle } from '../metrics-table-title';
29
29
  import { ModuleInfo } from '../module-info';
30
30
  import css from './bundle-modules.module.css';
31
31
 
32
+ const getFilters = ({ filters, compareMode, chunks }) => ({
33
+ [MODULE_FILTERS.CHANGED]: {
34
+ label: 'Changed',
35
+ defaultValue: filters.changed,
36
+ disabled: !compareMode,
37
+ },
38
+ [MODULE_FILTERS.DUPLICATED]: {
39
+ label: 'Duplicate',
40
+ defaultValue: filters[MODULE_FILTERS.DUPLICATED],
41
+ },
42
+ [MODULE_SOURCE_TYPE]: {
43
+ label: 'Source',
44
+ [MODULE_FILTERS.FIRST_PARTY]: {
45
+ label: 'First party',
46
+ defaultValue: get(filters, `${MODULE_SOURCE_TYPE}.${MODULE_FILTERS.FIRST_PARTY}`, true),
47
+ },
48
+ [MODULE_FILTERS.THIRD_PARTY]: {
49
+ label: 'Third party',
50
+ defaultValue: get(filters, `${MODULE_SOURCE_TYPE}.${MODULE_FILTERS.THIRD_PARTY}`, true),
51
+ },
52
+ },
53
+
54
+ // When chunks data available, list available chunks as filters
55
+ ...(!isEmpty(chunks) && {
56
+ [MODULE_CHUNK]: {
57
+ label: 'Chunk',
58
+ ...chunks.reduce(
59
+ (chunkFilters, { id, name }) => ({
60
+ ...chunkFilters,
61
+ [id]: {
62
+ label: name,
63
+ defaultValue: get(filters, `${MODULE_CHUNK}.${id}`, true),
64
+ },
65
+ }),
66
+ {},
67
+ ),
68
+ },
69
+ }),
70
+
71
+ // Module source types
72
+ [MODULE_FILE_TYPE]: {
73
+ label: 'File type',
74
+ ...MODULE_SOURCE_FILE_TYPES.reduce(
75
+ (agg, fileType) => ({
76
+ ...agg,
77
+ [fileType]: {
78
+ label: FILE_TYPE_LABELS[fileType],
79
+ defaultValue: get(filters, `${MODULE_FILE_TYPE}.${fileType}`, true),
80
+ },
81
+ }),
82
+ {},
83
+ ),
84
+ },
85
+ })
86
+
32
87
  const RowHeader = ({ row, chunks, labels, CustomComponentLink }) => {
33
88
  const chunkIds = map(chunks, 'id');
34
89
 
@@ -103,6 +158,20 @@ export const BundleModules = ({
103
158
  }) => {
104
159
  const rootClassName = cx(css.root, className);
105
160
 
161
+ const dropdownFilters = useMemo(
162
+ () => getFilters({ filters, chunks, compareMode: jobs.length > 1 }),
163
+ [jobs, filters, chunks]
164
+ );
165
+
166
+ const metricsTableTitle = useMemo(() => (
167
+ <MetricsTableTitle
168
+ title={I18N.MODULES}
169
+ info={`${items.length}/${totalRowCount}`}
170
+ popoverInfo={I18N.MODULES_INFO}
171
+ popoverHref={config.documentation.modules}
172
+ />
173
+ ), [items, totalRowCount]);
174
+
106
175
  const renderRowHeader = useCallback(
107
176
  (row) => (
108
177
  <RowHeader
@@ -115,69 +184,14 @@ export const BundleModules = ({
115
184
  [jobs, chunks, CustomComponentLink],
116
185
  );
117
186
 
118
- const emptyMessage = (
187
+ const emptyMessage = useMemo(() => (
119
188
  <EmptySet
120
189
  resources="modules"
121
190
  filtered={totalRowCount !== 0}
122
191
  handleResetFilters={resetFilters}
123
192
  handleViewAll={resetAllFilters}
124
193
  />
125
- );
126
-
127
- const dropdownFilters = {
128
- [MODULE_FILTERS.CHANGED]: {
129
- label: 'Changed',
130
- defaultValue: filters.changed,
131
- disabled: jobs.length <= 1,
132
- },
133
- [MODULE_FILTERS.DUPLICATED]: {
134
- label: 'Duplicate',
135
- defaultValue: filters[MODULE_FILTERS.DUPLICATED],
136
- },
137
- [MODULE_SOURCE_TYPE]: {
138
- label: 'Source',
139
- [MODULE_FILTERS.FIRST_PARTY]: {
140
- label: 'First party',
141
- defaultValue: get(filters, `${MODULE_SOURCE_TYPE}.${MODULE_FILTERS.FIRST_PARTY}`, true),
142
- },
143
- [MODULE_FILTERS.THIRD_PARTY]: {
144
- label: 'Third party',
145
- defaultValue: get(filters, `${MODULE_SOURCE_TYPE}.${MODULE_FILTERS.THIRD_PARTY}`, true),
146
- },
147
- },
148
-
149
- // When chunks data available, list available chunks as filters
150
- ...(!isEmpty(chunks) && {
151
- [MODULE_CHUNK]: {
152
- label: 'Chunk',
153
- ...chunks.reduce(
154
- (chunkFilters, { id, name }) => ({
155
- ...chunkFilters,
156
- [id]: {
157
- label: name,
158
- defaultValue: get(filters, `${MODULE_CHUNK}.${id}`, true),
159
- },
160
- }),
161
- {},
162
- ),
163
- },
164
- }),
165
-
166
- // Module source types
167
- [MODULE_FILE_TYPE]: {
168
- label: 'File type',
169
- ...MODULE_SOURCE_FILE_TYPES.reduce(
170
- (agg, fileType) => ({
171
- ...agg,
172
- [fileType]: {
173
- label: FILE_TYPE_LABELS[fileType],
174
- defaultValue: get(filters, `${MODULE_FILE_TYPE}.${fileType}`, true),
175
- },
176
- }),
177
- {},
178
- ),
179
- },
180
- };
194
+ ), [totalRowCount, resetFilters, resetAllFilters]);
181
195
 
182
196
  return (
183
197
  <div className={rootClassName}>
@@ -221,14 +235,7 @@ export const BundleModules = ({
221
235
  renderRowHeader={renderRowHeader}
222
236
  emptyMessage={emptyMessage}
223
237
  showHeaderSum
224
- title={
225
- <MetricsTableTitle
226
- title={I18N.MODULES}
227
- info={`(${items.length}/${totalRowCount})`}
228
- popoverInfo={I18N.MODULES_INFO}
229
- popoverHref={config.documentation.modules}
230
- />
231
- }
238
+ title={metricsTableTitle}
232
239
  />
233
240
  </div>
234
241
  );
@@ -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
+ };
package/src/ui/index.js CHANGED
@@ -5,6 +5,7 @@ export { EmptySet } from './empty-set';
5
5
  export { FileName } from './file-name';
6
6
  export { Filters } from './filters';
7
7
  export { HorizontalBarChart } from './horizontal-bar-chart';
8
+ export { HoverCard } from './hover-card';
8
9
  export { Icon } from './icon';
9
10
  export { Input } from './input';
10
11
  export { Loader } from './loader';
@@ -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;