@rovela-ai/sdk 0.1.19 → 0.1.20

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.
Files changed (60) hide show
  1. package/dist/admin/components/AdminNav.d.ts.map +1 -1
  2. package/dist/admin/components/AdminNav.js +5 -0
  3. package/dist/admin/components/AdminNav.js.map +1 -1
  4. package/dist/admin/components/CategoryForm.d.ts +30 -0
  5. package/dist/admin/components/CategoryForm.d.ts.map +1 -0
  6. package/dist/admin/components/CategoryForm.js +153 -0
  7. package/dist/admin/components/CategoryForm.js.map +1 -0
  8. package/dist/admin/components/CategorySelect.d.ts +32 -0
  9. package/dist/admin/components/CategorySelect.d.ts.map +1 -0
  10. package/dist/admin/components/CategorySelect.js +148 -0
  11. package/dist/admin/components/CategorySelect.js.map +1 -0
  12. package/dist/admin/components/ProductForm.d.ts +2 -2
  13. package/dist/admin/components/ProductForm.d.ts.map +1 -1
  14. package/dist/admin/components/ProductForm.js +125 -9
  15. package/dist/admin/components/ProductForm.js.map +1 -1
  16. package/dist/admin/components/SEOPreview.d.ts +32 -0
  17. package/dist/admin/components/SEOPreview.d.ts.map +1 -0
  18. package/dist/admin/components/SEOPreview.js +30 -0
  19. package/dist/admin/components/SEOPreview.js.map +1 -0
  20. package/dist/admin/components/TagInput.d.ts +29 -0
  21. package/dist/admin/components/TagInput.d.ts.map +1 -0
  22. package/dist/admin/components/TagInput.js +73 -0
  23. package/dist/admin/components/TagInput.js.map +1 -0
  24. package/dist/admin/components/VariantManager.d.ts +42 -0
  25. package/dist/admin/components/VariantManager.d.ts.map +1 -0
  26. package/dist/admin/components/VariantManager.js +175 -0
  27. package/dist/admin/components/VariantManager.js.map +1 -0
  28. package/dist/admin/components/index.d.ts +5 -0
  29. package/dist/admin/components/index.d.ts.map +1 -1
  30. package/dist/admin/components/index.js +11 -0
  31. package/dist/admin/components/index.js.map +1 -1
  32. package/dist/admin/hooks/index.d.ts +2 -0
  33. package/dist/admin/hooks/index.d.ts.map +1 -1
  34. package/dist/admin/hooks/index.js +1 -0
  35. package/dist/admin/hooks/index.js.map +1 -1
  36. package/dist/admin/hooks/useAdminCategories.d.ts +36 -0
  37. package/dist/admin/hooks/useAdminCategories.d.ts.map +1 -0
  38. package/dist/admin/hooks/useAdminCategories.js +217 -0
  39. package/dist/admin/hooks/useAdminCategories.js.map +1 -0
  40. package/dist/admin/index.d.ts +3 -2
  41. package/dist/admin/index.d.ts.map +1 -1
  42. package/dist/admin/index.js +5 -1
  43. package/dist/admin/index.js.map +1 -1
  44. package/dist/core/StoreSettingsProvider.d.ts +104 -0
  45. package/dist/core/StoreSettingsProvider.d.ts.map +1 -0
  46. package/dist/core/StoreSettingsProvider.js +195 -0
  47. package/dist/core/StoreSettingsProvider.js.map +1 -0
  48. package/dist/core/api/index.d.ts +7 -0
  49. package/dist/core/api/index.d.ts.map +1 -0
  50. package/dist/core/api/index.js +7 -0
  51. package/dist/core/api/index.js.map +1 -0
  52. package/dist/core/api/settings.d.ts +42 -0
  53. package/dist/core/api/settings.d.ts.map +1 -0
  54. package/dist/core/api/settings.js +74 -0
  55. package/dist/core/api/settings.js.map +1 -0
  56. package/dist/core/index.d.ts +2 -0
  57. package/dist/core/index.d.ts.map +1 -1
  58. package/dist/core/index.js +2 -0
  59. package/dist/core/index.js.map +1 -1
  60. package/package.json +5 -1
@@ -1 +1 @@
1
- {"version":3,"file":"AdminNav.d.ts","sourceRoot":"","sources":["../../../src/admin/components/AdminNav.tsx"],"names":[],"mappings":"AAEA;;;;GAIG;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,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,uBAAuB;IACvB,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAuED;;;;;;;GAOG;AACH,wBAAgB,QAAQ,CAAC,EACvB,SAAS,EACT,KAAuB,EACvB,SAAmB,EACnB,IAAI,EACJ,SAAc,GACf,EAAE,aAAa,2CA4Cf"}
1
+ {"version":3,"file":"AdminNav.d.ts","sourceRoot":"","sources":["../../../src/admin/components/AdminNav.tsx"],"names":[],"mappings":"AAEA;;;;GAIG;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,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,uBAAuB;IACvB,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAiFD;;;;;;;GAOG;AACH,wBAAgB,QAAQ,CAAC,EACvB,SAAS,EACT,KAAuB,EACvB,SAAmB,EACnB,IAAI,EACJ,SAAc,GACf,EAAE,aAAa,2CA4Cf"}
@@ -6,6 +6,7 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
6
6
  const defaultNavItems = [
7
7
  { id: 'dashboard', label: 'Dashboard', href: '/admin' },
8
8
  { id: 'products', label: 'Products', href: '/admin/products' },
9
+ { id: 'categories', label: 'Categories', href: '/admin/categories' },
9
10
  { id: 'orders', label: 'Orders', href: '/admin/orders' },
10
11
  { id: 'customers', label: 'Customers', href: '/admin/customers' },
11
12
  { id: 'settings', label: 'Settings', href: '/admin/settings' },
@@ -19,6 +20,9 @@ function DashboardIcon() {
19
20
  function ProductsIcon() {
20
21
  return (_jsx("svg", { className: "h-5 w-5", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", children: _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 1.5, d: "M20 7l-8-4-8 4m16 0l-8 4m8-4v10l-8 4m0-10L4 7m8 4v10M4 7v10l8 4" }) }));
21
22
  }
23
+ function CategoriesIcon() {
24
+ return (_jsx("svg", { className: "h-5 w-5", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", children: _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 1.5, d: "M3 7v10a2 2 0 002 2h14a2 2 0 002-2V9a2 2 0 00-2-2h-6l-2-2H5a2 2 0 00-2 2z" }) }));
25
+ }
22
26
  function OrdersIcon() {
23
27
  return (_jsx("svg", { className: "h-5 w-5", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", children: _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 1.5, d: "M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-3 7h3m-3 4h3m-6-4h.01M9 16h.01" }) }));
24
28
  }
@@ -31,6 +35,7 @@ function SettingsIcon() {
31
35
  const iconMap = {
32
36
  dashboard: DashboardIcon,
33
37
  products: ProductsIcon,
38
+ categories: CategoriesIcon,
34
39
  orders: OrdersIcon,
35
40
  customers: CustomersIcon,
36
41
  settings: SettingsIcon,
@@ -1 +1 @@
1
- {"version":3,"file":"AdminNav.js","sourceRoot":"","sources":["../../../src/admin/components/AdminNav.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"AdminNav.js","sourceRoot":"","sources":["../../../src/admin/components/AdminNav.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAA;;AAkCZ,gFAAgF;AAChF,2BAA2B;AAC3B,gFAAgF;AAEhF,MAAM,eAAe,GAAc;IACjC,EAAE,EAAE,EAAE,WAAW,EAAE,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,QAAQ,EAAE;IACvD,EAAE,EAAE,EAAE,UAAU,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,iBAAiB,EAAE;IAC9D,EAAE,EAAE,EAAE,YAAY,EAAE,KAAK,EAAE,YAAY,EAAE,IAAI,EAAE,mBAAmB,EAAE;IACpE,EAAE,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,eAAe,EAAE;IACxD,EAAE,EAAE,EAAE,WAAW,EAAE,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,kBAAkB,EAAE;IACjE,EAAE,EAAE,EAAE,UAAU,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,iBAAiB,EAAE;CAC/D,CAAA;AAED,gFAAgF;AAChF,2CAA2C;AAC3C,gFAAgF;AAEhF,SAAS,aAAa;IACpB,OAAO,CACL,cAAK,SAAS,EAAC,SAAS,EAAC,IAAI,EAAC,MAAM,EAAC,OAAO,EAAC,WAAW,EAAC,MAAM,EAAC,cAAc,YAC5E,eAAM,aAAa,EAAC,OAAO,EAAC,cAAc,EAAC,OAAO,EAAC,WAAW,EAAE,GAAG,EAAE,CAAC,EAAC,sQAAsQ,GAAG,GAC5U,CACP,CAAA;AACH,CAAC;AAED,SAAS,YAAY;IACnB,OAAO,CACL,cAAK,SAAS,EAAC,SAAS,EAAC,IAAI,EAAC,MAAM,EAAC,OAAO,EAAC,WAAW,EAAC,MAAM,EAAC,cAAc,YAC5E,eAAM,aAAa,EAAC,OAAO,EAAC,cAAc,EAAC,OAAO,EAAC,WAAW,EAAE,GAAG,EAAE,CAAC,EAAC,iEAAiE,GAAG,GACvI,CACP,CAAA;AACH,CAAC;AAED,SAAS,cAAc;IACrB,OAAO,CACL,cAAK,SAAS,EAAC,SAAS,EAAC,IAAI,EAAC,MAAM,EAAC,OAAO,EAAC,WAAW,EAAC,MAAM,EAAC,cAAc,YAC5E,eAAM,aAAa,EAAC,OAAO,EAAC,cAAc,EAAC,OAAO,EAAC,WAAW,EAAE,GAAG,EAAE,CAAC,EAAC,2EAA2E,GAAG,GACjJ,CACP,CAAA;AACH,CAAC;AAED,SAAS,UAAU;IACjB,OAAO,CACL,cAAK,SAAS,EAAC,SAAS,EAAC,IAAI,EAAC,MAAM,EAAC,OAAO,EAAC,WAAW,EAAC,MAAM,EAAC,cAAc,YAC5E,eAAM,aAAa,EAAC,OAAO,EAAC,cAAc,EAAC,OAAO,EAAC,WAAW,EAAE,GAAG,EAAE,CAAC,EAAC,iKAAiK,GAAG,GACvO,CACP,CAAA;AACH,CAAC;AAED,SAAS,aAAa;IACpB,OAAO,CACL,cAAK,SAAS,EAAC,SAAS,EAAC,IAAI,EAAC,MAAM,EAAC,OAAO,EAAC,WAAW,EAAC,MAAM,EAAC,cAAc,YAC5E,eAAM,aAAa,EAAC,OAAO,EAAC,cAAc,EAAC,OAAO,EAAC,WAAW,EAAE,GAAG,EAAE,CAAC,EAAC,+GAA+G,GAAG,GACrL,CACP,CAAA;AACH,CAAC;AAED,SAAS,YAAY;IACnB,OAAO,CACL,eAAK,SAAS,EAAC,SAAS,EAAC,IAAI,EAAC,MAAM,EAAC,OAAO,EAAC,WAAW,EAAC,MAAM,EAAC,cAAc,aAC5E,eAAM,aAAa,EAAC,OAAO,EAAC,cAAc,EAAC,OAAO,EAAC,WAAW,EAAE,GAAG,EAAE,CAAC,EAAC,qeAAqe,GAAG,EAC/iB,eAAM,aAAa,EAAC,OAAO,EAAC,cAAc,EAAC,OAAO,EAAC,WAAW,EAAE,GAAG,EAAE,CAAC,EAAC,kCAAkC,GAAG,IACxG,CACP,CAAA;AACH,CAAC;AAED,MAAM,OAAO,GAA6C;IACxD,SAAS,EAAE,aAAa;IACxB,QAAQ,EAAE,YAAY;IACtB,UAAU,EAAE,cAAc;IAC1B,MAAM,EAAE,UAAU;IAClB,SAAS,EAAE,aAAa;IACxB,QAAQ,EAAE,YAAY;CACvB,CAAA;AAED,gFAAgF;AAChF,YAAY;AACZ,gFAAgF;AAEhF;;;;;;;GAOG;AACH,MAAM,UAAU,QAAQ,CAAC,EACvB,SAAS,EACT,KAAK,GAAG,eAAe,EACvB,SAAS,GAAG,OAAO,EACnB,IAAI,EACJ,SAAS,GAAG,EAAE,GACA;IACd,OAAO,CACL,eAAK,SAAS,EAAE,4DAA4D,SAAS,EAAE,aAErF,cAAK,SAAS,EAAC,oDAAoD,YAChE,IAAI,IAAI,CACP,eAAM,SAAS,EAAC,uCAAuC,YAAE,SAAS,GAAQ,CAC3E,GACG,EAGN,cAAK,SAAS,EAAC,6BAA6B,YAC1C,aAAI,SAAS,EAAC,gBAAgB,YAC3B,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;wBAClB,MAAM,QAAQ,GAAG,SAAS,KAAK,IAAI,CAAC,EAAE,CAAA;wBACtC,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;wBAE1C,OAAO,CACL,uBACE,aACE,IAAI,EAAE,IAAI,CAAC,IAAI,EACf,SAAS,EAAE,sFACT,QAAQ;oCACN,CAAC,CAAC,oCAAoC;oCACtC,CAAC,CAAC,oEACN,EAAE,aAED,OAAO,IAAI,KAAK,UAAU,CAAC,CAAC,CAAC,KAAC,IAAI,KAAG,CAAC,CAAC,CAAC,IAAI,EAC5C,IAAI,CAAC,KAAK,IACT,IAXG,IAAI,CAAC,EAAE,CAYX,CACN,CAAA;oBACH,CAAC,CAAC,GACC,GACD,EAGN,cAAK,SAAS,EAAC,4BAA4B,YACzC,YAAG,SAAS,EAAC,+BAA+B,kCAExC,GACA,IACF,CACP,CAAA;AACH,CAAC"}
@@ -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"}
@@ -0,0 +1,148 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ /**
4
+ * @rovela/sdk/admin/components/CategorySelect
5
+ *
6
+ * Category dropdown selector with tree structure and search.
7
+ */
8
+ import { useState, useEffect, useRef, useCallback } from 'react';
9
+ import { ChevronDown, X, FolderOpen, Plus, Search } from 'lucide-react';
10
+ // =============================================================================
11
+ // Component
12
+ // =============================================================================
13
+ /**
14
+ * Category selector with hierarchical dropdown.
15
+ *
16
+ * @example
17
+ * ```tsx
18
+ * <CategorySelect
19
+ * value={categoryId}
20
+ * onChange={setCategoryId}
21
+ * placeholder="Select a category"
22
+ * showAddNew
23
+ * onAddNew={() => setShowCategoryModal(true)}
24
+ * />
25
+ * ```
26
+ */
27
+ export function CategorySelect({ value, onChange, placeholder = 'Select category', showAddNew = false, onAddNew, disabled = false, className = '', }) {
28
+ const [isOpen, setIsOpen] = useState(false);
29
+ const [search, setSearch] = useState('');
30
+ const [categories, setCategories] = useState([]);
31
+ const [isLoading, setIsLoading] = useState(false);
32
+ const containerRef = useRef(null);
33
+ const searchInputRef = useRef(null);
34
+ // Fetch categories
35
+ useEffect(() => {
36
+ const fetchCategories = async () => {
37
+ setIsLoading(true);
38
+ try {
39
+ const response = await fetch('/api/admin/categories?flat=true');
40
+ if (response.ok) {
41
+ const data = await response.json();
42
+ setCategories(data.data || []);
43
+ }
44
+ }
45
+ catch (error) {
46
+ console.error('[CategorySelect] Failed to fetch categories:', error);
47
+ }
48
+ finally {
49
+ setIsLoading(false);
50
+ }
51
+ };
52
+ fetchCategories();
53
+ }, []);
54
+ // Build tree with levels
55
+ const buildTreeWithLevels = useCallback((items) => {
56
+ const map = new Map();
57
+ const roots = [];
58
+ // First pass: create nodes
59
+ for (const cat of items) {
60
+ map.set(cat.id, { ...cat, children: [], level: 0 });
61
+ }
62
+ // Second pass: build tree and assign levels
63
+ for (const cat of items) {
64
+ const node = map.get(cat.id);
65
+ if (cat.parentId && map.has(cat.parentId)) {
66
+ const parent = map.get(cat.parentId);
67
+ node.level = parent.level + 1;
68
+ parent.children.push(node);
69
+ }
70
+ else {
71
+ roots.push(node);
72
+ }
73
+ }
74
+ // Sort by order
75
+ const sortByOrder = (a, b) => a.order - b.order;
76
+ roots.sort(sortByOrder);
77
+ for (const node of map.values()) {
78
+ node.children.sort(sortByOrder);
79
+ }
80
+ return roots;
81
+ }, []);
82
+ // Flatten tree for display
83
+ const flattenTree = useCallback((tree) => {
84
+ const result = [];
85
+ const traverse = (nodes) => {
86
+ for (const node of nodes) {
87
+ result.push(node);
88
+ traverse(node.children);
89
+ }
90
+ };
91
+ traverse(tree);
92
+ return result;
93
+ }, []);
94
+ // Get flat list with levels
95
+ const flatListWithLevels = flattenTree(buildTreeWithLevels(categories));
96
+ // Filter by search
97
+ const filteredCategories = search
98
+ ? flatListWithLevels.filter((cat) => cat.name.toLowerCase().includes(search.toLowerCase()))
99
+ : flatListWithLevels;
100
+ // Get selected category
101
+ const selectedCategory = categories.find((cat) => cat.id === value);
102
+ // Close on outside click
103
+ useEffect(() => {
104
+ const handleClickOutside = (event) => {
105
+ if (containerRef.current && !containerRef.current.contains(event.target)) {
106
+ setIsOpen(false);
107
+ setSearch('');
108
+ }
109
+ };
110
+ document.addEventListener('mousedown', handleClickOutside);
111
+ return () => document.removeEventListener('mousedown', handleClickOutside);
112
+ }, []);
113
+ // Focus search input when opened
114
+ useEffect(() => {
115
+ if (isOpen && searchInputRef.current) {
116
+ searchInputRef.current.focus();
117
+ }
118
+ }, [isOpen]);
119
+ // Handle keyboard navigation
120
+ const handleKeyDown = (e) => {
121
+ if (e.key === 'Escape') {
122
+ setIsOpen(false);
123
+ setSearch('');
124
+ }
125
+ };
126
+ return (_jsxs("div", { ref: containerRef, className: `relative ${className}`, onKeyDown: handleKeyDown, children: [_jsxs("button", { type: "button", onClick: () => !disabled && setIsOpen(!isOpen), disabled: disabled, className: `
127
+ flex w-full items-center justify-between gap-2 rounded-md border px-3 py-2 text-sm
128
+ ${disabled
129
+ ? 'cursor-not-allowed border-input bg-muted text-muted-foreground'
130
+ : 'border-input bg-background text-foreground hover:border-primary focus:border-primary focus:outline-none focus:ring-1 focus:ring-primary'}
131
+ `, children: [_jsx("span", { className: selectedCategory ? 'text-foreground' : 'text-muted-foreground', children: isLoading ? ('Loading...') : selectedCategory ? (_jsxs("span", { className: "flex items-center gap-2", children: [_jsx(FolderOpen, { className: "h-4 w-4 text-muted-foreground" }), selectedCategory.name] })) : (placeholder) }), _jsxs("div", { className: "flex items-center gap-1", children: [selectedCategory && !disabled && (_jsx("button", { type: "button", onClick: (e) => {
132
+ e.stopPropagation();
133
+ onChange(null);
134
+ }, className: "rounded p-0.5 hover:bg-accent", children: _jsx(X, { className: "h-3 w-3 text-muted-foreground" }) })), _jsx(ChevronDown, { className: `h-4 w-4 text-muted-foreground transition-transform ${isOpen ? 'rotate-180' : ''}` })] })] }), isOpen && (_jsxs("div", { className: "absolute z-50 mt-1 w-full rounded-md border border-border bg-popover shadow-lg", children: [_jsx("div", { className: "border-b border-border p-2", children: _jsxs("div", { className: "relative", children: [_jsx(Search, { className: "absolute left-2.5 top-1/2 h-4 w-4 -translate-y-1/2 text-muted-foreground" }), _jsx("input", { ref: searchInputRef, type: "text", value: search, onChange: (e) => setSearch(e.target.value), placeholder: "Search categories...", className: "w-full rounded-md border border-input bg-background py-1.5 pl-8 pr-3 text-sm focus:border-primary focus:outline-none focus:ring-1 focus:ring-primary" })] }) }), _jsx("div", { className: "max-h-60 overflow-auto p-1", children: filteredCategories.length === 0 ? (_jsx("div", { className: "px-3 py-6 text-center text-sm text-muted-foreground", children: search ? 'No categories found' : 'No categories yet' })) : (filteredCategories.map((category) => (_jsxs("button", { type: "button", onClick: () => {
135
+ onChange(category.id);
136
+ setIsOpen(false);
137
+ setSearch('');
138
+ }, className: `
139
+ flex w-full items-center gap-2 rounded-md px-3 py-2 text-left text-sm
140
+ ${category.id === value
141
+ ? 'bg-primary/10 text-primary'
142
+ : 'text-foreground hover:bg-accent'}
143
+ `, style: { paddingLeft: `${12 + category.level * 16}px` }, children: [_jsx(FolderOpen, { className: "h-4 w-4 text-muted-foreground" }), category.name] }, category.id)))) }), showAddNew && onAddNew && (_jsx("div", { className: "border-t border-border p-1", children: _jsxs("button", { type: "button", onClick: () => {
144
+ onAddNew();
145
+ setIsOpen(false);
146
+ }, className: "flex w-full items-center gap-2 rounded-md px-3 py-2 text-left text-sm text-primary hover:bg-accent", children: [_jsx(Plus, { className: "h-4 w-4" }), "Add new category"] }) }))] }))] }));
147
+ }
148
+ //# sourceMappingURL=CategorySelect.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CategorySelect.js","sourceRoot":"","sources":["../../../src/admin/components/CategorySelect.tsx"],"names":[],"mappings":"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"}
@@ -1,11 +1,11 @@
1
1
  import type { ProductFormProps } from '../types';
2
2
  /**
3
- * Product form for create and edit.
3
+ * Enhanced product form for create and edit.
4
4
  *
5
5
  * @example
6
6
  * ```tsx
7
7
  * // Create mode
8
- * <ProductForm onSuccess={(id) => router.push(`/admin/products/${id}`)} />
8
+ * <ProductForm onSuccess={() => router.push('/admin/products')} />
9
9
  *
10
10
  * // Edit mode
11
11
  * <ProductForm
@@ -1 +1 @@
1
- {"version":3,"file":"ProductForm.d.ts","sourceRoot":"","sources":["../../../src/admin/components/ProductForm.tsx"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,gBAAgB,EAAmB,MAAM,UAAU,CAAA;AAMjE;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,WAAW,CAAC,EAC1B,SAAS,EACT,WAAW,EACX,SAAS,EACT,QAAQ,EACR,SAAc,GACf,EAAE,gBAAgB,2CA+SlB"}
1
+ {"version":3,"file":"ProductForm.d.ts","sourceRoot":"","sources":["../../../src/admin/components/ProductForm.tsx"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAE,gBAAgB,EAAoC,MAAM,UAAU,CAAA;AAkBlF;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,WAAW,CAAC,EAC1B,SAAS,EACT,WAAW,EACX,SAAS,EACT,QAAQ,EACR,SAAc,GACf,EAAE,gBAAgB,2CAmvBlB"}