@rovela-ai/sdk 0.7.2 → 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.
- package/dist/admin/api/customers.d.ts +32 -1
- package/dist/admin/api/customers.d.ts.map +1 -1
- package/dist/admin/api/customers.js +116 -0
- package/dist/admin/api/customers.js.map +1 -1
- package/dist/admin/api/index.d.ts +2 -2
- package/dist/admin/api/index.d.ts.map +1 -1
- package/dist/admin/api/index.js +2 -2
- package/dist/admin/api/index.js.map +1 -1
- package/dist/admin/api/orders.d.ts +29 -1
- package/dist/admin/api/orders.d.ts.map +1 -1
- package/dist/admin/api/orders.js +110 -0
- package/dist/admin/api/orders.js.map +1 -1
- package/dist/admin/api/products.d.ts +10 -1
- package/dist/admin/api/products.d.ts.map +1 -1
- package/dist/admin/api/products.js +29 -0
- package/dist/admin/api/products.js.map +1 -1
- package/dist/admin/components/BulkActionBar.d.ts +33 -0
- package/dist/admin/components/BulkActionBar.d.ts.map +1 -0
- package/dist/admin/components/BulkActionBar.js +10 -0
- package/dist/admin/components/BulkActionBar.js.map +1 -0
- package/dist/admin/components/CustomerAddressPanel.d.ts.map +1 -1
- package/dist/admin/components/CustomerAddressPanel.js +20 -9
- package/dist/admin/components/CustomerAddressPanel.js.map +1 -1
- package/dist/admin/components/CustomerGroupsManager.d.ts.map +1 -1
- package/dist/admin/components/CustomerGroupsManager.js +21 -12
- package/dist/admin/components/CustomerGroupsManager.js.map +1 -1
- package/dist/admin/components/CustomerTable.d.ts.map +1 -1
- package/dist/admin/components/CustomerTable.js +84 -6
- package/dist/admin/components/CustomerTable.js.map +1 -1
- package/dist/admin/components/DiscountsManager.d.ts.map +1 -1
- package/dist/admin/components/DiscountsManager.js +25 -12
- package/dist/admin/components/DiscountsManager.js.map +1 -1
- package/dist/admin/components/OrderTable.d.ts.map +1 -1
- package/dist/admin/components/OrderTable.js +67 -6
- package/dist/admin/components/OrderTable.js.map +1 -1
- package/dist/admin/components/PaymentMethodsManager.d.ts.map +1 -1
- package/dist/admin/components/PaymentMethodsManager.js +21 -11
- package/dist/admin/components/PaymentMethodsManager.js.map +1 -1
- package/dist/admin/components/ProductTable.d.ts.map +1 -1
- package/dist/admin/components/ProductTable.js +49 -51
- package/dist/admin/components/ProductTable.js.map +1 -1
- package/dist/admin/components/index.d.ts +2 -0
- package/dist/admin/components/index.d.ts.map +1 -1
- package/dist/admin/components/index.js +1 -0
- package/dist/admin/components/index.js.map +1 -1
- package/dist/admin/hooks/index.d.ts +2 -0
- package/dist/admin/hooks/index.d.ts.map +1 -1
- package/dist/admin/hooks/index.js +1 -0
- package/dist/admin/hooks/index.js.map +1 -1
- package/dist/admin/hooks/useAdminCustomers.d.ts.map +1 -1
- package/dist/admin/hooks/useAdminCustomers.js +31 -0
- package/dist/admin/hooks/useAdminCustomers.js.map +1 -1
- package/dist/admin/hooks/useAdminOrders.d.ts.map +1 -1
- package/dist/admin/hooks/useAdminOrders.js +30 -0
- package/dist/admin/hooks/useAdminOrders.js.map +1 -1
- package/dist/admin/hooks/useAdminProducts.d.ts.map +1 -1
- package/dist/admin/hooks/useAdminProducts.js +20 -0
- package/dist/admin/hooks/useAdminProducts.js.map +1 -1
- package/dist/admin/hooks/useBulkSelection.d.ts +32 -0
- package/dist/admin/hooks/useBulkSelection.d.ts.map +1 -0
- package/dist/admin/hooks/useBulkSelection.js +74 -0
- package/dist/admin/hooks/useBulkSelection.js.map +1 -0
- package/dist/admin/index.d.ts +3 -3
- package/dist/admin/index.d.ts.map +1 -1
- package/dist/admin/index.js +3 -3
- package/dist/admin/index.js.map +1 -1
- package/dist/admin/styles/admin-theme.css +3 -1
- package/dist/admin/types.d.ts +12 -0
- package/dist/admin/types.d.ts.map +1 -1
- package/dist/core/db/index.d.ts +1 -1
- package/dist/core/db/index.d.ts.map +1 -1
- package/dist/core/db/index.js +1 -1
- package/dist/core/db/index.js.map +1 -1
- package/dist/core/db/queries.d.ts +90 -22
- package/dist/core/db/queries.d.ts.map +1 -1
- package/dist/core/db/queries.js +28 -0
- package/dist/core/db/queries.js.map +1 -1
- package/dist/core/server/index.d.ts +1 -1
- package/dist/core/server/index.d.ts.map +1 -1
- package/dist/core/server/index.js +1 -1
- package/dist/core/server/index.js.map +1 -1
- package/package.json +1 -1
|
@@ -7,9 +7,13 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
|
7
7
|
* Styled with Rovela admin theme - uses pure CSS for hover states.
|
|
8
8
|
*/
|
|
9
9
|
import { useState, useEffect, useCallback } from 'react';
|
|
10
|
+
import { RefreshCw } from 'lucide-react';
|
|
10
11
|
import { useAdminOrders } from '../hooks/useAdminOrders';
|
|
12
|
+
import { useBulkSelection, runChunkedBulk } from '../hooks/useBulkSelection';
|
|
11
13
|
import { useStoreSettingsOptional } from '../../core/StoreSettingsProvider';
|
|
12
14
|
import { AdminSelect } from './AdminSelect';
|
|
15
|
+
import { BulkActionBar } from './BulkActionBar';
|
|
16
|
+
import { DeleteConfirmDialog } from './DeleteConfirmDialog';
|
|
13
17
|
// =============================================================================
|
|
14
18
|
// Status Badge - Pure CSS Classes
|
|
15
19
|
// =============================================================================
|
|
@@ -25,8 +29,8 @@ function StatusBadge({ status }) {
|
|
|
25
29
|
const badgeClass = statusBadgeClass[status] || 'admin-badge-neutral';
|
|
26
30
|
return (_jsx("span", { className: `admin-badge ${badgeClass}`, children: status.charAt(0).toUpperCase() + status.slice(1) }));
|
|
27
31
|
}
|
|
28
|
-
function OrderRow({ order, onOrderClick, onStatusChange, formatCurrency, formatDate }) {
|
|
29
|
-
return (_jsxs("tr", { className:
|
|
32
|
+
function OrderRow({ order, isSelected, onToggleSelect, onOrderClick, onStatusChange, formatCurrency, formatDate }) {
|
|
33
|
+
return (_jsxs("tr", { className: `admin-table-row ${isSelected ? 'admin-table-row-selected' : ''}`, children: [_jsx("td", { className: "px-4 py-4 w-12", children: _jsx("input", { type: "checkbox", className: "admin-checkbox", checked: isSelected, onChange: () => onToggleSelect(order.id), "aria-label": `Select order ${order.id.slice(-8).toUpperCase()}` }) }), _jsx("td", { className: "px-6 py-4", children: _jsxs("button", { onClick: () => onOrderClick?.(order.id), className: "admin-table-row-link", children: ["#", order.id.slice(-8).toUpperCase()] }) }), _jsx("td", { className: "px-6 py-4 text-sm", children: order.email }), _jsx("td", { className: "px-6 py-4", children: _jsx(StatusBadge, { status: order.status }) }), _jsx("td", { className: "px-6 py-4 text-sm font-medium", children: formatCurrency(order.total) }), _jsx("td", { className: "px-6 py-4 text-sm admin-text-muted", children: formatDate(order.createdAt) }), _jsx("td", { className: "px-6 py-4", children: _jsx(AdminSelect, { value: order.status, onChange: (value) => onStatusChange(order.id, value), disabled: order.status === 'refunded' || order.status === 'cancelled', size: "sm", options: [
|
|
30
34
|
{ value: 'pending', label: 'Pending' },
|
|
31
35
|
{ value: 'paid', label: 'Paid' },
|
|
32
36
|
{ value: 'shipped', label: 'Shipped' },
|
|
@@ -49,7 +53,7 @@ function OrderRow({ order, onOrderClick, onStatusChange, formatCurrency, formatD
|
|
|
49
53
|
* ```
|
|
50
54
|
*/
|
|
51
55
|
export function OrderTable({ initialSearch, initialStatus, pageSize = 20, onOrderClick, className = '', }) {
|
|
52
|
-
const { orders, total, page, isLoading, fetchOrders, updateStatus } = useAdminOrders();
|
|
56
|
+
const { orders, total, page, isLoading, fetchOrders, updateStatus, fetchAllMatchingIds, bulkUpdateStatus, } = useAdminOrders();
|
|
53
57
|
// Get currency from context
|
|
54
58
|
const storeSettings = useStoreSettingsOptional();
|
|
55
59
|
const resolvedCurrency = storeSettings?.currency ?? 'USD';
|
|
@@ -57,6 +61,13 @@ export function OrderTable({ initialSearch, initialStatus, pageSize = 20, onOrde
|
|
|
57
61
|
const [search, setSearch] = useState(initialSearch || '');
|
|
58
62
|
const [status, setStatus] = useState(initialStatus || '');
|
|
59
63
|
const [sort, setSort] = useState('newest');
|
|
64
|
+
// Bulk selection (shared state machine — survives page changes, resets on
|
|
65
|
+
// filter changes; Select-all-matching via the ids-only fetch).
|
|
66
|
+
const { selected, isAllMatching, toggle: toggleSelect, togglePage: togglePageSelect, selectAllMatching, reset: resetSelection, } = useBulkSelection();
|
|
67
|
+
const [isProcessing, setIsProcessing] = useState(false);
|
|
68
|
+
const [isExpandingSelection, setIsExpandingSelection] = useState(false);
|
|
69
|
+
const [bulkStatus, setBulkStatus] = useState('');
|
|
70
|
+
const [bulkConfirmOpen, setBulkConfirmOpen] = useState(false);
|
|
60
71
|
// Fetch orders on filter change
|
|
61
72
|
useEffect(() => {
|
|
62
73
|
fetchOrders({
|
|
@@ -66,7 +77,9 @@ export function OrderTable({ initialSearch, initialStatus, pageSize = 20, onOrde
|
|
|
66
77
|
page: 1,
|
|
67
78
|
limit: pageSize,
|
|
68
79
|
});
|
|
69
|
-
|
|
80
|
+
// Selection resets with the filter (page changes deliberately keep it).
|
|
81
|
+
resetSelection();
|
|
82
|
+
}, [search, status, sort, pageSize, fetchOrders, resetSelection]);
|
|
70
83
|
const handlePageChange = useCallback((newPage) => {
|
|
71
84
|
fetchOrders({
|
|
72
85
|
search: search || undefined,
|
|
@@ -76,6 +89,40 @@ export function OrderTable({ initialSearch, initialStatus, pageSize = 20, onOrde
|
|
|
76
89
|
limit: pageSize,
|
|
77
90
|
});
|
|
78
91
|
}, [search, status, sort, pageSize, fetchOrders]);
|
|
92
|
+
const handleSelectAllOnPage = useCallback(() => {
|
|
93
|
+
togglePageSelect(orders.map((o) => o.id));
|
|
94
|
+
}, [orders, togglePageSelect]);
|
|
95
|
+
const handleSelectAllMatching = useCallback(async () => {
|
|
96
|
+
setIsExpandingSelection(true);
|
|
97
|
+
const ids = await fetchAllMatchingIds({ status: status || undefined });
|
|
98
|
+
setIsExpandingSelection(false);
|
|
99
|
+
if (ids)
|
|
100
|
+
selectAllMatching(ids);
|
|
101
|
+
}, [status, fetchAllMatchingIds, selectAllMatching]);
|
|
102
|
+
const performBulkStatus = useCallback(async () => {
|
|
103
|
+
if (!bulkStatus)
|
|
104
|
+
return;
|
|
105
|
+
const ids = Array.from(selected);
|
|
106
|
+
if (ids.length === 0)
|
|
107
|
+
return;
|
|
108
|
+
setIsProcessing(true);
|
|
109
|
+
// Chunked: the server caps at 100 ids/request.
|
|
110
|
+
const result = await runChunkedBulk(ids, (chunk) => bulkUpdateStatus(chunk, bulkStatus));
|
|
111
|
+
setIsProcessing(false);
|
|
112
|
+
setBulkConfirmOpen(false);
|
|
113
|
+
setBulkStatus('');
|
|
114
|
+
resetSelection();
|
|
115
|
+
fetchOrders({
|
|
116
|
+
search: search || undefined,
|
|
117
|
+
status: status || undefined,
|
|
118
|
+
sort,
|
|
119
|
+
page,
|
|
120
|
+
limit: pageSize,
|
|
121
|
+
});
|
|
122
|
+
if (result.failed.length > 0) {
|
|
123
|
+
console.warn(`[OrderTable] Bulk status=${bulkStatus}: ${result.succeeded.length} succeeded, ${result.failed.length} failed`, result.failed);
|
|
124
|
+
}
|
|
125
|
+
}, [bulkStatus, selected, bulkUpdateStatus, resetSelection, fetchOrders, search, status, sort, page, pageSize]);
|
|
79
126
|
const handleStatusChange = useCallback(async (orderId, newStatus) => {
|
|
80
127
|
const result = await updateStatus(orderId, newStatus);
|
|
81
128
|
if (result.success) {
|
|
@@ -99,7 +146,15 @@ export function OrderTable({ initialSearch, initialStatus, pageSize = 20, onOrde
|
|
|
99
146
|
}).format(parseFloat(value));
|
|
100
147
|
};
|
|
101
148
|
const totalPages = Math.ceil(total / pageSize);
|
|
102
|
-
|
|
149
|
+
const allOnPageSelected = orders.length > 0 && orders.every((o) => selected.has(o.id));
|
|
150
|
+
const someOnPageSelected = orders.length > 0 && orders.some((o) => selected.has(o.id));
|
|
151
|
+
return (_jsxs("div", { className: `space-y-4 ${className}`, children: [selected.size > 0 ? (_jsxs(BulkActionBar, { count: selected.size, total: total, isAllMatching: isAllMatching, noun: "order", isProcessing: isProcessing, onSelectAllMatching: handleSelectAllMatching, isExpandingSelection: isExpandingSelection, onClear: resetSelection, children: [_jsx(AdminSelect, { value: bulkStatus, onChange: (value) => setBulkStatus(value), placeholder: "Set status\u2026", size: "sm", options: [
|
|
152
|
+
{ value: 'pending', label: 'Pending' },
|
|
153
|
+
{ value: 'paid', label: 'Paid' },
|
|
154
|
+
{ value: 'shipped', label: 'Shipped' },
|
|
155
|
+
{ value: 'delivered', label: 'Delivered' },
|
|
156
|
+
{ value: 'cancelled', label: 'Cancelled' },
|
|
157
|
+
], className: "min-w-[140px]" }), _jsxs("button", { type: "button", onClick: () => setBulkConfirmOpen(true), disabled: isProcessing || !bulkStatus, className: "admin-btn admin-btn-primary admin-btn-sm", children: [_jsx(RefreshCw, { className: "h-4 w-4" }), "Apply"] })] })) : (_jsxs("div", { className: "admin-filter-bar", children: [_jsx("input", { type: "text", value: search, onChange: (e) => setSearch(e.target.value), placeholder: "Search by order ID or email...", className: "admin-filter-search" }), _jsx(AdminSelect, { value: status, onChange: (value) => setStatus(value), placeholder: "All Status", options: [
|
|
103
158
|
{ value: '', label: 'All Status' },
|
|
104
159
|
{ value: 'pending', label: 'Pending' },
|
|
105
160
|
{ value: 'paid', label: 'Paid' },
|
|
@@ -112,6 +167,12 @@ export function OrderTable({ initialSearch, initialStatus, pageSize = 20, onOrde
|
|
|
112
167
|
{ value: 'oldest', label: 'Oldest First' },
|
|
113
168
|
{ value: 'total-desc', label: 'Highest Total' },
|
|
114
169
|
{ value: 'total-asc', label: 'Lowest Total' },
|
|
115
|
-
], className: "w-[150px]" })] }), _jsxs("div", { className: "admin-card", children: [_jsx("div", { className: "overflow-x-auto overflow-y-visible", children: _jsxs("table", { className: "admin-table w-full", children: [_jsx("thead", { children: _jsxs("tr", { className: "admin-table-header", children: [_jsx("th", { className: "px-
|
|
170
|
+
], className: "w-[150px]" })] })), _jsxs("div", { className: "admin-card", children: [_jsx("div", { className: "overflow-x-auto overflow-y-visible", 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) => {
|
|
171
|
+
if (el)
|
|
172
|
+
el.indeterminate = someOnPageSelected && !allOnPageSelected;
|
|
173
|
+
}, onChange: handleSelectAllOnPage, "aria-label": "Select all orders on this page" }) }), _jsx("th", { className: "px-6 py-3 text-left", children: "Order" }), _jsx("th", { className: "px-6 py-3 text-left", children: "Customer" }), _jsx("th", { className: "px-6 py-3 text-left", children: "Status" }), _jsx("th", { className: "px-6 py-3 text-left", children: "Total" }), _jsx("th", { className: "px-6 py-3 text-left", children: "Date" }), _jsx("th", { className: "px-6 py-3 text-left", children: "Actions" })] }) }), _jsx("tbody", { children: isLoading ? ([...Array(5)].map((_, i) => (_jsxs("tr", { className: "admin-table-row", children: [_jsx("td", { className: "px-4 py-4 w-12", children: _jsx("div", { className: "admin-skeleton admin-skeleton-md w-4 rounded" }) }), _jsx("td", { className: "px-6 py-4", children: _jsx("div", { className: "admin-skeleton admin-skeleton-md w-24 rounded" }) }), _jsx("td", { className: "px-6 py-4", children: _jsx("div", { className: "admin-skeleton admin-skeleton-md w-32 rounded" }) }), _jsx("td", { className: "px-6 py-4", children: _jsx("div", { className: "admin-skeleton admin-skeleton-lg w-16 rounded" }) }), _jsx("td", { className: "px-6 py-4", children: _jsx("div", { className: "admin-skeleton admin-skeleton-md w-20 rounded" }) }), _jsx("td", { className: "px-6 py-4", children: _jsx("div", { className: "admin-skeleton admin-skeleton-md w-28 rounded" }) }), _jsx("td", { className: "px-6 py-4", children: _jsx("div", { className: "admin-skeleton admin-skeleton-md w-20 rounded" }) })] }, i)))) : orders.length === 0 ? (_jsx("tr", { children: _jsx("td", { colSpan: 7, className: "px-6 py-12 text-center admin-empty-text", children: "No orders found" }) })) : (orders.map((order) => (_jsx(OrderRow, { order: order, isSelected: selected.has(order.id), onToggleSelect: toggleSelect, onOrderClick: onOrderClick, onStatusChange: handleStatusChange, formatCurrency: formatCurrency, formatDate: formatDate }, order.id)))) })] }) }), totalPages > 1 && (_jsxs("div", { className: "admin-pagination px-6", children: [_jsxs("p", { className: "admin-pagination-info", children: ["Showing ", (page - 1) * pageSize + 1, " to ", Math.min(page * pageSize, total), " of ", total] }), _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" })] })] }))] }), _jsx(DeleteConfirmDialog, { isOpen: bulkConfirmOpen, title: `Update ${selected.size} order${selected.size === 1 ? '' : 's'}`, itemName: "", description: `Set ${selected.size} order${selected.size === 1 ? '' : 's'} to "${bulkStatus}"? Customers will be notified by email.`, confirmLabel: "Update", busyLabel: "Updating...", variant: bulkStatus === 'cancelled' ? 'destructive' : 'primary', isDeleting: isProcessing, onConfirm: performBulkStatus, onCancel: () => {
|
|
174
|
+
if (!isProcessing)
|
|
175
|
+
setBulkConfirmOpen(false);
|
|
176
|
+
} })] }));
|
|
116
177
|
}
|
|
117
178
|
//# sourceMappingURL=OrderTable.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"OrderTable.js","sourceRoot":"","sources":["../../../src/admin/components/OrderTable.tsx"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"OrderTable.js","sourceRoot":"","sources":["../../../src/admin/components/OrderTable.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PaymentMethodsManager.d.ts","sourceRoot":"","sources":["../../../src/admin/components/PaymentMethodsManager.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"PaymentMethodsManager.d.ts","sourceRoot":"","sources":["../../../src/admin/components/PaymentMethodsManager.tsx"],"names":[],"mappings":"AAkBA,MAAM,WAAW,0BAA0B;IACzC,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AASD,wBAAgB,qBAAqB,CAAC,EAAE,SAAc,EAAE,EAAE,0BAA0B,2CAsRnF"}
|
|
@@ -12,6 +12,7 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
|
12
12
|
import { useState } from 'react';
|
|
13
13
|
import { Wallet, Plus, Pencil, Trash2, Check, X } from 'lucide-react';
|
|
14
14
|
import { useAdminPaymentMethods } from '../hooks/useAdminPaymentMethods';
|
|
15
|
+
import { DeleteConfirmDialog } from './DeleteConfirmDialog';
|
|
15
16
|
const EMPTY_FORM = { name: '', instructions: '' };
|
|
16
17
|
export function PaymentMethodsManager({ className = '' }) {
|
|
17
18
|
const { methods, isLoading, error, createMethod, updateMethod, deleteMethod } = useAdminPaymentMethods();
|
|
@@ -21,8 +22,9 @@ export function PaymentMethodsManager({ className = '' }) {
|
|
|
21
22
|
const [editingId, setEditingId] = useState(null);
|
|
22
23
|
const [editForm, setEditForm] = useState(EMPTY_FORM);
|
|
23
24
|
const [isSavingEdit, setIsSavingEdit] = useState(false);
|
|
24
|
-
const [
|
|
25
|
-
const [
|
|
25
|
+
const [deleteTarget, setDeleteTarget] = useState(null);
|
|
26
|
+
const [isDeleting, setIsDeleting] = useState(false);
|
|
27
|
+
const [deleteError, setDeleteError] = useState(null);
|
|
26
28
|
const [actionError, setActionError] = useState(null);
|
|
27
29
|
async function handleCreate() {
|
|
28
30
|
if (!createForm.name.trim())
|
|
@@ -65,14 +67,19 @@ export function PaymentMethodsManager({ className = '' }) {
|
|
|
65
67
|
if (!res.success)
|
|
66
68
|
setActionError(res.error || 'Failed to update payment method');
|
|
67
69
|
}
|
|
68
|
-
async function
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
70
|
+
async function handleDeleteConfirm() {
|
|
71
|
+
if (!deleteTarget)
|
|
72
|
+
return;
|
|
73
|
+
setIsDeleting(true);
|
|
74
|
+
setDeleteError(null);
|
|
75
|
+
const res = await deleteMethod(deleteTarget.id);
|
|
76
|
+
setIsDeleting(false);
|
|
77
|
+
if (res.success) {
|
|
78
|
+
setDeleteTarget(null);
|
|
79
|
+
}
|
|
80
|
+
else {
|
|
81
|
+
setDeleteError(res.error || 'Failed to delete payment method');
|
|
82
|
+
}
|
|
76
83
|
}
|
|
77
84
|
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(Wallet, { className: "h-5 w-5 text-[hsl(var(--admin-primary))]" }), _jsx("h2", { className: "text-lg font-semibold text-[hsl(var(--admin-foreground))]", children: "Payment Methods" })] }), !showCreate && (_jsxs("button", { type: "button", onClick: () => {
|
|
78
85
|
setActionError(null);
|
|
@@ -87,6 +94,9 @@ export function PaymentMethodsManager({ className = '' }) {
|
|
|
87
94
|
instructions: method.instructions || '',
|
|
88
95
|
});
|
|
89
96
|
setActionError(null);
|
|
90
|
-
}, className: "admin-action-link inline-flex items-center gap-1", children: [_jsx(Pencil, { className: "h-3 w-3" }), "Edit"] }),
|
|
97
|
+
}, className: "admin-action-link inline-flex items-center gap-1", children: [_jsx(Pencil, { className: "h-3 w-3" }), "Edit"] }), _jsxs("button", { onClick: () => {
|
|
98
|
+
setDeleteError(null);
|
|
99
|
+
setDeleteTarget({ id: method.id, name: method.name });
|
|
100
|
+
}, className: "admin-action-link inline-flex items-center gap-1", children: [_jsx(Trash2, { className: "h-3 w-3" }), "Delete"] })] })] })) }, method.id))) }))] }), _jsx(DeleteConfirmDialog, { isOpen: !!deleteTarget, title: "Delete Payment Method", itemName: deleteTarget?.name || 'payment method', itemType: "payment method", isDeleting: isDeleting, error: deleteError, onConfirm: handleDeleteConfirm, onCancel: () => setDeleteTarget(null) })] }));
|
|
91
101
|
}
|
|
92
102
|
//# sourceMappingURL=PaymentMethodsManager.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PaymentMethodsManager.js","sourceRoot":"","sources":["../../../src/admin/components/PaymentMethodsManager.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAA;;AAEZ;;;;;;;;GAQG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;AAChC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,cAAc,CAAA;AACrE,OAAO,EAAE,sBAAsB,EAAE,MAAM,iCAAiC,CAAA;
|
|
1
|
+
{"version":3,"file":"PaymentMethodsManager.js","sourceRoot":"","sources":["../../../src/admin/components/PaymentMethodsManager.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ProductTable.d.ts","sourceRoot":"","sources":["../../../src/admin/components/ProductTable.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"ProductTable.d.ts","sourceRoot":"","sources":["../../../src/admin/components/ProductTable.tsx"],"names":[],"mappings":"AAqCA,OAAO,KAAK,EACV,iBAAiB,EAIlB,MAAM,UAAU,CAAA;AAgYjB;;;;;;;;;;GAUG;AACH,wBAAgB,YAAY,CAAC,EAC3B,aAAa,EACb,eAAe,EACf,aAAa,EACb,QAAa,EACb,cAAc,EACd,SAAc,GACf,EAAE,iBAAiB,2CAmenB"}
|
|
@@ -17,11 +17,13 @@ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-run
|
|
|
17
17
|
* Back-compat: every existing `ProductTableProps` field is preserved.
|
|
18
18
|
*/
|
|
19
19
|
import { useState, useEffect, useCallback, useMemo } from 'react';
|
|
20
|
-
import { ImageIcon, Pencil, Trash2, CheckCircle2, Archive,
|
|
20
|
+
import { ImageIcon, Pencil, Trash2, CheckCircle2, Archive, TrendingUp, AlertTriangle, Package, } from 'lucide-react';
|
|
21
21
|
import { useAdminProducts } from '../hooks/useAdminProducts';
|
|
22
22
|
import { useAdminProductMetrics } from '../hooks/useAdminProductMetrics';
|
|
23
|
+
import { useBulkSelection, runChunkedBulk } from '../hooks/useBulkSelection';
|
|
23
24
|
import { useStoreSettingsOptional } from '../../core/StoreSettingsProvider';
|
|
24
25
|
import { AdminSelect } from './AdminSelect';
|
|
26
|
+
import { BulkActionBar } from './BulkActionBar';
|
|
25
27
|
import { DeleteConfirmDialog } from './DeleteConfirmDialog';
|
|
26
28
|
const CHIP_LABELS = {
|
|
27
29
|
all: 'All',
|
|
@@ -138,14 +140,6 @@ function ChipRow({ active, onChange, disabled, }) {
|
|
|
138
140
|
return (_jsx("button", { type: "button", role: "tab", "aria-selected": isActive, disabled: disabled, onClick: () => onChange(chip), className: `admin-chip ${isActive ? 'admin-chip-active' : ''}`, children: CHIP_LABELS[chip] }, chip));
|
|
139
141
|
}) }));
|
|
140
142
|
}
|
|
141
|
-
// =============================================================================
|
|
142
|
-
// Bulk Action Bar
|
|
143
|
-
// =============================================================================
|
|
144
|
-
function BulkActionBar({ count, selectedAreAllArchived, isProcessing, onActivate, onArchive, onDelete, onClear, }) {
|
|
145
|
-
return (_jsxs("div", { className: "admin-bulk-bar", role: "region", "aria-label": "Bulk actions", children: [_jsxs("div", { className: "admin-bulk-bar-count", children: [_jsx(CheckCircle2, { className: "h-4 w-4" }), _jsxs("span", { children: [_jsx("strong", { children: count }), " selected"] })] }), _jsxs("div", { className: "admin-bulk-bar-actions", children: [_jsxs("button", { type: "button", onClick: onActivate, disabled: isProcessing, className: "admin-btn admin-btn-secondary admin-btn-sm", children: [_jsx(CheckCircle2, { className: "h-4 w-4" }), "Activate"] }), _jsxs("button", { type: "button", onClick: onArchive, disabled: isProcessing, className: "admin-btn admin-btn-secondary admin-btn-sm", children: [_jsx(Archive, { className: "h-4 w-4" }), "Archive"] }), _jsxs("button", { type: "button", onClick: onDelete, disabled: isProcessing || !selectedAreAllArchived, title: selectedAreAllArchived
|
|
146
|
-
? 'Permanently delete selected'
|
|
147
|
-
: 'Archive these products first, then delete', className: "admin-btn admin-btn-danger admin-btn-sm", children: [_jsx(Trash2, { className: "h-4 w-4" }), "Delete"] }), _jsx("button", { type: "button", onClick: onClear, disabled: isProcessing, "aria-label": "Clear selection", className: "admin-bulk-bar-clear", children: _jsx(X, { className: "h-4 w-4" }) })] })] }));
|
|
148
|
-
}
|
|
149
143
|
function ProductRow({ product: p, isSelected, onToggleSelect, onProductClick, onDeleteClick, formatCurrency, }) {
|
|
150
144
|
return (_jsxs("tr", { className: `admin-table-row ${isSelected ? 'admin-table-row-selected' : ''}`, children: [_jsx("td", { className: "px-4 py-4 w-12", children: _jsx("input", { type: "checkbox", className: "admin-checkbox", checked: isSelected, onChange: () => onToggleSelect(p.id), "aria-label": `Select ${p.name}` }) }), _jsx("td", { className: "px-6 py-4", children: _jsxs("div", { className: "flex items-center gap-3", children: [p.images?.[0] ? (
|
|
151
145
|
// 40px admin-only thumbnail; next/image's perf wins don't apply at this scale
|
|
@@ -155,12 +149,12 @@ function ProductRow({ product: p, isSelected, onToggleSelect, onProductClick, on
|
|
|
155
149
|
e.preventDefault();
|
|
156
150
|
onProductClick(p.id);
|
|
157
151
|
}
|
|
158
|
-
}, className: "admin-inventory-item-link", children: p.name })] }) }), _jsx("td", { className: "px-6 py-4", children: _jsx(StatusBadge, { status: p.status }) }), _jsx("td", { className: "px-6 py-4 text-sm font-medium", children: formatCurrency(p.price) }), _jsx("td", { className: "px-6 py-4 text-sm", children: _jsx(InventoryCell, { product: p }) }), _jsx("td", { className: "px-6 py-4", children: _jsxs("div", { className: "flex items-center justify-
|
|
152
|
+
}, className: "admin-inventory-item-link", children: p.name })] }) }), _jsx("td", { className: "px-6 py-4", children: _jsx(StatusBadge, { status: p.status }) }), _jsx("td", { className: "px-6 py-4 text-sm font-medium", children: formatCurrency(p.price) }), _jsx("td", { className: "px-6 py-4 text-sm", children: _jsx(InventoryCell, { product: p }) }), _jsx("td", { className: "px-6 py-4", children: _jsxs("div", { className: "flex items-center justify-start gap-2", children: [_jsx("a", { href: `/admin/products/${p.id}`, onClick: (e) => {
|
|
159
153
|
if (onProductClick) {
|
|
160
154
|
e.preventDefault();
|
|
161
155
|
onProductClick(p.id);
|
|
162
156
|
}
|
|
163
|
-
}, className: "p-2 rounded-md hover:bg-[hsl(var(--admin-background-subtle))] text-[hsl(var(--admin-foreground-muted))] hover:text-[hsl(var(--admin-foreground))] transition-colors", "aria-label": "Edit product", children: _jsx(Pencil, { className: "h-4 w-4" }) }), _jsx("button", { type: "button", onClick: () => onDeleteClick(p.id, p.name), className: "p-2 rounded-md hover:bg-[hsl(var(--admin-error)/0.1)] text-[hsl(var(--admin-foreground-muted))] hover:text-[hsl(var(--admin-error))] transition-colors", "aria-label": "Delete product", children: _jsx(Trash2, { className: "h-4 w-4" }) })] }) })] }));
|
|
157
|
+
}, className: "p-2 -ml-2 rounded-md hover:bg-[hsl(var(--admin-background-subtle))] text-[hsl(var(--admin-foreground-muted))] hover:text-[hsl(var(--admin-foreground))] transition-colors", "aria-label": "Edit product", children: _jsx(Pencil, { className: "h-4 w-4" }) }), _jsx("button", { type: "button", onClick: () => onDeleteClick(p.id, p.name), className: "p-2 rounded-md hover:bg-[hsl(var(--admin-error)/0.1)] text-[hsl(var(--admin-foreground-muted))] hover:text-[hsl(var(--admin-error))] transition-colors", "aria-label": "Delete product", children: _jsx(Trash2, { className: "h-4 w-4" }) })] }) })] }));
|
|
164
158
|
}
|
|
165
159
|
// =============================================================================
|
|
166
160
|
// Component
|
|
@@ -177,7 +171,7 @@ function ProductRow({ product: p, isSelected, onToggleSelect, onProductClick, on
|
|
|
177
171
|
* ```
|
|
178
172
|
*/
|
|
179
173
|
export function ProductTable({ initialSearch, initialCategory, initialStatus, pageSize = 20, onProductClick, className = '', }) {
|
|
180
|
-
const { products, total, page, isLoading, fetchProducts, deleteProduct, bulkAction, } = useAdminProducts();
|
|
174
|
+
const { products, total, page, isLoading, fetchProducts, deleteProduct, bulkAction, fetchAllMatchingIds, } = useAdminProducts();
|
|
181
175
|
const { metrics, isLoading: isMetricsLoading, fetchMetrics } = useAdminProductMetrics();
|
|
182
176
|
// Get currency from context
|
|
183
177
|
const storeSettings = useStoreSettingsOptional();
|
|
@@ -187,26 +181,36 @@ export function ProductTable({ initialSearch, initialCategory, initialStatus, pa
|
|
|
187
181
|
const [search, setSearch] = useState(initialSearch || '');
|
|
188
182
|
const [chip, setChip] = useState(() => initialStatusToChip(initialStatus));
|
|
189
183
|
const [sort, setSort] = useState('newest');
|
|
190
|
-
// Selection
|
|
191
|
-
|
|
184
|
+
// Selection — shared state machine (survives page changes, resets on
|
|
185
|
+
// filter changes; supports Select-all-matching via the ids-only fetch).
|
|
186
|
+
const { selected, isAllMatching, toggle: toggleSelect, togglePage: togglePageSelect, selectAllMatching, reset: resetSelection, } = useBulkSelection();
|
|
192
187
|
const [isProcessing, setIsProcessing] = useState(false);
|
|
188
|
+
const [isExpandingSelection, setIsExpandingSelection] = useState(false);
|
|
193
189
|
// Single-row delete dialog
|
|
194
190
|
const [deleteTarget, setDeleteTarget] = useState(null);
|
|
195
191
|
const [isDeleting, setIsDeleting] = useState(false);
|
|
196
192
|
const [deleteError, setDeleteError] = useState(null);
|
|
197
193
|
// Bulk confirmation dialog
|
|
198
194
|
const [bulkConfirm, setBulkConfirm] = useState(null);
|
|
199
|
-
// Derived:
|
|
200
|
-
// button enable state in the bulk bar.
|
|
195
|
+
// Derived: is every selected product known to be archived? Drives the
|
|
196
|
+
// Delete button enable state in the bulk bar. On the Archived chip the
|
|
197
|
+
// filter itself guarantees it (selection resets on chip change, so every
|
|
198
|
+
// selected id came from archived pages). Otherwise every selected id must
|
|
199
|
+
// be visible on the current page AND archived — cross-page ids of unknown
|
|
200
|
+
// status disable Delete. The server re-validates regardless.
|
|
201
201
|
const selectedAreAllArchived = useMemo(() => {
|
|
202
202
|
if (selected.size === 0)
|
|
203
203
|
return false;
|
|
204
|
-
|
|
205
|
-
|
|
204
|
+
if (chip === 'archived')
|
|
205
|
+
return true;
|
|
206
|
+
const byId = new Map(products.map((p) => [p.id, p]));
|
|
207
|
+
for (const id of selected) {
|
|
208
|
+
const p = byId.get(id);
|
|
209
|
+
if (!p || p.status !== 'archived')
|
|
206
210
|
return false;
|
|
207
211
|
}
|
|
208
212
|
return true;
|
|
209
|
-
}, [selected, products]);
|
|
213
|
+
}, [selected, products, chip]);
|
|
210
214
|
// Fetch products on filter change.
|
|
211
215
|
// Pattern A — reset internal selection on filter prop changes.
|
|
212
216
|
// Alternative is `<ProductTable key={filterSignature}/>` parent remount.
|
|
@@ -222,10 +226,9 @@ export function ProductTable({ initialSearch, initialCategory, initialStatus, pa
|
|
|
222
226
|
limit: pageSize,
|
|
223
227
|
});
|
|
224
228
|
// Clear selection on filter change so the user doesn't accidentally
|
|
225
|
-
// bulk-act on rows they can't see.
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
}, [search, chip, sort, pageSize, initialCategory, fetchProducts]);
|
|
229
|
+
// bulk-act on rows they can't see. (Page changes deliberately keep it.)
|
|
230
|
+
resetSelection();
|
|
231
|
+
}, [search, chip, sort, pageSize, initialCategory, fetchProducts, resetSelection]);
|
|
229
232
|
// One-time metric fetch on mount (re-fetched after every successful action)
|
|
230
233
|
useEffect(() => {
|
|
231
234
|
fetchMetrics();
|
|
@@ -263,34 +266,25 @@ export function ProductTable({ initialSearch, initialCategory, initialStatus, pa
|
|
|
263
266
|
page: newPage,
|
|
264
267
|
limit: pageSize,
|
|
265
268
|
});
|
|
266
|
-
|
|
269
|
+
// Selection deliberately survives page changes (verify-then-act).
|
|
267
270
|
}, [search, chip, sort, pageSize, initialCategory, fetchProducts]);
|
|
268
271
|
// ---- Selection handlers ------------------------------------------------
|
|
269
|
-
const handleToggleSelect = useCallback((id) => {
|
|
270
|
-
setSelected((prev) => {
|
|
271
|
-
const next = new Set(prev);
|
|
272
|
-
if (next.has(id))
|
|
273
|
-
next.delete(id);
|
|
274
|
-
else
|
|
275
|
-
next.add(id);
|
|
276
|
-
return next;
|
|
277
|
-
});
|
|
278
|
-
}, []);
|
|
279
272
|
const handleSelectAllOnPage = useCallback(() => {
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
273
|
+
togglePageSelect(products.map((p) => p.id));
|
|
274
|
+
}, [products, togglePageSelect]);
|
|
275
|
+
const handleSelectAllMatching = useCallback(async () => {
|
|
276
|
+
setIsExpandingSelection(true);
|
|
277
|
+
const filter = chipToFilter(chip);
|
|
278
|
+
const ids = await fetchAllMatchingIds({
|
|
279
|
+
search: search || undefined,
|
|
280
|
+
category: initialCategory || undefined,
|
|
281
|
+
status: filter.status,
|
|
282
|
+
outOfStock: filter.outOfStock,
|
|
289
283
|
});
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
}, []);
|
|
284
|
+
setIsExpandingSelection(false);
|
|
285
|
+
if (ids)
|
|
286
|
+
selectAllMatching(ids);
|
|
287
|
+
}, [chip, search, initialCategory, fetchAllMatchingIds, selectAllMatching]);
|
|
294
288
|
// ---- Single-row delete (existing flow, unchanged) -----------------------
|
|
295
289
|
const handleDeleteClick = useCallback((id, name) => {
|
|
296
290
|
setDeleteTarget({ id, name });
|
|
@@ -323,12 +317,14 @@ export function ProductTable({ initialSearch, initialCategory, initialStatus, pa
|
|
|
323
317
|
if (ids.length === 0)
|
|
324
318
|
return;
|
|
325
319
|
setIsProcessing(true);
|
|
326
|
-
|
|
320
|
+
// Chunked: the server caps at 100 ids/request; select-all-matching
|
|
321
|
+
// selections can be much larger.
|
|
322
|
+
const result = await runChunkedBulk(ids, (chunk) => bulkAction(chunk, action));
|
|
327
323
|
setIsProcessing(false);
|
|
328
324
|
setBulkConfirm(null);
|
|
329
325
|
// Refresh the page + metrics regardless of partial-success outcome.
|
|
330
326
|
refetchAll();
|
|
331
|
-
|
|
327
|
+
resetSelection();
|
|
332
328
|
// Surface partial failures via console — the parent app can wire a toast
|
|
333
329
|
// by inspecting the hook return if needed. We deliberately don't throw
|
|
334
330
|
// because the SDK shouldn't depend on a toast library.
|
|
@@ -368,7 +364,9 @@ export function ProductTable({ initialSearch, initialCategory, initialStatus, pa
|
|
|
368
364
|
const totalPages = Math.ceil(total / pageSize);
|
|
369
365
|
const allOnPageSelected = products.length > 0 && products.every((p) => selected.has(p.id));
|
|
370
366
|
const someOnPageSelected = products.length > 0 && products.some((p) => selected.has(p.id));
|
|
371
|
-
return (_jsxs("div", { className: `space-y-4 ${className}`, children: [_jsx(ProductMetricsCards, { metrics: metrics, isLoading: isMetricsLoading, currency: resolvedCurrency, locale: resolvedLocale, onActiveClick: handleActiveCardClick, onOutOfStockClick: handleOosCardClick, onBestSellerClick: handleBestSellerCardClick }), selected.size > 0 ? (
|
|
367
|
+
return (_jsxs("div", { className: `space-y-4 ${className}`, children: [_jsx(ProductMetricsCards, { metrics: metrics, isLoading: isMetricsLoading, currency: resolvedCurrency, locale: resolvedLocale, onActiveClick: handleActiveCardClick, onOutOfStockClick: handleOosCardClick, onBestSellerClick: handleBestSellerCardClick }), selected.size > 0 ? (_jsxs(BulkActionBar, { count: selected.size, total: total, isAllMatching: isAllMatching, noun: "product", isProcessing: isProcessing, onSelectAllMatching: handleSelectAllMatching, isExpandingSelection: isExpandingSelection, onClear: resetSelection, children: [_jsxs("button", { type: "button", onClick: handleActivate, disabled: isProcessing, className: "admin-btn admin-btn-secondary admin-btn-sm", children: [_jsx(CheckCircle2, { className: "h-4 w-4" }), "Activate"] }), _jsxs("button", { type: "button", onClick: handleArchive, disabled: isProcessing, className: "admin-btn admin-btn-secondary admin-btn-sm", children: [_jsx(Archive, { className: "h-4 w-4" }), "Archive"] }), _jsxs("button", { type: "button", onClick: handleDeleteBulk, disabled: isProcessing || !selectedAreAllArchived, title: selectedAreAllArchived
|
|
368
|
+
? 'Permanently delete selected'
|
|
369
|
+
: 'Archive these products first, then delete', className: "admin-btn admin-btn-danger admin-btn-sm", children: [_jsx(Trash2, { className: "h-4 w-4" }), "Delete"] })] })) : (_jsxs(_Fragment, { children: [_jsx(ChipRow, { active: chip, onChange: setChip, disabled: isLoading }), _jsxs("div", { className: "admin-filter-bar", children: [_jsx("input", { type: "text", value: search, onChange: (e) => setSearch(e.target.value), placeholder: "Search products...", className: "admin-filter-search" }), _jsx(AdminSelect, { value: sort, onChange: (value) => setSort(value), options: [
|
|
372
370
|
{ value: 'newest', label: 'Newest' },
|
|
373
371
|
{ value: 'name', label: 'Name' },
|
|
374
372
|
{ value: 'price-asc', label: 'Price: Low to High' },
|
|
@@ -377,7 +375,7 @@ export function ProductTable({ initialSearch, initialCategory, initialStatus, pa
|
|
|
377
375
|
if (el)
|
|
378
376
|
el.indeterminate =
|
|
379
377
|
someOnPageSelected && !allOnPageSelected;
|
|
380
|
-
}, onChange: handleSelectAllOnPage, "aria-label": "Select all products on this page" }) }), _jsx("th", { className: "px-6 py-3 text-left", children: "Product" }), _jsx("th", { className: "px-6 py-3 text-left", children: "Status" }), _jsx("th", { className: "px-6 py-3 text-left", children: "Price" }), _jsx("th", { className: "px-6 py-3 text-left", children: "Inventory" }), _jsx("th", { className: "px-6 py-3 text-
|
|
378
|
+
}, onChange: handleSelectAllOnPage, "aria-label": "Select all products on this page" }) }), _jsx("th", { className: "px-6 py-3 text-left", children: "Product" }), _jsx("th", { className: "px-6 py-3 text-left", children: "Status" }), _jsx("th", { className: "px-6 py-3 text-left", children: "Price" }), _jsx("th", { className: "px-6 py-3 text-left", children: "Inventory" }), _jsx("th", { className: "px-6 py-3 text-left", children: "Actions" })] }) }), _jsx("tbody", { children: isLoading ? ([...Array(5)].map((_, i) => (_jsxs("tr", { className: "admin-table-row", children: [_jsx("td", { className: "px-4 py-4 w-12", children: _jsx("div", { className: "admin-skeleton admin-skeleton-md w-4 rounded" }) }), _jsx("td", { className: "px-6 py-4", children: _jsxs("div", { className: "flex items-center gap-3", children: [_jsx("div", { className: "admin-skeleton admin-skeleton-xl w-10 rounded" }), _jsx("div", { className: "admin-skeleton admin-skeleton-md w-32 rounded" })] }) }), _jsx("td", { className: "px-6 py-4", children: _jsx("div", { className: "admin-skeleton admin-skeleton-lg w-16 rounded" }) }), _jsx("td", { className: "px-6 py-4", children: _jsx("div", { className: "admin-skeleton admin-skeleton-md w-16 rounded" }) }), _jsx("td", { className: "px-6 py-4", children: _jsx("div", { className: "admin-skeleton admin-skeleton-md w-12 rounded" }) }), _jsx("td", { className: "px-6 py-4", children: _jsx("div", { className: "admin-skeleton admin-skeleton-md w-20 rounded" }) })] }, i)))) : products.length === 0 ? (_jsx("tr", { children: _jsx("td", { colSpan: 6, className: "px-6 py-12 text-center admin-empty-text", children: "No products found" }) })) : (products.map((product) => (_jsx(ProductRow, { product: product, isSelected: selected.has(product.id), onToggleSelect: toggleSelect, onProductClick: onProductClick, onDeleteClick: handleDeleteClick, formatCurrency: formatCurrency }, product.id)))) })] }) }), totalPages > 1 && (_jsxs("div", { className: "admin-pagination px-6", children: [_jsxs("p", { className: "admin-pagination-info", children: ["Showing ", (page - 1) * pageSize + 1, " to", ' ', Math.min(page * pageSize, total), " of ", total] }), _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" })] })] }))] }), _jsx(DeleteConfirmDialog, { isOpen: !!deleteTarget, title: "Delete Product", itemName: deleteTarget?.name || '', itemType: "product", isDeleting: isDeleting, error: deleteError, onConfirm: handleDeleteConfirm, onCancel: handleDeleteCancel }), _jsx(DeleteConfirmDialog, { isOpen: bulkConfirm !== null, title: bulkConfirm === 'delete'
|
|
381
379
|
? `Delete ${selected.size} product${selected.size === 1 ? '' : 's'}`
|
|
382
380
|
: `Archive ${selected.size} product${selected.size === 1 ? '' : 's'}`, itemName: `${selected.size} selected product${selected.size === 1 ? '' : 's'}`, itemType: "product", isDeleting: isProcessing, error: null, onConfirm: confirmBulk, onCancel: cancelBulkConfirm })] }));
|
|
383
381
|
}
|