@bundle-stats/ui 4.2.5-beta.0 → 4.2.5-beta.2
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/globals.d.ts +4 -0
- package/lib/components/bundle-assets-totals-chart-bars/bundle-assets-totals-chart-bars.js +7 -5
- package/lib/components/bundle-assets-totals-chart-bars/bundle-assets-totals-chart-bars.js.map +1 -1
- package/lib/components/index.js +5 -3
- package/lib/components/index.js.map +1 -1
- package/lib/components/insight-icon/insight-icon.js.map +1 -1
- package/lib/components/insights/insights.js.map +1 -1
- package/lib/components/metric/index.js.map +1 -1
- package/lib/components/metric/metric.js +7 -64
- package/lib/components/metric/metric.js.map +1 -1
- package/lib/components/metric/metric.module.css +2 -2
- package/lib/components/metric-run-info/index.js +18 -0
- package/lib/components/metric-run-info/index.js.map +1 -0
- package/lib/components/metric-run-info/metric-run-info.js +59 -0
- package/lib/components/metric-run-info/metric-run-info.js.map +1 -0
- package/lib/components/metric-run-info/metric-run-info.module.css +18 -0
- package/lib/components/metrics-table-title/metrics-table-title.module.css +1 -0
- package/lib/components/{summary-item → run-info}/index.js +1 -1
- package/lib/components/run-info/index.js.map +1 -0
- package/lib/components/run-info/run-info.js +45 -0
- package/lib/components/run-info/run-info.js.map +1 -0
- package/lib/components/{summary-item/summary-item.module.css → run-info/run-info.module.css} +3 -20
- package/lib/components/summary/index.js.map +1 -1
- package/lib/components/summary/summary.js +10 -30
- package/lib/components/summary/summary.js.map +1 -1
- package/lib/components/summary/summary.module.css +19 -0
- package/lib/layout/box/box.js.map +1 -1
- package/lib/layout/flex-stack/flex-stack.js.map +1 -1
- package/lib/ui/container/container.js.map +1 -1
- package/lib/ui/tooltip/tooltip.js.map +1 -1
- package/lib-esm/components/bundle-assets-totals-chart-bars/bundle-assets-totals-chart-bars.js +6 -6
- package/lib-esm/components/bundle-assets-totals-chart-bars/bundle-assets-totals-chart-bars.js.map +1 -1
- package/lib-esm/components/index.js +2 -1
- package/lib-esm/components/index.js.map +1 -1
- package/lib-esm/components/insight-icon/insight-icon.js.map +1 -1
- package/lib-esm/components/insights/insights.js.map +1 -1
- package/lib-esm/components/metric/index.js.map +1 -1
- package/lib-esm/components/metric/metric.js +7 -41
- package/lib-esm/components/metric/metric.js.map +1 -1
- package/lib-esm/components/metric/metric.module.css +2 -2
- package/lib-esm/components/metric-run-info/index.js +2 -0
- package/lib-esm/components/metric-run-info/index.js.map +1 -0
- package/lib-esm/components/metric-run-info/metric-run-info.js +29 -0
- package/lib-esm/components/metric-run-info/metric-run-info.js.map +1 -0
- package/lib-esm/components/metric-run-info/metric-run-info.module.css +18 -0
- package/lib-esm/components/metrics-table-title/metrics-table-title.module.css +1 -0
- package/lib-esm/components/run-info/index.js +2 -0
- package/lib-esm/components/run-info/index.js.map +1 -0
- package/lib-esm/components/run-info/run-info.js +38 -0
- package/lib-esm/components/run-info/run-info.js.map +1 -0
- package/lib-esm/components/{summary-item/summary-item.module.css → run-info/run-info.module.css} +3 -20
- package/lib-esm/components/summary/index.js.map +1 -1
- package/lib-esm/components/summary/summary.js +9 -29
- package/lib-esm/components/summary/summary.js.map +1 -1
- package/lib-esm/components/summary/summary.module.css +19 -0
- package/lib-esm/layout/box/box.js.map +1 -1
- package/lib-esm/layout/flex-stack/flex-stack.js.map +1 -1
- package/lib-esm/ui/container/container.js.map +1 -1
- package/lib-esm/ui/tooltip/tooltip.js.map +1 -1
- package/package.json +10 -9
- package/src/components/bundle-assets-totals-chart-bars/bundle-assets-totals-chart-bars.jsx +18 -15
- package/src/components/index.js +2 -1
- package/src/components/insight-icon/insight-icon.tsx +0 -2
- package/src/components/insights/insights.tsx +0 -1
- package/src/components/metric/metric.module.css +2 -2
- package/src/components/metric/metric.stories.tsx +41 -0
- package/src/components/metric/metric.tsx +42 -0
- package/src/components/metric-run-info/index.ts +1 -0
- package/src/components/metric-run-info/metric-run-info.module.css +18 -0
- package/src/components/metric-run-info/metric-run-info.stories.tsx +33 -0
- package/src/components/metric-run-info/metric-run-info.tsx +67 -0
- package/src/components/metrics-table-title/metrics-table-title.module.css +1 -0
- package/src/components/run-info/index.ts +1 -0
- package/src/components/{summary-item/summary-item.module.css → run-info/run-info.module.css} +3 -20
- package/src/components/run-info/run-info.stories.tsx +49 -0
- package/src/components/run-info/run-info.tsx +100 -0
- package/src/components/summary/summary.module.css +19 -0
- package/src/components/summary/summary.stories.tsx +56 -0
- package/src/components/summary/summary.tsx +97 -0
- package/src/layout/box/box.tsx +0 -1
- package/src/layout/flex-stack/flex-stack.tsx +1 -2
- package/src/ui/container/container.tsx +0 -1
- package/src/ui/tooltip/tooltip.tsx +0 -1
- package/types/components/index.d.ts +2 -1
- package/types/components/metric/index.d.ts +1 -1
- package/types/components/metric/metric.d.ts +6 -32
- package/types/components/metric-run-info/index.d.ts +1 -0
- package/types/components/metric-run-info/metric-run-info.d.ts +12 -0
- package/types/components/run-info/index.d.ts +1 -0
- package/types/components/run-info/run-info.d.ts +14 -0
- package/types/components/summary/index.d.ts +1 -1
- package/types/components/summary/summary.d.ts +15 -36
- package/types/layout/flex-stack/flex-stack.d.ts +2 -1
- package/lib/components/summary-item/index.js.map +0 -1
- package/lib/components/summary-item/summary-item.js +0 -97
- package/lib/components/summary-item/summary-item.js.map +0 -1
- package/lib-esm/components/summary-item/index.js +0 -2
- package/lib-esm/components/summary-item/index.js.map +0 -1
- package/lib-esm/components/summary-item/summary-item.js +0 -67
- package/lib-esm/components/summary-item/summary-item.js.map +0 -1
- package/src/components/metric/metric.jsx +0 -63
- package/src/components/summary/summary.jsx +0 -74
- package/src/components/summary-item/index.js +0 -1
- package/src/components/summary-item/summary-item.jsx +0 -142
- package/types/components/summary-item/index.d.ts +0 -1
- package/types/components/summary-item/summary-item.d.ts +0 -40
- /package/src/components/metric/{index.js → index.ts} +0 -0
- /package/src/components/summary/{index.js → index.ts} +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
export * from
|
|
1
|
+
export * from './metric';
|
|
@@ -1,33 +1,7 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
value
|
|
4
|
-
|
|
5
|
-
inline
|
|
6
|
-
children: any;
|
|
7
|
-
enhanced: any;
|
|
8
|
-
}): JSX.Element;
|
|
9
|
-
export namespace Metric {
|
|
10
|
-
namespace defaultProps {
|
|
11
|
-
const className: string;
|
|
12
|
-
const enhanced: boolean;
|
|
13
|
-
const inline: boolean;
|
|
14
|
-
const value: number;
|
|
15
|
-
const children: never[];
|
|
16
|
-
function formatter(val: any): any;
|
|
17
|
-
}
|
|
18
|
-
namespace propTypes {
|
|
19
|
-
const className_1: PropTypes.Requireable<string>;
|
|
20
|
-
export { className_1 as className };
|
|
21
|
-
const enhanced_1: PropTypes.Requireable<boolean>;
|
|
22
|
-
export { enhanced_1 as enhanced };
|
|
23
|
-
const inline_1: PropTypes.Requireable<boolean>;
|
|
24
|
-
export { inline_1 as inline };
|
|
25
|
-
const value_1: PropTypes.Requireable<NonNullable<string | number | null | undefined>>;
|
|
26
|
-
export { value_1 as value };
|
|
27
|
-
const formatter_1: PropTypes.Requireable<(...args: any[]) => any>;
|
|
28
|
-
export { formatter_1 as formatter };
|
|
29
|
-
const children_1: PropTypes.Requireable<PropTypes.ReactNodeLike>;
|
|
30
|
-
export { children_1 as children };
|
|
31
|
-
}
|
|
1
|
+
import React from 'react';
|
|
2
|
+
export interface MetricProps {
|
|
3
|
+
value?: string;
|
|
4
|
+
unit?: string;
|
|
5
|
+
inline?: boolean;
|
|
32
6
|
}
|
|
33
|
-
|
|
7
|
+
export declare const Metric: (props: MetricProps & React.ComponentProps<'div'>) => JSX.Element;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './metric-run-info';
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { RunInfoProps } from '../run-info';
|
|
3
|
+
export interface MetricRunInfoProps {
|
|
4
|
+
metricId: string;
|
|
5
|
+
current: number;
|
|
6
|
+
baseline?: number;
|
|
7
|
+
showDelta?: boolean;
|
|
8
|
+
showMetridDescription?: boolean;
|
|
9
|
+
size?: RunInfoProps['size'];
|
|
10
|
+
loading?: RunInfoProps['loading'];
|
|
11
|
+
}
|
|
12
|
+
export declare const MetricRunInfo: (props: MetricRunInfoProps & React.ComponentProps<'div'>) => JSX.Element;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './run-info';
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
export interface RunInfoProps {
|
|
3
|
+
title?: string;
|
|
4
|
+
titleHoverCard?: React.ReactNode;
|
|
5
|
+
titleTooltip?: React.ReactNode;
|
|
6
|
+
current?: string;
|
|
7
|
+
baseline?: string;
|
|
8
|
+
delta?: string;
|
|
9
|
+
deltaType?: string;
|
|
10
|
+
as?: React.ElementType;
|
|
11
|
+
size?: 'medium' | 'large';
|
|
12
|
+
loading?: boolean;
|
|
13
|
+
}
|
|
14
|
+
export declare const RunInfo: ({ className, title, titleHoverCard, titleTooltip, current, baseline, delta, deltaType, as: Component, size, loading, ...restProps }: RunInfoProps & React.ComponentProps<'div'>) => JSX.Element;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export * from
|
|
1
|
+
export * from './summary';
|
|
@@ -1,37 +1,16 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
loading: any;
|
|
7
|
-
showSummaryItemDelta: any;
|
|
8
|
-
summaryItemLink: any;
|
|
9
|
-
}): JSX.Element;
|
|
10
|
-
export namespace Summary {
|
|
11
|
-
namespace defaultProps {
|
|
12
|
-
export const className: string;
|
|
13
|
-
export const data: null;
|
|
14
|
-
export const loading: boolean;
|
|
15
|
-
export const size: string;
|
|
16
|
-
export { METRICS_WEBPACK_GENERAL as keys };
|
|
17
|
-
export const showSummaryItemDelta: boolean;
|
|
18
|
-
export { ComponentLink as summaryItemLink };
|
|
19
|
-
}
|
|
20
|
-
namespace propTypes {
|
|
21
|
-
const className_1: PropTypes.Requireable<string>;
|
|
22
|
-
export { className_1 as className };
|
|
23
|
-
const size_1: PropTypes.Requireable<string>;
|
|
24
|
-
export { size_1 as size };
|
|
25
|
-
export const keys: PropTypes.Requireable<(string | null | undefined)[]>;
|
|
26
|
-
const data_1: PropTypes.Requireable<PropTypes.InferProps<{}>>;
|
|
27
|
-
export { data_1 as data };
|
|
28
|
-
const loading_1: PropTypes.Requireable<boolean>;
|
|
29
|
-
export { loading_1 as loading };
|
|
30
|
-
const showSummaryItemDelta_1: PropTypes.Requireable<boolean>;
|
|
31
|
-
export { showSummaryItemDelta_1 as showSummaryItemDelta };
|
|
32
|
-
export const summaryItemLink: PropTypes.Requireable<PropTypes.ReactComponentLike>;
|
|
33
|
-
}
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { MetricRunInfoProps } from '../metric-run-info';
|
|
3
|
+
interface SummaryItemData {
|
|
4
|
+
current: number;
|
|
5
|
+
baseline: number;
|
|
34
6
|
}
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
7
|
+
interface SummaryProps {
|
|
8
|
+
size?: MetricRunInfoProps['size'];
|
|
9
|
+
keys?: Array<string>;
|
|
10
|
+
data?: Record<string, SummaryItemData> | null;
|
|
11
|
+
loading?: boolean;
|
|
12
|
+
showSummaryItemDelta?: boolean;
|
|
13
|
+
summaryItemLink?: React.ElementType;
|
|
14
|
+
}
|
|
15
|
+
export declare const Summary: ({ className, size, keys, data, loading, showSummaryItemDelta, summaryItemLink, }: SummaryProps & React.ComponentProps<'div'>) => JSX.Element;
|
|
16
|
+
export {};
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
2
|
import { SPACES } from '../../tokens';
|
|
3
|
+
type SpaceValue = (typeof SPACES)[number];
|
|
3
4
|
interface FlexStackProps<T extends React.ElementType> {
|
|
4
5
|
as?: T;
|
|
5
|
-
space?:
|
|
6
|
+
space?: SpaceValue;
|
|
6
7
|
inline?: boolean;
|
|
7
8
|
alignItems?: 'top' | 'center' | 'bottom';
|
|
8
9
|
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/components/summary-item/index.js"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,iDAA+B"}
|
|
@@ -1,97 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
-
if (k2 === undefined) k2 = k;
|
|
4
|
-
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
-
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
-
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
-
}
|
|
8
|
-
Object.defineProperty(o, k2, desc);
|
|
9
|
-
}) : (function(o, m, k, k2) {
|
|
10
|
-
if (k2 === undefined) k2 = k;
|
|
11
|
-
o[k2] = m[k];
|
|
12
|
-
}));
|
|
13
|
-
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
-
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
-
}) : function(o, v) {
|
|
16
|
-
o["default"] = v;
|
|
17
|
-
});
|
|
18
|
-
var __importStar = (this && this.__importStar) || function (mod) {
|
|
19
|
-
if (mod && mod.__esModule) return mod;
|
|
20
|
-
var result = {};
|
|
21
|
-
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
22
|
-
__setModuleDefault(result, mod);
|
|
23
|
-
return result;
|
|
24
|
-
};
|
|
25
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
26
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
27
|
-
};
|
|
28
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
29
|
-
exports.SummaryItem = void 0;
|
|
30
|
-
const react_1 = __importStar(require("react"));
|
|
31
|
-
const prop_types_1 = __importDefault(require("prop-types"));
|
|
32
|
-
const classnames_1 = __importDefault(require("classnames"));
|
|
33
|
-
const utils_1 = require("@bundle-stats/utils");
|
|
34
|
-
const icon_1 = require("../../ui/icon");
|
|
35
|
-
const hover_card_1 = require("../../ui/hover-card");
|
|
36
|
-
const skeleton_1 = require("../../ui/skeleton");
|
|
37
|
-
const flex_stack_1 = require("../../layout/flex-stack");
|
|
38
|
-
const stack_1 = require("../../layout/stack");
|
|
39
|
-
const metric_1 = require("../metric");
|
|
40
|
-
const delta_1 = require("../delta");
|
|
41
|
-
const summary_item_module_css_1 = __importDefault(require("./summary-item.module.css"));
|
|
42
|
-
const MetricInfo = ({ description, url }) => {
|
|
43
|
-
const onClick = (0, react_1.useCallback)(() => {
|
|
44
|
-
if (url) {
|
|
45
|
-
window.open(url);
|
|
46
|
-
}
|
|
47
|
-
}, [url]);
|
|
48
|
-
return (react_1.default.createElement(stack_1.Stack, { space: "xxxsmall" },
|
|
49
|
-
react_1.default.createElement("p", null, description),
|
|
50
|
-
url && (react_1.default.createElement("p", null,
|
|
51
|
-
react_1.default.createElement("button", { type: "button", onClick: onClick, className: summary_item_module_css_1.default.readMoreLink }, "Read more")))));
|
|
52
|
-
};
|
|
53
|
-
MetricInfo.propTypes = {
|
|
54
|
-
description: prop_types_1.default.string.isRequired,
|
|
55
|
-
url: prop_types_1.default.string,
|
|
56
|
-
};
|
|
57
|
-
MetricInfo.defaultProps = {
|
|
58
|
-
url: '',
|
|
59
|
-
};
|
|
60
|
-
const SummaryItem = ({ className, as: Component, size, id, data, loading, showDelta, showMetricDescription, ...props }) => {
|
|
61
|
-
const { baseline, current } = data || { baseline: 0, current: 0 };
|
|
62
|
-
const metric = (0, utils_1.getGlobalMetricType)(id);
|
|
63
|
-
const runInfo = (0, utils_1.getMetricRunInfo)(metric, current, baseline);
|
|
64
|
-
const showMetricDescriptionTooltip = showMetricDescription && metric?.description;
|
|
65
|
-
const rootClassName = (0, classnames_1.default)(summary_item_module_css_1.default.root, className, summary_item_module_css_1.default[size], showDelta && summary_item_module_css_1.default.showDelta);
|
|
66
|
-
return (react_1.default.createElement(stack_1.Stack, { space: "xxsmall", as: Component, className: rootClassName, ...props },
|
|
67
|
-
react_1.default.createElement(flex_stack_1.FlexStack, { space: "xxxsmall", alignItems: "center", as: "h3", className: summary_item_module_css_1.default.title },
|
|
68
|
-
react_1.default.createElement("span", null, metric.label),
|
|
69
|
-
showMetricDescriptionTooltip && (react_1.default.createElement(hover_card_1.HoverCard, { label: react_1.default.createElement(icon_1.Icon, { glyph: icon_1.Icon.ICONS.HELP }), className: summary_item_module_css_1.default.titleIcon },
|
|
70
|
-
react_1.default.createElement(MetricInfo, { ...metric })))),
|
|
71
|
-
!loading ? (react_1.default.createElement(stack_1.Stack, null,
|
|
72
|
-
react_1.default.createElement(metric_1.Metric, { className: summary_item_module_css_1.default.currentMetric, value: current, formatter: metric.formatter, enhanced: true, inline: true }, showDelta && (react_1.default.createElement(delta_1.Delta, { className: summary_item_module_css_1.default.delta, displayValue: runInfo.displayDeltaPercentage, deltaType: runInfo.deltaType }))),
|
|
73
|
-
react_1.default.createElement(metric_1.Metric, { className: summary_item_module_css_1.default.baselineMetric, value: baseline, formatter: metric.formatter }))) : (react_1.default.createElement(stack_1.Stack, null,
|
|
74
|
-
react_1.default.createElement(skeleton_1.Skeleton, { as: "p", className: (0, classnames_1.default)(summary_item_module_css_1.default.currentMetric, summary_item_module_css_1.default.loading) }),
|
|
75
|
-
react_1.default.createElement(skeleton_1.Skeleton, { as: "p", className: (0, classnames_1.default)(summary_item_module_css_1.default.baselineMetric, summary_item_module_css_1.default.loading) })))));
|
|
76
|
-
};
|
|
77
|
-
exports.SummaryItem = SummaryItem;
|
|
78
|
-
exports.SummaryItem.defaultProps = {
|
|
79
|
-
className: '',
|
|
80
|
-
as: 'div',
|
|
81
|
-
data: null,
|
|
82
|
-
size: 'medium',
|
|
83
|
-
loading: false,
|
|
84
|
-
showMetricDescription: false,
|
|
85
|
-
showDelta: true,
|
|
86
|
-
};
|
|
87
|
-
exports.SummaryItem.propTypes = {
|
|
88
|
-
className: prop_types_1.default.string,
|
|
89
|
-
as: prop_types_1.default.elementType,
|
|
90
|
-
size: prop_types_1.default.oneOf(['medium', 'large']),
|
|
91
|
-
id: prop_types_1.default.string.isRequired,
|
|
92
|
-
loading: prop_types_1.default.bool,
|
|
93
|
-
data: prop_types_1.default.object,
|
|
94
|
-
showMetricDescription: prop_types_1.default.bool,
|
|
95
|
-
showDelta: prop_types_1.default.bool,
|
|
96
|
-
};
|
|
97
|
-
//# sourceMappingURL=summary-item.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"summary-item.js","sourceRoot":"","sources":["../../../src/components/summary-item/summary-item.jsx"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/components/summary-item/index.js"],"names":[],"mappings":"AAAA,cAAc,gBAAgB,CAAC"}
|
|
@@ -1,67 +0,0 @@
|
|
|
1
|
-
import React, { useCallback } from 'react';
|
|
2
|
-
import PropTypes from 'prop-types';
|
|
3
|
-
import cx from 'classnames';
|
|
4
|
-
import { getGlobalMetricType, getMetricRunInfo } from '@bundle-stats/utils';
|
|
5
|
-
import { Icon } from '../../ui/icon';
|
|
6
|
-
import { HoverCard } from '../../ui/hover-card';
|
|
7
|
-
import { Skeleton } from '../../ui/skeleton';
|
|
8
|
-
import { FlexStack } from '../../layout/flex-stack';
|
|
9
|
-
import { Stack } from '../../layout/stack';
|
|
10
|
-
import { Metric } from '../metric';
|
|
11
|
-
import { Delta } from '../delta';
|
|
12
|
-
import css from './summary-item.module.css';
|
|
13
|
-
const MetricInfo = ({ description, url }) => {
|
|
14
|
-
const onClick = useCallback(() => {
|
|
15
|
-
if (url) {
|
|
16
|
-
window.open(url);
|
|
17
|
-
}
|
|
18
|
-
}, [url]);
|
|
19
|
-
return (React.createElement(Stack, { space: "xxxsmall" },
|
|
20
|
-
React.createElement("p", null, description),
|
|
21
|
-
url && (React.createElement("p", null,
|
|
22
|
-
React.createElement("button", { type: "button", onClick: onClick, className: css.readMoreLink }, "Read more")))));
|
|
23
|
-
};
|
|
24
|
-
MetricInfo.propTypes = {
|
|
25
|
-
description: PropTypes.string.isRequired,
|
|
26
|
-
url: PropTypes.string,
|
|
27
|
-
};
|
|
28
|
-
MetricInfo.defaultProps = {
|
|
29
|
-
url: '',
|
|
30
|
-
};
|
|
31
|
-
export const SummaryItem = ({ className, as: Component, size, id, data, loading, showDelta, showMetricDescription, ...props }) => {
|
|
32
|
-
const { baseline, current } = data || { baseline: 0, current: 0 };
|
|
33
|
-
const metric = getGlobalMetricType(id);
|
|
34
|
-
const runInfo = getMetricRunInfo(metric, current, baseline);
|
|
35
|
-
const showMetricDescriptionTooltip = showMetricDescription && (metric === null || metric === void 0 ? void 0 : metric.description);
|
|
36
|
-
const rootClassName = cx(css.root, className, css[size], showDelta && css.showDelta);
|
|
37
|
-
return (React.createElement(Stack, { space: "xxsmall", as: Component, className: rootClassName, ...props },
|
|
38
|
-
React.createElement(FlexStack, { space: "xxxsmall", alignItems: "center", as: "h3", className: css.title },
|
|
39
|
-
React.createElement("span", null, metric.label),
|
|
40
|
-
showMetricDescriptionTooltip && (React.createElement(HoverCard, { label: React.createElement(Icon, { glyph: Icon.ICONS.HELP }), className: css.titleIcon },
|
|
41
|
-
React.createElement(MetricInfo, { ...metric })))),
|
|
42
|
-
!loading ? (React.createElement(Stack, null,
|
|
43
|
-
React.createElement(Metric, { className: css.currentMetric, value: current, formatter: metric.formatter, enhanced: true, inline: true }, showDelta && (React.createElement(Delta, { className: css.delta, displayValue: runInfo.displayDeltaPercentage, deltaType: runInfo.deltaType }))),
|
|
44
|
-
React.createElement(Metric, { className: css.baselineMetric, value: baseline, formatter: metric.formatter }))) : (React.createElement(Stack, null,
|
|
45
|
-
React.createElement(Skeleton, { as: "p", className: cx(css.currentMetric, css.loading) }),
|
|
46
|
-
React.createElement(Skeleton, { as: "p", className: cx(css.baselineMetric, css.loading) })))));
|
|
47
|
-
};
|
|
48
|
-
SummaryItem.defaultProps = {
|
|
49
|
-
className: '',
|
|
50
|
-
as: 'div',
|
|
51
|
-
data: null,
|
|
52
|
-
size: 'medium',
|
|
53
|
-
loading: false,
|
|
54
|
-
showMetricDescription: false,
|
|
55
|
-
showDelta: true,
|
|
56
|
-
};
|
|
57
|
-
SummaryItem.propTypes = {
|
|
58
|
-
className: PropTypes.string,
|
|
59
|
-
as: PropTypes.elementType,
|
|
60
|
-
size: PropTypes.oneOf(['medium', 'large']),
|
|
61
|
-
id: PropTypes.string.isRequired,
|
|
62
|
-
loading: PropTypes.bool,
|
|
63
|
-
data: PropTypes.object,
|
|
64
|
-
showMetricDescription: PropTypes.bool,
|
|
65
|
-
showDelta: PropTypes.bool,
|
|
66
|
-
};
|
|
67
|
-
//# sourceMappingURL=summary-item.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"summary-item.js","sourceRoot":"","sources":["../../../src/components/summary-item/summary-item.jsx"],"names":[],"mappings":"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"}
|
|
@@ -1,63 +0,0 @@
|
|
|
1
|
-
import React, { useMemo } from 'react';
|
|
2
|
-
import PropTypes from 'prop-types';
|
|
3
|
-
import cx from 'classnames';
|
|
4
|
-
|
|
5
|
-
import css from './metric.module.css';
|
|
6
|
-
|
|
7
|
-
// Separate value and unit
|
|
8
|
-
const EXTRACT_VALUE_UNIT_PATTERN = /([\d|.|,| ]*)(\w*|%)$/;
|
|
9
|
-
|
|
10
|
-
export const Metric = ({ className, value, formatter, inline, children, enhanced }) => {
|
|
11
|
-
const { displayValue, displayUnit } = useMemo(() => {
|
|
12
|
-
const formattedValue = formatter?.(value);
|
|
13
|
-
|
|
14
|
-
if (!formattedValue) {
|
|
15
|
-
return { displayValue: value };
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
if (!enhanced) {
|
|
19
|
-
return { displayValue: formattedValue };
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
const matches = formattedValue.match(EXTRACT_VALUE_UNIT_PATTERN);
|
|
23
|
-
|
|
24
|
-
if (!matches) {
|
|
25
|
-
return { displayValue: value };
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
return {
|
|
29
|
-
displayUnit: matches[2],
|
|
30
|
-
displayValue: matches[1],
|
|
31
|
-
};
|
|
32
|
-
}, [formatter, value]);
|
|
33
|
-
|
|
34
|
-
const rootClassName = cx(className, css.root, inline && css.inline);
|
|
35
|
-
|
|
36
|
-
return (
|
|
37
|
-
<div className={rootClassName}>
|
|
38
|
-
<div className={css.display}>
|
|
39
|
-
<span className={css.displayValue}>{displayValue}</span>
|
|
40
|
-
{displayUnit && <span className={css.displayUnit}>{displayUnit}</span>}
|
|
41
|
-
</div>
|
|
42
|
-
<div className={css.delta}>{children}</div>
|
|
43
|
-
</div>
|
|
44
|
-
);
|
|
45
|
-
};
|
|
46
|
-
|
|
47
|
-
Metric.defaultProps = {
|
|
48
|
-
className: '',
|
|
49
|
-
enhanced: false,
|
|
50
|
-
inline: false,
|
|
51
|
-
value: 0,
|
|
52
|
-
children: [],
|
|
53
|
-
formatter: (val) => val,
|
|
54
|
-
};
|
|
55
|
-
|
|
56
|
-
Metric.propTypes = {
|
|
57
|
-
className: PropTypes.string,
|
|
58
|
-
enhanced: PropTypes.bool,
|
|
59
|
-
inline: PropTypes.bool,
|
|
60
|
-
value: PropTypes.oneOfType([PropTypes.number, PropTypes.string]),
|
|
61
|
-
formatter: PropTypes.func,
|
|
62
|
-
children: PropTypes.node,
|
|
63
|
-
};
|
|
@@ -1,74 +0,0 @@
|
|
|
1
|
-
import React from 'react';
|
|
2
|
-
import PropTypes from 'prop-types';
|
|
3
|
-
import cx from 'classnames';
|
|
4
|
-
import get from 'lodash/get';
|
|
5
|
-
import { METRIC_COMPONENT_LINKS } from '@bundle-stats/utils';
|
|
6
|
-
|
|
7
|
-
import { METRICS_WEBPACK_GENERAL } from '../../constants';
|
|
8
|
-
import { Box } from '../../layout/box';
|
|
9
|
-
import { FlexStack } from '../../layout/flex-stack';
|
|
10
|
-
import { ComponentLink } from '../component-link';
|
|
11
|
-
import { SummaryItem } from '../summary-item';
|
|
12
|
-
import css from './summary.module.css';
|
|
13
|
-
|
|
14
|
-
export const Summary = ({
|
|
15
|
-
className,
|
|
16
|
-
size,
|
|
17
|
-
keys,
|
|
18
|
-
data,
|
|
19
|
-
loading,
|
|
20
|
-
showSummaryItemDelta,
|
|
21
|
-
summaryItemLink: SummaryItemCustomLink,
|
|
22
|
-
}) => (
|
|
23
|
-
<Box className={cx(css.root, className)}>
|
|
24
|
-
<FlexStack space="small" className={css.items}>
|
|
25
|
-
{Array.from(METRIC_COMPONENT_LINKS)
|
|
26
|
-
.filter(([metricId]) => keys.includes(metricId))
|
|
27
|
-
.map(([metricId, metricOptions]) => (
|
|
28
|
-
<Box
|
|
29
|
-
key={metricId}
|
|
30
|
-
outline
|
|
31
|
-
outlineHover
|
|
32
|
-
padding="small"
|
|
33
|
-
as={SummaryItemCustomLink}
|
|
34
|
-
{...metricOptions.link}
|
|
35
|
-
className={css.item}
|
|
36
|
-
>
|
|
37
|
-
<SummaryItem
|
|
38
|
-
size={size}
|
|
39
|
-
id={metricId}
|
|
40
|
-
data={get(data, metricId)}
|
|
41
|
-
loading={loading}
|
|
42
|
-
showMetricDescription
|
|
43
|
-
showDelta={showSummaryItemDelta && metricOptions.showDelta !== false}
|
|
44
|
-
/>
|
|
45
|
-
</Box>
|
|
46
|
-
))}
|
|
47
|
-
</FlexStack>
|
|
48
|
-
</Box>
|
|
49
|
-
);
|
|
50
|
-
|
|
51
|
-
Summary.defaultProps = {
|
|
52
|
-
className: '',
|
|
53
|
-
data: null,
|
|
54
|
-
loading: false,
|
|
55
|
-
size: '',
|
|
56
|
-
keys: METRICS_WEBPACK_GENERAL,
|
|
57
|
-
showSummaryItemDelta: true,
|
|
58
|
-
summaryItemLink: ComponentLink,
|
|
59
|
-
};
|
|
60
|
-
|
|
61
|
-
Summary.propTypes = {
|
|
62
|
-
className: PropTypes.string,
|
|
63
|
-
size: PropTypes.string,
|
|
64
|
-
keys: PropTypes.arrayOf(PropTypes.string),
|
|
65
|
-
data: PropTypes.shape({
|
|
66
|
-
[PropTypes.string]: PropTypes.shape({
|
|
67
|
-
baseline: PropTypes.number,
|
|
68
|
-
current: PropTypes.number,
|
|
69
|
-
}),
|
|
70
|
-
}),
|
|
71
|
-
loading: PropTypes.bool,
|
|
72
|
-
showSummaryItemDelta: PropTypes.bool,
|
|
73
|
-
summaryItemLink: PropTypes.elementType,
|
|
74
|
-
};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export * from './summary-item';
|
|
@@ -1,142 +0,0 @@
|
|
|
1
|
-
import React, { useCallback } from 'react';
|
|
2
|
-
import PropTypes from 'prop-types';
|
|
3
|
-
import cx from 'classnames';
|
|
4
|
-
import { getGlobalMetricType, getMetricRunInfo } from '@bundle-stats/utils';
|
|
5
|
-
|
|
6
|
-
import { Icon } from '../../ui/icon';
|
|
7
|
-
import { HoverCard } from '../../ui/hover-card';
|
|
8
|
-
import { Skeleton } from '../../ui/skeleton';
|
|
9
|
-
import { FlexStack } from '../../layout/flex-stack';
|
|
10
|
-
import { Stack } from '../../layout/stack';
|
|
11
|
-
import { Metric } from '../metric';
|
|
12
|
-
import { Delta } from '../delta';
|
|
13
|
-
import css from './summary-item.module.css';
|
|
14
|
-
|
|
15
|
-
const MetricInfo = ({ description, url }) => {
|
|
16
|
-
// The component parent can be rendered inside a link, use button to avoid using nested links
|
|
17
|
-
const onClick = useCallback(() => {
|
|
18
|
-
if (url) {
|
|
19
|
-
window.open(url);
|
|
20
|
-
}
|
|
21
|
-
}, [url]);
|
|
22
|
-
|
|
23
|
-
return (
|
|
24
|
-
<Stack space="xxxsmall">
|
|
25
|
-
<p>{description}</p>
|
|
26
|
-
{url && (
|
|
27
|
-
<p>
|
|
28
|
-
<button type="button" onClick={onClick} className={css.readMoreLink}>
|
|
29
|
-
Read more
|
|
30
|
-
</button>
|
|
31
|
-
</p>
|
|
32
|
-
)}
|
|
33
|
-
</Stack>
|
|
34
|
-
);
|
|
35
|
-
};
|
|
36
|
-
|
|
37
|
-
MetricInfo.propTypes = {
|
|
38
|
-
description: PropTypes.string.isRequired,
|
|
39
|
-
url: PropTypes.string,
|
|
40
|
-
};
|
|
41
|
-
|
|
42
|
-
MetricInfo.defaultProps = {
|
|
43
|
-
url: '',
|
|
44
|
-
};
|
|
45
|
-
|
|
46
|
-
export const SummaryItem = ({
|
|
47
|
-
className,
|
|
48
|
-
as: Component,
|
|
49
|
-
size,
|
|
50
|
-
id,
|
|
51
|
-
data,
|
|
52
|
-
loading,
|
|
53
|
-
showDelta,
|
|
54
|
-
showMetricDescription,
|
|
55
|
-
...props
|
|
56
|
-
}) => {
|
|
57
|
-
const { baseline, current } = data || { baseline: 0, current: 0 };
|
|
58
|
-
|
|
59
|
-
const metric = getGlobalMetricType(id);
|
|
60
|
-
const runInfo = getMetricRunInfo(metric, current, baseline);
|
|
61
|
-
const showMetricDescriptionTooltip = showMetricDescription && metric?.description;
|
|
62
|
-
|
|
63
|
-
const rootClassName = cx(css.root, className, css[size], showDelta && css.showDelta);
|
|
64
|
-
|
|
65
|
-
return (
|
|
66
|
-
<Stack space="xxsmall" as={Component} className={rootClassName} {...props}>
|
|
67
|
-
<FlexStack space="xxxsmall" alignItems="center" as="h3" className={css.title}>
|
|
68
|
-
<span>
|
|
69
|
-
{metric.label}
|
|
70
|
-
</span>
|
|
71
|
-
|
|
72
|
-
{showMetricDescriptionTooltip && (
|
|
73
|
-
<HoverCard label={<Icon glyph={Icon.ICONS.HELP} />} className={css.titleIcon}>
|
|
74
|
-
<MetricInfo {...metric} />
|
|
75
|
-
</HoverCard>
|
|
76
|
-
)}
|
|
77
|
-
</FlexStack>
|
|
78
|
-
|
|
79
|
-
{!loading ? (
|
|
80
|
-
<Stack>
|
|
81
|
-
<Metric
|
|
82
|
-
className={css.currentMetric}
|
|
83
|
-
value={current}
|
|
84
|
-
formatter={metric.formatter}
|
|
85
|
-
enhanced
|
|
86
|
-
inline
|
|
87
|
-
>
|
|
88
|
-
{showDelta && (
|
|
89
|
-
<Delta
|
|
90
|
-
className={css.delta}
|
|
91
|
-
displayValue={runInfo.displayDeltaPercentage}
|
|
92
|
-
deltaType={runInfo.deltaType}
|
|
93
|
-
/>
|
|
94
|
-
)}
|
|
95
|
-
</Metric>
|
|
96
|
-
<Metric className={css.baselineMetric} value={baseline} formatter={metric.formatter} />
|
|
97
|
-
</Stack>
|
|
98
|
-
) : (
|
|
99
|
-
<Stack>
|
|
100
|
-
<Skeleton as="p" className={cx(css.currentMetric, css.loading)} />
|
|
101
|
-
<Skeleton as="p" className={cx(css.baselineMetric, css.loading)} />
|
|
102
|
-
</Stack>
|
|
103
|
-
)}
|
|
104
|
-
</Stack>
|
|
105
|
-
);
|
|
106
|
-
};
|
|
107
|
-
|
|
108
|
-
SummaryItem.defaultProps = {
|
|
109
|
-
className: '',
|
|
110
|
-
as: 'div',
|
|
111
|
-
data: null,
|
|
112
|
-
size: 'medium',
|
|
113
|
-
loading: false,
|
|
114
|
-
showMetricDescription: false,
|
|
115
|
-
showDelta: true,
|
|
116
|
-
};
|
|
117
|
-
|
|
118
|
-
SummaryItem.propTypes = {
|
|
119
|
-
/** Adopted child class name */
|
|
120
|
-
className: PropTypes.string,
|
|
121
|
-
|
|
122
|
-
/** Custom component */
|
|
123
|
-
as: PropTypes.elementType,
|
|
124
|
-
|
|
125
|
-
/** Size modifier */
|
|
126
|
-
size: PropTypes.oneOf(['medium', 'large']),
|
|
127
|
-
|
|
128
|
-
/** Metric id */
|
|
129
|
-
id: PropTypes.string.isRequired,
|
|
130
|
-
|
|
131
|
-
/** Loading flag */
|
|
132
|
-
loading: PropTypes.bool,
|
|
133
|
-
|
|
134
|
-
/** Summary data */
|
|
135
|
-
data: PropTypes.object, // eslint-disable-line react/forbid-prop-types
|
|
136
|
-
|
|
137
|
-
/** Show description */
|
|
138
|
-
showMetricDescription: PropTypes.bool,
|
|
139
|
-
|
|
140
|
-
/** Show delta */
|
|
141
|
-
showDelta: PropTypes.bool,
|
|
142
|
-
};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export * from "./summary-item";
|