@bundle-stats/ui 4.13.0-beta.0 → 4.13.0-beta.10

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 (207) 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/components/bundle-assets/bundle-assets.js +12 -5
  5. package/lib/components/bundle-assets/bundle-assets.js.map +1 -1
  6. package/lib/components/bundle-assets/bundle-assets.module.css +0 -5
  7. package/lib/components/bundle-assets/index.js +2 -2
  8. package/lib/components/bundle-assets/index.js.map +1 -1
  9. package/lib/components/bundle-assets-totals/bundle-assets-totals.js +22 -11
  10. package/lib/components/bundle-assets-totals/bundle-assets-totals.js.map +1 -1
  11. package/lib/components/bundle-modules/bundle-modules.js +22 -12
  12. package/lib/components/bundle-modules/bundle-modules.js.map +1 -1
  13. package/lib/components/bundle-modules/bundle-modules.module.css +0 -5
  14. package/lib/components/bundle-modules/index.js +2 -2
  15. package/lib/components/bundle-modules/index.js.map +1 -1
  16. package/lib/components/bundle-packages/bundle-packages.js +10 -3
  17. package/lib/components/bundle-packages/bundle-packages.js.map +1 -1
  18. package/lib/components/bundle-packages/bundle-packages.module.css +0 -5
  19. package/lib/components/bundle-packages/index.js +2 -2
  20. package/lib/components/bundle-packages/index.js.map +1 -1
  21. package/lib/components/index.js +1 -3
  22. package/lib/components/index.js.map +1 -1
  23. package/lib/components/jobs-header/jobs-header.module.css +0 -4
  24. package/lib/components/metrics-display-selector/metrics-display-selector.js +4 -10
  25. package/lib/components/metrics-display-selector/metrics-display-selector.js.map +1 -1
  26. package/lib/components/metrics-table/metrics-table.i18n.js +1 -6
  27. package/lib/components/metrics-table/metrics-table.i18n.js.map +1 -1
  28. package/lib/components/metrics-table/metrics-table.js +4 -37
  29. package/lib/components/metrics-table/metrics-table.js.map +1 -1
  30. package/lib/components/metrics-table/metrics-table.module.css +1 -44
  31. package/lib/components/{total-size-type-title → metrics-table-header}/index.js +1 -1
  32. package/lib/components/metrics-table-header/index.js.map +1 -0
  33. package/lib/components/metrics-table-header/metrics-table-header.i18n.js +9 -0
  34. package/lib/components/metrics-table-header/metrics-table-header.i18n.js.map +1 -0
  35. package/lib/components/metrics-table-header/metrics-table-header.js +79 -0
  36. package/lib/components/metrics-table-header/metrics-table-header.js.map +1 -0
  37. package/lib/components/metrics-table-header/metrics-table-header.module.css +51 -0
  38. package/lib/components/metrics-table-options/metrics-table-options.js +2 -2
  39. package/lib/components/metrics-table-options/metrics-table-options.js.map +1 -1
  40. package/lib/components/metrics-table-title/metrics-table-title.js +1 -1
  41. package/lib/components/metrics-table-title/metrics-table-title.js.map +1 -1
  42. package/lib/components/metrics-table-title/metrics-table-title.module.css +4 -4
  43. package/lib/components/metrics-treemap/metrics-treemap.js +66 -51
  44. package/lib/components/metrics-treemap/metrics-treemap.js.map +1 -1
  45. package/lib/components/metrics-treemap/metrics-treemap.module.css +89 -56
  46. package/lib/components/sort-button/sort-button.module.css +1 -0
  47. package/lib/css/variables.css +11 -11
  48. package/lib/hooks/entry-info.js +12 -0
  49. package/lib/hooks/entry-info.js.map +1 -0
  50. package/lib/layout/flex-stack/flex-stack.js +3 -4
  51. package/lib/layout/flex-stack/flex-stack.js.map +1 -1
  52. package/lib/layout/flex-stack/flex-stack.module.css +19 -23
  53. package/lib/query-state.js +1 -1
  54. package/lib/query-state.js.map +1 -1
  55. package/lib/ui/button/button.module.css +1 -0
  56. package/lib/ui/dropdown/dropdown.js +10 -40
  57. package/lib/ui/dropdown/dropdown.js.map +1 -1
  58. package/lib/ui/dropdown/index.js.map +1 -1
  59. package/lib/ui/filters/filters.js +33 -35
  60. package/lib/ui/filters/filters.js.map +1 -1
  61. package/lib/ui/filters/filters.module.css +55 -67
  62. package/lib/ui/hover-card/hover-card.js +1 -1
  63. package/lib/ui/hover-card/hover-card.js.map +1 -1
  64. package/lib/ui/toolbar/toolbar.module.css +1 -3
  65. package/lib-esm/app/app.js +4 -8
  66. package/lib-esm/app/app.js.map +1 -1
  67. package/lib-esm/app/app.module.css +2 -2
  68. package/lib-esm/components/bundle-assets/bundle-assets.js +12 -5
  69. package/lib-esm/components/bundle-assets/bundle-assets.js.map +1 -1
  70. package/lib-esm/components/bundle-assets/bundle-assets.module.css +0 -5
  71. package/lib-esm/components/bundle-assets/index.js +3 -3
  72. package/lib-esm/components/bundle-assets/index.js.map +1 -1
  73. package/lib-esm/components/bundle-assets-totals/bundle-assets-totals.js +23 -12
  74. package/lib-esm/components/bundle-assets-totals/bundle-assets-totals.js.map +1 -1
  75. package/lib-esm/components/bundle-modules/bundle-modules.js +22 -12
  76. package/lib-esm/components/bundle-modules/bundle-modules.js.map +1 -1
  77. package/lib-esm/components/bundle-modules/bundle-modules.module.css +0 -5
  78. package/lib-esm/components/bundle-modules/index.js +2 -2
  79. package/lib-esm/components/bundle-modules/index.js.map +1 -1
  80. package/lib-esm/components/bundle-packages/bundle-packages.js +10 -3
  81. package/lib-esm/components/bundle-packages/bundle-packages.js.map +1 -1
  82. package/lib-esm/components/bundle-packages/bundle-packages.module.css +0 -5
  83. package/lib-esm/components/bundle-packages/index.js +3 -3
  84. package/lib-esm/components/bundle-packages/index.js.map +1 -1
  85. package/lib-esm/components/index.js +0 -1
  86. package/lib-esm/components/index.js.map +1 -1
  87. package/lib-esm/components/jobs-header/jobs-header.module.css +0 -4
  88. package/lib-esm/components/metrics-display-selector/metrics-display-selector.js +4 -10
  89. package/lib-esm/components/metrics-display-selector/metrics-display-selector.js.map +1 -1
  90. package/lib-esm/components/metrics-table/metrics-table.i18n.js +0 -5
  91. package/lib-esm/components/metrics-table/metrics-table.i18n.js.map +1 -1
  92. package/lib-esm/components/metrics-table/metrics-table.js +4 -37
  93. package/lib-esm/components/metrics-table/metrics-table.js.map +1 -1
  94. package/lib-esm/components/metrics-table/metrics-table.module.css +1 -44
  95. package/lib-esm/components/metrics-table-header/index.js +2 -0
  96. package/lib-esm/components/metrics-table-header/index.js.map +1 -0
  97. package/lib-esm/components/metrics-table-header/metrics-table-header.i18n.js +6 -0
  98. package/lib-esm/components/metrics-table-header/metrics-table-header.i18n.js.map +1 -0
  99. package/lib-esm/components/metrics-table-header/metrics-table-header.js +49 -0
  100. package/lib-esm/components/metrics-table-header/metrics-table-header.js.map +1 -0
  101. package/lib-esm/components/metrics-table-header/metrics-table-header.module.css +51 -0
  102. package/lib-esm/components/metrics-table-options/metrics-table-options.js +3 -3
  103. package/lib-esm/components/metrics-table-options/metrics-table-options.js.map +1 -1
  104. package/lib-esm/components/metrics-table-title/metrics-table-title.js +1 -1
  105. package/lib-esm/components/metrics-table-title/metrics-table-title.js.map +1 -1
  106. package/lib-esm/components/metrics-table-title/metrics-table-title.module.css +4 -4
  107. package/lib-esm/components/metrics-treemap/metrics-treemap.js +69 -53
  108. package/lib-esm/components/metrics-treemap/metrics-treemap.js.map +1 -1
  109. package/lib-esm/components/metrics-treemap/metrics-treemap.module.css +89 -56
  110. package/lib-esm/components/sort-button/sort-button.module.css +1 -0
  111. package/lib-esm/css/variables.css +11 -11
  112. package/lib-esm/hooks/entry-info.js +8 -0
  113. package/lib-esm/hooks/entry-info.js.map +1 -0
  114. package/lib-esm/layout/flex-stack/flex-stack.js +3 -4
  115. package/lib-esm/layout/flex-stack/flex-stack.js.map +1 -1
  116. package/lib-esm/layout/flex-stack/flex-stack.module.css +19 -23
  117. package/lib-esm/query-state.js +1 -1
  118. package/lib-esm/query-state.js.map +1 -1
  119. package/lib-esm/ui/button/button.module.css +1 -0
  120. package/lib-esm/ui/dropdown/dropdown.js +8 -39
  121. package/lib-esm/ui/dropdown/dropdown.js.map +1 -1
  122. package/lib-esm/ui/dropdown/index.js.map +1 -1
  123. package/lib-esm/ui/filters/filters.js +34 -36
  124. package/lib-esm/ui/filters/filters.js.map +1 -1
  125. package/lib-esm/ui/filters/filters.module.css +55 -67
  126. package/lib-esm/ui/hover-card/hover-card.js +1 -1
  127. package/lib-esm/ui/hover-card/hover-card.js.map +1 -1
  128. package/lib-esm/ui/toolbar/toolbar.module.css +1 -3
  129. package/package.json +8 -10
  130. package/src/app/app.jsx +4 -12
  131. package/src/app/app.module.css +2 -2
  132. package/src/components/bundle-assets/bundle-assets.jsx +24 -7
  133. package/src/components/bundle-assets/bundle-assets.module.css +0 -5
  134. package/src/components/bundle-assets/index.jsx +8 -3
  135. package/src/components/bundle-assets-totals/bundle-assets-totals.jsx +55 -24
  136. package/src/components/bundle-modules/bundle-modules.module.css +0 -5
  137. package/src/components/bundle-modules/bundle-modules.tsx +60 -42
  138. package/src/components/bundle-modules/index.tsx +2 -2
  139. package/src/components/bundle-packages/bundle-packages.jsx +19 -5
  140. package/src/components/bundle-packages/bundle-packages.module.css +0 -5
  141. package/src/components/bundle-packages/index.jsx +8 -3
  142. package/src/components/index.js +0 -1
  143. package/src/components/jobs-header/jobs-header.module.css +0 -4
  144. package/src/components/metrics-display-selector/metrics-display-selector.tsx +8 -12
  145. package/src/components/metrics-table/metrics-table.i18n.ts +0 -7
  146. package/src/components/metrics-table/metrics-table.module.css +1 -44
  147. package/src/components/metrics-table/metrics-table.tsx +17 -153
  148. package/src/components/metrics-table-header/index.ts +1 -0
  149. package/src/components/metrics-table-header/metrics-table-header.i18n.ts +6 -0
  150. package/src/components/metrics-table-header/metrics-table-header.module.css +51 -0
  151. package/src/components/metrics-table-header/metrics-table-header.tsx +172 -0
  152. package/src/components/metrics-table-options/metrics-table-options.jsx +4 -10
  153. package/src/components/metrics-table-title/metrics-table-title.jsx +1 -1
  154. package/src/components/metrics-table-title/metrics-table-title.module.css +4 -4
  155. package/src/components/metrics-treemap/metrics-treemap.module.css +89 -56
  156. package/src/components/metrics-treemap/metrics-treemap.tsx +151 -118
  157. package/src/components/sort-button/sort-button.module.css +1 -0
  158. package/src/css/variables.css +11 -11
  159. package/src/hooks/entry-info.ts +19 -0
  160. package/src/layout/flex-stack/flex-stack.module.css +19 -23
  161. package/src/layout/flex-stack/flex-stack.tsx +2 -8
  162. package/src/query-state.tsx +1 -1
  163. package/src/ui/button/button.module.css +1 -0
  164. package/src/ui/dropdown/dropdown.stories.tsx +25 -0
  165. package/src/ui/dropdown/dropdown.tsx +66 -0
  166. package/src/ui/filters/filters.module.css +55 -67
  167. package/src/ui/filters/filters.stories.tsx +109 -0
  168. package/src/ui/filters/filters.tsx +128 -167
  169. package/src/ui/hover-card/hover-card.tsx +1 -1
  170. package/src/ui/toolbar/toolbar.module.css +1 -3
  171. package/types/components/bundle-assets-totals/bundle-assets-totals.d.ts +5 -1
  172. package/types/components/index.d.ts +0 -1
  173. package/types/components/metrics-display-selector/metrics-display-selector.d.ts +2 -2
  174. package/types/components/metrics-table/metrics-table.d.ts +4 -10
  175. package/types/components/metrics-table/metrics-table.i18n.d.ts +0 -5
  176. package/types/components/metrics-table-header/index.d.ts +1 -0
  177. package/types/components/metrics-table-header/metrics-table-header.d.ts +15 -0
  178. package/types/components/metrics-table-header/metrics-table-header.i18n.d.ts +5 -0
  179. package/types/hooks/entry-info.d.ts +8 -0
  180. package/types/ui/dropdown/dropdown.d.ts +12 -47
  181. package/types/ui/dropdown/index.d.ts +1 -1
  182. package/types/ui/filters/filters.d.ts +2 -7
  183. package/lib/components/bundle-assets-totals/bundle-assets-totals.module.css +0 -7
  184. package/lib/components/total-size-type-title/index.js.map +0 -1
  185. package/lib/components/total-size-type-title/total-size-type-title.js +0 -32
  186. package/lib/components/total-size-type-title/total-size-type-title.js.map +0 -1
  187. package/lib/components/total-size-type-title/total-size-type-title.module.css +0 -14
  188. package/lib/hooks/show-entry.js +0 -13
  189. package/lib/hooks/show-entry.js.map +0 -1
  190. package/lib-esm/components/bundle-assets-totals/bundle-assets-totals.module.css +0 -7
  191. package/lib-esm/components/total-size-type-title/index.js +0 -2
  192. package/lib-esm/components/total-size-type-title/index.js.map +0 -1
  193. package/lib-esm/components/total-size-type-title/total-size-type-title.js +0 -25
  194. package/lib-esm/components/total-size-type-title/total-size-type-title.js.map +0 -1
  195. package/lib-esm/components/total-size-type-title/total-size-type-title.module.css +0 -14
  196. package/lib-esm/hooks/show-entry.js +0 -9
  197. package/lib-esm/hooks/show-entry.js.map +0 -1
  198. package/src/components/bundle-assets-totals/bundle-assets-totals.module.css +0 -7
  199. package/src/components/total-size-type-title/index.js +0 -1
  200. package/src/components/total-size-type-title/total-size-type-title.jsx +0 -41
  201. package/src/components/total-size-type-title/total-size-type-title.module.css +0 -14
  202. package/src/hooks/show-entry.ts +0 -17
  203. package/src/ui/dropdown/dropdown.jsx +0 -88
  204. package/types/components/total-size-type-title/index.d.ts +0 -1
  205. package/types/components/total-size-type-title/total-size-type-title.d.ts +0 -14
  206. package/types/hooks/show-entry.d.ts +0 -10
  207. /package/src/ui/dropdown/{index.js → index.ts} +0 -0
@@ -5,19 +5,23 @@ import { SECTIONS, COMPONENT } from '@bundle-stats/utils';
5
5
  import { SortAction } from '../../types';
6
6
  import config from '../../config.json';
7
7
  import I18N from '../../i18n';
8
- import { Box } from '../../layout/box';
9
8
  import { MetricsDisplayType } from '../../constants';
9
+ import { Box } from '../../layout/box';
10
10
  import { FlexStack } from '../../layout/flex-stack';
11
+ import { Stack } from '../../layout/stack';
11
12
  import { Button } from '../../ui/button';
13
+ import { ControlGroup } from '../../ui/control-group';
12
14
  import { EmptySet } from '../../ui/empty-set';
13
15
  import { FileName } from '../../ui/file-name';
14
16
  import { Filters } from '../../ui/filters';
15
17
  import { InputSearch } from '../../ui/input-search';
16
18
  import { Tag } from '../../ui/tag';
19
+ import { Table } from '../../ui/table';
17
20
  import { Toolbar } from '../../ui/toolbar';
18
21
  import { Tooltip } from '../../ui/tooltip';
19
22
  import { ComponentLink } from '../component-link';
20
23
  import { MetricsTable } from '../metrics-table';
24
+ import { MetricsTableHeader } from '../metrics-table-header';
21
25
  import { MetricsTreemap } from '../metrics-treemap';
22
26
  import { MetricsTableOptions } from '../metrics-table-options';
23
27
  import { MetricsDisplaySelector } from '../metrics-display-selector';
@@ -44,7 +48,9 @@ const RowHeader = (props: RowHeaderProps) => {
44
48
  return (
45
49
  <CustomComponentLink
46
50
  section={SECTIONS.MODULES}
47
- params={{ [COMPONENT.BUNDLE_MODULES]: { filters, search, entryId: row.key, moduleMetric } }}
51
+ params={{
52
+ [COMPONENT.BUNDLE_MODULES]: { filters, search, entryId: row.key, metric: moduleMetric },
53
+ }}
48
54
  className={css.name}
49
55
  >
50
56
  {row.duplicated && (
@@ -140,7 +146,7 @@ export const BundleModules = (props: BundleModulesProps) => {
140
146
  customComponentLink={CustomComponentLink}
141
147
  />
142
148
  ),
143
- [jobs, chunks, CustomComponentLink, filters, search],
149
+ [jobs, chunks, CustomComponentLink, filters, search, moduleMetric],
144
150
  );
145
151
 
146
152
  const emptyMessage = useMemo(
@@ -165,7 +171,7 @@ export const BundleModules = (props: BundleModulesProps) => {
165
171
 
166
172
  return (
167
173
  <>
168
- <div className={rootClassName}>
174
+ <Stack space="xsmall" as="section" className={rootClassName}>
169
175
  <Toolbar
170
176
  className={css.toolbar}
171
177
  renderActions={({ actionClassName }) => (
@@ -192,45 +198,57 @@ export const BundleModules = (props: BundleModulesProps) => {
192
198
  />
193
199
  </FlexStack>
194
200
  </Toolbar>
195
- <Box padding={['xsmall', 'small']} className={css.metricSelector}>
196
- <FlexStack space="xxsmall" as="nav">
197
- <Button
198
- outline
199
- active={moduleMetric === ModuleMetric.SIZE}
200
- size="small"
201
- type="button"
202
- onClick={() => setModuleMetric(ModuleMetric.SIZE)}
203
- >
204
- <Tooltip title="Size (excluding duplicate modules)">Module size</Tooltip>
205
- </Button>
206
- <Button
207
- outline
208
- active={moduleMetric === ModuleMetric.TOTAL_SIZE}
209
- size="small"
210
- type="button"
211
- onClick={() => setModuleMetric(ModuleMetric.TOTAL_SIZE)}
212
- >
213
- <Tooltip title="Size (including duplicate modules)">Module total size</Tooltip>
214
- </Button>
215
- </FlexStack>
201
+ <Box outline as="main">
202
+ <Box padding={['xsmall', 'small']} className={css.metricSelector}>
203
+ <ControlGroup as="nav">
204
+ <Button
205
+ outline
206
+ active={moduleMetric === ModuleMetric.SIZE}
207
+ size="small"
208
+ type="button"
209
+ onClick={() => setModuleMetric(ModuleMetric.SIZE)}
210
+ >
211
+ <Tooltip title="Size (excluding duplicate modules)">Module size</Tooltip>
212
+ </Button>
213
+ <Button
214
+ outline
215
+ active={moduleMetric === ModuleMetric.TOTAL_SIZE}
216
+ size="small"
217
+ type="button"
218
+ onClick={() => setModuleMetric(ModuleMetric.TOTAL_SIZE)}
219
+ >
220
+ <Tooltip title="Size (including duplicate modules)">Module total size</Tooltip>
221
+ </Button>
222
+ </ControlGroup>
223
+ </Box>
224
+ {displayType === MetricsDisplayType.TABLE && (
225
+ <MetricsTable
226
+ className={css.table}
227
+ items={items}
228
+ runs={jobs}
229
+ renderRowHeader={renderRowHeader}
230
+ emptyMessage={emptyMessage}
231
+ showHeaderSum
232
+ title={metricsTableTitle}
233
+ sort={sort}
234
+ updateSort={updateSort}
235
+ />
236
+ )}
237
+ {displayType === MetricsDisplayType.TREEMAP && (
238
+ <>
239
+ <Table compact>
240
+ <MetricsTableHeader
241
+ metricTitle={metricsTableTitle}
242
+ showSum
243
+ jobs={jobs}
244
+ rows={items}
245
+ />
246
+ </Table>
247
+ <MetricsTreemap emptyMessage={emptyMessage} items={items} onItemClick={showEntryInfo} />
248
+ </>
249
+ )}
216
250
  </Box>
217
- {displayType === MetricsDisplayType.TABLE && (
218
- <MetricsTable
219
- className={css.table}
220
- items={items}
221
- runs={jobs}
222
- renderRowHeader={renderRowHeader}
223
- emptyMessage={emptyMessage}
224
- showHeaderSum
225
- title={metricsTableTitle}
226
- sort={sort}
227
- updateSort={updateSort}
228
- />
229
- )}
230
- {displayType === MetricsDisplayType.TREEMAP && (
231
- <MetricsTreemap emptyMessage={emptyMessage} items={items} onItemClick={showEntryInfo} />
232
- )}
233
- </div>
251
+ </Stack>
234
252
  {entryItem && (
235
253
  <ModuleInfo
236
254
  className={css.moduleInfo}
@@ -6,7 +6,7 @@ import type { SortAction } from '../../types';
6
6
  import { useRowsFilter } from '../../hooks/rows-filter';
7
7
  import { useRowsSort } from '../../hooks/rows-sort';
8
8
  import { useSearchParams } from '../../hooks/search-params';
9
- import { useShowEntry } from '../../hooks/show-entry';
9
+ import { useEntryInfo } from '../../hooks/entry-info';
10
10
  import { BundleModules as BaseComponent } from './bundle-modules';
11
11
  import {
12
12
  addRowFlags,
@@ -120,7 +120,7 @@ export const BundleModules = (props: BundleModulesProps) => {
120
120
  getCustomSort,
121
121
  });
122
122
 
123
- const { hideEntryInfo, showEntryInfo } = useShowEntry({ setState });
123
+ const [hideEntryInfo, showEntryInfo] = useEntryInfo({ setState });
124
124
 
125
125
  return (
126
126
  <BaseComponent
@@ -5,14 +5,18 @@ import { COMPONENT, PACKAGE_FILTERS, PACKAGES_SEPARATOR, SECTIONS } from '@bundl
5
5
 
6
6
  import config from '../../config.json';
7
7
  import I18N from '../../i18n';
8
+ import { Box } from '../../layout/box';
8
9
  import { FlexStack } from '../../layout/flex-stack';
10
+ import { Stack } from '../../layout/stack';
9
11
  import { InputSearch } from '../../ui/input-search';
10
12
  import { EmptySet } from '../../ui/empty-set';
11
13
  import { Filters } from '../../ui/filters';
12
14
  import { Tag } from '../../ui/tag';
15
+ import { Table } from '../../ui/table';
13
16
  import { Toolbar } from '../../ui/toolbar';
14
17
  import { ComponentLink } from '../component-link';
15
18
  import { MetricsTable } from '../metrics-table';
19
+ import { MetricsTableHeader } from '../metrics-table-header';
16
20
  import { MetricsTableOptions } from '../metrics-table-options';
17
21
  import { MetricsTableTitle } from '../metrics-table-title';
18
22
  import { PackageInfo } from '../package-info';
@@ -189,7 +193,7 @@ export const BundlePackages = (props) => {
189
193
 
190
194
  return (
191
195
  <>
192
- <section className={cx(css.root, className)}>
196
+ <Stack space="xsmall" as="section" className={cx(css.root, className)}>
193
197
  <Toolbar
194
198
  className={css.toolbar}
195
199
  renderActions={({ actionClassName }) => (
@@ -217,7 +221,7 @@ export const BundlePackages = (props) => {
217
221
  />
218
222
  </FlexStack>
219
223
  </Toolbar>
220
- <main>
224
+ <Box outline as="main">
221
225
  {displayType === MetricsDisplayType.TABLE && (
222
226
  <MetricsTable
223
227
  runs={jobs}
@@ -231,10 +235,20 @@ export const BundlePackages = (props) => {
231
235
  />
232
236
  )}
233
237
  {displayType === MetricsDisplayType.TREEMAP && (
234
- <MetricsTreemap emptyMessage={emptyMessage} items={items} onItemClick={showEntryInfo} />
238
+ <>
239
+ <Table compact>
240
+ <MetricsTableHeader
241
+ metricTitle={metricsTableTitle}
242
+ showSum
243
+ jobs={jobs}
244
+ rows={items}
245
+ />
246
+ </Table>
247
+ <MetricsTreemap emptyMessage={emptyMessage} items={items} onItemClick={showEntryInfo} />
248
+ </>
235
249
  )}
236
- </main>
237
- </section>
250
+ </Box>
251
+ </Stack>
238
252
  {entryItem && (
239
253
  <PackageInfo
240
254
  className={css.packageInfo}
@@ -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
  .hoverCard {
@@ -6,9 +6,14 @@ import * as webpack from '@bundle-stats/utils/lib-esm/webpack/compare';
6
6
  import { useRowsFilter } from '../../hooks/rows-filter';
7
7
  import { useRowsSort } from '../../hooks/rows-sort';
8
8
  import { useSearchParams } from '../../hooks/search-params';
9
- import { useShowEntry } from '../../hooks/show-entry';
9
+ import { useEntryInfo } from '../../hooks/entry-info';
10
10
  import { BundlePackages as BundlePackagesComponent } from './bundle-packages';
11
- import { getDuplicatePackages, getAddRowDuplicateFlag, getRowFilter, getCustomSort } from './bundle-packages.utils';
11
+ import {
12
+ getDuplicatePackages,
13
+ getAddRowDuplicateFlag,
14
+ getRowFilter,
15
+ getCustomSort,
16
+ } from './bundle-packages.utils';
12
17
 
13
18
  export const BundlePackages = (props) => {
14
19
  const { jobs, search, filters, setState, sortBy, direction, ...restProps } = props;
@@ -55,7 +60,7 @@ export const BundlePackages = (props) => {
55
60
  getCustomSort,
56
61
  });
57
62
 
58
- const { hideEntryInfo, showEntryInfo } = useShowEntry({ setState });
63
+ const [hideEntryInfo, showEntryInfo] = useEntryInfo({ setState });
59
64
 
60
65
  return (
61
66
  <BundlePackagesComponent
@@ -18,4 +18,3 @@ export { MetricsTableTitle } from './metrics-table-title';
18
18
  export { ModuleInfo } from './module-info';
19
19
  export { RunInfo, RunInfoProps } from './run-info';
20
20
  export { Summary } from './summary';
21
- export { TotalSizeTypeTitle } from './total-size-type-title';
@@ -24,10 +24,6 @@
24
24
  background: linear-gradient(90deg, transparent, var(--color-background));
25
25
  }
26
26
 
27
- .item + .item {
28
- margin-left: var(--space-small);
29
- }
30
-
31
27
  .item:first-child {
32
28
  border-left: 0;
33
29
  padding-left: 0;
@@ -2,8 +2,8 @@ import React from 'react';
2
2
  import cx from 'classnames';
3
3
 
4
4
  import { MetricsDisplayType } from '../../constants';
5
- import { FlexStack } from '../../layout/flex-stack';
6
5
  import { Button } from '../../ui/button';
6
+ import { ControlGroup } from '../../ui/control-group';
7
7
  import { Icon } from '../../ui/icon';
8
8
  import css from './metrics-display-selector.module.css';
9
9
 
@@ -14,38 +14,34 @@ interface MetricsDisplaySelectorProps {
14
14
 
15
15
  export const MetricsDisplaySelector = (
16
16
  props: MetricsDisplaySelectorProps &
17
- Omit<React.ComponentProps<typeof FlexStack>, 'onSelect' | 'value'>,
17
+ Omit<React.ComponentProps<typeof ControlGroup>, 'onSelect' | 'value'>,
18
18
  ) => {
19
19
  const { className = '', value, onSelect, ...restProps } = props;
20
20
 
21
21
  return (
22
- <FlexStack space="xxsmall" as="nav" className={cx(css.root, className)} {...restProps}>
22
+ <ControlGroup className={cx(css.root, className)} {...restProps}>
23
23
  <Button
24
24
  outline
25
25
  active={value === MetricsDisplayType.TABLE}
26
26
  size="small"
27
27
  type="button"
28
+ glyph={Icon.ICONS.TABLE}
28
29
  onClick={() => onSelect(MetricsDisplayType.TABLE)}
29
30
  className={css.button}
30
31
  >
31
- <FlexStack space="xxxsmall" alignItems="center">
32
- <Icon glyph={Icon.ICONS.TABLE} className={css.icon} />
33
- <span>Table</span>
34
- </FlexStack>
32
+ Table
35
33
  </Button>
36
34
  <Button
37
35
  outline
38
36
  active={value === MetricsDisplayType.TREEMAP}
39
37
  size="small"
40
38
  type="button"
39
+ glyph={Icon.ICONS.TREEMAP}
41
40
  onClick={() => onSelect(MetricsDisplayType.TREEMAP)}
42
41
  className={cx(css.button)}
43
42
  >
44
- <FlexStack space="xxxsmall" alignItems="center">
45
- <Icon glyph={Icon.ICONS.TREEMAP} className={css.icon} />
46
- <span>Treemap</span>
47
- </FlexStack>
43
+ Treemap
48
44
  </Button>
49
- </FlexStack>
45
+ </ControlGroup>
50
46
  );
51
47
  };
@@ -1,10 +1,3 @@
1
- export const BASELINE_TITLE = 'Baseline';
2
- export const CURRENT_TITLE = 'Current';
3
-
4
- export const SORT_VALUE = 'value';
5
- export const SORT_CHANGE = 'change';
6
- export const SORT_PERCENTUAL_CHANGE = 'percentual change';
7
-
8
1
  export const EMPTY_MESSAGE = 'No items found.';
9
2
  export const SHOW_ALL = 'Show all';
10
3
  export const SHOW_LESS = 'Show less';
@@ -10,52 +10,9 @@
10
10
  text-decoration: underline;
11
11
  }
12
12
 
13
- /* columns */
14
- .metricName {
15
- width: 55%;
16
- }
17
-
18
- .root .jobCol {
19
- text-align: right;
20
- }
21
-
22
- .root .value {
23
- text-align: right;
24
- vertical-align: baseline;
25
- width: 15%;
26
- }
27
-
13
+ .root .value,
28
14
  .root .delta {
29
15
  text-align: right;
30
- font-size: var(--size-xsmall);
31
- vertical-align: baseline;
32
- width: 10%;
33
- color: pink;
34
- }
35
-
36
- .root .deltaPercentage {
37
- width: 5%;
38
- }
39
-
40
- .root tbody .delta {
41
- line-height: 1.6rem; /* baseline alignment with the column value */
42
- }
43
-
44
- .jobName {
45
- white-space: nowrap;
46
- }
47
-
48
- /* columns overrides for showHeaderSum */
49
- .showHeaderSum .headerRow .jobCol {
50
- border-bottom: 0;
51
- padding-bottom: 0;
52
- }
53
-
54
- .showHeaderSum .headerRow .sum {
55
- padding-top: var(--space-xxxsmall);
56
- font-size: var(--size-small);
57
- vertical-align: middle;
58
- text-transform: none;
59
16
  }
60
17
 
61
18
  /** rows */
@@ -1,13 +1,7 @@
1
1
  import React from 'react';
2
2
  import cx from 'classnames';
3
3
  import isEmpty from 'lodash/isEmpty';
4
- import sum from 'lodash/sum';
5
- import {
6
- METRIC_TYPE_CONFIGS,
7
- type MetricRunInfo,
8
- MetricTypes,
9
- getMetricRunInfo,
10
- } from '@bundle-stats/utils';
4
+ import type { ReportMetricRow } from '@bundle-stats/utils';
11
5
 
12
6
  import { Button } from '../../ui/button';
13
7
  import { Icon } from '../../ui/icon';
@@ -15,128 +9,17 @@ import { Table } from '../../ui/table';
15
9
  import { Stack } from '../../layout/stack';
16
10
  import { Metric } from '../metric';
17
11
  import { Delta } from '../delta';
18
- import { JobName } from '../job-name';
19
- import { SortButton } from '../sort-button';
12
+ import { MetricsTableHeader } from '../metrics-table-header';
20
13
  import * as I18N from './metrics-table.i18n';
21
14
  import css from './metrics-table.module.css';
22
15
 
23
- const METRIC_TYPE = METRIC_TYPE_CONFIGS[MetricTypes.FileSize];
24
16
  const VISIBLE_COUNT = 500;
25
17
  const BASELINE_COLUMN_SPAN = 1;
26
18
  const CURRENT_COLUMN_SPAN = 3;
27
19
 
28
- interface Run {
29
- /**
30
- * Run job label
31
- */
32
- label?: React.ReactNode;
33
- /**
34
- * Job internal build number
35
- */
36
- internalBuildNumber: number;
37
- }
38
-
39
- interface Item {
40
- key: string;
41
- label?: string;
42
- changed: boolean;
43
- biggerIsBetter: boolean;
44
- runs: Array<MetricRunInfo | null>;
45
- }
46
-
47
- const getRowsRunTotal = (rows: Array<Item>, runIndex: number): number =>
48
- sum(rows.map((row) => row?.runs?.[runIndex]?.value || 0));
49
-
50
- interface JobColumnProps {
51
- run: Run;
52
- isBaseline: boolean;
53
- }
54
-
55
- const JobColumn = ({ run, isBaseline }: JobColumnProps) => {
56
- const colSpan = isBaseline ? BASELINE_COLUMN_SPAN : CURRENT_COLUMN_SPAN;
57
- const { label, internalBuildNumber } = run;
58
-
59
- if (!run) {
60
- return <Table.Th colSpan={colSpan}>-</Table.Th>;
61
- }
62
-
63
- return (
64
- <Table.Th className={css.jobCol} colSpan={colSpan}>
65
- <JobName
66
- title={isBaseline ? I18N.BASELINE_TITLE : I18N.CURRENT_TITLE}
67
- internalBuildNumber={internalBuildNumber}
68
- className={css.jobName}
69
- >
70
- {label}
71
- </JobName>
72
- </Table.Th>
73
- );
74
- };
75
-
76
- interface ColumnSumProps {
77
- rows: Array<Item>;
78
- isBaseline: boolean;
79
- runIndex: number;
80
- sort?: any;
81
- updateSort?: (val: any) => void;
82
- }
83
-
84
- const SumColumn = ({ rows, isBaseline, runIndex, updateSort, sort }: ColumnSumProps) => {
85
- const currentRunTotal = getRowsRunTotal(rows, runIndex);
86
- const baselineRunTotal = !isBaseline ? getRowsRunTotal(rows, runIndex + 1) : 0;
87
- const total = getMetricRunInfo(METRIC_TYPE, currentRunTotal, baselineRunTotal);
88
- const fieldPath = `runs[${runIndex}]`;
89
-
90
- return (
91
- <>
92
- <Table.Th className={cx(css.value, css.sum)}>
93
- <SortButton
94
- fieldPath={fieldPath}
95
- fieldName="value"
96
- label={I18N.SORT_VALUE}
97
- updateSort={updateSort}
98
- sort={sort}
99
- >
100
- <Metric value={total.displayValue} />
101
- </SortButton>
102
- </Table.Th>
103
- {!isBaseline && (
104
- <>
105
- <Table.Th className={cx(css.delta, css.sum)}>
106
- <SortButton
107
- fieldPath={fieldPath}
108
- fieldName="delta"
109
- label={I18N.SORT_CHANGE}
110
- updateSort={updateSort}
111
- sort={sort}
112
- >
113
- {'delta' in total && (
114
- <Delta displayValue={total.displayDelta} deltaType={total.deltaType} />
115
- )}
116
- </SortButton>
117
- </Table.Th>
118
- <Table.Th className={cx(css.delta, css.deltaPercentage, css.sum)}>
119
- <SortButton
120
- fieldPath={fieldPath}
121
- fieldName="deltaPercentage"
122
- label={I18N.SORT_PERCENTUAL_CHANGE}
123
- updateSort={updateSort}
124
- sort={sort}
125
- >
126
- {'delta' in total && (
127
- <Delta displayValue={total.displayDeltaPercentage} deltaType={total.deltaType} />
128
- )}
129
- </SortButton>
130
- </Table.Th>
131
- </>
132
- )}
133
- </>
134
- );
135
- };
136
-
137
20
  interface RowProps extends React.ComponentProps<typeof Table.Tr> {
138
- item: Item;
139
- renderHeader: (item: Item) => React.ReactNode;
21
+ item: ReportMetricRow;
22
+ renderHeader: (item: ReportMetricRow) => React.ReactNode;
140
23
  }
141
24
 
142
25
  const Row = ({ className = '', item, renderHeader, ...restProps }: RowProps) => (
@@ -185,14 +68,15 @@ const Row = ({ className = '', item, renderHeader, ...restProps }: RowProps) =>
185
68
 
186
69
  interface MetricsTableProps extends Omit<React.ComponentProps<typeof Table>, 'title'> {
187
70
  runs: Array<{
71
+ label: string;
188
72
  internalBuildNumber: number;
189
73
  }>;
190
- items: Array<Item>;
74
+ items: Array<ReportMetricRow>;
191
75
  title?: React.ReactNode;
192
76
  showHeaderSum?: boolean;
193
77
  sort?: any;
194
78
  updateSort?: (val: any) => void;
195
- renderRowHeader?: (item: Item) => React.ReactNode;
79
+ renderRowHeader?: (item: ReportMetricRow) => React.ReactNode;
196
80
  emptyMessage?: React.ReactNode;
197
81
  showAllItems: boolean;
198
82
  setShowAllItems: (value: boolean) => void;
@@ -203,7 +87,7 @@ export const MetricsTable = ({
203
87
  runs,
204
88
  items,
205
89
  showHeaderSum = false,
206
- title = '',
90
+ title,
207
91
  sort,
208
92
  updateSort,
209
93
  renderRowHeader = (item: any) => item.label,
@@ -214,12 +98,7 @@ export const MetricsTable = ({
214
98
  }: MetricsTableProps) => {
215
99
  const columnCount = (runs.length - 1) * CURRENT_COLUMN_SPAN + BASELINE_COLUMN_SPAN + 1;
216
100
 
217
- const rootClassName = cx(
218
- css.root,
219
- className,
220
- runs.length > 1 && css.multipleRuns,
221
- showHeaderSum && css.showHeaderSum,
222
- );
101
+ const rootClassName = cx(css.root, className, runs.length > 1 && css.multipleRuns);
223
102
 
224
103
  const showEmpty = isEmpty(items);
225
104
  const showItems = !showEmpty;
@@ -228,29 +107,14 @@ export const MetricsTable = ({
228
107
 
229
108
  return (
230
109
  <Table className={rootClassName} compact {...restProps}>
231
- <Table.THead>
232
- <Table.Tr className={css.headerRow}>
233
- <Table.Th className={css.metricName} rowSpan={showHeaderSum ? 2 : 1}>
234
- {title || ' '}
235
- </Table.Th>
236
- {runs.map((run, runIndex) => (
237
- <JobColumn run={run} isBaseline={runIndex === runs.length - 1} />
238
- ))}
239
- </Table.Tr>
240
- {showHeaderSum && (
241
- <Table.Tr className={css.headerRow}>
242
- {runs.map((_, runIndex) => (
243
- <SumColumn
244
- rows={items}
245
- isBaseline={runIndex === runs.length - 1}
246
- runIndex={runIndex}
247
- updateSort={updateSort}
248
- sort={sort}
249
- />
250
- ))}
251
- </Table.Tr>
252
- )}
253
- </Table.THead>
110
+ <MetricsTableHeader
111
+ metricTitle={title}
112
+ showSum={showHeaderSum}
113
+ jobs={runs}
114
+ rows={items}
115
+ sort={sort}
116
+ updateSort={updateSort}
117
+ />
254
118
  <Table.TBody>
255
119
  {showEmpty && (
256
120
  <Table.Tr>
@@ -0,0 +1 @@
1
+ export * from './metrics-table-header';
@@ -0,0 +1,6 @@
1
+ export const BASELINE_TITLE = 'Baseline';
2
+ export const CURRENT_TITLE = 'Current';
3
+
4
+ export const SORT_VALUE = 'value';
5
+ export const SORT_CHANGE = 'change';
6
+ export const SORT_PERCENTUAL_CHANGE = 'percentual change';