@rovela-ai/sdk 0.18.5 → 0.18.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/admin/components/AdminAcceptInviteForm.d.ts.map +1 -1
- package/dist/admin/components/AdminAcceptInviteForm.js +17 -6
- package/dist/admin/components/AdminAcceptInviteForm.js.map +1 -1
- package/dist/admin/components/AdminAccountPage.d.ts.map +1 -1
- package/dist/admin/components/AdminAccountPage.js +7 -10
- package/dist/admin/components/AdminAccountPage.js.map +1 -1
- package/dist/admin/components/AdminAuthShell.d.ts +32 -0
- package/dist/admin/components/AdminAuthShell.d.ts.map +1 -0
- package/dist/admin/components/AdminAuthShell.js +17 -0
- package/dist/admin/components/AdminAuthShell.js.map +1 -0
- package/dist/admin/components/AdminBrandTile.d.ts +10 -0
- package/dist/admin/components/AdminBrandTile.d.ts.map +1 -0
- package/dist/admin/components/AdminBrandTile.js +46 -0
- package/dist/admin/components/AdminBrandTile.js.map +1 -0
- package/dist/admin/components/AdminEmptyState.d.ts +33 -0
- package/dist/admin/components/AdminEmptyState.d.ts.map +1 -0
- package/dist/admin/components/AdminEmptyState.js +12 -0
- package/dist/admin/components/AdminEmptyState.js.map +1 -0
- package/dist/admin/components/AdminForgotPasswordForm.d.ts.map +1 -1
- package/dist/admin/components/AdminForgotPasswordForm.js +8 -6
- package/dist/admin/components/AdminForgotPasswordForm.js.map +1 -1
- package/dist/admin/components/AdminLoginForm.js +1 -1
- package/dist/admin/components/AdminLoginForm.js.map +1 -1
- package/dist/admin/components/AdminModal.d.ts +51 -0
- package/dist/admin/components/AdminModal.d.ts.map +1 -0
- package/dist/admin/components/AdminModal.js +118 -0
- package/dist/admin/components/AdminModal.js.map +1 -0
- package/dist/admin/components/AdminPagination.d.ts +22 -0
- package/dist/admin/components/AdminPagination.d.ts.map +1 -0
- package/dist/admin/components/AdminPagination.js +15 -0
- package/dist/admin/components/AdminPagination.js.map +1 -0
- package/dist/admin/components/AdminResetPasswordForm.d.ts.map +1 -1
- package/dist/admin/components/AdminResetPasswordForm.js +12 -6
- package/dist/admin/components/AdminResetPasswordForm.js.map +1 -1
- package/dist/admin/components/AdminSearchInput.d.ts +14 -0
- package/dist/admin/components/AdminSearchInput.d.ts.map +1 -0
- package/dist/admin/components/AdminSearchInput.js +56 -0
- package/dist/admin/components/AdminSearchInput.js.map +1 -0
- package/dist/admin/components/AdminSelect.d.ts +3 -1
- package/dist/admin/components/AdminSelect.d.ts.map +1 -1
- package/dist/admin/components/AdminSelect.js +2 -2
- package/dist/admin/components/AdminSelect.js.map +1 -1
- package/dist/admin/components/AdminSwitch.d.ts +20 -0
- package/dist/admin/components/AdminSwitch.d.ts.map +1 -0
- package/dist/admin/components/AdminSwitch.js +9 -0
- package/dist/admin/components/AdminSwitch.js.map +1 -0
- package/dist/admin/components/AdminTopBar.d.ts +1 -1
- package/dist/admin/components/AdminTopBar.d.ts.map +1 -1
- package/dist/admin/components/AdminTopBar.js +5 -21
- package/dist/admin/components/AdminTopBar.js.map +1 -1
- package/dist/admin/components/AdminUserMenu.js +1 -1
- package/dist/admin/components/BrandingAssetUpload.d.ts.map +1 -1
- package/dist/admin/components/BrandingAssetUpload.js +3 -3
- package/dist/admin/components/BrandingAssetUpload.js.map +1 -1
- package/dist/admin/components/CategoryForm.d.ts.map +1 -1
- package/dist/admin/components/CategoryForm.js +7 -3
- package/dist/admin/components/CategoryForm.js.map +1 -1
- package/dist/admin/components/CategorySelect.js +2 -2
- package/dist/admin/components/CategorySelect.js.map +1 -1
- package/dist/admin/components/CustomerAddressPanel.d.ts.map +1 -1
- package/dist/admin/components/CustomerAddressPanel.js +15 -7
- package/dist/admin/components/CustomerAddressPanel.js.map +1 -1
- package/dist/admin/components/CustomerDetails.d.ts.map +1 -1
- package/dist/admin/components/CustomerDetails.js +8 -14
- package/dist/admin/components/CustomerDetails.js.map +1 -1
- package/dist/admin/components/CustomerGroupsManager.d.ts.map +1 -1
- package/dist/admin/components/CustomerGroupsManager.js +18 -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 +24 -15
- package/dist/admin/components/CustomerTable.js.map +1 -1
- package/dist/admin/components/DeleteConfirmDialog.d.ts +5 -5
- package/dist/admin/components/DeleteConfirmDialog.d.ts.map +1 -1
- package/dist/admin/components/DeleteConfirmDialog.js +11 -8
- package/dist/admin/components/DeleteConfirmDialog.js.map +1 -1
- package/dist/admin/components/DiscountsManager.d.ts.map +1 -1
- package/dist/admin/components/DiscountsManager.js +47 -15
- package/dist/admin/components/DiscountsManager.js.map +1 -1
- package/dist/admin/components/EmailsManager.d.ts.map +1 -1
- package/dist/admin/components/EmailsManager.js +18 -20
- package/dist/admin/components/EmailsManager.js.map +1 -1
- package/dist/admin/components/FilesManager.d.ts.map +1 -1
- package/dist/admin/components/FilesManager.js +16 -18
- package/dist/admin/components/FilesManager.js.map +1 -1
- package/dist/admin/components/InventoryEditor.js +1 -1
- package/dist/admin/components/InventoryEditor.js.map +1 -1
- package/dist/admin/components/InviteUserDialog.d.ts.map +1 -1
- package/dist/admin/components/InviteUserDialog.js +12 -16
- package/dist/admin/components/InviteUserDialog.js.map +1 -1
- package/dist/admin/components/LocationsManager.d.ts.map +1 -1
- package/dist/admin/components/LocationsManager.js +18 -8
- package/dist/admin/components/LocationsManager.js.map +1 -1
- package/dist/admin/components/MediaLibraryPicker.d.ts.map +1 -1
- package/dist/admin/components/MediaLibraryPicker.js +22 -15
- package/dist/admin/components/MediaLibraryPicker.js.map +1 -1
- package/dist/admin/components/OrderDetails.d.ts.map +1 -1
- package/dist/admin/components/OrderDetails.js +19 -34
- package/dist/admin/components/OrderDetails.js.map +1 -1
- package/dist/admin/components/OrderStatusChart.js +1 -1
- package/dist/admin/components/OrderStatusChart.js.map +1 -1
- package/dist/admin/components/OrderTable.d.ts.map +1 -1
- package/dist/admin/components/OrderTable.js +27 -14
- 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 +17 -16
- package/dist/admin/components/PaymentMethodsManager.js.map +1 -1
- package/dist/admin/components/PaymentSettings.d.ts.map +1 -1
- package/dist/admin/components/PaymentSettings.js +2 -2
- package/dist/admin/components/PaymentSettings.js.map +1 -1
- package/dist/admin/components/PermissionsMatrix.js +1 -1
- package/dist/admin/components/PermissionsMatrix.js.map +1 -1
- package/dist/admin/components/PrimaryMetricsRow.d.ts.map +1 -1
- package/dist/admin/components/PrimaryMetricsRow.js +4 -1
- package/dist/admin/components/PrimaryMetricsRow.js.map +1 -1
- package/dist/admin/components/ProductForm.d.ts.map +1 -1
- package/dist/admin/components/ProductForm.js +11 -5
- package/dist/admin/components/ProductForm.js.map +1 -1
- package/dist/admin/components/ProductTable.d.ts.map +1 -1
- package/dist/admin/components/ProductTable.js +22 -9
- package/dist/admin/components/ProductTable.js.map +1 -1
- package/dist/admin/components/RecentOrders.d.ts.map +1 -1
- package/dist/admin/components/RecentOrders.js +3 -16
- package/dist/admin/components/RecentOrders.js.map +1 -1
- package/dist/admin/components/RefundDialog.d.ts +1 -1
- package/dist/admin/components/RefundDialog.d.ts.map +1 -1
- package/dist/admin/components/RefundDialog.js +10 -17
- package/dist/admin/components/RefundDialog.js.map +1 -1
- package/dist/admin/components/RevenueChart.js +1 -1
- package/dist/admin/components/RevenueChart.js.map +1 -1
- package/dist/admin/components/SEOPreview.js +1 -1
- package/dist/admin/components/SEOPreview.js.map +1 -1
- package/dist/admin/components/SecondaryMetricsRow.d.ts.map +1 -1
- package/dist/admin/components/SecondaryMetricsRow.js +6 -1
- package/dist/admin/components/SecondaryMetricsRow.js.map +1 -1
- package/dist/admin/components/ShippingSettings.d.ts.map +1 -1
- package/dist/admin/components/ShippingSettings.js +22 -31
- package/dist/admin/components/ShippingSettings.js.map +1 -1
- package/dist/admin/components/StatsCards.d.ts.map +1 -1
- package/dist/admin/components/StatsCards.js +4 -1
- package/dist/admin/components/StatsCards.js.map +1 -1
- package/dist/admin/components/TagInput.d.ts +1 -1
- package/dist/admin/components/TagInput.js +1 -1
- package/dist/admin/components/TaxSettings.d.ts.map +1 -1
- package/dist/admin/components/TaxSettings.js +20 -19
- package/dist/admin/components/TaxSettings.js.map +1 -1
- package/dist/admin/components/UsersTable.d.ts.map +1 -1
- package/dist/admin/components/UsersTable.js +21 -20
- package/dist/admin/components/UsersTable.js.map +1 -1
- package/dist/admin/components/VariantManager.d.ts.map +1 -1
- package/dist/admin/components/VariantManager.js +5 -5
- package/dist/admin/components/VariantManager.js.map +1 -1
- package/dist/admin/components/emails/ColorField.d.ts.map +1 -1
- package/dist/admin/components/emails/ColorField.js +1 -1
- package/dist/admin/components/emails/ColorField.js.map +1 -1
- package/dist/admin/components/emails/EmailPreviewPane.js +1 -1
- package/dist/admin/components/emails/EmailPreviewPane.js.map +1 -1
- package/dist/admin/components/emails/EmailThemePanel.js +1 -1
- package/dist/admin/components/emails/EmailThemePanel.js.map +1 -1
- package/dist/admin/components/emails/FontPicker.js +2 -2
- package/dist/admin/components/emails/FontPicker.js.map +1 -1
- package/dist/admin/components/index.d.ts +15 -0
- package/dist/admin/components/index.d.ts.map +1 -1
- package/dist/admin/components/index.js +9 -0
- package/dist/admin/components/index.js.map +1 -1
- package/dist/admin/components/statusBadges.d.ts +12 -0
- package/dist/admin/components/statusBadges.d.ts.map +1 -0
- package/dist/admin/components/statusBadges.js +50 -0
- package/dist/admin/components/statusBadges.js.map +1 -0
- package/dist/admin/index.d.ts +2 -2
- package/dist/admin/index.d.ts.map +1 -1
- package/dist/admin/index.js +4 -2
- package/dist/admin/index.js.map +1 -1
- package/dist/admin/styles/admin-theme.css +289 -0
- package/package.json +1 -1
|
@@ -1,15 +1,18 @@
|
|
|
1
1
|
'use client';
|
|
2
|
-
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
3
3
|
/**
|
|
4
4
|
* @rovela/sdk/admin/components/RefundDialog
|
|
5
5
|
*
|
|
6
|
-
* Refund dialog with reason and confirmation.
|
|
7
|
-
*
|
|
6
|
+
* Refund dialog with reason and confirmation. Built on AdminModal (the one
|
|
7
|
+
* overlay primitive) — Escape, guarded click-outside, scroll lock, portal
|
|
8
|
+
* and focus containment come from the primitive, not from local handlers.
|
|
8
9
|
*/
|
|
9
10
|
import { useState, useCallback, useEffect } from 'react';
|
|
10
|
-
import { AlertTriangle
|
|
11
|
+
import { AlertTriangle } from 'lucide-react';
|
|
11
12
|
import { useAdminOrders } from '../hooks/useAdminOrders';
|
|
12
13
|
import { useStoreSettingsOptional } from '../../core/StoreSettingsProvider';
|
|
14
|
+
import { adminToast } from './AdminToaster';
|
|
15
|
+
import { AdminModal } from './AdminModal';
|
|
13
16
|
// =============================================================================
|
|
14
17
|
// Component
|
|
15
18
|
// =============================================================================
|
|
@@ -43,16 +46,6 @@ export function RefundDialog({ orderId, orderTotal, currency: orderCurrency, isO
|
|
|
43
46
|
setError(null);
|
|
44
47
|
}
|
|
45
48
|
}, [isOpen]);
|
|
46
|
-
// Handle escape key
|
|
47
|
-
useEffect(() => {
|
|
48
|
-
const handleEscape = (e) => {
|
|
49
|
-
if (e.key === 'Escape' && isOpen && !isProcessing) {
|
|
50
|
-
onClose();
|
|
51
|
-
}
|
|
52
|
-
};
|
|
53
|
-
window.addEventListener('keydown', handleEscape);
|
|
54
|
-
return () => window.removeEventListener('keydown', handleEscape);
|
|
55
|
-
}, [isOpen, isProcessing, onClose]);
|
|
56
49
|
const handleSubmit = useCallback(async (e) => {
|
|
57
50
|
e.preventDefault();
|
|
58
51
|
setError(null);
|
|
@@ -67,6 +60,8 @@ export function RefundDialog({ orderId, orderTotal, currency: orderCurrency, isO
|
|
|
67
60
|
const amountInCents = Math.round(total * 100);
|
|
68
61
|
const result = await processRefund(orderId, amountInCents, reason.trim());
|
|
69
62
|
if (result.success) {
|
|
63
|
+
// Money moved — the dialog closes, the toast confirms (convention #7).
|
|
64
|
+
adminToast.success('Refund processed');
|
|
70
65
|
onSuccess?.();
|
|
71
66
|
onClose();
|
|
72
67
|
}
|
|
@@ -78,14 +73,12 @@ export function RefundDialog({ orderId, orderTotal, currency: orderCurrency, isO
|
|
|
78
73
|
setIsProcessing(false);
|
|
79
74
|
}
|
|
80
75
|
}, [orderId, orderTotal, reason, processRefund, onSuccess, onClose]);
|
|
81
|
-
if (!isOpen)
|
|
82
|
-
return null;
|
|
83
76
|
const total = typeof orderTotal === 'string' ? parseFloat(orderTotal) : orderTotal;
|
|
84
77
|
// Per-order snapshot wins (see RefundDialogProps.currency).
|
|
85
78
|
const formattedTotal = new Intl.NumberFormat(resolvedLocale, {
|
|
86
79
|
style: 'currency',
|
|
87
80
|
currency: orderCurrency || resolvedCurrency,
|
|
88
81
|
}).format(total);
|
|
89
|
-
return (
|
|
82
|
+
return (_jsx(AdminModal, { open: isOpen, onClose: onClose, busy: isProcessing, title: "Process refund", description: `Order #${orderId.slice(-8).toUpperCase()}`, icon: _jsx(AlertTriangle, { className: "h-5 w-5" }), iconTone: "warning", showClose: true, footer: _jsxs(_Fragment, { children: [_jsx("button", { type: "button", onClick: onClose, disabled: isProcessing, className: "admin-btn admin-btn-secondary", children: "Cancel" }), _jsx("button", { type: "submit", form: "refund-form", disabled: isProcessing || !reason.trim(), className: "admin-btn admin-btn-destructive", children: isProcessing ? 'Processing…' : 'Process refund' })] }), children: _jsx("form", { id: "refund-form", onSubmit: handleSubmit, children: _jsxs("div", { className: "admin-modal-body space-y-6", children: [error && (_jsx("div", { className: "admin-alert admin-alert-error", children: _jsx("div", { className: "admin-alert-description", children: error }) })), _jsxs("div", { className: "admin-card admin-card-subtle rounded-lg p-4", children: [_jsx("p", { className: "text-sm admin-text-muted", children: "Refund amount" }), _jsx("p", { className: "admin-heading-2 mt-1", children: formattedTotal }), _jsx("p", { className: "mt-1 text-xs admin-text-muted", children: "Full refund will be processed via Stripe" })] }), _jsxs("div", { className: "admin-form-group", children: [_jsx("label", { htmlFor: "reason", className: "admin-label admin-label-required", children: "Reason for refund" }), _jsx("textarea", { id: "reason", value: reason, onChange: (e) => setReason(e.target.value), placeholder: "Enter the reason for this refund\u2026", rows: 3, required: true, disabled: isProcessing, className: "admin-input admin-textarea w-full resize-none" })] })] }) }) }));
|
|
90
83
|
}
|
|
91
84
|
//# sourceMappingURL=RefundDialog.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RefundDialog.js","sourceRoot":"","sources":["../../../src/admin/components/RefundDialog.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAA;;AAEZ
|
|
1
|
+
{"version":3,"file":"RefundDialog.js","sourceRoot":"","sources":["../../../src/admin/components/RefundDialog.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAA;;AAEZ;;;;;;GAMG;AAEH,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AACxD,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA;AAC5C,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAA;AACxD,OAAO,EAAE,wBAAwB,EAAE,MAAM,kCAAkC,CAAA;AAE3E,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAA;AAC3C,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAA;AAEzC,gFAAgF;AAChF,YAAY;AACZ,gFAAgF;AAEhF;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,YAAY,CAAC,EAC3B,OAAO,EACP,UAAU,EACV,QAAQ,EAAE,aAAa,EACvB,MAAM,EACN,OAAO,EACP,SAAS,GACS;IAClB,MAAM,EAAE,aAAa,EAAE,GAAG,cAAc,EAAE,CAAA;IAE1C,4BAA4B;IAC5B,MAAM,aAAa,GAAG,wBAAwB,EAAE,CAAA;IAChD,MAAM,gBAAgB,GAAG,aAAa,EAAE,QAAQ,IAAI,KAAK,CAAA;IACzD,MAAM,cAAc,GAAG,aAAa,EAAE,MAAM,IAAI,OAAO,CAAA;IAEvD,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAA;IACxC,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAgB,IAAI,CAAC,CAAA;IACvD,MAAM,CAAC,YAAY,EAAE,eAAe,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAA;IAEvD,uCAAuC;IACvC,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,MAAM,EAAE,CAAC;YACX,SAAS,CAAC,EAAE,CAAC,CAAA;YACb,QAAQ,CAAC,IAAI,CAAC,CAAA;QAChB,CAAC;IACH,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAA;IAEZ,MAAM,YAAY,GAAG,WAAW,CAAC,KAAK,EAAE,CAAkB,EAAE,EAAE;QAC5D,CAAC,CAAC,cAAc,EAAE,CAAA;QAClB,QAAQ,CAAC,IAAI,CAAC,CAAA;QAEd,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC;YACnB,QAAQ,CAAC,wCAAwC,CAAC,CAAA;YAClD,OAAM;QACR,CAAC;QAED,eAAe,CAAC,IAAI,CAAC,CAAA;QACrB,IAAI,CAAC;YACH,yCAAyC;YACzC,MAAM,KAAK,GAAG,OAAO,UAAU,KAAK,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,UAAU,CAAA;YAClF,MAAM,aAAa,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,GAAG,CAAC,CAAA;YAE7C,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,OAAO,EAAE,aAAa,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC,CAAA;YACzE,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;gBACnB,uEAAuE;gBACvE,UAAU,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAA;gBACtC,SAAS,EAAE,EAAE,CAAA;gBACb,OAAO,EAAE,CAAA;YACX,CAAC;iBAAM,CAAC;gBACN,QAAQ,CAAC,MAAM,CAAC,KAAK,IAAI,6CAA6C,CAAC,CAAA;YACzE,CAAC;QACH,CAAC;gBAAS,CAAC;YACT,eAAe,CAAC,KAAK,CAAC,CAAA;QACxB,CAAC;IACH,CAAC,EAAE,CAAC,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,aAAa,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC,CAAA;IAEpE,MAAM,KAAK,GAAG,OAAO,UAAU,KAAK,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,UAAU,CAAA;IAClF,4DAA4D;IAC5D,MAAM,cAAc,GAAG,IAAI,IAAI,CAAC,YAAY,CAAC,cAAc,EAAE;QAC3D,KAAK,EAAE,UAAU;QACjB,QAAQ,EAAE,aAAa,IAAI,gBAAgB;KAC5C,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;IAEhB,OAAO,CACL,KAAC,UAAU,IACT,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,OAAO,EAChB,IAAI,EAAE,YAAY,EAClB,KAAK,EAAC,gBAAgB,EACtB,WAAW,EAAE,UAAU,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,EAAE,EACxD,IAAI,EAAE,KAAC,aAAa,IAAC,SAAS,EAAC,SAAS,GAAG,EAC3C,QAAQ,EAAC,SAAS,EAClB,SAAS,QACT,MAAM,EACJ,8BACE,iBACE,IAAI,EAAC,QAAQ,EACb,OAAO,EAAE,OAAO,EAChB,QAAQ,EAAE,YAAY,EACtB,SAAS,EAAC,+BAA+B,uBAGlC,EACT,iBACE,IAAI,EAAC,QAAQ,EACb,IAAI,EAAC,aAAa,EAClB,QAAQ,EAAE,YAAY,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,EACxC,SAAS,EAAC,iCAAiC,YAE1C,YAAY,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,gBAAgB,GACzC,IACR,YAGL,eAAM,EAAE,EAAC,aAAa,EAAC,QAAQ,EAAE,YAAY,YAC3C,eAAK,SAAS,EAAC,4BAA4B,aACxC,KAAK,IAAI,CACR,cAAK,SAAS,EAAC,+BAA+B,YAC5C,cAAK,SAAS,EAAC,yBAAyB,YAAE,KAAK,GAAO,GAClD,CACP,EAGD,eAAK,SAAS,EAAC,6CAA6C,aAC1D,YAAG,SAAS,EAAC,0BAA0B,8BAAkB,EACzD,YAAG,SAAS,EAAC,sBAAsB,YAAE,cAAc,GAAK,EACxD,YAAG,SAAS,EAAC,+BAA+B,yDAExC,IACA,EAGN,eAAK,SAAS,EAAC,kBAAkB,aAC/B,gBAAO,OAAO,EAAC,QAAQ,EAAC,SAAS,EAAC,kCAAkC,kCAE5D,EACR,mBACE,EAAE,EAAC,QAAQ,EACX,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAC1C,WAAW,EAAC,wCAAmC,EAC/C,IAAI,EAAE,CAAC,EACP,QAAQ,QACR,QAAQ,EAAE,YAAY,EACtB,SAAS,EAAC,+CAA+C,GACzD,IACE,IACF,GACD,GACI,CACd,CAAA;AACH,CAAC"}
|
|
@@ -62,7 +62,7 @@ export function RevenueChart({ data, isLoading = false, currency = 'USD', classN
|
|
|
62
62
|
currency,
|
|
63
63
|
minimumFractionDigits: 0,
|
|
64
64
|
maximumFractionDigits: 0,
|
|
65
|
-
}).format(totalRevenue) }), _jsx("p", { className: "admin-chart-value-label", children: "Total" })] }))] }), _jsx("div", { className: "admin-chart-body flex min-h-0 flex-1 flex-col", children: isLoading ? (_jsx("div", { className: "admin-chart-loading", children: _jsx("
|
|
65
|
+
}).format(totalRevenue) }), _jsx("p", { className: "admin-chart-value-label", children: "Total" })] }))] }), _jsx("div", { className: "admin-chart-body flex min-h-0 flex-1 flex-col", children: isLoading ? (_jsx("div", { className: "admin-chart-loading", children: _jsx("span", { className: "admin-spinner admin-spinner-lg" }) })) : data.length === 0 ? (_jsxs("div", { className: "admin-chart-empty", children: [_jsx(BarChart3, { className: "h-12 w-12 admin-chart-empty-icon", strokeWidth: 1 }), _jsx("p", { className: "admin-chart-empty-text", children: "No revenue data yet" }), _jsx("p", { className: "admin-chart-empty-subtext", children: "Revenue will appear here after your first sale" })] })) : (_jsx("div", {
|
|
66
66
|
// Screen-reader summary so the chart isn't an opaque visual.
|
|
67
67
|
// Tooltip alone doesn't surface to assistive tech.
|
|
68
68
|
role: "img", className: "h-full min-h-[260px] w-full", "aria-label": `Revenue chart for the last ${data.length} days. Total ${new Intl.NumberFormat('en-US', { style: 'currency', currency, maximumFractionDigits: 0 }).format(totalRevenue)}.`, children: _jsx(ResponsiveContainer, { width: "100%", height: "100%", children: _jsxs(AreaChart, { data: data, margin: { top: 10, right: 10, left: 0, bottom: 0 }, children: [_jsx("defs", { children: _jsxs("linearGradient", { id: "revenueGradient", x1: "0", y1: "0", x2: "0", y2: "1", children: [_jsx("stop", { offset: "0%", stopColor: "hsl(var(--admin-primary))", stopOpacity: 0.3 }), _jsx("stop", { offset: "100%", stopColor: "hsl(var(--admin-primary))", stopOpacity: 0 })] }) }), _jsx(CartesianGrid, { strokeDasharray: "3 3", vertical: false, stroke: "hsl(var(--admin-border))" }), _jsx(XAxis, { dataKey: "date", tickFormatter: tickFormatter, axisLine: false, tickLine: false, tick: { fill: 'hsl(var(--admin-foreground-muted))', fontSize: 12 }, dy: 10 }), _jsx(YAxis, { tickFormatter: formatCurrency, axisLine: false, tickLine: false, tick: { fill: 'hsl(var(--admin-foreground-muted))', fontSize: 12 }, width: 60 }), _jsx(Tooltip, { content: _jsx(CustomTooltip, { currency: currency }) }), _jsx(Area, { type: "monotone", dataKey: "revenue", stroke: "hsl(var(--admin-primary))", strokeWidth: 2, fill: "url(#revenueGradient)" })] }) }) })) })] }));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RevenueChart.js","sourceRoot":"","sources":["../../../src/admin/components/RevenueChart.tsx"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"RevenueChart.js","sourceRoot":"","sources":["../../../src/admin/components/RevenueChart.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAA;;AAEZ;;;;;GAKG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAA;AACxC,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAA;AACvD,OAAO,EACL,IAAI,EACJ,SAAS,EACT,aAAa,EACb,mBAAmB,EACnB,OAAO,EACP,KAAK,EACL,KAAK,GACN,MAAM,UAAU,CAAA;AA4BjB,SAAS,aAAa,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAgB;IACvE,IAAI,CAAC,MAAM,IAAI,CAAC,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM;QAAE,OAAO,IAAI,CAAA;IAEvD,MAAM,cAAc,GAAG,CAAC,KAAa,EAAE,EAAE;QACvC,OAAO,IAAI,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE;YACpC,KAAK,EAAE,UAAU;YACjB,QAAQ;YACR,qBAAqB,EAAE,CAAC;YACxB,qBAAqB,EAAE,CAAC;SACzB,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;IAClB,CAAC,CAAA;IAED,iEAAiE;IACjE,sEAAsE;IACtE,iCAAiC;IACjC,MAAM,UAAU,GAAG,CAAC,OAAe,EAAE,EAAE,CAAC,cAAc,CAAC,OAAO,CAAC,CAAA;IAE/D,OAAO,CACL,eAAK,SAAS,EAAC,qBAAqB,aAClC,YAAG,SAAS,EAAC,2BAA2B,YACrC,KAAK,CAAC,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,GAC7B,EACJ,YAAG,SAAS,EAAC,2BAA2B,YACrC,cAAc,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAC/B,IACA,CACP,CAAA;AACH,CAAC;AAED,gFAAgF;AAChF,YAAY;AACZ,gFAAgF;AAEhF;;;;;;;GAOG;AACH,MAAM,UAAU,YAAY,CAAC,EAC3B,IAAI,EACJ,SAAS,GAAG,KAAK,EACjB,QAAQ,GAAG,KAAK,EAChB,SAAS,GAAG,EAAE,GACI;IAClB,MAAM,cAAc,GAAG,CAAC,KAAa,EAAE,EAAE;QACvC,OAAO,IAAI,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE;YACpC,KAAK,EAAE,UAAU;YACjB,QAAQ;YACR,QAAQ,EAAE,SAAS;YACnB,qBAAqB,EAAE,CAAC;YACxB,qBAAqB,EAAE,CAAC;SACzB,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;IAClB,CAAC,CAAA;IAED,MAAM,WAAW,GAAG,CAAC,OAAe,EAAE,EAAE,CAAC,cAAc,CAAC,OAAO,CAAC,CAAA;IAEhE,0BAA0B;IAC1B,MAAM,YAAY,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,CAAC,GAAG,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,CAAA;IAEtE,wDAAwD;IACxD,MAAM,aAAa,GAAG,CAAC,KAAa,EAAE,KAAa,EAAE,EAAE;QACrD,IAAI,KAAK,GAAG,CAAC,KAAK,CAAC,IAAI,KAAK,KAAK,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACjD,OAAO,WAAW,CAAC,KAAK,CAAC,CAAA;QAC3B,CAAC;QACD,OAAO,EAAE,CAAA;IACX,CAAC,CAAA;IAED,OAAO,CACL,eAAK,SAAS,EAAE,oCAAoC,SAAS,EAAE,aAE7D,eAAK,SAAS,EAAC,oBAAoB,aACjC,0BACE,aAAI,SAAS,EAAC,mBAAmB,wBAAa,EAC9C,YAAG,SAAS,EAAC,sBAAsB,6BAAiB,IAChD,EACL,CAAC,SAAS,IAAI,CACb,eAAK,SAAS,EAAC,YAAY,aACzB,YAAG,SAAS,EAAC,mBAAmB,YAC7B,IAAI,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE;oCAC9B,KAAK,EAAE,UAAU;oCACjB,QAAQ;oCACR,qBAAqB,EAAE,CAAC;oCACxB,qBAAqB,EAAE,CAAC;iCACzB,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC,GACrB,EACJ,YAAG,SAAS,EAAC,yBAAyB,sBAAU,IAC5C,CACP,IACG,EAGN,cAAK,SAAS,EAAC,+CAA+C,YAC3D,SAAS,CAAC,CAAC,CAAC,CACX,cAAK,SAAS,EAAC,qBAAqB,YAClC,eAAM,SAAS,EAAC,gCAAgC,GAAG,GAC/C,CACP,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,CACtB,eAAK,SAAS,EAAC,mBAAmB,aAChC,KAAC,SAAS,IAAC,SAAS,EAAC,kCAAkC,EAAC,WAAW,EAAE,CAAC,GAAI,EAC1E,YAAG,SAAS,EAAC,wBAAwB,oCAAwB,EAC7D,YAAG,SAAS,EAAC,2BAA2B,+DAEpC,IACA,CACP,CAAC,CAAC,CAAC,CACF;oBACE,6DAA6D;oBAC7D,mDAAmD;oBACnD,IAAI,EAAC,KAAK,EACV,SAAS,EAAC,6BAA6B,gBAC3B,8BAA8B,IAAI,CAAC,MAAM,gBAAgB,IAAI,IAAI,CAAC,YAAY,CACxF,OAAO,EACP,EAAE,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,qBAAqB,EAAE,CAAC,EAAE,CAC1D,CAAC,MAAM,CAAC,YAAY,CAAC,GAAG,YAEzB,KAAC,mBAAmB,IAAC,KAAK,EAAC,MAAM,EAAC,MAAM,EAAC,MAAM,YAC/C,MAAC,SAAS,IAAC,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,aACvE,yBACE,0BAAgB,EAAE,EAAC,iBAAiB,EAAC,EAAE,EAAC,GAAG,EAAC,EAAE,EAAC,GAAG,EAAC,EAAE,EAAC,GAAG,EAAC,EAAE,EAAC,GAAG,aAC9D,eAAM,MAAM,EAAC,IAAI,EAAC,SAAS,EAAC,2BAA2B,EAAC,WAAW,EAAE,GAAG,GAAI,EAC5E,eAAM,MAAM,EAAC,MAAM,EAAC,SAAS,EAAC,2BAA2B,EAAC,WAAW,EAAE,CAAC,GAAI,IAC7D,GACZ,EACP,KAAC,aAAa,IACZ,eAAe,EAAC,KAAK,EACrB,QAAQ,EAAE,KAAK,EACf,MAAM,EAAC,0BAA0B,GACjC,EACF,KAAC,KAAK,IACJ,OAAO,EAAC,MAAM,EACd,aAAa,EAAE,aAAa,EAC5B,QAAQ,EAAE,KAAK,EACf,QAAQ,EAAE,KAAK,EACf,IAAI,EAAE,EAAE,IAAI,EAAE,oCAAoC,EAAE,QAAQ,EAAE,EAAE,EAAE,EAClE,EAAE,EAAE,EAAE,GACN,EACF,KAAC,KAAK,IACJ,aAAa,EAAE,cAAc,EAC7B,QAAQ,EAAE,KAAK,EACf,QAAQ,EAAE,KAAK,EACf,IAAI,EAAE,EAAE,IAAI,EAAE,oCAAoC,EAAE,QAAQ,EAAE,EAAE,EAAE,EAClE,KAAK,EAAE,EAAE,GACT,EACF,KAAC,OAAO,IAAC,OAAO,EAAE,KAAC,aAAa,IAAC,QAAQ,EAAE,QAAQ,GAAI,GAAI,EAC3D,KAAC,IAAI,IACH,IAAI,EAAC,UAAU,EACf,OAAO,EAAC,SAAS,EACjB,MAAM,EAAC,2BAA2B,EAClC,WAAW,EAAE,CAAC,EACd,IAAI,EAAC,uBAAuB,GAC5B,IACQ,GACU,GAClB,CACP,GACG,IACF,CACP,CAAA;AACH,CAAC"}
|
|
@@ -25,6 +25,6 @@ export function SEOPreview({ title, description, slug, baseUrl = 'https://yourst
|
|
|
25
25
|
: description;
|
|
26
26
|
// Build URL
|
|
27
27
|
const displayUrl = `${baseUrl}/${slug || 'product-name'}`;
|
|
28
|
-
return (_jsxs("div", { className: `admin-card p-4 ${className}`, children: [_jsx("p", { className: "
|
|
28
|
+
return (_jsxs("div", { className: `admin-card p-4 ${className}`, children: [_jsx("p", { className: "admin-section-title mb-3", children: "Search Engine Preview" }), _jsxs("div", { className: "space-y-1", children: [_jsxs("div", { className: "flex items-center gap-2 text-sm", children: [_jsx("div", { className: "admin-seo-preview-favicon admin-avatar-sm", children: _jsx("span", { className: "text-xs font-medium admin-text-muted", children: "S" }) }), _jsxs("div", { className: "flex flex-col", children: [_jsx("span", { className: "text-xs admin-text-muted", children: "Your Store" }), _jsx("span", { className: "admin-seo-preview-url text-xs truncate max-w-[300px]", children: displayUrl })] })] }), _jsx("h3", { className: "admin-seo-preview-title text-lg font-normal hover:underline cursor-pointer leading-snug", children: displayTitle || 'Product Title' }), _jsx("p", { className: "admin-seo-preview-description text-sm leading-relaxed", children: displayDescription || 'Add a meta description to help search engines understand what this product is about and to entice users to click.' })] }), _jsxs("div", { className: "admin-summary-divider mt-4 flex gap-6 pt-3", children: [_jsxs("div", { className: "text-xs", children: [_jsx("span", { className: "admin-text-muted", children: "Title: " }), _jsxs("span", { className: title.length > 60 ? 'admin-text-error' : 'admin-text', children: [title.length, "/60"] })] }), _jsxs("div", { className: "text-xs", children: [_jsx("span", { className: "admin-text-muted", children: "Description: " }), _jsxs("span", { className: description.length > 160 ? 'admin-text-error' : 'admin-text', children: [description.length, "/160"] })] })] })] }));
|
|
29
29
|
}
|
|
30
30
|
//# sourceMappingURL=SEOPreview.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SEOPreview.js","sourceRoot":"","sources":["../../../src/admin/components/SEOPreview.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAA;;AA0BZ,gFAAgF;AAChF,YAAY;AACZ,gFAAgF;AAEhF;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,UAAU,CAAC,EACzB,KAAK,EACL,WAAW,EACX,IAAI,EACJ,OAAO,GAAG,gCAAgC,EAC1C,SAAS,GAAG,EAAE,GACE;IAChB,4DAA4D;IAC5D,MAAM,YAAY,GAAG,KAAK,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAA;IAE3E,qEAAqE;IACrE,MAAM,kBAAkB,GAAG,WAAW,CAAC,MAAM,GAAG,GAAG;QACjD,CAAC,CAAC,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,KAAK;QACnC,CAAC,CAAC,WAAW,CAAA;IAEf,YAAY;IACZ,MAAM,UAAU,GAAG,GAAG,OAAO,IAAI,IAAI,IAAI,cAAc,EAAE,CAAA;IAEzD,OAAO,CACL,eAAK,SAAS,EAAE,kBAAkB,SAAS,EAAE,aAC3C,YAAG,SAAS,EAAC,
|
|
1
|
+
{"version":3,"file":"SEOPreview.js","sourceRoot":"","sources":["../../../src/admin/components/SEOPreview.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAA;;AA0BZ,gFAAgF;AAChF,YAAY;AACZ,gFAAgF;AAEhF;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,UAAU,CAAC,EACzB,KAAK,EACL,WAAW,EACX,IAAI,EACJ,OAAO,GAAG,gCAAgC,EAC1C,SAAS,GAAG,EAAE,GACE;IAChB,4DAA4D;IAC5D,MAAM,YAAY,GAAG,KAAK,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAA;IAE3E,qEAAqE;IACrE,MAAM,kBAAkB,GAAG,WAAW,CAAC,MAAM,GAAG,GAAG;QACjD,CAAC,CAAC,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,KAAK;QACnC,CAAC,CAAC,WAAW,CAAA;IAEf,YAAY;IACZ,MAAM,UAAU,GAAG,GAAG,OAAO,IAAI,IAAI,IAAI,cAAc,EAAE,CAAA;IAEzD,OAAO,CACL,eAAK,SAAS,EAAE,kBAAkB,SAAS,EAAE,aAC3C,YAAG,SAAS,EAAC,0BAA0B,sCAEnC,EAGJ,eAAK,SAAS,EAAC,WAAW,aAExB,eAAK,SAAS,EAAC,iCAAiC,aAC9C,cAAK,SAAS,EAAC,2CAA2C,YACxD,eAAM,SAAS,EAAC,sCAAsC,kBAAS,GAC3D,EACN,eAAK,SAAS,EAAC,eAAe,aAC5B,eAAM,SAAS,EAAC,0BAA0B,2BAAkB,EAC5D,eAAM,SAAS,EAAC,sDAAsD,YACnE,UAAU,GACN,IACH,IACF,EAGN,aAAI,SAAS,EAAC,yFAAyF,YACpG,YAAY,IAAI,eAAe,GAC7B,EAGL,YAAG,SAAS,EAAC,uDAAuD,YACjE,kBAAkB,IAAI,mHAAmH,GACxI,IACA,EAGN,eAAK,SAAS,EAAC,4CAA4C,aACzD,eAAK,SAAS,EAAC,SAAS,aACtB,eAAM,SAAS,EAAC,kBAAkB,wBAAe,EACjD,gBAAM,SAAS,EAAE,KAAK,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,YAAY,aACnE,KAAK,CAAC,MAAM,WACR,IACH,EACN,eAAK,SAAS,EAAC,SAAS,aACtB,eAAM,SAAS,EAAC,kBAAkB,8BAAqB,EACvD,gBAAM,SAAS,EAAE,WAAW,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,YAAY,aAC1E,WAAW,CAAC,MAAM,YACd,IACH,IACF,IACF,CACP,CAAA;AACH,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SecondaryMetricsRow.d.ts","sourceRoot":"","sources":["../../../src/admin/components/SecondaryMetricsRow.tsx"],"names":[],"mappings":"AAiBA,OAAO,KAAK,EAAE,cAAc,EAAE,uBAAuB,EAAE,MAAM,UAAU,CAAA;AAMvE,MAAM,WAAW,wBAAwB;IACvC,2DAA2D;IAC3D,OAAO,EAAE,uBAAuB,GAAG,IAAI,CAAA;IACvC,iEAAiE;IACjE,KAAK,EAAE,cAAc,GAAG,IAAI,CAAA;IAC5B,SAAS,EAAE,OAAO,CAAA;IAClB,QAAQ,EAAE,MAAM,CAAA;IAChB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,kFAAkF;IAClF,cAAc,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,MAAM,CAAA;CAC/C;AA8HD,wBAAgB,mBAAmB,CAAC,EAClC,OAAO,EACP,KAAK,EACL,SAAS,EACT,QAAQ,EACR,MAAgB,EAChB,cAAgD,GACjD,EAAE,wBAAwB,
|
|
1
|
+
{"version":3,"file":"SecondaryMetricsRow.d.ts","sourceRoot":"","sources":["../../../src/admin/components/SecondaryMetricsRow.tsx"],"names":[],"mappings":"AAiBA,OAAO,KAAK,EAAE,cAAc,EAAE,uBAAuB,EAAE,MAAM,UAAU,CAAA;AAMvE,MAAM,WAAW,wBAAwB;IACvC,2DAA2D;IAC3D,OAAO,EAAE,uBAAuB,GAAG,IAAI,CAAA;IACvC,iEAAiE;IACjE,KAAK,EAAE,cAAc,GAAG,IAAI,CAAA;IAC5B,SAAS,EAAE,OAAO,CAAA;IAClB,QAAQ,EAAE,MAAM,CAAA;IAChB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,kFAAkF;IAClF,cAAc,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,MAAM,CAAA;CAC/C;AA8HD,wBAAgB,mBAAmB,CAAC,EAClC,OAAO,EACP,KAAK,EACL,SAAS,EACT,QAAQ,EACR,MAAgB,EAChB,cAAgD,GACjD,EAAE,wBAAwB,2CAgC1B"}
|
|
@@ -40,6 +40,11 @@ function CountCard({ label, value, href, icon: Icon, isLoading, }) {
|
|
|
40
40
|
// Component
|
|
41
41
|
// =============================================================================
|
|
42
42
|
export function SecondaryMetricsRow({ summary, stats, isLoading, currency, locale = 'en-US', bestSellerHref = (id) => `/admin/products/${id}`, }) {
|
|
43
|
-
|
|
43
|
+
// Skeletons only when there is nothing to display yet — a background
|
|
44
|
+
// refetch (period change / tab refocus) keeps the rendered cards mounted.
|
|
45
|
+
// Each card gates on its own data source.
|
|
46
|
+
const summarySkeleton = isLoading && !summary;
|
|
47
|
+
const statsSkeleton = isLoading && !stats;
|
|
48
|
+
return (_jsxs("div", { className: "admin-stats-grid admin-stats-grid-3", children: [_jsx(BestSellerCard, { summary: summary, isLoading: summarySkeleton, currency: currency, locale: locale, bestSellerHref: bestSellerHref }), _jsx(CountCard, { label: "Customers", value: stats?.customers ?? 0, href: "/admin/customers", icon: Users, isLoading: statsSkeleton }), _jsx(CountCard, { label: "Active products", value: stats?.products ?? 0, href: "/admin/products", icon: Package, isLoading: statsSkeleton })] }));
|
|
44
49
|
}
|
|
45
50
|
//# sourceMappingURL=SecondaryMetricsRow.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SecondaryMetricsRow.js","sourceRoot":"","sources":["../../../src/admin/components/SecondaryMetricsRow.tsx"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"SecondaryMetricsRow.js","sourceRoot":"","sources":["../../../src/admin/components/SecondaryMetricsRow.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ShippingSettings.d.ts","sourceRoot":"","sources":["../../../src/admin/components/ShippingSettings.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EACV,qBAAqB,EAOtB,MAAM,UAAU,CAAA;
|
|
1
|
+
{"version":3,"file":"ShippingSettings.d.ts","sourceRoot":"","sources":["../../../src/admin/components/ShippingSettings.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EACV,qBAAqB,EAOtB,MAAM,UAAU,CAAA;AAiXjB,wBAAgB,gBAAgB,CAAC,EAAE,SAAS,EAAE,EAAE,qBAAqB,2CAghCpE"}
|
|
@@ -2,8 +2,11 @@
|
|
|
2
2
|
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
3
3
|
import { useState, useCallback, useEffect } from 'react';
|
|
4
4
|
import { fetchAdminApi } from '../hooks/fetchAdminApi';
|
|
5
|
-
import { Package, Plus, Edit2, Trash2, Globe, ChevronDown, ChevronUp, Plug, MapPin, Check, Truck, Box, RefreshCw, Key,
|
|
5
|
+
import { Package, Plus, Edit2, Trash2, Globe, ChevronDown, ChevronUp, Plug, MapPin, Check, Truck, Box, RefreshCw, Key, ExternalLink, } from 'lucide-react';
|
|
6
6
|
import { DeleteConfirmDialog } from './DeleteConfirmDialog';
|
|
7
|
+
import { AdminModal } from './AdminModal';
|
|
8
|
+
import { AdminSwitch } from './AdminSwitch';
|
|
9
|
+
import { AdminEmptyState } from './AdminEmptyState';
|
|
7
10
|
import { GroupVisibilityPicker } from './GroupVisibilityPicker';
|
|
8
11
|
import { AdminSelect } from './AdminSelect';
|
|
9
12
|
import { AdminSaveBar } from './AdminSaveBar';
|
|
@@ -44,14 +47,14 @@ function CountryTag({ code, onRemove, }) {
|
|
|
44
47
|
function CarrierCard({ carrier, onEdit, onDelete, onAddZone, onEditZone, onDeleteZone, onAddRate, onEditRate, onDeleteRate, formatCurrency, }) {
|
|
45
48
|
const [isExpanded, setIsExpanded] = useState(true);
|
|
46
49
|
const zones = carrier.zones || [];
|
|
47
|
-
return (_jsxs("div", { className: "rounded-lg border border-[hsl(var(--admin-border))] overflow-hidden", children: [_jsxs("div", { className: "flex items-center justify-between bg-[hsl(var(--admin-primary))]/10 px-4 py-3", children: [_jsxs("button", { type: "button", onClick: () => setIsExpanded(!isExpanded), className: "flex items-center gap-3 text-left flex-1", children: [_jsx(Truck, { className: "h-5 w-5 text-[hsl(var(--admin-primary))]" }), _jsxs("div", { children: [_jsx("span", { className: "font-semibold text-[hsl(var(--admin-foreground))]", children: carrier.name }), _jsxs("span", { className: "ml-2 text-sm text-[hsl(var(--admin-foreground-muted))]", children: ["(", carrier.code, ")"] }), carrier.description && (_jsx("p", { className: "text-sm text-[hsl(var(--admin-foreground-muted))]", children: carrier.description }))] }), isExpanded ? (_jsx(ChevronUp, { className: "h-4 w-4 text-[hsl(var(--admin-foreground-muted))]" })) : (_jsx(ChevronDown, { className: "h-4 w-4 text-[hsl(var(--admin-foreground-muted))]" }))] }), _jsxs("div", { className: "flex items-center gap-2", children: [!carrier.isActive && (_jsx("span", { className: "admin-badge admin-badge-
|
|
50
|
+
return (_jsxs("div", { className: "rounded-lg border border-[hsl(var(--admin-border))] overflow-hidden", children: [_jsxs("div", { className: "flex items-center justify-between bg-[hsl(var(--admin-primary))]/10 px-4 py-3", children: [_jsxs("button", { type: "button", onClick: () => setIsExpanded(!isExpanded), className: "flex items-center gap-3 text-left flex-1", children: [_jsx(Truck, { className: "h-5 w-5 text-[hsl(var(--admin-primary))]" }), _jsxs("div", { children: [_jsx("span", { className: "font-semibold text-[hsl(var(--admin-foreground))]", children: carrier.name }), _jsxs("span", { className: "ml-2 text-sm text-[hsl(var(--admin-foreground-muted))]", children: ["(", carrier.code, ")"] }), carrier.description && (_jsx("p", { className: "text-sm text-[hsl(var(--admin-foreground-muted))]", children: carrier.description }))] }), isExpanded ? (_jsx(ChevronUp, { className: "h-4 w-4 text-[hsl(var(--admin-foreground-muted))]" })) : (_jsx(ChevronDown, { className: "h-4 w-4 text-[hsl(var(--admin-foreground-muted))]" }))] }), _jsxs("div", { className: "flex items-center gap-2", children: [!carrier.isActive && (_jsx("span", { className: "admin-badge admin-badge-neutral", children: "Inactive" })), _jsxs("span", { className: "text-xs text-[hsl(var(--admin-foreground-muted))]", children: [zones.length, " zone", zones.length !== 1 ? 's' : ''] }), _jsx("button", { type: "button", onClick: onEdit, className: "admin-btn admin-btn-ghost admin-btn-sm", title: "Edit carrier", children: _jsx(Edit2, { className: "h-4 w-4" }) }), _jsx("button", { type: "button", onClick: onDelete, className: "admin-btn admin-btn-ghost admin-btn-sm text-[hsl(var(--admin-error))]", title: "Delete carrier", children: _jsx(Trash2, { className: "h-4 w-4" }) })] })] }), isExpanded && (_jsxs("div", { className: "bg-[hsl(var(--admin-card))]", children: [zones.length === 0 ? (_jsx("div", { className: "px-4 py-6", children: _jsx(AdminEmptyState, { icon: _jsx(Package, {}), title: "No zones yet", description: "Add a shipping zone to start configuring rates for this carrier." }) })) : (_jsx("div", { className: "divide-y divide-[hsl(var(--admin-border))]", children: zones.map((zone) => (_jsx(ZoneCard, { zone: zone, onEdit: () => onEditZone(zone), onDelete: () => onDeleteZone(zone), onAddRate: () => onAddRate(zone.id), onEditRate: (rate) => onEditRate(zone.id, rate), onDeleteRate: onDeleteRate, formatCurrency: formatCurrency }, zone.id))) })), _jsx("div", { className: "px-4 py-3 border-t border-[hsl(var(--admin-border))]", children: _jsxs("button", { type: "button", onClick: onAddZone, className: "flex items-center gap-2 text-sm text-[hsl(var(--admin-primary))] hover:text-[hsl(var(--admin-primary-hover))]", children: [_jsx(Plus, { className: "h-4 w-4" }), "Add shipping zone"] }) })] }))] }));
|
|
48
51
|
}
|
|
49
52
|
// =============================================================================
|
|
50
53
|
// Zone Card Component
|
|
51
54
|
// =============================================================================
|
|
52
55
|
function ZoneCard({ zone, onEdit, onDelete, onAddRate, onEditRate, onDeleteRate, formatCurrency, }) {
|
|
53
56
|
const [isExpanded, setIsExpanded] = useState(true);
|
|
54
|
-
return (_jsxs("div", { className: "bg-[hsl(var(--admin-background-subtle))]/30", children: [_jsxs("div", { className: "flex items-center justify-between px-4 py-3 pl-8", children: [_jsxs("button", { type: "button", onClick: () => setIsExpanded(!isExpanded), className: "flex items-center gap-3 text-left flex-1", children: [_jsx(Package, { className: "h-4 w-4 text-[hsl(var(--admin-foreground-muted))]" }), _jsxs("div", { children: [_jsx("span", { className: "font-medium text-[hsl(var(--admin-foreground))]", children: zone.name }), _jsxs("span", { className: "ml-2 text-sm text-[hsl(var(--admin-foreground-muted))]", children: ["(", zone.countries.includes('*') ? 'All countries' : zone.countries.join(', '), ")"] })] }), isExpanded ? (_jsx(ChevronUp, { className: "h-3 w-3 text-[hsl(var(--admin-foreground-muted))]" })) : (_jsx(ChevronDown, { className: "h-3 w-3 text-[hsl(var(--admin-foreground-muted))]" }))] }), _jsxs("div", { className: "flex items-center gap-2", children: [!zone.isActive && (_jsx("span", { className: "admin-badge admin-badge-
|
|
57
|
+
return (_jsxs("div", { className: "bg-[hsl(var(--admin-background-subtle))]/30", children: [_jsxs("div", { className: "flex items-center justify-between px-4 py-3 pl-8", children: [_jsxs("button", { type: "button", onClick: () => setIsExpanded(!isExpanded), className: "flex items-center gap-3 text-left flex-1", children: [_jsx(Package, { className: "h-4 w-4 text-[hsl(var(--admin-foreground-muted))]" }), _jsxs("div", { children: [_jsx("span", { className: "font-medium text-[hsl(var(--admin-foreground))]", children: zone.name }), _jsxs("span", { className: "ml-2 text-sm text-[hsl(var(--admin-foreground-muted))]", children: ["(", zone.countries.includes('*') ? 'All countries' : zone.countries.join(', '), ")"] })] }), isExpanded ? (_jsx(ChevronUp, { className: "h-3 w-3 text-[hsl(var(--admin-foreground-muted))]" })) : (_jsx(ChevronDown, { className: "h-3 w-3 text-[hsl(var(--admin-foreground-muted))]" }))] }), _jsxs("div", { className: "flex items-center gap-2", children: [!zone.isActive && (_jsx("span", { className: "admin-badge admin-badge-neutral", children: "Inactive" })), _jsxs("span", { className: "admin-row-actions", children: [_jsx("button", { type: "button", onClick: onEdit, className: "admin-btn admin-btn-ghost admin-btn-icon admin-btn-sm", "aria-label": "Edit zone", children: _jsx(Edit2, { className: "h-4 w-4" }) }), _jsx("button", { type: "button", onClick: onDelete, className: "admin-btn admin-btn-ghost admin-btn-icon admin-btn-sm", "aria-label": "Delete zone", children: _jsx(Trash2, { className: "h-4 w-4" }) })] })] })] }), isExpanded && (_jsxs("div", { className: "bg-[hsl(var(--admin-card))]", children: [zone.rates.length === 0 ? (_jsx("div", { className: "px-4 py-4 pl-12", children: _jsx(AdminEmptyState, { compact: true, description: "No shipping rates configured yet." }) })) : (_jsx("div", { className: "divide-y divide-[hsl(var(--admin-border))]", children: zone.rates.map((rate) => (_jsxs("div", { className: "flex items-center justify-between px-4 py-2 pl-12 hover:bg-[hsl(var(--admin-background-subtle))]/50 transition-colors", children: [_jsxs("div", { className: "flex items-center gap-3", children: [_jsx("span", { className: "text-[hsl(var(--admin-foreground-muted))] text-xs", children: "\u2514\u2500" }), _jsxs("div", { children: [_jsx("span", { className: "text-sm font-medium text-[hsl(var(--admin-foreground))]", children: rate.name }), rate.description && (_jsx("span", { className: "ml-2 text-xs text-[hsl(var(--admin-foreground-muted))]", children: rate.description }))] })] }), _jsxs("div", { className: "flex items-center gap-3", children: [_jsx("span", { className: "font-medium text-sm text-[hsl(var(--admin-foreground))]", children: formatCurrency(rate.price) }), rate.estimatedDays && (_jsxs("span", { className: "text-xs text-[hsl(var(--admin-foreground-muted))]", children: [rate.estimatedDays, " days"] })), !rate.isActive && (_jsx("span", { className: "admin-badge admin-badge-neutral", children: "Inactive" })), _jsx("button", { type: "button", onClick: () => onEditRate(rate), className: "admin-btn admin-btn-ghost admin-btn-sm", title: "Edit rate", children: _jsx(Edit2, { className: "h-3 w-3" }) }), _jsx("button", { type: "button", onClick: () => onDeleteRate(rate), className: "admin-btn admin-btn-ghost admin-btn-sm text-[hsl(var(--admin-error))]", title: "Delete rate", children: _jsx(Trash2, { className: "h-3 w-3" }) })] })] }, rate.id))) })), _jsx("div", { className: "px-4 py-2 pl-12 border-t border-[hsl(var(--admin-border))]", children: _jsxs("button", { type: "button", onClick: onAddRate, className: "flex items-center gap-2 text-xs text-[hsl(var(--admin-primary))] hover:text-[hsl(var(--admin-primary-hover))]", children: [_jsx(Plus, { className: "h-3 w-3" }), "Add rate"] }) })] }))] }));
|
|
55
58
|
}
|
|
56
59
|
// =============================================================================
|
|
57
60
|
// Main Component
|
|
@@ -341,19 +344,17 @@ export function ShippingSettings({ className }) {
|
|
|
341
344
|
// ---------------------------------------------------------------------------
|
|
342
345
|
// Render
|
|
343
346
|
// ---------------------------------------------------------------------------
|
|
344
|
-
return (_jsxs("div", { className: `space-y-6 ${className || ''}`, children: [_jsx(AdminPageHeader, { title: "Shipping", subtitle: "Carriers, zones and rates, and whether shipping is offered at checkout." }), _jsx("div", { className: "admin-card rounded-lg p-6", children: _jsxs("div", { className: "flex items-center justify-between", children: [_jsxs("div", { className: "flex items-center gap-3", children: [_jsx("div", { className: "h-10 w-10 rounded-full bg-[hsl(var(--admin-primary))]/10 flex items-center justify-center", children: _jsx(Package, { className: "h-5 w-5 text-[hsl(var(--admin-primary))]" }) }), _jsxs("div", { children: [_jsx("h3", { className: "admin-card-title", children: "Enable Shipping" }), _jsx("p", { className: "admin-text-muted text-sm", children: "Turn off to hide shipping options at checkout" })] })] }), _jsx("
|
|
345
|
-
? 'bg-[hsl(var(--admin-primary))]'
|
|
346
|
-
: 'bg-[hsl(var(--admin-background-subtle))]'}`, children: _jsx("span", { className: `inline-block h-4 w-4 transform rounded-full bg-white transition-transform ${shippingEnabled ? 'translate-x-6' : 'translate-x-1'}` }) })] }) }), shippingEnabled && (_jsxs(_Fragment, { children: [_jsxs("div", { className: "admin-card rounded-lg p-6", children: [_jsxs("div", { className: "flex items-center gap-2 mb-4", children: [_jsx(Truck, { className: "h-5 w-5 text-[hsl(var(--admin-primary))]" }), _jsx("h3", { className: "admin-card-title", children: "Shipping Method" })] }), _jsx("p", { className: "admin-text-muted text-sm mb-4", children: "Choose how shipping rates are calculated at checkout." }), _jsxs("div", { className: "grid grid-cols-1 md:grid-cols-2 gap-4", children: [_jsxs("button", { type: "button", onClick: () => setShippingMode('manual'), className: `p-4 rounded-lg border-2 text-left transition-colors ${shippingMode === 'manual'
|
|
347
|
+
return (_jsxs("div", { className: `space-y-6 ${className || ''}`, children: [_jsx(AdminPageHeader, { title: "Shipping", subtitle: "Carriers, zones and rates, and whether shipping is offered at checkout." }), _jsx("div", { className: "admin-card rounded-lg p-6", children: _jsxs("div", { className: "flex items-center justify-between", children: [_jsxs("div", { className: "flex items-center gap-3", children: [_jsx("div", { className: "h-10 w-10 rounded-full bg-[hsl(var(--admin-primary))]/10 flex items-center justify-center", children: _jsx(Package, { className: "h-5 w-5 text-[hsl(var(--admin-primary))]" }) }), _jsxs("div", { children: [_jsx("h3", { className: "admin-card-title", children: "Enable Shipping" }), _jsx("p", { className: "admin-text-muted text-sm", children: "Turn off to hide shipping options at checkout" })] })] }), _jsx(AdminSwitch, { checked: shippingEnabled, onChange: handleToggleShippingEnabled, "aria-label": "Enable shipping" })] }) }), shippingEnabled && (_jsxs(_Fragment, { children: [_jsxs("div", { className: "admin-card rounded-lg p-6", children: [_jsxs("div", { className: "flex items-center gap-2 mb-4", children: [_jsx(Truck, { className: "h-5 w-5 text-[hsl(var(--admin-primary))]" }), _jsx("h3", { className: "admin-card-title", children: "Shipping Method" })] }), _jsx("p", { className: "admin-text-muted text-sm mb-4", children: "Choose how shipping rates are calculated at checkout." }), _jsxs("div", { className: "grid grid-cols-1 md:grid-cols-2 gap-4", children: [_jsxs("button", { type: "button", onClick: () => setShippingMode('manual'), className: `p-4 rounded-lg border-2 text-left transition-colors ${shippingMode === 'manual'
|
|
347
348
|
? 'border-[hsl(var(--admin-primary))] bg-[hsl(var(--admin-primary-light))]'
|
|
348
349
|
: 'border-[hsl(var(--admin-border))] hover:border-[hsl(var(--admin-primary))]'}`, children: [_jsxs("div", { className: "flex items-center gap-2 mb-2", children: [_jsx(Package, { className: "h-5 w-5" }), _jsx("span", { className: "font-medium", children: "Manual Rates" })] }), _jsx("p", { className: "text-sm text-[hsl(var(--admin-foreground-muted))]", children: "Configure carriers, zones, and rates manually." })] }), _jsxs("button", { type: "button", onClick: () => setShippingMode('shippo'), className: `p-4 rounded-lg border-2 text-left transition-colors ${shippingMode === 'shippo'
|
|
349
350
|
? 'border-[hsl(var(--admin-primary))] bg-[hsl(var(--admin-primary-light))]'
|
|
350
|
-
: 'border-[hsl(var(--admin-border))] hover:border-[hsl(var(--admin-primary))]'}`, children: [_jsxs("div", { className: "flex items-center gap-2 mb-2", children: [_jsx(Plug, { className: "h-5 w-5" }), _jsx("span", { className: "font-medium", children: "Shippo (Carrier Rates)" })] }), _jsx("p", { className: "text-sm text-[hsl(var(--admin-foreground-muted))]", children: "Real-time rates from USPS, UPS, FedEx, and more." })] })] })] }), _jsxs("div", { className: "admin-card rounded-lg p-6", children: [_jsxs("div", { className: "flex items-center gap-2 mb-6", children: [_jsx(Globe, { className: "h-5 w-5 text-[hsl(var(--admin-primary))]" }), _jsx("h3", { className: "admin-card-title", children: "General Settings" })] }), _jsx("div", { className: "space-y-6", children: _jsxs("div", { children: [_jsxs("label", { className: "admin-label", children: [_jsx(MapPin, { className: "inline h-4 w-4 mr-1" }), "Shipping Countries"] }), _jsx("p", { className: "admin-text-muted text-sm mb-2", children: "Countries where you offer shipping" }), _jsx("div", { className: "flex flex-wrap gap-2 mb-3", children: shippingCountries.map((code) => (_jsx(CountryTag, { code: code, onRemove: () => handleRemoveCountry(code) }, code))) }), _jsxs("div", { className: "flex gap-2", children: [_jsx(AdminSelect, { value: countryInput, onChange: setCountryInput, placeholder: "Select a country
|
|
351
|
+
: 'border-[hsl(var(--admin-border))] hover:border-[hsl(var(--admin-primary))]'}`, children: [_jsxs("div", { className: "flex items-center gap-2 mb-2", children: [_jsx(Plug, { className: "h-5 w-5" }), _jsx("span", { className: "font-medium", children: "Shippo (Carrier Rates)" })] }), _jsx("p", { className: "text-sm text-[hsl(var(--admin-foreground-muted))]", children: "Real-time rates from USPS, UPS, FedEx, and more." })] })] })] }), _jsxs("div", { className: "admin-card rounded-lg p-6", children: [_jsxs("div", { className: "flex items-center gap-2 mb-6", children: [_jsx(Globe, { className: "h-5 w-5 text-[hsl(var(--admin-primary))]" }), _jsx("h3", { className: "admin-card-title", children: "General Settings" })] }), _jsx("div", { className: "space-y-6", children: _jsxs("div", { children: [_jsxs("label", { className: "admin-label", children: [_jsx(MapPin, { className: "inline h-4 w-4 mr-1" }), "Shipping Countries"] }), _jsx("p", { className: "admin-text-muted text-sm mb-2", children: "Countries where you offer shipping" }), _jsx("div", { className: "flex flex-wrap gap-2 mb-3", children: shippingCountries.map((code) => (_jsx(CountryTag, { code: code, onRemove: () => handleRemoveCountry(code) }, code))) }), _jsxs("div", { className: "flex gap-2", children: [_jsx(AdminSelect, { value: countryInput, onChange: setCountryInput, placeholder: "Select a country\u2026", options: COMMON_COUNTRIES.filter((c) => !shippingCountries.includes(c.code)).map((country) => ({
|
|
351
352
|
value: country.code,
|
|
352
353
|
label: `${country.name} (${country.code})`,
|
|
353
354
|
})), className: "w-full max-w-xs" }), _jsx("button", { type: "button", onClick: handleAddCountry, disabled: !countryInput, className: "admin-btn admin-btn-secondary disabled:opacity-50", children: "Add" })] })] }) })] }), shippingMode === 'manual' && (_jsxs("div", { className: "admin-card rounded-lg p-6", children: [_jsxs("div", { className: "flex items-center justify-between mb-6", children: [_jsxs("div", { className: "flex items-center gap-2", children: [_jsx(Truck, { className: "h-5 w-5 text-[hsl(var(--admin-primary))]" }), _jsx("h3", { className: "admin-card-title", children: "Shipping Carriers" })] }), _jsxs("button", { type: "button", onClick: () => {
|
|
354
355
|
setEditingCarrier(null);
|
|
355
356
|
setShowCarrierForm(true);
|
|
356
|
-
}, className: "admin-btn admin-btn-primary admin-btn-sm", children: [_jsx(Plus, { className: "h-4 w-4 mr-1" }), "Add
|
|
357
|
+
}, className: "admin-btn admin-btn-primary admin-btn-sm", children: [_jsx(Plus, { className: "h-4 w-4 mr-1" }), "Add carrier"] })] }), _jsx("p", { className: "admin-text-muted text-sm mb-4", children: "Configure your shipping carriers, zones, and rates. Each carrier can have multiple zones, and each zone can have multiple rates." }), carriers.length === 0 ? (_jsx(AdminEmptyState, { icon: _jsx(Truck, {}), title: "No carriers yet", description: "Add your first carrier to start offering shipping rates." })) : (_jsx("div", { className: "space-y-4", children: carriers.map((carrier) => (_jsx(CarrierCard, { carrier: carrier, onEdit: () => {
|
|
357
358
|
setEditingCarrier(carrier);
|
|
358
359
|
setShowCarrierForm(true);
|
|
359
360
|
}, onDelete: () => handleDeleteCarrierClick(carrier), onAddZone: () => {
|
|
@@ -368,17 +369,15 @@ export function ShippingSettings({ className }) {
|
|
|
368
369
|
}, onEditRate: (zoneId, rate) => {
|
|
369
370
|
setEditingRate({ zoneId, rate });
|
|
370
371
|
setShowRateForm(true);
|
|
371
|
-
}, onDeleteRate: handleDeleteRateClick, formatCurrency: formatCurrency }, carrier.id))) }))] })), shippingMode === 'shippo' && (_jsxs("div", { className: "space-y-6", children: [_jsxs("div", { className: "admin-card rounded-lg p-6", children: [_jsxs("div", { className: "flex items-center gap-2 mb-4", children: [_jsx(Plug, { className: "h-5 w-5 text-[hsl(var(--admin-primary))]" }), _jsx("h3", { className: "admin-card-title", children: "Shippo Connection" })] }), _jsxs("div", { className: "p-4 rounded-lg border border-[hsl(var(--admin-border))] bg-[hsl(var(--admin-card))]", children: [shippoKeyValid === true && (_jsxs("div", { className: "flex items-center justify-between", children: [_jsxs("div", { className: "flex items-center gap-3", children: [_jsx("div", { className: "h-10 w-10 rounded-full bg-[hsl(var(--admin-success))]/20 flex items-center justify-center", children: _jsx(Check, { className: "h-5 w-5 text-[hsl(var(--admin-success))]" }) }), _jsxs("div", { children: [_jsx("p", { className: "font-medium text-[hsl(var(--admin-foreground))]", children: "Connected" }), _jsx("p", { className: "text-sm text-[hsl(var(--admin-foreground-muted))]", children: hasStoredKey ? (_jsxs(_Fragment, { children: ["API key: ", _jsx("code", { className: "px-1 py-0.5 rounded bg-[hsl(var(--admin-background))] text-xs", children: maskedKey })] })) : ('Using environment variable') })] })] }), _jsxs("div", { className: "flex items-center gap-2", children: [hasStoredKey && (_jsx("button", { type: "button", onClick: handleRemoveApiKey, disabled: isDeletingApiKey, className: "admin-btn admin-btn-ghost admin-btn-sm text-[hsl(var(--admin-error))] hover:bg-[hsl(var(--admin-error))]/10", children: isDeletingApiKey ? (_jsx(
|
|
372
|
-
? 'Verifying
|
|
372
|
+
}, onDeleteRate: handleDeleteRateClick, formatCurrency: formatCurrency }, carrier.id))) }))] })), shippingMode === 'shippo' && (_jsxs("div", { className: "space-y-6", children: [_jsxs("div", { className: "admin-card rounded-lg p-6", children: [_jsxs("div", { className: "flex items-center gap-2 mb-4", children: [_jsx(Plug, { className: "h-5 w-5 text-[hsl(var(--admin-primary))]" }), _jsx("h3", { className: "admin-card-title", children: "Shippo Connection" })] }), _jsxs("div", { className: "p-4 rounded-lg border border-[hsl(var(--admin-border))] bg-[hsl(var(--admin-card))]", children: [shippoKeyValid === true && (_jsxs("div", { className: "flex items-center justify-between", children: [_jsxs("div", { className: "flex items-center gap-3", children: [_jsx("div", { className: "h-10 w-10 rounded-full bg-[hsl(var(--admin-success))]/20 flex items-center justify-center", children: _jsx(Check, { className: "h-5 w-5 text-[hsl(var(--admin-success))]" }) }), _jsxs("div", { children: [_jsx("p", { className: "font-medium text-[hsl(var(--admin-foreground))]", children: "Connected" }), _jsx("p", { className: "text-sm text-[hsl(var(--admin-foreground-muted))]", children: hasStoredKey ? (_jsxs(_Fragment, { children: ["API key: ", _jsx("code", { className: "px-1 py-0.5 rounded bg-[hsl(var(--admin-background))] text-xs", children: maskedKey })] })) : ('Using environment variable') })] })] }), _jsxs("div", { className: "flex items-center gap-2", children: [hasStoredKey && (_jsx("button", { type: "button", onClick: handleRemoveApiKey, disabled: isDeletingApiKey, className: "admin-btn admin-btn-ghost admin-btn-sm text-[hsl(var(--admin-error))] hover:bg-[hsl(var(--admin-error))]/10", children: isDeletingApiKey ? (_jsx("span", { className: "admin-spinner admin-spinner-sm" })) : ('Remove key') })), _jsx("button", { type: "button", onClick: handleValidateShippoKey, disabled: isValidatingShippo, className: "admin-btn admin-btn-secondary disabled:opacity-50", children: isValidatingShippo ? (_jsx(RefreshCw, { className: "h-4 w-4 animate-spin" })) : ('Re-verify') })] })] })), shippoKeyValid !== true && (_jsxs("div", { className: "space-y-4", children: [_jsxs("div", { className: "flex items-center gap-3", children: [_jsx("div", { className: "h-10 w-10 rounded-full bg-[hsl(var(--admin-warning))]/20 flex items-center justify-center", children: isValidatingShippo ? (_jsx("span", { className: "admin-spinner admin-spinner-sm" })) : (_jsx(Key, { className: "h-5 w-5 text-[hsl(var(--admin-warning))]" })) }), _jsxs("div", { children: [_jsx("p", { className: "font-medium text-[hsl(var(--admin-foreground))]", children: isValidatingShippo
|
|
373
|
+
? 'Verifying…'
|
|
373
374
|
: hasStoredKey && shippoKeyValid === false
|
|
374
375
|
? 'API Key Invalid'
|
|
375
376
|
: 'API Key Required' }), _jsx("p", { className: "text-sm text-[hsl(var(--admin-foreground-muted))]", children: isValidatingShippo
|
|
376
|
-
? 'Checking your Shippo connection
|
|
377
|
+
? 'Checking your Shippo connection…'
|
|
377
378
|
: hasStoredKey && shippoKeyValid === false
|
|
378
379
|
? `Current key (${maskedKey}) is invalid. Enter a new key.`
|
|
379
|
-
: 'Enter your Shippo API key to enable carrier rate shipping.' })] })] }), !isValidatingShippo && (_jsxs(_Fragment, { children: [_jsxs("div", { className: "flex gap-2", children: [_jsx("input", { type: "password", value: shippoApiKeyInput, onChange: (e) => setShippoApiKeyInput(e.target.value), placeholder: "shippo_live_
|
|
380
|
-
? 'bg-[hsl(var(--admin-primary))]'
|
|
381
|
-
: 'bg-[hsl(var(--admin-background-subtle))]'}`, children: _jsx("span", { className: `inline-block h-4 w-4 transform rounded-full bg-white transition-transform ${shippoTestMode ? 'translate-x-6' : 'translate-x-1'}` }) })] })] }), _jsxs("div", { className: "admin-card rounded-lg p-6", children: [_jsxs("div", { className: "flex items-center gap-2 mb-4", children: [_jsx(MapPin, { className: "h-5 w-5 text-[hsl(var(--admin-primary))]" }), _jsx("h3", { className: "admin-card-title", children: "Ship-From Address" })] }), _jsx("p", { className: "admin-text-muted text-sm mb-4", children: "Your warehouse or fulfillment center address for shipping calculations." }), _jsxs("div", { className: "grid grid-cols-1 md:grid-cols-2 gap-4", children: [_jsxs("div", { children: [_jsx("label", { htmlFor: "shippo-name", className: "admin-label", children: "Name" }), _jsx("input", { type: "text", id: "shippo-name", value: shippoFromAddress.name, onChange: (e) => setShippoFromAddress((prev) => ({ ...prev, name: e.target.value })), className: "admin-input mt-1 w-full", placeholder: "John Smith" })] }), _jsxs("div", { children: [_jsx("label", { htmlFor: "shippo-company", className: "admin-label", children: "Company (optional)" }), _jsx("input", { type: "text", id: "shippo-company", value: shippoFromAddress.company || '', onChange: (e) => setShippoFromAddress((prev) => ({ ...prev, company: e.target.value })), className: "admin-input mt-1 w-full", placeholder: "Acme Inc." })] }), _jsxs("div", { className: "md:col-span-2", children: [_jsx("label", { htmlFor: "shippo-street1", className: "admin-label", children: "Street Address" }), _jsx("input", { type: "text", id: "shippo-street1", value: shippoFromAddress.street1, onChange: (e) => setShippoFromAddress((prev) => ({ ...prev, street1: e.target.value })), className: "admin-input mt-1 w-full", placeholder: "123 Main St" })] }), _jsxs("div", { className: "md:col-span-2", children: [_jsx("label", { htmlFor: "shippo-street2", className: "admin-label", children: "Apt, Suite, etc. (optional)" }), _jsx("input", { type: "text", id: "shippo-street2", value: shippoFromAddress.street2 || '', onChange: (e) => setShippoFromAddress((prev) => ({ ...prev, street2: e.target.value })), className: "admin-input mt-1 w-full", placeholder: "Suite 100" })] }), _jsxs("div", { children: [_jsx("label", { htmlFor: "shippo-city", className: "admin-label", children: "City" }), _jsx("input", { type: "text", id: "shippo-city", value: shippoFromAddress.city, onChange: (e) => setShippoFromAddress((prev) => ({ ...prev, city: e.target.value })), className: "admin-input mt-1 w-full", placeholder: "San Francisco" })] }), shippoFromAddress.country === 'US' && (_jsxs("div", { children: [_jsx("label", { htmlFor: "shippo-state", className: "admin-label", children: "State" }), _jsx(AdminSelect, { id: "shippo-state", value: shippoFromAddress.state, onChange: (value) => setShippoFromAddress((prev) => ({ ...prev, state: value })), placeholder: "Select state...", options: US_STATES.map((state) => ({
|
|
380
|
+
: 'Enter your Shippo API key to enable carrier rate shipping.' })] })] }), !isValidatingShippo && (_jsxs(_Fragment, { children: [_jsxs("div", { className: "flex gap-2", children: [_jsx("input", { type: "password", value: shippoApiKeyInput, onChange: (e) => setShippoApiKeyInput(e.target.value), placeholder: "shippo_live_\u2026", className: "admin-input flex-1" }), _jsx("button", { type: "button", onClick: handleSaveShippoApiKey, disabled: isSavingApiKey || !shippoApiKeyInput.trim(), className: "admin-btn admin-btn-primary disabled:opacity-50", children: isSavingApiKey ? (_jsx("span", { className: "admin-spinner admin-spinner-sm" })) : ('Save & Verify') })] }), _jsxs("p", { className: "text-xs text-[hsl(var(--admin-foreground-muted))]", children: ["Get your API key from", ' ', _jsxs("a", { href: "https://apps.goshippo.com/settings/api", target: "_blank", rel: "noopener noreferrer", className: "text-[hsl(var(--admin-primary))] hover:underline inline-flex items-center gap-1", children: ["Shippo Dashboard", _jsx(ExternalLink, { className: "h-3 w-3" })] })] })] }))] }))] }), _jsxs("div", { className: "flex items-center justify-between mt-4 pt-4 border-t border-[hsl(var(--admin-border))]", children: [_jsxs("div", { children: [_jsx("label", { className: "admin-label", children: "Test Mode" }), _jsx("p", { className: "admin-text-muted text-sm", children: "Use Shippo test API for development (free API calls)" })] }), _jsx(AdminSwitch, { checked: shippoTestMode, onChange: setShippoTestMode, "aria-label": "Test mode" })] })] }), _jsxs("div", { className: "admin-card rounded-lg p-6", children: [_jsxs("div", { className: "flex items-center gap-2 mb-4", children: [_jsx(MapPin, { className: "h-5 w-5 text-[hsl(var(--admin-primary))]" }), _jsx("h3", { className: "admin-card-title", children: "Ship-From Address" })] }), _jsx("p", { className: "admin-text-muted text-sm mb-4", children: "Your warehouse or fulfillment center address for shipping calculations." }), _jsxs("div", { className: "grid grid-cols-1 md:grid-cols-2 gap-4", children: [_jsxs("div", { children: [_jsx("label", { htmlFor: "shippo-name", className: "admin-label", children: "Name" }), _jsx("input", { type: "text", id: "shippo-name", value: shippoFromAddress.name, onChange: (e) => setShippoFromAddress((prev) => ({ ...prev, name: e.target.value })), className: "admin-input mt-1 w-full", placeholder: "John Smith" })] }), _jsxs("div", { children: [_jsx("label", { htmlFor: "shippo-company", className: "admin-label", children: "Company (optional)" }), _jsx("input", { type: "text", id: "shippo-company", value: shippoFromAddress.company || '', onChange: (e) => setShippoFromAddress((prev) => ({ ...prev, company: e.target.value })), className: "admin-input mt-1 w-full", placeholder: "Acme Inc." })] }), _jsxs("div", { className: "md:col-span-2", children: [_jsx("label", { htmlFor: "shippo-street1", className: "admin-label", children: "Street Address" }), _jsx("input", { type: "text", id: "shippo-street1", value: shippoFromAddress.street1, onChange: (e) => setShippoFromAddress((prev) => ({ ...prev, street1: e.target.value })), className: "admin-input mt-1 w-full", placeholder: "123 Main St" })] }), _jsxs("div", { className: "md:col-span-2", children: [_jsx("label", { htmlFor: "shippo-street2", className: "admin-label", children: "Apt, Suite, etc. (optional)" }), _jsx("input", { type: "text", id: "shippo-street2", value: shippoFromAddress.street2 || '', onChange: (e) => setShippoFromAddress((prev) => ({ ...prev, street2: e.target.value })), className: "admin-input mt-1 w-full", placeholder: "Suite 100" })] }), _jsxs("div", { children: [_jsx("label", { htmlFor: "shippo-city", className: "admin-label", children: "City" }), _jsx("input", { type: "text", id: "shippo-city", value: shippoFromAddress.city, onChange: (e) => setShippoFromAddress((prev) => ({ ...prev, city: e.target.value })), className: "admin-input mt-1 w-full", placeholder: "San Francisco" })] }), shippoFromAddress.country === 'US' && (_jsxs("div", { children: [_jsx("label", { htmlFor: "shippo-state", className: "admin-label", children: "State" }), _jsx(AdminSelect, { id: "shippo-state", value: shippoFromAddress.state, onChange: (value) => setShippoFromAddress((prev) => ({ ...prev, state: value })), placeholder: "Select state\u2026", options: US_STATES.map((state) => ({
|
|
382
381
|
value: state.code,
|
|
383
382
|
label: state.name,
|
|
384
383
|
})), className: "mt-1 w-full" })] })), _jsxs("div", { children: [_jsx("label", { htmlFor: "shippo-zip", className: "admin-label", children: "ZIP Code" }), _jsx("input", { type: "text", id: "shippo-zip", value: shippoFromAddress.zip, onChange: (e) => setShippoFromAddress((prev) => ({ ...prev, zip: e.target.value })), className: "admin-input mt-1 w-full", placeholder: "94102" })] }), _jsxs("div", { children: [_jsx("label", { htmlFor: "shippo-country", className: "admin-label", children: "Country" }), _jsx(AdminSelect, { id: "shippo-country", value: shippoFromAddress.country, onChange: (value) => setShippoFromAddress((prev) => ({ ...prev, country: value })), options: COMMON_COUNTRIES.map((country) => ({
|
|
@@ -413,7 +412,7 @@ export function ShippingSettings({ className }) {
|
|
|
413
412
|
setShowRateForm(false);
|
|
414
413
|
setEditingRate(null);
|
|
415
414
|
fetchData();
|
|
416
|
-
}, currencySymbol: currencySymbol })), _jsx(DeleteConfirmDialog, { isOpen: !!deleteTarget, title: `Delete ${deleteTarget?.type === 'carrier' ? '
|
|
415
|
+
}, currencySymbol: currencySymbol })), _jsx(DeleteConfirmDialog, { isOpen: !!deleteTarget, title: `Delete ${deleteTarget?.type === 'carrier' ? 'carrier' : deleteTarget?.type === 'zone' ? 'zone' : 'rate'}`, itemName: deleteTarget?.name || '', itemType: deleteTarget?.type === 'carrier'
|
|
417
416
|
? 'carrier'
|
|
418
417
|
: deleteTarget?.type === 'zone'
|
|
419
418
|
? 'zone'
|
|
@@ -468,9 +467,7 @@ function CarrierFormModal({ carrier, onClose, onSuccess, }) {
|
|
|
468
467
|
}
|
|
469
468
|
onSuccess();
|
|
470
469
|
};
|
|
471
|
-
return (
|
|
472
|
-
? 'bg-[hsl(var(--admin-primary))]'
|
|
473
|
-
: 'bg-[hsl(var(--admin-background-subtle))]'}`, children: _jsx("span", { className: `inline-block h-4 w-4 transform rounded-full bg-white transition-transform ${isActive ? 'translate-x-6' : 'translate-x-1'}` }) })] })] })] }), _jsxs("div", { className: "flex justify-end gap-3 p-6 border-t border-[hsl(var(--admin-border))]", children: [_jsx("button", { type: "button", onClick: onClose, className: "admin-btn admin-btn-secondary", children: "Cancel" }), _jsx("button", { type: "submit", disabled: isLoading || !name.trim() || !code.trim(), className: "admin-btn admin-btn-primary disabled:opacity-50", children: isLoading ? 'Saving...' : isEdit ? 'Update Carrier' : 'Create Carrier' })] })] }) })] }));
|
|
470
|
+
return (_jsx(AdminModal, { open: true, onClose: onClose, busy: isLoading, width: "md", title: isEdit ? 'Edit shipping carrier' : 'Add shipping carrier', showClose: true, footer: _jsxs(_Fragment, { children: [_jsx("button", { type: "button", onClick: onClose, disabled: isLoading, className: "admin-btn admin-btn-secondary", children: "Cancel" }), _jsx("button", { type: "submit", form: "carrier-form", disabled: isLoading || !name.trim() || !code.trim(), className: "admin-btn admin-btn-primary", children: isLoading ? 'Saving…' : isEdit ? 'Update carrier' : 'Create carrier' })] }), children: _jsx("form", { id: "carrier-form", onSubmit: handleSubmit, children: _jsxs("div", { className: "admin-modal-body", children: [error && (_jsx("div", { className: "admin-alert admin-alert-error mb-4", children: _jsx("div", { className: "admin-alert-description", children: error }) })), _jsxs("div", { className: "space-y-4", children: [_jsxs("div", { children: [_jsx("label", { htmlFor: "carrierName", className: "admin-label admin-label-required", children: "Carrier Name" }), _jsx("input", { type: "text", id: "carrierName", value: name, onChange: (e) => handleNameChange(e.target.value), className: "admin-input mt-1 w-full", placeholder: "e.g., USPS, UPS, FedEx", required: true })] }), _jsxs("div", { children: [_jsx("label", { htmlFor: "carrierCode", className: "admin-label admin-label-required", children: "Carrier Code" }), _jsx("input", { type: "text", id: "carrierCode", value: code, onChange: (e) => setCode(e.target.value.toLowerCase().replace(/[^a-z0-9-]/g, '')), className: "admin-input mt-1 w-full", placeholder: "e.g., usps, ups, fedex", required: true, maxLength: 50 }), _jsx("p", { className: "admin-helper-text mt-1", children: "Unique identifier (lowercase, letters, numbers, hyphens only)" })] }), _jsxs("div", { children: [_jsx("label", { htmlFor: "carrierDescription", className: "admin-label", children: "Description" }), _jsx("input", { type: "text", id: "carrierDescription", value: description, onChange: (e) => setDescription(e.target.value), className: "admin-input mt-1 w-full", placeholder: "e.g., United States Postal Service", maxLength: 500 })] }), _jsxs("div", { className: "flex items-center justify-between", children: [_jsx("label", { className: "admin-label", children: "Active" }), _jsx(AdminSwitch, { checked: isActive, onChange: setIsActive, "aria-label": "Active" })] })] })] }) }) }));
|
|
474
471
|
}
|
|
475
472
|
// =============================================================================
|
|
476
473
|
// Zone Form Modal (UPDATED - requires carrierId)
|
|
@@ -519,14 +516,10 @@ function ZoneFormModal({ carrierId, zone, onClose, onSuccess, }) {
|
|
|
519
516
|
setCountryInput('');
|
|
520
517
|
}
|
|
521
518
|
};
|
|
522
|
-
return (
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
label: country.name,
|
|
527
|
-
})), className: "flex-1" }), _jsx("button", { type: "button", onClick: handleAddCountry, disabled: !countryInput, className: "admin-btn admin-btn-secondary disabled:opacity-50", children: "Add" })] })] })), _jsxs("div", { className: "flex items-center justify-between", children: [_jsx("label", { className: "admin-label", children: "Active" }), _jsx("button", { type: "button", role: "switch", "aria-checked": isActive, onClick: () => setIsActive(!isActive), className: `relative inline-flex h-6 w-11 items-center rounded-full transition-colors ${isActive
|
|
528
|
-
? 'bg-[hsl(var(--admin-primary))]'
|
|
529
|
-
: 'bg-[hsl(var(--admin-background-subtle))]'}`, children: _jsx("span", { className: `inline-block h-4 w-4 transform rounded-full bg-white transition-transform ${isActive ? 'translate-x-6' : 'translate-x-1'}` }) })] })] })] }), _jsxs("div", { className: "flex justify-end gap-3 p-6 border-t border-[hsl(var(--admin-border))]", children: [_jsx("button", { type: "button", onClick: onClose, className: "admin-btn admin-btn-secondary", children: "Cancel" }), _jsx("button", { type: "submit", disabled: isLoading || !name.trim(), className: "admin-btn admin-btn-primary disabled:opacity-50", children: isLoading ? 'Saving...' : isEdit ? 'Update Zone' : 'Create Zone' })] })] }) })] }));
|
|
519
|
+
return (_jsx(AdminModal, { open: true, onClose: onClose, busy: isLoading, width: "md", title: isEdit ? 'Edit shipping zone' : 'Add shipping zone', showClose: true, footer: _jsxs(_Fragment, { children: [_jsx("button", { type: "button", onClick: onClose, disabled: isLoading, className: "admin-btn admin-btn-secondary", children: "Cancel" }), _jsx("button", { type: "submit", form: "shipping-zone-form", disabled: isLoading || !name.trim(), className: "admin-btn admin-btn-primary", children: isLoading ? 'Saving…' : isEdit ? 'Update zone' : 'Create zone' })] }), children: _jsx("form", { id: "shipping-zone-form", onSubmit: handleSubmit, children: _jsxs("div", { className: "admin-modal-body", children: [error && (_jsx("div", { className: "admin-alert admin-alert-error mb-4", children: _jsx("div", { className: "admin-alert-description", children: error }) })), _jsxs("div", { className: "space-y-4", children: [_jsxs("div", { children: [_jsx("label", { htmlFor: "zoneName", className: "admin-label admin-label-required", children: "Zone Name" }), _jsx("input", { type: "text", id: "zoneName", value: name, onChange: (e) => setName(e.target.value), className: "admin-input mt-1 w-full", placeholder: "e.g., Domestic, International", required: true })] }), _jsxs("div", { className: "flex items-center justify-between", children: [_jsxs("div", { children: [_jsx("label", { className: "admin-label", children: "All Countries" }), _jsx("p", { className: "admin-text-muted text-sm", children: "Apply to all countries not covered by other zones" })] }), _jsx(AdminSwitch, { checked: isAllCountries, onChange: setIsAllCountries, "aria-label": "All countries" })] }), !isAllCountries && (_jsxs("div", { children: [_jsx("label", { className: "admin-label", children: "Countries" }), _jsx("div", { className: "flex flex-wrap gap-2 mb-2 mt-1", children: countries.map((code) => (_jsx(CountryTag, { code: code, onRemove: () => setCountries((prev) => prev.filter((c) => c !== code)) }, code))) }), _jsxs("div", { className: "flex gap-2", children: [_jsx(AdminSelect, { value: countryInput, onChange: setCountryInput, placeholder: "Select country\u2026", options: COMMON_COUNTRIES.filter((c) => !countries.includes(c.code)).map((country) => ({
|
|
520
|
+
value: country.code,
|
|
521
|
+
label: country.name,
|
|
522
|
+
})), className: "flex-1" }), _jsx("button", { type: "button", onClick: handleAddCountry, disabled: !countryInput, className: "admin-btn admin-btn-secondary disabled:opacity-50", children: "Add" })] })] })), _jsxs("div", { className: "flex items-center justify-between", children: [_jsx("label", { className: "admin-label", children: "Active" }), _jsx(AdminSwitch, { checked: isActive, onChange: setIsActive, "aria-label": "Active" })] })] })] }) }) }));
|
|
530
523
|
}
|
|
531
524
|
// =============================================================================
|
|
532
525
|
// Rate Form Modal
|
|
@@ -590,10 +583,8 @@ function RateFormModal({ zoneId, rate, onClose, onSuccess, currencySymbol, }) {
|
|
|
590
583
|
}
|
|
591
584
|
onSuccess();
|
|
592
585
|
};
|
|
593
|
-
return (
|
|
594
|
-
|
|
595
|
-
|
|
596
|
-
? 'bg-[hsl(var(--admin-primary))]'
|
|
597
|
-
: 'bg-[hsl(var(--admin-background-subtle))]'}`, children: _jsx("span", { className: `inline-block h-4 w-4 transform rounded-full bg-white transition-transform ${isActive ? 'translate-x-6' : 'translate-x-1'}` }) })] })] }), _jsx(GroupVisibilityPicker, { value: visibleToGroups, onChange: setVisibleToGroups, noun: "shipping rate" })] }), _jsxs("div", { className: "flex justify-end gap-3 p-6 border-t border-[hsl(var(--admin-border))]", children: [_jsx("button", { type: "button", onClick: onClose, className: "admin-btn admin-btn-secondary", children: "Cancel" }), _jsx("button", { type: "submit", disabled: isLoading || !name.trim() || (!isFree && !price), className: "admin-btn admin-btn-primary disabled:opacity-50", children: isLoading ? 'Saving...' : isEdit ? 'Update Rate' : 'Create Rate' })] })] }) })] }));
|
|
586
|
+
return (_jsx(AdminModal, { open: true, onClose: onClose, busy: isLoading, width: "md", title: isEdit ? 'Edit shipping rate' : 'Add shipping rate', showClose: true, footer: _jsxs(_Fragment, { children: [_jsx("button", { type: "button", onClick: onClose, disabled: isLoading, className: "admin-btn admin-btn-secondary", children: "Cancel" }), _jsx("button", { type: "submit", form: "shipping-rate-form", disabled: isLoading || !name.trim() || (!isFree && !price), className: "admin-btn admin-btn-primary", children: isLoading ? 'Saving…' : isEdit ? 'Update rate' : 'Create rate' })] }), children: _jsx("form", { id: "shipping-rate-form", onSubmit: handleSubmit, children: _jsxs("div", { className: "admin-modal-body", children: [error && (_jsx("div", { className: "admin-alert admin-alert-error mb-4", children: _jsx("div", { className: "admin-alert-description", children: error }) })), _jsxs("div", { className: "space-y-4", children: [_jsxs("div", { children: [_jsx("label", { className: "admin-label", children: "Rate type" }), _jsxs("div", { className: "mt-1 grid grid-cols-2 gap-2", children: [_jsx("button", { type: "button", onClick: () => selectRateType(false), className: `admin-btn ${!isFree ? 'admin-btn-primary' : 'admin-btn-secondary'}`, children: "Paid rate" }), _jsx("button", { type: "button", onClick: () => selectRateType(true), className: `admin-btn ${isFree ? 'admin-btn-primary' : 'admin-btn-secondary'}`, children: "Free shipping" })] })] }), _jsxs("div", { children: [_jsx("label", { htmlFor: "rateName", className: "admin-label admin-label-required", children: "Rate Name" }), _jsx("input", { type: "text", id: "rateName", value: name, onChange: (e) => setName(e.target.value), className: "admin-input mt-1 w-full", placeholder: "e.g., Standard Shipping", required: true })] }), _jsxs("div", { children: [_jsx("label", { htmlFor: "rateDescription", className: "admin-label", children: "Description" }), _jsx("input", { type: "text", id: "rateDescription", value: description, onChange: (e) => setDescription(e.target.value), className: "admin-input mt-1 w-full", placeholder: "e.g., Delivery in 5-7 business days" })] }), isFree ? (_jsxs("div", { children: [_jsx("label", { className: "admin-label", children: "Price" }), _jsx("div", { className: "admin-input mt-1 flex items-center text-[hsl(var(--admin-foreground-muted))]", children: "Free \u2014 no shipping charge to the customer" })] })) : (_jsxs("div", { children: [_jsx("label", { htmlFor: "ratePrice", className: "admin-label admin-label-required", children: "Price" }), _jsxs("div", { className: "admin-input-with-addon mt-1", children: [_jsx("span", { className: "admin-input-addon-left", children: currencySymbol }), _jsx("input", { type: "number", id: "ratePrice", value: price, onChange: (e) => setPrice(e.target.value), min: "0", step: "0.01", className: "admin-input w-full pl-7", placeholder: "0.00", required: true })] })] })), _jsxs("div", { children: [_jsx("label", { htmlFor: "estimatedDays", className: "admin-label", children: "Estimated Delivery (days)" }), _jsx("input", { type: "text", id: "estimatedDays", value: estimatedDays, onChange: (e) => setEstimatedDays(e.target.value), className: "admin-input mt-1 w-full", placeholder: "e.g., 3-5" }), _jsx("p", { className: "admin-helper-text mt-1", children: "Format: single number (5) or range (3-5)" })] }), _jsxs("div", { className: "grid grid-cols-2 gap-4", children: [_jsxs("div", { children: [_jsx("label", { htmlFor: "minOrderAmount", className: "admin-label", children: isFree ? 'Free above' : 'Min Order Amount' }), _jsxs("div", { className: "admin-input-with-addon mt-1", children: [_jsx("span", { className: "admin-input-addon-left", children: currencySymbol }), _jsx("input", { type: "number", id: "minOrderAmount", value: minOrderAmount, onChange: (e) => setMinOrderAmount(e.target.value), min: "0", step: "0.01", className: "admin-input w-full pl-7", placeholder: "0.00" })] })] }), _jsxs("div", { children: [_jsx("label", { htmlFor: "maxOrderAmount", className: "admin-label", children: "Max Order Amount" }), _jsxs("div", { className: "admin-input-with-addon mt-1", children: [_jsx("span", { className: "admin-input-addon-left", children: currencySymbol }), _jsx("input", { type: "number", id: "maxOrderAmount", value: maxOrderAmount, onChange: (e) => setMaxOrderAmount(e.target.value), min: "0", step: "0.01", className: "admin-input w-full pl-7", placeholder: "No limit" })] })] })] }), _jsx("p", { className: "admin-helper-text", children: isFree
|
|
587
|
+
? 'Set a minimum order for free shipping, or leave both blank to always ship free.'
|
|
588
|
+
: 'Leave empty for no restrictions' }), _jsxs("div", { className: "flex items-center justify-between", children: [_jsx("label", { className: "admin-label", children: "Active" }), _jsx(AdminSwitch, { checked: isActive, onChange: setIsActive, "aria-label": "Active" })] })] }), _jsx(GroupVisibilityPicker, { value: visibleToGroups, onChange: setVisibleToGroups, noun: "shipping rate" })] }) }) }));
|
|
598
589
|
}
|
|
599
590
|
//# sourceMappingURL=ShippingSettings.js.map
|