1 line
No EOL
25 KiB
JavaScript
1 line
No EOL
25 KiB
JavaScript
import{c as e,f as t,h as n,i as r,l as i,r as a,s as o,t as s}from"./useToast-CS8pZhce.js";import{s as c}from"./indexedDb-D30TbhA6.js";import{t as l}from"./arrow-down-CWbiHuZO.js";import{t as u}from"./arrow-up-down--M136cK3.js";import{t as d}from"./arrow-up-B4Ca-HNG.js";import{i as f,n as p,r as m,t as h}from"./types-DMl_5q2N.js";import{n as g,r as _,t as v}from"./DynamicFormRenderer-u2RREFCE.js";import{t as y}from"./eye-CkF1gwUX.js";import{t as b}from"./file-text-DR21jZDS.js";import{t as x}from"./mail-DOD5KO1v.js";import{t as S}from"./panels-top-left-BomsDlf9.js";import{t as C}from"./pen-D8SS70u3.js";import{t as w}from"./phone-DpnQw4if.js";import{t as T}from"./star-B6hvSjuv.js";import{t as E}from"./table-_fqSCPRE.js";import{A as D,F as O,L as k,R as A,W as j,a as M,ct as N,et as P,ft as F,h as I,j as L,k as R,n as ee,ot as z,p as B,pt as V,r as H,st as U,u as W,w as G,y as K}from"./index-CNnq9VO5.js";import{t as q}from"./currency-DdDs82F5.js";var J={name:`copy`,size:24,node:[[`rect`,{width:`14`,height:`14`,x:`8`,y:`8`,rx:`2`,ry:`2`,key:`17jyea`}],[`path`,{d:`M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2`,key:`zix9uf`}]]};J.node;var Y=i(J),X={name:`inbox`,size:24,node:[[`polyline`,{points:`22 12 16 12 14 15 10 15 8 12 2 12`,key:`o97t9d`}],[`path`,{d:`M5.45 5.11 2 12v6a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2v-6l-3.45-6.89A2 2 0 0 0 16.76 4H7.24a2 2 0 0 0-1.79 1.11z`,key:`oot6mr`}]]};X.node;var te=i(X),Z=n(t(),1),Q=o(),ne=({entity:e,records:t,view:n,isLoading:i=!1,onRowClick:o,onEdit:s,onDelete:c,onCreateNew:f})=>{let[p,m]=(0,Z.useState)(``),[h,g]=(0,Z.useState)(n?.sortBy||`updatedAt`),[v,b]=(0,Z.useState)(n?.sortOrder||`desc`),[x,S]=(0,Z.useState)(1),w=(0,Z.useMemo)(()=>{let t=new Map;return e.fields.forEach(e=>t.set(e.key,e)),t},[e]),T=(0,Z.useMemo)(()=>n?.visibleFieldKeys&&n.visibleFieldKeys.length>0?n.visibleFieldKeys.map(e=>w.get(e)).filter(e=>!!e):e.fields.filter(e=>!e.hidden).slice(0,6),[n,w,e]),E=e=>{h===e?b(e=>e===`asc`?`desc`:`asc`):(g(e),b(`asc`))},D=(0,Z.useMemo)(()=>{let e=[...t];if(p.trim()){let t=p.toLowerCase().trim();e=e.filter(e=>Object.values(e).some(e=>typeof e==`string`?e.toLowerCase().includes(t):typeof e==`number`&&String(e).includes(t)))}return h&&e.sort((e,t)=>{let n=e[h],r=t[h];if(n===r)return 0;if(n==null)return 1;if(r==null)return-1;let i=n>r?1:-1;return v===`desc`?-i:i}),e},[t,p,h,v]),O=Math.ceil(D.length/15)||1,k=(0,Z.useMemo)(()=>{let e=(x-1)*15;return D.slice(e,e+15)},[D,x,15]);return(0,Q.jsxs)(`div`,{className:`space-y-3`,children:[(0,Q.jsxs)(`div`,{className:`flex flex-col sm:flex-row sm:items-center justify-between gap-3 p-3 bg-krona-surface border border-krona-border rounded-xl`,children:[(0,Q.jsx)(`div`,{className:`relative w-full sm:w-80`,children:(0,Q.jsx)(M,{value:p,onChange:e=>{m(e.target.value),S(1)},placeholder:`Поиск по записям...`,icon:(0,Q.jsx)(K,{className:`w-3.5 h-3.5`}),className:`text-xs py-1.5`})}),(0,Q.jsxs)(`div`,{className:`flex items-center gap-3 text-xs text-krona-secondary justify-between sm:justify-end`,children:[(0,Q.jsxs)(`span`,{children:[`Найдено записей: `,(0,Q.jsx)(`strong`,{className:`text-krona-primary`,children:D.length})]}),f&&(0,Q.jsxs)(r,{variant:`primary`,size:`sm`,onClick:f,children:[(0,Q.jsx)(G,{className:`w-3.5 h-3.5 mr-1`}),`Создать`]})]})]}),(0,Q.jsxs)(`div`,{className:`bg-krona-surface border border-krona-border rounded-xl shadow-krona-soft overflow-hidden`,children:[(0,Q.jsx)(`div`,{className:`overflow-x-auto`,children:(0,Q.jsxs)(`table`,{className:`w-full text-left text-xs border-collapse`,children:[(0,Q.jsx)(`thead`,{className:`bg-krona-workspace border-b border-krona-border select-none`,children:(0,Q.jsxs)(`tr`,{children:[T.map(e=>{let t=h===e.key;return(0,Q.jsx)(`th`,{onClick:()=>E(e.key),className:`p-3 font-semibold text-krona-primary hover:bg-krona-surface-muted/60 cursor-pointer transition-colors whitespace-nowrap`,children:(0,Q.jsxs)(`div`,{className:`flex items-center gap-1.5`,children:[(0,Q.jsx)(`span`,{children:e.label}),t?v===`asc`?(0,Q.jsx)(d,{className:`w-3 h-3 text-krona-green`}):(0,Q.jsx)(l,{className:`w-3 h-3 text-krona-green`}):(0,Q.jsx)(u,{className:`w-3 h-3 text-krona-secondary opacity-40 hover:opacity-100`})]})},e.key)}),(0,Q.jsx)(`th`,{className:`p-3 text-right font-semibold text-krona-secondary w-28`,children:`Действия`})]})}),(0,Q.jsxs)(`tbody`,{className:`divide-y divide-krona-border/60 bg-krona-surface`,children:[k.map(t=>(0,Q.jsxs)(`tr`,{onClick:()=>o&&o(t),className:`hover:bg-krona-workspace/60 transition-colors cursor-pointer group`,children:[T.map(n=>{let r=t[n.key],i=_(n.type,r,n);return(0,Q.jsx)(`td`,{className:`p-3 text-krona-secondary truncate max-w-xs`,children:n.type===`color`&&r?(0,Q.jsxs)(`div`,{className:`flex items-center gap-1.5`,children:[(0,Q.jsx)(`span`,{className:`w-3 h-3 rounded-full border border-krona-border/60 shrink-0`,style:{backgroundColor:String(r)}}),(0,Q.jsx)(`span`,{className:`font-mono text-[11px]`,children:i})]}):n.type===`boolean`&&r!=null?(0,Q.jsx)(a,{variant:r?`green`:`neutral`,size:`sm`,children:r?`Да`:`Нет`}):n.key===`status`||n.type===`status`?(0,Q.jsx)(a,{variant:`neutral`,size:`sm`,children:i}):n.key===e.primaryFieldKey||n.key===`name`?(0,Q.jsx)(`span`,{className:`font-semibold text-krona-primary`,children:i}):(0,Q.jsx)(`span`,{children:i})},n.key)}),(0,Q.jsx)(`td`,{className:`p-3 text-right`,onClick:e=>e.stopPropagation(),children:(0,Q.jsxs)(`div`,{className:`flex items-center justify-end gap-1 opacity-70 group-hover:opacity-100`,children:[o&&(0,Q.jsx)(`button`,{type:`button`,onClick:()=>o(t),className:`p-1 hover:bg-krona-workspace rounded text-krona-secondary hover:text-krona-primary`,title:`Просмотреть карточку`,children:(0,Q.jsx)(y,{className:`w-3.5 h-3.5`})}),s&&(0,Q.jsx)(`button`,{type:`button`,onClick:()=>s(t),className:`p-1 hover:bg-krona-workspace rounded text-krona-secondary hover:text-krona-primary`,title:`Редактировать запись`,children:(0,Q.jsx)(C,{className:`w-3.5 h-3.5`})}),c&&(0,Q.jsx)(`button`,{type:`button`,onClick:()=>c(t),className:`p-1 hover:bg-krona-danger/10 rounded text-krona-danger`,title:`Удалить запись`,children:(0,Q.jsx)(W,{className:`w-3.5 h-3.5`})})]})})]},t.id)),k.length===0&&!i&&(0,Q.jsx)(`tr`,{children:(0,Q.jsxs)(`td`,{colSpan:T.length+1,className:`p-12 text-center text-krona-secondary`,children:[(0,Q.jsx)(te,{className:`w-8 h-8 text-krona-secondary mx-auto mb-2 opacity-50`}),(0,Q.jsx)(`p`,{className:`font-semibold text-krona-primary`,children:`Записей пока нет`}),(0,Q.jsxs)(`p`,{className:`text-xs text-krona-secondary mb-3`,children:[`Создайте первую запись в сущности «`,e.name,`»`]}),f&&(0,Q.jsxs)(r,{variant:`primary`,size:`sm`,onClick:f,children:[(0,Q.jsx)(G,{className:`w-3.5 h-3.5 mr-1`}),`Создать запись`]})]})})]})]})}),O>1&&(0,Q.jsxs)(`div`,{className:`flex items-center justify-between p-3 border-t border-krona-border text-xs text-krona-secondary`,children:[(0,Q.jsxs)(`span`,{children:[`Страница `,x,` из `,O]}),(0,Q.jsxs)(`div`,{className:`flex gap-1`,children:[(0,Q.jsx)(r,{variant:`outline`,size:`sm`,disabled:x<=1,onClick:()=>S(e=>Math.max(1,e-1)),children:`Назад`}),(0,Q.jsx)(r,{variant:`outline`,size:`sm`,disabled:x>=O,onClick:()=>S(e=>Math.min(O,e+1)),children:`Вперёд`})]})]})]})]})},re=({entity:t,record:n,layout:i,onEdit:o,onDelete:l,onClose:u})=>{let{showToast:d}=s(),[_,v]=(0,Z.useState)(`overview`),[y,S]=(0,Z.useState)([]),[E,D]=(0,Z.useState)(!1);(0,Z.useEffect)(()=>{async function e(){try{let e=await(await c()).transaction(`audit_log`,`readonly`).store.index(`by_entity_id`).getAll(n.id);e.sort((e,t)=>e.timestamp>t.timestamp?-1:1),S(e)}catch{}}e()},[n.id]);let k=()=>{navigator.clipboard.writeText(JSON.stringify(n,null,2)),D(!0),d({type:`success`,title:`JSON скопирован в буфер обмена`}),setTimeout(()=>D(!1),2e3)},M=String(n.name||n.title||n[t.primaryFieldKey||`name`]||n.id),N=e=>{let t=n[e.key],r=h(e.type);if(t==null||t===``)return(0,Q.jsx)(`span`,{className:`text-krona-secondary/60 font-normal`,children:`—`});if(r===`rating`){let e=Math.min(5,Math.max(1,Number(t)||5));return(0,Q.jsxs)(`div`,{className:`flex items-center gap-1`,children:[[1,2,3,4,5].map(t=>(0,Q.jsx)(T,{className:`w-3.5 h-3.5 ${t<=e?`fill-amber-400 text-amber-400`:`text-krona-secondary opacity-30`}`},t)),(0,Q.jsxs)(`span`,{className:`text-[11px] font-semibold text-krona-primary ml-1`,children:[e,`/5`]})]})}if(r===`color`){let e=String(t);return(0,Q.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,Q.jsx)(`span`,{className:`w-4 h-4 rounded border border-krona-border/60 shrink-0`,style:{backgroundColor:e}}),(0,Q.jsx)(`span`,{className:`font-mono text-xs`,children:e})]})}if(r===`url`){let e=String(t);return(0,Q.jsxs)(`a`,{href:e,target:`_blank`,rel:`noopener noreferrer`,className:`text-krona-green hover:underline inline-flex items-center gap-1 break-all`,children:[e,(0,Q.jsx)(O,{className:`w-3 h-3 shrink-0`})]})}if(r===`email`){let e=String(t);return(0,Q.jsxs)(`a`,{href:`mailto:${e}`,className:`text-krona-green hover:underline inline-flex items-center gap-1`,children:[(0,Q.jsx)(x,{className:`w-3 h-3 shrink-0`}),e]})}if(r===`phone`){let e=String(t);return(0,Q.jsxs)(`a`,{href:`tel:${e.replace(/\D/g,``)}`,className:`text-krona-green hover:underline inline-flex items-center gap-1`,children:[(0,Q.jsx)(w,{className:`w-3 h-3 shrink-0`}),e]})}if(r===`multi_select`||r===`checkbox_group`)return Array.isArray(t)?t.length===0?(0,Q.jsx)(`span`,{className:`text-krona-secondary/60`,children:`—`}):(0,Q.jsx)(`div`,{className:`flex flex-wrap gap-1`,children:t.map(t=>{let n=e.options?.find(e=>e.value===t);return(0,Q.jsx)(a,{variant:`neutral`,size:`sm`,children:n?.label||String(t)},String(t))})}):(0,Q.jsx)(`span`,{children:String(t)});if(r===`money`)return(0,Q.jsx)(`span`,{className:`font-semibold text-krona-primary`,children:q(typeof t==`number`?t:0)});if(r===`percentage`)return(0,Q.jsxs)(`span`,{className:`font-semibold text-krona-primary`,children:[String(t),`%`]});if(r===`boolean`)return(0,Q.jsx)(a,{variant:t?`green`:`neutral`,size:`sm`,children:t?`Да`:`Нет`});if(r===`date`||r===`datetime`)return(0,Q.jsx)(`span`,{children:r===`datetime`?U(String(t)):z(String(t))});if(r===`time`)return(0,Q.jsx)(`span`,{className:`font-mono`,children:String(t)});if(r===`status`){let n=e.options?.find(e=>e.value===t);return(0,Q.jsx)(a,{variant:`green`,size:`sm`,children:n?.label||String(t)})}if(r===`select`||r===`radio`){let n=e.options?.find(e=>e.value===t);return(0,Q.jsx)(`span`,{children:n?.label||String(t)})}if(r===`file`||r===`image`){if(typeof t==`object`&&t&&`name`in t){let e=t;return(0,Q.jsxs)(`div`,{className:`flex items-center gap-2`,children:[r===`image`&&e.url?(0,Q.jsx)(`img`,{src:e.url,alt:e.name,className:`w-8 h-8 rounded object-cover border border-krona-border shrink-0`}):(0,Q.jsx)(b,{className:`w-4 h-4 text-krona-green shrink-0`}),(0,Q.jsxs)(`div`,{className:`truncate`,children:[(0,Q.jsx)(`span`,{className:`font-semibold text-krona-primary truncate block`,children:e.name}),(0,Q.jsxs)(`span`,{className:`text-[10px] text-krona-secondary font-mono`,children:[(e.size/1024).toFixed(1),` КБ`]})]})]})}return(0,Q.jsx)(`span`,{children:String(t)})}if(r===`address`){if(typeof t==`object`&&t){let e=t,n=[e.city,e.street,e.postalCode,e.country].filter(Boolean);return(0,Q.jsxs)(`div`,{className:`flex items-center gap-1.5`,children:[(0,Q.jsx)(R,{className:`w-3.5 h-3.5 text-krona-green shrink-0`}),(0,Q.jsx)(`span`,{children:n.join(`, `)||`—`})]})}return(0,Q.jsxs)(`div`,{className:`flex items-center gap-1.5`,children:[(0,Q.jsx)(R,{className:`w-3.5 h-3.5 text-krona-green shrink-0`}),(0,Q.jsx)(`span`,{children:String(t)})]})}if(r===`location`){if(typeof t==`object`&&t){let e=t;return(0,Q.jsxs)(`div`,{className:`flex items-center gap-1.5 font-mono text-xs`,children:[(0,Q.jsx)(p,{className:`w-3.5 h-3.5 text-krona-green shrink-0`}),(0,Q.jsxs)(`span`,{children:[e.lat.toFixed(4),`, `,e.lng.toFixed(4)]})]})}return(0,Q.jsx)(`span`,{children:String(t)})}if(r===`formula`){let r=e.formula?g(e.formula,n):t;return(0,Q.jsxs)(`div`,{className:`flex items-center gap-1.5`,children:[(0,Q.jsx)(f,{className:`w-3.5 h-3.5 text-krona-green shrink-0`}),(0,Q.jsx)(`span`,{className:`font-mono font-bold text-krona-primary`,children:String(r===null?t:r)})]})}if(r===`json`){let e=typeof t==`object`?JSON.stringify(t):String(t);return(0,Q.jsx)(`pre`,{className:`p-1 bg-krona-workspace rounded text-[11px] font-mono text-krona-primary truncate max-w-xs`,children:e})}return r===`autonumber`?(0,Q.jsx)(`span`,{className:`font-mono font-bold text-krona-green`,children:String(t)}):(0,Q.jsx)(`span`,{children:String(t)})};return(0,Q.jsxs)(`div`,{className:`space-y-4 text-left`,children:[(0,Q.jsxs)(`div`,{className:`p-4 bg-krona-surface border border-krona-border rounded-xl shadow-krona-soft flex flex-col sm:flex-row sm:items-center justify-between gap-3`,children:[(0,Q.jsxs)(`div`,{className:`flex items-center gap-3`,children:[(0,Q.jsx)(`div`,{className:`w-11 h-11 rounded-xl bg-krona-green/10 text-krona-green flex items-center justify-center font-bold text-base border border-krona-green/20`,children:M.slice(0,1).toUpperCase()}),(0,Q.jsxs)(`div`,{children:[(0,Q.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,Q.jsx)(`h2`,{className:`text-base font-bold text-krona-primary`,children:M}),(0,Q.jsx)(a,{variant:`neutral`,size:`sm`,children:(0,Q.jsx)(`code`,{children:t.code})}),n.status!==void 0&&n.status!==null&&(0,Q.jsx)(a,{variant:`green`,size:`sm`,children:String(n.status)})]}),(0,Q.jsxs)(`p`,{className:`text-xs font-mono text-krona-secondary`,children:[`ID: `,n.id]})]})]}),(0,Q.jsxs)(`div`,{className:`flex items-center gap-2`,children:[o&&(0,Q.jsxs)(r,{variant:`outline`,size:`sm`,onClick:o,children:[(0,Q.jsx)(C,{className:`w-3.5 h-3.5 mr-1`}),`Редактировать`]}),l&&(0,Q.jsxs)(r,{variant:`outline`,size:`sm`,onClick:l,className:`text-krona-danger hover:bg-krona-danger/10`,children:[(0,Q.jsx)(W,{className:`w-3.5 h-3.5 mr-1`}),`Удалить`]}),u&&(0,Q.jsx)(`button`,{onClick:u,className:`p-1.5 text-krona-secondary hover:text-krona-primary rounded-lg`,title:`Закрыть`,children:(0,Q.jsx)(e,{className:`w-4 h-4`})})]})]}),(0,Q.jsxs)(`div`,{className:`flex items-center gap-1 border-b border-krona-border/80 pb-1`,children:[(0,Q.jsxs)(`button`,{onClick:()=>v(`overview`),className:`px-3 py-1.5 rounded-lg text-xs font-semibold cursor-pointer transition-all flex items-center gap-1.5 ${_===`overview`?`bg-krona-green text-white shadow-sm`:`text-krona-secondary hover:text-krona-primary`}`,children:[(0,Q.jsx)(L,{className:`w-3.5 h-3.5`}),`Обзор реквизитов`]}),(0,Q.jsxs)(`button`,{onClick:()=>v(`timeline`),className:`px-3 py-1.5 rounded-lg text-xs font-semibold cursor-pointer transition-all flex items-center gap-1.5 ${_===`timeline`?`bg-krona-green text-white shadow-sm`:`text-krona-secondary hover:text-krona-primary`}`,children:[(0,Q.jsx)(A,{className:`w-3.5 h-3.5`}),`Аудит и история (`,y.length,`)`]}),(0,Q.jsxs)(`button`,{onClick:()=>v(`json`),className:`px-3 py-1.5 rounded-lg text-xs font-semibold cursor-pointer transition-all flex items-center gap-1.5 ${_===`json`?`bg-krona-green text-white shadow-sm`:`text-krona-secondary hover:text-krona-primary`}`,children:[(0,Q.jsx)(m,{className:`w-3.5 h-3.5`}),`Сырой JSON`]})]}),_===`overview`&&(0,Q.jsxs)(`div`,{className:`space-y-4`,children:[(0,Q.jsxs)(`div`,{className:`p-4 bg-krona-surface border border-krona-border rounded-xl shadow-krona-soft space-y-3`,children:[(0,Q.jsx)(`h3`,{className:`text-xs font-bold text-krona-primary uppercase tracking-wider`,children:`Все атрибуты записи`}),(0,Q.jsx)(`div`,{className:`grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-3 text-xs`,children:t.fields.map(e=>(0,Q.jsxs)(`div`,{className:`p-3 bg-krona-workspace/60 rounded-lg border border-krona-border/60 flex flex-col justify-between`,children:[(0,Q.jsx)(`span`,{className:`text-[11px] text-krona-secondary block mb-1`,children:e.label}),(0,Q.jsx)(`div`,{className:`font-semibold text-krona-primary break-words`,children:N(e)})]},e.key))})]}),(0,Q.jsxs)(`div`,{className:`p-3.5 bg-krona-surface border border-krona-border rounded-xl text-xs text-krona-secondary flex flex-wrap gap-4`,children:[(0,Q.jsxs)(`div`,{children:[`Создано:`,` `,(0,Q.jsx)(`strong`,{className:`text-krona-primary`,children:n.audit?.createdAt?U(String(n.audit.createdAt)):n.created_at?U(String(n.created_at)):`—`})]}),(0,Q.jsxs)(`div`,{children:[`Обновлено:`,` `,(0,Q.jsx)(`strong`,{className:`text-krona-primary`,children:U(String(n.updatedAt||new Date().toISOString()))})]}),(0,Q.jsxs)(`div`,{children:[`Версия:`,` `,(0,Q.jsxs)(`strong`,{className:`text-krona-primary`,children:[`v`,n.audit?.version||1]})]})]})]}),_===`timeline`&&(0,Q.jsxs)(`div`,{className:`p-4 bg-krona-surface border border-krona-border rounded-xl shadow-krona-soft space-y-3`,children:[(0,Q.jsx)(`h3`,{className:`text-xs font-bold text-krona-primary uppercase tracking-wider`,children:`История изменений записи`}),(0,Q.jsxs)(`div`,{className:`space-y-3`,children:[y.map(e=>(0,Q.jsxs)(`div`,{className:`p-3 bg-krona-workspace rounded-lg border border-krona-border/60 flex items-start justify-between gap-3 text-xs`,children:[(0,Q.jsxs)(`div`,{className:`flex items-start gap-2.5`,children:[(0,Q.jsx)(`div`,{className:`w-2 h-2 rounded-full bg-krona-green mt-1.5 shrink-0`}),(0,Q.jsxs)(`div`,{children:[(0,Q.jsx)(`p`,{className:`font-semibold text-krona-primary`,children:e.summary}),(0,Q.jsxs)(`p`,{className:`text-[11px] text-krona-secondary`,children:[`Действие: `,(0,Q.jsx)(`code`,{className:`font-mono`,children:e.action}),` • Пользователь: `,e.userName||e.userId]})]})]}),(0,Q.jsx)(`span`,{className:`text-[11px] text-krona-secondary shrink-0 font-mono`,children:U(e.timestamp)})]},e.id)),y.length===0&&(0,Q.jsx)(`div`,{className:`py-8 text-center text-xs text-krona-secondary`,children:`Лента аудита пока пуста для этой записи.`})]})]}),_===`json`&&(0,Q.jsxs)(`div`,{className:`p-4 bg-krona-surface border border-krona-border rounded-xl shadow-krona-soft space-y-2`,children:[(0,Q.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,Q.jsx)(`span`,{className:`text-xs font-bold text-krona-primary uppercase tracking-wider`,children:`Исходный документ (IndexedDB JSON)`}),(0,Q.jsxs)(r,{variant:`outline`,size:`sm`,onClick:k,children:[E?(0,Q.jsx)(j,{className:`w-3 h-3 mr-1 text-krona-green`}):(0,Q.jsx)(Y,{className:`w-3 h-3 mr-1`}),E?`Скопировано`:`Копировать`]})]}),(0,Q.jsx)(`pre`,{className:`p-3 bg-krona-workspace border border-krona-border rounded-lg text-xs font-mono text-krona-primary overflow-x-auto max-h-96`,children:JSON.stringify(n,null,2)})]})]})},$=()=>{let{entityCode:e,recordId:t}=V(),n=F(),{currentEntity:i,views:o,layouts:c,loading:l}=P(e),{showToast:u}=s(),[d,f]=(0,Z.useState)([]),[p,m]=(0,Z.useState)(!0),[h,g]=(0,Z.useState)(``),[_,y]=(0,Z.useState)(!1),[b,x]=(0,Z.useState)(null),[C,w]=(0,Z.useState)(null),[T,O]=(0,Z.useState)(null),A=(0,Z.useMemo)(()=>e?new N(e):null,[e]),j=(0,Z.useCallback)(async()=>{if(A)try{m(!0);let e=await A.list({pageSize:100});f(e.items)}catch(e){u({type:`error`,title:`Ошибка загрузки записей`,message:e instanceof Error?e.message:String(e)})}finally{m(!1)}},[A,u]);(0,Z.useEffect)(()=>{Promise.resolve().then(()=>{j()})},[j]),(0,Z.useEffect)(()=>{Promise.resolve().then(()=>{if(o&&o.length>0&&!h){let e=o.find(e=>e.isDefault)||o[0];g(e.id)}})},[o,h]),(0,Z.useEffect)(()=>{t&&A&&A.getById(t).then(e=>{e&&w(e)})},[t,A]);let M=(0,Z.useMemo)(()=>o.find(e=>e.id===h)||null,[o,h]),R=(0,Z.useMemo)(()=>c.find(e=>e.type===`form`||e.isDefault)||null,[c]),z=(0,Z.useMemo)(()=>c.find(e=>e.type===`card`||e.cardBlocks)||null,[c]);return!i&&!l?(0,Q.jsxs)(`div`,{className:`p-8 text-center bg-krona-surface border border-krona-border rounded-xl`,children:[(0,Q.jsx)(L,{className:`w-10 h-10 text-krona-secondary mx-auto mb-2 opacity-40`}),(0,Q.jsxs)(`h2`,{className:`text-base font-bold text-krona-primary mb-1`,children:[`Сущность «`,e,`» не найдена`]}),(0,Q.jsx)(`p`,{className:`text-xs text-krona-secondary mb-4`,children:`Возможно, она была удалена или переименована в каталоге сущностей.`}),(0,Q.jsx)(r,{variant:`primary`,size:`sm`,onClick:()=>n(`/settings/entities`),children:`Перейти в каталог сущностей`})]}):(0,Q.jsxs)(`div`,{className:`space-y-4 animate-fade-in text-left`,children:[(0,Q.jsxs)(`div`,{className:`flex flex-col sm:flex-row sm:items-center justify-between gap-3 p-4 bg-krona-surface border border-krona-border rounded-xl shadow-krona-soft`,children:[(0,Q.jsxs)(`div`,{className:`flex items-center gap-3`,children:[(0,Q.jsx)(`div`,{className:`w-10 h-10 rounded-xl bg-krona-workspace flex items-center justify-center text-krona-green border border-krona-border/60`,children:(0,Q.jsx)(L,{className:`w-5 h-5`})}),(0,Q.jsxs)(`div`,{children:[(0,Q.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,Q.jsx)(`h1`,{className:`text-base font-bold text-krona-primary`,children:i?.pluralName||i?.name||e}),i?.isSystem?(0,Q.jsxs)(a,{variant:`neutral`,size:`sm`,children:[(0,Q.jsx)(D,{className:`w-2.5 h-2.5 mr-1`}),`System`]}):(0,Q.jsxs)(a,{variant:`gold`,size:`sm`,children:[(0,Q.jsx)(B,{className:`w-2.5 h-2.5 mr-1`}),`Custom`]})]}),(0,Q.jsx)(`p`,{className:`text-xs text-krona-secondary`,children:i?.description||`Управление записями сущности ${e}`})]})]}),(0,Q.jsxs)(`div`,{className:`flex items-center gap-2 flex-wrap`,children:[(0,Q.jsxs)(`div`,{className:`flex items-center bg-krona-workspace rounded-lg p-0.5 border border-krona-border/80 text-xs`,children:[(0,Q.jsx)(`button`,{onClick:()=>n(`/settings/entities/${e}/fields`),className:`px-2 py-1 text-krona-secondary hover:text-krona-primary rounded`,title:`Настройка полей`,children:(0,Q.jsx)(I,{className:`w-3.5 h-3.5`})}),(0,Q.jsx)(`button`,{onClick:()=>n(`/settings/entities/${e}/forms`),className:`px-2 py-1 text-krona-secondary hover:text-krona-primary rounded`,title:`Настройка форм`,children:(0,Q.jsx)(S,{className:`w-3.5 h-3.5`})}),(0,Q.jsx)(`button`,{onClick:()=>n(`/settings/entities/${e}/card`),className:`px-2 py-1 text-krona-secondary hover:text-krona-primary rounded`,title:`Настройка карточки`,children:(0,Q.jsx)(k,{className:`w-3.5 h-3.5`})}),(0,Q.jsx)(`button`,{onClick:()=>n(`/settings/entities/${e}/views`),className:`px-2 py-1 text-krona-secondary hover:text-krona-primary rounded`,title:`Настройка представлений`,children:(0,Q.jsx)(E,{className:`w-3.5 h-3.5`})})]}),(0,Q.jsxs)(r,{variant:`primary`,size:`sm`,"data-testid":`create-record-btn`,onClick:()=>y(!0),children:[(0,Q.jsx)(G,{className:`w-3.5 h-3.5 mr-1`}),`Создать `,i?.name||`запись`]})]})]}),o.length>0&&(0,Q.jsx)(`div`,{className:`flex items-center gap-1.5 overflow-x-auto pb-1`,children:o.map(e=>(0,Q.jsx)(`button`,{onClick:()=>g(e.id),className:`px-3 py-1.5 rounded-lg text-xs font-semibold cursor-pointer transition-all ${h===e.id?`bg-krona-green text-white shadow-sm`:`bg-krona-surface text-krona-secondary hover:text-krona-primary border border-krona-border/60`}`,children:e.name},e.id))}),i&&(0,Q.jsx)(ne,{entity:i,records:d,view:M,isLoading:p,onRowClick:e=>w(e),onEdit:e=>x(e),onDelete:e=>O(e),onCreateNew:()=>y(!0)}),i&&(0,Q.jsx)(H,{isOpen:_,onClose:()=>y(!1),title:`Создать ${i.name}`,subtitle:`Заполните реквизиты сущности «${i.name}»`,maxWidth:`lg`,children:(0,Q.jsx)(v,{entity:i,layout:R,mode:`create`,onSave:async e=>{if(!A||!i)return;let t={...e};if(i.autonumberingEnabled&&!t.number){let e=new Date().getFullYear(),n=d.length+1,r=`DOC-${e}-${String(n).padStart(4,`0`)}`;t={...t,number:r}}await A.create(t),u({type:`success`,title:`Запись успешно создана`}),y(!1),await j()},onCancel:()=>y(!1)})}),i&&b&&(0,Q.jsx)(H,{isOpen:!!b,onClose:()=>x(null),title:`Редактирование: ${b.name||b.id}`,subtitle:`Сущность «${i.name}»`,maxWidth:`lg`,children:(0,Q.jsx)(v,{entity:i,record:b,layout:R,mode:`edit`,onSave:async e=>{if(A&&b){if(await A.update(b.id,e),u({type:`success`,title:`Запись обновлена`}),x(null),C?.id===b.id){let e=await A.getById(b.id);w(e)}await j()}},onCancel:()=>x(null)})}),i&&C&&(0,Q.jsx)(ee,{isOpen:!!C,onClose:()=>w(null),title:String(C.name||C.id),subtitle:`Карточка записи: ${i.name}`,width:`xl`,children:(0,Q.jsx)(re,{entity:i,record:C,layout:z,onEdit:()=>{x(C),w(null)},onDelete:()=>{O(C)},onClose:()=>w(null)})}),(0,Q.jsx)(H,{isOpen:!!T,onClose:()=>O(null),title:`Подтверждение удаления`,subtitle:`Вы действительно хотите удалить запись «${T?.name||T?.id}»?`,maxWidth:`sm`,children:(0,Q.jsxs)(`div`,{className:`space-y-4`,children:[(0,Q.jsx)(`p`,{className:`text-xs text-krona-secondary`,children:`Это действие нельзя будет отменить. Запись будет удалена из базы данных, а в журнал аудита будет внесена соответствующая запись.`}),(0,Q.jsxs)(`div`,{className:`flex justify-end gap-2 pt-2 border-t border-krona-border`,children:[(0,Q.jsx)(r,{variant:`outline`,size:`sm`,onClick:()=>O(null),children:`Отмена`}),(0,Q.jsx)(r,{variant:`danger`,size:`sm`,onClick:async()=>{if(A&&T)try{await A.delete(T.id),u({type:`success`,title:`Запись удалена`}),O(null),C?.id===T.id&&w(null),await j()}catch(e){u({type:`error`,title:`Ошибка удаления`,message:e instanceof Error?e.message:String(e)})}},children:`Удалить запись`})]})]})})]})};export{$ as CustomEntityPage,$ as default}; |