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:
@@ -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>
|
||||||
|
|||||||
Reference in New Issue
Block a user