feat(rbac): full permission catalog in the custom-role matrix UI (fa/en/ar)
CI/CD / CI · API (dotnet build + test) (push) Successful in 42s
CI/CD / CI · Admin API (dotnet build) (push) Successful in 30s
CI/CD / CI · Dashboard (tsc) (push) Successful in 1m7s
CI/CD / CI · Admin Web (tsc) (push) Successful in 37s
CI/CD / CI · Website (tsc) (push) Successful in 45s
CI/CD / CI · Koja (tsc) (push) Successful in 49s
CI/CD / Deploy · all services (push) Successful in 3m24s

Mirrors the expanded backend catalog on the client: the Permission type and the
custom-role permission matrix now expose all ~80 capabilities grouped into 16
sections (admin, branches, menu, inventory, taxes, staff, tables, orders,
register, queue/kitchen, delivery, customers, coupons, marketing, reports,
expenses), each with fa/en/ar labels. Nav visibility now maps each page to its
View permission; taxes & branches become permission-driven (managers can view),
leaving billing as the sole hard owner-only nav gate.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
soroush.asadi
2026-06-21 05:49:11 +03:30
parent 7a5ea75b50
commit 53d90fa357
6 changed files with 471 additions and 113 deletions
+97 -25
View File
@@ -1256,34 +1256,106 @@
"saveError": "فشل حفظ الدور", "saveError": "فشل حفظ الدور",
"deleteConfirm": "حذف الدور «{name}»؟ سيعود الموظفون إلى صلاحيات دورهم الأساسي.", "deleteConfirm": "حذف الدور «{name}»؟ سيعود الموظفون إلى صلاحيات دورهم الأساسي.",
"groupAdmin": "إدارة المقهى", "groupAdmin": "إدارة المقهى",
"groupMenu": "القائمة والمخزون", "groupBranches": "الفروع",
"groupStaff": "الموظفون", "groupMenu": "القائمة",
"groupCustomer": "العملاء والطاولات", "groupInventory": "المخزون",
"groupTaxes": "الضرائب",
"groupStaff": "الموظفون والموارد البشرية",
"groupTables": "الطاولات والحجوزات",
"groupOrders": "الطلبات ونقطة البيع",
"groupRegister": "الصندوق والنقد",
"groupQueueKitchen": "الانتظار والمطبخ",
"groupDelivery": "التوصيل",
"groupCustomers": "العملاء",
"groupCoupons": "الكوبونات",
"groupMarketing": "التسويق والتقييمات",
"groupReports": "التقارير والمالية", "groupReports": "التقارير والمالية",
"groupOps": "عمليات الصندوق", "groupExpenses": "المصروفات",
"groupKitchen": "المطبخ والتوصيل",
"perm": { "perm": {
"ManageCafeSettings": "إعدادات المقهى", "ViewCafeSettings": "عرض إعدادات المقهى",
"ManageBilling": "الاشتراك والفواتير", "ManageCafeSettings": "تعديل إعدادات المقهى",
"ManageBranches": "إدارة الفروع", "ManageDiscoverProfile": "الملف العام و«كوجا»",
"ManageMenu": "إدارة القائمة", "ViewBilling": "عرض الفواتير",
"ManageInventory": "المخزون", "ManageBilling": "إدارة الاشتراك والفواتير",
"ManageTaxes": "الضرائب", "ManageRoles": "إدارة الأدوار",
"ManagePrintSettings": "إعدادات الطباعة", "ViewPrintSettings": "عرض إعدادات الطباعة",
"ManageStaff": "إدارة الموظفين", "ManagePrintSettings": "تعديل إعدادات الطباعة",
"ManageSalaries": "الرواتب", "ViewBranches": "عرض الفروع",
"ReviewLeave": "طلبات الإجازة", "CreateBranch": "إنشاء فرع",
"ManageReservations": "الحجوزات", "EditBranch": "تعديل فرع",
"ManageTables": "الطاولات", "DeleteBranch": "حذف فرع",
"ManageCoupons": "الكوبونات", "ViewMenu": "عرض القائمة",
"ViewReports": "التقارير", "CreateMenuItem": "إضافة أصناف",
"ManageExpenses": "المصروفات", "EditMenuItem": "تعديل الأصناف",
"ProcessOrders": "معالجة الطلبات", "DeleteMenuItem": "حذف الأصناف",
"HandlePayments": "المدفوعات", "ViewInventory": "عرض المخزون",
"OperateRegister": "الصندوق", "CreateInventory": "إضافة للمخزون",
"ManageQueue": "قائمة الانتظار", "EditInventory": "تعديل المخزون والكميات",
"DeleteInventory": "حذف من المخزون",
"ViewTaxes": "عرض الضرائب",
"CreateTax": "إنشاء ضريبة",
"EditTax": "تعديل ضريبة",
"DeleteTax": "حذف ضريبة",
"ViewStaff": "عرض الموظفين",
"CreateStaff": "إضافة موظف",
"EditStaff": "تعديل موظف",
"DeleteStaff": "حذف موظف",
"ManageStaff": "تعيين أدوار الفروع",
"ManageStaffCredentials": "إدارة بيانات الدخول",
"ViewAttendance": "عرض الحضور",
"ManageAttendance": "إدارة الحضور",
"ViewSchedules": "عرض المناوبات",
"ManageSchedules": "إدارة المناوبات",
"ViewLeave": "عرض طلبات الإجازة",
"ReviewLeave": "اعتماد الإجازات",
"ViewSalaries": "عرض الرواتب",
"ManageSalaries": "إدارة الرواتب",
"ViewTables": "عرض الطاولات",
"ManageTables": "إدارة الطاولات والأقسام",
"ViewReservations": "عرض الحجوزات",
"CreateReservation": "إنشاء حجز",
"EditReservation": "تعديل حجز",
"DeleteReservation": "حذف حجز",
"ViewOrders": "عرض الطلبات",
"ProcessOrders": "تسجيل الطلبات",
"EditOrder": "تعديل الطلبات",
"VoidOrder": "إبطال / إلغاء الطلبات",
"RefundOrder": "استرداد الطلبات",
"ApplyDiscount": "تطبيق الخصومات",
"CompOrder": "طلب مجاني (ضيافة)",
"HandlePayments": "استلام المدفوعات",
"UpdateOrderStatus": "تحديث حالة الطلب",
"OperateRegister": "فتح / إغلاق الصندوق",
"OpenCashDrawer": "فتح درج النقود (بدون بيع)",
"ViewQueue": "عرض قائمة الانتظار",
"ManageQueue": "إدارة قائمة الانتظار",
"ViewKitchen": "شاشة المطبخ", "ViewKitchen": "شاشة المطبخ",
"HandleDelivery": "التوصيل" "ManageKitchenStations": "إدارة محطات المطبخ",
"ViewDelivery": "عرض التوصيل",
"HandleDelivery": "إدارة التوصيل",
"AssignDelivery": "تعيين السائق",
"ViewCustomers": "عرض العملاء",
"CreateCustomer": "إضافة عميل",
"EditCustomer": "تعديل عميل",
"DeleteCustomer": "حذف عميل",
"ViewCoupons": "عرض الكوبونات",
"CreateCoupon": "إنشاء كوبون",
"EditCoupon": "تعديل كوبون",
"DeleteCoupon": "حذف كوبون",
"ViewSms": "عرض الرسائل",
"SendSms": "إرسال حملات الرسائل",
"ManageSmsSettings": "إعدادات الرسائل",
"ViewReviews": "عرض التقييمات",
"ManageReviews": "الرد على التقييمات وإدارتها",
"ViewReports": "عرض التقارير",
"ExportReports": "تصدير التقارير",
"ViewAuditLog": "عرض سجل العمليات",
"ViewFinancials": "عرض المالية (الأرباح والخسائر)",
"ManageFinancials": "تصحيح سندات الدفع",
"ViewExpenses": "عرض المصروفات",
"CreateExpense": "إضافة مصروف",
"EditExpense": "تعديل مصروف",
"DeleteExpense": "حذف مصروف"
} }
}, },
"appearance": { "appearance": {
+97 -25
View File
@@ -1328,34 +1328,106 @@
"saveError": "Failed to save role", "saveError": "Failed to save role",
"deleteConfirm": "Delete role '{name}'? Employees will revert to their base role permissions.", "deleteConfirm": "Delete role '{name}'? Employees will revert to their base role permissions.",
"groupAdmin": "Café Administration", "groupAdmin": "Café Administration",
"groupMenu": "Menu & Inventory", "groupBranches": "Branches",
"groupStaff": "Staff", "groupMenu": "Menu",
"groupCustomer": "Customer & Tables", "groupInventory": "Inventory",
"groupTaxes": "Taxes",
"groupStaff": "Staff & HR",
"groupTables": "Tables & Reservations",
"groupOrders": "Orders & POS",
"groupRegister": "Register & Cash",
"groupQueueKitchen": "Queue & Kitchen",
"groupDelivery": "Delivery",
"groupCustomers": "Customers",
"groupCoupons": "Coupons",
"groupMarketing": "Marketing & Reviews",
"groupReports": "Reports & Finance", "groupReports": "Reports & Finance",
"groupOps": "Register Operations", "groupExpenses": "Expenses",
"groupKitchen": "Kitchen & Delivery",
"perm": { "perm": {
"ManageCafeSettings": "Café settings", "ViewCafeSettings": "View café settings",
"ManageBilling": "Billing & subscription", "ManageCafeSettings": "Edit café settings",
"ManageBranches": "Manage branches", "ManageDiscoverProfile": "Discover & public profile",
"ManageMenu": "Menu management", "ViewBilling": "View billing",
"ManageInventory": "Inventory", "ManageBilling": "Manage billing & subscription",
"ManageTaxes": "Taxes", "ManageRoles": "Manage roles",
"ManagePrintSettings": "Print settings", "ViewPrintSettings": "View print settings",
"ManageStaff": "Staff management", "ManagePrintSettings": "Edit print settings",
"ManageSalaries": "Salaries", "ViewBranches": "View branches",
"ReviewLeave": "Leave requests", "CreateBranch": "Create branch",
"ManageReservations": "Reservations", "EditBranch": "Edit branch",
"ManageTables": "Tables", "DeleteBranch": "Delete branch",
"ManageCoupons": "Coupons", "ViewMenu": "View menu",
"ViewReports": "Reports", "CreateMenuItem": "Add menu items",
"ManageExpenses": "Expenses", "EditMenuItem": "Edit menu items",
"ProcessOrders": "Process orders", "DeleteMenuItem": "Delete menu items",
"HandlePayments": "Handle payments", "ViewInventory": "View inventory",
"OperateRegister": "Register", "CreateInventory": "Add inventory",
"ManageQueue": "Queue", "EditInventory": "Edit inventory & stock",
"DeleteInventory": "Delete inventory",
"ViewTaxes": "View taxes",
"CreateTax": "Create tax",
"EditTax": "Edit tax",
"DeleteTax": "Delete tax",
"ViewStaff": "View staff",
"CreateStaff": "Add staff",
"EditStaff": "Edit staff",
"DeleteStaff": "Remove staff",
"ManageStaff": "Assign branch roles",
"ManageStaffCredentials": "Manage login credentials",
"ViewAttendance": "View attendance",
"ManageAttendance": "Manage attendance",
"ViewSchedules": "View schedules",
"ManageSchedules": "Manage schedules",
"ViewLeave": "View leave requests",
"ReviewLeave": "Approve leave requests",
"ViewSalaries": "View salaries",
"ManageSalaries": "Manage salaries",
"ViewTables": "View tables",
"ManageTables": "Manage tables & sections",
"ViewReservations": "View reservations",
"CreateReservation": "Create reservation",
"EditReservation": "Edit reservation",
"DeleteReservation": "Delete reservation",
"ViewOrders": "View orders",
"ProcessOrders": "Take orders",
"EditOrder": "Edit orders",
"VoidOrder": "Void / cancel orders",
"RefundOrder": "Refund orders",
"ApplyDiscount": "Apply discounts",
"CompOrder": "Comp (free) orders",
"HandlePayments": "Take payments",
"UpdateOrderStatus": "Update order status",
"OperateRegister": "Open / close register",
"OpenCashDrawer": "Open cash drawer (no-sale)",
"ViewQueue": "View queue",
"ManageQueue": "Manage queue",
"ViewKitchen": "Kitchen display", "ViewKitchen": "Kitchen display",
"HandleDelivery": "Delivery" "ManageKitchenStations": "Manage kitchen stations",
"ViewDelivery": "View delivery",
"HandleDelivery": "Handle delivery",
"AssignDelivery": "Assign delivery",
"ViewCustomers": "View customers",
"CreateCustomer": "Add customers",
"EditCustomer": "Edit customers",
"DeleteCustomer": "Delete customers",
"ViewCoupons": "View coupons",
"CreateCoupon": "Create coupon",
"EditCoupon": "Edit coupon",
"DeleteCoupon": "Delete coupon",
"ViewSms": "View SMS",
"SendSms": "Send SMS campaigns",
"ManageSmsSettings": "SMS settings",
"ViewReviews": "View reviews",
"ManageReviews": "Reply & moderate reviews",
"ViewReports": "View reports",
"ExportReports": "Export reports",
"ViewAuditLog": "View audit log",
"ViewFinancials": "View financials (P&L)",
"ManageFinancials": "Payment corrections",
"ViewExpenses": "View expenses",
"CreateExpense": "Add expense",
"EditExpense": "Edit expense",
"DeleteExpense": "Delete expense"
} }
}, },
"appearance": { "appearance": {
+96 -24
View File
@@ -1329,34 +1329,106 @@
"saveError": "ذخیره نقش ناموفق بود", "saveError": "ذخیره نقش ناموفق بود",
"deleteConfirm": "نقش «{name}» حذف شود؟ این کارمندان به دسترسی پیش‌فرض نقش اصلی خود بازمی‌گردند.", "deleteConfirm": "نقش «{name}» حذف شود؟ این کارمندان به دسترسی پیش‌فرض نقش اصلی خود بازمی‌گردند.",
"groupAdmin": "مدیریت کافه", "groupAdmin": "مدیریت کافه",
"groupMenu": "منو و انبار", "groupBranches": "شعب",
"groupStaff": "پرسنل", "groupMenu": "منو",
"groupCustomer": "مشتری و میز", "groupInventory": "انبار و موجودی",
"groupTaxes": "مالیات",
"groupStaff": "پرسنل و منابع انسانی",
"groupTables": "میز و رزرو",
"groupOrders": "سفارش و فروش",
"groupRegister": "صندوق و وجه نقد",
"groupQueueKitchen": "صف و آشپزخانه",
"groupDelivery": "تحویل و پیک",
"groupCustomers": "مشتریان",
"groupCoupons": "کوپن‌ها",
"groupMarketing": "بازاریابی و نظرات",
"groupReports": "گزارش و مالی", "groupReports": "گزارش و مالی",
"groupOps": "عملیات صندوق", "groupExpenses": "هزینه‌ها",
"groupKitchen": "آشپزخانه و تحویل",
"perm": { "perm": {
"ManageCafeSettings": "تنظیمات کافه", "ViewCafeSettings": "مشاهده تنظیمات کافه",
"ManageBilling": "اشتراک و پرداخت", "ManageCafeSettings": "ویرایش تنظیمات کافه",
"ManageBranches": "مدیریت شعب", "ManageDiscoverProfile": "پروفایل عمومی و کوجا",
"ManageMenu": "مدیریت منو", "ViewBilling": "مشاهده صورتحساب",
"ManageInventory": "انبار و موجودی", "ManageBilling": "مدیریت اشتراک و پرداخت",
"ManageTaxes": الیات", "ManageRoles": دیریت نقش‌ها",
"ManagePrintSettings": "تنظیمات چاپ", "ViewPrintSettings": "مشاهده تنظیمات چاپ",
"ManageStaff": "مدیریت کارمندان", "ManagePrintSettings": "ویرایش تنظیمات چاپ",
"ManageSalaries": "حقوق و دستمزد", "ViewBranches": "مشاهده شعب",
"ReviewLeave": "بررسی مرخصی", "CreateBranch": "ایجاد شعبه",
"ManageReservations": "رزروها", "EditBranch": "ویرایش شعبه",
"ManageTables": "میزها", "DeleteBranch": "حذف شعبه",
"ManageCoupons": "کوپن‌ها", "ViewMenu": "مشاهده منو",
"ViewReports": "گزارش‌ها", "CreateMenuItem": "افزودن آیتم منو",
"ManageExpenses": "هزینه‌ها", "EditMenuItem": "ویرایش آیتم منو",
"DeleteMenuItem": "حذف آیتم منو",
"ViewInventory": "مشاهده انبار",
"CreateInventory": "افزودن به انبار",
"EditInventory": "ویرایش انبار و موجودی",
"DeleteInventory": "حذف از انبار",
"ViewTaxes": "مشاهده مالیات",
"CreateTax": "ایجاد مالیات",
"EditTax": "ویرایش مالیات",
"DeleteTax": "حذف مالیات",
"ViewStaff": "مشاهده کارمندان",
"CreateStaff": "افزودن کارمند",
"EditStaff": "ویرایش کارمند",
"DeleteStaff": "حذف کارمند",
"ManageStaff": "تخصیص نقش شعبه",
"ManageStaffCredentials": "مدیریت اطلاعات ورود",
"ViewAttendance": "مشاهده حضور و غیاب",
"ManageAttendance": "مدیریت حضور و غیاب",
"ViewSchedules": "مشاهده شیفت‌ها",
"ManageSchedules": "مدیریت شیفت‌ها",
"ViewLeave": "مشاهده درخواست مرخصی",
"ReviewLeave": "تأیید مرخصی",
"ViewSalaries": "مشاهده حقوق",
"ManageSalaries": "مدیریت حقوق و دستمزد",
"ViewTables": "مشاهده میزها",
"ManageTables": "مدیریت میز و بخش‌ها",
"ViewReservations": "مشاهده رزروها",
"CreateReservation": "ایجاد رزرو",
"EditReservation": "ویرایش رزرو",
"DeleteReservation": "حذف رزرو",
"ViewOrders": "مشاهده سفارش‌ها",
"ProcessOrders": "ثبت سفارش", "ProcessOrders": "ثبت سفارش",
"HandlePayments": "پردازش پرداخت", "EditOrder": "ویرایش سفارش",
"OperateRegister": "صندوق", "VoidOrder": "ابطال / لغو سفارش",
"ManageQueue": "صف انتظار", "RefundOrder": "استرداد وجه سفارش",
"ApplyDiscount": "اعمال تخفیف",
"CompOrder": "سفارش رایگان (مهمان)",
"HandlePayments": "دریافت پرداخت",
"UpdateOrderStatus": "تغییر وضعیت سفارش",
"OperateRegister": "باز / بستن صندوق",
"OpenCashDrawer": "باز کردن کشوی پول (بدون فروش)",
"ViewQueue": "مشاهده صف",
"ManageQueue": "مدیریت صف",
"ViewKitchen": "نمایش آشپزخانه", "ViewKitchen": "نمایش آشپزخانه",
"HandleDelivery": "تحویل و پیک" "ManageKitchenStations": "مدیریت ایستگاه‌های آشپزخانه",
"ViewDelivery": "مشاهده تحویل",
"HandleDelivery": "مدیریت تحویل",
"AssignDelivery": "تخصیص پیک",
"ViewCustomers": "مشاهده مشتریان",
"CreateCustomer": "افزودن مشتری",
"EditCustomer": "ویرایش مشتری",
"DeleteCustomer": "حذف مشتری",
"ViewCoupons": "مشاهده کوپن‌ها",
"CreateCoupon": "ایجاد کوپن",
"EditCoupon": "ویرایش کوپن",
"DeleteCoupon": "حذف کوپن",
"ViewSms": "مشاهده پیامک",
"SendSms": "ارسال کمپین پیامکی",
"ManageSmsSettings": "تنظیمات پیامک",
"ViewReviews": "مشاهده نظرات",
"ManageReviews": "پاسخ و مدیریت نظرات",
"ViewReports": "مشاهده گزارش‌ها",
"ExportReports": "خروجی گرفتن از گزارش",
"ViewAuditLog": "مشاهده گزارش رویدادها",
"ViewFinancials": "مشاهده مالی (سود و زیان)",
"ManageFinancials": "اصلاح سند پرداخت",
"ViewExpenses": "مشاهده هزینه‌ها",
"CreateExpense": "افزودن هزینه",
"EditExpense": "ویرایش هزینه",
"DeleteExpense": "حذف هزینه"
} }
}, },
"appearance": { "appearance": {
@@ -34,31 +34,84 @@ interface PermGroup {
const PERM_GROUPS: PermGroup[] = [ const PERM_GROUPS: PermGroup[] = [
{ {
labelKey: "customRoles.groupAdmin", labelKey: "customRoles.groupAdmin",
perms: ["ManageCafeSettings", "ManageBilling", "ManageBranches"], perms: [
"ViewCafeSettings", "ManageCafeSettings", "ManageDiscoverProfile",
"ViewBilling", "ManageBilling", "ManageRoles",
"ViewPrintSettings", "ManagePrintSettings",
],
},
{
labelKey: "customRoles.groupBranches",
perms: ["ViewBranches", "CreateBranch", "EditBranch", "DeleteBranch"],
}, },
{ {
labelKey: "customRoles.groupMenu", labelKey: "customRoles.groupMenu",
perms: ["ManageMenu", "ManageInventory", "ManageTaxes", "ManagePrintSettings"], perms: ["ViewMenu", "CreateMenuItem", "EditMenuItem", "DeleteMenuItem"],
},
{
labelKey: "customRoles.groupInventory",
perms: ["ViewInventory", "CreateInventory", "EditInventory", "DeleteInventory"],
},
{
labelKey: "customRoles.groupTaxes",
perms: ["ViewTaxes", "CreateTax", "EditTax", "DeleteTax"],
}, },
{ {
labelKey: "customRoles.groupStaff", labelKey: "customRoles.groupStaff",
perms: ["ManageStaff", "ManageSalaries", "ReviewLeave"], perms: [
"ViewStaff", "CreateStaff", "EditStaff", "DeleteStaff",
"ManageStaff", "ManageStaffCredentials",
"ViewAttendance", "ManageAttendance",
"ViewSchedules", "ManageSchedules",
"ViewLeave", "ReviewLeave",
"ViewSalaries", "ManageSalaries",
],
}, },
{ {
labelKey: "customRoles.groupCustomer", labelKey: "customRoles.groupTables",
perms: ["ManageReservations", "ManageTables", "ManageCoupons"], perms: [
"ViewTables", "ManageTables",
"ViewReservations", "CreateReservation", "EditReservation", "DeleteReservation",
],
},
{
labelKey: "customRoles.groupOrders",
perms: [
"ViewOrders", "ProcessOrders", "EditOrder", "VoidOrder", "RefundOrder",
"ApplyDiscount", "CompOrder", "HandlePayments", "UpdateOrderStatus",
],
},
{
labelKey: "customRoles.groupRegister",
perms: ["OperateRegister", "OpenCashDrawer"],
},
{
labelKey: "customRoles.groupQueueKitchen",
perms: ["ViewQueue", "ManageQueue", "ViewKitchen", "ManageKitchenStations"],
},
{
labelKey: "customRoles.groupDelivery",
perms: ["ViewDelivery", "HandleDelivery", "AssignDelivery"],
},
{
labelKey: "customRoles.groupCustomers",
perms: ["ViewCustomers", "CreateCustomer", "EditCustomer", "DeleteCustomer"],
},
{
labelKey: "customRoles.groupCoupons",
perms: ["ViewCoupons", "CreateCoupon", "EditCoupon", "DeleteCoupon"],
},
{
labelKey: "customRoles.groupMarketing",
perms: ["ViewSms", "SendSms", "ManageSmsSettings", "ViewReviews", "ManageReviews"],
}, },
{ {
labelKey: "customRoles.groupReports", labelKey: "customRoles.groupReports",
perms: ["ViewReports", "ManageExpenses"], perms: ["ViewReports", "ExportReports", "ViewAuditLog", "ViewFinancials", "ManageFinancials"],
}, },
{ {
labelKey: "customRoles.groupOps", labelKey: "customRoles.groupExpenses",
perms: ["ProcessOrders", "HandlePayments", "OperateRegister", "ManageQueue"], perms: ["ViewExpenses", "CreateExpense", "EditExpense", "DeleteExpense"],
},
{
labelKey: "customRoles.groupKitchen",
perms: ["ViewKitchen", "HandleDelivery"],
}, },
]; ];
+4 -1
View File
@@ -11,7 +11,10 @@ export function isBranchAccount(branchId: string | null | undefined): boolean {
return !!branchId; return !!branchId;
} }
export const OWNER_ONLY_NAV_KEYS = ["subscription", "taxes", "branches"] as const; // Billing stays a hard owner gate (also covers legacy sessions with no
// permission list). Taxes & branches are now permission-driven via
// NAV_REQUIRED_PERMISSION (ViewTaxes / ViewBranches), which managers hold.
export const OWNER_ONLY_NAV_KEYS = ["subscription"] as const;
export function canSeeNavItem( export function canSeeNavItem(
key: string, key: string,
+112 -26
View File
@@ -5,50 +5,136 @@ import type { NavItemKey } from "@/lib/sidebar-nav";
* Client mirror of the backend `Meezi.Core.Authorization.Permission` enum. The * Client mirror of the backend `Meezi.Core.Authorization.Permission` enum. The
* server (EnsurePermission) remains the single source of truth — these values * server (EnsurePermission) remains the single source of truth — these values
* only drive what the UI *shows* (pages, action buttons). Never rely on them * only drive what the UI *shows* (pages, action buttons). Never rely on them
* for actual security. * for actual security. Keep this list in sync with Permission.cs.
*/ */
export type Permission = export type Permission =
// Café administration
| "ViewCafeSettings"
| "ManageCafeSettings" | "ManageCafeSettings"
| "ManageDiscoverProfile"
| "ViewBilling"
| "ManageBilling" | "ManageBilling"
| "ManageBranches" | "ViewBranches"
| "ManageStaff" | "CreateBranch"
| "ManageMenu" | "EditBranch"
| "ManageInventory" | "DeleteBranch"
| "ManageExpenses" | "ManageRoles"
| "ManageTaxes" | "ViewPrintSettings"
| "ManageCoupons"
| "ManageReservations"
| "ManageTables"
| "ViewReports"
| "ReviewLeave"
| "ManageSalaries"
| "ManagePrintSettings" | "ManagePrintSettings"
// Taxes
| "ViewTaxes"
| "CreateTax"
| "EditTax"
| "DeleteTax"
// Staff & HR
| "ViewStaff"
| "CreateStaff"
| "EditStaff"
| "DeleteStaff"
| "ManageStaff"
| "ManageStaffCredentials"
| "ViewAttendance"
| "ManageAttendance"
| "ViewSchedules"
| "ManageSchedules"
| "ViewLeave"
| "ReviewLeave"
| "ViewSalaries"
| "ManageSalaries"
// Menu
| "ViewMenu"
| "CreateMenuItem"
| "EditMenuItem"
| "DeleteMenuItem"
// Inventory
| "ViewInventory"
| "CreateInventory"
| "EditInventory"
| "DeleteInventory"
// Tables
| "ViewTables"
| "ManageTables"
// Reservations
| "ViewReservations"
| "CreateReservation"
| "EditReservation"
| "DeleteReservation"
// Orders & POS
| "ViewOrders"
| "ProcessOrders" | "ProcessOrders"
| "EditOrder"
| "VoidOrder"
| "RefundOrder"
| "ApplyDiscount"
| "CompOrder"
| "HandlePayments" | "HandlePayments"
| "UpdateOrderStatus"
// Register / cash
| "OperateRegister" | "OperateRegister"
| "OpenCashDrawer"
// Queue
| "ViewQueue"
| "ManageQueue" | "ManageQueue"
// Kitchen
| "ViewKitchen" | "ViewKitchen"
| "HandleDelivery"; | "ManageKitchenStations"
// Delivery
| "ViewDelivery"
| "HandleDelivery"
| "AssignDelivery"
// Customers / CRM
| "ViewCustomers"
| "CreateCustomer"
| "EditCustomer"
| "DeleteCustomer"
// Coupons
| "ViewCoupons"
| "CreateCoupon"
| "EditCoupon"
| "DeleteCoupon"
// SMS / marketing
| "ViewSms"
| "SendSms"
| "ManageSmsSettings"
// Reviews
| "ViewReviews"
| "ManageReviews"
// Reports & finance
| "ViewReports"
| "ExportReports"
| "ViewAuditLog"
| "ViewFinancials"
| "ManageFinancials"
// Expenses
| "ViewExpenses"
| "CreateExpense"
| "EditExpense"
| "DeleteExpense";
/** /**
* Permission a nav page requires to be visible. Pages not listed here fall back * Permission a nav page requires to be visible. Each maps to the page's "View"
* to the existing owner-only / branch-account visibility logic in * capability. Pages not listed fall back to the owner-only / branch-account
* {@link file://./auth-permissions.ts}. * visibility logic in {@link file://./auth-permissions.ts}.
*/ */
export const NAV_REQUIRED_PERMISSION: Partial<Record<NavItemKey, Permission>> = { export const NAV_REQUIRED_PERMISSION: Partial<Record<NavItemKey, Permission>> = {
pos: "ProcessOrders", pos: "ProcessOrders",
tables: "ManageTables", tables: "ViewTables",
queue: "ManageQueue", queue: "ViewQueue",
kds: "ViewKitchen", kds: "ViewKitchen",
reservations: "ManageReservations", reservations: "ViewReservations",
menu: "ManageMenu", menu: "ViewMenu",
inventory: "ManageInventory",
coupons: "ManageCoupons",
reports: "ViewReports", reports: "ViewReports",
expenses: "ManageExpenses", crm: "ViewCustomers",
coupons: "ViewCoupons",
sms: "ViewSms",
reviews: "ViewReviews",
inventory: "ViewInventory",
expenses: "ViewExpenses",
shifts: "OperateRegister", shifts: "OperateRegister",
taxes: "ManageTaxes", taxes: "ViewTaxes",
hr: "ManageStaff", hr: "ViewStaff",
branches: "ViewBranches",
subscription: "ViewBilling",
}; };
/** Read the effective permission set off an auth response (null = legacy session). */ /** Read the effective permission set off an auth response (null = legacy session). */