@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.
- package/lib/app/app.js +12 -12
- package/lib/app/app.js.map +1 -1
- package/lib/components/asset-name/asset-name.js +2 -2
- package/lib/components/asset-name/asset-name.js.map +1 -1
- package/lib/components/bundle-assets/bundle-assets.js +11 -3
- package/lib/components/bundle-assets/bundle-assets.js.map +1 -1
- package/lib/components/bundle-assets/index.js +1 -0
- package/lib/components/bundle-assets/index.js.map +1 -1
- package/lib/components/bundle-modules/bundle-modules.js +12 -10
- package/lib/components/bundle-modules/bundle-modules.js.map +1 -1
- package/lib/components/bundle-modules/index.js +1 -0
- package/lib/components/bundle-modules/index.js.map +1 -1
- package/lib/components/bundle-packages/bundle-packages.js +21 -22
- package/lib/components/bundle-packages/bundle-packages.js.map +1 -1
- package/lib/components/bundle-packages/index.js +1 -0
- package/lib/components/bundle-packages/index.js.map +1 -1
- package/lib/hooks/rows-sort.js +6 -2
- package/lib/hooks/rows-sort.js.map +1 -1
- package/lib-esm/app/app.js +12 -12
- package/lib-esm/app/app.js.map +1 -1
- package/lib-esm/components/asset-name/asset-name.js +2 -2
- package/lib-esm/components/asset-name/asset-name.js.map +1 -1
- package/lib-esm/components/bundle-assets/bundle-assets.js +11 -3
- package/lib-esm/components/bundle-assets/bundle-assets.js.map +1 -1
- package/lib-esm/components/bundle-assets/index.js +1 -0
- package/lib-esm/components/bundle-assets/index.js.map +1 -1
- package/lib-esm/components/bundle-modules/bundle-modules.js +12 -10
- package/lib-esm/components/bundle-modules/bundle-modules.js.map +1 -1
- package/lib-esm/components/bundle-modules/index.js +1 -0
- package/lib-esm/components/bundle-modules/index.js.map +1 -1
- package/lib-esm/components/bundle-packages/bundle-packages.js +21 -22
- package/lib-esm/components/bundle-packages/bundle-packages.js.map +1 -1
- package/lib-esm/components/bundle-packages/index.js +1 -0
- package/lib-esm/components/bundle-packages/index.js.map +1 -1
- package/lib-esm/hooks/rows-sort.js +7 -3
- package/lib-esm/hooks/rows-sort.js.map +1 -1
- package/package.json +3 -3
- package/src/app/app.jsx +12 -16
- package/src/components/asset-name/asset-name.tsx +4 -4
- package/src/components/bundle-assets/bundle-assets.jsx +14 -10
- package/src/components/bundle-assets/index.jsx +1 -0
- package/src/components/bundle-modules/bundle-modules.tsx +29 -28
- package/src/components/bundle-modules/index.tsx +1 -0
- package/src/components/bundle-packages/bundle-packages.jsx +53 -40
- package/src/components/bundle-packages/index.jsx +1 -0
- package/src/hooks/rows-sort.ts +17 -2
- package/types/components/asset-name/asset-name.d.ts +1 -1
- package/types/components/bundle-assets/bundle-assets.d.ts +1 -1
- package/types/components/bundle-packages/bundle-packages.d.ts +1 -1
- 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
|
-
|
|
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,
|
|
50
|
+
const { row, EntryComponentLink } = props;
|
|
53
51
|
|
|
54
52
|
const moduleRow = row as ReportMetricModuleRow;
|
|
55
53
|
|
|
56
54
|
return (
|
|
57
|
-
<
|
|
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
|
-
</
|
|
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
|
-
|
|
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(
|
|
@@ -46,17 +46,9 @@ const getDropdownFilters = ({ compareMode, filters }) => ({
|
|
|
46
46
|
},
|
|
47
47
|
});
|
|
48
48
|
|
|
49
|
-
const PackageName = ({
|
|
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
|
-
<
|
|
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
|
-
</
|
|
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
|
-
|
|
86
|
-
|
|
87
|
-
|
|
76
|
+
packageName: PropTypes.string.isRequired,
|
|
77
|
+
showDetails: PropTypes.bool.isRequired,
|
|
78
|
+
EntryComponentLink: PropTypes.elementType.isRequired,
|
|
88
79
|
};
|
|
89
80
|
|
|
90
|
-
const RowHeader = ({ row,
|
|
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
|
-
|
|
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
|
-
|
|
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 {
|
|
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
|
|
234
|
-
(
|
|
235
|
-
<
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
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,
|
|
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
|
|
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
|
-
|
|
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(
|
|
398
|
-
|
|
399
|
-
|
|
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,
|
package/src/hooks/rows-sort.ts
CHANGED
|
@@ -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,
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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 {};
|