krona-front/dist/assets/SettingsModule-ClG-ZgbR.js

1 line
No EOL
10 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import{f as e,h as t,i as n,l as r,r as i,s as a,t as o}from"./useToast-CS8pZhce.js";import{a as s,d as c,m as l}from"./indexedDb-D30TbhA6.js";import{t as u}from"./building-BdUpGLM5.js";import{t as d}from"./upload-CY2IsfiN.js";import{F as f,Q as p,_ as m,b as h,ct as g,h as _,lt as v,t as y,x as b}from"./index-CT8iDYYK.js";import{t as x}from"./types-CTcNpN0z.js";var S={name:`database`,size:24,node:[[`ellipse`,{cx:`12`,cy:`5`,rx:`9`,ry:`3`,key:`msslwz`}],[`path`,{d:`M3 5V19A9 3 0 0 0 21 19V5`,key:`1wlel7`}],[`path`,{d:`M3 12A9 3 0 0 0 21 12`,key:`mv7ke4`}]]};S.node;var C=r(S),w=t(e(),1),T=a(),E=()=>{let{currentProfileId:e,setProfileId:t,currentRoleId:r,setRoleId:a,customCapabilities:S,toggleCapability:E,resetCapabilitiesToProfile:D}=g(),{showToast:O}=o(),[k,A]=(0,w.useState)(!1),[j,M]=(0,w.useState)(!1),[N,P]=(0,w.useState)(!1),[F,I]=(0,w.useState)(null),L=(0,w.useRef)(null);return(0,w.useEffect)(()=>{typeof window<`u`&&(window.__krona_db={exportDatabaseSnapshot:s,importDatabaseSnapshot:c,resetDatabase:l})},[]),(0,T.jsxs)(`div`,{className:`space-y-4 animate-fade-in`,children:[(0,T.jsxs)(`div`,{className:`flex flex-col sm:flex-row sm:items-center justify-between gap-3 bg-krona-surface p-3.5 rounded-xl border border-krona-border shadow-krona-soft`,children:[(0,T.jsxs)(`div`,{children:[(0,T.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,T.jsx)(`h2`,{className:`text-sm font-bold text-krona-primary`,children:`Krona Configuration Center & Capability Studio`}),(0,T.jsx)(y,{level:`pilot1`,size:`sm`})]}),(0,T.jsx)(`p`,{className:`text-xs text-krona-secondary`,children:`Управление архитектурой экосистемы, переключение бизнес-профилей и тонкая настройка Capabilities`})]}),(0,T.jsxs)(n,{variant:`secondary`,size:`sm`,onClick:D,children:[(0,T.jsx)(b,{className:`w-3.5 h-3.5 mr-1`}),`Сбросить к дефолту профиля`]})]}),(0,T.jsxs)(`div`,{className:`bg-krona-surface border border-krona-border rounded-xl p-4 shadow-krona-soft flex flex-col sm:flex-row sm:items-center justify-between gap-4`,children:[(0,T.jsxs)(`div`,{className:`flex items-center gap-3`,children:[(0,T.jsx)(`div`,{className:`w-10 h-10 rounded-xl bg-krona-green/10 text-krona-green flex items-center justify-center border border-krona-green/20 shrink-0`,children:(0,T.jsx)(_,{className:`w-5 h-5`})}),(0,T.jsxs)(`div`,{children:[(0,T.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,T.jsx)(`h3`,{className:`text-sm font-bold text-krona-primary`,children:`Configuration Engine: Сущности и Конструкторы`}),(0,T.jsx)(i,{variant:`gold`,size:`sm`,children:`Phase C Central`})]}),(0,T.jsx)(`p`,{className:`text-xs text-krona-secondary`,children:`Управление 39+ типами полей, визуальный редактор форм, карточек, фильтров и кастомных модулей.`})]})]}),(0,T.jsx)(`a`,{href:`/settings/entities`,className:`inline-flex items-center justify-center px-4 py-2 rounded-lg bg-krona-green text-white text-xs font-semibold hover:bg-krona-green/90 transition-colors shrink-0`,children:`Открыть каталог сущностей →`})]}),(0,T.jsxs)(`div`,{className:`bg-krona-surface border border-krona-border rounded-xl p-4 shadow-krona-soft space-y-3`,children:[(0,T.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,T.jsx)(u,{className:`w-4 h-4 text-krona-gold`}),(0,T.jsx)(`h3`,{className:`text-xs font-bold text-krona-primary uppercase tracking-wider`,children:`Активный бизнес-профиль`})]}),(0,T.jsx)(`div`,{className:`grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-2.5`,children:Object.values(v).map(n=>(0,T.jsxs)(`button`,{onClick:()=>t(n.id),className:`p-3 rounded-xl border text-left flex flex-col justify-between transition-all ${n.id===e?`border-krona-gold bg-krona-gold/10 ring-2 ring-krona-gold/30`:`border-krona-border bg-krona-workspace hover:border-krona-border-strong`}`,children:[(0,T.jsxs)(`div`,{children:[(0,T.jsxs)(`div`,{className:`flex items-center justify-between mb-1`,children:[(0,T.jsx)(`span`,{className:`text-xs font-bold text-krona-primary`,children:n.name}),(0,T.jsx)(i,{variant:`neutral`,size:`sm`,children:n.category})]}),(0,T.jsx)(`div`,{className:`text-[11px] text-krona-secondary`,children:n.companyName})]}),(0,T.jsx)(`div`,{className:`text-[10px] text-krona-gold-text font-semibold pt-2`,children:n.id===e?`✓ Активный профиль`:`Выбрать →`})]},n.id))})]}),(0,T.jsxs)(`div`,{className:`bg-krona-surface border border-krona-border rounded-xl p-4 shadow-krona-soft space-y-3`,children:[(0,T.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,T.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,T.jsx)(_,{className:`w-4 h-4 text-krona-green`}),(0,T.jsx)(`h3`,{className:`text-xs font-bold text-krona-primary uppercase tracking-wider`,children:`Capability Engine (21 системная возможность платформы)`})]}),(0,T.jsx)(`span`,{className:`text-xs text-krona-secondary`,children:`Тумблеры мгновенно перестраивают меню, разделы и табы`})]}),(0,T.jsx)(`div`,{className:`grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-2.5`,children:x.map(e=>{let t=S[e.id];return(0,T.jsxs)(`div`,{onClick:()=>E(e.id),className:`p-3 rounded-lg border cursor-pointer select-none transition-all flex items-center justify-between gap-2 ${t?`border-krona-green/60 bg-krona-green/5`:`border-krona-border bg-krona-workspace opacity-60`}`,children:[(0,T.jsxs)(`div`,{className:`min-w-0`,children:[(0,T.jsx)(`div`,{className:`font-bold text-xs text-krona-primary truncate`,children:e.name}),(0,T.jsx)(`div`,{className:`text-[10px] text-krona-secondary truncate`,children:e.description})]}),(0,T.jsx)(`div`,{className:`w-10 h-5 rounded-full p-0.5 transition-colors duration-200 ease-in-out shrink-0 ${t?`bg-krona-green`:`bg-[#D8D5CB] dark:bg-[#3A3D35]`}`,children:(0,T.jsx)(`div`,{className:`w-4 h-4 rounded-full bg-white transition-transform duration-200 ease-in-out shadow-sm ${t?`translate-x-5`:`translate-x-0`}`})})]},e.id)})})]}),(0,T.jsxs)(`div`,{className:`bg-krona-surface border border-krona-border rounded-xl p-4 shadow-krona-soft space-y-3`,children:[(0,T.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,T.jsx)(m,{className:`w-4 h-4 text-krona-info`}),(0,T.jsx)(`h3`,{className:`text-xs font-bold text-krona-primary uppercase tracking-wider`,children:`Матрица прав и ролей (RBAC)`})]}),(0,T.jsx)(`div`,{className:`grid grid-cols-2 sm:grid-cols-3 lg:grid-cols-5 gap-2`,children:Object.values(p).map(e=>(0,T.jsxs)(`button`,{"data-testid":`settings-role-${e.id}`,onClick:()=>a(e.id),className:`p-2.5 rounded-lg border text-left transition-all ${e.id===r?`border-krona-green bg-krona-green/10 text-krona-green-text font-bold`:`border-krona-border bg-krona-workspace text-krona-secondary hover:text-krona-primary`}`,children:[(0,T.jsx)(`div`,{className:`text-xs font-semibold`,children:e.label}),(0,T.jsx)(`div`,{className:`text-[10px] opacity-75`,children:e.badge})]},e.id))})]}),(0,T.jsxs)(`div`,{className:`bg-krona-surface border border-krona-border rounded-xl p-4 shadow-krona-soft space-y-3`,children:[(0,T.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,T.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,T.jsx)(C,{className:`w-4 h-4 text-krona-green`}),(0,T.jsx)(`h3`,{className:`text-xs font-bold text-krona-primary uppercase tracking-wider`,children:`Управление снимками и базой данных (IndexedDB)`})]}),F&&(0,T.jsx)(`span`,{className:`text-xs font-medium text-krona-green`,children:F})]}),(0,T.jsx)(`p`,{className:`text-xs text-krona-secondary`,children:`Экспорт полного слепка данных (сделки, заказы, кастомные сущности, финансы, остатки) в JSON, сброс к дефолтному демо-состоянию и мгновенное восстановление из файла.`}),(0,T.jsxs)(`div`,{className:`flex flex-wrap items-center gap-3 pt-1`,children:[(0,T.jsxs)(n,{variant:`primary`,size:`sm`,"data-testid":`export-snapshot-btn`,onClick:async()=>{try{M(!0);let e=await s(),t=JSON.stringify(e,null,2),n=new Blob([t],{type:`application/json`}),r=URL.createObjectURL(n),i=document.createElement(`a`);i.href=r,i.download=`krona_db_snapshot_${Date.now()}.json`,document.body.appendChild(i),i.click(),document.body.removeChild(i),URL.revokeObjectURL(r);let a=e.metadata?.totalRecords??Object.values(e.stores).reduce((e,t)=>e+(Array.isArray(t)?t.length:0),0);I(`Экспортировано ${a} записей (v${e.version})`),O(`Снимок базы данных успешно экспортирован!`,`success`)}catch(e){O(`Ошибка экспорта: ${e instanceof Error?e.message:String(e)}`,`error`)}finally{M(!1)}},disabled:j,children:[(0,T.jsx)(f,{className:`w-3.5 h-3.5 mr-1.5`}),j?`Экспорт...`:`Экспорт снимка (JSON)`]}),(0,T.jsxs)(n,{variant:`secondary`,size:`sm`,"data-testid":`reset-database-btn`,onClick:async()=>{try{A(!0),await l(),I(`База данных сброшена к начальному состоянию`),O(`База данных успешно сброшена к начальному состоянию!`,`info`)}catch(e){O(`Ошибка сброса: ${e instanceof Error?e.message:String(e)}`,`error`)}finally{A(!1)}},disabled:k,children:[(0,T.jsx)(h,{className:`w-3.5 h-3.5 mr-1.5`}),k?`Сброс...`:`Сбросить демо-данные`]}),(0,T.jsxs)(`div`,{children:[(0,T.jsx)(`input`,{type:`file`,ref:L,"data-testid":`import-snapshot-input`,accept:`.json`,onChange:async e=>{let t=e.target.files?.[0];if(t)try{P(!0);let e=await t.text(),n=JSON.parse(e);if(!n.version||!n.stores)throw Error(`Некорректный формат файла снимка`);await c(n);let r=n.metadata?.totalRecords??Object.values(n.stores).reduce((e,t)=>e+(Array.isArray(t)?t.length:0),0);I(`Импортировано ${r} записей`),O(`Снимок базы данных успешно импортирован!`,`success`)}catch(e){O(`Ошибка импорта: ${e instanceof Error?e.message:String(e)}`,`error`)}finally{P(!1),L.current&&(L.current.value=``)}},className:`hidden`}),(0,T.jsxs)(n,{variant:`outline`,size:`sm`,"data-testid":`import-snapshot-btn`,onClick:()=>L.current?.click(),disabled:N,children:[(0,T.jsx)(d,{className:`w-3.5 h-3.5 mr-1.5`}),N?`Импорт...`:`Импортировать снимок`]})]})]})]})]})};export{E as SettingsModule};