1 line
No EOL
18 KiB
JavaScript
1 line
No EOL
18 KiB
JavaScript
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{l as s}from"./indexedDb-D30TbhA6.js";import{t as c}from"./eye-CkF1gwUX.js";import{t as l}from"./list-XDoRqfJ2.js";import{n as u,t as d}from"./move-up-qiRY8MuU.js";import{t as f}from"./save-D8euL60I.js";import{t as p}from"./settings-2-CSojebrG.js";import{t as m}from"./user-CuEEaB8a.js";import{L as h,Q as g,R as _,Z as v,a as y,et as b,f as x,ft as S,j as C,n as w,pt as T,st as E,w as D}from"./index-CNnq9VO5.js";import{t as O}from"./currency-DdDs82F5.js";var k={name:`paperclip`,size:24,node:[[`path`,{d:`m16 6-8.414 8.586a2 2 0 0 0 2.829 2.829l8.414-8.586a4 4 0 1 0-5.657-5.657l-8.379 8.551a6 6 0 1 0 8.485 8.485l8.379-8.551`,key:`1miecu`}]]};k.node;var A=r(k),j=t(e(),1),M=a(),N=[{id:`blk_header`,type:`header`,title:`Шапка карточки (Header)`,enabled:!0,columnSpan:3,order:1,settings:{showAvatar:!0}},{id:`blk_badges`,type:`badges`,title:`Статусная строка и бейджи`,enabled:!0,columnSpan:3,order:2},{id:`blk_fields`,type:`fields_grid`,title:`Основная сетка полей (Fields Grid)`,enabled:!0,columnSpan:2,order:3,settings:{columnsCount:2}},{id:`blk_timeline`,type:`timeline`,title:`Лента активности и аудит (Timeline)`,enabled:!0,columnSpan:1,order:4,settings:{maxItems:10}},{id:`blk_tasks_notes`,type:`tasks_notes`,title:`Заметки и связанные задачи`,enabled:!0,columnSpan:2,order:5},{id:`blk_related`,type:`related_lists`,title:`Связанные списки (Related Lists)`,enabled:!0,columnSpan:3,order:6},{id:`blk_attachments`,type:`attachments`,title:`Вложенные файлы и документы`,enabled:!0,columnSpan:1,order:7}],P={header:m,badges:g,fields_grid:C,timeline:_,tasks_notes:x,related_lists:l,attachments:A},F=()=>{let{entityCode:e}=T(),t=S(),{currentEntity:r,layouts:a,saveLayout:l}=b(e),{showToast:m}=o(),[g,k]=(0,j.useState)(N),[F,I]=(0,j.useState)(!1),[L,R]=(0,j.useState)(!1),[z,B]=(0,j.useState)(null),[V,H]=(0,j.useState)([]),[U,W]=(0,j.useState)(`demo`);(0,j.useEffect)(()=>{if(!a||a.length===0)return;let t=a.find(t=>t.entityCode===e&&(t.type===`card`||t.cardBlocks));t?.cardBlocks&&t.cardBlocks.length>0&&Promise.resolve().then(()=>{k(t.cardBlocks)})},[a,e]),(0,j.useEffect)(()=>{e&&s(e,{pageSize:10}).then(e=>{H(e.items),e.items.length>0&&W(e.items[0].id)})},[e]);let G=(0,j.useMemo)(()=>{let t=V.find(e=>e.id===U);if(t)return t;let n={id:`rec_demo_preview`,entityType:e||`custom`,name:`Тестовая запись (${r?.name||`Сущность`})`,status:`in_progress`,updatedAt:new Date().toISOString(),created_at:new Date().toISOString()};return r?.fields.forEach(e=>{e.key!==`name`&&e.key!==`status`&&(e.type===`money`?n[e.key]=125e5:e.type===`integer`||e.type===`number`?n[e.key]=42:e.type===`boolean`?n[e.key]=!0:e.type===`email`?n[e.key]=`client@example.com`:e.type===`phone`?n[e.key]=`+7 (999) 000-11-22`:n[e.key]=e.defaultValue||`Значение поля ${e.label}`)}),n},[V,U,r,e]),K=e=>{k(t=>t.map(t=>t.id===e?{...t,enabled:!t.enabled}:t)),I(!0)},q=(e,t)=>{k(n=>{let r=[...n],[i]=r.splice(e,1);return r.splice(t,0,i),r.map((e,t)=>({...e,order:t+1}))}),I(!0)},J=e=>{k(t=>t.map(t=>t.id===e.id?e:t)),I(!0),B(null)},Y=async()=>{if(e)try{let t={id:`card_layout_${e}`,entityCode:e,name:`Карточка сущности`,isDefault:!0,type:`card`,sections:[],cardBlocks:g};await l(t),I(!1),m({type:`success`,title:`Макет карточки успешно сохранён`})}catch(e){m({type:`error`,title:`Ошибка сохранения карточки`,message:e instanceof Error?e.message:String(e)})}},X=(0,j.useMemo)(()=>r?.fields||[],[r]);return(0,M.jsxs)(`div`,{className:`space-y-4 animate-fade-in`,children:[(0,M.jsxs)(`div`,{className:`flex flex-col md:flex-row md:items-center justify-between gap-3 p-4 bg-krona-surface border border-krona-border rounded-xl shadow-krona-soft`,children:[(0,M.jsxs)(`div`,{className:`flex items-center gap-3`,children:[(0,M.jsxs)(n,{variant:`ghost`,size:`sm`,onClick:()=>t(`/settings/entities`),className:`p-1.5`,children:[(0,M.jsx)(v,{className:`w-4 h-4 mr-1`}),`Каталог`]}),(0,M.jsxs)(`div`,{children:[(0,M.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,M.jsx)(h,{className:`w-4 h-4 text-krona-info`}),(0,M.jsxs)(`h1`,{className:`text-base font-bold text-krona-primary`,children:[`Конструктор карточки: `,r?.name||e]}),F&&(0,M.jsx)(i,{variant:`warning`,size:`sm`,children:`Несохранённые изменения`})]}),(0,M.jsx)(`p`,{className:`text-xs text-krona-secondary`,children:`Настройка блочной структуры детальной карточки записи, таймлайна, бейджей и связанных списков`})]})]}),(0,M.jsxs)(`div`,{className:`flex items-center gap-2`,children:[V.length>0&&(0,M.jsx)(`select`,{value:U,onChange:e=>W(e.target.value),className:`text-xs bg-krona-surface text-krona-primary border border-krona-border rounded-md px-2.5 py-1.5 max-w-[180px]`,title:`Выберите запись для проверки`,children:V.map(e=>(0,M.jsx)(`option`,{value:e.id,children:String(e.name||e.id)},e.id))}),(0,M.jsxs)(n,{variant:L?`secondary`:`outline`,size:`sm`,onClick:()=>R(!L),children:[(0,M.jsx)(c,{className:`w-3.5 h-3.5 mr-1 text-krona-gold`}),L?`В редактор`:`Предпросмотр записи`]}),(0,M.jsxs)(n,{variant:`primary`,size:`sm`,onClick:Y,children:[(0,M.jsx)(f,{className:`w-3.5 h-3.5 mr-1`}),`Сохранить`]})]})]}),L?(0,M.jsxs)(`div`,{className:`max-w-5xl mx-auto space-y-4`,children:[(0,M.jsxs)(`div`,{className:`p-3 bg-krona-surface-muted/60 border border-krona-border rounded-lg flex items-center justify-between text-xs text-krona-secondary`,children:[(0,M.jsxs)(`span`,{children:[`Предпросмотр на записи: `,(0,M.jsx)(`strong`,{className:`text-krona-primary`,children:String(G.name||G.id)})]}),(0,M.jsx)(i,{variant:`gold`,size:`sm`,children:`Live DB Preview`})]}),(0,M.jsx)(`div`,{className:`grid grid-cols-1 md:grid-cols-3 gap-4`,children:g.filter(e=>e.enabled).map(e=>{let t={1:`md:col-span-1`,2:`md:col-span-2`,3:`md:col-span-3`}[e.columnSpan];switch(e.type){case`header`:return(0,M.jsxs)(`div`,{className:`${t} p-5 bg-krona-surface border border-krona-border rounded-xl shadow-krona-soft flex flex-col sm:flex-row sm:items-center justify-between gap-4`,children:[(0,M.jsxs)(`div`,{className:`flex items-center gap-3`,children:[e.settings?.showAvatar!==!1&&(0,M.jsx)(`div`,{className:`w-12 h-12 rounded-xl bg-krona-green/10 text-krona-green flex items-center justify-center font-bold text-lg border border-krona-green/20`,children:String(G.name||`K`).slice(0,1).toUpperCase()}),(0,M.jsxs)(`div`,{children:[(0,M.jsx)(`h2`,{className:`text-lg font-bold text-krona-primary`,children:String(G.name||`Без названия`)}),(0,M.jsxs)(`p`,{className:`text-xs font-mono text-krona-secondary`,children:[`ID: `,G.id,` • Тип: `,G.entityType]})]})]}),(0,M.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,M.jsx)(n,{variant:`outline`,size:`sm`,children:`Редактировать`}),(0,M.jsx)(n,{variant:`primary`,size:`sm`,children:`Действие`})]})]},e.id);case`badges`:return(0,M.jsxs)(`div`,{className:`${t} flex flex-wrap items-center gap-2 p-3 bg-krona-surface border border-krona-border rounded-xl`,children:[(0,M.jsx)(`span`,{className:`text-xs text-krona-secondary font-medium`,children:`Статус:`}),(0,M.jsx)(i,{variant:`green`,size:`md`,children:String(G.status||`В работе`)}),(0,M.jsx)(i,{variant:`gold`,size:`md`,children:`Приоритет: Высокий`}),(0,M.jsxs)(`span`,{className:`text-xs text-krona-secondary ml-auto`,children:[`Обновлено: `,E(String(G.updatedAt||new Date().toISOString()))]})]},e.id);case`fields_grid`:return(0,M.jsxs)(`div`,{className:`${t} p-4 bg-krona-surface border border-krona-border rounded-xl shadow-krona-soft space-y-3`,children:[(0,M.jsx)(`h3`,{className:`text-xs font-bold text-krona-primary uppercase tracking-wider`,children:e.title}),(0,M.jsx)(`div`,{className:`grid grid-cols-1 ${(e.settings?.columnsCount||2)===2?`sm:grid-cols-2`:`sm:grid-cols-3`} gap-3 text-xs`,children:X.map(e=>{let t=G[e.key];return(0,M.jsxs)(`div`,{className:`p-2.5 bg-krona-workspace/60 rounded-lg border border-krona-border/50`,children:[(0,M.jsx)(`span`,{className:`text-[11px] text-krona-secondary block mb-0.5`,children:e.label}),(0,M.jsx)(`span`,{className:`font-medium text-krona-primary`,children:e.type===`money`?typeof t==`number`?O(t):`—`:typeof t==`boolean`?t?`Да`:`Нет`:t!=null&&t!==``?String(t):`—`})]},e.key)})})]},e.id);case`timeline`:return(0,M.jsxs)(`div`,{className:`${t} p-4 bg-krona-surface border border-krona-border rounded-xl shadow-krona-soft space-y-3`,children:[(0,M.jsxs)(`h3`,{className:`text-xs font-bold text-krona-primary uppercase tracking-wider flex items-center gap-1.5`,children:[(0,M.jsx)(_,{className:`w-3.5 h-3.5 text-krona-gold`}),e.title]}),(0,M.jsxs)(`div`,{className:`space-y-2.5 text-xs`,children:[(0,M.jsxs)(`div`,{className:`flex gap-2.5 items-start`,children:[(0,M.jsx)(`div`,{className:`w-2 h-2 rounded-full bg-krona-green mt-1.5 shrink-0`}),(0,M.jsxs)(`div`,{children:[(0,M.jsx)(`p`,{className:`font-medium text-krona-primary`,children:`Создана запись`}),(0,M.jsx)(`p`,{className:`text-[11px] text-krona-secondary`,children:E(String(G.created_at||new Date().toISOString()))})]})]}),(0,M.jsxs)(`div`,{className:`flex gap-2.5 items-start`,children:[(0,M.jsx)(`div`,{className:`w-2 h-2 rounded-full bg-krona-gold mt-1.5 shrink-0`}),(0,M.jsxs)(`div`,{children:[(0,M.jsx)(`p`,{className:`font-medium text-krona-primary`,children:`Статус изменён на «В работе»`}),(0,M.jsx)(`p`,{className:`text-[11px] text-krona-secondary`,children:E(String(G.updatedAt||new Date().toISOString()))})]})]})]})]},e.id);case`tasks_notes`:return(0,M.jsxs)(`div`,{className:`${t} p-4 bg-krona-surface border border-krona-border rounded-xl shadow-krona-soft space-y-3`,children:[(0,M.jsxs)(`h3`,{className:`text-xs font-bold text-krona-primary uppercase tracking-wider flex items-center gap-1.5`,children:[(0,M.jsx)(x,{className:`w-3.5 h-3.5 text-krona-green`}),e.title]}),(0,M.jsxs)(`div`,{className:`space-y-2 text-xs`,children:[(0,M.jsxs)(`label`,{className:`flex items-center gap-2 text-krona-primary`,children:[(0,M.jsx)(`input`,{type:`checkbox`,defaultChecked:!0,className:`rounded text-krona-green`}),(0,M.jsx)(`span`,{children:`Проверить реквизиты контрагента`})]}),(0,M.jsxs)(`label`,{className:`flex items-center gap-2 text-krona-primary`,children:[(0,M.jsx)(`input`,{type:`checkbox`,className:`rounded text-krona-green`}),(0,M.jsx)(`span`,{children:`Подписать договор у генерального директора`})]})]})]},e.id);case`related_lists`:return(0,M.jsxs)(`div`,{className:`${t} p-4 bg-krona-surface border border-krona-border rounded-xl shadow-krona-soft space-y-3`,children:[(0,M.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,M.jsx)(`h3`,{className:`text-xs font-bold text-krona-primary uppercase tracking-wider`,children:e.title}),(0,M.jsxs)(n,{variant:`ghost`,size:`sm`,className:`text-xs`,children:[(0,M.jsx)(D,{className:`w-3 h-3 mr-1`}),` Добавить`]})]}),(0,M.jsx)(`div`,{className:`p-3 bg-krona-workspace rounded-lg border border-krona-border/50 text-xs text-krona-secondary text-center`,children:`Связанные документы и записи будут автоматически отображаться здесь`})]},e.id);case`attachments`:return(0,M.jsxs)(`div`,{className:`${t} p-4 bg-krona-surface border border-krona-border rounded-xl shadow-krona-soft space-y-3`,children:[(0,M.jsxs)(`h3`,{className:`text-xs font-bold text-krona-primary uppercase tracking-wider flex items-center gap-1.5`,children:[(0,M.jsx)(A,{className:`w-3.5 h-3.5 text-krona-info`}),e.title]}),(0,M.jsx)(`div`,{className:`p-3 border border-dashed border-krona-border rounded-lg text-center text-xs text-krona-secondary`,children:`Перетащите файлы для прикрепления`})]},e.id);default:return null}})})]}):(0,M.jsxs)(`div`,{className:`space-y-3`,children:[(0,M.jsxs)(`div`,{className:`flex items-center justify-between p-3 bg-krona-surface border border-krona-border rounded-xl`,children:[(0,M.jsx)(`span`,{className:`text-xs font-semibold text-krona-primary`,children:`Блоки макета карточки (Drag / Порядок отображения)`}),(0,M.jsxs)(`span`,{className:`text-xs text-krona-secondary`,children:[`Активных блоков: `,(0,M.jsx)(`strong`,{children:g.filter(e=>e.enabled).length}),` из`,` `,g.length]})]}),(0,M.jsx)(`div`,{className:`space-y-2`,children:g.map((e,t)=>{let r=P[e.type]||C;return(0,M.jsxs)(`div`,{className:`flex items-center justify-between p-3.5 rounded-xl border transition-all ${e.enabled?`bg-krona-surface border-krona-border shadow-xs`:`bg-krona-workspace/40 border-krona-border/40 opacity-50`}`,children:[(0,M.jsxs)(`div`,{className:`flex items-center gap-3 min-w-0`,children:[(0,M.jsx)(`div`,{className:`w-8 h-8 rounded-lg bg-krona-workspace flex items-center justify-center border border-krona-border/60 shrink-0`,children:(0,M.jsx)(r,{className:`w-4 h-4 text-krona-green`})}),(0,M.jsxs)(`div`,{className:`min-w-0`,children:[(0,M.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,M.jsx)(`span`,{className:`text-sm font-semibold text-krona-primary truncate`,children:e.title}),(0,M.jsx)(i,{variant:`neutral`,size:`sm`,className:`font-mono text-[10px]`,children:e.type}),(0,M.jsxs)(i,{variant:`gold`,size:`sm`,className:`text-[10px]`,children:[`Ширина: `,e.columnSpan,`/3`]})]}),(0,M.jsxs)(`p`,{className:`text-xs text-krona-secondary truncate mt-0.5`,children:[e.type===`header`&&`Имя записи, аватар, первичные действия и кнопки`,e.type===`badges`&&`Статусные пилюли, категория, приоритет, метки`,e.type===`fields_grid`&&`Сетка основных атрибутов (колонок: ${e.settings?.columnsCount||2})`,e.type===`timeline`&&`История изменений, аудит действий и комментарии`,e.type===`tasks_notes`&&`Быстрые заметки и связанные поручения`,e.type===`related_lists`&&`Связанные документы, сделки, заказы или контакты`,e.type===`attachments`&&`Загруженные файлы, чеки, спецификации`]})]})]}),(0,M.jsxs)(`div`,{className:`flex items-center gap-2 shrink-0`,children:[(0,M.jsxs)(`label`,{className:`flex items-center gap-1.5 cursor-pointer text-xs text-krona-secondary mr-2`,children:[(0,M.jsx)(`input`,{type:`checkbox`,checked:e.enabled,onChange:()=>K(e.id),className:`rounded text-krona-green`}),`Включен`]}),(0,M.jsx)(n,{variant:`ghost`,size:`icon`,onClick:()=>B(e),title:`Настройки блока`,children:(0,M.jsx)(p,{className:`w-4 h-4 text-krona-secondary hover:text-krona-primary`})}),(0,M.jsx)(`button`,{onClick:()=>q(t,t-1),disabled:t===0,className:`p-1.5 text-krona-secondary hover:text-krona-primary disabled:opacity-20`,title:`Переместить вверх`,children:(0,M.jsx)(d,{className:`w-4 h-4`})}),(0,M.jsx)(`button`,{onClick:()=>q(t,t+1),disabled:t===g.length-1,className:`p-1.5 text-krona-secondary hover:text-krona-primary disabled:opacity-20`,title:`Переместить вниз`,children:(0,M.jsx)(u,{className:`w-4 h-4`})})]})]},e.id)})})]}),(0,M.jsx)(w,{isOpen:!!z,onClose:()=>B(null),title:z?`Настройки: ${z.title}`:`Настройки`,subtitle:`Тип блока: ${z?.type}`,width:`md`,children:z&&(0,M.jsxs)(`div`,{className:`space-y-4 text-xs`,children:[(0,M.jsx)(y,{label:`Заголовок блока`,value:z.title,onChange:e=>B(t=>t?{...t,title:e.target.value}:null)}),(0,M.jsxs)(`div`,{children:[(0,M.jsx)(`label`,{className:`text-xs font-semibold text-krona-primary block mb-1`,children:`Ширина блока (Количество колонок)`}),(0,M.jsx)(`div`,{className:`grid grid-cols-3 gap-2`,children:[1,2,3].map(e=>(0,M.jsxs)(`button`,{type:`button`,onClick:()=>B(t=>t?{...t,columnSpan:e}:null),className:`py-2 text-xs font-bold rounded-lg border text-center ${z.columnSpan===e?`bg-krona-green text-white border-krona-green`:`bg-krona-surface text-krona-secondary border-krona-border`}`,children:[e,` / 3 колонок`]},e))})]}),z.type===`fields_grid`&&(0,M.jsxs)(`div`,{children:[(0,M.jsx)(`label`,{className:`text-xs font-semibold text-krona-primary block mb-1`,children:`Количество внутренних колонок сетки`}),(0,M.jsxs)(`select`,{value:z.settings?.columnsCount||2,onChange:e=>B(t=>t?{...t,settings:{...t.settings,columnsCount:Number(e.target.value)}}:null),className:`w-full bg-krona-surface text-krona-primary border border-krona-border rounded-md px-3 py-2 text-xs`,children:[(0,M.jsx)(`option`,{value:1,children:`1 колонка`}),(0,M.jsx)(`option`,{value:2,children:`2 колонки`}),(0,M.jsx)(`option`,{value:3,children:`3 колонки`})]})]}),z.type===`header`&&(0,M.jsxs)(`label`,{className:`flex items-center gap-2 cursor-pointer font-medium text-krona-primary`,children:[(0,M.jsx)(`input`,{type:`checkbox`,checked:z.settings?.showAvatar!==!1,onChange:e=>B(t=>t?{...t,settings:{...t.settings,showAvatar:e.target.checked}}:null),className:`rounded text-krona-green`}),`Отображать аватар/иконку в шапке`]}),(0,M.jsxs)(`div`,{className:`flex justify-end gap-2 pt-4 border-t border-krona-border`,children:[(0,M.jsx)(n,{variant:`outline`,size:`sm`,onClick:()=>B(null),children:`Отмена`}),(0,M.jsx)(n,{variant:`primary`,size:`sm`,onClick:()=>z&&J(z),children:`Сохранить параметры`})]})]})})]})};export{F as CardLayoutBuilder,F as default}; |