feat(frontend): add React UI — procurement office, wizard, suppliers, inventory panel (dash port), role-based login

This commit is contained in:
ali_mohaghegh
2026-08-25 19:08:15 +03:30
parent 170aed66ea
commit 4e105c5cd5
103 changed files with 16352 additions and 0 deletions
+52
View File
@@ -0,0 +1,52 @@
// ============================================================
// ثابت‌های سراسری
// ============================================================
import { normalize } from "./normalize";
export interface Topic {
key: string;
name: string;
icon: string;
}
// ۸ تاپیک ثابت — HVAC و لوله‌کشی ادغام شدند؛ ابزار و تجهیزات ساخت اضافه شد
export const TOPICS: Topic[] = [
{ key: "hvac-plumb", name: "تاسیسات مکانیکی و آبی", icon: "/icons/topic-1.png" },
{ key: "electric", name: "تجهیزات و لوازم برقی", icon: "/icons/topic-2.png" },
{ key: "door-win", name: "درب، پنجره و شیشه", icon: "/icons/topic-3.png" },
{ key: "metal", name: "فلزات و مقاطع فولادی", icon: "/icons/topic-4.png" },
{ key: "build-mat", name: "مصالح ساختمانی", icon: "/icons/topic-6.png" },
{ key: "chem", name: "مواد شیمیایی ساختمانی", icon: "/icons/topic-7.png" },
{ key: "finish", name: "نازک‌کاری و دکوراسیون داخلی", icon: "/icons/topic-8.png" },
{ key: "tools", name: "ابزار و تجهیزات ساخت", icon: "/icons/topic-9.png" },
];
function topicEq(a: string, b: string): boolean {
return normalize(a) === normalize(b);
}
// یافتن تاپیک بر اساس نام (نرمال‌شده)
export function topicByName(name: string | null | undefined): Topic | null {
if (!name) return null;
return TOPICS.find((t) => topicEq(t.name, name)) || null;
}
export const STATUS_LABEL: Record<string, string> = {
offered: "پیشنهاد شده",
accepted: "پذیرفته شده",
arrived: "رسیده",
rejected: "رد شده",
expired: "منقضی شده",
};
export const STATUS_ORDER = ["offered", "accepted", "arrived"];
// در ویرایش، وضعیت فقط می‌تواند به مراحل قبلی برگردد
export function statusOptionsFor(current: string): string[] {
const idx = STATUS_ORDER.indexOf(current);
return idx < 0 ? STATUS_ORDER : STATUS_ORDER.slice(0, idx + 1);
}
// واحدهای شناخته‌شده از بک‌اند خوانده می‌شوند — این لیست حذف شد
// (واحدها فقط در دیتابیس تعریف می‌شوند و واحد جدید هنگام تایپ ساخته می‌شود)