@rovela-ai/sdk 0.7.1 → 0.7.3

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 (91) hide show
  1. package/dist/admin/api/customers.d.ts +32 -1
  2. package/dist/admin/api/customers.d.ts.map +1 -1
  3. package/dist/admin/api/customers.js +116 -0
  4. package/dist/admin/api/customers.js.map +1 -1
  5. package/dist/admin/api/index.d.ts +2 -2
  6. package/dist/admin/api/index.d.ts.map +1 -1
  7. package/dist/admin/api/index.js +2 -2
  8. package/dist/admin/api/index.js.map +1 -1
  9. package/dist/admin/api/orders.d.ts +29 -1
  10. package/dist/admin/api/orders.d.ts.map +1 -1
  11. package/dist/admin/api/orders.js +110 -0
  12. package/dist/admin/api/orders.js.map +1 -1
  13. package/dist/admin/api/products.d.ts +10 -1
  14. package/dist/admin/api/products.d.ts.map +1 -1
  15. package/dist/admin/api/products.js +29 -0
  16. package/dist/admin/api/products.js.map +1 -1
  17. package/dist/admin/components/AdminDateTimePicker.d.ts +13 -0
  18. package/dist/admin/components/AdminDateTimePicker.d.ts.map +1 -0
  19. package/dist/admin/components/AdminDateTimePicker.js +161 -0
  20. package/dist/admin/components/AdminDateTimePicker.js.map +1 -0
  21. package/dist/admin/components/BulkActionBar.d.ts +33 -0
  22. package/dist/admin/components/BulkActionBar.d.ts.map +1 -0
  23. package/dist/admin/components/BulkActionBar.js +10 -0
  24. package/dist/admin/components/BulkActionBar.js.map +1 -0
  25. package/dist/admin/components/CustomerAddressPanel.d.ts.map +1 -1
  26. package/dist/admin/components/CustomerAddressPanel.js +21 -10
  27. package/dist/admin/components/CustomerAddressPanel.js.map +1 -1
  28. package/dist/admin/components/CustomerGroupsManager.d.ts.map +1 -1
  29. package/dist/admin/components/CustomerGroupsManager.js +22 -13
  30. package/dist/admin/components/CustomerGroupsManager.js.map +1 -1
  31. package/dist/admin/components/CustomerTable.d.ts.map +1 -1
  32. package/dist/admin/components/CustomerTable.js +84 -6
  33. package/dist/admin/components/CustomerTable.js.map +1 -1
  34. package/dist/admin/components/DiscountsManager.d.ts.map +1 -1
  35. package/dist/admin/components/DiscountsManager.js +47 -30
  36. package/dist/admin/components/DiscountsManager.js.map +1 -1
  37. package/dist/admin/components/OrderTable.d.ts.map +1 -1
  38. package/dist/admin/components/OrderTable.js +67 -6
  39. package/dist/admin/components/OrderTable.js.map +1 -1
  40. package/dist/admin/components/PaymentMethodsManager.d.ts.map +1 -1
  41. package/dist/admin/components/PaymentMethodsManager.js +28 -18
  42. package/dist/admin/components/PaymentMethodsManager.js.map +1 -1
  43. package/dist/admin/components/ProductTable.d.ts.map +1 -1
  44. package/dist/admin/components/ProductTable.js +49 -51
  45. package/dist/admin/components/ProductTable.js.map +1 -1
  46. package/dist/admin/components/TaxSettings.js +2 -2
  47. package/dist/admin/components/TaxSettings.js.map +1 -1
  48. package/dist/admin/components/index.d.ts +4 -0
  49. package/dist/admin/components/index.d.ts.map +1 -1
  50. package/dist/admin/components/index.js +2 -0
  51. package/dist/admin/components/index.js.map +1 -1
  52. package/dist/admin/hooks/index.d.ts +2 -0
  53. package/dist/admin/hooks/index.d.ts.map +1 -1
  54. package/dist/admin/hooks/index.js +1 -0
  55. package/dist/admin/hooks/index.js.map +1 -1
  56. package/dist/admin/hooks/useAdminCustomers.d.ts.map +1 -1
  57. package/dist/admin/hooks/useAdminCustomers.js +31 -0
  58. package/dist/admin/hooks/useAdminCustomers.js.map +1 -1
  59. package/dist/admin/hooks/useAdminOrders.d.ts.map +1 -1
  60. package/dist/admin/hooks/useAdminOrders.js +30 -0
  61. package/dist/admin/hooks/useAdminOrders.js.map +1 -1
  62. package/dist/admin/hooks/useAdminProducts.d.ts.map +1 -1
  63. package/dist/admin/hooks/useAdminProducts.js +20 -0
  64. package/dist/admin/hooks/useAdminProducts.js.map +1 -1
  65. package/dist/admin/hooks/useBulkSelection.d.ts +32 -0
  66. package/dist/admin/hooks/useBulkSelection.d.ts.map +1 -0
  67. package/dist/admin/hooks/useBulkSelection.js +74 -0
  68. package/dist/admin/hooks/useBulkSelection.js.map +1 -0
  69. package/dist/admin/index.d.ts +3 -3
  70. package/dist/admin/index.d.ts.map +1 -1
  71. package/dist/admin/index.js +4 -4
  72. package/dist/admin/index.js.map +1 -1
  73. package/dist/admin/styles/admin-theme.css +173 -1
  74. package/dist/admin/types.d.ts +12 -0
  75. package/dist/admin/types.d.ts.map +1 -1
  76. package/dist/checkout/components/CheckoutFlow.d.ts.map +1 -1
  77. package/dist/checkout/components/CheckoutFlow.js +33 -29
  78. package/dist/checkout/components/CheckoutFlow.js.map +1 -1
  79. package/dist/core/db/index.d.ts +1 -1
  80. package/dist/core/db/index.d.ts.map +1 -1
  81. package/dist/core/db/index.js +1 -1
  82. package/dist/core/db/index.js.map +1 -1
  83. package/dist/core/db/queries.d.ts +90 -22
  84. package/dist/core/db/queries.d.ts.map +1 -1
  85. package/dist/core/db/queries.js +28 -0
  86. package/dist/core/db/queries.js.map +1 -1
  87. package/dist/core/server/index.d.ts +1 -1
  88. package/dist/core/server/index.d.ts.map +1 -1
  89. package/dist/core/server/index.js +1 -1
  90. package/dist/core/server/index.js.map +1 -1
  91. package/package.json +1 -1
@@ -11,6 +11,7 @@ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-run
11
11
  import { useState } from 'react';
12
12
  import { Tags, Plus, Pencil, Trash2, Check, X } from 'lucide-react';
13
13
  import { useAdminCustomerGroups } from '../hooks/useAdminCustomerGroups';
14
+ import { DeleteConfirmDialog } from './DeleteConfirmDialog';
14
15
  export function CustomerGroupsManager({ className = '', onChanged }) {
15
16
  const { groups, isLoading, error, createGroup, updateGroup, deleteGroup } = useAdminCustomerGroups();
16
17
  const [newName, setNewName] = useState('');
@@ -18,8 +19,9 @@ export function CustomerGroupsManager({ className = '', onChanged }) {
18
19
  const [isCreating, setIsCreating] = useState(false);
19
20
  const [editing, setEditing] = useState(null);
20
21
  const [isSavingEdit, setIsSavingEdit] = useState(false);
21
- const [pendingDelete, setPendingDelete] = useState(null);
22
- const [isDeletingId, setIsDeletingId] = useState(null);
22
+ const [deleteTarget, setDeleteTarget] = useState(null);
23
+ const [isDeleting, setIsDeleting] = useState(false);
24
+ const [deleteError, setDeleteError] = useState(null);
23
25
  const [actionError, setActionError] = useState(null);
24
26
  async function handleCreate() {
25
27
  if (!newName.trim())
@@ -66,21 +68,28 @@ export function CustomerGroupsManager({ className = '', onChanged }) {
66
68
  else
67
69
  onChanged?.();
68
70
  }
69
- async function handleDelete(id) {
70
- setIsDeletingId(id);
71
- setActionError(null);
72
- const res = await deleteGroup(id);
73
- setIsDeletingId(null);
74
- setPendingDelete(null);
75
- if (!res.success)
76
- setActionError(res.error || 'Failed to delete group');
77
- else
71
+ async function handleDeleteConfirm() {
72
+ if (!deleteTarget)
73
+ return;
74
+ setIsDeleting(true);
75
+ setDeleteError(null);
76
+ const res = await deleteGroup(deleteTarget.id);
77
+ setIsDeleting(false);
78
+ if (res.success) {
79
+ setDeleteTarget(null);
78
80
  onChanged?.();
81
+ }
82
+ else {
83
+ setDeleteError(res.error || 'Failed to delete group');
84
+ }
79
85
  }
80
- return (_jsxs("div", { className: `admin-card overflow-hidden ${className}`, children: [_jsxs("div", { className: "admin-card-header flex items-center gap-2", children: [_jsx(Tags, { className: "h-4 w-4 admin-text-muted" }), _jsx("h2", { className: "admin-card-title", children: "Customer groups" })] }), _jsxs("div", { className: "p-4", children: [_jsx("p", { className: "mb-4 text-sm admin-text-muted", children: "Group your customers by type (Company, Individual, VIP\u2026). Groups show as a tag on the customer profile and can be used to filter the list. Deleting a group never deletes its customers \u2014 they just become ungrouped." }), (error || actionError) && (_jsx("div", { className: "admin-alert-inline admin-alert-inline-error mb-4", children: actionError || error })), isLoading ? (_jsx("div", { className: "space-y-2", children: Array.from({ length: 2 }).map((_, i) => (_jsx("div", { className: "admin-skeleton admin-skeleton-lg w-full rounded" }, i))) })) : groups.length === 0 ? (_jsx("p", { className: "mb-4 text-sm admin-text-muted", children: "No groups yet \u2014 create your first below." })) : (_jsx("ul", { className: "mb-4 divide-y divide-[hsl(var(--admin-border))]", children: groups.map((group) => (_jsx("li", { className: "flex items-center gap-3 py-2.5", children: editing?.id === group.id ? (_jsxs(_Fragment, { children: [_jsx("input", { className: "admin-input flex-1", value: editing.name, onChange: (e) => setEditing({ ...editing, name: e.target.value }), placeholder: "Group name", maxLength: 100 }), _jsx("input", { className: "admin-input flex-1", value: editing.description, onChange: (e) => setEditing({ ...editing, description: e.target.value }), placeholder: "Description (optional)", maxLength: 255 }), _jsxs("button", { onClick: handleSaveEdit, disabled: isSavingEdit || !editing.name.trim(), className: "admin-btn admin-btn-primary admin-btn-sm inline-flex items-center gap-1 disabled:opacity-50", children: [_jsx(Check, { className: "h-3 w-3" }), "Save"] }), _jsx("button", { onClick: () => setEditing(null), disabled: isSavingEdit, className: "admin-btn admin-btn-secondary admin-btn-sm inline-flex items-center gap-1", children: _jsx(X, { className: "h-3 w-3" }) })] })) : (_jsxs(_Fragment, { children: [_jsx("span", { className: "admin-badge admin-badge-neutral", children: group.name }), _jsx("span", { className: "flex-1 truncate text-sm admin-text-muted", children: group.description || '' }), _jsxs("span", { className: "text-xs admin-text-muted", children: [group.customerCount ?? 0, " customer", (group.customerCount ?? 0) !== 1 ? 's' : ''] }), _jsxs("label", { className: "flex items-center gap-1.5 text-xs admin-text-muted", children: [_jsx("input", { type: "checkbox", checked: group.isActive, onChange: () => handleToggleActive(group) }), "Active"] }), _jsxs("button", { onClick: () => setEditing({
86
+ return (_jsxs("div", { className: `admin-card overflow-hidden ${className}`, children: [_jsxs("div", { className: "admin-card-header flex items-center gap-2", children: [_jsx(Tags, { className: "h-4 w-4 admin-text-muted" }), _jsx("h2", { className: "admin-card-title", children: "Customer groups" })] }), _jsxs("div", { className: "p-4", children: [_jsx("p", { className: "mb-4 text-sm admin-text-muted", children: "Group your customers by type (Company, Individual, VIP\u2026). Groups show as a tag on the customer profile and can be used to filter the list. Deleting a group never deletes its customers \u2014 they just become ungrouped." }), (error || actionError) && (_jsx("div", { className: "admin-alert-inline admin-alert-inline-error mb-4", children: actionError || error })), isLoading ? (_jsx("div", { className: "space-y-2", children: Array.from({ length: 2 }).map((_, i) => (_jsx("div", { className: "admin-skeleton admin-skeleton-lg w-full rounded" }, i))) })) : groups.length === 0 ? (_jsx("p", { className: "mb-4 text-sm admin-text-muted", children: "No groups yet \u2014 create your first below." })) : (_jsx("ul", { className: "mb-4 divide-y divide-[hsl(var(--admin-border))]", children: groups.map((group) => (_jsx("li", { className: "flex items-center gap-3 py-2.5", children: editing?.id === group.id ? (_jsxs(_Fragment, { children: [_jsx("input", { className: "admin-input flex-1", value: editing.name, onChange: (e) => setEditing({ ...editing, name: e.target.value }), placeholder: "Group name", maxLength: 100 }), _jsx("input", { className: "admin-input flex-1", value: editing.description, onChange: (e) => setEditing({ ...editing, description: e.target.value }), placeholder: "Description (optional)", maxLength: 255 }), _jsxs("button", { onClick: handleSaveEdit, disabled: isSavingEdit || !editing.name.trim(), className: "admin-btn admin-btn-primary admin-btn-sm inline-flex items-center gap-1 disabled:opacity-50", children: [_jsx(Check, { className: "h-3 w-3" }), "Save"] }), _jsx("button", { onClick: () => setEditing(null), disabled: isSavingEdit, className: "admin-btn admin-btn-secondary admin-btn-sm inline-flex items-center gap-1", children: _jsx(X, { className: "h-3 w-3" }) })] })) : (_jsxs(_Fragment, { children: [_jsx("span", { className: "admin-badge admin-badge-neutral", children: group.name }), _jsx("span", { className: "flex-1 truncate text-sm admin-text-muted", children: group.description || '' }), _jsxs("span", { className: "text-xs admin-text-muted", children: [group.customerCount ?? 0, " customer", (group.customerCount ?? 0) !== 1 ? 's' : ''] }), _jsxs("label", { className: "flex items-center gap-1.5 text-xs admin-text-muted", children: [_jsx("input", { type: "checkbox", className: "admin-checkbox", checked: group.isActive, onChange: () => handleToggleActive(group) }), "Active"] }), _jsxs("button", { onClick: () => setEditing({
81
87
  id: group.id,
82
88
  name: group.name,
83
89
  description: group.description || '',
84
- }), className: "admin-action-link inline-flex items-center gap-1", children: [_jsx(Pencil, { className: "h-3 w-3" }), "Edit"] }), pendingDelete === group.id ? (_jsxs("span", { className: "inline-flex items-center gap-2 text-xs", children: [_jsx("span", { className: "admin-text-muted", children: "Delete?" }), _jsx("button", { onClick: () => handleDelete(group.id), disabled: isDeletingId === group.id, className: "admin-error-text font-medium disabled:opacity-50", children: isDeletingId === group.id ? 'Deleting…' : 'Yes' }), _jsx("button", { onClick: () => setPendingDelete(null), className: "admin-text-muted", children: "No" })] })) : (_jsxs("button", { onClick: () => setPendingDelete(group.id), className: "admin-action-link inline-flex items-center gap-1", children: [_jsx(Trash2, { className: "h-3 w-3" }), "Delete"] }))] })) }, group.id))) })), _jsxs("div", { className: "flex flex-wrap items-center gap-2 border-t border-[hsl(var(--admin-border))] pt-4", children: [_jsx("input", { className: "admin-input flex-1 min-w-[160px]", value: newName, onChange: (e) => setNewName(e.target.value), placeholder: "New group name (e.g. Company)", maxLength: 100 }), _jsx("input", { className: "admin-input flex-1 min-w-[200px]", value: newDescription, onChange: (e) => setNewDescription(e.target.value), placeholder: "Description (optional)", maxLength: 255 }), _jsxs("button", { onClick: handleCreate, disabled: isCreating || !newName.trim(), className: "admin-btn admin-btn-primary admin-btn-sm inline-flex items-center gap-1 disabled:opacity-50", children: [_jsx(Plus, { className: "h-3 w-3" }), isCreating ? 'Adding…' : 'Add group'] })] })] })] }));
90
+ }), className: "admin-action-link inline-flex items-center gap-1", children: [_jsx(Pencil, { className: "h-3 w-3" }), "Edit"] }), _jsxs("button", { onClick: () => {
91
+ setDeleteError(null);
92
+ setDeleteTarget({ id: group.id, name: group.name });
93
+ }, className: "admin-action-link inline-flex items-center gap-1", children: [_jsx(Trash2, { className: "h-3 w-3" }), "Delete"] })] })) }, group.id))) })), _jsxs("div", { className: "flex flex-wrap items-center gap-2 border-t border-[hsl(var(--admin-border))] pt-4", children: [_jsx("input", { className: "admin-input flex-1 min-w-[160px]", value: newName, onChange: (e) => setNewName(e.target.value), placeholder: "New group name (e.g. Company)", maxLength: 100 }), _jsx("input", { className: "admin-input flex-1 min-w-[200px]", value: newDescription, onChange: (e) => setNewDescription(e.target.value), placeholder: "Description (optional)", maxLength: 255 }), _jsxs("button", { onClick: handleCreate, disabled: isCreating || !newName.trim(), className: "admin-btn admin-btn-primary admin-btn-sm inline-flex items-center gap-1 disabled:opacity-50", children: [_jsx(Plus, { className: "h-3 w-3" }), isCreating ? 'Adding…' : 'Add group'] })] })] }), _jsx(DeleteConfirmDialog, { isOpen: !!deleteTarget, title: "Delete Customer Group", itemName: deleteTarget?.name || 'group', itemType: "group", description: `Are you sure you want to delete "${deleteTarget?.name || ''}"? Its customers are never deleted — they just become ungrouped.`, isDeleting: isDeleting, error: deleteError, onConfirm: handleDeleteConfirm, onCancel: () => setDeleteTarget(null) })] }));
85
94
  }
86
95
  //# sourceMappingURL=CustomerGroupsManager.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"CustomerGroupsManager.js","sourceRoot":"","sources":["../../../src/admin/components/CustomerGroupsManager.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"CustomerGroupsManager.js","sourceRoot":"","sources":["../../../src/admin/components/CustomerGroupsManager.tsx"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"CustomerTable.d.ts","sourceRoot":"","sources":["../../../src/admin/components/CustomerTable.tsx"],"names":[],"mappings":"AAgBA,OAAO,KAAK,EAAE,kBAAkB,EAAyB,MAAM,UAAU,CAAA;AA8FzE;;;;;;;;;GASG;AACH,wBAAgB,aAAa,CAAC,EAC5B,QAAa,EACb,eAAe,EACf,SAAc,GACf,EAAE,kBAAkB,2CAiQpB"}
1
+ {"version":3,"file":"CustomerTable.d.ts","sourceRoot":"","sources":["../../../src/admin/components/CustomerTable.tsx"],"names":[],"mappings":"AAmBA,OAAO,KAAK,EAAE,kBAAkB,EAAyB,MAAM,UAAU,CAAA;AAgHzE;;;;;;;;;GASG;AACH,wBAAgB,aAAa,CAAC,EAC5B,QAAa,EACb,eAAe,EACf,SAAc,GACf,EAAE,kBAAkB,2CA4apB"}
@@ -10,9 +10,14 @@ import { useState, useEffect, useCallback, useMemo } from 'react';
10
10
  import { Search, Users, Mail, Calendar, CheckCircle, Clock, Trash2, Tags } from 'lucide-react';
11
11
  import { useAdminCustomers } from '../hooks/useAdminCustomers';
12
12
  import { useAdminCustomerGroups } from '../hooks/useAdminCustomerGroups';
13
+ import { useBulkSelection, runChunkedBulk } from '../hooks/useBulkSelection';
13
14
  import { useStoreSettingsOptional } from '../../core/StoreSettingsProvider';
15
+ import { AdminSelect } from './AdminSelect';
16
+ import { BulkActionBar } from './BulkActionBar';
14
17
  import { DeleteConfirmDialog } from './DeleteConfirmDialog';
15
18
  import { CustomerGroupsManager } from './CustomerGroupsManager';
19
+ /** AdminSelect sentinel for "remove from group" (empty string = placeholder). */
20
+ const UNGROUP_SENTINEL = '__ungroup__';
16
21
  // =============================================================================
17
22
  // Verification Badge - Pure CSS Classes
18
23
  // =============================================================================
@@ -22,8 +27,8 @@ function VerificationBadge({ verified }) {
22
27
  }
23
28
  return (_jsxs("span", { className: "admin-badge admin-badge-unverified inline-flex items-center gap-1", children: [_jsx(Clock, { className: "h-3 w-3" }), "Pending"] }));
24
29
  }
25
- function CustomerRow({ customer, groupName, onCustomerClick, onDeleteClick, formatDate }) {
26
- return (_jsxs("tr", { onClick: () => onCustomerClick?.(customer.id), className: `admin-table-row ${onCustomerClick ? 'cursor-pointer' : ''}`, children: [_jsx("td", { className: "px-4 py-3", children: _jsxs("div", { className: "flex items-center gap-3", children: [_jsx("div", { className: "admin-customer-avatar h-9 w-9 text-sm font-medium", children: (customer.name || customer.email).charAt(0).toUpperCase() }), _jsx("span", { className: "font-medium", children: customer.name || 'Unnamed' })] }) }), _jsx("td", { className: "px-4 py-3", children: _jsxs("div", { className: "flex items-center gap-2 text-sm admin-text-muted", children: [_jsx(Mail, { className: "h-4 w-4" }), customer.email] }) }), _jsx("td", { className: "px-4 py-3", children: groupName ? (_jsx("span", { className: "admin-badge admin-badge-neutral", children: groupName })) : (_jsx("span", { className: "text-sm admin-text-muted", children: "\u2014" })) }), _jsx("td", { className: "px-4 py-3", children: _jsx(VerificationBadge, { verified: !!customer.emailVerified }) }), _jsx("td", { className: "px-4 py-3", children: _jsxs("div", { className: "flex items-center gap-2 text-sm admin-text-muted", children: [_jsx(Calendar, { className: "h-4 w-4" }), formatDate(customer.createdAt)] }) }), _jsx("td", { className: "px-4 py-3", children: _jsx("div", { className: "flex items-center justify-end gap-2", children: _jsx("button", { type: "button", onClick: (e) => onDeleteClick(customer.id, customer.name || customer.email, e), className: "p-2 rounded-md hover:bg-[hsl(var(--admin-destructive)/0.1)] text-[hsl(var(--admin-foreground-muted))] hover:text-[hsl(var(--admin-destructive))] transition-colors", title: "Delete customer", children: _jsx(Trash2, { className: "h-4 w-4" }) }) }) })] }));
30
+ function CustomerRow({ customer, groupName, isSelected, onToggleSelect, onCustomerClick, onDeleteClick, formatDate }) {
31
+ return (_jsxs("tr", { onClick: () => onCustomerClick?.(customer.id), className: `admin-table-row ${onCustomerClick ? 'cursor-pointer' : ''} ${isSelected ? 'admin-table-row-selected' : ''}`, children: [_jsx("td", { className: "px-4 py-3 w-12", onClick: (e) => e.stopPropagation(), children: _jsx("input", { type: "checkbox", className: "admin-checkbox", checked: isSelected, onChange: () => onToggleSelect(customer.id), "aria-label": `Select ${customer.name || customer.email}` }) }), _jsx("td", { className: "px-4 py-3", children: _jsxs("div", { className: "flex items-center gap-3", children: [_jsx("div", { className: "admin-customer-avatar h-9 w-9 text-sm font-medium", children: (customer.name || customer.email).charAt(0).toUpperCase() }), _jsx("span", { className: "font-medium", children: customer.name || 'Unnamed' })] }) }), _jsx("td", { className: "px-4 py-3", children: _jsxs("div", { className: "flex items-center gap-2 text-sm admin-text-muted", children: [_jsx(Mail, { className: "h-4 w-4" }), customer.email] }) }), _jsx("td", { className: "px-4 py-3", children: groupName ? (_jsx("span", { className: "admin-badge admin-badge-neutral", children: groupName })) : (_jsx("span", { className: "text-sm admin-text-muted", children: "\u2014" })) }), _jsx("td", { className: "px-4 py-3", children: _jsx(VerificationBadge, { verified: !!customer.emailVerified }) }), _jsx("td", { className: "px-4 py-3", children: _jsxs("div", { className: "flex items-center gap-2 text-sm admin-text-muted", children: [_jsx(Calendar, { className: "h-4 w-4" }), formatDate(customer.createdAt)] }) }), _jsx("td", { className: "px-4 py-3", children: _jsx("div", { className: "flex items-center justify-start gap-2", children: _jsx("button", { type: "button", onClick: (e) => onDeleteClick(customer.id, customer.name || customer.email, e), className: "p-2 -ml-2 rounded-md hover:bg-[hsl(var(--admin-destructive)/0.1)] text-[hsl(var(--admin-foreground-muted))] hover:text-[hsl(var(--admin-destructive))] transition-colors", title: "Delete customer", children: _jsx(Trash2, { className: "h-4 w-4" }) }) }) })] }));
27
32
  }
28
33
  // =============================================================================
29
34
  // Component
@@ -39,7 +44,7 @@ function CustomerRow({ customer, groupName, onCustomerClick, onDeleteClick, form
39
44
  * ```
40
45
  */
41
46
  export function CustomerTable({ pageSize = 20, onCustomerClick, className = '', }) {
42
- const { customers, total, page, isLoading, error, fetchCustomers, deleteCustomer } = useAdminCustomers();
47
+ const { customers, total, page, isLoading, error, fetchCustomers, deleteCustomer, fetchAllMatchingIds, bulkCustomerAction, } = useAdminCustomers();
43
48
  const { groups, fetchGroups } = useAdminCustomerGroups();
44
49
  // Get locale from context
45
50
  const storeSettings = useStoreSettingsOptional();
@@ -58,6 +63,13 @@ export function CustomerTable({ pageSize = 20, onCustomerClick, className = '',
58
63
  const [deleteTarget, setDeleteTarget] = useState(null);
59
64
  const [isDeleting, setIsDeleting] = useState(false);
60
65
  const [deleteError, setDeleteError] = useState(null);
66
+ // Bulk selection (shared state machine — survives page changes, resets on
67
+ // filter changes; Select-all-matching via the ids-only fetch).
68
+ const { selected, isAllMatching, toggle: toggleSelect, togglePage: togglePageSelect, selectAllMatching, reset: resetSelection, } = useBulkSelection();
69
+ const [isProcessing, setIsProcessing] = useState(false);
70
+ const [isExpandingSelection, setIsExpandingSelection] = useState(false);
71
+ const [bulkGroupPick, setBulkGroupPick] = useState('');
72
+ const [bulkDeleteConfirm, setBulkDeleteConfirm] = useState(false);
61
73
  // Debounce search input
62
74
  useEffect(() => {
63
75
  const timer = setTimeout(() => {
@@ -73,7 +85,9 @@ export function CustomerTable({ pageSize = 20, onCustomerClick, className = '',
73
85
  page: 1,
74
86
  limit: pageSize,
75
87
  });
76
- }, [debouncedSearch, groupFilter, pageSize, fetchCustomers]);
88
+ // Selection resets with the filter (page changes deliberately keep it).
89
+ resetSelection();
90
+ }, [debouncedSearch, groupFilter, pageSize, fetchCustomers, resetSelection]);
77
91
  const handlePageChange = useCallback((newPage) => {
78
92
  fetchCustomers({
79
93
  search: debouncedSearch || undefined,
@@ -109,6 +123,59 @@ export function CustomerTable({ pageSize = 20, onCustomerClick, className = '',
109
123
  setDeleteError(null);
110
124
  }
111
125
  }, [isDeleting]);
126
+ // ---- Bulk selection + actions ------------------------------------------
127
+ const handleSelectAllOnPage = useCallback(() => {
128
+ togglePageSelect(customers.map((c) => c.id));
129
+ }, [customers, togglePageSelect]);
130
+ const handleSelectAllMatching = useCallback(async () => {
131
+ setIsExpandingSelection(true);
132
+ const ids = await fetchAllMatchingIds({
133
+ search: debouncedSearch || undefined,
134
+ group: groupFilter || undefined,
135
+ });
136
+ setIsExpandingSelection(false);
137
+ if (ids)
138
+ selectAllMatching(ids);
139
+ }, [debouncedSearch, groupFilter, fetchAllMatchingIds, selectAllMatching]);
140
+ const refetchList = useCallback(() => {
141
+ fetchCustomers({
142
+ search: debouncedSearch || undefined,
143
+ group: groupFilter || undefined,
144
+ page,
145
+ limit: pageSize,
146
+ });
147
+ }, [fetchCustomers, debouncedSearch, groupFilter, page, pageSize]);
148
+ const performBulkAssign = useCallback(async () => {
149
+ if (!bulkGroupPick)
150
+ return;
151
+ const ids = Array.from(selected);
152
+ if (ids.length === 0)
153
+ return;
154
+ const groupId = bulkGroupPick === UNGROUP_SENTINEL ? null : bulkGroupPick;
155
+ setIsProcessing(true);
156
+ const result = await runChunkedBulk(ids, (chunk) => bulkCustomerAction(chunk, 'assign_group', groupId));
157
+ setIsProcessing(false);
158
+ setBulkGroupPick('');
159
+ resetSelection();
160
+ refetchList();
161
+ if (result.failed.length > 0) {
162
+ console.warn(`[CustomerTable] Bulk group assign: ${result.succeeded.length} succeeded, ${result.failed.length} failed`, result.failed);
163
+ }
164
+ }, [bulkGroupPick, selected, bulkCustomerAction, resetSelection, refetchList]);
165
+ const performBulkDelete = useCallback(async () => {
166
+ const ids = Array.from(selected);
167
+ if (ids.length === 0)
168
+ return;
169
+ setIsProcessing(true);
170
+ const result = await runChunkedBulk(ids, (chunk) => bulkCustomerAction(chunk, 'delete'));
171
+ setIsProcessing(false);
172
+ setBulkDeleteConfirm(false);
173
+ resetSelection();
174
+ refetchList();
175
+ if (result.failed.length > 0) {
176
+ console.warn(`[CustomerTable] Bulk delete: ${result.succeeded.length} succeeded, ${result.failed.length} failed`, result.failed);
177
+ }
178
+ }, [selected, bulkCustomerAction, resetSelection, refetchList]);
112
179
  const formatDate = (dateString) => {
113
180
  const date = new Date(dateString);
114
181
  return date.toLocaleDateString(resolvedLocale, {
@@ -118,8 +185,19 @@ export function CustomerTable({ pageSize = 20, onCustomerClick, className = '',
118
185
  });
119
186
  };
120
187
  const totalPages = Math.ceil(total / pageSize);
121
- return (_jsxs("div", { className: `space-y-4 ${className}`, children: [_jsxs("div", { className: "flex flex-wrap items-center justify-between gap-4", children: [_jsxs("div", { className: "admin-input-with-icon flex-1 max-w-sm", children: [_jsx(Search, { className: "admin-input-with-icon-left h-4 w-4" }), _jsx("input", { type: "text", value: search, onChange: (e) => setSearch(e.target.value), placeholder: "Search by email or name...", className: "admin-input w-full" })] }), _jsxs("select", { value: groupFilter, onChange: (e) => setGroupFilter(e.target.value), className: "admin-input w-auto", "aria-label": "Filter by group", children: [_jsx("option", { value: "", children: "All groups" }), groups.map((g) => (_jsx("option", { value: g.id, children: g.name }, g.id)))] }), _jsxs("button", { type: "button", onClick: () => setShowGroupsManager((v) => !v), className: "admin-btn admin-btn-secondary admin-btn-sm inline-flex items-center gap-1.5", children: [_jsx(Tags, { className: "h-4 w-4" }), showGroupsManager ? 'Hide groups' : 'Manage groups'] }), _jsxs("div", { className: "flex items-center gap-2 text-sm admin-text-muted", children: [_jsx(Users, { className: "h-4 w-4" }), _jsxs("span", { children: [total, " customer", total !== 1 ? 's' : ''] })] })] }), showGroupsManager && _jsx(CustomerGroupsManager, { onChanged: fetchGroups }), error && (_jsx("div", { className: "admin-alert-inline admin-alert-inline-error", children: error })), _jsx("div", { className: "admin-card overflow-hidden", children: _jsxs("table", { className: "admin-table w-full", children: [_jsx("thead", { children: _jsxs("tr", { className: "admin-table-header", children: [_jsx("th", { className: "px-4 py-3 text-left", children: "Customer" }), _jsx("th", { className: "px-4 py-3 text-left", children: "Email" }), _jsx("th", { className: "px-4 py-3 text-left", children: "Group" }), _jsx("th", { className: "px-4 py-3 text-left", children: "Status" }), _jsx("th", { className: "px-4 py-3 text-left", children: "Joined" }), _jsx("th", { className: "px-4 py-3 text-right", children: "Actions" })] }) }), _jsx("tbody", { children: isLoading ? (
188
+ const allOnPageSelected = customers.length > 0 && customers.every((c) => selected.has(c.id));
189
+ const someOnPageSelected = customers.length > 0 && customers.some((c) => selected.has(c.id));
190
+ return (_jsxs("div", { className: `space-y-4 ${className}`, children: [selected.size > 0 ? (_jsxs(BulkActionBar, { count: selected.size, total: total, isAllMatching: isAllMatching, noun: "customer", isProcessing: isProcessing, onSelectAllMatching: handleSelectAllMatching, isExpandingSelection: isExpandingSelection, onClear: resetSelection, children: [_jsx(AdminSelect, { value: bulkGroupPick, onChange: setBulkGroupPick, placeholder: "Move to group\u2026", size: "sm", options: [
191
+ ...groups.map((g) => ({ value: g.id, label: g.name })),
192
+ { value: UNGROUP_SENTINEL, label: 'No group (ungroup)' },
193
+ ], className: "min-w-[170px]" }), _jsxs("button", { type: "button", onClick: performBulkAssign, disabled: isProcessing || !bulkGroupPick, className: "admin-btn admin-btn-primary admin-btn-sm", children: [_jsx(Tags, { className: "h-4 w-4" }), "Assign"] }), _jsxs("button", { type: "button", onClick: () => setBulkDeleteConfirm(true), disabled: isProcessing, className: "admin-btn admin-btn-danger admin-btn-sm", children: [_jsx(Trash2, { className: "h-4 w-4" }), "Delete"] })] })) : (_jsxs("div", { className: "flex flex-wrap items-center justify-between gap-4", children: [_jsxs("div", { className: "admin-input-with-icon flex-1 max-w-sm", children: [_jsx(Search, { className: "admin-input-with-icon-left h-4 w-4" }), _jsx("input", { type: "text", value: search, onChange: (e) => setSearch(e.target.value), placeholder: "Search by email or name...", className: "admin-input w-full" })] }), _jsxs("select", { value: groupFilter, onChange: (e) => setGroupFilter(e.target.value), className: "admin-input w-auto", "aria-label": "Filter by group", children: [_jsx("option", { value: "", children: "All groups" }), groups.map((g) => (_jsx("option", { value: g.id, children: g.name }, g.id)))] }), _jsxs("button", { type: "button", onClick: () => setShowGroupsManager((v) => !v), className: "admin-btn admin-btn-secondary admin-btn-sm inline-flex items-center gap-1.5", children: [_jsx(Tags, { className: "h-4 w-4" }), showGroupsManager ? 'Hide groups' : 'Manage groups'] }), _jsxs("div", { className: "flex items-center gap-2 text-sm admin-text-muted", children: [_jsx(Users, { className: "h-4 w-4" }), _jsxs("span", { children: [total, " customer", total !== 1 ? 's' : ''] })] })] })), showGroupsManager && _jsx(CustomerGroupsManager, { onChanged: fetchGroups }), error && (_jsx("div", { className: "admin-alert-inline admin-alert-inline-error", children: error })), _jsx("div", { className: "admin-card overflow-hidden", children: _jsxs("table", { className: "admin-table w-full", children: [_jsx("thead", { children: _jsxs("tr", { className: "admin-table-header", children: [_jsx("th", { className: "px-4 py-3 w-12 text-left", children: _jsx("input", { type: "checkbox", className: "admin-checkbox", checked: allOnPageSelected, ref: (el) => {
194
+ if (el)
195
+ el.indeterminate = someOnPageSelected && !allOnPageSelected;
196
+ }, onChange: handleSelectAllOnPage, "aria-label": "Select all customers on this page" }) }), _jsx("th", { className: "px-4 py-3 text-left", children: "Customer" }), _jsx("th", { className: "px-4 py-3 text-left", children: "Email" }), _jsx("th", { className: "px-4 py-3 text-left", children: "Group" }), _jsx("th", { className: "px-4 py-3 text-left", children: "Status" }), _jsx("th", { className: "px-4 py-3 text-left", children: "Joined" }), _jsx("th", { className: "px-4 py-3 text-left", children: "Actions" })] }) }), _jsx("tbody", { children: isLoading ? (
122
197
  // Loading skeleton
123
- Array.from({ length: 5 }).map((_, i) => (_jsxs("tr", { className: "admin-table-row", children: [_jsx("td", { className: "px-4 py-3", children: _jsxs("div", { className: "flex items-center gap-3", children: [_jsx("div", { className: "admin-skeleton admin-skeleton-xl w-9 rounded-full" }), _jsx("div", { className: "admin-skeleton admin-skeleton-md w-24 rounded" })] }) }), _jsx("td", { className: "px-4 py-3", children: _jsx("div", { className: "admin-skeleton admin-skeleton-md w-48 rounded" }) }), _jsx("td", { className: "px-4 py-3", children: _jsx("div", { className: "admin-skeleton admin-skeleton-md w-16 rounded" }) }), _jsx("td", { className: "px-4 py-3", children: _jsx("div", { className: "admin-skeleton admin-skeleton-lg w-20 rounded" }) }), _jsx("td", { className: "px-4 py-3", children: _jsx("div", { className: "admin-skeleton admin-skeleton-md w-24 rounded" }) }), _jsx("td", { className: "px-4 py-3", children: _jsx("div", { className: "admin-skeleton admin-skeleton-md w-8 rounded ml-auto" }) })] }, i)))) : customers.length === 0 ? (_jsx("tr", { children: _jsxs("td", { colSpan: 6, className: "px-4 py-12 text-center", children: [_jsx(Users, { className: "mx-auto h-12 w-12 admin-empty-icon" }), _jsx("p", { className: "mt-2 text-sm admin-empty-text", children: debouncedSearch ? 'No customers found matching your search' : 'No customers yet' })] }) })) : (customers.map((customer) => (_jsx(CustomerRow, { customer: customer, groupName: customer.groupId ? groupNameById.get(customer.groupId) ?? null : null, onCustomerClick: onCustomerClick, onDeleteClick: handleDeleteClick, formatDate: formatDate }, customer.id)))) })] }) }), _jsx(DeleteConfirmDialog, { isOpen: !!deleteTarget, title: "Delete Customer", itemName: deleteTarget?.name || '', itemType: "customer", isDeleting: isDeleting, error: deleteError, onConfirm: handleDeleteConfirm, onCancel: handleDeleteCancel }), totalPages > 1 && (_jsxs("div", { className: "admin-pagination", children: [_jsxs("p", { className: "admin-pagination-info", children: ["Showing ", (page - 1) * pageSize + 1, " to", ' ', Math.min(page * pageSize, total), " of ", total, " customers"] }), _jsxs("div", { className: "admin-pagination-controls", children: [_jsx("button", { onClick: () => handlePageChange(page - 1), disabled: page <= 1, className: "admin-btn admin-btn-secondary admin-btn-sm disabled:opacity-50", children: "Previous" }), _jsx("button", { onClick: () => handlePageChange(page + 1), disabled: page >= totalPages, className: "admin-btn admin-btn-secondary admin-btn-sm disabled:opacity-50", children: "Next" })] })] }))] }));
198
+ Array.from({ length: 5 }).map((_, i) => (_jsxs("tr", { className: "admin-table-row", children: [_jsx("td", { className: "px-4 py-3 w-12", children: _jsx("div", { className: "admin-skeleton admin-skeleton-md w-4 rounded" }) }), _jsx("td", { className: "px-4 py-3", children: _jsxs("div", { className: "flex items-center gap-3", children: [_jsx("div", { className: "admin-skeleton admin-skeleton-xl w-9 rounded-full" }), _jsx("div", { className: "admin-skeleton admin-skeleton-md w-24 rounded" })] }) }), _jsx("td", { className: "px-4 py-3", children: _jsx("div", { className: "admin-skeleton admin-skeleton-md w-48 rounded" }) }), _jsx("td", { className: "px-4 py-3", children: _jsx("div", { className: "admin-skeleton admin-skeleton-md w-16 rounded" }) }), _jsx("td", { className: "px-4 py-3", children: _jsx("div", { className: "admin-skeleton admin-skeleton-lg w-20 rounded" }) }), _jsx("td", { className: "px-4 py-3", children: _jsx("div", { className: "admin-skeleton admin-skeleton-md w-24 rounded" }) }), _jsx("td", { className: "px-4 py-3", children: _jsx("div", { className: "admin-skeleton admin-skeleton-md w-8 rounded" }) })] }, i)))) : customers.length === 0 ? (_jsx("tr", { children: _jsxs("td", { colSpan: 7, className: "px-4 py-12 text-center", children: [_jsx(Users, { className: "mx-auto h-12 w-12 admin-empty-icon" }), _jsx("p", { className: "mt-2 text-sm admin-empty-text", children: debouncedSearch ? 'No customers found matching your search' : 'No customers yet' })] }) })) : (customers.map((customer) => (_jsx(CustomerRow, { customer: customer, groupName: customer.groupId ? groupNameById.get(customer.groupId) ?? null : null, isSelected: selected.has(customer.id), onToggleSelect: toggleSelect, onCustomerClick: onCustomerClick, onDeleteClick: handleDeleteClick, formatDate: formatDate }, customer.id)))) })] }) }), _jsx(DeleteConfirmDialog, { isOpen: !!deleteTarget, title: "Delete Customer", itemName: deleteTarget?.name || '', itemType: "customer", isDeleting: isDeleting, error: deleteError, onConfirm: handleDeleteConfirm, onCancel: handleDeleteCancel }), _jsx(DeleteConfirmDialog, { isOpen: bulkDeleteConfirm, title: `Delete ${selected.size} customer${selected.size === 1 ? '' : 's'}`, itemName: "", description: `Are you sure you want to delete ${selected.size} customer${selected.size === 1 ? '' : 's'}? Their personal data is anonymized; order history is preserved. This action cannot be undone.`, isDeleting: isProcessing, onConfirm: performBulkDelete, onCancel: () => {
199
+ if (!isProcessing)
200
+ setBulkDeleteConfirm(false);
201
+ } }), totalPages > 1 && (_jsxs("div", { className: "admin-pagination", children: [_jsxs("p", { className: "admin-pagination-info", children: ["Showing ", (page - 1) * pageSize + 1, " to", ' ', Math.min(page * pageSize, total), " of ", total, " customers"] }), _jsxs("div", { className: "admin-pagination-controls", children: [_jsx("button", { onClick: () => handlePageChange(page - 1), disabled: page <= 1, className: "admin-btn admin-btn-secondary admin-btn-sm disabled:opacity-50", children: "Previous" }), _jsx("button", { onClick: () => handlePageChange(page + 1), disabled: page >= totalPages, className: "admin-btn admin-btn-secondary admin-btn-sm disabled:opacity-50", children: "Next" })] })] }))] }));
124
202
  }
125
203
  //# sourceMappingURL=CustomerTable.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"CustomerTable.js","sourceRoot":"","sources":["../../../src/admin/components/CustomerTable.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"CustomerTable.js","sourceRoot":"","sources":["../../../src/admin/components/CustomerTable.tsx"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"DiscountsManager.d.ts","sourceRoot":"","sources":["../../../src/admin/components/DiscountsManager.tsx"],"names":[],"mappings":"AA2BA,MAAM,WAAW,qBAAqB;IACpC,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAmaD,wBAAgB,gBAAgB,CAAC,EAAE,SAAc,EAAE,EAAE,qBAAqB,2CA0mBzE"}
1
+ {"version":3,"file":"DiscountsManager.d.ts","sourceRoot":"","sources":["../../../src/admin/components/DiscountsManager.tsx"],"names":[],"mappings":"AA6BA,MAAM,WAAW,qBAAqB;IACpC,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAgcD,wBAAgB,gBAAgB,CAAC,EAAE,SAAc,EAAE,EAAE,qBAAqB,2CA4nBzE"}
@@ -20,6 +20,8 @@ import { useAdminDiscounts } from '../hooks/useAdminDiscounts';
20
20
  import { useAdminCustomerGroups } from '../hooks/useAdminCustomerGroups';
21
21
  import { useAdminCategories } from '../hooks/useAdminCategories';
22
22
  import { fetchAdminApi } from '../hooks/fetchAdminApi';
23
+ import { AdminDateTimePicker } from './AdminDateTimePicker';
24
+ import { DeleteConfirmDialog } from './DeleteConfirmDialog';
23
25
  import { useStoreSettingsOptional } from '../../core/StoreSettingsProvider';
24
26
  import { getCurrencySymbol } from '../../core/utils';
25
27
  const EMPTY_FORM = {
@@ -226,12 +228,7 @@ function statusOf(d) {
226
228
  }
227
229
  return { label: 'Active', cls: 'admin-badge-success' };
228
230
  }
229
- // =============================================================================
230
- // Product picker (search + chips) — minimal inline picker so merchants never
231
- // touch raw ids. Selected products not in the current search keep their label
232
- // from the labels map (falls back to a shortened id for pre-existing rows).
233
- // =============================================================================
234
- function ProductPicker({ selected, onChange, labels, onLabel, }) {
231
+ function ProductPicker({ selected, onChange, labels, onLabel, currencySymbol, }) {
235
232
  const [query, setQuery] = useState('');
236
233
  const [results, setResults] = useState([]);
237
234
  const [isSearching, setIsSearching] = useState(false);
@@ -249,35 +246,43 @@ function ProductPicker({ selected, onChange, labels, onLabel, }) {
249
246
  return;
250
247
  setIsSearching(false);
251
248
  // eslint-disable-next-line react-hooks/set-state-in-effect
252
- setResults(res.ok ? (res.data.data || []).map((p) => ({ id: p.id, name: p.name })) : []);
249
+ setResults(res.ok
250
+ ? (res.data.data || []).map((p) => ({
251
+ id: p.id,
252
+ name: p.name,
253
+ price: p.price,
254
+ sku: p.sku,
255
+ }))
256
+ : []);
253
257
  }, 250);
254
258
  return () => {
255
259
  active = false;
256
260
  clearTimeout(t);
257
261
  };
258
262
  }, [query]);
259
- return (_jsxs("div", { children: [selected.length > 0 && (_jsx("div", { className: "mb-2 flex flex-wrap gap-1.5", children: selected.map((id) => (_jsxs("span", { className: "inline-flex items-center gap-1 rounded-full border border-[hsl(var(--admin-border))] px-2 py-0.5 text-xs", children: [labels[id] || `${id.slice(0, 8)}…`, _jsx("button", { type: "button", onClick: () => onChange(selected.filter((x) => x !== id)), "aria-label": "Remove product", children: _jsx(X, { className: "h-3 w-3" }) })] }, id))) })), _jsxs("div", { className: "relative", children: [_jsx(Search, { className: "pointer-events-none absolute left-2.5 top-2.5 h-3.5 w-3.5 text-[hsl(var(--admin-foreground-muted))]" }), _jsx("input", { className: "admin-input w-full pl-8", value: query, onChange: (e) => setQuery(e.target.value), placeholder: "Search products\u2026" })] }), query.trim().length >= 2 && (_jsx("div", { className: "mt-1 rounded-md border border-[hsl(var(--admin-border))]", children: isSearching ? (_jsx("p", { className: "px-3 py-2 text-xs text-[hsl(var(--admin-foreground-muted))]", children: "Searching\u2026" })) : results.length === 0 ? (_jsx("p", { className: "px-3 py-2 text-xs text-[hsl(var(--admin-foreground-muted))]", children: "No products found" })) : (results.map((p) => {
263
+ return (_jsxs("div", { children: [selected.length > 0 && (_jsx("div", { className: "mb-2 flex flex-wrap gap-1.5", children: selected.map((id) => (_jsxs("span", { className: "inline-flex items-center gap-1 rounded-full border border-[hsl(var(--admin-border))] px-2 py-0.5 text-xs", children: [labels[id] || `${id.slice(0, 8)}…`, _jsx("button", { type: "button", onClick: () => onChange(selected.filter((x) => x !== id)), "aria-label": "Remove product", children: _jsx(X, { className: "h-3 w-3" }) })] }, id))) })), _jsxs("div", { className: "admin-input-with-icon", children: [_jsx(Search, { className: "admin-input-with-icon-left h-4 w-4" }), _jsx("input", { className: "admin-input w-full", value: query, onChange: (e) => setQuery(e.target.value), placeholder: "Search products\u2026" })] }), query.trim().length >= 2 && (_jsx("div", { className: "mt-1 rounded-md border border-[hsl(var(--admin-border))]", children: isSearching ? (_jsx("p", { className: "px-3 py-2 text-xs text-[hsl(var(--admin-foreground-muted))]", children: "Searching\u2026" })) : results.length === 0 ? (_jsx("p", { className: "px-3 py-2 text-xs text-[hsl(var(--admin-foreground-muted))]", children: "No products found" })) : (results.map((p) => {
260
264
  const isPicked = selected.includes(p.id);
261
- return (_jsx("button", { type: "button", disabled: isPicked, onClick: () => {
265
+ const priceLabel = `${currencySymbol}${Number(p.price || 0).toFixed(2)}`;
266
+ return (_jsxs("button", { type: "button", disabled: isPicked, onClick: () => {
262
267
  onLabel(p.id, p.name);
263
268
  onChange([...selected, p.id]);
264
269
  setQuery('');
265
- }, className: "block w-full px-3 py-2 text-left text-sm hover:bg-[hsl(var(--admin-background-subtle))] disabled:opacity-50", children: p.name }, p.id));
270
+ }, className: "block w-full px-3 py-2 text-left hover:bg-[hsl(var(--admin-background-subtle))] disabled:opacity-50", children: [_jsx("span", { className: "block text-sm text-[hsl(var(--admin-foreground))]", children: p.name }), _jsxs("span", { className: "block text-xs text-[hsl(var(--admin-foreground-muted))]", children: [priceLabel, p.sku ? ` · ${p.sku}` : ''] })] }, p.id));
266
271
  })) }))] }));
267
272
  }
268
273
  // =============================================================================
269
274
  // Target scope editor (products picker / category checkboxes)
270
275
  // =============================================================================
271
- function TargetEditor({ scope, targetIds, onChange, categories, productLabels, onProductLabel, }) {
276
+ function TargetEditor({ scope, targetIds, onChange, categories, productLabels, onProductLabel, currencySymbol, }) {
272
277
  if (scope === 'categories') {
273
278
  if (categories.length === 0) {
274
279
  return (_jsx("p", { className: "text-xs text-[hsl(var(--admin-foreground-muted))]", children: "No categories yet \u2014 create some under Products \u2192 Categories first." }));
275
280
  }
276
- return (_jsx("div", { className: "grid max-h-40 grid-cols-1 gap-1 overflow-y-auto sm:grid-cols-2", children: categories.map((c) => (_jsxs("label", { className: "flex items-center gap-2 text-sm", children: [_jsx("input", { type: "checkbox", checked: targetIds.includes(c.id), onChange: (e) => onChange(e.target.checked
281
+ return (_jsx("div", { className: "grid max-h-40 grid-cols-1 gap-1 overflow-y-auto sm:grid-cols-2", children: categories.map((c) => (_jsxs("label", { className: "flex items-center gap-2 text-sm", children: [_jsx("input", { type: "checkbox", className: "admin-checkbox", checked: targetIds.includes(c.id), onChange: (e) => onChange(e.target.checked
277
282
  ? [...targetIds, c.id]
278
283
  : targetIds.filter((x) => x !== c.id)) }), c.name] }, c.id))) }));
279
284
  }
280
- return (_jsx(ProductPicker, { selected: targetIds, onChange: onChange, labels: productLabels, onLabel: onProductLabel }));
285
+ return (_jsx(ProductPicker, { selected: targetIds, onChange: onChange, labels: productLabels, onLabel: onProductLabel, currencySymbol: currencySymbol }));
281
286
  }
282
287
  // =============================================================================
283
288
  // Component
@@ -292,8 +297,9 @@ export function DiscountsManager({ className = '' }) {
292
297
  const [form, setForm] = useState(EMPTY_FORM);
293
298
  const [isSaving, setIsSaving] = useState(false);
294
299
  const [actionError, setActionError] = useState(null);
295
- const [pendingDelete, setPendingDelete] = useState(null);
296
- const [isDeletingId, setIsDeletingId] = useState(null);
300
+ const [deleteTarget, setDeleteTarget] = useState(null);
301
+ const [isDeleting, setIsDeleting] = useState(false);
302
+ const [deleteError, setDeleteError] = useState(null);
297
303
  // Names for product chips (search results + best-effort for existing rows).
298
304
  const [productLabels, setProductLabels] = useState({});
299
305
  const categoryOptions = useMemo(() => flatCategories.map((c) => ({ id: c.id, name: c.name })), [flatCategories]);
@@ -332,32 +338,43 @@ export function DiscountsManager({ className = '' }) {
332
338
  if (!res.success)
333
339
  setActionError(res.error || 'Failed to update the discount');
334
340
  }
335
- async function handleDelete(id) {
336
- setIsDeletingId(id);
337
- setActionError(null);
338
- const res = await deleteDiscount(id);
339
- setIsDeletingId(null);
340
- setPendingDelete(null);
341
- if (!res.success)
342
- setActionError(res.error || 'Failed to delete the discount');
341
+ async function handleDeleteConfirm() {
342
+ if (!deleteTarget)
343
+ return;
344
+ setIsDeleting(true);
345
+ setDeleteError(null);
346
+ const res = await deleteDiscount(deleteTarget.id);
347
+ setIsDeleting(false);
348
+ if (res.success) {
349
+ setDeleteTarget(null);
350
+ }
351
+ else {
352
+ setDeleteError(res.error || 'Failed to delete the discount');
353
+ }
343
354
  }
344
355
  const set = (patch) => setForm((prev) => ({ ...prev, ...patch }));
345
356
  const needsValue = form.type === 'percentage' || form.type === 'fixed_amount';
346
- return (_jsxs("div", { className: `admin-card ${className}`, children: [_jsx("div", { className: "admin-card-header", children: _jsxs("div", { className: "flex items-center justify-between gap-2", children: [_jsxs("div", { className: "flex items-center gap-2", children: [_jsx(BadgePercent, { className: "h-5 w-5 text-[hsl(var(--admin-primary))]" }), _jsx("h2", { className: "text-lg font-semibold text-[hsl(var(--admin-foreground))]", children: "Discounts" })] }), editing === null && (_jsxs("button", { type: "button", onClick: startCreate, className: "admin-btn admin-btn-primary admin-btn-sm inline-flex items-center gap-1", children: [_jsx(Plus, { className: "h-3 w-3" }), "Create discount"] }))] }) }), _jsxs("div", { className: "admin-card-body", children: [_jsx("p", { className: "mb-4 text-sm text-[hsl(var(--admin-foreground-muted))]", children: "Discount codes and automatic promotions, applied in your own checkout \u2014 they work with card payments and manual methods (cash on delivery, wire\u2026) alike." }), (error || actionError) && (_jsx("div", { className: "admin-alert-inline admin-alert-inline-error mb-4", children: actionError || error })), editing !== null && (_jsxs("div", { className: "mb-6 space-y-4 rounded-lg border border-[hsl(var(--admin-border))] p-4", children: [_jsxs("div", { className: "grid gap-4 sm:grid-cols-2", children: [_jsxs("div", { children: [_jsx("label", { className: "admin-label", children: "Method" }), _jsxs("div", { className: "mt-1 flex gap-4", children: [_jsxs("label", { className: "flex items-center gap-2 text-sm", children: [_jsx("input", { type: "radio", checked: form.method === 'code', onChange: () => set({ method: 'code' }) }), "Discount code"] }), _jsxs("label", { className: "flex items-center gap-2 text-sm", children: [_jsx("input", { type: "radio", checked: form.method === 'automatic', onChange: () => set({ method: 'automatic' }) }), "Automatic"] })] })] }), form.method === 'code' && (_jsxs("div", { children: [_jsx("label", { className: "admin-label", children: "Code" }), _jsx("input", { className: "admin-input w-full uppercase", value: form.code, onChange: (e) => set({ code: e.target.value.toUpperCase() }), placeholder: "e.g. WELCOME10", maxLength: 64 })] }))] }), _jsxs("div", { children: [_jsx("label", { className: "admin-label", children: "Title" }), _jsx("input", { className: "admin-input w-full", value: form.title, onChange: (e) => set({ title: e.target.value }), placeholder: "e.g. Welcome offer \u2014 10% off", maxLength: 255 })] }), _jsxs("div", { className: "grid gap-4 sm:grid-cols-3", children: [_jsxs("div", { children: [_jsx("label", { className: "admin-label", children: "Type" }), _jsxs("select", { className: "admin-input w-full", value: form.type, onChange: (e) => set({ type: e.target.value }), children: [_jsx("option", { value: "percentage", children: "Percentage off" }), _jsx("option", { value: "fixed_amount", children: "Fixed amount off" }), _jsx("option", { value: "free_shipping", children: "Free shipping" }), _jsx("option", { value: "buy_x_get_y", children: "Buy X get Y" })] })] }), needsValue && (_jsxs("div", { children: [_jsx("label", { className: "admin-label", children: form.type === 'percentage' ? 'Percentage (%)' : `Amount (${currencySymbol})` }), _jsx("input", { className: "admin-input w-full", type: "number", min: "0", step: form.type === 'percentage' ? '1' : '0.01', value: form.value, onChange: (e) => set({ value: e.target.value }) })] })), form.type !== 'buy_x_get_y' && form.type !== 'free_shipping' && (_jsxs("div", { children: [_jsx("label", { className: "admin-label", children: "Applies to" }), _jsxs("select", { className: "admin-input w-full", value: form.appliesTo, onChange: (e) => set({ appliesTo: e.target.value, targetIds: [] }), children: [_jsx("option", { value: "order", children: "Entire order" }), _jsx("option", { value: "products", children: "Specific products" }), _jsx("option", { value: "categories", children: "Specific categories" })] })] }))] }), form.type !== 'buy_x_get_y' &&
357
+ return (_jsxs("div", { className: `admin-card ${className}`, children: [_jsx("div", { className: "admin-card-header", children: _jsxs("div", { className: "flex items-center justify-between gap-2", children: [_jsxs("div", { className: "flex items-center gap-2", children: [_jsx(BadgePercent, { className: "h-5 w-5 text-[hsl(var(--admin-primary))]" }), _jsx("h2", { className: "text-lg font-semibold text-[hsl(var(--admin-foreground))]", children: "Discounts" })] }), editing === null && (_jsxs("button", { type: "button", onClick: startCreate, className: "admin-btn admin-btn-primary admin-btn-sm inline-flex items-center gap-1", children: [_jsx(Plus, { className: "h-3 w-3" }), "Create discount"] }))] }) }), _jsxs("div", { className: "admin-card-body", children: [_jsx("p", { className: "mb-4 text-sm text-[hsl(var(--admin-foreground-muted))]", children: "Discount codes and automatic promotions, applied in your own checkout \u2014 they work with card payments and manual methods (cash on delivery, wire\u2026) alike." }), (error || actionError) && (_jsx("div", { className: "admin-alert-inline admin-alert-inline-error mb-4", children: actionError || error })), editing !== null && (_jsxs("div", { className: "mb-6 space-y-4 rounded-lg border border-[hsl(var(--admin-border))] p-4", children: [_jsxs("div", { className: "grid gap-4 sm:grid-cols-2", children: [_jsxs("div", { children: [_jsx("label", { className: "admin-label", children: "Method" }), _jsxs("div", { className: "mt-1 flex gap-4", children: [_jsxs("label", { className: "flex items-center gap-2 text-sm", children: [_jsx("input", { type: "radio", className: "admin-radio", checked: form.method === 'code', onChange: () => set({ method: 'code' }) }), "Discount code"] }), _jsxs("label", { className: "flex items-center gap-2 text-sm", children: [_jsx("input", { type: "radio", className: "admin-radio", checked: form.method === 'automatic', onChange: () => set({ method: 'automatic' }) }), "Automatic"] })] })] }), form.method === 'code' && (_jsxs("div", { children: [_jsx("label", { className: "admin-label", children: "Code" }), _jsx("input", { className: "admin-input w-full uppercase", value: form.code, onChange: (e) => set({ code: e.target.value.toUpperCase() }), placeholder: "e.g. WELCOME10", maxLength: 64 })] }))] }), _jsxs("div", { children: [_jsx("label", { className: "admin-label", children: "Title" }), _jsx("input", { className: "admin-input w-full", value: form.title, onChange: (e) => set({ title: e.target.value }), placeholder: "e.g. Welcome offer \u2014 10% off", maxLength: 255 })] }), _jsxs("div", { className: "grid gap-4 sm:grid-cols-3", children: [_jsxs("div", { children: [_jsx("label", { className: "admin-label", children: "Type" }), _jsxs("select", { className: "admin-input w-full", value: form.type, onChange: (e) => set({ type: e.target.value }), children: [_jsx("option", { value: "percentage", children: "Percentage off" }), _jsx("option", { value: "fixed_amount", children: "Fixed amount off" }), _jsx("option", { value: "free_shipping", children: "Free shipping" }), _jsx("option", { value: "buy_x_get_y", children: "Buy X get Y" })] })] }), needsValue && (_jsxs("div", { children: [_jsx("label", { className: "admin-label", children: form.type === 'percentage' ? 'Percentage (%)' : `Amount (${currencySymbol})` }), _jsx("input", { className: "admin-input w-full", type: "number", min: "0", step: form.type === 'percentage' ? '1' : '0.01', value: form.value, onChange: (e) => set({ value: e.target.value }) })] })), form.type !== 'buy_x_get_y' && form.type !== 'free_shipping' && (_jsxs("div", { children: [_jsx("label", { className: "admin-label", children: "Applies to" }), _jsxs("select", { className: "admin-input w-full", value: form.appliesTo, onChange: (e) => set({ appliesTo: e.target.value, targetIds: [] }), children: [_jsx("option", { value: "order", children: "Entire order" }), _jsx("option", { value: "products", children: "Specific products" }), _jsx("option", { value: "categories", children: "Specific categories" })] })] }))] }), form.type !== 'buy_x_get_y' &&
347
358
  form.type !== 'free_shipping' &&
348
- form.appliesTo !== 'order' && (_jsxs("div", { children: [_jsx("label", { className: "admin-label", children: form.appliesTo === 'products' ? 'Products' : 'Categories' }), _jsx(TargetEditor, { scope: form.appliesTo, targetIds: form.targetIds, onChange: (ids) => set({ targetIds: ids }), categories: categoryOptions, productLabels: productLabels, onProductLabel: (id, name) => setProductLabels((prev) => ({ ...prev, [id]: name })) })] })), form.type === 'buy_x_get_y' && (_jsxs("div", { className: "space-y-4 rounded-md border border-dashed border-[hsl(var(--admin-border))] p-3", children: [_jsxs("div", { className: "grid gap-4 sm:grid-cols-3", children: [_jsxs("div", { children: [_jsx("label", { className: "admin-label", children: "Customer buys (quantity)" }), _jsx("input", { className: "admin-input w-full", type: "number", min: "1", value: form.buyQuantity, onChange: (e) => set({ buyQuantity: e.target.value }) })] }), _jsxs("div", { children: [_jsx("label", { className: "admin-label", children: "From" }), _jsxs("select", { className: "admin-input w-full", value: form.buyAppliesTo, onChange: (e) => set({
359
+ form.appliesTo !== 'order' && (_jsxs("div", { children: [_jsx("label", { className: "admin-label", children: form.appliesTo === 'products' ? 'Products' : 'Categories' }), _jsx(TargetEditor, { scope: form.appliesTo, targetIds: form.targetIds, onChange: (ids) => set({ targetIds: ids }), categories: categoryOptions, productLabels: productLabels, onProductLabel: (id, name) => setProductLabels((prev) => ({ ...prev, [id]: name })), currencySymbol: currencySymbol })] })), form.type === 'buy_x_get_y' && (_jsxs("div", { className: "space-y-4 rounded-md border border-dashed border-[hsl(var(--admin-border))] p-3", children: [_jsxs("div", { className: "grid gap-4 sm:grid-cols-3", children: [_jsxs("div", { children: [_jsx("label", { className: "admin-label", children: "Customer buys (quantity)" }), _jsx("input", { className: "admin-input w-full", type: "number", min: "1", value: form.buyQuantity, onChange: (e) => set({ buyQuantity: e.target.value }) })] }), _jsxs("div", { children: [_jsx("label", { className: "admin-label", children: "From" }), _jsxs("select", { className: "admin-input w-full", value: form.buyAppliesTo, onChange: (e) => set({
349
360
  buyAppliesTo: e.target.value,
350
361
  buyTargetIds: [],
351
- }), children: [_jsx("option", { value: "any", children: "Any items" }), _jsx("option", { value: "products", children: "Specific products" }), _jsx("option", { value: "categories", children: "Specific categories" })] })] })] }), form.buyAppliesTo !== 'any' && (_jsx(TargetEditor, { scope: form.buyAppliesTo, targetIds: form.buyTargetIds, onChange: (ids) => set({ buyTargetIds: ids }), categories: categoryOptions, productLabels: productLabels, onProductLabel: (id, name) => setProductLabels((prev) => ({ ...prev, [id]: name })) })), _jsxs("div", { className: "grid gap-4 sm:grid-cols-4", children: [_jsxs("div", { children: [_jsx("label", { className: "admin-label", children: "Customer gets (quantity)" }), _jsx("input", { className: "admin-input w-full", type: "number", min: "1", value: form.getQuantity, onChange: (e) => set({ getQuantity: e.target.value }) })] }), _jsxs("div", { children: [_jsx("label", { className: "admin-label", children: "From" }), _jsxs("select", { className: "admin-input w-full", value: form.getAppliesTo, onChange: (e) => set({
362
+ }), children: [_jsx("option", { value: "any", children: "Any items" }), _jsx("option", { value: "products", children: "Specific products" }), _jsx("option", { value: "categories", children: "Specific categories" })] })] })] }), form.buyAppliesTo !== 'any' && (_jsx(TargetEditor, { scope: form.buyAppliesTo, targetIds: form.buyTargetIds, onChange: (ids) => set({ buyTargetIds: ids }), categories: categoryOptions, productLabels: productLabels, onProductLabel: (id, name) => setProductLabels((prev) => ({ ...prev, [id]: name })), currencySymbol: currencySymbol })), _jsxs("div", { className: "grid gap-4 sm:grid-cols-4", children: [_jsxs("div", { children: [_jsx("label", { className: "admin-label", children: "Customer gets (quantity)" }), _jsx("input", { className: "admin-input w-full", type: "number", min: "1", value: form.getQuantity, onChange: (e) => set({ getQuantity: e.target.value }) })] }), _jsxs("div", { children: [_jsx("label", { className: "admin-label", children: "From" }), _jsxs("select", { className: "admin-input w-full", value: form.getAppliesTo, onChange: (e) => set({
352
363
  getAppliesTo: e.target.value,
353
364
  getTargetIds: [],
354
- }), children: [_jsx("option", { value: "any", children: "Any items" }), _jsx("option", { value: "products", children: "Specific products" }), _jsx("option", { value: "categories", children: "Specific categories" })] })] }), _jsxs("div", { children: [_jsx("label", { className: "admin-label", children: "At" }), _jsxs("select", { className: "admin-input w-full", value: form.getType, onChange: (e) => set({ getType: e.target.value }), children: [_jsx("option", { value: "free", children: "Free" }), _jsx("option", { value: "percentage", children: "Percentage off" })] })] }), form.getType === 'percentage' && (_jsxs("div", { children: [_jsx("label", { className: "admin-label", children: "Percent (%)" }), _jsx("input", { className: "admin-input w-full", type: "number", min: "1", max: "100", value: form.getValue, onChange: (e) => set({ getValue: e.target.value }) })] }))] }), form.getAppliesTo !== 'any' && (_jsx(TargetEditor, { scope: form.getAppliesTo, targetIds: form.getTargetIds, onChange: (ids) => set({ getTargetIds: ids }), categories: categoryOptions, productLabels: productLabels, onProductLabel: (id, name) => setProductLabels((prev) => ({ ...prev, [id]: name })) })), _jsxs("div", { className: "max-w-xs", children: [_jsx("label", { className: "admin-label", children: "Max uses per order (optional)" }), _jsx("input", { className: "admin-input w-full", type: "number", min: "1", value: form.maxUsesPerOrder, onChange: (e) => set({ maxUsesPerOrder: e.target.value }), placeholder: "Unlimited" })] })] })), _jsxs("div", { className: "grid gap-4 sm:grid-cols-2", children: [_jsxs("div", { children: [_jsxs("label", { className: "admin-label", children: ["Minimum purchase (", currencySymbol, ", optional)"] }), _jsx("input", { className: "admin-input w-full", type: "number", min: "0", step: "0.01", value: form.minSubtotal, onChange: (e) => set({ minSubtotal: e.target.value }), placeholder: "No minimum" })] }), _jsxs("div", { children: [_jsx("label", { className: "admin-label", children: "Minimum quantity (optional)" }), _jsx("input", { className: "admin-input w-full", type: "number", min: "0", value: form.minQuantity, onChange: (e) => set({ minQuantity: e.target.value }), placeholder: "No minimum" })] })] }), _jsxs("div", { children: [_jsx("label", { className: "admin-label", children: "Customer eligibility" }), _jsxs("select", { className: "admin-input w-full max-w-xs", value: form.eligibility, onChange: (e) => set({ eligibility: e.target.value }), children: [_jsx("option", { value: "all", children: "Everyone" }), _jsx("option", { value: "logged_in", children: "Signed-in customers" }), _jsx("option", { value: "groups", children: "Specific customer groups" })] }), form.eligibility === 'groups' && (_jsx("div", { className: "mt-2 grid max-h-32 grid-cols-1 gap-1 overflow-y-auto sm:grid-cols-2", children: groups.length === 0 ? (_jsx("p", { className: "text-xs text-[hsl(var(--admin-foreground-muted))]", children: "No customer groups yet \u2014 create some under Customers \u2192 Manage groups." })) : (groups.map((g) => (_jsxs("label", { className: "flex items-center gap-2 text-sm", children: [_jsx("input", { type: "checkbox", checked: form.groupIds.includes(g.id), onChange: (e) => set({
365
+ }), children: [_jsx("option", { value: "any", children: "Any items" }), _jsx("option", { value: "products", children: "Specific products" }), _jsx("option", { value: "categories", children: "Specific categories" })] })] }), _jsxs("div", { children: [_jsx("label", { className: "admin-label", children: "At" }), _jsxs("select", { className: "admin-input w-full", value: form.getType, onChange: (e) => set({ getType: e.target.value }), children: [_jsx("option", { value: "free", children: "Free" }), _jsx("option", { value: "percentage", children: "Percentage off" })] })] }), form.getType === 'percentage' && (_jsxs("div", { children: [_jsx("label", { className: "admin-label", children: "Percent (%)" }), _jsx("input", { className: "admin-input w-full", type: "number", min: "1", max: "100", value: form.getValue, onChange: (e) => set({ getValue: e.target.value }) })] }))] }), form.getAppliesTo !== 'any' && (_jsx(TargetEditor, { scope: form.getAppliesTo, targetIds: form.getTargetIds, onChange: (ids) => set({ getTargetIds: ids }), categories: categoryOptions, productLabels: productLabels, onProductLabel: (id, name) => setProductLabels((prev) => ({ ...prev, [id]: name })), currencySymbol: currencySymbol })), _jsxs("div", { className: "max-w-xs", children: [_jsx("label", { className: "admin-label", children: "Max uses per order (optional)" }), _jsx("input", { className: "admin-input w-full", type: "number", min: "1", value: form.maxUsesPerOrder, onChange: (e) => set({ maxUsesPerOrder: e.target.value }), placeholder: "Unlimited" })] })] })), _jsxs("div", { className: "grid gap-4 sm:grid-cols-2", children: [_jsxs("div", { children: [_jsxs("label", { className: "admin-label", children: ["Minimum purchase (", currencySymbol, ", optional)"] }), _jsx("input", { className: "admin-input w-full", type: "number", min: "0", step: "0.01", value: form.minSubtotal, onChange: (e) => set({ minSubtotal: e.target.value }), placeholder: "No minimum" })] }), _jsxs("div", { children: [_jsx("label", { className: "admin-label", children: "Minimum quantity (optional)" }), _jsx("input", { className: "admin-input w-full", type: "number", min: "0", value: form.minQuantity, onChange: (e) => set({ minQuantity: e.target.value }), placeholder: "No minimum" })] })] }), _jsxs("div", { children: [_jsx("label", { className: "admin-label", children: "Customer eligibility" }), _jsxs("select", { className: "admin-input w-full max-w-xs", value: form.eligibility, onChange: (e) => set({ eligibility: e.target.value }), children: [_jsx("option", { value: "all", children: "Everyone" }), _jsx("option", { value: "logged_in", children: "Signed-in customers" }), _jsx("option", { value: "groups", children: "Specific customer groups" })] }), form.eligibility === 'groups' && (_jsx("div", { className: "mt-2 grid max-h-32 grid-cols-1 gap-1 overflow-y-auto sm:grid-cols-2", children: groups.length === 0 ? (_jsx("p", { className: "text-xs text-[hsl(var(--admin-foreground-muted))]", children: "No customer groups yet \u2014 create some under Customers \u2192 Manage groups." })) : (groups.map((g) => (_jsxs("label", { className: "flex items-center gap-2 text-sm", children: [_jsx("input", { type: "checkbox", className: "admin-checkbox", checked: form.groupIds.includes(g.id), onChange: (e) => set({
355
366
  groupIds: e.target.checked
356
367
  ? [...form.groupIds, g.id]
357
368
  : form.groupIds.filter((x) => x !== g.id),
358
- }) }), g.name] }, g.id)))) }))] }), _jsxs("div", { className: "grid gap-4 sm:grid-cols-2", children: [_jsxs("div", { children: [_jsx("label", { className: "admin-label", children: "Total usage limit (optional)" }), _jsx("input", { className: "admin-input w-full", type: "number", min: "0", value: form.usageLimit, onChange: (e) => set({ usageLimit: e.target.value }), placeholder: "Unlimited" })] }), _jsxs("label", { className: "mt-6 flex items-center gap-2 text-sm", children: [_jsx("input", { type: "checkbox", checked: form.oncePerCustomer, onChange: (e) => set({ oncePerCustomer: e.target.checked }) }), "Limit to one use per customer"] })] }), _jsxs("div", { children: [_jsx("label", { className: "admin-label", children: "Can combine with" }), _jsxs("div", { className: "mt-1 flex flex-wrap gap-4", children: [_jsxs("label", { className: "flex items-center gap-2 text-sm", children: [_jsx("input", { type: "checkbox", checked: form.combinesProduct, onChange: (e) => set({ combinesProduct: e.target.checked }) }), "Product discounts"] }), _jsxs("label", { className: "flex items-center gap-2 text-sm", children: [_jsx("input", { type: "checkbox", checked: form.combinesOrder, onChange: (e) => set({ combinesOrder: e.target.checked }) }), "Order discounts"] }), _jsxs("label", { className: "flex items-center gap-2 text-sm", children: [_jsx("input", { type: "checkbox", checked: form.combinesShipping, onChange: (e) => set({ combinesShipping: e.target.checked }) }), "Shipping discounts"] })] })] }), _jsxs("div", { className: "grid gap-4 sm:grid-cols-2", children: [_jsxs("div", { children: [_jsx("label", { className: "admin-label", children: "Starts (optional)" }), _jsx("input", { className: "admin-input w-full", type: "datetime-local", value: form.startsAt, onChange: (e) => set({ startsAt: e.target.value }) })] }), _jsxs("div", { children: [_jsx("label", { className: "admin-label", children: "Ends (optional)" }), _jsx("input", { className: "admin-input w-full", type: "datetime-local", value: form.endsAt, onChange: (e) => set({ endsAt: e.target.value }) })] })] }), _jsxs("label", { className: "flex items-center gap-2 text-sm", children: [_jsx("input", { type: "checkbox", checked: form.enabled, onChange: (e) => set({ enabled: e.target.checked }) }), "Active"] }), _jsxs("div", { className: "flex gap-2", children: [_jsxs("button", { onClick: handleSave, disabled: isSaving, className: "admin-btn admin-btn-primary admin-btn-sm inline-flex items-center gap-1 disabled:opacity-50", children: [_jsx(Check, { className: "h-3 w-3" }), isSaving ? 'Saving…' : editing === 'new' ? 'Create discount' : 'Save changes'] }), _jsxs("button", { onClick: () => setEditing(null), disabled: isSaving, className: "admin-btn admin-btn-secondary admin-btn-sm inline-flex items-center gap-1", children: [_jsx(X, { className: "h-3 w-3" }), "Cancel"] })] })] })), isLoading ? (_jsx("div", { className: "space-y-2", children: Array.from({ length: 3 }).map((_, i) => (_jsx("div", { className: "admin-skeleton admin-skeleton-lg w-full rounded" }, i))) })) : discounts.length === 0 ? (editing === null && (_jsx("p", { className: "text-sm text-[hsl(var(--admin-foreground-muted))]", children: "No discounts yet. Create a code (e.g. WELCOME10) or an automatic promotion." }))) : (_jsx("ul", { className: "divide-y divide-[hsl(var(--admin-border))]", children: discounts.map((d) => {
369
+ }) }), g.name] }, g.id)))) }))] }), _jsxs("div", { className: "grid gap-4 sm:grid-cols-2", children: [_jsxs("div", { children: [_jsx("label", { className: "admin-label", children: "Total usage limit (optional)" }), _jsx("input", { className: "admin-input w-full", type: "number", min: "0", value: form.usageLimit, onChange: (e) => set({ usageLimit: e.target.value }), placeholder: "Unlimited" })] }), _jsxs("label", { className: "mt-6 flex items-center gap-2 text-sm", children: [_jsx("input", { type: "checkbox", className: "admin-checkbox", checked: form.oncePerCustomer, onChange: (e) => set({ oncePerCustomer: e.target.checked }) }), "Limit to one use per customer"] })] }), _jsxs("div", { children: [_jsx("label", { className: "admin-label", children: "Can combine with" }), _jsxs("div", { className: "mt-1 flex flex-wrap gap-4", children: [_jsxs("label", { className: "flex items-center gap-2 text-sm", children: [_jsx("input", { type: "checkbox", className: "admin-checkbox", checked: form.combinesProduct, onChange: (e) => set({ combinesProduct: e.target.checked }) }), "Product discounts"] }), _jsxs("label", { className: "flex items-center gap-2 text-sm", children: [_jsx("input", { type: "checkbox", className: "admin-checkbox", checked: form.combinesOrder, onChange: (e) => set({ combinesOrder: e.target.checked }) }), "Order discounts"] }), _jsxs("label", { className: "flex items-center gap-2 text-sm", children: [_jsx("input", { type: "checkbox", className: "admin-checkbox", checked: form.combinesShipping, onChange: (e) => set({ combinesShipping: e.target.checked }) }), "Shipping discounts"] })] })] }), _jsxs("div", { className: "grid gap-4 sm:grid-cols-2", children: [_jsxs("div", { children: [_jsx("label", { className: "admin-label", children: "Starts (optional)" }), _jsx(AdminDateTimePicker, { value: form.startsAt, onChange: (v) => set({ startsAt: v }), placeholder: "No start date" })] }), _jsxs("div", { children: [_jsx("label", { className: "admin-label", children: "Ends (optional)" }), _jsx(AdminDateTimePicker, { value: form.endsAt, onChange: (v) => set({ endsAt: v }), placeholder: "No end date" })] })] }), _jsxs("label", { className: "flex items-center gap-2 text-sm", children: [_jsx("input", { type: "checkbox", className: "admin-checkbox", checked: form.enabled, onChange: (e) => set({ enabled: e.target.checked }) }), "Active"] }), _jsxs("div", { className: "flex gap-2", children: [_jsxs("button", { onClick: handleSave, disabled: isSaving, className: "admin-btn admin-btn-primary admin-btn-sm inline-flex items-center gap-1 disabled:opacity-50", children: [_jsx(Check, { className: "h-3 w-3" }), isSaving ? 'Saving…' : editing === 'new' ? 'Create discount' : 'Save changes'] }), _jsxs("button", { onClick: () => setEditing(null), disabled: isSaving, className: "admin-btn admin-btn-secondary admin-btn-sm inline-flex items-center gap-1", children: [_jsx(X, { className: "h-3 w-3" }), "Cancel"] })] })] })), isLoading ? (_jsx("div", { className: "space-y-2", children: Array.from({ length: 3 }).map((_, i) => (_jsx("div", { className: "admin-skeleton admin-skeleton-lg w-full rounded" }, i))) })) : discounts.length === 0 ? (editing === null && (_jsx("p", { className: "text-sm text-[hsl(var(--admin-foreground-muted))]", children: "No discounts yet. Create a code (e.g. WELCOME10) or an automatic promotion." }))) : (_jsx("ul", { className: "divide-y divide-[hsl(var(--admin-border))]", children: discounts.map((d) => {
359
370
  const status = statusOf(d);
360
- return (_jsx("li", { className: "py-3", children: _jsxs("div", { className: "flex items-start gap-3", children: [_jsxs("div", { className: "min-w-0 flex-1", children: [_jsxs("div", { className: "flex flex-wrap items-center gap-2", children: [_jsx("p", { className: "font-medium text-[hsl(var(--admin-foreground))]", children: d.method === 'code' && d.code ? d.code : d.title }), _jsx("span", { className: `admin-badge ${status.cls}`, children: status.label }), d.method === 'automatic' && (_jsx("span", { className: "admin-badge admin-badge-neutral", children: "Automatic" })), d.eligibility === 'groups' && (_jsx("span", { className: "admin-badge admin-badge-neutral", children: "Group-only" }))] }), _jsxs("p", { className: "mt-0.5 text-sm text-[hsl(var(--admin-foreground-muted))]", children: [typeSummary(d, currencySymbol), d.method === 'code' && d.code && d.title ? ` · ${d.title}` : ''] }), _jsxs("p", { className: "mt-0.5 text-xs text-[hsl(var(--admin-foreground-muted))]", children: [d.usedCount, " used", d.usageLimit != null ? ` of ${d.usageLimit}` : '', d.oncePerCustomer ? ' · once per customer' : ''] })] }), _jsxs("label", { className: "flex shrink-0 items-center gap-1.5 text-xs text-[hsl(var(--admin-foreground-muted))]", children: [_jsx("input", { type: "checkbox", checked: d.enabled, onChange: () => handleToggleEnabled(d) }), "Active"] }), _jsxs("button", { onClick: () => startEdit(d), className: "admin-action-link inline-flex shrink-0 items-center gap-1", children: [_jsx(Pencil, { className: "h-3 w-3" }), "Edit"] }), pendingDelete === d.id ? (_jsxs("span", { className: "inline-flex shrink-0 items-center gap-2 text-xs", children: [_jsx("span", { className: "text-[hsl(var(--admin-foreground-muted))]", children: "Delete?" }), _jsx("button", { onClick: () => handleDelete(d.id), disabled: isDeletingId === d.id, className: "admin-error-text font-medium disabled:opacity-50", children: isDeletingId === d.id ? 'Deleting…' : 'Yes' }), _jsx("button", { onClick: () => setPendingDelete(null), className: "text-[hsl(var(--admin-foreground-muted))]", children: "No" })] })) : (_jsxs("button", { onClick: () => setPendingDelete(d.id), className: "admin-action-link inline-flex shrink-0 items-center gap-1", children: [_jsx(Trash2, { className: "h-3 w-3" }), "Delete"] }))] }) }, d.id));
361
- }) }))] })] }));
371
+ return (_jsx("li", { className: "py-3", children: _jsxs("div", { className: "flex items-start gap-3", children: [_jsxs("div", { className: "min-w-0 flex-1", children: [_jsxs("div", { className: "flex flex-wrap items-center gap-2", children: [_jsx("p", { className: "font-medium text-[hsl(var(--admin-foreground))]", children: d.method === 'code' && d.code ? d.code : d.title }), _jsx("span", { className: `admin-badge ${status.cls}`, children: status.label }), d.method === 'automatic' && (_jsx("span", { className: "admin-badge admin-badge-neutral", children: "Automatic" })), d.eligibility === 'groups' && (_jsx("span", { className: "admin-badge admin-badge-neutral", children: "Group-only" }))] }), _jsxs("p", { className: "mt-0.5 text-sm text-[hsl(var(--admin-foreground-muted))]", children: [typeSummary(d, currencySymbol), d.method === 'code' && d.code && d.title ? ` · ${d.title}` : ''] }), _jsxs("p", { className: "mt-0.5 text-xs text-[hsl(var(--admin-foreground-muted))]", children: [d.usedCount, " used", d.usageLimit != null ? ` of ${d.usageLimit}` : '', d.oncePerCustomer ? ' · once per customer' : ''] })] }), _jsxs("div", { className: "flex shrink-0 items-center gap-3 whitespace-nowrap", children: [_jsxs("label", { className: "flex items-center gap-1.5 text-xs text-[hsl(var(--admin-foreground-muted))]", children: [_jsx("input", { type: "checkbox", className: "admin-checkbox", checked: d.enabled, onChange: () => handleToggleEnabled(d) }), "Active"] }), _jsxs("button", { onClick: () => startEdit(d), className: "admin-action-link inline-flex items-center gap-1", children: [_jsx(Pencil, { className: "h-3 w-3" }), "Edit"] }), _jsxs("button", { onClick: () => {
372
+ setDeleteError(null);
373
+ setDeleteTarget({
374
+ id: d.id,
375
+ name: d.method === 'code' && d.code ? d.code : d.title,
376
+ });
377
+ }, className: "admin-action-link inline-flex items-center gap-1", children: [_jsx(Trash2, { className: "h-3 w-3" }), "Delete"] })] })] }) }, d.id));
378
+ }) }))] }), _jsx(DeleteConfirmDialog, { isOpen: !!deleteTarget, title: "Delete Discount", itemName: deleteTarget?.name || 'discount', itemType: "discount", isDeleting: isDeleting, error: deleteError, onConfirm: handleDeleteConfirm, onCancel: () => setDeleteTarget(null) })] }));
362
379
  }
363
380
  //# sourceMappingURL=DiscountsManager.js.map