From 4c03f174484950db945b57224f5a9ab5c7bbf126 Mon Sep 17 00:00:00 2001 From: vladtechno Date: Wed, 20 May 2026 15:35:05 +1000 Subject: [PATCH] =?UTF-8?q?inspection-editor:=20=D0=B1=D0=BB=D0=BE=D0=BA?= =?UTF-8?q?=20=C2=AB=D0=97=D0=B0=D0=BC=D0=B5=D1=82=D0=BA=D0=B8=20=D0=BC?= =?UTF-8?q?=D0=B5=D1=85=D0=B0=D0=BD=D0=B8=D0=BA=D0=B0=C2=BB=20=D0=B2=20?= =?UTF-8?q?=D1=84=D0=BE=D1=80=D0=BC=D0=B5=20=D0=BD=D0=BE=D0=B2=D0=BE=D0=B3?= =?UTF-8?q?=D0=BE/in-progress=20=D0=BE=D1=81=D0=BC=D0=BE=D1=82=D1=80=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Раньше textarea для заметок жил только в InspectionReview (завершённый осмотр). При создании нового планового осмотра (через '/inspections//edit') поля ввода не было — приходилось завершить осмотр, потом открыть карточку и только там вводить. Теперь блок есть в обеих страницах: - InspectionEditor (in_progress): textarea + кнопки Сохранить/Отменить - InspectionEditor (completed): read-only вывод текста - InspectionReview: оставлен прежний редактор как был Бонус: при нажатии «Завершить осмотр» текущий draft заметки коммитится тем же PATCH вместе со status=completed — не теряется если механик ввёл текст и сразу нажал завершение, не сохранив отдельно. --- .../frontend/src/pages/InspectionEditor.tsx | 65 ++++++++++++++++++- 1 file changed, 64 insertions(+), 1 deletion(-) diff --git a/mechanic-pwa/frontend/src/pages/InspectionEditor.tsx b/mechanic-pwa/frontend/src/pages/InspectionEditor.tsx index 04bcb06..fbc9386 100644 --- a/mechanic-pwa/frontend/src/pages/InspectionEditor.tsx +++ b/mechanic-pwa/frontend/src/pages/InspectionEditor.tsx @@ -125,6 +125,10 @@ export default function InspectionEditor() { const [flow, setFlow] = useState({ kind: "idle" }); const [zoneLabels, setZoneLabels] = useState | null>(null); const [tireWearOpen, setTireWearOpen] = useState(false); + // Local draft заметок механика — синхронизируется с ins.notes когда осмотр + // прогружается / обновляется. Кнопка «Сохранить» появляется только когда + // draft отличается от сохранённого (см. notesDirty ниже). + const [notesDraft, setNotesDraft] = useState(""); useEffect(() => { loadZoneLabels().then(setZoneLabels); }, []); @@ -133,8 +137,18 @@ export default function InspectionEditor() { queryFn: () => getInspection(insId), }); + useEffect(() => { + if (ins?.notes !== undefined) setNotesDraft(ins.notes ?? ""); + }, [ins?.notes]); + const finalize = useMutation({ - mutationFn: () => patchInspection(insId, { status: "completed" }), + mutationFn: () => + // При завершении осмотра коммитим текст заметки тем же patch'ем — + // если механик что-то ввёл и сразу нажал «Завершить», не теряем. + patchInspection(insId, { + status: "completed", + notes: (notesDraft ?? "").trim() || undefined, + }), onSuccess: () => { toast.success("Осмотр завершён"); navigate(`/inspections/${insId}`); @@ -142,6 +156,15 @@ export default function InspectionEditor() { onError: () => toast.error("Не удалось завершить"), }); + const notesMutation = useMutation({ + mutationFn: (next: string) => patchInspection(insId, { notes: next }), + onSuccess: (updated) => { + toast.success("Заметка сохранена"); + qc.setQueryData(["inspection", insId], updated); + }, + onError: () => toast.error("Не удалось сохранить заметку"), + }); + const removeMarker = useMutation({ mutationFn: (markerId: number) => deleteMarker(markerId), onSuccess: () => { @@ -445,6 +468,46 @@ export default function InspectionEditor() { )} + +

+ Заметки механика +

+ {editable ? ( + <> +