import React, { useState, useRef, useEffect } from 'react'; import { useDemoStore } from '../../mock/store'; import { CAPABILITIES_LIST } from '../../core/capabilities/types'; import { BUSINESS_PROFILES } from '../../core/profiles/profiles'; import { SYSTEM_ROLES, SystemRoleId } from '../../core/permissions/types'; import { Badge } from '../../shared/components/Badge'; import { MaturityBadge } from '../../shared/ui/MaturityBadge'; import { Button } from '../../shared/components/Button'; import { useToast } from '../../shared/ui/useToast'; import { exportDatabaseSnapshot, importDatabaseSnapshot, resetDatabase, DatabaseSnapshot, } from '../../services/storage/indexedDb'; import { Sliders, Shield, Building, RefreshCw, Database, Download, Upload, RotateCcw } from 'lucide-react'; export const SettingsModule: React.FC = () => { const { currentProfileId, setProfileId, currentRoleId, setRoleId, customCapabilities, toggleCapability, resetCapabilitiesToProfile, } = useDemoStore(); const { showToast } = useToast(); const [isResetting, setIsResetting] = useState(false); const [isExporting, setIsExporting] = useState(false); const [isImporting, setIsImporting] = useState(false); const [snapshotStats, setSnapshotStats] = useState(null); const fileInputRef = useRef(null); useEffect(() => { if (typeof window !== 'undefined') { (window as unknown as { __krona_db?: unknown }).__krona_db = { exportDatabaseSnapshot, importDatabaseSnapshot, resetDatabase, }; } }, []); const handleExportSnapshot = async () => { try { setIsExporting(true); const snapshot = await exportDatabaseSnapshot(); const jsonStr = JSON.stringify(snapshot, null, 2); const blob = new Blob([jsonStr], { type: 'application/json' }); const url = URL.createObjectURL(blob); const a = document.createElement('a'); a.href = url; a.download = `krona_db_snapshot_${Date.now()}.json`; document.body.appendChild(a); a.click(); document.body.removeChild(a); URL.revokeObjectURL(url); const totalRecords = snapshot.metadata?.totalRecords ?? Object.values(snapshot.stores).reduce( (acc: number, curr) => acc + (Array.isArray(curr) ? curr.length : 0), 0 ); setSnapshotStats(`Экспортировано ${totalRecords} записей (v${snapshot.version})`); showToast('Снимок базы данных успешно экспортирован!', 'success'); } catch (err) { showToast(`Ошибка экспорта: ${err instanceof Error ? err.message : String(err)}`, 'error'); } finally { setIsExporting(false); } }; const handleResetDatabase = async () => { try { setIsResetting(true); await resetDatabase(); setSnapshotStats('База данных сброшена к начальному состоянию'); showToast('База данных успешно сброшена к начальному состоянию!', 'info'); } catch (err) { showToast(`Ошибка сброса: ${err instanceof Error ? err.message : String(err)}`, 'error'); } finally { setIsResetting(false); } }; const handleImportFile = async (e: React.ChangeEvent) => { const file = e.target.files?.[0]; if (!file) return; try { setIsImporting(true); const text = await file.text(); const parsed = JSON.parse(text) as DatabaseSnapshot; if (!parsed.version || !parsed.stores) { throw new Error('Некорректный формат файла снимка'); } await importDatabaseSnapshot(parsed); const totalRecords = parsed.metadata?.totalRecords ?? Object.values(parsed.stores).reduce( (acc: number, curr) => acc + (Array.isArray(curr) ? curr.length : 0), 0 ); setSnapshotStats(`Импортировано ${totalRecords} записей`); showToast('Снимок базы данных успешно импортирован!', 'success'); } catch (err) { showToast(`Ошибка импорта: ${err instanceof Error ? err.message : String(err)}`, 'error'); } finally { setIsImporting(false); if (fileInputRef.current) fileInputRef.current.value = ''; } }; return (
{/* Header */}

Krona Configuration Center & Capability Studio

Управление архитектурой экосистемы, переключение бизнес-профилей и тонкая настройка Capabilities

{/* Configuration Engine / Entity Catalog Feature Banner */}

Configuration Engine: Сущности и Конструкторы

Phase C Central

Управление 39+ типами полей, визуальный редактор форм, карточек, фильтров и кастомных модулей.

Открыть каталог сущностей →
{/* 1. Business Profile Selector */}

Активный бизнес-профиль

{Object.values(BUSINESS_PROFILES).map((p) => ( ))}
{/* 2. Capability Engine Studio (Live interactive toggles for all 21 capabilities!) */}

Capability Engine (21 системная возможность платформы)

Тумблеры мгновенно перестраивают меню, разделы и табы
{CAPABILITIES_LIST.map((cap) => { const isEnabled = customCapabilities[cap.id]; return (
toggleCapability(cap.id)} className={`p-3 rounded-lg border cursor-pointer select-none transition-all flex items-center justify-between gap-2 ${ isEnabled ? 'border-krona-green/60 bg-krona-green/5' : 'border-krona-border bg-krona-workspace opacity-60' }`} >
{cap.name}
{cap.description}
); })}
{/* 3. Role & RBAC selector */}

Матрица прав и ролей (RBAC)

{Object.values(SYSTEM_ROLES).map((role) => ( ))}
{/* 4. IndexedDB Snapshots & State Management */}

Управление снимками и базой данных (IndexedDB)

{snapshotStats && ( {snapshotStats} )}

Экспорт полного слепка данных (сделки, заказы, кастомные сущности, финансы, остатки) в JSON, сброс к дефолтному демо-состоянию и мгновенное восстановление из файла.

); };