@bundle-stats/ui 4.13.0-beta.16 → 4.13.0-beta.18

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 (91) hide show
  1. package/lib/assets/icons.svg +70 -67
  2. package/lib/assets/icons.svg.js +14 -12
  3. package/lib/assets/icons.svg.js.map +1 -1
  4. package/lib/components/bundle-assets/bundle-assets.js +39 -7
  5. package/lib/components/bundle-assets/bundle-assets.js.map +1 -1
  6. package/lib/components/bundle-assets-totals/bundle-assets-totals.js +4 -4
  7. package/lib/components/bundle-assets-totals/bundle-assets-totals.js.map +1 -1
  8. package/lib/components/bundle-modules/bundle-modules.js +28 -7
  9. package/lib/components/bundle-modules/bundle-modules.js.map +1 -1
  10. package/lib/components/bundle-packages/bundle-packages.js +39 -7
  11. package/lib/components/bundle-packages/bundle-packages.js.map +1 -1
  12. package/lib/components/metrics-display-selector/metrics-display-selector.js +41 -4
  13. package/lib/components/metrics-display-selector/metrics-display-selector.js.map +1 -1
  14. package/lib/components/metrics-display-selector/metrics-display-selector.module.css +15 -7
  15. package/lib/components/metrics-treemap/index.js +4 -0
  16. package/lib/components/metrics-treemap/index.js.map +1 -1
  17. package/lib/components/metrics-treemap/metrics-treemap.constants.js +3 -0
  18. package/lib/components/metrics-treemap/metrics-treemap.constants.js.map +1 -0
  19. package/lib/components/metrics-treemap/metrics-treemap.js +63 -44
  20. package/lib/components/metrics-treemap/metrics-treemap.js.map +1 -1
  21. package/lib/components/metrics-treemap/metrics-treemap.module.css +60 -28
  22. package/lib/components/metrics-treemap/metrics-treemap.utils.js +70 -0
  23. package/lib/components/metrics-treemap/metrics-treemap.utils.js.map +1 -0
  24. package/lib/hooks/metrics-display-type.js +56 -24
  25. package/lib/hooks/metrics-display-type.js.map +1 -1
  26. package/lib/hooks/search-params.js +1 -0
  27. package/lib/hooks/search-params.js.map +1 -1
  28. package/lib/ui/icon/icon.js +1 -0
  29. package/lib/ui/icon/icon.js.map +1 -1
  30. package/lib/ui/input-search/input-search.js +1 -1
  31. package/lib/ui/input-search/input-search.js.map +1 -1
  32. package/lib-esm/assets/icons.svg +70 -67
  33. package/lib-esm/assets/icons.svg.js +14 -12
  34. package/lib-esm/assets/icons.svg.js.map +1 -1
  35. package/lib-esm/components/bundle-assets/bundle-assets.js +40 -8
  36. package/lib-esm/components/bundle-assets/bundle-assets.js.map +1 -1
  37. package/lib-esm/components/bundle-assets-totals/bundle-assets-totals.js +5 -5
  38. package/lib-esm/components/bundle-assets-totals/bundle-assets-totals.js.map +1 -1
  39. package/lib-esm/components/bundle-modules/bundle-modules.js +29 -8
  40. package/lib-esm/components/bundle-modules/bundle-modules.js.map +1 -1
  41. package/lib-esm/components/bundle-packages/bundle-packages.js +40 -8
  42. package/lib-esm/components/bundle-packages/bundle-packages.js.map +1 -1
  43. package/lib-esm/components/metrics-display-selector/metrics-display-selector.js +41 -4
  44. package/lib-esm/components/metrics-display-selector/metrics-display-selector.js.map +1 -1
  45. package/lib-esm/components/metrics-display-selector/metrics-display-selector.module.css +15 -7
  46. package/lib-esm/components/metrics-treemap/index.js +1 -0
  47. package/lib-esm/components/metrics-treemap/index.js.map +1 -1
  48. package/lib-esm/components/metrics-treemap/metrics-treemap.constants.js +2 -0
  49. package/lib-esm/components/metrics-treemap/metrics-treemap.constants.js.map +1 -0
  50. package/lib-esm/components/metrics-treemap/metrics-treemap.js +64 -45
  51. package/lib-esm/components/metrics-treemap/metrics-treemap.js.map +1 -1
  52. package/lib-esm/components/metrics-treemap/metrics-treemap.module.css +60 -28
  53. package/lib-esm/components/metrics-treemap/metrics-treemap.utils.js +65 -0
  54. package/lib-esm/components/metrics-treemap/metrics-treemap.utils.js.map +1 -0
  55. package/lib-esm/hooks/metrics-display-type.js +57 -24
  56. package/lib-esm/hooks/metrics-display-type.js.map +1 -1
  57. package/lib-esm/hooks/search-params.js +1 -0
  58. package/lib-esm/hooks/search-params.js.map +1 -1
  59. package/lib-esm/ui/icon/icon.js +1 -0
  60. package/lib-esm/ui/icon/icon.js.map +1 -1
  61. package/lib-esm/ui/input-search/input-search.js +1 -1
  62. package/lib-esm/ui/input-search/input-search.js.map +1 -1
  63. package/package.json +7 -7
  64. package/src/assets/icons/check.svg +4 -0
  65. package/src/assets/icons.svg +70 -67
  66. package/src/assets/icons.svg.jsx +12 -12
  67. package/src/components/bundle-assets/bundle-assets.jsx +76 -20
  68. package/src/components/bundle-assets-totals/bundle-assets-totals.jsx +5 -4
  69. package/src/components/bundle-modules/bundle-modules.tsx +76 -16
  70. package/src/components/bundle-packages/bundle-packages.jsx +71 -16
  71. package/src/components/metrics-display-selector/metrics-display-selector.module.css +15 -7
  72. package/src/components/metrics-display-selector/metrics-display-selector.stories.tsx +33 -0
  73. package/src/components/metrics-display-selector/metrics-display-selector.tsx +83 -25
  74. package/src/components/metrics-treemap/__tests__/metrics-treemap.utils.ts +143 -0
  75. package/src/components/metrics-treemap/index.ts +1 -0
  76. package/src/components/metrics-treemap/metrics-treemap.constants.ts +43 -0
  77. package/src/components/metrics-treemap/metrics-treemap.module.css +60 -28
  78. package/src/components/metrics-treemap/metrics-treemap.stories.tsx +44 -10
  79. package/src/components/metrics-treemap/metrics-treemap.tsx +258 -90
  80. package/src/components/metrics-treemap/metrics-treemap.utils.ts +107 -0
  81. package/src/hooks/metrics-display-type.ts +87 -29
  82. package/src/hooks/search-params.js +1 -0
  83. package/src/ui/icon/icon.tsx +1 -0
  84. package/src/ui/input-search/input-search.tsx +1 -0
  85. package/types/components/metrics-display-selector/metrics-display-selector.d.ts +3 -1
  86. package/types/components/metrics-treemap/index.d.ts +1 -0
  87. package/types/components/metrics-treemap/metrics-treemap.constants.d.ts +15 -0
  88. package/types/components/metrics-treemap/metrics-treemap.d.ts +7 -5
  89. package/types/components/metrics-treemap/metrics-treemap.utils.d.ts +4 -0
  90. package/types/hooks/metrics-display-type.d.ts +8 -2
  91. package/types/ui/icon/icon.d.ts +2 -0
@@ -4,53 +4,111 @@ import { StringParam, useQueryParams } from 'use-query-params';
4
4
 
5
5
  import { MetricsDisplayType } from '../constants';
6
6
 
7
- const DEFAULT_DISPLAY_TYPE = MetricsDisplayType.TABLE;
8
- const PARAM_NAME = 'dt';
7
+ const DEFAULT_VALUE = MetricsDisplayType.TABLE;
8
+ const DEFAULT_GROUP_BY = '';
9
9
 
10
- type UseMetricsDisplayType = [MetricsDisplayType, (value: MetricsDisplayType) => void];
10
+ // Display type query param name
11
+ const QUERY_PARAM_VALUE = 'dt';
12
+ // Display type group by param name
13
+ const QUERY_PARAM_GROUP_BY = 'dtg';
11
14
 
12
- export const useMetricsDisplayType = (): UseMetricsDisplayType => {
13
- const [{ [PARAM_NAME]: queryDisplayType }, setQueryParams] = useQueryParams({
14
- [PARAM_NAME]: StringParam,
15
+ type UseMetricsDisplayType = [
16
+ { value: MetricsDisplayType; groupBy?: string },
17
+ (value: MetricsDisplayType, newGroupBy?: string) => void,
18
+ ];
19
+
20
+ export const useMetricsDisplayType = (
21
+ groups?: Partial<Record<MetricsDisplayType, Array<string>>>,
22
+ ): UseMetricsDisplayType => {
23
+ const [queryParams, setQueryParams] = useQueryParams({
24
+ [QUERY_PARAM_VALUE]: StringParam,
25
+ [QUERY_PARAM_GROUP_BY]: StringParam,
15
26
  });
16
- const [storageDisplayType, setStoreageDisplayType] = useLocalStorage(
17
- PARAM_NAME,
18
- MetricsDisplayType.TABLE,
27
+
28
+ const { [QUERY_PARAM_VALUE]: queryParamValue, [QUERY_PARAM_GROUP_BY]: queryParamGroupBy } =
29
+ queryParams;
30
+
31
+ const [storageValue, setStorageValue] = useLocalStorage(QUERY_PARAM_VALUE, DEFAULT_VALUE);
32
+ const [storageGroupBy, setStorageGroupBy] = useLocalStorage(
33
+ QUERY_PARAM_GROUP_BY,
34
+ DEFAULT_GROUP_BY,
19
35
  );
20
36
 
21
- const displayType = useMemo(() => {
22
- const value = queryDisplayType || storageDisplayType;
37
+ /**
38
+ * Normalize display type value
39
+ */
40
+ const value = useMemo(() => {
41
+ const resolvedValue = queryParamValue || storageValue;
42
+
43
+ if (!resolvedValue) {
44
+ return DEFAULT_VALUE;
45
+ }
46
+
47
+ if (!Object.values(MetricsDisplayType).includes(resolvedValue as MetricsDisplayType)) {
48
+ return DEFAULT_VALUE;
49
+ }
50
+
51
+ return resolvedValue as MetricsDisplayType;
52
+ }, [queryParamValue, storageValue]);
53
+
54
+ /**
55
+ * Normalize display type group by
56
+ */
57
+ const groupBy = useMemo(() => {
58
+ const resolvedValue = queryParamGroupBy || storageGroupBy;
23
59
 
24
- if (!value) {
25
- return DEFAULT_DISPLAY_TYPE;
60
+ if (!resolvedValue) {
61
+ return DEFAULT_GROUP_BY;
26
62
  }
27
63
 
28
- if (!Object.values(MetricsDisplayType).includes(value as MetricsDisplayType)) {
29
- return DEFAULT_DISPLAY_TYPE;
64
+ if (!groups?.[value]?.includes(resolvedValue as MetricsDisplayType)) {
65
+ return DEFAULT_GROUP_BY;
30
66
  }
31
67
 
32
- return value as MetricsDisplayType;
33
- }, [queryDisplayType, storageDisplayType]);
68
+ return resolvedValue;
69
+ }, [queryParamGroupBy, storageGroupBy]);
34
70
 
71
+ /**
72
+ * Synchronize query params when values are different
73
+ */
35
74
  useEffect(() => {
36
- // Update query string display type when missing
37
- if (queryDisplayType !== displayType) {
38
- setQueryParams({ [PARAM_NAME]: displayType });
75
+ if (value !== queryParamValue || groupBy !== queryParamGroupBy) {
76
+ setQueryParams({ [QUERY_PARAM_VALUE]: value, [QUERY_PARAM_GROUP_BY]: groupBy });
39
77
  }
78
+ }, [value, queryParamValue, groupBy, queryParamGroupBy, setQueryParams]);
40
79
 
41
- // Update storage state when query string is set and different
42
- if (storageDisplayType !== displayType) {
43
- setStoreageDisplayType(queryDisplayType as MetricsDisplayType);
80
+ /**
81
+ * Synchronize storeage when values are different
82
+ */
83
+ useEffect(() => {
84
+ if (value !== storageValue) {
85
+ setStorageValue(value);
86
+ }
87
+ if (groupBy !== storageValue) {
88
+ setStorageGroupBy(groupBy);
44
89
  }
45
- }, [displayType, queryDisplayType, storageDisplayType, setQueryParams, setStoreageDisplayType]);
90
+ }, [
91
+ value,
92
+ storageValue,
93
+ groupBy,
94
+ storageGroupBy,
95
+ setQueryParams,
96
+ setStorageValue,
97
+ setStorageGroupBy,
98
+ ]);
46
99
 
47
100
  const setDisplayType = useCallback(
48
- (value: MetricsDisplayType) => {
49
- setStoreageDisplayType(value);
50
- setQueryParams({ [PARAM_NAME]: value });
101
+ (newValue: MetricsDisplayType, newGroupBy: string = DEFAULT_GROUP_BY) => {
102
+ setStorageValue(newValue);
103
+ setStorageGroupBy(newGroupBy);
104
+
105
+ setQueryParams({
106
+ [QUERY_PARAM_VALUE]: newValue,
107
+ [QUERY_PARAM_GROUP_BY]: newGroupBy,
108
+ });
51
109
  },
52
- [setStoreageDisplayType, setQueryParams],
110
+ [setStorageValue, setQueryParams],
53
111
  );
54
112
 
55
- return [displayType, setDisplayType];
113
+ return [{ value, groupBy }, setDisplayType];
56
114
  };
@@ -38,6 +38,7 @@ const getSearchReducer =
38
38
  const newState = {
39
39
  filters: payload,
40
40
  search: state.search,
41
+ searchPattern: getSearchPattern(state.search),
41
42
  };
42
43
  setParentState(newState);
43
44
  return newState;
@@ -9,6 +9,7 @@ const ICONS = {
9
9
  CANCEL: 'close',
10
10
  CHEVRON_DOWN: 'chevron-down',
11
11
  CHEVRON_UP: 'chevron-up',
12
+ CHECK: 'check',
12
13
  CLOSE: 'close',
13
14
  CLOCK: 'clock',
14
15
  COMMIT: 'commit',
@@ -70,6 +70,7 @@ export const InputSearch = (
70
70
  />
71
71
  {value && (
72
72
  <Button
73
+ size="small"
73
74
  radius="circle"
74
75
  glyph={Icon.ICONS.CANCEL}
75
76
  type="button"
@@ -3,7 +3,9 @@ import { MetricsDisplayType } from '../../constants';
3
3
  import { ControlGroup } from '../../ui/control-group';
4
4
  interface MetricsDisplaySelectorProps {
5
5
  value: MetricsDisplayType;
6
- onSelect: (newValue: MetricsDisplayType) => void;
6
+ groupBy?: string;
7
+ groups?: Partial<Record<MetricsDisplayType, Array<string>>>;
8
+ onSelect: (newValue: MetricsDisplayType, groupBy?: string) => void;
7
9
  }
8
10
  export declare const MetricsDisplaySelector: (props: MetricsDisplaySelectorProps & Omit<React.ComponentProps<typeof ControlGroup>, 'onSelect' | 'value'>) => React.JSX.Element;
9
11
  export {};
@@ -1 +1,2 @@
1
1
  export * from './metrics-treemap';
2
+ export { getTreemapNodes, getTreemapNodesGroupedByPath } from './metrics-treemap.utils';
@@ -0,0 +1,15 @@
1
+ import type { ReportMetricRow } from '@bundle-stats/utils';
2
+ export interface TreeLeaf {
3
+ id: string;
4
+ label: string;
5
+ value: number;
6
+ item: ReportMetricRow;
7
+ }
8
+ export interface Tree {
9
+ id: string;
10
+ label: string;
11
+ value: number;
12
+ children: TreeNodeChildren;
13
+ }
14
+ export type TreeNode = Tree | TreeLeaf;
15
+ export type TreeNodeChildren = Array<TreeNode>;
@@ -1,9 +1,11 @@
1
- import React from 'react';
2
- import type { ReportMetricRow } from '@bundle-stats/utils';
1
+ import React, { type ComponentProps, type ReactNode } from 'react';
2
+ import type { Tree } from './metrics-treemap.constants';
3
3
  interface MetricsTreemapProps {
4
- items: Array<ReportMetricRow>;
5
- emptyMessage?: React.ReactNode;
4
+ treeNodes: Tree;
5
+ emptyMessage?: ReactNode;
6
+ nested?: boolean;
6
7
  onItemClick?: (entryId: string) => void;
8
+ onGroupClick?: (entryId: string) => void;
7
9
  }
8
- export declare const MetricsTreemap: (props: MetricsTreemapProps & React.ComponentProps<'div'>) => React.JSX.Element;
10
+ export declare const MetricsTreemap: (props: MetricsTreemapProps & ComponentProps<'div'>) => React.JSX.Element;
9
11
  export {};
@@ -0,0 +1,4 @@
1
+ import type { ReportMetricRow } from '@bundle-stats/utils';
2
+ import type { Tree } from './metrics-treemap.constants';
3
+ export declare function getTreemapNodes(items: Array<ReportMetricRow>): Tree;
4
+ export declare function getTreemapNodesGroupedByPath(items: Array<ReportMetricRow>): Tree;
@@ -1,4 +1,10 @@
1
1
  import { MetricsDisplayType } from '../constants';
2
- type UseMetricsDisplayType = [MetricsDisplayType, (value: MetricsDisplayType) => void];
3
- export declare const useMetricsDisplayType: () => UseMetricsDisplayType;
2
+ type UseMetricsDisplayType = [
3
+ {
4
+ value: MetricsDisplayType;
5
+ groupBy?: string;
6
+ },
7
+ (value: MetricsDisplayType, newGroupBy?: string) => void
8
+ ];
9
+ export declare const useMetricsDisplayType: (groups?: Partial<Record<MetricsDisplayType, Array<string>>>) => UseMetricsDisplayType;
4
10
  export {};
@@ -5,6 +5,7 @@ declare const ICONS: {
5
5
  readonly CANCEL: "close";
6
6
  readonly CHEVRON_DOWN: "chevron-down";
7
7
  readonly CHEVRON_UP: "chevron-up";
8
+ readonly CHECK: "check";
8
9
  readonly CLOSE: "close";
9
10
  readonly CLOCK: "clock";
10
11
  readonly COMMIT: "commit";
@@ -40,6 +41,7 @@ export declare const Icon: {
40
41
  readonly CANCEL: "close";
41
42
  readonly CHEVRON_DOWN: "chevron-down";
42
43
  readonly CHEVRON_UP: "chevron-up";
44
+ readonly CHECK: "check";
43
45
  readonly CLOSE: "close";
44
46
  readonly CLOCK: "clock";
45
47
  readonly COMMIT: "commit";