@bundle-stats/ui 4.13.0-beta.2 → 4.13.0-beta.21

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 (279) 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 +47 -8
  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-totals/bundle-assets-totals.js +25 -14
  11. package/lib/components/bundle-assets-totals/bundle-assets-totals.js.map +1 -1
  12. package/lib/components/bundle-modules/bundle-modules.i18n.js +1 -1
  13. package/lib/components/bundle-modules/bundle-modules.js +45 -14
  14. package/lib/components/bundle-modules/bundle-modules.js.map +1 -1
  15. package/lib/components/bundle-modules/bundle-modules.module.css +0 -5
  16. package/lib/components/bundle-packages/bundle-packages.js +45 -6
  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/delta/delta.js +1 -1
  20. package/lib/components/delta/delta.js.map +1 -1
  21. package/lib/components/delta/delta.module.css +10 -1
  22. package/lib/components/index.js +1 -3
  23. package/lib/components/index.js.map +1 -1
  24. package/lib/components/jobs-header/jobs-header.module.css +0 -4
  25. package/lib/components/metrics-display-selector/metrics-display-selector.js +42 -5
  26. package/lib/components/metrics-display-selector/metrics-display-selector.js.map +1 -1
  27. package/lib/components/metrics-display-selector/metrics-display-selector.module.css +15 -7
  28. package/lib/components/metrics-table/metrics-table.i18n.js +1 -6
  29. package/lib/components/metrics-table/metrics-table.i18n.js.map +1 -1
  30. package/lib/components/metrics-table/metrics-table.js +4 -37
  31. package/lib/components/metrics-table/metrics-table.js.map +1 -1
  32. package/lib/components/metrics-table/metrics-table.module.css +1 -44
  33. package/lib/components/{total-size-type-title → metrics-table-header}/index.js +1 -1
  34. package/lib/components/metrics-table-header/index.js.map +1 -0
  35. package/lib/components/metrics-table-header/metrics-table-header.i18n.js +9 -0
  36. package/lib/components/metrics-table-header/metrics-table-header.i18n.js.map +1 -0
  37. package/lib/components/metrics-table-header/metrics-table-header.js +79 -0
  38. package/lib/components/metrics-table-header/metrics-table-header.js.map +1 -0
  39. package/lib/components/metrics-table-header/metrics-table-header.module.css +51 -0
  40. package/lib/components/metrics-table-options/metrics-table-options.js +2 -2
  41. package/lib/components/metrics-table-options/metrics-table-options.js.map +1 -1
  42. package/lib/components/metrics-table-title/metrics-table-title.js +1 -1
  43. package/lib/components/metrics-table-title/metrics-table-title.js.map +1 -1
  44. package/lib/components/metrics-table-title/metrics-table-title.module.css +4 -4
  45. package/lib/components/metrics-treemap/index.js +4 -0
  46. package/lib/components/metrics-treemap/index.js.map +1 -1
  47. package/lib/components/metrics-treemap/metrics-treemap.constants.js +3 -0
  48. package/lib/components/metrics-treemap/metrics-treemap.constants.js.map +1 -0
  49. package/lib/components/metrics-treemap/metrics-treemap.i18n.js +6 -0
  50. package/lib/components/metrics-treemap/metrics-treemap.i18n.js.map +1 -0
  51. package/lib/components/metrics-treemap/metrics-treemap.js +106 -73
  52. package/lib/components/metrics-treemap/metrics-treemap.js.map +1 -1
  53. package/lib/components/metrics-treemap/metrics-treemap.module.css +156 -51
  54. package/lib/components/metrics-treemap/metrics-treemap.utils.js +109 -0
  55. package/lib/components/metrics-treemap/metrics-treemap.utils.js.map +1 -0
  56. package/lib/components/module-info/module-info.js +1 -2
  57. package/lib/components/module-info/module-info.js.map +1 -1
  58. package/lib/components/run-info/run-info.module.css +7 -7
  59. package/lib/components/sort-button/sort-button.module.css +1 -0
  60. package/lib/css/variables.css +14 -13
  61. package/lib/hooks/metrics-display-type.js +45 -24
  62. package/lib/hooks/metrics-display-type.js.map +1 -1
  63. package/lib/hooks/search-params.js +1 -0
  64. package/lib/hooks/search-params.js.map +1 -1
  65. package/lib/layout/box/box.module.css +4 -2
  66. package/lib/layout/flex-stack/flex-stack.js +3 -4
  67. package/lib/layout/flex-stack/flex-stack.js.map +1 -1
  68. package/lib/layout/flex-stack/flex-stack.module.css +19 -23
  69. package/lib/ui/button/button.js +5 -4
  70. package/lib/ui/button/button.js.map +1 -1
  71. package/lib/ui/button/button.module.css +55 -53
  72. package/lib/ui/dropdown/dropdown.js +10 -40
  73. package/lib/ui/dropdown/dropdown.js.map +1 -1
  74. package/lib/ui/dropdown/index.js.map +1 -1
  75. package/lib/ui/filters/filters.js +33 -35
  76. package/lib/ui/filters/filters.js.map +1 -1
  77. package/lib/ui/filters/filters.module.css +55 -67
  78. package/lib/ui/hover-card/hover-card.js +1 -1
  79. package/lib/ui/hover-card/hover-card.js.map +1 -1
  80. package/lib/ui/icon/icon.js +2 -1
  81. package/lib/ui/icon/icon.js.map +1 -1
  82. package/lib/ui/input-search/input-search.js +1 -1
  83. package/lib/ui/input-search/input-search.js.map +1 -1
  84. package/lib/ui/loader/loader.js +1 -1
  85. package/lib/ui/loader/loader.js.map +1 -1
  86. package/lib/ui/table/table.module.css +30 -0
  87. package/lib/ui/tag/tag.module.css +3 -3
  88. package/lib/ui/toolbar/toolbar.module.css +1 -3
  89. package/lib-esm/app/app.js +4 -8
  90. package/lib-esm/app/app.js.map +1 -1
  91. package/lib-esm/app/app.module.css +2 -2
  92. package/lib-esm/assets/icons.svg +70 -67
  93. package/lib-esm/assets/icons.svg.js +14 -12
  94. package/lib-esm/assets/icons.svg.js.map +1 -1
  95. package/lib-esm/components/bundle-assets/bundle-assets.js +48 -9
  96. package/lib-esm/components/bundle-assets/bundle-assets.js.map +1 -1
  97. package/lib-esm/components/bundle-assets/bundle-assets.module.css +0 -5
  98. package/lib-esm/components/bundle-assets-totals/bundle-assets-totals.js +26 -15
  99. package/lib-esm/components/bundle-assets-totals/bundle-assets-totals.js.map +1 -1
  100. package/lib-esm/components/bundle-modules/bundle-modules.i18n.js +1 -1
  101. package/lib-esm/components/bundle-modules/bundle-modules.js +46 -15
  102. package/lib-esm/components/bundle-modules/bundle-modules.js.map +1 -1
  103. package/lib-esm/components/bundle-modules/bundle-modules.module.css +0 -5
  104. package/lib-esm/components/bundle-packages/bundle-packages.js +46 -7
  105. package/lib-esm/components/bundle-packages/bundle-packages.js.map +1 -1
  106. package/lib-esm/components/bundle-packages/bundle-packages.module.css +0 -5
  107. package/lib-esm/components/delta/delta.js +1 -1
  108. package/lib-esm/components/delta/delta.js.map +1 -1
  109. package/lib-esm/components/delta/delta.module.css +10 -1
  110. package/lib-esm/components/index.js +0 -1
  111. package/lib-esm/components/index.js.map +1 -1
  112. package/lib-esm/components/jobs-header/jobs-header.module.css +0 -4
  113. package/lib-esm/components/metrics-display-selector/metrics-display-selector.js +42 -5
  114. package/lib-esm/components/metrics-display-selector/metrics-display-selector.js.map +1 -1
  115. package/lib-esm/components/metrics-display-selector/metrics-display-selector.module.css +15 -7
  116. package/lib-esm/components/metrics-table/metrics-table.i18n.js +0 -5
  117. package/lib-esm/components/metrics-table/metrics-table.i18n.js.map +1 -1
  118. package/lib-esm/components/metrics-table/metrics-table.js +4 -37
  119. package/lib-esm/components/metrics-table/metrics-table.js.map +1 -1
  120. package/lib-esm/components/metrics-table/metrics-table.module.css +1 -44
  121. package/lib-esm/components/metrics-table-header/index.js +2 -0
  122. package/lib-esm/components/metrics-table-header/index.js.map +1 -0
  123. package/lib-esm/components/metrics-table-header/metrics-table-header.i18n.js +6 -0
  124. package/lib-esm/components/metrics-table-header/metrics-table-header.i18n.js.map +1 -0
  125. package/lib-esm/components/metrics-table-header/metrics-table-header.js +49 -0
  126. package/lib-esm/components/metrics-table-header/metrics-table-header.js.map +1 -0
  127. package/lib-esm/components/metrics-table-header/metrics-table-header.module.css +51 -0
  128. package/lib-esm/components/metrics-table-options/metrics-table-options.js +3 -3
  129. package/lib-esm/components/metrics-table-options/metrics-table-options.js.map +1 -1
  130. package/lib-esm/components/metrics-table-title/metrics-table-title.js +1 -1
  131. package/lib-esm/components/metrics-table-title/metrics-table-title.js.map +1 -1
  132. package/lib-esm/components/metrics-table-title/metrics-table-title.module.css +4 -4
  133. package/lib-esm/components/metrics-treemap/index.js +1 -0
  134. package/lib-esm/components/metrics-treemap/index.js.map +1 -1
  135. package/lib-esm/components/metrics-treemap/metrics-treemap.constants.js +2 -0
  136. package/lib-esm/components/metrics-treemap/metrics-treemap.constants.js.map +1 -0
  137. package/lib-esm/components/metrics-treemap/metrics-treemap.i18n.js +3 -0
  138. package/lib-esm/components/metrics-treemap/metrics-treemap.i18n.js.map +1 -0
  139. package/lib-esm/components/metrics-treemap/metrics-treemap.js +108 -74
  140. package/lib-esm/components/metrics-treemap/metrics-treemap.js.map +1 -1
  141. package/lib-esm/components/metrics-treemap/metrics-treemap.module.css +156 -51
  142. package/lib-esm/components/metrics-treemap/metrics-treemap.utils.js +105 -0
  143. package/lib-esm/components/metrics-treemap/metrics-treemap.utils.js.map +1 -0
  144. package/lib-esm/components/module-info/module-info.js +1 -2
  145. package/lib-esm/components/module-info/module-info.js.map +1 -1
  146. package/lib-esm/components/run-info/run-info.module.css +7 -7
  147. package/lib-esm/components/sort-button/sort-button.module.css +1 -0
  148. package/lib-esm/css/variables.css +14 -13
  149. package/lib-esm/hooks/metrics-display-type.js +46 -24
  150. package/lib-esm/hooks/metrics-display-type.js.map +1 -1
  151. package/lib-esm/hooks/search-params.js +1 -0
  152. package/lib-esm/hooks/search-params.js.map +1 -1
  153. package/lib-esm/layout/box/box.module.css +4 -2
  154. package/lib-esm/layout/flex-stack/flex-stack.js +3 -4
  155. package/lib-esm/layout/flex-stack/flex-stack.js.map +1 -1
  156. package/lib-esm/layout/flex-stack/flex-stack.module.css +19 -23
  157. package/lib-esm/ui/button/button.js +5 -4
  158. package/lib-esm/ui/button/button.js.map +1 -1
  159. package/lib-esm/ui/button/button.module.css +55 -53
  160. package/lib-esm/ui/dropdown/dropdown.js +8 -39
  161. package/lib-esm/ui/dropdown/dropdown.js.map +1 -1
  162. package/lib-esm/ui/dropdown/index.js.map +1 -1
  163. package/lib-esm/ui/filters/filters.js +34 -36
  164. package/lib-esm/ui/filters/filters.js.map +1 -1
  165. package/lib-esm/ui/filters/filters.module.css +55 -67
  166. package/lib-esm/ui/hover-card/hover-card.js +1 -1
  167. package/lib-esm/ui/hover-card/hover-card.js.map +1 -1
  168. package/lib-esm/ui/icon/icon.js +2 -1
  169. package/lib-esm/ui/icon/icon.js.map +1 -1
  170. package/lib-esm/ui/input-search/input-search.js +1 -1
  171. package/lib-esm/ui/input-search/input-search.js.map +1 -1
  172. package/lib-esm/ui/loader/loader.js +1 -1
  173. package/lib-esm/ui/loader/loader.js.map +1 -1
  174. package/lib-esm/ui/table/table.module.css +30 -0
  175. package/lib-esm/ui/tag/tag.module.css +3 -3
  176. package/lib-esm/ui/toolbar/toolbar.module.css +1 -3
  177. package/package.json +10 -10
  178. package/src/app/app.jsx +4 -12
  179. package/src/app/app.module.css +2 -2
  180. package/src/assets/icons/check.svg +4 -0
  181. package/src/assets/icons.svg +70 -67
  182. package/src/assets/icons.svg.jsx +12 -12
  183. package/src/components/bundle-assets/bundle-assets.jsx +85 -12
  184. package/src/components/bundle-assets/bundle-assets.module.css +0 -5
  185. package/src/components/bundle-assets-totals/bundle-assets-totals.jsx +71 -35
  186. package/src/components/bundle-modules/bundle-modules.i18n.ts +1 -1
  187. package/src/components/bundle-modules/bundle-modules.module.css +0 -5
  188. package/src/components/bundle-modules/bundle-modules.tsx +123 -45
  189. package/src/components/bundle-packages/bundle-packages.jsx +79 -10
  190. package/src/components/bundle-packages/bundle-packages.module.css +0 -5
  191. package/src/components/delta/delta.jsx +1 -1
  192. package/src/components/delta/delta.module.css +10 -1
  193. package/src/components/index.js +0 -1
  194. package/src/components/jobs-header/jobs-header.module.css +0 -4
  195. package/src/components/metrics-display-selector/metrics-display-selector.module.css +15 -7
  196. package/src/components/metrics-display-selector/metrics-display-selector.stories.tsx +33 -0
  197. package/src/components/metrics-display-selector/metrics-display-selector.tsx +86 -28
  198. package/src/components/metrics-table/metrics-table.i18n.ts +0 -7
  199. package/src/components/metrics-table/metrics-table.module.css +1 -44
  200. package/src/components/metrics-table/metrics-table.tsx +17 -153
  201. package/src/components/metrics-table-header/index.ts +1 -0
  202. package/src/components/metrics-table-header/metrics-table-header.i18n.ts +6 -0
  203. package/src/components/metrics-table-header/metrics-table-header.module.css +51 -0
  204. package/src/components/metrics-table-header/metrics-table-header.tsx +172 -0
  205. package/src/components/metrics-table-options/metrics-table-options.jsx +4 -10
  206. package/src/components/metrics-table-title/metrics-table-title.jsx +1 -1
  207. package/src/components/metrics-table-title/metrics-table-title.module.css +4 -4
  208. package/src/components/metrics-treemap/__tests__/metrics-treemap.utils.ts +188 -0
  209. package/src/components/metrics-treemap/index.ts +1 -0
  210. package/src/components/metrics-treemap/metrics-treemap.constants.ts +52 -0
  211. package/src/components/metrics-treemap/metrics-treemap.i18n.ts +2 -0
  212. package/src/components/metrics-treemap/metrics-treemap.module.css +156 -51
  213. package/src/components/metrics-treemap/metrics-treemap.stories.tsx +44 -10
  214. package/src/components/metrics-treemap/metrics-treemap.tsx +349 -145
  215. package/src/components/metrics-treemap/metrics-treemap.utils.ts +162 -0
  216. package/src/components/module-info/module-info.tsx +1 -1
  217. package/src/components/run-info/run-info.module.css +7 -7
  218. package/src/components/sort-button/sort-button.module.css +1 -0
  219. package/src/css/variables.css +14 -13
  220. package/src/hooks/metrics-display-type.ts +79 -29
  221. package/src/hooks/search-params.js +1 -0
  222. package/src/layout/box/box.module.css +4 -2
  223. package/src/layout/flex-stack/flex-stack.module.css +19 -23
  224. package/src/layout/flex-stack/flex-stack.tsx +2 -8
  225. package/src/ui/button/button.module.css +55 -53
  226. package/src/ui/button/button.stories.tsx +16 -9
  227. package/src/ui/button/button.tsx +8 -7
  228. package/src/ui/dropdown/dropdown.stories.tsx +25 -0
  229. package/src/ui/dropdown/dropdown.tsx +66 -0
  230. package/src/ui/filters/filters.module.css +55 -67
  231. package/src/ui/filters/filters.stories.tsx +109 -0
  232. package/src/ui/filters/filters.tsx +128 -167
  233. package/src/ui/hover-card/hover-card.tsx +1 -1
  234. package/src/ui/icon/icon.tsx +2 -1
  235. package/src/ui/input-search/input-search.tsx +1 -0
  236. package/src/ui/loader/loader.jsx +1 -1
  237. package/src/ui/table/table.module.css +30 -0
  238. package/src/ui/tag/tag.module.css +3 -3
  239. package/src/ui/toolbar/toolbar.module.css +1 -3
  240. package/types/components/bundle-assets-totals/bundle-assets-totals.d.ts +5 -1
  241. package/types/components/bundle-modules/bundle-modules.i18n.d.ts +1 -1
  242. package/types/components/delta/delta.d.ts +2 -2
  243. package/types/components/index.d.ts +0 -1
  244. package/types/components/metrics-display-selector/metrics-display-selector.d.ts +5 -3
  245. package/types/components/metrics-table/metrics-table.d.ts +4 -10
  246. package/types/components/metrics-table/metrics-table.i18n.d.ts +0 -5
  247. package/types/components/metrics-table-header/index.d.ts +1 -0
  248. package/types/components/metrics-table-header/metrics-table-header.d.ts +15 -0
  249. package/types/components/metrics-table-header/metrics-table-header.i18n.d.ts +5 -0
  250. package/types/components/metrics-treemap/index.d.ts +1 -0
  251. package/types/components/metrics-treemap/metrics-treemap.constants.d.ts +20 -0
  252. package/types/components/metrics-treemap/metrics-treemap.d.ts +7 -5
  253. package/types/components/metrics-treemap/metrics-treemap.i18n.d.ts +2 -0
  254. package/types/components/metrics-treemap/metrics-treemap.utils.d.ts +5 -0
  255. package/types/hooks/metrics-display-type.d.ts +8 -2
  256. package/types/ui/dropdown/dropdown.d.ts +12 -47
  257. package/types/ui/dropdown/index.d.ts +1 -1
  258. package/types/ui/filters/filters.d.ts +2 -7
  259. package/types/ui/icon/icon.d.ts +4 -2
  260. package/types/ui/loader/loader.d.ts +2 -2
  261. package/lib/components/bundle-assets-totals/bundle-assets-totals.module.css +0 -7
  262. package/lib/components/total-size-type-title/index.js.map +0 -1
  263. package/lib/components/total-size-type-title/total-size-type-title.js +0 -32
  264. package/lib/components/total-size-type-title/total-size-type-title.js.map +0 -1
  265. package/lib/components/total-size-type-title/total-size-type-title.module.css +0 -14
  266. package/lib-esm/components/bundle-assets-totals/bundle-assets-totals.module.css +0 -7
  267. package/lib-esm/components/total-size-type-title/index.js +0 -2
  268. package/lib-esm/components/total-size-type-title/index.js.map +0 -1
  269. package/lib-esm/components/total-size-type-title/total-size-type-title.js +0 -25
  270. package/lib-esm/components/total-size-type-title/total-size-type-title.js.map +0 -1
  271. package/lib-esm/components/total-size-type-title/total-size-type-title.module.css +0 -14
  272. package/src/components/bundle-assets-totals/bundle-assets-totals.module.css +0 -7
  273. package/src/components/total-size-type-title/index.js +0 -1
  274. package/src/components/total-size-type-title/total-size-type-title.jsx +0 -41
  275. package/src/components/total-size-type-title/total-size-type-title.module.css +0 -14
  276. package/src/ui/dropdown/dropdown.jsx +0 -88
  277. package/types/components/total-size-type-title/index.d.ts +0 -1
  278. package/types/components/total-size-type-title/total-size-type-title.d.ts +0 -14
  279. /package/src/ui/dropdown/{index.js → index.ts} +0 -0
@@ -0,0 +1,33 @@
1
+ import { action } from '@storybook/addon-actions'; // eslint-disable-line
2
+ import { Meta, StoryObj } from '@storybook/react';
3
+
4
+ import { MetricsDisplayType } from '../../constants';
5
+ import { MetricsDisplaySelector } from '.';
6
+
7
+ const meta: Meta<typeof MetricsDisplaySelector> = {
8
+ title: 'Components/MetricsDisplaySelector',
9
+ component: MetricsDisplaySelector,
10
+ args: {
11
+ onSelect: action('SELECT'),
12
+ },
13
+ } as Meta;
14
+
15
+ export default meta;
16
+
17
+ type Story = StoryObj<typeof meta>;
18
+
19
+ export const Default: Story = {
20
+ args: {
21
+ value: MetricsDisplayType.TABLE,
22
+ },
23
+ };
24
+
25
+ export const TreemapGroups: Story = {
26
+ args: {
27
+ value: MetricsDisplayType.TREEMAP,
28
+ groupBy: '',
29
+ groups: {
30
+ [MetricsDisplayType.TREEMAP]: ['folder'],
31
+ },
32
+ },
33
+ };
@@ -2,46 +2,104 @@ 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
+ import { Dropdown, DropdownItem } from '../../ui/dropdown';
7
8
  import { Icon } from '../../ui/icon';
8
9
  import css from './metrics-display-selector.module.css';
10
+ import { FlexStack } from '../../layout';
11
+
12
+ const DEFAULT_GROUP_BY = '';
13
+
14
+ const METRICS_DISPLAY_MAP = {
15
+ [MetricsDisplayType.TABLE]: {
16
+ glyph: Icon.ICONS.TABLE,
17
+ label: 'Table',
18
+ },
19
+ [MetricsDisplayType.TREEMAP]: {
20
+ glyph: Icon.ICONS.TREEMAP,
21
+ label: 'Treemap',
22
+ },
23
+ };
24
+
25
+ const displayTypes = Object.values(MetricsDisplayType);
9
26
 
10
27
  interface MetricsDisplaySelectorProps {
11
28
  value: MetricsDisplayType;
12
- onSelect: (newValue: MetricsDisplayType) => void;
29
+ groupBy?: string;
30
+ groups?: Partial<Record<MetricsDisplayType, Array<string>>>;
31
+ onSelect: (newValue: MetricsDisplayType, groupBy?: string) => void;
13
32
  }
14
33
 
15
34
  export const MetricsDisplaySelector = (
16
35
  props: MetricsDisplaySelectorProps &
17
- Omit<React.ComponentProps<typeof FlexStack>, 'onSelect' | 'value'>,
36
+ Omit<React.ComponentProps<typeof ControlGroup>, 'onSelect' | 'value'>,
18
37
  ) => {
19
- const { className = '', value, onSelect, ...restProps } = props;
38
+ const { value, groupBy = DEFAULT_GROUP_BY, groups = {}, onSelect, ...restProps } = props;
20
39
 
21
40
  return (
22
- <FlexStack space="xxsmall" as="nav" className={cx(css.root, className)} {...restProps}>
23
- <Button
24
- outline
25
- active={value === MetricsDisplayType.TABLE}
26
- size="small"
27
- type="button"
28
- glyph={Icon.ICONS.TABLE}
29
- onClick={() => onSelect(MetricsDisplayType.TABLE)}
30
- className={css.button}
31
- >
32
- Table
33
- </Button>
34
- <Button
35
- outline
36
- active={value === MetricsDisplayType.TREEMAP}
37
- size="small"
38
- type="button"
39
- glyph={Icon.ICONS.TREEMAP}
40
- onClick={() => onSelect(MetricsDisplayType.TREEMAP)}
41
- className={cx(css.button)}
42
- >
43
- Treemap
44
- </Button>
45
- </FlexStack>
41
+ <ControlGroup {...restProps}>
42
+ {displayTypes.map((displayType, index) => {
43
+ const displayGroups = groups?.[displayType];
44
+ const displayProps = METRICS_DISPLAY_MAP[displayType];
45
+ const isLast = displayTypes.length - 1 === index;
46
+ const isActive = displayType === value;
47
+
48
+ if (!displayGroups || displayGroups.length === 0) {
49
+ return (
50
+ <Button
51
+ outline
52
+ active={isActive}
53
+ size="small"
54
+ type="button"
55
+ glyph={displayProps.glyph}
56
+ onClick={() => onSelect(displayType)}
57
+ className={isLast && css.itemLast}
58
+ key={displayType}
59
+ >
60
+ {displayProps.label}
61
+ </Button>
62
+ );
63
+ }
64
+
65
+ const displayGroupsData = [
66
+ {
67
+ value: DEFAULT_GROUP_BY,
68
+ label: 'No groups',
69
+ },
70
+ ...displayGroups.map((displayGroup) => ({
71
+ value: displayGroup,
72
+ label: `Group by ${displayGroup}`,
73
+ })),
74
+ ];
75
+
76
+ return (
77
+ <Dropdown
78
+ glyph={displayProps.glyph}
79
+ label={displayProps.label}
80
+ className={cx(isLast && css.itemLast, isActive && css.buttonActive)}
81
+ key={displayType}
82
+ >
83
+ {displayGroupsData.map((displayGroupData) => {
84
+ const isGroupActive = isActive && displayGroupData.value === groupBy;
85
+
86
+ return (
87
+ <DropdownItem
88
+ onClick={() => onSelect(displayType, displayGroupData.value)}
89
+ isActive={isGroupActive}
90
+ className={cx(css.dropdownItem, isGroupActive && css.dropdownItemActive)}
91
+ key={displayGroupData.value}
92
+ >
93
+ <FlexStack space="xxxsmall" alignItems="center">
94
+ <Icon glyph={Icon.ICONS.CHECK} size="small" className={css.dropdownItemIcon} />
95
+ <span>{displayGroupData.label}</span>
96
+ </FlexStack>
97
+ </DropdownItem>
98
+ );
99
+ })}
100
+ </Dropdown>
101
+ );
102
+ })}
103
+ </ControlGroup>
46
104
  );
47
105
  };
@@ -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';
@@ -0,0 +1,51 @@
1
+ /* columns */
2
+ .root .col {
3
+ padding-top: var(--space-xxsmall);
4
+ padding-bottom: var(--space-xxsmall);
5
+ }
6
+
7
+ .root .metric {
8
+ width: 55%;
9
+ vertical-align: middle;
10
+ }
11
+
12
+ .root .job {
13
+ padding-top: var(--space-xxsmall);
14
+ text-align: right;
15
+ }
16
+
17
+ .root .value {
18
+ text-align: right;
19
+ vertical-align: baseline;
20
+ width: 15%;
21
+ }
22
+
23
+ .root .delta {
24
+ text-align: right;
25
+ font-size: var(--size-xsmall);
26
+ vertical-align: baseline;
27
+ width: 10%;
28
+ color: pink;
29
+ }
30
+
31
+ .root .deltaPercentage {
32
+ width: 5%;
33
+ }
34
+
35
+ .jobName {
36
+ white-space: nowrap;
37
+ }
38
+
39
+ /* columns overrides for showHeaderSum */
40
+ .showHeaderSum .job {
41
+ border-bottom: 0;
42
+ padding-bottom: 0;
43
+ }
44
+
45
+ .showHeaderSum .sum {
46
+ padding-top: 0;
47
+ font-size: var(--size-small);
48
+ vertical-align: middle;
49
+ text-transform: none;
50
+ }
51
+
@@ -0,0 +1,172 @@
1
+ import React from 'react';
2
+ import cx from 'classnames';
3
+ import sum from 'lodash/sum';
4
+ import {
5
+ METRIC_TYPE_CONFIGS,
6
+ MetricTypes,
7
+ type ReportMetricRow,
8
+ getMetricRunInfo,
9
+ } from '@bundle-stats/utils';
10
+
11
+ import { Table } from '../../ui/table';
12
+ import { Delta } from '../delta';
13
+ import { JobName } from '../job-name';
14
+ import { Metric } from '../metric';
15
+ import { SortButton } from '../sort-button';
16
+ import * as I18N from './metrics-table-header.i18n';
17
+ import css from './metrics-table-header.module.css';
18
+
19
+ const METRIC_TYPE = METRIC_TYPE_CONFIGS[MetricTypes.FileSize];
20
+ const BASELINE_COLUMN_SPAN = 1;
21
+ const CURRENT_COLUMN_SPAN = 3;
22
+
23
+ interface JobColumnProps {
24
+ job: { label: string; internalBuildNumber: number };
25
+ isBaseline: boolean;
26
+ }
27
+
28
+ const JobColumn = ({ job, isBaseline }: JobColumnProps) => {
29
+ const colSpan = isBaseline ? BASELINE_COLUMN_SPAN : CURRENT_COLUMN_SPAN;
30
+ const { label, internalBuildNumber } = job;
31
+
32
+ if (!job) {
33
+ return <Table.Th colSpan={colSpan}>-</Table.Th>;
34
+ }
35
+
36
+ return (
37
+ <Table.Th className={cx(css.col, css.job)} colSpan={colSpan}>
38
+ <JobName
39
+ title={isBaseline ? I18N.BASELINE_TITLE : I18N.CURRENT_TITLE}
40
+ internalBuildNumber={internalBuildNumber}
41
+ className={css.jobName}
42
+ >
43
+ {label}
44
+ </JobName>
45
+ </Table.Th>
46
+ );
47
+ };
48
+
49
+ const getRowsRunTotal = (rows: Array<ReportMetricRow>, runIndex: number): number =>
50
+ sum(rows.map((row) => row?.runs?.[runIndex]?.value || 0));
51
+
52
+ interface ColumnSumProps {
53
+ rows: Array<ReportMetricRow>;
54
+ isBaseline: boolean;
55
+ runIndex: number;
56
+ sort?: any;
57
+ updateSort?: (val: any) => void;
58
+ }
59
+
60
+ const SumColumn = ({ rows, isBaseline, runIndex, updateSort, sort }: ColumnSumProps) => {
61
+ const currentRunTotal = getRowsRunTotal(rows, runIndex);
62
+ const baselineRunTotal = !isBaseline ? getRowsRunTotal(rows, runIndex + 1) : 0;
63
+ const total = getMetricRunInfo(METRIC_TYPE, currentRunTotal, baselineRunTotal);
64
+ const fieldPath = `runs[${runIndex}]`;
65
+
66
+ return (
67
+ <>
68
+ <Table.Th className={cx(css.col, css.value, css.sum)}>
69
+ <SortButton
70
+ fieldPath={fieldPath}
71
+ fieldName="value"
72
+ label={I18N.SORT_VALUE}
73
+ updateSort={updateSort}
74
+ sort={sort}
75
+ >
76
+ <Metric value={total.displayValue} />
77
+ </SortButton>
78
+ </Table.Th>
79
+ {!isBaseline && (
80
+ <>
81
+ <Table.Th className={cx(css.col, css.delta, css.sum)}>
82
+ <SortButton
83
+ fieldPath={fieldPath}
84
+ fieldName="delta"
85
+ label={I18N.SORT_CHANGE}
86
+ updateSort={updateSort}
87
+ sort={sort}
88
+ >
89
+ {'delta' in total && (
90
+ <Delta displayValue={total.displayDelta} deltaType={total.deltaType} />
91
+ )}
92
+ </SortButton>
93
+ </Table.Th>
94
+ <Table.Th className={cx(css.col, css.delta, css.deltaPercentage, css.sum)}>
95
+ <SortButton
96
+ fieldPath={fieldPath}
97
+ fieldName="deltaPercentage"
98
+ label={I18N.SORT_PERCENTUAL_CHANGE}
99
+ updateSort={updateSort}
100
+ sort={sort}
101
+ >
102
+ {'delta' in total && (
103
+ <Delta displayValue={total.displayDeltaPercentage} deltaType={total.deltaType} />
104
+ )}
105
+ </SortButton>
106
+ </Table.Th>
107
+ </>
108
+ )}
109
+ </>
110
+ );
111
+ };
112
+
113
+ interface MetricsTableHeaderProps {
114
+ /**
115
+ * Metric column title
116
+ */
117
+ metricTitle?: React.ReactNode;
118
+ /**
119
+ * Show column sum flag
120
+ */
121
+ showSum?: boolean;
122
+ /**
123
+ * Array of jobs
124
+ */
125
+ jobs: Array<{ label: string; internalBuildNumber: number }>;
126
+ /**
127
+ * Report rows
128
+ */
129
+ rows: Array<ReportMetricRow>;
130
+ /**
131
+ * Sort field data
132
+ */
133
+ sort?: any;
134
+ /**
135
+ * Update sort field
136
+ */
137
+ updateSort?: (val: any) => void;
138
+ }
139
+
140
+ export const MetricsTableHeader = (
141
+ props: MetricsTableHeaderProps & React.ComponentProps<'thead'>,
142
+ ) => {
143
+ const { className = '', metricTitle = '', showSum = false, jobs, rows, sort, updateSort } = props;
144
+
145
+ const rootClassName = cx(css.root, showSum && css.showHeaderSum, className);
146
+
147
+ return (
148
+ <Table.THead className={rootClassName}>
149
+ <Table.Tr>
150
+ <Table.Th className={cx(css.col, css.metric)} rowSpan={showSum ? 2 : 1}>
151
+ {metricTitle || ' '}
152
+ </Table.Th>
153
+ {jobs.map((job, runIndex) => (
154
+ <JobColumn job={job} isBaseline={runIndex === jobs.length - 1} />
155
+ ))}
156
+ </Table.Tr>
157
+ {showSum && (
158
+ <Table.Tr>
159
+ {jobs.map((_, runIndex) => (
160
+ <SumColumn
161
+ rows={rows}
162
+ isBaseline={runIndex === jobs.length - 1}
163
+ runIndex={runIndex}
164
+ updateSort={updateSort}
165
+ sort={sort}
166
+ />
167
+ ))}
168
+ </Table.Tr>
169
+ )}
170
+ </Table.THead>
171
+ );
172
+ };