WFDASH-WEBAPP/src/lib/repair-document-stage.ts
Dave d8e8714720 feat(stock): update pricing logic and transform script for fasteners
- Enhanced `nss-fasteners-pb-import.json` to compute `selling_price` as `cost_price * (1 + 80%)` and included `markup` in the records.
- Updated `nss-fasteners-pb-transform.ts` to allow configurable CSV and output file names via environment variables, improving flexibility for different product runs.
- Added support for uploading photos in the repair detail page, including validation for file types and sizes, and implemented a dialog for creating customer quotes linked to repairs.
- Introduced a new `customer_quote` field in the `Repair` type to link generated quotes back to their respective repairs.

These changes streamline the pricing process and enhance the user experience in managing repairs and quotes.
2026-09-21 12:32:44 +02:00

78 lines
2.6 KiB
TypeScript

/**
* Stage colours for the repair Documents flow.
*
* Visual contract:
* - "pending" : red — operator hasn't produced this artefact yet
* - "in_progress" : amber — produced / received, awaiting next step
* - "done" : emerald — final stage of this flow, complete
* - "skipped" : muted — superseded / replaced (e.g. a re-quoted
* customer quote); still rendered but de-emphasised
*
* Each stage has:
* - label — short human label rendered in the row badge
* - tone — tailwind semantic colour bucket used to derive classes
* - stripe — left-edge stripe colour (the row's "stage colour")
* - dot — small filled circle colour (used inside the badge)
* - badge — badge background + text colour pair
* - dim — row background tint (very subtle; lets the stripe
* do most of the visual lifting)
*
* The class strings are kept as constants so we never have to
* dynamically build Tailwind class names (Tailwind's JIT needs the
* full string in source for it to be in the generated CSS).
*/
export type DocumentStageTone =
| "pending"
| "in_progress"
| "done"
| "skipped";
export interface DocumentStageStyle {
label: string;
/** Tone bucket — drives the other fields. */
tone: DocumentStageTone;
/** Tailwind class for the left-edge stripe. */
stripeClass: string;
/** Tailwind class for the small filled circle inside the badge. */
dotClass: string;
/** Tailwind classes for the badge background + text. */
badgeClass: string;
/** Tailwind class for the very-subtle row background tint. */
tintClass: string;
}
const STYLE: Record<DocumentStageTone, Omit<DocumentStageStyle, "tone">> = {
pending: {
label: "Not started",
stripeClass: "bg-red-500",
dotClass: "bg-red-500",
badgeClass: "bg-red-100 text-red-700 ring-red-600/20",
tintClass: "bg-red-50/40",
},
in_progress: {
label: "In progress",
stripeClass: "bg-amber-500",
dotClass: "bg-amber-500",
badgeClass: "bg-amber-100 text-amber-800 ring-amber-600/20",
tintClass: "bg-amber-50/40",
},
done: {
label: "Done",
stripeClass: "bg-emerald-500",
dotClass: "bg-emerald-500",
badgeClass: "bg-emerald-100 text-emerald-800 ring-emerald-600/20",
tintClass: "bg-emerald-50/40",
},
skipped: {
label: "Replaced",
stripeClass: "bg-zinc-300",
dotClass: "bg-zinc-400",
badgeClass: "bg-zinc-100 text-zinc-600 ring-zinc-500/20",
tintClass: "bg-zinc-50/40",
},
};
export function documentStageStyle(tone: DocumentStageTone): DocumentStageStyle {
return { tone, ...STYLE[tone] };
}