krona-front/dist/assets/CustomEntityPage-BBlkJ9R4.js

1 line
No EOL
25 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{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};