@rovela-ai/sdk 0.1.19 → 0.1.21
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/components/AdminNav.d.ts +10 -3
- package/dist/admin/components/AdminNav.d.ts.map +1 -1
- package/dist/admin/components/AdminNav.js +80 -28
- package/dist/admin/components/AdminNav.js.map +1 -1
- package/dist/admin/components/CategoryForm.d.ts +30 -0
- package/dist/admin/components/CategoryForm.d.ts.map +1 -0
- package/dist/admin/components/CategoryForm.js +153 -0
- package/dist/admin/components/CategoryForm.js.map +1 -0
- package/dist/admin/components/CategorySelect.d.ts +32 -0
- package/dist/admin/components/CategorySelect.d.ts.map +1 -0
- package/dist/admin/components/CategorySelect.js +148 -0
- package/dist/admin/components/CategorySelect.js.map +1 -0
- package/dist/admin/components/LowStockAlert.d.ts +2 -2
- package/dist/admin/components/LowStockAlert.d.ts.map +1 -1
- package/dist/admin/components/LowStockAlert.js +16 -9
- package/dist/admin/components/LowStockAlert.js.map +1 -1
- package/dist/admin/components/OrderStatusChart.d.ts +21 -0
- package/dist/admin/components/OrderStatusChart.d.ts.map +1 -0
- package/dist/admin/components/OrderStatusChart.js +54 -0
- package/dist/admin/components/OrderStatusChart.js.map +1 -0
- package/dist/admin/components/ProductForm.d.ts +2 -2
- package/dist/admin/components/ProductForm.d.ts.map +1 -1
- package/dist/admin/components/ProductForm.js +125 -9
- package/dist/admin/components/ProductForm.js.map +1 -1
- package/dist/admin/components/RecentOrders.d.ts +1 -1
- package/dist/admin/components/RecentOrders.d.ts.map +1 -1
- package/dist/admin/components/RecentOrders.js +11 -10
- package/dist/admin/components/RecentOrders.js.map +1 -1
- package/dist/admin/components/RevenueChart.d.ts +23 -0
- package/dist/admin/components/RevenueChart.d.ts.map +1 -0
- package/dist/admin/components/RevenueChart.js +70 -0
- package/dist/admin/components/RevenueChart.js.map +1 -0
- package/dist/admin/components/SEOPreview.d.ts +32 -0
- package/dist/admin/components/SEOPreview.d.ts.map +1 -0
- package/dist/admin/components/SEOPreview.js +30 -0
- package/dist/admin/components/SEOPreview.js.map +1 -0
- package/dist/admin/components/StatsCards.d.ts +2 -2
- package/dist/admin/components/StatsCards.d.ts.map +1 -1
- package/dist/admin/components/StatsCards.js +18 -20
- package/dist/admin/components/StatsCards.js.map +1 -1
- package/dist/admin/components/TagInput.d.ts +29 -0
- package/dist/admin/components/TagInput.d.ts.map +1 -0
- package/dist/admin/components/TagInput.js +73 -0
- package/dist/admin/components/TagInput.js.map +1 -0
- package/dist/admin/components/VariantManager.d.ts +42 -0
- package/dist/admin/components/VariantManager.d.ts.map +1 -0
- package/dist/admin/components/VariantManager.js +175 -0
- package/dist/admin/components/VariantManager.js.map +1 -0
- package/dist/admin/components/index.d.ts +9 -0
- package/dist/admin/components/index.d.ts.map +1 -1
- package/dist/admin/components/index.js +13 -0
- package/dist/admin/components/index.js.map +1 -1
- package/dist/admin/hooks/index.d.ts +2 -0
- package/dist/admin/hooks/index.d.ts.map +1 -1
- package/dist/admin/hooks/index.js +1 -0
- package/dist/admin/hooks/index.js.map +1 -1
- package/dist/admin/hooks/useAdminCategories.d.ts +36 -0
- package/dist/admin/hooks/useAdminCategories.d.ts.map +1 -0
- package/dist/admin/hooks/useAdminCategories.js +217 -0
- package/dist/admin/hooks/useAdminCategories.js.map +1 -0
- package/dist/admin/index.d.ts +4 -3
- package/dist/admin/index.d.ts.map +1 -1
- package/dist/admin/index.js +6 -2
- package/dist/admin/index.js.map +1 -1
- package/dist/core/StoreSettingsProvider.d.ts +104 -0
- package/dist/core/StoreSettingsProvider.d.ts.map +1 -0
- package/dist/core/StoreSettingsProvider.js +195 -0
- package/dist/core/StoreSettingsProvider.js.map +1 -0
- package/dist/core/api/index.d.ts +7 -0
- package/dist/core/api/index.d.ts.map +1 -0
- package/dist/core/api/index.js +7 -0
- package/dist/core/api/index.js.map +1 -0
- package/dist/core/api/settings.d.ts +42 -0
- package/dist/core/api/settings.d.ts.map +1 -0
- package/dist/core/api/settings.js +74 -0
- package/dist/core/api/settings.js.map +1 -0
- package/dist/core/db/queries.d.ts +6 -6
- package/dist/core/index.d.ts +2 -0
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js +2 -0
- package/dist/core/index.js.map +1 -1
- package/package.json +6 -1
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* @rovela/sdk/admin/components/AdminNav
|
|
3
3
|
*
|
|
4
|
-
* Admin sidebar navigation component
|
|
4
|
+
* Admin sidebar navigation component with grouped navigation,
|
|
5
|
+
* elegant styling, and Rovela branding.
|
|
5
6
|
*/
|
|
6
7
|
import { type ReactNode } from 'react';
|
|
7
8
|
export interface NavItem {
|
|
@@ -10,6 +11,10 @@ export interface NavItem {
|
|
|
10
11
|
href: string;
|
|
11
12
|
icon?: ReactNode;
|
|
12
13
|
}
|
|
14
|
+
export interface NavGroup {
|
|
15
|
+
label: string;
|
|
16
|
+
items: NavItem[];
|
|
17
|
+
}
|
|
13
18
|
export interface AdminNavProps {
|
|
14
19
|
/** Currently active nav item ID */
|
|
15
20
|
activeNav?: string;
|
|
@@ -19,16 +24,18 @@ export interface AdminNavProps {
|
|
|
19
24
|
storeName?: string;
|
|
20
25
|
/** Logo element */
|
|
21
26
|
logo?: ReactNode;
|
|
27
|
+
/** Store URL for "View Store" link */
|
|
28
|
+
storeUrl?: string;
|
|
22
29
|
/** Custom className */
|
|
23
30
|
className?: string;
|
|
24
31
|
}
|
|
25
32
|
/**
|
|
26
|
-
* Admin sidebar navigation.
|
|
33
|
+
* Admin sidebar navigation with grouped sections and elegant styling.
|
|
27
34
|
*
|
|
28
35
|
* @example
|
|
29
36
|
* ```tsx
|
|
30
37
|
* <AdminNav activeNav="dashboard" storeName="My Store" />
|
|
31
38
|
* ```
|
|
32
39
|
*/
|
|
33
|
-
export declare function AdminNav({ activeNav, items, storeName, logo, className, }: AdminNavProps): import("react/jsx-runtime").JSX.Element;
|
|
40
|
+
export declare function AdminNav({ activeNav, items, storeName, logo, storeUrl, className, }: AdminNavProps): import("react/jsx-runtime").JSX.Element;
|
|
34
41
|
//# sourceMappingURL=AdminNav.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AdminNav.d.ts","sourceRoot":"","sources":["../../../src/admin/components/AdminNav.tsx"],"names":[],"mappings":"AAEA
|
|
1
|
+
{"version":3,"file":"AdminNav.d.ts","sourceRoot":"","sources":["../../../src/admin/components/AdminNav.tsx"],"names":[],"mappings":"AAEA;;;;;GAKG;AAEH,OAAc,EAAE,KAAK,SAAS,EAAE,MAAM,OAAO,CAAA;AAM7C,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;AA0KD;;;;;;;GAOG;AACH,wBAAgB,QAAQ,CAAC,EACvB,SAAS,EACT,KAAK,EACL,SAAmB,EACnB,IAAI,EACJ,QAAc,EACd,SAAc,GACf,EAAE,aAAa,2CAgGf"}
|
|
@@ -1,58 +1,110 @@
|
|
|
1
1
|
'use client';
|
|
2
|
-
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
3
3
|
// =============================================================================
|
|
4
|
-
// Default Navigation
|
|
4
|
+
// Default Navigation Groups
|
|
5
5
|
// =============================================================================
|
|
6
|
-
const
|
|
7
|
-
{
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
6
|
+
const defaultNavGroups = [
|
|
7
|
+
{
|
|
8
|
+
label: 'Main',
|
|
9
|
+
items: [
|
|
10
|
+
{ id: 'dashboard', label: 'Dashboard', href: '/admin' },
|
|
11
|
+
],
|
|
12
|
+
},
|
|
13
|
+
{
|
|
14
|
+
label: 'Catalog',
|
|
15
|
+
items: [
|
|
16
|
+
{ id: 'products', label: 'Products', href: '/admin/products' },
|
|
17
|
+
{ id: 'categories', label: 'Categories', href: '/admin/categories' },
|
|
18
|
+
],
|
|
19
|
+
},
|
|
20
|
+
{
|
|
21
|
+
label: 'Sales',
|
|
22
|
+
items: [
|
|
23
|
+
{ id: 'orders', label: 'Orders', href: '/admin/orders' },
|
|
24
|
+
{ id: 'customers', label: 'Customers', href: '/admin/customers' },
|
|
25
|
+
],
|
|
26
|
+
},
|
|
12
27
|
];
|
|
28
|
+
const settingsItem = { id: 'settings', label: 'Settings', href: '/admin/settings' };
|
|
13
29
|
// =============================================================================
|
|
14
|
-
// Icons (
|
|
30
|
+
// Icons (refined SVG icons)
|
|
15
31
|
// =============================================================================
|
|
16
|
-
function DashboardIcon() {
|
|
17
|
-
return (_jsx("svg", { className:
|
|
32
|
+
function DashboardIcon({ className = 'h-5 w-5' }) {
|
|
33
|
+
return (_jsx("svg", { className: className, fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.5, children: _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M3.75 6A2.25 2.25 0 016 3.75h2.25A2.25 2.25 0 0110.5 6v2.25a2.25 2.25 0 01-2.25 2.25H6a2.25 2.25 0 01-2.25-2.25V6zM3.75 15.75A2.25 2.25 0 016 13.5h2.25a2.25 2.25 0 012.25 2.25V18a2.25 2.25 0 01-2.25 2.25H6A2.25 2.25 0 013.75 18v-2.25zM13.5 6a2.25 2.25 0 012.25-2.25H18A2.25 2.25 0 0120.25 6v2.25A2.25 2.25 0 0118 10.5h-2.25a2.25 2.25 0 01-2.25-2.25V6zM13.5 15.75a2.25 2.25 0 012.25-2.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-2.25A2.25 2.25 0 0113.5 18v-2.25z" }) }));
|
|
18
34
|
}
|
|
19
|
-
function ProductsIcon() {
|
|
20
|
-
return (_jsx("svg", { className:
|
|
35
|
+
function ProductsIcon({ className = 'h-5 w-5' }) {
|
|
36
|
+
return (_jsx("svg", { className: className, fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.5, children: _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M20.25 7.5l-.625 10.632a2.25 2.25 0 01-2.247 2.118H6.622a2.25 2.25 0 01-2.247-2.118L3.75 7.5M10 11.25h4M3.375 7.5h17.25c.621 0 1.125-.504 1.125-1.125v-1.5c0-.621-.504-1.125-1.125-1.125H3.375c-.621 0-1.125.504-1.125 1.125v1.5c0 .621.504 1.125 1.125 1.125z" }) }));
|
|
21
37
|
}
|
|
22
|
-
function
|
|
23
|
-
return (_jsx("svg", { className:
|
|
38
|
+
function CategoriesIcon({ className = 'h-5 w-5' }) {
|
|
39
|
+
return (_jsx("svg", { className: className, fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.5, children: _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M2.25 12.75V12A2.25 2.25 0 014.5 9.75h15A2.25 2.25 0 0121.75 12v.75m-8.69-6.44l-2.12-2.12a1.5 1.5 0 00-1.061-.44H4.5A2.25 2.25 0 002.25 6v12a2.25 2.25 0 002.25 2.25h15A2.25 2.25 0 0021.75 18V9a2.25 2.25 0 00-2.25-2.25h-5.379a1.5 1.5 0 01-1.06-.44z" }) }));
|
|
24
40
|
}
|
|
25
|
-
function
|
|
26
|
-
return (_jsx("svg", { className:
|
|
41
|
+
function OrdersIcon({ className = 'h-5 w-5' }) {
|
|
42
|
+
return (_jsx("svg", { className: className, fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.5, children: _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M9 12h3.75M9 15h3.75M9 18h3.75m3 .75H18a2.25 2.25 0 002.25-2.25V6.108c0-1.135-.845-2.098-1.976-2.192a48.424 48.424 0 00-1.123-.08m-5.801 0c-.065.21-.1.433-.1.664 0 .414.336.75.75.75h4.5a.75.75 0 00.75-.75 2.25 2.25 0 00-.1-.664m-5.8 0A2.251 2.251 0 0113.5 2.25H15c1.012 0 1.867.668 2.15 1.586m-5.8 0c-.376.023-.75.05-1.124.08C9.095 4.01 8.25 4.973 8.25 6.108V8.25m0 0H4.875c-.621 0-1.125.504-1.125 1.125v11.25c0 .621.504 1.125 1.125 1.125h9.75c.621 0 1.125-.504 1.125-1.125V9.375c0-.621-.504-1.125-1.125-1.125H8.25zM6.75 12h.008v.008H6.75V12zm0 3h.008v.008H6.75V15zm0 3h.008v.008H6.75V18z" }) }));
|
|
27
43
|
}
|
|
28
|
-
function
|
|
29
|
-
return (
|
|
44
|
+
function CustomersIcon({ className = 'h-5 w-5' }) {
|
|
45
|
+
return (_jsx("svg", { className: className, fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.5, children: _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M15 19.128a9.38 9.38 0 002.625.372 9.337 9.337 0 004.121-.952 4.125 4.125 0 00-7.533-2.493M15 19.128v-.003c0-1.113-.285-2.16-.786-3.07M15 19.128v.106A12.318 12.318 0 018.624 21c-2.331 0-4.512-.645-6.374-1.766l-.001-.109a6.375 6.375 0 0111.964-3.07M12 6.375a3.375 3.375 0 11-6.75 0 3.375 3.375 0 016.75 0zm8.25 2.25a2.625 2.625 0 11-5.25 0 2.625 2.625 0 015.25 0z" }) }));
|
|
46
|
+
}
|
|
47
|
+
function SettingsIcon({ className = 'h-5 w-5' }) {
|
|
48
|
+
return (_jsxs("svg", { className: className, fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.5, children: [_jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M9.594 3.94c.09-.542.56-.94 1.11-.94h2.593c.55 0 1.02.398 1.11.94l.213 1.281c.063.374.313.686.645.87.074.04.147.083.22.127.324.196.72.257 1.075.124l1.217-.456a1.125 1.125 0 011.37.49l1.296 2.247a1.125 1.125 0 01-.26 1.431l-1.003.827c-.293.24-.438.613-.431.992a6.759 6.759 0 010 .255c-.007.378.138.75.43.99l1.005.828c.424.35.534.954.26 1.43l-1.298 2.247a1.125 1.125 0 01-1.369.491l-1.217-.456c-.355-.133-.75-.072-1.076.124a6.57 6.57 0 01-.22.128c-.331.183-.581.495-.644.869l-.213 1.28c-.09.543-.56.941-1.11.941h-2.594c-.55 0-1.02-.398-1.11-.94l-.213-1.281c-.062-.374-.312-.686-.644-.87a6.52 6.52 0 01-.22-.127c-.325-.196-.72-.257-1.076-.124l-1.217.456a1.125 1.125 0 01-1.369-.49l-1.297-2.247a1.125 1.125 0 01.26-1.431l1.004-.827c.292-.24.437-.613.43-.992a6.932 6.932 0 010-.255c.007-.378-.138-.75-.43-.99l-1.004-.828a1.125 1.125 0 01-.26-1.43l1.297-2.247a1.125 1.125 0 011.37-.491l1.216.456c.356.133.751.072 1.076-.124.072-.044.146-.087.22-.128.332-.183.582-.495.644-.869l.214-1.281z" }), _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M15 12a3 3 0 11-6 0 3 3 0 016 0z" })] }));
|
|
49
|
+
}
|
|
50
|
+
function ExternalLinkIcon({ className = 'h-4 w-4' }) {
|
|
51
|
+
return (_jsx("svg", { className: className, fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.5, children: _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M13.5 6H5.25A2.25 2.25 0 003 8.25v10.5A2.25 2.25 0 005.25 21h10.5A2.25 2.25 0 0018 18.75V10.5m-10.5 6L21 3m0 0h-5.25M21 3v5.25" }) }));
|
|
52
|
+
}
|
|
53
|
+
// Rovela Logo Image
|
|
54
|
+
function RovelaLogo({ className = 'h-4 w-4' }) {
|
|
55
|
+
return (
|
|
56
|
+
// eslint-disable-next-line @next/next/no-img-element
|
|
57
|
+
_jsx("img", { src: "/rovela-logo.png", alt: "Rovela", className: className }));
|
|
30
58
|
}
|
|
31
59
|
const iconMap = {
|
|
32
60
|
dashboard: DashboardIcon,
|
|
33
61
|
products: ProductsIcon,
|
|
62
|
+
categories: CategoriesIcon,
|
|
34
63
|
orders: OrdersIcon,
|
|
35
64
|
customers: CustomersIcon,
|
|
36
65
|
settings: SettingsIcon,
|
|
37
66
|
};
|
|
38
67
|
// =============================================================================
|
|
68
|
+
// Nav Item Component
|
|
69
|
+
// =============================================================================
|
|
70
|
+
function NavItemButton({ item, isActive, }) {
|
|
71
|
+
const Icon = item.icon || iconMap[item.id];
|
|
72
|
+
return (_jsxs("a", { href: item.href, className: `
|
|
73
|
+
group flex items-center gap-3 rounded-lg px-3 py-2.5 text-sm font-medium
|
|
74
|
+
transition-all duration-200 ease-out
|
|
75
|
+
${isActive
|
|
76
|
+
? 'bg-primary/10 text-primary'
|
|
77
|
+
: 'text-muted-foreground hover:bg-accent hover:text-foreground'}
|
|
78
|
+
`, children: [_jsx("span", { className: `
|
|
79
|
+
absolute left-0 h-8 w-1 rounded-r-full bg-primary
|
|
80
|
+
transition-all duration-200
|
|
81
|
+
${isActive ? 'opacity-100' : 'opacity-0'}
|
|
82
|
+
` }), _jsx("span", { className: `
|
|
83
|
+
transition-transform duration-200
|
|
84
|
+
${!isActive ? 'group-hover:translate-x-0.5' : ''}
|
|
85
|
+
`, children: typeof Icon === 'function' ? _jsx(Icon, { className: "h-5 w-5" }) : Icon }), _jsx("span", { className: `
|
|
86
|
+
transition-transform duration-200
|
|
87
|
+
${!isActive ? 'group-hover:translate-x-0.5' : ''}
|
|
88
|
+
`, children: item.label })] }));
|
|
89
|
+
}
|
|
90
|
+
// =============================================================================
|
|
39
91
|
// Component
|
|
40
92
|
// =============================================================================
|
|
41
93
|
/**
|
|
42
|
-
* Admin sidebar navigation.
|
|
94
|
+
* Admin sidebar navigation with grouped sections and elegant styling.
|
|
43
95
|
*
|
|
44
96
|
* @example
|
|
45
97
|
* ```tsx
|
|
46
98
|
* <AdminNav activeNav="dashboard" storeName="My Store" />
|
|
47
99
|
* ```
|
|
48
100
|
*/
|
|
49
|
-
export function AdminNav({ activeNav, items
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
101
|
+
export function AdminNav({ activeNav, items, storeName = 'Admin', logo, storeUrl = '/', className = '', }) {
|
|
102
|
+
// If custom items provided, use flat list; otherwise use groups
|
|
103
|
+
const useGroups = !items;
|
|
104
|
+
return (_jsxs("nav", { className: `flex h-full w-64 flex-col bg-card ${className}`, children: [_jsx("div", { className: "flex h-16 items-center gap-3 border-b border-border px-5", children: logo || (_jsxs(_Fragment, { children: [_jsx("div", { className: "flex h-9 w-9 items-center justify-center rounded-lg bg-primary/10 text-primary font-semibold", children: storeName.charAt(0).toUpperCase() }), _jsxs("div", { className: "flex flex-col", children: [_jsx("span", { className: "text-sm font-semibold text-foreground leading-tight", children: storeName }), _jsx("span", { className: "text-xs text-muted-foreground", children: "Admin Panel" })] })] })) }), _jsx("div", { className: "flex-1 overflow-y-auto px-3 py-4", children: useGroups ? (
|
|
105
|
+
// Grouped navigation
|
|
106
|
+
_jsx("div", { className: "space-y-6", children: defaultNavGroups.map((group) => (_jsxs("div", { children: [_jsx("p", { className: "mb-2 px-3 text-xs font-semibold uppercase tracking-wider text-muted-foreground/70", children: group.label }), _jsx("ul", { className: "space-y-1", children: group.items.map((item) => (_jsx("li", { className: "relative", children: _jsx(NavItemButton, { item: item, isActive: activeNav === item.id }) }, item.id))) })] }, group.label))) })) : (
|
|
107
|
+
// Flat navigation (custom items)
|
|
108
|
+
_jsx("ul", { className: "space-y-1", children: items?.map((item) => (_jsx("li", { className: "relative", children: _jsx(NavItemButton, { item: item, isActive: activeNav === item.id }) }, item.id))) })) }), _jsx("div", { className: "border-t border-border px-3 py-3", children: _jsx("div", { className: "relative", children: _jsx(NavItemButton, { item: settingsItem, isActive: activeNav === 'settings' }) }) }), _jsxs("div", { className: "border-t border-border px-4 py-4 space-y-3", children: [_jsxs("a", { href: storeUrl, target: "_blank", rel: "noopener noreferrer", className: "flex items-center justify-center gap-2 rounded-lg border border-border px-3 py-2 text-sm font-medium text-muted-foreground transition-colors hover:bg-accent hover:text-foreground", children: [_jsx(ExternalLinkIcon, { className: "h-4 w-4" }), "View Store"] }), _jsxs("div", { className: "flex items-center justify-center gap-1.5 text-xs text-muted-foreground/60", children: [_jsx("span", { children: "Powered by" }), _jsx(RovelaLogo, { className: "h-4 w-4" }), _jsx("span", { className: "font-medium", children: "Rovela" })] })] })] }));
|
|
57
109
|
}
|
|
58
110
|
//# sourceMappingURL=AdminNav.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AdminNav.js","sourceRoot":"","sources":["../../../src/admin/components/AdminNav.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAA;;
|
|
1
|
+
{"version":3,"file":"AdminNav.js","sourceRoot":"","sources":["../../../src/admin/components/AdminNav.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import type { CategoryFormData } from '../types';
|
|
2
|
+
export interface CategoryFormProps {
|
|
3
|
+
/** Category ID for edit mode */
|
|
4
|
+
categoryId?: string;
|
|
5
|
+
/** Initial data (optional, for optimistic UI) */
|
|
6
|
+
initialData?: Partial<CategoryFormData>;
|
|
7
|
+
/** Callback when save succeeds */
|
|
8
|
+
onSuccess?: (categoryId: string) => void;
|
|
9
|
+
/** Callback when cancel is clicked */
|
|
10
|
+
onCancel?: () => void;
|
|
11
|
+
/** Additional CSS classes */
|
|
12
|
+
className?: string;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Category form for create and edit.
|
|
16
|
+
*
|
|
17
|
+
* @example
|
|
18
|
+
* ```tsx
|
|
19
|
+
* // Create mode
|
|
20
|
+
* <CategoryForm onSuccess={() => router.push('/admin/categories')} />
|
|
21
|
+
*
|
|
22
|
+
* // Edit mode
|
|
23
|
+
* <CategoryForm
|
|
24
|
+
* categoryId="123"
|
|
25
|
+
* onSuccess={() => router.push('/admin/categories')}
|
|
26
|
+
* />
|
|
27
|
+
* ```
|
|
28
|
+
*/
|
|
29
|
+
export declare function CategoryForm({ categoryId, initialData, onSuccess, onCancel, className, }: CategoryFormProps): import("react/jsx-runtime").JSX.Element;
|
|
30
|
+
//# sourceMappingURL=CategoryForm.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CategoryForm.d.ts","sourceRoot":"","sources":["../../../src/admin/components/CategoryForm.tsx"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,gBAAgB,EAAyB,MAAM,UAAU,CAAA;AAMvE,MAAM,WAAW,iBAAiB;IAChC,gCAAgC;IAChC,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,iDAAiD;IACjD,WAAW,CAAC,EAAE,OAAO,CAAC,gBAAgB,CAAC,CAAA;IACvC,kCAAkC;IAClC,SAAS,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,IAAI,CAAA;IACxC,sCAAsC;IACtC,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAA;IACrB,6BAA6B;IAC7B,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAMD;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,YAAY,CAAC,EAC3B,UAAU,EACV,WAAW,EACX,SAAS,EACT,QAAQ,EACR,SAAc,GACf,EAAE,iBAAiB,2CAyUnB"}
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
/**
|
|
4
|
+
* @rovela/sdk/admin/components/CategoryForm
|
|
5
|
+
*
|
|
6
|
+
* Category create/edit form component.
|
|
7
|
+
*/
|
|
8
|
+
import { useState, useCallback, useEffect, useMemo } from 'react';
|
|
9
|
+
import { ImagePlus, Trash2 } from 'lucide-react';
|
|
10
|
+
// =============================================================================
|
|
11
|
+
// Component
|
|
12
|
+
// =============================================================================
|
|
13
|
+
/**
|
|
14
|
+
* Category form for create and edit.
|
|
15
|
+
*
|
|
16
|
+
* @example
|
|
17
|
+
* ```tsx
|
|
18
|
+
* // Create mode
|
|
19
|
+
* <CategoryForm onSuccess={() => router.push('/admin/categories')} />
|
|
20
|
+
*
|
|
21
|
+
* // Edit mode
|
|
22
|
+
* <CategoryForm
|
|
23
|
+
* categoryId="123"
|
|
24
|
+
* onSuccess={() => router.push('/admin/categories')}
|
|
25
|
+
* />
|
|
26
|
+
* ```
|
|
27
|
+
*/
|
|
28
|
+
export function CategoryForm({ categoryId, initialData, onSuccess, onCancel, className = '', }) {
|
|
29
|
+
const isEditMode = !!categoryId;
|
|
30
|
+
// Form state
|
|
31
|
+
const [formData, setFormData] = useState({
|
|
32
|
+
name: initialData?.name || '',
|
|
33
|
+
slug: initialData?.slug || '',
|
|
34
|
+
description: initialData?.description || '',
|
|
35
|
+
image: initialData?.image || '',
|
|
36
|
+
parentId: initialData?.parentId || '',
|
|
37
|
+
order: initialData?.order || 0,
|
|
38
|
+
});
|
|
39
|
+
// Categories for parent selector
|
|
40
|
+
const [categories, setCategories] = useState([]);
|
|
41
|
+
// UI state
|
|
42
|
+
const [isLoading, setIsLoading] = useState(false);
|
|
43
|
+
const [isFetching, setIsFetching] = useState(false);
|
|
44
|
+
const [error, setError] = useState(null);
|
|
45
|
+
// Auto-generate slug from name
|
|
46
|
+
const autoSlug = useMemo(() => {
|
|
47
|
+
return formData.name
|
|
48
|
+
.toLowerCase()
|
|
49
|
+
.replace(/[^a-z0-9]+/g, '-')
|
|
50
|
+
.replace(/^-|-$/g, '');
|
|
51
|
+
}, [formData.name]);
|
|
52
|
+
// Fetch categories for parent selector
|
|
53
|
+
useEffect(() => {
|
|
54
|
+
const fetchCategories = async () => {
|
|
55
|
+
try {
|
|
56
|
+
const response = await fetch('/api/admin/categories?flat=true');
|
|
57
|
+
if (response.ok) {
|
|
58
|
+
const data = await response.json();
|
|
59
|
+
setCategories(data.data || []);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
catch (err) {
|
|
63
|
+
console.error('[CategoryForm] Failed to fetch categories:', err);
|
|
64
|
+
}
|
|
65
|
+
};
|
|
66
|
+
fetchCategories();
|
|
67
|
+
}, []);
|
|
68
|
+
// Load category data in edit mode
|
|
69
|
+
useEffect(() => {
|
|
70
|
+
if (categoryId && !initialData) {
|
|
71
|
+
setIsFetching(true);
|
|
72
|
+
fetch(`/api/admin/categories/${categoryId}`)
|
|
73
|
+
.then((res) => res.json())
|
|
74
|
+
.then((data) => {
|
|
75
|
+
if (data.data) {
|
|
76
|
+
const cat = data.data;
|
|
77
|
+
setFormData({
|
|
78
|
+
name: cat.name,
|
|
79
|
+
slug: cat.slug,
|
|
80
|
+
description: cat.description || '',
|
|
81
|
+
image: cat.image || '',
|
|
82
|
+
parentId: cat.parentId || '',
|
|
83
|
+
order: cat.order,
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
setIsFetching(false);
|
|
87
|
+
})
|
|
88
|
+
.catch((err) => {
|
|
89
|
+
console.error('[CategoryForm] Failed to fetch category:', err);
|
|
90
|
+
setError('Failed to load category');
|
|
91
|
+
setIsFetching(false);
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
}, [categoryId, initialData]);
|
|
95
|
+
// Filter out self and descendants from parent options
|
|
96
|
+
const parentOptions = useMemo(() => {
|
|
97
|
+
if (!isEditMode)
|
|
98
|
+
return categories;
|
|
99
|
+
// Simple filter: just exclude self (circular reference check is on backend)
|
|
100
|
+
return categories.filter((cat) => cat.id !== categoryId);
|
|
101
|
+
}, [categories, categoryId, isEditMode]);
|
|
102
|
+
// Handle field changes
|
|
103
|
+
const handleChange = useCallback((e) => {
|
|
104
|
+
const { name, value, type } = e.target;
|
|
105
|
+
setFormData((prev) => ({
|
|
106
|
+
...prev,
|
|
107
|
+
[name]: type === 'number' ? (value ? parseInt(value, 10) : 0) : value,
|
|
108
|
+
}));
|
|
109
|
+
}, []);
|
|
110
|
+
// Handle submit
|
|
111
|
+
const handleSubmit = useCallback(async (e) => {
|
|
112
|
+
e.preventDefault();
|
|
113
|
+
setError(null);
|
|
114
|
+
setIsLoading(true);
|
|
115
|
+
try {
|
|
116
|
+
const data = {
|
|
117
|
+
name: formData.name,
|
|
118
|
+
slug: formData.slug || autoSlug,
|
|
119
|
+
description: formData.description || undefined,
|
|
120
|
+
image: formData.image || undefined,
|
|
121
|
+
parentId: formData.parentId || undefined,
|
|
122
|
+
order: formData.order,
|
|
123
|
+
};
|
|
124
|
+
const url = isEditMode
|
|
125
|
+
? `/api/admin/categories/${categoryId}`
|
|
126
|
+
: '/api/admin/categories';
|
|
127
|
+
const response = await fetch(url, {
|
|
128
|
+
method: isEditMode ? 'PUT' : 'POST',
|
|
129
|
+
headers: { 'Content-Type': 'application/json' },
|
|
130
|
+
body: JSON.stringify(data),
|
|
131
|
+
});
|
|
132
|
+
const result = await response.json();
|
|
133
|
+
if (!response.ok) {
|
|
134
|
+
setError(result.error || 'Failed to save category');
|
|
135
|
+
return;
|
|
136
|
+
}
|
|
137
|
+
const savedCategory = result.data;
|
|
138
|
+
onSuccess?.(savedCategory.id);
|
|
139
|
+
}
|
|
140
|
+
catch {
|
|
141
|
+
setError('An unexpected error occurred');
|
|
142
|
+
}
|
|
143
|
+
finally {
|
|
144
|
+
setIsLoading(false);
|
|
145
|
+
}
|
|
146
|
+
}, [isEditMode, categoryId, formData, autoSlug, onSuccess]);
|
|
147
|
+
// Loading state
|
|
148
|
+
if (isFetching) {
|
|
149
|
+
return (_jsx("div", { className: "flex items-center justify-center py-12", children: _jsx("div", { className: "h-8 w-8 animate-spin rounded-full border-2 border-primary border-t-transparent" }) }));
|
|
150
|
+
}
|
|
151
|
+
return (_jsxs("form", { onSubmit: handleSubmit, className: `space-y-6 ${className}`, children: [error && (_jsx("div", { className: "rounded-md bg-destructive/10 px-4 py-3 text-sm text-destructive", children: error })), _jsxs("div", { className: "rounded-lg border border-border bg-card p-6", children: [_jsx("h3", { className: "mb-4 text-lg font-medium text-foreground", children: "Basic Information" }), _jsxs("div", { className: "space-y-4", children: [_jsxs("div", { children: [_jsxs("label", { htmlFor: "name", className: "block text-sm font-medium text-foreground", children: ["Category Name ", _jsx("span", { className: "text-destructive", children: "*" })] }), _jsx("input", { id: "name", name: "name", type: "text", value: formData.name, onChange: handleChange, required: true, placeholder: "e.g., Electronics, Clothing", className: "mt-1 block w-full rounded-md border border-input bg-background px-3 py-2 text-sm focus:border-primary focus:outline-none focus:ring-1 focus:ring-primary" })] }), _jsxs("div", { children: [_jsx("label", { htmlFor: "slug", className: "block text-sm font-medium text-foreground", children: "URL Handle" }), _jsxs("div", { className: "mt-1 flex rounded-md border border-input focus-within:border-primary focus-within:ring-1 focus-within:ring-primary", children: [_jsx("span", { className: "inline-flex items-center rounded-l-md border-r border-input bg-muted px-3 text-sm text-muted-foreground", children: "/categories/" }), _jsx("input", { id: "slug", name: "slug", type: "text", value: formData.slug, onChange: handleChange, placeholder: autoSlug || 'auto-generated', className: "flex-1 rounded-r-md border-0 bg-background px-3 py-2 text-sm focus:outline-none" })] }), _jsx("p", { className: "mt-1 text-xs text-muted-foreground", children: "Leave blank to auto-generate from category name" })] }), _jsxs("div", { children: [_jsx("label", { htmlFor: "description", className: "block text-sm font-medium text-foreground", children: "Description" }), _jsx("textarea", { id: "description", name: "description", value: formData.description, onChange: handleChange, rows: 3, placeholder: "Brief description of this category...", className: "mt-1 block w-full rounded-md border border-input bg-background px-3 py-2 text-sm focus:border-primary focus:outline-none focus:ring-1 focus:ring-primary" })] })] })] }), _jsxs("div", { className: "rounded-lg border border-border bg-card p-6", children: [_jsx("h3", { className: "mb-4 text-lg font-medium text-foreground", children: "Image" }), _jsxs("div", { className: "space-y-4", children: [_jsxs("div", { children: [_jsx("label", { htmlFor: "image", className: "block text-sm font-medium text-foreground", children: "Image URL" }), _jsx("input", { id: "image", name: "image", type: "url", value: formData.image, onChange: handleChange, placeholder: "https://example.com/category-image.jpg", className: "mt-1 block w-full rounded-md border border-input bg-background px-3 py-2 text-sm focus:border-primary focus:outline-none focus:ring-1 focus:ring-primary" })] }), formData.image && (_jsxs("div", { className: "relative inline-block", children: [_jsx("img", { src: formData.image, alt: "Category preview", className: "h-32 w-32 rounded-lg object-cover border border-border" }), _jsx("button", { type: "button", onClick: () => setFormData((prev) => ({ ...prev, image: '' })), className: "absolute -right-2 -top-2 rounded-full bg-destructive p-1 text-destructive-foreground hover:bg-destructive/90", children: _jsx(Trash2, { className: "h-4 w-4" }) })] })), !formData.image && (_jsxs("div", { className: "rounded-lg border-2 border-dashed border-border p-8 text-center", children: [_jsx(ImagePlus, { className: "mx-auto h-10 w-10 text-muted-foreground" }), _jsx("p", { className: "mt-2 text-sm text-muted-foreground", children: "Add an image URL above" })] }))] })] }), _jsxs("div", { className: "rounded-lg border border-border bg-card p-6", children: [_jsx("h3", { className: "mb-4 text-lg font-medium text-foreground", children: "Organization" }), _jsxs("div", { className: "grid gap-4 sm:grid-cols-2", children: [_jsxs("div", { children: [_jsx("label", { htmlFor: "parentId", className: "block text-sm font-medium text-foreground", children: "Parent Category" }), _jsxs("select", { id: "parentId", name: "parentId", value: formData.parentId, onChange: handleChange, className: "mt-1 block w-full rounded-md border border-input bg-background px-3 py-2 text-sm focus:border-primary focus:outline-none focus:ring-1 focus:ring-primary", children: [_jsx("option", { value: "", children: "None (Top Level)" }), parentOptions.map((cat) => (_jsx("option", { value: cat.id, children: cat.name }, cat.id)))] }), _jsx("p", { className: "mt-1 text-xs text-muted-foreground", children: "Make this a subcategory of another category" })] }), _jsxs("div", { children: [_jsx("label", { htmlFor: "order", className: "block text-sm font-medium text-foreground", children: "Display Order" }), _jsx("input", { id: "order", name: "order", type: "number", min: "0", value: formData.order, onChange: handleChange, className: "mt-1 block w-full rounded-md border border-input bg-background px-3 py-2 text-sm focus:border-primary focus:outline-none focus:ring-1 focus:ring-primary" }), _jsx("p", { className: "mt-1 text-xs text-muted-foreground", children: "Lower numbers appear first" })] })] })] }), _jsxs("div", { className: "flex justify-end gap-4", children: [onCancel && (_jsx("button", { type: "button", onClick: onCancel, className: "rounded-md border border-border px-4 py-2 text-sm font-medium text-foreground hover:bg-accent", children: "Cancel" })), _jsx("button", { type: "submit", disabled: isLoading, className: "rounded-md bg-primary px-4 py-2 text-sm font-medium text-primary-foreground hover:bg-primary/90 disabled:opacity-50", children: isLoading ? 'Saving...' : isEditMode ? 'Save Changes' : 'Create Category' })] })] }));
|
|
152
|
+
}
|
|
153
|
+
//# sourceMappingURL=CategoryForm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CategoryForm.js","sourceRoot":"","sources":["../../../src/admin/components/CategoryForm.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
export interface CategorySelectProps {
|
|
2
|
+
/** Currently selected category ID */
|
|
3
|
+
value?: string | null;
|
|
4
|
+
/** Callback when category is selected */
|
|
5
|
+
onChange: (categoryId: string | null) => void;
|
|
6
|
+
/** Placeholder text */
|
|
7
|
+
placeholder?: string;
|
|
8
|
+
/** Show "Add new category" option */
|
|
9
|
+
showAddNew?: boolean;
|
|
10
|
+
/** Callback when "Add new" is clicked */
|
|
11
|
+
onAddNew?: () => void;
|
|
12
|
+
/** Disabled state */
|
|
13
|
+
disabled?: boolean;
|
|
14
|
+
/** Additional CSS classes */
|
|
15
|
+
className?: string;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Category selector with hierarchical dropdown.
|
|
19
|
+
*
|
|
20
|
+
* @example
|
|
21
|
+
* ```tsx
|
|
22
|
+
* <CategorySelect
|
|
23
|
+
* value={categoryId}
|
|
24
|
+
* onChange={setCategoryId}
|
|
25
|
+
* placeholder="Select a category"
|
|
26
|
+
* showAddNew
|
|
27
|
+
* onAddNew={() => setShowCategoryModal(true)}
|
|
28
|
+
* />
|
|
29
|
+
* ```
|
|
30
|
+
*/
|
|
31
|
+
export declare function CategorySelect({ value, onChange, placeholder, showAddNew, onAddNew, disabled, className, }: CategorySelectProps): import("react/jsx-runtime").JSX.Element;
|
|
32
|
+
//# sourceMappingURL=CategorySelect.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CategorySelect.d.ts","sourceRoot":"","sources":["../../../src/admin/components/CategorySelect.tsx"],"names":[],"mappings":"AAgBA,MAAM,WAAW,mBAAmB;IAClC,qCAAqC;IACrC,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACrB,yCAAyC;IACzC,QAAQ,EAAE,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAA;IAC7C,uBAAuB;IACvB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,qCAAqC;IACrC,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB,yCAAyC;IACzC,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAA;IACrB,qBAAqB;IACrB,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,6BAA6B;IAC7B,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAWD;;;;;;;;;;;;;GAaG;AACH,wBAAgB,cAAc,CAAC,EAC7B,KAAK,EACL,QAAQ,EACR,WAA+B,EAC/B,UAAkB,EAClB,QAAQ,EACR,QAAgB,EAChB,SAAc,GACf,EAAE,mBAAmB,2CAkOrB"}
|