krona-front/dist/assets/CardLayoutBuilder-DiCqYVEZ.js

1 line
No EOL
18 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{l as s}from"./indexedDb-DZ-aRPMs.js";import{t as c}from"./clock-BelL0bvZ.js";import{t as l}from"./credit-card-6Y5eHPCw.js";import{t as u}from"./eye-CkF1gwUX.js";import{t as d}from"./list-XDoRqfJ2.js";import{n as f,t as p}from"./move-up-qiRY8MuU.js";import{t as m}from"./save-D8euL60I.js";import{t as h}from"./settings-2-CSojebrG.js";import{t as g}from"./user-CuEEaB8a.js";import{B as _,C as v,D as y,H as b,Y as x,a as S,et as C,f as w,n as T,tt as E}from"./index-CyHCRa3Z.js";import{t as D}from"./currency-DdDs82F5.js";var O={name:`activity`,size:24,node:[[`path`,{d:`M22 12h-2.48a2 2 0 0 0-1.93 1.46l-2.35 8.36a.25.25 0 0 1-.48 0L9.24 2.18a.25.25 0 0 0-.48 0l-2.35 8.36A2 2 0 0 1 4.49 12H2`,key:`169zse`}]]};O.node;var k=r(O),A={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`}]]};A.node;var j=r(A),M=t(e(),1),N=a(),P=[{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}],F={header:g,badges:k,fields_grid:y,timeline:c,tasks_notes:w,related_lists:d,attachments:j},I=()=>{let{entityCode:e}=E(),t=C(),{currentEntity:r,layouts:a,saveLayout:d}=b(e),{showToast:g}=o(),[O,k]=(0,M.useState)(P),[A,I]=(0,M.useState)(!1),[L,R]=(0,M.useState)(!1),[z,B]=(0,M.useState)(null),[V,H]=(0,M.useState)([]),[U,W]=(0,M.useState)(`demo`);(0,M.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,M.useEffect)(()=>{e&&s(e,{pageSize:10}).then(e=>{H(e.items),e.items.length>0&&W(e.items[0].id)})},[e]);let G=(0,M.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:O};await d(t),I(!1),g({type:`success`,title:`Макет карточки успешно сохранён`})}catch(e){g({type:`error`,title:`Ошибка сохранения карточки`,message:e instanceof Error?e.message:String(e)})}},X=(0,M.useMemo)(()=>r?.fields||[],[r]);return(0,N.jsxs)(`div`,{className:`space-y-4 animate-fade-in`,children:[(0,N.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,N.jsxs)(`div`,{className:`flex items-center gap-3`,children:[(0,N.jsxs)(n,{variant:`ghost`,size:`sm`,onClick:()=>t(`/settings/entities`),className:`p-1.5`,children:[(0,N.jsx)(_,{className:`w-4 h-4 mr-1`}),`Каталог`]}),(0,N.jsxs)(`div`,{children:[(0,N.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,N.jsx)(l,{className:`w-4 h-4 text-krona-info`}),(0,N.jsxs)(`h1`,{className:`text-base font-bold text-krona-primary`,children:[`Конструктор карточки: `,r?.name||e]}),A&&(0,N.jsx)(i,{variant:`warning`,size:`sm`,children:`Несохранённые изменения`})]}),(0,N.jsx)(`p`,{className:`text-xs text-krona-secondary`,children:`Настройка блочной структуры детальной карточки записи, таймлайна, бейджей и связанных списков`})]})]}),(0,N.jsxs)(`div`,{className:`flex items-center gap-2`,children:[V.length>0&&(0,N.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,N.jsx)(`option`,{value:e.id,children:String(e.name||e.id)},e.id))}),(0,N.jsxs)(n,{variant:L?`secondary`:`outline`,size:`sm`,onClick:()=>R(!L),children:[(0,N.jsx)(u,{className:`w-3.5 h-3.5 mr-1 text-krona-gold`}),L?`В редактор`:`Предпросмотр записи`]}),(0,N.jsxs)(n,{variant:`primary`,size:`sm`,onClick:Y,children:[(0,N.jsx)(m,{className:`w-3.5 h-3.5 mr-1`}),`Сохранить`]})]})]}),L?(0,N.jsxs)(`div`,{className:`max-w-5xl mx-auto space-y-4`,children:[(0,N.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,N.jsxs)(`span`,{children:[`Предпросмотр на записи: `,(0,N.jsx)(`strong`,{className:`text-krona-primary`,children:String(G.name||G.id)})]}),(0,N.jsx)(i,{variant:`gold`,size:`sm`,children:`Live DB Preview`})]}),(0,N.jsx)(`div`,{className:`grid grid-cols-1 md:grid-cols-3 gap-4`,children:O.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,N.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,N.jsxs)(`div`,{className:`flex items-center gap-3`,children:[e.settings?.showAvatar!==!1&&(0,N.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,N.jsxs)(`div`,{children:[(0,N.jsx)(`h2`,{className:`text-lg font-bold text-krona-primary`,children:String(G.name||`Без названия`)}),(0,N.jsxs)(`p`,{className:`text-xs font-mono text-krona-secondary`,children:[`ID: `,G.id,` • Тип: `,G.entityType]})]})]}),(0,N.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,N.jsx)(n,{variant:`outline`,size:`sm`,children:`Редактировать`}),(0,N.jsx)(n,{variant:`primary`,size:`sm`,children:`Действие`})]})]},e.id);case`badges`:return(0,N.jsxs)(`div`,{className:`${t} flex flex-wrap items-center gap-2 p-3 bg-krona-surface border border-krona-border rounded-xl`,children:[(0,N.jsx)(`span`,{className:`text-xs text-krona-secondary font-medium`,children:`Статус:`}),(0,N.jsx)(i,{variant:`green`,size:`md`,children:String(G.status||`В работе`)}),(0,N.jsx)(i,{variant:`gold`,size:`md`,children:`Приоритет: Высокий`}),(0,N.jsxs)(`span`,{className:`text-xs text-krona-secondary ml-auto`,children:[`Обновлено: `,x(String(G.updatedAt||new Date().toISOString()))]})]},e.id);case`fields_grid`:return(0,N.jsxs)(`div`,{className:`${t} p-4 bg-krona-surface border border-krona-border rounded-xl shadow-krona-soft space-y-3`,children:[(0,N.jsx)(`h3`,{className:`text-xs font-bold text-krona-primary uppercase tracking-wider`,children:e.title}),(0,N.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,N.jsxs)(`div`,{className:`p-2.5 bg-krona-workspace/60 rounded-lg border border-krona-border/50`,children:[(0,N.jsx)(`span`,{className:`text-[11px] text-krona-secondary block mb-0.5`,children:e.label}),(0,N.jsx)(`span`,{className:`font-medium text-krona-primary`,children:e.type===`money`?typeof t==`number`?D(t):`—`:typeof t==`boolean`?t?`Да`:`Нет`:t!=null&&t!==``?String(t):`—`})]},e.key)})})]},e.id);case`timeline`:return(0,N.jsxs)(`div`,{className:`${t} p-4 bg-krona-surface border border-krona-border rounded-xl shadow-krona-soft space-y-3`,children:[(0,N.jsxs)(`h3`,{className:`text-xs font-bold text-krona-primary uppercase tracking-wider flex items-center gap-1.5`,children:[(0,N.jsx)(c,{className:`w-3.5 h-3.5 text-krona-gold`}),e.title]}),(0,N.jsxs)(`div`,{className:`space-y-2.5 text-xs`,children:[(0,N.jsxs)(`div`,{className:`flex gap-2.5 items-start`,children:[(0,N.jsx)(`div`,{className:`w-2 h-2 rounded-full bg-krona-green mt-1.5 shrink-0`}),(0,N.jsxs)(`div`,{children:[(0,N.jsx)(`p`,{className:`font-medium text-krona-primary`,children:`Создана запись`}),(0,N.jsx)(`p`,{className:`text-[11px] text-krona-secondary`,children:x(String(G.created_at||new Date().toISOString()))})]})]}),(0,N.jsxs)(`div`,{className:`flex gap-2.5 items-start`,children:[(0,N.jsx)(`div`,{className:`w-2 h-2 rounded-full bg-krona-gold mt-1.5 shrink-0`}),(0,N.jsxs)(`div`,{children:[(0,N.jsx)(`p`,{className:`font-medium text-krona-primary`,children:`Статус изменён на «В работе»`}),(0,N.jsx)(`p`,{className:`text-[11px] text-krona-secondary`,children:x(String(G.updatedAt||new Date().toISOString()))})]})]})]})]},e.id);case`tasks_notes`:return(0,N.jsxs)(`div`,{className:`${t} p-4 bg-krona-surface border border-krona-border rounded-xl shadow-krona-soft space-y-3`,children:[(0,N.jsxs)(`h3`,{className:`text-xs font-bold text-krona-primary uppercase tracking-wider flex items-center gap-1.5`,children:[(0,N.jsx)(w,{className:`w-3.5 h-3.5 text-krona-green`}),e.title]}),(0,N.jsxs)(`div`,{className:`space-y-2 text-xs`,children:[(0,N.jsxs)(`label`,{className:`flex items-center gap-2 text-krona-primary`,children:[(0,N.jsx)(`input`,{type:`checkbox`,defaultChecked:!0,className:`rounded text-krona-green`}),(0,N.jsx)(`span`,{children:`Проверить реквизиты контрагента`})]}),(0,N.jsxs)(`label`,{className:`flex items-center gap-2 text-krona-primary`,children:[(0,N.jsx)(`input`,{type:`checkbox`,className:`rounded text-krona-green`}),(0,N.jsx)(`span`,{children:`Подписать договор у генерального директора`})]})]})]},e.id);case`related_lists`:return(0,N.jsxs)(`div`,{className:`${t} p-4 bg-krona-surface border border-krona-border rounded-xl shadow-krona-soft space-y-3`,children:[(0,N.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,N.jsx)(`h3`,{className:`text-xs font-bold text-krona-primary uppercase tracking-wider`,children:e.title}),(0,N.jsxs)(n,{variant:`ghost`,size:`sm`,className:`text-xs`,children:[(0,N.jsx)(v,{className:`w-3 h-3 mr-1`}),` Добавить`]})]}),(0,N.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,N.jsxs)(`div`,{className:`${t} p-4 bg-krona-surface border border-krona-border rounded-xl shadow-krona-soft space-y-3`,children:[(0,N.jsxs)(`h3`,{className:`text-xs font-bold text-krona-primary uppercase tracking-wider flex items-center gap-1.5`,children:[(0,N.jsx)(j,{className:`w-3.5 h-3.5 text-krona-info`}),e.title]}),(0,N.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,N.jsxs)(`div`,{className:`space-y-3`,children:[(0,N.jsxs)(`div`,{className:`flex items-center justify-between p-3 bg-krona-surface border border-krona-border rounded-xl`,children:[(0,N.jsx)(`span`,{className:`text-xs font-semibold text-krona-primary`,children:`Блоки макета карточки (Drag / Порядок отображения)`}),(0,N.jsxs)(`span`,{className:`text-xs text-krona-secondary`,children:[`Активных блоков: `,(0,N.jsx)(`strong`,{children:O.filter(e=>e.enabled).length}),` из`,` `,O.length]})]}),(0,N.jsx)(`div`,{className:`space-y-2`,children:O.map((e,t)=>{let r=F[e.type]||y;return(0,N.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,N.jsxs)(`div`,{className:`flex items-center gap-3 min-w-0`,children:[(0,N.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,N.jsx)(r,{className:`w-4 h-4 text-krona-green`})}),(0,N.jsxs)(`div`,{className:`min-w-0`,children:[(0,N.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,N.jsx)(`span`,{className:`text-sm font-semibold text-krona-primary truncate`,children:e.title}),(0,N.jsx)(i,{variant:`neutral`,size:`sm`,className:`font-mono text-[10px]`,children:e.type}),(0,N.jsxs)(i,{variant:`gold`,size:`sm`,className:`text-[10px]`,children:[`Ширина: `,e.columnSpan,`/3`]})]}),(0,N.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,N.jsxs)(`div`,{className:`flex items-center gap-2 shrink-0`,children:[(0,N.jsxs)(`label`,{className:`flex items-center gap-1.5 cursor-pointer text-xs text-krona-secondary mr-2`,children:[(0,N.jsx)(`input`,{type:`checkbox`,checked:e.enabled,onChange:()=>K(e.id),className:`rounded text-krona-green`}),`Включен`]}),(0,N.jsx)(n,{variant:`ghost`,size:`icon`,onClick:()=>B(e),title:`Настройки блока`,children:(0,N.jsx)(h,{className:`w-4 h-4 text-krona-secondary hover:text-krona-primary`})}),(0,N.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,N.jsx)(p,{className:`w-4 h-4`})}),(0,N.jsx)(`button`,{onClick:()=>q(t,t+1),disabled:t===O.length-1,className:`p-1.5 text-krona-secondary hover:text-krona-primary disabled:opacity-20`,title:`Переместить вниз`,children:(0,N.jsx)(f,{className:`w-4 h-4`})})]})]},e.id)})})]}),(0,N.jsx)(T,{isOpen:!!z,onClose:()=>B(null),title:z?`Настройки: ${z.title}`:`Настройки`,subtitle:`Тип блока: ${z?.type}`,width:`md`,children:z&&(0,N.jsxs)(`div`,{className:`space-y-4 text-xs`,children:[(0,N.jsx)(S,{label:`Заголовок блока`,value:z.title,onChange:e=>B(t=>t?{...t,title:e.target.value}:null)}),(0,N.jsxs)(`div`,{children:[(0,N.jsx)(`label`,{className:`text-xs font-semibold text-krona-primary block mb-1`,children:`Ширина блока (Количество колонок)`}),(0,N.jsx)(`div`,{className:`grid grid-cols-3 gap-2`,children:[1,2,3].map(e=>(0,N.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,N.jsxs)(`div`,{children:[(0,N.jsx)(`label`,{className:`text-xs font-semibold text-krona-primary block mb-1`,children:`Количество внутренних колонок сетки`}),(0,N.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,N.jsx)(`option`,{value:1,children:`1 колонка`}),(0,N.jsx)(`option`,{value:2,children:`2 колонки`}),(0,N.jsx)(`option`,{value:3,children:`3 колонки`})]})]}),z.type===`header`&&(0,N.jsxs)(`label`,{className:`flex items-center gap-2 cursor-pointer font-medium text-krona-primary`,children:[(0,N.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,N.jsxs)(`div`,{className:`flex justify-end gap-2 pt-4 border-t border-krona-border`,children:[(0,N.jsx)(n,{variant:`outline`,size:`sm`,onClick:()=>B(null),children:`Отмена`}),(0,N.jsx)(n,{variant:`primary`,size:`sm`,onClick:()=>z&&J(z),children:`Сохранить параметры`})]})]})})]})};export{I as CardLayoutBuilder,I as default};