diff --git a/src/components/admin/UserDirectoryPanel.jsx b/src/components/admin/UserDirectoryPanel.jsx index 7661027..b5c7bbd 100644 --- a/src/components/admin/UserDirectoryPanel.jsx +++ b/src/components/admin/UserDirectoryPanel.jsx @@ -8,7 +8,7 @@ import { Panel } from "../UI/Panel"; const getUsers = (users) => (Array.isArray(users) && users.length ? users : demoUsers); export const UserDirectoryPanel = ({ currentUser, users }) => { - if (currentUser.role !== "admin") { + if (currentUser.role !== "admin" && currentUser.role !== "mega_admin") { return (

Пользователи и роли

diff --git a/src/components/admin/UserManagementPanel.jsx b/src/components/admin/UserManagementPanel.jsx index 3beb5cf..fe951d5 100644 --- a/src/components/admin/UserManagementPanel.jsx +++ b/src/components/admin/UserManagementPanel.jsx @@ -63,7 +63,7 @@ export default function UserManagementPanel() { const fetchUsers = useCallback(async () => { setLoading(true); setError(null); - const { data, error: err } = await client + const { data, error: err } = await supabase .from('users') .select('id, email, name, role_id, created_at, last_login, roles(name)') .order('created_at', { ascending: false }); @@ -123,7 +123,7 @@ export default function UserManagementPanel() { const roleId = getRoleId(newRoleName); if (!roleId) return; try { - const { error: err } = await (supabase || client) + const { error: err } = await supabase .from('users') .update({ role_id: roleId }) .eq('id', userId); @@ -137,7 +137,7 @@ export default function UserManagementPanel() { const handleDeleteUser = async (userId) => { try { - const { error: err } = await (supabase || client).from('users').delete().eq('id', userId); + const { error: err } = await supabase.from('users').delete().eq('id', userId); if (err) throw err; if (supabase) await supabase.auth.admin.deleteUser(userId); setDeleteConfirmId(null); diff --git a/src/components/notifications/NotificationSettings.jsx b/src/components/notifications/NotificationSettings.jsx index c12b605..2d8b367 100644 --- a/src/components/notifications/NotificationSettings.jsx +++ b/src/components/notifications/NotificationSettings.jsx @@ -5,12 +5,12 @@ import { Panel } from "../UI/Panel"; import { Bell, Settings } from "../UI/Icons"; const ALL_NOTIF_TYPES = [ - { key: "order_status_change", label: "Изменение статуса", description: "Статус заказа или доставки изменился", roles: ["manager", "logistician", "driver", "admin"] }, + { key: "order_status_change", label: "Изменение статуса", description: "Статус заказа или доставки изменился", roles: ["manager", "logistician", "driver", "admin", "mega_admin"] }, { key: "driver_assigned", label: "Назначение на заказ", description: "Вам назначили заказ или доставку", roles: ["driver"] }, { key: "driver_unassigned", label: "Снятие с заказа", description: "Вас сняли с заказа или доставки", roles: ["driver"] }, - { key: "delivery_problem", label: "Проблемы и отмены", description: "Отмена, проблема, невозможность дозвониться", roles: ["manager", "logistician", "admin"] }, - { key: "new_order", label: "Новый заказ", description: "Создан новый заказ в системе", roles: ["manager", "logistician", "admin"] }, - { key: "group_status_change", label: "Изменение группы доставки", description: "Статус группы доставки обновлён", roles: ["logistician", "manager", "admin"] }, + { key: "delivery_problem", label: "Проблемы и отмены", description: "Отмена, проблема, невозможность дозвониться", roles: ["manager", "logistician", "admin", "mega_admin"] }, + { key: "new_order", label: "Новый заказ", description: "Создан новый заказ в системе", roles: ["manager", "logistician", "admin", "mega_admin"] }, + { key: "group_status_change", label: "Изменение группы доставки", description: "Статус группы доставки обновлён", roles: ["logistician", "manager", "admin", "mega_admin"] }, ]; export function NotificationSettings({ userId, userRole, onBack }) { diff --git a/src/components/orders/OrderEditorPanel.jsx b/src/components/orders/OrderEditorPanel.jsx index e3b29fa..125d88e 100644 --- a/src/components/orders/OrderEditorPanel.jsx +++ b/src/components/orders/OrderEditorPanel.jsx @@ -6,7 +6,7 @@ import { Panel } from "../UI/Panel"; import { Select } from "../UI/Select"; const getUsers = (users) => (Array.isArray(users) && users.length ? users : demoUsers); -const getManagerOptions = (users) => getUsers(users).filter((user) => user.role === "manager" || user.role === "admin"); +const getManagerOptions = (users) => getUsers(users).filter((user) => user.role === "manager" || user.role === "admin" || user.role === "mega_admin"); const initialForm = { orderNumber: "", customerName: "", @@ -31,7 +31,7 @@ export const OrderEditorPanel = ({ }) => { const [form, setForm] = React.useState(initialForm); const [isCreateMode, setIsCreateMode] = React.useState(createOnly); - const canManageOrders = currentUser.role === "manager" || currentUser.role === "admin"; + const canManageOrders = currentUser.role === "manager" || currentUser.role === "admin" || currentUser.role === "mega_admin"; const managerOptions = getManagerOptions(users); React.useEffect(() => { diff --git a/src/services/orderService.js b/src/services/orderService.js index 0598fb9..80135d6 100644 --- a/src/services/orderService.js +++ b/src/services/orderService.js @@ -66,7 +66,7 @@ export const filterOrdersByView = ({ orders, currentUser, filters, now }) => { return false; } - if (currentUser.role === "manager" || currentUser.role === "admin") { + if (currentUser.role === "manager" || currentUser.role === "admin" || currentUser.role === "mega_admin") { return true; } diff --git a/src/utils/roleHelpers.js b/src/utils/roleHelpers.js new file mode 100644 index 0000000..ba8aeed --- /dev/null +++ b/src/utils/roleHelpers.js @@ -0,0 +1,16 @@ +/** + * Role helpers for SuperSam. + * mega_admin inherits all admin permissions. + */ + +/** Roles that have admin-level access (mega_admin is a superset of admin) */ +export const ADMIN_ROLES = ['admin', 'mega_admin']; + +/** Check if the given role has admin-level access */ +export const isAdminRole = (role) => ADMIN_ROLES.includes(role); + +/** Roles that can manage orders */ +export const ORDER_MANAGER_ROLES = ['manager', 'logistician', 'admin', 'mega_admin']; + +/** Check if the role can manage orders */ +export const canManageOrders = (role) => ORDER_MANAGER_ROLES.includes(role); \ No newline at end of file