diff --git a/mechanic-pwa/frontend/src/App.tsx b/mechanic-pwa/frontend/src/App.tsx index 1c75fc9..50eb33b 100644 --- a/mechanic-pwa/frontend/src/App.tsx +++ b/mechanic-pwa/frontend/src/App.tsx @@ -44,6 +44,22 @@ function RequireAdmin({ children }: { children: React.ReactNode }) { return <>{children}; } +/** + * Выдача резины — по складскому праву (warehouse:tyres в /me), не только + * админам. Приёмка и инвентаризация остаются под RequireAdmin. + */ +function RequireTyres({ children }: { children: React.ReactNode }) { + const token = useAuth((s) => s.token); + const meQuery = useQuery({ queryKey: ["me"], queryFn: getMe, staleTime: 60_000, enabled: !!token }); + if (!token) return ; + if (meQuery.isLoading) return null; + const me = meQuery.data; + if (!me?.is_admin && !me?.permissions?.includes("warehouse:tyres")) { + return ; + } + return <>{children}; +} + export default function App() { // У35: фоновая сверка прав механика раз в 5 минут — выкидывает на /login // с сообщением «Доступ отозван», если админ снял can_login_pwa или вывел @@ -72,10 +88,10 @@ export default function App() { } /> } /> } /> - {/* Сезонная выдача резины — тот же круг, что приёмка и инвентаризация. */} - } /> - } /> - } /> + {/* Сезонная выдача резины — по складскому праву (не только админам). */} + } /> + } /> + } /> } /> ); diff --git a/mechanic-pwa/frontend/src/pages/ActionMenu.tsx b/mechanic-pwa/frontend/src/pages/ActionMenu.tsx index efe6519..788b63f 100644 --- a/mechanic-pwa/frontend/src/pages/ActionMenu.tsx +++ b/mechanic-pwa/frontend/src/pages/ActionMenu.tsx @@ -34,7 +34,7 @@ export default function ActionMenu() { emoji: "🔧", onClick: () => navigate("/repairs"), }, - // Складские разделы правят остатки и деньги — пока только админам + // Приёмка и инвентаризация правят остатки и деньги — пока только админам // (тот же гейт стоит на сервере, здесь просто не показываем лишнего). ...(meQuery.data?.is_admin ? [ @@ -52,6 +52,12 @@ export default function ActionMenu() { emoji: "📋", onClick: () => navigate("/wh/stocktake"), }, + ] + : []), + // Выдача резины — по складскому праву (не только админам): признак + // warehouse:tyres приходит в /me, если у механика есть право склада. + ...(meQuery.data?.is_admin || meQuery.data?.permissions?.includes("warehouse:tyres") + ? [ { key: "tyres", title: "Выдача резины",