import React, { useState, useEffect, useMemo } from 'react'; import { UserCog, Plug, DatabaseBackup, Upload, Shield, ShieldCheck, Trash2, Building2, Bot, Users, Briefcase } from 'lucide-react'; import { allowedSubsForSection } from '../constants/permissions'; import { UsersSection } from './admin/UsersSection'; import { IntegrationsSection } from './admin/IntegrationsSection'; import { AISection } from './admin/AISection'; import { BackupsSection } from './admin/BackupsSection'; import { DataImportSection } from './admin/DataImportSection'; import { DataCleanupSection } from './admin/DataCleanupSection'; import { PermissionsSection } from './admin/PermissionsSection'; import { SecuritySection } from './admin/SecuritySection'; import { CompanySection } from './admin/CompanySection'; import { ResponsibilityZonesSection } from './admin/ResponsibilityZonesSection'; import { PositionsSection } from './admin/PositionsSection'; export type AdminSectionId = 'users' | 'permissions' | 'integrations' | 'ai' | 'company' | 'positions' | 'responsibility-zones' | 'backups' | 'data-import' | 'data-cleanup' | 'security'; const ADMIN_SECTIONS: Array<{ id: AdminSectionId; label: string; icon: React.ComponentType<{ className?: string }>; component: React.ComponentType; }> = [ { id: 'users', label: 'Пользователи', icon: UserCog, component: UsersSection }, { id: 'permissions', label: 'Права и шаблоны', icon: Shield, component: PermissionsSection }, { id: 'integrations', label: 'Интеграции', icon: Plug, component: IntegrationsSection }, { id: 'ai', label: 'ИИ', icon: Bot, component: AISection }, { id: 'company', label: 'О компании', icon: Building2, component: CompanySection }, { id: 'positions', label: 'Должности', icon: Briefcase, component: PositionsSection }, { id: 'responsibility-zones', label: 'Зоны ответственности', icon: Users, component: ResponsibilityZonesSection }, { id: 'backups', label: 'Резервные копии', icon: DatabaseBackup, component: BackupsSection }, { id: 'data-import', label: 'Загрузка данных', icon: Upload, component: DataImportSection }, { id: 'data-cleanup', label: 'Очистка данных', icon: Trash2, component: DataCleanupSection }, { id: 'security', label: 'Безопасность', icon: ShieldCheck, component: SecuritySection }, ]; const ADMIN_SUBTAB_KEY = 'mkd_subTab_admin'; export type AdminModuleProps = { allowedPermissions?: string[] | null; }; export const AdminModule: React.FC = ({ allowedPermissions }) => { const visibleSectionIds = useMemo(() => { const allowed = allowedSubsForSection(allowedPermissions ?? [], 'admin'); return allowed === 'all' ? ADMIN_SECTIONS.map((s) => s.id) : allowed; }, [allowedPermissions]); const visibleSections = useMemo( () => ADMIN_SECTIONS.filter((s) => visibleSectionIds.includes(s.id)), [visibleSectionIds] ); const [activeSection, setActiveSection] = useState(() => { const s = localStorage.getItem(ADMIN_SUBTAB_KEY); const id = s as AdminSectionId; const allowed = allowedSubsForSection(allowedPermissions ?? [], 'admin'); const ids = allowed === 'all' ? ADMIN_SECTIONS.map((x) => x.id) : allowed; if (id && ids.includes(id)) return id; return (ids[0] as AdminSectionId) ?? 'users'; }); useEffect(() => { if (!visibleSectionIds.includes(activeSection)) { setActiveSection((visibleSectionIds[0] as AdminSectionId) ?? 'users'); } }, [visibleSectionIds, activeSection]); useEffect(() => { localStorage.setItem(ADMIN_SUBTAB_KEY, activeSection); }, [activeSection]); const ActiveComponent = ADMIN_SECTIONS.find((s) => s.id === activeSection)?.component ?? UsersSection; if (visibleSections.length === 0) { return (

Нет доступа к разделам панели управления.

); } return (

Панель управления

Пользователи, интеграции, данные компании, резервные копии и безопасность

{visibleSections.map((section) => ( ))}
); };