@rovela-ai/sdk 0.3.22 → 0.3.30
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/admin/api/index.d.ts +4 -0
- package/dist/admin/api/index.d.ts.map +1 -1
- package/dist/admin/api/index.js +6 -0
- package/dist/admin/api/index.js.map +1 -1
- package/dist/admin/api/products-bulk.d.ts +38 -0
- package/dist/admin/api/products-bulk.d.ts.map +1 -0
- package/dist/admin/api/products-bulk.js +135 -0
- package/dist/admin/api/products-bulk.js.map +1 -0
- package/dist/admin/api/products-stats.d.ts +34 -0
- package/dist/admin/api/products-stats.d.ts.map +1 -0
- package/dist/admin/api/products-stats.js +43 -0
- package/dist/admin/api/products-stats.js.map +1 -0
- package/dist/admin/api/products.d.ts.map +1 -1
- package/dist/admin/api/products.js +56 -5
- package/dist/admin/api/products.js.map +1 -1
- package/dist/admin/api/setup-guide.d.ts +78 -0
- package/dist/admin/api/setup-guide.d.ts.map +1 -0
- package/dist/admin/api/setup-guide.js +235 -0
- package/dist/admin/api/setup-guide.js.map +1 -0
- package/dist/admin/api/stats.d.ts +3 -0
- package/dist/admin/api/stats.d.ts.map +1 -1
- package/dist/admin/api/stats.js +20 -5
- package/dist/admin/api/stats.js.map +1 -1
- package/dist/admin/components/AdminLayout.d.ts.map +1 -1
- package/dist/admin/components/AdminLayout.js +5 -2
- package/dist/admin/components/AdminLayout.js.map +1 -1
- package/dist/admin/components/AdminNav.d.ts.map +1 -1
- package/dist/admin/components/AdminNav.js +13 -0
- package/dist/admin/components/AdminNav.js.map +1 -1
- package/dist/admin/components/LowStockAlert.d.ts.map +1 -1
- package/dist/admin/components/LowStockAlert.js +1 -1
- package/dist/admin/components/LowStockAlert.js.map +1 -1
- package/dist/admin/components/OrderStatusChart.d.ts.map +1 -1
- package/dist/admin/components/OrderStatusChart.js +7 -1
- package/dist/admin/components/OrderStatusChart.js.map +1 -1
- package/dist/admin/components/PeriodSelector.d.ts +9 -0
- package/dist/admin/components/PeriodSelector.d.ts.map +1 -0
- package/dist/admin/components/PeriodSelector.js +19 -0
- package/dist/admin/components/PeriodSelector.js.map +1 -0
- package/dist/admin/components/PrimaryMetricsRow.d.ts +11 -0
- package/dist/admin/components/PrimaryMetricsRow.d.ts.map +1 -0
- package/dist/admin/components/PrimaryMetricsRow.js +73 -0
- package/dist/admin/components/PrimaryMetricsRow.js.map +1 -0
- package/dist/admin/components/ProductTable.d.ts +2 -1
- package/dist/admin/components/ProductTable.d.ts.map +1 -1
- package/dist/admin/components/ProductTable.js +284 -33
- package/dist/admin/components/ProductTable.js.map +1 -1
- package/dist/admin/components/RevenueChart.d.ts.map +1 -1
- package/dist/admin/components/RevenueChart.js +4 -1
- package/dist/admin/components/RevenueChart.js.map +1 -1
- package/dist/admin/components/SecondaryMetricsRow.d.ts +14 -0
- package/dist/admin/components/SecondaryMetricsRow.d.ts.map +1 -0
- package/dist/admin/components/SecondaryMetricsRow.js +45 -0
- package/dist/admin/components/SecondaryMetricsRow.js.map +1 -0
- package/dist/admin/components/SetupGuide.d.ts +4 -0
- package/dist/admin/components/SetupGuide.d.ts.map +1 -0
- package/dist/admin/components/SetupGuide.js +238 -0
- package/dist/admin/components/SetupGuide.js.map +1 -0
- package/dist/admin/components/index.d.ts +7 -0
- package/dist/admin/components/index.d.ts.map +1 -1
- package/dist/admin/components/index.js +4 -0
- package/dist/admin/components/index.js.map +1 -1
- package/dist/admin/hooks/index.d.ts +3 -0
- package/dist/admin/hooks/index.d.ts.map +1 -1
- package/dist/admin/hooks/index.js +2 -0
- package/dist/admin/hooks/index.js.map +1 -1
- package/dist/admin/hooks/useAdminProductMetrics.d.ts +3 -0
- package/dist/admin/hooks/useAdminProductMetrics.d.ts.map +1 -0
- package/dist/admin/hooks/useAdminProductMetrics.js +32 -0
- package/dist/admin/hooks/useAdminProductMetrics.js.map +1 -0
- package/dist/admin/hooks/useAdminProducts.d.ts.map +1 -1
- package/dist/admin/hooks/useAdminProducts.js +19 -0
- package/dist/admin/hooks/useAdminProducts.js.map +1 -1
- package/dist/admin/hooks/useAdminStats.d.ts +7 -1
- package/dist/admin/hooks/useAdminStats.d.ts.map +1 -1
- package/dist/admin/hooks/useAdminStats.js +31 -2
- package/dist/admin/hooks/useAdminStats.js.map +1 -1
- package/dist/admin/hooks/useSetupGuide.d.ts +45 -0
- package/dist/admin/hooks/useSetupGuide.d.ts.map +1 -0
- package/dist/admin/hooks/useSetupGuide.js +57 -0
- package/dist/admin/hooks/useSetupGuide.js.map +1 -0
- package/dist/admin/index.d.ts +5 -5
- package/dist/admin/index.d.ts.map +1 -1
- package/dist/admin/index.js +5 -3
- package/dist/admin/index.js.map +1 -1
- package/dist/admin/server/admin-session.d.ts +37 -0
- package/dist/admin/server/admin-session.d.ts.map +1 -1
- package/dist/admin/server/admin-session.js +43 -0
- package/dist/admin/server/admin-session.js.map +1 -1
- package/dist/admin/server/index.d.ts +1 -1
- package/dist/admin/server/index.d.ts.map +1 -1
- package/dist/admin/server/index.js +1 -1
- package/dist/admin/server/index.js.map +1 -1
- package/dist/admin/styles/admin-theme.css +634 -8
- package/dist/admin/types.d.ts +108 -0
- package/dist/admin/types.d.ts.map +1 -1
- package/dist/core/cookie-consent/CookieBanner.d.ts.map +1 -1
- package/dist/core/cookie-consent/CookieBanner.js +51 -15
- package/dist/core/cookie-consent/CookieBanner.js.map +1 -1
- package/dist/core/db/index.d.ts +2 -2
- package/dist/core/db/index.d.ts.map +1 -1
- package/dist/core/db/index.js +3 -1
- package/dist/core/db/index.js.map +1 -1
- package/dist/core/db/queries.d.ts +181 -17
- package/dist/core/db/queries.d.ts.map +1 -1
- package/dist/core/db/queries.js +398 -10
- package/dist/core/db/queries.js.map +1 -1
- package/dist/core/db/schema.d.ts +34 -3
- package/dist/core/db/schema.d.ts.map +1 -1
- package/dist/core/db/schema.js +19 -1
- package/dist/core/db/schema.js.map +1 -1
- package/dist/core/server/index.d.ts +2 -1
- package/dist/core/server/index.d.ts.map +1 -1
- package/dist/core/server/index.js +3 -1
- package/dist/core/server/index.js.map +1 -1
- package/dist/media/components/ImageGalleryUpload.d.ts.map +1 -1
- package/dist/media/components/ImageGalleryUpload.js +9 -2
- package/dist/media/components/ImageGalleryUpload.js.map +1 -1
- package/dist/products/components/ProductCard.d.ts.map +1 -1
- package/dist/products/components/ProductCard.js +8 -1
- package/dist/products/components/ProductCard.js.map +1 -1
- package/dist/products/components/ProductGallery.d.ts.map +1 -1
- package/dist/products/components/ProductGallery.js +14 -3
- package/dist/products/components/ProductGallery.js.map +1 -1
- package/package.json +13 -1
|
@@ -0,0 +1,235 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @rovela/sdk/admin/api/setup-guide
|
|
3
|
+
*
|
|
4
|
+
* Setup-guide orchestrator for the admin dashboard.
|
|
5
|
+
*
|
|
6
|
+
* Usage:
|
|
7
|
+
* ```typescript
|
|
8
|
+
* // app/api/admin/setup-guide/route.ts
|
|
9
|
+
* export { GET } from '@rovela-ai/sdk/admin/api/setup-guide'
|
|
10
|
+
*
|
|
11
|
+
* // app/api/admin/setup-guide/manual-mark/route.ts
|
|
12
|
+
* export { POST as markSetupTask } from '@rovela-ai/sdk/admin/api/setup-guide'
|
|
13
|
+
* ```
|
|
14
|
+
*
|
|
15
|
+
* GET returns the 9 task statuses + progress + visibility hint in one
|
|
16
|
+
* round-trip. Auto-detected signals are read live; manual marks live in
|
|
17
|
+
* `store_settings.onboarding` JSONB and are written via POST.
|
|
18
|
+
*
|
|
19
|
+
* Tasks (3 tiers):
|
|
20
|
+
* Tier 1 (Open for business — must do):
|
|
21
|
+
* - stripe (auto) — connected account exists
|
|
22
|
+
* - products (auto) — onboarding.firstProductTouched OR count > 1
|
|
23
|
+
* - shipping (auto) — at least one active shipping zone
|
|
24
|
+
* - tax (auto) — at least one tax zone OR onboarding.taxNoneNeeded
|
|
25
|
+
*
|
|
26
|
+
* Tier 2 (Make it yours):
|
|
27
|
+
* - logo (auto) — onboarding.logoUploaded
|
|
28
|
+
* - domain (auto) — NEXT_PUBLIC_APP_URL is not a `.rovela.app` host
|
|
29
|
+
* - legal (manual) — onboarding.legalPagesReviewed
|
|
30
|
+
*
|
|
31
|
+
* Tier 3 (Operational):
|
|
32
|
+
* - team (auto) — admin count > 1
|
|
33
|
+
* - analytics (auto) — store_settings.analytics has any keys
|
|
34
|
+
*/
|
|
35
|
+
import { NextResponse } from 'next/server';
|
|
36
|
+
import { requireAdmin } from '../server/admin-session';
|
|
37
|
+
import { getSetupGuideSignals, setOnboardingFlag, } from '../../core/db/queries';
|
|
38
|
+
import { hasConnectedAccount } from '../../checkout/stripe/client';
|
|
39
|
+
const MANUAL_MARK_KEYS = [
|
|
40
|
+
'taxNoneNeeded',
|
|
41
|
+
'legalPagesReviewed',
|
|
42
|
+
'firstProductTouched',
|
|
43
|
+
'logoUploaded',
|
|
44
|
+
'dismiss',
|
|
45
|
+
'reopen',
|
|
46
|
+
];
|
|
47
|
+
// =============================================================================
|
|
48
|
+
// GET /api/admin/setup-guide
|
|
49
|
+
// =============================================================================
|
|
50
|
+
export async function GET(_request) {
|
|
51
|
+
const guard = await requireAdmin({ permission: 'settings.read' });
|
|
52
|
+
if (!guard.ok)
|
|
53
|
+
return guard.response;
|
|
54
|
+
try {
|
|
55
|
+
const [signals, stripeConnected] = await Promise.all([
|
|
56
|
+
getSetupGuideSignals(),
|
|
57
|
+
Promise.resolve(hasConnectedAccount()),
|
|
58
|
+
]);
|
|
59
|
+
const onboarding = signals.storeSettings?.onboarding ?? {};
|
|
60
|
+
const analyticsKeys = Object.keys(signals.storeSettings?.analytics ?? {});
|
|
61
|
+
// Tolerance read: legacy stores have manual-mark flags persisted as
|
|
62
|
+
// JSONB strings ("true") instead of booleans because of an earlier
|
|
63
|
+
// bug in setOnboardingFlag's text-cast (queries.ts). Accept BOTH
|
|
64
|
+
// shapes so existing stores self-heal at render time without a SQL
|
|
65
|
+
// migration. New writes (post-fix) land as proper booleans.
|
|
66
|
+
const isMarked = (v) => v === true || v === 'true';
|
|
67
|
+
// --- Custom-domain detection -------------------------------------------
|
|
68
|
+
// Platform's deploy flow flips NEXT_PUBLIC_APP_URL to the custom domain
|
|
69
|
+
// only after DNS verification succeeds (see CLAUDE.md §23). The negative
|
|
70
|
+
// list covers every host pattern the platform manages on the merchant's
|
|
71
|
+
// behalf — anything outside this list is a real custom domain.
|
|
72
|
+
//
|
|
73
|
+
// Without the extended list, the Blaxel sandbox preview URL
|
|
74
|
+
// (`*.preview.bl.run`) would falsely register as "custom domain
|
|
75
|
+
// verified" in every editing session.
|
|
76
|
+
const isManagedHost = (host) => host.endsWith('.rovela.app') ||
|
|
77
|
+
host.endsWith('.preview.bl.run') ||
|
|
78
|
+
host.endsWith('.bl.run') ||
|
|
79
|
+
host.endsWith('.vercel.app') ||
|
|
80
|
+
host === 'localhost' ||
|
|
81
|
+
host === '127.0.0.1';
|
|
82
|
+
const appUrl = process.env.NEXT_PUBLIC_APP_URL ?? '';
|
|
83
|
+
let appHost = '';
|
|
84
|
+
try {
|
|
85
|
+
appHost = appUrl ? new URL(appUrl).hostname : '';
|
|
86
|
+
}
|
|
87
|
+
catch {
|
|
88
|
+
appHost = '';
|
|
89
|
+
}
|
|
90
|
+
const customDomainVerified = appHost.length > 0 && !isManagedHost(appHost);
|
|
91
|
+
// --- Build tasks --------------------------------------------------------
|
|
92
|
+
const tasks = [
|
|
93
|
+
// Tier 1
|
|
94
|
+
{
|
|
95
|
+
id: 'stripe',
|
|
96
|
+
tier: 1,
|
|
97
|
+
status: stripeConnected ? 'complete' : 'incomplete',
|
|
98
|
+
auto: true,
|
|
99
|
+
},
|
|
100
|
+
{
|
|
101
|
+
id: 'products',
|
|
102
|
+
tier: 1,
|
|
103
|
+
// Two complete-paths: explicit flag (set by API writeback on any
|
|
104
|
+
// product create/update) OR more than 1 product (covers the case
|
|
105
|
+
// where the AI seeded one and the merchant added more without ever
|
|
106
|
+
// editing the seeded one).
|
|
107
|
+
status: isMarked(onboarding.firstProductTouched) || signals.productCount > 1
|
|
108
|
+
? 'complete'
|
|
109
|
+
: 'incomplete',
|
|
110
|
+
auto: true,
|
|
111
|
+
},
|
|
112
|
+
{
|
|
113
|
+
id: 'shipping',
|
|
114
|
+
tier: 1,
|
|
115
|
+
status: signals.shippingZonesCount > 0 ? 'complete' : 'incomplete',
|
|
116
|
+
auto: true,
|
|
117
|
+
},
|
|
118
|
+
{
|
|
119
|
+
id: 'tax',
|
|
120
|
+
tier: 1,
|
|
121
|
+
status: signals.taxZonesCount > 0 || isMarked(onboarding.taxNoneNeeded)
|
|
122
|
+
? 'complete'
|
|
123
|
+
: 'incomplete',
|
|
124
|
+
auto: true,
|
|
125
|
+
hasManualOverride: true, // "I don't collect tax"
|
|
126
|
+
},
|
|
127
|
+
// Tier 2
|
|
128
|
+
{
|
|
129
|
+
id: 'logo',
|
|
130
|
+
tier: 2,
|
|
131
|
+
status: isMarked(onboarding.logoUploaded) ? 'complete' : 'incomplete',
|
|
132
|
+
auto: true,
|
|
133
|
+
},
|
|
134
|
+
{
|
|
135
|
+
id: 'domain',
|
|
136
|
+
tier: 2,
|
|
137
|
+
status: customDomainVerified ? 'complete' : 'incomplete',
|
|
138
|
+
auto: true,
|
|
139
|
+
},
|
|
140
|
+
{
|
|
141
|
+
id: 'legal',
|
|
142
|
+
tier: 2,
|
|
143
|
+
status: isMarked(onboarding.legalPagesReviewed) ? 'complete' : 'incomplete',
|
|
144
|
+
auto: false,
|
|
145
|
+
},
|
|
146
|
+
// Tier 3
|
|
147
|
+
{
|
|
148
|
+
id: 'team',
|
|
149
|
+
tier: 3,
|
|
150
|
+
status: signals.adminCount > 1 ? 'complete' : 'incomplete',
|
|
151
|
+
auto: true,
|
|
152
|
+
},
|
|
153
|
+
{
|
|
154
|
+
id: 'analytics',
|
|
155
|
+
tier: 3,
|
|
156
|
+
status: analyticsKeys.length > 0 ? 'complete' : 'incomplete',
|
|
157
|
+
auto: true,
|
|
158
|
+
},
|
|
159
|
+
];
|
|
160
|
+
// --- Build progress -----------------------------------------------------
|
|
161
|
+
const tier1Tasks = tasks.filter((t) => t.tier === 1);
|
|
162
|
+
const tier2Tasks = tasks.filter((t) => t.tier === 2);
|
|
163
|
+
const tier3Tasks = tasks.filter((t) => t.tier === 3);
|
|
164
|
+
const completeOf = (xs) => xs.filter((t) => t.status === 'complete').length;
|
|
165
|
+
const completeTotal = completeOf(tasks);
|
|
166
|
+
const total = tasks.length;
|
|
167
|
+
// --- Visibility ---------------------------------------------------------
|
|
168
|
+
// Hide once the merchant has explicitly dismissed (which they can only do
|
|
169
|
+
// after 100% complete). Otherwise show — even at 100%, we want one render
|
|
170
|
+
// pass with the celebration state, then the client can auto-collapse.
|
|
171
|
+
const dismissedAt = onboarding.dismissedAt ?? null;
|
|
172
|
+
const visibility = dismissedAt ? 'hide' : 'show';
|
|
173
|
+
return NextResponse.json({
|
|
174
|
+
tasks,
|
|
175
|
+
progress: {
|
|
176
|
+
total,
|
|
177
|
+
complete: completeTotal,
|
|
178
|
+
tier1: { complete: completeOf(tier1Tasks), total: tier1Tasks.length },
|
|
179
|
+
tier2: { complete: completeOf(tier2Tasks), total: tier2Tasks.length },
|
|
180
|
+
tier3: { complete: completeOf(tier3Tasks), total: tier3Tasks.length },
|
|
181
|
+
},
|
|
182
|
+
visibility,
|
|
183
|
+
dismissedAt,
|
|
184
|
+
});
|
|
185
|
+
}
|
|
186
|
+
catch (error) {
|
|
187
|
+
console.error('[Setup Guide API] GET error:', error);
|
|
188
|
+
return NextResponse.json({ error: 'Failed to fetch setup guide', code: 'INTERNAL_ERROR' }, { status: 500 });
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
function isValidKey(value) {
|
|
192
|
+
return (typeof value === 'string' && MANUAL_MARK_KEYS.includes(value));
|
|
193
|
+
}
|
|
194
|
+
export async function POST(request) {
|
|
195
|
+
const guard = await requireAdmin({ permission: 'settings.write' });
|
|
196
|
+
if (!guard.ok)
|
|
197
|
+
return guard.response;
|
|
198
|
+
let body;
|
|
199
|
+
try {
|
|
200
|
+
body = await request.json();
|
|
201
|
+
}
|
|
202
|
+
catch {
|
|
203
|
+
return NextResponse.json({ error: 'Invalid JSON body', code: 'VALIDATION_ERROR' }, { status: 400 });
|
|
204
|
+
}
|
|
205
|
+
if (!isValidKey(body.key)) {
|
|
206
|
+
return NextResponse.json({
|
|
207
|
+
error: `Unknown manual-mark key. Allowed: ${MANUAL_MARK_KEYS.join(', ')}`,
|
|
208
|
+
code: 'VALIDATION_ERROR',
|
|
209
|
+
}, { status: 400 });
|
|
210
|
+
}
|
|
211
|
+
if (typeof body.value !== 'boolean') {
|
|
212
|
+
return NextResponse.json({ error: '`value` must be a boolean', code: 'VALIDATION_ERROR' }, { status: 400 });
|
|
213
|
+
}
|
|
214
|
+
try {
|
|
215
|
+
if (body.key === 'dismiss') {
|
|
216
|
+
// Special case: write a timestamp instead of a boolean. We store the
|
|
217
|
+
// ISO string so an admin tool / merchant support can see WHEN they
|
|
218
|
+
// dismissed (not just THAT they did).
|
|
219
|
+
await setOnboardingFlag('dismissedAt', body.value ? new Date().toISOString() : undefined);
|
|
220
|
+
}
|
|
221
|
+
else if (body.key === 'reopen') {
|
|
222
|
+
await setOnboardingFlag('dismissedAt', undefined);
|
|
223
|
+
}
|
|
224
|
+
else {
|
|
225
|
+
// Standard boolean flag
|
|
226
|
+
await setOnboardingFlag(body.key, body.value);
|
|
227
|
+
}
|
|
228
|
+
return NextResponse.json({ ok: true });
|
|
229
|
+
}
|
|
230
|
+
catch (error) {
|
|
231
|
+
console.error('[Setup Guide API] manual-mark error:', error);
|
|
232
|
+
return NextResponse.json({ error: 'Failed to update setup guide', code: 'INTERNAL_ERROR' }, { status: 500 });
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
//# sourceMappingURL=setup-guide.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setup-guide.js","sourceRoot":"","sources":["../../../src/admin/api/setup-guide.ts"],"names":[],"mappings":"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"}
|
|
@@ -10,6 +10,7 @@
|
|
|
10
10
|
* ```
|
|
11
11
|
*/
|
|
12
12
|
import { NextRequest, NextResponse } from 'next/server';
|
|
13
|
+
import { type DashboardSummary } from '../../core/db/queries';
|
|
13
14
|
import type { AdminApiError, DashboardStats, LowStockItem } from '../types';
|
|
14
15
|
interface StatsResponse {
|
|
15
16
|
stats: DashboardStats;
|
|
@@ -23,6 +24,8 @@ interface StatsResponse {
|
|
|
23
24
|
status: string;
|
|
24
25
|
count: number;
|
|
25
26
|
}[];
|
|
27
|
+
/** Period-scoped summary with deltas + best seller. Present when ?period= is set. */
|
|
28
|
+
summary?: DashboardSummary;
|
|
26
29
|
}
|
|
27
30
|
/**
|
|
28
31
|
* GET /api/admin/stats
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stats.d.ts","sourceRoot":"","sources":["../../../src/admin/api/stats.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;
|
|
1
|
+
{"version":3,"file":"stats.d.ts","sourceRoot":"","sources":["../../../src/admin/api/stats.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAEvD,OAAO,EAOL,KAAK,gBAAgB,EACtB,MAAM,uBAAuB,CAAA;AAC9B,OAAO,KAAK,EAAE,aAAa,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,UAAU,CAAA;AAM3E,UAAU,aAAa;IACrB,KAAK,EAAE,cAAc,CAAA;IACrB,QAAQ,EAAE,YAAY,EAAE,CAAA;IACxB,YAAY,EAAE,OAAO,EAAE,CAAA;IACvB,YAAY,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,EAAE,CAAA;IAClD,cAAc,CAAC,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,EAAE,CAAA;IACpD,qFAAqF;IACrF,OAAO,CAAC,EAAE,gBAAgB,CAAA;CAC3B;AAcD;;;;;;;;;;GAUG;AACH,wBAAsB,GAAG,CACvB,OAAO,EAAE,WAAW,GACnB,OAAO,CAAC,YAAY,CAAC,aAAa,GAAG,aAAa,CAAC,CAAC,CAkEtD"}
|
package/dist/admin/api/stats.js
CHANGED
|
@@ -11,7 +11,14 @@
|
|
|
11
11
|
*/
|
|
12
12
|
import { NextResponse } from 'next/server';
|
|
13
13
|
import { requireAdmin } from '../server/admin-session';
|
|
14
|
-
import { getStoreStats, getLowStockProducts, getRecentOrders, getRevenueByPeriod, getOrdersByStatus, } from '../../core/db/queries';
|
|
14
|
+
import { getStoreStats, getLowStockProducts, getRecentOrders, getRevenueByPeriod, getOrdersByStatus, getDashboardSummary, } from '../../core/db/queries';
|
|
15
|
+
// Map the public period code to a number of calendar days.
|
|
16
|
+
const PERIOD_DAYS = {
|
|
17
|
+
today: 1,
|
|
18
|
+
'7d': 7,
|
|
19
|
+
'30d': 30,
|
|
20
|
+
'90d': 90,
|
|
21
|
+
};
|
|
15
22
|
// =============================================================================
|
|
16
23
|
// Handler
|
|
17
24
|
// =============================================================================
|
|
@@ -39,11 +46,15 @@ export async function GET(request) {
|
|
|
39
46
|
const includeOrderStatus = searchParams.get('includeOrderStatus') === 'true';
|
|
40
47
|
const lowStockThreshold = parseInt(searchParams.get('lowStockThreshold') || '10', 10);
|
|
41
48
|
const recentOrdersLimit = parseInt(searchParams.get('recentOrdersLimit') || '5', 10);
|
|
42
|
-
|
|
43
|
-
const
|
|
49
|
+
const periodCode = searchParams.get('period');
|
|
50
|
+
const periodDays = periodCode ? PERIOD_DAYS[periodCode] : null;
|
|
51
|
+
// Fetch core stats in parallel — include the period-scoped summary when
|
|
52
|
+
// the client asks for one.
|
|
53
|
+
const [stats, lowStockData, recentOrders, summary] = await Promise.all([
|
|
44
54
|
getStoreStats(),
|
|
45
55
|
getLowStockProducts(lowStockThreshold),
|
|
46
56
|
getRecentOrders(recentOrdersLimit),
|
|
57
|
+
periodDays ? getDashboardSummary(periodDays) : Promise.resolve(undefined),
|
|
47
58
|
]);
|
|
48
59
|
// Transform low stock data
|
|
49
60
|
const lowStock = lowStockData.map((item) => ({
|
|
@@ -59,9 +70,13 @@ export async function GET(request) {
|
|
|
59
70
|
lowStock,
|
|
60
71
|
recentOrders,
|
|
61
72
|
};
|
|
62
|
-
|
|
73
|
+
if (summary) {
|
|
74
|
+
response.summary = summary;
|
|
75
|
+
}
|
|
76
|
+
// Optionally include revenue data — match the requested period when set,
|
|
77
|
+
// otherwise default to 30 days.
|
|
63
78
|
if (includeRevenue) {
|
|
64
|
-
response.revenueByDay = await getRevenueByPeriod(30);
|
|
79
|
+
response.revenueByDay = await getRevenueByPeriod(periodDays ?? 30);
|
|
65
80
|
}
|
|
66
81
|
// Optionally include order status breakdown
|
|
67
82
|
if (includeOrderStatus) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stats.js","sourceRoot":"","sources":["../../../src/admin/api/stats.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAe,YAAY,EAAE,MAAM,aAAa,CAAA;AACvD,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAA;AACtD,OAAO,EACL,aAAa,EACb,mBAAmB,EACnB,eAAe,EACf,kBAAkB,EAClB,iBAAiB,
|
|
1
|
+
{"version":3,"file":"stats.js","sourceRoot":"","sources":["../../../src/admin/api/stats.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AdminLayout.d.ts","sourceRoot":"","sources":["../../../src/admin/components/AdminLayout.tsx"],"names":[],"mappings":"AAEA;;;;;;GAMG;AAEH,OAAO,EAAY,KAAK,OAAO,EAAE,MAAM,YAAY,CAAA;
|
|
1
|
+
{"version":3,"file":"AdminLayout.d.ts","sourceRoot":"","sources":["../../../src/admin/components/AdminLayout.tsx"],"names":[],"mappings":"AAEA;;;;;;GAMG;AAEH,OAAO,EAAY,KAAK,OAAO,EAAE,MAAM,YAAY,CAAA;AACnD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAA;AAChD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AAQtC,OAAO,2BAA2B,CAAA;AAMlC,UAAU,wBAAyB,SAAQ,gBAAgB;IACzD,6BAA6B;IAC7B,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,sCAAsC;IACtC,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,8BAA8B;IAC9B,QAAQ,CAAC,EAAE,OAAO,EAAE,CAAA;IACpB,+BAA+B;IAC/B,IAAI,CAAC,EAAE,SAAS,CAAA;CACjB;AAMD;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,WAAW,CAAC,EAC1B,QAAQ,EACR,SAAS,EACT,SAAmB,EACnB,QAAc,EACd,QAAQ,EACR,IAAI,EACJ,SAAc,GACf,EAAE,wBAAwB,2CA0B1B"}
|
|
@@ -8,7 +8,10 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
|
8
8
|
* User menu is rendered in the sidebar footer via AdminNav.
|
|
9
9
|
*/
|
|
10
10
|
import { AdminNav } from './AdminNav';
|
|
11
|
-
|
|
11
|
+
// `ExampleContentBanner` (R107) was retired in favor of the SetupGuide,
|
|
12
|
+
// which subsumes the "review your example content" nudge into its
|
|
13
|
+
// "Add or edit your first product" task. The banner component is still
|
|
14
|
+
// exported for any custom store that imported it directly.
|
|
12
15
|
// Import Rovela admin theme CSS
|
|
13
16
|
import '../styles/admin-theme.css';
|
|
14
17
|
// =============================================================================
|
|
@@ -31,6 +34,6 @@ import '../styles/admin-theme.css';
|
|
|
31
34
|
* ```
|
|
32
35
|
*/
|
|
33
36
|
export function AdminLayout({ children, activeNav, storeName = 'Admin', storeUrl = '/', navItems, logo, className = '', }) {
|
|
34
|
-
return (_jsx("div", { className: `rovela-admin-theme ${className}`, children: _jsxs("div", { className: "admin-layout", children: [_jsx(AdminNav, { activeNav: activeNav, items: navItems, storeName: storeName, logo: logo, storeUrl: storeUrl }), _jsx("div", { className: "admin-layout-main", children:
|
|
37
|
+
return (_jsx("div", { className: `rovela-admin-theme ${className}`, children: _jsxs("div", { className: "admin-layout", children: [_jsx(AdminNav, { activeNav: activeNav, items: navItems, storeName: storeName, logo: logo, storeUrl: storeUrl }), _jsx("div", { className: "admin-layout-main", children: _jsx("main", { className: "admin-layout-content", children: children }) })] }) }));
|
|
35
38
|
}
|
|
36
39
|
//# sourceMappingURL=AdminLayout.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AdminLayout.js","sourceRoot":"","sources":["../../../src/admin/components/AdminLayout.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAA;;AAEZ;;;;;;GAMG;AAEH,OAAO,EAAE,QAAQ,EAAgB,MAAM,YAAY,CAAA;
|
|
1
|
+
{"version":3,"file":"AdminLayout.js","sourceRoot":"","sources":["../../../src/admin/components/AdminLayout.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAA;;AAEZ;;;;;;GAMG;AAEH,OAAO,EAAE,QAAQ,EAAgB,MAAM,YAAY,CAAA;AAInD,wEAAwE;AACxE,kEAAkE;AAClE,uEAAuE;AACvE,2DAA2D;AAE3D,gCAAgC;AAChC,OAAO,2BAA2B,CAAA;AAiBlC,gFAAgF;AAChF,YAAY;AACZ,gFAAgF;AAEhF;;;;;;;;;;;;;;;GAeG;AACH,MAAM,UAAU,WAAW,CAAC,EAC1B,QAAQ,EACR,SAAS,EACT,SAAS,GAAG,OAAO,EACnB,QAAQ,GAAG,GAAG,EACd,QAAQ,EACR,IAAI,EACJ,SAAS,GAAG,EAAE,GACW;IACzB,OAAO,CACL,cAAK,SAAS,EAAE,sBAAsB,SAAS,EAAE,YAC/C,eAAK,SAAS,EAAC,cAAc,aAE3B,KAAC,QAAQ,IACP,SAAS,EAAE,SAAS,EACpB,KAAK,EAAE,QAAQ,EACf,SAAS,EAAE,SAAS,EACpB,IAAI,EAAE,IAAI,EACV,QAAQ,EAAE,QAAQ,GAClB,EAGF,cAAK,SAAS,EAAC,mBAAmB,YAChC,eAAM,SAAS,EAAC,sBAAsB,YAKnC,QAAQ,GACJ,GACH,IACF,GACF,CACP,CAAA;AACH,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AdminNav.d.ts","sourceRoot":"","sources":["../../../src/admin/components/AdminNav.tsx"],"names":[],"mappings":"AAEA;;;;;;;;GAQG;AAEH,OAAc,EAAE,KAAK,SAAS,EAAE,MAAM,OAAO,CAAA;AAW7C,MAAM,WAAW,OAAO;IACtB,EAAE,EAAE,MAAM,CAAA;IACV,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,CAAC,EAAE,SAAS,CAAA;CACjB;AAED,MAAM,WAAW,QAAQ;IACvB,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,EAAE,OAAO,EAAE,CAAA;CACjB;AAED,MAAM,WAAW,aAAa;IAC5B,mCAAmC;IACnC,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,wDAAwD;IACxD,KAAK,CAAC,EAAE,OAAO,EAAE,CAAA;IACjB,4BAA4B;IAC5B,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,mBAAmB;IACnB,IAAI,CAAC,EAAE,SAAS,CAAA;IAChB,sCAAsC;IACtC,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,uBAAuB;IACvB,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;
|
|
1
|
+
{"version":3,"file":"AdminNav.d.ts","sourceRoot":"","sources":["../../../src/admin/components/AdminNav.tsx"],"names":[],"mappings":"AAEA;;;;;;;;GAQG;AAEH,OAAc,EAAE,KAAK,SAAS,EAAE,MAAM,OAAO,CAAA;AAW7C,MAAM,WAAW,OAAO;IACtB,EAAE,EAAE,MAAM,CAAA;IACV,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,CAAC,EAAE,SAAS,CAAA;CACjB;AAED,MAAM,WAAW,QAAQ;IACvB,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,EAAE,OAAO,EAAE,CAAA;CACjB;AAED,MAAM,WAAW,aAAa;IAC5B,mCAAmC;IACnC,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,wDAAwD;IACxD,KAAK,CAAC,EAAE,OAAO,EAAE,CAAA;IACjB,4BAA4B;IAC5B,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,mBAAmB;IACnB,IAAI,CAAC,EAAE,SAAS,CAAA;IAChB,sCAAsC;IACtC,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,uBAAuB;IACvB,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AA4ID;;;;;;;GAOG;AACH,wBAAgB,QAAQ,CAAC,EACvB,SAAS,EACT,KAAK,EACL,SAAS,EAAE,aAAuB,EAClC,IAAI,EACJ,QAAc,EACd,SAAc,GACf,EAAE,aAAa,2CAwJf"}
|
|
@@ -51,8 +51,21 @@ const defaultNavGroups = [
|
|
|
51
51
|
* Remove nav items the current role cannot access. For Phase 2, this only
|
|
52
52
|
* hides `users` from managers and regular users — owners and administrators
|
|
53
53
|
* keep full visibility.
|
|
54
|
+
*
|
|
55
|
+
* Pop-in fix (R-sidebar-1): when `role` is null/undefined the session fetch
|
|
56
|
+
* hasn't resolved yet. In that window we render the Users item OPTIMISTICALLY
|
|
57
|
+
* so owners and administrators (the common case) see a stable layout from
|
|
58
|
+
* first paint — no flash, no CLS.
|
|
59
|
+
*
|
|
60
|
+
* Trade-off: managers and regular users briefly see a Users link they can't
|
|
61
|
+
* use. They're a small minority of admin sessions; if they click it during
|
|
62
|
+
* the ~200–400ms flash, the server-side `requireAdmin({ permission: 'users.read' })`
|
|
63
|
+
* gate (CLAUDE.md §24) returns 403. Defense-in-depth holds.
|
|
54
64
|
*/
|
|
55
65
|
function filterNavGroupsByRole(groups, role) {
|
|
66
|
+
const roleResolved = typeof role === 'string' && role.length > 0;
|
|
67
|
+
if (!roleResolved)
|
|
68
|
+
return groups;
|
|
56
69
|
const canManageUsers = role === 'owner' || role === 'administrator' || role === 'admin';
|
|
57
70
|
if (canManageUsers)
|
|
58
71
|
return groups;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AdminNav.js","sourceRoot":"","sources":["../../../src/admin/components/AdminNav.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAA;;AAEZ;;;;;;;;GAQG;AAEH,OAAO,KAAyB,MAAM,OAAO,CAAA;AAC7C,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAA;AAC7C,OAAO,EAAE,eAAe,EAAE,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,KAAK,EAAE,UAAU,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AAC3J,OAAO,EAAE,wBAAwB,EAAE,MAAM,YAAY,CAAA;AACrD,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAA;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAA;AAiC/C,gFAAgF;AAChF,4BAA4B;AAC5B,gFAAgF;AAEhF,MAAM,gBAAgB,GAAe;IACnC;QACE,KAAK,EAAE,MAAM;QACb,KAAK,EAAE;YACL,EAAE,EAAE,EAAE,WAAW,EAAE,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,QAAQ,EAAE;YACvD,qEAAqE;YACrE,4DAA4D;YAC5D,EAAE,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,cAAc,EAAE;SACtD;KACF;IACD;QACE,KAAK,EAAE,SAAS;QAChB,KAAK,EAAE;YACL,EAAE,EAAE,EAAE,UAAU,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,iBAAiB,EAAE;YAC9D,EAAE,EAAE,EAAE,YAAY,EAAE,KAAK,EAAE,YAAY,EAAE,IAAI,EAAE,mBAAmB,EAAE;SACrE;KACF;IACD;QACE,KAAK,EAAE,OAAO;QACd,KAAK,EAAE;YACL,EAAE,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,eAAe,EAAE;YACxD,EAAE,EAAE,EAAE,WAAW,EAAE,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,kBAAkB,EAAE;YACjE,EAAE,EAAE,EAAE,UAAU,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,iBAAiB,EAAE;YAC9D,EAAE,EAAE,EAAE,UAAU,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,iBAAiB,EAAE;YAC9D,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,YAAY,EAAE;YAC/C,EAAE,EAAE,EAAE,WAAW,EAAE,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,kBAAkB,EAAE;SAClE;KACF;CACF,CAAA;AAED
|
|
1
|
+
{"version":3,"file":"AdminNav.js","sourceRoot":"","sources":["../../../src/admin/components/AdminNav.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LowStockAlert.d.ts","sourceRoot":"","sources":["../../../src/admin/components/LowStockAlert.tsx"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAA;AAMlD;;;;;;;GAOG;AACH,wBAAgB,aAAa,CAAC,EAC5B,SAAc,EACd,WAA+B,EAC/B,SAAc,GACf,EAAE,kBAAkB,
|
|
1
|
+
{"version":3,"file":"LowStockAlert.d.ts","sourceRoot":"","sources":["../../../src/admin/components/LowStockAlert.tsx"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAA;AAMlD;;;;;;;GAOG;AACH,wBAAgB,aAAa,CAAC,EAC5B,SAAc,EACd,WAA+B,EAC/B,SAAc,GACf,EAAE,kBAAkB,2CAoHpB"}
|
|
@@ -26,7 +26,7 @@ export function LowStockAlert({ threshold = 10, viewAllHref = '/admin/products',
|
|
|
26
26
|
const isHealthy = !isLoading && lowStock.length === 0;
|
|
27
27
|
return (_jsxs("div", { className: `admin-card ${className}`, children: [_jsxs("div", { className: "admin-widget-header", children: [_jsxs("div", { className: "flex items-center gap-3", children: [isHealthy ? (_jsx("div", { className: "admin-status-icon admin-status-icon-success", children: _jsx(CheckCircle, { className: "h-5 w-5" }) })) : (_jsx("div", { className: "admin-status-icon admin-status-icon-warning", children: _jsx(AlertTriangle, { className: "h-5 w-5" }) })), _jsxs("div", { children: [_jsx("h3", { className: "admin-widget-title", children: isHealthy ? 'Inventory Healthy' : 'Low Stock Alert' }), _jsx("p", { className: "admin-widget-subtitle", children: isHealthy
|
|
28
28
|
? 'All products are well stocked'
|
|
29
|
-
: `${lowStock.length} item${lowStock.length !== 1 ? 's' : ''} need attention` })] })] }), lowStock.length > 0 && (_jsxs("a", { href: viewAllHref, className: "admin-view-all-link", children: ["View all", _jsx(ChevronRight, { className: "h-4 w-4" })] }))] }), _jsxs("div", { children: [isLoading ? (_jsx("div", { className: "p-6", children: _jsx("div", { className: "space-y-4", children: [...Array(3)].map((_, i) => (_jsxs("div", { className: "flex items-center justify-between", children: [_jsxs("div", { className: "space-y-2", children: [_jsx("div", { className: "admin-skeleton admin-skeleton-md w-32 rounded" }), _jsx("div", { className: "admin-skeleton admin-skeleton-sm w-20 rounded" })] }), _jsx("div", { className: "admin-skeleton admin-skeleton-lg w-16 rounded" })] }, i))) }) })) : lowStock.length === 0 ? (_jsxs("div", { className: "admin-empty-state py-12", children: [_jsx("div", { className: "admin-status-icon admin-status-icon-success p-4", children: _jsx(CheckCircle, { className: "h-8 w-8" }) }), _jsx("p", { className: "admin-empty-text mt-4 text-sm font-medium", children: "All stocked up!" }), _jsxs("p", { className: "admin-empty-subtext text-xs", children: ["No products below ", threshold, " units in stock"] })] })) : (_jsx("div", { children: lowStock.slice(0, 5).map((item) => (_jsxs("div", { className: "admin-inventory-item", children: [_jsxs("div", { className: "min-w-0 flex-1", children: [_jsx("a", { href: `/admin/products/${item.productId}`, className: "admin-inventory-item-link", children: item.productName }), _jsx("p", { className: "admin-inventory-item-variant", children: item.variantName })] }), _jsx("div", { className: "ml-4 flex-shrink-0", children: _jsx("span", { className: `admin-badge ${item.inventory === 0
|
|
29
|
+
: `${lowStock.length} item${lowStock.length !== 1 ? 's' : ''} need attention` })] })] }), lowStock.length > 0 && (_jsxs("a", { href: viewAllHref, className: "admin-view-all-link", children: ["View all", _jsx(ChevronRight, { className: "h-4 w-4" })] }))] }), _jsxs("div", { children: [isLoading ? (_jsx("div", { className: "p-6", children: _jsx("div", { className: "space-y-4", children: [...Array(3)].map((_, i) => (_jsxs("div", { className: "flex items-center justify-between", children: [_jsxs("div", { className: "space-y-2", children: [_jsx("div", { className: "admin-skeleton admin-skeleton-md w-32 rounded" }), _jsx("div", { className: "admin-skeleton admin-skeleton-sm w-20 rounded" })] }), _jsx("div", { className: "admin-skeleton admin-skeleton-lg w-16 rounded" })] }, i))) }) })) : lowStock.length === 0 ? (_jsxs("div", { className: "admin-empty-state py-12", children: [_jsx("div", { className: "admin-status-icon admin-status-icon-success p-4", children: _jsx(CheckCircle, { className: "h-8 w-8" }) }), _jsx("p", { className: "admin-empty-text mt-4 text-sm font-medium", children: "All stocked up!" }), _jsxs("p", { className: "admin-empty-subtext text-xs", children: ["No products below ", threshold, " units in stock"] })] })) : (_jsx("div", { children: lowStock.slice(0, 5).map((item) => (_jsxs("div", { className: "admin-inventory-item", children: [_jsxs("div", { className: "min-w-0 flex-1", children: [_jsx("a", { href: `/admin/products/${item.productId}${item.variantId ? `?variant=${item.variantId}` : ''}`, className: "admin-inventory-item-link", children: item.productName }), _jsx("p", { className: "admin-inventory-item-variant", children: item.variantName })] }), _jsx("div", { className: "ml-4 flex-shrink-0", children: _jsx("span", { className: `admin-badge ${item.inventory === 0
|
|
30
30
|
? 'admin-badge-out-of-stock'
|
|
31
31
|
: 'admin-badge-low-stock'}`, children: item.inventory === 0 ? 'Out of stock' : `${item.inventory} left` }) })] }, item.variantId))) })), !isLoading && lowStock.length > 5 && (_jsx("div", { className: "admin-card-footer text-center", children: _jsxs("a", { href: viewAllHref, className: "admin-link-primary text-sm", children: ["+", lowStock.length - 5, " more items"] }) }))] })] }));
|
|
32
32
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LowStockAlert.js","sourceRoot":"","sources":["../../../src/admin/components/LowStockAlert.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAA;;AAEZ;;;;;GAKG;AAEH,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,cAAc,CAAA;AACvE,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAA;AAGtD,gFAAgF;AAChF,YAAY;AACZ,gFAAgF;AAEhF;;;;;;;GAOG;AACH,MAAM,UAAU,aAAa,CAAC,EAC5B,SAAS,GAAG,EAAE,EACd,WAAW,GAAG,iBAAiB,EAC/B,SAAS,GAAG,EAAE,GACK;IACnB,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,GAAG,aAAa,CAAC;QAC5C,iBAAiB,EAAE,SAAS;KAC7B,CAAC,CAAA;IAEF,MAAM,SAAS,GAAG,CAAC,SAAS,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,CAAA;IAErD,OAAO,CACL,eAAK,SAAS,EAAE,cAAc,SAAS,EAAE,aAEvC,eAAK,SAAS,EAAC,qBAAqB,aAClC,eAAK,SAAS,EAAC,yBAAyB,aACrC,SAAS,CAAC,CAAC,CAAC,CACX,cAAK,SAAS,EAAC,6CAA6C,YAC1D,KAAC,WAAW,IAAC,SAAS,EAAC,SAAS,GAAG,GAC/B,CACP,CAAC,CAAC,CAAC,CACF,cAAK,SAAS,EAAC,6CAA6C,YAC1D,KAAC,aAAa,IAAC,SAAS,EAAC,SAAS,GAAG,GACjC,CACP,EACD,0BACE,aAAI,SAAS,EAAC,oBAAoB,YAC/B,SAAS,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,iBAAiB,GACjD,EACL,YAAG,SAAS,EAAC,uBAAuB,YACjC,SAAS;4CACR,CAAC,CAAC,+BAA+B;4CACjC,CAAC,CAAC,GAAG,QAAQ,CAAC,MAAM,QAAQ,QAAQ,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,iBAAiB,GAE7E,IACA,IACF,EACL,QAAQ,CAAC,MAAM,GAAG,CAAC,IAAI,CACtB,aAAG,IAAI,EAAE,WAAW,EAAE,SAAS,EAAC,qBAAqB,yBAEnD,KAAC,YAAY,IAAC,SAAS,EAAC,SAAS,GAAG,IAClC,CACL,IACG,EAGN,0BACG,SAAS,CAAC,CAAC,CAAC,CACX,cAAK,SAAS,EAAC,KAAK,YAClB,cAAK,SAAS,EAAC,WAAW,YACvB,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAC3B,eAAa,SAAS,EAAC,mCAAmC,aACxD,eAAK,SAAS,EAAC,WAAW,aACxB,cAAK,SAAS,EAAC,+CAA+C,GAAG,EACjE,cAAK,SAAS,EAAC,+CAA+C,GAAG,IAC7D,EACN,cAAK,SAAS,EAAC,+CAA+C,GAAG,KALzD,CAAC,CAML,CACP,CAAC,GACE,GACF,CACP,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,CAC1B,eAAK,SAAS,EAAC,yBAAyB,aACtC,cAAK,SAAS,EAAC,iDAAiD,YAC9D,KAAC,WAAW,IAAC,SAAS,EAAC,SAAS,GAAG,GAC/B,EACN,YAAG,SAAS,EAAC,2CAA2C,gCAEpD,EACJ,aAAG,SAAS,EAAC,6BAA6B,mCACrB,SAAS,uBAC1B,IACA,CACP,CAAC,CAAC,CAAC,CACF,wBACG,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAClC,eAA0B,SAAS,EAAC,sBAAsB,aACxD,eAAK,SAAS,EAAC,gBAAgB,
|
|
1
|
+
{"version":3,"file":"LowStockAlert.js","sourceRoot":"","sources":["../../../src/admin/components/LowStockAlert.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"OrderStatusChart.d.ts","sourceRoot":"","sources":["../../../src/admin/components/OrderStatusChart.tsx"],"names":[],"mappings":"AAeA,MAAM,WAAW,qBAAqB;IACpC,6BAA6B;IAC7B,IAAI,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,EAAE,CAAA;IACzC,oBAAoB;IACpB,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,uBAAuB;IACvB,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;
|
|
1
|
+
{"version":3,"file":"OrderStatusChart.d.ts","sourceRoot":"","sources":["../../../src/admin/components/OrderStatusChart.tsx"],"names":[],"mappings":"AAeA,MAAM,WAAW,qBAAqB;IACpC,6BAA6B;IAC7B,IAAI,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,EAAE,CAAA;IACzC,oBAAoB;IACpB,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,uBAAuB;IACvB,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAwDD;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAAC,EAC/B,IAAI,EACJ,SAAiB,EACjB,SAAc,GACf,EAAE,qBAAqB,2CAmGvB"}
|
|
@@ -15,6 +15,10 @@ const statusConfig = {
|
|
|
15
15
|
paid: { label: 'Paid', color: 'hsl(var(--admin-success))' },
|
|
16
16
|
shipped: { label: 'Shipped', color: 'hsl(var(--admin-info))' },
|
|
17
17
|
delivered: { label: 'Delivered', color: 'hsl(var(--admin-primary))' },
|
|
18
|
+
// Transient — order is paid but the customer asked for a return that
|
|
19
|
+
// hasn't been approved/rejected yet. Distinct amber so it doesn't blend
|
|
20
|
+
// into "Pending" or "Refunded".
|
|
21
|
+
return_requested: { label: 'Return requested', color: 'hsl(var(--admin-warning) / 0.7)' },
|
|
18
22
|
cancelled: { label: 'Cancelled', color: 'hsl(var(--admin-destructive))' },
|
|
19
23
|
refunded: { label: 'Refunded', color: 'hsl(var(--admin-foreground-muted))' },
|
|
20
24
|
};
|
|
@@ -45,7 +49,9 @@ export function OrderStatusChart({ data, isLoading = false, className = '', }) {
|
|
|
45
49
|
}));
|
|
46
50
|
// Calculate total
|
|
47
51
|
const totalOrders = data.reduce((sum, item) => sum + item.count, 0);
|
|
48
|
-
return (_jsxs("div", { className: `admin-chart ${className}`, children: [_jsx("div", { className: "admin-chart-header", children: _jsxs("div", { children: [_jsx("h3", { className: "admin-chart-title", children: "Order Status" }), _jsx("p", { className: "admin-chart-subtitle", children: "Distribution by status" })] }) }), _jsx("div", { className: "admin-chart-body", children: isLoading ? (_jsx("div", { className: "admin-chart-loading", children: _jsx("div", { className: "admin-chart-spinner" }) })) : totalOrders === 0 ? (_jsxs("div", { className: "admin-chart-empty", children: [_jsx(ShoppingBag, { className: "h-12 w-12 admin-chart-empty-icon", strokeWidth: 1 }), _jsx("p", { className: "admin-chart-empty-text", children: "No orders yet" }), _jsx("p", { className: "admin-chart-empty-subtext", children: "Order breakdown will appear here" })] })) : (_jsxs("div", { className: "flex items-center gap-6",
|
|
52
|
+
return (_jsxs("div", { className: `admin-chart ${className}`, children: [_jsx("div", { className: "admin-chart-header", children: _jsxs("div", { children: [_jsx("h3", { className: "admin-chart-title", children: "Order Status" }), _jsx("p", { className: "admin-chart-subtitle", children: "Distribution by status" })] }) }), _jsx("div", { className: "admin-chart-body", children: isLoading ? (_jsx("div", { className: "admin-chart-loading", children: _jsx("div", { className: "admin-chart-spinner" }) })) : totalOrders === 0 ? (_jsxs("div", { className: "admin-chart-empty", children: [_jsx(ShoppingBag, { className: "h-12 w-12 admin-chart-empty-icon", strokeWidth: 1 }), _jsx("p", { className: "admin-chart-empty-text", children: "No orders yet" }), _jsx("p", { className: "admin-chart-empty-subtext", children: "Order breakdown will appear here" })] })) : (_jsxs("div", { className: "flex items-center gap-6", role: "img", "aria-label": `Order status breakdown: ${chartData
|
|
53
|
+
.map((d) => `${d.label} ${d.count}`)
|
|
54
|
+
.join(', ')}`, children: [_jsxs("div", { className: "relative flex-shrink-0", children: [_jsx(ResponsiveContainer, { width: 220, height: 220, children: _jsxs(PieChart, { children: [_jsx(Pie, { data: chartData, cx: "50%", cy: "50%", innerRadius: 70, outerRadius: 100, paddingAngle: 2, dataKey: "count", children: chartData.map((entry, index) => (_jsx(Cell, { fill: entry.color }, `cell-${index}`))) }), _jsx(Tooltip, { content: _jsx(CustomTooltip, {}) })] }) }), _jsxs("div", { className: "admin-chart-center", children: [_jsx("p", { className: "admin-chart-center-value", children: totalOrders }), _jsx("p", { className: "admin-chart-center-label", children: "Total" })] })] }), _jsx("div", { className: "admin-chart-legend", children: chartData.map((item) => {
|
|
49
55
|
const percentage = totalOrders > 0
|
|
50
56
|
? Math.round((item.count / totalOrders) * 100)
|
|
51
57
|
: 0;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"OrderStatusChart.js","sourceRoot":"","sources":["../../../src/admin/components/OrderStatusChart.tsx"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"OrderStatusChart.js","sourceRoot":"","sources":["../../../src/admin/components/OrderStatusChart.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { DashboardPeriod } from '../types';
|
|
2
|
+
export interface PeriodSelectorProps {
|
|
3
|
+
value: DashboardPeriod;
|
|
4
|
+
onChange: (next: DashboardPeriod) => void;
|
|
5
|
+
className?: string;
|
|
6
|
+
disabled?: boolean;
|
|
7
|
+
}
|
|
8
|
+
export declare function PeriodSelector({ value, onChange, className, disabled, }: PeriodSelectorProps): import("react/jsx-runtime").JSX.Element;
|
|
9
|
+
//# sourceMappingURL=PeriodSelector.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PeriodSelector.d.ts","sourceRoot":"","sources":["../../../src/admin/components/PeriodSelector.tsx"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,UAAU,CAAA;AAE/C,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,eAAe,CAAA;IACtB,QAAQ,EAAE,CAAC,IAAI,EAAE,eAAe,KAAK,IAAI,CAAA;IACzC,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,QAAQ,CAAC,EAAE,OAAO,CAAA;CACnB;AASD,wBAAgB,cAAc,CAAC,EAC7B,KAAK,EACL,QAAQ,EACR,SAAuB,EACvB,QAAQ,GACT,EAAE,mBAAmB,2CAUrB"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
3
|
+
/**
|
|
4
|
+
* @rovela/sdk/admin/components/PeriodSelector
|
|
5
|
+
*
|
|
6
|
+
* Time-window selector for the admin dashboard. Controls which window the
|
|
7
|
+
* metric cards + best seller card cover. Default = 30d.
|
|
8
|
+
*/
|
|
9
|
+
import { AdminSelect } from './AdminSelect';
|
|
10
|
+
const OPTIONS = [
|
|
11
|
+
{ value: 'today', label: 'Today' },
|
|
12
|
+
{ value: '7d', label: 'Last 7 days' },
|
|
13
|
+
{ value: '30d', label: 'Last 30 days' },
|
|
14
|
+
{ value: '90d', label: 'Last 90 days' },
|
|
15
|
+
];
|
|
16
|
+
export function PeriodSelector({ value, onChange, className = 'w-[160px]', disabled, }) {
|
|
17
|
+
return (_jsx(AdminSelect, { value: value, onChange: (v) => onChange(v), options: OPTIONS, className: className, disabled: disabled }));
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=PeriodSelector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PeriodSelector.js","sourceRoot":"","sources":["../../../src/admin/components/PeriodSelector.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAA;;AAEZ;;;;;GAKG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;AAU3C,MAAM,OAAO,GAAqD;IAChE,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE;IAClC,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,aAAa,EAAE;IACrC,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,cAAc,EAAE;IACvC,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,cAAc,EAAE;CACxC,CAAA;AAED,MAAM,UAAU,cAAc,CAAC,EAC7B,KAAK,EACL,QAAQ,EACR,SAAS,GAAG,WAAW,EACvB,QAAQ,GACY;IACpB,OAAO,CACL,KAAC,WAAW,IACV,KAAK,EAAE,KAAK,EACZ,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAoB,CAAC,EAC/C,OAAO,EAAE,OAAO,EAChB,SAAS,EAAE,SAAS,EACpB,QAAQ,EAAE,QAAQ,GAClB,CACH,CAAA;AACH,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { DashboardSummaryPayload } from '../types';
|
|
2
|
+
export interface PrimaryMetricsRowProps {
|
|
3
|
+
summary: DashboardSummaryPayload | null;
|
|
4
|
+
isLoading: boolean;
|
|
5
|
+
/** ISO currency code (e.g. 'USD'). Forwarded to Intl formatters. */
|
|
6
|
+
currency: string;
|
|
7
|
+
/** BCP-47 locale (e.g. 'en-US') for number formatting. */
|
|
8
|
+
locale?: string;
|
|
9
|
+
}
|
|
10
|
+
export declare function PrimaryMetricsRow({ summary, isLoading, currency, locale, }: PrimaryMetricsRowProps): import("react/jsx-runtime").JSX.Element;
|
|
11
|
+
//# sourceMappingURL=PrimaryMetricsRow.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PrimaryMetricsRow.d.ts","sourceRoot":"","sources":["../../../src/admin/components/PrimaryMetricsRow.tsx"],"names":[],"mappings":"AAuBA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,UAAU,CAAA;AAMvD,MAAM,WAAW,sBAAsB;IACrC,OAAO,EAAE,uBAAuB,GAAG,IAAI,CAAA;IACvC,SAAS,EAAE,OAAO,CAAA;IAClB,oEAAoE;IACpE,QAAQ,EAAE,MAAM,CAAA;IAChB,0DAA0D;IAC1D,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB;AA4FD,wBAAgB,iBAAiB,CAAC,EAChC,OAAO,EACP,SAAS,EACT,QAAQ,EACR,MAAgB,GACjB,EAAE,sBAAsB,2CAyDxB"}
|