Admin Franchise — UI-гейтинг по permissions

Контракты и спеки

Инфраструктура (уже есть из BR 1.4.3)

  • usePermission(key) hook
  • <RequirePermission keys={[...]}> компонент
  • PermissionContext с массивом permissions[]

Задача — применить инфраструктуру ко всем разделам и страницам.


Чеклист задач

Каркас

  • Layout.tsx — sidebar gating: каждый пункт обернуть в usePermission. Группы (Каталог, Склад, Сотрудники, Заказы) — показывать если хотя бы один подпункт виден. Дашборд всегда видно. Franchise owner bypass
  • App.tsx — обернуть маршруты в <PermissionRoute> компонент
  • Новый components/PermissionRoute.tsx — проверяет permission через usePermission, рендерит children или <NoAccessPage />
  • Новый pages/NoAccessPage.tsx — «У вас нет доступа к этому разделу» + иконка замка + кнопка «На главную» (→ /)
  • api/client.ts — 403 response interceptor → toast «У вас нет прав на это действие»
  • LoginPage.tsx или PermissionContext — POS-only блокировка: после /auth/me проверить permissions, если нет ни одного backoffice *.read → модалка «У вашей роли нет доступа к бэк-офису» + кнопка «Выйти»

Торговые точки

  • StoresListPage — кнопка «Добавить» через usePermission("stores.edit")
  • StoreViewPage — кнопки «Редактировать», «Удалить», «Опубликовать/Снять» через usePermission("stores.edit")
  • StoreCreatePage, StoreEditPage — route guard stores.edit

Каталог: товары

  • ProductsListPage — кнопка «Добавить товар» через usePermission("menu.edit")
  • ProductViewPage — кнопки «Редактировать», «Удалить» через usePermission("menu.edit")
  • ProductCreatePage, ProductEditPage — route guard menu.edit

Каталог: категории

  • CategoriesPage — кнопка «Добавить», drag-n-drop через usePermission("menu.edit")

Каталог: модификаторы

  • ModifiersListPage — кнопка «Добавить» через usePermission("menu.edit")
  • ModifierViewPage — кнопки «Редактировать», «Удалить» через usePermission("menu.edit")
  • ModifierCreatePage, ModifierEditPage — route guard menu.edit

Каталог: прейскуранты

  • PriceListsPage — кнопка «Добавить» через usePermission("price_list.edit")
  • PriceListDetailPage — кнопка «Редактировать» через usePermission("price_list.edit")

Каталог: ингредиенты

  • IngredientsListPage — кнопка «Добавить» через usePermission("ingredients.edit")
  • IngredientViewPage — кнопка «Редактировать» через usePermission("ingredients.edit")
  • IngredientCreatePage, IngredientEditPage — route guard ingredients.edit

Каталог: стоп-листы

  • StopListPage — toggle on/off через usePermission("stoplists.edit")

Склад

  • InventoryPage — read-only если нет warehouse.edit
  • ReceiptActListPage — кнопка «Добавить акт» через usePermission("warehouse.edit")
  • ReceiptActDetailPage — кнопки действий через usePermission("warehouse.edit")
  • WriteOffActListPage — кнопка «Добавить акт» через usePermission("warehouse.edit")
  • WriteOffActDetailPage — кнопки действий через usePermission("warehouse.edit")

Сотрудники

  • EmployeesListPage — кнопка «Добавить», меню действий через usePermission("employees.edit") (частично уже сделано)
  • EmployeeViewPage — кнопки «Редактировать», «Деактивировать/Реактивировать» через usePermission("employees.edit")
  • EmployeeCreatePage, EmployeeEditPage — route guard employees.edit

Роли

  • RolesListPage — кнопка «Добавить», «Удалить» через usePermission("roles.edit")
  • RoleViewPage — кнопки «Редактировать», «Удалить» через usePermission("roles.edit")
  • RoleCreatePage, RoleEditPage — route guard roles.edit

Расписание

  • SchedulePage — кнопка «Добавить смену» через usePermission("schedule.edit")

Зарплата

  • PayrollFormulasPage — кнопки «Добавить», «Редактировать» через usePermission("payroll.edit")
  • PayrollPage — кнопки «Рассчитать», «Подтвердить», «Отметить выплаченной» через usePermission("payroll.edit")

Заказы

  • ActiveOrdersPage — кнопки действий через usePermission("orders.edit")
  • OrderHistoryPage — read-only если нет orders.edit

Юридические лица

  • LegalEntitiesListPage — кнопка «Добавить» через usePermission("legal_entities.edit")
  • LegalEntityViewPage — кнопки «Редактировать», «Удалить» через usePermission("legal_entities.edit")
  • LegalEntityCreatePage, LegalEntityEditPage — route guard legal_entities.edit

Ссылки