@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
@@ -1,18 +1,19 @@
1
- /* Checkbox + label + button */
2
- .filter {
3
- /* Update MenuItem padding */
4
- padding-top: calc(var(--space-xxxsmall) / 2);
5
- padding-bottom: calc(var(--space-xxxsmall) / 2);
1
+ /* explicit ControlGroup last item styles to override ariakit injected sibling nodes */
2
+ .itemLast {
3
+ border-top-right-radius: var(--radius-small) !important;
4
+ border-bottom-right-radius: var(--radius-small) !important;
5
+ }
6
6
 
7
+ /* Filter (label with input + text) */
8
+ .filter {
7
9
  position: relative;
8
10
  width: 100%;
9
11
  max-width: 240px;
12
+ color: var(--color-text);
10
13
  }
11
14
 
12
- .filterCheckbox {
13
- }
14
-
15
- .filterInput {
15
+ .filterControl {
16
+ margin: 0;
16
17
  flex: 0 0 auto;
17
18
  height: 1em;
18
19
  }
@@ -25,7 +26,47 @@
25
26
  text-overflow: ellipsis;
26
27
  }
27
28
 
28
- .filterOnlyButton {
29
+ .filterControl[disabled] + .filterLabel {
30
+ color: var(--color-text-light);
31
+ }
32
+
33
+ .filter:hover {
34
+ color: var(--color-dark);
35
+ }
36
+
37
+ /** Filter single */
38
+ .filterSingle {
39
+ padding: calc(var(--space-xxsmall) - 1px);
40
+ border: 1px solid var(--color-outline);
41
+ border-radius: var(--radius-small);
42
+ font-size: var(--size-small);
43
+ line-height: var(--space-small);
44
+ color: var(--color-text-ultra-light);
45
+ transition: var(--transition-out);
46
+ }
47
+
48
+ .filterSingle:hover,
49
+ .filterSingle:active,
50
+ .filterSingle:focus {
51
+ border-color: var(--color-outline-dark);
52
+ transition: var(--transition-in);
53
+ }
54
+
55
+ /** Filter group */
56
+ .filterGroupItems {
57
+ max-height: calc(10 * (var(--space-small) + 2 * var(--space-xxxsmall)));
58
+ overflow: auto;
59
+ }
60
+
61
+ .filterGroupItem {
62
+ position: relative;
63
+ }
64
+
65
+ .filterGroupItemFilter {
66
+ padding-right: 24px; /* space for only button */
67
+ }
68
+
69
+ .filterGroupOnlyButton {
29
70
  display: none;
30
71
  position: absolute;
31
72
  right: 2px;
@@ -37,10 +78,11 @@
37
78
  }
38
79
 
39
80
  /** cover item text */
40
- .filterOnlyButton::before {
81
+ .filterGroupOnlyButton::before {
41
82
  content: ' ';
42
83
  display: block;
43
84
  position: absolute;
85
+ pointer-events: none;
44
86
  top: 0;
45
87
  right: 100%;
46
88
  bottom: 0;
@@ -48,53 +90,13 @@
48
90
  background: linear-gradient(90deg, rgba(255, 255, 255, 0), var(--color-highlight) 75%);
49
91
  }
50
92
 
51
- /** filter disabled state */
52
- .filterInput[disabled] + .filterLabel {
53
- color: var(--color-text-light);
54
- }
55
-
56
- .filterInput[disabled] + .filterOnlyButton {
57
- display: none;
58
- }
59
-
60
93
  /** filter hover state */
61
- .filter {
62
- color: var(--color-text);
63
- }
64
-
65
- .filter:hover {
66
- color: var(--color-dark);
67
- }
68
-
69
- .filter:hover .filterOnlyButton {
94
+ .filterGroupItem:hover .filterGroupOnlyButton {
70
95
  display: block;
71
96
  }
72
97
 
73
- /** Filter standard variation */
74
- .filterStandalone {
75
- padding: 0;
76
- width: auto;
77
- color: var(--color-text-light);
78
- z-index: var(--layout-xlow); /* show collapsed border */
79
- font-size: var(--size-small);
80
- line-height: var(--space-small);
81
- }
82
-
83
- .filterStandalone .filterCheckbox {
84
- padding: calc(var(--space-xxsmall) - 1px) calc(var(--space-xxsmall) - 1px);
85
- border: 1px solid var(--color-outline);
86
- }
87
-
88
- .filterStandalone:hover .filterCheckbox,
89
- .filterStandalone:active .filterCheckbox,
90
- .filterStandalone:focus .filterCheckbox {
91
- z-index: var(--layout-xlow); /* show collapsed border */
92
- box-shadow: var(--outline-hover);
93
- color: var(--color-text);
94
- }
95
-
96
98
  /** Filter group variation */
97
- .labelSuffixCustom {
99
+ .filterGroupLabelSuffixCustom {
98
100
  color: var(--color-text);
99
101
  text-transform: lowercase;
100
102
  }
@@ -112,11 +114,6 @@
112
114
  color: var(--color-text-light);
113
115
  }
114
116
 
115
- .filterGroupItems {
116
- max-height: calc(10 * (var(--space-small) + 2 * var(--space-xxxsmall)));
117
- overflow: auto;
118
- }
119
-
120
117
  .filterGroupActions {
121
118
  margin-top: var(--space-xxxsmall);
122
119
  padding-top: var(--space-xxxsmall);
@@ -124,12 +121,3 @@
124
121
  margin-bottom: calc(0px - var(--space-xxxsmall));
125
122
  border-top: 1px solid var(--color-outline);
126
123
  }
127
-
128
- .item {
129
- position: relative;
130
- flex: 0 0 auto;
131
- }
132
-
133
- .itemButton {
134
- border-radius: var(--radius-small);
135
- }
@@ -0,0 +1,109 @@
1
+ import React from 'react';
2
+ import { Meta } from '@storybook/react';
3
+ import { action } from '@storybook/addon-actions'; // eslint-disable-line
4
+
5
+ import { getWrapperDecorator } from '../../stories';
6
+ import { Filters } from '.';
7
+
8
+ export default {
9
+ title: 'UI/Filters',
10
+ component: Filters,
11
+ decorators: [getWrapperDecorator({ paddingLeft: '200px' })],
12
+ } as Meta;
13
+
14
+ export const Default = () => (
15
+ <Filters
16
+ onChange={action('CHANGE')}
17
+ filters={{
18
+ changed: {
19
+ label: 'Changed',
20
+ defaultValue: true,
21
+ },
22
+ fileTypes: {
23
+ label: 'File types',
24
+ children: [
25
+ {
26
+ key: 'CSS',
27
+ label: 'CSS',
28
+ defaultValue: true,
29
+ },
30
+ {
31
+ key: 'JS',
32
+ label: 'JS',
33
+ defaultValue: true,
34
+ },
35
+ {
36
+ key: 'HTML',
37
+ label: 'HTML',
38
+ defaultValue: true,
39
+ },
40
+ {
41
+ key: 'OTHER',
42
+ label: 'Asset that is not CSS, JS or HTML',
43
+ defaultValue: true,
44
+ },
45
+ ],
46
+ },
47
+ }}
48
+ />
49
+ );
50
+
51
+ export const Overflow = () => (
52
+ <Filters
53
+ onChange={action('CHANGE')}
54
+ filters={{
55
+ changed: {
56
+ label: 'Changed',
57
+ defaultValue: true,
58
+ },
59
+ chunks: {
60
+ label: 'Chunks',
61
+ children: Array(22)
62
+ .fill('')
63
+ .map((_, currentIndex) => ({
64
+ key: `chunk-${currentIndex}`,
65
+ label: `Chunk ${currentIndex + 1}`,
66
+ defaultValue: true,
67
+ })),
68
+ },
69
+ }}
70
+ />
71
+ );
72
+
73
+ export const DisableOptions = () => (
74
+ <Filters
75
+ onChange={action('CHANGE')}
76
+ filters={{
77
+ changed: {
78
+ label: 'Changed',
79
+ defaultValue: false,
80
+ disabled: true,
81
+ },
82
+ entrypoint: {
83
+ label: 'Entrypoint',
84
+ defaultValue: false,
85
+ },
86
+ fileTypes: {
87
+ label: 'File types',
88
+ children: [
89
+ {
90
+ key: 'CSS',
91
+ label: 'CSS',
92
+ defaultValue: true,
93
+ },
94
+ {
95
+ key: 'JS',
96
+ label: 'JS',
97
+ defaultValue: true,
98
+ disabled: true,
99
+ },
100
+ {
101
+ key: 'HTML',
102
+ label: 'HTML',
103
+ defaultValue: true,
104
+ },
105
+ ],
106
+ },
107
+ }}
108
+ />
109
+ );
@@ -5,90 +5,55 @@ import type { FilterFieldsData, FilterGroupFieldData } from '../../types';
5
5
  import { FlexStack } from '../../layout/flex-stack';
6
6
  import { Stack } from '../../layout/stack';
7
7
  import { Button } from '../button';
8
- import { Dropdown } from '../dropdown';
8
+ import { ControlGroup } from '../control-group';
9
+ import { Dropdown, DropdownItem } from '../dropdown';
9
10
  import { InputSearch } from '../input-search';
10
11
  import * as I18N from './filters.i18n';
11
12
  import { getGroupFiltersLabelSuffix, LABELS } from './filters.utils';
12
13
  import css from './filters.module.css';
13
14
 
14
- interface FilterProps extends React.ComponentProps<'input'> {
15
- as?: React.ElementType;
16
- buttonClassName?: string;
15
+ interface FilterBooleanProps extends React.ComponentProps<'input'> {
17
16
  label: string;
18
- name: string;
19
- getOnOnlyClick?: (name: string) => () => void;
20
17
  }
21
18
 
22
- const Filter = (props: FilterProps) => {
23
- const {
24
- className = '',
25
- as: Component = 'div',
26
- buttonClassName = '',
27
- label,
28
- name,
29
- getOnOnlyClick,
30
- ...inputProps
31
- } = props;
32
-
33
- const id = `filter-${name}`;
34
- const rootClassName = cx(css.filter, className);
19
+ const Filter = (props: FilterBooleanProps) => {
20
+ const { className = '', label, name, ...inputProps } = props;
35
21
 
36
22
  return (
37
- <Component className={rootClassName}>
38
- {/* eslint-disable */}
39
- <FlexStack
40
- space="xxxsmall"
41
- alignItems="center"
42
- as="label"
43
- className={cx(css.filterCheckbox, buttonClassName)}
44
- >
45
- {/* eslint-enabled */}
46
- <input type="checkbox" id={id} name={name} {...inputProps} className={css.filterInput} />
47
- <span title={label} className={css.filterLabel}>
48
- {label}
49
- </span>
50
- </FlexStack>
51
-
52
- {getOnOnlyClick && (
53
- <Button
54
- kind="info"
55
- solid
56
- size="small"
57
- type="button"
58
- onClick={getOnOnlyClick(name)}
59
- className={css.filterOnlyButton}
60
- >
61
- {I18N.ONLY}
62
- </Button>
63
- )}
64
- </Component>
23
+ <FlexStack
24
+ space="xxxsmall"
25
+ alignItems="center"
26
+ as="label"
27
+ className={cx(css.filter, className)}
28
+ >
29
+ <input
30
+ type="checkbox"
31
+ id={`filter-${name}`}
32
+ name={name}
33
+ {...inputProps}
34
+ className={css.filterControl}
35
+ />
36
+ <span title={label} className={css.filterLabel}>
37
+ {label}
38
+ </span>
39
+ </FlexStack>
65
40
  );
66
41
  };
67
42
 
68
43
  interface FilterGroupProps extends React.ComponentProps<'div'> {
69
- buttonClassName?: string;
70
44
  groupKey: string;
71
45
  data: FilterGroupFieldData;
72
46
  values: Record<string, boolean>;
73
- onCheckboxChange: FilterProps['onChange'];
47
+ onCheckboxChange: FilterBooleanProps['onChange'];
74
48
  toggleFilters: (newFilters: Record<string, boolean>) => void;
75
49
  }
76
50
 
77
51
  const FilterGroup = (props: FilterGroupProps) => {
78
- const {
79
- className = '',
80
- buttonClassName = '',
81
- groupKey,
82
- data,
83
- values,
84
- onCheckboxChange,
85
- toggleFilters,
86
- } = props;
52
+ const { className = '', groupKey, data, values, onCheckboxChange, toggleFilters } = props;
53
+ const { label: groupLabel, children: groupItems } = data;
87
54
 
88
55
  const [search, setSearch] = useState('');
89
56
 
90
- const { label: groupLabel, children: groupItems } = data;
91
-
92
57
  const areAllGroupItemsChecked = groupItems
93
58
  .map(({ key: itemKey }) => values?.[`${groupKey}.${itemKey}`])
94
59
  .reduce((agg, val) => agg && val, true);
@@ -99,7 +64,9 @@ const FilterGroup = (props: FilterGroupProps) => {
99
64
  <>
100
65
  {`${groupLabel}:`}
101
66
  &nbsp;
102
- <span className={cx(hasCustomFilterSuffix && css.labelSuffixCustom)}>{filterSuffix}</span>
67
+ <span className={cx(hasCustomFilterSuffix && css.filterGroupLabelSuffixCustom)}>
68
+ {filterSuffix}
69
+ </span>
103
70
  </>
104
71
  );
105
72
 
@@ -131,87 +98,78 @@ const FilterGroup = (props: FilterGroupProps) => {
131
98
  return (
132
99
  <Dropdown
133
100
  className={className}
134
- buttonClassName={buttonClassName}
135
101
  label={dropdownLabel}
136
102
  ariaLabel={`${groupLabel}: ${filterSuffix}`}
137
103
  >
138
- {({ MenuItem, menuItemClassName }) => {
139
- return (
140
- <>
141
- {groupItems.length > 10 && (
142
- <div className={css.filterGroupSearchWrapper}>
143
- <InputSearch
144
- defaultValue={search}
145
- onChange={setSearch}
146
- placeholder={I18N.GROUP_SEARCH}
147
- debounceWait={0}
148
- />
149
- </div>
150
- )}
151
- <div className={css.filterGroupItems}>
152
- {filteredGroupItems.length === 0 && (
153
- <Stack className={css.filterGroupSearchNotFound}>
154
- <p>{I18N.GROUP_NOT_FOUND}</p>
155
- <div>
156
- <Button
157
- size="small"
158
- kind="primary"
159
- type="button"
160
- onClick={() => setSearch('')}
161
- className={css.filterGroupSearchNotFoundClear}
162
- >
163
- {I18N.GROUP_SEARCH_CLEAR}
164
- </Button>
165
- </div>
166
- </Stack>
167
- )}
168
- {filteredGroupItems.map(({ key: itemKey, ...itemData }) => {
169
- const id = [groupKey, itemKey].join('.');
170
- const getOnOnlyClick = () => getOnGroupCheck(false, { [id]: true });
171
-
172
- return (
173
- <Filter
174
- key={id}
175
- className={menuItemClassName}
176
- as={MenuItem}
177
- name={id}
178
- label={itemData.label}
179
- onChange={onCheckboxChange}
180
- checked={values[id]}
181
- disabled={itemData.disabled}
182
- getOnOnlyClick={getOnOnlyClick}
183
- />
184
- );
185
- })}
104
+ {groupItems.length > 10 && (
105
+ <div className={css.filterGroupSearchWrapper}>
106
+ <InputSearch
107
+ defaultValue={search}
108
+ onChange={setSearch}
109
+ placeholder={I18N.GROUP_SEARCH}
110
+ debounceWait={0}
111
+ />
112
+ </div>
113
+ )}
114
+ <div className={css.filterGroupItems}>
115
+ {filteredGroupItems.length === 0 && (
116
+ <Stack className={css.filterGroupSearchNotFound}>
117
+ <p>{I18N.GROUP_NOT_FOUND}</p>
118
+ <div>
119
+ <Button
120
+ size="small"
121
+ kind="primary"
122
+ type="button"
123
+ onClick={() => setSearch('')}
124
+ className={css.filterGroupSearchNotFoundClear}
125
+ >
126
+ {I18N.GROUP_SEARCH_CLEAR}
127
+ </Button>
186
128
  </div>
187
- {filteredGroupItems.length !== 0 && (
188
- <div className={css.filterGroupActions}>
189
- {areAllGroupItemsChecked ? (
190
- <MenuItem
191
- id="clear-all"
192
- as="button"
193
- className={menuItemClassName}
194
- type="button"
195
- onClick={getOnGroupCheck(false)}
196
- >
197
- {I18N.CLEAR}
198
- </MenuItem>
199
- ) : (
200
- <MenuItem
201
- id="clear-all"
202
- as="button"
203
- className={menuItemClassName}
204
- type="button"
205
- onClick={getOnGroupCheck(true)}
206
- >
207
- {I18N.CHECK}
208
- </MenuItem>
209
- )}
210
- </div>
211
- )}
212
- </>
213
- );
214
- }}
129
+ </Stack>
130
+ )}
131
+ {filteredGroupItems.map(({ key: itemKey, ...itemData }) => {
132
+ const id = [groupKey, itemKey].join('.');
133
+ const getOnOnlyClick = () => getOnGroupCheck(false, { [id]: true });
134
+
135
+ return (
136
+ <DropdownItem key={id} className={css.filterGroupItem}>
137
+ <Filter
138
+ label={itemData.label}
139
+ name={id}
140
+ onChange={onCheckboxChange}
141
+ checked={values[id]}
142
+ disabled={itemData.disabled}
143
+ className={css.filterGroupItemFilter}
144
+ />
145
+ <Button
146
+ kind="info"
147
+ solid
148
+ size="small"
149
+ type="button"
150
+ onClick={getOnOnlyClick()}
151
+ disabled={itemData.disabled}
152
+ className={css.filterGroupOnlyButton}
153
+ >
154
+ {I18N.ONLY}
155
+ </Button>
156
+ </DropdownItem>
157
+ );
158
+ })}
159
+ </div>
160
+ {filteredGroupItems.length !== 0 && (
161
+ <div className={css.filterGroupActions}>
162
+ {areAllGroupItemsChecked ? (
163
+ <DropdownItem id="clear-all" onClick={getOnGroupCheck(false)} role="button">
164
+ {I18N.CLEAR}
165
+ </DropdownItem>
166
+ ) : (
167
+ <DropdownItem id="clear-all" onClick={getOnGroupCheck(true)} role="button">
168
+ {I18N.CHECK}
169
+ </DropdownItem>
170
+ )}
171
+ </div>
172
+ )}
215
173
  </Dropdown>
216
174
  );
217
175
  };
@@ -226,6 +184,9 @@ interface FiltersProps extends React.ComponentProps<'div'> {
226
184
  export const Filters = (props: FiltersProps) => {
227
185
  const { className = '', values, filters, toggleFilter, toggleFilters } = props;
228
186
 
187
+ /**
188
+ * Toggle filter value on checkbox change
189
+ */
229
190
  const onCheckboxChange = useCallback(
230
191
  (event: any) => {
231
192
  const { name } = event.target;
@@ -233,41 +194,41 @@ export const Filters = (props: FiltersProps) => {
233
194
  },
234
195
  [toggleFilter, values],
235
196
  );
236
- const rootClassName = cx(css.root, className);
197
+
198
+ const filterList = Object.entries(filters);
199
+ const filterCount = filterList.length;
237
200
 
238
201
  return (
239
- <form className={rootClassName}>
240
- <FlexStack space="xxsmall" alignItems="top" className={css.items}>
241
- {Object.entries(filters).map(([name, data]) => {
242
- if ('defaultValue' in data) {
243
- return (
244
- <Filter
245
- key={name}
246
- className={cx(css.item, css.filterStandalone)}
247
- buttonClassName={css.itemButton}
248
- name={name}
249
- label={data.label}
250
- onChange={onCheckboxChange}
251
- checked={values[name]}
252
- disabled={data.disabled as boolean}
253
- />
254
- );
255
- }
202
+ <ControlGroup className={cx(css.root, className)}>
203
+ {filterList.map(([name, data], index) => {
204
+ const lastItem = index === filterCount - 1;
256
205
 
206
+ if ('defaultValue' in data) {
257
207
  return (
258
- <FilterGroup
259
- className={css.item}
260
- buttonClassName={css.itemButton}
208
+ <Filter
209
+ name={name}
210
+ label={data.label}
211
+ onChange={onCheckboxChange}
212
+ checked={values[name]}
213
+ disabled={data.disabled as boolean}
261
214
  key={name}
262
- groupKey={name}
263
- data={data}
264
- values={values}
265
- onCheckboxChange={onCheckboxChange}
266
- toggleFilters={toggleFilters}
215
+ className={cx(css.filterSingle, lastItem && css.itemLast)}
267
216
  />
268
217
  );
269
- })}
270
- </FlexStack>
271
- </form>
218
+ }
219
+
220
+ return (
221
+ <FilterGroup
222
+ groupKey={name}
223
+ data={data}
224
+ values={values}
225
+ onCheckboxChange={onCheckboxChange}
226
+ toggleFilters={toggleFilters}
227
+ className={cx(lastItem && css.itemLast)}
228
+ key={name}
229
+ />
230
+ );
231
+ })}
232
+ </ControlGroup>
272
233
  );
273
234
  };
@@ -31,7 +31,7 @@ export const HoverCard = (props: HoverCardProps) => {
31
31
  children,
32
32
  } = props;
33
33
 
34
- const state = useHovercardState({ gutter: 8, timeout: 300 });
34
+ const state = useHovercardState({ gutter: 8, timeout: 300, placement: 'top' });
35
35
  const hovercardProps = useHovercard({ state, portal: true });
36
36
 
37
37
  // Fallback to span if no href
@@ -1,6 +1,4 @@
1
- .root {
2
- padding: var(--space-small);
3
- }
1
+ .root { }
4
2
 
5
3
  .content {}
6
4
 
@@ -1,14 +1,16 @@
1
- export function BundleAssetsTotals({ className, jobs, customComponentLink: CustomComponentLink, ...restProps }: {
1
+ export function BundleAssetsTotals({ className, jobs, customComponentLink: CustomComponentLink, onTreemapItemClick, ...restProps }: {
2
2
  [x: string]: any;
3
3
  className: any;
4
4
  jobs: any;
5
5
  customComponentLink: any;
6
+ onTreemapItemClick: any;
6
7
  }): React.JSX.Element;
7
8
  export namespace BundleAssetsTotals {
8
9
  namespace defaultProps {
9
10
  export let className: string;
10
11
  export let jobs: never[];
11
12
  export { ComponentLink as customComponentLink };
13
+ export let onTreemapItemClick: undefined;
12
14
  }
13
15
  namespace propTypes {
14
16
  let className_1: PropTypes.Requireable<string>;
@@ -16,6 +18,8 @@ export namespace BundleAssetsTotals {
16
18
  let jobs_1: PropTypes.Requireable<any[]>;
17
19
  export { jobs_1 as jobs };
18
20
  export let customComponentLink: PropTypes.Requireable<PropTypes.ReactComponentLike>;
21
+ let onTreemapItemClick_1: PropTypes.Requireable<(...args: any[]) => any>;
22
+ export { onTreemapItemClick_1 as onTreemapItemClick };
19
23
  }
20
24
  }
21
25
  import React from 'react';