From 205078c5ce2d4fc588b3a4ff9626899d93b752f0 Mon Sep 17 00:00:00 2001 From: vladtechno Date: Mon, 25 May 2026 21:29:26 +1000 Subject: [PATCH] =?UTF-8?q?fix(pwa/repairs):=20drop=20duplicate=20mileage?= =?UTF-8?q?=20input=20under=20=C2=AB=D0=97=D0=B0=D0=BC=D0=B5=D0=BD=D0=B0?= =?UTF-8?q?=20=D0=BC=D0=B0=D1=81=D0=BB=D0=B0=C2=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit При создании/редактировании ремонта в форме был отдельный «Пробег на момент замены» внутри блока замены масла — auto-sync от шапочного с soft-dirty флагом по У24. На практике это всё равно заставляло механика вводить значение дважды, если шапочный пробег вводился вручную (StarLine недоступен): момент включения галочки случался после ручного ввода, soft-sync не успевал отработать или механик не понимал что поле автозаполнилось. Упростили: единственный пробег — «Пробег (км)» в шапке формы. На submit он же подставляется в oil_change.mileage_at_change. Поле «Следующая через» оставили — это интервал, а не значение пробега. Бэкенд не трогаем — схема та же (mileage_at_change всё ещё в payload). --- .../src/pages/repairs/CreateRepairPage.tsx | 32 +++------------ .../src/pages/repairs/EditRepairPage.tsx | 40 ++++++------------- 2 files changed, 18 insertions(+), 54 deletions(-) diff --git a/mechanic-pwa/frontend/src/pages/repairs/CreateRepairPage.tsx b/mechanic-pwa/frontend/src/pages/repairs/CreateRepairPage.tsx index e7e881a..c08aeeb 100644 --- a/mechanic-pwa/frontend/src/pages/repairs/CreateRepairPage.tsx +++ b/mechanic-pwa/frontend/src/pages/repairs/CreateRepairPage.tsx @@ -67,8 +67,6 @@ interface PartRow { interface OilChangeState { enabled: boolean; - mileage_at_change: number | null; - mileage_is_dirty: boolean; // У24: мягкая подписка с шапочным next_in_km: number; sticker: PhotoState | null; } @@ -107,8 +105,6 @@ export default function CreateRepairPage() { const [parts, setParts] = useState([]); const [oilChange, setOilChange] = useState({ enabled: false, - mileage_at_change: null, - mileage_is_dirty: false, next_in_km: 10000, sticker: null, }); @@ -130,13 +126,9 @@ export default function CreateRepairPage() { .catch((e) => setCtxError((e as Error).message || "Не удалось загрузить машину")); }, [carId]); - // У24: мягкая подписка пробега блока масла на шапочный. - useEffect(() => { - if (oilChange.enabled && !oilChange.mileage_is_dirty) { - setOilChange((oc) => ({ ...oc, mileage_at_change: mileage })); - } - // eslint-disable-next-line react-hooks/exhaustive-deps - }, [mileage, oilChange.enabled]); + // У24 упрощено: пробег ввода в форме теперь один — главный «Пробег (км)» + // в шапке. На submit подставляется и в oil_change.mileage_at_change, чтобы + // не заставлять механика вводить одно и то же дважды. // ── Photo upload ───────────────────────────────────────────────────────── @@ -325,7 +317,8 @@ export default function CreateRepairPage() { oil_change: oilChange.enabled ? { enabled: true, - mileage_at_change: oilChange.mileage_at_change, + // Один источник истины — главный пробег ремонта (см. У24). + mileage_at_change: mileage, next_in_km: oilChange.next_in_km, sticker_photo_uuid: oilChange.sticker?.status === "uploaded" @@ -625,21 +618,6 @@ export default function CreateRepairPage() { {oilChange.enabled && (
-
- - - setOilChange((oc) => ({ - ...oc, - mileage_at_change: e.target.value === "" ? null : Number(e.target.value), - mileage_is_dirty: true, - })) - } - /> -
(null); const [works, setWorks] = useState([]); const [parts, setParts] = useState([]); - const [oil, setOil] = useState({ enabled: false, mileage_at_change: null, next_in_km: null }); + const [oil, setOil] = useState({ enabled: false, next_in_km: null }); const [worksPicker, setWorksPicker] = useState<{ open: boolean; q: string; results: MechWork[] }>( { open: false, q: "", results: [] } @@ -89,7 +88,6 @@ export default function EditRepairPage() { if (d.oil_change) { setOil({ enabled: true, - mileage_at_change: d.oil_change.mileage_at_change, next_in_km: d.oil_change.next_in_km, }); } @@ -174,7 +172,8 @@ export default function EditRepairPage() { qty: p.qty, })), oil_change: oil.enabled - ? { enabled: true, mileage_at_change: oil.mileage_at_change, next_in_km: oil.next_in_km } + // Один источник истины — главный пробег ремонта. + ? { enabled: true, mileage_at_change: mileage, next_in_km: oil.next_in_km } : { enabled: false, mileage_at_change: null, next_in_km: null }, }); navigate(`/repairs/${detail.id}`, { replace: true }); @@ -343,29 +342,16 @@ export default function EditRepairPage() { Замена масла {oil.enabled && ( -
-
- - setOil((o) => ({ - ...o, mileage_at_change: e.target.value === "" ? null : Number(e.target.value), - }))} - /> -
-
- - setOil((o) => ({ - ...o, next_in_km: e.target.value === "" ? null : Number(e.target.value), - }))} - /> -
+
+ + setOil((o) => ({ + ...o, next_in_km: e.target.value === "" ? null : Number(e.target.value), + }))} + />
)}