@bundle-stats/ui 4.13.0-beta.9 → 4.13.0-rc.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 (247) hide show
  1. package/lib/app/app.js +4 -8
  2. package/lib/app/app.js.map +1 -1
  3. package/lib/app/app.module.css +2 -2
  4. package/lib/assets/icons.svg +70 -67
  5. package/lib/assets/icons.svg.js +14 -12
  6. package/lib/assets/icons.svg.js.map +1 -1
  7. package/lib/components/bundle-assets/bundle-assets.js +61 -26
  8. package/lib/components/bundle-assets/bundle-assets.js.map +1 -1
  9. package/lib/components/bundle-assets/bundle-assets.module.css +0 -5
  10. package/lib/components/bundle-assets/index.js +3 -1
  11. package/lib/components/bundle-assets/index.js.map +1 -1
  12. package/lib/components/bundle-assets-totals/bundle-assets-totals.js +14 -12
  13. package/lib/components/bundle-assets-totals/bundle-assets-totals.js.map +1 -1
  14. package/lib/components/bundle-modules/bundle-modules.i18n.js +1 -1
  15. package/lib/components/bundle-modules/bundle-modules.js +42 -15
  16. package/lib/components/bundle-modules/bundle-modules.js.map +1 -1
  17. package/lib/components/bundle-modules/bundle-modules.module.css +0 -5
  18. package/lib/components/bundle-modules/bundle-modules.utils.js +2 -13
  19. package/lib/components/bundle-modules/bundle-modules.utils.js.map +1 -1
  20. package/lib/components/bundle-modules/index.js +2 -1
  21. package/lib/components/bundle-modules/index.js.map +1 -1
  22. package/lib/components/bundle-packages/bundle-packages.js +48 -9
  23. package/lib/components/bundle-packages/bundle-packages.js.map +1 -1
  24. package/lib/components/bundle-packages/bundle-packages.module.css +0 -5
  25. package/lib/components/delta/delta.js +1 -1
  26. package/lib/components/delta/delta.js.map +1 -1
  27. package/lib/components/delta/delta.module.css +10 -1
  28. package/lib/components/jobs-header/jobs-header.module.css +0 -4
  29. package/lib/components/metrics-display-selector/metrics-display-selector.js +41 -4
  30. package/lib/components/metrics-display-selector/metrics-display-selector.js.map +1 -1
  31. package/lib/components/metrics-display-selector/metrics-display-selector.module.css +15 -7
  32. package/lib/components/metrics-treemap/index.js +4 -0
  33. package/lib/components/metrics-treemap/index.js.map +1 -1
  34. package/lib/components/metrics-treemap/metrics-treemap.constants.js +10 -0
  35. package/lib/components/metrics-treemap/metrics-treemap.constants.js.map +1 -0
  36. package/lib/components/metrics-treemap/metrics-treemap.i18n.js +6 -0
  37. package/lib/components/metrics-treemap/metrics-treemap.i18n.js.map +1 -0
  38. package/lib/components/metrics-treemap/metrics-treemap.js +131 -95
  39. package/lib/components/metrics-treemap/metrics-treemap.js.map +1 -1
  40. package/lib/components/metrics-treemap/metrics-treemap.module.css +179 -54
  41. package/lib/components/metrics-treemap/metrics-treemap.utils.js +168 -0
  42. package/lib/components/metrics-treemap/metrics-treemap.utils.js.map +1 -0
  43. package/lib/components/module-info/module-info.js +1 -2
  44. package/lib/components/module-info/module-info.js.map +1 -1
  45. package/lib/components/run-info/run-info.module.css +7 -7
  46. package/lib/css/variables.css +14 -13
  47. package/lib/hooks/metrics-display-type.js +45 -24
  48. package/lib/hooks/metrics-display-type.js.map +1 -1
  49. package/lib/hooks/search-params.js +1 -0
  50. package/lib/hooks/search-params.js.map +1 -1
  51. package/lib/layout/box/box.module.css +4 -2
  52. package/lib/layout/flex-stack/flex-stack.js +3 -4
  53. package/lib/layout/flex-stack/flex-stack.js.map +1 -1
  54. package/lib/layout/flex-stack/flex-stack.module.css +19 -23
  55. package/lib/ui/button/button.js +5 -4
  56. package/lib/ui/button/button.js.map +1 -1
  57. package/lib/ui/button/button.module.css +55 -53
  58. package/lib/ui/dropdown/dropdown.js +2 -2
  59. package/lib/ui/dropdown/dropdown.js.map +1 -1
  60. package/lib/ui/filters/filters.js +2 -2
  61. package/lib/ui/filters/filters.js.map +1 -1
  62. package/lib/ui/filters/filters.module.css +8 -1
  63. package/lib/ui/hover-card/hover-card.js +1 -1
  64. package/lib/ui/hover-card/hover-card.js.map +1 -1
  65. package/lib/ui/icon/icon.js +2 -1
  66. package/lib/ui/icon/icon.js.map +1 -1
  67. package/lib/ui/input-search/input-search.js +1 -1
  68. package/lib/ui/input-search/input-search.js.map +1 -1
  69. package/lib/ui/loader/loader.js +1 -1
  70. package/lib/ui/loader/loader.js.map +1 -1
  71. package/lib/ui/table/table.module.css +30 -0
  72. package/lib/ui/tag/tag.module.css +3 -3
  73. package/lib/ui/toolbar/toolbar.module.css +1 -3
  74. package/lib/utils/colors.js +22 -0
  75. package/lib/utils/colors.js.map +1 -0
  76. package/lib/{utils.js → utils/components.js} +2 -17
  77. package/lib/utils/components.js.map +1 -0
  78. package/lib/utils/index.js +20 -0
  79. package/lib/utils/index.js.map +1 -0
  80. package/lib/utils/jobs.js +18 -0
  81. package/lib/utils/jobs.js.map +1 -0
  82. package/lib-esm/app/app.js +4 -8
  83. package/lib-esm/app/app.js.map +1 -1
  84. package/lib-esm/app/app.module.css +2 -2
  85. package/lib-esm/assets/icons.svg +70 -67
  86. package/lib-esm/assets/icons.svg.js +14 -12
  87. package/lib-esm/assets/icons.svg.js.map +1 -1
  88. package/lib-esm/components/bundle-assets/bundle-assets.js +62 -28
  89. package/lib-esm/components/bundle-assets/bundle-assets.js.map +1 -1
  90. package/lib-esm/components/bundle-assets/bundle-assets.module.css +0 -5
  91. package/lib-esm/components/bundle-assets/index.js +3 -1
  92. package/lib-esm/components/bundle-assets/index.js.map +1 -1
  93. package/lib-esm/components/bundle-assets-totals/bundle-assets-totals.js +15 -13
  94. package/lib-esm/components/bundle-assets-totals/bundle-assets-totals.js.map +1 -1
  95. package/lib-esm/components/bundle-modules/bundle-modules.i18n.js +1 -1
  96. package/lib-esm/components/bundle-modules/bundle-modules.js +43 -16
  97. package/lib-esm/components/bundle-modules/bundle-modules.js.map +1 -1
  98. package/lib-esm/components/bundle-modules/bundle-modules.module.css +0 -5
  99. package/lib-esm/components/bundle-modules/bundle-modules.utils.js +1 -11
  100. package/lib-esm/components/bundle-modules/bundle-modules.utils.js.map +1 -1
  101. package/lib-esm/components/bundle-modules/index.js +3 -2
  102. package/lib-esm/components/bundle-modules/index.js.map +1 -1
  103. package/lib-esm/components/bundle-packages/bundle-packages.js +49 -10
  104. package/lib-esm/components/bundle-packages/bundle-packages.js.map +1 -1
  105. package/lib-esm/components/bundle-packages/bundle-packages.module.css +0 -5
  106. package/lib-esm/components/delta/delta.js +1 -1
  107. package/lib-esm/components/delta/delta.js.map +1 -1
  108. package/lib-esm/components/delta/delta.module.css +10 -1
  109. package/lib-esm/components/jobs-header/jobs-header.module.css +0 -4
  110. package/lib-esm/components/metrics-display-selector/metrics-display-selector.js +41 -4
  111. package/lib-esm/components/metrics-display-selector/metrics-display-selector.js.map +1 -1
  112. package/lib-esm/components/metrics-display-selector/metrics-display-selector.module.css +15 -7
  113. package/lib-esm/components/metrics-treemap/index.js +1 -0
  114. package/lib-esm/components/metrics-treemap/index.js.map +1 -1
  115. package/lib-esm/components/metrics-treemap/metrics-treemap.constants.js +7 -0
  116. package/lib-esm/components/metrics-treemap/metrics-treemap.constants.js.map +1 -0
  117. package/lib-esm/components/metrics-treemap/metrics-treemap.i18n.js +3 -0
  118. package/lib-esm/components/metrics-treemap/metrics-treemap.i18n.js.map +1 -0
  119. package/lib-esm/components/metrics-treemap/metrics-treemap.js +134 -98
  120. package/lib-esm/components/metrics-treemap/metrics-treemap.js.map +1 -1
  121. package/lib-esm/components/metrics-treemap/metrics-treemap.module.css +179 -54
  122. package/lib-esm/components/metrics-treemap/metrics-treemap.utils.js +162 -0
  123. package/lib-esm/components/metrics-treemap/metrics-treemap.utils.js.map +1 -0
  124. package/lib-esm/components/module-info/module-info.js +1 -2
  125. package/lib-esm/components/module-info/module-info.js.map +1 -1
  126. package/lib-esm/components/run-info/run-info.module.css +7 -7
  127. package/lib-esm/css/variables.css +14 -13
  128. package/lib-esm/hooks/metrics-display-type.js +46 -24
  129. package/lib-esm/hooks/metrics-display-type.js.map +1 -1
  130. package/lib-esm/hooks/search-params.js +1 -0
  131. package/lib-esm/hooks/search-params.js.map +1 -1
  132. package/lib-esm/layout/box/box.module.css +4 -2
  133. package/lib-esm/layout/flex-stack/flex-stack.js +3 -4
  134. package/lib-esm/layout/flex-stack/flex-stack.js.map +1 -1
  135. package/lib-esm/layout/flex-stack/flex-stack.module.css +19 -23
  136. package/lib-esm/ui/button/button.js +5 -4
  137. package/lib-esm/ui/button/button.js.map +1 -1
  138. package/lib-esm/ui/button/button.module.css +55 -53
  139. package/lib-esm/ui/dropdown/dropdown.js +2 -2
  140. package/lib-esm/ui/dropdown/dropdown.js.map +1 -1
  141. package/lib-esm/ui/filters/filters.js +2 -2
  142. package/lib-esm/ui/filters/filters.js.map +1 -1
  143. package/lib-esm/ui/filters/filters.module.css +8 -1
  144. package/lib-esm/ui/hover-card/hover-card.js +1 -1
  145. package/lib-esm/ui/hover-card/hover-card.js.map +1 -1
  146. package/lib-esm/ui/icon/icon.js +2 -1
  147. package/lib-esm/ui/icon/icon.js.map +1 -1
  148. package/lib-esm/ui/input-search/input-search.js +1 -1
  149. package/lib-esm/ui/input-search/input-search.js.map +1 -1
  150. package/lib-esm/ui/loader/loader.js +1 -1
  151. package/lib-esm/ui/loader/loader.js.map +1 -1
  152. package/lib-esm/ui/table/table.module.css +30 -0
  153. package/lib-esm/ui/tag/tag.module.css +3 -3
  154. package/lib-esm/ui/toolbar/toolbar.module.css +1 -3
  155. package/lib-esm/utils/colors.js +15 -0
  156. package/lib-esm/utils/colors.js.map +1 -0
  157. package/lib-esm/utils/components.js +16 -0
  158. package/lib-esm/utils/components.js.map +1 -0
  159. package/lib-esm/utils/index.js +4 -0
  160. package/lib-esm/utils/index.js.map +1 -0
  161. package/lib-esm/utils/jobs.js +11 -0
  162. package/lib-esm/utils/jobs.js.map +1 -0
  163. package/package.json +9 -9
  164. package/src/app/app.jsx +4 -12
  165. package/src/app/app.module.css +2 -2
  166. package/src/assets/icons/check.svg +4 -0
  167. package/src/assets/icons.svg +70 -67
  168. package/src/assets/icons.svg.jsx +12 -12
  169. package/src/components/bundle-assets/bundle-assets.jsx +147 -66
  170. package/src/components/bundle-assets/bundle-assets.module.css +0 -5
  171. package/src/components/bundle-assets/index.jsx +4 -0
  172. package/src/components/bundle-assets-totals/bundle-assets-totals.jsx +53 -46
  173. package/src/components/bundle-modules/bundle-modules.i18n.ts +1 -1
  174. package/src/components/bundle-modules/bundle-modules.module.css +0 -5
  175. package/src/components/bundle-modules/bundle-modules.tsx +140 -56
  176. package/src/components/bundle-modules/bundle-modules.types.d.ts +2 -17
  177. package/src/components/bundle-modules/bundle-modules.utils.ts +7 -18
  178. package/src/components/bundle-modules/index.tsx +4 -3
  179. package/src/components/bundle-packages/bundle-packages.jsx +89 -20
  180. package/src/components/bundle-packages/bundle-packages.module.css +0 -5
  181. package/src/components/delta/delta.jsx +1 -1
  182. package/src/components/delta/delta.module.css +10 -1
  183. package/src/components/jobs-header/jobs-header.module.css +0 -4
  184. package/src/components/metrics-display-selector/metrics-display-selector.module.css +15 -7
  185. package/src/components/metrics-display-selector/metrics-display-selector.stories.tsx +33 -0
  186. package/src/components/metrics-display-selector/metrics-display-selector.tsx +83 -25
  187. package/src/components/metrics-treemap/__tests__/metrics-treemap.utils.ts +188 -0
  188. package/src/components/metrics-treemap/index.ts +1 -0
  189. package/src/components/metrics-treemap/metrics-treemap.constants.ts +63 -0
  190. package/src/components/metrics-treemap/metrics-treemap.i18n.ts +2 -0
  191. package/src/components/metrics-treemap/metrics-treemap.module.css +179 -54
  192. package/src/components/metrics-treemap/metrics-treemap.stories.tsx +44 -10
  193. package/src/components/metrics-treemap/metrics-treemap.tsx +453 -184
  194. package/src/components/metrics-treemap/metrics-treemap.utils.ts +268 -0
  195. package/src/components/module-info/module-info.tsx +1 -1
  196. package/src/components/run-info/run-info.module.css +7 -7
  197. package/src/css/variables.css +14 -13
  198. package/src/hooks/metrics-display-type.ts +79 -29
  199. package/src/hooks/search-params.js +1 -0
  200. package/src/layout/box/box.module.css +4 -2
  201. package/src/layout/flex-stack/flex-stack.module.css +19 -23
  202. package/src/layout/flex-stack/flex-stack.tsx +2 -8
  203. package/src/ui/button/button.module.css +55 -53
  204. package/src/ui/button/button.stories.tsx +16 -9
  205. package/src/ui/button/button.tsx +8 -7
  206. package/src/ui/dropdown/dropdown.tsx +2 -3
  207. package/src/ui/filters/filters.module.css +8 -1
  208. package/src/ui/filters/filters.tsx +2 -3
  209. package/src/ui/hover-card/hover-card.tsx +1 -1
  210. package/src/ui/icon/icon.tsx +2 -1
  211. package/src/ui/input-search/input-search.tsx +1 -0
  212. package/src/ui/loader/loader.jsx +1 -1
  213. package/src/ui/table/table.module.css +30 -0
  214. package/src/ui/tag/tag.module.css +3 -3
  215. package/src/ui/toolbar/toolbar.module.css +1 -3
  216. package/src/utils/colors.ts +19 -0
  217. package/src/utils/components.tsx +19 -0
  218. package/src/utils/index.ts +3 -0
  219. package/src/utils/jobs.ts +22 -0
  220. package/types/components/bundle-assets/bundle-assets.d.ts +1 -5
  221. package/types/components/bundle-modules/bundle-modules.d.ts +4 -2
  222. package/types/components/bundle-modules/bundle-modules.i18n.d.ts +1 -1
  223. package/types/components/bundle-modules/bundle-modules.utils.d.ts +3 -7
  224. package/types/components/bundle-modules/index.d.ts +2 -2
  225. package/types/components/delta/delta.d.ts +2 -2
  226. package/types/components/metrics-display-selector/metrics-display-selector.d.ts +3 -1
  227. package/types/components/metrics-treemap/index.d.ts +1 -0
  228. package/types/components/metrics-treemap/metrics-treemap.constants.d.ts +28 -0
  229. package/types/components/metrics-treemap/metrics-treemap.d.ts +7 -5
  230. package/types/components/metrics-treemap/metrics-treemap.i18n.d.ts +2 -0
  231. package/types/components/metrics-treemap/metrics-treemap.utils.d.ts +15 -0
  232. package/types/hooks/metrics-display-type.d.ts +8 -2
  233. package/types/ui/dropdown/dropdown.d.ts +0 -1
  234. package/types/ui/icon/icon.d.ts +4 -2
  235. package/types/ui/loader/loader.d.ts +2 -2
  236. package/types/utils/colors.d.ts +1 -0
  237. package/types/utils/components.d.ts +2 -0
  238. package/types/utils/index.d.ts +3 -0
  239. package/types/utils/jobs.d.ts +7 -0
  240. package/lib/components/bundle-assets-totals/bundle-assets-totals.module.css +0 -7
  241. package/lib/utils.js.map +0 -1
  242. package/lib-esm/components/bundle-assets-totals/bundle-assets-totals.module.css +0 -7
  243. package/lib-esm/utils.js +0 -30
  244. package/lib-esm/utils.js.map +0 -1
  245. package/src/components/bundle-assets-totals/bundle-assets-totals.module.css +0 -7
  246. package/src/utils.jsx +0 -38
  247. package/types/utils.d.ts +0 -3
@@ -15,7 +15,9 @@ import config from '../../config.json';
15
15
  import I18N from '../../i18n';
16
16
  import { MetricsDisplayType } from '../../constants';
17
17
  import { useMetricsDisplayType } from '../../hooks/metrics-display-type';
18
+ import { Box } from '../../layout/box';
18
19
  import { FlexStack } from '../../layout/flex-stack';
20
+ import { Stack } from '../../layout/stack';
19
21
  import { Icon } from '../../ui/icon';
20
22
  import { InputSearch } from '../../ui/input-search';
21
23
  import { FileName } from '../../ui/file-name';
@@ -33,7 +35,7 @@ import { MetricsTableOptions } from '../metrics-table-options';
33
35
  import { MetricsTableTitle } from '../metrics-table-title';
34
36
  import { MetricsDisplaySelector } from '../metrics-display-selector';
35
37
  import { MetricsTableHeader } from '../metrics-table-header';
36
- import { MetricsTreemap } from '../metrics-treemap';
38
+ import { MetricsTreemap, getTreemapNodes, getTreemapNodesGroupedByPath } from '../metrics-treemap';
37
39
  import { SEARCH_PLACEHOLDER } from './bundle-assets.i18n';
38
40
  import css from './bundle-assets.module.css';
39
41
 
@@ -41,13 +43,16 @@ const RUN_TITLE_CURRENT = 'Current';
41
43
  const RUN_TITLE_BASELINE = 'Baseline';
42
44
  const RUNS_LABELS = [RUN_TITLE_CURRENT, RUN_TITLE_BASELINE];
43
45
 
46
+ const DISPLAY_TYPE_GROUPS = {
47
+ [MetricsDisplayType.TREEMAP]: ['folder'],
48
+ };
49
+
44
50
  const getFileTypeFilters = (filters) =>
45
- Object.entries(FILE_TYPE_LABELS)
46
- .map(([key, label]) => ({
47
- key,
48
- label,
49
- defaultValue: get(filters, `${ASSET_FILE_TYPE}.${key}`, true),
50
- }));
51
+ Object.entries(FILE_TYPE_LABELS).map(([key, label]) => ({
52
+ key,
53
+ label,
54
+ defaultValue: get(filters, `${ASSET_FILE_TYPE}.${key}`, true),
55
+ }));
51
56
 
52
57
  const getFilters = ({ compareMode, filters }) => ({
53
58
  [ASSET_FILTERS.CHANGED]: {
@@ -140,6 +145,7 @@ const RowHeader = ({ row, customComponentLink: CustomComponentLink, filters, sea
140
145
 
141
146
  RowHeader.propTypes = {
142
147
  row: PropTypes.shape({
148
+ key: PropTypes.string,
143
149
  label: PropTypes.string,
144
150
  isNotPredictive: PropTypes.bool,
145
151
  isChunk: PropTypes.bool,
@@ -147,24 +153,94 @@ RowHeader.propTypes = {
147
153
  isEntry: PropTypes.bool,
148
154
  runs: PropTypes.arrayOf(PropTypes.object), // eslint-disable-line react/forbid-prop-types
149
155
  }).isRequired,
150
- chunks: PropTypes.arrayOf(
151
- PropTypes.shape({
152
- id: PropTypes.string,
153
- name: PropTypes.string,
154
- }),
155
- ),
156
- labels: PropTypes.arrayOf(PropTypes.string).isRequired,
157
- CustomComponentLink: PropTypes.elementType.isRequired,
156
+ customComponentLink: PropTypes.elementType.isRequired,
157
+ filters: PropTypes.object.isRequired, // eslint-disable-line react/forbid-prop-types
158
+ search: PropTypes.string,
158
159
  };
159
160
 
160
161
  RowHeader.defaultProps = {
161
- chunks: [],
162
+ search: '',
163
+ };
164
+
165
+ const ViewMetricsTreemap = (props) => {
166
+ const {
167
+ metricsTableTitle,
168
+ jobs,
169
+ items,
170
+ displayType,
171
+ emptyMessage,
172
+ showEntryInfo,
173
+ updateSearch,
174
+ search,
175
+ } = props;
176
+
177
+ // Get treenodes based on group
178
+ const treeNodes = useMemo(() => {
179
+ if (displayType.groupBy === 'folder') {
180
+ return getTreemapNodesGroupedByPath(items);
181
+ }
182
+
183
+ return getTreemapNodes(items);
184
+ }, [items, displayType.groupBy]);
185
+
186
+ // Search based on the group path on group title click
187
+ const onGroupClick = useCallback(
188
+ (groupPath) => {
189
+ // Clear seach when groupPath is emty (root)
190
+ if (groupPath === '') {
191
+ updateSearch('');
192
+ return;
193
+ }
194
+ // Search by group path
195
+ // 1. use `^` to match only the string beggining
196
+ // 2. add `/` suffix to exactly match the directory
197
+ const newSearch = `^${groupPath}/`;
198
+
199
+ // Reset search when toggling the same groupPath
200
+ if (newSearch === search) {
201
+ updateSearch('');
202
+ return;
203
+ }
204
+
205
+ updateSearch(`^${groupPath}/`);
206
+ },
207
+ [updateSearch, search],
208
+ );
209
+
210
+ return (
211
+ <>
212
+ <Table compact>
213
+ <MetricsTableHeader metricTitle={metricsTableTitle} showSum jobs={jobs} rows={items} />
214
+ </Table>
215
+ <MetricsTreemap
216
+ treeNodes={treeNodes}
217
+ nested={Boolean(displayType.groupBy)}
218
+ emptyMessage={emptyMessage}
219
+ onItemClick={showEntryInfo}
220
+ onGroupClick={onGroupClick}
221
+ />
222
+ </>
223
+ );
224
+ };
225
+
226
+ ViewMetricsTreemap.propTypes = {
227
+ jobs: PropTypes.arrayOf(PropTypes.object).isRequired, // eslint-disable-line react/forbid-prop-types
228
+ items: PropTypes.arrayOf(PropTypes.object).isRequired, // eslint-disable-line react/forbid-prop-types
229
+ metricsTableTitle: PropTypes.node.isRequired,
230
+ displayType: PropTypes.shape({
231
+ groupBy: PropTypes.string,
232
+ }).isRequired,
233
+ emptyMessage: PropTypes.node.isRequired,
234
+ showEntryInfo: PropTypes.func.isRequired,
235
+ updateSearch: PropTypes.func.isRequired,
236
+ search: PropTypes.string.isRequired,
162
237
  };
163
238
 
164
239
  export const BundleAssets = (props) => {
165
240
  const {
166
241
  className,
167
242
  jobs,
243
+ chunks,
168
244
  items,
169
245
  allItems,
170
246
  updateFilters,
@@ -185,21 +261,24 @@ export const BundleAssets = (props) => {
185
261
 
186
262
  const jobLabels = jobs?.map((job) => job?.label);
187
263
 
188
- const [displayType, setDisplayType] = useMetricsDisplayType();
264
+ const [displayType, setDisplayType] = useMetricsDisplayType(DISPLAY_TYPE_GROUPS);
189
265
 
190
266
  const dropdownFilters = useMemo(
191
267
  () => getFilters({ compareMode: jobs?.length > 1, filters }),
192
268
  [jobs, filters],
193
269
  );
194
270
 
195
- const metricsTableTitle = useMemo(() => (
196
- <MetricsTableTitle
197
- title={I18N.ASSETS}
198
- info={`${items.length}/${totalRowCount}`}
199
- popoverInfo={I18N.ASSETS_INFO}
200
- popoverHref={config.documentation.assets}
201
- />
202
- ), [items, totalRowCount]);
271
+ const metricsTableTitle = useMemo(
272
+ () => (
273
+ <MetricsTableTitle
274
+ title={I18N.ASSETS}
275
+ info={`${items.length}/${totalRowCount}`}
276
+ popoverInfo={I18N.ASSETS_INFO}
277
+ popoverHref={config.documentation.assets}
278
+ />
279
+ ),
280
+ [items, totalRowCount],
281
+ );
203
282
 
204
283
  const renderRowHeader = useCallback(
205
284
  (row) => (
@@ -213,31 +292,38 @@ export const BundleAssets = (props) => {
213
292
  [CustomComponentLink, filters, search],
214
293
  );
215
294
 
216
- const emptyMessage = useMemo(() => (
217
- <EmptySet
218
- resources="assets"
219
- filtered={totalRowCount !== 0}
220
- handleResetFilters={resetFilters}
221
- handleViewAll={resetAllFilters}
222
- />
223
- ), [totalRowCount, resetFilters, resetAllFilters]);
295
+ const emptyMessage = useMemo(
296
+ () => (
297
+ <EmptySet
298
+ resources="assets"
299
+ filtered={totalRowCount !== 0}
300
+ handleResetFilters={resetFilters}
301
+ handleViewAll={resetAllFilters}
302
+ />
303
+ ),
304
+ [totalRowCount, resetFilters, resetAllFilters],
305
+ );
224
306
 
225
307
  const entryItem = useMemo(() => {
226
308
  if (!entryId) {
227
309
  return null;
228
310
  }
229
311
 
230
- return allItems.find(({ key }) => key === entryId)
312
+ return allItems.find(({ key }) => key === entryId);
231
313
  }, [allItems, entryId]);
232
314
 
233
315
  return (
234
316
  <>
235
- <section className={cx(css.root, className)}>
317
+ <Stack space="xsmall" as="section" className={cx(css.root, className)}>
236
318
  <Toolbar
237
- className={css.toolbar}
238
319
  renderActions={({ actionClassName }) => (
239
320
  <FlexStack space="xxsmall" className={cx(css.dropdown, actionClassName)}>
240
- <MetricsDisplaySelector onSelect={setDisplayType} value={displayType} />
321
+ <MetricsDisplaySelector
322
+ value={displayType.value}
323
+ groupBy={displayType.groupBy}
324
+ groups={DISPLAY_TYPE_GROUPS}
325
+ onSelect={setDisplayType}
326
+ />
241
327
  <MetricsTableOptions
242
328
  handleViewAll={resetAllFilters}
243
329
  handleResetFilters={resetFilters}
@@ -260,8 +346,8 @@ export const BundleAssets = (props) => {
260
346
  />
261
347
  </FlexStack>
262
348
  </Toolbar>
263
- <main>
264
- {displayType === MetricsDisplayType.TABLE && (
349
+ <Box outline as="main">
350
+ {displayType.value === MetricsDisplayType.TABLE && (
265
351
  <MetricsTable
266
352
  runs={jobs}
267
353
  items={items}
@@ -273,32 +359,26 @@ export const BundleAssets = (props) => {
273
359
  updateSort={updateSort}
274
360
  />
275
361
  )}
276
- {displayType === MetricsDisplayType.TREEMAP && (
277
- <>
278
- <Table compact>
279
- <MetricsTableHeader
280
- metricTitle={metricsTableTitle}
281
- showSum
282
- jobs={jobs}
283
- rows={items}
284
- />
285
- </Table>
286
- <MetricsTreemap
287
- emptyMessage={emptyMessage}
288
- items={items}
289
- onItemClick={showEntryInfo}
290
- />
291
- </>
362
+ {displayType.value === MetricsDisplayType.TREEMAP && (
363
+ <ViewMetricsTreemap
364
+ jobs={jobs}
365
+ items={items}
366
+ displayType={displayType}
367
+ emptyMessage={emptyMessage}
368
+ showEntryInfo={showEntryInfo}
369
+ updateSearch={updateSearch}
370
+ search={search}
371
+ />
292
372
  )}
293
- </main>
294
- </section>
373
+ </Box>
374
+ </Stack>
295
375
 
296
376
  {entryItem && (
297
377
  <AssetInfo
298
378
  className={css.assetInfo}
299
379
  item={entryItem}
300
380
  labels={jobLabels}
301
- chunks={jobs[0]?.meta?.webpack?.chunks || []}
381
+ chunks={chunks}
302
382
  customComponentLink={CustomComponentLink}
303
383
  onClose={hideEntryInfo}
304
384
  />
@@ -321,13 +401,12 @@ BundleAssets.propTypes = {
321
401
  PropTypes.shape({
322
402
  internalBuildNumber: PropTypes.number,
323
403
  label: PropTypes.string,
324
- meta: PropTypes.shape({
325
- webpack: PropTypes.shape({
326
- chunks: PropTypes.array, // eslint-disable-line react/forbid-prop-types
327
- }),
328
- }),
329
404
  }),
330
405
  ).isRequired,
406
+ chunks: PropTypes.arrayOf({
407
+ id: PropTypes.string,
408
+ name: PropTypes.string,
409
+ }).isRequired,
331
410
  items: PropTypes.arrayOf(
332
411
  PropTypes.shape({
333
412
  key: PropTypes.string,
@@ -357,9 +436,11 @@ BundleAssets.propTypes = {
357
436
  direction: PropTypes.string,
358
437
  }).isRequired,
359
438
  updateSort: PropTypes.func.isRequired,
360
- allItems: PropTypes.arrayOf(PropTypes.shape({
361
- key: PropTypes.string,
362
- })).isRequired,
439
+ allItems: PropTypes.arrayOf(
440
+ PropTypes.shape({
441
+ key: PropTypes.string,
442
+ }),
443
+ ).isRequired,
363
444
  customComponentLink: PropTypes.elementType,
364
445
  hideEntryInfo: PropTypes.func.isRequired,
365
446
  showEntryInfo: PropTypes.func.isRequired,
@@ -1,11 +1,6 @@
1
- .toolbar {
2
- border-bottom: 1px solid var(--color-outline);
3
- }
4
-
5
1
  .toolbarSearch {
6
2
  width: 100%;
7
3
  max-width: 240px;
8
- margin-right: -1px; /** collapse border */
9
4
  }
10
5
 
11
6
  .assetNameWrapper {
@@ -11,6 +11,7 @@ import { useRowsFilter } from '../../hooks/rows-filter';
11
11
  import { useRowsSort } from '../../hooks/rows-sort';
12
12
  import { useSearchParams } from '../../hooks/search-params';
13
13
  import { useEntryInfo } from '../../hooks/entry-info';
14
+ import { getJobsChunksData } from '../../utils/jobs';
14
15
  import { BundleAssets as BundleAssetsComponent } from './bundle-assets';
15
16
  import {
16
17
  addRowAssetFlags,
@@ -22,6 +23,8 @@ import {
22
23
  export const BundleAssets = (props) => {
23
24
  const { jobs, filters, search, setState, sortBy, direction, ...restProps } = props;
24
25
 
26
+ const { chunks } = useMemo(() => getJobsChunksData(jobs), [jobs]);
27
+
25
28
  const { defaultFilters, allEntriesFilters } = useMemo(
26
29
  () => ({
27
30
  defaultFilters: {
@@ -70,6 +73,7 @@ export const BundleAssets = (props) => {
70
73
  return (
71
74
  <BundleAssetsComponent
72
75
  jobs={jobs}
76
+ chunks={chunks}
73
77
  {...restProps}
74
78
  {...searchParams}
75
79
  {...sortParams}
@@ -13,13 +13,22 @@ import { useMetricsDisplayType } from '../../hooks/metrics-display-type';
13
13
  import I18N from '../../i18n';
14
14
  import { Toolbar } from '../../ui/toolbar';
15
15
  import { Table } from '../../ui/table';
16
+ import { Box } from '../../layout/box';
17
+ import { Stack } from '../../layout/stack';
16
18
  import { MetricsDisplaySelector } from '../metrics-display-selector';
17
19
  import { MetricsTable } from '../metrics-table';
18
20
  import { MetricsTableTitle } from '../metrics-table-title';
19
21
  import { MetricsTableHeader } from '../metrics-table-header';
20
- import { MetricsTreemap } from '../metrics-treemap';
22
+ import { MetricsTreemap, getTreemapNodes } from '../metrics-treemap';
21
23
  import { ComponentLink } from '../component-link';
22
- import css from './bundle-assets-totals.module.css';
24
+
25
+ const metricsTableTitle = (
26
+ <MetricsTableTitle
27
+ title={I18N.ASSET_TOTALS}
28
+ popoverInfo={I18N.ASSET_TOTALS_INFO}
29
+ popoverHref={config.documentation.assets}
30
+ />
31
+ );
23
32
 
24
33
  export const BundleAssetsTotals = ({
25
34
  className,
@@ -31,18 +40,21 @@ export const BundleAssetsTotals = ({
31
40
  const [displayType, setDisplayType] = useMetricsDisplayType();
32
41
  const history = useHistory();
33
42
 
34
- const items = webpack.compareBySection.sizes(jobs);
43
+ const items = useMemo(() => webpack.compareBySection.sizes(jobs), [jobs]);
35
44
 
36
- const renderRowHeader = (item) => {
37
- const fileType = ASSETS_SIZES_FILE_TYPE_MAP[item.key];
38
- const { section, title, params } = getBundleAssetsFileTypeComponentLink(fileType, item.label);
45
+ const renderRowHeader = useCallback(
46
+ (item) => {
47
+ const fileType = ASSETS_SIZES_FILE_TYPE_MAP[item.key];
48
+ const { section, title, params } = getBundleAssetsFileTypeComponentLink(fileType, item.label);
39
49
 
40
- return (
41
- <CustomComponentLink section={section} title={title} params={params}>
42
- {item.label}
43
- </CustomComponentLink>
44
- );
45
- };
50
+ return (
51
+ <CustomComponentLink section={section} title={title} params={params}>
52
+ {item.label}
53
+ </CustomComponentLink>
54
+ );
55
+ },
56
+ [CustomComponentLink],
57
+ );
46
58
 
47
59
  const handleMetricsTreemapItemClick = useCallback(
48
60
  (entryId) => {
@@ -56,47 +68,42 @@ export const BundleAssetsTotals = ({
56
68
  [history],
57
69
  );
58
70
 
59
- const metricsTableTitle = useMemo(
60
- () => (
61
- <MetricsTableTitle
62
- title={I18N.ASSET_TOTALS}
63
- popoverInfo={I18N.ASSET_TOTALS_INFO}
64
- popoverHref={config.documentation.assets}
65
- />
66
- ),
67
- [],
68
- );
69
-
70
71
  return (
71
- <div className={className}>
72
+ <Stack space="xsmall" as="section" className={className}>
72
73
  <Toolbar
73
- className={css.toolbar}
74
74
  renderActions={() => (
75
- <MetricsDisplaySelector onSelect={setDisplayType} value={displayType} />
75
+ <MetricsDisplaySelector onSelect={setDisplayType} value={displayType.value} />
76
76
  )}
77
77
  />
78
- {displayType === MetricsDisplayType.TABLE && (
79
- <MetricsTable
80
- title={metricsTableTitle}
81
- runs={jobs}
82
- items={items}
83
- renderRowHeader={renderRowHeader}
84
- showHeaderSum
85
- {...restProps}
86
- />
87
- )}
88
- {displayType === MetricsDisplayType.TREEMAP && (
89
- <>
90
- <Table compact>
91
- <MetricsTableHeader metricTitle={metricsTableTitle} showSum jobs={jobs} rows={items} />
92
- </Table>
93
- <MetricsTreemap
78
+ <Box outline as="main">
79
+ {displayType.value === MetricsDisplayType.TABLE && (
80
+ <MetricsTable
81
+ title={metricsTableTitle}
82
+ runs={jobs}
94
83
  items={items}
95
- onItemClick={onTreemapItemClick || handleMetricsTreemapItemClick}
84
+ renderRowHeader={renderRowHeader}
85
+ showHeaderSum
86
+ {...restProps}
96
87
  />
97
- </>
98
- )}
99
- </div>
88
+ )}
89
+ {displayType.value === MetricsDisplayType.TREEMAP && (
90
+ <>
91
+ <Table compact>
92
+ <MetricsTableHeader
93
+ metricTitle={metricsTableTitle}
94
+ showSum
95
+ jobs={jobs}
96
+ rows={items}
97
+ />
98
+ </Table>
99
+ <MetricsTreemap
100
+ treeNodes={getTreemapNodes(items)}
101
+ onItemClick={onTreemapItemClick || handleMetricsTreemapItemClick}
102
+ />
103
+ </>
104
+ )}
105
+ </Box>
106
+ </Stack>
100
107
  );
101
108
  };
102
109
 
@@ -1,4 +1,4 @@
1
- export const SEARCH = 'Search by module name';
1
+ export const SEARCH = 'Search by module path';
2
2
  export const CHANGED = 'Changed';
3
3
  export const DUPLICATE = 'Duplicate';
4
4
  export const CHUNK = 'Chunk';
@@ -2,14 +2,9 @@
2
2
  color: var(--color-text-light);
3
3
  }
4
4
 
5
- .toolbar {
6
- border-bottom: 1px solid var(--color-outline);
7
- }
8
-
9
5
  .toolbarSearch {
10
6
  width: 100%;
11
7
  max-width: 240px;
12
- margin-right: -1px; /** collapse border */
13
8
  }
14
9
 
15
10
  .metricSelector {