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 hourlyChartRows.map((h) => ({
736
- key: `hour-${h.hour}`,
737
- label: h.label,
738
- orders_count: h.orders_count,
739
- revenue: h.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
- if (!ordersInsights) return [];
744
- return ordersInsights.byWeekday.map((w) => ({
745
- key: `weekday-${w.weekday}`,
746
- label: w.label,
747
- orders_count: w.orders_count,
748
- revenue: w.revenue
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 aggregateDailyOrdersForBreakdown(
753
- dailyOrders,
754
- (d) => monthKeyFromDateStr(d.date),
755
- (ymKey) => formatMonthBucketLabel(ymKey)
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 dailyOrders.map((d) => ({
869
+ return salesBreakdownDaily.map((d) => ({
759
870
  key: d.date,
760
- label: d.label ?? formatChartLabel$2(d.date),
871
+ label: formatDayBreakdownDm(d.date),
761
872
  orders_count: d.orders_count,
762
873
  revenue: d.total_revenue
763
874
  }));
764
- }, [salesGranularity, dailyOrders, hourlyChartRows, ordersInsights]);
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 `${insightsHint} Bars show revenue by hour of day.`;
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 `Revenue by UTC weekday last ${insightsWindowDays} days.`;
887
+ return "Last 7 weeks (UTC, weeks start Sunday); axis shows each week’s start as day/month.";
776
888
  case "month":
777
- return `Revenue summed by calendar month (UTC) across ${rangeLabel}.`;
889
+ return "Last 12 calendar months through the current month (UTC) Jan, Feb, Mar, …";
778
890
  default:
779
891
  return "";
780
892
  }
781
- }, [salesGranularity, overTimePeriod, insightsWindowDays]);
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) return Math.max(0, Math.ceil(n / 10) - 1);
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 needsSalesOverTime = salesGranularity === "day" || salesGranularity === "month";
865
- const needsSalesInsights = salesGranularity === "hour" || salesGranularity === "week";
977
+ const salesBreakdownWaiting = salesGranularity === "hour" ? salesBreakdownHourlyLoading : salesBreakdownOtLoading;
978
+ const salesBreakdownFetchError = salesGranularity === "hour" ? salesBreakdownHourlyError : salesBreakdownOtError;
866
979
  const salesBreakdownBody = (() => {
867
- if (needsSalesOverTime && overTimeLoading) {
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 (needsSalesOverTime && overTimeError) {
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: overTimeError }) }) });
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.jsx(
1839
- "div",
1840
- {
1841
- className: "flex flex-wrap items-center gap-1 rounded-lg border border-ui-border-base bg-ui-bg-subtle/40 p-0.5",
1842
- role: "tablist",
1843
- "aria-label": "Sales breakdown granularity",
1844
- children: SALES_GRANULARITY_TABS.map((tab) => {
1845
- const selected = salesGranularity === tab.value;
1846
- return /* @__PURE__ */ jsxRuntime.jsx(
1847
- "button",
1848
- {
1849
- type: "button",
1850
- role: "tab",
1851
- "aria-selected": selected,
1852
- onClick: () => setSalesGranularity(tab.value),
1853
- className: `rounded-md px-2.5 py-1.5 text-xs font-medium transition-colors duration-200 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ui-fg-interactive ${selected ? "bg-ui-bg-base text-ui-fg-base shadow-sm" : "text-ui-fg-muted hover:text-ui-fg-base"}`,
1854
- children: tab.label
1855
- },
1856
- tab.value
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, _k;
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, _b2;
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 topProductId = (_b2 = (_a2 = topSellers == null ? void 0 : topSellers.products) == null ? void 0 : _a2[0]) == null ? void 0 : _b2.product_id;
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) ?? ((_c = (_b = topSellers == null ? void 0 : topSellers.products) == null ? void 0 : _b[0]) == null ? void 0 : _c.product_title) ?? null;
2932
- const mostViewedTrendProductTitle = ((_d = mostViewedTrend == null ? void 0 : mostViewedTrend.product) == null ? void 0 : _d.product_title) ?? ((_f = (_e = performance == null ? void 0 : performance.topViewedProducts) == null ? void 0 : _e[0]) == null ? void 0 : _f.product_title) ?? null;
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 = ((_g = SUMMARY_PERIODS.find((p) => p.value === summaryDays)) == null ? void 0 : _g.label) ?? "All time";
2938
- const selectedGraphPeriodLabel = ((_h = GRAPH_PERIODS.find((p) => p.value === graphPeriod)) == null ? void 0 : _h.label) ?? "One week";
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" : ((_i = salesChannels.find((channel) => channel.id === salesChannelId)) == null ? void 0 : _i.name) ?? "Selected channel";
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 revenue in this window; all-time uses a 12‑month chart).` : "Revenue and units over time for the top product by revenue in this window (all-time leaderboard uses a 12‑month chart).",
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 revenue — same window as Best sellers.",
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 ? ((topSellers == null ? void 0 : topSellers.products) ?? []).slice(0, 8).map((product) => {
3581
- var _a2, _b2;
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 === ((_b2 = (_a2 = topSellers == null ? void 0 : topSellers.products) == null ? void 0 : _a2[0]) == null ? void 0 : _b2.product_id) ? "bg-emerald-500/5" : void 0,
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 && (((_j = topSellers == null ? void 0 : topSellers.products) == null ? void 0 : _j.length) ?? 0) === 0 ? /* @__PURE__ */ jsxRuntime.jsxs(ui.Table.Row, { children: [
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 && (((_k = performance == null ? void 0 : performance.viewOpportunities) == null ? void 0 : _k.length) ?? 0) === 0 ? /* @__PURE__ */ jsxRuntime.jsxs(ui.Table.Row, { children: [
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, useEffect, useMemo } from "react";
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 hourlyChartRows.map((h) => ({
735
- key: `hour-${h.hour}`,
736
- label: h.label,
737
- orders_count: h.orders_count,
738
- revenue: h.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
- if (!ordersInsights) return [];
743
- return ordersInsights.byWeekday.map((w) => ({
744
- key: `weekday-${w.weekday}`,
745
- label: w.label,
746
- orders_count: w.orders_count,
747
- revenue: w.revenue
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 aggregateDailyOrdersForBreakdown(
752
- dailyOrders,
753
- (d) => monthKeyFromDateStr(d.date),
754
- (ymKey) => formatMonthBucketLabel(ymKey)
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 dailyOrders.map((d) => ({
868
+ return salesBreakdownDaily.map((d) => ({
758
869
  key: d.date,
759
- label: d.label ?? formatChartLabel$2(d.date),
870
+ label: formatDayBreakdownDm(d.date),
760
871
  orders_count: d.orders_count,
761
872
  revenue: d.total_revenue
762
873
  }));
763
- }, [salesGranularity, dailyOrders, hourlyChartRows, ordersInsights]);
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 `${insightsHint} Bars show revenue by hour of day.`;
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 `Revenue by UTC weekday last ${insightsWindowDays} days.`;
886
+ return "Last 7 weeks (UTC, weeks start Sunday); axis shows each week’s start as day/month.";
775
887
  case "month":
776
- return `Revenue summed by calendar month (UTC) across ${rangeLabel}.`;
888
+ return "Last 12 calendar months through the current month (UTC) Jan, Feb, Mar, …";
777
889
  default:
778
890
  return "";
779
891
  }
780
- }, [salesGranularity, overTimePeriod, insightsWindowDays]);
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) return Math.max(0, Math.ceil(n / 10) - 1);
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 needsSalesOverTime = salesGranularity === "day" || salesGranularity === "month";
864
- const needsSalesInsights = salesGranularity === "hour" || salesGranularity === "week";
976
+ const salesBreakdownWaiting = salesGranularity === "hour" ? salesBreakdownHourlyLoading : salesBreakdownOtLoading;
977
+ const salesBreakdownFetchError = salesGranularity === "hour" ? salesBreakdownHourlyError : salesBreakdownOtError;
865
978
  const salesBreakdownBody = (() => {
866
- if (needsSalesOverTime && overTimeLoading) {
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 (needsSalesOverTime && overTimeError) {
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: overTimeError }) }) });
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__ */ jsx(
1838
- "div",
1839
- {
1840
- className: "flex flex-wrap items-center gap-1 rounded-lg border border-ui-border-base bg-ui-bg-subtle/40 p-0.5",
1841
- role: "tablist",
1842
- "aria-label": "Sales breakdown granularity",
1843
- children: SALES_GRANULARITY_TABS.map((tab) => {
1844
- const selected = salesGranularity === tab.value;
1845
- return /* @__PURE__ */ jsx(
1846
- "button",
1847
- {
1848
- type: "button",
1849
- role: "tab",
1850
- "aria-selected": selected,
1851
- onClick: () => setSalesGranularity(tab.value),
1852
- className: `rounded-md px-2.5 py-1.5 text-xs font-medium transition-colors duration-200 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ui-fg-interactive ${selected ? "bg-ui-bg-base text-ui-fg-base shadow-sm" : "text-ui-fg-muted hover:text-ui-fg-base"}`,
1853
- children: tab.label
1854
- },
1855
- tab.value
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, _k;
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, _b2;
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 topProductId = (_b2 = (_a2 = topSellers == null ? void 0 : topSellers.products) == null ? void 0 : _a2[0]) == null ? void 0 : _b2.product_id;
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) ?? ((_c = (_b = topSellers == null ? void 0 : topSellers.products) == null ? void 0 : _b[0]) == null ? void 0 : _c.product_title) ?? null;
2931
- const mostViewedTrendProductTitle = ((_d = mostViewedTrend == null ? void 0 : mostViewedTrend.product) == null ? void 0 : _d.product_title) ?? ((_f = (_e = performance == null ? void 0 : performance.topViewedProducts) == null ? void 0 : _e[0]) == null ? void 0 : _f.product_title) ?? null;
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 = ((_g = SUMMARY_PERIODS.find((p) => p.value === summaryDays)) == null ? void 0 : _g.label) ?? "All time";
2937
- const selectedGraphPeriodLabel = ((_h = GRAPH_PERIODS.find((p) => p.value === graphPeriod)) == null ? void 0 : _h.label) ?? "One week";
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" : ((_i = salesChannels.find((channel) => channel.id === salesChannelId)) == null ? void 0 : _i.name) ?? "Selected channel";
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 revenue in this window; all-time uses a 12‑month chart).` : "Revenue and units over time for the top product by revenue in this window (all-time leaderboard uses a 12‑month chart).",
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 revenue — same window as Best sellers.",
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 ? ((topSellers == null ? void 0 : topSellers.products) ?? []).slice(0, 8).map((product) => {
3580
- var _a2, _b2;
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 === ((_b2 = (_a2 = topSellers == null ? void 0 : topSellers.products) == null ? void 0 : _a2[0]) == null ? void 0 : _b2.product_id) ? "bg-emerald-500/5" : void 0,
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 && (((_j = topSellers == null ? void 0 : topSellers.products) == null ? void 0 : _j.length) ?? 0) === 0 ? /* @__PURE__ */ jsxs(Table.Row, { children: [
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 && (((_k = performance == null ? void 0 : performance.viewOpportunities) == null ? void 0 : _k.length) ?? 0) === 0 ? /* @__PURE__ */ jsxs(Table.Row, { children: [
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
- const today = new Date();
66
- today.setUTCHours(23, 59, 59, 999);
67
- const rangeStart = new Date(today);
68
- rangeStart.setUTCDate(rangeStart.getUTCDate() - (days - 1));
69
- rangeStart.setUTCHours(0, 0, 0, 0);
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 > today) {
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 > today)
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: 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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL2FkbWluL2FuYWx5dGljcy9vcmRlcnMtaW5zaWdodHMvcm91dGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUF3R0Esa0JBME1DO0FBM1NELHFEQUdrQztBQUNsQyw4RUFBdUU7QUFDdkUsMEVBT29DO0FBV3BDLE1BQU0sY0FBYyxHQUFHLENBQUMsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUE7QUFFeEUsU0FBUyxTQUFTLENBQUMsS0FBYztJQUMvQixNQUFNLENBQUMsR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUE7SUFDdkIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUM7UUFBRSxPQUFPLEVBQUUsQ0FBQTtJQUMzQyxJQUFJLENBQUMsR0FBRyxHQUFHO1FBQUUsT0FBTyxHQUFHLENBQUE7SUFDdkIsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFBO0FBQ3RCLENBQUM7QUFFRCxrRUFBa0U7QUFDbEUsU0FBUyxjQUFjLENBQUMsS0FBYztJQUNwQyxJQUFJLEtBQUssS0FBSyxTQUFTLElBQUksS0FBSyxLQUFLLEVBQUU7UUFBRSxPQUFPLElBQUksQ0FBQTtJQUNwRCxNQUFNLENBQUMsR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUE7SUFDdkIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUM7UUFBRSxPQUFPLElBQUksQ0FBQTtJQUM3QyxJQUFJLENBQUMsR0FBRyxHQUFHO1FBQUUsT0FBTyxHQUFHLENBQUE7SUFDdkIsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFBO0FB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
@@ -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 = ["one_week", "one_month", "12_months", "one_year"];
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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
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "medusa-analytics",
3
- "version": "0.0.21",
3
+ "version": "0.0.23",
4
4
  "description": "A starter for Medusa plugins.",
5
5
  "author": "Medusa (https://medusajs.com)",
6
6
  "license": "MIT",