@bundle-stats/ui 4.17.0-beta.3 → 4.17.0-beta.5

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 (50) hide show
  1. package/lib/app/app.js +12 -12
  2. package/lib/app/app.js.map +1 -1
  3. package/lib/components/asset-name/asset-name.js +2 -2
  4. package/lib/components/asset-name/asset-name.js.map +1 -1
  5. package/lib/components/bundle-assets/bundle-assets.js +11 -3
  6. package/lib/components/bundle-assets/bundle-assets.js.map +1 -1
  7. package/lib/components/bundle-assets/index.js +1 -0
  8. package/lib/components/bundle-assets/index.js.map +1 -1
  9. package/lib/components/bundle-modules/bundle-modules.js +12 -10
  10. package/lib/components/bundle-modules/bundle-modules.js.map +1 -1
  11. package/lib/components/bundle-modules/index.js +1 -0
  12. package/lib/components/bundle-modules/index.js.map +1 -1
  13. package/lib/components/bundle-packages/bundle-packages.js +21 -22
  14. package/lib/components/bundle-packages/bundle-packages.js.map +1 -1
  15. package/lib/components/bundle-packages/index.js +1 -0
  16. package/lib/components/bundle-packages/index.js.map +1 -1
  17. package/lib/hooks/rows-sort.js +6 -2
  18. package/lib/hooks/rows-sort.js.map +1 -1
  19. package/lib-esm/app/app.js +12 -12
  20. package/lib-esm/app/app.js.map +1 -1
  21. package/lib-esm/components/asset-name/asset-name.js +2 -2
  22. package/lib-esm/components/asset-name/asset-name.js.map +1 -1
  23. package/lib-esm/components/bundle-assets/bundle-assets.js +11 -3
  24. package/lib-esm/components/bundle-assets/bundle-assets.js.map +1 -1
  25. package/lib-esm/components/bundle-assets/index.js +1 -0
  26. package/lib-esm/components/bundle-assets/index.js.map +1 -1
  27. package/lib-esm/components/bundle-modules/bundle-modules.js +12 -10
  28. package/lib-esm/components/bundle-modules/bundle-modules.js.map +1 -1
  29. package/lib-esm/components/bundle-modules/index.js +1 -0
  30. package/lib-esm/components/bundle-modules/index.js.map +1 -1
  31. package/lib-esm/components/bundle-packages/bundle-packages.js +21 -22
  32. package/lib-esm/components/bundle-packages/bundle-packages.js.map +1 -1
  33. package/lib-esm/components/bundle-packages/index.js +1 -0
  34. package/lib-esm/components/bundle-packages/index.js.map +1 -1
  35. package/lib-esm/hooks/rows-sort.js +7 -3
  36. package/lib-esm/hooks/rows-sort.js.map +1 -1
  37. package/package.json +3 -3
  38. package/src/app/app.jsx +12 -16
  39. package/src/components/asset-name/asset-name.tsx +4 -4
  40. package/src/components/bundle-assets/bundle-assets.jsx +14 -10
  41. package/src/components/bundle-assets/index.jsx +1 -0
  42. package/src/components/bundle-modules/bundle-modules.tsx +29 -28
  43. package/src/components/bundle-modules/index.tsx +1 -0
  44. package/src/components/bundle-packages/bundle-packages.jsx +53 -40
  45. package/src/components/bundle-packages/index.jsx +1 -0
  46. package/src/hooks/rows-sort.ts +17 -2
  47. package/types/components/asset-name/asset-name.d.ts +1 -1
  48. package/types/components/bundle-assets/bundle-assets.d.ts +1 -1
  49. package/types/components/bundle-packages/bundle-packages.d.ts +1 -1
  50. package/types/hooks/rows-sort.d.ts +5 -1
@@ -1,3 +1,4 @@
1
+ import type { ComponentProps, ElementType } from 'react';
1
2
  import React, { useCallback, useMemo, useState } from 'react';
2
3
  import cx from 'classnames';
3
4
  import { SECTIONS, COMPONENT, type Job, ReportMetricRow } from '@bundle-stats/utils';
@@ -42,35 +43,21 @@ const DISPLAY_TYPE_GROUPS = {
42
43
 
43
44
  interface RowHeaderProps {
44
45
  row: ReportMetricRow;
45
- filters?: any;
46
- search?: string;
47
- moduleMetric?: string;
48
- customComponentLink: React.ElementType;
46
+ EntryComponentLink: ElementType;
49
47
  }
50
48
 
51
49
  const RowHeader = (props: RowHeaderProps) => {
52
- const { row, filters, search, moduleMetric, customComponentLink: CustomComponentLink } = props;
50
+ const { row, EntryComponentLink } = props;
53
51
 
54
52
  const moduleRow = row as ReportMetricModuleRow;
55
53
 
56
54
  return (
57
- <CustomComponentLink
58
- section={SECTIONS.MODULES}
59
- params={{
60
- [COMPONENT.BUNDLE_MODULES]: {
61
- filters,
62
- search,
63
- entryId: moduleRow.key,
64
- metric: moduleMetric,
65
- },
66
- }}
67
- className={css.name}
68
- >
55
+ <EntryComponentLink entryId={row.key} className={css.name}>
69
56
  {moduleRow.duplicated && (
70
57
  <Tag className={css.nameTagDuplicated} size="small" kind={Tag.KINDS.DANGER} />
71
58
  )}
72
59
  <FileName className={css.nameText} name={moduleRow.label} />
73
- </CustomComponentLink>
60
+ </EntryComponentLink>
74
61
  );
75
62
  };
76
63
 
@@ -209,6 +196,28 @@ export const BundleModules = (props: BundleModulesProps) => {
209
196
  [jobs, filters, chunks],
210
197
  );
211
198
 
199
+ const EntryComponentLink = useCallback(
200
+ ({
201
+ entryId: moduleEntryId,
202
+ ...moduleNameRestProps
203
+ }: { entryId: string } & ComponentProps<typeof CustomComponentLink>) => (
204
+ <CustomComponentLink
205
+ section={SECTIONS.MODULES}
206
+ params={{
207
+ [COMPONENT.BUNDLE_MODULES]: {
208
+ filters,
209
+ search,
210
+ entryId: moduleEntryId,
211
+ sortBy: sort.field,
212
+ direction: sort.direction,
213
+ },
214
+ }}
215
+ {...moduleNameRestProps}
216
+ />
217
+ ),
218
+ [CustomComponentLink, filters, search, sort],
219
+ );
220
+
212
221
  const metricsTableTitle = useMemo(
213
222
  () => (
214
223
  <MetricsTableTitle
@@ -222,16 +231,8 @@ export const BundleModules = (props: BundleModulesProps) => {
222
231
  );
223
232
 
224
233
  const renderRowHeader = useCallback(
225
- (row: ReportMetricRow) => (
226
- <RowHeader
227
- row={row}
228
- filters={filters}
229
- search={search}
230
- moduleMetric={moduleMetric}
231
- customComponentLink={CustomComponentLink}
232
- />
233
- ),
234
- [jobs, chunks, CustomComponentLink, filters, search, moduleMetric],
234
+ (row: ReportMetricRow) => <RowHeader row={row} EntryComponentLink={EntryComponentLink} />,
235
+ [EntryComponentLink],
235
236
  );
236
237
 
237
238
  const emptyMessage = useMemo(
@@ -125,6 +125,7 @@ export const BundleModules = (props: BundleModulesProps) => {
125
125
  initialField: sortBy,
126
126
  initialDirection: direction,
127
127
  getCustomSort,
128
+ setQueryState: setState,
128
129
  });
129
130
 
130
131
  const [hideEntryInfo, showEntryInfo] = useEntryInfo({ setState });
@@ -46,17 +46,9 @@ const getDropdownFilters = ({ compareMode, filters }) => ({
46
46
  },
47
47
  });
48
48
 
49
- const PackageName = ({ packageName, showDetails, row, filters, search, CustomComponentLink }) => {
50
- const params = useMemo(() => ({
51
- [COMPONENT.BUNDLE_PACKAGES]: {
52
- filters,
53
- search,
54
- entryId: showDetails ? row.key : packageName
55
- }
56
- }), [filters, search, row, packageName]);
57
-
49
+ const PackageName = ({ row, packageName, showDetails, EntryComponentLink }) => {
58
50
  return (
59
- <CustomComponentLink section={SECTIONS.PACKAGES} params={params} className={css.packageName}>
51
+ <EntryComponentLink entryId={showDetails ? row.key : packageName} className={css.packageName}>
60
52
  {showDetails && row.duplicate && (
61
53
  <Tag
62
54
  className={css.packageNameTagDuplicate}
@@ -66,14 +58,13 @@ const PackageName = ({ packageName, showDetails, row, filters, search, CustomCom
66
58
  />
67
59
  )}
68
60
  <span className={css.packageNameLabel}>{packageName}</span>
69
- </CustomComponentLink>
61
+ </EntryComponentLink>
70
62
  );
71
63
  };
72
64
 
73
65
  PackageName.propTypes = {
74
- packageName: PropTypes.string.isRequired,
75
- showDetails: PropTypes.bool.isRequired,
76
66
  row: PropTypes.shape({
67
+ key: PropTypes.string,
77
68
  label: PropTypes.string,
78
69
  duplicate: PropTypes.bool,
79
70
  runs: PropTypes.arrayOf(
@@ -82,12 +73,12 @@ PackageName.propTypes = {
82
73
  }),
83
74
  ).isRequired,
84
75
  }).isRequired,
85
- CustomComponentLink: PropTypes.elementType.isRequired,
86
- filters: PropTypes.object, // eslint-disable-line react/forbid-props
87
- search: PropTypes.string,
76
+ packageName: PropTypes.string.isRequired,
77
+ showDetails: PropTypes.bool.isRequired,
78
+ EntryComponentLink: PropTypes.elementType.isRequired,
88
79
  };
89
80
 
90
- const RowHeader = ({ row, labels, CustomComponentLink, filters, search }) => {
81
+ const RowHeader = ({ row, EntryComponentLink }) => {
91
82
  const packageNames = row.label.split(PACKAGES_SEPARATOR);
92
83
 
93
84
  return (
@@ -96,11 +87,8 @@ const RowHeader = ({ row, labels, CustomComponentLink, filters, search }) => {
96
87
  <PackageName
97
88
  packageName={packageName}
98
89
  row={row}
99
- labels={labels}
100
90
  showDetails={index === packageNames.length - 1}
101
- CustomComponentLink={CustomComponentLink}
102
- filters={filters}
103
- search={search}
91
+ EntryComponentLink={EntryComponentLink}
104
92
  />
105
93
  ))}
106
94
  </span>
@@ -117,13 +105,20 @@ RowHeader.propTypes = {
117
105
  }),
118
106
  ).isRequired,
119
107
  }).isRequired,
120
- CustomComponentLink: PropTypes.elementType.isRequired,
121
- filters: PropTypes.object, // eslint-disable-line react/forbid-props
122
- search: PropTypes.string,
108
+ EntryComponentLink: PropTypes.elementType.isRequired,
123
109
  };
124
110
 
125
111
  const ViewMetricsTreemap = (props) => {
126
- const { metricsTableTitle, jobs, items, displayType, emptyMessage, showEntryInfo, updateSearch, search } = props;
112
+ const {
113
+ metricsTableTitle,
114
+ jobs,
115
+ items,
116
+ displayType,
117
+ emptyMessage,
118
+ showEntryInfo,
119
+ updateSearch,
120
+ search,
121
+ } = props;
127
122
 
128
123
  // Get treenodes based on group
129
124
  const treeNodes = useMemo(() => {
@@ -230,17 +225,28 @@ export const BundlePackages = (props) => {
230
225
  [items, totalRowCount],
231
226
  );
232
227
 
233
- const renderRowHeader = useCallback(
234
- (row) => (
235
- <RowHeader
236
- row={row}
237
- labels={jobLabels}
238
- CustomComponentLink={CustomComponentLink}
239
- filters={filters}
240
- search={search}
228
+ const PackageNameCustomComponentLink = useCallback(
229
+ ({ entryId: packageEntryId, ...assetNameRestProps }) => (
230
+ <CustomComponentLink
231
+ section={SECTIONS.PACKAGES}
232
+ params={{
233
+ [COMPONENT.BUNDLE_PACKAGES]: {
234
+ filters,
235
+ search,
236
+ entryId: packageEntryId,
237
+ sortBy: sort.field,
238
+ direction: sort.direction,
239
+ },
240
+ }}
241
+ {...assetNameRestProps}
241
242
  />
242
243
  ),
243
- [CustomComponentLink, jobLabels, filters, search],
244
+ [CustomComponentLink, filters, search, sort],
245
+ );
246
+
247
+ const renderRowHeader = useCallback(
248
+ (row) => <RowHeader row={row} EntryComponentLink={PackageNameCustomComponentLink} />,
249
+ [PackageNameCustomComponentLink],
244
250
  );
245
251
 
246
252
  const emptyMessage = useMemo(
@@ -260,7 +266,7 @@ export const BundlePackages = (props) => {
260
266
  return null;
261
267
  }
262
268
 
263
- return allItems.find(({ key }) => key === entryId)
269
+ return allItems.find(({ key }) => key === entryId);
264
270
  }, [allItems, entryId]);
265
271
 
266
272
  const exportDialog = useDialogState();
@@ -278,7 +284,12 @@ export const BundlePackages = (props) => {
278
284
  className={css.toolbar}
279
285
  renderActions={({ actionClassName }) => (
280
286
  <FlexStack space="xxsmall" className={cx(css.dropdown, actionClassName)}>
281
- <MetricsDisplaySelector onSelect={setDisplayType} value={displayType.value} groupBy={displayType.groupBy} groups={DISPLAY_TYPE_GROUPS} />
287
+ <MetricsDisplaySelector
288
+ onSelect={setDisplayType}
289
+ value={displayType.value}
290
+ groupBy={displayType.groupBy}
291
+ groups={DISPLAY_TYPE_GROUPS}
292
+ />
282
293
  <MetricsTableOptions
283
294
  onViewAllClick={resetAllFilters}
284
295
  onResetClick={resetFilters}
@@ -388,15 +399,17 @@ BundlePackages.propTypes = {
388
399
  }).isRequired,
389
400
  hasActiveFilters: PropTypes.bool,
390
401
  sort: PropTypes.shape({
391
- sortBy: PropTypes.string,
402
+ field: PropTypes.string,
392
403
  direction: PropTypes.string,
393
404
  }).isRequired,
394
405
  updateSort: PropTypes.func.isRequired,
395
406
  search: PropTypes.string.isRequired,
396
407
  updateSearch: PropTypes.func.isRequired,
397
- allItems: PropTypes.arrayOf(PropTypes.shape({
398
- key: PropTypes.string,
399
- })).isRequired,
408
+ allItems: PropTypes.arrayOf(
409
+ PropTypes.shape({
410
+ key: PropTypes.string,
411
+ }),
412
+ ).isRequired,
400
413
  customComponentLink: PropTypes.elementType,
401
414
  entryId: PropTypes.string,
402
415
  hideEntryInfo: PropTypes.func.isRequired,
@@ -58,6 +58,7 @@ export const BundlePackages = (props) => {
58
58
  initialField: sortBy,
59
59
  initialDirection: direction,
60
60
  getCustomSort,
61
+ setQueryState: setState,
61
62
  });
62
63
 
63
64
  const [hideEntryInfo, showEntryInfo] = useEntryInfo({ setState });
@@ -1,4 +1,4 @@
1
- import { useState, useMemo } from 'react';
1
+ import { useState, useMemo, useCallback } from 'react';
2
2
  import get from 'lodash/get';
3
3
  import orderBy from 'lodash/orderBy';
4
4
 
@@ -20,6 +20,10 @@ interface UseRowsSortParams<TRow> {
20
20
  initialField?: string;
21
21
  initialDirection?: SortAction['direction'];
22
22
  getCustomSort: (item: any) => Array<string | number | boolean>;
23
+ setQueryState: (queryParams: {
24
+ sortBy: SortAction['field'];
25
+ direction: SortAction['direction'];
26
+ }) => void;
23
27
  }
24
28
 
25
29
  interface UseRowsSort<TRow> {
@@ -33,8 +37,19 @@ export const useRowsSort = <TRow>({
33
37
  initialField = 'runs[0].delta',
34
38
  initialDirection = 'desc',
35
39
  getCustomSort,
40
+ setQueryState,
36
41
  }: UseRowsSortParams<TRow>): UseRowsSort<TRow> => {
37
- const [sort, updateSort] = useState({ field: initialField, direction: initialDirection });
42
+ const [sort, setSort] = useState({ field: initialField, direction: initialDirection });
43
+
44
+ const updateSort = useCallback(
45
+ (newState: SortAction) => {
46
+ // 1. Update local state
47
+ setSort(newState);
48
+ // 2. Update query state params
49
+ setQueryState({ sortBy: newState.field, direction: newState.direction });
50
+ },
51
+ [setQueryState, setSort],
52
+ );
38
53
 
39
54
  const orderedRows = useMemo(
40
55
  () =>
@@ -3,6 +3,6 @@ import type { ReportMetricAssetRow } from '../../types';
3
3
  export type AssetNameProps = {
4
4
  className?: string;
5
5
  row: ReportMetricAssetRow;
6
- customComponentLink: ElementType;
6
+ EntryComponentLink: ElementType;
7
7
  };
8
8
  export declare const AssetName: (props: AssetNameProps) => React.JSX.Element;
@@ -39,7 +39,7 @@ export namespace BundleAssets {
39
39
  export let search: PropTypes.Validator<string>;
40
40
  export let updateSearch: PropTypes.Validator<(...args: any[]) => any>;
41
41
  export let sort: PropTypes.Validator<NonNullable<PropTypes.InferProps<{
42
- sortBy: PropTypes.Requireable<string>;
42
+ field: PropTypes.Requireable<string>;
43
43
  direction: PropTypes.Requireable<string>;
44
44
  }>>>;
45
45
  export let updateSort: PropTypes.Validator<(...args: any[]) => any>;
@@ -32,7 +32,7 @@ export namespace BundlePackages {
32
32
  let hasActiveFilters_1: PropTypes.Requireable<boolean>;
33
33
  export { hasActiveFilters_1 as hasActiveFilters };
34
34
  export let sort: PropTypes.Validator<NonNullable<PropTypes.InferProps<{
35
- sortBy: PropTypes.Requireable<string>;
35
+ field: PropTypes.Requireable<string>;
36
36
  direction: PropTypes.Requireable<string>;
37
37
  }>>>;
38
38
  export let updateSort: PropTypes.Validator<(...args: any[]) => any>;
@@ -5,11 +5,15 @@ interface UseRowsSortParams<TRow> {
5
5
  initialField?: string;
6
6
  initialDirection?: SortAction['direction'];
7
7
  getCustomSort: (item: any) => Array<string | number | boolean>;
8
+ setQueryState: (queryParams: {
9
+ sortBy: SortAction['field'];
10
+ direction: SortAction['direction'];
11
+ }) => void;
8
12
  }
9
13
  interface UseRowsSort<TRow> {
10
14
  items: Array<TRow>;
11
15
  sort: SortAction;
12
16
  updateSort: (params: SortAction) => void;
13
17
  }
14
- export declare const useRowsSort: <TRow>({ rows, initialField, initialDirection, getCustomSort, }: UseRowsSortParams<TRow>) => UseRowsSort<TRow>;
18
+ export declare const useRowsSort: <TRow>({ rows, initialField, initialDirection, getCustomSort, setQueryState, }: UseRowsSortParams<TRow>) => UseRowsSort<TRow>;
15
19
  export {};