@endora-commerce/mod-quote-requests 0.100.0
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/LICENSE +21 -0
- package/README.md +59 -0
- package/dist/admin/index.d.ts +26 -0
- package/dist/admin/index.d.ts.map +1 -0
- package/dist/admin/index.js +56 -0
- package/dist/admin/index.js.map +1 -0
- package/dist/admin/pages/RfqCreatePage.d.ts +9 -0
- package/dist/admin/pages/RfqCreatePage.d.ts.map +1 -0
- package/dist/admin/pages/RfqCreatePage.js +163 -0
- package/dist/admin/pages/RfqCreatePage.js.map +1 -0
- package/dist/admin/pages/RfqDetail.d.ts +9 -0
- package/dist/admin/pages/RfqDetail.d.ts.map +1 -0
- package/dist/admin/pages/RfqDetail.js +399 -0
- package/dist/admin/pages/RfqDetail.js.map +1 -0
- package/dist/admin/pages/RfqList.d.ts +9 -0
- package/dist/admin/pages/RfqList.d.ts.map +1 -0
- package/dist/admin/pages/RfqList.js +214 -0
- package/dist/admin/pages/RfqList.js.map +1 -0
- package/dist/admin/validity.d.ts +52 -0
- package/dist/admin/validity.d.ts.map +1 -0
- package/dist/admin/validity.js +61 -0
- package/dist/admin/validity.js.map +1 -0
- package/dist/backend/entities/quote-request-event.entity.d.ts +24 -0
- package/dist/backend/entities/quote-request-event.entity.d.ts.map +1 -0
- package/dist/backend/entities/quote-request-event.entity.js +67 -0
- package/dist/backend/entities/quote-request-event.entity.js.map +1 -0
- package/dist/backend/entities/quote-request-item.entity.d.ts +34 -0
- package/dist/backend/entities/quote-request-item.entity.d.ts.map +1 -0
- package/dist/backend/entities/quote-request-item.entity.js +119 -0
- package/dist/backend/entities/quote-request-item.entity.js.map +1 -0
- package/dist/backend/entities/quote-request-notification-event.entity.d.ts +23 -0
- package/dist/backend/entities/quote-request-notification-event.entity.d.ts.map +1 -0
- package/dist/backend/entities/quote-request-notification-event.entity.js +72 -0
- package/dist/backend/entities/quote-request-notification-event.entity.js.map +1 -0
- package/dist/backend/entities/quote-request-revision.entity.d.ts +35 -0
- package/dist/backend/entities/quote-request-revision.entity.d.ts.map +1 -0
- package/dist/backend/entities/quote-request-revision.entity.js +67 -0
- package/dist/backend/entities/quote-request-revision.entity.js.map +1 -0
- package/dist/backend/entities/quote-request.entity.d.ts +90 -0
- package/dist/backend/entities/quote-request.entity.d.ts.map +1 -0
- package/dist/backend/entities/quote-request.entity.js +191 -0
- package/dist/backend/entities/quote-request.entity.js.map +1 -0
- package/dist/backend/index.d.ts +120 -0
- package/dist/backend/index.d.ts.map +1 -0
- package/dist/backend/index.js +361 -0
- package/dist/backend/index.js.map +1 -0
- package/dist/backend/plugin.d.ts +95 -0
- package/dist/backend/plugin.d.ts.map +1 -0
- package/dist/backend/plugin.js +152 -0
- package/dist/backend/plugin.js.map +1 -0
- package/dist/backend/routes.admin.d.ts +13 -0
- package/dist/backend/routes.admin.d.ts.map +1 -0
- package/dist/backend/routes.admin.js +82 -0
- package/dist/backend/routes.admin.js.map +1 -0
- package/dist/backend/routes.customer.d.ts +18 -0
- package/dist/backend/routes.customer.d.ts.map +1 -0
- package/dist/backend/routes.customer.js +98 -0
- package/dist/backend/routes.customer.js.map +1 -0
- package/dist/backend/routes.sales-reps.d.ts +12 -0
- package/dist/backend/routes.sales-reps.d.ts.map +1 -0
- package/dist/backend/routes.sales-reps.js +57 -0
- package/dist/backend/routes.sales-reps.js.map +1 -0
- package/dist/backend/services/order-completion-reactor.d.ts +32 -0
- package/dist/backend/services/order-completion-reactor.d.ts.map +1 -0
- package/dist/backend/services/order-completion-reactor.js +57 -0
- package/dist/backend/services/order-completion-reactor.js.map +1 -0
- package/dist/backend/services/quote-request-business-id-generator.d.ts +46 -0
- package/dist/backend/services/quote-request-business-id-generator.d.ts.map +1 -0
- package/dist/backend/services/quote-request-business-id-generator.js +69 -0
- package/dist/backend/services/quote-request-business-id-generator.js.map +1 -0
- package/dist/backend/services/quote-request-read-port.d.ts +36 -0
- package/dist/backend/services/quote-request-read-port.d.ts.map +1 -0
- package/dist/backend/services/quote-request-read-port.js +96 -0
- package/dist/backend/services/quote-request-read-port.js.map +1 -0
- package/dist/backend/services/raised-on-channel.d.ts +23 -0
- package/dist/backend/services/raised-on-channel.d.ts.map +1 -0
- package/dist/backend/services/raised-on-channel.js +26 -0
- package/dist/backend/services/raised-on-channel.js.map +1 -0
- package/dist/backend/services/rfq-admin-service.d.ts +75 -0
- package/dist/backend/services/rfq-admin-service.d.ts.map +1 -0
- package/dist/backend/services/rfq-admin-service.js +487 -0
- package/dist/backend/services/rfq-admin-service.js.map +1 -0
- package/dist/backend/services/rfq-event-service.d.ts +32 -0
- package/dist/backend/services/rfq-event-service.d.ts.map +1 -0
- package/dist/backend/services/rfq-event-service.js +28 -0
- package/dist/backend/services/rfq-event-service.js.map +1 -0
- package/dist/backend/services/rfq-expiry-worker.d.ts +50 -0
- package/dist/backend/services/rfq-expiry-worker.d.ts.map +1 -0
- package/dist/backend/services/rfq-expiry-worker.js +70 -0
- package/dist/backend/services/rfq-expiry-worker.js.map +1 -0
- package/dist/backend/services/rfq-notification-service.d.ts +36 -0
- package/dist/backend/services/rfq-notification-service.d.ts.map +1 -0
- package/dist/backend/services/rfq-notification-service.js +52 -0
- package/dist/backend/services/rfq-notification-service.js.map +1 -0
- package/dist/backend/services/rfq-revision-service.d.ts +70 -0
- package/dist/backend/services/rfq-revision-service.d.ts.map +1 -0
- package/dist/backend/services/rfq-revision-service.js +120 -0
- package/dist/backend/services/rfq-revision-service.js.map +1 -0
- package/dist/backend/services/rfq-service.d.ts +140 -0
- package/dist/backend/services/rfq-service.d.ts.map +1 -0
- package/dist/backend/services/rfq-service.js +786 -0
- package/dist/backend/services/rfq-service.js.map +1 -0
- package/dist/backend/services/sales-channel-attributions.d.ts +38 -0
- package/dist/backend/services/sales-channel-attributions.d.ts.map +1 -0
- package/dist/backend/services/sales-channel-attributions.js +48 -0
- package/dist/backend/services/sales-channel-attributions.js.map +1 -0
- package/dist/manifest.d.ts +203 -0
- package/dist/manifest.d.ts.map +1 -0
- package/dist/manifest.js +277 -0
- package/dist/manifest.js.map +1 -0
- package/dist/migrations/20260424T190112_quote_requests_init.d.ts +19 -0
- package/dist/migrations/20260424T190112_quote_requests_init.d.ts.map +1 -0
- package/dist/migrations/20260424T190112_quote_requests_init.js +65 -0
- package/dist/migrations/20260424T190112_quote_requests_init.js.map +1 -0
- package/dist/migrations/20260503T141344_quote_requests_workflow.d.ts +37 -0
- package/dist/migrations/20260503T141344_quote_requests_workflow.d.ts.map +1 -0
- package/dist/migrations/20260503T141344_quote_requests_workflow.js +251 -0
- package/dist/migrations/20260503T141344_quote_requests_workflow.js.map +1 -0
- package/dist/migrations/20260611T140415_quote_requests_qr_item_packaging.d.ts +10 -0
- package/dist/migrations/20260611T140415_quote_requests_qr_item_packaging.d.ts.map +1 -0
- package/dist/migrations/20260611T140415_quote_requests_qr_item_packaging.js +16 -0
- package/dist/migrations/20260611T140415_quote_requests_qr_item_packaging.js.map +1 -0
- package/dist/migrations/20260611T140417_quote_requests_business_id.d.ts +24 -0
- package/dist/migrations/20260611T140417_quote_requests_business_id.d.ts.map +1 -0
- package/dist/migrations/20260611T140417_quote_requests_business_id.js +34 -0
- package/dist/migrations/20260611T140417_quote_requests_business_id.js.map +1 -0
- package/dist/migrations/20260617T095510_quote_requests_backfill_admin_created_awaiting.d.ts +21 -0
- package/dist/migrations/20260617T095510_quote_requests_backfill_admin_created_awaiting.d.ts.map +1 -0
- package/dist/migrations/20260617T095510_quote_requests_backfill_admin_created_awaiting.js +29 -0
- package/dist/migrations/20260617T095510_quote_requests_backfill_admin_created_awaiting.js.map +1 -0
- package/dist/migrations/20260718T200342_quote_requests_quote_request_custom_field_values.d.ts +12 -0
- package/dist/migrations/20260718T200342_quote_requests_quote_request_custom_field_values.d.ts.map +1 -0
- package/dist/migrations/20260718T200342_quote_requests_quote_request_custom_field_values.js +16 -0
- package/dist/migrations/20260718T200342_quote_requests_quote_request_custom_field_values.js.map +1 -0
- package/dist/migrations/20260912T125614_quote_requests_quote_request_channel_attribution.d.ts +34 -0
- package/dist/migrations/20260912T125614_quote_requests_quote_request_channel_attribution.d.ts.map +1 -0
- package/dist/migrations/20260912T125614_quote_requests_quote_request_channel_attribution.js +57 -0
- package/dist/migrations/20260912T125614_quote_requests_quote_request_channel_attribution.js.map +1 -0
- package/dist/migrations/index.d.ts +53 -0
- package/dist/migrations/index.d.ts.map +1 -0
- package/dist/migrations/index.js +61 -0
- package/dist/migrations/index.js.map +1 -0
- package/dist/migrations/status-mapping.d.ts +18 -0
- package/dist/migrations/status-mapping.d.ts.map +1 -0
- package/dist/migrations/status-mapping.js +28 -0
- package/dist/migrations/status-mapping.js.map +1 -0
- package/docs/quote_requests.md +168 -0
- package/i18n/en.json +14 -0
- package/i18n/pl.json +14 -0
- package/package.json +99 -0
- package/tailwind.css +14 -0
|
@@ -0,0 +1,399 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
|
+
import { useCallback, useEffect, useRef, useState } from 'react';
|
|
3
|
+
import { useParams } from 'react-router-dom';
|
|
4
|
+
import { CalendarClock, CalendarX, Check, ClipboardList, Copy, FileText, History, PencilLine, XCircle, } from 'lucide-react';
|
|
5
|
+
import { apiClient, ApiError, cn, formatDateTime } from '@endora-commerce/admin-kit/lib';
|
|
6
|
+
import { Alert, AlertDescription, Badge, Button, Card, CardContent, Input, Label, PageHeader, Section, Table, TableBody, TableCell, TableHead, TableHeader, TableRow, Textarea } from '@endora-commerce/admin-kit/ui';
|
|
7
|
+
import { CustomFieldValuesPanel, ProductPicker } from '@endora-commerce/admin-kit/components';
|
|
8
|
+
import { useTranslation } from '@endora-commerce/admin-kit/i18n';
|
|
9
|
+
import { deadlineForDays, isValidityDaysInvalid, rfqValidity } from '../validity.js';
|
|
10
|
+
const TERMINAL = ['Approved', 'Completed', 'Canceled', 'Expired'];
|
|
11
|
+
/**
|
|
12
|
+
* The statuses on which the operator's validity deadline still decides
|
|
13
|
+
* something: the two the customer can still accept a revision from, and the
|
|
14
|
+
* one they can still convert to an order. On a Canceled, Completed or
|
|
15
|
+
* (worker-)Expired request the deadline decides nothing, so saying it lapsed
|
|
16
|
+
* would be crying wolf over a record that is closed for another reason.
|
|
17
|
+
*/
|
|
18
|
+
const VALIDITY_MATTERS_ON = ['Pending', 'Created from admin', 'Approved'];
|
|
19
|
+
const STATUS_VARIANT = {
|
|
20
|
+
'Created from admin': 'warning',
|
|
21
|
+
Pending: 'warning',
|
|
22
|
+
Approved: 'success',
|
|
23
|
+
Completed: 'default',
|
|
24
|
+
Canceled: 'destructive',
|
|
25
|
+
Expired: 'secondary',
|
|
26
|
+
};
|
|
27
|
+
export function RfqDetail() {
|
|
28
|
+
const t = useTranslation('core');
|
|
29
|
+
const { id } = useParams();
|
|
30
|
+
const [rfq, setRfq] = useState(null);
|
|
31
|
+
const [loading, setLoading] = useState(true);
|
|
32
|
+
const [error, setError] = useState(null);
|
|
33
|
+
const [info, setInfo] = useState(null);
|
|
34
|
+
const [cancelReason, setCancelReason] = useState('');
|
|
35
|
+
const [cancelOpen, setCancelOpen] = useState(false);
|
|
36
|
+
const [busy, setBusy] = useState(false);
|
|
37
|
+
const [tab, setTab] = useState('overview');
|
|
38
|
+
// Bumped when the operator takes the "set a new deadline" shortcut out of the
|
|
39
|
+
// lapsed banner, so the Modify tab opens with the deadline field focused
|
|
40
|
+
// rather than at the top of a form the operator then has to scan.
|
|
41
|
+
const [validityFocusNonce, setValidityFocusNonce] = useState(0);
|
|
42
|
+
const refresh = useCallback(async () => {
|
|
43
|
+
if (!id)
|
|
44
|
+
return;
|
|
45
|
+
setLoading(true);
|
|
46
|
+
setError(null);
|
|
47
|
+
try {
|
|
48
|
+
const res = await apiClient.get(`/api/v1/admin/quote-requests/${id}`);
|
|
49
|
+
setRfq(res.data);
|
|
50
|
+
}
|
|
51
|
+
catch (err) {
|
|
52
|
+
setError(err instanceof ApiError ? err.envelope.error.message : t('rfq.detail.error.load'));
|
|
53
|
+
}
|
|
54
|
+
finally {
|
|
55
|
+
setLoading(false);
|
|
56
|
+
}
|
|
57
|
+
}, [id, t]);
|
|
58
|
+
useEffect(() => {
|
|
59
|
+
void refresh();
|
|
60
|
+
}, [refresh]);
|
|
61
|
+
const approve = async () => {
|
|
62
|
+
if (!rfq)
|
|
63
|
+
return;
|
|
64
|
+
setBusy(true);
|
|
65
|
+
setError(null);
|
|
66
|
+
setInfo(null);
|
|
67
|
+
try {
|
|
68
|
+
await apiClient.post(`/api/v1/admin/quote-requests/${rfq.id}/approve`, {}, { headers: { 'If-Match': `"${rfq.version}"` } });
|
|
69
|
+
setInfo(t('rfq.detail.info.approved'));
|
|
70
|
+
await refresh();
|
|
71
|
+
}
|
|
72
|
+
catch (err) {
|
|
73
|
+
setError(err instanceof ApiError ? err.envelope.error.message : t('rfq.detail.error.approve'));
|
|
74
|
+
}
|
|
75
|
+
finally {
|
|
76
|
+
setBusy(false);
|
|
77
|
+
}
|
|
78
|
+
};
|
|
79
|
+
const cancel = async () => {
|
|
80
|
+
if (!rfq)
|
|
81
|
+
return;
|
|
82
|
+
setBusy(true);
|
|
83
|
+
setError(null);
|
|
84
|
+
setInfo(null);
|
|
85
|
+
try {
|
|
86
|
+
const body = cancelReason.trim().length > 0 ? { reason: cancelReason.trim() } : {};
|
|
87
|
+
await apiClient.post(`/api/v1/admin/quote-requests/${rfq.id}/cancel`, body, { headers: { 'If-Match': `"${rfq.version}"` } });
|
|
88
|
+
setInfo(t('rfq.detail.info.canceled'));
|
|
89
|
+
setCancelReason('');
|
|
90
|
+
setCancelOpen(false);
|
|
91
|
+
await refresh();
|
|
92
|
+
}
|
|
93
|
+
catch (err) {
|
|
94
|
+
setError(err instanceof ApiError ? err.envelope.error.message : t('rfq.detail.error.cancel'));
|
|
95
|
+
}
|
|
96
|
+
finally {
|
|
97
|
+
setBusy(false);
|
|
98
|
+
}
|
|
99
|
+
};
|
|
100
|
+
const convert = async () => {
|
|
101
|
+
if (!rfq)
|
|
102
|
+
return;
|
|
103
|
+
setBusy(true);
|
|
104
|
+
setError(null);
|
|
105
|
+
setInfo(null);
|
|
106
|
+
try {
|
|
107
|
+
const res = await apiClient.post(`/api/v1/quote-requests/${rfq.id}/convert-to-order`, {});
|
|
108
|
+
setInfo(t('rfq.detail.convert.success', {
|
|
109
|
+
cartId: res.data.cartId.slice(0, 8),
|
|
110
|
+
url: res.data.checkoutUrl,
|
|
111
|
+
}));
|
|
112
|
+
}
|
|
113
|
+
catch (err) {
|
|
114
|
+
setError(err instanceof ApiError ? err.envelope.error.message : t('rfq.detail.convert.error'));
|
|
115
|
+
}
|
|
116
|
+
finally {
|
|
117
|
+
setBusy(false);
|
|
118
|
+
}
|
|
119
|
+
};
|
|
120
|
+
const copyId = useCallback(async () => {
|
|
121
|
+
if (!rfq)
|
|
122
|
+
return;
|
|
123
|
+
const ref = rfq.businessId ?? rfq.id;
|
|
124
|
+
try {
|
|
125
|
+
await navigator.clipboard.writeText(ref);
|
|
126
|
+
setInfo(t('rfq.detail.copied', { id: ref }));
|
|
127
|
+
}
|
|
128
|
+
catch {
|
|
129
|
+
setError(t('rfq.detail.copyError'));
|
|
130
|
+
}
|
|
131
|
+
}, [rfq, t]);
|
|
132
|
+
if (loading)
|
|
133
|
+
return _jsx("p", { className: "text-sm text-muted-foreground", children: t('rfq.detail.loading') });
|
|
134
|
+
if (!rfq)
|
|
135
|
+
return (_jsx(Alert, { variant: "destructive", children: _jsx(AlertDescription, { children: error ?? t('rfq.detail.notFound') }) }));
|
|
136
|
+
const displayId = rfq.businessId ?? rfq.id.slice(0, 8);
|
|
137
|
+
const isTerminal = TERMINAL.includes(rfq.status);
|
|
138
|
+
const total = rfq.items.every((it) => it.agreedUnitPrice !== null)
|
|
139
|
+
? rfq.items.reduce((s, it) => s + (it.agreedUnitPrice ?? 0) * it.quantity, 0)
|
|
140
|
+
: null;
|
|
141
|
+
const currency = rfq.items[0]?.lineCurrency ?? 'PLN';
|
|
142
|
+
// Quote prices are net; surface VAT + gross so the total matches the order
|
|
143
|
+
// it converts into. `rfq.taxRate` is the flat rate resolved server-side.
|
|
144
|
+
const taxRate = rfq.taxRate ?? 0;
|
|
145
|
+
const taxTotal = total !== null ? total * taxRate : null;
|
|
146
|
+
const grossTotal = total !== null && taxTotal !== null ? total + taxTotal : null;
|
|
147
|
+
// The operator's validity deadline, read once per render against the same
|
|
148
|
+
// clock every branch below uses.
|
|
149
|
+
const validity = rfqValidity(rfq.expiresAt, new Date());
|
|
150
|
+
const validityLapsed = validity.kind === 'lapsed' && VALIDITY_MATTERS_ON.includes(rfq.status);
|
|
151
|
+
// `modify` is the only operation that writes `expiresAt`, and it refuses any
|
|
152
|
+
// status but these two — so on an Approved request the deadline can no
|
|
153
|
+
// longer be moved at all, and the banner says so instead of pointing at a
|
|
154
|
+
// tab that is not rendered.
|
|
155
|
+
const validityReDatable = rfq.status === 'Pending' || rfq.status === 'Created from admin';
|
|
156
|
+
const openValidityEditor = () => {
|
|
157
|
+
setTab('modify');
|
|
158
|
+
setValidityFocusNonce((n) => n + 1);
|
|
159
|
+
};
|
|
160
|
+
// Action buttons live in the PageHeader's top-right slot — mirroring the
|
|
161
|
+
// Order detail view — rather than in an in-body status row.
|
|
162
|
+
//
|
|
163
|
+
// Both are disabled past the deadline, because both can now only answer 410:
|
|
164
|
+
// convert-to-order is refused outright, and approving moves a lapsed request
|
|
165
|
+
// into `Approved`, which `modify` refuses — so the deadline could never be
|
|
166
|
+
// moved afterwards and the quote would be unusable by either party. The
|
|
167
|
+
// banner below carries the reason and the remedy; a disabled button cannot.
|
|
168
|
+
const headerActions = [];
|
|
169
|
+
if (rfq.status === 'Pending') {
|
|
170
|
+
headerActions.push(_jsxs(Button, { variant: "outline", size: "sm", className: "bg-card", onClick: () => void approve(), disabled: busy || validityLapsed, children: [_jsx(Check, {}), t('rfq.detail.approve')] }, "approve"));
|
|
171
|
+
}
|
|
172
|
+
if (rfq.status === 'Approved') {
|
|
173
|
+
headerActions.push(_jsxs(Button, { variant: "outline", size: "sm", className: "bg-card", onClick: () => void convert(), disabled: busy || validityLapsed, children: [_jsx(FileText, {}), t('rfq.detail.convert.placeOrder')] }, "convert"));
|
|
174
|
+
}
|
|
175
|
+
if (!isTerminal) {
|
|
176
|
+
headerActions.push(_jsxs(Button, { variant: "outline", size: "sm", className: "bg-card border-destructive/40 text-destructive hover:bg-destructive/10", onClick: () => setCancelOpen(true), disabled: busy, children: [_jsx(XCircle, {}), t('rfq.detail.cancelRfq')] }, "cancel"));
|
|
177
|
+
}
|
|
178
|
+
return (_jsxs(_Fragment, { children: [_jsx(PageHeader, { back: { label: t('rfq.list.title'), to: '/quote-requests' }, title: _jsxs(_Fragment, { children: [_jsxs("button", { type: "button", onClick: () => void copyId(), title: t('rfq.detail.copyHint'), className: "inline-flex items-center gap-1.5 hover:opacity-80", children: [t('rfq.detail.title', { id: displayId }), _jsx(Copy, { className: "size-3.5 opacity-60" })] }), _jsx(Badge, { variant: STATUS_VARIANT[rfq.status], className: "text-xs font-medium", children: rfq.status }), rfq.awaitingCustomerRevisionAcceptance ? (_jsx(Badge, { variant: "warning", className: "text-xs font-medium", children: t('rfq.detail.badge.awaitingRevision') })) : null, validityLapsed ? (_jsxs(Badge, { variant: "destructive", className: "gap-1 text-xs font-medium", children: [_jsx(CalendarX, { className: "size-3", "aria-hidden": "true" }), t('rfq.detail.badge.validityEnded')] })) : null] }), description: _jsxs("span", { children: [t('rfq.detail.meta.created', { date: formatDateTime(rfq.createdAt) }), rfq.submittedAt
|
|
179
|
+
? ` · ${t('rfq.detail.meta.submitted', { date: formatDateTime(rfq.submittedAt) })}`
|
|
180
|
+
: '', rfq.expiredAt
|
|
181
|
+
? ` · ${t('rfq.detail.meta.expired', { date: formatDateTime(rfq.expiredAt) })}`
|
|
182
|
+
: validity.kind === 'active'
|
|
183
|
+
? ` · ${t('rfq.detail.meta.expires', { date: formatDateTime(validity.expiresAt) })}`
|
|
184
|
+
: validity.kind === 'lapsed'
|
|
185
|
+
? ` · ${t('rfq.detail.meta.validityEnded', { date: formatDateTime(validity.expiresAt) })}`
|
|
186
|
+
: '', ' ', _jsxs("code", { className: "font-mono text-xs", children: ["(", rfq.id, ")"] })] }), actions: headerActions.length > 0 ? headerActions : null }), error ? (_jsx(Alert, { variant: "destructive", className: "mb-4", children: _jsx(AlertDescription, { children: error }) })) : null, info ? (_jsx(Alert, { variant: "success", className: "mb-4", children: _jsx(AlertDescription, { children: info }) })) : null, rfq.cancellationReason ? (_jsx(Alert, { variant: "destructive", className: "mb-4", children: _jsx(AlertDescription, { children: t('rfq.detail.badge.cancelReason', { reason: rfq.cancellationReason }) }) })) : null, validityLapsed && validity.kind === 'lapsed' ? (_jsxs(Alert, { variant: "warning", className: "mb-4", children: [_jsx(CalendarX, { className: "size-4", "aria-hidden": "true" }), _jsxs(AlertDescription, { children: [_jsx("p", { className: "font-medium", children: t('rfq.detail.validity.lapsed.headline', {
|
|
187
|
+
date: formatDateTime(validity.expiresAt),
|
|
188
|
+
}) }), _jsx("p", { className: "mt-1", children: validityReDatable
|
|
189
|
+
? t('rfq.detail.validity.lapsed.remedyEditable')
|
|
190
|
+
: t('rfq.detail.validity.lapsed.remedyLocked') }), validityReDatable ? (_jsxs(Button, { variant: "outline", size: "sm", className: "mt-3 bg-card", onClick: openValidityEditor, children: [_jsx(CalendarClock, {}), t('rfq.detail.validity.lapsed.setNewDeadline')] })) : null] })] })) : null, _jsxs(Card, { className: cn('mb-4', tab !== 'modify' && 'overflow-hidden'), children: [_jsx("div", { style: { padding: '4px 4px 0', overflow: 'hidden' }, children: _jsx("div", { className: "b2b-tabs-scroll", children: _jsxs("div", { className: "b2b-tabs", role: "tablist", children: [_jsx(TabBtn, { id: "overview", label: t('rfq.detail.tabs.overview'), icon: _jsx(ClipboardList, { size: 14 }), active: tab, onChange: setTab }), !isTerminal ? (_jsx(TabBtn, { id: "modify", label: t('rfq.detail.tabs.modify'), icon: _jsx(PencilLine, { size: 14 }), active: tab, onChange: setTab })) : null, _jsx(TabBtn, { id: "history", label: t('rfq.detail.tabs.history'), icon: _jsx(History, { size: 14 }), active: tab, onChange: setTab })] }) }) }), _jsxs(CardContent, { className: "divide-y divide-border pt-6 [&>*]:py-6 [&>*:first-child]:pt-0 [&>*:last-child]:pb-0", children: [tab === 'overview' ? (_jsxs(_Fragment, { children: [_jsxs("div", { className: "grid gap-6 md:grid-cols-2", children: [_jsx(Section, { title: t('rfq.detail.sections.organization'), children: rfq.organization ? (_jsxs("div", { className: "space-y-1 text-sm", children: [_jsx("p", { className: "font-medium", children: rfq.organization.name }), rfq.organization.legalName &&
|
|
191
|
+
rfq.organization.legalName !== rfq.organization.name ? (_jsx("p", { className: "text-muted-foreground", children: rfq.organization.legalName })) : null, _jsxs("p", { className: "text-muted-foreground", children: [t('rfq.detail.org.taxId'), ": ", _jsx("strong", { children: rfq.organization.taxId })] }), _jsxs("p", { className: "text-muted-foreground", children: [t('rfq.detail.org.vat'), ":", ' ', t(`rfq.detail.vatStatus.${rfq.organization.vatStatus}`)] })] })) : (_jsx("p", { className: "text-sm text-muted-foreground", children: _jsx("code", { className: "font-mono text-xs", children: rfq.organizationId }) })) }), _jsx(Section, { title: t('rfq.detail.sections.customer'), children: rfq.customer ? (_jsxs("div", { className: "space-y-1 text-sm", children: [_jsx("p", { className: "font-medium", children: `${rfq.customer.firstName ?? ''} ${rfq.customer.lastName ?? ''}`.trim() ||
|
|
192
|
+
rfq.customer.email }), _jsx("p", { className: "text-muted-foreground", children: _jsx("a", { className: "underline underline-offset-2", href: `mailto:${rfq.customer.email}`, children: rfq.customer.email }) })] })) : (_jsx("p", { className: "text-sm text-muted-foreground", children: _jsx("code", { className: "font-mono text-xs", children: rfq.customerAccountId }) })) })] }), rfq.headerNote ? (_jsx(Section, { title: t('rfq.detail.sections.buyerNote'), children: _jsx("p", { className: "text-sm", children: rfq.headerNote }) })) : null, _jsx(Section, { title: t('rfq.detail.sections.items'), children: _jsxs(Table, { children: [_jsx(TableHeader, { children: _jsxs(TableRow, { children: [_jsx(TableHead, { children: t('rfq.detail.column.product') }), _jsx(TableHead, { children: t('rfq.detail.column.qty') }), _jsx(TableHead, { children: t('rfq.detail.column.desired') }), _jsx(TableHead, { children: t('rfq.detail.column.agreed') }), _jsx(TableHead, { className: "text-right", children: t('rfq.detail.column.lineTotal') })] }) }), _jsx(TableBody, { children: rfq.items.map((it) => {
|
|
193
|
+
const lineTotal = it.agreedUnitPrice !== null
|
|
194
|
+
? it.agreedUnitPrice * it.quantity
|
|
195
|
+
: it.desiredUnitPrice !== null
|
|
196
|
+
? it.desiredUnitPrice * it.quantity
|
|
197
|
+
: null;
|
|
198
|
+
return (_jsxs(TableRow, { children: [_jsxs(TableCell, { children: [_jsx("strong", { children: it.productName }), it.variantLabel ? _jsxs("small", { children: [" (", it.variantLabel, ")"] }) : null, it.lineNote ? (_jsx("div", { className: "text-xs text-muted-foreground", children: it.lineNote })) : null] }), _jsx(TableCell, { children: it.quantity }), _jsx(TableCell, { className: "tabular-nums", children: it.desiredUnitPrice !== null ? it.desiredUnitPrice.toFixed(2) : '—' }), _jsx(TableCell, { className: "tabular-nums", children: it.agreedUnitPrice !== null ? it.agreedUnitPrice.toFixed(2) : '—' }), _jsx(TableCell, { className: "tabular-nums text-right", children: lineTotal !== null
|
|
199
|
+
? `${lineTotal.toLocaleString('pl-PL', { minimumFractionDigits: 2 })} ${it.lineCurrency}`
|
|
200
|
+
: '—' })] }, it.id));
|
|
201
|
+
}) }), total !== null ? (_jsxs("tfoot", { className: "border-t [&_td]:p-2 [&_th]:p-2", children: [taxRate > 0 ? (_jsxs(_Fragment, { children: [_jsxs("tr", { children: [_jsx("th", { colSpan: 4, className: "text-right", children: t('rfq.detail.netLabel') }), _jsxs("td", { className: "tabular-nums text-right", children: [total.toLocaleString('pl-PL', { minimumFractionDigits: 2 }), " ", currency] })] }), _jsxs("tr", { children: [_jsx("th", { colSpan: 4, className: "text-right", children: t('rfq.detail.taxLabel', { rate: (taxRate * 100).toFixed(0) }) }), _jsxs("td", { className: "tabular-nums text-right", children: [(taxTotal ?? 0).toLocaleString('pl-PL', { minimumFractionDigits: 2 }), ' ', currency] })] })] })) : null, _jsxs("tr", { children: [_jsx("th", { colSpan: 4, className: "text-right font-semibold", children: taxRate > 0 ? t('rfq.detail.grossLabel') : t('rfq.detail.totalLabel') }), _jsxs("td", { className: "tabular-nums text-right font-semibold", children: [(grossTotal ?? total).toLocaleString('pl-PL', {
|
|
202
|
+
minimumFractionDigits: 2,
|
|
203
|
+
}), ' ', currency] })] })] })) : null] }) }), !isTerminal ? (_jsx(CustomFieldValuesPanel, { entityType: "quote_request", values: rfq.customFieldValues ?? {}, save: async (values) => {
|
|
204
|
+
await apiClient.patch(`/api/v1/admin/quote-requests/${rfq.id}`, { customFieldValues: values }, { headers: { 'If-Match': `"${rfq.version}"` } });
|
|
205
|
+
await refresh();
|
|
206
|
+
} })) : null] })) : null, tab === 'modify' && !isTerminal ? (_jsx(ModifyCard, { rfq: rfq, onSaved: refresh, setError: setError, setInfo: setInfo, focusValidityNonce: validityFocusNonce })) : null, tab === 'history' ? (_jsx(Section, { title: t('rfq.detail.history.title'), children: rfq.events.length === 0 ? (_jsx("p", { className: "text-sm text-muted-foreground", children: t('rfq.detail.history.empty') })) : (_jsx("ul", { className: "space-y-2", children: rfq.events.map((e) => (_jsxs("li", { className: "rounded-md border p-3 text-sm", children: [_jsxs("div", { className: "mb-1 flex items-center gap-2 text-xs text-muted-foreground", children: [_jsx("span", { children: formatDateTime(e.createdAt) }), e.actorRoleLabel ? _jsxs("span", { children: ["\u00B7 ", e.actorRoleLabel] }) : null] }), _jsx("p", { className: "font-medium", children: e.eventType })] }, e.id))) })) })) : null] })] }), cancelOpen ? (_jsx(CancelDialog, { reason: cancelReason, onReasonChange: setCancelReason, onConfirm: () => void cancel(), onClose: () => setCancelOpen(false), busy: busy })) : null] }));
|
|
207
|
+
}
|
|
208
|
+
/**
|
|
209
|
+
* Cancellation modal — captures the (optional) cancellation reason on an
|
|
210
|
+
* overlay rather than stretching the status row, then confirms the cancel.
|
|
211
|
+
*/
|
|
212
|
+
function CancelDialog(props) {
|
|
213
|
+
const t = useTranslation('core');
|
|
214
|
+
return (_jsx("div", { className: "fixed inset-0 z-50 flex items-center justify-center bg-black/50 p-4", role: "dialog", "aria-modal": "true", onClick: props.onClose, children: _jsxs("div", { className: "w-full max-w-md rounded-lg border bg-card p-5 shadow-lg", onClick: (e) => e.stopPropagation(), children: [_jsx("h2", { className: "mb-3 text-base font-semibold", children: t('rfq.detail.cancelDialog.title') }), _jsxs("div", { className: "space-y-2", children: [_jsx(Label, { htmlFor: "cancel-reason", children: t('rfq.detail.cancelReason') }), _jsx(Textarea, { id: "cancel-reason", autoFocus: true, value: props.reason, onChange: (e) => props.onReasonChange(e.target.value), placeholder: t('rfq.detail.cancelReasonPlaceholder'), rows: 3 })] }), _jsxs("div", { className: "mt-4 flex justify-end gap-2", children: [_jsx(Button, { variant: "outline", onClick: props.onClose, disabled: props.busy, children: t('rfq.detail.cancelDialog.dismiss') }), _jsxs(Button, { variant: "destructive", onClick: props.onConfirm, disabled: props.busy, children: [_jsx(XCircle, { size: 14, className: "mr-1" }), " ", t('rfq.detail.cancelDialog.confirm')] })] })] }) }));
|
|
215
|
+
}
|
|
216
|
+
function TabBtn(props) {
|
|
217
|
+
return (_jsxs("button", { type: "button", role: "tab", "aria-selected": props.active === props.id, className: cn('b2b-tab', props.active === props.id && 'is-active'), onClick: () => props.onChange(props.id), children: [props.icon, props.label] }));
|
|
218
|
+
}
|
|
219
|
+
/**
|
|
220
|
+
* Resolves a product's current price-list unit price (sale price preferred,
|
|
221
|
+
* else base) via the canonical resolver. Used to prefill the agreed unit price
|
|
222
|
+
* so the operator starts from the price-list value and only edits the
|
|
223
|
+
* negotiated delta. Returns null when no price is published for the product.
|
|
224
|
+
*/
|
|
225
|
+
async function resolvePriceListPrice(productId) {
|
|
226
|
+
try {
|
|
227
|
+
const res = await apiClient.get(`/api/v1/storefront/products/${productId}/resolved-price`);
|
|
228
|
+
const resolved = res.data.resolvedPrice;
|
|
229
|
+
const raw = resolved.salePrice?.amount ?? resolved.basePrice?.amount ?? null;
|
|
230
|
+
if (raw === null)
|
|
231
|
+
return null;
|
|
232
|
+
const n = Number(raw);
|
|
233
|
+
return Number.isFinite(n) ? n : null;
|
|
234
|
+
}
|
|
235
|
+
catch {
|
|
236
|
+
return null;
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
function ModifyCard({ rfq, onSaved, setError, setInfo, focusValidityNonce, }) {
|
|
240
|
+
const t = useTranslation('core');
|
|
241
|
+
const [headerNote, setHeaderNote] = useState(rfq.headerNote ?? '');
|
|
242
|
+
// Blank means "leave the deadline where it is" — that is `expiresInDays`
|
|
243
|
+
// being absent from the PATCH, which is what the contract reads as "do not
|
|
244
|
+
// touch it". It is never prefilled: `expiresInDays` counts from *now*, so
|
|
245
|
+
// any number put here on the operator's behalf would be this screen choosing
|
|
246
|
+
// a date the customer is then held to.
|
|
247
|
+
const [expiresInDays, setExpiresInDays] = useState('');
|
|
248
|
+
const validityInputRef = useRef(null);
|
|
249
|
+
const [lines, setLines] = useState(rfq.items.map((it) => {
|
|
250
|
+
// Open on the request's current state: start the agreed price from the
|
|
251
|
+
// price already defined in the quote request — the agreed price if the
|
|
252
|
+
// operator set one, otherwise the customer's desired price — so the
|
|
253
|
+
// modification is a delta on the existing offer, not a blank slate.
|
|
254
|
+
const definedPrice = it.agreedUnitPrice ?? it.desiredUnitPrice;
|
|
255
|
+
return {
|
|
256
|
+
productId: it.productId,
|
|
257
|
+
quantity: String(it.quantity),
|
|
258
|
+
agreedUnitPrice: definedPrice !== null ? definedPrice.toFixed(2) : '',
|
|
259
|
+
};
|
|
260
|
+
}));
|
|
261
|
+
const [busy, setBusy] = useState(false);
|
|
262
|
+
// Prefill an empty "agreed unit price" with the product's price-list price so
|
|
263
|
+
// the operator starts from the catalogue value and only edits the negotiated
|
|
264
|
+
// delta. Never clobbers a value already present (an existing agreed price, or
|
|
265
|
+
// one the operator just typed).
|
|
266
|
+
const prefillAgreed = useCallback((idx, productId) => {
|
|
267
|
+
void resolvePriceListPrice(productId).then((price) => {
|
|
268
|
+
if (price === null)
|
|
269
|
+
return;
|
|
270
|
+
setLines((prev) => prev.map((l, i) => i === idx && l.productId === productId && l.agreedUnitPrice.trim() === ''
|
|
271
|
+
? { ...l, agreedUnitPrice: price.toFixed(2) }
|
|
272
|
+
: l));
|
|
273
|
+
});
|
|
274
|
+
}, []);
|
|
275
|
+
// On mount, fall back to the catalogue price only for lines where the request
|
|
276
|
+
// itself defines no price (neither agreed nor desired). Lines that already
|
|
277
|
+
// carry a request-defined price keep it as the modification's starting point.
|
|
278
|
+
useEffect(() => {
|
|
279
|
+
rfq.items.forEach((it, idx) => {
|
|
280
|
+
if (it.productId && it.agreedUnitPrice === null && it.desiredUnitPrice === null) {
|
|
281
|
+
prefillAgreed(idx, it.productId);
|
|
282
|
+
}
|
|
283
|
+
});
|
|
284
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
285
|
+
}, []);
|
|
286
|
+
// Land the caret on the deadline field when the operator arrived here from
|
|
287
|
+
// the lapsed banner: the remedy they asked for is the one control they
|
|
288
|
+
// should not have to hunt for in this form (Fitts's Law).
|
|
289
|
+
useEffect(() => {
|
|
290
|
+
if (focusValidityNonce > 0)
|
|
291
|
+
validityInputRef.current?.focus();
|
|
292
|
+
}, [focusValidityNonce]);
|
|
293
|
+
const save = async () => {
|
|
294
|
+
setBusy(true);
|
|
295
|
+
setError(null);
|
|
296
|
+
setInfo(null);
|
|
297
|
+
try {
|
|
298
|
+
const items = lines
|
|
299
|
+
.filter((l) => l.productId.trim().length > 0 && Number(l.quantity) > 0)
|
|
300
|
+
.map((l) => ({
|
|
301
|
+
productId: l.productId.trim(),
|
|
302
|
+
quantity: Number(l.quantity),
|
|
303
|
+
...(l.agreedUnitPrice.trim().length > 0
|
|
304
|
+
? { agreedUnitPrice: Number(l.agreedUnitPrice) }
|
|
305
|
+
: {}),
|
|
306
|
+
}));
|
|
307
|
+
if (items.length === 0) {
|
|
308
|
+
setError(t('rfq.detail.modify.error.atLeastOneLine'));
|
|
309
|
+
setBusy(false);
|
|
310
|
+
return;
|
|
311
|
+
}
|
|
312
|
+
// A deadline the contract would refuse is refused here rather than
|
|
313
|
+
// dropped from the payload: an operator who typed a number and got no
|
|
314
|
+
// deadline would have been told nothing.
|
|
315
|
+
const typedDays = expiresInDays.trim();
|
|
316
|
+
if (isValidityDaysInvalid(typedDays, new Date())) {
|
|
317
|
+
setError(t('rfq.detail.validity.error.days'));
|
|
318
|
+
setBusy(false);
|
|
319
|
+
validityInputRef.current?.focus();
|
|
320
|
+
return;
|
|
321
|
+
}
|
|
322
|
+
await apiClient.patch(`/api/v1/admin/quote-requests/${rfq.id}`, {
|
|
323
|
+
headerNote: headerNote.trim().length > 0 ? headerNote.trim() : null,
|
|
324
|
+
items,
|
|
325
|
+
// Absent means "leave the deadline as it is" — the same shape
|
|
326
|
+
// `RfqCreatePage` sends, and what `adminPatchQuoteRequestSchema`
|
|
327
|
+
// reads as untouched.
|
|
328
|
+
...(typedDays !== '' ? { expiresInDays: Number(typedDays) } : {}),
|
|
329
|
+
}, { headers: { 'If-Match': `"${rfq.version}"` } });
|
|
330
|
+
setInfo(t('rfq.detail.modify.info.saved'));
|
|
331
|
+
await onSaved();
|
|
332
|
+
}
|
|
333
|
+
catch (err) {
|
|
334
|
+
setError(err instanceof ApiError ? err.envelope.error.message : t('rfq.detail.modify.error.save'));
|
|
335
|
+
}
|
|
336
|
+
finally {
|
|
337
|
+
setBusy(false);
|
|
338
|
+
}
|
|
339
|
+
};
|
|
340
|
+
const updateLine = (idx, patch) => {
|
|
341
|
+
setLines((prev) => prev.map((l, i) => (i === idx ? { ...l, ...patch } : l)));
|
|
342
|
+
};
|
|
343
|
+
// Reference data from the current revision: the customer's desired unit price
|
|
344
|
+
// and the line currency, keyed by product so each modify row can show a price
|
|
345
|
+
// even before an agreed price is typed.
|
|
346
|
+
const originalByProduct = new Map(rfq.items.map((it) => [it.productId, it]));
|
|
347
|
+
const currency = rfq.items[0]?.lineCurrency ?? 'PLN';
|
|
348
|
+
const fmt = (n) => `${n.toLocaleString('pl-PL', { minimumFractionDigits: 2 })} ${currency}`;
|
|
349
|
+
// A plain grid (not <Table>, which wraps in an overflow-auto container that
|
|
350
|
+
// would clip the product dropdown) so the picker's options overlay outside
|
|
351
|
+
// the row instead of being trapped inside it. The fixed-width columns only
|
|
352
|
+
// engage at md+ (where the header is visible); on narrower widths the row
|
|
353
|
+
// stacks so the trailing actions column can't overflow and break the layout.
|
|
354
|
+
const gridCols = 'md:grid-cols-[minmax(200px,1fr)_96px_140px_130px_140px_auto]';
|
|
355
|
+
// The deadline field's answers, all about the same date: what saving would
|
|
356
|
+
// set, or — while the field is blank — what leaving it blank keeps. "Blank"
|
|
357
|
+
// and "no deadline" are two of those answers and must not read as one.
|
|
358
|
+
const now = new Date();
|
|
359
|
+
const currentValidity = rfqValidity(rfq.expiresAt, now);
|
|
360
|
+
const typedDays = expiresInDays.trim();
|
|
361
|
+
const previewDeadline = deadlineForDays(expiresInDays, now);
|
|
362
|
+
const daysInvalid = isValidityDaysInvalid(expiresInDays, now);
|
|
363
|
+
const validityHelp = daysInvalid
|
|
364
|
+
? t('rfq.detail.validity.error.days')
|
|
365
|
+
: previewDeadline !== null
|
|
366
|
+
? t(Number(typedDays) === 0
|
|
367
|
+
? 'rfq.detail.validity.help.previewImmediate'
|
|
368
|
+
: 'rfq.detail.validity.help.preview', { date: formatDateTime(previewDeadline.toISOString()) })
|
|
369
|
+
: currentValidity.kind === 'none'
|
|
370
|
+
? t('rfq.detail.validity.help.keepNone')
|
|
371
|
+
: t(currentValidity.kind === 'active'
|
|
372
|
+
? 'rfq.detail.validity.help.keepActive'
|
|
373
|
+
: 'rfq.detail.validity.help.keepLapsed', { date: formatDateTime(currentValidity.expiresAt) });
|
|
374
|
+
return (_jsx(Section, { title: t('rfq.detail.modify.title'), children: _jsxs("div", { className: "space-y-3", children: [_jsxs("div", { className: "space-y-2", children: [_jsx(Label, { htmlFor: "modify-note", children: t('rfq.detail.modify.headerNote') }), _jsx(Textarea, { id: "modify-note", value: headerNote, onChange: (e) => setHeaderNote(e.target.value), rows: 2 })] }), _jsxs("div", { className: "space-y-1.5", children: [_jsxs(Label, { htmlFor: "modify-expires-in-days", className: "flex items-center gap-1.5", children: [_jsx(CalendarClock, { className: "size-3.5 opacity-70", "aria-hidden": "true" }), t('rfq.detail.validity.field')] }), _jsx(Input, { id: "modify-expires-in-days", ref: validityInputRef, type: "number", min: 0, step: 1, inputMode: "numeric", className: "w-40 tabular-nums", value: expiresInDays, placeholder: t('rfq.detail.validity.placeholder'), "aria-describedby": "modify-expires-in-days-help", "aria-invalid": daysInvalid || undefined, onChange: (e) => setExpiresInDays(e.target.value) }), _jsx("p", { id: "modify-expires-in-days-help", className: cn('text-xs', daysInvalid ? 'text-destructive' : 'text-muted-foreground'), children: validityHelp })] }), _jsxs("div", { className: "space-y-2", children: [_jsxs("div", { className: cn('hidden gap-3 px-1 text-xs font-medium text-muted-foreground md:grid', gridCols), children: [_jsx("span", { children: t('rfq.detail.modify.productId') }), _jsx("span", { children: t('rfq.detail.modify.quantity') }), _jsx("span", { children: t('rfq.detail.modify.agreedUnitPrice') }), _jsx("span", { children: t('rfq.detail.modify.desiredPrice') }), _jsx("span", { children: t('rfq.detail.modify.lineTotal') }), _jsx("span", {})] }), lines.map((l, i) => {
|
|
375
|
+
const orig = l.productId ? originalByProduct.get(l.productId) : undefined;
|
|
376
|
+
const desired = orig?.desiredUnitPrice ?? null;
|
|
377
|
+
const qtyNum = Number(l.quantity);
|
|
378
|
+
const agreedNum = Number(l.agreedUnitPrice);
|
|
379
|
+
const lineTotal = l.agreedUnitPrice.trim().length > 0 && Number.isFinite(agreedNum) && qtyNum > 0
|
|
380
|
+
? agreedNum * qtyNum
|
|
381
|
+
: desired !== null && qtyNum > 0
|
|
382
|
+
? desired * qtyNum
|
|
383
|
+
: null;
|
|
384
|
+
return (_jsxs("div", { className: cn('grid grid-cols-1 items-center gap-3', gridCols), children: [_jsx(ProductPicker, { mode: "select", value: l.productId || null, onChange: (v) => {
|
|
385
|
+
// Switching products invalidates any prior agreed price; clear
|
|
386
|
+
// it and let the price-list value prefill for the new product.
|
|
387
|
+
updateLine(i, { productId: v ?? '', agreedUnitPrice: '' });
|
|
388
|
+
if (v)
|
|
389
|
+
prefillAgreed(i, v);
|
|
390
|
+
} }), _jsx(Input, { type: "number", min: 1, "aria-label": t('rfq.detail.modify.quantity'), value: l.quantity, onChange: (e) => updateLine(i, { quantity: e.target.value }), className: "tabular-nums" }), _jsx(Input, { type: "number", step: "0.01", min: 0, "aria-label": t('rfq.detail.modify.agreedUnitPrice'), value: l.agreedUnitPrice, onChange: (e) => updateLine(i, { agreedUnitPrice: e.target.value }), className: "tabular-nums" }), _jsx("span", { className: "self-center text-sm tabular-nums text-muted-foreground", children: desired !== null ? fmt(desired) : '—' }), _jsx("span", { className: "self-center text-sm font-medium tabular-nums", children: lineTotal !== null ? fmt(lineTotal) : '—' }), _jsx(Button, { variant: "ghost", size: "sm", onClick: () => setLines((prev) => prev.filter((_, j) => j !== i)), children: t('rfq.detail.modify.remove') })] }, i));
|
|
391
|
+
})] }), _jsx("div", { className: "flex gap-2", children: _jsx(Button, { variant: "outline", size: "sm", onClick: () => setLines((prev) => [...prev, { productId: '', quantity: '1', agreedUnitPrice: '' }]), children: t('rfq.detail.modify.addLine') }) }), _jsx("div", { children: _jsx(Button, { onClick: () => void save(), disabled: busy, children: t('rfq.detail.modify.saveRevision') }) })] }) }));
|
|
392
|
+
}
|
|
393
|
+
/**
|
|
394
|
+
* The registry loads a route component through a dynamic-import factory and
|
|
395
|
+
* reads its default export (feature 091, FR-013). The named export stays: it is
|
|
396
|
+
* the spelling this module's own code and its tests use.
|
|
397
|
+
*/
|
|
398
|
+
export default RfqDetail;
|
|
399
|
+
//# sourceMappingURL=RfqDetail.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RfqDetail.js","sourceRoot":"","sources":["../../../src/admin/pages/RfqDetail.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { type ReactNode } from 'react';
|
|
2
|
+
export declare function RfqList(): ReactNode;
|
|
3
|
+
/**
|
|
4
|
+
* The registry loads a route component through a dynamic-import factory and
|
|
5
|
+
* reads its default export (feature 091, FR-013). The named export stays: it is
|
|
6
|
+
* the spelling this module's own code and its tests use.
|
|
7
|
+
*/
|
|
8
|
+
export default RfqList;
|
|
9
|
+
//# sourceMappingURL=RfqList.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RfqList.d.ts","sourceRoot":"","sources":["../../../src/admin/pages/RfqList.tsx"],"names":[],"mappings":"AAAA,OAAO,EAA6C,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AA2FlF,wBAAgB,OAAO,IAAI,SAAS,CA2WnC;AAED;;;;GAIG;AACH,eAAe,OAAO,CAAC"}
|