@bundle-stats/ui 4.0.0-rc.6 → 4.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/components/bundle-assets/bundle-assets.js +64 -49
- package/lib/components/bundle-assets/bundle-assets.utils.js +1 -1
- package/lib/components/bundle-modules/bundle-modules.js +94 -79
- package/lib/components/bundle-packages/bundle-packages.js +60 -45
- package/lib/components/metrics-table-title/metrics-table-title.js +10 -7
- package/lib/components/metrics-table-title/metrics-table-title.module.css +9 -3
- package/lib/ui/filters/filters.js +5 -7
- package/lib/ui/filters/filters.utils.js +40 -2
- package/lib/ui/filters/index.js +96 -3
- package/lib/ui/index.js +8 -0
- package/lib-esm/components/bundle-assets/bundle-assets.js +63 -50
- package/lib-esm/components/bundle-assets/bundle-assets.utils.js +1 -1
- package/lib-esm/components/bundle-modules/bundle-modules.js +78 -64
- package/lib-esm/components/bundle-packages/bundle-packages.js +44 -31
- package/lib-esm/components/metrics-table-title/metrics-table-title.js +10 -7
- package/lib-esm/components/metrics-table-title/metrics-table-title.module.css +9 -3
- package/lib-esm/ui/filters/filters.js +3 -4
- package/lib-esm/ui/filters/filters.utils.js +18 -0
- package/lib-esm/ui/filters/index.js +65 -3
- package/lib-esm/ui/index.js +1 -0
- package/package.json +8 -8
- package/src/components/bundle-assets/bundle-assets.jsx +54 -45
- package/src/components/bundle-assets/bundle-assets.utils.js +1 -1
- package/src/components/bundle-modules/bundle-modules.jsx +72 -65
- package/src/components/bundle-packages/bundle-packages.jsx +36 -26
- package/src/components/metrics-table-title/metrics-table-title.jsx +20 -18
- package/src/components/metrics-table-title/metrics-table-title.module.css +9 -3
- package/src/ui/filters/filters.jsx +4 -4
- package/src/ui/filters/filters.utils.js +21 -0
- package/src/ui/filters/index.jsx +72 -0
- package/src/ui/index.js +1 -0
- package/lib/ui/filters/filters.container.js +0 -187
- package/lib-esm/ui/filters/filters.container.js +0 -111
- package/src/ui/filters/filters.container.jsx +0 -108
- package/src/ui/filters/index.js +0 -4
|
@@ -29,6 +29,61 @@ import { MetricsTableTitle } from '../metrics-table-title';
|
|
|
29
29
|
import { ModuleInfo } from '../module-info';
|
|
30
30
|
import css from './bundle-modules.module.css';
|
|
31
31
|
|
|
32
|
+
const getFilters = ({ filters, compareMode, chunks }) => ({
|
|
33
|
+
[MODULE_FILTERS.CHANGED]: {
|
|
34
|
+
label: 'Changed',
|
|
35
|
+
defaultValue: filters.changed,
|
|
36
|
+
disabled: !compareMode,
|
|
37
|
+
},
|
|
38
|
+
[MODULE_FILTERS.DUPLICATED]: {
|
|
39
|
+
label: 'Duplicate',
|
|
40
|
+
defaultValue: filters[MODULE_FILTERS.DUPLICATED],
|
|
41
|
+
},
|
|
42
|
+
[MODULE_SOURCE_TYPE]: {
|
|
43
|
+
label: 'Source',
|
|
44
|
+
[MODULE_FILTERS.FIRST_PARTY]: {
|
|
45
|
+
label: 'First party',
|
|
46
|
+
defaultValue: get(filters, `${MODULE_SOURCE_TYPE}.${MODULE_FILTERS.FIRST_PARTY}`, true),
|
|
47
|
+
},
|
|
48
|
+
[MODULE_FILTERS.THIRD_PARTY]: {
|
|
49
|
+
label: 'Third party',
|
|
50
|
+
defaultValue: get(filters, `${MODULE_SOURCE_TYPE}.${MODULE_FILTERS.THIRD_PARTY}`, true),
|
|
51
|
+
},
|
|
52
|
+
},
|
|
53
|
+
|
|
54
|
+
// When chunks data available, list available chunks as filters
|
|
55
|
+
...(!isEmpty(chunks) && {
|
|
56
|
+
[MODULE_CHUNK]: {
|
|
57
|
+
label: 'Chunk',
|
|
58
|
+
...chunks.reduce(
|
|
59
|
+
(chunkFilters, { id, name }) => ({
|
|
60
|
+
...chunkFilters,
|
|
61
|
+
[id]: {
|
|
62
|
+
label: name,
|
|
63
|
+
defaultValue: get(filters, `${MODULE_CHUNK}.${id}`, true),
|
|
64
|
+
},
|
|
65
|
+
}),
|
|
66
|
+
{},
|
|
67
|
+
),
|
|
68
|
+
},
|
|
69
|
+
}),
|
|
70
|
+
|
|
71
|
+
// Module source types
|
|
72
|
+
[MODULE_FILE_TYPE]: {
|
|
73
|
+
label: 'File type',
|
|
74
|
+
...MODULE_SOURCE_FILE_TYPES.reduce(
|
|
75
|
+
(agg, fileType) => ({
|
|
76
|
+
...agg,
|
|
77
|
+
[fileType]: {
|
|
78
|
+
label: FILE_TYPE_LABELS[fileType],
|
|
79
|
+
defaultValue: get(filters, `${MODULE_FILE_TYPE}.${fileType}`, true),
|
|
80
|
+
},
|
|
81
|
+
}),
|
|
82
|
+
{},
|
|
83
|
+
),
|
|
84
|
+
},
|
|
85
|
+
})
|
|
86
|
+
|
|
32
87
|
const RowHeader = ({ row, chunks, labels, CustomComponentLink }) => {
|
|
33
88
|
const chunkIds = map(chunks, 'id');
|
|
34
89
|
|
|
@@ -103,6 +158,20 @@ export const BundleModules = ({
|
|
|
103
158
|
}) => {
|
|
104
159
|
const rootClassName = cx(css.root, className);
|
|
105
160
|
|
|
161
|
+
const dropdownFilters = useMemo(
|
|
162
|
+
() => getFilters({ filters, chunks, compareMode: jobs.length > 1 }),
|
|
163
|
+
[jobs, filters, chunks]
|
|
164
|
+
);
|
|
165
|
+
|
|
166
|
+
const metricsTableTitle = useMemo(() => (
|
|
167
|
+
<MetricsTableTitle
|
|
168
|
+
title={I18N.MODULES}
|
|
169
|
+
info={`${items.length}/${totalRowCount}`}
|
|
170
|
+
popoverInfo={I18N.MODULES_INFO}
|
|
171
|
+
popoverHref={config.documentation.modules}
|
|
172
|
+
/>
|
|
173
|
+
), [items, totalRowCount]);
|
|
174
|
+
|
|
106
175
|
const renderRowHeader = useCallback(
|
|
107
176
|
(row) => (
|
|
108
177
|
<RowHeader
|
|
@@ -115,69 +184,14 @@ export const BundleModules = ({
|
|
|
115
184
|
[jobs, chunks, CustomComponentLink],
|
|
116
185
|
);
|
|
117
186
|
|
|
118
|
-
const emptyMessage = (
|
|
187
|
+
const emptyMessage = useMemo(() => (
|
|
119
188
|
<EmptySet
|
|
120
189
|
resources="modules"
|
|
121
190
|
filtered={totalRowCount !== 0}
|
|
122
191
|
handleResetFilters={resetFilters}
|
|
123
192
|
handleViewAll={resetAllFilters}
|
|
124
193
|
/>
|
|
125
|
-
);
|
|
126
|
-
|
|
127
|
-
const dropdownFilters = {
|
|
128
|
-
[MODULE_FILTERS.CHANGED]: {
|
|
129
|
-
label: 'Changed',
|
|
130
|
-
defaultValue: filters.changed,
|
|
131
|
-
disabled: jobs.length <= 1,
|
|
132
|
-
},
|
|
133
|
-
[MODULE_FILTERS.DUPLICATED]: {
|
|
134
|
-
label: 'Duplicate',
|
|
135
|
-
defaultValue: filters[MODULE_FILTERS.DUPLICATED],
|
|
136
|
-
},
|
|
137
|
-
[MODULE_SOURCE_TYPE]: {
|
|
138
|
-
label: 'Source',
|
|
139
|
-
[MODULE_FILTERS.FIRST_PARTY]: {
|
|
140
|
-
label: 'First party',
|
|
141
|
-
defaultValue: get(filters, `${MODULE_SOURCE_TYPE}.${MODULE_FILTERS.FIRST_PARTY}`, true),
|
|
142
|
-
},
|
|
143
|
-
[MODULE_FILTERS.THIRD_PARTY]: {
|
|
144
|
-
label: 'Third party',
|
|
145
|
-
defaultValue: get(filters, `${MODULE_SOURCE_TYPE}.${MODULE_FILTERS.THIRD_PARTY}`, true),
|
|
146
|
-
},
|
|
147
|
-
},
|
|
148
|
-
|
|
149
|
-
// When chunks data available, list available chunks as filters
|
|
150
|
-
...(!isEmpty(chunks) && {
|
|
151
|
-
[MODULE_CHUNK]: {
|
|
152
|
-
label: 'Chunk',
|
|
153
|
-
...chunks.reduce(
|
|
154
|
-
(chunkFilters, { id, name }) => ({
|
|
155
|
-
...chunkFilters,
|
|
156
|
-
[id]: {
|
|
157
|
-
label: name,
|
|
158
|
-
defaultValue: get(filters, `${MODULE_CHUNK}.${id}`, true),
|
|
159
|
-
},
|
|
160
|
-
}),
|
|
161
|
-
{},
|
|
162
|
-
),
|
|
163
|
-
},
|
|
164
|
-
}),
|
|
165
|
-
|
|
166
|
-
// Module source types
|
|
167
|
-
[MODULE_FILE_TYPE]: {
|
|
168
|
-
label: 'File type',
|
|
169
|
-
...MODULE_SOURCE_FILE_TYPES.reduce(
|
|
170
|
-
(agg, fileType) => ({
|
|
171
|
-
...agg,
|
|
172
|
-
[fileType]: {
|
|
173
|
-
label: FILE_TYPE_LABELS[fileType],
|
|
174
|
-
defaultValue: get(filters, `${MODULE_FILE_TYPE}.${fileType}`, true),
|
|
175
|
-
},
|
|
176
|
-
}),
|
|
177
|
-
{},
|
|
178
|
-
),
|
|
179
|
-
},
|
|
180
|
-
};
|
|
194
|
+
), [totalRowCount, resetFilters, resetAllFilters]);
|
|
181
195
|
|
|
182
196
|
return (
|
|
183
197
|
<div className={rootClassName}>
|
|
@@ -221,14 +235,7 @@ export const BundleModules = ({
|
|
|
221
235
|
renderRowHeader={renderRowHeader}
|
|
222
236
|
emptyMessage={emptyMessage}
|
|
223
237
|
showHeaderSum
|
|
224
|
-
title={
|
|
225
|
-
<MetricsTableTitle
|
|
226
|
-
title={I18N.MODULES}
|
|
227
|
-
info={`(${items.length}/${totalRowCount})`}
|
|
228
|
-
popoverInfo={I18N.MODULES_INFO}
|
|
229
|
-
popoverHref={config.documentation.modules}
|
|
230
|
-
/>
|
|
231
|
-
}
|
|
238
|
+
title={metricsTableTitle}
|
|
232
239
|
/>
|
|
233
240
|
</div>
|
|
234
241
|
);
|
|
@@ -27,6 +27,19 @@ import { MetricsTableOptions } from '../metrics-table-options';
|
|
|
27
27
|
import { MetricsTableTitle } from '../metrics-table-title';
|
|
28
28
|
import css from './bundle-packages.module.css';
|
|
29
29
|
|
|
30
|
+
const getDropdownFilters = ({ compareMode, filters }) => ({
|
|
31
|
+
[PACKAGE_FILTERS.CHANGED]: {
|
|
32
|
+
label: 'Changed',
|
|
33
|
+
defaultValue: filters[PACKAGE_FILTERS.CHANGED],
|
|
34
|
+
disabled: !compareMode,
|
|
35
|
+
},
|
|
36
|
+
[PACKAGE_FILTERS.DUPLICATE]: {
|
|
37
|
+
label: 'Duplicate',
|
|
38
|
+
defaultValue: filters[PACKAGE_FILTERS.DUPLICATE],
|
|
39
|
+
},
|
|
40
|
+
});
|
|
41
|
+
|
|
42
|
+
|
|
30
43
|
const PackagePopoverContent = ({ name, fullName, path, duplicate, CustomComponentLink }) => {
|
|
31
44
|
const fallbackPackagePath = `node_modules/${fullName.split(PACKAGES_SEPARATOR).join('/node_modules/')}`;
|
|
32
45
|
const normalizedPackagePath = `${path || fallbackPackagePath}/`;
|
|
@@ -208,20 +221,34 @@ export const BundlePackages = (props) => {
|
|
|
208
221
|
customComponentLink: CustomComponentLink,
|
|
209
222
|
} = props;
|
|
210
223
|
|
|
211
|
-
const
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
filtered={totalRowCount !== 0}
|
|
215
|
-
handleResetFilters={resetFilters}
|
|
216
|
-
handleViewAll={resetAllFilters}
|
|
217
|
-
/>
|
|
224
|
+
const dropdownFilters = useMemo(
|
|
225
|
+
() => getDropdownFilters({ compareMode: jobs?.length > 1, filters }),
|
|
226
|
+
[jobs, filters],
|
|
218
227
|
);
|
|
219
228
|
|
|
229
|
+
const metricsTableTitle = useMemo(() => (
|
|
230
|
+
<MetricsTableTitle
|
|
231
|
+
title={I18N.PACKAGES}
|
|
232
|
+
info={`${items.length}/${totalRowCount}`}
|
|
233
|
+
popoverInfo={I18N.PACKAGES_INFO}
|
|
234
|
+
popoverHref={config.documentation.packages}
|
|
235
|
+
/>
|
|
236
|
+
), [items, totalRowCount]);
|
|
237
|
+
|
|
220
238
|
const renderRowHeader = useCallback(
|
|
221
239
|
(row) => <RowHeader row={row} CustomComponentLink={CustomComponentLink} />,
|
|
222
240
|
[CustomComponentLink],
|
|
223
241
|
);
|
|
224
242
|
|
|
243
|
+
const emptyMessage = useMemo(() => (
|
|
244
|
+
<EmptySet
|
|
245
|
+
resources="packages"
|
|
246
|
+
filtered={totalRowCount !== 0}
|
|
247
|
+
handleResetFilters={resetFilters}
|
|
248
|
+
handleViewAll={resetAllFilters}
|
|
249
|
+
/>
|
|
250
|
+
), [totalRowCount, resetFilters, resetAllFilters]);
|
|
251
|
+
|
|
225
252
|
return (
|
|
226
253
|
<section className={cx(css.root, className)}>
|
|
227
254
|
<Toolbar
|
|
@@ -244,17 +271,7 @@ export const BundlePackages = (props) => {
|
|
|
244
271
|
updateSearch={updateSearch}
|
|
245
272
|
/>
|
|
246
273
|
<Filters
|
|
247
|
-
filters={
|
|
248
|
-
[PACKAGE_FILTERS.CHANGED]: {
|
|
249
|
-
label: 'Changed',
|
|
250
|
-
defaultValue: filters[PACKAGE_FILTERS.CHANGED],
|
|
251
|
-
disabled: jobs.length <= 1,
|
|
252
|
-
},
|
|
253
|
-
[PACKAGE_FILTERS.DUPLICATE]: {
|
|
254
|
-
label: 'Duplicate',
|
|
255
|
-
defaultValue: filters[PACKAGE_FILTERS.DUPLICATE],
|
|
256
|
-
},
|
|
257
|
-
}}
|
|
274
|
+
filters={dropdownFilters}
|
|
258
275
|
label={`Filters (${items.length}/${totalRowCount})`}
|
|
259
276
|
onChange={updateFilters}
|
|
260
277
|
hasActiveFilters={hasActiveFilters}
|
|
@@ -268,14 +285,7 @@ export const BundlePackages = (props) => {
|
|
|
268
285
|
emptyMessage={emptyMessage}
|
|
269
286
|
renderRowHeader={renderRowHeader}
|
|
270
287
|
showHeaderSum
|
|
271
|
-
title={
|
|
272
|
-
<MetricsTableTitle
|
|
273
|
-
title={I18N.PACKAGES}
|
|
274
|
-
info={`(${items.length}/${totalRowCount})`}
|
|
275
|
-
popoverInfo={I18N.PACKAGES_INFO}
|
|
276
|
-
popoverHref={config.documentation.packages}
|
|
277
|
-
/>
|
|
278
|
-
}
|
|
288
|
+
title={metricsTableTitle}
|
|
279
289
|
/>
|
|
280
290
|
</main>
|
|
281
291
|
</section>
|
|
@@ -14,24 +14,26 @@ export const MetricsTableTitle = (props) => {
|
|
|
14
14
|
const rootClassName = cx(css.root, className);
|
|
15
15
|
|
|
16
16
|
return (
|
|
17
|
-
<
|
|
18
|
-
<
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
17
|
+
<Stack className={rootClassName}>
|
|
18
|
+
<FlexStack space="xxxsmall" className={css.title}>
|
|
19
|
+
<span>{title}</span>
|
|
20
|
+
{(popoverInfo || popoverHref) && (
|
|
21
|
+
<HoverCard label={<Icon glyph="help" />} className={css.hoverCard}>
|
|
22
|
+
<Stack space="xxxsmall">
|
|
23
|
+
{popoverInfo && <p>{popoverInfo}</p>}
|
|
24
|
+
{popoverHref && (
|
|
25
|
+
<p>
|
|
26
|
+
<button type="button" onClick={() => window.open(popoverHref)} className={css.readMoreLink}>
|
|
27
|
+
{I18N.READ_MORE}
|
|
28
|
+
</button>
|
|
29
|
+
</p>
|
|
30
|
+
)}
|
|
31
|
+
</Stack>
|
|
32
|
+
</HoverCard>
|
|
33
|
+
)}
|
|
34
|
+
</FlexStack>
|
|
35
|
+
{info && <p className={css.info}>{info}</p>}
|
|
36
|
+
</Stack>
|
|
35
37
|
);
|
|
36
38
|
};
|
|
37
39
|
|
|
@@ -1,14 +1,20 @@
|
|
|
1
1
|
.root {
|
|
2
|
+
}
|
|
3
|
+
|
|
4
|
+
.title {
|
|
5
|
+
color: var(--color-text-light);
|
|
2
6
|
align-items: center;
|
|
3
7
|
font-weight: bold;
|
|
4
|
-
line-height: var(--space-small);
|
|
5
8
|
text-transform: uppercase;
|
|
6
|
-
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
.hoverCard {
|
|
12
|
+
line-height: 1;
|
|
7
13
|
}
|
|
8
14
|
|
|
9
15
|
.info {
|
|
16
|
+
font-size: var(--size-xsmall);
|
|
10
17
|
font-weight: normal;
|
|
11
|
-
text-transform: none;
|
|
12
18
|
}
|
|
13
19
|
|
|
14
20
|
.readMoreLink {
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import React, { useCallback } from 'react';
|
|
2
2
|
import PropTypes from 'prop-types';
|
|
3
3
|
import cx from 'classnames';
|
|
4
|
-
import { get
|
|
4
|
+
import { get } from 'lodash';
|
|
5
5
|
|
|
6
6
|
import { FlexStack } from '../../layout/flex-stack';
|
|
7
7
|
import { Dropdown } from '../dropdown';
|
|
@@ -58,8 +58,8 @@ const FilterGroup = (props) => {
|
|
|
58
58
|
const groupCheckboxes = groupItems.filter(
|
|
59
59
|
([itemKey, item]) => typeof item?.defaultValue !== 'undefined',
|
|
60
60
|
);
|
|
61
|
-
const
|
|
62
|
-
.map(([itemKey]) =>
|
|
61
|
+
const areAllGroupItemsChecked = groupCheckboxes
|
|
62
|
+
.map(([itemKey]) => values?.[`${groupKey}.${itemKey}`])
|
|
63
63
|
.reduce((agg, val) => agg && val, true);
|
|
64
64
|
|
|
65
65
|
const filterSuffix = getGroupFiltersLabelSuffix(groupItems);
|
|
@@ -123,7 +123,7 @@ const FilterGroup = (props) => {
|
|
|
123
123
|
})}
|
|
124
124
|
</div>
|
|
125
125
|
<div className={css.filterGroupActions}>
|
|
126
|
-
{
|
|
126
|
+
{areAllGroupItemsChecked ? (
|
|
127
127
|
<MenuItem
|
|
128
128
|
id="clear-all"
|
|
129
129
|
as="button"
|
|
@@ -64,3 +64,24 @@ export const getGroupFiltersLabelSuffix = (filters) => {
|
|
|
64
64
|
|
|
65
65
|
return `${suffix}${skippedLabels > 0 ? ` +${skippedLabels}` : ''}`;
|
|
66
66
|
};
|
|
67
|
+
|
|
68
|
+
export const getInitialValues = (key, filters) => {
|
|
69
|
+
if (typeof filters?.defaultValue !== 'undefined') {
|
|
70
|
+
return {
|
|
71
|
+
[key]: filters.defaultValue,
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
if (typeof filters === 'object') {
|
|
76
|
+
return Object.entries(filters).map(([groupKey, groupFilters]) => getInitialValues(
|
|
77
|
+
[...key ? [key] : [], groupKey].join('.'),
|
|
78
|
+
groupFilters,
|
|
79
|
+
)).reduce((agg, current) => ({
|
|
80
|
+
...agg,
|
|
81
|
+
...current,
|
|
82
|
+
}), {});
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
return {};
|
|
86
|
+
};
|
|
87
|
+
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import React, { useCallback, useEffect, useState } from 'react';
|
|
2
|
+
import PropTypes from 'prop-types';
|
|
3
|
+
import { isEqual, merge } from 'lodash';
|
|
4
|
+
|
|
5
|
+
import { getInitialValues } from './filters.utils';
|
|
6
|
+
import { Filters as BaseComponent } from './filters';
|
|
7
|
+
|
|
8
|
+
export const Filters = (props) => {
|
|
9
|
+
const { onChange, filters, ...restProps } = props;
|
|
10
|
+
const [values, setValues] = useState(getInitialValues('', filters));
|
|
11
|
+
|
|
12
|
+
// Update values when the parent filters are changing (route with query string change)
|
|
13
|
+
useEffect(
|
|
14
|
+
() => {
|
|
15
|
+
const parentValues = getInitialValues('', filters);
|
|
16
|
+
|
|
17
|
+
if (isEqual(parentValues, values)) {
|
|
18
|
+
return;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
setValues(parentValues);
|
|
22
|
+
},
|
|
23
|
+
// Do not trigger effect when the values are changing locally
|
|
24
|
+
[filters, setValues],
|
|
25
|
+
);
|
|
26
|
+
|
|
27
|
+
const toggleFilter = useCallback(
|
|
28
|
+
(key, value) => {
|
|
29
|
+
const nextValues = merge({}, values, { [key]: value });
|
|
30
|
+
setValues(nextValues);
|
|
31
|
+
|
|
32
|
+
if (onChange) {
|
|
33
|
+
onChange(nextValues);
|
|
34
|
+
}
|
|
35
|
+
},
|
|
36
|
+
[onChange, setValues, values]
|
|
37
|
+
);
|
|
38
|
+
|
|
39
|
+
const toggleFilters = useCallback(
|
|
40
|
+
(newFilters) => {
|
|
41
|
+
const nextValues = merge({}, values, newFilters);
|
|
42
|
+
setValues(nextValues);
|
|
43
|
+
|
|
44
|
+
if (onChange) {
|
|
45
|
+
onChange(nextValues);
|
|
46
|
+
}
|
|
47
|
+
},
|
|
48
|
+
[onChange, setValues, values],
|
|
49
|
+
);
|
|
50
|
+
|
|
51
|
+
return (
|
|
52
|
+
<BaseComponent
|
|
53
|
+
{...restProps}
|
|
54
|
+
filters={filters}
|
|
55
|
+
values={values}
|
|
56
|
+
toggleFilter={toggleFilter}
|
|
57
|
+
toggleFilters={toggleFilters}
|
|
58
|
+
/>
|
|
59
|
+
);
|
|
60
|
+
};
|
|
61
|
+
|
|
62
|
+
Filters.defaultProps = {
|
|
63
|
+
onChange: null,
|
|
64
|
+
};
|
|
65
|
+
|
|
66
|
+
Filters.propTypes = {
|
|
67
|
+
/** Filter config */
|
|
68
|
+
filters: PropTypes.object.isRequired, // eslint-disable-line react/forbid-prop-types
|
|
69
|
+
|
|
70
|
+
/** OnChange handler */
|
|
71
|
+
onChange: PropTypes.func,
|
|
72
|
+
};
|
package/src/ui/index.js
CHANGED
|
@@ -5,6 +5,7 @@ export { EmptySet } from './empty-set';
|
|
|
5
5
|
export { FileName } from './file-name';
|
|
6
6
|
export { Filters } from './filters';
|
|
7
7
|
export { HorizontalBarChart } from './horizontal-bar-chart';
|
|
8
|
+
export { HoverCard } from './hover-card';
|
|
8
9
|
export { Icon } from './icon';
|
|
9
10
|
export { Input } from './input';
|
|
10
11
|
export { Loader } from './loader';
|
|
@@ -1,187 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
Object.defineProperty(exports, "__esModule", {
|
|
4
|
-
value: true
|
|
5
|
-
});
|
|
6
|
-
exports.filtersDropdownContainer = void 0;
|
|
7
|
-
|
|
8
|
-
var _isEqual2 = _interopRequireDefault(require("lodash/isEqual"));
|
|
9
|
-
|
|
10
|
-
var _react = _interopRequireDefault(require("react"));
|
|
11
|
-
|
|
12
|
-
var _propTypes = _interopRequireDefault(require("prop-types"));
|
|
13
|
-
|
|
14
|
-
var _excluded = ["values"];
|
|
15
|
-
|
|
16
|
-
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
|
|
17
|
-
|
|
18
|
-
function _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
|
|
19
|
-
|
|
20
|
-
function _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }
|
|
21
|
-
|
|
22
|
-
function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }
|
|
23
|
-
|
|
24
|
-
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
|
25
|
-
|
|
26
|
-
function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
|
|
27
|
-
|
|
28
|
-
function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; }
|
|
29
|
-
|
|
30
|
-
function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) _setPrototypeOf(subClass, superClass); }
|
|
31
|
-
|
|
32
|
-
function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }
|
|
33
|
-
|
|
34
|
-
function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }
|
|
35
|
-
|
|
36
|
-
function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return _assertThisInitialized(self); }
|
|
37
|
-
|
|
38
|
-
function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; }
|
|
39
|
-
|
|
40
|
-
function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
|
|
41
|
-
|
|
42
|
-
function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }
|
|
43
|
-
|
|
44
|
-
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
|
|
45
|
-
|
|
46
|
-
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
|
|
47
|
-
|
|
48
|
-
function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); }
|
|
49
|
-
|
|
50
|
-
function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
|
|
51
|
-
|
|
52
|
-
function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter); }
|
|
53
|
-
|
|
54
|
-
function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); }
|
|
55
|
-
|
|
56
|
-
function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
|
|
57
|
-
|
|
58
|
-
function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
|
|
59
|
-
|
|
60
|
-
function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
|
|
61
|
-
|
|
62
|
-
function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
|
|
63
|
-
|
|
64
|
-
function _iterableToArrayLimit(arr, i) { var _i = arr == null ? null : typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"]; if (_i == null) return; var _arr = []; var _n = true; var _d = false; var _s, _e; try { for (_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }
|
|
65
|
-
|
|
66
|
-
function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
|
|
67
|
-
|
|
68
|
-
function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof(obj); }
|
|
69
|
-
|
|
70
|
-
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
|
71
|
-
|
|
72
|
-
var getInitialValues = function getInitialValues(key, filters) {
|
|
73
|
-
if (typeof (filters === null || filters === void 0 ? void 0 : filters.defaultValue) !== 'undefined') {
|
|
74
|
-
return _defineProperty({}, key, filters.defaultValue);
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
if (_typeof(filters) === 'object') {
|
|
78
|
-
return Object.entries(filters).map(function (_ref2) {
|
|
79
|
-
var _ref3 = _slicedToArray(_ref2, 2),
|
|
80
|
-
groupKey = _ref3[0],
|
|
81
|
-
groupFilters = _ref3[1];
|
|
82
|
-
|
|
83
|
-
return getInitialValues([].concat(_toConsumableArray(key ? [key] : []), [groupKey]).join('.'), groupFilters);
|
|
84
|
-
}).reduce(function (agg, current) {
|
|
85
|
-
return _objectSpread(_objectSpread({}, agg), current);
|
|
86
|
-
}, {});
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
return {};
|
|
90
|
-
};
|
|
91
|
-
|
|
92
|
-
var filtersDropdownContainer = function filtersDropdownContainer(BaseComponent) {
|
|
93
|
-
var FiltersContainer = /*#__PURE__*/function (_React$Component) {
|
|
94
|
-
_inherits(FiltersContainer, _React$Component);
|
|
95
|
-
|
|
96
|
-
var _super = _createSuper(FiltersContainer);
|
|
97
|
-
|
|
98
|
-
function FiltersContainer(props) {
|
|
99
|
-
var _this;
|
|
100
|
-
|
|
101
|
-
_classCallCheck(this, FiltersContainer);
|
|
102
|
-
|
|
103
|
-
_this = _super.call(this, props);
|
|
104
|
-
|
|
105
|
-
_defineProperty(_assertThisInitialized(_this), "toggleFilter", function (key, value) {
|
|
106
|
-
return _this.setState(function (_ref4) {
|
|
107
|
-
var values = _ref4.values,
|
|
108
|
-
state = _objectWithoutProperties(_ref4, _excluded);
|
|
109
|
-
|
|
110
|
-
var newState = _objectSpread(_objectSpread({}, state), {}, {
|
|
111
|
-
values: _objectSpread(_objectSpread({}, values), {}, _defineProperty({}, key, value))
|
|
112
|
-
});
|
|
113
|
-
|
|
114
|
-
var onChange = _this.props.onChange;
|
|
115
|
-
|
|
116
|
-
if (onChange) {
|
|
117
|
-
onChange(newState.values);
|
|
118
|
-
}
|
|
119
|
-
|
|
120
|
-
return newState;
|
|
121
|
-
});
|
|
122
|
-
});
|
|
123
|
-
|
|
124
|
-
_defineProperty(_assertThisInitialized(_this), "toggleFilters", function (newFilters) {
|
|
125
|
-
return _this.setState(function (prevState) {
|
|
126
|
-
var newState = _objectSpread(_objectSpread({}, prevState), {}, {
|
|
127
|
-
values: _objectSpread(_objectSpread({}, prevState.values), newFilters)
|
|
128
|
-
});
|
|
129
|
-
|
|
130
|
-
var onChange = _this.props.onChange;
|
|
131
|
-
|
|
132
|
-
if (onChange) {
|
|
133
|
-
onChange(newState.values);
|
|
134
|
-
}
|
|
135
|
-
|
|
136
|
-
return newState;
|
|
137
|
-
});
|
|
138
|
-
});
|
|
139
|
-
|
|
140
|
-
var filters = _this.props.filters;
|
|
141
|
-
_this.state = {
|
|
142
|
-
values: getInitialValues('', filters)
|
|
143
|
-
};
|
|
144
|
-
return _this;
|
|
145
|
-
}
|
|
146
|
-
|
|
147
|
-
_createClass(FiltersContainer, [{
|
|
148
|
-
key: "render",
|
|
149
|
-
value: function render() {
|
|
150
|
-
return /*#__PURE__*/_react["default"].createElement(BaseComponent, _extends({}, this.props, this.state, {
|
|
151
|
-
toggleFilter: this.toggleFilter,
|
|
152
|
-
toggleFilters: this.toggleFilters
|
|
153
|
-
}));
|
|
154
|
-
}
|
|
155
|
-
}], [{
|
|
156
|
-
key: "getDerivedStateFromProps",
|
|
157
|
-
value: function getDerivedStateFromProps(_ref5, state) {
|
|
158
|
-
var filters = _ref5.filters;
|
|
159
|
-
|
|
160
|
-
if ((0, _isEqual2["default"])(filters, state.values)) {
|
|
161
|
-
return null;
|
|
162
|
-
}
|
|
163
|
-
|
|
164
|
-
return {
|
|
165
|
-
values: getInitialValues('', filters)
|
|
166
|
-
};
|
|
167
|
-
}
|
|
168
|
-
}]);
|
|
169
|
-
|
|
170
|
-
return FiltersContainer;
|
|
171
|
-
}(_react["default"].Component);
|
|
172
|
-
|
|
173
|
-
FiltersContainer.defaultProps = {
|
|
174
|
-
onChange: null
|
|
175
|
-
};
|
|
176
|
-
FiltersContainer.propTypes = {
|
|
177
|
-
/** Filter config */
|
|
178
|
-
filters: _propTypes["default"].object.isRequired,
|
|
179
|
-
// eslint-disable-line react/forbid-prop-types
|
|
180
|
-
|
|
181
|
-
/** OnChange handler */
|
|
182
|
-
onChange: _propTypes["default"].func
|
|
183
|
-
};
|
|
184
|
-
return FiltersContainer;
|
|
185
|
-
};
|
|
186
|
-
|
|
187
|
-
exports.filtersDropdownContainer = filtersDropdownContainer;
|