feat(tyres): резину можно выдавать поштучно — 1, 2, 3 или 4 покрышки

Задача 4684. Выбор был 2/4/5 и не покрывал самый частый несезонный случай:
порезали боковину, поймали грыжу — в замену уходит одно-два колеса, а не
комплект. Теперь 1-4.

Подпись кнопки перестала врать: «Выдать комплект» осталась только для четырёх,
на меньшем количестве — «Выдать 1 покрышку» / «Выдать 2 покрышки».

Вариант «5» (комплект с запаской) убран: задача перечисляет 1-4, а выдач за
время жизни раздела не было ни одной — защищать нечего. Вернуть — одна строка.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
2026-08-14 12:24:44 +10:00
co-authored by Claude Opus 5
parent 2a58c5ca94
commit 771558a551
@@ -51,6 +51,13 @@ function daysOn(iso: string): number {
return Number.isNaN(d) ? 0 : Math.max(0, Math.round((Date.now() - d) / 86_400_000)); return Number.isNaN(d) ? 0 : Math.max(0, Math.round((Date.now() - d) / 86_400_000));
} }
/** Подпись кнопки выдачи. «Комплект» — только когда колёс действительно четыре:
* с тех пор как выдавать можно поштучно, на одной покрышке эта подпись врала. */
function issueLabel(qty: number): string {
if (qty === 4) return "Выдать комплект";
return `Выдать ${qty} ${qty === 1 ? "покрышку" : "покрышки"}`;
}
export default function TyresPage() { export default function TyresPage() {
const navigate = useNavigate(); const navigate = useNavigate();
const [sp, setSp] = useSearchParams(); const [sp, setSp] = useSearchParams();
@@ -230,7 +237,7 @@ function IssueForm({ carId, onDone }: { carId: number; onDone: () => void }) {
toast.success(`Выдано ${qty} шт · ${ctx.car_number ?? ""}`.trim()); toast.success(`Выдано ${qty} шт · ${ctx.car_number ?? ""}`.trim());
onDone(); onDone();
} catch (e) { } catch (e) {
toast.error(await apiErrorText(e, "Не удалось выдать комплект")); toast.error(await apiErrorText(e, "Не удалось выдать резину"));
setSaving(false); setSaving(false);
} }
}; };
@@ -344,8 +351,11 @@ function IssueForm({ carId, onDone }: { carId: number; onDone: () => void }) {
{/* Количество и состояние */} {/* Количество и состояние */}
<section className="p-3 border-b"> <section className="p-3 border-b">
<p className="text-sm mb-1">Сколько покрышек</p> <p className="text-sm mb-1">Сколько покрышек</p>
{/* Поштучно, а не только комплектом: в переобувку часто уходит одно-два
колеса — порезали боковину, поймали грыжу. Раньше выбор был 2/4/5 и
под такой случай не подходил (задача 4684). */}
<div className="flex gap-2"> <div className="flex gap-2">
{[2, 4, 5].map((n) => ( {[1, 2, 3, 4].map((n) => (
<Button <Button
key={n} key={n}
variant={qty === n ? "default" : "outline"} variant={qty === n ? "default" : "outline"}
@@ -370,7 +380,11 @@ function IssueForm({ carId, onDone }: { carId: number; onDone: () => void }) {
{/* Кнопка выдачи */} {/* Кнопка выдачи */}
<div className="fixed bottom-0 left-0 right-0 border-t bg-background p-3"> <div className="fixed bottom-0 left-0 right-0 border-t bg-background p-3">
<Button className="w-full" disabled={saving || needClose || partId === null} onClick={submit}> <Button className="w-full" disabled={saving || needClose || partId === null} onClick={submit}>
{saving ? "Выдаём…" : needClose ? "Сначала закройте предыдущий комплект" : "Выдать комплект"} {saving
? "Выдаём…"
: needClose
? "Сначала закройте предыдущий комплект"
: issueLabel(qty)}
</Button> </Button>
</div> </div>
</main> </main>