medusa-analytics 0.0.21 → 0.0.23
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.
|
@@ -303,15 +303,66 @@ function formatShortNumber$1(value) {
|
|
|
303
303
|
}).format(value);
|
|
304
304
|
}
|
|
305
305
|
const SALES_GRANULARITY_TABS = [
|
|
306
|
-
{ value: "day", label: "Day" },
|
|
307
306
|
{ value: "hour", label: "Hour" },
|
|
307
|
+
{ value: "day", label: "Day" },
|
|
308
308
|
{ value: "week", label: "Week" },
|
|
309
309
|
{ value: "month", label: "Month" }
|
|
310
310
|
];
|
|
311
|
+
function getSalesBreakdownOtPeriod(g) {
|
|
312
|
+
if (g === "day") return "one_week";
|
|
313
|
+
if (g === "week") return "two_months";
|
|
314
|
+
if (g === "month") return "one_year";
|
|
315
|
+
return null;
|
|
316
|
+
}
|
|
311
317
|
function monthKeyFromDateStr(dateStr) {
|
|
312
318
|
if (dateStr.length >= 7) return dateStr.slice(0, 7);
|
|
313
319
|
return dateStr;
|
|
314
320
|
}
|
|
321
|
+
function utcSundayWeekStartKeyFromDateStr(dateStr) {
|
|
322
|
+
const parsed = new Date(dateStr);
|
|
323
|
+
if (Number.isNaN(parsed.getTime())) return dateStr;
|
|
324
|
+
const y = parsed.getUTCFullYear();
|
|
325
|
+
const m = parsed.getUTCMonth();
|
|
326
|
+
const day = parsed.getUTCDate();
|
|
327
|
+
const dow = parsed.getUTCDay();
|
|
328
|
+
const start = new Date(Date.UTC(y, m, day - dow));
|
|
329
|
+
const ys = start.getUTCFullYear();
|
|
330
|
+
const ms = String(start.getUTCMonth() + 1).padStart(2, "0");
|
|
331
|
+
const ds = String(start.getUTCDate()).padStart(2, "0");
|
|
332
|
+
return `${ys}-${ms}-${ds}`;
|
|
333
|
+
}
|
|
334
|
+
function formatWeekStartDm(weekStartKey) {
|
|
335
|
+
const parsed = /* @__PURE__ */ new Date(`${weekStartKey}T00:00:00.000Z`);
|
|
336
|
+
if (Number.isNaN(parsed.getTime())) return weekStartKey;
|
|
337
|
+
return `${parsed.getUTCDate()}/${parsed.getUTCMonth() + 1}`;
|
|
338
|
+
}
|
|
339
|
+
function formatDayBreakdownDm(dateStr) {
|
|
340
|
+
const parsed = new Date(dateStr);
|
|
341
|
+
if (Number.isNaN(parsed.getTime())) return dateStr;
|
|
342
|
+
return `${parsed.getUTCDate()}/${parsed.getUTCMonth() + 1}`;
|
|
343
|
+
}
|
|
344
|
+
function toDateKeyUtcFromDate(d) {
|
|
345
|
+
const y = d.getUTCFullYear();
|
|
346
|
+
const m = String(d.getUTCMonth() + 1).padStart(2, "0");
|
|
347
|
+
const day = String(d.getUTCDate()).padStart(2, "0");
|
|
348
|
+
return `${y}-${m}-${day}`;
|
|
349
|
+
}
|
|
350
|
+
function lastNWeekStartKeysUtc(n) {
|
|
351
|
+
const now = /* @__PURE__ */ new Date();
|
|
352
|
+
const todayUtc = new Date(
|
|
353
|
+
Date.UTC(now.getUTCFullYear(), now.getUTCMonth(), now.getUTCDate())
|
|
354
|
+
);
|
|
355
|
+
const dow = todayUtc.getUTCDay();
|
|
356
|
+
const currentWeekStart = new Date(todayUtc);
|
|
357
|
+
currentWeekStart.setUTCDate(currentWeekStart.getUTCDate() - dow);
|
|
358
|
+
const keys = [];
|
|
359
|
+
for (let i = n - 1; i >= 0; i -= 1) {
|
|
360
|
+
const d = new Date(currentWeekStart);
|
|
361
|
+
d.setUTCDate(d.getUTCDate() - 7 * i);
|
|
362
|
+
keys.push(toDateKeyUtcFromDate(d));
|
|
363
|
+
}
|
|
364
|
+
return keys;
|
|
365
|
+
}
|
|
315
366
|
function formatMonthBucketLabel(ymKey) {
|
|
316
367
|
const [ys, ms] = ymKey.split("-");
|
|
317
368
|
const y = Number(ys);
|
|
@@ -319,27 +370,9 @@ function formatMonthBucketLabel(ymKey) {
|
|
|
319
370
|
if (!Number.isFinite(y) || !Number.isFinite(m)) return ymKey;
|
|
320
371
|
return new Intl.DateTimeFormat("en-IN", {
|
|
321
372
|
month: "short",
|
|
322
|
-
year: "numeric",
|
|
323
373
|
timeZone: "UTC"
|
|
324
374
|
}).format(new Date(Date.UTC(y, m - 1, 1)));
|
|
325
375
|
}
|
|
326
|
-
function aggregateDailyOrdersForBreakdown(rows, keyFn, labelFn) {
|
|
327
|
-
const map = /* @__PURE__ */ new Map();
|
|
328
|
-
for (const d of rows) {
|
|
329
|
-
const key = keyFn(d);
|
|
330
|
-
const cur = map.get(key) ?? { orders: 0, revenue: 0, bucketRows: [] };
|
|
331
|
-
cur.orders += d.orders_count;
|
|
332
|
-
cur.revenue += d.total_revenue;
|
|
333
|
-
cur.bucketRows.push(d);
|
|
334
|
-
map.set(key, cur);
|
|
335
|
-
}
|
|
336
|
-
return Array.from(map.entries()).sort(([a], [b]) => a.localeCompare(b)).map(([key, v]) => ({
|
|
337
|
-
key,
|
|
338
|
-
label: labelFn(key, v.bucketRows),
|
|
339
|
-
orders_count: v.orders,
|
|
340
|
-
revenue: v.revenue
|
|
341
|
-
}));
|
|
342
|
-
}
|
|
343
376
|
function isSalesBreakdownBarRow(value) {
|
|
344
377
|
if (typeof value !== "object" || value === null) return false;
|
|
345
378
|
const v = value;
|
|
@@ -535,6 +568,81 @@ function OrdersDashboard() {
|
|
|
535
568
|
const [todayContextLoading, setTodayContextLoading] = react.useState(true);
|
|
536
569
|
const [todayContextError, setTodayContextError] = react.useState(null);
|
|
537
570
|
const [salesGranularity, setSalesGranularity] = react.useState("day");
|
|
571
|
+
const [salesBreakdownDaily, setSalesBreakdownDaily] = react.useState(
|
|
572
|
+
[]
|
|
573
|
+
);
|
|
574
|
+
const [salesBreakdownOtLoading, setSalesBreakdownOtLoading] = react.useState(true);
|
|
575
|
+
const [salesBreakdownOtError, setSalesBreakdownOtError] = react.useState(null);
|
|
576
|
+
const [salesBreakdownHourlyRolling, setSalesBreakdownHourlyRolling] = react.useState([]);
|
|
577
|
+
const [salesBreakdownHourlyLoading, setSalesBreakdownHourlyLoading] = react.useState(false);
|
|
578
|
+
const [salesBreakdownHourlyError, setSalesBreakdownHourlyError] = react.useState(null);
|
|
579
|
+
const salesBreakdownOtPeriod = react.useMemo(
|
|
580
|
+
() => getSalesBreakdownOtPeriod(salesGranularity),
|
|
581
|
+
[salesGranularity]
|
|
582
|
+
);
|
|
583
|
+
react.useEffect(() => {
|
|
584
|
+
if (salesBreakdownOtPeriod === null) {
|
|
585
|
+
setSalesBreakdownDaily([]);
|
|
586
|
+
setSalesBreakdownOtLoading(false);
|
|
587
|
+
setSalesBreakdownOtError(null);
|
|
588
|
+
return;
|
|
589
|
+
}
|
|
590
|
+
let cancelled = false;
|
|
591
|
+
setSalesBreakdownOtLoading(true);
|
|
592
|
+
setSalesBreakdownOtError(null);
|
|
593
|
+
fetch(
|
|
594
|
+
`/admin/analytics/orders-over-time?period=${salesBreakdownOtPeriod}`,
|
|
595
|
+
{ credentials: "include" }
|
|
596
|
+
).then((res) => {
|
|
597
|
+
if (!res.ok) throw new Error(res.statusText);
|
|
598
|
+
return res.json();
|
|
599
|
+
}).then((body) => {
|
|
600
|
+
if (!cancelled) {
|
|
601
|
+
setSalesBreakdownDaily(body.dailyOrders ?? []);
|
|
602
|
+
}
|
|
603
|
+
}).catch((e) => {
|
|
604
|
+
if (!cancelled) {
|
|
605
|
+
setSalesBreakdownOtError(e instanceof Error ? e.message : String(e));
|
|
606
|
+
}
|
|
607
|
+
}).finally(() => {
|
|
608
|
+
if (!cancelled) setSalesBreakdownOtLoading(false);
|
|
609
|
+
});
|
|
610
|
+
return () => {
|
|
611
|
+
cancelled = true;
|
|
612
|
+
};
|
|
613
|
+
}, [salesBreakdownOtPeriod]);
|
|
614
|
+
react.useEffect(() => {
|
|
615
|
+
if (salesGranularity !== "hour") {
|
|
616
|
+
setSalesBreakdownHourlyRolling([]);
|
|
617
|
+
setSalesBreakdownHourlyLoading(false);
|
|
618
|
+
setSalesBreakdownHourlyError(null);
|
|
619
|
+
return;
|
|
620
|
+
}
|
|
621
|
+
let cancelled = false;
|
|
622
|
+
setSalesBreakdownHourlyLoading(true);
|
|
623
|
+
setSalesBreakdownHourlyError(null);
|
|
624
|
+
fetch("/admin/analytics/orders-insights?last_hours=24", {
|
|
625
|
+
credentials: "include"
|
|
626
|
+
}).then((res) => {
|
|
627
|
+
if (!res.ok) throw new Error(res.statusText);
|
|
628
|
+
return res.json();
|
|
629
|
+
}).then((body) => {
|
|
630
|
+
if (!cancelled) {
|
|
631
|
+
setSalesBreakdownHourlyRolling(body.hourly_rolling ?? []);
|
|
632
|
+
}
|
|
633
|
+
}).catch((e) => {
|
|
634
|
+
if (!cancelled) {
|
|
635
|
+
setSalesBreakdownHourlyError(
|
|
636
|
+
e instanceof Error ? e.message : String(e)
|
|
637
|
+
);
|
|
638
|
+
}
|
|
639
|
+
}).finally(() => {
|
|
640
|
+
if (!cancelled) setSalesBreakdownHourlyLoading(false);
|
|
641
|
+
});
|
|
642
|
+
return () => {
|
|
643
|
+
cancelled = true;
|
|
644
|
+
};
|
|
645
|
+
}, [salesGranularity]);
|
|
538
646
|
react.useEffect(() => {
|
|
539
647
|
let cancelled = false;
|
|
540
648
|
setLoading(true);
|
|
@@ -721,68 +829,73 @@ function OrdersDashboard() {
|
|
|
721
829
|
};
|
|
722
830
|
});
|
|
723
831
|
}, [dailyOrders, previousPeriodDailyOrders]);
|
|
724
|
-
const hourlyChartRows = react.useMemo(() => {
|
|
725
|
-
if (!ordersInsights) return [];
|
|
726
|
-
return ordersInsights.byHour.map((h) => ({
|
|
727
|
-
label: `${String(h.hour).padStart(2, "0")}:00`,
|
|
728
|
-
hour: h.hour,
|
|
729
|
-
orders_count: h.orders_count,
|
|
730
|
-
revenue: h.revenue
|
|
731
|
-
}));
|
|
732
|
-
}, [ordersInsights]);
|
|
733
832
|
const salesBreakdownChartRows = react.useMemo(() => {
|
|
734
833
|
if (salesGranularity === "hour") {
|
|
735
|
-
return
|
|
736
|
-
key: `
|
|
737
|
-
label:
|
|
738
|
-
orders_count:
|
|
739
|
-
revenue:
|
|
834
|
+
return salesBreakdownHourlyRolling.map((b, i) => ({
|
|
835
|
+
key: `rolling-${i}`,
|
|
836
|
+
label: b.label,
|
|
837
|
+
orders_count: b.orders_count,
|
|
838
|
+
revenue: b.revenue
|
|
740
839
|
}));
|
|
741
840
|
}
|
|
742
841
|
if (salesGranularity === "week") {
|
|
743
|
-
|
|
744
|
-
|
|
745
|
-
|
|
746
|
-
|
|
747
|
-
|
|
748
|
-
|
|
749
|
-
|
|
842
|
+
const targetKeys = lastNWeekStartKeysUtc(7);
|
|
843
|
+
const agg = /* @__PURE__ */ new Map();
|
|
844
|
+
for (const d of salesBreakdownDaily) {
|
|
845
|
+
const wk = utcSundayWeekStartKeyFromDateStr(d.date);
|
|
846
|
+
const cur = agg.get(wk) ?? { orders: 0, revenue: 0 };
|
|
847
|
+
cur.orders += d.orders_count;
|
|
848
|
+
cur.revenue += d.total_revenue;
|
|
849
|
+
agg.set(wk, cur);
|
|
850
|
+
}
|
|
851
|
+
return targetKeys.map((key) => {
|
|
852
|
+
var _a2, _b2;
|
|
853
|
+
return {
|
|
854
|
+
key,
|
|
855
|
+
label: formatWeekStartDm(key),
|
|
856
|
+
orders_count: ((_a2 = agg.get(key)) == null ? void 0 : _a2.orders) ?? 0,
|
|
857
|
+
revenue: ((_b2 = agg.get(key)) == null ? void 0 : _b2.revenue) ?? 0
|
|
858
|
+
};
|
|
859
|
+
});
|
|
750
860
|
}
|
|
751
861
|
if (salesGranularity === "month") {
|
|
752
|
-
return
|
|
753
|
-
|
|
754
|
-
|
|
755
|
-
|
|
756
|
-
|
|
862
|
+
return salesBreakdownDaily.map((d) => ({
|
|
863
|
+
key: d.date,
|
|
864
|
+
label: d.label ?? formatMonthBucketLabel(monthKeyFromDateStr(d.date)),
|
|
865
|
+
orders_count: d.orders_count,
|
|
866
|
+
revenue: d.total_revenue
|
|
867
|
+
}));
|
|
757
868
|
}
|
|
758
|
-
return
|
|
869
|
+
return salesBreakdownDaily.map((d) => ({
|
|
759
870
|
key: d.date,
|
|
760
|
-
label:
|
|
871
|
+
label: formatDayBreakdownDm(d.date),
|
|
761
872
|
orders_count: d.orders_count,
|
|
762
873
|
revenue: d.total_revenue
|
|
763
874
|
}));
|
|
764
|
-
}, [
|
|
875
|
+
}, [
|
|
876
|
+
salesGranularity,
|
|
877
|
+
salesBreakdownDaily,
|
|
878
|
+
salesBreakdownHourlyRolling
|
|
879
|
+
]);
|
|
765
880
|
const salesBreakdownDescription = react.useMemo(() => {
|
|
766
|
-
var _a2;
|
|
767
|
-
const rangeLabel = ((_a2 = OVER_TIME_PERIODS.find((p) => p.value === overTimePeriod)) == null ? void 0 : _a2.label) ?? "selected range";
|
|
768
|
-
const insightsHint = `Order-time breakdown uses last ${insightsWindowDays} days (UTC).`;
|
|
769
881
|
switch (salesGranularity) {
|
|
770
|
-
case "day":
|
|
771
|
-
return `Revenue by calendar day for ${rangeLabel} (aligned with Revenue & orders).`;
|
|
772
882
|
case "hour":
|
|
773
|
-
return
|
|
883
|
+
return "Last 24 hours from now (UTC): one bar per clock hour in the rolling window.";
|
|
884
|
+
case "day":
|
|
885
|
+
return "Last 7 calendar days (UTC), one bar per day — axis day/month.";
|
|
774
886
|
case "week":
|
|
775
|
-
return
|
|
887
|
+
return "Last 7 weeks (UTC, weeks start Sunday); axis shows each week’s start as day/month.";
|
|
776
888
|
case "month":
|
|
777
|
-
return
|
|
889
|
+
return "Last 12 calendar months through the current month (UTC) — Jan, Feb, Mar, …";
|
|
778
890
|
default:
|
|
779
891
|
return "";
|
|
780
892
|
}
|
|
781
|
-
}, [salesGranularity
|
|
893
|
+
}, [salesGranularity]);
|
|
782
894
|
const salesBreakdownXAxisInterval = react.useMemo(() => {
|
|
783
895
|
const n = salesBreakdownChartRows.length;
|
|
784
896
|
if (salesGranularity === "hour") return 3;
|
|
785
|
-
if (salesGranularity === "day" && n > 24)
|
|
897
|
+
if (salesGranularity === "day" && n > 24)
|
|
898
|
+
return Math.max(0, Math.ceil(n / 10) - 1);
|
|
786
899
|
return 0;
|
|
787
900
|
}, [salesGranularity, salesBreakdownChartRows.length]);
|
|
788
901
|
const ordersVsDraftsPie = react.useMemo(() => {
|
|
@@ -861,20 +974,14 @@ function OrdersDashboard() {
|
|
|
861
974
|
if (error || !data) {
|
|
862
975
|
return /* @__PURE__ */ jsxRuntime.jsx(ui.Container, { className: "p-6", children: /* @__PURE__ */ jsxRuntime.jsx(ui.Text, { className: "text-ui-fg-danger", children: error ?? "Failed to load analytics" }) });
|
|
863
976
|
}
|
|
864
|
-
const
|
|
865
|
-
const
|
|
977
|
+
const salesBreakdownWaiting = salesGranularity === "hour" ? salesBreakdownHourlyLoading : salesBreakdownOtLoading;
|
|
978
|
+
const salesBreakdownFetchError = salesGranularity === "hour" ? salesBreakdownHourlyError : salesBreakdownOtError;
|
|
866
979
|
const salesBreakdownBody = (() => {
|
|
867
|
-
if (
|
|
980
|
+
if (salesBreakdownWaiting) {
|
|
868
981
|
return /* @__PURE__ */ jsxRuntime.jsx(AnalyticsChartSurface, { variant: "atlas", children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex min-h-[min(176px,28vh)] items-center justify-center py-6", children: /* @__PURE__ */ jsxRuntime.jsx(ui.Text, { className: "text-ui-fg-muted text-xs", children: "Loading chart…" }) }) });
|
|
869
982
|
}
|
|
870
|
-
if (
|
|
871
|
-
return /* @__PURE__ */ jsxRuntime.jsx(AnalyticsChartSurface, { variant: "atlas", children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex min-h-[min(176px,28vh)] items-center justify-center px-2 py-6", children: /* @__PURE__ */ jsxRuntime.jsx(ui.Text, { className: "text-ui-fg-danger text-center text-xs", children:
|
|
872
|
-
}
|
|
873
|
-
if (needsSalesInsights && insightsLoading) {
|
|
874
|
-
return /* @__PURE__ */ jsxRuntime.jsx(AnalyticsChartSurface, { variant: "atlas", children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex min-h-[min(176px,28vh)] items-center justify-center py-6", children: /* @__PURE__ */ jsxRuntime.jsx(ui.Text, { className: "text-ui-fg-muted text-xs", children: "Loading chart…" }) }) });
|
|
875
|
-
}
|
|
876
|
-
if (needsSalesInsights && insightsError) {
|
|
877
|
-
return /* @__PURE__ */ jsxRuntime.jsx(AnalyticsChartSurface, { variant: "atlas", children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex min-h-[min(176px,28vh)] items-center justify-center px-2 py-6", children: /* @__PURE__ */ jsxRuntime.jsx(ui.Text, { className: "text-ui-fg-danger text-center text-xs", children: insightsError }) }) });
|
|
983
|
+
if (salesBreakdownFetchError) {
|
|
984
|
+
return /* @__PURE__ */ jsxRuntime.jsx(AnalyticsChartSurface, { variant: "atlas", children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex min-h-[min(176px,28vh)] items-center justify-center px-2 py-6", children: /* @__PURE__ */ jsxRuntime.jsx(ui.Text, { className: "text-ui-fg-danger text-center text-xs", children: salesBreakdownFetchError }) }) });
|
|
878
985
|
}
|
|
879
986
|
if (salesBreakdownChartRows.length === 0) {
|
|
880
987
|
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
@@ -1835,29 +1942,32 @@ function OrdersDashboard() {
|
|
|
1835
1942
|
title: "Sales breakdown",
|
|
1836
1943
|
description: salesBreakdownDescription,
|
|
1837
1944
|
actionsBare: true,
|
|
1838
|
-
actions: /* @__PURE__ */ jsxRuntime.
|
|
1839
|
-
|
|
1840
|
-
|
|
1841
|
-
|
|
1842
|
-
|
|
1843
|
-
|
|
1844
|
-
|
|
1845
|
-
|
|
1846
|
-
|
|
1847
|
-
|
|
1848
|
-
|
|
1849
|
-
|
|
1850
|
-
|
|
1851
|
-
|
|
1852
|
-
|
|
1853
|
-
|
|
1854
|
-
|
|
1855
|
-
|
|
1856
|
-
|
|
1857
|
-
|
|
1858
|
-
|
|
1859
|
-
|
|
1860
|
-
|
|
1945
|
+
actions: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col items-stretch gap-1 sm:flex-row sm:items-center sm:gap-2", children: [
|
|
1946
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
1947
|
+
ui.Label,
|
|
1948
|
+
{
|
|
1949
|
+
htmlFor: "sales-breakdown-granularity",
|
|
1950
|
+
className: "shrink-0 text-ui-fg-muted text-xs font-medium",
|
|
1951
|
+
children: "Breakdown"
|
|
1952
|
+
}
|
|
1953
|
+
),
|
|
1954
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
1955
|
+
"select",
|
|
1956
|
+
{
|
|
1957
|
+
id: "sales-breakdown-granularity",
|
|
1958
|
+
value: salesGranularity,
|
|
1959
|
+
onChange: (e) => {
|
|
1960
|
+
const v = e.target.value;
|
|
1961
|
+
if (v === "hour" || v === "day" || v === "week" || v === "month") {
|
|
1962
|
+
setSalesGranularity(v);
|
|
1963
|
+
}
|
|
1964
|
+
},
|
|
1965
|
+
className: SELECT_CLASS_NAME$2,
|
|
1966
|
+
"aria-label": "Sales breakdown time bucket",
|
|
1967
|
+
children: SALES_GRANULARITY_TABS.map((tab) => /* @__PURE__ */ jsxRuntime.jsx("option", { value: tab.value, children: tab.value === "hour" ? "Hour (last 24h)" : tab.value === "day" ? "Day (last 7 days)" : tab.value === "week" ? "Week (last 7 weeks)" : "Month (last 12 months)" }, tab.value))
|
|
1968
|
+
}
|
|
1969
|
+
)
|
|
1970
|
+
] }),
|
|
1861
1971
|
children: salesBreakdownBody
|
|
1862
1972
|
}
|
|
1863
1973
|
),
|
|
@@ -2637,7 +2747,7 @@ function EmptyAnalyticsPanel({ title, description }) {
|
|
|
2637
2747
|
] });
|
|
2638
2748
|
}
|
|
2639
2749
|
function ProductsDashboard() {
|
|
2640
|
-
var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j
|
|
2750
|
+
var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j;
|
|
2641
2751
|
const [summaryDays, setSummaryDays] = react.useState("all");
|
|
2642
2752
|
const [graphPeriod, setGraphPeriod] = react.useState("one_week");
|
|
2643
2753
|
const [topSellerPeriod, setTopSellerPeriod] = react.useState("week");
|
|
@@ -2764,7 +2874,7 @@ function ProductsDashboard() {
|
|
|
2764
2874
|
};
|
|
2765
2875
|
}, [salesChannelId, topSellerPeriod]);
|
|
2766
2876
|
react.useEffect(() => {
|
|
2767
|
-
var _a2
|
|
2877
|
+
var _a2;
|
|
2768
2878
|
let cancelled = false;
|
|
2769
2879
|
if (topSellersLoading) {
|
|
2770
2880
|
setBestSellersTrendLoading(true);
|
|
@@ -2780,7 +2890,12 @@ function ProductsDashboard() {
|
|
|
2780
2890
|
cancelled = true;
|
|
2781
2891
|
};
|
|
2782
2892
|
}
|
|
2783
|
-
const
|
|
2893
|
+
const topSellersByUnits2 = [...(topSellers == null ? void 0 : topSellers.products) ?? []].sort((a, b) => {
|
|
2894
|
+
if (b.units_sold !== a.units_sold) return b.units_sold - a.units_sold;
|
|
2895
|
+
if (b.order_count !== a.order_count) return b.order_count - a.order_count;
|
|
2896
|
+
return b.revenue - a.revenue;
|
|
2897
|
+
});
|
|
2898
|
+
const topProductId = (_a2 = topSellersByUnits2[0]) == null ? void 0 : _a2.product_id;
|
|
2784
2899
|
if (!topProductId) {
|
|
2785
2900
|
setBestSellersTrendLoading(false);
|
|
2786
2901
|
setBestSellersTrendError(null);
|
|
@@ -2926,16 +3041,24 @@ function ProductsDashboard() {
|
|
|
2926
3041
|
}, [series]);
|
|
2927
3042
|
const peakRevenuePoint = series.length > 0 ? series.reduce((peak, point) => point.revenue > peak.revenue ? point : peak) : null;
|
|
2928
3043
|
const viewsConnectedForPulse = ((summary == null ? void 0 : summary.productViewsConnected) ?? false) || (overTime == null ? void 0 : overTime.productViewsConnected) === true || (topSellers == null ? void 0 : topSellers.productViewsConnected) === true || (performance == null ? void 0 : performance.productViewsConnected) === true;
|
|
3044
|
+
const topSellersByUnits = react.useMemo(
|
|
3045
|
+
() => [...(topSellers == null ? void 0 : topSellers.products) ?? []].sort((a, b) => {
|
|
3046
|
+
if (b.units_sold !== a.units_sold) return b.units_sold - a.units_sold;
|
|
3047
|
+
if (b.order_count !== a.order_count) return b.order_count - a.order_count;
|
|
3048
|
+
return b.revenue - a.revenue;
|
|
3049
|
+
}),
|
|
3050
|
+
[topSellers]
|
|
3051
|
+
);
|
|
2929
3052
|
const bestSellersTrendSeries = (bestSellersTrend == null ? void 0 : bestSellersTrend.series) ?? [];
|
|
2930
3053
|
const mostViewedTrendSeries = (mostViewedTrend == null ? void 0 : mostViewedTrend.series) ?? [];
|
|
2931
|
-
const bestSellerTrendProductTitle = ((_a = bestSellersTrend == null ? void 0 : bestSellersTrend.product) == null ? void 0 : _a.product_title) ?? ((
|
|
2932
|
-
const mostViewedTrendProductTitle = ((
|
|
3054
|
+
const bestSellerTrendProductTitle = ((_a = bestSellersTrend == null ? void 0 : bestSellersTrend.product) == null ? void 0 : _a.product_title) ?? ((_b = topSellersByUnits[0]) == null ? void 0 : _b.product_title) ?? null;
|
|
3055
|
+
const mostViewedTrendProductTitle = ((_c = mostViewedTrend == null ? void 0 : mostViewedTrend.product) == null ? void 0 : _c.product_title) ?? ((_e = (_d = performance == null ? void 0 : performance.topViewedProducts) == null ? void 0 : _d[0]) == null ? void 0 : _e.product_title) ?? null;
|
|
2933
3056
|
const viewsVsUnitsScatterData = react.useMemo(
|
|
2934
3057
|
() => ((performance == null ? void 0 : performance.topViewedProducts) ?? []).slice(0, 48).filter((row) => row.total_views > 0 || row.units_sold > 0),
|
|
2935
3058
|
[performance]
|
|
2936
3059
|
);
|
|
2937
|
-
const selectedSummaryPeriod = ((
|
|
2938
|
-
const selectedGraphPeriodLabel = ((
|
|
3060
|
+
const selectedSummaryPeriod = ((_f = SUMMARY_PERIODS.find((p) => p.value === summaryDays)) == null ? void 0 : _f.label) ?? "All time";
|
|
3061
|
+
const selectedGraphPeriodLabel = ((_g = GRAPH_PERIODS.find((p) => p.value === graphPeriod)) == null ? void 0 : _g.label) ?? "One week";
|
|
2939
3062
|
const quickPulseMetrics = [
|
|
2940
3063
|
{
|
|
2941
3064
|
label: "Range units",
|
|
@@ -2977,7 +3100,7 @@ function ProductsDashboard() {
|
|
|
2977
3100
|
return /* @__PURE__ */ jsxRuntime.jsx(ui.Container, { className: "p-6", children: /* @__PURE__ */ jsxRuntime.jsx(ui.Text, { className: "text-ui-fg-danger", children: summaryError ?? "Failed to load product analytics" }) });
|
|
2978
3101
|
}
|
|
2979
3102
|
const viewsConnected = summary.productViewsConnected || (overTime == null ? void 0 : overTime.productViewsConnected) === true || (topSellers == null ? void 0 : topSellers.productViewsConnected) === true || (performance == null ? void 0 : performance.productViewsConnected) === true;
|
|
2980
|
-
const selectedChannelLabel = salesChannelId === "all" ? "All channels" : ((
|
|
3103
|
+
const selectedChannelLabel = salesChannelId === "all" ? "All channels" : ((_h = salesChannels.find((channel) => channel.id === salesChannelId)) == null ? void 0 : _h.name) ?? "Selected channel";
|
|
2981
3104
|
const primaryStats = [
|
|
2982
3105
|
{
|
|
2983
3106
|
label: "Units sold",
|
|
@@ -3398,7 +3521,7 @@ function ProductsDashboard() {
|
|
|
3398
3521
|
variant: "atlas",
|
|
3399
3522
|
actionsBare: true,
|
|
3400
3523
|
title: "Best sellers",
|
|
3401
|
-
description: bestSellerTrendProductTitle ? `Revenue and units over time for “${bestSellerTrendProductTitle}” (#1 by
|
|
3524
|
+
description: bestSellerTrendProductTitle ? `Revenue and units over time for “${bestSellerTrendProductTitle}” (#1 by units sold in this window; all-time uses a 12‑month chart).` : "Revenue and units over time for the top product by units sold in this window (all-time leaderboard uses a 12‑month chart).",
|
|
3402
3525
|
actions: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-wrap items-center gap-2", children: [
|
|
3403
3526
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
3404
3527
|
ui.Label,
|
|
@@ -3562,7 +3685,7 @@ function ProductsDashboard() {
|
|
|
3562
3685
|
variant: "atlas",
|
|
3563
3686
|
className: "min-w-0 md:col-span-1 xl:col-span-1",
|
|
3564
3687
|
title: "Leaderboard table",
|
|
3565
|
-
description: "Products ranked by
|
|
3688
|
+
description: "Products ranked by units sold — same window as Best sellers.",
|
|
3566
3689
|
children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "min-h-[212px] min-w-0 sm:min-h-[228px]", children: /* @__PURE__ */ jsxRuntime.jsx(AnalyticsTableSurface, { className: "shadow-sm", children: /* @__PURE__ */ jsxRuntime.jsxs(ui.Table, { className: LEADERBOARD_TABLE_CLASS, children: [
|
|
3567
3690
|
/* @__PURE__ */ jsxRuntime.jsx(ui.Table.Header, { children: /* @__PURE__ */ jsxRuntime.jsxs(ui.Table.Row, { children: [
|
|
3568
3691
|
/* @__PURE__ */ jsxRuntime.jsx(ui.Table.HeaderCell, { className: TABLE_HEAD_CELL_NOWRAP, children: "Product" }),
|
|
@@ -3577,12 +3700,12 @@ function ProductsDashboard() {
|
|
|
3577
3700
|
/* @__PURE__ */ jsxRuntime.jsx(ui.Table.Cell, {}),
|
|
3578
3701
|
/* @__PURE__ */ jsxRuntime.jsx(ui.Table.Cell, {})
|
|
3579
3702
|
] }) : null,
|
|
3580
|
-
!topSellersError ?
|
|
3581
|
-
var _a2
|
|
3703
|
+
!topSellersError ? topSellersByUnits.slice(0, 8).map((product) => {
|
|
3704
|
+
var _a2;
|
|
3582
3705
|
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
3583
3706
|
ui.Table.Row,
|
|
3584
3707
|
{
|
|
3585
|
-
className: product.product_id === ((
|
|
3708
|
+
className: product.product_id === ((_a2 = topSellersByUnits[0]) == null ? void 0 : _a2.product_id) ? "bg-emerald-500/5" : void 0,
|
|
3586
3709
|
children: [
|
|
3587
3710
|
/* @__PURE__ */ jsxRuntime.jsx(ui.Table.Cell, { children: product.product_title }),
|
|
3588
3711
|
/* @__PURE__ */ jsxRuntime.jsx(ui.Table.Cell, { children: product.units_sold.toLocaleString() }),
|
|
@@ -3593,7 +3716,7 @@ function ProductsDashboard() {
|
|
|
3593
3716
|
product.product_id
|
|
3594
3717
|
);
|
|
3595
3718
|
}) : null,
|
|
3596
|
-
!topSellersLoading && !topSellersError && (((
|
|
3719
|
+
!topSellersLoading && !topSellersError && (((_i = topSellers == null ? void 0 : topSellers.products) == null ? void 0 : _i.length) ?? 0) === 0 ? /* @__PURE__ */ jsxRuntime.jsxs(ui.Table.Row, { children: [
|
|
3597
3720
|
/* @__PURE__ */ jsxRuntime.jsx(ui.Table.Cell, { children: /* @__PURE__ */ jsxRuntime.jsx(ui.Text, { className: "text-ui-fg-muted text-xs", children: "No best seller data yet." }) }),
|
|
3598
3721
|
/* @__PURE__ */ jsxRuntime.jsx(ui.Table.Cell, {}),
|
|
3599
3722
|
/* @__PURE__ */ jsxRuntime.jsx(ui.Table.Cell, {}),
|
|
@@ -3749,7 +3872,7 @@ function ProductsDashboard() {
|
|
|
3749
3872
|
/* @__PURE__ */ jsxRuntime.jsx(ui.Table.Cell, { children: product.units_sold.toLocaleString() }),
|
|
3750
3873
|
/* @__PURE__ */ jsxRuntime.jsx(ui.Table.Cell, { children: formatRatio(product.views_per_unit) })
|
|
3751
3874
|
] }, product.product_id)),
|
|
3752
|
-
!performanceLoading && !performanceError && (((
|
|
3875
|
+
!performanceLoading && !performanceError && (((_j = performance == null ? void 0 : performance.viewOpportunities) == null ? void 0 : _j.length) ?? 0) === 0 ? /* @__PURE__ */ jsxRuntime.jsxs(ui.Table.Row, { children: [
|
|
3753
3876
|
/* @__PURE__ */ jsxRuntime.jsx(ui.Table.Cell, { children: /* @__PURE__ */ jsxRuntime.jsx(ui.Text, { className: "text-ui-fg-muted text-xs", children: "No product view opportunities yet." }) }),
|
|
3754
3877
|
/* @__PURE__ */ jsxRuntime.jsx(ui.Table.Cell, {}),
|
|
3755
3878
|
/* @__PURE__ */ jsxRuntime.jsx(ui.Table.Cell, {}),
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { jsx, jsxs, Fragment } from "react/jsx-runtime";
|
|
2
|
-
import { useState,
|
|
2
|
+
import { useState, useMemo, useEffect } from "react";
|
|
3
3
|
import { defineRouteConfig } from "@medusajs/admin-sdk";
|
|
4
4
|
import { CurrencyDollar, ShoppingCart, TruckFast, Cash, UsersSolid, User, UserGroup, Trash, Tag, CubeSolid, ChartBar } from "@medusajs/icons";
|
|
5
5
|
import { Container, Text, Heading, Label, Table } from "@medusajs/ui";
|
|
@@ -302,15 +302,66 @@ function formatShortNumber$1(value) {
|
|
|
302
302
|
}).format(value);
|
|
303
303
|
}
|
|
304
304
|
const SALES_GRANULARITY_TABS = [
|
|
305
|
-
{ value: "day", label: "Day" },
|
|
306
305
|
{ value: "hour", label: "Hour" },
|
|
306
|
+
{ value: "day", label: "Day" },
|
|
307
307
|
{ value: "week", label: "Week" },
|
|
308
308
|
{ value: "month", label: "Month" }
|
|
309
309
|
];
|
|
310
|
+
function getSalesBreakdownOtPeriod(g) {
|
|
311
|
+
if (g === "day") return "one_week";
|
|
312
|
+
if (g === "week") return "two_months";
|
|
313
|
+
if (g === "month") return "one_year";
|
|
314
|
+
return null;
|
|
315
|
+
}
|
|
310
316
|
function monthKeyFromDateStr(dateStr) {
|
|
311
317
|
if (dateStr.length >= 7) return dateStr.slice(0, 7);
|
|
312
318
|
return dateStr;
|
|
313
319
|
}
|
|
320
|
+
function utcSundayWeekStartKeyFromDateStr(dateStr) {
|
|
321
|
+
const parsed = new Date(dateStr);
|
|
322
|
+
if (Number.isNaN(parsed.getTime())) return dateStr;
|
|
323
|
+
const y = parsed.getUTCFullYear();
|
|
324
|
+
const m = parsed.getUTCMonth();
|
|
325
|
+
const day = parsed.getUTCDate();
|
|
326
|
+
const dow = parsed.getUTCDay();
|
|
327
|
+
const start = new Date(Date.UTC(y, m, day - dow));
|
|
328
|
+
const ys = start.getUTCFullYear();
|
|
329
|
+
const ms = String(start.getUTCMonth() + 1).padStart(2, "0");
|
|
330
|
+
const ds = String(start.getUTCDate()).padStart(2, "0");
|
|
331
|
+
return `${ys}-${ms}-${ds}`;
|
|
332
|
+
}
|
|
333
|
+
function formatWeekStartDm(weekStartKey) {
|
|
334
|
+
const parsed = /* @__PURE__ */ new Date(`${weekStartKey}T00:00:00.000Z`);
|
|
335
|
+
if (Number.isNaN(parsed.getTime())) return weekStartKey;
|
|
336
|
+
return `${parsed.getUTCDate()}/${parsed.getUTCMonth() + 1}`;
|
|
337
|
+
}
|
|
338
|
+
function formatDayBreakdownDm(dateStr) {
|
|
339
|
+
const parsed = new Date(dateStr);
|
|
340
|
+
if (Number.isNaN(parsed.getTime())) return dateStr;
|
|
341
|
+
return `${parsed.getUTCDate()}/${parsed.getUTCMonth() + 1}`;
|
|
342
|
+
}
|
|
343
|
+
function toDateKeyUtcFromDate(d) {
|
|
344
|
+
const y = d.getUTCFullYear();
|
|
345
|
+
const m = String(d.getUTCMonth() + 1).padStart(2, "0");
|
|
346
|
+
const day = String(d.getUTCDate()).padStart(2, "0");
|
|
347
|
+
return `${y}-${m}-${day}`;
|
|
348
|
+
}
|
|
349
|
+
function lastNWeekStartKeysUtc(n) {
|
|
350
|
+
const now = /* @__PURE__ */ new Date();
|
|
351
|
+
const todayUtc = new Date(
|
|
352
|
+
Date.UTC(now.getUTCFullYear(), now.getUTCMonth(), now.getUTCDate())
|
|
353
|
+
);
|
|
354
|
+
const dow = todayUtc.getUTCDay();
|
|
355
|
+
const currentWeekStart = new Date(todayUtc);
|
|
356
|
+
currentWeekStart.setUTCDate(currentWeekStart.getUTCDate() - dow);
|
|
357
|
+
const keys = [];
|
|
358
|
+
for (let i = n - 1; i >= 0; i -= 1) {
|
|
359
|
+
const d = new Date(currentWeekStart);
|
|
360
|
+
d.setUTCDate(d.getUTCDate() - 7 * i);
|
|
361
|
+
keys.push(toDateKeyUtcFromDate(d));
|
|
362
|
+
}
|
|
363
|
+
return keys;
|
|
364
|
+
}
|
|
314
365
|
function formatMonthBucketLabel(ymKey) {
|
|
315
366
|
const [ys, ms] = ymKey.split("-");
|
|
316
367
|
const y = Number(ys);
|
|
@@ -318,27 +369,9 @@ function formatMonthBucketLabel(ymKey) {
|
|
|
318
369
|
if (!Number.isFinite(y) || !Number.isFinite(m)) return ymKey;
|
|
319
370
|
return new Intl.DateTimeFormat("en-IN", {
|
|
320
371
|
month: "short",
|
|
321
|
-
year: "numeric",
|
|
322
372
|
timeZone: "UTC"
|
|
323
373
|
}).format(new Date(Date.UTC(y, m - 1, 1)));
|
|
324
374
|
}
|
|
325
|
-
function aggregateDailyOrdersForBreakdown(rows, keyFn, labelFn) {
|
|
326
|
-
const map = /* @__PURE__ */ new Map();
|
|
327
|
-
for (const d of rows) {
|
|
328
|
-
const key = keyFn(d);
|
|
329
|
-
const cur = map.get(key) ?? { orders: 0, revenue: 0, bucketRows: [] };
|
|
330
|
-
cur.orders += d.orders_count;
|
|
331
|
-
cur.revenue += d.total_revenue;
|
|
332
|
-
cur.bucketRows.push(d);
|
|
333
|
-
map.set(key, cur);
|
|
334
|
-
}
|
|
335
|
-
return Array.from(map.entries()).sort(([a], [b]) => a.localeCompare(b)).map(([key, v]) => ({
|
|
336
|
-
key,
|
|
337
|
-
label: labelFn(key, v.bucketRows),
|
|
338
|
-
orders_count: v.orders,
|
|
339
|
-
revenue: v.revenue
|
|
340
|
-
}));
|
|
341
|
-
}
|
|
342
375
|
function isSalesBreakdownBarRow(value) {
|
|
343
376
|
if (typeof value !== "object" || value === null) return false;
|
|
344
377
|
const v = value;
|
|
@@ -534,6 +567,81 @@ function OrdersDashboard() {
|
|
|
534
567
|
const [todayContextLoading, setTodayContextLoading] = useState(true);
|
|
535
568
|
const [todayContextError, setTodayContextError] = useState(null);
|
|
536
569
|
const [salesGranularity, setSalesGranularity] = useState("day");
|
|
570
|
+
const [salesBreakdownDaily, setSalesBreakdownDaily] = useState(
|
|
571
|
+
[]
|
|
572
|
+
);
|
|
573
|
+
const [salesBreakdownOtLoading, setSalesBreakdownOtLoading] = useState(true);
|
|
574
|
+
const [salesBreakdownOtError, setSalesBreakdownOtError] = useState(null);
|
|
575
|
+
const [salesBreakdownHourlyRolling, setSalesBreakdownHourlyRolling] = useState([]);
|
|
576
|
+
const [salesBreakdownHourlyLoading, setSalesBreakdownHourlyLoading] = useState(false);
|
|
577
|
+
const [salesBreakdownHourlyError, setSalesBreakdownHourlyError] = useState(null);
|
|
578
|
+
const salesBreakdownOtPeriod = useMemo(
|
|
579
|
+
() => getSalesBreakdownOtPeriod(salesGranularity),
|
|
580
|
+
[salesGranularity]
|
|
581
|
+
);
|
|
582
|
+
useEffect(() => {
|
|
583
|
+
if (salesBreakdownOtPeriod === null) {
|
|
584
|
+
setSalesBreakdownDaily([]);
|
|
585
|
+
setSalesBreakdownOtLoading(false);
|
|
586
|
+
setSalesBreakdownOtError(null);
|
|
587
|
+
return;
|
|
588
|
+
}
|
|
589
|
+
let cancelled = false;
|
|
590
|
+
setSalesBreakdownOtLoading(true);
|
|
591
|
+
setSalesBreakdownOtError(null);
|
|
592
|
+
fetch(
|
|
593
|
+
`/admin/analytics/orders-over-time?period=${salesBreakdownOtPeriod}`,
|
|
594
|
+
{ credentials: "include" }
|
|
595
|
+
).then((res) => {
|
|
596
|
+
if (!res.ok) throw new Error(res.statusText);
|
|
597
|
+
return res.json();
|
|
598
|
+
}).then((body) => {
|
|
599
|
+
if (!cancelled) {
|
|
600
|
+
setSalesBreakdownDaily(body.dailyOrders ?? []);
|
|
601
|
+
}
|
|
602
|
+
}).catch((e) => {
|
|
603
|
+
if (!cancelled) {
|
|
604
|
+
setSalesBreakdownOtError(e instanceof Error ? e.message : String(e));
|
|
605
|
+
}
|
|
606
|
+
}).finally(() => {
|
|
607
|
+
if (!cancelled) setSalesBreakdownOtLoading(false);
|
|
608
|
+
});
|
|
609
|
+
return () => {
|
|
610
|
+
cancelled = true;
|
|
611
|
+
};
|
|
612
|
+
}, [salesBreakdownOtPeriod]);
|
|
613
|
+
useEffect(() => {
|
|
614
|
+
if (salesGranularity !== "hour") {
|
|
615
|
+
setSalesBreakdownHourlyRolling([]);
|
|
616
|
+
setSalesBreakdownHourlyLoading(false);
|
|
617
|
+
setSalesBreakdownHourlyError(null);
|
|
618
|
+
return;
|
|
619
|
+
}
|
|
620
|
+
let cancelled = false;
|
|
621
|
+
setSalesBreakdownHourlyLoading(true);
|
|
622
|
+
setSalesBreakdownHourlyError(null);
|
|
623
|
+
fetch("/admin/analytics/orders-insights?last_hours=24", {
|
|
624
|
+
credentials: "include"
|
|
625
|
+
}).then((res) => {
|
|
626
|
+
if (!res.ok) throw new Error(res.statusText);
|
|
627
|
+
return res.json();
|
|
628
|
+
}).then((body) => {
|
|
629
|
+
if (!cancelled) {
|
|
630
|
+
setSalesBreakdownHourlyRolling(body.hourly_rolling ?? []);
|
|
631
|
+
}
|
|
632
|
+
}).catch((e) => {
|
|
633
|
+
if (!cancelled) {
|
|
634
|
+
setSalesBreakdownHourlyError(
|
|
635
|
+
e instanceof Error ? e.message : String(e)
|
|
636
|
+
);
|
|
637
|
+
}
|
|
638
|
+
}).finally(() => {
|
|
639
|
+
if (!cancelled) setSalesBreakdownHourlyLoading(false);
|
|
640
|
+
});
|
|
641
|
+
return () => {
|
|
642
|
+
cancelled = true;
|
|
643
|
+
};
|
|
644
|
+
}, [salesGranularity]);
|
|
537
645
|
useEffect(() => {
|
|
538
646
|
let cancelled = false;
|
|
539
647
|
setLoading(true);
|
|
@@ -720,68 +828,73 @@ function OrdersDashboard() {
|
|
|
720
828
|
};
|
|
721
829
|
});
|
|
722
830
|
}, [dailyOrders, previousPeriodDailyOrders]);
|
|
723
|
-
const hourlyChartRows = useMemo(() => {
|
|
724
|
-
if (!ordersInsights) return [];
|
|
725
|
-
return ordersInsights.byHour.map((h) => ({
|
|
726
|
-
label: `${String(h.hour).padStart(2, "0")}:00`,
|
|
727
|
-
hour: h.hour,
|
|
728
|
-
orders_count: h.orders_count,
|
|
729
|
-
revenue: h.revenue
|
|
730
|
-
}));
|
|
731
|
-
}, [ordersInsights]);
|
|
732
831
|
const salesBreakdownChartRows = useMemo(() => {
|
|
733
832
|
if (salesGranularity === "hour") {
|
|
734
|
-
return
|
|
735
|
-
key: `
|
|
736
|
-
label:
|
|
737
|
-
orders_count:
|
|
738
|
-
revenue:
|
|
833
|
+
return salesBreakdownHourlyRolling.map((b, i) => ({
|
|
834
|
+
key: `rolling-${i}`,
|
|
835
|
+
label: b.label,
|
|
836
|
+
orders_count: b.orders_count,
|
|
837
|
+
revenue: b.revenue
|
|
739
838
|
}));
|
|
740
839
|
}
|
|
741
840
|
if (salesGranularity === "week") {
|
|
742
|
-
|
|
743
|
-
|
|
744
|
-
|
|
745
|
-
|
|
746
|
-
|
|
747
|
-
|
|
748
|
-
|
|
841
|
+
const targetKeys = lastNWeekStartKeysUtc(7);
|
|
842
|
+
const agg = /* @__PURE__ */ new Map();
|
|
843
|
+
for (const d of salesBreakdownDaily) {
|
|
844
|
+
const wk = utcSundayWeekStartKeyFromDateStr(d.date);
|
|
845
|
+
const cur = agg.get(wk) ?? { orders: 0, revenue: 0 };
|
|
846
|
+
cur.orders += d.orders_count;
|
|
847
|
+
cur.revenue += d.total_revenue;
|
|
848
|
+
agg.set(wk, cur);
|
|
849
|
+
}
|
|
850
|
+
return targetKeys.map((key) => {
|
|
851
|
+
var _a2, _b2;
|
|
852
|
+
return {
|
|
853
|
+
key,
|
|
854
|
+
label: formatWeekStartDm(key),
|
|
855
|
+
orders_count: ((_a2 = agg.get(key)) == null ? void 0 : _a2.orders) ?? 0,
|
|
856
|
+
revenue: ((_b2 = agg.get(key)) == null ? void 0 : _b2.revenue) ?? 0
|
|
857
|
+
};
|
|
858
|
+
});
|
|
749
859
|
}
|
|
750
860
|
if (salesGranularity === "month") {
|
|
751
|
-
return
|
|
752
|
-
|
|
753
|
-
|
|
754
|
-
|
|
755
|
-
|
|
861
|
+
return salesBreakdownDaily.map((d) => ({
|
|
862
|
+
key: d.date,
|
|
863
|
+
label: d.label ?? formatMonthBucketLabel(monthKeyFromDateStr(d.date)),
|
|
864
|
+
orders_count: d.orders_count,
|
|
865
|
+
revenue: d.total_revenue
|
|
866
|
+
}));
|
|
756
867
|
}
|
|
757
|
-
return
|
|
868
|
+
return salesBreakdownDaily.map((d) => ({
|
|
758
869
|
key: d.date,
|
|
759
|
-
label:
|
|
870
|
+
label: formatDayBreakdownDm(d.date),
|
|
760
871
|
orders_count: d.orders_count,
|
|
761
872
|
revenue: d.total_revenue
|
|
762
873
|
}));
|
|
763
|
-
}, [
|
|
874
|
+
}, [
|
|
875
|
+
salesGranularity,
|
|
876
|
+
salesBreakdownDaily,
|
|
877
|
+
salesBreakdownHourlyRolling
|
|
878
|
+
]);
|
|
764
879
|
const salesBreakdownDescription = useMemo(() => {
|
|
765
|
-
var _a2;
|
|
766
|
-
const rangeLabel = ((_a2 = OVER_TIME_PERIODS.find((p) => p.value === overTimePeriod)) == null ? void 0 : _a2.label) ?? "selected range";
|
|
767
|
-
const insightsHint = `Order-time breakdown uses last ${insightsWindowDays} days (UTC).`;
|
|
768
880
|
switch (salesGranularity) {
|
|
769
|
-
case "day":
|
|
770
|
-
return `Revenue by calendar day for ${rangeLabel} (aligned with Revenue & orders).`;
|
|
771
881
|
case "hour":
|
|
772
|
-
return
|
|
882
|
+
return "Last 24 hours from now (UTC): one bar per clock hour in the rolling window.";
|
|
883
|
+
case "day":
|
|
884
|
+
return "Last 7 calendar days (UTC), one bar per day — axis day/month.";
|
|
773
885
|
case "week":
|
|
774
|
-
return
|
|
886
|
+
return "Last 7 weeks (UTC, weeks start Sunday); axis shows each week’s start as day/month.";
|
|
775
887
|
case "month":
|
|
776
|
-
return
|
|
888
|
+
return "Last 12 calendar months through the current month (UTC) — Jan, Feb, Mar, …";
|
|
777
889
|
default:
|
|
778
890
|
return "";
|
|
779
891
|
}
|
|
780
|
-
}, [salesGranularity
|
|
892
|
+
}, [salesGranularity]);
|
|
781
893
|
const salesBreakdownXAxisInterval = useMemo(() => {
|
|
782
894
|
const n = salesBreakdownChartRows.length;
|
|
783
895
|
if (salesGranularity === "hour") return 3;
|
|
784
|
-
if (salesGranularity === "day" && n > 24)
|
|
896
|
+
if (salesGranularity === "day" && n > 24)
|
|
897
|
+
return Math.max(0, Math.ceil(n / 10) - 1);
|
|
785
898
|
return 0;
|
|
786
899
|
}, [salesGranularity, salesBreakdownChartRows.length]);
|
|
787
900
|
const ordersVsDraftsPie = useMemo(() => {
|
|
@@ -860,20 +973,14 @@ function OrdersDashboard() {
|
|
|
860
973
|
if (error || !data) {
|
|
861
974
|
return /* @__PURE__ */ jsx(Container, { className: "p-6", children: /* @__PURE__ */ jsx(Text, { className: "text-ui-fg-danger", children: error ?? "Failed to load analytics" }) });
|
|
862
975
|
}
|
|
863
|
-
const
|
|
864
|
-
const
|
|
976
|
+
const salesBreakdownWaiting = salesGranularity === "hour" ? salesBreakdownHourlyLoading : salesBreakdownOtLoading;
|
|
977
|
+
const salesBreakdownFetchError = salesGranularity === "hour" ? salesBreakdownHourlyError : salesBreakdownOtError;
|
|
865
978
|
const salesBreakdownBody = (() => {
|
|
866
|
-
if (
|
|
979
|
+
if (salesBreakdownWaiting) {
|
|
867
980
|
return /* @__PURE__ */ jsx(AnalyticsChartSurface, { variant: "atlas", children: /* @__PURE__ */ jsx("div", { className: "flex min-h-[min(176px,28vh)] items-center justify-center py-6", children: /* @__PURE__ */ jsx(Text, { className: "text-ui-fg-muted text-xs", children: "Loading chart…" }) }) });
|
|
868
981
|
}
|
|
869
|
-
if (
|
|
870
|
-
return /* @__PURE__ */ jsx(AnalyticsChartSurface, { variant: "atlas", children: /* @__PURE__ */ jsx("div", { className: "flex min-h-[min(176px,28vh)] items-center justify-center px-2 py-6", children: /* @__PURE__ */ jsx(Text, { className: "text-ui-fg-danger text-center text-xs", children:
|
|
871
|
-
}
|
|
872
|
-
if (needsSalesInsights && insightsLoading) {
|
|
873
|
-
return /* @__PURE__ */ jsx(AnalyticsChartSurface, { variant: "atlas", children: /* @__PURE__ */ jsx("div", { className: "flex min-h-[min(176px,28vh)] items-center justify-center py-6", children: /* @__PURE__ */ jsx(Text, { className: "text-ui-fg-muted text-xs", children: "Loading chart…" }) }) });
|
|
874
|
-
}
|
|
875
|
-
if (needsSalesInsights && insightsError) {
|
|
876
|
-
return /* @__PURE__ */ jsx(AnalyticsChartSurface, { variant: "atlas", children: /* @__PURE__ */ jsx("div", { className: "flex min-h-[min(176px,28vh)] items-center justify-center px-2 py-6", children: /* @__PURE__ */ jsx(Text, { className: "text-ui-fg-danger text-center text-xs", children: insightsError }) }) });
|
|
982
|
+
if (salesBreakdownFetchError) {
|
|
983
|
+
return /* @__PURE__ */ jsx(AnalyticsChartSurface, { variant: "atlas", children: /* @__PURE__ */ jsx("div", { className: "flex min-h-[min(176px,28vh)] items-center justify-center px-2 py-6", children: /* @__PURE__ */ jsx(Text, { className: "text-ui-fg-danger text-center text-xs", children: salesBreakdownFetchError }) }) });
|
|
877
984
|
}
|
|
878
985
|
if (salesBreakdownChartRows.length === 0) {
|
|
879
986
|
return /* @__PURE__ */ jsx(
|
|
@@ -1834,29 +1941,32 @@ function OrdersDashboard() {
|
|
|
1834
1941
|
title: "Sales breakdown",
|
|
1835
1942
|
description: salesBreakdownDescription,
|
|
1836
1943
|
actionsBare: true,
|
|
1837
|
-
actions: /* @__PURE__ */
|
|
1838
|
-
|
|
1839
|
-
|
|
1840
|
-
|
|
1841
|
-
|
|
1842
|
-
|
|
1843
|
-
|
|
1844
|
-
|
|
1845
|
-
|
|
1846
|
-
|
|
1847
|
-
|
|
1848
|
-
|
|
1849
|
-
|
|
1850
|
-
|
|
1851
|
-
|
|
1852
|
-
|
|
1853
|
-
|
|
1854
|
-
|
|
1855
|
-
|
|
1856
|
-
|
|
1857
|
-
|
|
1858
|
-
|
|
1859
|
-
|
|
1944
|
+
actions: /* @__PURE__ */ jsxs("div", { className: "flex flex-col items-stretch gap-1 sm:flex-row sm:items-center sm:gap-2", children: [
|
|
1945
|
+
/* @__PURE__ */ jsx(
|
|
1946
|
+
Label,
|
|
1947
|
+
{
|
|
1948
|
+
htmlFor: "sales-breakdown-granularity",
|
|
1949
|
+
className: "shrink-0 text-ui-fg-muted text-xs font-medium",
|
|
1950
|
+
children: "Breakdown"
|
|
1951
|
+
}
|
|
1952
|
+
),
|
|
1953
|
+
/* @__PURE__ */ jsx(
|
|
1954
|
+
"select",
|
|
1955
|
+
{
|
|
1956
|
+
id: "sales-breakdown-granularity",
|
|
1957
|
+
value: salesGranularity,
|
|
1958
|
+
onChange: (e) => {
|
|
1959
|
+
const v = e.target.value;
|
|
1960
|
+
if (v === "hour" || v === "day" || v === "week" || v === "month") {
|
|
1961
|
+
setSalesGranularity(v);
|
|
1962
|
+
}
|
|
1963
|
+
},
|
|
1964
|
+
className: SELECT_CLASS_NAME$2,
|
|
1965
|
+
"aria-label": "Sales breakdown time bucket",
|
|
1966
|
+
children: SALES_GRANULARITY_TABS.map((tab) => /* @__PURE__ */ jsx("option", { value: tab.value, children: tab.value === "hour" ? "Hour (last 24h)" : tab.value === "day" ? "Day (last 7 days)" : tab.value === "week" ? "Week (last 7 weeks)" : "Month (last 12 months)" }, tab.value))
|
|
1967
|
+
}
|
|
1968
|
+
)
|
|
1969
|
+
] }),
|
|
1860
1970
|
children: salesBreakdownBody
|
|
1861
1971
|
}
|
|
1862
1972
|
),
|
|
@@ -2636,7 +2746,7 @@ function EmptyAnalyticsPanel({ title, description }) {
|
|
|
2636
2746
|
] });
|
|
2637
2747
|
}
|
|
2638
2748
|
function ProductsDashboard() {
|
|
2639
|
-
var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j
|
|
2749
|
+
var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j;
|
|
2640
2750
|
const [summaryDays, setSummaryDays] = useState("all");
|
|
2641
2751
|
const [graphPeriod, setGraphPeriod] = useState("one_week");
|
|
2642
2752
|
const [topSellerPeriod, setTopSellerPeriod] = useState("week");
|
|
@@ -2763,7 +2873,7 @@ function ProductsDashboard() {
|
|
|
2763
2873
|
};
|
|
2764
2874
|
}, [salesChannelId, topSellerPeriod]);
|
|
2765
2875
|
useEffect(() => {
|
|
2766
|
-
var _a2
|
|
2876
|
+
var _a2;
|
|
2767
2877
|
let cancelled = false;
|
|
2768
2878
|
if (topSellersLoading) {
|
|
2769
2879
|
setBestSellersTrendLoading(true);
|
|
@@ -2779,7 +2889,12 @@ function ProductsDashboard() {
|
|
|
2779
2889
|
cancelled = true;
|
|
2780
2890
|
};
|
|
2781
2891
|
}
|
|
2782
|
-
const
|
|
2892
|
+
const topSellersByUnits2 = [...(topSellers == null ? void 0 : topSellers.products) ?? []].sort((a, b) => {
|
|
2893
|
+
if (b.units_sold !== a.units_sold) return b.units_sold - a.units_sold;
|
|
2894
|
+
if (b.order_count !== a.order_count) return b.order_count - a.order_count;
|
|
2895
|
+
return b.revenue - a.revenue;
|
|
2896
|
+
});
|
|
2897
|
+
const topProductId = (_a2 = topSellersByUnits2[0]) == null ? void 0 : _a2.product_id;
|
|
2783
2898
|
if (!topProductId) {
|
|
2784
2899
|
setBestSellersTrendLoading(false);
|
|
2785
2900
|
setBestSellersTrendError(null);
|
|
@@ -2925,16 +3040,24 @@ function ProductsDashboard() {
|
|
|
2925
3040
|
}, [series]);
|
|
2926
3041
|
const peakRevenuePoint = series.length > 0 ? series.reduce((peak, point) => point.revenue > peak.revenue ? point : peak) : null;
|
|
2927
3042
|
const viewsConnectedForPulse = ((summary == null ? void 0 : summary.productViewsConnected) ?? false) || (overTime == null ? void 0 : overTime.productViewsConnected) === true || (topSellers == null ? void 0 : topSellers.productViewsConnected) === true || (performance == null ? void 0 : performance.productViewsConnected) === true;
|
|
3043
|
+
const topSellersByUnits = useMemo(
|
|
3044
|
+
() => [...(topSellers == null ? void 0 : topSellers.products) ?? []].sort((a, b) => {
|
|
3045
|
+
if (b.units_sold !== a.units_sold) return b.units_sold - a.units_sold;
|
|
3046
|
+
if (b.order_count !== a.order_count) return b.order_count - a.order_count;
|
|
3047
|
+
return b.revenue - a.revenue;
|
|
3048
|
+
}),
|
|
3049
|
+
[topSellers]
|
|
3050
|
+
);
|
|
2928
3051
|
const bestSellersTrendSeries = (bestSellersTrend == null ? void 0 : bestSellersTrend.series) ?? [];
|
|
2929
3052
|
const mostViewedTrendSeries = (mostViewedTrend == null ? void 0 : mostViewedTrend.series) ?? [];
|
|
2930
|
-
const bestSellerTrendProductTitle = ((_a = bestSellersTrend == null ? void 0 : bestSellersTrend.product) == null ? void 0 : _a.product_title) ?? ((
|
|
2931
|
-
const mostViewedTrendProductTitle = ((
|
|
3053
|
+
const bestSellerTrendProductTitle = ((_a = bestSellersTrend == null ? void 0 : bestSellersTrend.product) == null ? void 0 : _a.product_title) ?? ((_b = topSellersByUnits[0]) == null ? void 0 : _b.product_title) ?? null;
|
|
3054
|
+
const mostViewedTrendProductTitle = ((_c = mostViewedTrend == null ? void 0 : mostViewedTrend.product) == null ? void 0 : _c.product_title) ?? ((_e = (_d = performance == null ? void 0 : performance.topViewedProducts) == null ? void 0 : _d[0]) == null ? void 0 : _e.product_title) ?? null;
|
|
2932
3055
|
const viewsVsUnitsScatterData = useMemo(
|
|
2933
3056
|
() => ((performance == null ? void 0 : performance.topViewedProducts) ?? []).slice(0, 48).filter((row) => row.total_views > 0 || row.units_sold > 0),
|
|
2934
3057
|
[performance]
|
|
2935
3058
|
);
|
|
2936
|
-
const selectedSummaryPeriod = ((
|
|
2937
|
-
const selectedGraphPeriodLabel = ((
|
|
3059
|
+
const selectedSummaryPeriod = ((_f = SUMMARY_PERIODS.find((p) => p.value === summaryDays)) == null ? void 0 : _f.label) ?? "All time";
|
|
3060
|
+
const selectedGraphPeriodLabel = ((_g = GRAPH_PERIODS.find((p) => p.value === graphPeriod)) == null ? void 0 : _g.label) ?? "One week";
|
|
2938
3061
|
const quickPulseMetrics = [
|
|
2939
3062
|
{
|
|
2940
3063
|
label: "Range units",
|
|
@@ -2976,7 +3099,7 @@ function ProductsDashboard() {
|
|
|
2976
3099
|
return /* @__PURE__ */ jsx(Container, { className: "p-6", children: /* @__PURE__ */ jsx(Text, { className: "text-ui-fg-danger", children: summaryError ?? "Failed to load product analytics" }) });
|
|
2977
3100
|
}
|
|
2978
3101
|
const viewsConnected = summary.productViewsConnected || (overTime == null ? void 0 : overTime.productViewsConnected) === true || (topSellers == null ? void 0 : topSellers.productViewsConnected) === true || (performance == null ? void 0 : performance.productViewsConnected) === true;
|
|
2979
|
-
const selectedChannelLabel = salesChannelId === "all" ? "All channels" : ((
|
|
3102
|
+
const selectedChannelLabel = salesChannelId === "all" ? "All channels" : ((_h = salesChannels.find((channel) => channel.id === salesChannelId)) == null ? void 0 : _h.name) ?? "Selected channel";
|
|
2980
3103
|
const primaryStats = [
|
|
2981
3104
|
{
|
|
2982
3105
|
label: "Units sold",
|
|
@@ -3397,7 +3520,7 @@ function ProductsDashboard() {
|
|
|
3397
3520
|
variant: "atlas",
|
|
3398
3521
|
actionsBare: true,
|
|
3399
3522
|
title: "Best sellers",
|
|
3400
|
-
description: bestSellerTrendProductTitle ? `Revenue and units over time for “${bestSellerTrendProductTitle}” (#1 by
|
|
3523
|
+
description: bestSellerTrendProductTitle ? `Revenue and units over time for “${bestSellerTrendProductTitle}” (#1 by units sold in this window; all-time uses a 12‑month chart).` : "Revenue and units over time for the top product by units sold in this window (all-time leaderboard uses a 12‑month chart).",
|
|
3401
3524
|
actions: /* @__PURE__ */ jsxs("div", { className: "flex flex-wrap items-center gap-2", children: [
|
|
3402
3525
|
/* @__PURE__ */ jsx(
|
|
3403
3526
|
Label,
|
|
@@ -3561,7 +3684,7 @@ function ProductsDashboard() {
|
|
|
3561
3684
|
variant: "atlas",
|
|
3562
3685
|
className: "min-w-0 md:col-span-1 xl:col-span-1",
|
|
3563
3686
|
title: "Leaderboard table",
|
|
3564
|
-
description: "Products ranked by
|
|
3687
|
+
description: "Products ranked by units sold — same window as Best sellers.",
|
|
3565
3688
|
children: /* @__PURE__ */ jsx("div", { className: "min-h-[212px] min-w-0 sm:min-h-[228px]", children: /* @__PURE__ */ jsx(AnalyticsTableSurface, { className: "shadow-sm", children: /* @__PURE__ */ jsxs(Table, { className: LEADERBOARD_TABLE_CLASS, children: [
|
|
3566
3689
|
/* @__PURE__ */ jsx(Table.Header, { children: /* @__PURE__ */ jsxs(Table.Row, { children: [
|
|
3567
3690
|
/* @__PURE__ */ jsx(Table.HeaderCell, { className: TABLE_HEAD_CELL_NOWRAP, children: "Product" }),
|
|
@@ -3576,12 +3699,12 @@ function ProductsDashboard() {
|
|
|
3576
3699
|
/* @__PURE__ */ jsx(Table.Cell, {}),
|
|
3577
3700
|
/* @__PURE__ */ jsx(Table.Cell, {})
|
|
3578
3701
|
] }) : null,
|
|
3579
|
-
!topSellersError ?
|
|
3580
|
-
var _a2
|
|
3702
|
+
!topSellersError ? topSellersByUnits.slice(0, 8).map((product) => {
|
|
3703
|
+
var _a2;
|
|
3581
3704
|
return /* @__PURE__ */ jsxs(
|
|
3582
3705
|
Table.Row,
|
|
3583
3706
|
{
|
|
3584
|
-
className: product.product_id === ((
|
|
3707
|
+
className: product.product_id === ((_a2 = topSellersByUnits[0]) == null ? void 0 : _a2.product_id) ? "bg-emerald-500/5" : void 0,
|
|
3585
3708
|
children: [
|
|
3586
3709
|
/* @__PURE__ */ jsx(Table.Cell, { children: product.product_title }),
|
|
3587
3710
|
/* @__PURE__ */ jsx(Table.Cell, { children: product.units_sold.toLocaleString() }),
|
|
@@ -3592,7 +3715,7 @@ function ProductsDashboard() {
|
|
|
3592
3715
|
product.product_id
|
|
3593
3716
|
);
|
|
3594
3717
|
}) : null,
|
|
3595
|
-
!topSellersLoading && !topSellersError && (((
|
|
3718
|
+
!topSellersLoading && !topSellersError && (((_i = topSellers == null ? void 0 : topSellers.products) == null ? void 0 : _i.length) ?? 0) === 0 ? /* @__PURE__ */ jsxs(Table.Row, { children: [
|
|
3596
3719
|
/* @__PURE__ */ jsx(Table.Cell, { children: /* @__PURE__ */ jsx(Text, { className: "text-ui-fg-muted text-xs", children: "No best seller data yet." }) }),
|
|
3597
3720
|
/* @__PURE__ */ jsx(Table.Cell, {}),
|
|
3598
3721
|
/* @__PURE__ */ jsx(Table.Cell, {}),
|
|
@@ -3748,7 +3871,7 @@ function ProductsDashboard() {
|
|
|
3748
3871
|
/* @__PURE__ */ jsx(Table.Cell, { children: product.units_sold.toLocaleString() }),
|
|
3749
3872
|
/* @__PURE__ */ jsx(Table.Cell, { children: formatRatio(product.views_per_unit) })
|
|
3750
3873
|
] }, product.product_id)),
|
|
3751
|
-
!performanceLoading && !performanceError && (((
|
|
3874
|
+
!performanceLoading && !performanceError && (((_j = performance == null ? void 0 : performance.viewOpportunities) == null ? void 0 : _j.length) ?? 0) === 0 ? /* @__PURE__ */ jsxs(Table.Row, { children: [
|
|
3752
3875
|
/* @__PURE__ */ jsx(Table.Cell, { children: /* @__PURE__ */ jsx(Text, { className: "text-ui-fg-muted text-xs", children: "No product view opportunities yet." }) }),
|
|
3753
3876
|
/* @__PURE__ */ jsx(Table.Cell, {}),
|
|
3754
3877
|
/* @__PURE__ */ jsx(Table.Cell, {}),
|
|
@@ -13,6 +13,25 @@ function parseDays(value) {
|
|
|
13
13
|
return 365;
|
|
14
14
|
return Math.floor(n);
|
|
15
15
|
}
|
|
16
|
+
/** Rolling window in whole hours ending at request time (UTC). */
|
|
17
|
+
function parseLastHours(value) {
|
|
18
|
+
if (value === undefined || value === "")
|
|
19
|
+
return null;
|
|
20
|
+
const n = Number(value);
|
|
21
|
+
if (!Number.isFinite(n) || n < 1)
|
|
22
|
+
return null;
|
|
23
|
+
if (n > 168)
|
|
24
|
+
return 168;
|
|
25
|
+
return Math.floor(n);
|
|
26
|
+
}
|
|
27
|
+
const HOUR_MS = 60 * 60 * 1000;
|
|
28
|
+
function rollingBucketLabel(rangeStart, slotIndex) {
|
|
29
|
+
const t = new Date(rangeStart.getTime() + slotIndex * HOUR_MS);
|
|
30
|
+
const d = t.getUTCDate();
|
|
31
|
+
const m = t.getUTCMonth() + 1;
|
|
32
|
+
const h = t.getUTCHours();
|
|
33
|
+
return `${d}/${m} ${String(h).padStart(2, "0")}:00`;
|
|
34
|
+
}
|
|
16
35
|
function unwrapRemoteQueryRows(raw) {
|
|
17
36
|
if (raw === null || raw === undefined)
|
|
18
37
|
return [];
|
|
@@ -61,12 +80,29 @@ async function fetchDraftSnapshot(req) {
|
|
|
61
80
|
}
|
|
62
81
|
}
|
|
63
82
|
async function GET(req, res) {
|
|
83
|
+
const lastHours = parseLastHours(req.query?.last_hours);
|
|
64
84
|
const days = parseDays(req.query?.days);
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
85
|
+
let rangeEnd;
|
|
86
|
+
let rangeStart;
|
|
87
|
+
let windowDaysForDto;
|
|
88
|
+
let windowHoursForDto;
|
|
89
|
+
let rollingSlotCount = null;
|
|
90
|
+
if (lastHours !== null) {
|
|
91
|
+
rangeEnd = new Date();
|
|
92
|
+
rangeStart = new Date(rangeEnd.getTime() - lastHours * HOUR_MS);
|
|
93
|
+
windowHoursForDto = lastHours;
|
|
94
|
+
windowDaysForDto = Math.max(1, Math.ceil(lastHours / 24));
|
|
95
|
+
rollingSlotCount = lastHours;
|
|
96
|
+
}
|
|
97
|
+
else {
|
|
98
|
+
const today = new Date();
|
|
99
|
+
today.setUTCHours(23, 59, 59, 999);
|
|
100
|
+
rangeEnd = today;
|
|
101
|
+
rangeStart = new Date(today);
|
|
102
|
+
rangeStart.setUTCDate(rangeStart.getUTCDate() - (days - 1));
|
|
103
|
+
rangeStart.setUTCHours(0, 0, 0, 0);
|
|
104
|
+
windowDaysForDto = days;
|
|
105
|
+
}
|
|
70
106
|
try {
|
|
71
107
|
const orderFields = [
|
|
72
108
|
"id",
|
|
@@ -81,6 +117,12 @@ async function GET(req, res) {
|
|
|
81
117
|
const allOrders = await (0, fetch_orders_for_analytics_1.fetchOrdersForAnalytics)(req, orderFields);
|
|
82
118
|
const byHourMap = new Map();
|
|
83
119
|
const byWeekdayMap = new Map();
|
|
120
|
+
const rollingAgg = rollingSlotCount !== null
|
|
121
|
+
? Array.from({ length: rollingSlotCount }, () => ({
|
|
122
|
+
orders_count: 0,
|
|
123
|
+
revenue: 0,
|
|
124
|
+
}))
|
|
125
|
+
: null;
|
|
84
126
|
for (let h = 0; h < 24; h += 1) {
|
|
85
127
|
byHourMap.set(h, { orders_count: 0, revenue: 0 });
|
|
86
128
|
}
|
|
@@ -96,12 +138,22 @@ async function GET(req, res) {
|
|
|
96
138
|
if (!o)
|
|
97
139
|
continue;
|
|
98
140
|
const createdAt = (0, orders_analytics_helpers_1.toValidDate)(o.created_at);
|
|
99
|
-
if (!createdAt || createdAt < rangeStart || createdAt >
|
|
141
|
+
if (!createdAt || createdAt < rangeStart || createdAt > rangeEnd) {
|
|
100
142
|
continue;
|
|
101
143
|
}
|
|
102
144
|
const total = (0, orders_analytics_helpers_1.getOrderTotal)(o);
|
|
103
145
|
const hour = createdAt.getUTCHours();
|
|
104
146
|
const wd = createdAt.getUTCDay();
|
|
147
|
+
if (rollingAgg) {
|
|
148
|
+
const slot = Math.floor((createdAt.getTime() - rangeStart.getTime()) / HOUR_MS);
|
|
149
|
+
if (slot >= 0 && slot < rollingAgg.length) {
|
|
150
|
+
const cell = rollingAgg[slot];
|
|
151
|
+
if (cell) {
|
|
152
|
+
cell.orders_count += 1;
|
|
153
|
+
cell.revenue += total;
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
}
|
|
105
157
|
const hAgg = byHourMap.get(hour);
|
|
106
158
|
if (hAgg) {
|
|
107
159
|
hAgg.orders_count += 1;
|
|
@@ -129,6 +181,14 @@ async function GET(req, res) {
|
|
|
129
181
|
const v = byHourMap.get(h) ?? { orders_count: 0, revenue: 0 };
|
|
130
182
|
byHour.push({ hour: h, orders_count: v.orders_count, revenue: v.revenue });
|
|
131
183
|
}
|
|
184
|
+
let hourlyRolling;
|
|
185
|
+
if (rollingAgg) {
|
|
186
|
+
hourlyRolling = rollingAgg.map((v, i) => ({
|
|
187
|
+
label: rollingBucketLabel(rangeStart, i),
|
|
188
|
+
orders_count: v.orders_count,
|
|
189
|
+
revenue: v.revenue,
|
|
190
|
+
}));
|
|
191
|
+
}
|
|
132
192
|
const byWeekday = [];
|
|
133
193
|
for (let w = 0; w < 7; w += 1) {
|
|
134
194
|
const v = byWeekdayMap.get(w) ?? { orders_count: 0, revenue: 0 };
|
|
@@ -166,7 +226,7 @@ async function GET(req, res) {
|
|
|
166
226
|
if (!o)
|
|
167
227
|
continue;
|
|
168
228
|
const createdAt = (0, orders_analytics_helpers_1.toValidDate)(o.created_at);
|
|
169
|
-
if (!createdAt || createdAt < rangeStart || createdAt >
|
|
229
|
+
if (!createdAt || createdAt < rangeStart || createdAt > rangeEnd)
|
|
170
230
|
continue;
|
|
171
231
|
revenueInWindow += (0, orders_analytics_helpers_1.getOrderTotal)(o);
|
|
172
232
|
}
|
|
@@ -180,11 +240,13 @@ async function GET(req, res) {
|
|
|
180
240
|
const drafts = await fetchDraftSnapshot(req);
|
|
181
241
|
const body = {
|
|
182
242
|
byHour,
|
|
243
|
+
...(hourlyRolling ? { hourly_rolling: hourlyRolling } : {}),
|
|
183
244
|
byWeekday,
|
|
184
245
|
funnel,
|
|
185
246
|
traffic,
|
|
186
247
|
drafts,
|
|
187
|
-
window_days:
|
|
248
|
+
window_days: windowDaysForDto,
|
|
249
|
+
...(windowHoursForDto !== undefined ? { window_hours: windowHoursForDto } : {}),
|
|
188
250
|
};
|
|
189
251
|
res.json(body);
|
|
190
252
|
}
|
|
@@ -196,4 +258,4 @@ async function GET(req, res) {
|
|
|
196
258
|
});
|
|
197
259
|
}
|
|
198
260
|
}
|
|
199
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL2FkbWluL2FuYWx5dGljcy9vcmRlcnMtaW5zaWdodHMvcm91dGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFvRkEsa0JBMkpDO0FBeE9ELHFEQUdrQztBQUNsQyw4RUFBdUU7QUFDdkUsMEVBT29DO0FBVXBDLE1BQU0sY0FBYyxHQUFHLENBQUMsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUE7QUFFeEUsU0FBUyxTQUFTLENBQUMsS0FBYztJQUMvQixNQUFNLENBQUMsR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUE7SUFDdkIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUM7UUFBRSxPQUFPLEVBQUUsQ0FBQTtJQUMzQyxJQUFJLENBQUMsR0FBRyxHQUFHO1FBQUUsT0FBTyxHQUFHLENBQUE7SUFDdkIsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFBO0FBQ3RCLENBQUM7QUFFRCxTQUFTLHFCQUFxQixDQUFDLEdBQVk7SUFDekMsSUFBSSxHQUFHLEtBQUssSUFBSSxJQUFJLEdBQUcsS0FBSyxTQUFTO1FBQUUsT0FBTyxFQUFFLENBQUE7SUFDaEQsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQztRQUFFLE9BQU8sR0FBRyxDQUFBO0lBQ2xDLElBQUksT0FBTyxHQUFHLEtBQUssUUFBUSxFQUFFLENBQUM7UUFDNUIsTUFBTSxHQUFHLEdBQUcsR0FBOEIsQ0FBQTtRQUMxQyxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQztZQUFFLE9BQU8sR0FBRyxDQUFDLElBQUksQ0FBQTtRQUM1QyxJQUFJLEtBQUssQ0FBQyxP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
|
|
261
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL2FkbWluL2FuYWx5dGljcy9vcmRlcnMtaW5zaWdodHMvcm91dGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUF3R0Esa0JBME1DO0FBM1NELHFEQUdrQztBQUNsQyw4RUFBdUU7QUFDdkUsMEVBT29DO0FBV3BDLE1BQU0sY0FBYyxHQUFHLENBQUMsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUE7QUFFeEUsU0FBUyxTQUFTLENBQUMsS0FBYztJQUMvQixNQUFNLENBQUMsR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUE7SUFDdkIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUM7UUFBRSxPQUFPLEVBQUUsQ0FBQTtJQUMzQyxJQUFJLENBQUMsR0FBRyxHQUFHO1FBQUUsT0FBTyxHQUFHLENBQUE7SUFDdkIsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFBO0FBQ3RCLENBQUM7QUFFRCxrRUFBa0U7QUFDbEUsU0FBUyxjQUFjLENBQUMsS0FBYztJQUNwQyxJQUFJLEtBQUssS0FBSyxTQUFTLElBQUksS0FBSyxLQUFLLEVBQUU7UUFBRSxPQUFPLElBQUksQ0FBQTtJQUNwRCxNQUFNLENBQUMsR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUE7SUFDdkIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUM7UUFBRSxPQUFPLElBQUksQ0FBQTtJQUM3QyxJQUFJLENBQUMsR0FBRyxHQUFHO1FBQUUsT0FBTyxHQUFHLENBQUE7SUFDdkIsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFBO0FBQ3RCLENBQUM7QUFFRCxNQUFNLE9BQU8sR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQTtBQUU5QixTQUFTLGtCQUFrQixDQUFDLFVBQWdCLEVBQUUsU0FBaUI7SUFDN0QsTUFBTSxDQUFDLEdBQUcsSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sRUFBRSxHQUFHLFNBQVMsR0FBRyxPQUFPLENBQUMsQ0FBQTtJQUM5RCxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsVUFBVSxFQUFFLENBQUE7SUFDeEIsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLFdBQVcsRUFBRSxHQUFHLENBQUMsQ0FBQTtJQUM3QixNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUE7SUFDekIsT0FBTyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLEtBQUssQ0FBQTtBQUNyRCxDQUFDO0FBRUQsU0FBUyxxQkFBcUIsQ0FBQyxHQUFZO0lBQ3pDLElBQUksR0FBRyxLQUFLLElBQUksSUFBSSxHQUFHLEtBQUssU0FBUztRQUFFLE9BQU8sRUFBRSxDQUFBO0lBQ2hELElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUM7UUFBRSxPQUFPLEdBQUcsQ0FBQTtJQUNsQyxJQUFJLE9BQU8sR0FBRyxLQUFLLFFBQVEsRUFBRSxDQUFDO1FBQzVCLE1BQU0sR0FBRyxHQUFHLEdBQThCLENBQUE7UUFDMUMsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUM7WUFBRSxPQUFPLEdBQUcsQ0FBQyxJQUFJLENBQUE7UUFDNUMsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUM7WUFBRSxPQUFPLEdBQUcsQ0FBQyxJQUFJLENBQUE7UUFDNUMsTUFBTSxNQUFNLEdBQUcsR0FBRyxDQUFDLElBQUksQ0FBQTtRQUN2QixJQUFJLE1BQU0sSUFBSSxPQUFPLE1BQU0sS0FBSyxRQUFRLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7WUFDbkUsTUFBTSxDQUFDLEdBQUcsTUFBaUMsQ0FBQTtZQUMzQyxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztnQkFBRSxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUE7UUFDMUMsQ0FBQztJQUNILENBQUM7SUFDRCxPQUFPLEVBQUUsQ0FBQTtBQUNYLENBQUM7QUFFRCxLQUFLLFVBQVUsa0JBQWtCLENBQy9CLEdBQWtCO0lBRWxCLElBQUksQ0FBQztRQUNILE1BQU0sV0FBVyxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUNuQyxpQ0FBeUIsQ0FBQyxZQUFZLENBQ3ZDLENBQUE7UUFDRCxNQUFNLFdBQVcsR0FBRyxJQUFBLG1DQUEyQixFQUFDO1lBQzlDLFVBQVUsRUFBRSxhQUFhO1lBQ3pCLE1BQU0sRUFBRSxDQUFDLElBQUksRUFBRSxPQUFPLEVBQUUsWUFBWSxDQUFDO1lBQ3JDLFNBQVMsRUFBRSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBRTtTQUNuQyxDQUFDLENBQUE7UUFDRixNQUFNLEdBQUcsR0FBRyxNQUFNLFdBQVcsQ0FBQyxXQUFXLENBQUMsQ0FBQTtRQUMxQyxNQUFNLElBQUksR0FBRyxxQkFBcUIsQ0FBQyxHQUFHLENBQUMsQ0FBQTtRQUN2QyxJQUFJLFVBQVUsR0FBRyxDQUFDLENBQUE7UUFDbEIsS0FBSyxNQUFNLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQztZQUN2QixNQUFNLENBQUMsR0FBRyxHQUEwQixDQUFBO1lBQ3BDLE1BQU0sQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUE7WUFDekIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO2dCQUFFLFVBQVUsSUFBSSxDQUFDLENBQUE7UUFDdkMsQ0FBQztRQUNELE9BQU87WUFDTCxLQUFLLEVBQUUsSUFBSSxDQUFDLE1BQU07WUFDbEIsV0FBVyxFQUFFLFVBQVU7WUFDdkIsU0FBUyxFQUFFLElBQUk7U0FDaEIsQ0FBQTtJQUNILENBQUM7SUFBQyxNQUFNLENBQUM7UUFDUCxPQUFPLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxXQUFXLEVBQUUsQ0FBQyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsQ0FBQTtJQUN2RCxDQUFDO0FBQ0gsQ0FBQztBQUVNLEtBQUssVUFBVSxHQUFHLENBQ3ZCLEdBQWtCLEVBQ2xCLEdBQW1CO0lBRW5CLE1BQU0sU0FBUyxHQUFHLGNBQWMsQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFLFVBQVUsQ0FBQyxDQUFBO0lBQ3ZELE1BQU0sSUFBSSxHQUFHLFNBQVMsQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFBO0lBRXZDLElBQUksUUFBYyxDQUFBO0lBQ2xCLElBQUksVUFBZ0IsQ0FBQTtJQUNwQixJQUFJLGdCQUF3QixDQUFBO0lBQzVCLElBQUksaUJBQXFDLENBQUE7SUFDekMsSUFBSSxnQkFBZ0IsR0FBa0IsSUFBSSxDQUFBO0lBRTFDLElBQUksU0FBUyxLQUFLLElBQUksRUFBRSxDQUFDO1FBQ3ZCLFFBQVEsR0FBRyxJQUFJLElBQUksRUFBRSxDQUFBO1FBQ3JCLFVBQVUsR0FBRyxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxFQUFFLEdBQUcsU0FBUyxHQUFHLE9BQU8sQ0FBQyxDQUFBO1FBQy9ELGlCQUFpQixHQUFHLFNBQVMsQ0FBQTtRQUM3QixnQkFBZ0IsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFBO1FBQ3pELGdCQUFnQixHQUFHLFNBQVMsQ0FBQTtJQUM5QixDQUFDO1NBQU0sQ0FBQztRQUNOLE1BQU0sS0FBSyxHQUFHLElBQUksSUFBSSxFQUFFLENBQUE7UUFDeEIsS0FBSyxDQUFDLFdBQVcsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQTtRQUNsQyxRQUFRLEdBQUcsS0FBSyxDQUFBO1FBQ2hCLFVBQVUsR0FBRyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQTtRQUM1QixVQUFVLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxVQUFVLEVBQUUsR0FBRyxDQUFDLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFBO1FBQzNELFVBQVUsQ0FBQyxXQUFXLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUE7UUFDbEMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFBO0lBQ3pCLENBQUM7SUFFRCxJQUFJLENBQUM7UUFDSCxNQUFNLFdBQVcsR0FBRztZQUNsQixJQUFJO1lBQ0osUUFBUTtZQUNSLE9BQU87WUFDUCxZQUFZO1lBQ1osMkJBQTJCO1lBQzNCLHlCQUF5QjtZQUN6Qiw2QkFBNkI7WUFDN0IsMEJBQTBCO1NBQzNCLENBQUE7UUFFRCxNQUFNLFNBQVMsR0FBRyxNQUFNLElBQUEsb0RBQXVCLEVBQUMsR0FBRyxFQUFFLFdBQVcsQ0FBQyxDQUFBO1FBRWpFLE1BQU0sU0FBUyxHQUFHLElBQUksR0FBRyxFQUFxRCxDQUFBO1FBQzlFLE1BQU0sWUFBWSxHQUFHLElBQUksR0FBRyxFQUFxRCxDQUFBO1FBQ2pGLE1BQU0sVUFBVSxHQUNkLGdCQUFnQixLQUFLLElBQUk7WUFDdkIsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxNQUFNLEVBQUUsZ0JBQWdCLEVBQUUsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDO2dCQUM5QyxZQUFZLEVBQUUsQ0FBQztnQkFDZixPQUFPLEVBQUUsQ0FBQzthQUNYLENBQUMsQ0FBQztZQUNMLENBQUMsQ0FBQyxJQUFJLENBQUE7UUFFVixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztZQUMvQixTQUFTLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxFQUFFLFlBQVksRUFBRSxDQUFDLEVBQUUsT0FBTyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUE7UUFDbkQsQ0FBQztRQUNELEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1lBQzlCLFlBQVksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLEVBQUUsWUFBWSxFQUFFLENBQUMsRUFBRSxPQUFPLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQTtRQUN0RCxDQUFDO1FBRUQsSUFBSSxZQUFZLEdBQUcsQ0FBQyxDQUFBO1FBQ3BCLElBQUksa0JBQWtCLEdBQUcsQ0FBQyxDQUFBO1FBQzFCLElBQUksYUFBYSxHQUFHLENBQUMsQ0FBQTtRQUNyQixJQUFJLGVBQWUsR0FBRyxDQUFDLENBQUE7UUFFdkIsS0FBSyxNQUFNLEdBQUcsSUFBSSxTQUFTLEVBQUUsQ0FBQztZQUM1QixNQUFNLENBQUMsR0FBRyxJQUFBLDhDQUFtQixFQUFDLEdBQUcsQ0FBQyxDQUFBO1lBQ2xDLElBQUksQ0FBQyxDQUFDO2dCQUFFLFNBQVE7WUFDaEIsTUFBTSxTQUFTLEdBQUcsSUFBQSxzQ0FBVyxFQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQTtZQUMzQyxJQUFJLENBQUMsU0FBUyxJQUFJLFNBQVMsR0FBRyxVQUFVLElBQUksU0FBUyxHQUFHLFFBQVEsRUFBRSxDQUFDO2dCQUNqRSxTQUFRO1lBQ1YsQ0FBQztZQUVELE1BQU0sS0FBSyxHQUFHLElBQUEsd0NBQWEsRUFBQyxDQUE0QixDQUFDLENBQUE7WUFFekQsTUFBTSxJQUFJLEdBQUcsU0FBUyxDQUFDLFdBQVcsRUFBRSxDQUFBO1lBQ3BDLE1BQU0sRUFBRSxHQUFHLFNBQVMsQ0FBQyxTQUFTLEVBQUUsQ0FBQTtZQUNoQyxJQUFJLFVBQVUsRUFBRSxDQUFDO2dCQUNmLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQ3JCLENBQUMsU0FBUyxDQUFDLE9BQU8sRUFBRSxHQUFHLFVBQVUsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxHQUFHLE9BQU8sQ0FDdkQsQ0FBQTtnQkFDRCxJQUFJLElBQUksSUFBSSxDQUFDLElBQUksSUFBSSxHQUFHLFVBQVUsQ0FBQyxNQUFNLEVBQUUsQ0FBQztvQkFDMUMsTUFBTSxJQUFJLEdBQUcsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFBO29CQUM3QixJQUFJLElBQUksRUFBRSxDQUFDO3dCQUNULElBQUksQ0FBQyxZQUFZLElBQUksQ0FBQyxDQUFBO3dCQUN0QixJQUFJLENBQUMsT0FBTyxJQUFJLEtBQUssQ0FBQTtvQkFDdkIsQ0FBQztnQkFDSCxDQUFDO1lBQ0gsQ0FBQztZQUNELE1BQU0sSUFBSSxHQUFHLFNBQVMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUE7WUFDaEMsSUFBSSxJQUFJLEVBQUUsQ0FBQztnQkFDVCxJQUFJLENBQUMsWUFBWSxJQUFJLENBQUMsQ0FBQTtnQkFDdEIsSUFBSSxDQUFDLE9BQU8sSUFBSSxLQUFLLENBQUE7WUFDdkIsQ0FBQztZQUNELE1BQU0sSUFBSSxHQUFHLFlBQVksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUE7WUFDakMsSUFBSSxJQUFJLEVBQUUsQ0FBQztnQkFDVCxJQUFJLENBQUMsWUFBWSxJQUFJLENBQUMsQ0FBQTtnQkFDdEIsSUFBSSxDQUFDLE9BQU8sSUFBSSxLQUFLLENBQUE7WUFDdkIsQ0FBQztZQUVELFlBQVksSUFBSSxDQUFDLENBQUE7WUFDakIsSUFBSSxDQUFDLElBQUEsNENBQWlCLEVBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7Z0JBQ2pDLGtCQUFrQixJQUFJLENBQUMsQ0FBQTtnQkFDdkIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLFlBQVksQ0FBQTtnQkFDMUIsSUFBSSxJQUFBLGdEQUFxQixFQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7b0JBQy9CLGFBQWEsSUFBSSxDQUFDLENBQUE7Z0JBQ3BCLENBQUM7Z0JBQ0QsSUFBSSxJQUFBLGtEQUF1QixFQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7b0JBQ2pDLGVBQWUsSUFBSSxDQUFDLENBQUE7Z0JBQ3RCLENBQUM7WUFDSCxDQUFDO1FBQ0gsQ0FBQztRQUVELE1BQU0sTUFBTSxHQUF3QixFQUFFLENBQUE7UUFDdEMsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7WUFDL0IsTUFBTSxDQUFDLEdBQUcsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLFlBQVksRUFBRSxDQUFDLEVBQUUsT0FBTyxFQUFFLENBQUMsRUFBRSxDQUFBO1lBQzdELE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFFLFlBQVksRUFBRSxDQUFDLENBQUMsWUFBWSxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQTtRQUM1RSxDQUFDO1FBRUQsSUFBSSxhQUFnRCxDQUFBO1FBQ3BELElBQUksVUFBVSxFQUFFLENBQUM7WUFDZixhQUFhLEdBQUcsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7Z0JBQ3hDLEtBQUssRUFBRSxrQkFBa0IsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDO2dCQUN4QyxZQUFZLEVBQUUsQ0FBQyxDQUFDLFlBQVk7Z0JBQzVCLE9BQU8sRUFBRSxDQUFDLENBQUMsT0FBTzthQUNuQixDQUFDLENBQUMsQ0FBQTtRQUNMLENBQUM7UUFFRCxNQUFNLFNBQVMsR0FBeUIsRUFBRSxDQUFBO1FBQzFDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1lBQzlCLE1BQU0sQ0FBQyxHQUFHLFlBQVksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxZQUFZLEVBQUUsQ0FBQyxFQUFFLE9BQU8sRUFBRSxDQUFDLEVBQUUsQ0FBQTtZQUNoRSxTQUFTLENBQUMsSUFBSSxDQUFDO2dCQUNiLE9BQU8sRUFBRSxDQUFDO2dCQUNWLEtBQUssRUFBRSxjQUFjLENBQUMsQ0FBQyxDQUFDLElBQUksTUFBTSxDQUFDLENBQUMsQ0FBQztnQkFDckMsWUFBWSxFQUFFLENBQUMsQ0FBQyxZQUFZO2dCQUM1QixPQUFPLEVBQUUsQ0FBQyxDQUFDLE9BQU87YUFDbkIsQ0FBQyxDQUFBO1FBQ0osQ0FBQztRQUVELE1BQU0sTUFBTSxHQUF3RDtZQUNsRSxFQUFFLEVBQUUsRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLGVBQWUsRUFBRSxLQUFLLEVBQUUsWUFBWSxFQUFFO1lBQzdELEVBQUUsRUFBRSxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsZUFBZSxFQUFFLEtBQUssRUFBRSxrQkFBa0IsRUFBRTtZQUNuRSxFQUFFLEVBQUUsRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLHVCQUF1QixFQUFFLEtBQUssRUFBRSxhQUFhLEVBQUU7WUFDdkUsRUFBRSxFQUFFLEVBQUUsV0FBVyxFQUFFLEtBQUssRUFBRSxXQUFXLEVBQUUsS0FBSyxFQUFFLGVBQWUsRUFBRTtTQUNoRSxDQUFBO1FBRUQsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssSUFBSSxDQUFDLENBQUE7UUFDbkMsTUFBTSxNQUFNLEdBQWtCLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLEVBQUU7WUFDeEQsTUFBTSxjQUFjLEdBQUcsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBO1lBQ2xFLE1BQU0sU0FBUyxHQUFHLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUE7WUFDNUQsTUFBTSxnQkFBZ0IsR0FDcEIsU0FBUyxLQUFLLElBQUksSUFBSSxTQUFTLEdBQUcsQ0FBQztnQkFDakMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxHQUFHLFNBQVMsQ0FBQyxHQUFHLEdBQUc7Z0JBQy9DLENBQUMsQ0FBQyxJQUFJLENBQUE7WUFDVixPQUFPO2dCQUNMLEVBQUUsRUFBRSxLQUFLLENBQUMsRUFBRTtnQkFDWixLQUFLLEVBQUUsS0FBSyxDQUFDLEtBQUs7Z0JBQ2xCLEtBQUssRUFBRSxLQUFLLENBQUMsS0FBSztnQkFDbEIsZ0JBQWdCLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxjQUFjLEdBQUcsRUFBRSxDQUFDLEdBQUcsRUFBRTtnQkFDdEQsMEJBQTBCLEVBQ3hCLGdCQUFnQixLQUFLLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLGdCQUFnQixHQUFHLEVBQUUsQ0FBQyxHQUFHLEVBQUU7YUFDNUUsQ0FBQTtRQUNILENBQUMsQ0FBQyxDQUFBO1FBRUYsSUFBSSxlQUFlLEdBQUcsQ0FBQyxDQUFBO1FBQ3ZCLEtBQUssTUFBTSxHQUFHLElBQUksU0FBUyxFQUFFLENBQUM7WUFDNUIsTUFBTSxDQUFDLEdBQUcsSUFBQSw4Q0FBbUIsRUFBQyxHQUFHLENBQUMsQ0FBQTtZQUNsQyxJQUFJLENBQUMsQ0FBQztnQkFBRSxTQUFRO1lBQ2hCLE1BQU0sU0FBUyxHQUFHLElBQUEsc0NBQVcsRUFBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUE7WUFDM0MsSUFBSSxDQUFDLFNBQVMsSUFBSSxTQUFTLEdBQUcsVUFBVSxJQUFJLFNBQVMsR0FBRyxRQUFRO2dCQUFFLFNBQVE7WUFDMUUsZUFBZSxJQUFJLElBQUEsd0NBQWEsRUFBQyxDQUE0QixDQUFDLENBQUE7UUFDaEUsQ0FBQztRQUVELE1BQU0sT0FBTyxHQUFtQjtZQUM5QjtnQkFDRSxLQUFLLEVBQUUsNEJBQTRCO2dCQUNuQyxZQUFZLEVBQUUsWUFBWTtnQkFDMUIsT0FBTyxFQUFFLGVBQWU7YUFDekI7U0FDRixDQUFBO1FBRUQsTUFBTSxNQUFNLEdBQUcsTUFBTSxrQkFBa0IsQ0FBQyxHQUFHLENBQUMsQ0FBQTtRQUU1QyxNQUFNLElBQUksR0FBc0I7WUFDOUIsTUFBTTtZQUNOLEdBQUcsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLEVBQUUsY0FBYyxFQUFFLGFBQWEsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDM0QsU0FBUztZQUNULE1BQU07WUFDTixPQUFPO1lBQ1AsTUFBTTtZQUNOLFdBQVcsRUFBRSxnQkFBZ0I7WUFDN0IsR0FBRyxDQUFDLGlCQUFpQixLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxZQUFZLEVBQUUsaUJBQWlCLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1NBQ2hGLENBQUE7UUFFRCxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFBO0lBQ2hCLENBQUM7SUFBQyxPQUFPLEdBQUcsRUFBRSxDQUFDO1FBQ2IsT0FBTyxDQUFDLEtBQUssQ0FBQyx3QkFBd0IsRUFBRSxHQUFHLENBQUMsQ0FBQTtRQUM1QyxHQUFHLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQztZQUNuQixLQUFLLEVBQUUsaUNBQWlDO1lBQ3hDLE9BQU8sRUFBRSxHQUFHLFlBQVksS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDO1NBQzFELENBQUMsQ0FBQTtJQUNKLENBQUM7QUFDSCxDQUFDIn0=
|
|
@@ -4,7 +4,13 @@ exports.GET = GET;
|
|
|
4
4
|
const utils_1 = require("@medusajs/framework/utils");
|
|
5
5
|
const fetch_orders_for_analytics_1 = require("../fetch-orders-for-analytics");
|
|
6
6
|
const orders_analytics_helpers_1 = require("../orders-analytics-helpers");
|
|
7
|
-
const ALLOWED_PERIODS = [
|
|
7
|
+
const ALLOWED_PERIODS = [
|
|
8
|
+
"one_week",
|
|
9
|
+
"one_month",
|
|
10
|
+
"two_months",
|
|
11
|
+
"12_months",
|
|
12
|
+
"one_year",
|
|
13
|
+
];
|
|
8
14
|
function isPeriod(value) {
|
|
9
15
|
return typeof value === "string" && ALLOWED_PERIODS.some((period) => period === value);
|
|
10
16
|
}
|
|
@@ -34,8 +40,8 @@ function createBucket(date, label) {
|
|
|
34
40
|
function createBuckets(period, today) {
|
|
35
41
|
const rangeEnd = new Date(today);
|
|
36
42
|
rangeEnd.setUTCHours(23, 59, 59, 999);
|
|
37
|
-
if (period === "one_week" || period === "one_month") {
|
|
38
|
-
const maxDays = period === "one_week" ? 7 : 30;
|
|
43
|
+
if (period === "one_week" || period === "one_month" || period === "two_months") {
|
|
44
|
+
const maxDays = period === "one_week" ? 7 : period === "one_month" ? 30 : 60;
|
|
39
45
|
const rangeStart = new Date(today);
|
|
40
46
|
rangeStart.setUTCDate(rangeStart.getUTCDate() - (maxDays - 1));
|
|
41
47
|
rangeStart.setUTCHours(0, 0, 0, 0);
|
|
@@ -81,6 +87,10 @@ function previousPeriodAnchor(period, today) {
|
|
|
81
87
|
d.setUTCDate(d.getUTCDate() - 30);
|
|
82
88
|
return d;
|
|
83
89
|
}
|
|
90
|
+
if (period === "two_months") {
|
|
91
|
+
d.setUTCDate(d.getUTCDate() - 60);
|
|
92
|
+
return d;
|
|
93
|
+
}
|
|
84
94
|
d.setUTCMonth(d.getUTCMonth() - 12);
|
|
85
95
|
return d;
|
|
86
96
|
}
|
|
@@ -204,4 +214,4 @@ async function GET(req, res) {
|
|
|
204
214
|
});
|
|
205
215
|
}
|
|
206
216
|
}
|
|
207
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL2FkbWluL2FuYWx5dGljcy9vcmRlcnMtb3Zlci10aW1lL3JvdXRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBa09BLGtCQXFGQztBQWxURCxxREFBbUQ7QUFFbkQsOEVBQXVFO0FBQ3ZFLDBFQVFvQztBQUdwQyxNQUFNLGVBQWUsR0FBRyxDQUFDLFVBQVUsRUFBRSxXQUFXLEVBQUUsV0FBVyxFQUFFLFVBQVUsQ0FBVSxDQUFBO0FBVW5GLFNBQVMsUUFBUSxDQUFDLEtBQWM7SUFDOUIsT0FBTyxPQUFPLEtBQUssS0FBSyxRQUFRLElBQUksZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsTUFBTSxLQUFLLEtBQUssQ0FBQyxDQUFBO0FBQ3hGLENBQUM7QUFFRCxTQUFTLGFBQWEsQ0FBQyxDQUFPO0lBQzVCLE1BQU0sVUFBVSxHQUFHLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFBO0lBQzlCLFVBQVUsQ0FBQyxXQUFXLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUE7SUFDbEMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQTtJQUN4QixPQUFPLFVBQVUsQ0FBQTtBQUNuQixDQUFDO0FBRUQsU0FBUyxZQUFZLENBQUMsSUFBWSxFQUFFLEtBQWM7SUFDaEQsT0FBTztRQUNMLElBQUk7UUFDSixLQUFLO1FBQ0wsWUFBWSxFQUFFLENBQUM7UUFDZixhQUFhLEVBQUUsQ0FBQztRQUNoQixlQUFlLEVBQUUsQ0FBQztRQUNsQixhQUFhLEVBQUUsQ0FBQztRQUNoQixlQUFlLEVBQUUsQ0FBQztRQUNsQixjQUFjLEVBQUUsQ0FBQztRQUNqQixZQUFZLEVBQUUsQ0FBQztRQUNmLGlCQUFpQixFQUFFLENBQUM7UUFDcEIsaUJBQWlCLEVBQUUsQ0FBQztR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
|
|
217
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL2FkbWluL2FuYWx5dGljcy9vcmRlcnMtb3Zlci10aW1lL3JvdXRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBNk9BLGtCQXFGQztBQTdURCxxREFBbUQ7QUFFbkQsOEVBQXVFO0FBQ3ZFLDBFQVFvQztBQUdwQyxNQUFNLGVBQWUsR0FBRztJQUN0QixVQUFVO0lBQ1YsV0FBVztJQUNYLFlBQVk7SUFDWixXQUFXO0lBQ1gsVUFBVTtDQUNGLENBQUE7QUFVVixTQUFTLFFBQVEsQ0FBQyxLQUFjO0lBQzlCLE9BQU8sT0FBTyxLQUFLLEtBQUssUUFBUSxJQUFJLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLE1BQU0sS0FBSyxLQUFLLENBQUMsQ0FBQTtBQUN4RixDQUFDO0FBRUQsU0FBUyxhQUFhLENBQUMsQ0FBTztJQUM1QixNQUFNLFVBQVUsR0FBRyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQTtJQUM5QixVQUFVLENBQUMsV0FBVyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFBO0lBQ2xDLFVBQVUsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUE7SUFDeEIsT0FBTyxVQUFVLENBQUE7QUFDbkIsQ0FBQztBQUVELFNBQVMsWUFBWSxDQUFDLElBQVksRUFBRSxLQUFjO0lBQ2hELE9BQU87UUFDTCxJQUFJO1FBQ0osS0FBSztRQUNMLFlBQVksRUFBRSxDQUFDO1FBQ2YsYUFBYSxFQUFFLENBQUM7UUFDaEIsZUFBZSxFQUFFLENBQUM7UUFDbEIsYUFBYSxFQUFFLENBQUM7UUFDaEIsZUFBZSxFQUFFLENBQUM7UUFDbEIsY0FBYyxFQUFFLENBQUM7UUFDakIsWUFBWSxFQUFFLENBQUM7UUFDZixpQkFBaUIsRUFBRSxDQUFDO1FBQ3BCLGlCQUFpQixF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
|