@levi-gemcommerce/analytics 0.0.1-dev.0
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/README.md +37 -0
- package/dist/esm/components/GMultipleMetricChartCard/GMultipleMetricChartCard.d.ts +14 -0
- package/dist/esm/components/GMultipleMetricChartCard/MetricCard.d.ts +10 -0
- package/dist/esm/components/GMultipleMetricChartCard/MetricChart.d.ts +12 -0
- package/dist/esm/components/GMultipleMetricChartCard/index.d.ts +2 -0
- package/dist/esm/components/GSelectableMetricChartCard/GSelectableMetricChartCard.d.ts +14 -0
- package/dist/esm/components/GSelectableMetricChartCard/MetricCard.d.ts +10 -0
- package/dist/esm/components/GSelectableMetricChartCard/MetricChart.d.ts +12 -0
- package/dist/esm/components/GSelectableMetricChartCard/MetricChartTab.d.ts +11 -0
- package/dist/esm/components/GSelectableMetricChartCard/MetricChartTabs.d.ts +11 -0
- package/dist/esm/components/GSelectableMetricChartCard/index.d.ts +2 -0
- package/dist/esm/components/GTooltipCard/GTooltipCard.d.ts +32 -0
- package/dist/esm/components/GTooltipCard/index.d.ts +2 -0
- package/dist/esm/components/PATrendBadge/PATrendBadge.d.ts +7 -0
- package/dist/esm/components/PATrendBadge/index.d.ts +1 -0
- package/dist/esm/components/SingleMetricChartCard/SingleMetricChartCard.d.ts +12 -0
- package/dist/esm/components/SingleMetricChartCard/index.d.ts +2 -0
- package/dist/esm/components/common/chart/ChartSkeleton.d.ts +1 -0
- package/dist/esm/components/common/chart/GChartSkeleton.d.ts +1 -0
- package/dist/esm/components/common/chart/MetricChart.d.ts +8 -0
- package/dist/esm/components/common/chart/MetricChartEmpty.d.ts +8 -0
- package/dist/esm/components/common/chart/MetricChartProvider.d.ts +6 -0
- package/dist/esm/components/common/chart/MetricChartTooltip.d.ts +6 -0
- package/dist/esm/components/common/chart/MetricInfoBlock.d.ts +13 -0
- package/dist/esm/components/common/chart/MetricInfoSkeleton.d.ts +4 -0
- package/dist/esm/components/common/chart/MetricTrend.d.ts +5 -0
- package/dist/esm/components/common/chart/MetricValueSummary.d.ts +8 -0
- package/dist/esm/components/common/chart/PAMetricInfoSkeleton.d.ts +4 -0
- package/dist/esm/components/common/chart/index.d.ts +7 -0
- package/dist/esm/components/common/icons/DownIcon8px.d.ts +1 -0
- package/dist/esm/components/common/icons/UpIcon8px.d.ts +1 -0
- package/dist/esm/components/common/icons/index.d.ts +2 -0
- package/dist/esm/components/common/percent/MetricPercentage.d.ts +4 -0
- package/dist/esm/components/common/percent/index.d.ts +1 -0
- package/dist/esm/components/index.d.ts +2 -0
- package/dist/esm/constants/analytic-metric-tooltip.d.ts +5 -0
- package/dist/esm/constants/chart.d.ts +13 -0
- package/dist/esm/constants/g-multiple-metric-chart-card.d.ts +13 -0
- package/dist/esm/constants/g-selectable-metric-chart-card.d.ts +13 -0
- package/dist/esm/constants/index.d.ts +3 -0
- package/dist/esm/constants/pa-trend-badge.d.ts +9 -0
- package/dist/esm/constants/thumbnail.d.ts +2 -0
- package/dist/esm/index.d.ts +2 -0
- package/dist/esm/index.js +391 -0
- package/dist/esm/index.mjs +391 -0
- package/dist/esm/providers/MetricChartProvider.d.ts +6 -0
- package/dist/esm/providers/index.d.ts +1 -0
- package/dist/esm/shared/components/GBlockCenter/GBlockCenter.d.ts +15 -0
- package/dist/esm/shared/components/GBlockCenter/index.d.ts +1 -0
- package/dist/esm/shared/components/GSkeletonDisplayText/GSkeletonDisplayText.d.ts +4 -0
- package/dist/esm/shared/components/GSkeletonDisplayText/index.d.ts +1 -0
- package/dist/esm/shared/components/GThumbnail/GThumbnail.d.ts +20 -0
- package/dist/esm/shared/components/GThumbnail/index.d.ts +1 -0
- package/dist/esm/shared/components/GTooltipCard/GTooltipCard.d.ts +32 -0
- package/dist/esm/shared/components/GTooltipCard/index.d.ts +2 -0
- package/dist/esm/shared/components/index.d.ts +4 -0
- package/dist/esm/shared/index.d.ts +1 -0
- package/dist/esm/types/chart.d.ts +19 -0
- package/dist/esm/types/index.d.ts +2 -0
- package/dist/esm/types/metric.d.ts +27 -0
- package/dist/esm/utils/cls.d.ts +4 -0
- package/dist/esm/utils/index.d.ts +3 -0
- package/dist/esm/utils/number.d.ts +5 -0
- package/dist/esm/utils/percentage.d.ts +10 -0
- package/dist/style.css +1 -0
- package/dist/umd/esm/components/GMultipleMetricChartCard/GMultipleMetricChartCard.d.ts +14 -0
- package/dist/umd/esm/components/GMultipleMetricChartCard/MetricCard.d.ts +10 -0
- package/dist/umd/esm/components/GMultipleMetricChartCard/MetricChart.d.ts +12 -0
- package/dist/umd/esm/components/GMultipleMetricChartCard/index.d.ts +2 -0
- package/dist/umd/esm/components/GSelectableMetricChartCard/GSelectableMetricChartCard.d.ts +14 -0
- package/dist/umd/esm/components/GSelectableMetricChartCard/MetricCard.d.ts +10 -0
- package/dist/umd/esm/components/GSelectableMetricChartCard/MetricChart.d.ts +12 -0
- package/dist/umd/esm/components/GSelectableMetricChartCard/MetricChartTab.d.ts +11 -0
- package/dist/umd/esm/components/GSelectableMetricChartCard/index.d.ts +2 -0
- package/dist/umd/esm/components/GTooltipCard/GTooltipCard.d.ts +32 -0
- package/dist/umd/esm/components/GTooltipCard/index.d.ts +2 -0
- package/dist/umd/esm/components/PATrendBadge/PATrendBadge.d.ts +7 -0
- package/dist/umd/esm/components/PATrendBadge/index.d.ts +1 -0
- package/dist/umd/esm/components/SingleMetricChartCard/SingleMetricChartCard.d.ts +12 -0
- package/dist/umd/esm/components/SingleMetricChartCard/index.d.ts +2 -0
- package/dist/umd/esm/components/common/chart/GChartSkeleton.d.ts +1 -0
- package/dist/umd/esm/components/common/chart/MetricChart.d.ts +8 -0
- package/dist/umd/esm/components/common/chart/MetricChartEmpty.d.ts +8 -0
- package/dist/umd/esm/components/common/chart/MetricChartProvider.d.ts +6 -0
- package/dist/umd/esm/components/common/chart/MetricChartTooltip.d.ts +6 -0
- package/dist/umd/esm/components/common/chart/MetricInfoBlock.d.ts +13 -0
- package/dist/umd/esm/components/common/chart/MetricInfoSkeleton.d.ts +4 -0
- package/dist/umd/esm/components/common/chart/MetricTrend.d.ts +5 -0
- package/dist/umd/esm/components/common/chart/MetricValueSummary.d.ts +8 -0
- package/dist/umd/esm/components/common/chart/PAMetricInfoSkeleton.d.ts +4 -0
- package/dist/umd/esm/components/common/chart/index.d.ts +7 -0
- package/dist/umd/esm/components/common/icons/DownIcon8px.d.ts +1 -0
- package/dist/umd/esm/components/common/icons/UpIcon8px.d.ts +1 -0
- package/dist/umd/esm/components/common/icons/index.d.ts +2 -0
- package/dist/umd/esm/components/common/percent/MetricPercentage.d.ts +4 -0
- package/dist/umd/esm/components/common/percent/index.d.ts +1 -0
- package/dist/umd/esm/components/index.d.ts +2 -0
- package/dist/umd/esm/constants/analytic-metric-tooltip.d.ts +5 -0
- package/dist/umd/esm/constants/chart.d.ts +13 -0
- package/dist/umd/esm/constants/g-multiple-metric-chart-card.d.ts +13 -0
- package/dist/umd/esm/constants/g-selectable-metric-chart-card.d.ts +12 -0
- package/dist/umd/esm/constants/index.d.ts +3 -0
- package/dist/umd/esm/constants/pa-trend-badge.d.ts +9 -0
- package/dist/umd/esm/constants/thumbnail.d.ts +2 -0
- package/dist/umd/esm/index.d.ts +2 -0
- package/dist/umd/esm/providers/MetricChartProvider.d.ts +6 -0
- package/dist/umd/esm/providers/index.d.ts +1 -0
- package/dist/umd/esm/shared/components/GBlockCenter/GBlockCenter.d.ts +15 -0
- package/dist/umd/esm/shared/components/GBlockCenter/index.d.ts +1 -0
- package/dist/umd/esm/shared/components/GSkeletonDisplayText/GSkeletonDisplayText.d.ts +4 -0
- package/dist/umd/esm/shared/components/GSkeletonDisplayText/index.d.ts +1 -0
- package/dist/umd/esm/shared/components/GThumbnail/GThumbnail.d.ts +20 -0
- package/dist/umd/esm/shared/components/GThumbnail/index.d.ts +1 -0
- package/dist/umd/esm/shared/components/GTooltipCard/GTooltipCard.d.ts +32 -0
- package/dist/umd/esm/shared/components/GTooltipCard/index.d.ts +2 -0
- package/dist/umd/esm/shared/components/index.d.ts +4 -0
- package/dist/umd/esm/shared/index.d.ts +1 -0
- package/dist/umd/esm/types/chart.d.ts +19 -0
- package/dist/umd/esm/types/index.d.ts +2 -0
- package/dist/umd/esm/types/metric.d.ts +27 -0
- package/dist/umd/esm/utils/cls.d.ts +4 -0
- package/dist/umd/esm/utils/index.d.ts +3 -0
- package/dist/umd/esm/utils/number.d.ts +5 -0
- package/dist/umd/esm/utils/percentage.d.ts +10 -0
- package/dist/umd/index.js +1 -0
- package/package.json +86 -0
|
@@ -0,0 +1,391 @@
|
|
|
1
|
+
"use client"
|
|
2
|
+
import { jsxs, Fragment, jsx } from 'react/jsx-runtime';
|
|
3
|
+
import { SkeletonDisplayText, Box, Popover, InlineStack, BlockStack, Text, List, Card, SkeletonBodyText, Icon } from '@shopify/polaris';
|
|
4
|
+
import { useMemo, forwardRef, useState, useRef, useImperativeHandle } from 'react';
|
|
5
|
+
import { PolarisVizProvider, LineChart } from '@shopify/polaris-viz';
|
|
6
|
+
import { ChevronRightIcon } from '@shopify/polaris-icons';
|
|
7
|
+
|
|
8
|
+
var EMetricKey;
|
|
9
|
+
(function (EMetricKey) {
|
|
10
|
+
EMetricKey["SESSION"] = "sessions";
|
|
11
|
+
EMetricKey["ORDERS"] = "orders";
|
|
12
|
+
EMetricKey["PAGE_VIEWS"] = "pageviews";
|
|
13
|
+
EMetricKey["VISITORS"] = "visitors";
|
|
14
|
+
EMetricKey["BOUNCE_RATE"] = "bounce_rate";
|
|
15
|
+
EMetricKey["CTR"] = "ctr";
|
|
16
|
+
EMetricKey["CONVERSION_RATE"] = "conversion_rate";
|
|
17
|
+
EMetricKey["AVG_TIME_ON_PAGE"] = "average_time_on_page";
|
|
18
|
+
EMetricKey["ADDED_TO_CART"] = "added_to_cart";
|
|
19
|
+
EMetricKey["ADD_TO_CART_RATE"] = "added_to_cart_rate";
|
|
20
|
+
EMetricKey["REACHED_CHECKOUT"] = "sessions_that_reached_checkout";
|
|
21
|
+
EMetricKey["COMPLETE_CHECKOUT"] = "sessions_that_completed_checkout";
|
|
22
|
+
EMetricKey["CART_ADDITION"] = "sessions_with_cart_additions";
|
|
23
|
+
EMetricKey["AOV"] = "aov";
|
|
24
|
+
EMetricKey["REVENUE"] = "revenue";
|
|
25
|
+
EMetricKey["RPV"] = "revenue_per_visitor";
|
|
26
|
+
})(EMetricKey || (EMetricKey = {}));
|
|
27
|
+
|
|
28
|
+
const ANALYTICS_METRIC_TOOLTIP = {
|
|
29
|
+
[EMetricKey.SESSION]: {
|
|
30
|
+
title: 'Sessions',
|
|
31
|
+
content: 'A period during which a visitor interacts with your online store',
|
|
32
|
+
},
|
|
33
|
+
[EMetricKey.VISITORS]: {
|
|
34
|
+
title: 'Visitors',
|
|
35
|
+
content: 'Number of unique individuals who visit your online store',
|
|
36
|
+
},
|
|
37
|
+
[EMetricKey.BOUNCE_RATE]: {
|
|
38
|
+
title: 'Bounce rate',
|
|
39
|
+
content: 'Percentage of visitors who leave your store after viewing only one page, without interacting further',
|
|
40
|
+
formula: (jsxs(Fragment, { children: [jsx("span", { className: "formula-variable", children: "Bounce rate" }), jsx("span", { children: " = " }), jsx("span", { className: "formula-input", children: "sessions with a pageview" }), jsx("span", { className: "formula-operator", children: " / " }), jsx("span", { className: "formula-input", children: "total sessions" })] })),
|
|
41
|
+
},
|
|
42
|
+
[EMetricKey.CTR]: {
|
|
43
|
+
title: 'Click-through rate',
|
|
44
|
+
content: 'Percentage of clicks to open new page, compared to the number of times the page was viewed',
|
|
45
|
+
formula: (jsxs(Fragment, { children: [jsx("span", { className: "formula-variable", children: "Click-through rate" }), jsx("span", { children: " = " }), jsx("span", { className: "formula-input", children: "total clicks" }), jsx("span", { className: "formula-operator", children: " / " }), jsx("span", { className: "formula-input", children: "total pageviews" })] })),
|
|
46
|
+
},
|
|
47
|
+
[EMetricKey.AVG_TIME_ON_PAGE]: {
|
|
48
|
+
title: 'Average time on page',
|
|
49
|
+
content: 'Average duration that visitors spend on a page before clicking to open new page',
|
|
50
|
+
formula: (jsxs(Fragment, { children: [jsx("span", { className: "formula-variable", children: "Average time on page" }), jsx("span", { children: " = " }), jsx("span", { className: "formula-input", children: "total time on page" }), jsx("span", { className: "formula-operator", children: " / " }), jsx("span", { className: "formula-input", children: "(total pageviews - total exits)" })] })),
|
|
51
|
+
},
|
|
52
|
+
[EMetricKey.PAGE_VIEWS]: {
|
|
53
|
+
title: 'Pageviews',
|
|
54
|
+
content: 'Number of times a page on your online store has been viewed by visitors',
|
|
55
|
+
},
|
|
56
|
+
[EMetricKey.RPV]: {
|
|
57
|
+
title: 'Revenue per visitor',
|
|
58
|
+
content: 'Average revenue generated from each visitor',
|
|
59
|
+
formula: (jsxs(Fragment, { children: [jsx("span", { className: "formula-variable", children: "Revenue per visitor" }), jsx("span", { children: " = " }), jsx("span", { className: "formula-input", children: "total revenue" }), jsx("span", { className: "formula-operator", children: " / " }), jsx("span", { className: "formula-input", children: "total visitors" })] })),
|
|
60
|
+
},
|
|
61
|
+
[EMetricKey.ADDED_TO_CART]: {
|
|
62
|
+
title: 'Added to cart',
|
|
63
|
+
content: 'Total number of the event when a customer adds a product to their cart on your online store',
|
|
64
|
+
},
|
|
65
|
+
[EMetricKey.REACHED_CHECKOUT]: {
|
|
66
|
+
title: 'Sessions that reached checkout',
|
|
67
|
+
content: 'Sessions in your online store in which the checkout page was reached',
|
|
68
|
+
},
|
|
69
|
+
[EMetricKey.COMPLETE_CHECKOUT]: {
|
|
70
|
+
title: 'Sessions that completed checkout',
|
|
71
|
+
content: 'Sessions in your online store in which a purchase was completed',
|
|
72
|
+
},
|
|
73
|
+
[EMetricKey.ORDERS]: {
|
|
74
|
+
title: 'Orders',
|
|
75
|
+
content: 'Number of orders that went through this pages',
|
|
76
|
+
},
|
|
77
|
+
[EMetricKey.CONVERSION_RATE]: {
|
|
78
|
+
title: 'Conversion rate',
|
|
79
|
+
content: 'Percentage of online store sessions that completed an order',
|
|
80
|
+
formula: (jsxs(Fragment, { children: [jsx("span", { className: "formula-variable", children: "Conversion rate" }), jsx("span", { children: " = " }), jsx("span", { className: "formula-input", children: "sessions that completed checkout" }), jsx("span", { className: "formula-operator", children: " / " }), jsx("span", { className: "formula-input", children: "total sessions" })] })),
|
|
81
|
+
},
|
|
82
|
+
[EMetricKey.AOV]: {
|
|
83
|
+
title: 'Average order value',
|
|
84
|
+
content: 'Average value of orders placed in your online store',
|
|
85
|
+
formula: (jsxs(Fragment, { children: [jsx("span", { className: "formula-variable", children: "Average order value" }), jsx("span", { children: " = " }), jsx("span", { className: "formula-input", children: "total revenue" }), jsx("span", { className: "formula-operator", children: " / " }), jsx("span", { className: "formula-input", children: "total orders" })] })),
|
|
86
|
+
},
|
|
87
|
+
[EMetricKey.REVENUE]: {
|
|
88
|
+
title: 'Revenue',
|
|
89
|
+
content: 'Total income generated from sales after discounts',
|
|
90
|
+
formula: (jsxs(Fragment, { children: [jsx("span", { className: "formula-variable", children: "Revenue" }), jsx("span", { children: " = " }), jsx("span", { className: "formula-input", children: "gross sales" }), jsx("span", { className: "formula-operator", children: " - " }), jsx("span", { className: "formula-input", children: "discounts" })] })),
|
|
91
|
+
},
|
|
92
|
+
[EMetricKey.ADD_TO_CART_RATE]: {
|
|
93
|
+
title: 'Add to cart rate',
|
|
94
|
+
content: 'Percentage of sessions in which the customer added item to the cart',
|
|
95
|
+
formula: (jsxs(Fragment, { children: [jsx("span", { className: "formula-variable", children: "Added to cart rate" }), jsx("span", { children: " = " }), jsx("span", { className: "formula-input", children: "sessions with cart additions" }), jsx("span", { className: "formula-operator", children: " / " }), jsx("span", { className: "formula-input", children: "total sessions" })] })),
|
|
96
|
+
},
|
|
97
|
+
[EMetricKey.CART_ADDITION]: {
|
|
98
|
+
title: 'Sessions with cart additions',
|
|
99
|
+
content: 'Sessions in your online store in which a visitor added item to the cart',
|
|
100
|
+
},
|
|
101
|
+
};
|
|
102
|
+
|
|
103
|
+
const DEFAULT_CURRENT_PERIOD_LABEL = 'Current';
|
|
104
|
+
const DEFAULT_PREVIOUS_PERIOD_LABEL = 'Previous';
|
|
105
|
+
const CHART_MIN_HEIGHT = 228;
|
|
106
|
+
const SERIES_COLORS = {
|
|
107
|
+
current: 'rgba(64, 176, 230, 1)',
|
|
108
|
+
comparison: 'rgba(161, 202, 231, 1)',
|
|
109
|
+
all: ['#2C7DFF', '#F34A70'],
|
|
110
|
+
};
|
|
111
|
+
const TREND_TONE = {
|
|
112
|
+
POSITIVE: '#007F5F',
|
|
113
|
+
NEUTRAL: '#4A4A4A',
|
|
114
|
+
};
|
|
115
|
+
const PLACEHOLDER_VALUE = '-';
|
|
116
|
+
|
|
117
|
+
var THUMB_PRODUCT_DEFAULT = "data:image/svg+xml;base64,PHN2ZwogIHdpZHRoPSI5MCIKICBoZWlnaHQ9IjcyIgogIHZpZXdCb3g9IjAgMCA5MCA3MiIKICBmaWxsPSJub25lIgogIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKPgogIDxwYXRoCiAgICBkPSJNNDguNzUgMzQuNUM0OS45OTI2IDM0LjUgNTEgMzMuNDkyNiA1MSAzMi4yNUM1MSAzMS4wMDc0IDQ5Ljk5MjYgMzAgNDguNzUgMzBDNDcuNTA3NCAzMCA0Ni41IDMxLjAwNzQgNDYuNSAzMi4yNUM0Ni41IDMzLjQ5MjYgNDcuNTA3NCAzNC41IDQ4Ljc1IDM0LjVaIgogICAgZmlsbD0iIzYxNjE2MSIKICAvPgogIDxwYXRoCiAgICBmaWxsUnVsZT0iZXZlbm9kZCIKICAgIGNsaXBSdWxlPSJldmVub2RkIgogICAgZD0iTTQzLjUyNjggMjYuMjVINDYuNDczMkM0Ny42OTI0IDI2LjI1IDQ4LjY3NTggMjYuMjUgNDkuNDcyMiAyNi4zMTVDNTAuMjkyMiAyNi4zODIgNTEuMDEyNCAyNi41MjM2IDUxLjY3ODcgMjYuODYzMUM1Mi43MzcxIDI3LjQwMjQgNTMuNTk3NiAyOC4yNjI5IDU0LjEzNjkgMjkuMzIxM0M1NC40NzY0IDI5Ljk4NzYgNTQuNjE4IDMwLjcwNzggNTQuNjg1IDMxLjUyNzhDNTQuNzUgMzIuMzI0MiA1NC43NSAzMy4zMDc2IDU0Ljc1IDM0LjUyNjhWMzcuNDczMkM1NC43NSAzOC42OTI0IDU0Ljc1IDM5LjY3NTggNTQuNjg1IDQwLjQ3MjJDNTQuNjE4IDQxLjI5MjIgNTQuNDc2NCA0Mi4wMTI0IDU0LjEzNjkgNDIuNjc4N0M1My41OTc2IDQzLjczNzEgNTIuNzM3MSA0NC41OTc2IDUxLjY3ODcgNDUuMTM2OUM1MS4wMTI0IDQ1LjQ3NjQgNTAuMjkyMiA0NS42MTggNDkuNDcyMiA0NS42ODVDNDguNjc1OCA0NS43NSA0Ny42OTI0IDQ1Ljc1IDQ2LjQ3MzIgNDUuNzVINDMuNTI2OEM0Mi4zMDc2IDQ1Ljc1IDQxLjMyNDIgNDUuNzUgNDAuNTI3OCA0NS42ODVDMzkuNzA3OCA0NS42MTggMzguOTg3NiA0NS40NzY0IDM4LjMyMTMgNDUuMTM2OUMzNy4yNjI5IDQ0LjU5NzYgMzYuNDAyNCA0My43MzcxIDM1Ljg2MzEgNDIuNjc4N0MzNS41MjM2IDQyLjAxMjQgMzUuMzgyIDQxLjI5MjIgMzUuMzE1IDQwLjQ3MjJDMzUuMjUgMzkuNjc1OCAzNS4yNSAzOC42OTI0IDM1LjI1IDM3LjQ3MzJWMzQuNTI2OEMzNS4yNSAzMy4zMDc2IDM1LjI1IDMyLjMyNDIgMzUuMzE1IDMxLjUyNzhDMzUuMzgyIDMwLjcwNzggMzUuNTIzNiAyOS45ODc2IDM1Ljg2MzEgMjkuMzIxM0MzNi40MDI0IDI4LjI2MjkgMzcuMjYyOSAyNy40MDI0IDM4LjMyMTMgMjYuODYzMUMzOC45ODc2IDI2LjUyMzYgMzkuNzA3OCAyNi4zODIgNDAuNTI3OCAyNi4zMTVDNDEuMzI0MiAyNi4yNSA0Mi4zMDc2IDI2LjI1IDQzLjUyNjggMjYuMjVaTTQwLjcxMSAyOC41NTc2QzQwLjAzMDIgMjguNjEzMiAzOS42MzkxIDI4LjcxNjkgMzkuMzQyOCAyOC44Njc5QzM4LjcwNzcgMjkuMTkxNCAzOC4xOTE0IDI5LjcwNzcgMzcuODY3OSAzMC4zNDI4QzM3LjcxNjkgMzAuNjM5MSAzNy42MTMyIDMxLjAzMDIgMzcuNTU3NiAzMS43MTFDMzcuNTAwOSAzMi40MDUgMzcuNSAzMy4yOTYzIDM3LjUgMzQuNTc1VjM2LjcxNzdMMzguNTg0MiAzNS40MTY3QzM5LjU3MjQgMzQuMjMwOSA0MS4zNjU1IDM0LjE0OTYgNDIuNDU2OSAzNS4yNDFMNDYuNSAzOS4yODQxTDQ4LjI2OTQgMzcuNTE0NkM0OS4zNzU3IDM2LjQwODMgNTEuMTk4IDM2LjUwOTMgNTIuMTc1NCAzNy43MzA5TDUyLjQ5OTUgMzguMTM2MUM1Mi41IDM3LjkxMzEgNTIuNSAzNy42NzY1IDUyLjUgMzcuNDI1VjM0LjU3NUM1Mi41IDMzLjI5NjMgNTIuNDk5MSAzMi40MDUgNTIuNDQyNCAzMS43MTFDNTIuMzg2OCAzMS4wMzAyIDUyLjI4MzEgMzAuNjM5MSA1Mi4xMzIxIDMwLjM0MjhDNTEuODA4NiAyOS43MDc3IDUxLjI5MjMgMjkuMTkxNCA1MC42NTcyIDI4Ljg2NzlDNTAuMzYwOSAyOC43MTY5IDQ5Ljk2OTggMjguNjEzMiA0OS4yODkgMjguNTU3NkM0OC41OTUgMjguNTAwOSA0Ny43MDM3IDI4LjUgNDYuNDI1IDI4LjVINDMuNTc1QzQyLjI5NjMgMjguNSA0MS40MDUgMjguNTAwOSA0MC43MTEgMjguNTU3NlpNMzcuNTU3NiA0MC4yODlDMzcuNTU0MyA0MC4yNDkyIDM3LjU1MTMgNDAuMjA4OCAzNy41NDg0IDQwLjE2NzhDMzcuNTcxMSA0MC4xNDQ4IDM3LjU5MzEgNDAuMTIwNiAzNy42MTQyIDQwLjA5NTNMNDAuMzEyNyAzNi44NTcxQzQwLjQ1MzkgMzYuNjg3NyA0MC43MSAzNi42NzYxIDQwLjg2NTkgMzYuODMyTDQ1LjcwNDUgNDEuNjcwNkM0Ni4xNDM4IDQyLjEwOTkgNDYuODU2MSA0Mi4xMDk5IDQ3LjI5NTUgNDEuNjcwNkw0OS44NjA0IDM5LjEwNTZDNTAuMDE4NSAzOC45NDc2IDUwLjI3ODggMzguOTYyIDUwLjQxODQgMzkuMTM2NUw1Mi4yMzc3IDQxLjQxMDdDNTIuMjA1NiA0MS41MDEgNTIuMTcwNCA0MS41ODIyIDUyLjEzMjEgNDEuNjU3MkM1MS44MDg2IDQyLjI5MjMgNTEuMjkyMyA0Mi44MDg2IDUwLjY1NzIgNDMuMTMyMUM1MC4zNjA5IDQzLjI4MzEgNDkuOTY5OCA0My4zODY4IDQ5LjI4OSA0My40NDI0QzQ4LjU5NSA0My40OTkxIDQ3LjcwMzcgNDMuNSA0Ni40MjUgNDMuNUg0My41NzVDNDIuMjk2MyA0My41IDQxLjQwNSA0My40OTkxIDQwLjcxMSA0My40NDI0QzQwLjAzMDIgNDMuMzg2OCAzOS42MzkxIDQzLjI4MzEgMzkuMzQyOCA0My4xMzIxQzM4LjcwNzcgNDIuODA4NiAzOC4xOTE0IDQyLjI5MjMgMzcuODY3OSA0MS42NTcyQzM3LjcxNjkgNDEuMzYwOSAzNy42MTMyIDQwLjk2OTggMzcuNTU3NiA0MC4yODlaIgogICAgZmlsbD0iIzYxNjE2MSIKICAvPgo8L3N2Zz4K";
|
|
118
|
+
|
|
119
|
+
const GSkeletonDisplayText = (props) => {
|
|
120
|
+
const height = props.height ?? '50px';
|
|
121
|
+
return (jsxs("div", { className: "Polaris-GSkeletonDisplayText", children: [jsx("style", { children: `.Polaris-GSkeletonDisplayText .Polaris-SkeletonDisplayText__DisplayText { height: ${height} !important; }` }), jsx(SkeletonDisplayText, { maxWidth: "100%", size: "extraLarge" })] }));
|
|
122
|
+
};
|
|
123
|
+
|
|
124
|
+
const GBlockCenter = ({ height, align, inlineAlign, display, ...props }) => {
|
|
125
|
+
const stickyStyle = useMemo(() => {
|
|
126
|
+
if (props.position !== 'sticky')
|
|
127
|
+
return {};
|
|
128
|
+
const style = {
|
|
129
|
+
position: 'sticky',
|
|
130
|
+
};
|
|
131
|
+
if (props.insetInlineStart)
|
|
132
|
+
style.insetInlineStart = Number(props.insetInlineStart) * 4;
|
|
133
|
+
if (props.insetInlineEnd)
|
|
134
|
+
style.insetInlineEnd = Number(props.insetInlineEnd) * 4;
|
|
135
|
+
if (props.insetBlockStart)
|
|
136
|
+
style.insetBlockStart = Number(props.insetBlockStart) * 4;
|
|
137
|
+
if (props.insetBlockEnd)
|
|
138
|
+
style.insetBlockEnd = Number(props.insetBlockEnd) * 4;
|
|
139
|
+
return style;
|
|
140
|
+
}, [props.position, props.insetInlineStart, props.insetInlineEnd, props.insetBlockStart, props.insetBlockEnd]);
|
|
141
|
+
return (jsx("div", { className: "Polaris-GBlockCenter", style: {
|
|
142
|
+
...stickyStyle,
|
|
143
|
+
'--gp-block-center-height': height,
|
|
144
|
+
'--gp-block-center-display': display,
|
|
145
|
+
'--gp-block-center-align': align,
|
|
146
|
+
'--gp-block-center-inline-align': inlineAlign,
|
|
147
|
+
'--gp-block-center-overflow-x': props.overflowX,
|
|
148
|
+
'--gp-block-center-overflow-y': props.overflowY,
|
|
149
|
+
}, children: jsx(Box, { ...props }) }));
|
|
150
|
+
};
|
|
151
|
+
|
|
152
|
+
const TRIM_DECIMAL_ZEROS_REGEX = /\.0+$/;
|
|
153
|
+
const DEFAULT_DECIMALS = 2;
|
|
154
|
+
const trimDecimalZeros = (number) => {
|
|
155
|
+
return `${number}`.replace(TRIM_DECIMAL_ZEROS_REGEX, '');
|
|
156
|
+
};
|
|
157
|
+
const cleanDecimal = (number, decimals = DEFAULT_DECIMALS) => {
|
|
158
|
+
return trimDecimalZeros(number.toFixed(decimals));
|
|
159
|
+
};
|
|
160
|
+
|
|
161
|
+
/**
|
|
162
|
+
* Utility function to calculate percentage and format it.
|
|
163
|
+
* @param part - The part value.
|
|
164
|
+
* @param total - The total value.
|
|
165
|
+
* @param decimals - The number of decimal places to format the percentage to.
|
|
166
|
+
* @returns The formatted percentage as a string.
|
|
167
|
+
*/
|
|
168
|
+
const PERCENTAGE_THRESHOLD = 0.005;
|
|
169
|
+
const PERCENTAGE_THRESHOLD_STRING = '~0%';
|
|
170
|
+
const isLessThanThreshold = (percentage) => percentage > 0 && percentage < PERCENTAGE_THRESHOLD;
|
|
171
|
+
const formatPercentage = (percentage, decimals = DEFAULT_DECIMALS) => {
|
|
172
|
+
if (isLessThanThreshold(percentage)) {
|
|
173
|
+
return PERCENTAGE_THRESHOLD_STRING;
|
|
174
|
+
}
|
|
175
|
+
return `${cleanDecimal(percentage, decimals)}%`;
|
|
176
|
+
};
|
|
177
|
+
|
|
178
|
+
function toVal(mix) {
|
|
179
|
+
if (typeof mix === 'string') {
|
|
180
|
+
return mix;
|
|
181
|
+
}
|
|
182
|
+
else if (typeof mix === 'object' && mix !== null) {
|
|
183
|
+
return Object.keys(mix)
|
|
184
|
+
.filter((key) => mix[key])
|
|
185
|
+
.join(' ');
|
|
186
|
+
}
|
|
187
|
+
else {
|
|
188
|
+
return false;
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
function cls(...classes) {
|
|
192
|
+
return classes.map(toVal).filter(Boolean).join(' ');
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
/**
|
|
196
|
+
* Helper function to generate a variation class name.
|
|
197
|
+
* @param name - Base name of the class.
|
|
198
|
+
* @param value - Variation value to append.
|
|
199
|
+
* @returns Combined class name.
|
|
200
|
+
*/
|
|
201
|
+
function variationName(name, value) {
|
|
202
|
+
return `${name}${value.charAt(0).toUpperCase()}${value.slice(1)}`;
|
|
203
|
+
}
|
|
204
|
+
const GThumbnail = ({ source, alt, size, grayscale, defaultSource = THUMB_PRODUCT_DEFAULT, width = '80', height = '80', classRemoved = false, }) => {
|
|
205
|
+
const sizeClass = size && variationName('Polaris-Thumbnail--size', size);
|
|
206
|
+
const filterClass = grayscale && 'Polaris-GThumbnail--filter';
|
|
207
|
+
const className = cls('Polaris-Thumbnail', sizeClass);
|
|
208
|
+
const thumbnail = (jsx("img", { onError: (e) => {
|
|
209
|
+
e.currentTarget.src = defaultSource;
|
|
210
|
+
}, alt: alt ?? 'Thumbnail', src: `${source ?? defaultSource}`, width: width, height: height, style: {
|
|
211
|
+
'--gp-grayscale-percentage': grayscale || '100%',
|
|
212
|
+
}, className: cls('Polaris-GThumbnail', filterClass) }));
|
|
213
|
+
if (classRemoved)
|
|
214
|
+
return thumbnail;
|
|
215
|
+
return jsx("span", { className: className, children: thumbnail });
|
|
216
|
+
};
|
|
217
|
+
|
|
218
|
+
const SIZE_CLASS = {
|
|
219
|
+
default: 'w-[210px]',
|
|
220
|
+
wide: 'w-[320px]',
|
|
221
|
+
large: 'w-[328px]',
|
|
222
|
+
};
|
|
223
|
+
const ALIGNMENT_MAP = {
|
|
224
|
+
start: 'flex justify-start',
|
|
225
|
+
center: 'flex justify-center',
|
|
226
|
+
end: 'flex justify-end',
|
|
227
|
+
};
|
|
228
|
+
const GTooltipCard = forwardRef((props, ref) => {
|
|
229
|
+
const { tooltip, wrapper = 'div', activatorProps, isHideBorder, alignment, delay = 500, textDecoration = 'none', popoverRef, preferredAlignment = 'left', showArrow = false, } = props;
|
|
230
|
+
const { width = 'default' } = tooltip ?? {};
|
|
231
|
+
const [isMouseEnter, setIsMouseEnter] = useState(false);
|
|
232
|
+
const TooltipCardWrapper = wrapper;
|
|
233
|
+
const sizeClass = SIZE_CLASS[width];
|
|
234
|
+
const timeoutRef = useRef(null);
|
|
235
|
+
const handleMouseEnter = () => {
|
|
236
|
+
timeoutRef.current = setTimeout(() => {
|
|
237
|
+
setIsMouseEnter(true);
|
|
238
|
+
}, delay);
|
|
239
|
+
};
|
|
240
|
+
const handleMouseLeave = () => {
|
|
241
|
+
if (timeoutRef.current) {
|
|
242
|
+
clearTimeout(timeoutRef.current);
|
|
243
|
+
timeoutRef.current = null;
|
|
244
|
+
}
|
|
245
|
+
setIsMouseEnter(false);
|
|
246
|
+
};
|
|
247
|
+
useImperativeHandle(ref, () => ({ onClose: handleMouseLeave }));
|
|
248
|
+
return (jsx(TooltipCardWrapper, { className: cls('GTooltipCard cursor-pointer', alignment && ALIGNMENT_MAP[alignment], {
|
|
249
|
+
'GTooltipCard--text-underline': textDecoration === 'underline',
|
|
250
|
+
}), onMouseEnter: handleMouseEnter, onMouseLeave: handleMouseLeave, children: jsx(Popover, { ref: popoverRef, activator: !isHideBorder ? (jsx(Box, { borderBlockEndWidth: "025", borderStyle: "dashed", borderColor: "border-tertiary", as: wrapper, ...activatorProps, children: props.children })) : (jsx(InlineStack, { children: props.children })), activatorWrapper: wrapper, onClose: () => { }, active: isMouseEnter, preferredPosition: "below", preferredAlignment: preferredAlignment, children: tooltip && (jsx("div", { className: cls(sizeClass, { 'GTooltipCard-arrow': showArrow }), children: jsx(Box, { padding: "400", children: jsxs(BlockStack, { gap: "200", children: [jsxs(BlockStack, { gap: "100", children: [jsx(Text, { as: "span", variant: "headingSm", fontWeight: "semibold", children: tooltip.title }), jsxs(BlockStack, { gap: "400", children: [jsx(Text, { as: "span", variant: "bodyMd", tone: "subdued", fontWeight: "medium", children: jsx("span", { dangerouslySetInnerHTML: { __html: tooltip.content } }) }), tooltip.contentList && (jsx(List, { type: "bullet", children: tooltip.contentList.map((item) => (jsx(List.Item, { children: jsx(Text, { as: "span", variant: "bodyMd", tone: "subdued", fontWeight: "medium", children: item }) }, item))) }))] })] }), tooltip.formula && (jsx("div", { className: "rounded-md font-mono", style: { fontSize: '12px' }, children: tooltip.formula }))] }) }) })) }) }));
|
|
251
|
+
});
|
|
252
|
+
GTooltipCard.displayName = 'GTooltipCard';
|
|
253
|
+
|
|
254
|
+
const GChartSkeleton = () => {
|
|
255
|
+
return jsx(GSkeletonDisplayText, { height: "188px" });
|
|
256
|
+
};
|
|
257
|
+
|
|
258
|
+
const MetricChartProvider = ({ children, minHeight = CHART_MIN_HEIGHT }) => {
|
|
259
|
+
return (jsx(PolarisVizProvider, { themes: {
|
|
260
|
+
Light: {
|
|
261
|
+
chartContainer: {
|
|
262
|
+
minHeight,
|
|
263
|
+
},
|
|
264
|
+
grid: {
|
|
265
|
+
horizontalOverflow: true,
|
|
266
|
+
verticalOverflow: true,
|
|
267
|
+
horizontalMargin: 0,
|
|
268
|
+
},
|
|
269
|
+
seriesColors: {
|
|
270
|
+
comparison: SERIES_COLORS.comparison,
|
|
271
|
+
single: SERIES_COLORS.current,
|
|
272
|
+
all: [...SERIES_COLORS.all],
|
|
273
|
+
},
|
|
274
|
+
},
|
|
275
|
+
}, children: children }));
|
|
276
|
+
};
|
|
277
|
+
|
|
278
|
+
const defaultFormatValue = (value) => String(value);
|
|
279
|
+
const MetricChart = ({ lineChartData, isLoading, isEmptyMetricData }) => {
|
|
280
|
+
if (isLoading) {
|
|
281
|
+
return jsx(GChartSkeleton, {});
|
|
282
|
+
}
|
|
283
|
+
if (isEmptyMetricData) {
|
|
284
|
+
return jsx(MetricChartEmpty, { title: "No data yet", description: "Data needs time to gather" });
|
|
285
|
+
}
|
|
286
|
+
return (jsx(MetricChartProvider, { children: jsx(LineChart, { data: lineChartData, yAxisOptions: { labelFormatter: (value) => defaultFormatValue(Number(value) || 0) }, theme: "Light", tooltipOptions: {
|
|
287
|
+
keyFormatter: (value) => value,
|
|
288
|
+
renderTooltipContent(data) {
|
|
289
|
+
return jsx(MetricChartTooltip, { data: data, formatValue: defaultFormatValue });
|
|
290
|
+
},
|
|
291
|
+
}, showLegend: true }) }));
|
|
292
|
+
};
|
|
293
|
+
|
|
294
|
+
var IMAGE_ANALYTIC_EMPTY = "data:image/png;base64,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";
|
|
295
|
+
|
|
296
|
+
const MetricChartEmpty = ({ boxProps, minHeight, description, title }) => {
|
|
297
|
+
return (jsx(Box, { minWidth: "100%", ...boxProps, children: jsx(GBlockCenter, { minHeight: minHeight, children: jsx(Box, { padding: '400', children: jsxs(BlockStack, { gap: "400", align: "center", inlineAlign: "center", children: [jsx("div", { className: "h-[80px] w-[80px]", children: jsx(GThumbnail, { source: IMAGE_ANALYTIC_EMPTY, width: "80px", height: "80px", alt: title, classRemoved: true }) }), jsxs(BlockStack, { gap: "200", align: "center", inlineAlign: "center", children: [jsx(Text, { as: "h4", variant: "headingSm", fontWeight: "semibold", children: title }), jsx(Text, { as: "h4", variant: "bodyMd", tone: "subdued", children: description })] })] }) }) }) }));
|
|
298
|
+
};
|
|
299
|
+
|
|
300
|
+
const DownIcon8px = () => {
|
|
301
|
+
return (jsxs("svg", { width: "8", height: "8", viewBox: "0 0 8 8", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: [jsx("g", { clipPath: "url(#clip0_18114_1160)", children: jsx("path", { d: "M1 1L6.5 6.5M6.5 6.5V1.5M6.5 6.5H1.5", stroke: "#8A8A8A", strokeWidth: "1.5" }) }), jsx("defs", { children: jsx("clipPath", { id: "clip0_18114_1160", children: jsx("rect", { width: "8", height: "8", fill: "white" }) }) })] }));
|
|
302
|
+
};
|
|
303
|
+
|
|
304
|
+
const UpIcon8px = () => {
|
|
305
|
+
return (jsxs("svg", { width: "8", height: "8", viewBox: "0 0 8 8", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: [jsx("g", { clipPath: "url(#clip0_18114_1146)", children: jsx("path", { d: "M1 7L6.5 1.5M6.5 1.5H1.5M6.5 1.5V6.5", stroke: "#29845A", strokeWidth: "1.5" }) }), jsx("defs", { children: jsx("clipPath", { id: "clip0_18114_1146", children: jsx("rect", { width: "8", height: "8", fill: "white", transform: "matrix(0 -1 1 0 0 8)" }) }) })] }));
|
|
306
|
+
};
|
|
307
|
+
|
|
308
|
+
const MetricPercentage = ({ change }) => {
|
|
309
|
+
if (typeof change !== 'number') {
|
|
310
|
+
return jsx("div", { style: { height: '2px', width: '11px', backgroundColor: '#8A8A8A' } });
|
|
311
|
+
}
|
|
312
|
+
return (jsxs("div", { style: {
|
|
313
|
+
display: 'flex',
|
|
314
|
+
maxHeight: '20px',
|
|
315
|
+
width: 'fit-content',
|
|
316
|
+
alignItems: 'center',
|
|
317
|
+
gap: '4px',
|
|
318
|
+
borderRadius: '8px',
|
|
319
|
+
fontSize: '12px',
|
|
320
|
+
color: change > 0 ? TREND_TONE.POSITIVE : TREND_TONE.NEUTRAL,
|
|
321
|
+
}, children: [change < 0 && (jsx(InlineStack, { align: "center", children: jsx(DownIcon8px, {}) })), change > 0 && (jsx(InlineStack, { align: "center", children: jsx(UpIcon8px, {}) })), jsx(Text, { as: "span", variant: "bodyXs", fontWeight: "semibold", children: formatPercentage(Math.abs(change || 0)) })] }));
|
|
322
|
+
};
|
|
323
|
+
|
|
324
|
+
const MetricChartTooltip = ({ data, formatValue }) => {
|
|
325
|
+
const { activeIndex } = data;
|
|
326
|
+
const currentData = data?.dataSeries[0]?.data[activeIndex];
|
|
327
|
+
const previousData = data?.dataSeries[1]?.data[activeIndex];
|
|
328
|
+
const formatPercent = () => {
|
|
329
|
+
const value = currentData.trend?.value;
|
|
330
|
+
if (!value)
|
|
331
|
+
return PLACEHOLDER_VALUE;
|
|
332
|
+
const valueNumber = Number(value.replace(/[%~]/g, ''));
|
|
333
|
+
if (currentData.trend?.trend === 'negative') {
|
|
334
|
+
return valueNumber * -1;
|
|
335
|
+
}
|
|
336
|
+
return valueNumber;
|
|
337
|
+
};
|
|
338
|
+
return (jsx("div", { className: "w-fit min-w-[175px]", children: jsx(Card, { padding: '200', children: jsxs(BlockStack, { gap: '100', children: [jsx(Text, { as: "p", variant: "bodySm", fontWeight: "semibold", children: data.formatters?.titleFormatter?.(data.title || '') || data.title }), jsxs(BlockStack, { gap: '100', children: [jsxs(InlineStack, { gap: '400', align: "space-between", blockAlign: "center", children: [jsxs(InlineStack, { gap: '100', blockAlign: "center", children: [jsx("div", { className: "h-[2px] w-[12px] rounded-[10px] bg-[#4FA9EA]" }), jsx(Text, { as: "p", variant: "bodySm", fontWeight: "medium", tone: "subdued", children: currentData.tooltipKey })] }), jsxs(InlineStack, { blockAlign: "center", gap: "100", children: [jsx(Text, { as: "span", variant: "bodySm", fontWeight: "semibold", children: formatValue(currentData.value) }), jsx(MetricPercentage, { change: formatPercent() })] })] }), jsxs(InlineStack, { gap: '400', align: "space-between", blockAlign: "center", children: [jsxs(InlineStack, { gap: '100', blockAlign: "center", children: [jsx("div", { className: "w-[12px] border border-dashed border-[#A1CAE7]" }), jsx(Text, { as: "p", variant: "bodySm", tone: "subdued", fontWeight: "medium", children: previousData.tooltipKey })] }), jsxs(InlineStack, { blockAlign: "center", gap: "100", children: [jsx(Text, { as: "span", variant: "bodySm", fontWeight: "semibold", children: formatValue(previousData.value) }), jsx("div", { className: "opacity-0", children: jsx(MetricPercentage, { change: formatPercent() }) })] })] })] })] }) }) }));
|
|
339
|
+
};
|
|
340
|
+
|
|
341
|
+
const MetricInfoSkeleton = ({ isShowOneLine }) => {
|
|
342
|
+
if (isShowOneLine) {
|
|
343
|
+
return (jsx(Box, { width: "40%", children: jsx(SkeletonBodyText, { lines: 1 }) }));
|
|
344
|
+
}
|
|
345
|
+
return (jsxs(BlockStack, { gap: "200", children: [jsx(Box, { width: "60%", children: jsx(SkeletonBodyText, { lines: 1 }) }), jsx(Box, { width: "40%", children: jsx(SkeletonBodyText, { lines: 1 }) })] }));
|
|
346
|
+
};
|
|
347
|
+
|
|
348
|
+
const MetricValueSummary = ({ totalValue, hideComparison }) => (jsx(BlockStack, { gap: "200", children: jsxs(InlineStack, { blockAlign: "center", gap: "200", wrap: false, children: [jsx(InlineStack, { blockAlign: "center", gap: "200", children: jsx(Text, { as: "span", variant: "headingSm", children: totalValue.value }) }), !hideComparison && jsx(MetricPercentage, { change: totalValue.change })] }) }));
|
|
349
|
+
|
|
350
|
+
const MetricInfoBlock = ({ item, isHovered, isLoading, hideComparison, titleVariant = 'headingMd', titleFontWeight, onClickTitle, }) => {
|
|
351
|
+
const { key, title, totalValue } = item;
|
|
352
|
+
const tooltip = ANALYTICS_METRIC_TOOLTIP[key];
|
|
353
|
+
if (isLoading)
|
|
354
|
+
return jsx(MetricInfoSkeleton, {});
|
|
355
|
+
return (jsxs(BlockStack, { gap: "200", children: [jsx("div", { className: "hover:cursor-pointer hover:text-[--p-color-text-link-hover]", onClick: (e) => {
|
|
356
|
+
e?.stopPropagation();
|
|
357
|
+
onClickTitle?.(key);
|
|
358
|
+
}, children: jsxs(InlineStack, { wrap: false, children: [jsx(Box, { maxWidth: "100%", overflowX: "hidden", children: jsx(GTooltipCard, { tooltip: tooltip, children: jsx(Text, { as: "span", variant: titleVariant, fontWeight: titleFontWeight, truncate: true, children: title }) }) }), isHovered && (jsx("div", { className: "flex h-[20px] w-[20px] items-center", children: jsx(Icon, { source: ChevronRightIcon, tone: "inherit" }) }))] }) }), jsx(MetricValueSummary, { totalValue: totalValue, hideComparison: hideComparison })] }));
|
|
359
|
+
};
|
|
360
|
+
|
|
361
|
+
const MetricChartTab = ({ item, isActive, isLoading, hideComparison, onSelect, onClickTitle, }) => {
|
|
362
|
+
const [isHovered, setIsHovered] = useState(false);
|
|
363
|
+
const isHighlighted = isActive || isHovered;
|
|
364
|
+
return (jsx("div", { className: "w-full cursor-pointer overflow-hidden", onMouseEnter: () => setIsHovered(true), onMouseLeave: () => setIsHovered(false), onClick: () => onSelect(item.key), children: jsx(Box, { paddingBlock: "150", paddingInline: "300", borderRadius: "200", background: isHighlighted ? 'bg-surface-active' : undefined, children: jsx(MetricInfoBlock, { item: item, isHovered: isHovered, isLoading: isLoading, hideComparison: hideComparison, titleVariant: "headingSm", titleFontWeight: "semibold", onClickTitle: onClickTitle }) }) }));
|
|
365
|
+
};
|
|
366
|
+
|
|
367
|
+
const GSelectableMetricChartCard = ({ metricInfo, dataChart, defaultActiveTab, isLoading, isEmptyMetricData, hideComparison, currentPeriodLabel = DEFAULT_CURRENT_PERIOD_LABEL, previousPeriodLabel = DEFAULT_PREVIOUS_PERIOD_LABEL, }) => {
|
|
368
|
+
const [activeTab, setActiveTab] = useState(defaultActiveTab);
|
|
369
|
+
const lineChartData = useMemo(() => {
|
|
370
|
+
const chartData = activeTab ? dataChart[activeTab] : undefined;
|
|
371
|
+
if (!chartData)
|
|
372
|
+
return [];
|
|
373
|
+
const currentSeries = { name: currentPeriodLabel, data: chartData.current };
|
|
374
|
+
if (hideComparison)
|
|
375
|
+
return [currentSeries];
|
|
376
|
+
return [currentSeries, { name: previousPeriodLabel, data: chartData.previous, isComparison: true }];
|
|
377
|
+
}, [activeTab, dataChart, hideComparison, currentPeriodLabel, previousPeriodLabel]);
|
|
378
|
+
return (jsxs(Card, { children: [jsx("div", { style: {
|
|
379
|
+
display: 'grid',
|
|
380
|
+
gridTemplateColumns: `repeat(${metricInfo.length}, 1fr)`,
|
|
381
|
+
gap: '16px',
|
|
382
|
+
marginBottom: '16px',
|
|
383
|
+
}, children: metricInfo.map((item) => (jsx(MetricChartTab, { item: item, isActive: activeTab === item.key, isLoading: isLoading, hideComparison: hideComparison, onSelect: setActiveTab }, item.key))) }), jsx(MetricChart, { lineChartData: lineChartData, isLoading: isLoading, isEmptyMetricData: isEmptyMetricData })] }));
|
|
384
|
+
};
|
|
385
|
+
|
|
386
|
+
const SingleMetricChartCard = ({ metricInfo, lineChartData, isLoading, hideComparison, isEmptyMetricData, onClickTitle, }) => {
|
|
387
|
+
const [isHovered, setIsHovered] = useState(false);
|
|
388
|
+
return (jsx("div", { onMouseEnter: () => setIsHovered(true), onMouseLeave: () => setIsHovered(false), children: jsx(Card, { children: jsxs(BlockStack, { gap: "200", children: [jsx(MetricInfoBlock, { item: metricInfo, isHovered: isHovered, isLoading: isLoading, hideComparison: hideComparison, onClickTitle: onClickTitle }), jsx(MetricChart, { lineChartData: lineChartData, isLoading: isLoading, isEmptyMetricData: isEmptyMetricData })] }) }) }));
|
|
389
|
+
};
|
|
390
|
+
|
|
391
|
+
export { EMetricKey, GSelectableMetricChartCard, SingleMetricChartCard };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { MetricChartProvider } from './MetricChartProvider';
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { type CSSProperties } from 'react';
|
|
2
|
+
import type { BoxProps } from '@shopify/polaris';
|
|
3
|
+
import './GBlockCenter.scss';
|
|
4
|
+
export type SpaceScale = '0' | '025' | '050' | '100' | '150' | '200' | '300' | '400' | '500' | '600' | '800' | '1000' | '1200' | '1600' | '2000' | '2400' | '2800' | '3200';
|
|
5
|
+
export interface GBlockCenterProps extends Omit<BoxProps, 'insetInlineStart' | 'insetInlineEnd' | 'insetBlockStart' | 'insetBlockEnd'> {
|
|
6
|
+
height?: string;
|
|
7
|
+
align?: 'center' | 'start' | 'end';
|
|
8
|
+
inlineAlign?: 'center' | 'start' | 'end';
|
|
9
|
+
display?: CSSProperties['display'];
|
|
10
|
+
insetInlineStart?: SpaceScale;
|
|
11
|
+
insetInlineEnd?: SpaceScale;
|
|
12
|
+
insetBlockStart?: SpaceScale;
|
|
13
|
+
insetBlockEnd?: SpaceScale;
|
|
14
|
+
}
|
|
15
|
+
export declare const GBlockCenter: ({ height, align, inlineAlign, display, ...props }: GBlockCenterProps) => import("react/jsx-runtime").JSX.Element;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './GBlockCenter';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './GSkeletonDisplayText';
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { ThumbnailProps } from '@shopify/polaris';
|
|
2
|
+
export interface GThumbnailProps extends ThumbnailProps {
|
|
3
|
+
defaultSource?: string;
|
|
4
|
+
width?: string;
|
|
5
|
+
height?: string;
|
|
6
|
+
classRemoved?: boolean;
|
|
7
|
+
isInactive?: boolean;
|
|
8
|
+
/**
|
|
9
|
+
* @description Filter to apply grayscale to the image
|
|
10
|
+
*/
|
|
11
|
+
grayscale?: `${number}%`;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Helper function to generate a variation class name.
|
|
15
|
+
* @param name - Base name of the class.
|
|
16
|
+
* @param value - Variation value to append.
|
|
17
|
+
* @returns Combined class name.
|
|
18
|
+
*/
|
|
19
|
+
export declare function variationName(name: string, value: string): string;
|
|
20
|
+
export declare const GThumbnail: ({ source, alt, size, grayscale, defaultSource, width, height, classRemoved, }: GThumbnailProps) => import("react/jsx-runtime").JSX.Element;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './GThumbnail';
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import type { BoxProps } from '@shopify/polaris';
|
|
2
|
+
type CloseTarget = 'activator' | 'next-node';
|
|
3
|
+
export interface PopoverPublicAPI {
|
|
4
|
+
forceUpdatePosition(): void;
|
|
5
|
+
close(target?: CloseTarget): void;
|
|
6
|
+
}
|
|
7
|
+
export interface GTooltipCardPublicAPI {
|
|
8
|
+
onClose(): void;
|
|
9
|
+
}
|
|
10
|
+
type Width = 'default' | 'wide' | 'large';
|
|
11
|
+
export interface GTooltipCardData {
|
|
12
|
+
title: string;
|
|
13
|
+
content: string | TrustedHTML;
|
|
14
|
+
formula?: React.ReactNode;
|
|
15
|
+
contentList?: string[];
|
|
16
|
+
width?: Width;
|
|
17
|
+
}
|
|
18
|
+
export interface IProps {
|
|
19
|
+
children: React.ReactNode;
|
|
20
|
+
delay?: number;
|
|
21
|
+
tooltip?: GTooltipCardData;
|
|
22
|
+
activatorProps?: BoxProps;
|
|
23
|
+
wrapper?: 'span' | 'div';
|
|
24
|
+
isHideBorder?: boolean;
|
|
25
|
+
alignment?: 'start' | 'center' | 'end';
|
|
26
|
+
textDecoration?: 'underline' | 'none';
|
|
27
|
+
preferredAlignment?: 'left' | 'center' | 'right';
|
|
28
|
+
popoverRef?: React.RefObject<PopoverPublicAPI>;
|
|
29
|
+
showArrow?: boolean;
|
|
30
|
+
}
|
|
31
|
+
export declare const GTooltipCard: import("react").ForwardRefExoticComponent<IProps & import("react").RefAttributes<GTooltipCardPublicAPI>>;
|
|
32
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './components';
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { Trend } from '@shopify/polaris-viz-core';
|
|
2
|
+
export interface IPAChartLabel {
|
|
3
|
+
value: string;
|
|
4
|
+
tooltipValue: string;
|
|
5
|
+
}
|
|
6
|
+
export type IPAChartLabels = IPAChartLabel[];
|
|
7
|
+
export interface IPAChartDataPoint {
|
|
8
|
+
key: string;
|
|
9
|
+
tooltipKey: string;
|
|
10
|
+
value: number;
|
|
11
|
+
trend?: {
|
|
12
|
+
value: string | undefined;
|
|
13
|
+
trend: Trend;
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
export type AllChartsDataMap = Record<string, {
|
|
17
|
+
current: IPAChartDataPoint[];
|
|
18
|
+
previous: IPAChartDataPoint[];
|
|
19
|
+
}>;
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
export declare enum EMetricKey {
|
|
2
|
+
SESSION = "sessions",
|
|
3
|
+
ORDERS = "orders",
|
|
4
|
+
PAGE_VIEWS = "pageviews",
|
|
5
|
+
VISITORS = "visitors",
|
|
6
|
+
BOUNCE_RATE = "bounce_rate",
|
|
7
|
+
CTR = "ctr",
|
|
8
|
+
CONVERSION_RATE = "conversion_rate",
|
|
9
|
+
AVG_TIME_ON_PAGE = "average_time_on_page",
|
|
10
|
+
ADDED_TO_CART = "added_to_cart",
|
|
11
|
+
ADD_TO_CART_RATE = "added_to_cart_rate",
|
|
12
|
+
REACHED_CHECKOUT = "sessions_that_reached_checkout",
|
|
13
|
+
COMPLETE_CHECKOUT = "sessions_that_completed_checkout",
|
|
14
|
+
CART_ADDITION = "sessions_with_cart_additions",
|
|
15
|
+
AOV = "aov",
|
|
16
|
+
REVENUE = "revenue",
|
|
17
|
+
RPV = "revenue_per_visitor"
|
|
18
|
+
}
|
|
19
|
+
export interface IMetricControl {
|
|
20
|
+
value: string | number | null;
|
|
21
|
+
change: string | number;
|
|
22
|
+
}
|
|
23
|
+
export interface IMetricCardItem {
|
|
24
|
+
key: EMetricKey;
|
|
25
|
+
title: string;
|
|
26
|
+
totalValue: IMetricControl;
|
|
27
|
+
}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export declare const TRIM_DECIMAL_ZEROS_REGEX: RegExp;
|
|
2
|
+
export declare const DEFAULT_DECIMALS = 2;
|
|
3
|
+
export declare const trimDecimalZeros: (number?: string) => string;
|
|
4
|
+
export declare const cleanDecimal: (number: number, decimals?: number) => string;
|
|
5
|
+
export declare const semverToNum: (v: string) => number;
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Utility function to calculate percentage and format it.
|
|
3
|
+
* @param part - The part value.
|
|
4
|
+
* @param total - The total value.
|
|
5
|
+
* @param decimals - The number of decimal places to format the percentage to.
|
|
6
|
+
* @returns The formatted percentage as a string.
|
|
7
|
+
*/
|
|
8
|
+
export declare const calcPercentage: (part?: number, total?: number, decimals?: number) => number | undefined;
|
|
9
|
+
export declare const calcPercentageString: (part: number | undefined, total: number, decimals?: number) => string | undefined;
|
|
10
|
+
export declare const formatPercentage: (percentage: number, decimals?: number) => string;
|
package/dist/style.css
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
.sticky{position:sticky}.flex{display:flex}.grid{display:grid}.hidden{display:none}.h-\[20px\]{height:20px}.h-\[2px\]{height:2px}.h-\[80px\]{height:80px}.w-\[12px\]{width:12px}.w-\[20px\]{width:20px}.w-\[210px\]{width:210px}.w-\[320px\]{width:320px}.w-\[328px\]{width:328px}.w-\[80px\]{width:80px}.w-fit{width:-moz-fit-content;width:fit-content}.w-full{width:100%}.min-w-\[175px\]{min-width:175px}.transform{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.cursor-pointer{cursor:pointer}.items-center{align-items:center}.justify-start{justify-content:flex-start}.justify-end{justify-content:flex-end}.justify-center{justify-content:center}.overflow-hidden,.truncate{overflow:hidden}.truncate{text-overflow:ellipsis;white-space:nowrap}.rounded-\[10px\]{border-radius:10px}.rounded-md{border-radius:.375rem}.border{border-width:1px}.border-dashed{border-style:dashed}.border-\[\#A1CAE7\]{--tw-border-opacity:1;border-color:rgb(161 202 231/var(--tw-border-opacity))}.bg-\[\#4FA9EA\]{--tw-bg-opacity:1;background-color:rgb(79 169 234/var(--tw-bg-opacity))}.font-mono{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}.underline{text-decoration-line:underline}.opacity-0{opacity:0}.grayscale{--tw-grayscale:grayscale(100%)}.filter,.grayscale{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.hover\:cursor-pointer:hover{cursor:pointer}.hover\:text-\[--p-color-text-link-hover\]:hover{color:var(--p-color-text-link-hover)}
|