@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
@@ -7,8 +7,6 @@ Object.defineProperty(exports, "__esModule", {
7
7
  });
8
8
  exports.Filters = void 0;
9
9
 
10
- var _get2 = _interopRequireDefault(require("lodash/get"));
11
-
12
10
  var _react = _interopRequireWildcard(require("react"));
13
11
 
14
12
  var _propTypes = _interopRequireDefault(require("prop-types"));
@@ -26,12 +24,12 @@ var _filtersModule = _interopRequireDefault(require("./filters.module.css"));
26
24
  var _excluded = ["className", "buttonClassName", "label", "name", "getOnOnlyClick"],
27
25
  _excluded2 = ["label"];
28
26
 
27
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
28
+
29
29
  function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
30
30
 
31
31
  function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
32
32
 
33
- function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
34
-
35
33
  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; }
36
34
 
37
35
  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; }
@@ -120,11 +118,11 @@ var FilterGroup = function FilterGroup(props) {
120
118
 
121
119
  return typeof (item === null || item === void 0 ? void 0 : item.defaultValue) !== 'undefined';
122
120
  });
123
- var isGroupChecked = groupCheckboxes.map(function (_ref3) {
121
+ var areAllGroupItemsChecked = groupCheckboxes.map(function (_ref3) {
124
122
  var _ref4 = _slicedToArray(_ref3, 1),
125
123
  itemKey = _ref4[0];
126
124
 
127
- return (0, _get2["default"])(values, "".concat(groupKey, ".").concat(itemKey));
125
+ return values === null || values === void 0 ? void 0 : values["".concat(groupKey, ".").concat(itemKey)];
128
126
  }).reduce(function (agg, val) {
129
127
  return agg && val;
130
128
  }, true);
@@ -184,7 +182,7 @@ var FilterGroup = function FilterGroup(props) {
184
182
  }));
185
183
  })), /*#__PURE__*/_react["default"].createElement("div", {
186
184
  className: _filtersModule["default"].filterGroupActions
187
- }, isGroupChecked ? /*#__PURE__*/_react["default"].createElement(MenuItem, {
185
+ }, areAllGroupItemsChecked ? /*#__PURE__*/_react["default"].createElement(MenuItem, {
188
186
  id: "clear-all",
189
187
  as: "button",
190
188
  className: menuItemClassName,
@@ -3,7 +3,23 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.getGroupFiltersLabelSuffix = exports.LABELS = void 0;
6
+ exports.getInitialValues = exports.getGroupFiltersLabelSuffix = exports.LABELS = void 0;
7
+
8
+ 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; }
9
+
10
+ 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; }
11
+
12
+ function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); }
13
+
14
+ 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."); }
15
+
16
+ function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter); }
17
+
18
+ function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); }
19
+
20
+ 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); }
21
+
22
+ 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; }
7
23
 
8
24
  function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
9
25
 
@@ -90,4 +106,26 @@ var getGroupFiltersLabelSuffix = function getGroupFiltersLabelSuffix(filters) {
90
106
  return "".concat(suffix).concat(skippedLabels > 0 ? " +".concat(skippedLabels) : '');
91
107
  };
92
108
 
93
- exports.getGroupFiltersLabelSuffix = getGroupFiltersLabelSuffix;
109
+ exports.getGroupFiltersLabelSuffix = getGroupFiltersLabelSuffix;
110
+
111
+ var getInitialValues = function getInitialValues(key, filters) {
112
+ if (typeof (filters === null || filters === void 0 ? void 0 : filters.defaultValue) !== 'undefined') {
113
+ return _defineProperty({}, key, filters.defaultValue);
114
+ }
115
+
116
+ if (_typeof(filters) === 'object') {
117
+ return Object.entries(filters).map(function (_ref6) {
118
+ var _ref7 = _slicedToArray(_ref6, 2),
119
+ groupKey = _ref7[0],
120
+ groupFilters = _ref7[1];
121
+
122
+ return getInitialValues([].concat(_toConsumableArray(key ? [key] : []), [groupKey]).join('.'), groupFilters);
123
+ }).reduce(function (agg, current) {
124
+ return _objectSpread(_objectSpread({}, agg), current);
125
+ }, {});
126
+ }
127
+
128
+ return {};
129
+ };
130
+
131
+ exports.getInitialValues = getInitialValues;
@@ -1,13 +1,106 @@
1
1
  "use strict";
2
2
 
3
+ 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); }
4
+
3
5
  Object.defineProperty(exports, "__esModule", {
4
6
  value: true
5
7
  });
6
8
  exports.Filters = void 0;
7
9
 
8
- var _filters = require("./filters.container");
10
+ var _merge3 = _interopRequireDefault(require("lodash/merge"));
11
+
12
+ var _isEqual2 = _interopRequireDefault(require("lodash/isEqual"));
13
+
14
+ var _react = _interopRequireWildcard(require("react"));
15
+
16
+ var _propTypes = _interopRequireDefault(require("prop-types"));
17
+
18
+ var _filters = require("./filters.utils");
9
19
 
10
20
  var _filters2 = require("./filters");
11
21
 
12
- var Filters = (0, _filters.filtersDropdownContainer)(_filters2.Filters);
13
- exports.Filters = Filters;
22
+ var _excluded = ["onChange", "filters"];
23
+
24
+ function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
25
+
26
+ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
27
+
28
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
29
+
30
+ 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); }
31
+
32
+ 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; }
33
+
34
+ function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
35
+
36
+ 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."); }
37
+
38
+ 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); }
39
+
40
+ 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; }
41
+
42
+ 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; }
43
+
44
+ function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
45
+
46
+ 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; }
47
+
48
+ 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; }
49
+
50
+ var Filters = function Filters(props) {
51
+ var onChange = props.onChange,
52
+ filters = props.filters,
53
+ restProps = _objectWithoutProperties(props, _excluded);
54
+
55
+ var _useState = (0, _react.useState)((0, _filters.getInitialValues)('', filters)),
56
+ _useState2 = _slicedToArray(_useState, 2),
57
+ values = _useState2[0],
58
+ setValues = _useState2[1]; // Update values when the parent filters are changing (route with query string change)
59
+
60
+
61
+ (0, _react.useEffect)(function () {
62
+ var parentValues = (0, _filters.getInitialValues)('', filters);
63
+
64
+ if ((0, _isEqual2["default"])(parentValues, values)) {
65
+ return;
66
+ }
67
+
68
+ setValues(parentValues);
69
+ }, // Do not trigger effect when the values are changing locally
70
+ [filters, setValues]);
71
+ var toggleFilter = (0, _react.useCallback)(function (key, value) {
72
+ var nextValues = (0, _merge3["default"])({}, values, _defineProperty({}, key, value));
73
+ setValues(nextValues);
74
+
75
+ if (onChange) {
76
+ onChange(nextValues);
77
+ }
78
+ }, [onChange, setValues, values]);
79
+ var toggleFilters = (0, _react.useCallback)(function (newFilters) {
80
+ var nextValues = (0, _merge3["default"])({}, values, newFilters);
81
+ setValues(nextValues);
82
+
83
+ if (onChange) {
84
+ onChange(nextValues);
85
+ }
86
+ }, [onChange, setValues, values]);
87
+ return /*#__PURE__*/_react["default"].createElement(_filters2.Filters, _extends({}, restProps, {
88
+ filters: filters,
89
+ values: values,
90
+ toggleFilter: toggleFilter,
91
+ toggleFilters: toggleFilters
92
+ }));
93
+ };
94
+
95
+ exports.Filters = Filters;
96
+ Filters.defaultProps = {
97
+ onChange: null
98
+ };
99
+ Filters.propTypes = {
100
+ /** Filter config */
101
+ filters: _propTypes["default"].object.isRequired,
102
+ // eslint-disable-line react/forbid-prop-types
103
+
104
+ /** OnChange handler */
105
+ onChange: _propTypes["default"].func
106
+ };
package/lib/ui/index.js CHANGED
@@ -45,6 +45,12 @@ Object.defineProperty(exports, "HorizontalBarChart", {
45
45
  return _horizontalBarChart.HorizontalBarChart;
46
46
  }
47
47
  });
48
+ Object.defineProperty(exports, "HoverCard", {
49
+ enumerable: true,
50
+ get: function get() {
51
+ return _hoverCard.HoverCard;
52
+ }
53
+ });
48
54
  Object.defineProperty(exports, "Icon", {
49
55
  enumerable: true,
50
56
  get: function get() {
@@ -126,6 +132,8 @@ var _filters = require("./filters");
126
132
 
127
133
  var _horizontalBarChart = require("./horizontal-bar-chart");
128
134
 
135
+ var _hoverCard = require("./hover-card");
136
+
129
137
  var _icon = require("./icon");
130
138
 
131
139
  var _input = require("./input");
@@ -42,21 +42,58 @@ const getFileTypeFilters = filters => Object.entries(FILE_TYPE_LABELS).map(_ref
42
42
  ...current
43
43
  }), {});
44
44
 
45
- const TooltipNotPredictive = _ref2 => {
45
+ const getFilters = _ref2 => {
46
46
  let {
47
- runs
47
+ compareMode,
48
+ filters
48
49
  } = _ref2;
50
+ return {
51
+ [ASSET_FILTERS.CHANGED]: {
52
+ label: 'Changed',
53
+ defaultValue: filters[ASSET_FILTERS.CHANGED],
54
+ disabled: !compareMode
55
+ },
56
+ [ASSET_ENTRY_TYPE]: {
57
+ label: 'Entry type',
58
+ [ASSET_FILTERS.ENTRY]: {
59
+ label: 'Entry',
60
+ defaultValue: _get(filters, `${ASSET_ENTRY_TYPE}.${ASSET_FILTERS.ENTRY}`, true)
61
+ },
62
+ [ASSET_FILTERS.INITIAL]: {
63
+ label: 'Initial',
64
+ defaultValue: _get(filters, `${ASSET_ENTRY_TYPE}.${ASSET_FILTERS.INITIAL}`, true)
65
+ },
66
+ [ASSET_FILTERS.CHUNK]: {
67
+ label: 'Chunk',
68
+ defaultValue: _get(filters, `${ASSET_ENTRY_TYPE}.${ASSET_FILTERS.CHUNK}`, true)
69
+ },
70
+ [ASSET_FILTERS.OTHER]: {
71
+ label: 'Other',
72
+ defaultValue: _get(filters, `${ASSET_ENTRY_TYPE}.${ASSET_FILTERS.OTHER}`, true)
73
+ }
74
+ },
75
+ [ASSET_FILE_TYPE]: {
76
+ label: 'File type',
77
+ ...getFileTypeFilters(filters)
78
+ }
79
+ };
80
+ };
81
+
82
+ const TooltipNotPredictive = _ref3 => {
83
+ let {
84
+ runs
85
+ } = _ref3;
49
86
  return /*#__PURE__*/React.createElement("div", {
50
87
  className: css.tooltipNotPredictive
51
88
  }, /*#__PURE__*/React.createElement("p", {
52
89
  className: css.tooltipNotPredictiveText
53
90
  }, "File name is the same, but the size has changed:"), /*#__PURE__*/React.createElement("table", {
54
91
  className: css.tooltipTable
55
- }, /*#__PURE__*/React.createElement("tr", null, runs.map((_ref3, index) => {
92
+ }, /*#__PURE__*/React.createElement("tr", null, runs.map((_ref4, index) => {
56
93
  let {
57
94
  name,
58
95
  value
59
- } = _ref3;
96
+ } = _ref4;
60
97
  const key = index;
61
98
  return /*#__PURE__*/React.createElement("tr", {
62
99
  key: key
@@ -72,13 +109,13 @@ TooltipNotPredictive.propTypes = {
72
109
 
73
110
  };
74
111
 
75
- const RowHeader = _ref4 => {
112
+ const RowHeader = _ref5 => {
76
113
  let {
77
114
  row,
78
115
  labels,
79
116
  chunks,
80
117
  CustomComponentLink
81
- } = _ref4;
118
+ } = _ref5;
82
119
  const {
83
120
  label,
84
121
  isNotPredictive,
@@ -176,12 +213,16 @@ export const BundleAssets = props => {
176
213
  updateSearch,
177
214
  customComponentLink: CustomComponentLink
178
215
  } = props;
179
- const emptyMessage = /*#__PURE__*/React.createElement(EmptySet, {
180
- resources: "assets",
181
- filtered: totalRowCount !== 0,
182
- handleResetFilters: resetFilters,
183
- handleViewAll: resetAllFilters
184
- });
216
+ const dropdownFilters = useMemo(() => getFilters({
217
+ compareMode: (jobs == null ? void 0 : jobs.length) > 1,
218
+ filters
219
+ }), [jobs, filters]);
220
+ const metricsTableTitle = useMemo(() => /*#__PURE__*/React.createElement(MetricsTableTitle, {
221
+ title: I18N.ASSETS,
222
+ info: `${items.length}/${totalRowCount}`,
223
+ popoverInfo: I18N.ASSETS_INFO,
224
+ popoverHref: config.documentation.assets
225
+ }), [items, totalRowCount]);
185
226
  const renderRowHeader = useCallback(row => {
186
227
  var _jobs$, _jobs$$meta, _jobs$$meta$webpack;
187
228
 
@@ -192,14 +233,20 @@ export const BundleAssets = props => {
192
233
  CustomComponentLink: CustomComponentLink
193
234
  });
194
235
  }, [jobs, CustomComponentLink]);
236
+ const emptyMessage = useMemo(() => /*#__PURE__*/React.createElement(EmptySet, {
237
+ resources: "assets",
238
+ filtered: totalRowCount !== 0,
239
+ handleResetFilters: resetFilters,
240
+ handleViewAll: resetAllFilters
241
+ }), [totalRowCount, resetFilters, resetAllFilters]);
195
242
  return /*#__PURE__*/React.createElement("section", {
196
243
  className: cx(css.root, className)
197
244
  }, /*#__PURE__*/React.createElement(Toolbar, {
198
245
  className: css.toolbar,
199
- renderActions: _ref5 => {
246
+ renderActions: _ref6 => {
200
247
  let {
201
248
  actionClassName
202
- } = _ref5;
249
+ } = _ref6;
203
250
  return /*#__PURE__*/React.createElement(FlexStack, {
204
251
  space: "xxsmall",
205
252
  className: cx(css.dropdown, actionClassName)
@@ -221,36 +268,7 @@ export const BundleAssets = props => {
221
268
  updateSearch: updateSearch
222
269
  }), /*#__PURE__*/React.createElement(Filters, {
223
270
  className: css.toolbarFilters,
224
- filters: {
225
- [ASSET_FILTERS.CHANGED]: {
226
- label: 'Changed',
227
- defaultValue: filters[ASSET_FILTERS.CHANGED],
228
- disabled: jobs.length <= 1
229
- },
230
- [ASSET_ENTRY_TYPE]: {
231
- label: 'Entry type',
232
- [ASSET_FILTERS.ENTRY]: {
233
- label: 'Entry',
234
- defaultValue: _get(filters, `${ASSET_ENTRY_TYPE}.${ASSET_FILTERS.ENTRY}`, true)
235
- },
236
- [ASSET_FILTERS.INITIAL]: {
237
- label: 'Initial',
238
- defaultValue: _get(filters, `${ASSET_ENTRY_TYPE}.${ASSET_FILTERS.INITIAL}`, true)
239
- },
240
- [ASSET_FILTERS.CHUNK]: {
241
- label: 'Chunk',
242
- defaultValue: _get(filters, `${ASSET_ENTRY_TYPE}.${ASSET_FILTERS.CHUNK}`, true)
243
- },
244
- [ASSET_FILTERS.ASSET]: {
245
- label: 'Asset',
246
- defaultValue: _get(filters, `${ASSET_ENTRY_TYPE}.${ASSET_FILTERS.ASSET}`, true)
247
- }
248
- },
249
- [ASSET_FILE_TYPE]: {
250
- label: 'File type',
251
- ...getFileTypeFilters(filters)
252
- }
253
- },
271
+ filters: dropdownFilters,
254
272
  hasActiveFilters: hasActiveFilters,
255
273
  onChange: updateFilters
256
274
  }))), /*#__PURE__*/React.createElement("main", null, /*#__PURE__*/React.createElement(MetricsTable, {
@@ -259,12 +277,7 @@ export const BundleAssets = props => {
259
277
  renderRowHeader: renderRowHeader,
260
278
  emptyMessage: emptyMessage,
261
279
  showHeaderSum: true,
262
- title: /*#__PURE__*/React.createElement(MetricsTableTitle, {
263
- title: I18N.ASSETS,
264
- info: `(${items.length}/${totalRowCount})`,
265
- popoverInfo: I18N.ASSETS_INFO,
266
- popoverHref: config.documentation.assets
267
- })
280
+ title: metricsTableTitle
268
281
  })));
269
282
  };
270
283
  BundleAssets.defaultProps = {
@@ -40,7 +40,7 @@ export const getRowFilter = filters => item => {
40
40
  return false;
41
41
  }
42
42
 
43
- if (!(filters[`${ASSET_ENTRY_TYPE}.${ASSET_FILTERS.ENTRY}`] && item.isEntry || filters[`${ASSET_ENTRY_TYPE}.${ASSET_FILTERS.INITIAL}`] && item.isInitial || filters[`${ASSET_ENTRY_TYPE}.${ASSET_FILTERS.CHUNK}`] && item.isChunk || filters[`${ASSET_ENTRY_TYPE}.${ASSET_FILTERS.ASSET}`] && item.isAsset)) {
43
+ if (!(filters[`${ASSET_ENTRY_TYPE}.${ASSET_FILTERS.ENTRY}`] && item.isEntry || filters[`${ASSET_ENTRY_TYPE}.${ASSET_FILTERS.INITIAL}`] && item.isInitial || filters[`${ASSET_ENTRY_TYPE}.${ASSET_FILTERS.CHUNK}`] && item.isChunk || filters[`${ASSET_ENTRY_TYPE}.${ASSET_FILTERS.OTHER}`] && item.isAsset)) {
44
44
  return false;
45
45
  }
46
46
 
@@ -26,13 +26,71 @@ import { MetricsTableTitle } from '../metrics-table-title';
26
26
  import { ModuleInfo } from '../module-info';
27
27
  import css from './bundle-modules.module.css';
28
28
 
29
- const RowHeader = _ref => {
29
+ const getFilters = _ref => {
30
+ let {
31
+ filters,
32
+ compareMode,
33
+ chunks
34
+ } = _ref;
35
+ return {
36
+ [MODULE_FILTERS.CHANGED]: {
37
+ label: 'Changed',
38
+ defaultValue: filters.changed,
39
+ disabled: !compareMode
40
+ },
41
+ [MODULE_FILTERS.DUPLICATED]: {
42
+ label: 'Duplicate',
43
+ defaultValue: filters[MODULE_FILTERS.DUPLICATED]
44
+ },
45
+ [MODULE_SOURCE_TYPE]: {
46
+ label: 'Source',
47
+ [MODULE_FILTERS.FIRST_PARTY]: {
48
+ label: 'First party',
49
+ defaultValue: _get(filters, `${MODULE_SOURCE_TYPE}.${MODULE_FILTERS.FIRST_PARTY}`, true)
50
+ },
51
+ [MODULE_FILTERS.THIRD_PARTY]: {
52
+ label: 'Third party',
53
+ defaultValue: _get(filters, `${MODULE_SOURCE_TYPE}.${MODULE_FILTERS.THIRD_PARTY}`, true)
54
+ }
55
+ },
56
+ // When chunks data available, list available chunks as filters
57
+ ...(!_isEmpty(chunks) && {
58
+ [MODULE_CHUNK]: {
59
+ label: 'Chunk',
60
+ ...chunks.reduce((chunkFilters, _ref2) => {
61
+ let {
62
+ id,
63
+ name
64
+ } = _ref2;
65
+ return { ...chunkFilters,
66
+ [id]: {
67
+ label: name,
68
+ defaultValue: _get(filters, `${MODULE_CHUNK}.${id}`, true)
69
+ }
70
+ };
71
+ }, {})
72
+ }
73
+ }),
74
+ // Module source types
75
+ [MODULE_FILE_TYPE]: {
76
+ label: 'File type',
77
+ ...MODULE_SOURCE_FILE_TYPES.reduce((agg, fileType) => ({ ...agg,
78
+ [fileType]: {
79
+ label: FILE_TYPE_LABELS[fileType],
80
+ defaultValue: _get(filters, `${MODULE_FILE_TYPE}.${fileType}`, true)
81
+ }
82
+ }), {})
83
+ }
84
+ };
85
+ };
86
+
87
+ const RowHeader = _ref3 => {
30
88
  let {
31
89
  row,
32
90
  chunks,
33
91
  labels,
34
92
  CustomComponentLink
35
- } = _ref;
93
+ } = _ref3;
36
94
 
37
95
  const chunkIds = _map(chunks, 'id');
38
96
 
@@ -82,7 +140,7 @@ RowHeader.propTypes = {
82
140
  RowHeader.defaultProps = {
83
141
  chunks: []
84
142
  };
85
- export const BundleModules = _ref2 => {
143
+ export const BundleModules = _ref4 => {
86
144
  let {
87
145
  className,
88
146
  jobs,
@@ -100,78 +158,39 @@ export const BundleModules = _ref2 => {
100
158
  updateSearch,
101
159
  hasActiveFilters,
102
160
  customComponentLink: CustomComponentLink
103
- } = _ref2;
161
+ } = _ref4;
104
162
  const rootClassName = cx(css.root, className);
163
+ const dropdownFilters = useMemo(() => getFilters({
164
+ filters,
165
+ chunks,
166
+ compareMode: jobs.length > 1
167
+ }), [jobs, filters, chunks]);
168
+ const metricsTableTitle = useMemo(() => /*#__PURE__*/React.createElement(MetricsTableTitle, {
169
+ title: I18N.MODULES,
170
+ info: `${items.length}/${totalRowCount}`,
171
+ popoverInfo: I18N.MODULES_INFO,
172
+ popoverHref: config.documentation.modules
173
+ }), [items, totalRowCount]);
105
174
  const renderRowHeader = useCallback(row => /*#__PURE__*/React.createElement(RowHeader, {
106
175
  row: row,
107
176
  chunks: chunks,
108
177
  labels: _map(jobs, 'label'),
109
178
  CustomComponentLink: CustomComponentLink
110
179
  }), [jobs, chunks, CustomComponentLink]);
111
- const emptyMessage = /*#__PURE__*/React.createElement(EmptySet, {
180
+ const emptyMessage = useMemo(() => /*#__PURE__*/React.createElement(EmptySet, {
112
181
  resources: "modules",
113
182
  filtered: totalRowCount !== 0,
114
183
  handleResetFilters: resetFilters,
115
184
  handleViewAll: resetAllFilters
116
- });
117
- const dropdownFilters = {
118
- [MODULE_FILTERS.CHANGED]: {
119
- label: 'Changed',
120
- defaultValue: filters.changed,
121
- disabled: jobs.length <= 1
122
- },
123
- [MODULE_FILTERS.DUPLICATED]: {
124
- label: 'Duplicate',
125
- defaultValue: filters[MODULE_FILTERS.DUPLICATED]
126
- },
127
- [MODULE_SOURCE_TYPE]: {
128
- label: 'Source',
129
- [MODULE_FILTERS.FIRST_PARTY]: {
130
- label: 'First party',
131
- defaultValue: _get(filters, `${MODULE_SOURCE_TYPE}.${MODULE_FILTERS.FIRST_PARTY}`, true)
132
- },
133
- [MODULE_FILTERS.THIRD_PARTY]: {
134
- label: 'Third party',
135
- defaultValue: _get(filters, `${MODULE_SOURCE_TYPE}.${MODULE_FILTERS.THIRD_PARTY}`, true)
136
- }
137
- },
138
- // When chunks data available, list available chunks as filters
139
- ...(!_isEmpty(chunks) && {
140
- [MODULE_CHUNK]: {
141
- label: 'Chunk',
142
- ...chunks.reduce((chunkFilters, _ref3) => {
143
- let {
144
- id,
145
- name
146
- } = _ref3;
147
- return { ...chunkFilters,
148
- [id]: {
149
- label: name,
150
- defaultValue: _get(filters, `${MODULE_CHUNK}.${id}`, true)
151
- }
152
- };
153
- }, {})
154
- }
155
- }),
156
- // Module source types
157
- [MODULE_FILE_TYPE]: {
158
- label: 'File type',
159
- ...MODULE_SOURCE_FILE_TYPES.reduce((agg, fileType) => ({ ...agg,
160
- [fileType]: {
161
- label: FILE_TYPE_LABELS[fileType],
162
- defaultValue: _get(filters, `${MODULE_FILE_TYPE}.${fileType}`, true)
163
- }
164
- }), {})
165
- }
166
- };
185
+ }), [totalRowCount, resetFilters, resetAllFilters]);
167
186
  return /*#__PURE__*/React.createElement("div", {
168
187
  className: rootClassName
169
188
  }, /*#__PURE__*/React.createElement(Toolbar, {
170
189
  className: css.toolbar,
171
- renderActions: _ref4 => {
190
+ renderActions: _ref5 => {
172
191
  let {
173
192
  actionClassName
174
- } = _ref4;
193
+ } = _ref5;
175
194
  return /*#__PURE__*/React.createElement(FlexStack, {
176
195
  space: "xxsmall",
177
196
  className: cx(css.dropdown, actionClassName)
@@ -203,12 +222,7 @@ export const BundleModules = _ref2 => {
203
222
  renderRowHeader: renderRowHeader,
204
223
  emptyMessage: emptyMessage,
205
224
  showHeaderSum: true,
206
- title: /*#__PURE__*/React.createElement(MetricsTableTitle, {
207
- title: I18N.MODULES,
208
- info: `(${items.length}/${totalRowCount})`,
209
- popoverInfo: I18N.MODULES_INFO,
210
- popoverHref: config.documentation.modules
211
- })
225
+ title: metricsTableTitle
212
226
  }));
213
227
  };
214
228
  BundleModules.defaultProps = {