diff --git a/dist/assets/AiCenterModule-BBao0YAQ.js b/dist/assets/AiCenterModule-BBao0YAQ.js new file mode 100644 index 0000000..ba86c65 --- /dev/null +++ b/dist/assets/AiCenterModule-BBao0YAQ.js @@ -0,0 +1 @@ +import{f as e,h as t,i as n,l as r,r as i,s as a,t as o,u as s}from"./useToast-CS8pZhce.js";import{t as c}from"./file-text-DR21jZDS.js";import{H as l,I as u,d,m as f,r as p,s as m,t as h,y as g}from"./index-CrJKtV0u.js";var _={name:`bot`,size:24,node:[[`path`,{d:`M12 8V4H8`,key:`hb8ula`}],[`rect`,{width:`16`,height:`12`,x:`4`,y:`8`,rx:`2`,key:`enze0r`}],[`path`,{d:`M2 14h2`,key:`vft8re`}],[`path`,{d:`M20 14h2`,key:`4cs60a`}],[`path`,{d:`M15 13v2`,key:`1xurst`}],[`path`,{d:`M9 13v2`,key:`rq6x2g`}]]};_.node;var v=r(_),y=t(e(),1),b=a(),x=[{id:`orch`,name:`Главный Оркестратор`,role:`Orchestrator`,description:`Декомпозирует бизнес-цели и распределяет задачи между агентами-специалистами`,tools:[`Task Delegator`,`Cross-module Context`,`Guardian Policy`],status:`active`,tasksCompleted:342},{id:`analyst`,name:`Бизнес-аналитик`,role:`BI & Financial Analyst`,description:`Анализирует чеки, food cost, маржинальность, динамику продаж и выявляет аномалии`,tools:[`SQL Query`,`Revenue Forecast`,`ABC Matrix`,`Shift Audit`],status:`active`,tasksCompleted:819},{id:`marketer`,name:`Бизнес-маркетолог`,role:`Growth & Retention`,description:`Генерирует контент-планы, офферы для рассылок, анализирует сегменты клиентов в зоне риска`,tools:[`Promo Engine`,`Telegram Bot Sender`,`Copywriter`,`Cohort Analysis`],status:`active`,tasksCompleted:420},{id:`warehouse_agent`,name:`Складской су-шеф`,role:`Supply Chain Agent`,description:`Мониторит критические остатки, сроки годности и формирует авто-заказы поставщикам`,tools:[`Supplier Auto-Order`,`Waste Tracker`,`Inventory Audit`],status:`active`,tasksCompleted:612}],S=[{title:`Food Cost и маржа за сегодня`,agentId:`analyst`,prompt:`Проанализируй Food Cost и маржинальность блюд текущей смены. Есть ли отклонения от нормы?`,tools:[`ReadPosOrders()`,`CalculateFoodCostVariance()`,`AuditStopList()`],result:`Анализ завершен: фактический Food Cost составил 29.4% (норма 30.0%). Позиция «Том Ям» показала маржу 68.5% из-за стабильных цен на тигровые креветки. Отклонений по граммовкам не зафиксировано.`,artifactTitle:`Отчет маржинальности смены #84`},{title:`Кампания возврата спящих гостей`,agentId:`marketer`,prompt:`Сформируй триггерную рассылку для гостей, не заказывавших более 30 дней. Предложи оффер с высокой конверсией.`,tools:[`ScanInactiveCustomers()`,`DraftPromoOffer()`,`EstimateBudget()`],result:`Сегмент «Спящие клиенты» насчитывает 248 контактов. Сформирован персонализированный оффер: «Сет Осенний со скидкой 20% + ролл Калифорния в подарок». Ожидаемый отклик: 18-22%.`,artifactTitle:`Проект кампании «Осенний возврат 2026»`},{title:`Контроль дефицита на складе`,agentId:`warehouse_agent`,prompt:`Проверь физические остатки ингредиентов с учетом броней на вечер. Какие позиции нужно заказать?`,tools:[`AuditStockBalances()`,`CheckReservationBOM()`,`CreatePurchaseDraft()`],result:`Критический остаток: «Сливочный сыр Cre действия» остался 4.2 кг при вечернем прогнозе 6.5 кг. Сформирован черновик закупки #PO-109 на 15 кг у поставщика «СибМолоко» со скидкой 5%.`,artifactTitle:`Черновик заявки поставщику #PO-109`},{title:`Аудит графика и переработок`,agentId:`orch`,prompt:`Проверь расписание смен сотрудников на текущую неделю. Есть ли нарушения нормативов ТК РФ?`,tools:[`ReadEmployeeShifts()`,`CheckLaborRegulations()`,`SuggestScheduleOptimization()`],result:`Выявлен 1 конфликт: сотрудник Артем Васильев назначен на смену 14 часов в пятницу (норма до 12 ч). Рекомендовано разделить смену с подменным официантом или сместить начало на 11:00.`,artifactTitle:`Акт проверки графиков ТК РФ`}],C=()=>{let{showToast:e}=o(),[t,r]=(0,y.useState)(`orch`),[a,_]=(0,y.useState)(``),[C,w]=(0,y.useState)(!1),[T,E]=(0,y.useState)(-1),[D,O]=(0,y.useState)([]),[k,A]=(0,y.useState)(null),[j,M]=(0,y.useState)([{id:`m-1`,sender:`ai`,text:`Здравствуйте! Я Главный Оркестратор Кроны. Моя команда специализированных агентов (Аналитик, Маркетолог, Складской су-шеф) готова помочь вам оптимизировать операционные процессы, найти точки роста выручки и предотвратить кассовые разрывы.`,time:`12:00`}]),N=x.find(e=>e.id===t)||x[0],P=e=>{r(e.agentId),I(e.prompt,e.tools,e.result,e.artifactTitle)},F=e=>{if(e.preventDefault(),!a.trim()||C)return;let t=a.trim();_(``),I(t,[`ReadWorkspaceContext()`,`QueryDatabaseEngine()`,`SynthesizeBusinessStrategy()`],`Агент «${N.name}» проанализировал ваш запрос «${t}». Все релевантные данные сверены с текущим состоянием касс, складов и CRM платформы. Предложен проект решения.`,`Аналитическая записка: ${t.slice(0,30)}...`)},I=(t,n,r,i)=>{let a={id:`u-${s()}`,sender:`user`,text:t,time:new Date().toLocaleTimeString(`ru-RU`,{hour:`2-digit`,minute:`2-digit`})};M(e=>[...e,a]),w(!0),O(n),E(0),setTimeout(()=>{E(1)},450),setTimeout(()=>{E(2)},900),setTimeout(()=>{w(!1),E(-1);let t={id:`ai-${Date.now()}`,sender:`ai`,text:r,time:new Date().toLocaleTimeString(`ru-RU`,{hour:`2-digit`,minute:`2-digit`}),toolsUsed:n,artifact:{title:i,type:`report`}};M(e=>[...e,t]),e({title:`ИИ-задача выполнена`,message:`Агент «${N.name}» завершил выполнение задачи`,type:`success`})},1350)};return(0,b.jsxs)(`div`,{className:`space-y-4 animate-fade-in`,children:[(0,b.jsxs)(`div`,{className:`p-3.5 rounded-xl border border-purple-400/50 bg-purple-500/10 text-purple-900 dark:text-purple-200 flex flex-col sm:flex-row sm:items-center justify-between gap-2 shadow-xs`,children:[(0,b.jsxs)(`div`,{className:`flex items-center gap-2.5`,children:[(0,b.jsx)(m,{className:`w-5 h-5 text-purple-600 shrink-0`}),(0,b.jsxs)(`div`,{className:`text-xs`,children:[(0,b.jsx)(`span`,{className:`font-bold block`,children:`Демонстрационный контур ИИ (Simulated AI Engine)`}),(0,b.jsx)(`span`,{className:`text-purple-800 dark:text-purple-300`,children:`ИИ-агенты симулируют автономное выполнение бизнес-сценариев, цепочки вызова инструментов (tool calls) и генерацию артефактов без реальных LLM API.`})]})]}),(0,b.jsx)(h,{level:`demo`,size:`sm`,className:`shrink-0`})]}),(0,b.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,b.jsxs)(`div`,{children:[(0,b.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,b.jsx)(`h2`,{className:`text-sm font-bold text-krona-primary`,children:`✦ Krona AI Center & Автономная бизнес-команда`}),(0,b.jsx)(h,{level:`demo`,size:`sm`}),(0,b.jsx)(i,{variant:`gold`,size:`sm`,children:`Крона Модель v1.8 Flash`})]}),(0,b.jsx)(`p`,{className:`text-xs text-krona-secondary mt-0.5`,children:`Специализированные агенты с прямым доступом к инструментам платформы, кассам и складским журналам`})]}),(0,b.jsxs)(`div`,{className:`flex items-center gap-2 text-xs`,children:[(0,b.jsx)(i,{variant:`green`,size:`md`,children:`4 агента активны`}),(0,b.jsx)(i,{variant:`neutral`,size:`md`,children:`Задач за день: 2 195`})]})]}),(0,b.jsxs)(`div`,{className:`space-y-2`,children:[(0,b.jsx)(`span`,{className:`text-[11px] font-bold text-krona-secondary uppercase tracking-wider block`,children:`Быстрые бизнес-запросы для руководства:`}),(0,b.jsx)(`div`,{className:`grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-4 gap-2.5`,children:S.map((e,t)=>(0,b.jsxs)(`button`,{disabled:C,onClick:()=>P(e),className:`p-3 text-left rounded-xl border border-krona-border bg-krona-surface hover:border-krona-gold hover:bg-krona-gold/5 transition-all text-xs space-y-1 group disabled:opacity-50`,children:[(0,b.jsxs)(`div`,{className:`font-bold text-krona-primary group-hover:text-krona-gold transition-colors flex items-center gap-1.5`,children:[(0,b.jsx)(f,{className:`w-3.5 h-3.5 text-krona-gold`}),(0,b.jsx)(`span`,{children:e.title})]}),(0,b.jsx)(`p`,{className:`text-[11px] text-krona-secondary line-clamp-2`,children:e.prompt})]},t))})]}),(0,b.jsxs)(`div`,{className:`grid grid-cols-1 lg:grid-cols-12 gap-4`,children:[(0,b.jsxs)(`div`,{className:`lg:col-span-4 bg-krona-surface border border-krona-border rounded-xl p-3.5 space-y-3 shadow-krona-soft`,children:[(0,b.jsx)(`span`,{className:`text-xs font-bold text-krona-primary uppercase tracking-wider block pb-2 border-b border-krona-border`,children:`Команда ИИ-агентов`}),(0,b.jsx)(`div`,{className:`space-y-2`,children:x.map(e=>{let n=e.id===t;return(0,b.jsxs)(`div`,{onClick:()=>r(e.id),className:`p-3 rounded-xl border transition-all cursor-pointer select-none space-y-2 ${n?`border-krona-gold bg-krona-gold/5 shadow-xs`:`border-krona-border bg-krona-workspace hover:border-krona-border-strong`}`,children:[(0,b.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,b.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,b.jsx)(`div`,{className:`p-2 rounded-lg bg-krona-surface border border-krona-border text-krona-gold`,children:(0,b.jsx)(v,{className:`w-4 h-4`})}),(0,b.jsxs)(`div`,{children:[(0,b.jsx)(`h4`,{className:`text-xs font-bold text-krona-primary`,children:e.name}),(0,b.jsx)(`span`,{className:`text-[10px] text-krona-secondary`,children:e.role})]})]}),(0,b.jsx)(i,{variant:`green`,size:`sm`,children:`Online`})]}),(0,b.jsx)(`p`,{className:`text-[11px] text-krona-secondary leading-snug`,children:e.description}),(0,b.jsxs)(`div`,{className:`flex items-center justify-between pt-1 border-t border-krona-border/50 text-[10px] text-krona-secondary`,children:[(0,b.jsxs)(`span`,{children:[`Инструментов: `,e.tools.length]}),(0,b.jsxs)(`span`,{className:`font-mono font-bold text-krona-primary`,children:[e.tasksCompleted,` задач`]})]})]},e.id)})})]}),(0,b.jsxs)(`div`,{className:`lg:col-span-8 bg-krona-surface border border-krona-border rounded-xl shadow-krona-soft flex flex-col h-[540px] overflow-hidden`,children:[(0,b.jsxs)(`div`,{className:`p-3 border-b border-krona-border bg-krona-workspace flex items-center justify-between text-xs`,children:[(0,b.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,b.jsx)(`span`,{className:`w-2 h-2 rounded-full bg-emerald-500`}),(0,b.jsxs)(`span`,{className:`font-bold text-krona-primary`,children:[`Чат с агентом: `,N.name,` (`,N.role,`)`]})]}),(0,b.jsx)(`span`,{className:`text-[11px] text-krona-secondary`,children:`Память контекста: Активна`})]}),(0,b.jsxs)(`div`,{className:`flex-1 p-4 overflow-y-auto space-y-3.5 text-xs`,children:[j.map(e=>(0,b.jsxs)(`div`,{className:`flex flex-col ${e.sender===`user`?`items-end`:`items-start`}`,children:[(0,b.jsxs)(`div`,{className:`p-3.5 rounded-xl max-w-[82%] leading-relaxed shadow-xs space-y-2 ${e.sender===`user`?`bg-[#2F684C] text-[#F8F6F0] rounded-br-none`:`bg-krona-workspace border border-krona-border text-krona-primary rounded-bl-none`}`,children:[(0,b.jsx)(`p`,{children:e.text}),e.toolsUsed&&e.toolsUsed.length>0&&(0,b.jsxs)(`div`,{className:`pt-2 border-t border-krona-border/50 space-y-1`,children:[(0,b.jsx)(`span`,{className:`text-[10px] text-krona-secondary font-semibold uppercase block`,children:`Выполненные шаги инструментов (Tool Calls):`}),(0,b.jsx)(`div`,{className:`flex flex-wrap gap-1`,children:e.toolsUsed.map((e,t)=>(0,b.jsxs)(`span`,{className:`inline-flex items-center gap-1 font-mono text-[10px] bg-krona-surface border border-krona-border px-2 py-0.5 rounded text-krona-primary`,children:[(0,b.jsx)(l,{className:`w-2.5 h-2.5 text-emerald-600`}),e]},t))})]}),e.artifact&&(0,b.jsx)(`div`,{className:`pt-2 border-t border-krona-border/50`,children:(0,b.jsxs)(`button`,{type:`button`,onClick:()=>A({title:e.artifact.title,content:e.text}),className:`inline-flex items-center gap-1.5 px-3 py-1.5 rounded-lg bg-krona-gold/15 text-krona-gold-text border border-krona-gold/30 hover:bg-krona-gold/25 transition-colors font-bold text-xs`,children:[(0,b.jsx)(c,{className:`w-3.5 h-3.5 text-krona-gold`}),(0,b.jsxs)(`span`,{children:[`Открыть сформированный артефакт: «`,e.artifact.title,`»`]}),(0,b.jsx)(u,{className:`w-3 h-3 ml-1 opacity-70`})]})})]}),(0,b.jsx)(`span`,{className:`text-[10px] text-krona-secondary mt-1 px-1`,children:e.time})]},e.id)),C&&(0,b.jsxs)(`div`,{className:`p-3 bg-krona-workspace border border-krona-gold/40 rounded-xl space-y-2 max-w-[80%] animate-pulse`,children:[(0,b.jsxs)(`div`,{className:`flex items-center gap-2 font-bold text-xs text-krona-gold`,children:[(0,b.jsx)(d,{className:`w-4 h-4`}),(0,b.jsxs)(`span`,{children:[`Агент «`,N.name,`» выполняет цепочку вызовов инструментов...`]})]}),(0,b.jsx)(`div`,{className:`space-y-1.5 font-mono text-[11px] text-krona-secondary`,children:D.map((e,t)=>(0,b.jsxs)(`div`,{className:`flex items-center gap-2`,children:[t_(e.target.value),placeholder:`Спросите агента «${N.name}» (например: "Рассчитай Food Cost за вчера")...`,className:`flex-1 bg-krona-surface border border-krona-border rounded-lg px-3 py-2 text-xs text-krona-primary placeholder:text-krona-secondary focus:outline-none focus:border-krona-green disabled:opacity-50`}),(0,b.jsxs)(n,{type:`submit`,variant:`gold`,size:`sm`,disabled:C||!a.trim(),className:`px-3 text-xs`,children:[(0,b.jsx)(g,{className:`w-3.5 h-3.5 mr-1`}),`Спросить AI`]})]})})]})]}),k&&(0,b.jsx)(p,{isOpen:!!k,onClose:()=>A(null),title:k.title,subtitle:`Сгенерированный артефакт ИИ-агента Кроны`,maxWidth:`md`,footer:(0,b.jsxs)(`div`,{className:`flex gap-2 w-full justify-between`,children:[(0,b.jsx)(n,{variant:`secondary`,size:`sm`,onClick:()=>{e({title:`Рекомендации применены`,message:`Настройки применены к операционному контуру заведения`,type:`success`}),A(null)},children:`Применить рекомендации в системе`}),(0,b.jsx)(n,{variant:`primary`,size:`sm`,onClick:()=>A(null),children:`Закрыть`})]}),children:(0,b.jsx)(`div`,{className:`space-y-3 text-xs`,children:(0,b.jsxs)(`div`,{className:`p-3.5 bg-krona-workspace rounded-xl border border-krona-border font-mono text-xs leading-relaxed space-y-2`,children:[(0,b.jsxs)(`div`,{className:`font-bold text-krona-primary pb-1 border-b border-krona-border/60 flex items-center justify-between`,children:[(0,b.jsx)(`span`,{children:k.title}),(0,b.jsx)(i,{variant:`gold`,size:`sm`,children:`Verified AI Plan`})]}),(0,b.jsx)(`p`,{className:`text-krona-primary`,children:k.content})]})})})]})};export{C as AiCenterModule}; \ No newline at end of file diff --git a/dist/assets/AiCenterModule-TWoGGfS0.js b/dist/assets/AiCenterModule-TWoGGfS0.js deleted file mode 100644 index 10d6f42..0000000 --- a/dist/assets/AiCenterModule-TWoGGfS0.js +++ /dev/null @@ -1 +0,0 @@ -import{f as e,h as t,i as n,l as r,r as i,s as a,t as o,u as s}from"./useToast-CS8pZhce.js";import{t as c}from"./file-text-DR21jZDS.js";import{t as l}from"./terminal-CcncyL3J.js";import{B as u,F as d,p as f,r as p,s as m,t as h,v as g}from"./index-CNnq9VO5.js";var _={name:`bot`,size:24,node:[[`path`,{d:`M12 8V4H8`,key:`hb8ula`}],[`rect`,{width:`16`,height:`12`,x:`4`,y:`8`,rx:`2`,key:`enze0r`}],[`path`,{d:`M2 14h2`,key:`vft8re`}],[`path`,{d:`M20 14h2`,key:`4cs60a`}],[`path`,{d:`M15 13v2`,key:`1xurst`}],[`path`,{d:`M9 13v2`,key:`rq6x2g`}]]};_.node;var v=r(_),y=t(e(),1),b=a(),x=[{id:`orch`,name:`Главный Оркестратор`,role:`Orchestrator`,description:`Декомпозирует бизнес-цели и распределяет задачи между агентами-специалистами`,tools:[`Task Delegator`,`Cross-module Context`,`Guardian Policy`],status:`active`,tasksCompleted:342},{id:`analyst`,name:`Бизнес-аналитик`,role:`BI & Financial Analyst`,description:`Анализирует чеки, food cost, маржинальность, динамику продаж и выявляет аномалии`,tools:[`SQL Query`,`Revenue Forecast`,`ABC Matrix`,`Shift Audit`],status:`active`,tasksCompleted:819},{id:`marketer`,name:`Бизнес-маркетолог`,role:`Growth & Retention`,description:`Генерирует контент-планы, офферы для рассылок, анализирует сегменты клиентов в зоне риска`,tools:[`Promo Engine`,`Telegram Bot Sender`,`Copywriter`,`Cohort Analysis`],status:`active`,tasksCompleted:420},{id:`warehouse_agent`,name:`Складской су-шеф`,role:`Supply Chain Agent`,description:`Мониторит критические остатки, сроки годности и формирует авто-заказы поставщикам`,tools:[`Supplier Auto-Order`,`Waste Tracker`,`Inventory Audit`],status:`active`,tasksCompleted:612}],S=[{title:`Food Cost и маржа за сегодня`,agentId:`analyst`,prompt:`Проанализируй Food Cost и маржинальность блюд текущей смены. Есть ли отклонения от нормы?`,tools:[`ReadPosOrders()`,`CalculateFoodCostVariance()`,`AuditStopList()`],result:`Анализ завершен: фактический Food Cost составил 29.4% (норма 30.0%). Позиция «Том Ям» показала маржу 68.5% из-за стабильных цен на тигровые креветки. Отклонений по граммовкам не зафиксировано.`,artifactTitle:`Отчет маржинальности смены #84`},{title:`Кампания возврата спящих гостей`,agentId:`marketer`,prompt:`Сформируй триггерную рассылку для гостей, не заказывавших более 30 дней. Предложи оффер с высокой конверсией.`,tools:[`ScanInactiveCustomers()`,`DraftPromoOffer()`,`EstimateBudget()`],result:`Сегмент «Спящие клиенты» насчитывает 248 контактов. Сформирован персонализированный оффер: «Сет Осенний со скидкой 20% + ролл Калифорния в подарок». Ожидаемый отклик: 18-22%.`,artifactTitle:`Проект кампании «Осенний возврат 2026»`},{title:`Контроль дефицита на складе`,agentId:`warehouse_agent`,prompt:`Проверь физические остатки ингредиентов с учетом броней на вечер. Какие позиции нужно заказать?`,tools:[`AuditStockBalances()`,`CheckReservationBOM()`,`CreatePurchaseDraft()`],result:`Критический остаток: «Сливочный сыр Cre действия» остался 4.2 кг при вечернем прогнозе 6.5 кг. Сформирован черновик закупки #PO-109 на 15 кг у поставщика «СибМолоко» со скидкой 5%.`,artifactTitle:`Черновик заявки поставщику #PO-109`},{title:`Аудит графика и переработок`,agentId:`orch`,prompt:`Проверь расписание смен сотрудников на текущую неделю. Есть ли нарушения нормативов ТК РФ?`,tools:[`ReadEmployeeShifts()`,`CheckLaborRegulations()`,`SuggestScheduleOptimization()`],result:`Выявлен 1 конфликт: сотрудник Артем Васильев назначен на смену 14 часов в пятницу (норма до 12 ч). Рекомендовано разделить смену с подменным официантом или сместить начало на 11:00.`,artifactTitle:`Акт проверки графиков ТК РФ`}],C=()=>{let{showToast:e}=o(),[t,r]=(0,y.useState)(`orch`),[a,_]=(0,y.useState)(``),[C,w]=(0,y.useState)(!1),[T,E]=(0,y.useState)(-1),[D,O]=(0,y.useState)([]),[k,A]=(0,y.useState)(null),[j,M]=(0,y.useState)([{id:`m-1`,sender:`ai`,text:`Здравствуйте! Я Главный Оркестратор Кроны. Моя команда специализированных агентов (Аналитик, Маркетолог, Складской су-шеф) готова помочь вам оптимизировать операционные процессы, найти точки роста выручки и предотвратить кассовые разрывы.`,time:`12:00`}]),N=x.find(e=>e.id===t)||x[0],P=e=>{r(e.agentId),I(e.prompt,e.tools,e.result,e.artifactTitle)},F=e=>{if(e.preventDefault(),!a.trim()||C)return;let t=a.trim();_(``),I(t,[`ReadWorkspaceContext()`,`QueryDatabaseEngine()`,`SynthesizeBusinessStrategy()`],`Агент «${N.name}» проанализировал ваш запрос «${t}». Все релевантные данные сверены с текущим состоянием касс, складов и CRM платформы. Предложен проект решения.`,`Аналитическая записка: ${t.slice(0,30)}...`)},I=(t,n,r,i)=>{let a={id:`u-${s()}`,sender:`user`,text:t,time:new Date().toLocaleTimeString(`ru-RU`,{hour:`2-digit`,minute:`2-digit`})};M(e=>[...e,a]),w(!0),O(n),E(0),setTimeout(()=>{E(1)},450),setTimeout(()=>{E(2)},900),setTimeout(()=>{w(!1),E(-1);let t={id:`ai-${Date.now()}`,sender:`ai`,text:r,time:new Date().toLocaleTimeString(`ru-RU`,{hour:`2-digit`,minute:`2-digit`}),toolsUsed:n,artifact:{title:i,type:`report`}};M(e=>[...e,t]),e({title:`ИИ-задача выполнена`,message:`Агент «${N.name}» завершил выполнение задачи`,type:`success`})},1350)};return(0,b.jsxs)(`div`,{className:`space-y-4 animate-fade-in`,children:[(0,b.jsxs)(`div`,{className:`p-3.5 rounded-xl border border-purple-400/50 bg-purple-500/10 text-purple-900 dark:text-purple-200 flex flex-col sm:flex-row sm:items-center justify-between gap-2 shadow-xs`,children:[(0,b.jsxs)(`div`,{className:`flex items-center gap-2.5`,children:[(0,b.jsx)(m,{className:`w-5 h-5 text-purple-600 shrink-0`}),(0,b.jsxs)(`div`,{className:`text-xs`,children:[(0,b.jsx)(`span`,{className:`font-bold block`,children:`Демонстрационный контур ИИ (Simulated AI Engine)`}),(0,b.jsx)(`span`,{className:`text-purple-800 dark:text-purple-300`,children:`ИИ-агенты симулируют автономное выполнение бизнес-сценариев, цепочки вызова инструментов (tool calls) и генерацию артефактов без реальных LLM API.`})]})]}),(0,b.jsx)(h,{level:`demo`,size:`sm`,className:`shrink-0`})]}),(0,b.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,b.jsxs)(`div`,{children:[(0,b.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,b.jsx)(`h2`,{className:`text-sm font-bold text-krona-primary`,children:`✦ Krona AI Center & Автономная бизнес-команда`}),(0,b.jsx)(h,{level:`demo`,size:`sm`}),(0,b.jsx)(i,{variant:`gold`,size:`sm`,children:`Крона Модель v1.8 Flash`})]}),(0,b.jsx)(`p`,{className:`text-xs text-krona-secondary mt-0.5`,children:`Специализированные агенты с прямым доступом к инструментам платформы, кассам и складским журналам`})]}),(0,b.jsxs)(`div`,{className:`flex items-center gap-2 text-xs`,children:[(0,b.jsx)(i,{variant:`green`,size:`md`,children:`4 агента активны`}),(0,b.jsx)(i,{variant:`neutral`,size:`md`,children:`Задач за день: 2 195`})]})]}),(0,b.jsxs)(`div`,{className:`space-y-2`,children:[(0,b.jsx)(`span`,{className:`text-[11px] font-bold text-krona-secondary uppercase tracking-wider block`,children:`Быстрые бизнес-запросы для руководства:`}),(0,b.jsx)(`div`,{className:`grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-4 gap-2.5`,children:S.map((e,t)=>(0,b.jsxs)(`button`,{disabled:C,onClick:()=>P(e),className:`p-3 text-left rounded-xl border border-krona-border bg-krona-surface hover:border-krona-gold hover:bg-krona-gold/5 transition-all text-xs space-y-1 group disabled:opacity-50`,children:[(0,b.jsxs)(`div`,{className:`font-bold text-krona-primary group-hover:text-krona-gold transition-colors flex items-center gap-1.5`,children:[(0,b.jsx)(f,{className:`w-3.5 h-3.5 text-krona-gold`}),(0,b.jsx)(`span`,{children:e.title})]}),(0,b.jsx)(`p`,{className:`text-[11px] text-krona-secondary line-clamp-2`,children:e.prompt})]},t))})]}),(0,b.jsxs)(`div`,{className:`grid grid-cols-1 lg:grid-cols-12 gap-4`,children:[(0,b.jsxs)(`div`,{className:`lg:col-span-4 bg-krona-surface border border-krona-border rounded-xl p-3.5 space-y-3 shadow-krona-soft`,children:[(0,b.jsx)(`span`,{className:`text-xs font-bold text-krona-primary uppercase tracking-wider block pb-2 border-b border-krona-border`,children:`Команда ИИ-агентов`}),(0,b.jsx)(`div`,{className:`space-y-2`,children:x.map(e=>{let n=e.id===t;return(0,b.jsxs)(`div`,{onClick:()=>r(e.id),className:`p-3 rounded-xl border transition-all cursor-pointer select-none space-y-2 ${n?`border-krona-gold bg-krona-gold/5 shadow-xs`:`border-krona-border bg-krona-workspace hover:border-krona-border-strong`}`,children:[(0,b.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,b.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,b.jsx)(`div`,{className:`p-2 rounded-lg bg-krona-surface border border-krona-border text-krona-gold`,children:(0,b.jsx)(v,{className:`w-4 h-4`})}),(0,b.jsxs)(`div`,{children:[(0,b.jsx)(`h4`,{className:`text-xs font-bold text-krona-primary`,children:e.name}),(0,b.jsx)(`span`,{className:`text-[10px] text-krona-secondary`,children:e.role})]})]}),(0,b.jsx)(i,{variant:`green`,size:`sm`,children:`Online`})]}),(0,b.jsx)(`p`,{className:`text-[11px] text-krona-secondary leading-snug`,children:e.description}),(0,b.jsxs)(`div`,{className:`flex items-center justify-between pt-1 border-t border-krona-border/50 text-[10px] text-krona-secondary`,children:[(0,b.jsxs)(`span`,{children:[`Инструментов: `,e.tools.length]}),(0,b.jsxs)(`span`,{className:`font-mono font-bold text-krona-primary`,children:[e.tasksCompleted,` задач`]})]})]},e.id)})})]}),(0,b.jsxs)(`div`,{className:`lg:col-span-8 bg-krona-surface border border-krona-border rounded-xl shadow-krona-soft flex flex-col h-[540px] overflow-hidden`,children:[(0,b.jsxs)(`div`,{className:`p-3 border-b border-krona-border bg-krona-workspace flex items-center justify-between text-xs`,children:[(0,b.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,b.jsx)(`span`,{className:`w-2 h-2 rounded-full bg-emerald-500`}),(0,b.jsxs)(`span`,{className:`font-bold text-krona-primary`,children:[`Чат с агентом: `,N.name,` (`,N.role,`)`]})]}),(0,b.jsx)(`span`,{className:`text-[11px] text-krona-secondary`,children:`Память контекста: Активна`})]}),(0,b.jsxs)(`div`,{className:`flex-1 p-4 overflow-y-auto space-y-3.5 text-xs`,children:[j.map(e=>(0,b.jsxs)(`div`,{className:`flex flex-col ${e.sender===`user`?`items-end`:`items-start`}`,children:[(0,b.jsxs)(`div`,{className:`p-3.5 rounded-xl max-w-[82%] leading-relaxed shadow-xs space-y-2 ${e.sender===`user`?`bg-[#2F684C] text-[#F8F6F0] rounded-br-none`:`bg-krona-workspace border border-krona-border text-krona-primary rounded-bl-none`}`,children:[(0,b.jsx)(`p`,{children:e.text}),e.toolsUsed&&e.toolsUsed.length>0&&(0,b.jsxs)(`div`,{className:`pt-2 border-t border-krona-border/50 space-y-1`,children:[(0,b.jsx)(`span`,{className:`text-[10px] text-krona-secondary font-semibold uppercase block`,children:`Выполненные шаги инструментов (Tool Calls):`}),(0,b.jsx)(`div`,{className:`flex flex-wrap gap-1`,children:e.toolsUsed.map((e,t)=>(0,b.jsxs)(`span`,{className:`inline-flex items-center gap-1 font-mono text-[10px] bg-krona-surface border border-krona-border px-2 py-0.5 rounded text-krona-primary`,children:[(0,b.jsx)(u,{className:`w-2.5 h-2.5 text-emerald-600`}),e]},t))})]}),e.artifact&&(0,b.jsx)(`div`,{className:`pt-2 border-t border-krona-border/50`,children:(0,b.jsxs)(`button`,{type:`button`,onClick:()=>A({title:e.artifact.title,content:e.text}),className:`inline-flex items-center gap-1.5 px-3 py-1.5 rounded-lg bg-krona-gold/15 text-krona-gold-text border border-krona-gold/30 hover:bg-krona-gold/25 transition-colors font-bold text-xs`,children:[(0,b.jsx)(c,{className:`w-3.5 h-3.5 text-krona-gold`}),(0,b.jsxs)(`span`,{children:[`Открыть сформированный артефакт: «`,e.artifact.title,`»`]}),(0,b.jsx)(d,{className:`w-3 h-3 ml-1 opacity-70`})]})})]}),(0,b.jsx)(`span`,{className:`text-[10px] text-krona-secondary mt-1 px-1`,children:e.time})]},e.id)),C&&(0,b.jsxs)(`div`,{className:`p-3 bg-krona-workspace border border-krona-gold/40 rounded-xl space-y-2 max-w-[80%] animate-pulse`,children:[(0,b.jsxs)(`div`,{className:`flex items-center gap-2 font-bold text-xs text-krona-gold`,children:[(0,b.jsx)(l,{className:`w-4 h-4`}),(0,b.jsxs)(`span`,{children:[`Агент «`,N.name,`» выполняет цепочку вызовов инструментов...`]})]}),(0,b.jsx)(`div`,{className:`space-y-1.5 font-mono text-[11px] text-krona-secondary`,children:D.map((e,t)=>(0,b.jsxs)(`div`,{className:`flex items-center gap-2`,children:[t_(e.target.value),placeholder:`Спросите агента «${N.name}» (например: "Рассчитай Food Cost за вчера")...`,className:`flex-1 bg-krona-surface border border-krona-border rounded-lg px-3 py-2 text-xs text-krona-primary placeholder:text-krona-secondary focus:outline-none focus:border-krona-green disabled:opacity-50`}),(0,b.jsxs)(n,{type:`submit`,variant:`gold`,size:`sm`,disabled:C||!a.trim(),className:`px-3 text-xs`,children:[(0,b.jsx)(g,{className:`w-3.5 h-3.5 mr-1`}),`Спросить AI`]})]})})]})]}),k&&(0,b.jsx)(p,{isOpen:!!k,onClose:()=>A(null),title:k.title,subtitle:`Сгенерированный артефакт ИИ-агента Кроны`,maxWidth:`md`,footer:(0,b.jsxs)(`div`,{className:`flex gap-2 w-full justify-between`,children:[(0,b.jsx)(n,{variant:`secondary`,size:`sm`,onClick:()=>{e({title:`Рекомендации применены`,message:`Настройки применены к операционному контуру заведения`,type:`success`}),A(null)},children:`Применить рекомендации в системе`}),(0,b.jsx)(n,{variant:`primary`,size:`sm`,onClick:()=>A(null),children:`Закрыть`})]}),children:(0,b.jsx)(`div`,{className:`space-y-3 text-xs`,children:(0,b.jsxs)(`div`,{className:`p-3.5 bg-krona-workspace rounded-xl border border-krona-border font-mono text-xs leading-relaxed space-y-2`,children:[(0,b.jsxs)(`div`,{className:`font-bold text-krona-primary pb-1 border-b border-krona-border/60 flex items-center justify-between`,children:[(0,b.jsx)(`span`,{children:k.title}),(0,b.jsx)(i,{variant:`gold`,size:`sm`,children:`Verified AI Plan`})]}),(0,b.jsx)(`p`,{className:`text-krona-primary`,children:k.content})]})})})]})};export{C as AiCenterModule}; \ No newline at end of file diff --git a/dist/assets/AnalyticsModule-DwAY229b.js b/dist/assets/AnalyticsModule-xduYpRUy.js similarity index 97% rename from dist/assets/AnalyticsModule-DwAY229b.js rename to dist/assets/AnalyticsModule-xduYpRUy.js index 049230b..1719276 100644 --- a/dist/assets/AnalyticsModule-DwAY229b.js +++ b/dist/assets/AnalyticsModule-xduYpRUy.js @@ -1 +1 @@ -import{f as e,h as t,o as n,r,s as i}from"./useToast-CS8pZhce.js";import{t as a}from"./dollar-sign-Bf6JneNn.js";import{G as o,c as s,i as c,o as l,t as u}from"./index-CNnq9VO5.js";import{n as d,t as f}from"./formatters-WvGQLZg0.js";import{$ as p,A as m,At as h,B as g,C as _,Ct as v,D as y,Dt as b,E as x,Et as S,F as C,G as w,H as T,I as E,J as D,K as ee,L as te,M as ne,N as re,O as ie,Ot as O,P as ae,Q as oe,R as se,S as ce,St as le,T as ue,Tt as k,U as de,V as fe,W as pe,X as me,Y as he,Z as ge,_ as _e,_t as A,a as ve,at as ye,b as be,bt as j,c as xe,ct as M,d as Se,dt as Ce,et as we,f as Te,ft as Ee,g as De,gt as Oe,h as ke,ht as Ae,i as je,it as N,j as Me,k as Ne,kt as Pe,l as Fe,lt as Ie,m as Le,mt as Re,n as ze,nt as Be,o as Ve,ot as He,p as Ue,pt as We,q as Ge,r as Ke,rt as qe,s as Je,st as Ye,t as Xe,tt as P,u as Ze,ut as Qe,v as $e,vt as F,w as et,wt as tt,x as nt,xt as I,y as rt,yt as L,z as it}from"./AreaChart-BnzyacT3.js";var R=e=>null;R.displayName=`Cell`;var at=e=>e.graphicalItems.polarItems,ot=F([P,we],ee),z=F([at,D,ot],de),st=F([z],T),B=F([st,N],g),ct=F([B,D,z],te);F([B,D,z],(e,t,n)=>n.length>0?e.flatMap(e=>n.flatMap(n=>({value:A(e,t.dataKey??n.dataKey),errorDomain:[]}))).filter(Boolean):t?.dataKey==null?e.map(e=>({value:e,errorDomain:[]})):e.map(e=>({value:A(e,t.dataKey),errorDomain:[]})));var V=()=>void 0,lt=F([B,D,z,Ge,P,ye],fe),ut=F([D,he,me,V,lt,V,Qe,P],w),H=F([D,Qe,B,ct,qe,P,ut],se),dt=F([H,oe,ge],pe),ft=F([D,H,dt,P],it);F([ge,ft],p);function U(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter(function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable})),n.push.apply(n,r)}return n}function pt(e){for(var t=1;tt],(e,t)=>e.filter(e=>e.type===`pie`).find(e=>e.id===t)),_t=[],G=(e,t,n)=>n?.length===0?_t:n,vt=F([N,W,G],(e,t,n)=>{var r=e.chartData;if(t!=null){var i=t?.data!=null&&t.data.length>0?t.data:r;if((!i||!i.length)&&n!=null&&(i=n.map(e=>pt(pt({},t.presentationProps),e.props))),i!=null)return i}}),yt=F([vt,W,G],(e,t,n)=>{if(e!=null&&t!=null)return e.map((e,r)=>{var i,a=A(e,t.nameKey,t.name),o=n!=null&&(i=n[r])!=null&&(i=i.props)!=null&&i.fill?n[r].props.fill:typeof e==`object`&&e&&`fill`in e?e.fill:t.fill;return{value:Oe(a,t.dataKey),dataKey:t.dataKey,color:o,payload:e,type:t.legendType}})}),bt=F([vt,W,G,We],(e,t,n,r)=>{if(t!=null&&e!=null)return Kt({offset:r,pieSettings:t,displayedData:e,cells:n})}),xt=(e,t,n)=>{var r=L();return(i,a)=>o=>{e?.(i,a,o),r(E({activeIndex:String(a),activeDataKey:t,activeCoordinate:i.tooltipPosition,activeGraphicalItemId:n}))}},St=e=>{var t=L();return(n,r)=>i=>{e?.(n,r,i),t(ae())}},Ct=(e,t,n)=>{var r=L();return(i,a)=>o=>{e?.(i,a,o),r(C({activeIndex:String(a),activeDataKey:t,activeCoordinate:i.tooltipPosition,activeGraphicalItemId:n}))}},K=t(e()),wt=[`key`],Tt=[`onMouseEnter`,`onClick`,`onMouseLeave`],Et=[`id`],Dt=[`id`];function q(){return q=Object.assign?Object.assign.bind():function(e){for(var t=1;tce(e.children,R),[e.children]),n=j(n=>yt(n,e.id,t));return n==null?null:K.createElement(rt,{legendPayload:n})}function Ft(e){if(e!=null&&typeof e!=`boolean`&&typeof e!=`function`){if(K.isValidElement(e)){var t=e.props?.fill;return typeof t==`string`?t:void 0}var n=e.fill;return typeof n==`string`?n:void 0}}var It=K.memo(e=>{var t=e.dataKey,n=e.nameKey,r=e.sectors,i=e.stroke,a=e.strokeWidth,o=e.fill,s=e.name,c=e.hide,l=e.tooltipType,u=e.formatter,d=e.id,f=e.activeShape,p=Ft(f),m={dataDefinedOnItem:r.map(e=>{var t=e.tooltipPayload;return p==null||t==null?t:t.map(e=>Y(Y({},e),{},{color:p,fill:p}))}),getPosition:e=>r[Number(e)]?.tooltipPosition,settings:{stroke:i,strokeWidth:a,fill:o,dataKey:t,nameKey:n,name:Oe(s,t),hide:c,type:l,color:o,unit:``,formatter:u,graphicalItemId:d}};return K.createElement(be,{tooltipEntrySettings:m})}),Lt=(e,t)=>e>t?`start`:ev(typeof t==`function`?t(e):t,n,n*.8),zt=(e,t,n)=>{var r=t.top,i=t.left,a=t.width,o=t.height,s=Ye(a,o);return{cx:i+v(e.cx,a,a/2),cy:r+v(e.cy,o,o/2),innerRadius:v(e.innerRadius,s,0),outerRadius:Rt(n,e.outerRadius,s),maxRadius:e.maxRadius||Math.sqrt(a*a+o*o)/2}},Bt=(e,t)=>S(t-e)*Math.min(Math.abs(t-e),360),Vt=(e,t)=>{if(K.isValidElement(e))return K.cloneElement(e,t);if(typeof e==`function`)return e(t);var r=n(`recharts-pie-label-line`,typeof e==`boolean`?``:e.className);t.key;var i=J(t,wt);return K.createElement(Ie,q({},i,{type:`linear`,className:r}))},Ht=(e,t,r)=>{if(K.isValidElement(e))return K.cloneElement(e,t);var i=r;if(typeof e==`function`&&(i=e(t),K.isValidElement(i)))return i;var a=n(`recharts-pie-label-text`,_(e));return K.createElement(y,q({},t,{alignmentBaseline:`middle`,className:a}),i)};function Ut(e){var t=e.sectors,n=e.props,r=e.showLabels,i=n.label,a=n.labelLine,o=n.dataKey;if(!r||!i||!t)return null;var s=Pe(n),c=h(i),l=h(a),u=typeof i==`object`&&`offsetRadius`in i&&typeof i.offsetRadius==`number`&&i.offsetRadius||20,d=t.map((e,t)=>{var n=(e.startAngle+e.endAngle)/2,r=M(e.cx,e.cy,e.outerRadius+u,n),d=Y(Y(Y(Y({},s),e),{},{stroke:`none`},c),{},{index:t,textAnchor:Lt(r.x,e.cx)},r),f=Y(Y(Y(Y({},s),e),{},{fill:`none`,stroke:e.fill},l),{},{index:t,points:[M(e.cx,e.cy,e.outerRadius,n),r],key:`line`});return K.createElement(m,{zIndex:Be.label,key:`label-${e.startAngle}-${e.endAngle}-${e.midAngle}-${t}`},K.createElement(O,null,a&&Vt(a,f),Ht(i,d,A(e,o))))});return K.createElement(O,{className:`recharts-pie-labels`},d)}function Wt(e){var t=e.sectors,n=e.props,r=e.showLabels,i=n.label;return typeof i==`object`&&i&&`position`in i?K.createElement(et,{label:i}):K.createElement(Ut,{sectors:t,props:n,showLabels:r})}function Gt(e){var t=e.sectors,n=e.activeShape,r=e.inactiveShape,i=e.allOtherPieProps,a=e.shape,o=e.id,s=e.animationElapsedTime,c=e.isAnimating,l=e.isEntrance,u=j(re),d=j(Me),f=j(ne),p=i.onMouseEnter,m=i.onClick,h=i.onMouseLeave,g=J(i,Tt),_=xt(p,i.dataKey,o),v=St(h),y=Ct(m,i.dataKey,o);return t==null||t.length===0?null:K.createElement(K.Fragment,null,t.map((e,p)=>{if(e?.startAngle===0&&e?.endAngle===0&&t.length!==1)return null;var m=f==null||f===o,h=String(p)===u&&(d==null||i.dataKey===d)&&m,b=n&&h?n:u?r:null,x=Y(Y({},e),{},{stroke:e.stroke,tabIndex:-1,index:p,isActive:h,animationElapsedTime:s,isAnimating:c,isEntrance:l,[Ae]:p,[Re]:o});return K.createElement(O,q({key:`sector-${e?.startAngle}-${e?.endAngle}-${e.midAngle}-${p}`,tabIndex:-1,className:`recharts-pie-sector`},le(g,e,p),{onMouseEnter:_(e,p),onMouseLeave:v(e,p),onClick:y(e,p)}),K.createElement(nt,{option:b??a,DefaultShape:Nt,shapeProps:x}))}))}function Kt(e){var t=e.pieSettings,n=e.displayedData,r=e.cells,i=e.offset,a=t.cornerRadius,o=t.startAngle,s=t.endAngle,c=t.dataKey,l=t.nameKey,u=t.tooltipType,d=Math.abs(t.minAngle),f=Bt(o,s),p=Math.abs(f),m=n.length<=1?0:t.paddingAngle??0,h=n.filter(e=>A(e,c,0)!==0).length,g=(p>=360?h:h-1)*m,_=n.reduce((e,t)=>{var n=A(t,c,0);return e+(k(n)?n:0)},0),v=d>0&&_>0&&n.some(e=>{var t=A(e,c,0),n=(k(t)?t:0)/_;return t!==0&&n*p0){var x;b=n.map((e,n)=>{var s=A(e,c,0),d=A(e,l,n),p=zt(t,i,e),h=(k(s)?s:0)/_,g,b=Y(Y({},e),r&&r[n]&&r[n].props),C=b!=null&&`fill`in b&&typeof b.fill==`string`?b.fill:t.fill;g=n?x.endAngle+S(f)*m*(s===0?0:1):o;var w=g+S(f)*((s===0?0:v)+h*y),T=(g+w)/2,E=(p.innerRadius+p.outerRadius)/2,D=[{name:d,value:s,payload:b,dataKey:c,type:u,color:C,fill:C,graphicalItemId:t.id}],ee=M(p.cx,p.cy,E,T);return x=Y(Y(Y(Y({},t.presentationProps),{},{percent:h,cornerRadius:typeof a==`string`?parseFloat(a):a,name:d,tooltipPayload:D,midAngle:T,middleRadius:E,tooltipPosition:ee},b),p),{},{value:s,dataKey:c,startAngle:g,endAngle:w,payload:b,paddingAngle:s===0?0:S(f)*m}),x})}return b}function qt(e){var t=e.showLabels,n=e.sectors,r=e.children,i=(0,K.useMemo)(()=>!t||!n?[]:n.map(e=>({value:e.value,payload:e.payload,clockWise:!1,parentViewBox:void 0,viewBox:{cx:e.cx,cy:e.cy,innerRadius:e.innerRadius,outerRadius:e.outerRadius,startAngle:e.startAngle,endAngle:e.endAngle,clockWise:!1},fill:e.fill})),[n,t]);return K.createElement(ue,{value:t?i:void 0},r)}var Jt=(e,t)=>{if(e==null)return[];var n=[],r=e.find(e=>e.status!==`removed`),i=r?r.next.startAngle:0;return e.forEach((e,r)=>{if(e.status!==`removed`){var a=r>0?b(e.next,`paddingAngle`,0):0;if(e.status===`matched`){var o=tt(e.prev.endAngle-e.prev.startAngle,e.next.endAngle-e.next.startAngle,t),s=Y(Y({},e.next),{},{startAngle:i+a,endAngle:i+o+a});n.push(s),i=s.endAngle}else{var c=tt(0,e.next.endAngle-e.next.startAngle,t),l=Y(Y({},e.next),{},{startAngle:i+a,endAngle:i+c+a});n.push(l),i=l.endAngle}}}),n};function Yt(e){var t=e.props,n=e.previousSectorsRef,r=e.id,i=t.sectors,a=t.activeShape,o=t.inactiveShape,s=t.animationInterpolateFn,c=_e(t.onAnimationStart,t.onAnimationEnd),l=c.isAnimating,u=c.handleAnimationStart,d=c.handleAnimationEnd,f=Ce();if(f==null)return null;var p=i[0];return K.createElement(qt,{showLabels:!l,sectors:i},K.createElement(De,{animationInput:t,animationIdPrefix:`recharts-pie-`,items:i,previousItemsRef:n,isAnimationActive:t.isAnimationActive,animationBegin:t.animationBegin,animationDuration:t.animationDuration,animationEasing:t.animationEasing,onAnimationStart:u,onAnimationEnd:d,animationInterpolateFn:s,animationMatchBy:t.animationMatchBy,layout:f},(e,n,i)=>K.createElement(O,null,K.createElement(Gt,{sectors:e,activeShape:a,inactiveShape:o,allOtherPieProps:t,shape:t.shape,id:r,animationElapsedTime:n,isAnimating:l||n<1,isEntrance:i}))),K.createElement(Wt,{showLabels:!l,sectors:i,props:t}),K.createElement(x,{cx:p?.cx??0,cy:p?.cy??0,innerRadius:p?.innerRadius??0,outerRadius:p?.outerRadius??0,startAngle:t.startAngle,endAngle:t.endAngle,clockWise:!1},t.children))}var Xt={animationBegin:400,animationDuration:1500,animationEasing:`ease`,animationInterpolateFn:Jt,animationMatchBy:$e,cx:`50%`,cy:`50%`,dataKey:`value`,endAngle:360,fill:`#808080`,hide:!1,innerRadius:0,isAnimationActive:`auto`,label:!1,labelLine:!0,legendType:`rect`,minAngle:0,nameKey:`name`,outerRadius:`80%`,paddingAngle:0,rootTabIndex:0,shape:Nt,startAngle:0,stroke:`#fff`,zIndex:Be.area};function Zt(e){var t=e.id,r=J(e,Et),i=e.hide,a=e.className,o=e.rootTabIndex,s=(0,K.useMemo)(()=>ce(e.children,R),[e.children]),c=j(e=>bt(e,t,s)),l=(0,K.useRef)(null),u=n(`recharts-pie`,a);return i||c==null?(l.current=null,K.createElement(O,{tabIndex:o,className:u})):K.createElement(m,{zIndex:e.zIndex},K.createElement(It,{dataKey:e.dataKey,nameKey:e.nameKey,sectors:c,stroke:e.stroke,strokeWidth:e.strokeWidth,fill:e.fill,name:e.name,hide:e.hide,tooltipType:e.tooltipType,formatter:e.formatter,id:t,activeShape:e.activeShape}),K.createElement(O,{tabIndex:o,className:u},K.createElement(Yt,{props:Y(Y({},r),{},{sectors:c}),previousSectorsRef:l,id:t})))}function Qt(e){var t=I(e,Xt),n=t.id,r=J(t,Dt),i=Pe(r);return K.createElement(ke,{id:n,type:`pie`},e=>K.createElement(K.Fragment,null,K.createElement(Le,{type:`pie`,id:e,data:r.data,dataKey:r.dataKey,hide:r.hide,angleAxisId:0,radiusAxisId:0,name:r.name,nameKey:r.nameKey,tooltipType:r.tooltipType,legendType:r.legendType,fill:r.fill,cx:r.cx,cy:r.cy,startAngle:r.startAngle,endAngle:r.endAngle,paddingAngle:r.paddingAngle,minAngle:r.minAngle,innerRadius:r.innerRadius,outerRadius:r.outerRadius,cornerRadius:r.cornerRadius,presentationProps:i,maxRadius:t.maxRadius}),K.createElement(Pt,q({},r,{id:e})),K.createElement(Zt,q({},r,{id:e}))))}var $t=Qt;$t.displayName=`Pie`;function en(e){var t=L();return(0,K.useEffect)(()=>{t(xe(e))},[t,e]),null}var tn=[`layout`];function X(){return X=Object.assign?Object.assign.bind():function(e){for(var t=1;t{var n=I(e,_n);return K.createElement(un,{chartName:`PieChart`,defaultTooltipEventType:`item`,validateTooltipEventTypes:gn,tooltipPayloadSearcher:Ne,categoricalChartProps:n,ref:t})}),Q=i(),yn={today:{revenue:184500,revChange:`+12.4%`,orders:58,ordersChange:`+6`,avgCheck:3180,avgCheckChange:`+180 ₽`,retention:`68.4%`,retentionChange:`+2.1%`,salesTrend:[{label:`10:00`,revenue:14200,orders:4},{label:`12:00`,revenue:38400,orders:12},{label:`14:00`,revenue:76e3,orders:24},{label:`16:00`,revenue:104500,orders:32},{label:`18:00`,revenue:149e3,orders:45},{label:`20:00`,revenue:184500,orders:58}]},week:{revenue:1428e3,revChange:`+15.8%`,orders:432,ordersChange:`+42`,avgCheck:3305,avgCheckChange:`+210 ₽`,retention:`70.2%`,retentionChange:`+3.5%`,salesTrend:[{label:`Пн`,revenue:142e3,orders:48},{label:`Вт`,revenue:156e3,orders:52},{label:`Ср`,revenue:168e3,orders:56},{label:`Чт`,revenue:174e3,orders:59},{label:`Пт`,revenue:245e3,orders:84},{label:`Сб`,revenue:29e4,orders:98},{label:`Вс`,revenue:26e4,orders:89}]},month:{revenue:485e4,revChange:`+18.5%`,orders:1490,ordersChange:`+180`,avgCheck:3255,avgCheckChange:`+315 ₽`,retention:`72.4%`,retentionChange:`+4.0%`,salesTrend:[{label:`1-я нед`,revenue:112e4,orders:340},{label:`2-я нед`,revenue:124e4,orders:380},{label:`3-я нед`,revenue:139e4,orders:420},{label:`4-я нед`,revenue:1428e3,orders:432}]},year:{revenue:524e5,revChange:`+34.2%`,orders:16800,ordersChange:`+2400`,avgCheck:3120,avgCheckChange:`+420 ₽`,retention:`75.8%`,retentionChange:`+6.2%`,salesTrend:[{label:`Q1`,revenue:112e5,orders:3600},{label:`Q2`,revenue:128e5,orders:4100},{label:`Q3`,revenue:141e5,orders:4600},{label:`Q4 (прогноз)`,revenue:143e5,orders:4500}]}},$=[{name:`Зал ресторана`,value:48,color:`#2F684C`},{name:`Собственная доставка`,value:26,color:`#B78335`},{name:`Telegram-бот`,value:14,color:`#527286`},{name:`Яндекс Еда / Агрегаторы`,value:12,color:`#B16D50`}],bn=[{name:`Филадельфия Премиум`,revenue:42e4,qty:442,margin:`71.2%`,category:`A`},{name:`Том Ям с морепродуктами`,revenue:31e4,qty:455,margin:`68.5%`,category:`A`},{name:`Калифорния краб`,revenue:265e3,qty:335,margin:`69.0%`,category:`A`},{name:`Рамен Тонкоцу`,revenue:195e3,qty:330,margin:`64.5%`,category:`B`},{name:`Гёдза со свининой`,revenue:16e4,qty:380,margin:`74.0%`,category:`B`},{name:`Эби Темпура`,revenue:84e3,qty:155,margin:`58.0%`,category:`C`}],xn=()=>{let[e,t]=(0,K.useState)(`month`),n=yn[e];return(0,Q.jsxs)(`div`,{className:`space-y-4 animate-fade-in`,children:[(0,Q.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,Q.jsxs)(`div`,{children:[(0,Q.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,Q.jsx)(`h2`,{className:`text-sm font-bold text-krona-primary`,children:`Сквозная бизнес-аналитика, ABC-матрица & BI`}),(0,Q.jsx)(u,{level:`target`,size:`sm`})]}),(0,Q.jsx)(`p`,{className:`text-xs text-krona-secondary mt-0.5`,children:`Анализ маржинальности, выручки по каналам, структуры чеков, LTV и Food Cost`})]}),(0,Q.jsx)(`div`,{className:`flex items-center gap-1 bg-krona-workspace p-1 rounded-lg border border-krona-border text-xs`,children:[{id:`today`,label:`Сегодня`},{id:`week`,label:`7 дней`},{id:`month`,label:`30 дней`},{id:`year`,label:`Год`}].map(n=>(0,Q.jsx)(`button`,{onClick:()=>t(n.id),className:`px-3 py-1 rounded font-medium transition-colors ${e===n.id?`bg-[#2F684C] text-white shadow-sm`:`text-krona-secondary hover:text-krona-primary`}`,children:n.label},n.id))})]}),(0,Q.jsxs)(`div`,{className:`grid grid-cols-1 sm:grid-cols-4 gap-3.5`,children:[(0,Q.jsx)(c,{title:`Выручка за период`,value:f(n.revenue),change:{value:n.revChange,trend:`up`},subtitle:`Заказов: ${d(n.orders)}`,icon:(0,Q.jsx)(a,{className:`w-4 h-4 text-krona-green`})}),(0,Q.jsx)(c,{title:`Средний чек`,value:f(n.avgCheck),change:{value:n.avgCheckChange,trend:`up`},subtitle:`По всем каналам`,icon:(0,Q.jsx)(o,{className:`w-4 h-4 text-krona-gold`})}),(0,Q.jsx)(c,{title:`Удержание гостей (CRR)`,value:n.retention,change:{value:n.retentionChange,trend:`up`},subtitle:`Повторные покупки`,icon:(0,Q.jsx)(l,{className:`w-4 h-4 text-sky-600`})}),(0,Q.jsx)(c,{title:`Маржинальность меню`,value:`70.6%`,change:{value:`+1.2%`,trend:`up`},subtitle:`Food cost: 29.4%`,icon:(0,Q.jsx)(s,{className:`w-4 h-4 text-krona-green`})})]}),(0,Q.jsxs)(`div`,{className:`grid grid-cols-1 lg:grid-cols-3 gap-4`,children:[(0,Q.jsxs)(`div`,{className:`lg:col-span-2 bg-krona-surface border border-krona-border rounded-xl p-4 shadow-krona-soft space-y-3`,children:[(0,Q.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,Q.jsx)(`h4`,{className:`text-xs font-bold text-krona-primary`,children:`Динамика выручки за выбранный период`}),(0,Q.jsx)(r,{variant:`green`,size:`sm`,children:`План выполнен на 106%`})]}),(0,Q.jsx)(`div`,{className:`h-64 w-full`,children:(0,Q.jsx)(Ee,{width:`100%`,height:`100%`,children:(0,Q.jsxs)(Xe,{data:n.salesTrend,margin:{top:10,right:10,left:-20,bottom:0},children:[(0,Q.jsx)(`defs`,{children:(0,Q.jsxs)(`linearGradient`,{id:`colorRev`,x1:`0`,y1:`0`,x2:`0`,y2:`1`,children:[(0,Q.jsx)(`stop`,{offset:`5%`,stopColor:`#2F684C`,stopOpacity:.4}),(0,Q.jsx)(`stop`,{offset:`95%`,stopColor:`#2F684C`,stopOpacity:0})]})}),(0,Q.jsx)(Te,{strokeDasharray:`3 3`,stroke:`#DDDAD1`,opacity:.5}),(0,Q.jsx)(Ze,{dataKey:`label`,stroke:`#71766F`,fontSize:11}),(0,Q.jsx)(Fe,{stroke:`#71766F`,fontSize:11,tickFormatter:e=>`${e/1e3}k`}),(0,Q.jsx)(ie,{formatter:e=>[f(e),`Выручка`],contentStyle:{backgroundColor:`#FCFAF5`,borderColor:`#DDDAD1`,borderRadius:`8px`,fontSize:`11px`}}),(0,Q.jsx)(Se,{type:`monotone`,dataKey:`revenue`,stroke:`#2F684C`,strokeWidth:2,fillOpacity:1,fill:`url(#colorRev)`})]})})})]}),(0,Q.jsxs)(`div`,{className:`bg-krona-surface border border-krona-border rounded-xl p-4 shadow-krona-soft space-y-3 flex flex-col justify-between`,children:[(0,Q.jsxs)(`div`,{children:[(0,Q.jsx)(`h4`,{className:`text-xs font-bold text-krona-primary`,children:`Структура выручки по каналам продаж`}),(0,Q.jsx)(`p`,{className:`text-[11px] text-krona-secondary`,children:`Доля в общем обороте заведений`})]}),(0,Q.jsx)(`div`,{className:`h-44 w-full flex items-center justify-center`,children:(0,Q.jsx)(Ee,{width:`100%`,height:`100%`,children:(0,Q.jsxs)(vn,{children:[(0,Q.jsx)($t,{data:$,innerRadius:45,outerRadius:70,paddingAngle:4,dataKey:`value`,children:$.map((e,t)=>(0,Q.jsx)(R,{fill:e.color},`cell-${t}`))}),(0,Q.jsx)(ie,{formatter:e=>[`${e}%`,`Доля`]})]})})}),(0,Q.jsx)(`div`,{className:`space-y-1 text-xs border-t border-krona-border/60 pt-2`,children:$.map(e=>(0,Q.jsxs)(`div`,{className:`flex items-center justify-between text-[11px]`,children:[(0,Q.jsxs)(`div`,{className:`flex items-center gap-1.5`,children:[(0,Q.jsx)(`span`,{className:`w-2.5 h-2.5 rounded-full`,style:{backgroundColor:e.color}}),(0,Q.jsx)(`span`,{className:`text-krona-secondary`,children:e.name})]}),(0,Q.jsxs)(`span`,{className:`font-bold font-mono text-krona-primary`,children:[e.value,`%`]})]},e.name))})]})]}),(0,Q.jsxs)(`div`,{className:`bg-krona-surface border border-krona-border rounded-xl shadow-krona-soft overflow-hidden`,children:[(0,Q.jsxs)(`div`,{className:`p-3.5 border-b border-krona-border flex items-center justify-between`,children:[(0,Q.jsxs)(`div`,{children:[(0,Q.jsx)(`h4`,{className:`text-xs font-bold text-krona-primary`,children:`ABC-анализ меню и блюд`}),(0,Q.jsx)(`p`,{className:`text-[11px] text-krona-secondary`,children:`Классификация позиций по выручке и маржинальности (Группа A формирует 80% выручки)`})]}),(0,Q.jsx)(r,{variant:`gold`,size:`sm`,children:`ABC Matrix v2.1`})]}),(0,Q.jsxs)(`table`,{className:`w-full text-left text-xs border-collapse`,children:[(0,Q.jsx)(`thead`,{className:`bg-krona-workspace/80 text-krona-secondary border-b border-krona-border`,children:(0,Q.jsxs)(`tr`,{children:[(0,Q.jsx)(`th`,{className:`p-3 font-semibold`,children:`Блюдо / Позиция`}),(0,Q.jsx)(`th`,{className:`p-3 font-semibold text-center`,children:`Класс`}),(0,Q.jsx)(`th`,{className:`p-3 font-semibold text-right`,children:`Продано порций`}),(0,Q.jsx)(`th`,{className:`p-3 font-semibold text-right`,children:`Выручка`}),(0,Q.jsx)(`th`,{className:`p-3 font-semibold text-right`,children:`Маржинальность`})]})}),(0,Q.jsx)(`tbody`,{className:`divide-y divide-krona-border/50`,children:bn.map(e=>(0,Q.jsxs)(`tr`,{className:`hover:bg-krona-workspace/40 transition-colors`,children:[(0,Q.jsx)(`td`,{className:`p-3 font-medium text-krona-primary`,children:e.name}),(0,Q.jsx)(`td`,{className:`p-3 text-center`,children:(0,Q.jsxs)(r,{variant:e.category===`A`?`green`:e.category===`B`?`gold`:`neutral`,size:`sm`,children:[`Группа `,e.category]})}),(0,Q.jsxs)(`td`,{className:`p-3 text-right font-mono text-krona-secondary`,children:[e.qty,` шт`]}),(0,Q.jsx)(`td`,{className:`p-3 text-right font-mono font-bold text-krona-primary`,children:f(e.revenue)}),(0,Q.jsx)(`td`,{className:`p-3 text-right font-mono text-emerald-700 font-semibold`,children:e.margin})]},e.name))})]})]})]})};export{xn as AnalyticsModule}; \ No newline at end of file +import{f as e,h as t,o as n,r,s as i}from"./useToast-CS8pZhce.js";import{t as a}from"./dollar-sign-Bf6JneNn.js";import{c as o,i as s,o as c,q as l,t as u}from"./index-CrJKtV0u.js";import{n as d,t as f}from"./formatters-WvGQLZg0.js";import{$ as p,A as m,At as h,B as g,C as _,Ct as v,D as y,Dt as b,E as x,Et as S,F as C,G as w,H as T,I as E,J as D,K as ee,L as te,M as ne,N as re,O as ie,Ot as O,P as ae,Q as oe,R as se,S as ce,St as le,T as ue,Tt as k,U as de,V as fe,W as pe,X as me,Y as he,Z as ge,_ as _e,_t as A,a as ve,at as ye,b as be,bt as j,c as xe,ct as M,d as Se,dt as Ce,et as we,f as Te,ft as Ee,g as De,gt as Oe,h as ke,ht as Ae,i as je,it as N,j as Me,k as Ne,kt as Pe,l as Fe,lt as Ie,m as Le,mt as Re,n as ze,nt as Be,o as Ve,ot as He,p as Ue,pt as We,q as Ge,r as Ke,rt as qe,s as Je,st as Ye,t as Xe,tt as P,u as Ze,ut as Qe,v as $e,vt as F,w as et,wt as tt,x as nt,xt as I,y as rt,yt as L,z as it}from"./AreaChart-tvNE-d9G.js";var R=e=>null;R.displayName=`Cell`;var at=e=>e.graphicalItems.polarItems,ot=F([P,we],ee),z=F([at,D,ot],de),st=F([z],T),B=F([st,N],g),ct=F([B,D,z],te);F([B,D,z],(e,t,n)=>n.length>0?e.flatMap(e=>n.flatMap(n=>({value:A(e,t.dataKey??n.dataKey),errorDomain:[]}))).filter(Boolean):t?.dataKey==null?e.map(e=>({value:e,errorDomain:[]})):e.map(e=>({value:A(e,t.dataKey),errorDomain:[]})));var V=()=>void 0,lt=F([B,D,z,Ge,P,ye],fe),ut=F([D,he,me,V,lt,V,Qe,P],w),H=F([D,Qe,B,ct,qe,P,ut],se),dt=F([H,oe,ge],pe),ft=F([D,H,dt,P],it);F([ge,ft],p);function U(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter(function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable})),n.push.apply(n,r)}return n}function pt(e){for(var t=1;tt],(e,t)=>e.filter(e=>e.type===`pie`).find(e=>e.id===t)),_t=[],G=(e,t,n)=>n?.length===0?_t:n,vt=F([N,W,G],(e,t,n)=>{var r=e.chartData;if(t!=null){var i=t?.data!=null&&t.data.length>0?t.data:r;if((!i||!i.length)&&n!=null&&(i=n.map(e=>pt(pt({},t.presentationProps),e.props))),i!=null)return i}}),yt=F([vt,W,G],(e,t,n)=>{if(e!=null&&t!=null)return e.map((e,r)=>{var i,a=A(e,t.nameKey,t.name),o=n!=null&&(i=n[r])!=null&&(i=i.props)!=null&&i.fill?n[r].props.fill:typeof e==`object`&&e&&`fill`in e?e.fill:t.fill;return{value:Oe(a,t.dataKey),dataKey:t.dataKey,color:o,payload:e,type:t.legendType}})}),bt=F([vt,W,G,We],(e,t,n,r)=>{if(t!=null&&e!=null)return Kt({offset:r,pieSettings:t,displayedData:e,cells:n})}),xt=(e,t,n)=>{var r=L();return(i,a)=>o=>{e?.(i,a,o),r(E({activeIndex:String(a),activeDataKey:t,activeCoordinate:i.tooltipPosition,activeGraphicalItemId:n}))}},St=e=>{var t=L();return(n,r)=>i=>{e?.(n,r,i),t(ae())}},Ct=(e,t,n)=>{var r=L();return(i,a)=>o=>{e?.(i,a,o),r(C({activeIndex:String(a),activeDataKey:t,activeCoordinate:i.tooltipPosition,activeGraphicalItemId:n}))}},K=t(e()),wt=[`key`],Tt=[`onMouseEnter`,`onClick`,`onMouseLeave`],Et=[`id`],Dt=[`id`];function q(){return q=Object.assign?Object.assign.bind():function(e){for(var t=1;tce(e.children,R),[e.children]),n=j(n=>yt(n,e.id,t));return n==null?null:K.createElement(rt,{legendPayload:n})}function Ft(e){if(e!=null&&typeof e!=`boolean`&&typeof e!=`function`){if(K.isValidElement(e)){var t=e.props?.fill;return typeof t==`string`?t:void 0}var n=e.fill;return typeof n==`string`?n:void 0}}var It=K.memo(e=>{var t=e.dataKey,n=e.nameKey,r=e.sectors,i=e.stroke,a=e.strokeWidth,o=e.fill,s=e.name,c=e.hide,l=e.tooltipType,u=e.formatter,d=e.id,f=e.activeShape,p=Ft(f),m={dataDefinedOnItem:r.map(e=>{var t=e.tooltipPayload;return p==null||t==null?t:t.map(e=>Y(Y({},e),{},{color:p,fill:p}))}),getPosition:e=>r[Number(e)]?.tooltipPosition,settings:{stroke:i,strokeWidth:a,fill:o,dataKey:t,nameKey:n,name:Oe(s,t),hide:c,type:l,color:o,unit:``,formatter:u,graphicalItemId:d}};return K.createElement(be,{tooltipEntrySettings:m})}),Lt=(e,t)=>e>t?`start`:ev(typeof t==`function`?t(e):t,n,n*.8),zt=(e,t,n)=>{var r=t.top,i=t.left,a=t.width,o=t.height,s=Ye(a,o);return{cx:i+v(e.cx,a,a/2),cy:r+v(e.cy,o,o/2),innerRadius:v(e.innerRadius,s,0),outerRadius:Rt(n,e.outerRadius,s),maxRadius:e.maxRadius||Math.sqrt(a*a+o*o)/2}},Bt=(e,t)=>S(t-e)*Math.min(Math.abs(t-e),360),Vt=(e,t)=>{if(K.isValidElement(e))return K.cloneElement(e,t);if(typeof e==`function`)return e(t);var r=n(`recharts-pie-label-line`,typeof e==`boolean`?``:e.className);t.key;var i=J(t,wt);return K.createElement(Ie,q({},i,{type:`linear`,className:r}))},Ht=(e,t,r)=>{if(K.isValidElement(e))return K.cloneElement(e,t);var i=r;if(typeof e==`function`&&(i=e(t),K.isValidElement(i)))return i;var a=n(`recharts-pie-label-text`,_(e));return K.createElement(y,q({},t,{alignmentBaseline:`middle`,className:a}),i)};function Ut(e){var t=e.sectors,n=e.props,r=e.showLabels,i=n.label,a=n.labelLine,o=n.dataKey;if(!r||!i||!t)return null;var s=Pe(n),c=h(i),l=h(a),u=typeof i==`object`&&`offsetRadius`in i&&typeof i.offsetRadius==`number`&&i.offsetRadius||20,d=t.map((e,t)=>{var n=(e.startAngle+e.endAngle)/2,r=M(e.cx,e.cy,e.outerRadius+u,n),d=Y(Y(Y(Y({},s),e),{},{stroke:`none`},c),{},{index:t,textAnchor:Lt(r.x,e.cx)},r),f=Y(Y(Y(Y({},s),e),{},{fill:`none`,stroke:e.fill},l),{},{index:t,points:[M(e.cx,e.cy,e.outerRadius,n),r],key:`line`});return K.createElement(m,{zIndex:Be.label,key:`label-${e.startAngle}-${e.endAngle}-${e.midAngle}-${t}`},K.createElement(O,null,a&&Vt(a,f),Ht(i,d,A(e,o))))});return K.createElement(O,{className:`recharts-pie-labels`},d)}function Wt(e){var t=e.sectors,n=e.props,r=e.showLabels,i=n.label;return typeof i==`object`&&i&&`position`in i?K.createElement(et,{label:i}):K.createElement(Ut,{sectors:t,props:n,showLabels:r})}function Gt(e){var t=e.sectors,n=e.activeShape,r=e.inactiveShape,i=e.allOtherPieProps,a=e.shape,o=e.id,s=e.animationElapsedTime,c=e.isAnimating,l=e.isEntrance,u=j(re),d=j(Me),f=j(ne),p=i.onMouseEnter,m=i.onClick,h=i.onMouseLeave,g=J(i,Tt),_=xt(p,i.dataKey,o),v=St(h),y=Ct(m,i.dataKey,o);return t==null||t.length===0?null:K.createElement(K.Fragment,null,t.map((e,p)=>{if(e?.startAngle===0&&e?.endAngle===0&&t.length!==1)return null;var m=f==null||f===o,h=String(p)===u&&(d==null||i.dataKey===d)&&m,b=n&&h?n:u?r:null,x=Y(Y({},e),{},{stroke:e.stroke,tabIndex:-1,index:p,isActive:h,animationElapsedTime:s,isAnimating:c,isEntrance:l,[Ae]:p,[Re]:o});return K.createElement(O,q({key:`sector-${e?.startAngle}-${e?.endAngle}-${e.midAngle}-${p}`,tabIndex:-1,className:`recharts-pie-sector`},le(g,e,p),{onMouseEnter:_(e,p),onMouseLeave:v(e,p),onClick:y(e,p)}),K.createElement(nt,{option:b??a,DefaultShape:Nt,shapeProps:x}))}))}function Kt(e){var t=e.pieSettings,n=e.displayedData,r=e.cells,i=e.offset,a=t.cornerRadius,o=t.startAngle,s=t.endAngle,c=t.dataKey,l=t.nameKey,u=t.tooltipType,d=Math.abs(t.minAngle),f=Bt(o,s),p=Math.abs(f),m=n.length<=1?0:t.paddingAngle??0,h=n.filter(e=>A(e,c,0)!==0).length,g=(p>=360?h:h-1)*m,_=n.reduce((e,t)=>{var n=A(t,c,0);return e+(k(n)?n:0)},0),v=d>0&&_>0&&n.some(e=>{var t=A(e,c,0),n=(k(t)?t:0)/_;return t!==0&&n*p0){var x;b=n.map((e,n)=>{var s=A(e,c,0),d=A(e,l,n),p=zt(t,i,e),h=(k(s)?s:0)/_,g,b=Y(Y({},e),r&&r[n]&&r[n].props),C=b!=null&&`fill`in b&&typeof b.fill==`string`?b.fill:t.fill;g=n?x.endAngle+S(f)*m*(s===0?0:1):o;var w=g+S(f)*((s===0?0:v)+h*y),T=(g+w)/2,E=(p.innerRadius+p.outerRadius)/2,D=[{name:d,value:s,payload:b,dataKey:c,type:u,color:C,fill:C,graphicalItemId:t.id}],ee=M(p.cx,p.cy,E,T);return x=Y(Y(Y(Y({},t.presentationProps),{},{percent:h,cornerRadius:typeof a==`string`?parseFloat(a):a,name:d,tooltipPayload:D,midAngle:T,middleRadius:E,tooltipPosition:ee},b),p),{},{value:s,dataKey:c,startAngle:g,endAngle:w,payload:b,paddingAngle:s===0?0:S(f)*m}),x})}return b}function qt(e){var t=e.showLabels,n=e.sectors,r=e.children,i=(0,K.useMemo)(()=>!t||!n?[]:n.map(e=>({value:e.value,payload:e.payload,clockWise:!1,parentViewBox:void 0,viewBox:{cx:e.cx,cy:e.cy,innerRadius:e.innerRadius,outerRadius:e.outerRadius,startAngle:e.startAngle,endAngle:e.endAngle,clockWise:!1},fill:e.fill})),[n,t]);return K.createElement(ue,{value:t?i:void 0},r)}var Jt=(e,t)=>{if(e==null)return[];var n=[],r=e.find(e=>e.status!==`removed`),i=r?r.next.startAngle:0;return e.forEach((e,r)=>{if(e.status!==`removed`){var a=r>0?b(e.next,`paddingAngle`,0):0;if(e.status===`matched`){var o=tt(e.prev.endAngle-e.prev.startAngle,e.next.endAngle-e.next.startAngle,t),s=Y(Y({},e.next),{},{startAngle:i+a,endAngle:i+o+a});n.push(s),i=s.endAngle}else{var c=tt(0,e.next.endAngle-e.next.startAngle,t),l=Y(Y({},e.next),{},{startAngle:i+a,endAngle:i+c+a});n.push(l),i=l.endAngle}}}),n};function Yt(e){var t=e.props,n=e.previousSectorsRef,r=e.id,i=t.sectors,a=t.activeShape,o=t.inactiveShape,s=t.animationInterpolateFn,c=_e(t.onAnimationStart,t.onAnimationEnd),l=c.isAnimating,u=c.handleAnimationStart,d=c.handleAnimationEnd,f=Ce();if(f==null)return null;var p=i[0];return K.createElement(qt,{showLabels:!l,sectors:i},K.createElement(De,{animationInput:t,animationIdPrefix:`recharts-pie-`,items:i,previousItemsRef:n,isAnimationActive:t.isAnimationActive,animationBegin:t.animationBegin,animationDuration:t.animationDuration,animationEasing:t.animationEasing,onAnimationStart:u,onAnimationEnd:d,animationInterpolateFn:s,animationMatchBy:t.animationMatchBy,layout:f},(e,n,i)=>K.createElement(O,null,K.createElement(Gt,{sectors:e,activeShape:a,inactiveShape:o,allOtherPieProps:t,shape:t.shape,id:r,animationElapsedTime:n,isAnimating:l||n<1,isEntrance:i}))),K.createElement(Wt,{showLabels:!l,sectors:i,props:t}),K.createElement(x,{cx:p?.cx??0,cy:p?.cy??0,innerRadius:p?.innerRadius??0,outerRadius:p?.outerRadius??0,startAngle:t.startAngle,endAngle:t.endAngle,clockWise:!1},t.children))}var Xt={animationBegin:400,animationDuration:1500,animationEasing:`ease`,animationInterpolateFn:Jt,animationMatchBy:$e,cx:`50%`,cy:`50%`,dataKey:`value`,endAngle:360,fill:`#808080`,hide:!1,innerRadius:0,isAnimationActive:`auto`,label:!1,labelLine:!0,legendType:`rect`,minAngle:0,nameKey:`name`,outerRadius:`80%`,paddingAngle:0,rootTabIndex:0,shape:Nt,startAngle:0,stroke:`#fff`,zIndex:Be.area};function Zt(e){var t=e.id,r=J(e,Et),i=e.hide,a=e.className,o=e.rootTabIndex,s=(0,K.useMemo)(()=>ce(e.children,R),[e.children]),c=j(e=>bt(e,t,s)),l=(0,K.useRef)(null),u=n(`recharts-pie`,a);return i||c==null?(l.current=null,K.createElement(O,{tabIndex:o,className:u})):K.createElement(m,{zIndex:e.zIndex},K.createElement(It,{dataKey:e.dataKey,nameKey:e.nameKey,sectors:c,stroke:e.stroke,strokeWidth:e.strokeWidth,fill:e.fill,name:e.name,hide:e.hide,tooltipType:e.tooltipType,formatter:e.formatter,id:t,activeShape:e.activeShape}),K.createElement(O,{tabIndex:o,className:u},K.createElement(Yt,{props:Y(Y({},r),{},{sectors:c}),previousSectorsRef:l,id:t})))}function Qt(e){var t=I(e,Xt),n=t.id,r=J(t,Dt),i=Pe(r);return K.createElement(ke,{id:n,type:`pie`},e=>K.createElement(K.Fragment,null,K.createElement(Le,{type:`pie`,id:e,data:r.data,dataKey:r.dataKey,hide:r.hide,angleAxisId:0,radiusAxisId:0,name:r.name,nameKey:r.nameKey,tooltipType:r.tooltipType,legendType:r.legendType,fill:r.fill,cx:r.cx,cy:r.cy,startAngle:r.startAngle,endAngle:r.endAngle,paddingAngle:r.paddingAngle,minAngle:r.minAngle,innerRadius:r.innerRadius,outerRadius:r.outerRadius,cornerRadius:r.cornerRadius,presentationProps:i,maxRadius:t.maxRadius}),K.createElement(Pt,q({},r,{id:e})),K.createElement(Zt,q({},r,{id:e}))))}var $t=Qt;$t.displayName=`Pie`;function en(e){var t=L();return(0,K.useEffect)(()=>{t(xe(e))},[t,e]),null}var tn=[`layout`];function X(){return X=Object.assign?Object.assign.bind():function(e){for(var t=1;t{var n=I(e,_n);return K.createElement(un,{chartName:`PieChart`,defaultTooltipEventType:`item`,validateTooltipEventTypes:gn,tooltipPayloadSearcher:Ne,categoricalChartProps:n,ref:t})}),Q=i(),yn={today:{revenue:184500,revChange:`+12.4%`,orders:58,ordersChange:`+6`,avgCheck:3180,avgCheckChange:`+180 ₽`,retention:`68.4%`,retentionChange:`+2.1%`,salesTrend:[{label:`10:00`,revenue:14200,orders:4},{label:`12:00`,revenue:38400,orders:12},{label:`14:00`,revenue:76e3,orders:24},{label:`16:00`,revenue:104500,orders:32},{label:`18:00`,revenue:149e3,orders:45},{label:`20:00`,revenue:184500,orders:58}]},week:{revenue:1428e3,revChange:`+15.8%`,orders:432,ordersChange:`+42`,avgCheck:3305,avgCheckChange:`+210 ₽`,retention:`70.2%`,retentionChange:`+3.5%`,salesTrend:[{label:`Пн`,revenue:142e3,orders:48},{label:`Вт`,revenue:156e3,orders:52},{label:`Ср`,revenue:168e3,orders:56},{label:`Чт`,revenue:174e3,orders:59},{label:`Пт`,revenue:245e3,orders:84},{label:`Сб`,revenue:29e4,orders:98},{label:`Вс`,revenue:26e4,orders:89}]},month:{revenue:485e4,revChange:`+18.5%`,orders:1490,ordersChange:`+180`,avgCheck:3255,avgCheckChange:`+315 ₽`,retention:`72.4%`,retentionChange:`+4.0%`,salesTrend:[{label:`1-я нед`,revenue:112e4,orders:340},{label:`2-я нед`,revenue:124e4,orders:380},{label:`3-я нед`,revenue:139e4,orders:420},{label:`4-я нед`,revenue:1428e3,orders:432}]},year:{revenue:524e5,revChange:`+34.2%`,orders:16800,ordersChange:`+2400`,avgCheck:3120,avgCheckChange:`+420 ₽`,retention:`75.8%`,retentionChange:`+6.2%`,salesTrend:[{label:`Q1`,revenue:112e5,orders:3600},{label:`Q2`,revenue:128e5,orders:4100},{label:`Q3`,revenue:141e5,orders:4600},{label:`Q4 (прогноз)`,revenue:143e5,orders:4500}]}},$=[{name:`Зал ресторана`,value:48,color:`#2F684C`},{name:`Собственная доставка`,value:26,color:`#B78335`},{name:`Telegram-бот`,value:14,color:`#527286`},{name:`Яндекс Еда / Агрегаторы`,value:12,color:`#B16D50`}],bn=[{name:`Филадельфия Премиум`,revenue:42e4,qty:442,margin:`71.2%`,category:`A`},{name:`Том Ям с морепродуктами`,revenue:31e4,qty:455,margin:`68.5%`,category:`A`},{name:`Калифорния краб`,revenue:265e3,qty:335,margin:`69.0%`,category:`A`},{name:`Рамен Тонкоцу`,revenue:195e3,qty:330,margin:`64.5%`,category:`B`},{name:`Гёдза со свининой`,revenue:16e4,qty:380,margin:`74.0%`,category:`B`},{name:`Эби Темпура`,revenue:84e3,qty:155,margin:`58.0%`,category:`C`}],xn=()=>{let[e,t]=(0,K.useState)(`month`),n=yn[e];return(0,Q.jsxs)(`div`,{className:`space-y-4 animate-fade-in`,children:[(0,Q.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,Q.jsxs)(`div`,{children:[(0,Q.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,Q.jsx)(`h2`,{className:`text-sm font-bold text-krona-primary`,children:`Сквозная бизнес-аналитика, ABC-матрица & BI`}),(0,Q.jsx)(u,{level:`target`,size:`sm`})]}),(0,Q.jsx)(`p`,{className:`text-xs text-krona-secondary mt-0.5`,children:`Анализ маржинальности, выручки по каналам, структуры чеков, LTV и Food Cost`})]}),(0,Q.jsx)(`div`,{className:`flex items-center gap-1 bg-krona-workspace p-1 rounded-lg border border-krona-border text-xs`,children:[{id:`today`,label:`Сегодня`},{id:`week`,label:`7 дней`},{id:`month`,label:`30 дней`},{id:`year`,label:`Год`}].map(n=>(0,Q.jsx)(`button`,{onClick:()=>t(n.id),className:`px-3 py-1 rounded font-medium transition-colors ${e===n.id?`bg-[#2F684C] text-white shadow-sm`:`text-krona-secondary hover:text-krona-primary`}`,children:n.label},n.id))})]}),(0,Q.jsxs)(`div`,{className:`grid grid-cols-1 sm:grid-cols-4 gap-3.5`,children:[(0,Q.jsx)(s,{title:`Выручка за период`,value:f(n.revenue),change:{value:n.revChange,trend:`up`},subtitle:`Заказов: ${d(n.orders)}`,icon:(0,Q.jsx)(a,{className:`w-4 h-4 text-krona-green`})}),(0,Q.jsx)(s,{title:`Средний чек`,value:f(n.avgCheck),change:{value:n.avgCheckChange,trend:`up`},subtitle:`По всем каналам`,icon:(0,Q.jsx)(l,{className:`w-4 h-4 text-krona-gold`})}),(0,Q.jsx)(s,{title:`Удержание гостей (CRR)`,value:n.retention,change:{value:n.retentionChange,trend:`up`},subtitle:`Повторные покупки`,icon:(0,Q.jsx)(c,{className:`w-4 h-4 text-sky-600`})}),(0,Q.jsx)(s,{title:`Маржинальность меню`,value:`70.6%`,change:{value:`+1.2%`,trend:`up`},subtitle:`Food cost: 29.4%`,icon:(0,Q.jsx)(o,{className:`w-4 h-4 text-krona-green`})})]}),(0,Q.jsxs)(`div`,{className:`grid grid-cols-1 lg:grid-cols-3 gap-4`,children:[(0,Q.jsxs)(`div`,{className:`lg:col-span-2 bg-krona-surface border border-krona-border rounded-xl p-4 shadow-krona-soft space-y-3`,children:[(0,Q.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,Q.jsx)(`h4`,{className:`text-xs font-bold text-krona-primary`,children:`Динамика выручки за выбранный период`}),(0,Q.jsx)(r,{variant:`green`,size:`sm`,children:`План выполнен на 106%`})]}),(0,Q.jsx)(`div`,{className:`h-64 w-full`,children:(0,Q.jsx)(Ee,{width:`100%`,height:`100%`,children:(0,Q.jsxs)(Xe,{data:n.salesTrend,margin:{top:10,right:10,left:-20,bottom:0},children:[(0,Q.jsx)(`defs`,{children:(0,Q.jsxs)(`linearGradient`,{id:`colorRev`,x1:`0`,y1:`0`,x2:`0`,y2:`1`,children:[(0,Q.jsx)(`stop`,{offset:`5%`,stopColor:`#2F684C`,stopOpacity:.4}),(0,Q.jsx)(`stop`,{offset:`95%`,stopColor:`#2F684C`,stopOpacity:0})]})}),(0,Q.jsx)(Te,{strokeDasharray:`3 3`,stroke:`#DDDAD1`,opacity:.5}),(0,Q.jsx)(Ze,{dataKey:`label`,stroke:`#71766F`,fontSize:11}),(0,Q.jsx)(Fe,{stroke:`#71766F`,fontSize:11,tickFormatter:e=>`${e/1e3}k`}),(0,Q.jsx)(ie,{formatter:e=>[f(e),`Выручка`],contentStyle:{backgroundColor:`#FCFAF5`,borderColor:`#DDDAD1`,borderRadius:`8px`,fontSize:`11px`}}),(0,Q.jsx)(Se,{type:`monotone`,dataKey:`revenue`,stroke:`#2F684C`,strokeWidth:2,fillOpacity:1,fill:`url(#colorRev)`})]})})})]}),(0,Q.jsxs)(`div`,{className:`bg-krona-surface border border-krona-border rounded-xl p-4 shadow-krona-soft space-y-3 flex flex-col justify-between`,children:[(0,Q.jsxs)(`div`,{children:[(0,Q.jsx)(`h4`,{className:`text-xs font-bold text-krona-primary`,children:`Структура выручки по каналам продаж`}),(0,Q.jsx)(`p`,{className:`text-[11px] text-krona-secondary`,children:`Доля в общем обороте заведений`})]}),(0,Q.jsx)(`div`,{className:`h-44 w-full flex items-center justify-center`,children:(0,Q.jsx)(Ee,{width:`100%`,height:`100%`,children:(0,Q.jsxs)(vn,{children:[(0,Q.jsx)($t,{data:$,innerRadius:45,outerRadius:70,paddingAngle:4,dataKey:`value`,children:$.map((e,t)=>(0,Q.jsx)(R,{fill:e.color},`cell-${t}`))}),(0,Q.jsx)(ie,{formatter:e=>[`${e}%`,`Доля`]})]})})}),(0,Q.jsx)(`div`,{className:`space-y-1 text-xs border-t border-krona-border/60 pt-2`,children:$.map(e=>(0,Q.jsxs)(`div`,{className:`flex items-center justify-between text-[11px]`,children:[(0,Q.jsxs)(`div`,{className:`flex items-center gap-1.5`,children:[(0,Q.jsx)(`span`,{className:`w-2.5 h-2.5 rounded-full`,style:{backgroundColor:e.color}}),(0,Q.jsx)(`span`,{className:`text-krona-secondary`,children:e.name})]}),(0,Q.jsxs)(`span`,{className:`font-bold font-mono text-krona-primary`,children:[e.value,`%`]})]},e.name))})]})]}),(0,Q.jsxs)(`div`,{className:`bg-krona-surface border border-krona-border rounded-xl shadow-krona-soft overflow-hidden`,children:[(0,Q.jsxs)(`div`,{className:`p-3.5 border-b border-krona-border flex items-center justify-between`,children:[(0,Q.jsxs)(`div`,{children:[(0,Q.jsx)(`h4`,{className:`text-xs font-bold text-krona-primary`,children:`ABC-анализ меню и блюд`}),(0,Q.jsx)(`p`,{className:`text-[11px] text-krona-secondary`,children:`Классификация позиций по выручке и маржинальности (Группа A формирует 80% выручки)`})]}),(0,Q.jsx)(r,{variant:`gold`,size:`sm`,children:`ABC Matrix v2.1`})]}),(0,Q.jsxs)(`table`,{className:`w-full text-left text-xs border-collapse`,children:[(0,Q.jsx)(`thead`,{className:`bg-krona-workspace/80 text-krona-secondary border-b border-krona-border`,children:(0,Q.jsxs)(`tr`,{children:[(0,Q.jsx)(`th`,{className:`p-3 font-semibold`,children:`Блюдо / Позиция`}),(0,Q.jsx)(`th`,{className:`p-3 font-semibold text-center`,children:`Класс`}),(0,Q.jsx)(`th`,{className:`p-3 font-semibold text-right`,children:`Продано порций`}),(0,Q.jsx)(`th`,{className:`p-3 font-semibold text-right`,children:`Выручка`}),(0,Q.jsx)(`th`,{className:`p-3 font-semibold text-right`,children:`Маржинальность`})]})}),(0,Q.jsx)(`tbody`,{className:`divide-y divide-krona-border/50`,children:bn.map(e=>(0,Q.jsxs)(`tr`,{className:`hover:bg-krona-workspace/40 transition-colors`,children:[(0,Q.jsx)(`td`,{className:`p-3 font-medium text-krona-primary`,children:e.name}),(0,Q.jsx)(`td`,{className:`p-3 text-center`,children:(0,Q.jsxs)(r,{variant:e.category===`A`?`green`:e.category===`B`?`gold`:`neutral`,size:`sm`,children:[`Группа `,e.category]})}),(0,Q.jsxs)(`td`,{className:`p-3 text-right font-mono text-krona-secondary`,children:[e.qty,` шт`]}),(0,Q.jsx)(`td`,{className:`p-3 text-right font-mono font-bold text-krona-primary`,children:f(e.revenue)}),(0,Q.jsx)(`td`,{className:`p-3 text-right font-mono text-emerald-700 font-semibold`,children:e.margin})]},e.name))})]})]})]})};export{xn as AnalyticsModule}; \ No newline at end of file diff --git a/dist/assets/AppsCatalogModule-Dsu6Y18J.js b/dist/assets/AppsCatalogModule-rSx-Kisy.js similarity index 97% rename from dist/assets/AppsCatalogModule-Dsu6Y18J.js rename to dist/assets/AppsCatalogModule-rSx-Kisy.js index 156ae66..237a4ef 100644 --- a/dist/assets/AppsCatalogModule-Dsu6Y18J.js +++ b/dist/assets/AppsCatalogModule-rSx-Kisy.js @@ -1 +1 @@ -import{f as e,i as t,r as n,s as r}from"./useToast-CS8pZhce.js";import{lt as i,t as a}from"./index-CNnq9VO5.js";import{t as o}from"./types-CTcNpN0z.js";e();var s=r(),c=()=>{let{customCapabilities:e,toggleCapability:r}=i();return(0,s.jsxs)(`div`,{className:`space-y-4 animate-fade-in`,children:[(0,s.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,s.jsxs)(`div`,{children:[(0,s.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,s.jsx)(`h2`,{className:`text-sm font-bold text-krona-primary`,children:`Каталог приложений & Модульная экосистема Кроны`}),(0,s.jsx)(a,{level:`demo`,size:`sm`})]}),(0,s.jsx)(`p`,{className:`text-xs text-krona-secondary mt-0.5`,children:`Подключайте и отключайте функциональные блоки для адаптации платформы под новые ниши`})]}),(0,s.jsxs)(n,{variant:`gold`,size:`md`,children:[`Всего модулей: `,o.length]})]}),(0,s.jsx)(`div`,{className:`grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-3.5`,children:o.map(i=>{let a=e[i.id];return(0,s.jsxs)(`div`,{className:`p-4 rounded-xl border border-krona-border bg-krona-surface shadow-krona-soft flex flex-col justify-between space-y-3`,children:[(0,s.jsxs)(`div`,{children:[(0,s.jsxs)(`div`,{className:`flex items-center justify-between mb-1.5`,children:[(0,s.jsx)(`span`,{className:`text-[10px] uppercase font-bold text-krona-secondary`,children:i.category}),(0,s.jsx)(n,{variant:a?`green`:`neutral`,size:`sm`,children:a?`Активен`:`Отключен`})]}),(0,s.jsx)(`h4`,{className:`text-xs font-bold text-krona-primary`,children:i.name}),(0,s.jsx)(`p`,{className:`text-[11px] text-krona-secondary mt-1 leading-relaxed`,children:i.description})]}),(0,s.jsx)(`div`,{className:`pt-2 border-t border-krona-border/50 flex justify-end`,children:(0,s.jsx)(t,{variant:a?`secondary`:`primary`,size:`sm`,className:`w-full text-xs`,onClick:()=>r(i.id),children:a?`Отключить модуль`:`Включить в контур`})})]},i.id)})})]})};export{c as AppsCatalogModule}; \ No newline at end of file +import{f as e,i as t,r as n,s as r}from"./useToast-CS8pZhce.js";import{dt as i,t as a}from"./index-CrJKtV0u.js";import{t as o}from"./types-CTcNpN0z.js";e();var s=r(),c=()=>{let{customCapabilities:e,toggleCapability:r}=i();return(0,s.jsxs)(`div`,{className:`space-y-4 animate-fade-in`,children:[(0,s.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,s.jsxs)(`div`,{children:[(0,s.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,s.jsx)(`h2`,{className:`text-sm font-bold text-krona-primary`,children:`Каталог приложений & Модульная экосистема Кроны`}),(0,s.jsx)(a,{level:`demo`,size:`sm`})]}),(0,s.jsx)(`p`,{className:`text-xs text-krona-secondary mt-0.5`,children:`Подключайте и отключайте функциональные блоки для адаптации платформы под новые ниши`})]}),(0,s.jsxs)(n,{variant:`gold`,size:`md`,children:[`Всего модулей: `,o.length]})]}),(0,s.jsx)(`div`,{className:`grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-3.5`,children:o.map(i=>{let a=e[i.id];return(0,s.jsxs)(`div`,{className:`p-4 rounded-xl border border-krona-border bg-krona-surface shadow-krona-soft flex flex-col justify-between space-y-3`,children:[(0,s.jsxs)(`div`,{children:[(0,s.jsxs)(`div`,{className:`flex items-center justify-between mb-1.5`,children:[(0,s.jsx)(`span`,{className:`text-[10px] uppercase font-bold text-krona-secondary`,children:i.category}),(0,s.jsx)(n,{variant:a?`green`:`neutral`,size:`sm`,children:a?`Активен`:`Отключен`})]}),(0,s.jsx)(`h4`,{className:`text-xs font-bold text-krona-primary`,children:i.name}),(0,s.jsx)(`p`,{className:`text-[11px] text-krona-secondary mt-1 leading-relaxed`,children:i.description})]}),(0,s.jsx)(`div`,{className:`pt-2 border-t border-krona-border/50 flex justify-end`,children:(0,s.jsx)(t,{variant:a?`secondary`:`primary`,size:`sm`,className:`w-full text-xs`,onClick:()=>r(i.id),children:a?`Отключить модуль`:`Включить в контур`})})]},i.id)})})]})};export{c as AppsCatalogModule}; \ No newline at end of file diff --git a/dist/assets/AreaChart-BnzyacT3.js b/dist/assets/AreaChart-tvNE-d9G.js similarity index 99% rename from dist/assets/AreaChart-BnzyacT3.js rename to dist/assets/AreaChart-tvNE-d9G.js index 121d014..bf91ee9 100644 --- a/dist/assets/AreaChart-BnzyacT3.js +++ b/dist/assets/AreaChart-tvNE-d9G.js @@ -1,4 +1,4 @@ -import{f as e,h as t,m as n,o as r,p as i}from"./useToast-CS8pZhce.js";import{mt as a}from"./index-CNnq9VO5.js";var o=t(e()),s=t(a()),c=`dangerouslySetInnerHTML.onCopy.onCopyCapture.onCut.onCutCapture.onPaste.onPasteCapture.onCompositionEnd.onCompositionEndCapture.onCompositionStart.onCompositionStartCapture.onCompositionUpdate.onCompositionUpdateCapture.onFocus.onFocusCapture.onBlur.onBlurCapture.onChange.onChangeCapture.onBeforeInput.onBeforeInputCapture.onInput.onInputCapture.onReset.onResetCapture.onSubmit.onSubmitCapture.onInvalid.onInvalidCapture.onLoad.onLoadCapture.onError.onErrorCapture.onKeyDown.onKeyDownCapture.onKeyPress.onKeyPressCapture.onKeyUp.onKeyUpCapture.onAbort.onAbortCapture.onCanPlay.onCanPlayCapture.onCanPlayThrough.onCanPlayThroughCapture.onDurationChange.onDurationChangeCapture.onEmptied.onEmptiedCapture.onEncrypted.onEncryptedCapture.onEnded.onEndedCapture.onLoadedData.onLoadedDataCapture.onLoadedMetadata.onLoadedMetadataCapture.onLoadStart.onLoadStartCapture.onPause.onPauseCapture.onPlay.onPlayCapture.onPlaying.onPlayingCapture.onProgress.onProgressCapture.onRateChange.onRateChangeCapture.onSeeked.onSeekedCapture.onSeeking.onSeekingCapture.onStalled.onStalledCapture.onSuspend.onSuspendCapture.onTimeUpdate.onTimeUpdateCapture.onVolumeChange.onVolumeChangeCapture.onWaiting.onWaitingCapture.onAuxClick.onAuxClickCapture.onClick.onClickCapture.onContextMenu.onContextMenuCapture.onDoubleClick.onDoubleClickCapture.onDrag.onDragCapture.onDragEnd.onDragEndCapture.onDragEnter.onDragEnterCapture.onDragExit.onDragExitCapture.onDragLeave.onDragLeaveCapture.onDragOver.onDragOverCapture.onDragStart.onDragStartCapture.onDrop.onDropCapture.onMouseDown.onMouseDownCapture.onMouseEnter.onMouseLeave.onMouseMove.onMouseMoveCapture.onMouseOut.onMouseOutCapture.onMouseOver.onMouseOverCapture.onMouseUp.onMouseUpCapture.onSelect.onSelectCapture.onTouchCancel.onTouchCancelCapture.onTouchEnd.onTouchEndCapture.onTouchMove.onTouchMoveCapture.onTouchStart.onTouchStartCapture.onPointerDown.onPointerDownCapture.onPointerMove.onPointerMoveCapture.onPointerUp.onPointerUpCapture.onPointerCancel.onPointerCancelCapture.onPointerEnter.onPointerEnterCapture.onPointerLeave.onPointerLeaveCapture.onPointerOver.onPointerOverCapture.onPointerOut.onPointerOutCapture.onGotPointerCapture.onGotPointerCaptureCapture.onLostPointerCapture.onLostPointerCaptureCapture.onScroll.onScrollCapture.onWheel.onWheelCapture.onAnimationStart.onAnimationStartCapture.onAnimationEnd.onAnimationEndCapture.onAnimationIteration.onAnimationIterationCapture.onTransitionEnd.onTransitionEndCapture`.split(`.`);function l(e){return typeof e==`string`&&c.includes(e)}var u=new Set(`aria-activedescendant.aria-atomic.aria-autocomplete.aria-busy.aria-checked.aria-colcount.aria-colindex.aria-colspan.aria-controls.aria-current.aria-describedby.aria-details.aria-disabled.aria-errormessage.aria-expanded.aria-flowto.aria-haspopup.aria-hidden.aria-invalid.aria-keyshortcuts.aria-label.aria-labelledby.aria-level.aria-live.aria-modal.aria-multiline.aria-multiselectable.aria-orientation.aria-owns.aria-placeholder.aria-posinset.aria-pressed.aria-readonly.aria-relevant.aria-required.aria-roledescription.aria-rowcount.aria-rowindex.aria-rowspan.aria-selected.aria-setsize.aria-sort.aria-valuemax.aria-valuemin.aria-valuenow.aria-valuetext.className.color.height.id.lang.max.media.method.min.name.style.target.width.role.tabIndex.accentHeight.accumulate.additive.alignmentBaseline.allowReorder.alphabetic.amplitude.arabicForm.ascent.attributeName.attributeType.autoReverse.azimuth.baseFrequency.baselineShift.baseProfile.bbox.begin.bias.by.calcMode.capHeight.clip.clipPath.clipPathUnits.clipRule.colorInterpolation.colorInterpolationFilters.colorProfile.colorRendering.contentScriptType.contentStyleType.cursor.cx.cy.d.decelerate.descent.diffuseConstant.direction.display.divisor.dominantBaseline.dur.dx.dy.edgeMode.elevation.enableBackground.end.exponent.externalResourcesRequired.fill.fillOpacity.fillRule.filter.filterRes.filterUnits.floodColor.floodOpacity.focusable.fontFamily.fontSize.fontSizeAdjust.fontStretch.fontStyle.fontVariant.fontWeight.format.from.fx.fy.g1.g2.glyphName.glyphOrientationHorizontal.glyphOrientationVertical.glyphRef.gradientTransform.gradientUnits.hanging.horizAdvX.horizOriginX.href.ideographic.imageRendering.in2.in.intercept.k1.k2.k3.k4.k.kernelMatrix.kernelUnitLength.kerning.keyPoints.keySplines.keyTimes.lengthAdjust.letterSpacing.lightingColor.limitingConeAngle.local.markerEnd.markerHeight.markerMid.markerStart.markerUnits.markerWidth.mask.maskContentUnits.maskUnits.mathematical.mode.numOctaves.offset.opacity.operator.order.orient.orientation.origin.overflow.overlinePosition.overlineThickness.paintOrder.panose1.pathLength.patternContentUnits.patternTransform.patternUnits.pointerEvents.pointsAtX.pointsAtY.pointsAtZ.preserveAlpha.preserveAspectRatio.primitiveUnits.r.radius.refX.refY.renderingIntent.repeatCount.repeatDur.requiredExtensions.requiredFeatures.restart.result.rotate.rx.ry.seed.shapeRendering.slope.spacing.specularConstant.specularExponent.speed.spreadMethod.startOffset.stdDeviation.stemh.stemv.stitchTiles.stopColor.stopOpacity.strikethroughPosition.strikethroughThickness.string.stroke.strokeDasharray.strokeDashoffset.strokeLinecap.strokeLinejoin.strokeMiterlimit.strokeOpacity.strokeWidth.surfaceScale.systemLanguage.tableValues.targetX.targetY.textAnchor.textDecoration.textLength.textRendering.to.transform.u1.u2.underlinePosition.underlineThickness.unicode.unicodeBidi.unicodeRange.unitsPerEm.vAlphabetic.values.vectorEffect.version.vertAdvY.vertOriginX.vertOriginY.vHanging.vIdeographic.viewTarget.visibility.vMathematical.widths.wordSpacing.writingMode.x1.x2.x.xChannelSelector.xHeight.xlinkActuate.xlinkArcrole.xlinkHref.xlinkRole.xlinkShow.xlinkTitle.xlinkType.xmlBase.xmlLang.xmlns.xmlnsXlink.xmlSpace.y1.y2.y.yChannelSelector.z.zoomAndPan.ref.key.angle`.split(`.`));function d(e){return typeof e==`string`&&u.has(e)}function f(e){return typeof e==`string`&&e.startsWith(`data-`)}function p(e){if(typeof e!=`object`||!e)return{};var t={};for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(d(n)||f(n))&&(t[n]=e[n]);return t}function m(e){if(e==null)return null;if((0,o.isValidElement)(e)&&typeof e.props==`object`&&e.props!==null){var t=e.props;return p(t)}return typeof e==`object`&&!Array.isArray(e)?p(e):null}function h(e){var t={};for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(d(n)||f(n)||l(n))&&(t[n]=e[n]);return t}function g(e){return e==null?null:(0,o.isValidElement)(e)?h(e.props):typeof e==`object`&&!Array.isArray(e)?h(e):null}var _=[`children`,`width`,`height`,`viewBox`,`className`,`style`,`title`,`desc`];function v(){return v=Object.assign?Object.assign.bind():function(e){for(var t=1;t{var n=e.children,i=e.width,a=e.height,s=e.viewBox,c=e.className,l=e.style,u=e.title,d=e.desc,f=y(e,_),p=s||{width:i,height:a,x:0,y:0},m=r(`recharts-surface`,c);return o.createElement(`svg`,v({},h(f),{className:m,width:i,height:a,style:l,viewBox:`${p.x} ${p.y} ${p.width} ${p.height}`,ref:t}),o.createElement(`title`,null,u),o.createElement(`desc`,null,d),n)}),S=[`children`,`className`];function C(){return C=Object.assign?Object.assign.bind():function(e){for(var t=1;t{var n=e.children,i=e.className,a=w(e,S),s=r(`recharts-layer`,i);return o.createElement(`g`,C({className:s},h(a),{ref:t}),n)});function D(e){return e===`__proto__`}var O=/\.|(\[(?:[^[\]]*|(["'])(?:(?!\2)[^\\]|\\.)*?\2)\])/;function k(e){switch(typeof e){case`number`:case`symbol`:return!1;case`string`:return e===``||e.startsWith(`.`)||e.endsWith(`.`)?!1:O.test(e);default:return!1}}function A(e){return typeof e==`string`||typeof e==`symbol`?e:Object.is(e?.valueOf?.(),-0)?`-0`:String(e)}function j(e){return typeof e==`symbol`||e instanceof Symbol}function M(e){return e==null?``:N(e)}function N(e){if(typeof e==`string`)return e;if(Array.isArray(e))return e.map(N).join(`,`);if(j(e))return e.toString();let t=e+``;return t===`0`&&Object.is(Number(e),-0)?`-0`:t}function ee(e){if(Array.isArray(e))return e.map(A);if(typeof e==`symbol`)return[e];e=M(e);let t=[],n=e.length;if(n===0)return t;let r=0,i=``,a=``,o=!1,s=!1,c=/^-?\d+(?:\.\d+)?$/;for(e.charCodeAt(0)===46&&t.push(``);r1&&arguments[1]!==void 0?arguments[1]:re),n=Math.round(e*t)/t;return Object.is(n,-0)?0:n}function P(e){var t=[...arguments].slice(1);return e.reduce((e,n,r)=>{var i=t[r-1];return typeof i==`string`?e+i+n:i===void 0?e+n:e+ie(i)+n},``)}var F=e=>e===0?0:e>0?1:-1,ae=e=>typeof e==`number`&&e!=+e,oe=e=>typeof e==`string`&&e.length>1&&e.indexOf(`%`)===e.length-1,I=e=>(typeof e==`number`||e instanceof Number)&&!ae(e),se=e=>I(e)||typeof e==`string`,ce=0,le=e=>{var t=++ce;return`${e||``}${t}`},ue=function(e,t){var n=arguments.length>2&&arguments[2]!==void 0?arguments[2]:0,r=arguments.length>3&&arguments[3]!==void 0&&arguments[3];if(!I(e)&&typeof e!=`string`)return n;var i;if(oe(e)){if(t==null)return n;var a=e.indexOf(`%`);i=t*parseFloat(e.slice(0,a))/100}else i=+e;return ae(i)&&(i=n),r&&t!=null&&i>t&&(i=t),i},de=e=>{if(!Array.isArray(e))return!1;for(var t=e.length,n={},r=0;re&&(typeof t==`function`?t(e):te(e,t))===n)}var me=e=>e==null,he=e=>me(e)?e:`${e.charAt(0).toUpperCase()}${e.slice(1)}`;function ge(e){return e!=null}function _e(){}function ve(e){if(e)return{x:e.x,y:e.y,upperWidth:`upperWidth`in e?e.upperWidth:e.width,lowerWidth:`lowerWidth`in e?e.lowerWidth:e.width,width:e.width,height:e.height}}function ye(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter(function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable})),n.push.apply(n,r)}return n}function be(e){for(var t=1;t{var t=e.viewBox,n=e.position,r=e.offset,i=r===void 0?0:r,a=e.parentViewBox,o=e.clamp,s=ve(t),c=s.x,l=s.y,u=s.height,d=s.upperWidth,f=s.lowerWidth,p=c,m=c+(d-f)/2,h=(p+m)/2,g=(d+f)/2,_=p+d/2,v=u>=0?1:-1,y=v*i,b=v>0?`end`:`start`,x=v>0?`start`:`end`,S=d>=0?1:-1,C=S*i,w=S>0?`end`:`start`,T=S>0?`start`:`end`,E=a;if(n===`top`){var D={x:p+d/2,y:l-y,horizontalAnchor:`middle`,verticalAnchor:b};return o&&E&&(D.height=Math.max(l-E.y,0),D.width=d),D}if(n===`bottom`){var O={x:m+f/2,y:l+u+y,horizontalAnchor:`middle`,verticalAnchor:x};return o&&E&&(O.height=Math.max(E.y+E.height-(l+u),0),O.width=f),O}if(n===`left`){var k={x:h-C,y:l+u/2,horizontalAnchor:w,verticalAnchor:`middle`};return o&&E&&(k.width=Math.max(k.x-E.x,0),k.height=u),k}if(n===`right`){var A={x:h+g+C,y:l+u/2,horizontalAnchor:T,verticalAnchor:`middle`};return o&&E&&(A.width=Math.max(E.x+E.width-A.x,0),A.height=u),A}var j=o&&E?{width:g,height:u}:{};return n===`insideLeft`?be({x:h+C,y:l+u/2,horizontalAnchor:T,verticalAnchor:`middle`},j):n===`insideRight`?be({x:h+g-C,y:l+u/2,horizontalAnchor:w,verticalAnchor:`middle`},j):n===`insideTop`?be({x:p+d/2,y:l+y,horizontalAnchor:`middle`,verticalAnchor:x},j):n===`insideBottom`?be({x:m+f/2,y:l+u-y,horizontalAnchor:`middle`,verticalAnchor:b},j):n===`insideTopLeft`?be({x:p+C,y:l+y,horizontalAnchor:T,verticalAnchor:x},j):n===`insideTopRight`?be({x:p+d-C,y:l+y,horizontalAnchor:w,verticalAnchor:x},j):n===`insideBottomLeft`?be({x:m+C,y:l+u-y,horizontalAnchor:T,verticalAnchor:b},j):n===`insideBottomRight`?be({x:m+f-C,y:l+u-y,horizontalAnchor:w,verticalAnchor:b},j):n&&typeof n==`object`&&(I(n.x)||oe(n.x))&&(I(n.y)||oe(n.y))?be({x:c+ue(n.x,g),y:l+ue(n.y,u),horizontalAnchor:`end`,verticalAnchor:`end`},j):be({x:_,y:l+u/2,horizontalAnchor:`middle`,verticalAnchor:`middle`},j)},Te=[`top`,`left`,`right`,`bottom`];function Ee(e){return e==null?!1:typeof e==`object`||Te.includes(e)}var De=(0,o.createContext)(null);function L(e){return function(){return e}}var Oe=Math.PI,ke=2*Oe,Ae=1e-6,je=ke-Ae;function Me(e){this._+=e[0];for(let t=1,n=e.length;t=0))throw Error(`invalid digits: ${e}`);if(t>15)return Me;let n=10**t;return function(e){this._+=e[0];for(let t=1,r=e.length;tAe){if(!(Math.abs(u*s-c*l)>Ae)||!i)this._append`L${this._x1=e},${this._y1=t}`;else{let f=n-a,p=r-o,m=s*s+c*c,h=f*f+p*p,g=Math.sqrt(m),_=Math.sqrt(d),v=i*Math.tan((Oe-Math.acos((m+d-h)/(2*g*_)))/2),y=v/_,b=v/g;Math.abs(y-1)>Ae&&this._append`L${e+y*l},${t+y*u}`,this._append`A${i},${i},0,0,${+(u*f>l*p)},${this._x1=e+b*s},${this._y1=t+b*c}`}}}arc(e,t,n,r,i,a){if(e=+e,t=+t,n=+n,a=!!a,n<0)throw Error(`negative radius: ${n}`);let o=n*Math.cos(r),s=n*Math.sin(r),c=e+o,l=t+s,u=1^a,d=a?r-i:i-r;this._x1===null?this._append`M${c},${l}`:(Math.abs(this._x1-c)>Ae||Math.abs(this._y1-l)>Ae)&&this._append`L${c},${l}`,n&&(d<0&&(d=d%ke+ke),d>je?this._append`A${n},${n},0,1,${u},${e-o},${t-s}A${n},${n},0,1,${u},${this._x1=c},${this._y1=l}`:d>Ae&&this._append`A${n},${n},0,${+(d>=Oe)},${u},${this._x1=e+n*Math.cos(i)},${this._y1=t+n*Math.sin(i)}`)}rect(e,t,n,r){this._append`M${this._x0=this._x1=+e},${this._y0=this._y1=+t}h${n=+n}v${+r}h${-n}Z`}toString(){return this._}};Pe.prototype;function Fe(e){let t=3;return e.digits=function(n){if(!arguments.length)return t;if(n==null)t=null;else{let e=Math.floor(n);if(!(e>=0))throw RangeError(`invalid digits: ${n}`);t=e}return e},()=>new Pe(t)}Array.prototype.slice;function Ie(e){return typeof e==`object`&&`length`in e?e:Array.from(e)}function Le(e){this._context=e}Le.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._point=0},lineEnd:function(){(this._line||this._line!==0&&this._point===1)&&this._context.closePath(),this._line=1-this._line},point:function(e,t){switch(e=+e,t=+t,this._point){case 0:this._point=1,this._line?this._context.lineTo(e,t):this._context.moveTo(e,t);break;case 1:this._point=2;default:this._context.lineTo(e,t)}}};function Re(e){return new Le(e)}function ze(e){return e[0]}function Be(e){return e[1]}function Ve(e,t){var n=L(!0),r=null,i=Re,a=null,o=Fe(s);e=typeof e==`function`?e:e===void 0?ze:L(e),t=typeof t==`function`?t:t===void 0?Be:L(t);function s(s){var c,l=(s=Ie(s)).length,u,d=!1,f;for(r??(a=i(f=o())),c=0;c<=l;++c)!(c=d;--f)s.point(_[f],v[f]);s.lineEnd(),s.areaEnd()}}h&&(_[u]=+e(m,u,l),v[u]=+t(m,u,l),s.point(r?+r(m,u,l):_[u],n?+n(m,u,l):v[u]))}if(g)return s=null,g+``||null}function u(){return Ve().defined(i).curve(o).context(a)}return l.x=function(t){return arguments.length?(e=typeof t==`function`?t:L(+t),r=null,l):e},l.x0=function(t){return arguments.length?(e=typeof t==`function`?t:L(+t),l):e},l.x1=function(e){return arguments.length?(r=e==null?null:typeof e==`function`?e:L(+e),l):r},l.y=function(e){return arguments.length?(t=typeof e==`function`?e:L(+e),n=null,l):t},l.y0=function(e){return arguments.length?(t=typeof e==`function`?e:L(+e),l):t},l.y1=function(e){return arguments.length?(n=e==null?null:typeof e==`function`?e:L(+e),l):n},l.lineX0=l.lineY0=function(){return u().x(e).y(t)},l.lineY1=function(){return u().x(e).y(n)},l.lineX1=function(){return u().x(r).y(t)},l.defined=function(e){return arguments.length?(i=typeof e==`function`?e:L(!!e),l):i},l.curve=function(e){return arguments.length?(o=e,a!=null&&(s=o(a)),l):o},l.context=function(e){return arguments.length?(e==null?a=s=null:s=o(a=e),l):a},l}var Ue=class{constructor(e,t){this._context=e,this._x=t}areaStart(){this._line=0}areaEnd(){this._line=NaN}lineStart(){this._point=0}lineEnd(){(this._line||this._line!==0&&this._point===1)&&this._context.closePath(),this._line=1-this._line}point(e,t){switch(e=+e,t=+t,this._point){case 0:this._point=1,this._line?this._context.lineTo(e,t):this._context.moveTo(e,t);break;case 1:this._point=2;default:this._x?this._context.bezierCurveTo(this._x0=(this._x0+e)/2,this._y0,this._x0,t,e,t):this._context.bezierCurveTo(this._x0,this._y0=(this._y0+t)/2,e,this._y0,e,t)}this._x0=e,this._y0=t}};function We(e){return new Ue(e,!0)}function Ge(e){return new Ue(e,!1)}function Ke(){}function qe(e,t,n){e._context.bezierCurveTo((2*e._x0+e._x1)/3,(2*e._y0+e._y1)/3,(e._x0+2*e._x1)/3,(e._y0+2*e._y1)/3,(e._x0+4*e._x1+t)/6,(e._y0+4*e._y1+n)/6)}function Je(e){this._context=e}Je.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x0=this._x1=this._y0=this._y1=NaN,this._point=0},lineEnd:function(){switch(this._point){case 3:qe(this,this._x1,this._y1);case 2:this._context.lineTo(this._x1,this._y1)}(this._line||this._line!==0&&this._point===1)&&this._context.closePath(),this._line=1-this._line},point:function(e,t){switch(e=+e,t=+t,this._point){case 0:this._point=1,this._line?this._context.lineTo(e,t):this._context.moveTo(e,t);break;case 1:this._point=2;break;case 2:this._point=3,this._context.lineTo((5*this._x0+this._x1)/6,(5*this._y0+this._y1)/6);default:qe(this,e,t)}this._x0=this._x1,this._x1=e,this._y0=this._y1,this._y1=t}};function Ye(e){return new Je(e)}function Xe(e){this._context=e}Xe.prototype={areaStart:Ke,areaEnd:Ke,lineStart:function(){this._x0=this._x1=this._x2=this._x3=this._x4=this._y0=this._y1=this._y2=this._y3=this._y4=NaN,this._point=0},lineEnd:function(){switch(this._point){case 1:this._context.moveTo(this._x2,this._y2),this._context.closePath();break;case 2:this._context.moveTo((this._x2+2*this._x3)/3,(this._y2+2*this._y3)/3),this._context.lineTo((this._x3+2*this._x2)/3,(this._y3+2*this._y2)/3),this._context.closePath();break;case 3:this.point(this._x2,this._y2),this.point(this._x3,this._y3),this.point(this._x4,this._y4)}},point:function(e,t){switch(e=+e,t=+t,this._point){case 0:this._point=1,this._x2=e,this._y2=t;break;case 1:this._point=2,this._x3=e,this._y3=t;break;case 2:this._point=3,this._x4=e,this._y4=t,this._context.moveTo((this._x0+4*this._x1+e)/6,(this._y0+4*this._y1+t)/6);break;default:qe(this,e,t)}this._x0=this._x1,this._x1=e,this._y0=this._y1,this._y1=t}};function Ze(e){return new Xe(e)}function Qe(e){this._context=e}Qe.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x0=this._x1=this._y0=this._y1=NaN,this._point=0},lineEnd:function(){(this._line||this._line!==0&&this._point===3)&&this._context.closePath(),this._line=1-this._line},point:function(e,t){switch(e=+e,t=+t,this._point){case 0:this._point=1;break;case 1:this._point=2;break;case 2:this._point=3;var n=(this._x0+4*this._x1+e)/6,r=(this._y0+4*this._y1+t)/6;this._line?this._context.lineTo(n,r):this._context.moveTo(n,r);break;case 3:this._point=4;default:qe(this,e,t)}this._x0=this._x1,this._x1=e,this._y0=this._y1,this._y1=t}};function $e(e){return new Qe(e)}function et(e){this._context=e}et.prototype={areaStart:Ke,areaEnd:Ke,lineStart:function(){this._point=0},lineEnd:function(){this._point&&this._context.closePath()},point:function(e,t){e=+e,t=+t,this._point?this._context.lineTo(e,t):(this._point=1,this._context.moveTo(e,t))}};function tt(e){return new et(e)}function nt(e){return e<0?-1:1}function rt(e,t,n){var r=e._x1-e._x0,i=t-e._x1,a=(e._y1-e._y0)/(r||i<0&&-0),o=(n-e._y1)/(i||r<0&&-0),s=(a*i+o*r)/(r+i);return(nt(a)+nt(o))*Math.min(Math.abs(a),Math.abs(o),.5*Math.abs(s))||0}function it(e,t){var n=e._x1-e._x0;return n?(3*(e._y1-e._y0)/n-t)/2:t}function at(e,t,n){var r=e._x0,i=e._y0,a=e._x1,o=e._y1,s=(a-r)/3;e._context.bezierCurveTo(r+s,i+s*t,a-s,o-s*n,a,o)}function ot(e){this._context=e}ot.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x0=this._x1=this._y0=this._y1=this._t0=NaN,this._point=0},lineEnd:function(){switch(this._point){case 2:this._context.lineTo(this._x1,this._y1);break;case 3:at(this,this._t0,it(this,this._t0))}(this._line||this._line!==0&&this._point===1)&&this._context.closePath(),this._line=1-this._line},point:function(e,t){var n=NaN;if(e=+e,t=+t,e!==this._x1||t!==this._y1){switch(this._point){case 0:this._point=1,this._line?this._context.lineTo(e,t):this._context.moveTo(e,t);break;case 1:this._point=2;break;case 2:this._point=3,at(this,it(this,n=rt(this,e,t)),n);break;default:at(this,this._t0,n=rt(this,e,t))}this._x0=this._x1,this._x1=e,this._y0=this._y1,this._y1=t,this._t0=n}}};function st(e){this._context=new ct(e)}(st.prototype=Object.create(ot.prototype)).point=function(e,t){ot.prototype.point.call(this,t,e)};function ct(e){this._context=e}ct.prototype={moveTo:function(e,t){this._context.moveTo(t,e)},closePath:function(){this._context.closePath()},lineTo:function(e,t){this._context.lineTo(t,e)},bezierCurveTo:function(e,t,n,r,i,a){this._context.bezierCurveTo(t,e,r,n,a,i)}};function lt(e){return new ot(e)}function ut(e){return new st(e)}function dt(e){this._context=e}dt.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x=[],this._y=[]},lineEnd:function(){var e=this._x,t=this._y,n=e.length;if(n){if(this._line?this._context.lineTo(e[0],t[0]):this._context.moveTo(e[0],t[0]),n===2)this._context.lineTo(e[1],t[1]);else for(var r=ft(e),i=ft(t),a=0,o=1;o=0;--t)i[t]=(o[t]-i[t+1])/a[t];for(a[n-1]=(e[n]+i[n-1])/2,t=0;t=0&&(this._t=1-this._t,this._line=1-this._line)},point:function(e,t){switch(e=+e,t=+t,this._point){case 0:this._point=1,this._line?this._context.lineTo(e,t):this._context.moveTo(e,t);break;case 1:this._point=2;default:if(this._t<=0)this._context.lineTo(this._x,t),this._context.lineTo(e,t);else{var n=this._x*(1-this._t)+e*this._t;this._context.lineTo(n,this._y),this._context.lineTo(n,t)}}this._x=e,this._y=t}};function ht(e){return new mt(e,.5)}function gt(e){return new mt(e,0)}function _t(e){return new mt(e,1)}function vt(e,t){if((o=e.length)>1)for(var n=1,r,i,a=e[t[0]],o,s=a.length;n=0;)n[t]=t;return n}function bt(e,t){return e[t]}function xt(e){let t=[];return t.key=e,t}function St(){var e=L([]),t=yt,n=vt,r=bt;function i(i){var a=Array.from(e.apply(this,arguments),xt),o,s=a.length,c=-1,l;for(let e of i)for(o=0,++c;o0){for(var n,r,i=0,a=e[0].length,o;i0){for(var n=0,r=e[t[0]],i,a=r.length;n0&&(a=(i=e[t[0]]).length)>0){for(var n=0,r=1,i,a,o;r`radius`in e&&`startAngle`in e&&`endAngle`in e,Dt=(e,t)=>{if(!e||typeof e==`function`||typeof e==`boolean`)return null;var n=e;if((0,o.isValidElement)(e)&&(n=e.props),typeof n!=`object`&&typeof n!=`function`)return null;var r={};return Object.keys(n).forEach(e=>{l(e)&&typeof n[e]==`function`&&(r[e]=t||(t=>n[e](n,t)))}),r},Ot=(e,t,n)=>r=>(e(t,n,r),null),kt=(e,t,n)=>{if(e===null||typeof e!=`object`&&typeof e!=`function`)return null;var r=null;return Object.keys(e).forEach(i=>{var a=e[i];l(i)&&typeof a==`function`&&(r||={},r[i]=Ot(a,t,n))}),r};function At(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter(function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable})),n.push.apply(n,r)}return n}function jt(e){for(var t=1;t(e[t]===void 0&&r[t]!==void 0&&(e[t]=r[t]),e),n)}function It(e,t){let n=new Map;for(let r=0;r=0}function Bt(e){return e!=null&&typeof e!=`function`&&zt(e.length)}function Vt(e){return function(t){return te(t,e)}}function Ht(e){return e==null||typeof e!=`object`&&typeof e!=`function`}function Ut(e){return ArrayBuffer.isView(e)&&!(e instanceof DataView)}function Wt(e){return Object.getOwnPropertySymbols(e).filter(t=>Object.prototype.propertyIsEnumerable.call(e,t))}function Gt(e){return e==null?e===void 0?`[object Undefined]`:`[object Null]`:Object.prototype.toString.call(e)}var Kt=`[object RegExp]`,qt=`[object String]`,Jt=`[object Number]`,Yt=`[object Boolean]`,Xt=`[object Arguments]`,Zt=`[object Symbol]`,Qt=`[object Date]`,$t=`[object Map]`,en=`[object Set]`,tn=`[object Array]`,nn=`[object Function]`,rn=`[object ArrayBuffer]`,an=`[object Object]`,on=`[object Error]`,sn=`[object DataView]`,cn=`[object Uint8Array]`,ln=`[object Uint8ClampedArray]`,un=`[object Uint16Array]`,dn=`[object Uint32Array]`,fn=`[object BigUint64Array]`,pn=`[object Int8Array]`,mn=`[object Int16Array]`,hn=`[object Int32Array]`,gn=`[object BigInt64Array]`,_n=`[object Float32Array]`,vn=`[object Float64Array]`,yn=typeof globalThis==`object`&&globalThis||typeof window==`object`&&window||typeof self==`object`&&self||typeof global==`object`&&global||(function(){return this})();function bn(e){return yn.Buffer!==void 0&&yn.Buffer.isBuffer(e)}function xn(e,t){return Sn(e,void 0,e,new Map,t)}function Sn(e,t,n,r=new Map,i=void 0){let a=i?.(e,t,n,r);if(a!==void 0)return a;if(Ht(e))return e;if(r.has(e))return r.get(e);if(Array.isArray(e)){let t=Array(e.length);r.set(e,t);for(let a=0;avoid 0)}function kn(e,t,n,r,i=!1){if(t===e)return!0;switch(typeof t){case`object`:return An(e,t,n,r,i);case`function`:return Object.keys(t).length>0?kn(e,{...t},n,r,i):En(e,t);default:return Dn(e)&&i?typeof t!=`string`||t===``:En(e,t)}}function An(e,t,n,r,i=!1){if(t==null)return!0;if(Array.isArray(t))return Mn(e,t,n,r);if(t instanceof Map)return jn(e,t,n,r);if(t instanceof Set)return Nn(e,t,n,r);let a=Object.keys(t);if(e==null)return i&&a.length===0;if(i)Ht(e)&&(e=Object(e));else{let t=Gt(e);if(t!==`[object Object]`&&t!==`[object Arguments]`)return!1}if(a.length===0)return!0;if(r?.has(t))return r.get(t)===e;r?.set(t,e);try{for(let i=0;ivoid 0)}function Fn(e){return e=Tn(e),t=>Pn(t,e)}function In(e,t){return xn(e,(n,r,i,a)=>{let o=t?.(n,r,i,a);if(o!==void 0)return o;if(typeof e==`object`){if(Gt(e)===`[object Object]`&&typeof e.constructor!=`function`){let t={};return a.set(e,t),Cn(t,e,i,a),t}switch(Object.prototype.toString.call(e)){case Jt:case qt:case Yt:{let t=new e.constructor(e?.valueOf());return Cn(t,e),t}case Xt:{let t={};return Cn(t,e),t.length=e.length,t[Symbol.iterator]=e[Symbol.iterator],t}default:return}}})}function Ln(e){return In(e)}var Rn=/^(?:0|[1-9]\d*)$/;function zn(e,t=2**53-1){switch(typeof e){case`number`:return Number.isInteger(e)&&e>=0&&e{var n=e();function r(e,t){return e===t&&(e!==0||1/e==1/t)||e!==e&&t!==t}var i=typeof Object.is==`function`?Object.is:r,a=n.useState,o=n.useEffect,s=n.useLayoutEffect,c=n.useDebugValue;function l(e,t){var n=t(),r=a({inst:{value:n,getSnapshot:t}}),i=r[0].inst,l=r[1];return s(function(){i.value=n,i.getSnapshot=t,u(i)&&l({inst:i})},[e,n,t]),o(function(){return u(i)&&l({inst:i}),e(function(){u(i)&&l({inst:i})})},[e]),c(n),n}function u(e){var t=e.getSnapshot;e=e.value;try{var n=t();return!i(e,n)}catch{return!0}}function d(e,t){return t()}var f=typeof window>`u`||window.document===void 0||window.document.createElement===void 0?d:l;t.useSyncExternalStore=n.useSyncExternalStore===void 0?f:n.useSyncExternalStore})),Jn=i(((e,t)=>{t.exports=qn()})),Yn=i((t=>{var n=e(),r=Jn();function i(e,t){return e===t&&(e!==0||1/e==1/t)||e!==e&&t!==t}var a=typeof Object.is==`function`?Object.is:i,o=r.useSyncExternalStore,s=n.useRef,c=n.useEffect,l=n.useMemo,u=n.useDebugValue;t.useSyncExternalStoreWithSelector=function(e,t,n,r,i){var d=s(null);if(d.current===null){var f={hasValue:!1,value:null};d.current=f}else f=d.current;d=l(function(){function e(e){if(!o){if(o=!0,s=e,e=r(e),i!==void 0&&f.hasValue){var t=f.value;if(i(t,e))return c=t}return c=e}if(t=c,a(s,e))return t;var n=r(e);return i!==void 0&&i(t,n)?(s=e,t):(s=e,c=n)}var o=!1,s,c,l=n===void 0?null:n;return[function(){return e(t())},l===null?void 0:function(){return e(l())}]},[t,n,r,i]);var p=o(e,d[0],d[1]);return c(function(){f.hasValue=!0,f.value=p},[p]),u(p),p}})),Xn=i(((e,t)=>{t.exports=Yn()}))(),Zn=(0,o.createContext)(null),Qn=e=>e,R=()=>{var e=(0,o.useContext)(Zn);return e?e.store.dispatch:Qn},$n=()=>{},er=()=>$n,tr=(e,t)=>e===t;function z(e){var t=(0,o.useContext)(Zn),n=(0,o.useMemo)(()=>t?t=>{if(t!=null)return e(t)}:$n,[t,e]);return(0,Xn.useSyncExternalStoreWithSelector)(t?t.subscription.addNestedSub:er,t?t.store.getState:$n,t?t.store.getState:$n,n,tr)}function nr(e,t=`expected a function, instead received ${typeof e}`){if(typeof e!=`function`)throw TypeError(t)}function rr(e,t=`expected all items to be functions, instead received the following types: `){if(!e.every(e=>typeof e==`function`)){let n=e.map(e=>typeof e==`function`?`function ${e.name||`unnamed`}()`:typeof e).join(`, `);throw TypeError(`${t}[${n}]`)}}var ir=e=>Array.isArray(e)?e:[e];function ar(e){let t=Array.isArray(e[0])?e[0]:e;return rr(t,`createSelector expects all input-selectors to be functions, but received the following types: `),t}function or(e,t){let n=[],{length:r}=e;for(let i=0;i`u`?sr:WeakRef,lr=0,ur=1;function dr(){return{s:lr,v:void 0,o:null,p:null}}function fr(e){return e instanceof cr?e.deref():e}function pr(e,t={}){let n=dr(),{resultEqualityCheck:r}=t,i,a=0;function o(){let t=n,{length:o}=arguments;for(let e=0,n=o;e{n=dr(),o.resetResultsCount()},o.resultsCount=()=>a,o.resetResultsCount=()=>{a=0},o}function mr(e,...t){let n=typeof e==`function`?{memoize:e,memoizeOptions:t}:e,r=(...e)=>{let t=0,r=0,i,a={},o=e.pop();typeof o==`object`&&(a=o,o=e.pop()),nr(o,`createSelector expects an output function after the inputs, but received: [${typeof o}]`);let{memoize:s,memoizeOptions:c=[],argsMemoize:l=pr,argsMemoizeOptions:u=[]}={...n,...a},d=ir(c),f=ir(u),p=ar(e),m=s(function(){return t++,o.apply(null,arguments)},...d),h=l(function(){r++;let e=or(p,arguments);return i=m.apply(null,e),i},...f);return Object.assign(h,{resultFunc:o,memoizedResultFunc:m,dependencies:p,dependencyRecomputations:()=>r,resetDependencyRecomputations:()=>{r=0},lastResult:()=>i,recomputations:()=>t,resetRecomputations:()=>{t=0},memoize:s,argsMemoize:l})};return Object.assign(r,{withTypes:()=>r}),r}var B=mr(pr);function hr(e,t=1){let n=[],r=Math.floor(t),i=(e,t)=>{for(let a=0;a{if(e!==t){let r=_r(e),i=_r(t);if(r===i&&r===0){if(et)return n===`desc`?-1:1}return n===`desc`?i-r:r-i}return 0},yr=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,br=/^\w*$/;function xr(e,t){return Array.isArray(e)?!1:typeof e==`number`||typeof e==`boolean`||e==null||j(e)?!0:typeof e==`string`&&(br.test(e)||!yr.test(e))||t!=null&&Object.hasOwn(t,e)}function Sr(e,t,n,r){if(e==null)return[];n=r?void 0:n,Array.isArray(e)||(e=Bt(e)?Array.from(e):Object.values(e)),Array.isArray(t)||(t=t==null?[null]:[t]),t.length===0&&(t=[null]),Array.isArray(n)||(n=n==null?[]:[n]),n=n.map(e=>String(e));let i=(e,t)=>{let n=e,r=0;for(;r0&&r===t.length?n:void 0},a=(e,t)=>{if(e==null)return t;if(t!=null)return typeof e==`object`&&`key`in e?Object.hasOwn(t,e.key)?t[e.key]:i(t,e.path):typeof e==`function`?e(t):Array.isArray(e)?i(t,e):t[e]},o=t.map(e=>(Array.isArray(e)&&e.length===1&&(e=e[0]),e==null||typeof e==`function`||Array.isArray(e)||xr(e)?e:{key:e,path:ee(e)}));return e.map(e=>({original:e,criteria:o.map(t=>a(t,e))})).slice().sort((e,t)=>{for(let r=0;re.original)}function Cr(e,...t){let n=t.length;return n>1&&gr(e,t[0],t[1])?t=[]:n>2&&gr(t[0],t[1],t[2])&&(t=[t[0]]),Sr(e,hr(t),[`asc`])}var wr=e=>e.legend.settings,Tr=e=>e.legend.size;B([e=>e.legend.payload,wr],(e,t)=>{var n=t.itemSorter,r=e.flat(1);return n?Cr(r,n):r});function Er(e,t){return jr(e)||Ar(e,t)||Or(e,t)||Dr()}function Dr(){throw TypeError(`Invalid attempt to destructure non-iterable instance. +import{f as e,h as t,m as n,o as r,p as i}from"./useToast-CS8pZhce.js";import{gt as a}from"./index-CrJKtV0u.js";var o=t(e()),s=t(a()),c=`dangerouslySetInnerHTML.onCopy.onCopyCapture.onCut.onCutCapture.onPaste.onPasteCapture.onCompositionEnd.onCompositionEndCapture.onCompositionStart.onCompositionStartCapture.onCompositionUpdate.onCompositionUpdateCapture.onFocus.onFocusCapture.onBlur.onBlurCapture.onChange.onChangeCapture.onBeforeInput.onBeforeInputCapture.onInput.onInputCapture.onReset.onResetCapture.onSubmit.onSubmitCapture.onInvalid.onInvalidCapture.onLoad.onLoadCapture.onError.onErrorCapture.onKeyDown.onKeyDownCapture.onKeyPress.onKeyPressCapture.onKeyUp.onKeyUpCapture.onAbort.onAbortCapture.onCanPlay.onCanPlayCapture.onCanPlayThrough.onCanPlayThroughCapture.onDurationChange.onDurationChangeCapture.onEmptied.onEmptiedCapture.onEncrypted.onEncryptedCapture.onEnded.onEndedCapture.onLoadedData.onLoadedDataCapture.onLoadedMetadata.onLoadedMetadataCapture.onLoadStart.onLoadStartCapture.onPause.onPauseCapture.onPlay.onPlayCapture.onPlaying.onPlayingCapture.onProgress.onProgressCapture.onRateChange.onRateChangeCapture.onSeeked.onSeekedCapture.onSeeking.onSeekingCapture.onStalled.onStalledCapture.onSuspend.onSuspendCapture.onTimeUpdate.onTimeUpdateCapture.onVolumeChange.onVolumeChangeCapture.onWaiting.onWaitingCapture.onAuxClick.onAuxClickCapture.onClick.onClickCapture.onContextMenu.onContextMenuCapture.onDoubleClick.onDoubleClickCapture.onDrag.onDragCapture.onDragEnd.onDragEndCapture.onDragEnter.onDragEnterCapture.onDragExit.onDragExitCapture.onDragLeave.onDragLeaveCapture.onDragOver.onDragOverCapture.onDragStart.onDragStartCapture.onDrop.onDropCapture.onMouseDown.onMouseDownCapture.onMouseEnter.onMouseLeave.onMouseMove.onMouseMoveCapture.onMouseOut.onMouseOutCapture.onMouseOver.onMouseOverCapture.onMouseUp.onMouseUpCapture.onSelect.onSelectCapture.onTouchCancel.onTouchCancelCapture.onTouchEnd.onTouchEndCapture.onTouchMove.onTouchMoveCapture.onTouchStart.onTouchStartCapture.onPointerDown.onPointerDownCapture.onPointerMove.onPointerMoveCapture.onPointerUp.onPointerUpCapture.onPointerCancel.onPointerCancelCapture.onPointerEnter.onPointerEnterCapture.onPointerLeave.onPointerLeaveCapture.onPointerOver.onPointerOverCapture.onPointerOut.onPointerOutCapture.onGotPointerCapture.onGotPointerCaptureCapture.onLostPointerCapture.onLostPointerCaptureCapture.onScroll.onScrollCapture.onWheel.onWheelCapture.onAnimationStart.onAnimationStartCapture.onAnimationEnd.onAnimationEndCapture.onAnimationIteration.onAnimationIterationCapture.onTransitionEnd.onTransitionEndCapture`.split(`.`);function l(e){return typeof e==`string`&&c.includes(e)}var u=new Set(`aria-activedescendant.aria-atomic.aria-autocomplete.aria-busy.aria-checked.aria-colcount.aria-colindex.aria-colspan.aria-controls.aria-current.aria-describedby.aria-details.aria-disabled.aria-errormessage.aria-expanded.aria-flowto.aria-haspopup.aria-hidden.aria-invalid.aria-keyshortcuts.aria-label.aria-labelledby.aria-level.aria-live.aria-modal.aria-multiline.aria-multiselectable.aria-orientation.aria-owns.aria-placeholder.aria-posinset.aria-pressed.aria-readonly.aria-relevant.aria-required.aria-roledescription.aria-rowcount.aria-rowindex.aria-rowspan.aria-selected.aria-setsize.aria-sort.aria-valuemax.aria-valuemin.aria-valuenow.aria-valuetext.className.color.height.id.lang.max.media.method.min.name.style.target.width.role.tabIndex.accentHeight.accumulate.additive.alignmentBaseline.allowReorder.alphabetic.amplitude.arabicForm.ascent.attributeName.attributeType.autoReverse.azimuth.baseFrequency.baselineShift.baseProfile.bbox.begin.bias.by.calcMode.capHeight.clip.clipPath.clipPathUnits.clipRule.colorInterpolation.colorInterpolationFilters.colorProfile.colorRendering.contentScriptType.contentStyleType.cursor.cx.cy.d.decelerate.descent.diffuseConstant.direction.display.divisor.dominantBaseline.dur.dx.dy.edgeMode.elevation.enableBackground.end.exponent.externalResourcesRequired.fill.fillOpacity.fillRule.filter.filterRes.filterUnits.floodColor.floodOpacity.focusable.fontFamily.fontSize.fontSizeAdjust.fontStretch.fontStyle.fontVariant.fontWeight.format.from.fx.fy.g1.g2.glyphName.glyphOrientationHorizontal.glyphOrientationVertical.glyphRef.gradientTransform.gradientUnits.hanging.horizAdvX.horizOriginX.href.ideographic.imageRendering.in2.in.intercept.k1.k2.k3.k4.k.kernelMatrix.kernelUnitLength.kerning.keyPoints.keySplines.keyTimes.lengthAdjust.letterSpacing.lightingColor.limitingConeAngle.local.markerEnd.markerHeight.markerMid.markerStart.markerUnits.markerWidth.mask.maskContentUnits.maskUnits.mathematical.mode.numOctaves.offset.opacity.operator.order.orient.orientation.origin.overflow.overlinePosition.overlineThickness.paintOrder.panose1.pathLength.patternContentUnits.patternTransform.patternUnits.pointerEvents.pointsAtX.pointsAtY.pointsAtZ.preserveAlpha.preserveAspectRatio.primitiveUnits.r.radius.refX.refY.renderingIntent.repeatCount.repeatDur.requiredExtensions.requiredFeatures.restart.result.rotate.rx.ry.seed.shapeRendering.slope.spacing.specularConstant.specularExponent.speed.spreadMethod.startOffset.stdDeviation.stemh.stemv.stitchTiles.stopColor.stopOpacity.strikethroughPosition.strikethroughThickness.string.stroke.strokeDasharray.strokeDashoffset.strokeLinecap.strokeLinejoin.strokeMiterlimit.strokeOpacity.strokeWidth.surfaceScale.systemLanguage.tableValues.targetX.targetY.textAnchor.textDecoration.textLength.textRendering.to.transform.u1.u2.underlinePosition.underlineThickness.unicode.unicodeBidi.unicodeRange.unitsPerEm.vAlphabetic.values.vectorEffect.version.vertAdvY.vertOriginX.vertOriginY.vHanging.vIdeographic.viewTarget.visibility.vMathematical.widths.wordSpacing.writingMode.x1.x2.x.xChannelSelector.xHeight.xlinkActuate.xlinkArcrole.xlinkHref.xlinkRole.xlinkShow.xlinkTitle.xlinkType.xmlBase.xmlLang.xmlns.xmlnsXlink.xmlSpace.y1.y2.y.yChannelSelector.z.zoomAndPan.ref.key.angle`.split(`.`));function d(e){return typeof e==`string`&&u.has(e)}function f(e){return typeof e==`string`&&e.startsWith(`data-`)}function p(e){if(typeof e!=`object`||!e)return{};var t={};for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(d(n)||f(n))&&(t[n]=e[n]);return t}function m(e){if(e==null)return null;if((0,o.isValidElement)(e)&&typeof e.props==`object`&&e.props!==null){var t=e.props;return p(t)}return typeof e==`object`&&!Array.isArray(e)?p(e):null}function h(e){var t={};for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(d(n)||f(n)||l(n))&&(t[n]=e[n]);return t}function g(e){return e==null?null:(0,o.isValidElement)(e)?h(e.props):typeof e==`object`&&!Array.isArray(e)?h(e):null}var _=[`children`,`width`,`height`,`viewBox`,`className`,`style`,`title`,`desc`];function v(){return v=Object.assign?Object.assign.bind():function(e){for(var t=1;t{var n=e.children,i=e.width,a=e.height,s=e.viewBox,c=e.className,l=e.style,u=e.title,d=e.desc,f=y(e,_),p=s||{width:i,height:a,x:0,y:0},m=r(`recharts-surface`,c);return o.createElement(`svg`,v({},h(f),{className:m,width:i,height:a,style:l,viewBox:`${p.x} ${p.y} ${p.width} ${p.height}`,ref:t}),o.createElement(`title`,null,u),o.createElement(`desc`,null,d),n)}),S=[`children`,`className`];function C(){return C=Object.assign?Object.assign.bind():function(e){for(var t=1;t{var n=e.children,i=e.className,a=w(e,S),s=r(`recharts-layer`,i);return o.createElement(`g`,C({className:s},h(a),{ref:t}),n)});function D(e){return e===`__proto__`}var O=/\.|(\[(?:[^[\]]*|(["'])(?:(?!\2)[^\\]|\\.)*?\2)\])/;function k(e){switch(typeof e){case`number`:case`symbol`:return!1;case`string`:return e===``||e.startsWith(`.`)||e.endsWith(`.`)?!1:O.test(e);default:return!1}}function A(e){return typeof e==`string`||typeof e==`symbol`?e:Object.is(e?.valueOf?.(),-0)?`-0`:String(e)}function j(e){return typeof e==`symbol`||e instanceof Symbol}function M(e){return e==null?``:N(e)}function N(e){if(typeof e==`string`)return e;if(Array.isArray(e))return e.map(N).join(`,`);if(j(e))return e.toString();let t=e+``;return t===`0`&&Object.is(Number(e),-0)?`-0`:t}function ee(e){if(Array.isArray(e))return e.map(A);if(typeof e==`symbol`)return[e];e=M(e);let t=[],n=e.length;if(n===0)return t;let r=0,i=``,a=``,o=!1,s=!1,c=/^-?\d+(?:\.\d+)?$/;for(e.charCodeAt(0)===46&&t.push(``);r1&&arguments[1]!==void 0?arguments[1]:re),n=Math.round(e*t)/t;return Object.is(n,-0)?0:n}function P(e){var t=[...arguments].slice(1);return e.reduce((e,n,r)=>{var i=t[r-1];return typeof i==`string`?e+i+n:i===void 0?e+n:e+ie(i)+n},``)}var F=e=>e===0?0:e>0?1:-1,ae=e=>typeof e==`number`&&e!=+e,oe=e=>typeof e==`string`&&e.length>1&&e.indexOf(`%`)===e.length-1,I=e=>(typeof e==`number`||e instanceof Number)&&!ae(e),se=e=>I(e)||typeof e==`string`,ce=0,le=e=>{var t=++ce;return`${e||``}${t}`},ue=function(e,t){var n=arguments.length>2&&arguments[2]!==void 0?arguments[2]:0,r=arguments.length>3&&arguments[3]!==void 0&&arguments[3];if(!I(e)&&typeof e!=`string`)return n;var i;if(oe(e)){if(t==null)return n;var a=e.indexOf(`%`);i=t*parseFloat(e.slice(0,a))/100}else i=+e;return ae(i)&&(i=n),r&&t!=null&&i>t&&(i=t),i},de=e=>{if(!Array.isArray(e))return!1;for(var t=e.length,n={},r=0;re&&(typeof t==`function`?t(e):te(e,t))===n)}var me=e=>e==null,he=e=>me(e)?e:`${e.charAt(0).toUpperCase()}${e.slice(1)}`;function ge(e){return e!=null}function _e(){}function ve(e){if(e)return{x:e.x,y:e.y,upperWidth:`upperWidth`in e?e.upperWidth:e.width,lowerWidth:`lowerWidth`in e?e.lowerWidth:e.width,width:e.width,height:e.height}}function ye(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter(function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable})),n.push.apply(n,r)}return n}function be(e){for(var t=1;t{var t=e.viewBox,n=e.position,r=e.offset,i=r===void 0?0:r,a=e.parentViewBox,o=e.clamp,s=ve(t),c=s.x,l=s.y,u=s.height,d=s.upperWidth,f=s.lowerWidth,p=c,m=c+(d-f)/2,h=(p+m)/2,g=(d+f)/2,_=p+d/2,v=u>=0?1:-1,y=v*i,b=v>0?`end`:`start`,x=v>0?`start`:`end`,S=d>=0?1:-1,C=S*i,w=S>0?`end`:`start`,T=S>0?`start`:`end`,E=a;if(n===`top`){var D={x:p+d/2,y:l-y,horizontalAnchor:`middle`,verticalAnchor:b};return o&&E&&(D.height=Math.max(l-E.y,0),D.width=d),D}if(n===`bottom`){var O={x:m+f/2,y:l+u+y,horizontalAnchor:`middle`,verticalAnchor:x};return o&&E&&(O.height=Math.max(E.y+E.height-(l+u),0),O.width=f),O}if(n===`left`){var k={x:h-C,y:l+u/2,horizontalAnchor:w,verticalAnchor:`middle`};return o&&E&&(k.width=Math.max(k.x-E.x,0),k.height=u),k}if(n===`right`){var A={x:h+g+C,y:l+u/2,horizontalAnchor:T,verticalAnchor:`middle`};return o&&E&&(A.width=Math.max(E.x+E.width-A.x,0),A.height=u),A}var j=o&&E?{width:g,height:u}:{};return n===`insideLeft`?be({x:h+C,y:l+u/2,horizontalAnchor:T,verticalAnchor:`middle`},j):n===`insideRight`?be({x:h+g-C,y:l+u/2,horizontalAnchor:w,verticalAnchor:`middle`},j):n===`insideTop`?be({x:p+d/2,y:l+y,horizontalAnchor:`middle`,verticalAnchor:x},j):n===`insideBottom`?be({x:m+f/2,y:l+u-y,horizontalAnchor:`middle`,verticalAnchor:b},j):n===`insideTopLeft`?be({x:p+C,y:l+y,horizontalAnchor:T,verticalAnchor:x},j):n===`insideTopRight`?be({x:p+d-C,y:l+y,horizontalAnchor:w,verticalAnchor:x},j):n===`insideBottomLeft`?be({x:m+C,y:l+u-y,horizontalAnchor:T,verticalAnchor:b},j):n===`insideBottomRight`?be({x:m+f-C,y:l+u-y,horizontalAnchor:w,verticalAnchor:b},j):n&&typeof n==`object`&&(I(n.x)||oe(n.x))&&(I(n.y)||oe(n.y))?be({x:c+ue(n.x,g),y:l+ue(n.y,u),horizontalAnchor:`end`,verticalAnchor:`end`},j):be({x:_,y:l+u/2,horizontalAnchor:`middle`,verticalAnchor:`middle`},j)},Te=[`top`,`left`,`right`,`bottom`];function Ee(e){return e==null?!1:typeof e==`object`||Te.includes(e)}var De=(0,o.createContext)(null);function L(e){return function(){return e}}var Oe=Math.PI,ke=2*Oe,Ae=1e-6,je=ke-Ae;function Me(e){this._+=e[0];for(let t=1,n=e.length;t=0))throw Error(`invalid digits: ${e}`);if(t>15)return Me;let n=10**t;return function(e){this._+=e[0];for(let t=1,r=e.length;tAe){if(!(Math.abs(u*s-c*l)>Ae)||!i)this._append`L${this._x1=e},${this._y1=t}`;else{let f=n-a,p=r-o,m=s*s+c*c,h=f*f+p*p,g=Math.sqrt(m),_=Math.sqrt(d),v=i*Math.tan((Oe-Math.acos((m+d-h)/(2*g*_)))/2),y=v/_,b=v/g;Math.abs(y-1)>Ae&&this._append`L${e+y*l},${t+y*u}`,this._append`A${i},${i},0,0,${+(u*f>l*p)},${this._x1=e+b*s},${this._y1=t+b*c}`}}}arc(e,t,n,r,i,a){if(e=+e,t=+t,n=+n,a=!!a,n<0)throw Error(`negative radius: ${n}`);let o=n*Math.cos(r),s=n*Math.sin(r),c=e+o,l=t+s,u=1^a,d=a?r-i:i-r;this._x1===null?this._append`M${c},${l}`:(Math.abs(this._x1-c)>Ae||Math.abs(this._y1-l)>Ae)&&this._append`L${c},${l}`,n&&(d<0&&(d=d%ke+ke),d>je?this._append`A${n},${n},0,1,${u},${e-o},${t-s}A${n},${n},0,1,${u},${this._x1=c},${this._y1=l}`:d>Ae&&this._append`A${n},${n},0,${+(d>=Oe)},${u},${this._x1=e+n*Math.cos(i)},${this._y1=t+n*Math.sin(i)}`)}rect(e,t,n,r){this._append`M${this._x0=this._x1=+e},${this._y0=this._y1=+t}h${n=+n}v${+r}h${-n}Z`}toString(){return this._}};Pe.prototype;function Fe(e){let t=3;return e.digits=function(n){if(!arguments.length)return t;if(n==null)t=null;else{let e=Math.floor(n);if(!(e>=0))throw RangeError(`invalid digits: ${n}`);t=e}return e},()=>new Pe(t)}Array.prototype.slice;function Ie(e){return typeof e==`object`&&`length`in e?e:Array.from(e)}function Le(e){this._context=e}Le.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._point=0},lineEnd:function(){(this._line||this._line!==0&&this._point===1)&&this._context.closePath(),this._line=1-this._line},point:function(e,t){switch(e=+e,t=+t,this._point){case 0:this._point=1,this._line?this._context.lineTo(e,t):this._context.moveTo(e,t);break;case 1:this._point=2;default:this._context.lineTo(e,t)}}};function Re(e){return new Le(e)}function ze(e){return e[0]}function Be(e){return e[1]}function Ve(e,t){var n=L(!0),r=null,i=Re,a=null,o=Fe(s);e=typeof e==`function`?e:e===void 0?ze:L(e),t=typeof t==`function`?t:t===void 0?Be:L(t);function s(s){var c,l=(s=Ie(s)).length,u,d=!1,f;for(r??(a=i(f=o())),c=0;c<=l;++c)!(c=d;--f)s.point(_[f],v[f]);s.lineEnd(),s.areaEnd()}}h&&(_[u]=+e(m,u,l),v[u]=+t(m,u,l),s.point(r?+r(m,u,l):_[u],n?+n(m,u,l):v[u]))}if(g)return s=null,g+``||null}function u(){return Ve().defined(i).curve(o).context(a)}return l.x=function(t){return arguments.length?(e=typeof t==`function`?t:L(+t),r=null,l):e},l.x0=function(t){return arguments.length?(e=typeof t==`function`?t:L(+t),l):e},l.x1=function(e){return arguments.length?(r=e==null?null:typeof e==`function`?e:L(+e),l):r},l.y=function(e){return arguments.length?(t=typeof e==`function`?e:L(+e),n=null,l):t},l.y0=function(e){return arguments.length?(t=typeof e==`function`?e:L(+e),l):t},l.y1=function(e){return arguments.length?(n=e==null?null:typeof e==`function`?e:L(+e),l):n},l.lineX0=l.lineY0=function(){return u().x(e).y(t)},l.lineY1=function(){return u().x(e).y(n)},l.lineX1=function(){return u().x(r).y(t)},l.defined=function(e){return arguments.length?(i=typeof e==`function`?e:L(!!e),l):i},l.curve=function(e){return arguments.length?(o=e,a!=null&&(s=o(a)),l):o},l.context=function(e){return arguments.length?(e==null?a=s=null:s=o(a=e),l):a},l}var Ue=class{constructor(e,t){this._context=e,this._x=t}areaStart(){this._line=0}areaEnd(){this._line=NaN}lineStart(){this._point=0}lineEnd(){(this._line||this._line!==0&&this._point===1)&&this._context.closePath(),this._line=1-this._line}point(e,t){switch(e=+e,t=+t,this._point){case 0:this._point=1,this._line?this._context.lineTo(e,t):this._context.moveTo(e,t);break;case 1:this._point=2;default:this._x?this._context.bezierCurveTo(this._x0=(this._x0+e)/2,this._y0,this._x0,t,e,t):this._context.bezierCurveTo(this._x0,this._y0=(this._y0+t)/2,e,this._y0,e,t)}this._x0=e,this._y0=t}};function We(e){return new Ue(e,!0)}function Ge(e){return new Ue(e,!1)}function Ke(){}function qe(e,t,n){e._context.bezierCurveTo((2*e._x0+e._x1)/3,(2*e._y0+e._y1)/3,(e._x0+2*e._x1)/3,(e._y0+2*e._y1)/3,(e._x0+4*e._x1+t)/6,(e._y0+4*e._y1+n)/6)}function Je(e){this._context=e}Je.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x0=this._x1=this._y0=this._y1=NaN,this._point=0},lineEnd:function(){switch(this._point){case 3:qe(this,this._x1,this._y1);case 2:this._context.lineTo(this._x1,this._y1)}(this._line||this._line!==0&&this._point===1)&&this._context.closePath(),this._line=1-this._line},point:function(e,t){switch(e=+e,t=+t,this._point){case 0:this._point=1,this._line?this._context.lineTo(e,t):this._context.moveTo(e,t);break;case 1:this._point=2;break;case 2:this._point=3,this._context.lineTo((5*this._x0+this._x1)/6,(5*this._y0+this._y1)/6);default:qe(this,e,t)}this._x0=this._x1,this._x1=e,this._y0=this._y1,this._y1=t}};function Ye(e){return new Je(e)}function Xe(e){this._context=e}Xe.prototype={areaStart:Ke,areaEnd:Ke,lineStart:function(){this._x0=this._x1=this._x2=this._x3=this._x4=this._y0=this._y1=this._y2=this._y3=this._y4=NaN,this._point=0},lineEnd:function(){switch(this._point){case 1:this._context.moveTo(this._x2,this._y2),this._context.closePath();break;case 2:this._context.moveTo((this._x2+2*this._x3)/3,(this._y2+2*this._y3)/3),this._context.lineTo((this._x3+2*this._x2)/3,(this._y3+2*this._y2)/3),this._context.closePath();break;case 3:this.point(this._x2,this._y2),this.point(this._x3,this._y3),this.point(this._x4,this._y4)}},point:function(e,t){switch(e=+e,t=+t,this._point){case 0:this._point=1,this._x2=e,this._y2=t;break;case 1:this._point=2,this._x3=e,this._y3=t;break;case 2:this._point=3,this._x4=e,this._y4=t,this._context.moveTo((this._x0+4*this._x1+e)/6,(this._y0+4*this._y1+t)/6);break;default:qe(this,e,t)}this._x0=this._x1,this._x1=e,this._y0=this._y1,this._y1=t}};function Ze(e){return new Xe(e)}function Qe(e){this._context=e}Qe.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x0=this._x1=this._y0=this._y1=NaN,this._point=0},lineEnd:function(){(this._line||this._line!==0&&this._point===3)&&this._context.closePath(),this._line=1-this._line},point:function(e,t){switch(e=+e,t=+t,this._point){case 0:this._point=1;break;case 1:this._point=2;break;case 2:this._point=3;var n=(this._x0+4*this._x1+e)/6,r=(this._y0+4*this._y1+t)/6;this._line?this._context.lineTo(n,r):this._context.moveTo(n,r);break;case 3:this._point=4;default:qe(this,e,t)}this._x0=this._x1,this._x1=e,this._y0=this._y1,this._y1=t}};function $e(e){return new Qe(e)}function et(e){this._context=e}et.prototype={areaStart:Ke,areaEnd:Ke,lineStart:function(){this._point=0},lineEnd:function(){this._point&&this._context.closePath()},point:function(e,t){e=+e,t=+t,this._point?this._context.lineTo(e,t):(this._point=1,this._context.moveTo(e,t))}};function tt(e){return new et(e)}function nt(e){return e<0?-1:1}function rt(e,t,n){var r=e._x1-e._x0,i=t-e._x1,a=(e._y1-e._y0)/(r||i<0&&-0),o=(n-e._y1)/(i||r<0&&-0),s=(a*i+o*r)/(r+i);return(nt(a)+nt(o))*Math.min(Math.abs(a),Math.abs(o),.5*Math.abs(s))||0}function it(e,t){var n=e._x1-e._x0;return n?(3*(e._y1-e._y0)/n-t)/2:t}function at(e,t,n){var r=e._x0,i=e._y0,a=e._x1,o=e._y1,s=(a-r)/3;e._context.bezierCurveTo(r+s,i+s*t,a-s,o-s*n,a,o)}function ot(e){this._context=e}ot.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x0=this._x1=this._y0=this._y1=this._t0=NaN,this._point=0},lineEnd:function(){switch(this._point){case 2:this._context.lineTo(this._x1,this._y1);break;case 3:at(this,this._t0,it(this,this._t0))}(this._line||this._line!==0&&this._point===1)&&this._context.closePath(),this._line=1-this._line},point:function(e,t){var n=NaN;if(e=+e,t=+t,e!==this._x1||t!==this._y1){switch(this._point){case 0:this._point=1,this._line?this._context.lineTo(e,t):this._context.moveTo(e,t);break;case 1:this._point=2;break;case 2:this._point=3,at(this,it(this,n=rt(this,e,t)),n);break;default:at(this,this._t0,n=rt(this,e,t))}this._x0=this._x1,this._x1=e,this._y0=this._y1,this._y1=t,this._t0=n}}};function st(e){this._context=new ct(e)}(st.prototype=Object.create(ot.prototype)).point=function(e,t){ot.prototype.point.call(this,t,e)};function ct(e){this._context=e}ct.prototype={moveTo:function(e,t){this._context.moveTo(t,e)},closePath:function(){this._context.closePath()},lineTo:function(e,t){this._context.lineTo(t,e)},bezierCurveTo:function(e,t,n,r,i,a){this._context.bezierCurveTo(t,e,r,n,a,i)}};function lt(e){return new ot(e)}function ut(e){return new st(e)}function dt(e){this._context=e}dt.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x=[],this._y=[]},lineEnd:function(){var e=this._x,t=this._y,n=e.length;if(n){if(this._line?this._context.lineTo(e[0],t[0]):this._context.moveTo(e[0],t[0]),n===2)this._context.lineTo(e[1],t[1]);else for(var r=ft(e),i=ft(t),a=0,o=1;o=0;--t)i[t]=(o[t]-i[t+1])/a[t];for(a[n-1]=(e[n]+i[n-1])/2,t=0;t=0&&(this._t=1-this._t,this._line=1-this._line)},point:function(e,t){switch(e=+e,t=+t,this._point){case 0:this._point=1,this._line?this._context.lineTo(e,t):this._context.moveTo(e,t);break;case 1:this._point=2;default:if(this._t<=0)this._context.lineTo(this._x,t),this._context.lineTo(e,t);else{var n=this._x*(1-this._t)+e*this._t;this._context.lineTo(n,this._y),this._context.lineTo(n,t)}}this._x=e,this._y=t}};function ht(e){return new mt(e,.5)}function gt(e){return new mt(e,0)}function _t(e){return new mt(e,1)}function vt(e,t){if((o=e.length)>1)for(var n=1,r,i,a=e[t[0]],o,s=a.length;n=0;)n[t]=t;return n}function bt(e,t){return e[t]}function xt(e){let t=[];return t.key=e,t}function St(){var e=L([]),t=yt,n=vt,r=bt;function i(i){var a=Array.from(e.apply(this,arguments),xt),o,s=a.length,c=-1,l;for(let e of i)for(o=0,++c;o0){for(var n,r,i=0,a=e[0].length,o;i0){for(var n=0,r=e[t[0]],i,a=r.length;n0&&(a=(i=e[t[0]]).length)>0){for(var n=0,r=1,i,a,o;r`radius`in e&&`startAngle`in e&&`endAngle`in e,Dt=(e,t)=>{if(!e||typeof e==`function`||typeof e==`boolean`)return null;var n=e;if((0,o.isValidElement)(e)&&(n=e.props),typeof n!=`object`&&typeof n!=`function`)return null;var r={};return Object.keys(n).forEach(e=>{l(e)&&typeof n[e]==`function`&&(r[e]=t||(t=>n[e](n,t)))}),r},Ot=(e,t,n)=>r=>(e(t,n,r),null),kt=(e,t,n)=>{if(e===null||typeof e!=`object`&&typeof e!=`function`)return null;var r=null;return Object.keys(e).forEach(i=>{var a=e[i];l(i)&&typeof a==`function`&&(r||={},r[i]=Ot(a,t,n))}),r};function At(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter(function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable})),n.push.apply(n,r)}return n}function jt(e){for(var t=1;t(e[t]===void 0&&r[t]!==void 0&&(e[t]=r[t]),e),n)}function It(e,t){let n=new Map;for(let r=0;r=0}function Bt(e){return e!=null&&typeof e!=`function`&&zt(e.length)}function Vt(e){return function(t){return te(t,e)}}function Ht(e){return e==null||typeof e!=`object`&&typeof e!=`function`}function Ut(e){return ArrayBuffer.isView(e)&&!(e instanceof DataView)}function Wt(e){return Object.getOwnPropertySymbols(e).filter(t=>Object.prototype.propertyIsEnumerable.call(e,t))}function Gt(e){return e==null?e===void 0?`[object Undefined]`:`[object Null]`:Object.prototype.toString.call(e)}var Kt=`[object RegExp]`,qt=`[object String]`,Jt=`[object Number]`,Yt=`[object Boolean]`,Xt=`[object Arguments]`,Zt=`[object Symbol]`,Qt=`[object Date]`,$t=`[object Map]`,en=`[object Set]`,tn=`[object Array]`,nn=`[object Function]`,rn=`[object ArrayBuffer]`,an=`[object Object]`,on=`[object Error]`,sn=`[object DataView]`,cn=`[object Uint8Array]`,ln=`[object Uint8ClampedArray]`,un=`[object Uint16Array]`,dn=`[object Uint32Array]`,fn=`[object BigUint64Array]`,pn=`[object Int8Array]`,mn=`[object Int16Array]`,hn=`[object Int32Array]`,gn=`[object BigInt64Array]`,_n=`[object Float32Array]`,vn=`[object Float64Array]`,yn=typeof globalThis==`object`&&globalThis||typeof window==`object`&&window||typeof self==`object`&&self||typeof global==`object`&&global||(function(){return this})();function bn(e){return yn.Buffer!==void 0&&yn.Buffer.isBuffer(e)}function xn(e,t){return Sn(e,void 0,e,new Map,t)}function Sn(e,t,n,r=new Map,i=void 0){let a=i?.(e,t,n,r);if(a!==void 0)return a;if(Ht(e))return e;if(r.has(e))return r.get(e);if(Array.isArray(e)){let t=Array(e.length);r.set(e,t);for(let a=0;avoid 0)}function kn(e,t,n,r,i=!1){if(t===e)return!0;switch(typeof t){case`object`:return An(e,t,n,r,i);case`function`:return Object.keys(t).length>0?kn(e,{...t},n,r,i):En(e,t);default:return Dn(e)&&i?typeof t!=`string`||t===``:En(e,t)}}function An(e,t,n,r,i=!1){if(t==null)return!0;if(Array.isArray(t))return Mn(e,t,n,r);if(t instanceof Map)return jn(e,t,n,r);if(t instanceof Set)return Nn(e,t,n,r);let a=Object.keys(t);if(e==null)return i&&a.length===0;if(i)Ht(e)&&(e=Object(e));else{let t=Gt(e);if(t!==`[object Object]`&&t!==`[object Arguments]`)return!1}if(a.length===0)return!0;if(r?.has(t))return r.get(t)===e;r?.set(t,e);try{for(let i=0;ivoid 0)}function Fn(e){return e=Tn(e),t=>Pn(t,e)}function In(e,t){return xn(e,(n,r,i,a)=>{let o=t?.(n,r,i,a);if(o!==void 0)return o;if(typeof e==`object`){if(Gt(e)===`[object Object]`&&typeof e.constructor!=`function`){let t={};return a.set(e,t),Cn(t,e,i,a),t}switch(Object.prototype.toString.call(e)){case Jt:case qt:case Yt:{let t=new e.constructor(e?.valueOf());return Cn(t,e),t}case Xt:{let t={};return Cn(t,e),t.length=e.length,t[Symbol.iterator]=e[Symbol.iterator],t}default:return}}})}function Ln(e){return In(e)}var Rn=/^(?:0|[1-9]\d*)$/;function zn(e,t=2**53-1){switch(typeof e){case`number`:return Number.isInteger(e)&&e>=0&&e{var n=e();function r(e,t){return e===t&&(e!==0||1/e==1/t)||e!==e&&t!==t}var i=typeof Object.is==`function`?Object.is:r,a=n.useState,o=n.useEffect,s=n.useLayoutEffect,c=n.useDebugValue;function l(e,t){var n=t(),r=a({inst:{value:n,getSnapshot:t}}),i=r[0].inst,l=r[1];return s(function(){i.value=n,i.getSnapshot=t,u(i)&&l({inst:i})},[e,n,t]),o(function(){return u(i)&&l({inst:i}),e(function(){u(i)&&l({inst:i})})},[e]),c(n),n}function u(e){var t=e.getSnapshot;e=e.value;try{var n=t();return!i(e,n)}catch{return!0}}function d(e,t){return t()}var f=typeof window>`u`||window.document===void 0||window.document.createElement===void 0?d:l;t.useSyncExternalStore=n.useSyncExternalStore===void 0?f:n.useSyncExternalStore})),Jn=i(((e,t)=>{t.exports=qn()})),Yn=i((t=>{var n=e(),r=Jn();function i(e,t){return e===t&&(e!==0||1/e==1/t)||e!==e&&t!==t}var a=typeof Object.is==`function`?Object.is:i,o=r.useSyncExternalStore,s=n.useRef,c=n.useEffect,l=n.useMemo,u=n.useDebugValue;t.useSyncExternalStoreWithSelector=function(e,t,n,r,i){var d=s(null);if(d.current===null){var f={hasValue:!1,value:null};d.current=f}else f=d.current;d=l(function(){function e(e){if(!o){if(o=!0,s=e,e=r(e),i!==void 0&&f.hasValue){var t=f.value;if(i(t,e))return c=t}return c=e}if(t=c,a(s,e))return t;var n=r(e);return i!==void 0&&i(t,n)?(s=e,t):(s=e,c=n)}var o=!1,s,c,l=n===void 0?null:n;return[function(){return e(t())},l===null?void 0:function(){return e(l())}]},[t,n,r,i]);var p=o(e,d[0],d[1]);return c(function(){f.hasValue=!0,f.value=p},[p]),u(p),p}})),Xn=i(((e,t)=>{t.exports=Yn()}))(),Zn=(0,o.createContext)(null),Qn=e=>e,R=()=>{var e=(0,o.useContext)(Zn);return e?e.store.dispatch:Qn},$n=()=>{},er=()=>$n,tr=(e,t)=>e===t;function z(e){var t=(0,o.useContext)(Zn),n=(0,o.useMemo)(()=>t?t=>{if(t!=null)return e(t)}:$n,[t,e]);return(0,Xn.useSyncExternalStoreWithSelector)(t?t.subscription.addNestedSub:er,t?t.store.getState:$n,t?t.store.getState:$n,n,tr)}function nr(e,t=`expected a function, instead received ${typeof e}`){if(typeof e!=`function`)throw TypeError(t)}function rr(e,t=`expected all items to be functions, instead received the following types: `){if(!e.every(e=>typeof e==`function`)){let n=e.map(e=>typeof e==`function`?`function ${e.name||`unnamed`}()`:typeof e).join(`, `);throw TypeError(`${t}[${n}]`)}}var ir=e=>Array.isArray(e)?e:[e];function ar(e){let t=Array.isArray(e[0])?e[0]:e;return rr(t,`createSelector expects all input-selectors to be functions, but received the following types: `),t}function or(e,t){let n=[],{length:r}=e;for(let i=0;i`u`?sr:WeakRef,lr=0,ur=1;function dr(){return{s:lr,v:void 0,o:null,p:null}}function fr(e){return e instanceof cr?e.deref():e}function pr(e,t={}){let n=dr(),{resultEqualityCheck:r}=t,i,a=0;function o(){let t=n,{length:o}=arguments;for(let e=0,n=o;e{n=dr(),o.resetResultsCount()},o.resultsCount=()=>a,o.resetResultsCount=()=>{a=0},o}function mr(e,...t){let n=typeof e==`function`?{memoize:e,memoizeOptions:t}:e,r=(...e)=>{let t=0,r=0,i,a={},o=e.pop();typeof o==`object`&&(a=o,o=e.pop()),nr(o,`createSelector expects an output function after the inputs, but received: [${typeof o}]`);let{memoize:s,memoizeOptions:c=[],argsMemoize:l=pr,argsMemoizeOptions:u=[]}={...n,...a},d=ir(c),f=ir(u),p=ar(e),m=s(function(){return t++,o.apply(null,arguments)},...d),h=l(function(){r++;let e=or(p,arguments);return i=m.apply(null,e),i},...f);return Object.assign(h,{resultFunc:o,memoizedResultFunc:m,dependencies:p,dependencyRecomputations:()=>r,resetDependencyRecomputations:()=>{r=0},lastResult:()=>i,recomputations:()=>t,resetRecomputations:()=>{t=0},memoize:s,argsMemoize:l})};return Object.assign(r,{withTypes:()=>r}),r}var B=mr(pr);function hr(e,t=1){let n=[],r=Math.floor(t),i=(e,t)=>{for(let a=0;a{if(e!==t){let r=_r(e),i=_r(t);if(r===i&&r===0){if(et)return n===`desc`?-1:1}return n===`desc`?i-r:r-i}return 0},yr=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,br=/^\w*$/;function xr(e,t){return Array.isArray(e)?!1:typeof e==`number`||typeof e==`boolean`||e==null||j(e)?!0:typeof e==`string`&&(br.test(e)||!yr.test(e))||t!=null&&Object.hasOwn(t,e)}function Sr(e,t,n,r){if(e==null)return[];n=r?void 0:n,Array.isArray(e)||(e=Bt(e)?Array.from(e):Object.values(e)),Array.isArray(t)||(t=t==null?[null]:[t]),t.length===0&&(t=[null]),Array.isArray(n)||(n=n==null?[]:[n]),n=n.map(e=>String(e));let i=(e,t)=>{let n=e,r=0;for(;r0&&r===t.length?n:void 0},a=(e,t)=>{if(e==null)return t;if(t!=null)return typeof e==`object`&&`key`in e?Object.hasOwn(t,e.key)?t[e.key]:i(t,e.path):typeof e==`function`?e(t):Array.isArray(e)?i(t,e):t[e]},o=t.map(e=>(Array.isArray(e)&&e.length===1&&(e=e[0]),e==null||typeof e==`function`||Array.isArray(e)||xr(e)?e:{key:e,path:ee(e)}));return e.map(e=>({original:e,criteria:o.map(t=>a(t,e))})).slice().sort((e,t)=>{for(let r=0;re.original)}function Cr(e,...t){let n=t.length;return n>1&&gr(e,t[0],t[1])?t=[]:n>2&&gr(t[0],t[1],t[2])&&(t=[t[0]]),Sr(e,hr(t),[`asc`])}var wr=e=>e.legend.settings,Tr=e=>e.legend.size;B([e=>e.legend.payload,wr],(e,t)=>{var n=t.itemSorter,r=e.flat(1);return n?Cr(r,n):r});function Er(e,t){return jr(e)||Ar(e,t)||Or(e,t)||Dr()}function Dr(){throw TypeError(`Invalid attempt to destructure non-iterable instance. In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)}function Or(e,t){if(e){if(typeof e==`string`)return kr(e,t);var n={}.toString.call(e).slice(8,-1);return n===`Object`&&e.constructor&&(n=e.constructor.name),n===`Map`||n===`Set`?Array.from(e):n===`Arguments`||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?kr(e,t):void 0}}function kr(e,t){(t==null||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);nMr||Math.abs(e.left-t.left)>Mr||Math.abs(e.top-t.top)>Mr||Math.abs(e.width-t.width)>Mr}function Pr(e){var t=e.getBoundingClientRect();return{height:t.height,left:t.left,top:t.top,width:t.width}}function Fr(){var e=arguments.length>0&&arguments[0]!==void 0?arguments[0]:[],t=Er((0,o.useState)({height:0,left:0,top:0,width:0}),2),n=t[0],r=t[1],i=(0,o.useRef)(null),a=(0,o.useRef)(n);a.current=n;var s=(0,o.useCallback)(e=>{if(i.current!=null&&(i.current.disconnect(),i.current=null),e!=null){var t=Pr(e);if(Nr(t,a.current)&&r(t),typeof ResizeObserver<`u`){var n=new ResizeObserver(()=>{var t=Pr(e);Nr(t,a.current)&&r(t)});n.observe(e),i.current=n}}},[...e]);return(0,o.useEffect)(()=>()=>{var e;(e=i.current)==null||e.disconnect()},[]),[n,s]}function Ir(e){return`Minified Redux error #${e}; visit https://redux.js.org/Errors?code=${e} for the full message or use the non-minified dev environment for full errors. `}var Lr=typeof Symbol==`function`&&Symbol.observable||`@@observable`,Rr=()=>Math.random().toString(36).substring(7).split(``).join(`.`),zr={INIT:`@@redux/INIT${Rr()}`,REPLACE:`@@redux/REPLACE${Rr()}`,PROBE_UNKNOWN_ACTION:()=>`@@redux/PROBE_UNKNOWN_ACTION${Rr()}`};function Br(e){if(typeof e!=`object`||!e)return!1;let t=e;for(;Object.getPrototypeOf(t)!==null;)t=Object.getPrototypeOf(t);return Object.getPrototypeOf(e)===t||Object.getPrototypeOf(e)===null}function Vr(e,t,n){if(typeof e!=`function`)throw Error(Ir(2));if(typeof t==`function`&&typeof n==`function`||typeof n==`function`&&typeof arguments[3]==`function`)throw Error(Ir(0));if(typeof t==`function`&&n===void 0&&(n=t,t=void 0),n!==void 0){if(typeof n!=`function`)throw Error(Ir(1));return n(Vr)(e,t)}let r=e,i=t,a=new Map,o=a,s=0,c=!1;function l(){o===a&&(o=new Map,a.forEach((e,t)=>{o.set(t,e)}))}function u(){if(c)throw Error(Ir(3));return i}function d(e){if(typeof e!=`function`)throw Error(Ir(4));if(c)throw Error(Ir(5));let t=!0;l();let n=s++;return o.set(n,e),function(){if(t){if(c)throw Error(Ir(6));t=!1,l(),o.delete(n),a=null}}}function f(e){if(!Br(e))throw Error(Ir(7));if(e.type===void 0)throw Error(Ir(8));if(typeof e.type!=`string`)throw Error(Ir(17));if(c)throw Error(Ir(9));try{c=!0,i=r(i,e)}finally{c=!1}return(a=o).forEach(e=>{e()}),e}function p(e){if(typeof e!=`function`)throw Error(Ir(10));r=e,f({type:zr.REPLACE})}function m(){let e=d;return{subscribe(t){if(typeof t!=`object`||!t)throw Error(Ir(11));function n(){let e=t;e.next&&e.next(u())}return n(),{unsubscribe:e(n)}},[Lr](){return this}}}return f({type:zr.INIT}),{dispatch:f,subscribe:d,getState:u,replaceReducer:p,[Lr]:m}}function Hr(e){Object.keys(e).forEach(t=>{let n=e[t];if(n(void 0,{type:zr.INIT})===void 0)throw Error(Ir(12));if(n(void 0,{type:zr.PROBE_UNKNOWN_ACTION()})===void 0)throw Error(Ir(13))})}function Ur(e){let t=Object.keys(e),n={};for(let r=0;re:e.length===1?e[0]:e.reduce((e,t)=>(...n)=>e(t(...n)))}function Gr(...e){return t=>(n,r)=>{let i=t(n,r),a=()=>{throw Error(Ir(15))},o={getState:i.getState,dispatch:(e,...t)=>a(e,...t)};return a=Wr(...e.map(e=>e(o)))(i.dispatch),{...i,dispatch:a}}}function Kr(e){return Br(e)&&`type`in e&&typeof e.type==`string`}var qr=Symbol.for(`immer-nothing`),Jr=Symbol.for(`immer-draftable`),Yr=Symbol.for(`immer-state`);function Xr(e,...t){throw Error(`[Immer] minified error nr: ${e}. Full error at: https://bit.ly/3cXEKWf`)}var Zr=Object,Qr=Zr.getPrototypeOf,$r=`constructor`,ei=`prototype`,ti=`configurable`,ni=`enumerable`,ri=`writable`,ii=`value`,ai=e=>!!e&&!!e[Yr];function oi(e){return e?li(e)||gi(e)||!!e[Jr]||!!e[$r]?.[Jr]||_i(e)||vi(e):!1}var si=Zr[ei][$r].toString(),ci=new WeakMap;function li(e){if(!e||!yi(e))return!1;let t=Qr(e);if(t===null||t===Zr[ei])return!0;let n=Zr.hasOwnProperty.call(t,$r)&&t[$r];if(n===Object)return!0;if(!bi(n))return!1;let r=ci.get(n);return r===void 0&&(r=Function.toString.call(n),ci.set(n,r)),r===si}function ui(e,t,n=!0){di(e)===0?(n?Reflect.ownKeys(e):Zr.keys(e)).forEach(n=>{t(n,e[n],e)}):e.forEach((n,r)=>t(r,n,e))}function di(e){let t=e[Yr];return t?t.type_:gi(e)?1:_i(e)?2:vi(e)?3:0}var fi=(e,t,n=di(e))=>n===2?e.has(t):Zr[ei].hasOwnProperty.call(e,t),pi=(e,t,n=di(e))=>n===2?e.get(t):e[t],mi=(e,t,n,r=di(e))=>{r===2?e.set(t,n):r===3?e.add(n):e[t]=n};function hi(e,t){return e===t?e!==0||1/e==1/t:e!==e&&t!==t}var gi=Array.isArray,_i=e=>e instanceof Map,vi=e=>e instanceof Set,yi=e=>typeof e==`object`,bi=e=>typeof e==`function`,xi=e=>typeof e==`boolean`;function Si(e){let t=+e;return Number.isInteger(t)&&String(t)===e}var Ci=e=>e.copy_||e.base_,wi=e=>e.modified_?e.copy_:e.base_;function Ti(e,t){if(_i(e))return new Map(e);if(vi(e))return new Set(e);if(gi(e))return Array[ei].slice.call(e);let n=li(e);if(t===!0||t===`class_only`&&!n){let t=Zr.getOwnPropertyDescriptors(e);delete t[Yr];let n=Reflect.ownKeys(t);for(let r=0;r1&&Zr.defineProperties(e,{set:Oi,add:Oi,clear:Oi,delete:Oi}),Zr.freeze(e),t&&ui(e,(e,t)=>{Ei(t,!0)},!1),e)}function Di(){Xr(2)}var Oi={[ii]:Di};function ki(e){return e===null||!yi(e)||Zr.isFrozen(e)}var Ai=`MapSet`,ji=`Patches`,Mi=`ArrayMethods`,Ni={};function Pi(e){let t=Ni[e];return t||Xr(0,e),t}var Fi=e=>!!Ni[e],Ii,Li=()=>Ii,Ri=(e,t)=>({drafts_:[],parent_:e,immer_:t,canAutoFreeze_:!0,unfinalizedDrafts_:0,handledSet_:new Set,processedForPatches_:new Set,mapSetPlugin_:Fi(Ai)?Pi(Ai):void 0,arrayMethodsPlugin_:Fi(Mi)?Pi(Mi):void 0});function zi(e,t){t&&(e.patchPlugin_=Pi(ji),e.patches_=[],e.inversePatches_=[],e.patchListener_=t)}function Bi(e){Vi(e),e.drafts_.forEach(Ui),e.drafts_=null}function Vi(e){e===Ii&&(Ii=e.parent_)}var Hi=e=>Ii=Ri(Ii,e);function Ui(e){let t=e[Yr];t.type_===0||t.type_===1?t.revoke_():t.revoked_=!0}function Wi(e,t){t.unfinalizedDrafts_=t.drafts_.length;let n=t.drafts_[0];if(e!==void 0&&e!==n){n[Yr].modified_&&(Bi(t),Xr(4)),oi(e)&&(e=Gi(t,e));let{patchPlugin_:r}=t;r&&r.generateReplacementPatches_(n[Yr].base_,e,t)}else e=Gi(t,n);return Ki(t,e,!0),Bi(t),t.patches_&&t.patchListener_(t.patches_,t.inversePatches_),e===qr?void 0:e}function Gi(e,t){if(ki(t))return t;let n=t[Yr];if(!n)return ea(t,e.handledSet_,e);if(!Ji(n,e))return t;if(!n.modified_)return n.base_;if(!n.finalized_){let{callbacks_:t}=n;if(t)for(;t.length>0;)t.pop()(e);Qi(n,e)}return n.copy_}function Ki(e,t,n=!1){!e.parent_&&e.immer_.autoFreeze_&&e.canAutoFreeze_&&Ei(t,n)}function qi(e){e.finalized_=!0,e.scope_.unfinalizedDrafts_--}var Ji=(e,t)=>e.scope_===t,Yi=[];function Xi(e,t,n,r){let i=Ci(e),a=e.type_;if(r!==void 0&&pi(i,r,a)===t){mi(i,r,n,a);return}if(!e.draftLocations_){let t=e.draftLocations_=new Map;ui(i,(e,n)=>{if(ai(n)){let r=t.get(n)||[];r.push(e),t.set(n,r)}})}let o=e.draftLocations_.get(t)??Yi;for(let e of o)mi(i,e,n,a)}function Zi(e,t,n){e.callbacks_.push(function(r){let i=t;if(!i||!Ji(i,r))return;r.mapSetPlugin_?.fixSetContents(i);let a=wi(i);Xi(e,i.draft_??i,a,n),Qi(i,r)})}function Qi(e,t){if(e.modified_&&!e.finalized_&&(e.type_===3||e.type_===1&&e.allIndicesReassigned_||(e.assigned_?.size??0)>0)){let{patchPlugin_:n}=t;if(n){let r=n.getPath(e);r&&n.generatePatches_(e,r,t)}qi(e)}}function $i(e,t,n){let{scope_:r}=e;if(ai(n)){let i=n[Yr];Ji(i,r)&&i.callbacks_.push(function(){la(e),Xi(e,n,wi(i),t)})}else oi(n)&&e.callbacks_.push(function(){let i=Ci(e);e.type_===3?i.has(n)&&ea(n,r.handledSet_,r):pi(i,t,e.type_)===n&&r.drafts_.length>1&&(e.assigned_.get(t)??!1)===!0&&e.copy_&&ea(pi(e.copy_,t,e.type_),r.handledSet_,r)})}function ea(e,t,n){return!n.immer_.autoFreeze_&&n.unfinalizedDrafts_<1||ai(e)||t.has(e)||!oi(e)||ki(e)?e:(t.add(e),ui(e,(r,i)=>{if(ai(i)){let t=i[Yr];Ji(t,n)&&(mi(e,r,wi(t),e.type_),qi(t))}else oi(i)&&ea(i,t,n)}),e)}function ta(e,t){let n=gi(e),r={type_:+!!n,scope_:t?t.scope_:Li(),modified_:!1,finalized_:!1,assigned_:void 0,parent_:t,base_:e,draft_:null,copy_:null,revoke_:null,isManual_:!1,callbacks_:void 0},i=r,a=na;n&&(i=[r],a=ra);let{revoke:o,proxy:s}=Proxy.revocable(i,a);return r.draft_=s,r.revoke_=o,[s,r]}var na={get(e,t){if(t===Yr)return e;let n=e.scope_.arrayMethodsPlugin_,r=e.type_===1&&typeof t==`string`;if(r&&n?.isArrayOperationMethod(t))return n.createMethodInterceptor(e,t);let i=Ci(e);if(!fi(i,t,e.type_))return oa(e,i,t);let a=i[t];if(e.finalized_||!oi(a)||r&&e.operationMethod&&n?.isMutatingArrayMethod(e.operationMethod)&&Si(t))return a;if(a===ia(e.base_,t)||aa(e,t,a)){la(e);let n=e.type_===1?+t:t,r=da(e.scope_,a,e,n);return e.copy_[n]=r}return a},has(e,t){return t in Ci(e)},ownKeys(e){return Reflect.ownKeys(Ci(e))},set(e,t,n){let r=sa(Ci(e),t);if(r?.set)return r.set.call(e.draft_,n),!0;if(!e.modified_){let r=ia(Ci(e),t),i=r?.[Yr];if(i&&i.base_===n)return e.copy_[t]=n,e.assigned_.set(t,!1),!0;if(hi(n,r)&&(n!==void 0||fi(e.base_,t,e.type_)))return!0;la(e),ca(e)}return e.copy_[t]===n&&(n!==void 0||fi(e.copy_,t,e.type_))||Number.isNaN(n)&&Number.isNaN(e.copy_[t])?!0:(e.copy_[t]=n,e.assigned_.set(t,!0),$i(e,t,n),!0)},deleteProperty(e,t){return la(e),ia(e.base_,t)!==void 0||t in e.base_?(e.assigned_.set(t,!1),ca(e)):e.assigned_.delete(t),e.copy_&&delete e.copy_[t],!0},getOwnPropertyDescriptor(e,t){let n=Ci(e),r=Reflect.getOwnPropertyDescriptor(n,t);return r&&{[ri]:!0,[ti]:e.type_!==1||t!==`length`,[ni]:r[ni],[ii]:n[t]}},defineProperty(){Xr(11)},getPrototypeOf(e){return Qr(e.base_)},setPrototypeOf(){Xr(12)}},ra={};for(let e in na){let t=na[e];ra[e]=function(){let e=arguments;return e[0]=e[0][0],t.apply(this,e)}}ra.deleteProperty=function(e,t){return ra.set.call(this,e,t,void 0)},ra.set=function(e,t,n){return na.set.call(this,e[0],t,n,e[0])};function ia(e,t){let n=e[Yr];return(n?Ci(n):e)[t]}function aa(e,t,n){return e.type_!==1||!e.allIndicesReassigned_||e.assigned_?.get(t)||!oi(n)||n[Yr]?!1:e.baseRefs_.has(n)}function oa(e,t,n){let r=sa(t,n);return r?ii in r?r[ii]:r.get?.call(e.draft_):void 0}function sa(e,t){if(!(t in e))return;let n=Qr(e);for(;n;){let e=Object.getOwnPropertyDescriptor(n,t);if(e)return e;n=Qr(n)}}function ca(e){e.modified_||(e.modified_=!0,e.parent_&&ca(e.parent_))}function la(e){e.copy_||=(e.assigned_=new Map,Ti(e.base_,e.scope_.immer_.useStrictShallowCopy_))}var ua=class{constructor(e){this.autoFreeze_=!0,this.useStrictShallowCopy_=!1,this.useStrictIteration_=!1,this.produce=(e,t,n)=>{if(bi(e)&&!bi(t)){let n=t;t=e;let r=this;return function(e=n,...i){return r.produce(e,e=>t.call(this,e,...i))}}bi(t)||Xr(6),n!==void 0&&!bi(n)&&Xr(7);let r;if(oi(e)){let i=Hi(this),a=da(i,e,void 0),o=!0;try{r=t(a),o=!1}finally{o?Bi(i):Vi(i)}return zi(i,n),Wi(r,i)}if(!e||!yi(e)){if(r=t(e),r===void 0&&(r=e),r===qr&&(r=void 0),this.autoFreeze_&&Ei(r,!0),n){let t=[],i=[];Pi(ji).generateReplacementPatches_(e,r,{patches_:t,inversePatches_:i}),n(t,i)}return r}Xr(1,e)},this.produceWithPatches=(e,t)=>{if(bi(e))return(t,...n)=>this.produceWithPatches(t,t=>e(t,...n));let n,r;return[this.produce(e,t,(e,t)=>{n=e,r=t}),n,r]},xi(e?.autoFreeze)&&this.setAutoFreeze(e.autoFreeze),xi(e?.useStrictShallowCopy)&&this.setUseStrictShallowCopy(e.useStrictShallowCopy),xi(e?.useStrictIteration)&&this.setUseStrictIteration(e.useStrictIteration)}createDraft(e){oi(e)||Xr(8),ai(e)&&(e=fa(e));let t=Hi(this),n=da(t,e,void 0);return n[Yr].isManual_=!0,Vi(t),n}finishDraft(e,t){let n=e&&e[Yr];(!n||!n.isManual_)&&Xr(9);let{scope_:r}=n;return zi(r,t),Wi(void 0,r)}setAutoFreeze(e){this.autoFreeze_=e}setUseStrictShallowCopy(e){this.useStrictShallowCopy_=e}setUseStrictIteration(e){this.useStrictIteration_=e}shouldUseStrictIteration(){return this.useStrictIteration_}applyPatches(e,t){let n;for(n=t.length-1;n>=0;n--){let r=t[n];if(r.path.length===0&&r.op===`replace`){e=r.value;break}}n>-1&&(t=t.slice(n+1));let r=Pi(ji).applyPatches_;return ai(e)?r(e,t):this.produce(e,e=>r(e,t))}};function da(e,t,n,r){let[i,a]=_i(t)?Pi(Ai).proxyMap_(t,n):vi(t)?Pi(Ai).proxySet_(t,n):ta(t,n);return(n?.scope_??Li()).drafts_.push(i),a.callbacks_=n?.callbacks_??[],a.key_=r,n&&r!==void 0?Zi(n,a,r):a.callbacks_.push(function(e){e.mapSetPlugin_?.fixSetContents(a);let{patchPlugin_:t}=e;a.modified_&&t&&t.generatePatches_(a,[],e)}),i}function fa(e){return ai(e)||Xr(10,e),pa(e)}function pa(e){if(!oi(e)||ki(e))return e;let t=e[Yr],n,r=!0;if(t){if(!t.modified_)return t.base_;t.finalized_=!0,n=Ti(e,t.scope_.immer_.useStrictShallowCopy_),r=t.scope_.immer_.shouldUseStrictIteration()}else n=Ti(e,!0);return ui(n,(e,t)=>{mi(n,e,pa(t))},r),t&&(t.finalized_=!1),n}globalThis.Iterator?.from;var ma=new ua().produce,V=e=>e;function ha(e){return({dispatch:t,getState:n})=>r=>i=>typeof i==`function`?i(t,n,e):r(i)}var ga=ha(),_a=ha,va=typeof window<`u`&&window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__?window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__:function(){if(arguments.length!==0)return typeof arguments[0]==`object`?Wr:Wr.apply(null,arguments)};typeof window<`u`&&window.__REDUX_DEVTOOLS_EXTENSION__&&window.__REDUX_DEVTOOLS_EXTENSION__;function ya(e,t){function n(...n){if(t){let r=t(...n);if(!r)throw Error(Oo(0));return{type:e,payload:r.payload,...`meta`in r&&{meta:r.meta},...`error`in r&&{error:r.error}}}return{type:e,payload:n[0]}}return n.toString=()=>`${e}`,n.type=e,n.match=t=>Kr(t)&&t.type===e,n}var ba=class e extends Array{constructor(...t){super(...t),Object.setPrototypeOf(this,e.prototype)}static get[Symbol.species](){return e}concat(...e){return super.concat.apply(this,e)}prepend(...t){return t.length===1&&Array.isArray(t[0])?new e(...t[0].concat(this)):new e(...t.concat(this))}};function xa(e){return oi(e)?ma(e,()=>{}):e}function Sa(e,t,n){return e.has(t)?e.get(t):e.set(t,n(t)).get(t)}function Ca(e){return typeof e==`boolean`}var wa=()=>function(e){let{thunk:t=!0,immutableCheck:n=!0,serializableCheck:r=!0,actionCreatorCheck:i=!0}=e??{},a=new ba;return t&&(Ca(t)?a.push(ga):a.push(_a(t.extraArgument))),a},Ta=`RTK_autoBatch`,H=()=>e=>({payload:e,meta:{[Ta]:!0}}),Ea=e=>t=>{setTimeout(t,e)},Da=(e,t)=>n=>{let r=!1,i=()=>{r||(r=!0,cancelAnimationFrame(a),clearTimeout(o),n())},a=e(i),o=setTimeout(i,t)},Oa=(e={type:`raf`})=>t=>(...n)=>{let r=t(...n),i=!0,a=!1,o=!1,s=new Set,c=e.type===`tick`?queueMicrotask:e.type===`raf`?typeof window<`u`&&window.requestAnimationFrame?Da(window.requestAnimationFrame,100):Ea(10):e.type===`callback`?e.queueNotification:Ea(e.timeout),l=()=>{o=!1,a&&(a=!1,s.forEach(e=>e()))};return Object.assign({},r,{subscribe(e){let t=r.subscribe(()=>i&&e());return s.add(e),()=>{t(),s.delete(e)}},dispatch(e){try{return i=!e?.meta?.[Ta],a=!i,a&&(o||(o=!0,c(l))),r.dispatch(e)}finally{i=!0}}})},ka=e=>function(t){let{autoBatch:n=!0}=t??{},r=new ba(e);return n&&r.push(Oa(typeof n==`object`?n:void 0)),r};function Aa(e){let t=wa(),{reducer:n=void 0,middleware:r,devTools:i=!0,duplicateMiddlewareCheck:a=!0,preloadedState:o=void 0,enhancers:s=void 0}=e||{},c;if(typeof n==`function`)c=n;else if(Br(n))c=Ur(n);else throw Error(Oo(1));let l;l=typeof r==`function`?r(t):t();let u=Wr;i&&(u=va({trace:!1,...typeof i==`object`&&i}));let d=ka(Gr(...l)),f=typeof s==`function`?s(d):d(),p=u(...f);return Vr(c,o,p)}function ja(e){let t={},n=[],r,i={addCase(e,n){let r=typeof e==`string`?e:e.type;if(!r)throw Error(Oo(28));if(r in t)throw Error(Oo(29));return t[r]=n,i},addAsyncThunk(e,r){return r.pending&&(t[e.pending.type]=r.pending),r.rejected&&(t[e.rejected.type]=r.rejected),r.fulfilled&&(t[e.fulfilled.type]=r.fulfilled),r.settled&&n.push({matcher:e.settled,reducer:r.settled}),i},addMatcher(e,t){return n.push({matcher:e,reducer:t}),i},addDefaultCase(e){return r=e,i}};return e(i),[t,n,r]}function Ma(e){return typeof e==`function`}function Na(e,t){let[n,r,i]=ja(t),a;if(Ma(e))a=()=>xa(e());else{let t=xa(e);a=()=>t}function o(e=a(),t){let o=[n[t.type],...r.filter(({matcher:e})=>e(t)).map(({reducer:e})=>e)];return o.filter(e=>!!e).length===0&&(o=[i]),o.reduce((e,n)=>{if(n){if(ai(e)){let r=n(e,t);return r===void 0?e:r}if(oi(e))return ma(e,e=>n(e,t));{let r=n(e,t);if(r===void 0){if(e===null)return e;throw Error(`A case reducer on a non-draftable value must not return undefined`)}return r}}return e},e)}return o.getInitialState=a,o}var Pa=`ModuleSymbhasOwnPr-0123456789ABCDEFGHNRVfgctiUvz_KqYTJkLxpZXIjQW`,Fa=(e=21)=>{let t=``,n=e;for(;n--;)t+=Pa[Math.random()*64|0];return t},Ia=Symbol.for(`rtk-slice-createasyncthunk`);function La(e,t){return`${e}/${t}`}function Ra({creators:e}={}){let t=e?.asyncThunk?.[Ia];return function(e){let{name:n,reducerPath:r=n}=e;if(!n)throw Error(Oo(11));let i=(typeof e.reducers==`function`?e.reducers(Va()):e.reducers)||{},a=Object.keys(i),o={sliceCaseReducersByName:{},sliceCaseReducersByType:{},actionCreators:{},sliceMatchers:[]},s={addCase(e,t){let n=typeof e==`string`?e:e.type;if(!n)throw Error(Oo(12));if(n in o.sliceCaseReducersByType)throw Error(Oo(13));return o.sliceCaseReducersByType[n]=t,s},addMatcher(e,t){return o.sliceMatchers.push({matcher:e,reducer:t}),s},exposeAction(e,t){return o.actionCreators[e]=t,s},exposeCaseReducer(e,t){return o.sliceCaseReducersByName[e]=t,s}};a.forEach(r=>{let a=i[r],o={reducerName:r,type:La(n,r),createNotation:typeof e.reducers==`function`};Ua(a)?Ga(o,a,s,t):Ha(o,a,s)});function c(){let[t={},n=[],r=void 0]=typeof e.extraReducers==`function`?ja(e.extraReducers):[e.extraReducers],i={...t,...o.sliceCaseReducersByType};return Na(e.initialState,e=>{for(let t in i)e.addCase(t,i[t]);for(let t of o.sliceMatchers)e.addMatcher(t.matcher,t.reducer);for(let t of n)e.addMatcher(t.matcher,t.reducer);r&&e.addDefaultCase(r)})}let l=e=>e,u=new Map,d=new WeakMap,f;function p(e,t){return f||=c(),f(e,t)}function m(){return f||=c(),f.getInitialState()}function h(t,n=!1){function r(e){let i=e[t];return i===void 0&&n&&(i=Sa(d,r,m)),i}function i(t=l){return Sa(Sa(u,n,()=>new WeakMap),t,()=>{let r={};for(let[i,a]of Object.entries(e.selectors??{}))r[i]=za(a,t,()=>Sa(d,t,m),n);return r})}return{reducerPath:t,getSelectors:i,get selectors(){return i(r)},selectSlice:r}}let g={name:n,reducer:p,actions:o.actionCreators,caseReducers:o.sliceCaseReducersByName,getInitialState:m,...h(r),injectInto(e,{reducerPath:t,...n}={}){let i=t??r;return e.inject({reducerPath:i,reducer:p},n),{...g,...h(i,!0)}}};return g}}function za(e,t,n,r){function i(i,...a){let o=t(i);return o===void 0&&r&&(o=n()),e(o,...a)}return i.unwrapped=e,i}var Ba=Ra();function Va(){function e(e,t){return{_reducerDefinitionType:`asyncThunk`,payloadCreator:e,...t}}return e.withTypes=()=>e,{reducer(e){return Object.assign({[e.name](...t){return e(...t)}}[e.name],{_reducerDefinitionType:`reducer`})},preparedReducer(e,t){return{_reducerDefinitionType:`reducerWithPrepare`,prepare:e,reducer:t}},asyncThunk:e}}function Ha({type:e,reducerName:t,createNotation:n},r,i){let a,o;if(`reducer`in r){if(n&&!Wa(r))throw Error(Oo(17));a=r.reducer,o=r.prepare}else a=r;i.addCase(e,a).exposeCaseReducer(t,a).exposeAction(t,o?ya(e,o):ya(e))}function Ua(e){return e._reducerDefinitionType===`asyncThunk`}function Wa(e){return e._reducerDefinitionType===`reducerWithPrepare`}function Ga({type:e,reducerName:t},n,r,i){if(!i)throw Error(Oo(18));let{payloadCreator:a,fulfilled:o,pending:s,rejected:c,settled:l,options:u}=n,d=i(e,a,u);r.exposeAction(t,d),o&&r.addCase(d.fulfilled,o),s&&r.addCase(d.pending,s),c&&r.addCase(d.rejected,c),l&&r.addMatcher(d.settled,l),r.exposeCaseReducer(t,{fulfilled:o||Ka,pending:s||Ka,rejected:c||Ka,settled:l||Ka})}function Ka(){}var qa=`task`,Ja=`listener`,Ya=`completed`,Xa=`cancelled`,Za=`task-${Xa}`,Qa=`task-${Ya}`,$a=`${Ja}-${Xa}`,eo=`${Ja}-${Ya}`,to=class{constructor(e){this.code=e,this.message=`${qa} ${Xa} (reason: ${e})`}code;name=`TaskAbortError`;message},no=(e,t)=>{if(typeof e!=`function`)throw TypeError(Oo(32))},ro=()=>{},io=(e,t=ro)=>(e.catch(t),e),ao=(e,t)=>(e.addEventListener(`abort`,t,{once:!0}),()=>e.removeEventListener(`abort`,t)),oo=e=>{if(e.aborted)throw new to(e.reason)};function so(e,t){let n=ro;return new Promise((r,i)=>{let a=()=>i(new to(e.reason));if(e.aborted){a();return}n=ao(e,a),t.finally(()=>n()).then(r,i)}).finally(()=>{n=ro})}var co=async(e,t)=>{try{return await Promise.resolve(),{status:`ok`,value:await e()}}catch(e){return{status:e instanceof to?`cancelled`:`rejected`,error:e}}finally{t?.()}},lo=e=>t=>io(so(e,t).then(t=>(oo(e),t))),uo=e=>{let t=lo(e);return e=>t(new Promise(t=>setTimeout(t,e)))},{assign:fo}=Object,po={},mo=`listenerMiddleware`,ho=(e,t)=>{let n=t=>ao(e,()=>t.abort(e.reason));return(r,i)=>{no(r,`taskExecutor`);let a=new AbortController;n(a);let o=co(async()=>{oo(e),oo(a.signal);let t=await r({pause:lo(a.signal),delay:uo(a.signal),signal:a.signal});return oo(a.signal),t},()=>a.abort(Qa));return i?.autoJoin&&t.push(o.catch(ro)),{result:lo(e)(o),cancel(){a.abort(Za)}}}},go=(e,t)=>{let n=async(n,r)=>{oo(t);let i=()=>{},a=[new Promise((t,r)=>{let a=e({predicate:n,effect:(e,n)=>{n.unsubscribe(),t([e,n.getState(),n.getOriginalState()])}});i=()=>{a(),r()}})];r!=null&&a.push(new Promise(e=>setTimeout(e,r,null)));try{let e=await so(t,Promise.race(a));return oo(t),e}finally{i()}};return((e,t)=>io(n(e,t)))},_o=e=>{let{type:t,actionCreator:n,matcher:r,predicate:i,effect:a}=e;if(t)i=ya(t).match;else if(n)t=n.type,i=n.match;else if(r)i=r;else if(!i)throw Error(Oo(21));return no(a,`options.listener`),{predicate:i,type:t,effect:a}},vo=fo(e=>{let{type:t,predicate:n,effect:r}=_o(e);return{id:Fa(),effect:r,type:t,predicate:n,pending:new Set,unsubscribe:()=>{throw Error(Oo(22))}}},{withTypes:()=>vo}),yo=(e,t)=>{let{type:n,effect:r,predicate:i}=_o(t);return Array.from(e.values()).find(e=>(typeof n==`string`?e.type===n:e.predicate===i)&&e.effect===r)},bo=e=>{e.pending.forEach(e=>{e.abort($a)})},xo=(e,t)=>()=>{for(let e of t.keys())bo(e);e.clear()},So=(e,t,n)=>{try{e(t,n)}catch(e){setTimeout(()=>{throw e},0)}},Co=fo(ya(`${mo}/add`),{withTypes:()=>Co}),wo=ya(`${mo}/removeAll`),To=fo(ya(`${mo}/remove`),{withTypes:()=>To}),Eo=(...e)=>{console.error(`${mo}/error`,...e)},Do=(e={})=>{let t=new Map,n=new Map,r=e=>{let t=n.get(e)??0;n.set(e,t+1)},i=e=>{let t=n.get(e)??1;t===1?n.delete(e):n.set(e,t-1)},{extra:a,onError:o=Eo}=e;no(o,`onError`);let s=e=>(e.unsubscribe=()=>t.delete(e.id),t.set(e.id,e),t=>{e.unsubscribe(),t?.cancelActive&&bo(e)}),c=(e=>{let n=yo(t,e)??vo(e);return s(n)});fo(c,{withTypes:()=>c});let l=e=>{let n=yo(t,e);return n&&(n.unsubscribe(),e.cancelActive&&bo(n)),!!n};fo(l,{withTypes:()=>l});let u=async(e,n,s,l)=>{let u=new AbortController,d=go(c,u.signal),f=[];try{e.pending.add(u),r(e),await Promise.resolve(e.effect(n,fo({},s,{getOriginalState:l,condition:(e,t)=>d(e,t).then(Boolean),take:d,delay:uo(u.signal),pause:lo(u.signal),extra:a,signal:u.signal,fork:ho(u.signal,f),unsubscribe:e.unsubscribe,subscribe:()=>{t.set(e.id,e)},cancelActiveListeners:()=>{e.pending.forEach((e,t,n)=>{e!==u&&(e.abort($a),n.delete(e))})},cancel:()=>{u.abort($a),e.pending.delete(u)},throwIfCancelled:()=>{oo(u.signal)}})))}catch(e){e instanceof to||So(o,e,{raisedBy:`effect`})}finally{await Promise.all(f),u.abort(eo),i(e),e.pending.delete(u)}},d=xo(t,n);return{middleware:e=>n=>r=>{if(!Kr(r))return n(r);if(Co.match(r))return c(r.payload);if(wo.match(r)){d();return}if(To.match(r))return l(r.payload);let i=e.getState(),a=()=>{if(i===po)throw Error(Oo(23));return i},s;try{if(s=n(r),t.size>0){let n=e.getState(),s=Array.from(t.values());for(let t of s){let s=!1;try{s=t.predicate(r,n,i)}catch(e){s=!1,So(o,e,{raisedBy:`predicate`})}s&&u(t,r,e,a)}}}finally{i=po}return s},startListening:c,stopListening:l,clearListeners:d}};function Oo(e){return`Minified Redux Toolkit error #${e}; visit https://redux-toolkit.js.org/Errors?code=${e} for the full message or use the non-minified dev environment for full errors. `}var ko=Ba({name:`chartLayout`,initialState:{layoutType:`horizontal`,width:0,height:0,margin:{top:5,right:5,bottom:5,left:5},scale:1},reducers:{setLayout(e,t){e.layoutType=t.payload},setChartSize(e,t){e.width=t.payload.width,e.height=t.payload.height},setMargin(e,t){e.margin.top=t.payload.top??0,e.margin.right=t.payload.right??0,e.margin.bottom=t.payload.bottom??0,e.margin.left=t.payload.left??0},setScale(e,t){e.scale=t.payload}}}),Ao=ko.actions,jo=Ao.setMargin,Mo=Ao.setLayout,No=Ao.setChartSize,Po=Ao.setScale,Fo=ko.reducer;function Io(e,t,n){return Array.isArray(e)&&e&&t+n!==0?e.slice(t,n+1):e}function U(e){return Number.isFinite(e)}function Lo(e){return typeof e==`number`&&e>0&&Number.isFinite(e)}function Ro(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter(function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable})),n.push.apply(n,r)}return n}function zo(e){for(var t=1;t{if(t&&n){var r=n.width,i=n.height,a=t.align,o=t.verticalAlign,s=t.layout,c=t.position,l=t.offset,u=l===void 0?0:l;if(c!=null){if(Ee(c)){if(c===`top`&&I(e.top))return zo(zo({},e),{},{top:e.top+(i||0)+u});if(c===`bottom`&&I(e.bottom))return zo(zo({},e),{},{bottom:e.bottom+(i||0)+u});if(c===`left`&&I(e.left))return zo(zo({},e),{},{left:e.left+(r||0)+u});if(c===`right`&&I(e.right))return zo(zo({},e),{},{right:e.right+(r||0)+u})}return e}if((s===`vertical`||s===`horizontal`&&o===`middle`)&&a!==`center`&&I(e[a]))return zo(zo({},e),{},{[a]:e[a]+(r||0)});if((s===`horizontal`||s===`vertical`&&a===`center`)&&o!==`middle`&&I(e[o]))return zo(zo({},e),{},{[o]:e[o]+(i||0)})}return e},Wo=(e,t)=>e===`horizontal`&&t===`xAxis`||e===`vertical`&&t===`yAxis`||e===`centric`&&t===`angleAxis`||e===`radial`&&t===`radiusAxis`,Go=(e,t,n,r)=>{if(r)return e.map(e=>e.coordinate);var i,a,o=e.map(e=>(e.coordinate===t&&(i=!0),e.coordinate===n&&(a=!0),e.coordinate));return i||o.push(t),a||o.push(n),o},Ko=(e,t,n)=>{if(!e)return null;var r=e.duplicateDomain,i=e.type,a=e.range,o=e.scale,s=e.realScaleType,c=e.isCategorical,l=e.categoricalDomain,u=e.tickCount,d=e.ticks,f=e.niceTicks,p=e.axisType;if(!o)return null;var m=s===`scaleBand`&&o.bandwidth?o.bandwidth()/2:2,h=(t||n)&&i===`category`&&o.bandwidth?o.bandwidth()/m:0;return h=p===`angleAxis`&&a&&a.length>=2?F(a[0]-a[1])*2*h:h,t&&(d||f)?(d||f||[]).map((e,t)=>{var n=r?r.indexOf(e):e,i=o.map(n);return U(i)?{coordinate:i+h,value:e,offset:h,index:t}:null}).filter(ge):c&&l?l.map((e,t)=>{var n=o.map(e);return U(n)?{coordinate:n+h,value:e,index:t,offset:h}:null}).filter(ge):o.ticks&&!n&&u!=null?o.ticks(u).map((e,t)=>{var n=o.map(e);return U(n)?{coordinate:n+h,value:e,index:t,offset:h}:null}).filter(ge):o.domain().map((e,t)=>{var n=o.map(e);return U(n)?{coordinate:n+h,value:r?r[e]:e,index:t,offset:h}:null}).filter(ge)},qo={sign:e=>{var t=e.length;if(!(t<=0)){var n=e[0]?.length;if(!(n==null||n<=0))for(var r=0;r=0?(s[0]=i,i+=u,s[1]=i):(s[0]=a,a+=u,s[1]=a)}}}},expand:Ct,none:vt,silhouette:wt,wiggle:Tt,positive:e=>{var t=e.length;if(!(t<=0)){var n=e[0]?.length;if(!(n==null||n<=0))for(var r=0;r=0?(o[0]=i,i+=s,o[1]=i):(o[0]=0,o[1]=0)}}}}},Jo=(e,t,n)=>{var r=qo[n]??vt,i=St().keys(t).value((e,t)=>Number(W(e,t,0))).order(yt).offset(r)(e);return i.forEach((n,r)=>{n.forEach((n,i)=>{var a=W(e[i],t[r],0);Array.isArray(a)&&a.length===2&&I(a[0])&&I(a[1])&&(n[0]=a[0],n[1]=a[1])})}),i};function Yo(e){return e==null?void 0:String(e)}function Xo(e){var t=e.axis,n=e.ticks,r=e.bandSize,i=e.entry,a=e.index,o=e.dataKey;if(t.type===`category`){if(!t.allowDuplicatedCategory&&t.dataKey&&!me(i[t.dataKey])){var s=pe(n,`value`,i[t.dataKey]);if(s)return s.coordinate+r/2}return n!=null&&n[a]?n[a].coordinate+r/2:null}var c=W(i,me(o)?t.dataKey:o),l=t.scale.map(c);return I(l)?l:null}var Zo=e=>{var t=e.flat(2).filter(I);return[Math.min(...t),Math.max(...t)]},Qo=e=>[e[0]===1/0?0:e[0],e[1]===-1/0?0:e[1]],$o=(e,t,n)=>{if(e!=null&&Object.keys(e).length!==0)return Qo(Object.keys(e).reduce((r,i)=>{var a=e[i];if(!a)return r;var o=a.stackedData.reduce((e,r)=>{var i=Zo(Io(r,t,n));return!U(i[0])||!U(i[1])?e:[Math.min(e[0],i[0]),Math.max(e[1],i[1])]},[1/0,-1/0]);return[Math.min(o[0],r[0]),Math.max(o[1],r[1])]},[1/0,-1/0]))},es=/^dataMin[\s]*-[\s]*([0-9]+([.]{1}[0-9]+){0,1})$/,ts=/^dataMax[\s]*\+[\s]*([0-9]+([.]{1}[0-9]+){0,1})$/,ns=(e,t,n)=>{if(e&&e.scale&&e.scale.bandwidth){var r=e.scale.bandwidth();if(!n||r>0)return r}if(e&&t&&t.length>=2){for(var i=Cr(t,e=>e.coordinate),a=[],o=0,s=1,c=i.length;su&&(d=Math.min(f,d));return d===1/0?0:d}return n?void 0:0};function rs(e){var t=e.tooltipEntrySettings,n=e.dataKey,r=e.payload,i=e.value,a=e.name;return zo(zo({},t),{},{dataKey:n,payload:r,value:i,name:a})}function is(e,t){if(e!=null)return String(e);if(typeof t==`string`)return t}var as=(e,t)=>{if(t===`horizontal`)return e.relativeX;if(t===`vertical`)return e.relativeY},os=(e,t)=>t===`centric`?e.angle:e.radius,ss=e=>e.layout.width,cs=e=>e.layout.height,ls=e=>e.layout.scale,us=e=>e.layout.margin,ds=B(e=>e.cartesianAxis.xAxis,e=>Object.values(e)),fs=B(e=>e.cartesianAxis.yAxis,e=>Object.values(e)),ps=`data-recharts-item-index`,ms=`data-recharts-item-id`;function hs(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter(function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable})),n.push.apply(n,r)}return n}function gs(e){for(var t=1;te.brush.height;function xs(e){return fs(e).reduce((e,t)=>t.orientation===`left`&&!t.mirror&&!t.hide?e+(typeof t.width==`number`?t.width:60):e,0)}function Ss(e){return fs(e).reduce((e,t)=>t.orientation===`right`&&!t.mirror&&!t.hide?e+(typeof t.width==`number`?t.width:60):e,0)}function Cs(e){return ds(e).reduce((e,t)=>t.orientation===`top`&&!t.mirror&&!t.hide?e+(typeof t.height==`number`?t.height:30):e,0)}function ws(e){return ds(e).reduce((e,t)=>t.orientation===`bottom`&&!t.mirror&&!t.hide?e+(typeof t.height==`number`?t.height:30):e,0)}var Ts=B([ss,cs,us,bs,xs,Ss,Cs,ws,wr,Tr],(e,t,n,r,i,a,o,s,c,l)=>{var u={left:(n.left||0)+i,right:(n.right||0)+a},d=gs(gs({},{top:(n.top||0)+o,bottom:(n.bottom||0)+s}),u),f=d.bottom;d.bottom+=r,d=Uo(d,c,l);var p=e-d.left-d.right,m=t-d.top-d.bottom;return gs(gs({brushBottom:f},d),{},{width:Math.max(p,0),height:Math.max(m,0)})}),Es=B(Ts,e=>({x:e.left,y:e.top,width:e.width,height:e.height})),Ds=B(ss,cs,(e,t)=>({x:0,y:0,width:e,height:t})),Os=(0,o.createContext)(null),ks=()=>(0,o.useContext)(Os)!=null,As=e=>e.brush,js=B([As,Ts,us],(e,t,n)=>({height:e.height,x:I(e.x)?e.x:t.left,y:I(e.y)?e.y:t.top+t.height+t.brushBottom-(n?.bottom||0),width:I(e.width)?e.width:t.width}));function Ms(e,t,{signal:n,edges:r}={}){let i,a=null,o=r!=null&&r.includes(`leading`),s=r==null||r.includes(`trailing`),c=()=>{a!==null&&(e.apply(i,a),i=void 0,a=null)},l=()=>{s&&c(),p()},u=null,d=()=>{u!=null&&clearTimeout(u),u=setTimeout(()=>{u=null,l()},t)},f=()=>{u!==null&&(clearTimeout(u),u=null)},p=()=>{f(),i=void 0,a=null},m=()=>{c()},h=function(...e){if(n?.aborted)return;i=this,a=e;let t=u==null;d(),o&&t&&c()};return h.schedule=d,h.cancel=p,h.flush=m,n?.addEventListener(`abort`,p,{once:!0}),h}function Ns(e,t=0,n={}){typeof n!=`object`&&(n={});let{leading:r=!1,trailing:i=!0,maxWait:a}=n,o=[,,];r&&(o[0]=`leading`),i&&(o[1]=`trailing`);let s,c=null,l=Ms(function(...t){s=e.apply(this,t),c=null},t,{edges:o}),u=function(...t){return a!=null&&(c===null&&(c=Date.now()),Date.now()-c>=a)?((r||i)&&(s=e.apply(this,t)),c=Date.now(),l.cancel(),l.schedule(),s):(l.apply(this,t),s)};return u.cancel=l.cancel,u.flush=()=>(l.flush(),s),u}function Ps(e,t=0,n={}){let{leading:r=!0,trailing:i=!0}=n;return Ns(e,t,{leading:r,maxWait:t,trailing:i})}var Fs=function(e,t){var n=[...arguments].slice(2);if(typeof console<`u`&&console.warn&&(t===void 0&&console.warn(`LogUtils requires an error message argument`),!e)){if(t===void 0)console.warn(`Minified exception occurred; use the non-minified dev environment for the full error message and additional helpful warnings.`);else{var r=0;console.warn(t.replace(/%s/g,()=>n[r++]))}}},Is={width:`100%`,height:`100%`,debounce:0,minWidth:0,initialDimension:{width:-1,height:-1}},Ls=(e,t,n)=>{var r=n.width,i=r===void 0?Is.width:r,a=n.height,o=a===void 0?Is.height:a,s=n.aspect,c=n.maxHeight,l=oe(i)?e:Number(i),u=oe(o)?t:Number(o);return s&&s>0&&(l?u=l/s:u&&(l=u*s),c&&u!=null&&u>c&&(u=c)),{calculatedWidth:l,calculatedHeight:u}},Rs={width:0,height:0,overflow:`visible`},zs={width:0,overflowX:`visible`},Bs={height:0,overflowY:`visible`},Vs={},Hs=e=>{var t=e.width,n=e.height,r=oe(t),i=oe(n);return r&&i?Rs:r?zs:i?Bs:Vs};function Us(e){var t=e.width,n=e.height,r=e.aspect,i=t,a=n;return i===void 0&&a===void 0?(i=Is.width,a=Is.height):i===void 0?i=r&&r>0?void 0:Is.width:a===void 0&&(a=r&&r>0?void 0:Is.height),{width:i,height:a}}var Ws=[`aspect`,`initialDimension`,`width`,`height`,`minWidth`,`minHeight`,`maxHeight`,`children`,`debounce`,`id`,`className`,`onResize`,`style`];function Gs(){return Gs=Object.assign?Object.assign.bind():function(e){for(var t=1;te.length)&&(t=e.length);for(var n=0,r=Array(t);n({width:n,height:r}),[n,r]);return oc(i)?o.createElement(ac.Provider,{value:i},t):null}var cc=()=>(0,o.useContext)(ac),lc=(0,o.forwardRef)((e,t)=>{var n=e.aspect,i=e.initialDimension,a=i===void 0?Is.initialDimension:i,s=e.width,c=e.height,l=e.minWidth,u=l===void 0?Is.minWidth:l,d=e.minHeight,f=e.maxHeight,p=e.children,m=e.debounce,h=m===void 0?Is.debounce:m,g=e.id,_=e.className,v=e.onResize,y=e.style,b=y===void 0?{}:y,x=rc(e,Ws),S=(0,o.useRef)(null),C=(0,o.useRef)();C.current=v,(0,o.useImperativeHandle)(t,()=>S.current);var w=Zs((0,o.useState)({containerWidth:a.width,containerHeight:a.height}),2),T=w[0],E=w[1],D=(0,o.useCallback)((e,t)=>{E(n=>{var r=Math.round(e),i=Math.round(t);return n.containerWidth===r&&n.containerHeight===i?n:{containerWidth:r,containerHeight:i}})},[]);(0,o.useEffect)(()=>{if(S.current==null||typeof ResizeObserver>`u`)return _e;var e=e=>{var t,n=e[0];if(n!=null){var r=n.contentRect,i=r.width,a=r.height;D(i,a),(t=C.current)==null||t.call(C,i,a)}};h>0&&(e=Ps(e,h,{trailing:!0,leading:!1}));var t=new ResizeObserver(e),n=S.current.getBoundingClientRect(),r=n.width,i=n.height;return D(r,i),t.observe(S.current),()=>{t.disconnect()}},[D,h]);var O=T.containerWidth,k=T.containerHeight;Fs(!n||n>0,`The aspect(%s) must be greater than zero.`,n);var A=Ls(O,k,{width:s,height:c,aspect:n,maxHeight:f}),j=A.calculatedWidth,M=A.calculatedHeight;return Fs(O<0||k<0||j!=null&&j>0||M!=null&&M>0,`The width(%s) and height(%s) of chart should be greater than 0, please check the style of container, or the props width(%s) and height(%s), diff --git a/dist/assets/AutomationModule-CWTQE3B1.js b/dist/assets/AutomationModule-CWTQE3B1.js deleted file mode 100644 index d5d9514..0000000 --- a/dist/assets/AutomationModule-CWTQE3B1.js +++ /dev/null @@ -1 +0,0 @@ -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{t as s}from"./arrow-down-CWbiHuZO.js";import{t as c}from"./terminal-CcncyL3J.js";import{B as l,R as u,T as d,W as f,r as p,t as m,w as h}from"./index-CNnq9VO5.js";var g={name:`power`,size:24,node:[[`path`,{d:`M12 2v10`,key:`mnfbl`}],[`path`,{d:`M18.4 6.6a9 9 0 1 1-12.77.04`,key:`obofu9`}]]};g.node;var _=r(g),v=t(e(),1),y=a(),b=[{id:`n1`,type:`trigger`,title:`Триггер: Новое входящее сообщение в Telegram`,description:`Срабатывает мгновенно при обращении гостя в бота заведения`,badge:`Событие`,badgeVariant:`gold`,latencyMs:14},{id:`n2`,type:`condition`,title:`Условие: Поиск клиента в базе CRM платформы`,description:`Проверка номера телефона и истории заказов: клиент найден в базе`,badge:`CRM Match`,badgeVariant:`neutral`,latencyMs:42},{id:`n3`,type:`ai`,title:`✦ Krona AI: Определение намерения гостя (Intent Analysis)`,description:`Классификация сообщения: запрос бронирования столика (уверенность 98%)`,badge:`ИИ-анализ`,badgeVariant:`gold`,latencyMs:175},{id:`n4`,type:`action`,title:`Действие: Создание сделки и назначение менеджера`,description:`Открытие карточки сделки в воронке со статусом «Бронирование стола»`,badge:`CRM Сделка`,badgeVariant:`green`,latencyMs:65},{id:`n5`,type:`action`,title:`Действие: Отправка подтверждения гостю в чат`,description:`Формирование персонализированного ответа с подтверждением даты и времени`,badge:`Telegram Reply`,badgeVariant:`info`,latencyMs:88}],x=()=>{let{showToast:e}=o(),[t,r]=(0,v.useState)(b),[a,g]=(0,v.useState)(!0),[x,S]=(0,v.useState)(!1),[C,w]=(0,v.useState)([]),[T,E]=(0,v.useState)(!1),[D,O]=(0,v.useState)(!1),[k,A]=(0,v.useState)(`action`),[j,M]=(0,v.useState)(``),[N,P]=(0,v.useState)(``),F=()=>{S(!0),E(!1),w([]);let n=[{stepNumber:1,nodeTitle:t[0].title,status:`running`,output:`Получен вебхук Telegram: "Добрый вечер, хотим столик на четверых на 19:30"`,latencyMs:14}];w([...n]),setTimeout(()=>{n[0].status=`success`,n.push({stepNumber:2,nodeTitle:t[1]?.title||`Поиск клиента`,status:`running`,output:`Поиск по номеру +7 (913) 482-19-02: Найден контакт «Анна Воронина» (VIP, 14 заказов)`,latencyMs:42}),w([...n])},400),setTimeout(()=>{n[1].status=`success`,n.push({stepNumber:3,nodeTitle:t[2]?.title||`AI Анализ`,status:`running`,output:`Модель Krona NLP v1.8: Класс = table_booking, Персоны = 4, Время = 19:30, Confidence = 98.4%`,latencyMs:175}),w([...n])},900),setTimeout(()=>{n[2].status=`success`,n.push({stepNumber:4,nodeTitle:t[3]?.title||`Создание сделки`,status:`running`,output:`Сделка #DL-9428 создана в воронке «Бронирование». Назначен менеджер: Алина Соколова`,latencyMs:65}),w([...n])},1400),setTimeout(()=>{n[3].status=`success`,n.push({stepNumber:5,nodeTitle:t[4]?.title||`Отправка ответа`,status:`success`,output:`Сообщение доставлено пользователю: "Анна, здравствуйте! Забронировали Стол 5 на 19:30."`,latencyMs:88}),w([...n]),S(!1),E(!0),e({title:`Тестовый запуск успешен!`,message:`Все 5 узлов цепочки выполнены без ошибок за 384 ms`,type:`success`})},1900)},I=t=>{if(t.preventDefault(),!j.trim())return;let n={id:`n-${Date.now()}`,type:k,title:j.trim(),description:N.trim()||`Пользовательский шаг автоматизации`,badge:k.toUpperCase(),badgeVariant:{trigger:`gold`,condition:`neutral`,ai:`gold`,action:`green`}[k],latencyMs:Math.floor(20+Math.random()*80)};r(e=>[...e,n]),O(!1),M(``),P(``),e({title:`Узел добавлен в цепочку`,message:`Блок «${n.title}» готов к выполнению`,type:`success`})},L=t.reduce((e,t)=>e+t.latencyMs,0);return(0,y.jsxs)(`div`,{className:`space-y-4 animate-fade-in`,children:[(0,y.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,y.jsxs)(`div`,{children:[(0,y.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,y.jsx)(`h2`,{className:`text-sm font-bold text-krona-primary`,children:`Автоматизация & Visual Workflow Engine`}),(0,y.jsx)(m,{level:`target`,size:`sm`})]}),(0,y.jsx)(`p`,{className:`text-xs text-krona-secondary mt-0.5`,children:`Визуальный конструктор бизнес-процессов: триггеры, условия, AI-агенты и автоматические действия`})]}),(0,y.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,y.jsxs)(n,{variant:a?`secondary`:`outline`,size:`sm`,onClick:()=>{g(!a),e({title:a?`Сценарий деактивирован`:`Сценарий активирован`,message:a?`Цепочка приостановлена`:`Сценарий слушает входящие события`,type:`info`})},children:[(0,y.jsx)(_,{className:`w-3.5 h-3.5 mr-1`}),a?`Активен (Вкл)`:`Отключен (Пауза)`]}),(0,y.jsxs)(n,{variant:`primary`,size:`sm`,onClick:()=>O(!0),children:[(0,y.jsx)(h,{className:`w-3.5 h-3.5 mr-1`}),`Добавить узел`]})]})]}),(0,y.jsxs)(`div`,{className:`grid grid-cols-1 lg:grid-cols-12 gap-4`,children:[(0,y.jsxs)(`div`,{className:`lg:col-span-7 bg-krona-surface border border-krona-border rounded-xl p-5 shadow-krona-soft space-y-4`,children:[(0,y.jsxs)(`div`,{className:`flex items-center justify-between pb-3 border-b border-krona-border`,children:[(0,y.jsxs)(`div`,{children:[(0,y.jsx)(`h4`,{className:`text-xs font-bold text-krona-primary`,children:`Сценарий: «Автоматическая обработка брони стола из Telegram»`}),(0,y.jsxs)(`span`,{className:`text-[11px] text-krona-secondary`,children:[`Всего шагов: `,t.length,` • Среднее время сквозного выполнения: ~`,L,` ms`]})]}),(0,y.jsx)(i,{variant:a?`green`:`neutral`,size:`sm`,children:a?`Работает в фоне`:`На паузе`})]}),(0,y.jsx)(`div`,{className:`max-w-xl mx-auto py-2 flex flex-col items-center space-y-2`,children:t.map((e,n)=>(0,y.jsxs)(v.Fragment,{children:[(0,y.jsxs)(`div`,{className:`w-full p-3.5 rounded-xl border border-krona-border bg-krona-workspace shadow-krona-soft flex items-start justify-between gap-3 hover:border-krona-border-strong transition-all`,children:[(0,y.jsxs)(`div`,{children:[(0,y.jsx)(`div`,{className:`flex items-center gap-2 mb-1`,children:(0,y.jsx)(`span`,{className:`text-xs font-bold text-krona-primary`,children:e.title})}),(0,y.jsx)(`p`,{className:`text-[11px] text-krona-secondary leading-snug`,children:e.description}),(0,y.jsxs)(`span`,{className:`text-[10px] text-krona-secondary font-mono mt-1 block`,children:[`Ожидаемая задержка: ~`,e.latencyMs,` ms`]})]}),(0,y.jsx)(i,{variant:e.badgeVariant,size:`sm`,children:e.badge})]}),n(0,y.jsxs)(`div`,{className:`space-y-0.5 animate-fade-in`,children:[(0,y.jsxs)(`div`,{className:`flex items-center justify-between text-[10px]`,children:[(0,y.jsxs)(`span`,{className:`text-krona-gold font-bold`,children:[`[ШАГ `,e.stepNumber,`] `,e.nodeTitle]}),(0,y.jsxs)(`span`,{className:`text-zinc-400`,children:[e.latencyMs,` ms`]})]}),(0,y.jsx)(`div`,{className:`text-zinc-300 pl-2 border-l border-zinc-700`,children:e.output}),(0,y.jsxs)(`div`,{className:`text-[10px] pl-2 font-bold`,children:[e.status===`success`&&(0,y.jsxs)(`span`,{className:`text-emerald-400 flex items-center gap-1`,children:[(0,y.jsx)(f,{className:`w-3 h-3`}),` УСПЕШНО`]}),e.status===`running`&&(0,y.jsxs)(`span`,{className:`text-amber-400 flex items-center gap-1`,children:[(0,y.jsx)(u,{className:`w-3 h-3 animate-spin`}),` ВЫПОЛНЕНИЕ...`]})]})]},e.stepNumber)),T&&(0,y.jsx)(`div`,{className:`pt-2 border-t border-zinc-800 text-emerald-400 font-bold text-center`,children:`✓ ВСЕ ШАГИ ВЫПОЛНЕНЫ УСПЕШНО (ИТОГО: 384 ms)`})]})]}),(0,y.jsxs)(`div`,{className:`p-2.5 bg-krona-workspace rounded-lg border border-krona-border text-[11px] text-krona-secondary flex items-center gap-2`,children:[(0,y.jsx)(l,{className:`w-4 h-4 text-krona-green shrink-0`}),(0,y.jsx)(`span`,{children:`Логи тестового запуска записываются в журнал аудита безопасности.`})]})]})]}),D&&(0,y.jsx)(p,{isOpen:D,onClose:()=>O(!1),title:`Добавить узел автоматизации`,subtitle:`Выбор типа операции в цепочке`,maxWidth:`sm`,footer:(0,y.jsxs)(`div`,{className:`flex gap-2 w-full justify-end`,children:[(0,y.jsx)(n,{variant:`secondary`,onClick:()=>O(!1),children:`Отмена`}),(0,y.jsx)(n,{variant:`primary`,onClick:I,children:`Добавить в сценарий`})]}),children:(0,y.jsxs)(`div`,{className:`space-y-3 text-xs`,children:[(0,y.jsxs)(`div`,{className:`space-y-1`,children:[(0,y.jsx)(`label`,{className:`font-semibold text-krona-primary`,children:`Тип узла:`}),(0,y.jsxs)(`select`,{value:k,onChange:e=>A(e.target.value),className:`w-full p-2 bg-krona-workspace border border-krona-border rounded-lg text-krona-primary focus:outline-none focus:border-krona-green`,children:[(0,y.jsx)(`option`,{value:`action`,children:`Действие (Action)`}),(0,y.jsx)(`option`,{value:`condition`,children:`Условие (Condition)`}),(0,y.jsx)(`option`,{value:`ai`,children:`ИИ-агент (Krona AI)`}),(0,y.jsx)(`option`,{value:`trigger`,children:`Триггер (Trigger)`})]})]}),(0,y.jsxs)(`div`,{className:`space-y-1`,children:[(0,y.jsx)(`label`,{className:`font-semibold text-krona-primary`,children:`Название шага:`}),(0,y.jsx)(`input`,{type:`text`,value:j,onChange:e=>M(e.target.value),placeholder:`Например: Отправить уведомление в Telegram администратору`,className:`w-full p-2 bg-krona-workspace border border-krona-border rounded-lg text-krona-primary focus:outline-none focus:border-krona-green`})]}),(0,y.jsxs)(`div`,{className:`space-y-1`,children:[(0,y.jsx)(`label`,{className:`font-semibold text-krona-primary`,children:`Описание / Логика:`}),(0,y.jsx)(`textarea`,{rows:2,value:N,onChange:e=>P(e.target.value),placeholder:`Укажите условия или параметры вызова...`,className:`w-full p-2 bg-krona-workspace border border-krona-border rounded-lg text-krona-primary focus:outline-none focus:border-krona-green resize-none`})]})]})})]})};export{x as AutomationModule}; \ No newline at end of file diff --git a/dist/assets/AutomationModule-DO2GmeS1.js b/dist/assets/AutomationModule-DO2GmeS1.js new file mode 100644 index 0000000..d8cebba --- /dev/null +++ b/dist/assets/AutomationModule-DO2GmeS1.js @@ -0,0 +1 @@ +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{t as s}from"./arrow-down-CWbiHuZO.js";import{B as c,E as l,H as u,K as d,T as f,d as p,r as m,t as h}from"./index-CrJKtV0u.js";var g={name:`power`,size:24,node:[[`path`,{d:`M12 2v10`,key:`mnfbl`}],[`path`,{d:`M18.4 6.6a9 9 0 1 1-12.77.04`,key:`obofu9`}]]};g.node;var _=r(g),v=t(e(),1),y=a(),b=[{id:`n1`,type:`trigger`,title:`Триггер: Новое входящее сообщение в Telegram`,description:`Срабатывает мгновенно при обращении гостя в бота заведения`,badge:`Событие`,badgeVariant:`gold`,latencyMs:14},{id:`n2`,type:`condition`,title:`Условие: Поиск клиента в базе CRM платформы`,description:`Проверка номера телефона и истории заказов: клиент найден в базе`,badge:`CRM Match`,badgeVariant:`neutral`,latencyMs:42},{id:`n3`,type:`ai`,title:`✦ Krona AI: Определение намерения гостя (Intent Analysis)`,description:`Классификация сообщения: запрос бронирования столика (уверенность 98%)`,badge:`ИИ-анализ`,badgeVariant:`gold`,latencyMs:175},{id:`n4`,type:`action`,title:`Действие: Создание сделки и назначение менеджера`,description:`Открытие карточки сделки в воронке со статусом «Бронирование стола»`,badge:`CRM Сделка`,badgeVariant:`green`,latencyMs:65},{id:`n5`,type:`action`,title:`Действие: Отправка подтверждения гостю в чат`,description:`Формирование персонализированного ответа с подтверждением даты и времени`,badge:`Telegram Reply`,badgeVariant:`info`,latencyMs:88}],x=()=>{let{showToast:e}=o(),[t,r]=(0,v.useState)(b),[a,g]=(0,v.useState)(!0),[x,S]=(0,v.useState)(!1),[C,w]=(0,v.useState)([]),[T,E]=(0,v.useState)(!1),[D,O]=(0,v.useState)(!1),[k,A]=(0,v.useState)(`action`),[j,M]=(0,v.useState)(``),[N,P]=(0,v.useState)(``),F=()=>{S(!0),E(!1),w([]);let n=[{stepNumber:1,nodeTitle:t[0].title,status:`running`,output:`Получен вебхук Telegram: "Добрый вечер, хотим столик на четверых на 19:30"`,latencyMs:14}];w([...n]),setTimeout(()=>{n[0].status=`success`,n.push({stepNumber:2,nodeTitle:t[1]?.title||`Поиск клиента`,status:`running`,output:`Поиск по номеру +7 (913) 482-19-02: Найден контакт «Анна Воронина» (VIP, 14 заказов)`,latencyMs:42}),w([...n])},400),setTimeout(()=>{n[1].status=`success`,n.push({stepNumber:3,nodeTitle:t[2]?.title||`AI Анализ`,status:`running`,output:`Модель Krona NLP v1.8: Класс = table_booking, Персоны = 4, Время = 19:30, Confidence = 98.4%`,latencyMs:175}),w([...n])},900),setTimeout(()=>{n[2].status=`success`,n.push({stepNumber:4,nodeTitle:t[3]?.title||`Создание сделки`,status:`running`,output:`Сделка #DL-9428 создана в воронке «Бронирование». Назначен менеджер: Алина Соколова`,latencyMs:65}),w([...n])},1400),setTimeout(()=>{n[3].status=`success`,n.push({stepNumber:5,nodeTitle:t[4]?.title||`Отправка ответа`,status:`success`,output:`Сообщение доставлено пользователю: "Анна, здравствуйте! Забронировали Стол 5 на 19:30."`,latencyMs:88}),w([...n]),S(!1),E(!0),e({title:`Тестовый запуск успешен!`,message:`Все 5 узлов цепочки выполнены без ошибок за 384 ms`,type:`success`})},1900)},I=t=>{if(t.preventDefault(),!j.trim())return;let n={id:`n-${Date.now()}`,type:k,title:j.trim(),description:N.trim()||`Пользовательский шаг автоматизации`,badge:k.toUpperCase(),badgeVariant:{trigger:`gold`,condition:`neutral`,ai:`gold`,action:`green`}[k],latencyMs:Math.floor(20+Math.random()*80)};r(e=>[...e,n]),O(!1),M(``),P(``),e({title:`Узел добавлен в цепочку`,message:`Блок «${n.title}» готов к выполнению`,type:`success`})},L=t.reduce((e,t)=>e+t.latencyMs,0);return(0,y.jsxs)(`div`,{className:`space-y-4 animate-fade-in`,children:[(0,y.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,y.jsxs)(`div`,{children:[(0,y.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,y.jsx)(`h2`,{className:`text-sm font-bold text-krona-primary`,children:`Автоматизация & Visual Workflow Engine`}),(0,y.jsx)(h,{level:`target`,size:`sm`})]}),(0,y.jsx)(`p`,{className:`text-xs text-krona-secondary mt-0.5`,children:`Визуальный конструктор бизнес-процессов: триггеры, условия, AI-агенты и автоматические действия`})]}),(0,y.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,y.jsxs)(n,{variant:a?`secondary`:`outline`,size:`sm`,onClick:()=>{g(!a),e({title:a?`Сценарий деактивирован`:`Сценарий активирован`,message:a?`Цепочка приостановлена`:`Сценарий слушает входящие события`,type:`info`})},children:[(0,y.jsx)(_,{className:`w-3.5 h-3.5 mr-1`}),a?`Активен (Вкл)`:`Отключен (Пауза)`]}),(0,y.jsxs)(n,{variant:`primary`,size:`sm`,onClick:()=>O(!0),children:[(0,y.jsx)(f,{className:`w-3.5 h-3.5 mr-1`}),`Добавить узел`]})]})]}),(0,y.jsxs)(`div`,{className:`grid grid-cols-1 lg:grid-cols-12 gap-4`,children:[(0,y.jsxs)(`div`,{className:`lg:col-span-7 bg-krona-surface border border-krona-border rounded-xl p-5 shadow-krona-soft space-y-4`,children:[(0,y.jsxs)(`div`,{className:`flex items-center justify-between pb-3 border-b border-krona-border`,children:[(0,y.jsxs)(`div`,{children:[(0,y.jsx)(`h4`,{className:`text-xs font-bold text-krona-primary`,children:`Сценарий: «Автоматическая обработка брони стола из Telegram»`}),(0,y.jsxs)(`span`,{className:`text-[11px] text-krona-secondary`,children:[`Всего шагов: `,t.length,` • Среднее время сквозного выполнения: ~`,L,` ms`]})]}),(0,y.jsx)(i,{variant:a?`green`:`neutral`,size:`sm`,children:a?`Работает в фоне`:`На паузе`})]}),(0,y.jsx)(`div`,{className:`max-w-xl mx-auto py-2 flex flex-col items-center space-y-2`,children:t.map((e,n)=>(0,y.jsxs)(v.Fragment,{children:[(0,y.jsxs)(`div`,{className:`w-full p-3.5 rounded-xl border border-krona-border bg-krona-workspace shadow-krona-soft flex items-start justify-between gap-3 hover:border-krona-border-strong transition-all`,children:[(0,y.jsxs)(`div`,{children:[(0,y.jsx)(`div`,{className:`flex items-center gap-2 mb-1`,children:(0,y.jsx)(`span`,{className:`text-xs font-bold text-krona-primary`,children:e.title})}),(0,y.jsx)(`p`,{className:`text-[11px] text-krona-secondary leading-snug`,children:e.description}),(0,y.jsxs)(`span`,{className:`text-[10px] text-krona-secondary font-mono mt-1 block`,children:[`Ожидаемая задержка: ~`,e.latencyMs,` ms`]})]}),(0,y.jsx)(i,{variant:e.badgeVariant,size:`sm`,children:e.badge})]}),n(0,y.jsxs)(`div`,{className:`space-y-0.5 animate-fade-in`,children:[(0,y.jsxs)(`div`,{className:`flex items-center justify-between text-[10px]`,children:[(0,y.jsxs)(`span`,{className:`text-krona-gold font-bold`,children:[`[ШАГ `,e.stepNumber,`] `,e.nodeTitle]}),(0,y.jsxs)(`span`,{className:`text-zinc-400`,children:[e.latencyMs,` ms`]})]}),(0,y.jsx)(`div`,{className:`text-zinc-300 pl-2 border-l border-zinc-700`,children:e.output}),(0,y.jsxs)(`div`,{className:`text-[10px] pl-2 font-bold`,children:[e.status===`success`&&(0,y.jsxs)(`span`,{className:`text-emerald-400 flex items-center gap-1`,children:[(0,y.jsx)(d,{className:`w-3 h-3`}),` УСПЕШНО`]}),e.status===`running`&&(0,y.jsxs)(`span`,{className:`text-amber-400 flex items-center gap-1`,children:[(0,y.jsx)(c,{className:`w-3 h-3 animate-spin`}),` ВЫПОЛНЕНИЕ...`]})]})]},e.stepNumber)),T&&(0,y.jsx)(`div`,{className:`pt-2 border-t border-zinc-800 text-emerald-400 font-bold text-center`,children:`✓ ВСЕ ШАГИ ВЫПОЛНЕНЫ УСПЕШНО (ИТОГО: 384 ms)`})]})]}),(0,y.jsxs)(`div`,{className:`p-2.5 bg-krona-workspace rounded-lg border border-krona-border text-[11px] text-krona-secondary flex items-center gap-2`,children:[(0,y.jsx)(u,{className:`w-4 h-4 text-krona-green shrink-0`}),(0,y.jsx)(`span`,{children:`Логи тестового запуска записываются в журнал аудита безопасности.`})]})]})]}),D&&(0,y.jsx)(m,{isOpen:D,onClose:()=>O(!1),title:`Добавить узел автоматизации`,subtitle:`Выбор типа операции в цепочке`,maxWidth:`sm`,footer:(0,y.jsxs)(`div`,{className:`flex gap-2 w-full justify-end`,children:[(0,y.jsx)(n,{variant:`secondary`,onClick:()=>O(!1),children:`Отмена`}),(0,y.jsx)(n,{variant:`primary`,onClick:I,children:`Добавить в сценарий`})]}),children:(0,y.jsxs)(`div`,{className:`space-y-3 text-xs`,children:[(0,y.jsxs)(`div`,{className:`space-y-1`,children:[(0,y.jsx)(`label`,{className:`font-semibold text-krona-primary`,children:`Тип узла:`}),(0,y.jsxs)(`select`,{value:k,onChange:e=>A(e.target.value),className:`w-full p-2 bg-krona-workspace border border-krona-border rounded-lg text-krona-primary focus:outline-none focus:border-krona-green`,children:[(0,y.jsx)(`option`,{value:`action`,children:`Действие (Action)`}),(0,y.jsx)(`option`,{value:`condition`,children:`Условие (Condition)`}),(0,y.jsx)(`option`,{value:`ai`,children:`ИИ-агент (Krona AI)`}),(0,y.jsx)(`option`,{value:`trigger`,children:`Триггер (Trigger)`})]})]}),(0,y.jsxs)(`div`,{className:`space-y-1`,children:[(0,y.jsx)(`label`,{className:`font-semibold text-krona-primary`,children:`Название шага:`}),(0,y.jsx)(`input`,{type:`text`,value:j,onChange:e=>M(e.target.value),placeholder:`Например: Отправить уведомление в Telegram администратору`,className:`w-full p-2 bg-krona-workspace border border-krona-border rounded-lg text-krona-primary focus:outline-none focus:border-krona-green`})]}),(0,y.jsxs)(`div`,{className:`space-y-1`,children:[(0,y.jsx)(`label`,{className:`font-semibold text-krona-primary`,children:`Описание / Логика:`}),(0,y.jsx)(`textarea`,{rows:2,value:N,onChange:e=>P(e.target.value),placeholder:`Укажите условия или параметры вызова...`,className:`w-full p-2 bg-krona-workspace border border-krona-border rounded-lg text-krona-primary focus:outline-none focus:border-krona-green resize-none`})]})]})})]})};export{x as AutomationModule}; \ No newline at end of file diff --git a/dist/assets/CardLayoutBuilder-CM6emXoY.js b/dist/assets/CardLayoutBuilder-CM6emXoY.js deleted file mode 100644 index a180b2c..0000000 --- a/dist/assets/CardLayoutBuilder-CM6emXoY.js +++ /dev/null @@ -1 +0,0 @@ -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}; \ No newline at end of file diff --git a/dist/assets/CardLayoutBuilder-CiBozXyO.js b/dist/assets/CardLayoutBuilder-CiBozXyO.js new file mode 100644 index 0000000..ea79de6 --- /dev/null +++ b/dist/assets/CardLayoutBuilder-CiBozXyO.js @@ -0,0 +1 @@ +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{$ as h,B as g,M as _,R as v,T as y,a as b,et as x,ht as S,lt as C,mt as w,n as T,nt as E,p as D}from"./index-CrJKtV0u.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:x,fields_grid:_,timeline:g,tasks_notes:D,related_lists:l,attachments:A},F=()=>{let{entityCode:e}=S(),t=w(),{currentEntity:r,layouts:a,saveLayout:l}=E(e),{showToast:m}=o(),[x,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:x};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)(h,{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)(v,{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:x.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:[`Обновлено: `,C(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)(g,{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:C(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:C(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)(D,{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)(y,{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:x.filter(e=>e.enabled).length}),` из`,` `,x.length]})]}),(0,M.jsx)(`div`,{className:`space-y-2`,children:x.map((e,t)=>{let r=P[e.type]||_;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===x.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)(T,{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)(b,{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}; \ No newline at end of file diff --git a/dist/assets/CmsModule-qZLJpvR4.js b/dist/assets/CmsModule-DuJnf1QM.js similarity index 96% rename from dist/assets/CmsModule-qZLJpvR4.js rename to dist/assets/CmsModule-DuJnf1QM.js index 581beae..bbeb4d6 100644 --- a/dist/assets/CmsModule-qZLJpvR4.js +++ b/dist/assets/CmsModule-DuJnf1QM.js @@ -1 +1 @@ -import{f as e,h as t,i as n,l as r,r as i,s as a,t as o,u as s}from"./useToast-CS8pZhce.js";import{t as c}from"./arrow-down-CWbiHuZO.js";import{t as l}from"./arrow-up-B4Ca-HNG.js";import{t as u}from"./image-B_RO1I7c.js";import{t as d}from"./settings-2-CSojebrG.js";import{D as f,I as p,P as m,d as h,dt as g,ft as _,j as v,m as y,t as b,u as x,w as S}from"./index-CNnq9VO5.js";var C={name:`pen-line`,size:24,node:[[`path`,{d:`M13 21h8`,key:`1jsn5i`}],[`path`,{d:`M21.174 6.812a1 1 0 0 0-3.986-3.987L3.842 16.174a2 2 0 0 0-.5.83l-1.321 4.352a.5.5 0 0 0 .623.622l4.353-1.32a2 2 0 0 0 .83-.497z`,key:`1a8usu`}]],aliases:[`edit-3`]};C.node;var w=r(C),T=t(e(),1),E=a(),D=[{id:`w-hero`,type:`hero`,title:`Свежие роллы и паназиатская кухня в Новосибирске`,subtitle:`Доставка за 35 минут или ролл в подарок при следующем заказе`,ctaText:`Заказать онлайн со скидкой 20%`,badge:`Спецпредложение осени`},{id:`w-features`,type:`features`,title:`Почему выбирают Суши & Гёдза`,subtitle:`Только охлажденный лосось с Фарерских островов и авторские рецепты шефа`,badge:`Качество`},{id:`w-pricing`,type:`pricing`,title:`Популярные сеты для компаний`,subtitle:`Выгодные комбо-наборы со скидкой до 30%`,ctaText:`Выбрать сет`,badge:`Хиты продаж`},{id:`w-testimonials`,type:`testimonials`,title:`Отзывы наших постоянных гостей`,subtitle:`Более 4 800 довольных клиентов на Flamp и 2ГИС`,badge:`Рейтинг 4.9`},{id:`w-form`,type:`form`,title:`Забронируйте столик на вечер`,subtitle:`Мы подготовим стол и подарим фирменный десерт Моти`,ctaText:`Подтвердить бронь`,badge:`Быстрая бронь`},{id:`w-cta`,type:`cta`,title:`Установите приложение или оформите в Telegram`,subtitle:`Получите 500 приветственных бонусов на первый заказ`,ctaText:`Открыть Telegram-бот`,badge:`Мобильный бонус`}],O=[{id:`p1`,title:`Главная страница доставки`,slug:`/`,viewsToday:1420,status:`published`,lastEdited:`Вчера, 18:40`},{id:`p2`,title:`Меню & Корзина онлайн`,slug:`/menu`,viewsToday:3890,status:`published`,lastEdited:`08.09.2026`},{id:`p3`,title:`Акции и Сеты сентября`,slug:`/promo-autumn`,viewsToday:840,status:`published`,lastEdited:`09.09.2026`},{id:`p4`,title:`Бронирование столов / запись`,slug:`/booking`,viewsToday:410,status:`published`,lastEdited:`05.09.2026`},{id:`p5`,title:`Контакты и точки в городе`,slug:`/contacts`,viewsToday:230,status:`published`,lastEdited:`01.09.2026`}],k=()=>{let e=g(),t=_(),{showToast:r}=o(),[a]=(0,T.useState)(O),[C,k]=(0,T.useState)(`pages`),[A,j]=(0,T.useState)(D),[M,N]=(0,T.useState)(D[0].id),[P,F]=(0,T.useState)(`desktop`),[I,L]=(0,T.useState)(`Суши & Гёдза — Доставка роллов и паназиатской кухни в Новосибирске`),[R,z]=(0,T.useState)(`Свежие суши, роллы, воки и супы с быстрой доставкой за 35 минут. Заказывайте любимые сеты онлайн со скидкой 20%!`),B=(0,T.useMemo)(()=>{let t=e.pathname;return t.includes(`/cms/forms`)?`forms`:t.includes(`/cms/media`)?`media`:t.includes(`/cms/seo`)?`seo`:t.includes(`/cms/domains`)?`domains`:t.includes(`/cms/builder`)?`builder`:t.includes(`/cms/pages`)?`pages`:C},[e.pathname,C]),V=k,H=A.find(e=>e.id===M)||A[0],U=e=>{let t={hero:{title:`Новый промо-баннер`,subtitle:`Описание специального предложения`,cta:`Подробнее`,badge:`Промо`},features:{title:`Наши преимущества`,subtitle:`Ключевые особенности нашего сервиса`,cta:``,badge:`Сервис`},pricing:{title:`Тарифы и меню`,subtitle:`Выберите подходящую опцию`,cta:`Заказать`,badge:`Цены`},testimonials:{title:`Отзывы гостей`,subtitle:`Что говорят наши посетители`,cta:``,badge:`Отзывы`},form:{title:`Форма обратной связи`,subtitle:`Оставьте заявку и мы свяжемся с вами`,cta:`Отправить заявку`,badge:`Заявка`},cta:{title:`Присоединяйтесь к нам!`,subtitle:`Специальный бонус при первом визите`,cta:`Получить бонус`,badge:`Бонус`}}[e],n={id:`w-${e}-${s()}`,type:e,title:t.title,subtitle:t.subtitle,ctaText:t.cta||void 0,badge:t.badge};j(e=>[...e,n]),N(n.id),r({title:`Виджет добавлен`,message:`Блок «${t.title}» добавлен на холст`,type:`success`})},W=(e,t)=>{let n=t===`up`?e-1:e+1;if(n<0||n>=A.length)return;let r=[...A],i=r[e];r[e]=r[n],r[n]=i,j(r)},G=e=>{if(A.length<=1){r({title:`Невозможно удалить`,message:`На странице должен оставаться минимум один блок`,type:`warning`});return}let t=A.filter(t=>t.id!==e);j(t),M===e&&N(t[0].id),r({title:`Блок удален`,message:`Виджет удален со страницы`,type:`info`})},K=(e,t)=>{j(n=>n.map(n=>n.id===M?{...n,[e]:t}:n))};return(0,E.jsxs)(`div`,{className:`space-y-4 animate-fade-in`,children:[(0,E.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,E.jsxs)(`div`,{children:[(0,E.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,E.jsx)(`h2`,{className:`text-sm font-bold text-krona-primary`,children:`Сайты & Krona CMS`}),(0,E.jsx)(b,{level:`target`,size:`sm`}),(0,E.jsx)(i,{variant:`gold`,size:`sm`,children:`krona.site/sushi-nsk`})]}),(0,E.jsx)(`p`,{className:`text-xs text-krona-secondary mt-0.5`,children:`Визуальный блочный конструктор посадочных страниц, формы захвата лидов, медиатека и SEO`})]}),(0,E.jsx)(`div`,{className:`flex items-center gap-1.5 overflow-x-auto text-xs`,children:[{id:`pages`,label:`Страницы`,route:`/cms/pages`},{id:`builder`,label:`Конструктор`},{id:`forms`,label:`Формы`,route:`/cms/forms`},{id:`media`,label:`Медиа`,route:`/cms/media`},{id:`seo`,label:`SEO`,route:`/cms/seo`},{id:`domains`,label:`Домены`,route:`/cms/domains`}].map(e=>(0,E.jsx)(`button`,{onClick:()=>{V(e.id),e.route&&t(e.route)},className:`px-3 py-1.5 rounded-md font-medium transition-colors whitespace-nowrap ${B===e.id?`bg-[#2F684C] text-white shadow-sm`:`bg-krona-workspace text-krona-secondary hover:text-krona-primary border border-krona-border`}`,children:e.label},e.id))})]}),B===`pages`&&(0,E.jsx)(`div`,{className:`bg-krona-surface border border-krona-border rounded-xl shadow-krona-soft overflow-hidden`,children:(0,E.jsxs)(`table`,{className:`w-full text-left text-xs border-collapse`,children:[(0,E.jsx)(`thead`,{className:`bg-krona-workspace/80 text-krona-secondary border-b border-krona-border`,children:(0,E.jsxs)(`tr`,{children:[(0,E.jsx)(`th`,{className:`p-3 font-semibold`,children:`Название страницы`}),(0,E.jsx)(`th`,{className:`p-3 font-semibold`,children:`URL / Slug`}),(0,E.jsx)(`th`,{className:`p-3 font-semibold`,children:`Просмотров сегодня`}),(0,E.jsx)(`th`,{className:`p-3 font-semibold`,children:`Дата редакции`}),(0,E.jsx)(`th`,{className:`p-3 font-semibold text-center`,children:`Статус`}),(0,E.jsx)(`th`,{className:`p-3 font-semibold text-right`,children:`Действие`})]})}),(0,E.jsx)(`tbody`,{className:`divide-y divide-krona-border/50`,children:a.map(e=>(0,E.jsxs)(`tr`,{className:`hover:bg-krona-workspace/50 transition-colors`,children:[(0,E.jsxs)(`td`,{className:`p-3 font-medium text-krona-primary flex items-center gap-2`,children:[(0,E.jsx)(m,{className:`w-4 h-4 text-krona-secondary`}),(0,E.jsx)(`span`,{children:e.title})]}),(0,E.jsx)(`td`,{className:`p-3 font-mono text-krona-secondary`,children:e.slug}),(0,E.jsx)(`td`,{className:`p-3 font-bold text-krona-primary`,children:e.viewsToday}),(0,E.jsx)(`td`,{className:`p-3 text-krona-secondary`,children:e.lastEdited}),(0,E.jsx)(`td`,{className:`p-3 text-center`,children:(0,E.jsx)(i,{variant:`green`,size:`sm`,children:`Опубликована`})}),(0,E.jsx)(`td`,{className:`p-3 text-right`,children:(0,E.jsxs)(`button`,{onClick:()=>V(`builder`),className:`text-krona-green font-medium hover:underline inline-flex items-center gap-1`,children:[(0,E.jsx)(w,{className:`w-3.5 h-3.5`}),`Редактор`]})})]},e.id))})]})}),B===`builder`&&(0,E.jsxs)(`div`,{className:`space-y-3`,children:[(0,E.jsxs)(`div`,{className:`flex flex-col sm:flex-row sm:items-center justify-between gap-3 bg-krona-surface p-3 rounded-xl border border-krona-border shadow-krona-soft`,children:[(0,E.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,E.jsx)(`span`,{className:`font-bold text-xs text-krona-primary`,children:`Редактирование: «Главная страница доставки»`}),(0,E.jsx)(i,{variant:`green`,size:`sm`,children:`Auto-save`})]}),(0,E.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,E.jsxs)(`div`,{className:`flex items-center bg-krona-workspace p-1 rounded-lg border border-krona-border text-xs`,children:[(0,E.jsx)(`button`,{onClick:()=>F(`desktop`),className:`p-1.5 rounded transition-colors ${P===`desktop`?`bg-[#2F684C] text-white shadow-sm`:`text-krona-secondary`}`,title:`Desktop (100%)`,children:(0,E.jsx)(f,{className:`w-3.5 h-3.5`})}),(0,E.jsx)(`button`,{onClick:()=>F(`tablet`),className:`p-1.5 rounded transition-colors ${P===`tablet`?`bg-[#2F684C] text-white shadow-sm`:`text-krona-secondary`}`,title:`Tablet (768px)`,children:(0,E.jsx)(h,{className:`w-3.5 h-3.5`})}),(0,E.jsx)(`button`,{onClick:()=>F(`mobile`),className:`p-1.5 rounded transition-colors ${P===`mobile`?`bg-[#2F684C] text-white shadow-sm`:`text-krona-secondary`}`,title:`Mobile (375px)`,children:(0,E.jsx)(y,{className:`w-3.5 h-3.5`})})]}),(0,E.jsxs)(n,{variant:`secondary`,size:`sm`,onClick:()=>{r({title:`Макет сохранен`,message:`JSON-конфигурация (${A.length} виджетов) сохранена в локальное хранилище`,type:`success`})},className:`text-xs`,children:[(0,E.jsx)(p,{className:`w-3.5 h-3.5 mr-1`}),`Сохранить JSON`]}),(0,E.jsx)(n,{variant:`primary`,size:`sm`,onClick:()=>{r({title:`Страница опубликована`,message:`Новая версия сайта успешно развернута на krona.site/sushi-nsk`,type:`success`})},className:`text-xs`,children:`Опубликовать`})]})]}),(0,E.jsxs)(`div`,{className:`grid grid-cols-1 lg:grid-cols-12 gap-3.5`,children:[(0,E.jsxs)(`div`,{className:`lg:col-span-3 bg-krona-surface border border-krona-border rounded-xl p-3 space-y-3 shadow-krona-soft`,children:[(0,E.jsx)(`div`,{className:`flex items-center justify-between pb-2 border-b border-krona-border`,children:(0,E.jsxs)(`span`,{className:`text-xs font-bold text-krona-primary flex items-center gap-1.5`,children:[(0,E.jsx)(v,{className:`w-3.5 h-3.5 text-krona-gold`}),` Палитра виджетов`]})}),(0,E.jsx)(`div`,{className:`space-y-2 text-xs`,children:[{type:`hero`,label:`Hero баннер`,desc:`Главный заголовок с призывом`},{type:`features`,label:`Feature Grid`,desc:`Сетка преимуществ с иконками`},{type:`pricing`,label:`Цены & Меню`,desc:`Карточки сетов и комбо`},{type:`testimonials`,label:`Отзывы гостей`,desc:`Карусель цитат с рейтингом`},{type:`form`,label:`Лид-форма`,desc:`Форма бронирования стола`},{type:`cta`,label:`CTA блок`,desc:`Финальный призыв к заказу`}].map(e=>(0,E.jsxs)(`button`,{onClick:()=>U(e.type),className:`w-full text-left p-2.5 rounded-lg border border-krona-border hover:border-krona-green/70 bg-krona-workspace hover:bg-krona-surface transition-all flex items-center justify-between group`,children:[(0,E.jsxs)(`div`,{children:[(0,E.jsxs)(`div`,{className:`font-semibold text-krona-primary group-hover:text-krona-green transition-colors`,children:[`+ `,e.label]}),(0,E.jsx)(`div`,{className:`text-[10px] text-krona-secondary`,children:e.desc})]}),(0,E.jsx)(S,{className:`w-3.5 h-3.5 text-krona-secondary group-hover:text-krona-green`})]},e.type))})]}),(0,E.jsx)(`div`,{className:`lg:col-span-6 bg-krona-workspace/60 border border-krona-border rounded-xl p-4 flex flex-col items-center overflow-y-auto min-h-[560px] max-h-[750px]`,children:(0,E.jsx)(`div`,{className:`w-full transition-all duration-300 space-y-3 ${P===`mobile`?`max-w-[375px] border-x border-krona-border shadow-md bg-krona-surface p-3 rounded-2xl`:P===`tablet`?`max-w-[640px] border border-krona-border shadow-md bg-krona-surface p-4 rounded-xl`:`max-w-full`}`,children:A.map((e,t)=>{let n=e.id===M;return(0,E.jsxs)(`div`,{onClick:()=>N(e.id),className:`relative p-4 rounded-xl border transition-all cursor-pointer select-none bg-krona-surface shadow-sm ${n?`border-krona-green ring-2 ring-krona-green/30`:`border-krona-border hover:border-krona-border-strong`}`,children:[(0,E.jsxs)(`div`,{className:`flex items-center justify-between pb-2 mb-2 border-b border-krona-border/60`,children:[(0,E.jsxs)(`div`,{className:`flex items-center gap-1.5`,children:[(0,E.jsxs)(`span`,{className:`font-bold text-[10px] uppercase text-krona-secondary`,children:[`#`,t+1,` `,e.type]}),e.badge&&(0,E.jsx)(i,{variant:`gold`,size:`sm`,children:e.badge})]}),(0,E.jsxs)(`div`,{className:`flex items-center gap-1`,onClick:e=>e.stopPropagation(),children:[(0,E.jsx)(`button`,{onClick:()=>W(t,`up`),disabled:t===0,className:`p-1 rounded hover:bg-krona-workspace text-krona-secondary disabled:opacity-30`,title:`Поднять выше`,children:(0,E.jsx)(l,{className:`w-3 h-3`})}),(0,E.jsx)(`button`,{onClick:()=>W(t,`down`),disabled:t===A.length-1,className:`p-1 rounded hover:bg-krona-workspace text-krona-secondary disabled:opacity-30`,title:`Опустить ниже`,children:(0,E.jsx)(c,{className:`w-3 h-3`})}),(0,E.jsx)(`button`,{onClick:()=>G(e.id),className:`p-1 rounded hover:bg-rose-500/10 text-krona-secondary hover:text-rose-600`,title:`Удалить блок`,children:(0,E.jsx)(x,{className:`w-3 h-3`})})]})]}),(0,E.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,E.jsx)(`h4`,{className:`font-bold text-xs text-krona-primary leading-snug`,children:e.title}),(0,E.jsx)(`p`,{className:`text-[11px] text-krona-secondary leading-relaxed`,children:e.subtitle}),e.ctaText&&(0,E.jsx)(`div`,{className:`pt-2`,children:(0,E.jsxs)(`span`,{className:`inline-flex items-center px-3 py-1 rounded bg-[#2F684C] text-white text-[10px] font-semibold`,children:[e.ctaText,` →`]})})]})]},e.id)})})}),(0,E.jsxs)(`div`,{className:`lg:col-span-3 bg-krona-surface border border-krona-border rounded-xl p-3.5 space-y-3.5 shadow-krona-soft text-xs`,children:[(0,E.jsxs)(`div`,{className:`flex items-center justify-between pb-2 border-b border-krona-border`,children:[(0,E.jsxs)(`span`,{className:`font-bold text-krona-primary flex items-center gap-1.5`,children:[(0,E.jsx)(d,{className:`w-3.5 h-3.5 text-krona-green`}),` Свойства виджета`]}),(0,E.jsx)(`span`,{className:`text-[10px] uppercase font-mono text-krona-secondary`,children:H.type})]}),(0,E.jsxs)(`div`,{className:`space-y-2.5`,children:[(0,E.jsxs)(`div`,{className:`space-y-1`,children:[(0,E.jsx)(`label`,{className:`text-[10px] font-semibold text-krona-secondary block`,children:`Заголовок блока:`}),(0,E.jsx)(`input`,{type:`text`,value:H.title,onChange:e=>K(`title`,e.target.value),className:`w-full p-2 bg-krona-workspace border border-krona-border rounded-lg text-xs text-krona-primary focus:outline-none focus:border-krona-green`})]}),(0,E.jsxs)(`div`,{className:`space-y-1`,children:[(0,E.jsx)(`label`,{className:`text-[10px] font-semibold text-krona-secondary block`,children:`Подзаголовок / Текст:`}),(0,E.jsx)(`textarea`,{rows:3,value:H.subtitle,onChange:e=>K(`subtitle`,e.target.value),className:`w-full p-2 bg-krona-workspace border border-krona-border rounded-lg text-xs text-krona-primary focus:outline-none focus:border-krona-green resize-none`})]}),(0,E.jsxs)(`div`,{className:`space-y-1`,children:[(0,E.jsx)(`label`,{className:`text-[10px] font-semibold text-krona-secondary block`,children:`Текст кнопки действия (CTA):`}),(0,E.jsx)(`input`,{type:`text`,value:H.ctaText||``,onChange:e=>K(`ctaText`,e.target.value),placeholder:`Например: Заказать онлайн`,className:`w-full p-2 bg-krona-workspace border border-krona-border rounded-lg text-xs text-krona-primary focus:outline-none focus:border-krona-green`})]}),(0,E.jsxs)(`div`,{className:`space-y-1`,children:[(0,E.jsx)(`label`,{className:`text-[10px] font-semibold text-krona-secondary block`,children:`Бейдж / Тег:`}),(0,E.jsx)(`input`,{type:`text`,value:H.badge||``,onChange:e=>K(`badge`,e.target.value),placeholder:`Например: Акция недели`,className:`w-full p-2 bg-krona-workspace border border-krona-border rounded-lg text-xs text-krona-primary focus:outline-none focus:border-krona-green`})]})]})]})]})]}),B===`forms`&&(0,E.jsxs)(`div`,{className:`bg-krona-surface border border-krona-border rounded-xl p-4 shadow-krona-soft space-y-4`,children:[(0,E.jsxs)(`div`,{className:`flex items-center justify-between pb-2 border-b border-krona-border`,children:[(0,E.jsxs)(`div`,{children:[(0,E.jsx)(`h4`,{className:`text-xs font-bold text-krona-primary`,children:`Лид-формы и виджеты захвата заявок`}),(0,E.jsx)(`p`,{className:`text-[11px] text-krona-secondary`,children:`Формы автоматически создают лиды и сделки в CRM`})]}),(0,E.jsxs)(n,{variant:`primary`,size:`sm`,children:[(0,E.jsx)(S,{className:`w-3.5 h-3.5 mr-1`}),`Новая форма`]})]}),(0,E.jsxs)(`div`,{className:`grid grid-cols-1 md:grid-cols-2 gap-3.5 text-xs`,children:[(0,E.jsxs)(`div`,{className:`p-3.5 rounded-xl border border-krona-border bg-krona-workspace space-y-2`,children:[(0,E.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,E.jsx)(`span`,{className:`font-bold text-krona-primary text-sm`,children:`Форма быстрой брони столика`}),(0,E.jsx)(i,{variant:`green`,size:`sm`,children:`Активна`})]}),(0,E.jsx)(`p`,{className:`text-krona-secondary text-[11px]`,children:`Поля: Имя, Телефон, Дата/Время, Персоны, Пожелания`}),(0,E.jsxs)(`div`,{className:`flex justify-between pt-2 border-t border-krona-border/60 text-[11px]`,children:[(0,E.jsx)(`span`,{children:`Конверсия: 24.8%`}),(0,E.jsx)(`span`,{className:`font-semibold text-krona-green`,children:`148 заявок`})]})]}),(0,E.jsxs)(`div`,{className:`p-3.5 rounded-xl border border-krona-border bg-krona-workspace space-y-2`,children:[(0,E.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,E.jsx)(`span`,{className:`font-bold text-krona-primary text-sm`,children:`Виджет подписки на скидку 20%`}),(0,E.jsx)(i,{variant:`green`,size:`sm`,children:`Всплывающее окно`})]}),(0,E.jsx)(`p`,{className:`text-krona-secondary text-[11px]`,children:`Поля: Номер телефона (с отправкой промокода в SMS/Telegram)`}),(0,E.jsxs)(`div`,{className:`flex justify-between pt-2 border-t border-krona-border/60 text-[11px]`,children:[(0,E.jsx)(`span`,{children:`Конверсия: 14.2%`}),(0,E.jsx)(`span`,{className:`font-semibold text-krona-green`,children:`312 лидов`})]})]})]})]}),B===`media`&&(0,E.jsxs)(`div`,{className:`bg-krona-surface border border-krona-border rounded-xl p-4 shadow-krona-soft space-y-4`,children:[(0,E.jsxs)(`div`,{className:`flex items-center justify-between pb-2 border-b border-krona-border`,children:[(0,E.jsxs)(`div`,{children:[(0,E.jsx)(`h4`,{className:`text-xs font-bold text-krona-primary`,children:`Медиабиблиотека сайта`}),(0,E.jsx)(`p`,{className:`text-[11px] text-krona-secondary`,children:`Фотографии блюд, баннеры акций, логотипы и видеоматериалы`})]}),(0,E.jsxs)(n,{variant:`primary`,size:`sm`,children:[(0,E.jsx)(S,{className:`w-3.5 h-3.5 mr-1`}),`Загрузить файл`]})]}),(0,E.jsx)(`div`,{className:`grid grid-cols-2 sm:grid-cols-4 gap-3`,children:[{name:`philadelphia_banner.jpg`,size:`1.2 MB`,category:`Баннеры`},{name:`tom_yam_dish.png`,size:`840 KB`,category:`Каталог`},{name:`autumn_set_promo.jpg`,size:`2.1 MB`,category:`Акции`},{name:`krona_hall_interior.jpg`,size:`3.4 MB`,category:`Интерьер`}].map((e,t)=>(0,E.jsxs)(`div`,{className:`p-3 rounded-xl border border-krona-border bg-krona-workspace space-y-2 text-xs`,children:[(0,E.jsx)(`div`,{className:`h-28 rounded-lg bg-krona-surface border border-krona-border flex items-center justify-center text-krona-secondary`,children:(0,E.jsx)(u,{className:`w-8 h-8 opacity-40`})}),(0,E.jsx)(`div`,{className:`font-semibold text-krona-primary truncate`,children:e.name}),(0,E.jsxs)(`div`,{className:`flex justify-between text-[10px] text-krona-secondary`,children:[(0,E.jsx)(`span`,{children:e.category}),(0,E.jsx)(`span`,{children:e.size})]})]},t))})]}),B===`seo`&&(0,E.jsxs)(`div`,{className:`bg-krona-surface border border-krona-border rounded-xl p-4 shadow-krona-soft space-y-4`,children:[(0,E.jsxs)(`div`,{className:`pb-2 border-b border-krona-border`,children:[(0,E.jsx)(`h4`,{className:`text-xs font-bold text-krona-primary`,children:`Поисковая оптимизация (SEO)`}),(0,E.jsx)(`p`,{className:`text-[11px] text-krona-secondary`,children:`Мета-теги, OpenGraph и сниппет поисковой выдачи Яндекс и Google`})]}),(0,E.jsxs)(`div`,{className:`space-y-3 max-w-xl text-xs`,children:[(0,E.jsxs)(`div`,{className:`space-y-1`,children:[(0,E.jsx)(`label`,{className:`font-semibold text-krona-primary`,children:`Meta Title (Заголовок в поисковике):`}),(0,E.jsx)(`input`,{type:`text`,value:I,onChange:e=>L(e.target.value),className:`w-full p-2 bg-krona-workspace border border-krona-border rounded-lg text-xs text-krona-primary focus:outline-none focus:border-krona-green`})]}),(0,E.jsxs)(`div`,{className:`space-y-1`,children:[(0,E.jsx)(`label`,{className:`font-semibold text-krona-primary`,children:`Meta Description (Описание):`}),(0,E.jsx)(`textarea`,{rows:3,value:R,onChange:e=>z(e.target.value),className:`w-full p-2 bg-krona-workspace border border-krona-border rounded-lg text-xs text-krona-primary focus:outline-none focus:border-krona-green resize-none`})]}),(0,E.jsxs)(`div`,{className:`p-3 bg-krona-workspace rounded-xl border border-krona-border space-y-1`,children:[(0,E.jsx)(`span`,{className:`text-[10px] uppercase text-krona-secondary font-bold`,children:`Превью в Яндекс:`}),(0,E.jsx)(`div`,{className:`text-blue-600 text-sm font-semibold hover:underline cursor-pointer`,children:I}),(0,E.jsx)(`div`,{className:`text-emerald-700 text-xs`,children:`krona.site/sushi-nsk`}),(0,E.jsx)(`p`,{className:`text-xs text-krona-secondary`,children:R})]}),(0,E.jsx)(n,{variant:`primary`,size:`sm`,onClick:()=>{r({title:`SEO мета-теги сохранены`,message:`Настройки поисковой оптимизации применены к сайту`,type:`success`})},children:`Сохранить SEO-настройки`})]})]}),B===`domains`&&(0,E.jsxs)(`div`,{className:`bg-krona-surface border border-krona-border rounded-xl p-4 shadow-krona-soft space-y-4`,children:[(0,E.jsxs)(`div`,{className:`pb-2 border-b border-krona-border`,children:[(0,E.jsx)(`h4`,{className:`text-xs font-bold text-krona-primary`,children:`Подключение доменов & SSL-сертификаты`}),(0,E.jsx)(`p`,{className:`text-[11px] text-krona-secondary`,children:`Привязка собственного домена второго уровня к CMS`})]}),(0,E.jsxs)(`div`,{className:`space-y-3 max-w-xl text-xs`,children:[(0,E.jsxs)(`div`,{className:`p-3.5 bg-krona-workspace rounded-xl border border-krona-border flex items-center justify-between`,children:[(0,E.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,E.jsx)(m,{className:`w-5 h-5 text-krona-green`}),(0,E.jsxs)(`div`,{children:[(0,E.jsx)(`span`,{className:`font-bold text-krona-primary block`,children:`sushi-nsk.ru`}),(0,E.jsx)(`span`,{className:`text-[10px] text-krona-secondary`,children:`SSL активен • Let's Encrypt Wildcard`})]})]}),(0,E.jsx)(i,{variant:`green`,size:`sm`,children:`Подключен`})]}),(0,E.jsxs)(`div`,{className:`p-3.5 bg-krona-workspace rounded-xl border border-krona-border flex items-center justify-between`,children:[(0,E.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,E.jsx)(m,{className:`w-5 h-5 text-krona-secondary`}),(0,E.jsxs)(`div`,{children:[(0,E.jsx)(`span`,{className:`font-bold text-krona-primary block`,children:`krona.site/sushi-nsk`}),(0,E.jsx)(`span`,{className:`text-[10px] text-krona-secondary`,children:`Системный поддомен платформы`})]})]}),(0,E.jsx)(i,{variant:`neutral`,size:`sm`,children:`Основной`})]})]})]})]})};export{k as CmsModule}; \ No newline at end of file +import{f as e,h as t,i as n,l as r,r as i,s as a,t as o,u as s}from"./useToast-CS8pZhce.js";import{t as c}from"./arrow-down-CWbiHuZO.js";import{t as l}from"./arrow-up-B4Ca-HNG.js";import{t as u}from"./image-B_RO1I7c.js";import{t as d}from"./settings-2-CSojebrG.js";import{F as f,L as p,M as m,O as h,T as g,f as _,h as v,mt as y,pt as b,t as x,u as S}from"./index-CrJKtV0u.js";var C={name:`pen-line`,size:24,node:[[`path`,{d:`M13 21h8`,key:`1jsn5i`}],[`path`,{d:`M21.174 6.812a1 1 0 0 0-3.986-3.987L3.842 16.174a2 2 0 0 0-.5.83l-1.321 4.352a.5.5 0 0 0 .623.622l4.353-1.32a2 2 0 0 0 .83-.497z`,key:`1a8usu`}]],aliases:[`edit-3`]};C.node;var w=r(C),T=t(e(),1),E=a(),D=[{id:`w-hero`,type:`hero`,title:`Свежие роллы и паназиатская кухня в Новосибирске`,subtitle:`Доставка за 35 минут или ролл в подарок при следующем заказе`,ctaText:`Заказать онлайн со скидкой 20%`,badge:`Спецпредложение осени`},{id:`w-features`,type:`features`,title:`Почему выбирают Суши & Гёдза`,subtitle:`Только охлажденный лосось с Фарерских островов и авторские рецепты шефа`,badge:`Качество`},{id:`w-pricing`,type:`pricing`,title:`Популярные сеты для компаний`,subtitle:`Выгодные комбо-наборы со скидкой до 30%`,ctaText:`Выбрать сет`,badge:`Хиты продаж`},{id:`w-testimonials`,type:`testimonials`,title:`Отзывы наших постоянных гостей`,subtitle:`Более 4 800 довольных клиентов на Flamp и 2ГИС`,badge:`Рейтинг 4.9`},{id:`w-form`,type:`form`,title:`Забронируйте столик на вечер`,subtitle:`Мы подготовим стол и подарим фирменный десерт Моти`,ctaText:`Подтвердить бронь`,badge:`Быстрая бронь`},{id:`w-cta`,type:`cta`,title:`Установите приложение или оформите в Telegram`,subtitle:`Получите 500 приветственных бонусов на первый заказ`,ctaText:`Открыть Telegram-бот`,badge:`Мобильный бонус`}],O=[{id:`p1`,title:`Главная страница доставки`,slug:`/`,viewsToday:1420,status:`published`,lastEdited:`Вчера, 18:40`},{id:`p2`,title:`Меню & Корзина онлайн`,slug:`/menu`,viewsToday:3890,status:`published`,lastEdited:`08.09.2026`},{id:`p3`,title:`Акции и Сеты сентября`,slug:`/promo-autumn`,viewsToday:840,status:`published`,lastEdited:`09.09.2026`},{id:`p4`,title:`Бронирование столов / запись`,slug:`/booking`,viewsToday:410,status:`published`,lastEdited:`05.09.2026`},{id:`p5`,title:`Контакты и точки в городе`,slug:`/contacts`,viewsToday:230,status:`published`,lastEdited:`01.09.2026`}],k=()=>{let e=b(),t=y(),{showToast:r}=o(),[a]=(0,T.useState)(O),[C,k]=(0,T.useState)(`pages`),[A,j]=(0,T.useState)(D),[M,N]=(0,T.useState)(D[0].id),[P,F]=(0,T.useState)(`desktop`),[I,L]=(0,T.useState)(`Суши & Гёдза — Доставка роллов и паназиатской кухни в Новосибирске`),[R,z]=(0,T.useState)(`Свежие суши, роллы, воки и супы с быстрой доставкой за 35 минут. Заказывайте любимые сеты онлайн со скидкой 20%!`),B=(0,T.useMemo)(()=>{let t=e.pathname;return t.includes(`/cms/forms`)?`forms`:t.includes(`/cms/media`)?`media`:t.includes(`/cms/seo`)?`seo`:t.includes(`/cms/domains`)?`domains`:t.includes(`/cms/builder`)?`builder`:t.includes(`/cms/pages`)?`pages`:C},[e.pathname,C]),V=k,H=A.find(e=>e.id===M)||A[0],U=e=>{let t={hero:{title:`Новый промо-баннер`,subtitle:`Описание специального предложения`,cta:`Подробнее`,badge:`Промо`},features:{title:`Наши преимущества`,subtitle:`Ключевые особенности нашего сервиса`,cta:``,badge:`Сервис`},pricing:{title:`Тарифы и меню`,subtitle:`Выберите подходящую опцию`,cta:`Заказать`,badge:`Цены`},testimonials:{title:`Отзывы гостей`,subtitle:`Что говорят наши посетители`,cta:``,badge:`Отзывы`},form:{title:`Форма обратной связи`,subtitle:`Оставьте заявку и мы свяжемся с вами`,cta:`Отправить заявку`,badge:`Заявка`},cta:{title:`Присоединяйтесь к нам!`,subtitle:`Специальный бонус при первом визите`,cta:`Получить бонус`,badge:`Бонус`}}[e],n={id:`w-${e}-${s()}`,type:e,title:t.title,subtitle:t.subtitle,ctaText:t.cta||void 0,badge:t.badge};j(e=>[...e,n]),N(n.id),r({title:`Виджет добавлен`,message:`Блок «${t.title}» добавлен на холст`,type:`success`})},W=(e,t)=>{let n=t===`up`?e-1:e+1;if(n<0||n>=A.length)return;let r=[...A],i=r[e];r[e]=r[n],r[n]=i,j(r)},G=e=>{if(A.length<=1){r({title:`Невозможно удалить`,message:`На странице должен оставаться минимум один блок`,type:`warning`});return}let t=A.filter(t=>t.id!==e);j(t),M===e&&N(t[0].id),r({title:`Блок удален`,message:`Виджет удален со страницы`,type:`info`})},K=(e,t)=>{j(n=>n.map(n=>n.id===M?{...n,[e]:t}:n))};return(0,E.jsxs)(`div`,{className:`space-y-4 animate-fade-in`,children:[(0,E.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,E.jsxs)(`div`,{children:[(0,E.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,E.jsx)(`h2`,{className:`text-sm font-bold text-krona-primary`,children:`Сайты & Krona CMS`}),(0,E.jsx)(x,{level:`target`,size:`sm`}),(0,E.jsx)(i,{variant:`gold`,size:`sm`,children:`krona.site/sushi-nsk`})]}),(0,E.jsx)(`p`,{className:`text-xs text-krona-secondary mt-0.5`,children:`Визуальный блочный конструктор посадочных страниц, формы захвата лидов, медиатека и SEO`})]}),(0,E.jsx)(`div`,{className:`flex items-center gap-1.5 overflow-x-auto text-xs`,children:[{id:`pages`,label:`Страницы`,route:`/cms/pages`},{id:`builder`,label:`Конструктор`},{id:`forms`,label:`Формы`,route:`/cms/forms`},{id:`media`,label:`Медиа`,route:`/cms/media`},{id:`seo`,label:`SEO`,route:`/cms/seo`},{id:`domains`,label:`Домены`,route:`/cms/domains`}].map(e=>(0,E.jsx)(`button`,{onClick:()=>{V(e.id),e.route&&t(e.route)},className:`px-3 py-1.5 rounded-md font-medium transition-colors whitespace-nowrap ${B===e.id?`bg-[#2F684C] text-white shadow-sm`:`bg-krona-workspace text-krona-secondary hover:text-krona-primary border border-krona-border`}`,children:e.label},e.id))})]}),B===`pages`&&(0,E.jsx)(`div`,{className:`bg-krona-surface border border-krona-border rounded-xl shadow-krona-soft overflow-hidden`,children:(0,E.jsxs)(`table`,{className:`w-full text-left text-xs border-collapse`,children:[(0,E.jsx)(`thead`,{className:`bg-krona-workspace/80 text-krona-secondary border-b border-krona-border`,children:(0,E.jsxs)(`tr`,{children:[(0,E.jsx)(`th`,{className:`p-3 font-semibold`,children:`Название страницы`}),(0,E.jsx)(`th`,{className:`p-3 font-semibold`,children:`URL / Slug`}),(0,E.jsx)(`th`,{className:`p-3 font-semibold`,children:`Просмотров сегодня`}),(0,E.jsx)(`th`,{className:`p-3 font-semibold`,children:`Дата редакции`}),(0,E.jsx)(`th`,{className:`p-3 font-semibold text-center`,children:`Статус`}),(0,E.jsx)(`th`,{className:`p-3 font-semibold text-right`,children:`Действие`})]})}),(0,E.jsx)(`tbody`,{className:`divide-y divide-krona-border/50`,children:a.map(e=>(0,E.jsxs)(`tr`,{className:`hover:bg-krona-workspace/50 transition-colors`,children:[(0,E.jsxs)(`td`,{className:`p-3 font-medium text-krona-primary flex items-center gap-2`,children:[(0,E.jsx)(f,{className:`w-4 h-4 text-krona-secondary`}),(0,E.jsx)(`span`,{children:e.title})]}),(0,E.jsx)(`td`,{className:`p-3 font-mono text-krona-secondary`,children:e.slug}),(0,E.jsx)(`td`,{className:`p-3 font-bold text-krona-primary`,children:e.viewsToday}),(0,E.jsx)(`td`,{className:`p-3 text-krona-secondary`,children:e.lastEdited}),(0,E.jsx)(`td`,{className:`p-3 text-center`,children:(0,E.jsx)(i,{variant:`green`,size:`sm`,children:`Опубликована`})}),(0,E.jsx)(`td`,{className:`p-3 text-right`,children:(0,E.jsxs)(`button`,{onClick:()=>V(`builder`),className:`text-krona-green font-medium hover:underline inline-flex items-center gap-1`,children:[(0,E.jsx)(w,{className:`w-3.5 h-3.5`}),`Редактор`]})})]},e.id))})]})}),B===`builder`&&(0,E.jsxs)(`div`,{className:`space-y-3`,children:[(0,E.jsxs)(`div`,{className:`flex flex-col sm:flex-row sm:items-center justify-between gap-3 bg-krona-surface p-3 rounded-xl border border-krona-border shadow-krona-soft`,children:[(0,E.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,E.jsx)(`span`,{className:`font-bold text-xs text-krona-primary`,children:`Редактирование: «Главная страница доставки»`}),(0,E.jsx)(i,{variant:`green`,size:`sm`,children:`Auto-save`})]}),(0,E.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,E.jsxs)(`div`,{className:`flex items-center bg-krona-workspace p-1 rounded-lg border border-krona-border text-xs`,children:[(0,E.jsx)(`button`,{onClick:()=>F(`desktop`),className:`p-1.5 rounded transition-colors ${P===`desktop`?`bg-[#2F684C] text-white shadow-sm`:`text-krona-secondary`}`,title:`Desktop (100%)`,children:(0,E.jsx)(h,{className:`w-3.5 h-3.5`})}),(0,E.jsx)(`button`,{onClick:()=>F(`tablet`),className:`p-1.5 rounded transition-colors ${P===`tablet`?`bg-[#2F684C] text-white shadow-sm`:`text-krona-secondary`}`,title:`Tablet (768px)`,children:(0,E.jsx)(_,{className:`w-3.5 h-3.5`})}),(0,E.jsx)(`button`,{onClick:()=>F(`mobile`),className:`p-1.5 rounded transition-colors ${P===`mobile`?`bg-[#2F684C] text-white shadow-sm`:`text-krona-secondary`}`,title:`Mobile (375px)`,children:(0,E.jsx)(v,{className:`w-3.5 h-3.5`})})]}),(0,E.jsxs)(n,{variant:`secondary`,size:`sm`,onClick:()=>{r({title:`Макет сохранен`,message:`JSON-конфигурация (${A.length} виджетов) сохранена в локальное хранилище`,type:`success`})},className:`text-xs`,children:[(0,E.jsx)(p,{className:`w-3.5 h-3.5 mr-1`}),`Сохранить JSON`]}),(0,E.jsx)(n,{variant:`primary`,size:`sm`,onClick:()=>{r({title:`Страница опубликована`,message:`Новая версия сайта успешно развернута на krona.site/sushi-nsk`,type:`success`})},className:`text-xs`,children:`Опубликовать`})]})]}),(0,E.jsxs)(`div`,{className:`grid grid-cols-1 lg:grid-cols-12 gap-3.5`,children:[(0,E.jsxs)(`div`,{className:`lg:col-span-3 bg-krona-surface border border-krona-border rounded-xl p-3 space-y-3 shadow-krona-soft`,children:[(0,E.jsx)(`div`,{className:`flex items-center justify-between pb-2 border-b border-krona-border`,children:(0,E.jsxs)(`span`,{className:`text-xs font-bold text-krona-primary flex items-center gap-1.5`,children:[(0,E.jsx)(m,{className:`w-3.5 h-3.5 text-krona-gold`}),` Палитра виджетов`]})}),(0,E.jsx)(`div`,{className:`space-y-2 text-xs`,children:[{type:`hero`,label:`Hero баннер`,desc:`Главный заголовок с призывом`},{type:`features`,label:`Feature Grid`,desc:`Сетка преимуществ с иконками`},{type:`pricing`,label:`Цены & Меню`,desc:`Карточки сетов и комбо`},{type:`testimonials`,label:`Отзывы гостей`,desc:`Карусель цитат с рейтингом`},{type:`form`,label:`Лид-форма`,desc:`Форма бронирования стола`},{type:`cta`,label:`CTA блок`,desc:`Финальный призыв к заказу`}].map(e=>(0,E.jsxs)(`button`,{onClick:()=>U(e.type),className:`w-full text-left p-2.5 rounded-lg border border-krona-border hover:border-krona-green/70 bg-krona-workspace hover:bg-krona-surface transition-all flex items-center justify-between group`,children:[(0,E.jsxs)(`div`,{children:[(0,E.jsxs)(`div`,{className:`font-semibold text-krona-primary group-hover:text-krona-green transition-colors`,children:[`+ `,e.label]}),(0,E.jsx)(`div`,{className:`text-[10px] text-krona-secondary`,children:e.desc})]}),(0,E.jsx)(g,{className:`w-3.5 h-3.5 text-krona-secondary group-hover:text-krona-green`})]},e.type))})]}),(0,E.jsx)(`div`,{className:`lg:col-span-6 bg-krona-workspace/60 border border-krona-border rounded-xl p-4 flex flex-col items-center overflow-y-auto min-h-[560px] max-h-[750px]`,children:(0,E.jsx)(`div`,{className:`w-full transition-all duration-300 space-y-3 ${P===`mobile`?`max-w-[375px] border-x border-krona-border shadow-md bg-krona-surface p-3 rounded-2xl`:P===`tablet`?`max-w-[640px] border border-krona-border shadow-md bg-krona-surface p-4 rounded-xl`:`max-w-full`}`,children:A.map((e,t)=>{let n=e.id===M;return(0,E.jsxs)(`div`,{onClick:()=>N(e.id),className:`relative p-4 rounded-xl border transition-all cursor-pointer select-none bg-krona-surface shadow-sm ${n?`border-krona-green ring-2 ring-krona-green/30`:`border-krona-border hover:border-krona-border-strong`}`,children:[(0,E.jsxs)(`div`,{className:`flex items-center justify-between pb-2 mb-2 border-b border-krona-border/60`,children:[(0,E.jsxs)(`div`,{className:`flex items-center gap-1.5`,children:[(0,E.jsxs)(`span`,{className:`font-bold text-[10px] uppercase text-krona-secondary`,children:[`#`,t+1,` `,e.type]}),e.badge&&(0,E.jsx)(i,{variant:`gold`,size:`sm`,children:e.badge})]}),(0,E.jsxs)(`div`,{className:`flex items-center gap-1`,onClick:e=>e.stopPropagation(),children:[(0,E.jsx)(`button`,{onClick:()=>W(t,`up`),disabled:t===0,className:`p-1 rounded hover:bg-krona-workspace text-krona-secondary disabled:opacity-30`,title:`Поднять выше`,children:(0,E.jsx)(l,{className:`w-3 h-3`})}),(0,E.jsx)(`button`,{onClick:()=>W(t,`down`),disabled:t===A.length-1,className:`p-1 rounded hover:bg-krona-workspace text-krona-secondary disabled:opacity-30`,title:`Опустить ниже`,children:(0,E.jsx)(c,{className:`w-3 h-3`})}),(0,E.jsx)(`button`,{onClick:()=>G(e.id),className:`p-1 rounded hover:bg-rose-500/10 text-krona-secondary hover:text-rose-600`,title:`Удалить блок`,children:(0,E.jsx)(S,{className:`w-3 h-3`})})]})]}),(0,E.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,E.jsx)(`h4`,{className:`font-bold text-xs text-krona-primary leading-snug`,children:e.title}),(0,E.jsx)(`p`,{className:`text-[11px] text-krona-secondary leading-relaxed`,children:e.subtitle}),e.ctaText&&(0,E.jsx)(`div`,{className:`pt-2`,children:(0,E.jsxs)(`span`,{className:`inline-flex items-center px-3 py-1 rounded bg-[#2F684C] text-white text-[10px] font-semibold`,children:[e.ctaText,` →`]})})]})]},e.id)})})}),(0,E.jsxs)(`div`,{className:`lg:col-span-3 bg-krona-surface border border-krona-border rounded-xl p-3.5 space-y-3.5 shadow-krona-soft text-xs`,children:[(0,E.jsxs)(`div`,{className:`flex items-center justify-between pb-2 border-b border-krona-border`,children:[(0,E.jsxs)(`span`,{className:`font-bold text-krona-primary flex items-center gap-1.5`,children:[(0,E.jsx)(d,{className:`w-3.5 h-3.5 text-krona-green`}),` Свойства виджета`]}),(0,E.jsx)(`span`,{className:`text-[10px] uppercase font-mono text-krona-secondary`,children:H.type})]}),(0,E.jsxs)(`div`,{className:`space-y-2.5`,children:[(0,E.jsxs)(`div`,{className:`space-y-1`,children:[(0,E.jsx)(`label`,{className:`text-[10px] font-semibold text-krona-secondary block`,children:`Заголовок блока:`}),(0,E.jsx)(`input`,{type:`text`,value:H.title,onChange:e=>K(`title`,e.target.value),className:`w-full p-2 bg-krona-workspace border border-krona-border rounded-lg text-xs text-krona-primary focus:outline-none focus:border-krona-green`})]}),(0,E.jsxs)(`div`,{className:`space-y-1`,children:[(0,E.jsx)(`label`,{className:`text-[10px] font-semibold text-krona-secondary block`,children:`Подзаголовок / Текст:`}),(0,E.jsx)(`textarea`,{rows:3,value:H.subtitle,onChange:e=>K(`subtitle`,e.target.value),className:`w-full p-2 bg-krona-workspace border border-krona-border rounded-lg text-xs text-krona-primary focus:outline-none focus:border-krona-green resize-none`})]}),(0,E.jsxs)(`div`,{className:`space-y-1`,children:[(0,E.jsx)(`label`,{className:`text-[10px] font-semibold text-krona-secondary block`,children:`Текст кнопки действия (CTA):`}),(0,E.jsx)(`input`,{type:`text`,value:H.ctaText||``,onChange:e=>K(`ctaText`,e.target.value),placeholder:`Например: Заказать онлайн`,className:`w-full p-2 bg-krona-workspace border border-krona-border rounded-lg text-xs text-krona-primary focus:outline-none focus:border-krona-green`})]}),(0,E.jsxs)(`div`,{className:`space-y-1`,children:[(0,E.jsx)(`label`,{className:`text-[10px] font-semibold text-krona-secondary block`,children:`Бейдж / Тег:`}),(0,E.jsx)(`input`,{type:`text`,value:H.badge||``,onChange:e=>K(`badge`,e.target.value),placeholder:`Например: Акция недели`,className:`w-full p-2 bg-krona-workspace border border-krona-border rounded-lg text-xs text-krona-primary focus:outline-none focus:border-krona-green`})]})]})]})]})]}),B===`forms`&&(0,E.jsxs)(`div`,{className:`bg-krona-surface border border-krona-border rounded-xl p-4 shadow-krona-soft space-y-4`,children:[(0,E.jsxs)(`div`,{className:`flex items-center justify-between pb-2 border-b border-krona-border`,children:[(0,E.jsxs)(`div`,{children:[(0,E.jsx)(`h4`,{className:`text-xs font-bold text-krona-primary`,children:`Лид-формы и виджеты захвата заявок`}),(0,E.jsx)(`p`,{className:`text-[11px] text-krona-secondary`,children:`Формы автоматически создают лиды и сделки в CRM`})]}),(0,E.jsxs)(n,{variant:`primary`,size:`sm`,children:[(0,E.jsx)(g,{className:`w-3.5 h-3.5 mr-1`}),`Новая форма`]})]}),(0,E.jsxs)(`div`,{className:`grid grid-cols-1 md:grid-cols-2 gap-3.5 text-xs`,children:[(0,E.jsxs)(`div`,{className:`p-3.5 rounded-xl border border-krona-border bg-krona-workspace space-y-2`,children:[(0,E.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,E.jsx)(`span`,{className:`font-bold text-krona-primary text-sm`,children:`Форма быстрой брони столика`}),(0,E.jsx)(i,{variant:`green`,size:`sm`,children:`Активна`})]}),(0,E.jsx)(`p`,{className:`text-krona-secondary text-[11px]`,children:`Поля: Имя, Телефон, Дата/Время, Персоны, Пожелания`}),(0,E.jsxs)(`div`,{className:`flex justify-between pt-2 border-t border-krona-border/60 text-[11px]`,children:[(0,E.jsx)(`span`,{children:`Конверсия: 24.8%`}),(0,E.jsx)(`span`,{className:`font-semibold text-krona-green`,children:`148 заявок`})]})]}),(0,E.jsxs)(`div`,{className:`p-3.5 rounded-xl border border-krona-border bg-krona-workspace space-y-2`,children:[(0,E.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,E.jsx)(`span`,{className:`font-bold text-krona-primary text-sm`,children:`Виджет подписки на скидку 20%`}),(0,E.jsx)(i,{variant:`green`,size:`sm`,children:`Всплывающее окно`})]}),(0,E.jsx)(`p`,{className:`text-krona-secondary text-[11px]`,children:`Поля: Номер телефона (с отправкой промокода в SMS/Telegram)`}),(0,E.jsxs)(`div`,{className:`flex justify-between pt-2 border-t border-krona-border/60 text-[11px]`,children:[(0,E.jsx)(`span`,{children:`Конверсия: 14.2%`}),(0,E.jsx)(`span`,{className:`font-semibold text-krona-green`,children:`312 лидов`})]})]})]})]}),B===`media`&&(0,E.jsxs)(`div`,{className:`bg-krona-surface border border-krona-border rounded-xl p-4 shadow-krona-soft space-y-4`,children:[(0,E.jsxs)(`div`,{className:`flex items-center justify-between pb-2 border-b border-krona-border`,children:[(0,E.jsxs)(`div`,{children:[(0,E.jsx)(`h4`,{className:`text-xs font-bold text-krona-primary`,children:`Медиабиблиотека сайта`}),(0,E.jsx)(`p`,{className:`text-[11px] text-krona-secondary`,children:`Фотографии блюд, баннеры акций, логотипы и видеоматериалы`})]}),(0,E.jsxs)(n,{variant:`primary`,size:`sm`,children:[(0,E.jsx)(g,{className:`w-3.5 h-3.5 mr-1`}),`Загрузить файл`]})]}),(0,E.jsx)(`div`,{className:`grid grid-cols-2 sm:grid-cols-4 gap-3`,children:[{name:`philadelphia_banner.jpg`,size:`1.2 MB`,category:`Баннеры`},{name:`tom_yam_dish.png`,size:`840 KB`,category:`Каталог`},{name:`autumn_set_promo.jpg`,size:`2.1 MB`,category:`Акции`},{name:`krona_hall_interior.jpg`,size:`3.4 MB`,category:`Интерьер`}].map((e,t)=>(0,E.jsxs)(`div`,{className:`p-3 rounded-xl border border-krona-border bg-krona-workspace space-y-2 text-xs`,children:[(0,E.jsx)(`div`,{className:`h-28 rounded-lg bg-krona-surface border border-krona-border flex items-center justify-center text-krona-secondary`,children:(0,E.jsx)(u,{className:`w-8 h-8 opacity-40`})}),(0,E.jsx)(`div`,{className:`font-semibold text-krona-primary truncate`,children:e.name}),(0,E.jsxs)(`div`,{className:`flex justify-between text-[10px] text-krona-secondary`,children:[(0,E.jsx)(`span`,{children:e.category}),(0,E.jsx)(`span`,{children:e.size})]})]},t))})]}),B===`seo`&&(0,E.jsxs)(`div`,{className:`bg-krona-surface border border-krona-border rounded-xl p-4 shadow-krona-soft space-y-4`,children:[(0,E.jsxs)(`div`,{className:`pb-2 border-b border-krona-border`,children:[(0,E.jsx)(`h4`,{className:`text-xs font-bold text-krona-primary`,children:`Поисковая оптимизация (SEO)`}),(0,E.jsx)(`p`,{className:`text-[11px] text-krona-secondary`,children:`Мета-теги, OpenGraph и сниппет поисковой выдачи Яндекс и Google`})]}),(0,E.jsxs)(`div`,{className:`space-y-3 max-w-xl text-xs`,children:[(0,E.jsxs)(`div`,{className:`space-y-1`,children:[(0,E.jsx)(`label`,{className:`font-semibold text-krona-primary`,children:`Meta Title (Заголовок в поисковике):`}),(0,E.jsx)(`input`,{type:`text`,value:I,onChange:e=>L(e.target.value),className:`w-full p-2 bg-krona-workspace border border-krona-border rounded-lg text-xs text-krona-primary focus:outline-none focus:border-krona-green`})]}),(0,E.jsxs)(`div`,{className:`space-y-1`,children:[(0,E.jsx)(`label`,{className:`font-semibold text-krona-primary`,children:`Meta Description (Описание):`}),(0,E.jsx)(`textarea`,{rows:3,value:R,onChange:e=>z(e.target.value),className:`w-full p-2 bg-krona-workspace border border-krona-border rounded-lg text-xs text-krona-primary focus:outline-none focus:border-krona-green resize-none`})]}),(0,E.jsxs)(`div`,{className:`p-3 bg-krona-workspace rounded-xl border border-krona-border space-y-1`,children:[(0,E.jsx)(`span`,{className:`text-[10px] uppercase text-krona-secondary font-bold`,children:`Превью в Яндекс:`}),(0,E.jsx)(`div`,{className:`text-blue-600 text-sm font-semibold hover:underline cursor-pointer`,children:I}),(0,E.jsx)(`div`,{className:`text-emerald-700 text-xs`,children:`krona.site/sushi-nsk`}),(0,E.jsx)(`p`,{className:`text-xs text-krona-secondary`,children:R})]}),(0,E.jsx)(n,{variant:`primary`,size:`sm`,onClick:()=>{r({title:`SEO мета-теги сохранены`,message:`Настройки поисковой оптимизации применены к сайту`,type:`success`})},children:`Сохранить SEO-настройки`})]})]}),B===`domains`&&(0,E.jsxs)(`div`,{className:`bg-krona-surface border border-krona-border rounded-xl p-4 shadow-krona-soft space-y-4`,children:[(0,E.jsxs)(`div`,{className:`pb-2 border-b border-krona-border`,children:[(0,E.jsx)(`h4`,{className:`text-xs font-bold text-krona-primary`,children:`Подключение доменов & SSL-сертификаты`}),(0,E.jsx)(`p`,{className:`text-[11px] text-krona-secondary`,children:`Привязка собственного домена второго уровня к CMS`})]}),(0,E.jsxs)(`div`,{className:`space-y-3 max-w-xl text-xs`,children:[(0,E.jsxs)(`div`,{className:`p-3.5 bg-krona-workspace rounded-xl border border-krona-border flex items-center justify-between`,children:[(0,E.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,E.jsx)(f,{className:`w-5 h-5 text-krona-green`}),(0,E.jsxs)(`div`,{children:[(0,E.jsx)(`span`,{className:`font-bold text-krona-primary block`,children:`sushi-nsk.ru`}),(0,E.jsx)(`span`,{className:`text-[10px] text-krona-secondary`,children:`SSL активен • Let's Encrypt Wildcard`})]})]}),(0,E.jsx)(i,{variant:`green`,size:`sm`,children:`Подключен`})]}),(0,E.jsxs)(`div`,{className:`p-3.5 bg-krona-workspace rounded-xl border border-krona-border flex items-center justify-between`,children:[(0,E.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,E.jsx)(f,{className:`w-5 h-5 text-krona-secondary`}),(0,E.jsxs)(`div`,{children:[(0,E.jsx)(`span`,{className:`font-bold text-krona-primary block`,children:`krona.site/sushi-nsk`}),(0,E.jsx)(`span`,{className:`text-[10px] text-krona-secondary`,children:`Системный поддомен платформы`})]})]}),(0,E.jsx)(i,{variant:`neutral`,size:`sm`,children:`Основной`})]})]})]})]})};export{k as CmsModule}; \ No newline at end of file diff --git a/dist/assets/CommunicationsModule-CVUsOJz5.js b/dist/assets/CommunicationsModule-gCjT_vNw.js similarity index 96% rename from dist/assets/CommunicationsModule-CVUsOJz5.js rename to dist/assets/CommunicationsModule-gCjT_vNw.js index 90d223c..19426d7 100644 --- a/dist/assets/CommunicationsModule-CVUsOJz5.js +++ b/dist/assets/CommunicationsModule-gCjT_vNw.js @@ -1 +1 @@ -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{M as s,p as c,t as l,v as u,y as d}from"./index-CNnq9VO5.js";import{a as f,c as p,i as m,l as h,n as g,o as _,r as v,s as y,t as b,u as x}from"./mockData-DAqQG5te.js";var S={name:`check-check`,size:24,node:[[`path`,{d:`M18 6 7 17l-5-5`,key:`116fxf`}],[`path`,{d:`m22 10-7.5 7.5L13 16`,key:`ke71qq`}]]};S.node;var C=r(S),w=t(e(),1),T=(e=250)=>new Promise(t=>setTimeout(t,e)),E=new class{clients=[...g];deals=[...m];catalog=[...b];inventory=[...y];recipes=[...p];employees=[...f];tickets=[...x];conversations=[...v];finance=[..._];tasks=[...h];async getCustomers(){return await T(200),[...this.clients]}async createCustomer(e){await T(300);let t={...e,id:`cl-${Date.now()}`};return this.clients=[t,...this.clients],t}async getDeals(){return await T(200),[...this.deals]}async updateDealStage(e,t){await T(150),this.deals=this.deals.map(n=>n.id===e?{...n,stage:t}:n)}async getCatalog(){return await T(200),[...this.catalog]}async toggleStopList(e){await T(150);let t=!1;return this.catalog=this.catalog.map(n=>n.id===e?(t=!n.isStopListed,{...n,isStopListed:t}):n),t}async getInventory(){return await T(200),[...this.inventory]}async getRecipes(){return await T(200),[...this.recipes]}async getEmployees(){return await T(200),[...this.employees]}async getTickets(){return await T(200),[...this.tickets]}async getMessages(){return await T(200),[...this.conversations]}async sendMessage(e,t){await T(150),this.conversations=this.conversations.map(n=>n.id===e?{...n,lastMessage:t,time:new Date().toLocaleTimeString(`ru-RU`,{hour:`2-digit`,minute:`2-digit`}),messages:[...n.messages,{id:`msg-${Date.now()}`,sender:`agent`,senderName:`Вы (Оператор)`,text:t,time:new Date().toLocaleTimeString(`ru-RU`,{hour:`2-digit`,minute:`2-digit`})}]}:n)}async getFinance(){return await T(200),[...this.finance]}async addFinanceEntry(e){await T(250);let t={...e,id:`fin-${Date.now()}`};return this.finance=[t,...this.finance],t}async getTasks(){return await T(200),[...this.tasks]}async updateTaskStatus(e,t){await T(150),this.tasks=this.tasks.map(n=>n.id===e?{...n,status:t}:n)}},D=a(),O=()=>{let{showToast:e}=o(),[t,r]=(0,w.useState)(v),[a,f]=(0,w.useState)(v[0].id),[p,m]=(0,w.useState)(``),[h,g]=(0,w.useState)(`all`),[_,y]=(0,w.useState)(!1),[b,x]=(0,w.useState)(!0),S=t.find(e=>e.id===a)||t[0],T=async n=>{if(n.preventDefault(),!p.trim())return;let i=p;m(``),await E.sendMessage(a,i);let o=await E.getMessages();r(o),y(!0),setTimeout(async()=>{y(!1);let n=[`Спасибо за быстрый ответ! Будем ждать вас.`,`Отлично, подтверждаю заказ. Оплату проведу при получении.`,`Спасибо большое! Подскажите ещё, есть ли у вас десерты без сахара?`,`Супер, всё понятно, спасибо вашей поддержке!`],i=n[Math.floor(Math.random()*n.length)],o=t.find(e=>e.id===a);if(o){let t={id:`m-reply-${Date.now()}`,sender:`client`,senderName:o.clientName,text:i,time:new Date().toLocaleTimeString(`ru-RU`,{hour:`2-digit`,minute:`2-digit`})};r(e=>e.map(e=>e.id===a?{...e,lastMessage:i,time:`Только что`,messages:[...e.messages,t]}:e)),e({title:`Новый ответ от ${o.clientName}`,message:i,type:`info`})}},750)},O=e=>{switch(e){case`telegram`:return(0,D.jsx)(i,{variant:`gold`,size:`sm`,children:`Telegram Bot`});case`whatsapp`:return(0,D.jsx)(i,{variant:`green`,size:`sm`,children:`WhatsApp`});case`max`:return(0,D.jsx)(i,{variant:`info`,size:`sm`,children:`MAX`});case`internal`:return(0,D.jsx)(i,{variant:`warning`,size:`sm`,children:`Командный чат`});default:return(0,D.jsx)(i,{variant:`neutral`,size:`sm`,children:`Чат`})}},k=t.filter(e=>h===`all`||e.channel===h);return(0,D.jsxs)(`div`,{className:`space-y-4 animate-fade-in`,children:[(0,D.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,D.jsxs)(`div`,{children:[(0,D.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,D.jsx)(`h2`,{className:`text-sm font-bold text-krona-primary`,children:`Единый центр коммуникаций & Омниканальный Inbox`}),(0,D.jsx)(l,{level:`target`,size:`sm`})]}),(0,D.jsx)(`p`,{className:`text-xs text-krona-secondary mt-0.5`,children:`Telegram, WhatsApp, MAX Messenger, Web-чат и внутренние командные каналы в одном окне`})]}),(0,D.jsxs)(`div`,{className:`flex items-center gap-2 text-xs`,children:[(0,D.jsxs)(n,{variant:`secondary`,size:`sm`,onClick:()=>x(!b),children:[(0,D.jsx)(s,{className:`w-3.5 h-3.5 mr-1`}),b?`Скрыть CRM-карточку`:`Показать CRM-карточку`]}),(0,D.jsx)(i,{variant:`green`,size:`md`,children:`Онлайн: 4 канала активны`})]})]}),(0,D.jsxs)(`div`,{className:`h-[calc(100vh-13rem)] flex flex-col md:flex-row gap-3 bg-krona-surface border border-krona-border rounded-xl shadow-krona-soft overflow-hidden`,children:[(0,D.jsxs)(`div`,{className:`w-full md:w-80 lg:w-96 border-r border-krona-border flex flex-col bg-krona-workspace/50`,children:[(0,D.jsxs)(`div`,{className:`p-3 border-b border-krona-border space-y-2`,children:[(0,D.jsx)(`div`,{className:`flex items-center justify-between`,children:(0,D.jsxs)(`span`,{className:`text-xs font-bold text-krona-primary uppercase tracking-wider`,children:[`Диалоги (`,k.length,`)`]})}),(0,D.jsx)(`div`,{className:`flex items-center gap-1 overflow-x-auto text-[11px] pb-1`,children:[{id:`all`,label:`Все`},{id:`telegram`,label:`Telegram`},{id:`whatsapp`,label:`WhatsApp`},{id:`max`,label:`MAX`},{id:`internal`,label:`Команда`}].map(e=>(0,D.jsx)(`button`,{onClick:()=>g(e.id),className:`px-2 py-0.5 rounded transition-colors whitespace-nowrap ${h===e.id?`bg-[#2F684C] text-white font-medium shadow-sm`:`bg-krona-surface text-krona-secondary hover:text-krona-primary border border-krona-border/60`}`,children:e.label},e.id))}),(0,D.jsxs)(`div`,{className:`relative`,children:[(0,D.jsx)(d,{className:`w-3.5 h-3.5 absolute left-2.5 top-2.5 text-krona-secondary`}),(0,D.jsx)(`input`,{type:`text`,placeholder:`Поиск диалогов...`,className:`w-full pl-8 pr-3 py-1.5 text-xs bg-krona-surface border border-krona-border rounded-lg text-krona-primary placeholder:text-krona-secondary focus:outline-none`})]})]}),(0,D.jsx)(`div`,{className:`flex-1 overflow-y-auto divide-y divide-krona-border/40`,children:k.map(e=>(0,D.jsxs)(`div`,{onClick:()=>f(e.id),className:`p-3 cursor-pointer transition-colors ${e.id===a?`bg-krona-surface font-medium border-l-2 border-krona-gold`:`hover:bg-krona-surface/60 text-krona-secondary`}`,children:[(0,D.jsxs)(`div`,{className:`flex items-center justify-between mb-1`,children:[(0,D.jsx)(`span`,{className:`font-semibold text-xs text-krona-primary truncate`,children:e.clientName}),(0,D.jsx)(`span`,{className:`text-[10px] text-krona-secondary`,children:e.time})]}),(0,D.jsx)(`p`,{className:`text-xs text-krona-secondary truncate mb-1.5`,children:e.lastMessage}),(0,D.jsxs)(`div`,{className:`flex items-center justify-between`,children:[O(e.channel),e.unreadCount>0&&(0,D.jsx)(`span`,{className:`w-4 h-4 rounded-full bg-krona-gold text-white text-[10px] font-bold flex items-center justify-center`,children:e.unreadCount})]})]},e.id))})]}),(0,D.jsxs)(`div`,{className:`flex-1 flex flex-col min-w-0 bg-krona-surface`,children:[(0,D.jsxs)(`div`,{className:`p-3.5 border-b border-krona-border flex items-center justify-between bg-krona-surface/80`,children:[(0,D.jsxs)(`div`,{className:`flex items-center gap-2.5`,children:[(0,D.jsx)(`div`,{className:`w-8 h-8 rounded-full bg-krona-workspace border border-krona-border flex items-center justify-center font-bold text-xs text-krona-primary`,children:S.avatar}),(0,D.jsxs)(`div`,{children:[(0,D.jsx)(`h4`,{className:`text-xs font-bold text-krona-primary`,children:S.clientName}),(0,D.jsxs)(`span`,{className:`text-[10px] text-krona-secondary`,children:[`Канал связи: `,S.channel]})]})]}),O(S.channel)]}),(0,D.jsxs)(`div`,{className:`flex-1 overflow-y-auto p-4 space-y-3`,children:[S.messages.map(e=>(0,D.jsxs)(`div`,{className:`flex flex-col ${e.sender===`agent`?`items-end`:`items-start`}`,children:[(0,D.jsx)(`span`,{className:`text-[10px] text-krona-secondary mb-0.5 px-1`,children:e.senderName}),(0,D.jsxs)(`div`,{className:`p-3 rounded-xl max-w-[75%] text-xs leading-relaxed shadow-krona-soft ${e.sender===`agent`?`bg-[#2F684C] text-[#F8F6F0] rounded-br-none`:`bg-krona-workspace border border-krona-border text-krona-primary rounded-bl-none`}`,children:[(0,D.jsx)(`p`,{children:e.text}),(0,D.jsxs)(`div`,{className:`flex items-center justify-end gap-1 mt-1 text-[9px] opacity-70`,children:[(0,D.jsx)(`span`,{children:e.time}),e.sender===`agent`&&(0,D.jsx)(C,{className:`w-3 h-3`})]})]})]},e.id)),_&&(0,D.jsxs)(`div`,{className:`flex items-center gap-2 text-xs text-krona-secondary bg-krona-workspace p-2 rounded-lg w-48 animate-pulse`,children:[(0,D.jsx)(`span`,{className:`w-2 h-2 rounded-full bg-krona-gold animate-ping`}),(0,D.jsx)(`span`,{children:`Собеседник печатает...`})]})]}),(0,D.jsx)(`div`,{className:`p-3 border-t border-krona-border bg-krona-workspace/50`,children:(0,D.jsxs)(`form`,{onSubmit:T,className:`flex items-center gap-2`,children:[(0,D.jsx)(`input`,{type:`text`,value:p,onChange:e=>m(e.target.value),placeholder:`Напишите ответ клиенту или коллегам (симуляция авто-ответа)...`,className:`flex-1 bg-krona-surface border border-krona-border rounded-lg px-3 py-2 text-xs text-krona-primary placeholder:text-krona-secondary focus:outline-none focus:border-krona-green`}),(0,D.jsxs)(n,{type:`submit`,variant:`primary`,size:`sm`,className:`px-3`,children:[(0,D.jsx)(u,{className:`w-3.5 h-3.5 mr-1`}),`Отправить`]})]})})]}),b&&(0,D.jsxs)(`div`,{className:`hidden lg:flex w-72 border-l border-krona-border flex-col bg-krona-surface p-3.5 space-y-4 text-xs`,children:[(0,D.jsxs)(`div`,{className:`flex items-center justify-between pb-2 border-b border-krona-border`,children:[(0,D.jsx)(`span`,{className:`font-bold text-krona-primary uppercase text-[11px]`,children:`CRM Контекст`}),(0,D.jsx)(i,{variant:`gold`,size:`sm`,children:`VIP Клиент`})]}),(0,D.jsxs)(`div`,{className:`space-y-2`,children:[(0,D.jsxs)(`div`,{children:[(0,D.jsx)(`span`,{className:`text-[10px] text-krona-secondary`,children:`ФИО клиента:`}),(0,D.jsx)(`div`,{className:`font-bold text-krona-primary`,children:S.clientName})]}),(0,D.jsxs)(`div`,{children:[(0,D.jsx)(`span`,{className:`text-[10px] text-krona-secondary`,children:`Телефон:`}),(0,D.jsx)(`div`,{className:`font-mono text-krona-primary`,children:`+7 (913) 482-19-02`})]}),(0,D.jsxs)(`div`,{children:[(0,D.jsx)(`span`,{className:`text-[10px] text-krona-secondary`,children:`LTV (Общий объем заказов):`}),(0,D.jsx)(`div`,{className:`font-bold text-krona-green font-mono`,children:`48 200 ₽ (14 чеков)`})]}),(0,D.jsxs)(`div`,{children:[(0,D.jsx)(`span`,{className:`text-[10px] text-krona-secondary`,children:`Любимые позиции:`}),(0,D.jsx)(`div`,{className:`text-krona-secondary text-[11px]`,children:`Филадельфия Премиум, Том Ям`})]})]}),(0,D.jsxs)(`div`,{className:`p-2.5 bg-krona-workspace rounded-lg border border-krona-border space-y-1`,children:[(0,D.jsxs)(`div`,{className:`font-semibold text-krona-primary flex items-center gap-1`,children:[(0,D.jsx)(c,{className:`w-3 h-3 text-krona-gold`}),`AI Подсказка оператору:`]}),(0,D.jsx)(`p`,{className:`text-[11px] text-krona-secondary`,children:`Гость часто заказывает по пятницам в 19:30. Предложите сет Осенний со скидкой постоянного клиента.`})]}),(0,D.jsx)(`div`,{className:`pt-2 border-t border-krona-border space-y-2`,children:(0,D.jsx)(n,{variant:`outline`,size:`sm`,className:`w-full text-xs`,children:`Открыть сделку в CRM →`})})]})]})]})};export{O as CommunicationsModule}; \ No newline at end of file +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{N as s,b as c,m as l,t as u,y as d}from"./index-CrJKtV0u.js";import{a as f,c as p,i as m,l as h,n as g,o as _,r as v,s as y,t as b,u as x}from"./mockData-DAqQG5te.js";var S={name:`check-check`,size:24,node:[[`path`,{d:`M18 6 7 17l-5-5`,key:`116fxf`}],[`path`,{d:`m22 10-7.5 7.5L13 16`,key:`ke71qq`}]]};S.node;var C=r(S),w=t(e(),1),T=(e=250)=>new Promise(t=>setTimeout(t,e)),E=new class{clients=[...g];deals=[...m];catalog=[...b];inventory=[...y];recipes=[...p];employees=[...f];tickets=[...x];conversations=[...v];finance=[..._];tasks=[...h];async getCustomers(){return await T(200),[...this.clients]}async createCustomer(e){await T(300);let t={...e,id:`cl-${Date.now()}`};return this.clients=[t,...this.clients],t}async getDeals(){return await T(200),[...this.deals]}async updateDealStage(e,t){await T(150),this.deals=this.deals.map(n=>n.id===e?{...n,stage:t}:n)}async getCatalog(){return await T(200),[...this.catalog]}async toggleStopList(e){await T(150);let t=!1;return this.catalog=this.catalog.map(n=>n.id===e?(t=!n.isStopListed,{...n,isStopListed:t}):n),t}async getInventory(){return await T(200),[...this.inventory]}async getRecipes(){return await T(200),[...this.recipes]}async getEmployees(){return await T(200),[...this.employees]}async getTickets(){return await T(200),[...this.tickets]}async getMessages(){return await T(200),[...this.conversations]}async sendMessage(e,t){await T(150),this.conversations=this.conversations.map(n=>n.id===e?{...n,lastMessage:t,time:new Date().toLocaleTimeString(`ru-RU`,{hour:`2-digit`,minute:`2-digit`}),messages:[...n.messages,{id:`msg-${Date.now()}`,sender:`agent`,senderName:`Вы (Оператор)`,text:t,time:new Date().toLocaleTimeString(`ru-RU`,{hour:`2-digit`,minute:`2-digit`})}]}:n)}async getFinance(){return await T(200),[...this.finance]}async addFinanceEntry(e){await T(250);let t={...e,id:`fin-${Date.now()}`};return this.finance=[t,...this.finance],t}async getTasks(){return await T(200),[...this.tasks]}async updateTaskStatus(e,t){await T(150),this.tasks=this.tasks.map(n=>n.id===e?{...n,status:t}:n)}},D=a(),O=()=>{let{showToast:e}=o(),[t,r]=(0,w.useState)(v),[a,f]=(0,w.useState)(v[0].id),[p,m]=(0,w.useState)(``),[h,g]=(0,w.useState)(`all`),[_,y]=(0,w.useState)(!1),[b,x]=(0,w.useState)(!0),S=t.find(e=>e.id===a)||t[0],T=async n=>{if(n.preventDefault(),!p.trim())return;let i=p;m(``),await E.sendMessage(a,i);let o=await E.getMessages();r(o),y(!0),setTimeout(async()=>{y(!1);let n=[`Спасибо за быстрый ответ! Будем ждать вас.`,`Отлично, подтверждаю заказ. Оплату проведу при получении.`,`Спасибо большое! Подскажите ещё, есть ли у вас десерты без сахара?`,`Супер, всё понятно, спасибо вашей поддержке!`],i=n[Math.floor(Math.random()*n.length)],o=t.find(e=>e.id===a);if(o){let t={id:`m-reply-${Date.now()}`,sender:`client`,senderName:o.clientName,text:i,time:new Date().toLocaleTimeString(`ru-RU`,{hour:`2-digit`,minute:`2-digit`})};r(e=>e.map(e=>e.id===a?{...e,lastMessage:i,time:`Только что`,messages:[...e.messages,t]}:e)),e({title:`Новый ответ от ${o.clientName}`,message:i,type:`info`})}},750)},O=e=>{switch(e){case`telegram`:return(0,D.jsx)(i,{variant:`gold`,size:`sm`,children:`Telegram Bot`});case`whatsapp`:return(0,D.jsx)(i,{variant:`green`,size:`sm`,children:`WhatsApp`});case`max`:return(0,D.jsx)(i,{variant:`info`,size:`sm`,children:`MAX`});case`internal`:return(0,D.jsx)(i,{variant:`warning`,size:`sm`,children:`Командный чат`});default:return(0,D.jsx)(i,{variant:`neutral`,size:`sm`,children:`Чат`})}},k=t.filter(e=>h===`all`||e.channel===h);return(0,D.jsxs)(`div`,{className:`space-y-4 animate-fade-in`,children:[(0,D.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,D.jsxs)(`div`,{children:[(0,D.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,D.jsx)(`h2`,{className:`text-sm font-bold text-krona-primary`,children:`Единый центр коммуникаций & Омниканальный Inbox`}),(0,D.jsx)(u,{level:`target`,size:`sm`})]}),(0,D.jsx)(`p`,{className:`text-xs text-krona-secondary mt-0.5`,children:`Telegram, WhatsApp, MAX Messenger, Web-чат и внутренние командные каналы в одном окне`})]}),(0,D.jsxs)(`div`,{className:`flex items-center gap-2 text-xs`,children:[(0,D.jsxs)(n,{variant:`secondary`,size:`sm`,onClick:()=>x(!b),children:[(0,D.jsx)(s,{className:`w-3.5 h-3.5 mr-1`}),b?`Скрыть CRM-карточку`:`Показать CRM-карточку`]}),(0,D.jsx)(i,{variant:`green`,size:`md`,children:`Онлайн: 4 канала активны`})]})]}),(0,D.jsxs)(`div`,{className:`h-[calc(100vh-13rem)] flex flex-col md:flex-row gap-3 bg-krona-surface border border-krona-border rounded-xl shadow-krona-soft overflow-hidden`,children:[(0,D.jsxs)(`div`,{className:`w-full md:w-80 lg:w-96 border-r border-krona-border flex flex-col bg-krona-workspace/50`,children:[(0,D.jsxs)(`div`,{className:`p-3 border-b border-krona-border space-y-2`,children:[(0,D.jsx)(`div`,{className:`flex items-center justify-between`,children:(0,D.jsxs)(`span`,{className:`text-xs font-bold text-krona-primary uppercase tracking-wider`,children:[`Диалоги (`,k.length,`)`]})}),(0,D.jsx)(`div`,{className:`flex items-center gap-1 overflow-x-auto text-[11px] pb-1`,children:[{id:`all`,label:`Все`},{id:`telegram`,label:`Telegram`},{id:`whatsapp`,label:`WhatsApp`},{id:`max`,label:`MAX`},{id:`internal`,label:`Команда`}].map(e=>(0,D.jsx)(`button`,{onClick:()=>g(e.id),className:`px-2 py-0.5 rounded transition-colors whitespace-nowrap ${h===e.id?`bg-[#2F684C] text-white font-medium shadow-sm`:`bg-krona-surface text-krona-secondary hover:text-krona-primary border border-krona-border/60`}`,children:e.label},e.id))}),(0,D.jsxs)(`div`,{className:`relative`,children:[(0,D.jsx)(c,{className:`w-3.5 h-3.5 absolute left-2.5 top-2.5 text-krona-secondary`}),(0,D.jsx)(`input`,{type:`text`,placeholder:`Поиск диалогов...`,className:`w-full pl-8 pr-3 py-1.5 text-xs bg-krona-surface border border-krona-border rounded-lg text-krona-primary placeholder:text-krona-secondary focus:outline-none`})]})]}),(0,D.jsx)(`div`,{className:`flex-1 overflow-y-auto divide-y divide-krona-border/40`,children:k.map(e=>(0,D.jsxs)(`div`,{onClick:()=>f(e.id),className:`p-3 cursor-pointer transition-colors ${e.id===a?`bg-krona-surface font-medium border-l-2 border-krona-gold`:`hover:bg-krona-surface/60 text-krona-secondary`}`,children:[(0,D.jsxs)(`div`,{className:`flex items-center justify-between mb-1`,children:[(0,D.jsx)(`span`,{className:`font-semibold text-xs text-krona-primary truncate`,children:e.clientName}),(0,D.jsx)(`span`,{className:`text-[10px] text-krona-secondary`,children:e.time})]}),(0,D.jsx)(`p`,{className:`text-xs text-krona-secondary truncate mb-1.5`,children:e.lastMessage}),(0,D.jsxs)(`div`,{className:`flex items-center justify-between`,children:[O(e.channel),e.unreadCount>0&&(0,D.jsx)(`span`,{className:`w-4 h-4 rounded-full bg-krona-gold text-white text-[10px] font-bold flex items-center justify-center`,children:e.unreadCount})]})]},e.id))})]}),(0,D.jsxs)(`div`,{className:`flex-1 flex flex-col min-w-0 bg-krona-surface`,children:[(0,D.jsxs)(`div`,{className:`p-3.5 border-b border-krona-border flex items-center justify-between bg-krona-surface/80`,children:[(0,D.jsxs)(`div`,{className:`flex items-center gap-2.5`,children:[(0,D.jsx)(`div`,{className:`w-8 h-8 rounded-full bg-krona-workspace border border-krona-border flex items-center justify-center font-bold text-xs text-krona-primary`,children:S.avatar}),(0,D.jsxs)(`div`,{children:[(0,D.jsx)(`h4`,{className:`text-xs font-bold text-krona-primary`,children:S.clientName}),(0,D.jsxs)(`span`,{className:`text-[10px] text-krona-secondary`,children:[`Канал связи: `,S.channel]})]})]}),O(S.channel)]}),(0,D.jsxs)(`div`,{className:`flex-1 overflow-y-auto p-4 space-y-3`,children:[S.messages.map(e=>(0,D.jsxs)(`div`,{className:`flex flex-col ${e.sender===`agent`?`items-end`:`items-start`}`,children:[(0,D.jsx)(`span`,{className:`text-[10px] text-krona-secondary mb-0.5 px-1`,children:e.senderName}),(0,D.jsxs)(`div`,{className:`p-3 rounded-xl max-w-[75%] text-xs leading-relaxed shadow-krona-soft ${e.sender===`agent`?`bg-[#2F684C] text-[#F8F6F0] rounded-br-none`:`bg-krona-workspace border border-krona-border text-krona-primary rounded-bl-none`}`,children:[(0,D.jsx)(`p`,{children:e.text}),(0,D.jsxs)(`div`,{className:`flex items-center justify-end gap-1 mt-1 text-[9px] opacity-70`,children:[(0,D.jsx)(`span`,{children:e.time}),e.sender===`agent`&&(0,D.jsx)(C,{className:`w-3 h-3`})]})]})]},e.id)),_&&(0,D.jsxs)(`div`,{className:`flex items-center gap-2 text-xs text-krona-secondary bg-krona-workspace p-2 rounded-lg w-48 animate-pulse`,children:[(0,D.jsx)(`span`,{className:`w-2 h-2 rounded-full bg-krona-gold animate-ping`}),(0,D.jsx)(`span`,{children:`Собеседник печатает...`})]})]}),(0,D.jsx)(`div`,{className:`p-3 border-t border-krona-border bg-krona-workspace/50`,children:(0,D.jsxs)(`form`,{onSubmit:T,className:`flex items-center gap-2`,children:[(0,D.jsx)(`input`,{type:`text`,value:p,onChange:e=>m(e.target.value),placeholder:`Напишите ответ клиенту или коллегам (симуляция авто-ответа)...`,className:`flex-1 bg-krona-surface border border-krona-border rounded-lg px-3 py-2 text-xs text-krona-primary placeholder:text-krona-secondary focus:outline-none focus:border-krona-green`}),(0,D.jsxs)(n,{type:`submit`,variant:`primary`,size:`sm`,className:`px-3`,children:[(0,D.jsx)(d,{className:`w-3.5 h-3.5 mr-1`}),`Отправить`]})]})})]}),b&&(0,D.jsxs)(`div`,{className:`hidden lg:flex w-72 border-l border-krona-border flex-col bg-krona-surface p-3.5 space-y-4 text-xs`,children:[(0,D.jsxs)(`div`,{className:`flex items-center justify-between pb-2 border-b border-krona-border`,children:[(0,D.jsx)(`span`,{className:`font-bold text-krona-primary uppercase text-[11px]`,children:`CRM Контекст`}),(0,D.jsx)(i,{variant:`gold`,size:`sm`,children:`VIP Клиент`})]}),(0,D.jsxs)(`div`,{className:`space-y-2`,children:[(0,D.jsxs)(`div`,{children:[(0,D.jsx)(`span`,{className:`text-[10px] text-krona-secondary`,children:`ФИО клиента:`}),(0,D.jsx)(`div`,{className:`font-bold text-krona-primary`,children:S.clientName})]}),(0,D.jsxs)(`div`,{children:[(0,D.jsx)(`span`,{className:`text-[10px] text-krona-secondary`,children:`Телефон:`}),(0,D.jsx)(`div`,{className:`font-mono text-krona-primary`,children:`+7 (913) 482-19-02`})]}),(0,D.jsxs)(`div`,{children:[(0,D.jsx)(`span`,{className:`text-[10px] text-krona-secondary`,children:`LTV (Общий объем заказов):`}),(0,D.jsx)(`div`,{className:`font-bold text-krona-green font-mono`,children:`48 200 ₽ (14 чеков)`})]}),(0,D.jsxs)(`div`,{children:[(0,D.jsx)(`span`,{className:`text-[10px] text-krona-secondary`,children:`Любимые позиции:`}),(0,D.jsx)(`div`,{className:`text-krona-secondary text-[11px]`,children:`Филадельфия Премиум, Том Ям`})]})]}),(0,D.jsxs)(`div`,{className:`p-2.5 bg-krona-workspace rounded-lg border border-krona-border space-y-1`,children:[(0,D.jsxs)(`div`,{className:`font-semibold text-krona-primary flex items-center gap-1`,children:[(0,D.jsx)(l,{className:`w-3 h-3 text-krona-gold`}),`AI Подсказка оператору:`]}),(0,D.jsx)(`p`,{className:`text-[11px] text-krona-secondary`,children:`Гость часто заказывает по пятницам в 19:30. Предложите сет Осенний со скидкой постоянного клиента.`})]}),(0,D.jsx)(`div`,{className:`pt-2 border-t border-krona-border space-y-2`,children:(0,D.jsx)(n,{variant:`outline`,size:`sm`,className:`w-full text-xs`,children:`Открыть сделку в CRM →`})})]})]})]})};export{O as CommunicationsModule}; \ No newline at end of file diff --git a/dist/assets/CrmModule-Cw43Bd0U.js b/dist/assets/CrmModule-Cw43Bd0U.js deleted file mode 100644 index 8caaadb..0000000 --- a/dist/assets/CrmModule-Cw43Bd0U.js +++ /dev/null @@ -1,12 +0,0 @@ -import{d as e,f as t,h as n,i as r,l as i,r as a,s as o,t as s,u as c}from"./useToast-CS8pZhce.js";import{t as l}from"./DynamicFormRenderer-u2RREFCE.js";import{t as u}from"./building-BdUpGLM5.js";import{t as d}from"./file-text-DR21jZDS.js";import{B as f,H as p,I as ee,V as te,W as m,X as ne,Z as h,dt as re,et as g,g as ie,n as _,nt as ae,p as v,r as y,rt as b,st as oe,t as x,tt as S,w as C,x as se,y as w}from"./index-CNnq9VO5.js";import{t as T}from"./useOrders-Dp-LV7vp.js";import{t as E}from"./currency-DdDs82F5.js";var D={name:`cloud-upload`,size:24,node:[[`path`,{d:`M12 13v8`,key:`1l5pq0`}],[`path`,{d:`M4 14.899A7 7 0 1 1 15.71 8h1.79a4.5 4.5 0 0 1 2.5 8.242`,key:`1pljnt`}],[`path`,{d:`m8 17 4-4 4 4`,key:`1quai1`}]],aliases:[`upload-cloud`]};D.node;var ce=i(D),O=n(t(),1);function k(){let[e,t]=(0,O.useState)([]),[n,r]=(0,O.useState)([]),[i,a]=(0,O.useState)([]),[o,s]=(0,O.useState)([]),[c,l]=(0,O.useState)(!0),[u,d]=(0,O.useState)(null),f=(0,O.useCallback)(async()=>{try{l(!0),d(null);let[e,n,i,o]=await Promise.all([b.contacts.list({pageSize:100}),b.companies.list({pageSize:100}),b.leads.list({pageSize:100}),b.deals.list({pageSize:100})]);t(e.items),r(n.items),a(i.items),s(o.items)}catch(e){d(e instanceof Error?e:Error(String(e)))}finally{l(!1)}},[]);return(0,O.useEffect)(()=>{let e=!0;return Promise.resolve().then(()=>{e&&f()}),()=>{e=!1}},[f]),S(`records:changed`,e=>{(e.entityType===`contact`||e.entityType===`company`||e.entityType===`lead`||e.entityType===`deal`)&&f()}),S(`storage:reset`,f),S(`snapshot:imported`,f),{contacts:e,companies:n,leads:i,deals:o,loading:c,error:u,refetch:f,createContact:(0,O.useCallback)(async e=>b.contacts.create(e),[]),updateContact:(0,O.useCallback)(async(e,t)=>b.contacts.update(e,t),[]),deleteContact:(0,O.useCallback)(async e=>b.contacts.delete(e),[]),createCompany:(0,O.useCallback)(async e=>b.companies.create(e),[]),updateCompany:(0,O.useCallback)(async(e,t)=>b.companies.update(e,t),[]),deleteCompany:(0,O.useCallback)(async e=>b.companies.delete(e),[]),createDeal:(0,O.useCallback)(async e=>b.deals.create(e),[]),updateDeal:(0,O.useCallback)(async(e,t)=>b.deals.update(e,t),[]),deleteDeal:(0,O.useCallback)(async e=>b.deals.delete(e),[]),createLead:(0,O.useCallback)(async e=>b.leads.create(e),[]),updateLead:(0,O.useCallback)(async(e,t)=>b.leads.update(e,t),[]),deleteLead:(0,O.useCallback)(async e=>b.leads.delete(e),[]),convertLead:(0,O.useCallback)(async(e,t)=>b.convertLeadToDeal(e,t),[]),getTimeline:(0,O.useCallback)(async(e,t)=>b.getTimeline(e,t),[]),createActivity:(0,O.useCallback)(async e=>b.activities.create(e),[]),createNote:(0,O.useCallback)(async e=>b.notes.create(e),[])}}var A=o(),le=`Имя,Фамилия,Телефон,Email,Компания,Должность -Владимир,Ковалев,+7 (916) 123-45-67,kovalev@partner.ru,ООО «СеверТорг»,Коммерческий директор -Елена,Васильева,+7 (903) 987-65-43,elena.v@iceberg.ru,ГК «Айсберг Логистик»,Руководитель закупок -Дмитрий,Смирнов,,dmitry@corp.ru,,Менеджер -Иван,,+7 (999) 888-77-66,invalid-email-address,ИП «Михайлов»,Инженер -Анна,Кузнецова,+7 (926) 111-22-33,anna.k@beautyshop.ru,ООО «Бьюти Групп»,Директор по маркетингу`,j=`Артикул,Наименование,Категория,Цена (коп),Единица -COF-ETH-01,Кофе зерновой Эфиопия Иргачефф 1кг,Кофе,185000,уп -COF-BRZ-02,Кофе зерновой Бразилия Сантос 1кг,Кофе,145000,уп -SYR-VAN-01,Сироп Ваниль 1000мл,Сиропы,65000,бут -,,Расходники,25000,уп -CUP-PAP-300,Стакан бумажный 300мл 50шт,Упаковка,-5000,уп -TEA-SEN-01,Чай зеленый Сенча 500г,Чай,95000,уп`,M=[{key:`firstName`,label:`Имя`,required:!0},{key:`lastName`,label:`Фамилия`,required:!0},{key:`phone`,label:`Телефон`,required:!1},{key:`email`,label:`Email`,required:!1},{key:`companyName`,label:`Компания`,required:!1},{key:`jobTitle`,label:`Должность`,required:!1}],N=[{key:`sku`,label:`Артикул (SKU)`,required:!0},{key:`name`,label:`Наименование`,required:!0},{key:`category`,label:`Категория`,required:!1},{key:`price`,label:`Цена (копейки)`,required:!0},{key:`unit`,label:`Единица измерения`,required:!1}],ue=({initialEntityType:e=`contact`,onComplete:t,onClose:n})=>{let{showToast:i}=s(),[o,l]=(0,O.useState)(1),[u,p]=(0,O.useState)(e),[re,g]=(0,O.useState)(``),[ie,_]=(0,O.useState)(``),[y,oe]=(0,O.useState)([]),[x,S]=(0,O.useState)([]),[C,w]=(0,O.useState)({}),[T,E]=(0,O.useState)(!0),[D,k]=(0,O.useState)(!1),[ue,P]=(0,O.useState)(0),F=e=>{let t=e.trim().split(/\r?\n/).filter(Boolean);if(t.length<2)return;let n=e=>{let t=[],n=``,r=!1;for(let i=0;i{o[e]=a[t]||``}),i.push(o)}oe(r),S(i);let a={},o=u===`contact`?M:N;r.forEach(e=>{let t=e.toLowerCase(),n=o.find(e=>{let n=e.label.toLowerCase();return t===e.key.toLowerCase()||t===n||t.includes(n)||n.includes(t)});n?a[e]=n.key:a[e]=``}),w(a)},I=e=>{p(e);let t=e===`contact`?le:j;g(t),_(`образец_${e===`contact`?`контактов`:`товаров`}.csv`),F(t),l(2)},L=e=>{let t=e.target.files?.[0];if(!t)return;_(t.name);let n=new FileReader;n.onload=e=>{let t=e.target?.result;g(t),F(t),l(2)},n.readAsText(t)},R=x.map((e,t)=>{let n={};Object.entries(C).forEach(([t,r])=>{r&&(n[r]=e[t]||``)});let r=[];if(u===`contact`)n.firstName?.trim()||r.push(`Имя обязательно`),n.lastName?.trim()||r.push(`Фамилия обязательна`),n.email&&!/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(n.email)&&r.push(`Некорректный email: "${n.email}"`);else if(n.sku?.trim()||r.push(`Артикул (SKU) обязателен`),n.name?.trim()||r.push(`Наименование обязательно`),n.price){let e=Number(n.price);(isNaN(e)||e<=0)&&r.push(`Цена должна быть положительным числом: "${n.price}"`)}else r.push(`Цена обязательна`);return{rowIndex:t+1,raw:e,mapped:n,isValid:r.length===0,errors:r}}),z=R.filter(e=>e.isValid).length,de=R.filter(e=>!e.isValid).length,B=async()=>{k(!0);try{let e=T?R.filter(e=>e.isValid):R,n=0;if(u===`contact`)for(let t of e)await b.contacts.create({firstName:t.mapped.firstName||`Контакт`,lastName:t.mapped.lastName||``,phone:t.mapped.phone||``,email:t.mapped.email||``,roles:[`client`],status:`active`}),n++;else for(let t of e){let e=Math.round(Number(t.mapped.price)||1e4);await ae.products.create({sku:t.mapped.sku||`SKU-${c()}`,name:t.mapped.name||`Товар`,categoryId:`cat_default`,isService:!1,trackInventory:!0,status:`active`,price:{minor:e,currency:`RUB`},costPrice:{minor:Math.round(e*.6),currency:`RUB`},unit:t.mapped.unit||`шт`}),n++}P(n),l(4),i(`Успешно импортировано ${n} записей в IndexedDB!`,`success`),t&&t(n)}catch(e){i(`Ошибка импорта: ${e instanceof Error?e.message:String(e)}`,`error`)}finally{k(!1)}},V=u===`contact`?M:N;return(0,A.jsxs)(`div`,{className:`bg-krona-surface border border-krona-border rounded-xl shadow-krona-soft p-5 space-y-6`,children:[(0,A.jsxs)(`div`,{className:`flex flex-col sm:flex-row sm:items-center justify-between gap-4 border-b border-krona-border pb-4`,children:[(0,A.jsxs)(`div`,{children:[(0,A.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,A.jsx)(`h2`,{className:`text-base font-bold text-krona-primary`,children:`Мастер импорта данных из CSV`}),(0,A.jsx)(a,{variant:`gold`,size:`sm`,children:u===`contact`?`Контакты CRM`:`Товары`})]}),(0,A.jsx)(`p`,{className:`text-xs text-krona-secondary mt-0.5`,children:`Пакетная загрузка записей с проверкой форматов, сопоставлением колонок и отчетом валидации`})]}),(0,A.jsx)(`div`,{className:`flex items-center gap-2 text-xs`,children:[{num:1,label:`Файл`},{num:2,label:`Сопоставление`},{num:3,label:`Валидация`},{num:4,label:`Готово`}].map(e=>(0,A.jsxs)(`div`,{className:`flex items-center gap-1.5`,children:[(0,A.jsx)(`span`,{className:`w-6 h-6 rounded-full flex items-center justify-center font-bold text-xs ${o===e.num?`bg-krona-green text-white shadow-sm`:o>e.num?`bg-[#2F684C]/20 text-krona-green`:`bg-krona-workspace text-krona-secondary border border-krona-border`}`,children:o>e.num?(0,A.jsx)(m,{className:`w-3.5 h-3.5`}):e.num}),(0,A.jsx)(`span`,{className:`hidden sm:inline font-medium ${o===e.num?`text-krona-primary`:`text-krona-secondary`}`,children:e.label}),e.num<4&&(0,A.jsx)(`div`,{className:`w-4 h-0.5 bg-krona-border`})]},e.num))})]}),o===1&&(0,A.jsxs)(`div`,{className:`space-y-5 animate-fade-in`,children:[(0,A.jsxs)(`div`,{className:`grid grid-cols-1 sm:grid-cols-2 gap-4`,children:[(0,A.jsxs)(`div`,{children:[(0,A.jsx)(`label`,{className:`block text-xs font-semibold text-krona-primary mb-1.5`,children:`Целевая сущность`}),(0,A.jsxs)(`div`,{className:`flex gap-2`,children:[(0,A.jsxs)(`button`,{type:`button`,onClick:()=>p(`contact`),className:`flex-1 p-3 rounded-lg border text-left text-xs transition-all ${u===`contact`?`border-krona-green bg-krona-green/10 text-krona-primary font-semibold`:`border-krona-border bg-krona-workspace text-krona-secondary hover:border-krona-border/80`}`,children:[(0,A.jsx)(`div`,{className:`font-bold text-sm text-krona-primary`,children:`Контакты`}),(0,A.jsx)(`div`,{className:`text-xs text-krona-secondary mt-0.5`,children:`Физлица, клиенты, сотрудники контрагентов`})]}),(0,A.jsxs)(`button`,{type:`button`,onClick:()=>p(`product`),className:`flex-1 p-3 rounded-lg border text-left text-xs transition-all ${u===`product`?`border-krona-green bg-krona-green/10 text-krona-primary font-semibold`:`border-krona-border bg-krona-workspace text-krona-secondary hover:border-krona-border/80`}`,children:[(0,A.jsx)(`div`,{className:`font-bold text-sm text-krona-primary`,children:`Товары`}),(0,A.jsx)(`div`,{className:`text-xs text-krona-secondary mt-0.5`,children:`Номенклатура, артикулы, цены и остатки`})]})]})]}),(0,A.jsxs)(`div`,{children:[(0,A.jsx)(`label`,{className:`block text-xs font-semibold text-krona-primary mb-1.5`,children:`Быстрый старт с образцами данных`}),(0,A.jsxs)(`div`,{className:`space-y-2`,children:[(0,A.jsxs)(r,{variant:`secondary`,size:`sm`,className:`w-full justify-start text-xs`,onClick:()=>I(`contact`),children:[(0,A.jsx)(v,{className:`w-3.5 h-3.5 text-amber-500 mr-2`}),`Загрузить образец контактов (с корректными и ошибочными строками)`]}),(0,A.jsxs)(r,{variant:`secondary`,size:`sm`,className:`w-full justify-start text-xs`,onClick:()=>I(`product`),children:[(0,A.jsx)(v,{className:`w-3.5 h-3.5 text-emerald-500 mr-2`}),`Загрузить образец товаров (с корректными и ошибочными строками)`]})]})]})]}),(0,A.jsxs)(`div`,{className:`border-2 border-dashed border-krona-border hover:border-krona-green rounded-xl p-8 text-center transition-colors bg-krona-workspace/40`,children:[(0,A.jsx)(ce,{className:`w-10 h-10 text-krona-secondary mx-auto mb-2`}),(0,A.jsx)(`div`,{className:`text-xs font-medium text-krona-primary`,children:`Перетащите сюда файл .csv или выберите на диске`}),(0,A.jsx)(`p`,{className:`text-[11px] text-krona-secondary mt-1`,children:`Поддерживается разделитель запятая (,), кодировка UTF-8`}),(0,A.jsxs)(`label`,{className:`mt-3 inline-block cursor-pointer`,children:[(0,A.jsxs)(`span`,{className:`px-3.5 py-1.5 rounded-lg bg-krona-green text-white text-xs font-medium hover:bg-krona-green/90 transition-colors shadow-sm inline-flex items-center gap-1.5`,children:[(0,A.jsx)(d,{className:`w-3.5 h-3.5`}),` Выбрать файл на компьютере`]}),(0,A.jsx)(`input`,{type:`file`,accept:`.csv,text/csv`,onChange:L,className:`hidden`})]})]})]}),o===2&&(0,A.jsxs)(`div`,{className:`space-y-4 animate-fade-in`,children:[(0,A.jsxs)(`div`,{className:`flex items-center justify-between text-xs bg-krona-workspace p-3 rounded-lg border border-krona-border`,children:[(0,A.jsxs)(`div`,{children:[(0,A.jsx)(`span`,{className:`text-krona-secondary`,children:`Файл: `}),(0,A.jsx)(`span`,{className:`font-semibold text-krona-primary`,children:ie}),(0,A.jsx)(`span`,{className:`text-krona-secondary ml-3`,children:`Строк: `}),(0,A.jsx)(`span`,{className:`font-semibold text-krona-primary`,children:x.length})]}),(0,A.jsx)(r,{variant:`ghost`,size:`sm`,onClick:()=>l(1),children:`Выбрать другой файл`})]}),(0,A.jsx)(`div`,{className:`border border-krona-border rounded-lg overflow-hidden`,children:(0,A.jsxs)(`table`,{className:`w-full text-xs text-left`,children:[(0,A.jsx)(`thead`,{className:`bg-krona-workspace text-krona-secondary border-b border-krona-border`,children:(0,A.jsxs)(`tr`,{children:[(0,A.jsx)(`th`,{className:`p-3 font-semibold`,children:`Колонка в CSV-файле`}),(0,A.jsx)(`th`,{className:`p-3 font-semibold`,children:`Пример значения (первая строка)`}),(0,A.jsx)(`th`,{className:`p-3 font-semibold`,children:`Поле в системе Krona`})]})}),(0,A.jsx)(`tbody`,{className:`divide-y divide-krona-border`,children:y.map(e=>(0,A.jsxs)(`tr`,{className:`hover:bg-krona-workspace/50`,children:[(0,A.jsx)(`td`,{className:`p-3 font-semibold text-krona-primary`,children:e}),(0,A.jsx)(`td`,{className:`p-3 font-mono text-krona-secondary truncate max-w-xs`,children:x[0]?.[e]||`—`}),(0,A.jsx)(`td`,{className:`p-3`,children:(0,A.jsxs)(`select`,{value:C[e]||``,onChange:t=>w({...C,[e]:t.target.value}),className:`w-64 px-2.5 py-1 text-xs bg-krona-workspace border border-krona-border rounded-md text-krona-primary focus:outline-none focus:border-krona-green`,children:[(0,A.jsx)(`option`,{value:``,children:`-- Не импортировать --`}),V.map(e=>(0,A.jsxs)(`option`,{value:e.key,children:[e.label,` `,e.required?`*`:``]},e.key))]})})]},e))})]})}),(0,A.jsxs)(`div`,{className:`flex justify-between items-center pt-2`,children:[(0,A.jsxs)(r,{variant:`secondary`,size:`sm`,onClick:()=>l(1),children:[(0,A.jsx)(h,{className:`w-3.5 h-3.5 mr-1`}),` Назад`]}),(0,A.jsxs)(r,{variant:`primary`,size:`sm`,onClick:()=>l(3),children:[`Перейти к валидации `,(0,A.jsx)(ne,{className:`w-3.5 h-3.5 ml-1`})]})]})]}),o===3&&(0,A.jsxs)(`div`,{className:`space-y-4 animate-fade-in`,children:[(0,A.jsxs)(`div`,{className:`grid grid-cols-1 sm:grid-cols-3 gap-3`,children:[(0,A.jsxs)(`div`,{className:`p-3 rounded-lg border border-krona-border bg-krona-workspace/60`,children:[(0,A.jsx)(`div`,{className:`text-[11px] text-krona-secondary uppercase font-semibold`,children:`Всего строк в файле`}),(0,A.jsx)(`div`,{className:`text-xl font-bold text-krona-primary mt-1`,children:R.length})]}),(0,A.jsxs)(`div`,{className:`p-3 rounded-lg border border-emerald-500/30 bg-emerald-500/10`,children:[(0,A.jsxs)(`div`,{className:`text-[11px] text-emerald-700 dark:text-emerald-300 uppercase font-semibold flex items-center gap-1`,children:[(0,A.jsx)(f,{className:`w-3.5 h-3.5`}),` Корректные строки`]}),(0,A.jsx)(`div`,{className:`text-xl font-bold text-emerald-600 dark:text-emerald-400 mt-1`,children:z})]}),(0,A.jsxs)(`div`,{className:`p-3 rounded-lg border border-rose-500/30 bg-rose-500/10`,children:[(0,A.jsxs)(`div`,{className:`text-[11px] text-rose-700 dark:text-rose-300 uppercase font-semibold flex items-center gap-1`,children:[(0,A.jsx)(te,{className:`w-3.5 h-3.5`}),` Строки с ошибками`]}),(0,A.jsx)(`div`,{className:`text-xl font-bold text-rose-600 dark:text-rose-400 mt-1`,children:de})]})]}),(0,A.jsxs)(`div`,{className:`flex items-center gap-2 text-xs bg-krona-workspace p-3 rounded-lg border border-krona-border`,children:[(0,A.jsx)(`input`,{type:`checkbox`,id:`skipErrors`,checked:T,onChange:e=>E(e.target.checked),className:`rounded border-krona-border text-krona-green focus:ring-krona-green`}),(0,A.jsxs)(`label`,{htmlFor:`skipErrors`,className:`text-krona-primary font-medium cursor-pointer`,children:[`Импортировать только корректные строки (`,z,` из `,R.length,`), пропуская ошибочные`]})]}),(0,A.jsx)(`div`,{className:`border border-krona-border rounded-lg overflow-x-auto max-h-80`,children:(0,A.jsxs)(`table`,{className:`w-full text-xs text-left`,children:[(0,A.jsx)(`thead`,{className:`bg-krona-workspace text-krona-secondary border-b border-krona-border sticky top-0`,children:(0,A.jsxs)(`tr`,{children:[(0,A.jsx)(`th`,{className:`p-2.5 font-semibold w-12`,children:`№`}),(0,A.jsx)(`th`,{className:`p-2.5 font-semibold w-24`,children:`Статус`}),V.map(e=>(0,A.jsx)(`th`,{className:`p-2.5 font-semibold`,children:e.label},e.key)),(0,A.jsx)(`th`,{className:`p-2.5 font-semibold`,children:`Ошибки / Замечания`})]})}),(0,A.jsx)(`tbody`,{className:`divide-y divide-krona-border`,children:R.map(e=>(0,A.jsxs)(`tr`,{className:`transition-colors ${e.isValid?`hover:bg-krona-workspace/40`:`bg-rose-500/5 hover:bg-rose-500/10`}`,children:[(0,A.jsx)(`td`,{className:`p-2.5 font-mono text-krona-secondary`,children:e.rowIndex}),(0,A.jsx)(`td`,{className:`p-2.5`,children:e.isValid?(0,A.jsx)(a,{variant:`green`,size:`sm`,children:`Корректно`}):(0,A.jsx)(a,{variant:`danger`,size:`sm`,children:`Ошибка`})}),V.map(t=>(0,A.jsx)(`td`,{className:`p-2.5 text-krona-primary font-medium`,children:e.mapped[t.key]||(0,A.jsx)(`span`,{className:`text-krona-secondary italic`,children:`—`})},t.key)),(0,A.jsx)(`td`,{className:`p-2.5 text-xs text-rose-600 dark:text-rose-400`,children:e.errors.length>0?(0,A.jsx)(`ul`,{className:`list-disc pl-4 space-y-0.5`,children:e.errors.map((e,t)=>(0,A.jsx)(`li`,{children:e},t))}):(0,A.jsxs)(`span`,{className:`text-emerald-600 dark:text-emerald-400 flex items-center gap-1`,children:[(0,A.jsx)(m,{className:`w-3 h-3`}),` Проверка пройдена`]})})]},e.rowIndex))})]})}),(0,A.jsxs)(`div`,{className:`flex justify-between items-center pt-2`,children:[(0,A.jsxs)(r,{variant:`secondary`,size:`sm`,onClick:()=>l(2),children:[(0,A.jsx)(h,{className:`w-3.5 h-3.5 mr-1`}),` Назад`]}),(0,A.jsx)(r,{variant:`primary`,size:`sm`,disabled:D||T&&z===0,onClick:B,children:D?(0,A.jsxs)(A.Fragment,{children:[(0,A.jsx)(se,{className:`w-3.5 h-3.5 mr-1.5 animate-spin`}),` Выполняется импорт...`]}):(0,A.jsxs)(A.Fragment,{children:[(0,A.jsx)(ee,{className:`w-3.5 h-3.5 mr-1.5`}),` Импортировать `,T?z:R.length,` записей в базу`]})})]})]}),o===4&&(0,A.jsxs)(`div`,{className:`text-center py-8 space-y-4 animate-fade-in`,children:[(0,A.jsx)(`div`,{className:`w-14 h-14 rounded-full bg-emerald-500/20 text-emerald-600 dark:text-emerald-400 flex items-center justify-center mx-auto`,children:(0,A.jsx)(f,{className:`w-8 h-8`})}),(0,A.jsxs)(`div`,{children:[(0,A.jsx)(`h3`,{className:`text-lg font-bold text-krona-primary`,children:`Импорт успешно завершен!`}),(0,A.jsxs)(`p`,{className:`text-xs text-krona-secondary max-w-md mx-auto mt-1`,children:[`В локальную базу данных IndexedDB успешно добавлено`,` `,(0,A.jsx)(`strong`,{className:`text-krona-primary font-semibold`,children:ue}),` записей`,` `,`(`,u===`contact`?`контактов`:`товаров`,`). Данные мгновенно доступны для использования во всех модулях платформы.`]})]}),(0,A.jsxs)(`div`,{className:`flex justify-center gap-2 pt-3`,children:[n&&(0,A.jsx)(r,{variant:`secondary`,size:`sm`,onClick:n,children:`Закрыть мастер`}),(0,A.jsx)(r,{variant:`primary`,size:`sm`,onClick:()=>{l(1),g(``),_(``),S([])},children:`Импортировать еще файл`})]})]})]})},P=[{key:`prospecting`,label:`Первичный контакт`,color:`border-sky-500/40`},{key:`discovery`,label:`Квалификация`,color:`border-indigo-500/40`},{key:`proposal`,label:`Предложение`,color:`border-amber-500/40`},{key:`negotiation`,label:`Переговоры`,color:`border-orange-500/40`},{key:`contract`,label:`Согласование`,color:`border-purple-500/40`},{key:`won`,label:`Выиграна`,color:`border-emerald-500/60 bg-emerald-500/5`},{key:`lost`,label:`Проиграна`,color:`border-rose-500/40 bg-rose-500/5`}],F=()=>{let t=re(),{showToast:n}=s(),{contacts:i,companies:o,leads:c,deals:d,createContact:f,createCompany:ee,createDeal:te,createLead:h,updateDeal:ae,convertLead:b,getTimeline:S,createActivity:se}=k(),{orders:D,createOrder:le}=T(),j=g(`contact`),M=g(`company`),N=g(`deal`),F=g(`lead`),[I,L]=(0,O.useState)(()=>{let e=t.pathname;return e.includes(`/crm/deals`)?`deals`:e.includes(`/crm/leads`)?`leads`:e.includes(`/crm/companies`)?`companies`:e.includes(`/crm/import`)?`import`:e.includes(`/crm/contacts`)||e===`/crm`?`contacts`:`deals`}),[R,z]=(0,O.useState)(``),[de,B]=(0,O.useState)(!1),[V,H]=(0,O.useState)(!1),[fe,U]=(0,O.useState)(!1),[pe,W]=(0,O.useState)(!1),[me,G]=(0,O.useState)(!1),[he,ge]=(0,O.useState)(null),[_e,ve]=(0,O.useState)(``),[ye,K]=(0,O.useState)(!1),[q,be]=(0,O.useState)(null),[xe,Se]=(0,O.useState)(``),[Ce,we]=(0,O.useState)(`wh_main`),[J,Y]=(0,O.useState)(null),[X,Te]=(0,O.useState)(null),[Z,Ee]=(0,O.useState)(`overview`),[De,Q]=(0,O.useState)([]),[Oe,ke]=(0,O.useState)(``),[Ae,je]=(0,O.useState)(`call`),[Me,Ne]=(0,O.useState)(null),[Pe,Fe]=(0,O.useState)(t.pathname);if(Pe!==t.pathname){Fe(t.pathname);let e=t.pathname;e.includes(`/crm/deals`)?L(`deals`):e.includes(`/crm/leads`)?L(`leads`):e.includes(`/crm/companies`)?L(`companies`):e.includes(`/crm/import`)?L(`import`):(e.includes(`/crm/contacts`)||e===`/crm`)&&L(`contacts`)}O.useEffect(()=>{let e=!0;return J?S(`contact`,J.id).then(t=>{e&&Q(t)}).catch(()=>{}):X&&S(`company`,X.id).then(t=>{e&&Q(t)}).catch(()=>{}),()=>{e=!1}},[J,X,S]);let Ie=async(e,t)=>{let r=d.find(t=>t.id===e);r&&(await ae(e,{stage:t}),n(`Сделка «${r.title}» переведена на этап: ${P.find(e=>e.key===t)?.label}`,`info`),t===`won`&&(be(r),Se(`Заказ по сделке: ${r.title}`),K(!0)))},Le=(e,t)=>{e.dataTransfer.setData(`text/plain`,t),Ne(t)},Re=e=>{e.preventDefault()},ze=async(e,t)=>{e.preventDefault();let n=e.dataTransfer.getData(`text/plain`)||Me;n&&await Ie(n,t),Ne(null)},Be=async()=>{if(q)try{let t=i.find(e=>e.id===q.contactId),r=o.find(e=>e.id===q.companyId),a=t?`${t.firstName} ${t.lastName}`:r?.name||`Клиент`,s=q.contactId||q.companyId||`cnt_default`,c=`ORD-${e().slice(-6)}`;await le({orderNumber:c,customerType:q.contactId?`contact`:`company`,customerId:s,customerName:a,status:`draft`,paymentStatus:`pending`,fulfillmentStatus:`unfulfilled`,items:[{id:`item_${e()}`,productId:`prd_coffee_beans`,sku:`COF-100`,name:q.title,quantity:1,unitPrice:q.amount,discountMinor:0,totalPrice:q.amount}],subtotal:q.amount,discountMinor:0,taxMinor:Math.round(q.amount.minor*.2),shippingMinor:0,total:q.amount,channel:`b2b`}),n(`Связанный Заказ ${c} успешно создан в Коммерции!`,`success`),K(!1),be(null)}catch(e){n(`Ошибка создания заказа: ${e instanceof Error?e.message:String(e)}`,`error`)}},Ve=async()=>{if(he)try{let e=await b(he.id,_e);n(`Лид конвертирован! Создана сделка «${e.deal.title}»`,`success`),G(!1),ge(null)}catch(e){n(`Ошибка конвертации: ${e instanceof Error?e.message:String(e)}`,`error`)}},He=async e=>{if(e.preventDefault(),!Oe)return;let t=J?`contact`:`company`,r=J?.id||X?.id||``;await se({targetEntityType:t,targetEntityId:r,type:Ae,title:Oe,completed:!1,dueDate:new Date(Date.now()+864e5).toISOString()}),ke(``),n(`Активность запланирована`,`success`),S(t,r).then(Q).catch(()=>{})},$=J?.id||X?.id||``,Ue=(0,O.useMemo)(()=>d.filter(e=>e.contactId===$||e.companyId===$),[d,$]),We=(0,O.useMemo)(()=>D.filter(e=>e.customerId===$),[D,$]);return(0,A.jsxs)(`div`,{className:`space-y-4 animate-fade-in`,children:[(0,A.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,A.jsxs)(`div`,{children:[(0,A.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,A.jsx)(`h1`,{className:`text-sm font-bold text-krona-primary`,children:`CRM: Клиенты, Воронка продаж & Сделки`}),(0,A.jsx)(x,{level:`pilot1`,size:`sm`})]}),(0,A.jsx)(`p`,{className:`text-xs text-krona-secondary mt-0.5`,children:`Сквозной процесс: Лид → Контакт/Компания → Сделка (Kanban) → Выиграна → Заказ в Коммерции`})]}),(0,A.jsxs)(`div`,{className:`flex items-center gap-1.5 overflow-x-auto text-xs`,children:[(0,A.jsxs)(`button`,{onClick:()=>L(`deals`),className:`px-3 py-1.5 rounded-lg font-medium transition-all ${I===`deals`?`bg-krona-green text-white shadow-sm`:`bg-krona-workspace text-krona-secondary hover:text-krona-primary border border-krona-border`}`,children:[`Воронка сделок (`,d.length,`)`]}),(0,A.jsxs)(`button`,{onClick:()=>L(`contacts`),className:`px-3 py-1.5 rounded-lg font-medium transition-all ${I===`contacts`?`bg-krona-green text-white shadow-sm`:`bg-krona-workspace text-krona-secondary hover:text-krona-primary border border-krona-border`}`,children:[`Контакты (`,i.length,`)`]}),(0,A.jsxs)(`button`,{onClick:()=>L(`companies`),className:`px-3 py-1.5 rounded-lg font-medium transition-all ${I===`companies`?`bg-krona-green text-white shadow-sm`:`bg-krona-workspace text-krona-secondary hover:text-krona-primary border border-krona-border`}`,children:[`Компании (`,o.length,`)`]}),(0,A.jsxs)(`button`,{onClick:()=>L(`leads`),className:`px-3 py-1.5 rounded-lg font-medium transition-all ${I===`leads`?`bg-krona-green text-white shadow-sm`:`bg-krona-workspace text-krona-secondary hover:text-krona-primary border border-krona-border`}`,children:[`Лиды (`,c.length,`)`]}),(0,A.jsxs)(`button`,{onClick:()=>L(`import`),className:`px-3 py-1.5 rounded-lg font-medium transition-all flex items-center gap-1 ${I===`import`?`bg-krona-green text-white shadow-sm`:`bg-krona-workspace text-krona-secondary hover:text-krona-primary border border-krona-border`}`,children:[(0,A.jsx)(ce,{className:`w-3.5 h-3.5`}),` Импорт CSV`]})]})]}),I===`deals`&&(0,A.jsxs)(`div`,{className:`space-y-3`,children:[(0,A.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,A.jsxs)(`div`,{className:`relative w-64`,children:[(0,A.jsx)(w,{className:`w-3.5 h-3.5 absolute left-2.5 top-2.5 text-krona-secondary`}),(0,A.jsx)(`input`,{type:`text`,value:R,onChange:e=>z(e.target.value),placeholder:`Поиск по сделкам...`,className:`w-full pl-8 pr-3 py-1.5 text-xs bg-krona-surface border border-krona-border rounded-lg text-krona-primary focus:outline-none focus:border-krona-green`})]}),(0,A.jsxs)(r,{variant:`primary`,size:`sm`,onClick:()=>U(!0),children:[(0,A.jsx)(C,{className:`w-3.5 h-3.5 mr-1`}),` Новая сделка`]})]}),(0,A.jsx)(`div`,{className:`grid grid-cols-1 md:grid-cols-4 lg:grid-cols-7 gap-2.5 overflow-x-auto pb-4`,children:P.map(e=>{let t=d.filter(t=>t.stage===e.key&&(t.title.toLowerCase().includes(R.toLowerCase())||!R)),n=t.reduce((e,t)=>e+t.amount.minor,0);return(0,A.jsxs)(`div`,{"data-testid":`kanban-column-${e.key}`,onDragOver:Re,onDrop:t=>ze(t,e.key),className:`bg-krona-surface/70 border rounded-xl p-2.5 flex flex-col min-w-[200px] max-h-[750px] shadow-krona-soft transition-all ${e.color}`,children:[(0,A.jsxs)(`div`,{className:`flex items-center justify-between border-b border-krona-border/60 pb-2 mb-2`,children:[(0,A.jsxs)(`div`,{children:[(0,A.jsx)(`div`,{className:`text-xs font-bold text-krona-primary`,children:e.label}),(0,A.jsx)(`div`,{className:`text-[11px] font-medium text-krona-green mt-0.5`,children:E(n)})]}),(0,A.jsx)(`span`,{className:`text-[11px] px-1.5 py-0.5 rounded-full bg-krona-workspace text-krona-secondary font-bold`,children:t.length})]}),(0,A.jsxs)(`div`,{className:`space-y-2 overflow-y-auto flex-1 pr-0.5`,children:[t.map(e=>{let t=i.find(t=>t.id===e.contactId),n=o.find(t=>t.id===e.companyId),r=P.findIndex(t=>t.key===e.stage)+1,a=P[r]?.key;return(0,A.jsxs)(`div`,{"data-testid":`deal-card-${e.id}`,"data-deal-id":e.id,"data-deal-stage":e.stage,draggable:!0,onDragStart:t=>Le(t,e.id),className:`bg-krona-workspace border border-krona-border hover:border-krona-green/60 p-2.5 rounded-lg text-xs space-y-2 shadow-xs cursor-grab active:cursor-grabbing transition-all`,children:[(0,A.jsx)(`div`,{className:`font-semibold text-krona-primary line-clamp-2`,children:e.title}),(0,A.jsxs)(`div`,{className:`flex items-center justify-between text-[11px]`,children:[(0,A.jsx)(`span`,{className:`font-bold text-krona-primary`,children:E(e.amount.minor)}),(0,A.jsxs)(`span`,{className:`px-1.5 py-0.2 bg-emerald-500/10 text-emerald-600 dark:text-emerald-400 rounded font-medium`,children:[e.probability,`% вер.`]})]}),(t||n)&&(0,A.jsxs)(`div`,{className:`text-[11px] text-krona-secondary truncate flex items-center gap-1`,children:[(0,A.jsx)(u,{className:`w-3 h-3`}),n?.name||`${t?.firstName} ${t?.lastName}`]}),a&&e.stage!==`won`&&e.stage!==`lost`&&(0,A.jsxs)(`button`,{type:`button`,onClick:()=>Ie(e.id,a),className:`w-full mt-1 py-1 text-[11px] bg-krona-surface hover:bg-krona-green/10 text-krona-secondary hover:text-krona-green border border-krona-border rounded flex items-center justify-center gap-1 transition-colors`,children:[`Далее: `,P[r]?.label,` `,(0,A.jsx)(ne,{className:`w-3 h-3`})]})]},e.id)}),t.length===0&&(0,A.jsx)(`div`,{className:`text-center py-6 text-[11px] text-krona-secondary italic`,children:`Пусто`})]})]},e.key)})})]}),I===`contacts`&&(0,A.jsxs)(`div`,{className:`space-y-3`,children:[(0,A.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,A.jsxs)(`div`,{className:`relative w-64`,children:[(0,A.jsx)(w,{className:`w-3.5 h-3.5 absolute left-2.5 top-2.5 text-krona-secondary`}),(0,A.jsx)(`input`,{type:`text`,value:R,onChange:e=>z(e.target.value),placeholder:`Поиск по имени, телефону, email...`,className:`w-full pl-8 pr-3 py-1.5 text-xs bg-krona-surface border border-krona-border rounded-lg text-krona-primary focus:outline-none focus:border-krona-green`})]}),(0,A.jsxs)(r,{variant:`primary`,size:`sm`,onClick:()=>B(!0),children:[(0,A.jsx)(C,{className:`w-3.5 h-3.5 mr-1`}),` Новый контакт`]})]}),(0,A.jsx)(`div`,{className:`bg-krona-surface border border-krona-border rounded-xl shadow-krona-soft overflow-hidden`,children:(0,A.jsxs)(`table`,{className:`w-full text-xs text-left`,children:[(0,A.jsx)(`thead`,{className:`bg-krona-workspace text-krona-secondary border-b border-krona-border`,children:(0,A.jsxs)(`tr`,{children:[(0,A.jsx)(`th`,{className:`p-3 font-semibold`,children:`ФИО / Контакт`}),(0,A.jsx)(`th`,{className:`p-3 font-semibold`,children:`Компания`}),(0,A.jsx)(`th`,{className:`p-3 font-semibold`,children:`Телефон`}),(0,A.jsx)(`th`,{className:`p-3 font-semibold`,children:`Email`}),(0,A.jsx)(`th`,{className:`p-3 font-semibold`,children:`Роли`}),(0,A.jsx)(`th`,{className:`p-3 font-semibold text-right`,children:`Действие`})]})}),(0,A.jsx)(`tbody`,{className:`divide-y divide-krona-border`,children:i.filter(e=>`${e.firstName} ${e.lastName}`.toLowerCase().includes(R.toLowerCase())||e.phone?.includes(R)||e.email?.toLowerCase().includes(R.toLowerCase())).map(e=>{let t=o.find(t=>t.id===e.companyId);return(0,A.jsxs)(`tr`,{onClick:()=>{Y(e),Te(null)},className:`hover:bg-krona-workspace/50 cursor-pointer transition-colors`,children:[(0,A.jsx)(`td`,{className:`p-3 font-medium text-krona-primary`,children:(0,A.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,A.jsxs)(`div`,{className:`w-7 h-7 rounded-full bg-krona-green/10 text-krona-green flex items-center justify-center font-bold text-xs`,children:[e.firstName[0],e.lastName?.[0]]}),(0,A.jsxs)(`div`,{children:[(0,A.jsxs)(`div`,{children:[e.firstName,` `,e.lastName]}),e.jobTitle&&(0,A.jsx)(`div`,{className:`text-[11px] text-krona-secondary`,children:e.jobTitle})]})]})}),(0,A.jsx)(`td`,{className:`p-3 text-krona-secondary`,children:t?.name||`—`}),(0,A.jsx)(`td`,{className:`p-3 font-mono text-krona-secondary`,children:e.phone||`—`}),(0,A.jsx)(`td`,{className:`p-3 text-krona-secondary`,children:e.email||`—`}),(0,A.jsx)(`td`,{className:`p-3`,children:(0,A.jsx)(`div`,{className:`flex gap-1`,children:e.roles?.map(e=>(0,A.jsx)(a,{variant:`gold`,size:`sm`,children:e},e))})}),(0,A.jsx)(`td`,{className:`p-3 text-right`,children:(0,A.jsxs)(r,{variant:`ghost`,size:`sm`,children:[`Карточка 360 `,(0,A.jsx)(p,{className:`w-3.5 h-3.5 ml-1`})]})})]},e.id)})})]})})]}),I===`companies`&&(0,A.jsxs)(`div`,{className:`space-y-3`,children:[(0,A.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,A.jsxs)(`div`,{className:`relative w-64`,children:[(0,A.jsx)(w,{className:`w-3.5 h-3.5 absolute left-2.5 top-2.5 text-krona-secondary`}),(0,A.jsx)(`input`,{type:`text`,value:R,onChange:e=>z(e.target.value),placeholder:`Поиск по названию, ИНН...`,className:`w-full pl-8 pr-3 py-1.5 text-xs bg-krona-surface border border-krona-border rounded-lg text-krona-primary focus:outline-none focus:border-krona-green`})]}),(0,A.jsxs)(r,{variant:`primary`,size:`sm`,onClick:()=>H(!0),children:[(0,A.jsx)(C,{className:`w-3.5 h-3.5 mr-1`}),` Новая компания`]})]}),(0,A.jsx)(`div`,{className:`bg-krona-surface border border-krona-border rounded-xl shadow-krona-soft overflow-hidden`,children:(0,A.jsxs)(`table`,{className:`w-full text-xs text-left`,children:[(0,A.jsx)(`thead`,{className:`bg-krona-workspace text-krona-secondary border-b border-krona-border`,children:(0,A.jsxs)(`tr`,{children:[(0,A.jsx)(`th`,{className:`p-3 font-semibold`,children:`Название компании`}),(0,A.jsx)(`th`,{className:`p-3 font-semibold`,children:`ИНН`}),(0,A.jsx)(`th`,{className:`p-3 font-semibold`,children:`Город`}),(0,A.jsx)(`th`,{className:`p-3 font-semibold`,children:`Телефон`}),(0,A.jsx)(`th`,{className:`p-3 font-semibold`,children:`Роли`}),(0,A.jsx)(`th`,{className:`p-3 font-semibold text-right`,children:`Действие`})]})}),(0,A.jsx)(`tbody`,{className:`divide-y divide-krona-border`,children:o.filter(e=>e.name.toLowerCase().includes(R.toLowerCase())||e.inn?.includes(R)||e.address?.toLowerCase().includes(R.toLowerCase())).map(e=>(0,A.jsxs)(`tr`,{onClick:()=>{Te(e),Y(null)},className:`hover:bg-krona-workspace/50 cursor-pointer transition-colors`,children:[(0,A.jsx)(`td`,{className:`p-3 font-medium text-krona-primary`,children:(0,A.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,A.jsx)(u,{className:`w-4 h-4 text-krona-secondary`}),(0,A.jsxs)(`div`,{children:[(0,A.jsx)(`div`,{className:`font-bold`,children:e.name}),e.legalName&&(0,A.jsx)(`div`,{className:`text-[11px] text-krona-secondary`,children:e.legalName})]})]})}),(0,A.jsx)(`td`,{className:`p-3 font-mono text-krona-secondary`,children:e.inn||`—`}),(0,A.jsx)(`td`,{className:`p-3 text-krona-secondary`,children:e.address||`—`}),(0,A.jsx)(`td`,{className:`p-3 font-mono text-krona-secondary`,children:e.phone||`—`}),(0,A.jsx)(`td`,{className:`p-3`,children:(0,A.jsx)(`div`,{className:`flex gap-1`,children:e.roles?.map(e=>(0,A.jsx)(a,{variant:`gold`,size:`sm`,children:e},e))})}),(0,A.jsx)(`td`,{className:`p-3 text-right`,children:(0,A.jsxs)(r,{variant:`ghost`,size:`sm`,children:[`Карточка 360 `,(0,A.jsx)(p,{className:`w-3.5 h-3.5 ml-1`})]})})]},e.id))})]})})]}),I===`leads`&&(0,A.jsxs)(`div`,{className:`space-y-3`,children:[(0,A.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,A.jsxs)(`div`,{className:`relative w-64`,children:[(0,A.jsx)(w,{className:`w-3.5 h-3.5 absolute left-2.5 top-2.5 text-krona-secondary`}),(0,A.jsx)(`input`,{type:`text`,value:R,onChange:e=>z(e.target.value),placeholder:`Поиск лидов...`,className:`w-full pl-8 pr-3 py-1.5 text-xs bg-krona-surface border border-krona-border rounded-lg text-krona-primary focus:outline-none focus:border-krona-green`})]}),(0,A.jsxs)(r,{variant:`primary`,size:`sm`,"data-testid":`new-lead-btn`,onClick:()=>W(!0),children:[(0,A.jsx)(C,{className:`w-3.5 h-3.5 mr-1`}),` Новый лид`]})]}),(0,A.jsx)(`div`,{className:`bg-krona-surface border border-krona-border rounded-xl shadow-krona-soft overflow-hidden`,children:(0,A.jsxs)(`table`,{className:`w-full text-xs text-left`,children:[(0,A.jsx)(`thead`,{className:`bg-krona-workspace text-krona-secondary border-b border-krona-border`,children:(0,A.jsxs)(`tr`,{children:[(0,A.jsx)(`th`,{className:`p-3 font-semibold`,children:`Название лида`}),(0,A.jsx)(`th`,{className:`p-3 font-semibold`,children:`Контактное лицо`}),(0,A.jsx)(`th`,{className:`p-3 font-semibold`,children:`Контакты`}),(0,A.jsx)(`th`,{className:`p-3 font-semibold`,children:`Оценка бюджета`}),(0,A.jsx)(`th`,{className:`p-3 font-semibold`,children:`Статус`}),(0,A.jsx)(`th`,{className:`p-3 font-semibold text-right`,children:`Конвертация`})]})}),(0,A.jsx)(`tbody`,{className:`divide-y divide-krona-border`,children:c.map(e=>(0,A.jsxs)(`tr`,{className:`hover:bg-krona-workspace/50 transition-colors`,children:[(0,A.jsx)(`td`,{className:`p-3 font-bold text-krona-primary`,children:e.title}),(0,A.jsx)(`td`,{className:`p-3 font-medium text-krona-primary`,children:e.contactName}),(0,A.jsxs)(`td`,{className:`p-3 text-krona-secondary`,children:[(0,A.jsx)(`div`,{children:e.phone}),(0,A.jsx)(`div`,{className:`text-[11px]`,children:e.email})]}),(0,A.jsx)(`td`,{className:`p-3 font-bold text-krona-green`,children:e.estimatedValue?E(e.estimatedValue.minor):`—`}),(0,A.jsx)(`td`,{className:`p-3`,children:(0,A.jsx)(a,{variant:e.status===`converted`?`green`:e.status===`disqualified`?`danger`:`warning`,size:`sm`,children:e.status===`converted`?`Конвертирован`:e.status===`new`?`Новый`:e.status})}),(0,A.jsx)(`td`,{className:`p-3 text-right`,children:e.status===`converted`?(0,A.jsxs)(`span`,{className:`text-emerald-600 dark:text-emerald-400 text-xs font-semibold flex items-center justify-end gap-1`,children:[(0,A.jsx)(m,{className:`w-3.5 h-3.5`}),` Сделка создана`]}):(0,A.jsxs)(r,{variant:`primary`,size:`sm`,"data-testid":`convert-lead-btn`,onClick:()=>{ge(e),ve(`Сделка: ${e.title}`),G(!0)},children:[(0,A.jsx)(v,{className:`w-3.5 h-3.5 mr-1`}),` Конвертировать в сделку`]})})]},e.id))})]})})]}),I===`import`&&(0,A.jsx)(ue,{initialEntityType:`contact`}),(0,A.jsx)(_,{isOpen:!!(J||X),onClose:()=>{Y(null),Te(null),Q([])},title:J?`${J.firstName} ${J.lastName} (Customer 360)`:`${X?.name} (Company 360)`,size:`lg`,children:(0,A.jsxs)(`div`,{className:`space-y-4`,children:[(0,A.jsx)(`div`,{className:`flex border-b border-krona-border text-xs`,children:[`overview`,`deals`,`orders`,`activities`,`timeline`].map(e=>(0,A.jsxs)(`button`,{onClick:()=>Ee(e),className:`px-3.5 py-2 font-semibold capitalize transition-colors border-b-2 ${Z===e?`border-krona-green text-krona-green`:`border-transparent text-krona-secondary hover:text-krona-primary`}`,children:[e===`overview`&&`Обзор`,e===`deals`&&`Сделки (${Ue.length})`,e===`orders`&&`Заказы (${We.length})`,e===`activities`&&`Задачи & Звонки`,e===`timeline`&&`Таймлайн (${De.length})`]},e))}),Z===`overview`&&(0,A.jsxs)(`div`,{className:`space-y-3 text-xs`,children:[(0,A.jsxs)(`div`,{className:`grid grid-cols-2 gap-3 bg-krona-workspace p-3.5 rounded-lg border border-krona-border`,children:[J&&(0,A.jsxs)(A.Fragment,{children:[(0,A.jsxs)(`div`,{children:[(0,A.jsx)(`span`,{className:`text-krona-secondary`,children:`ФИО:`}),` `,(0,A.jsxs)(`strong`,{className:`text-krona-primary`,children:[J.firstName,` `,J.lastName]})]}),(0,A.jsxs)(`div`,{children:[(0,A.jsx)(`span`,{className:`text-krona-secondary`,children:`Телефон:`}),` `,(0,A.jsx)(`strong`,{className:`text-krona-primary`,children:J.phone||`—`})]}),(0,A.jsxs)(`div`,{children:[(0,A.jsx)(`span`,{className:`text-krona-secondary`,children:`Email:`}),` `,(0,A.jsx)(`strong`,{className:`text-krona-primary`,children:J.email||`—`})]}),(0,A.jsxs)(`div`,{children:[(0,A.jsx)(`span`,{className:`text-krona-secondary`,children:`Должность:`}),` `,(0,A.jsx)(`strong`,{className:`text-krona-primary`,children:J.jobTitle||`—`})]})]}),X&&(0,A.jsxs)(A.Fragment,{children:[(0,A.jsxs)(`div`,{children:[(0,A.jsx)(`span`,{className:`text-krona-secondary`,children:`Название:`}),` `,(0,A.jsx)(`strong`,{className:`text-krona-primary`,children:X.name})]}),(0,A.jsxs)(`div`,{children:[(0,A.jsx)(`span`,{className:`text-krona-secondary`,children:`ИНН:`}),` `,(0,A.jsx)(`strong`,{className:`text-krona-primary`,children:X.inn||`—`})]}),(0,A.jsxs)(`div`,{children:[(0,A.jsx)(`span`,{className:`text-krona-secondary`,children:`Адрес:`}),` `,(0,A.jsx)(`strong`,{className:`text-krona-primary`,children:X.address||`—`})]}),(0,A.jsxs)(`div`,{children:[(0,A.jsx)(`span`,{className:`text-krona-secondary`,children:`Телефон:`}),` `,(0,A.jsx)(`strong`,{className:`text-krona-primary`,children:X.phone||`—`})]})]})]}),(0,A.jsxs)(`div`,{className:`p-3 bg-krona-workspace/40 rounded-lg border border-krona-border`,children:[(0,A.jsx)(`div`,{className:`font-semibold text-krona-primary mb-1`,children:`Кастомные атрибуты (Схема Krona Studio):`}),J?.customFields&&Object.keys(J.customFields).length>0||X?.customFields&&Object.keys(X.customFields).length>0?(0,A.jsx)(`div`,{className:`grid grid-cols-2 gap-2 mt-2`,children:Object.entries(J?.customFields||X?.customFields).map(([e,t])=>(0,A.jsxs)(`div`,{className:`text-xs`,children:[(0,A.jsxs)(`span`,{className:`text-krona-secondary`,children:[e,`:`]}),` `,(0,A.jsx)(`strong`,{className:`text-krona-primary`,children:String(t)})]},e))}):(0,A.jsx)(`p`,{className:`text-krona-secondary text-[11px]`,children:`Дополнительные поля из Конструктора полей отображаются здесь в реальном времени.`})]})]}),Z===`deals`&&(0,A.jsxs)(`div`,{className:`space-y-2`,children:[Ue.map(e=>(0,A.jsxs)(`div`,{className:`p-3 rounded-lg border border-krona-border bg-krona-workspace flex items-center justify-between text-xs`,children:[(0,A.jsxs)(`div`,{children:[(0,A.jsx)(`div`,{className:`font-bold text-krona-primary`,children:e.title}),(0,A.jsxs)(`div`,{className:`text-[11px] text-krona-secondary`,children:[`Этап:`,` `,(0,A.jsx)(`span`,{className:`font-semibold`,children:P.find(t=>t.key===e.stage)?.label})]})]}),(0,A.jsxs)(`div`,{className:`text-right`,children:[(0,A.jsx)(`div`,{className:`font-bold text-krona-green`,children:E(e.amount.minor)}),(0,A.jsxs)(`div`,{className:`text-[11px] text-krona-secondary`,children:[e.probability,`% вер.`]})]})]},e.id)),Ue.length===0&&(0,A.jsx)(`div`,{className:`text-center py-6 text-krona-secondary text-xs italic`,children:`Нет связанных сделок`})]}),Z===`orders`&&(0,A.jsxs)(`div`,{className:`space-y-2`,children:[We.map(e=>(0,A.jsxs)(`div`,{className:`p-3 rounded-lg border border-krona-border bg-krona-workspace flex items-center justify-between text-xs`,children:[(0,A.jsxs)(`div`,{children:[(0,A.jsx)(`div`,{className:`font-bold font-mono text-krona-primary`,children:e.orderNumber}),(0,A.jsxs)(`div`,{className:`text-[11px] text-krona-secondary`,children:[e.items.length,` поз. • Статус: `,e.status]})]}),(0,A.jsxs)(`div`,{className:`text-right`,children:[(0,A.jsx)(`div`,{className:`font-bold text-krona-green`,children:E(e.total.minor)}),(0,A.jsx)(a,{variant:e.paymentStatus===`paid`?`green`:`warning`,size:`sm`,children:e.paymentStatus})]})]},e.id)),We.length===0&&(0,A.jsx)(`div`,{className:`text-center py-6 text-krona-secondary text-xs italic`,children:`Нет связанных заказов`})]}),Z===`activities`&&(0,A.jsx)(`div`,{className:`space-y-3`,children:(0,A.jsxs)(`form`,{onSubmit:He,className:`p-3 bg-krona-workspace rounded-lg border border-krona-border space-y-2`,children:[(0,A.jsx)(`div`,{className:`text-xs font-semibold text-krona-primary`,children:`Запланировать активность:`}),(0,A.jsxs)(`div`,{className:`flex gap-2`,children:[(0,A.jsxs)(`select`,{value:Ae,onChange:e=>je(e.target.value),className:`px-2.5 py-1 text-xs bg-krona-surface border border-krona-border rounded-md text-krona-primary`,children:[(0,A.jsx)(`option`,{value:`call`,children:`Звонок`}),(0,A.jsx)(`option`,{value:`meeting`,children:`Встреча`}),(0,A.jsx)(`option`,{value:`task`,children:`Задача`}),(0,A.jsx)(`option`,{value:`email`,children:`Email`})]}),(0,A.jsx)(`input`,{type:`text`,value:Oe,onChange:e=>ke(e.target.value),placeholder:`Например: Обсудить коммерческое предложение...`,className:`flex-1 px-3 py-1 text-xs bg-krona-surface border border-krona-border rounded-md text-krona-primary`}),(0,A.jsx)(r,{type:`submit`,variant:`primary`,size:`sm`,children:`Добавить`})]})]})}),Z===`timeline`&&(0,A.jsxs)(`div`,{className:`space-y-2.5 max-h-96 overflow-y-auto pr-1`,children:[De.map(e=>(0,A.jsxs)(`div`,{className:`p-3 rounded-lg border border-krona-border bg-krona-workspace text-xs space-y-1`,children:[(0,A.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,A.jsx)(`span`,{className:`font-bold text-krona-primary`,children:e.title}),(0,A.jsx)(`span`,{className:`text-[10px] text-krona-secondary`,children:oe(e.timestamp)})]}),e.description&&(0,A.jsx)(`p`,{className:`text-krona-secondary text-[11px]`,children:e.description}),(0,A.jsxs)(`div`,{className:`text-[10px] text-krona-green font-medium`,children:[`Автор: `,e.actor]})]},e.id)),De.length===0&&(0,A.jsx)(`div`,{className:`text-center py-6 text-krona-secondary text-xs italic`,children:`Таймлайн пуст`})]})]})}),(0,A.jsx)(y,{isOpen:ye,onClose:()=>K(!1),title:`Сделка выиграна! Создать заказ в Коммерции?`,size:`md`,children:(0,A.jsxs)(`div`,{className:`space-y-4 text-xs`,children:[(0,A.jsxs)(`div`,{className:`p-3 bg-emerald-500/10 border border-emerald-500/30 rounded-lg text-emerald-800 dark:text-emerald-300`,children:[(0,A.jsx)(`strong`,{children:`Поздравляем с успехом!`}),` Сделка «`,q?.title,`» переведена в статус «Выиграна». Система предлагает автоматически сформировать коммерческий Заказ.`]}),(0,A.jsxs)(`div`,{className:`space-y-3`,children:[(0,A.jsxs)(`div`,{children:[(0,A.jsx)(`label`,{className:`block font-semibold text-krona-primary mb-1`,children:`Наименование заказа:`}),(0,A.jsx)(`input`,{type:`text`,value:xe,onChange:e=>Se(e.target.value),className:`w-full px-3 py-1.5 bg-krona-workspace border border-krona-border rounded-lg text-krona-primary`})]}),(0,A.jsxs)(`div`,{children:[(0,A.jsx)(`label`,{className:`block font-semibold text-krona-primary mb-1`,children:`Сумма заказа (RUB):`}),(0,A.jsx)(`div`,{className:`font-bold text-sm text-krona-green py-1`,children:q?E(q.amount.minor):`0 ₽`})]}),(0,A.jsxs)(`div`,{children:[(0,A.jsx)(`label`,{className:`block font-semibold text-krona-primary mb-1`,children:`Склад отгрузки:`}),(0,A.jsxs)(`select`,{value:Ce,onChange:e=>we(e.target.value),className:`w-full px-3 py-1.5 bg-krona-workspace border border-krona-border rounded-lg text-krona-primary`,children:[(0,A.jsx)(`option`,{value:`wh_main`,children:`Основной распределительный склад (Москва)`}),(0,A.jsx)(`option`,{value:`wh_spb`,children:`Склад Санкт-Петербург`})]})]})]}),(0,A.jsxs)(`div`,{className:`flex justify-end gap-2 pt-2 border-t border-krona-border`,children:[(0,A.jsx)(r,{variant:`secondary`,size:`sm`,onClick:()=>K(!1),children:`Не создавать сейчас`}),(0,A.jsxs)(r,{variant:`primary`,size:`sm`,"data-testid":`create-order-confirm-btn`,onClick:Be,children:[(0,A.jsx)(ie,{className:`w-3.5 h-3.5 mr-1`}),` Создать заказ в Коммерции`]})]})]})}),(0,A.jsx)(y,{isOpen:me,onClose:()=>G(!1),title:`Конвертация лида в сделку и контакт`,size:`md`,children:(0,A.jsxs)(`div`,{className:`space-y-4 text-xs`,children:[(0,A.jsx)(`p`,{className:`text-krona-secondary`,children:`При конвертации будет автоматически создан Контакт клиента и новая Сделка на этапе «Предложение».`}),(0,A.jsxs)(`div`,{children:[(0,A.jsx)(`label`,{className:`block font-semibold text-krona-primary mb-1`,children:`Название новой сделки:`}),(0,A.jsx)(`input`,{type:`text`,value:_e,onChange:e=>ve(e.target.value),className:`w-full px-3 py-1.5 bg-krona-workspace border border-krona-border rounded-lg text-krona-primary`})]}),(0,A.jsxs)(`div`,{className:`flex justify-end gap-2 pt-2 border-t border-krona-border`,children:[(0,A.jsx)(r,{variant:`secondary`,size:`sm`,onClick:()=>G(!1),children:`Отмена`}),(0,A.jsx)(r,{variant:`primary`,size:`sm`,"data-testid":`confirm-convert-lead-btn`,onClick:Ve,children:`Подтвердить конвертацию`})]})]})}),(0,A.jsx)(y,{isOpen:pe,onClose:()=>W(!1),title:`Создание нового лида`,size:`lg`,children:F.currentEntity?(0,A.jsx)(l,{entity:F.currentEntity,layout:F.layouts?.[0]||null,mode:`create`,onSave:async e=>{await h({title:String(e.title||`Новый лид`),contactName:String(e.contactName||e.title||`Контактное лицо`),phone:String(e.phone||`+7 (999) 000-00-00`),email:String(e.email||`lead@example.com`),companyName:String(e.companyName||``),status:`new`,source:`website`,estimatedValue:e.estimatedValue?{minor:Number(e.estimatedValue)||1e6,currency:`RUB`}:{minor:15e5,currency:`RUB`},customFields:e}),W(!1),n(`Лид успешно создан!`,`success`)},onCancel:()=>W(!1)}):(0,A.jsx)(`div`,{className:`p-4 text-center text-krona-secondary`,children:`Загрузка схемы...`})}),(0,A.jsx)(y,{isOpen:de,onClose:()=>B(!1),title:`Создание нового контакта`,size:`lg`,children:j.currentEntity?(0,A.jsx)(l,{entity:j.currentEntity,layout:j.layouts?.[0]||null,mode:`create`,onSave:async e=>{await f({firstName:String(e.firstName||`Новый`),lastName:String(e.lastName||`Контакт`),phone:String(e.phone||``),email:String(e.email||``),jobTitle:String(e.jobTitle||``),roles:[`client`],status:`active`,customFields:e}),B(!1),n(`Контакт успешно создан!`,`success`)},onCancel:()=>B(!1)}):(0,A.jsx)(`div`,{className:`p-4 text-center text-krona-secondary`,children:`Загрузка схемы...`})}),(0,A.jsx)(y,{isOpen:V,onClose:()=>H(!1),title:`Создание новой компании`,size:`lg`,children:M.currentEntity?(0,A.jsx)(l,{entity:M.currentEntity,layout:M.layouts?.[0]||null,mode:`create`,onSave:async e=>{await ee({name:String(e.name||`Новая компания`),inn:String(e.inn||``),address:String(e.city||e.address||`г. Москва`),phone:String(e.phone||``),roles:[`client`],status:`active`,customFields:e}),H(!1),n(`Компания успешно создана!`,`success`)},onCancel:()=>H(!1)}):(0,A.jsx)(`div`,{className:`p-4 text-center text-krona-secondary`,children:`Загрузка схемы...`})}),(0,A.jsx)(y,{isOpen:fe,onClose:()=>U(!1),title:`Создание новой сделки`,size:`lg`,children:N.currentEntity?(0,A.jsx)(l,{entity:N.currentEntity,layout:N.layouts?.[0]||null,mode:`create`,onSave:async e=>{let t=typeof e.amount==`number`?e.amount:5e6;await te({title:String(e.title||`Новая сделка`),pipelineId:`pipe_default`,stage:`prospecting`,amount:{minor:t,currency:`RUB`},probability:20,contactId:i[0]?.id,companyId:o[0]?.id,customFields:e}),U(!1),n(`Сделка успешно создана в воронке!`,`success`)},onCancel:()=>U(!1)}):(0,A.jsx)(`div`,{className:`p-4 text-center text-krona-secondary`,children:`Загрузка схемы...`})})]})};export{F as CrmModule}; \ No newline at end of file diff --git a/dist/assets/CrmModule-l7PoMLhA.js b/dist/assets/CrmModule-l7PoMLhA.js new file mode 100644 index 0000000..6e0b935 --- /dev/null +++ b/dist/assets/CrmModule-l7PoMLhA.js @@ -0,0 +1,12 @@ +import{d as e,f as t,h as n,i as r,l as i,r as a,s as o,t as s,u as c}from"./useToast-CS8pZhce.js";import{t as l}from"./DynamicFormRenderer-0ioSXYKX.js";import{t as u}from"./building-BdUpGLM5.js";import{t as d}from"./file-text-DR21jZDS.js";import{$ as f,H as p,K as ee,L as te,Q as ne,S as re,T as m,U as ie,W as ae,_ as h,at as g,b as _,it as v,lt as y,m as b,n as oe,nt as x,pt as S,r as C,rt as w,t as T}from"./index-CrJKtV0u.js";import{t as E}from"./useOrders-TRZWcao8.js";import{t as D}from"./currency-DdDs82F5.js";var O={name:`cloud-upload`,size:24,node:[[`path`,{d:`M12 13v8`,key:`1l5pq0`}],[`path`,{d:`M4 14.899A7 7 0 1 1 15.71 8h1.79a4.5 4.5 0 0 1 2.5 8.242`,key:`1pljnt`}],[`path`,{d:`m8 17 4-4 4 4`,key:`1quai1`}]],aliases:[`upload-cloud`]};O.node;var se=i(O),k=n(t(),1);function A(){let[e,t]=(0,k.useState)([]),[n,r]=(0,k.useState)([]),[i,a]=(0,k.useState)([]),[o,s]=(0,k.useState)([]),[c,l]=(0,k.useState)(!0),[u,d]=(0,k.useState)(null),f=(0,k.useCallback)(async()=>{try{l(!0),d(null);let[e,n,i,o]=await Promise.all([g.contacts.list({pageSize:100}),g.companies.list({pageSize:100}),g.leads.list({pageSize:100}),g.deals.list({pageSize:100})]);t(e.items),r(n.items),a(i.items),s(o.items)}catch(e){d(e instanceof Error?e:Error(String(e)))}finally{l(!1)}},[]);return(0,k.useEffect)(()=>{let e=!0;return Promise.resolve().then(()=>{e&&f()}),()=>{e=!1}},[f]),w(`records:changed`,e=>{(e.entityType===`contact`||e.entityType===`company`||e.entityType===`lead`||e.entityType===`deal`)&&f()}),w(`storage:reset`,f),w(`snapshot:imported`,f),{contacts:e,companies:n,leads:i,deals:o,loading:c,error:u,refetch:f,createContact:(0,k.useCallback)(async e=>g.contacts.create(e),[]),updateContact:(0,k.useCallback)(async(e,t)=>g.contacts.update(e,t),[]),deleteContact:(0,k.useCallback)(async e=>g.contacts.delete(e),[]),createCompany:(0,k.useCallback)(async e=>g.companies.create(e),[]),updateCompany:(0,k.useCallback)(async(e,t)=>g.companies.update(e,t),[]),deleteCompany:(0,k.useCallback)(async e=>g.companies.delete(e),[]),createDeal:(0,k.useCallback)(async e=>g.deals.create(e),[]),updateDeal:(0,k.useCallback)(async(e,t)=>g.deals.update(e,t),[]),deleteDeal:(0,k.useCallback)(async e=>g.deals.delete(e),[]),createLead:(0,k.useCallback)(async e=>g.leads.create(e),[]),updateLead:(0,k.useCallback)(async(e,t)=>g.leads.update(e,t),[]),deleteLead:(0,k.useCallback)(async e=>g.leads.delete(e),[]),convertLead:(0,k.useCallback)(async(e,t)=>g.convertLeadToDeal(e,t),[]),getTimeline:(0,k.useCallback)(async(e,t)=>g.getTimeline(e,t),[]),createActivity:(0,k.useCallback)(async e=>g.activities.create(e),[]),createNote:(0,k.useCallback)(async e=>g.notes.create(e),[])}}var j=o(),ce=`Имя,Фамилия,Телефон,Email,Компания,Должность +Владимир,Ковалев,+7 (916) 123-45-67,kovalev@partner.ru,ООО «СеверТорг»,Коммерческий директор +Елена,Васильева,+7 (903) 987-65-43,elena.v@iceberg.ru,ГК «Айсберг Логистик»,Руководитель закупок +Дмитрий,Смирнов,,dmitry@corp.ru,,Менеджер +Иван,,+7 (999) 888-77-66,invalid-email-address,ИП «Михайлов»,Инженер +Анна,Кузнецова,+7 (926) 111-22-33,anna.k@beautyshop.ru,ООО «Бьюти Групп»,Директор по маркетингу`,M=`Артикул,Наименование,Категория,Цена (коп),Единица +COF-ETH-01,Кофе зерновой Эфиопия Иргачефф 1кг,Кофе,185000,уп +COF-BRZ-02,Кофе зерновой Бразилия Сантос 1кг,Кофе,145000,уп +SYR-VAN-01,Сироп Ваниль 1000мл,Сиропы,65000,бут +,,Расходники,25000,уп +CUP-PAP-300,Стакан бумажный 300мл 50шт,Упаковка,-5000,уп +TEA-SEN-01,Чай зеленый Сенча 500г,Чай,95000,уп`,N=[{key:`firstName`,label:`Имя`,required:!0},{key:`lastName`,label:`Фамилия`,required:!0},{key:`phone`,label:`Телефон`,required:!1},{key:`email`,label:`Email`,required:!1},{key:`companyName`,label:`Компания`,required:!1},{key:`jobTitle`,label:`Должность`,required:!1}],P=[{key:`sku`,label:`Артикул (SKU)`,required:!0},{key:`name`,label:`Наименование`,required:!0},{key:`category`,label:`Категория`,required:!1},{key:`price`,label:`Цена (копейки)`,required:!0},{key:`unit`,label:`Единица измерения`,required:!1}],le=({initialEntityType:e=`contact`,onComplete:t,onClose:n})=>{let{showToast:i}=s(),[o,l]=(0,k.useState)(1),[u,m]=(0,k.useState)(e),[ae,h]=(0,k.useState)(``),[_,y]=(0,k.useState)(``),[oe,x]=(0,k.useState)([]),[S,C]=(0,k.useState)([]),[w,T]=(0,k.useState)({}),[E,D]=(0,k.useState)(!0),[O,A]=(0,k.useState)(!1),[le,F]=(0,k.useState)(0),I=e=>{let t=e.trim().split(/\r?\n/).filter(Boolean);if(t.length<2)return;let n=e=>{let t=[],n=``,r=!1;for(let i=0;i{o[e]=a[t]||``}),i.push(o)}x(r),C(i);let a={},o=u===`contact`?N:P;r.forEach(e=>{let t=e.toLowerCase(),n=o.find(e=>{let n=e.label.toLowerCase();return t===e.key.toLowerCase()||t===n||t.includes(n)||n.includes(t)});n?a[e]=n.key:a[e]=``}),T(a)},L=e=>{m(e);let t=e===`contact`?ce:M;h(t),y(`образец_${e===`contact`?`контактов`:`товаров`}.csv`),I(t),l(2)},R=e=>{let t=e.target.files?.[0];if(!t)return;y(t.name);let n=new FileReader;n.onload=e=>{let t=e.target?.result;h(t),I(t),l(2)},n.readAsText(t)},z=S.map((e,t)=>{let n={};Object.entries(w).forEach(([t,r])=>{r&&(n[r]=e[t]||``)});let r=[];if(u===`contact`)n.firstName?.trim()||r.push(`Имя обязательно`),n.lastName?.trim()||r.push(`Фамилия обязательна`),n.email&&!/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(n.email)&&r.push(`Некорректный email: "${n.email}"`);else if(n.sku?.trim()||r.push(`Артикул (SKU) обязателен`),n.name?.trim()||r.push(`Наименование обязательно`),n.price){let e=Number(n.price);(isNaN(e)||e<=0)&&r.push(`Цена должна быть положительным числом: "${n.price}"`)}else r.push(`Цена обязательна`);return{rowIndex:t+1,raw:e,mapped:n,isValid:r.length===0,errors:r}}),B=z.filter(e=>e.isValid).length,ue=z.filter(e=>!e.isValid).length,V=async()=>{A(!0);try{let e=E?z.filter(e=>e.isValid):z,n=0;if(u===`contact`)for(let t of e)await g.contacts.create({firstName:t.mapped.firstName||`Контакт`,lastName:t.mapped.lastName||``,phone:t.mapped.phone||``,email:t.mapped.email||``,roles:[`client`],status:`active`}),n++;else for(let t of e){let e=Math.round(Number(t.mapped.price)||1e4);await v.products.create({sku:t.mapped.sku||`SKU-${c()}`,name:t.mapped.name||`Товар`,categoryId:`cat_default`,isService:!1,trackInventory:!0,status:`active`,price:{minor:e,currency:`RUB`},costPrice:{minor:Math.round(e*.6),currency:`RUB`},unit:t.mapped.unit||`шт`}),n++}F(n),l(4),i(`Успешно импортировано ${n} записей в IndexedDB!`,`success`),t&&t(n)}catch(e){i(`Ошибка импорта: ${e instanceof Error?e.message:String(e)}`,`error`)}finally{A(!1)}},H=u===`contact`?N:P;return(0,j.jsxs)(`div`,{className:`bg-krona-surface border border-krona-border rounded-xl shadow-krona-soft p-5 space-y-6`,children:[(0,j.jsxs)(`div`,{className:`flex flex-col sm:flex-row sm:items-center justify-between gap-4 border-b border-krona-border pb-4`,children:[(0,j.jsxs)(`div`,{children:[(0,j.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,j.jsx)(`h2`,{className:`text-base font-bold text-krona-primary`,children:`Мастер импорта данных из CSV`}),(0,j.jsx)(a,{variant:`gold`,size:`sm`,children:u===`contact`?`Контакты CRM`:`Товары`})]}),(0,j.jsx)(`p`,{className:`text-xs text-krona-secondary mt-0.5`,children:`Пакетная загрузка записей с проверкой форматов, сопоставлением колонок и отчетом валидации`})]}),(0,j.jsx)(`div`,{className:`flex items-center gap-2 text-xs`,children:[{num:1,label:`Файл`},{num:2,label:`Сопоставление`},{num:3,label:`Валидация`},{num:4,label:`Готово`}].map(e=>(0,j.jsxs)(`div`,{className:`flex items-center gap-1.5`,children:[(0,j.jsx)(`span`,{className:`w-6 h-6 rounded-full flex items-center justify-center font-bold text-xs ${o===e.num?`bg-krona-green text-white shadow-sm`:o>e.num?`bg-[#2F684C]/20 text-krona-green`:`bg-krona-workspace text-krona-secondary border border-krona-border`}`,children:o>e.num?(0,j.jsx)(ee,{className:`w-3.5 h-3.5`}):e.num}),(0,j.jsx)(`span`,{className:`hidden sm:inline font-medium ${o===e.num?`text-krona-primary`:`text-krona-secondary`}`,children:e.label}),e.num<4&&(0,j.jsx)(`div`,{className:`w-4 h-0.5 bg-krona-border`})]},e.num))})]}),o===1&&(0,j.jsxs)(`div`,{className:`space-y-5 animate-fade-in`,children:[(0,j.jsxs)(`div`,{className:`grid grid-cols-1 sm:grid-cols-2 gap-4`,children:[(0,j.jsxs)(`div`,{children:[(0,j.jsx)(`label`,{className:`block text-xs font-semibold text-krona-primary mb-1.5`,children:`Целевая сущность`}),(0,j.jsxs)(`div`,{className:`flex gap-2`,children:[(0,j.jsxs)(`button`,{type:`button`,onClick:()=>m(`contact`),className:`flex-1 p-3 rounded-lg border text-left text-xs transition-all ${u===`contact`?`border-krona-green bg-krona-green/10 text-krona-primary font-semibold`:`border-krona-border bg-krona-workspace text-krona-secondary hover:border-krona-border/80`}`,children:[(0,j.jsx)(`div`,{className:`font-bold text-sm text-krona-primary`,children:`Контакты`}),(0,j.jsx)(`div`,{className:`text-xs text-krona-secondary mt-0.5`,children:`Физлица, клиенты, сотрудники контрагентов`})]}),(0,j.jsxs)(`button`,{type:`button`,onClick:()=>m(`product`),className:`flex-1 p-3 rounded-lg border text-left text-xs transition-all ${u===`product`?`border-krona-green bg-krona-green/10 text-krona-primary font-semibold`:`border-krona-border bg-krona-workspace text-krona-secondary hover:border-krona-border/80`}`,children:[(0,j.jsx)(`div`,{className:`font-bold text-sm text-krona-primary`,children:`Товары`}),(0,j.jsx)(`div`,{className:`text-xs text-krona-secondary mt-0.5`,children:`Номенклатура, артикулы, цены и остатки`})]})]})]}),(0,j.jsxs)(`div`,{children:[(0,j.jsx)(`label`,{className:`block text-xs font-semibold text-krona-primary mb-1.5`,children:`Быстрый старт с образцами данных`}),(0,j.jsxs)(`div`,{className:`space-y-2`,children:[(0,j.jsxs)(r,{variant:`secondary`,size:`sm`,className:`w-full justify-start text-xs`,onClick:()=>L(`contact`),children:[(0,j.jsx)(b,{className:`w-3.5 h-3.5 text-amber-500 mr-2`}),`Загрузить образец контактов (с корректными и ошибочными строками)`]}),(0,j.jsxs)(r,{variant:`secondary`,size:`sm`,className:`w-full justify-start text-xs`,onClick:()=>L(`product`),children:[(0,j.jsx)(b,{className:`w-3.5 h-3.5 text-emerald-500 mr-2`}),`Загрузить образец товаров (с корректными и ошибочными строками)`]})]})]})]}),(0,j.jsxs)(`div`,{className:`border-2 border-dashed border-krona-border hover:border-krona-green rounded-xl p-8 text-center transition-colors bg-krona-workspace/40`,children:[(0,j.jsx)(se,{className:`w-10 h-10 text-krona-secondary mx-auto mb-2`}),(0,j.jsx)(`div`,{className:`text-xs font-medium text-krona-primary`,children:`Перетащите сюда файл .csv или выберите на диске`}),(0,j.jsx)(`p`,{className:`text-[11px] text-krona-secondary mt-1`,children:`Поддерживается разделитель запятая (,), кодировка UTF-8`}),(0,j.jsxs)(`label`,{className:`mt-3 inline-block cursor-pointer`,children:[(0,j.jsxs)(`span`,{className:`px-3.5 py-1.5 rounded-lg bg-krona-green text-white text-xs font-medium hover:bg-krona-green/90 transition-colors shadow-sm inline-flex items-center gap-1.5`,children:[(0,j.jsx)(d,{className:`w-3.5 h-3.5`}),` Выбрать файл на компьютере`]}),(0,j.jsx)(`input`,{type:`file`,accept:`.csv,text/csv`,onChange:R,className:`hidden`})]})]})]}),o===2&&(0,j.jsxs)(`div`,{className:`space-y-4 animate-fade-in`,children:[(0,j.jsxs)(`div`,{className:`flex items-center justify-between text-xs bg-krona-workspace p-3 rounded-lg border border-krona-border`,children:[(0,j.jsxs)(`div`,{children:[(0,j.jsx)(`span`,{className:`text-krona-secondary`,children:`Файл: `}),(0,j.jsx)(`span`,{className:`font-semibold text-krona-primary`,children:_}),(0,j.jsx)(`span`,{className:`text-krona-secondary ml-3`,children:`Строк: `}),(0,j.jsx)(`span`,{className:`font-semibold text-krona-primary`,children:S.length})]}),(0,j.jsx)(r,{variant:`ghost`,size:`sm`,onClick:()=>l(1),children:`Выбрать другой файл`})]}),(0,j.jsx)(`div`,{className:`border border-krona-border rounded-lg overflow-hidden`,children:(0,j.jsxs)(`table`,{className:`w-full text-xs text-left`,children:[(0,j.jsx)(`thead`,{className:`bg-krona-workspace text-krona-secondary border-b border-krona-border`,children:(0,j.jsxs)(`tr`,{children:[(0,j.jsx)(`th`,{className:`p-3 font-semibold`,children:`Колонка в CSV-файле`}),(0,j.jsx)(`th`,{className:`p-3 font-semibold`,children:`Пример значения (первая строка)`}),(0,j.jsx)(`th`,{className:`p-3 font-semibold`,children:`Поле в системе Krona`})]})}),(0,j.jsx)(`tbody`,{className:`divide-y divide-krona-border`,children:oe.map(e=>(0,j.jsxs)(`tr`,{className:`hover:bg-krona-workspace/50`,children:[(0,j.jsx)(`td`,{className:`p-3 font-semibold text-krona-primary`,children:e}),(0,j.jsx)(`td`,{className:`p-3 font-mono text-krona-secondary truncate max-w-xs`,children:S[0]?.[e]||`—`}),(0,j.jsx)(`td`,{className:`p-3`,children:(0,j.jsxs)(`select`,{value:w[e]||``,onChange:t=>T({...w,[e]:t.target.value}),className:`w-64 px-2.5 py-1 text-xs bg-krona-workspace border border-krona-border rounded-md text-krona-primary focus:outline-none focus:border-krona-green`,children:[(0,j.jsx)(`option`,{value:``,children:`-- Не импортировать --`}),H.map(e=>(0,j.jsxs)(`option`,{value:e.key,children:[e.label,` `,e.required?`*`:``]},e.key))]})})]},e))})]})}),(0,j.jsxs)(`div`,{className:`flex justify-between items-center pt-2`,children:[(0,j.jsxs)(r,{variant:`secondary`,size:`sm`,onClick:()=>l(1),children:[(0,j.jsx)(f,{className:`w-3.5 h-3.5 mr-1`}),` Назад`]}),(0,j.jsxs)(r,{variant:`primary`,size:`sm`,onClick:()=>l(3),children:[`Перейти к валидации `,(0,j.jsx)(ne,{className:`w-3.5 h-3.5 ml-1`})]})]})]}),o===3&&(0,j.jsxs)(`div`,{className:`space-y-4 animate-fade-in`,children:[(0,j.jsxs)(`div`,{className:`grid grid-cols-1 sm:grid-cols-3 gap-3`,children:[(0,j.jsxs)(`div`,{className:`p-3 rounded-lg border border-krona-border bg-krona-workspace/60`,children:[(0,j.jsx)(`div`,{className:`text-[11px] text-krona-secondary uppercase font-semibold`,children:`Всего строк в файле`}),(0,j.jsx)(`div`,{className:`text-xl font-bold text-krona-primary mt-1`,children:z.length})]}),(0,j.jsxs)(`div`,{className:`p-3 rounded-lg border border-emerald-500/30 bg-emerald-500/10`,children:[(0,j.jsxs)(`div`,{className:`text-[11px] text-emerald-700 dark:text-emerald-300 uppercase font-semibold flex items-center gap-1`,children:[(0,j.jsx)(p,{className:`w-3.5 h-3.5`}),` Корректные строки`]}),(0,j.jsx)(`div`,{className:`text-xl font-bold text-emerald-600 dark:text-emerald-400 mt-1`,children:B})]}),(0,j.jsxs)(`div`,{className:`p-3 rounded-lg border border-rose-500/30 bg-rose-500/10`,children:[(0,j.jsxs)(`div`,{className:`text-[11px] text-rose-700 dark:text-rose-300 uppercase font-semibold flex items-center gap-1`,children:[(0,j.jsx)(ie,{className:`w-3.5 h-3.5`}),` Строки с ошибками`]}),(0,j.jsx)(`div`,{className:`text-xl font-bold text-rose-600 dark:text-rose-400 mt-1`,children:ue})]})]}),(0,j.jsxs)(`div`,{className:`flex items-center gap-2 text-xs bg-krona-workspace p-3 rounded-lg border border-krona-border`,children:[(0,j.jsx)(`input`,{type:`checkbox`,id:`skipErrors`,checked:E,onChange:e=>D(e.target.checked),className:`rounded border-krona-border text-krona-green focus:ring-krona-green`}),(0,j.jsxs)(`label`,{htmlFor:`skipErrors`,className:`text-krona-primary font-medium cursor-pointer`,children:[`Импортировать только корректные строки (`,B,` из `,z.length,`), пропуская ошибочные`]})]}),(0,j.jsx)(`div`,{className:`border border-krona-border rounded-lg overflow-x-auto max-h-80`,children:(0,j.jsxs)(`table`,{className:`w-full text-xs text-left`,children:[(0,j.jsx)(`thead`,{className:`bg-krona-workspace text-krona-secondary border-b border-krona-border sticky top-0`,children:(0,j.jsxs)(`tr`,{children:[(0,j.jsx)(`th`,{className:`p-2.5 font-semibold w-12`,children:`№`}),(0,j.jsx)(`th`,{className:`p-2.5 font-semibold w-24`,children:`Статус`}),H.map(e=>(0,j.jsx)(`th`,{className:`p-2.5 font-semibold`,children:e.label},e.key)),(0,j.jsx)(`th`,{className:`p-2.5 font-semibold`,children:`Ошибки / Замечания`})]})}),(0,j.jsx)(`tbody`,{className:`divide-y divide-krona-border`,children:z.map(e=>(0,j.jsxs)(`tr`,{className:`transition-colors ${e.isValid?`hover:bg-krona-workspace/40`:`bg-rose-500/5 hover:bg-rose-500/10`}`,children:[(0,j.jsx)(`td`,{className:`p-2.5 font-mono text-krona-secondary`,children:e.rowIndex}),(0,j.jsx)(`td`,{className:`p-2.5`,children:e.isValid?(0,j.jsx)(a,{variant:`green`,size:`sm`,children:`Корректно`}):(0,j.jsx)(a,{variant:`danger`,size:`sm`,children:`Ошибка`})}),H.map(t=>(0,j.jsx)(`td`,{className:`p-2.5 text-krona-primary font-medium`,children:e.mapped[t.key]||(0,j.jsx)(`span`,{className:`text-krona-secondary italic`,children:`—`})},t.key)),(0,j.jsx)(`td`,{className:`p-2.5 text-xs text-rose-600 dark:text-rose-400`,children:e.errors.length>0?(0,j.jsx)(`ul`,{className:`list-disc pl-4 space-y-0.5`,children:e.errors.map((e,t)=>(0,j.jsx)(`li`,{children:e},t))}):(0,j.jsxs)(`span`,{className:`text-emerald-600 dark:text-emerald-400 flex items-center gap-1`,children:[(0,j.jsx)(ee,{className:`w-3 h-3`}),` Проверка пройдена`]})})]},e.rowIndex))})]})}),(0,j.jsxs)(`div`,{className:`flex justify-between items-center pt-2`,children:[(0,j.jsxs)(r,{variant:`secondary`,size:`sm`,onClick:()=>l(2),children:[(0,j.jsx)(f,{className:`w-3.5 h-3.5 mr-1`}),` Назад`]}),(0,j.jsx)(r,{variant:`primary`,size:`sm`,disabled:O||E&&B===0,onClick:V,children:O?(0,j.jsxs)(j.Fragment,{children:[(0,j.jsx)(re,{className:`w-3.5 h-3.5 mr-1.5 animate-spin`}),` Выполняется импорт...`]}):(0,j.jsxs)(j.Fragment,{children:[(0,j.jsx)(te,{className:`w-3.5 h-3.5 mr-1.5`}),` Импортировать `,E?B:z.length,` записей в базу`]})})]})]}),o===4&&(0,j.jsxs)(`div`,{className:`text-center py-8 space-y-4 animate-fade-in`,children:[(0,j.jsx)(`div`,{className:`w-14 h-14 rounded-full bg-emerald-500/20 text-emerald-600 dark:text-emerald-400 flex items-center justify-center mx-auto`,children:(0,j.jsx)(p,{className:`w-8 h-8`})}),(0,j.jsxs)(`div`,{children:[(0,j.jsx)(`h3`,{className:`text-lg font-bold text-krona-primary`,children:`Импорт успешно завершен!`}),(0,j.jsxs)(`p`,{className:`text-xs text-krona-secondary max-w-md mx-auto mt-1`,children:[`В локальную базу данных IndexedDB успешно добавлено`,` `,(0,j.jsx)(`strong`,{className:`text-krona-primary font-semibold`,children:le}),` записей`,` `,`(`,u===`contact`?`контактов`:`товаров`,`). Данные мгновенно доступны для использования во всех модулях платформы.`]})]}),(0,j.jsxs)(`div`,{className:`flex justify-center gap-2 pt-3`,children:[n&&(0,j.jsx)(r,{variant:`secondary`,size:`sm`,onClick:n,children:`Закрыть мастер`}),(0,j.jsx)(r,{variant:`primary`,size:`sm`,onClick:()=>{l(1),h(``),y(``),C([])},children:`Импортировать еще файл`})]})]})]})},F=[{key:`prospecting`,label:`Первичный контакт`,color:`border-sky-500/40`},{key:`discovery`,label:`Квалификация`,color:`border-indigo-500/40`},{key:`proposal`,label:`Предложение`,color:`border-amber-500/40`},{key:`negotiation`,label:`Переговоры`,color:`border-orange-500/40`},{key:`contract`,label:`Согласование`,color:`border-purple-500/40`},{key:`won`,label:`Выиграна`,color:`border-emerald-500/60 bg-emerald-500/5`},{key:`lost`,label:`Проиграна`,color:`border-rose-500/40 bg-rose-500/5`}],I=()=>{let t=S(),{showToast:n}=s(),{contacts:i,companies:o,leads:c,deals:d,createContact:f,createCompany:p,createDeal:te,createLead:re,updateDeal:ie,convertLead:g,getTimeline:v,createActivity:w}=A(),{orders:O,createOrder:ce}=E(),M=x(`contact`),N=x(`company`),P=x(`deal`),I=x(`lead`),[L,R]=(0,k.useState)(()=>{let e=t.pathname;return e.includes(`/crm/deals`)?`deals`:e.includes(`/crm/leads`)?`leads`:e.includes(`/crm/companies`)?`companies`:e.includes(`/crm/import`)?`import`:e.includes(`/crm/contacts`)||e===`/crm`?`contacts`:`deals`}),[z,B]=(0,k.useState)(``),[ue,V]=(0,k.useState)(!1),[H,U]=(0,k.useState)(!1),[de,W]=(0,k.useState)(!1),[fe,G]=(0,k.useState)(!1),[pe,K]=(0,k.useState)(!1),[me,he]=(0,k.useState)(null),[ge,_e]=(0,k.useState)(``),[ve,q]=(0,k.useState)(!1),[J,ye]=(0,k.useState)(null),[be,xe]=(0,k.useState)(``),[Se,Ce]=(0,k.useState)(`wh_main`),[Y,we]=(0,k.useState)(null),[X,Te]=(0,k.useState)(null),[Z,Ee]=(0,k.useState)(`overview`),[De,Q]=(0,k.useState)([]),[Oe,ke]=(0,k.useState)(``),[Ae,je]=(0,k.useState)(`call`),[Me,Ne]=(0,k.useState)(null),[Pe,Fe]=(0,k.useState)(t.pathname);if(Pe!==t.pathname){Fe(t.pathname);let e=t.pathname;e.includes(`/crm/deals`)?R(`deals`):e.includes(`/crm/leads`)?R(`leads`):e.includes(`/crm/companies`)?R(`companies`):e.includes(`/crm/import`)?R(`import`):(e.includes(`/crm/contacts`)||e===`/crm`)&&R(`contacts`)}k.useEffect(()=>{let e=!0;return Y?v(`contact`,Y.id).then(t=>{e&&Q(t)}).catch(()=>{}):X&&v(`company`,X.id).then(t=>{e&&Q(t)}).catch(()=>{}),()=>{e=!1}},[Y,X,v]);let Ie=async(e,t)=>{let r=d.find(t=>t.id===e);r&&(await ie(e,{stage:t}),n(`Сделка «${r.title}» переведена на этап: ${F.find(e=>e.key===t)?.label}`,`info`),t===`won`&&(ye(r),xe(`Заказ по сделке: ${r.title}`),q(!0)))},Le=(e,t)=>{e.dataTransfer.setData(`text/plain`,t),Ne(t)},Re=e=>{e.preventDefault()},ze=async(e,t)=>{e.preventDefault();let n=e.dataTransfer.getData(`text/plain`)||Me;n&&await Ie(n,t),Ne(null)},Be=async()=>{if(J)try{let t=i.find(e=>e.id===J.contactId),r=o.find(e=>e.id===J.companyId),a=t?`${t.firstName} ${t.lastName}`:r?.name||`Клиент`,s=J.contactId||J.companyId||`cnt_default`,c=`ORD-${e().slice(-6)}`;await ce({orderNumber:c,customerType:J.contactId?`contact`:`company`,customerId:s,customerName:a,status:`draft`,paymentStatus:`pending`,fulfillmentStatus:`unfulfilled`,items:[{id:`item_${e()}`,productId:`prd_coffee_beans`,sku:`COF-100`,name:J.title,quantity:1,unitPrice:J.amount,discountMinor:0,totalPrice:J.amount}],subtotal:J.amount,discountMinor:0,taxMinor:Math.round(J.amount.minor*.2),shippingMinor:0,total:J.amount,channel:`b2b`}),n(`Связанный Заказ ${c} успешно создан в Коммерции!`,`success`),q(!1),ye(null)}catch(e){n(`Ошибка создания заказа: ${e instanceof Error?e.message:String(e)}`,`error`)}},Ve=async()=>{if(me)try{let e=await g(me.id,ge);n(`Лид конвертирован! Создана сделка «${e.deal.title}»`,`success`),K(!1),he(null)}catch(e){n(`Ошибка конвертации: ${e instanceof Error?e.message:String(e)}`,`error`)}},He=async e=>{if(e.preventDefault(),!Oe)return;let t=Y?`contact`:`company`,r=Y?.id||X?.id||``;await w({targetEntityType:t,targetEntityId:r,type:Ae,title:Oe,completed:!1,dueDate:new Date(Date.now()+864e5).toISOString()}),ke(``),n(`Активность запланирована`,`success`),v(t,r).then(Q).catch(()=>{})},$=Y?.id||X?.id||``,Ue=(0,k.useMemo)(()=>d.filter(e=>e.contactId===$||e.companyId===$),[d,$]),We=(0,k.useMemo)(()=>O.filter(e=>e.customerId===$),[O,$]);return(0,j.jsxs)(`div`,{className:`space-y-4 animate-fade-in`,children:[(0,j.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,j.jsxs)(`div`,{children:[(0,j.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,j.jsx)(`h1`,{className:`text-sm font-bold text-krona-primary`,children:`CRM: Клиенты, Воронка продаж & Сделки`}),(0,j.jsx)(T,{level:`pilot1`,size:`sm`})]}),(0,j.jsx)(`p`,{className:`text-xs text-krona-secondary mt-0.5`,children:`Сквозной процесс: Лид → Контакт/Компания → Сделка (Kanban) → Выиграна → Заказ в Коммерции`})]}),(0,j.jsxs)(`div`,{className:`flex items-center gap-1.5 overflow-x-auto text-xs`,children:[(0,j.jsxs)(`button`,{onClick:()=>R(`deals`),className:`px-3 py-1.5 rounded-lg font-medium transition-all ${L===`deals`?`bg-krona-green text-white shadow-sm`:`bg-krona-workspace text-krona-secondary hover:text-krona-primary border border-krona-border`}`,children:[`Воронка сделок (`,d.length,`)`]}),(0,j.jsxs)(`button`,{onClick:()=>R(`contacts`),className:`px-3 py-1.5 rounded-lg font-medium transition-all ${L===`contacts`?`bg-krona-green text-white shadow-sm`:`bg-krona-workspace text-krona-secondary hover:text-krona-primary border border-krona-border`}`,children:[`Контакты (`,i.length,`)`]}),(0,j.jsxs)(`button`,{onClick:()=>R(`companies`),className:`px-3 py-1.5 rounded-lg font-medium transition-all ${L===`companies`?`bg-krona-green text-white shadow-sm`:`bg-krona-workspace text-krona-secondary hover:text-krona-primary border border-krona-border`}`,children:[`Компании (`,o.length,`)`]}),(0,j.jsxs)(`button`,{onClick:()=>R(`leads`),className:`px-3 py-1.5 rounded-lg font-medium transition-all ${L===`leads`?`bg-krona-green text-white shadow-sm`:`bg-krona-workspace text-krona-secondary hover:text-krona-primary border border-krona-border`}`,children:[`Лиды (`,c.length,`)`]}),(0,j.jsxs)(`button`,{onClick:()=>R(`import`),className:`px-3 py-1.5 rounded-lg font-medium transition-all flex items-center gap-1 ${L===`import`?`bg-krona-green text-white shadow-sm`:`bg-krona-workspace text-krona-secondary hover:text-krona-primary border border-krona-border`}`,children:[(0,j.jsx)(se,{className:`w-3.5 h-3.5`}),` Импорт CSV`]})]})]}),L===`deals`&&(0,j.jsxs)(`div`,{className:`space-y-3`,children:[(0,j.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,j.jsxs)(`div`,{className:`relative w-64`,children:[(0,j.jsx)(_,{className:`w-3.5 h-3.5 absolute left-2.5 top-2.5 text-krona-secondary`}),(0,j.jsx)(`input`,{type:`text`,value:z,onChange:e=>B(e.target.value),placeholder:`Поиск по сделкам...`,className:`w-full pl-8 pr-3 py-1.5 text-xs bg-krona-surface border border-krona-border rounded-lg text-krona-primary focus:outline-none focus:border-krona-green`})]}),(0,j.jsxs)(r,{variant:`primary`,size:`sm`,onClick:()=>W(!0),children:[(0,j.jsx)(m,{className:`w-3.5 h-3.5 mr-1`}),` Новая сделка`]})]}),(0,j.jsx)(`div`,{className:`grid grid-cols-1 md:grid-cols-4 lg:grid-cols-7 gap-2.5 overflow-x-auto pb-4`,children:F.map(e=>{let t=d.filter(t=>t.stage===e.key&&(t.title.toLowerCase().includes(z.toLowerCase())||!z)),n=t.reduce((e,t)=>e+t.amount.minor,0);return(0,j.jsxs)(`div`,{"data-testid":`kanban-column-${e.key}`,onDragOver:Re,onDrop:t=>ze(t,e.key),className:`bg-krona-surface/70 border rounded-xl p-2.5 flex flex-col min-w-[200px] max-h-[750px] shadow-krona-soft transition-all ${e.color}`,children:[(0,j.jsxs)(`div`,{className:`flex items-center justify-between border-b border-krona-border/60 pb-2 mb-2`,children:[(0,j.jsxs)(`div`,{children:[(0,j.jsx)(`div`,{className:`text-xs font-bold text-krona-primary`,children:e.label}),(0,j.jsx)(`div`,{className:`text-[11px] font-medium text-krona-green mt-0.5`,children:D(n)})]}),(0,j.jsx)(`span`,{className:`text-[11px] px-1.5 py-0.5 rounded-full bg-krona-workspace text-krona-secondary font-bold`,children:t.length})]}),(0,j.jsxs)(`div`,{className:`space-y-2 overflow-y-auto flex-1 pr-0.5`,children:[t.map(e=>{let t=i.find(t=>t.id===e.contactId),n=o.find(t=>t.id===e.companyId),r=F.findIndex(t=>t.key===e.stage)+1,a=F[r]?.key;return(0,j.jsxs)(`div`,{"data-testid":`deal-card-${e.id}`,"data-deal-id":e.id,"data-deal-stage":e.stage,draggable:!0,onDragStart:t=>Le(t,e.id),className:`bg-krona-workspace border border-krona-border hover:border-krona-green/60 p-2.5 rounded-lg text-xs space-y-2 shadow-xs cursor-grab active:cursor-grabbing transition-all`,children:[(0,j.jsx)(`div`,{className:`font-semibold text-krona-primary line-clamp-2`,children:e.title}),(0,j.jsxs)(`div`,{className:`flex items-center justify-between text-[11px]`,children:[(0,j.jsx)(`span`,{className:`font-bold text-krona-primary`,children:D(e.amount.minor)}),(0,j.jsxs)(`span`,{className:`px-1.5 py-0.2 bg-emerald-500/10 text-emerald-600 dark:text-emerald-400 rounded font-medium`,children:[e.probability,`% вер.`]})]}),(t||n)&&(0,j.jsxs)(`div`,{className:`text-[11px] text-krona-secondary truncate flex items-center gap-1`,children:[(0,j.jsx)(u,{className:`w-3 h-3`}),n?.name||`${t?.firstName} ${t?.lastName}`]}),a&&e.stage!==`won`&&e.stage!==`lost`&&(0,j.jsxs)(`button`,{type:`button`,onClick:()=>Ie(e.id,a),className:`w-full mt-1 py-1 text-[11px] bg-krona-surface hover:bg-krona-green/10 text-krona-secondary hover:text-krona-green border border-krona-border rounded flex items-center justify-center gap-1 transition-colors`,children:[`Далее: `,F[r]?.label,` `,(0,j.jsx)(ne,{className:`w-3 h-3`})]})]},e.id)}),t.length===0&&(0,j.jsx)(`div`,{className:`text-center py-6 text-[11px] text-krona-secondary italic`,children:`Пусто`})]})]},e.key)})})]}),L===`contacts`&&(0,j.jsxs)(`div`,{className:`space-y-3`,children:[(0,j.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,j.jsxs)(`div`,{className:`relative w-64`,children:[(0,j.jsx)(_,{className:`w-3.5 h-3.5 absolute left-2.5 top-2.5 text-krona-secondary`}),(0,j.jsx)(`input`,{type:`text`,value:z,onChange:e=>B(e.target.value),placeholder:`Поиск по имени, телефону, email...`,className:`w-full pl-8 pr-3 py-1.5 text-xs bg-krona-surface border border-krona-border rounded-lg text-krona-primary focus:outline-none focus:border-krona-green`})]}),(0,j.jsxs)(r,{variant:`primary`,size:`sm`,onClick:()=>V(!0),children:[(0,j.jsx)(m,{className:`w-3.5 h-3.5 mr-1`}),` Новый контакт`]})]}),(0,j.jsx)(`div`,{className:`bg-krona-surface border border-krona-border rounded-xl shadow-krona-soft overflow-hidden`,children:(0,j.jsxs)(`table`,{className:`w-full text-xs text-left`,children:[(0,j.jsx)(`thead`,{className:`bg-krona-workspace text-krona-secondary border-b border-krona-border`,children:(0,j.jsxs)(`tr`,{children:[(0,j.jsx)(`th`,{className:`p-3 font-semibold`,children:`ФИО / Контакт`}),(0,j.jsx)(`th`,{className:`p-3 font-semibold`,children:`Компания`}),(0,j.jsx)(`th`,{className:`p-3 font-semibold`,children:`Телефон`}),(0,j.jsx)(`th`,{className:`p-3 font-semibold`,children:`Email`}),(0,j.jsx)(`th`,{className:`p-3 font-semibold`,children:`Роли`}),(0,j.jsx)(`th`,{className:`p-3 font-semibold text-right`,children:`Действие`})]})}),(0,j.jsx)(`tbody`,{className:`divide-y divide-krona-border`,children:i.filter(e=>`${e.firstName} ${e.lastName}`.toLowerCase().includes(z.toLowerCase())||e.phone?.includes(z)||e.email?.toLowerCase().includes(z.toLowerCase())).map(e=>{let t=o.find(t=>t.id===e.companyId);return(0,j.jsxs)(`tr`,{onClick:()=>{we(e),Te(null)},className:`hover:bg-krona-workspace/50 cursor-pointer transition-colors`,children:[(0,j.jsx)(`td`,{className:`p-3 font-medium text-krona-primary`,children:(0,j.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,j.jsxs)(`div`,{className:`w-7 h-7 rounded-full bg-krona-green/10 text-krona-green flex items-center justify-center font-bold text-xs`,children:[e.firstName[0],e.lastName?.[0]]}),(0,j.jsxs)(`div`,{children:[(0,j.jsxs)(`div`,{children:[e.firstName,` `,e.lastName]}),e.jobTitle&&(0,j.jsx)(`div`,{className:`text-[11px] text-krona-secondary`,children:e.jobTitle})]})]})}),(0,j.jsx)(`td`,{className:`p-3 text-krona-secondary`,children:t?.name||`—`}),(0,j.jsx)(`td`,{className:`p-3 font-mono text-krona-secondary`,children:e.phone||`—`}),(0,j.jsx)(`td`,{className:`p-3 text-krona-secondary`,children:e.email||`—`}),(0,j.jsx)(`td`,{className:`p-3`,children:(0,j.jsx)(`div`,{className:`flex gap-1`,children:e.roles?.map(e=>(0,j.jsx)(a,{variant:`gold`,size:`sm`,children:e},e))})}),(0,j.jsx)(`td`,{className:`p-3 text-right`,children:(0,j.jsxs)(r,{variant:`ghost`,size:`sm`,children:[`Карточка 360 `,(0,j.jsx)(ae,{className:`w-3.5 h-3.5 ml-1`})]})})]},e.id)})})]})})]}),L===`companies`&&(0,j.jsxs)(`div`,{className:`space-y-3`,children:[(0,j.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,j.jsxs)(`div`,{className:`relative w-64`,children:[(0,j.jsx)(_,{className:`w-3.5 h-3.5 absolute left-2.5 top-2.5 text-krona-secondary`}),(0,j.jsx)(`input`,{type:`text`,value:z,onChange:e=>B(e.target.value),placeholder:`Поиск по названию, ИНН...`,className:`w-full pl-8 pr-3 py-1.5 text-xs bg-krona-surface border border-krona-border rounded-lg text-krona-primary focus:outline-none focus:border-krona-green`})]}),(0,j.jsxs)(r,{variant:`primary`,size:`sm`,onClick:()=>U(!0),children:[(0,j.jsx)(m,{className:`w-3.5 h-3.5 mr-1`}),` Новая компания`]})]}),(0,j.jsx)(`div`,{className:`bg-krona-surface border border-krona-border rounded-xl shadow-krona-soft overflow-hidden`,children:(0,j.jsxs)(`table`,{className:`w-full text-xs text-left`,children:[(0,j.jsx)(`thead`,{className:`bg-krona-workspace text-krona-secondary border-b border-krona-border`,children:(0,j.jsxs)(`tr`,{children:[(0,j.jsx)(`th`,{className:`p-3 font-semibold`,children:`Название компании`}),(0,j.jsx)(`th`,{className:`p-3 font-semibold`,children:`ИНН`}),(0,j.jsx)(`th`,{className:`p-3 font-semibold`,children:`Город`}),(0,j.jsx)(`th`,{className:`p-3 font-semibold`,children:`Телефон`}),(0,j.jsx)(`th`,{className:`p-3 font-semibold`,children:`Роли`}),(0,j.jsx)(`th`,{className:`p-3 font-semibold text-right`,children:`Действие`})]})}),(0,j.jsx)(`tbody`,{className:`divide-y divide-krona-border`,children:o.filter(e=>e.name.toLowerCase().includes(z.toLowerCase())||e.inn?.includes(z)||e.address?.toLowerCase().includes(z.toLowerCase())).map(e=>(0,j.jsxs)(`tr`,{onClick:()=>{Te(e),we(null)},className:`hover:bg-krona-workspace/50 cursor-pointer transition-colors`,children:[(0,j.jsx)(`td`,{className:`p-3 font-medium text-krona-primary`,children:(0,j.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,j.jsx)(u,{className:`w-4 h-4 text-krona-secondary`}),(0,j.jsxs)(`div`,{children:[(0,j.jsx)(`div`,{className:`font-bold`,children:e.name}),e.legalName&&(0,j.jsx)(`div`,{className:`text-[11px] text-krona-secondary`,children:e.legalName})]})]})}),(0,j.jsx)(`td`,{className:`p-3 font-mono text-krona-secondary`,children:e.inn||`—`}),(0,j.jsx)(`td`,{className:`p-3 text-krona-secondary`,children:e.address||`—`}),(0,j.jsx)(`td`,{className:`p-3 font-mono text-krona-secondary`,children:e.phone||`—`}),(0,j.jsx)(`td`,{className:`p-3`,children:(0,j.jsx)(`div`,{className:`flex gap-1`,children:e.roles?.map(e=>(0,j.jsx)(a,{variant:`gold`,size:`sm`,children:e},e))})}),(0,j.jsx)(`td`,{className:`p-3 text-right`,children:(0,j.jsxs)(r,{variant:`ghost`,size:`sm`,children:[`Карточка 360 `,(0,j.jsx)(ae,{className:`w-3.5 h-3.5 ml-1`})]})})]},e.id))})]})})]}),L===`leads`&&(0,j.jsxs)(`div`,{className:`space-y-3`,children:[(0,j.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,j.jsxs)(`div`,{className:`relative w-64`,children:[(0,j.jsx)(_,{className:`w-3.5 h-3.5 absolute left-2.5 top-2.5 text-krona-secondary`}),(0,j.jsx)(`input`,{type:`text`,value:z,onChange:e=>B(e.target.value),placeholder:`Поиск лидов...`,className:`w-full pl-8 pr-3 py-1.5 text-xs bg-krona-surface border border-krona-border rounded-lg text-krona-primary focus:outline-none focus:border-krona-green`})]}),(0,j.jsxs)(r,{variant:`primary`,size:`sm`,"data-testid":`new-lead-btn`,onClick:()=>G(!0),children:[(0,j.jsx)(m,{className:`w-3.5 h-3.5 mr-1`}),` Новый лид`]})]}),(0,j.jsx)(`div`,{className:`bg-krona-surface border border-krona-border rounded-xl shadow-krona-soft overflow-hidden`,children:(0,j.jsxs)(`table`,{className:`w-full text-xs text-left`,children:[(0,j.jsx)(`thead`,{className:`bg-krona-workspace text-krona-secondary border-b border-krona-border`,children:(0,j.jsxs)(`tr`,{children:[(0,j.jsx)(`th`,{className:`p-3 font-semibold`,children:`Название лида`}),(0,j.jsx)(`th`,{className:`p-3 font-semibold`,children:`Контактное лицо`}),(0,j.jsx)(`th`,{className:`p-3 font-semibold`,children:`Контакты`}),(0,j.jsx)(`th`,{className:`p-3 font-semibold`,children:`Оценка бюджета`}),(0,j.jsx)(`th`,{className:`p-3 font-semibold`,children:`Статус`}),(0,j.jsx)(`th`,{className:`p-3 font-semibold text-right`,children:`Конвертация`})]})}),(0,j.jsx)(`tbody`,{className:`divide-y divide-krona-border`,children:c.map(e=>(0,j.jsxs)(`tr`,{className:`hover:bg-krona-workspace/50 transition-colors`,children:[(0,j.jsx)(`td`,{className:`p-3 font-bold text-krona-primary`,children:e.title}),(0,j.jsx)(`td`,{className:`p-3 font-medium text-krona-primary`,children:e.contactName}),(0,j.jsxs)(`td`,{className:`p-3 text-krona-secondary`,children:[(0,j.jsx)(`div`,{children:e.phone}),(0,j.jsx)(`div`,{className:`text-[11px]`,children:e.email})]}),(0,j.jsx)(`td`,{className:`p-3 font-bold text-krona-green`,children:e.estimatedValue?D(e.estimatedValue.minor):`—`}),(0,j.jsx)(`td`,{className:`p-3`,children:(0,j.jsx)(a,{variant:e.status===`converted`?`green`:e.status===`disqualified`?`danger`:`warning`,size:`sm`,children:e.status===`converted`?`Конвертирован`:e.status===`new`?`Новый`:e.status})}),(0,j.jsx)(`td`,{className:`p-3 text-right`,children:e.status===`converted`?(0,j.jsxs)(`span`,{className:`text-emerald-600 dark:text-emerald-400 text-xs font-semibold flex items-center justify-end gap-1`,children:[(0,j.jsx)(ee,{className:`w-3.5 h-3.5`}),` Сделка создана`]}):(0,j.jsxs)(r,{variant:`primary`,size:`sm`,"data-testid":`convert-lead-btn`,onClick:()=>{he(e),_e(`Сделка: ${e.title}`),K(!0)},children:[(0,j.jsx)(b,{className:`w-3.5 h-3.5 mr-1`}),` Конвертировать в сделку`]})})]},e.id))})]})})]}),L===`import`&&(0,j.jsx)(le,{initialEntityType:`contact`}),(0,j.jsx)(oe,{isOpen:!!(Y||X),onClose:()=>{we(null),Te(null),Q([])},title:Y?`${Y.firstName} ${Y.lastName} (Customer 360)`:`${X?.name} (Company 360)`,size:`lg`,children:(0,j.jsxs)(`div`,{className:`space-y-4`,children:[(0,j.jsx)(`div`,{className:`flex border-b border-krona-border text-xs`,children:[`overview`,`deals`,`orders`,`activities`,`timeline`].map(e=>(0,j.jsxs)(`button`,{onClick:()=>Ee(e),className:`px-3.5 py-2 font-semibold capitalize transition-colors border-b-2 ${Z===e?`border-krona-green text-krona-green`:`border-transparent text-krona-secondary hover:text-krona-primary`}`,children:[e===`overview`&&`Обзор`,e===`deals`&&`Сделки (${Ue.length})`,e===`orders`&&`Заказы (${We.length})`,e===`activities`&&`Задачи & Звонки`,e===`timeline`&&`Таймлайн (${De.length})`]},e))}),Z===`overview`&&(0,j.jsxs)(`div`,{className:`space-y-3 text-xs`,children:[(0,j.jsxs)(`div`,{className:`grid grid-cols-2 gap-3 bg-krona-workspace p-3.5 rounded-lg border border-krona-border`,children:[Y&&(0,j.jsxs)(j.Fragment,{children:[(0,j.jsxs)(`div`,{children:[(0,j.jsx)(`span`,{className:`text-krona-secondary`,children:`ФИО:`}),` `,(0,j.jsxs)(`strong`,{className:`text-krona-primary`,children:[Y.firstName,` `,Y.lastName]})]}),(0,j.jsxs)(`div`,{children:[(0,j.jsx)(`span`,{className:`text-krona-secondary`,children:`Телефон:`}),` `,(0,j.jsx)(`strong`,{className:`text-krona-primary`,children:Y.phone||`—`})]}),(0,j.jsxs)(`div`,{children:[(0,j.jsx)(`span`,{className:`text-krona-secondary`,children:`Email:`}),` `,(0,j.jsx)(`strong`,{className:`text-krona-primary`,children:Y.email||`—`})]}),(0,j.jsxs)(`div`,{children:[(0,j.jsx)(`span`,{className:`text-krona-secondary`,children:`Должность:`}),` `,(0,j.jsx)(`strong`,{className:`text-krona-primary`,children:Y.jobTitle||`—`})]})]}),X&&(0,j.jsxs)(j.Fragment,{children:[(0,j.jsxs)(`div`,{children:[(0,j.jsx)(`span`,{className:`text-krona-secondary`,children:`Название:`}),` `,(0,j.jsx)(`strong`,{className:`text-krona-primary`,children:X.name})]}),(0,j.jsxs)(`div`,{children:[(0,j.jsx)(`span`,{className:`text-krona-secondary`,children:`ИНН:`}),` `,(0,j.jsx)(`strong`,{className:`text-krona-primary`,children:X.inn||`—`})]}),(0,j.jsxs)(`div`,{children:[(0,j.jsx)(`span`,{className:`text-krona-secondary`,children:`Адрес:`}),` `,(0,j.jsx)(`strong`,{className:`text-krona-primary`,children:X.address||`—`})]}),(0,j.jsxs)(`div`,{children:[(0,j.jsx)(`span`,{className:`text-krona-secondary`,children:`Телефон:`}),` `,(0,j.jsx)(`strong`,{className:`text-krona-primary`,children:X.phone||`—`})]})]})]}),(0,j.jsxs)(`div`,{className:`p-3 bg-krona-workspace/40 rounded-lg border border-krona-border`,children:[(0,j.jsx)(`div`,{className:`font-semibold text-krona-primary mb-1`,children:`Кастомные атрибуты (Схема Krona Studio):`}),Y?.customFields&&Object.keys(Y.customFields).length>0||X?.customFields&&Object.keys(X.customFields).length>0?(0,j.jsx)(`div`,{className:`grid grid-cols-2 gap-2 mt-2`,children:Object.entries(Y?.customFields||X?.customFields).map(([e,t])=>(0,j.jsxs)(`div`,{className:`text-xs`,children:[(0,j.jsxs)(`span`,{className:`text-krona-secondary`,children:[e,`:`]}),` `,(0,j.jsx)(`strong`,{className:`text-krona-primary`,children:String(t)})]},e))}):(0,j.jsx)(`p`,{className:`text-krona-secondary text-[11px]`,children:`Дополнительные поля из Конструктора полей отображаются здесь в реальном времени.`})]})]}),Z===`deals`&&(0,j.jsxs)(`div`,{className:`space-y-2`,children:[Ue.map(e=>(0,j.jsxs)(`div`,{className:`p-3 rounded-lg border border-krona-border bg-krona-workspace flex items-center justify-between text-xs`,children:[(0,j.jsxs)(`div`,{children:[(0,j.jsx)(`div`,{className:`font-bold text-krona-primary`,children:e.title}),(0,j.jsxs)(`div`,{className:`text-[11px] text-krona-secondary`,children:[`Этап:`,` `,(0,j.jsx)(`span`,{className:`font-semibold`,children:F.find(t=>t.key===e.stage)?.label})]})]}),(0,j.jsxs)(`div`,{className:`text-right`,children:[(0,j.jsx)(`div`,{className:`font-bold text-krona-green`,children:D(e.amount.minor)}),(0,j.jsxs)(`div`,{className:`text-[11px] text-krona-secondary`,children:[e.probability,`% вер.`]})]})]},e.id)),Ue.length===0&&(0,j.jsx)(`div`,{className:`text-center py-6 text-krona-secondary text-xs italic`,children:`Нет связанных сделок`})]}),Z===`orders`&&(0,j.jsxs)(`div`,{className:`space-y-2`,children:[We.map(e=>(0,j.jsxs)(`div`,{className:`p-3 rounded-lg border border-krona-border bg-krona-workspace flex items-center justify-between text-xs`,children:[(0,j.jsxs)(`div`,{children:[(0,j.jsx)(`div`,{className:`font-bold font-mono text-krona-primary`,children:e.orderNumber}),(0,j.jsxs)(`div`,{className:`text-[11px] text-krona-secondary`,children:[e.items.length,` поз. • Статус: `,e.status]})]}),(0,j.jsxs)(`div`,{className:`text-right`,children:[(0,j.jsx)(`div`,{className:`font-bold text-krona-green`,children:D(e.total.minor)}),(0,j.jsx)(a,{variant:e.paymentStatus===`paid`?`green`:`warning`,size:`sm`,children:e.paymentStatus})]})]},e.id)),We.length===0&&(0,j.jsx)(`div`,{className:`text-center py-6 text-krona-secondary text-xs italic`,children:`Нет связанных заказов`})]}),Z===`activities`&&(0,j.jsx)(`div`,{className:`space-y-3`,children:(0,j.jsxs)(`form`,{onSubmit:He,className:`p-3 bg-krona-workspace rounded-lg border border-krona-border space-y-2`,children:[(0,j.jsx)(`div`,{className:`text-xs font-semibold text-krona-primary`,children:`Запланировать активность:`}),(0,j.jsxs)(`div`,{className:`flex gap-2`,children:[(0,j.jsxs)(`select`,{value:Ae,onChange:e=>je(e.target.value),className:`px-2.5 py-1 text-xs bg-krona-surface border border-krona-border rounded-md text-krona-primary`,children:[(0,j.jsx)(`option`,{value:`call`,children:`Звонок`}),(0,j.jsx)(`option`,{value:`meeting`,children:`Встреча`}),(0,j.jsx)(`option`,{value:`task`,children:`Задача`}),(0,j.jsx)(`option`,{value:`email`,children:`Email`})]}),(0,j.jsx)(`input`,{type:`text`,value:Oe,onChange:e=>ke(e.target.value),placeholder:`Например: Обсудить коммерческое предложение...`,className:`flex-1 px-3 py-1 text-xs bg-krona-surface border border-krona-border rounded-md text-krona-primary`}),(0,j.jsx)(r,{type:`submit`,variant:`primary`,size:`sm`,children:`Добавить`})]})]})}),Z===`timeline`&&(0,j.jsxs)(`div`,{className:`space-y-2.5 max-h-96 overflow-y-auto pr-1`,children:[De.map(e=>(0,j.jsxs)(`div`,{className:`p-3 rounded-lg border border-krona-border bg-krona-workspace text-xs space-y-1`,children:[(0,j.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,j.jsx)(`span`,{className:`font-bold text-krona-primary`,children:e.title}),(0,j.jsx)(`span`,{className:`text-[10px] text-krona-secondary`,children:y(e.timestamp)})]}),e.description&&(0,j.jsx)(`p`,{className:`text-krona-secondary text-[11px]`,children:e.description}),(0,j.jsxs)(`div`,{className:`text-[10px] text-krona-green font-medium`,children:[`Автор: `,e.actor]})]},e.id)),De.length===0&&(0,j.jsx)(`div`,{className:`text-center py-6 text-krona-secondary text-xs italic`,children:`Таймлайн пуст`})]})]})}),(0,j.jsx)(C,{isOpen:ve,onClose:()=>q(!1),title:`Сделка выиграна! Создать заказ в Коммерции?`,size:`md`,children:(0,j.jsxs)(`div`,{className:`space-y-4 text-xs`,children:[(0,j.jsxs)(`div`,{className:`p-3 bg-emerald-500/10 border border-emerald-500/30 rounded-lg text-emerald-800 dark:text-emerald-300`,children:[(0,j.jsx)(`strong`,{children:`Поздравляем с успехом!`}),` Сделка «`,J?.title,`» переведена в статус «Выиграна». Система предлагает автоматически сформировать коммерческий Заказ.`]}),(0,j.jsxs)(`div`,{className:`space-y-3`,children:[(0,j.jsxs)(`div`,{children:[(0,j.jsx)(`label`,{className:`block font-semibold text-krona-primary mb-1`,children:`Наименование заказа:`}),(0,j.jsx)(`input`,{type:`text`,value:be,onChange:e=>xe(e.target.value),className:`w-full px-3 py-1.5 bg-krona-workspace border border-krona-border rounded-lg text-krona-primary`})]}),(0,j.jsxs)(`div`,{children:[(0,j.jsx)(`label`,{className:`block font-semibold text-krona-primary mb-1`,children:`Сумма заказа (RUB):`}),(0,j.jsx)(`div`,{className:`font-bold text-sm text-krona-green py-1`,children:J?D(J.amount.minor):`0 ₽`})]}),(0,j.jsxs)(`div`,{children:[(0,j.jsx)(`label`,{className:`block font-semibold text-krona-primary mb-1`,children:`Склад отгрузки:`}),(0,j.jsxs)(`select`,{value:Se,onChange:e=>Ce(e.target.value),className:`w-full px-3 py-1.5 bg-krona-workspace border border-krona-border rounded-lg text-krona-primary`,children:[(0,j.jsx)(`option`,{value:`wh_main`,children:`Основной распределительный склад (Москва)`}),(0,j.jsx)(`option`,{value:`wh_spb`,children:`Склад Санкт-Петербург`})]})]})]}),(0,j.jsxs)(`div`,{className:`flex justify-end gap-2 pt-2 border-t border-krona-border`,children:[(0,j.jsx)(r,{variant:`secondary`,size:`sm`,onClick:()=>q(!1),children:`Не создавать сейчас`}),(0,j.jsxs)(r,{variant:`primary`,size:`sm`,"data-testid":`create-order-confirm-btn`,onClick:Be,children:[(0,j.jsx)(h,{className:`w-3.5 h-3.5 mr-1`}),` Создать заказ в Коммерции`]})]})]})}),(0,j.jsx)(C,{isOpen:pe,onClose:()=>K(!1),title:`Конвертация лида в сделку и контакт`,size:`md`,children:(0,j.jsxs)(`div`,{className:`space-y-4 text-xs`,children:[(0,j.jsx)(`p`,{className:`text-krona-secondary`,children:`При конвертации будет автоматически создан Контакт клиента и новая Сделка на этапе «Предложение».`}),(0,j.jsxs)(`div`,{children:[(0,j.jsx)(`label`,{className:`block font-semibold text-krona-primary mb-1`,children:`Название новой сделки:`}),(0,j.jsx)(`input`,{type:`text`,value:ge,onChange:e=>_e(e.target.value),className:`w-full px-3 py-1.5 bg-krona-workspace border border-krona-border rounded-lg text-krona-primary`})]}),(0,j.jsxs)(`div`,{className:`flex justify-end gap-2 pt-2 border-t border-krona-border`,children:[(0,j.jsx)(r,{variant:`secondary`,size:`sm`,onClick:()=>K(!1),children:`Отмена`}),(0,j.jsx)(r,{variant:`primary`,size:`sm`,"data-testid":`confirm-convert-lead-btn`,onClick:Ve,children:`Подтвердить конвертацию`})]})]})}),(0,j.jsx)(C,{isOpen:fe,onClose:()=>G(!1),title:`Создание нового лида`,size:`lg`,children:I.currentEntity?(0,j.jsx)(l,{entity:I.currentEntity,layout:I.layouts?.[0]||null,mode:`create`,onSave:async e=>{await re({title:String(e.title||`Новый лид`),contactName:String(e.contactName||e.title||`Контактное лицо`),phone:String(e.phone||`+7 (999) 000-00-00`),email:String(e.email||`lead@example.com`),companyName:String(e.companyName||``),status:`new`,source:`website`,estimatedValue:e.estimatedValue?{minor:Number(e.estimatedValue)||1e6,currency:`RUB`}:{minor:15e5,currency:`RUB`},customFields:e}),G(!1),n(`Лид успешно создан!`,`success`)},onCancel:()=>G(!1)}):(0,j.jsx)(`div`,{className:`p-4 text-center text-krona-secondary`,children:`Загрузка схемы...`})}),(0,j.jsx)(C,{isOpen:ue,onClose:()=>V(!1),title:`Создание нового контакта`,size:`lg`,children:M.currentEntity?(0,j.jsx)(l,{entity:M.currentEntity,layout:M.layouts?.[0]||null,mode:`create`,onSave:async e=>{await f({firstName:String(e.firstName||`Новый`),lastName:String(e.lastName||`Контакт`),phone:String(e.phone||``),email:String(e.email||``),jobTitle:String(e.jobTitle||``),roles:[`client`],status:`active`,customFields:e}),V(!1),n(`Контакт успешно создан!`,`success`)},onCancel:()=>V(!1)}):(0,j.jsx)(`div`,{className:`p-4 text-center text-krona-secondary`,children:`Загрузка схемы...`})}),(0,j.jsx)(C,{isOpen:H,onClose:()=>U(!1),title:`Создание новой компании`,size:`lg`,children:N.currentEntity?(0,j.jsx)(l,{entity:N.currentEntity,layout:N.layouts?.[0]||null,mode:`create`,onSave:async e=>{await p({name:String(e.name||`Новая компания`),inn:String(e.inn||``),address:String(e.city||e.address||`г. Москва`),phone:String(e.phone||``),roles:[`client`],status:`active`,customFields:e}),U(!1),n(`Компания успешно создана!`,`success`)},onCancel:()=>U(!1)}):(0,j.jsx)(`div`,{className:`p-4 text-center text-krona-secondary`,children:`Загрузка схемы...`})}),(0,j.jsx)(C,{isOpen:de,onClose:()=>W(!1),title:`Создание новой сделки`,size:`lg`,children:P.currentEntity?(0,j.jsx)(l,{entity:P.currentEntity,layout:P.layouts?.[0]||null,mode:`create`,onSave:async e=>{let t=typeof e.amount==`number`?e.amount:5e6;await te({title:String(e.title||`Новая сделка`),pipelineId:`pipe_default`,stage:`prospecting`,amount:{minor:t,currency:`RUB`},probability:20,contactId:i[0]?.id,companyId:o[0]?.id,customFields:e}),W(!1),n(`Сделка успешно создана в воронке!`,`success`)},onCancel:()=>W(!1)}):(0,j.jsx)(`div`,{className:`p-4 text-center text-krona-secondary`,children:`Загрузка схемы...`})})]})};export{I as CrmModule}; \ No newline at end of file diff --git a/dist/assets/CustomEntityPage-BBlkJ9R4.js b/dist/assets/CustomEntityPage-BBlkJ9R4.js deleted file mode 100644 index 3dc010c..0000000 --- a/dist/assets/CustomEntityPage-BBlkJ9R4.js +++ /dev/null @@ -1 +0,0 @@ -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}; \ No newline at end of file diff --git a/dist/assets/CustomEntityPage-B_J0Fvzq.js b/dist/assets/CustomEntityPage-B_J0Fvzq.js new file mode 100644 index 0000000..5c8cb60 --- /dev/null +++ b/dist/assets/CustomEntityPage-B_J0Fvzq.js @@ -0,0 +1 @@ +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-0ioSXYKX.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,B as O,I as k,K as A,M as j,R as M,T as N,a as P,b as F,ct as I,g as L,ht as R,j as z,lt as B,m as V,mt as H,n as U,nt as W,r as G,u as K,ut as q,z as J}from"./index-CrJKtV0u.js";import{t as Y}from"./currency-DdDs82F5.js";var 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 ee=i(X),Z=n(t(),1),Q=o(),te=({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)(P,{value:p,onChange:e=>{m(e.target.value),S(1)},placeholder:`Поиск по записям...`,icon:(0,Q.jsx)(F,{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)(N,{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)(K,{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)(ee,{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)(N,{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:`Вперёд`})]})]})]})]})},ne=({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,M]=(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 N=()=>{navigator.clipboard.writeText(JSON.stringify(n,null,2)),M(!0),d({type:`success`,title:`JSON скопирован в буфер обмена`}),setTimeout(()=>M(!1),2e3)},P=String(n.name||n.title||n[t.primaryFieldKey||`name`]||n.id),F=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)(k,{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:Y(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`?B(String(t)):I(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)(D,{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)(D,{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:P.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:P}),(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)(K,{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)(j,{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)(O,{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:F(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?B(String(n.audit.createdAt)):n.created_at?B(String(n.created_at)):`—`})]}),(0,Q.jsxs)(`div`,{children:[`Обновлено:`,` `,(0,Q.jsx)(`strong`,{className:`text-krona-primary`,children:B(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:B(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:N,children:[E?(0,Q.jsx)(A,{className:`w-3 h-3 mr-1 text-krona-green`}):(0,Q.jsx)(J,{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}=R(),n=H(),{currentEntity:i,views:o,layouts:c,loading:l}=W(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,D]=(0,Z.useState)(null),O=(0,Z.useMemo)(()=>e?new q(e):null,[e]),k=(0,Z.useCallback)(async()=>{if(O)try{m(!0);let e=await O.list({pageSize:100});f(e.items)}catch(e){u({type:`error`,title:`Ошибка загрузки записей`,message:e instanceof Error?e.message:String(e)})}finally{m(!1)}},[O,u]);(0,Z.useEffect)(()=>{Promise.resolve().then(()=>{k()})},[k]),(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&&O&&O.getById(t).then(e=>{e&&w(e)})},[t,O]);let A=(0,Z.useMemo)(()=>o.find(e=>e.id===h)||null,[o,h]),P=(0,Z.useMemo)(()=>c.find(e=>e.type===`form`||e.isDefault)||null,[c]),F=(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)(j,{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)(j,{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)(z,{className:`w-2.5 h-2.5 mr-1`}),`System`]}):(0,Q.jsxs)(a,{variant:`gold`,size:`sm`,children:[(0,Q.jsx)(V,{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)(L,{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)(M,{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)(N,{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)(te,{entity:i,records:d,view:A,isLoading:p,onRowClick:e=>w(e),onEdit:e=>x(e),onDelete:e=>D(e),onCreateNew:()=>y(!0)}),i&&(0,Q.jsx)(G,{isOpen:_,onClose:()=>y(!1),title:`Создать ${i.name}`,subtitle:`Заполните реквизиты сущности «${i.name}»`,maxWidth:`lg`,children:(0,Q.jsx)(v,{entity:i,layout:P,mode:`create`,onSave:async e=>{if(!O||!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 O.create(t),u({type:`success`,title:`Запись успешно создана`}),y(!1),await k()},onCancel:()=>y(!1)})}),i&&b&&(0,Q.jsx)(G,{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:P,mode:`edit`,onSave:async e=>{if(O&&b){if(await O.update(b.id,e),u({type:`success`,title:`Запись обновлена`}),x(null),C?.id===b.id){let e=await O.getById(b.id);w(e)}await k()}},onCancel:()=>x(null)})}),i&&C&&(0,Q.jsx)(U,{isOpen:!!C,onClose:()=>w(null),title:String(C.name||C.id),subtitle:`Карточка записи: ${i.name}`,width:`xl`,children:(0,Q.jsx)(ne,{entity:i,record:C,layout:F,onEdit:()=>{x(C),w(null)},onDelete:()=>{D(C)},onClose:()=>w(null)})}),(0,Q.jsx)(G,{isOpen:!!T,onClose:()=>D(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:()=>D(null),children:`Отмена`}),(0,Q.jsx)(r,{variant:`danger`,size:`sm`,onClick:async()=>{if(O&&T)try{await O.delete(T.id),u({type:`success`,title:`Запись удалена`}),D(null),C?.id===T.id&&w(null),await k()}catch(e){u({type:`error`,title:`Ошибка удаления`,message:e instanceof Error?e.message:String(e)})}},children:`Удалить запись`})]})]})})]})};export{$ as CustomEntityPage,$ as default}; \ No newline at end of file diff --git a/dist/assets/DynamicDashboard-BWfBzitG.js b/dist/assets/DynamicDashboard-BWfBzitG.js new file mode 100644 index 0000000..bce5c64 --- /dev/null +++ b/dist/assets/DynamicDashboard-BWfBzitG.js @@ -0,0 +1 @@ +import{f as e,h as t,i as n,r,s as i}from"./useToast-CS8pZhce.js";import{t as a}from"./dollar-sign-Bf6JneNn.js";import{t as o}from"./truck-D5o8mTsH.js";import{t as s}from"./utensils-BhILG_B7.js";import{B as c,D as l,H as u,J as d,M as f,Q as p,U as m,_ as h,c as g,dt as _,i as v,mt as y,o as b,s as x,t as S}from"./index-CrJKtV0u.js";import{t as C}from"./formatters-WvGQLZg0.js";import{O as w,d as T,f as E,ft as D,l as O,t as k,u as A}from"./AreaChart-tvNE-d9G.js";var j=t(e(),1),M=i(),N=[{time:`10:00`,revenue:14200,orders:4},{time:`12:00`,revenue:38400,orders:12},{time:`14:00`,revenue:76e3,orders:24},{time:`16:00`,revenue:104500,orders:32},{time:`18:00`,revenue:149e3,orders:45},{time:`20:00`,revenue:184500,orders:58}],P=[{time:`Пн`,revenue:142e3,orders:48},{time:`Вт`,revenue:156e3,orders:52},{time:`Ср`,revenue:168e3,orders:56},{time:`Чт`,revenue:174e3,orders:59},{time:`Пт`,revenue:245e3,orders:84},{time:`Сб`,revenue:29e4,orders:98},{time:`Вс`,revenue:26e4,orders:89}],F=()=>{let{getActiveProfile:e,getActiveCapabilities:t,activeLocation:i,setIsQuickActionsOpen:F,kdsTickets:I,deliveries:L,workOrders:R}=_(),z=e(),B=t(),V=y(),[H,U]=(0,j.useState)(`today`);return(0,M.jsxs)(`div`,{className:`space-y-5 animate-fade-in`,children:[(0,M.jsxs)(`div`,{className:`flex flex-col sm:flex-row sm:items-center justify-between gap-3 bg-krona-surface border border-krona-border rounded-xl p-4 shadow-krona-soft`,children:[(0,M.jsxs)(`div`,{children:[(0,M.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,M.jsxs)(`h1`,{className:`text-lg font-bold text-krona-primary tracking-tight`,children:[`Операционный центр • `,z.companyName]}),(0,M.jsx)(r,{variant:`gold`,size:`sm`,children:z.category}),(0,M.jsx)(S,{level:`pilot1`,size:`sm`})]}),(0,M.jsxs)(`p`,{className:`text-xs text-krona-secondary mt-1`,children:[`Локация: `,(0,M.jsx)(`span`,{className:`font-semibold text-krona-primary`,children:i}),` • Контур реального времени синхронизирован`]})]}),(0,M.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,M.jsx)(n,{variant:`outline`,size:`sm`,onClick:()=>V(`/operations`),children:`Открыть рабочий стол`}),(0,M.jsx)(n,{variant:`primary`,size:`sm`,onClick:()=>F(!0),children:`+ Быстрое действие`})]})]}),(()=>{switch(z.id){case`car_wash`:return(0,M.jsxs)(`div`,{className:`grid grid-cols-2 lg:grid-cols-4 gap-3.5`,children:[(0,M.jsx)(v,{title:`Машин в работе`,value:`${R.filter(e=>e.status===`in_progress`).length||4} авто`,change:{value:`+2`,trend:`up`},subtitle:`2 бокса на въезде`,icon:(0,M.jsx)(d,{className:`w-4 h-4 text-krona-info`})}),(0,M.jsx)(v,{title:`Загрузка боксов`,value:`83%`,change:{value:`+5%`,trend:`up`},subtitle:`5 из 6 боксов заняты`,icon:(0,M.jsx)(f,{className:`w-4 h-4 text-krona-gold`})}),(0,M.jsx)(v,{title:`Средний чек мойки`,value:C(1850),change:{value:`+12%`,trend:`up`},subtitle:`Комплекс + воск`,icon:(0,M.jsx)(g,{className:`w-4 h-4 text-krona-green`})}),(0,M.jsx)(v,{title:`Время на пост`,value:`28 минут`,change:{value:`-3 мин`,trend:`up`},subtitle:`Норматив: 30 мин`,icon:(0,M.jsx)(c,{className:`w-4 h-4 text-krona-green`})})]});case`auto_service`:return(0,M.jsxs)(`div`,{className:`grid grid-cols-2 lg:grid-cols-4 gap-3.5`,children:[(0,M.jsx)(v,{title:`Авто на постах`,value:`${R.length} авто`,change:{value:`+3`,trend:`up`},subtitle:`В работе: 3 • Ожидают: 1`,icon:(0,M.jsx)(d,{className:`w-4 h-4 text-krona-info`})}),(0,M.jsx)(v,{title:`Подъемники`,value:`4 из 4 заняты`,change:{value:`100%`,trend:`up`},subtitle:`Очередь: 2 авто`,icon:(0,M.jsx)(f,{className:`w-4 h-4 text-krona-gold`})}),(0,M.jsx)(v,{title:`Нормо-часы`,value:`42.5 н-ч`,change:{value:`+6.5`,trend:`up`},subtitle:`Ставка: 2 100 ₽/н-ч`,icon:(0,M.jsx)(c,{className:`w-4 h-4 text-krona-green`})}),(0,M.jsx)(v,{title:`Запчасти в нарядах`,value:C(186400),change:{value:`+18%`,trend:`up`},subtitle:`На складе: 94% позиций`,icon:(0,M.jsx)(a,{className:`w-4 h-4 text-krona-green`})})]});case`restaurant_delivery_only`:return(0,M.jsxs)(`div`,{className:`grid grid-cols-2 lg:grid-cols-4 gap-3.5`,children:[(0,M.jsx)(v,{title:`Выручка доставки`,value:C(142800),change:{value:`+22%`,trend:`up`},subtitle:`План: 130 000 ₽`,icon:(0,M.jsx)(a,{className:`w-4 h-4 text-krona-green`})}),(0,M.jsx)(v,{title:`Курьеров на линии`,value:`${L.filter(e=>e.status===`in_transit`).length+3} курьера`,change:{value:`+2`,trend:`up`},subtitle:`3 на авто, 2 самокат`,icon:(0,M.jsx)(o,{className:`w-4 h-4 text-krona-gold`})}),(0,M.jsx)(v,{title:`Среднее время доставки`,value:`34 мин`,change:{value:`-4 мин`,trend:`up`},subtitle:`Готовка 14 мин + путь 20 мин`,icon:(0,M.jsx)(c,{className:`w-4 h-4 text-krona-green`})}),(0,M.jsx)(v,{title:`Онлайн-чеков`,value:`${L.length+38} заказов`,change:{value:`+14`,trend:`up`},subtitle:`Сайт: 60% • Бот: 40%`,icon:(0,M.jsx)(h,{className:`w-4 h-4 text-krona-info`})})]});case`fitness`:return(0,M.jsxs)(`div`,{className:`grid grid-cols-2 lg:grid-cols-4 gap-3.5`,children:[(0,M.jsx)(v,{title:`Активных абонементов`,value:`840 карт`,change:{value:`+32`,trend:`up`},subtitle:`Продлений в мес: 78%`,icon:(0,M.jsx)(b,{className:`w-4 h-4 text-krona-green`})}),(0,M.jsx)(v,{title:`Загрузка залов`,value:`72%`,change:{value:`+8%`,trend:`up`},subtitle:`Пик: 18:00 - 21:00`,icon:(0,M.jsx)(f,{className:`w-4 h-4 text-krona-gold`})}),(0,M.jsx)(v,{title:`Тренировок сегодня`,value:`18 занятий`,subtitle:`Персональных: 12`,icon:(0,M.jsx)(c,{className:`w-4 h-4 text-krona-info`})}),(0,M.jsx)(v,{title:`Выручка сегодня`,value:C(92e3),change:{value:`+15%`,trend:`up`},subtitle:`Карты + спортбар`,icon:(0,M.jsx)(a,{className:`w-4 h-4 text-krona-green`})})]});case`clinic`:return(0,M.jsxs)(`div`,{className:`grid grid-cols-2 lg:grid-cols-4 gap-3.5`,children:[(0,M.jsx)(v,{title:`Приёмов сегодня`,value:`36 пациентов`,change:{value:`+4`,trend:`up`},subtitle:`Подтверждено: 34`,icon:(0,M.jsx)(b,{className:`w-4 h-4 text-krona-green`})}),(0,M.jsx)(v,{title:`Занятость кабинетов`,value:`90%`,change:{value:`+6%`,trend:`up`},subtitle:`9 из 10 кабинетов`,icon:(0,M.jsx)(f,{className:`w-4 h-4 text-krona-gold`})}),(0,M.jsx)(v,{title:`Средний чек приема`,value:C(3400),change:{value:`+300 ₽`,trend:`up`},subtitle:`Первичный + анализы`,icon:(0,M.jsx)(g,{className:`w-4 h-4 text-krona-gold`})}),(0,M.jsx)(v,{title:`Выручка сегодня`,value:C(122400),change:{value:`+11%`,trend:`up`},subtitle:`Оплата картами: 82%`,icon:(0,M.jsx)(a,{className:`w-4 h-4 text-krona-green`})})]});case`coworking`:return(0,M.jsxs)(`div`,{className:`grid grid-cols-2 lg:grid-cols-4 gap-3.5`,children:[(0,M.jsx)(v,{title:`Занятость рабочих мест`,value:`88% (44 из 50)`,change:{value:`+6%`,trend:`up`},subtitle:`Свободно 6 мест`,icon:(0,M.jsx)(f,{className:`w-4 h-4 text-krona-gold`})}),(0,M.jsx)(v,{title:`Брони переговорных`,value:`9 броней`,change:{value:`+2`,trend:`up`},subtitle:`Зал А, Б и Скайп-румы`,icon:(0,M.jsx)(c,{className:`w-4 h-4 text-krona-info`})}),(0,M.jsx)(v,{title:`Активных резидентов`,value:`64 чел`,subtitle:`Командных офисов: 6`,icon:(0,M.jsx)(b,{className:`w-4 h-4 text-krona-green`})}),(0,M.jsx)(v,{title:`Выручка сегодня`,value:C(45e3),change:{value:`+8%`,trend:`up`},subtitle:`Дневные пропуски + кофе`,icon:(0,M.jsx)(a,{className:`w-4 h-4 text-krona-green`})})]});case`logistics`:return(0,M.jsxs)(`div`,{className:`grid grid-cols-2 lg:grid-cols-4 gap-3.5`,children:[(0,M.jsx)(v,{title:`Заказов в пути`,value:`18 отправлений`,change:{value:`+5`,trend:`up`},subtitle:`В доставке прямо сейчас`,icon:(0,M.jsx)(o,{className:`w-4 h-4 text-krona-info`})}),(0,M.jsx)(v,{title:`Доставлено вовремя %`,value:`97.8%`,change:{value:`+0.5%`,trend:`up`},subtitle:`SLA: 95%`,icon:(0,M.jsx)(u,{className:`w-4 h-4 text-krona-green`})}),(0,M.jsx)(v,{title:`Курьеров на маршрутах`,value:`8 курьеров`,subtitle:`Авто: 5, Мото: 3`,icon:(0,M.jsx)(b,{className:`w-4 h-4 text-krona-gold`})}),(0,M.jsx)(v,{title:`Среднее время рейса`,value:`26 минут`,change:{value:`-2 мин`,trend:`up`},subtitle:`Городской экспресс`,icon:(0,M.jsx)(c,{className:`w-4 h-4 text-krona-green`})})]});case`retail`:return(0,M.jsxs)(`div`,{className:`grid grid-cols-2 lg:grid-cols-4 gap-3.5`,children:[(0,M.jsx)(v,{title:`Выручка магазина`,value:C(248e3),change:{value:`+19%`,trend:`up`},subtitle:`Чеков сегодня: 142`,icon:(0,M.jsx)(h,{className:`w-4 h-4 text-krona-green`})}),(0,M.jsx)(v,{title:`Средний чек`,value:C(1746),change:{value:`+4%`,trend:`up`},subtitle:`Товаров в чеке: 3.2`,icon:(0,M.jsx)(g,{className:`w-4 h-4 text-krona-gold`})}),(0,M.jsx)(v,{title:`Товарных позиций на складе`,value:`1 420 SKU`,subtitle:`Критический остаток: 4 SKU`,icon:(0,M.jsx)(l,{className:`w-4 h-4 text-krona-info`})}),(0,M.jsx)(v,{title:`Оборачиваемость склада`,value:`14.2 дня`,change:{value:`-1.5 дн`,trend:`up`},subtitle:`Маржинальность: 42.4%`,icon:(0,M.jsx)(a,{className:`w-4 h-4 text-krona-green`})})]});case`beauty_services`:return(0,M.jsxs)(`div`,{className:`grid grid-cols-2 lg:grid-cols-4 gap-3.5`,children:[(0,M.jsx)(v,{title:`Выручка салона`,value:C(124e3),change:{value:`+12%`,trend:`up`},subtitle:`18 визитов сегодня`,icon:(0,M.jsx)(a,{className:`w-4 h-4 text-krona-green`})}),(0,M.jsx)(v,{title:`Загрузка мастеров`,value:`86%`,change:{value:`+5%`,trend:`up`},subtitle:`5 мастеров на смене`,icon:(0,M.jsx)(b,{className:`w-4 h-4 text-krona-gold`})}),(0,M.jsx)(v,{title:`Записей на сегодня`,value:`22 клиента`,subtitle:`Подтверждено: 19`,icon:(0,M.jsx)(c,{className:`w-4 h-4 text-krona-info`})}),(0,M.jsx)(v,{title:`Средний чек визита`,value:C(4850),change:{value:`+350 ₽`,trend:`up`},subtitle:`Услуги + уход дома`,icon:(0,M.jsx)(g,{className:`w-4 h-4 text-krona-green`})})]});case`wholesale_b2b`:return(0,M.jsxs)(`div`,{className:`grid grid-cols-2 lg:grid-cols-4 gap-3.5`,children:[(0,M.jsx)(v,{title:`Объем отгрузок сегодня`,value:C(145e4),change:{value:`+24%`,trend:`up`},subtitle:`9 партий сформировано`,icon:(0,M.jsx)(a,{className:`w-4 h-4 text-krona-green`})}),(0,M.jsx)(v,{title:`Активные B2B контракты`,value:`42 контрагента`,subtitle:`В согласовании: 3`,icon:(0,M.jsx)(b,{className:`w-4 h-4 text-krona-info`})}),(0,M.jsx)(v,{title:`Дебиторская задолженность`,value:C(84e4),change:{value:`-8%`,trend:`up`},subtitle:`Просрочено: 95 000 ₽`,icon:(0,M.jsx)(g,{className:`w-4 h-4 text-krona-gold`})}),(0,M.jsx)(v,{title:`Загрузка распредцентра`,value:`84%`,subtitle:`Свободно 320 паллетомест`,icon:(0,M.jsx)(l,{className:`w-4 h-4 text-krona-green`})})]});default:return(0,M.jsxs)(`div`,{className:`grid grid-cols-2 lg:grid-cols-5 gap-3.5`,children:[(0,M.jsx)(v,{title:`Выручка сегодня`,value:C(184500),change:{value:`+14%`,trend:`up`},subtitle:`План: 170 000 ₽ (108%)`,icon:(0,M.jsx)(a,{className:`w-4 h-4 text-krona-green`})}),(0,M.jsx)(v,{title:`Заказы`,value:`58 чеков`,change:{value:`+8`,trend:`up`},subtitle:`Зал: 34 • Доставка: 24`,icon:(0,M.jsx)(s,{className:`w-4 h-4 text-krona-gold`})}),(0,M.jsx)(v,{title:`Средний чек`,value:C(3180),change:{value:`+6.2%`,trend:`up`},subtitle:`Зал: 3 650 ₽ • Онлайн: 2 450 ₽`,icon:(0,M.jsx)(g,{className:`w-4 h-4 text-krona-green`})}),(0,M.jsx)(v,{title:`Загрузка зала`,value:`82%`,change:{value:`+12%`,trend:`up`},subtitle:`11 из 14 столов заняты`,icon:(0,M.jsx)(b,{className:`w-4 h-4 text-krona-info`})}),(0,M.jsx)(v,{title:`Food Cost / Маржа`,value:`29.4%`,change:{value:`-0.8%`,trend:`up`},subtitle:`Маржинальность: 70.6%`,icon:(0,M.jsx)(l,{className:`w-4 h-4 text-krona-green`})})]})}})(),(0,M.jsxs)(`div`,{className:`bg-krona-surface border border-krona-border rounded-xl p-4 shadow-krona-soft`,children:[(0,M.jsxs)(`div`,{className:`flex items-center justify-between mb-4`,children:[(0,M.jsxs)(`div`,{children:[(0,M.jsx)(`h3`,{className:`text-sm font-semibold text-krona-primary`,children:`Динамика выручки и среднего чека`}),(0,M.jsx)(`p`,{className:`text-xs text-krona-secondary`,children:`Почасовая разбивка с кассовых узлов и онлайн-заказов`})]}),(0,M.jsxs)(`div`,{className:`flex items-center gap-1 bg-krona-workspace p-1 rounded-lg border border-krona-border text-xs`,children:[(0,M.jsx)(`button`,{onClick:()=>U(`today`),className:`px-3 py-1 rounded font-medium transition-colors ${H===`today`?`bg-[#2F684C] text-white`:`text-krona-secondary hover:text-krona-primary`}`,children:`Сегодня`}),(0,M.jsx)(`button`,{onClick:()=>U(`week`),className:`px-3 py-1 rounded font-medium transition-colors ${H===`week`?`bg-[#2F684C] text-white`:`text-krona-secondary hover:text-krona-primary`}`,children:`Неделя`})]})]}),(0,M.jsx)(`div`,{className:`h-64 w-full`,children:(0,M.jsx)(D,{width:`100%`,height:`100%`,children:(0,M.jsxs)(k,{data:H===`today`?N:P,children:[(0,M.jsx)(`defs`,{children:(0,M.jsxs)(`linearGradient`,{id:`colorRev`,x1:`0`,y1:`0`,x2:`0`,y2:`1`,children:[(0,M.jsx)(`stop`,{offset:`5%`,stopColor:`#2F684C`,stopOpacity:.4}),(0,M.jsx)(`stop`,{offset:`95%`,stopColor:`#2F684C`,stopOpacity:0})]})}),(0,M.jsx)(E,{strokeDasharray:`3 3`,stroke:`#D8D5CB`,opacity:.4}),(0,M.jsx)(A,{dataKey:`time`,stroke:`#686C65`,fontSize:11}),(0,M.jsx)(O,{stroke:`#686C65`,fontSize:11,tickFormatter:e=>`${e/1e3}k`}),(0,M.jsx)(w,{formatter:e=>[C(Number(e)),`Выручка`],contentStyle:{backgroundColor:`#F8F6F0`,borderColor:`#D8D5CB`,borderRadius:8,fontSize:12}}),(0,M.jsx)(T,{type:`monotone`,dataKey:`revenue`,stroke:`#2F684C`,strokeWidth:2.5,fillOpacity:1,fill:`url(#colorRev)`})]})})})]}),(0,M.jsxs)(`div`,{className:`bg-krona-surface border border-krona-border rounded-xl p-4 shadow-krona-soft`,children:[(0,M.jsxs)(`div`,{className:`flex items-center justify-between mb-3`,children:[(0,M.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,M.jsx)(x,{className:`w-4 h-4 text-krona-warning`}),(0,M.jsx)(`h3`,{className:`text-sm font-semibold text-krona-primary`,children:`Требует внимания управляющего`})]}),(0,M.jsx)(`span`,{className:`text-xs text-krona-secondary`,children:`3 критических инцидента`})]}),(0,M.jsxs)(`div`,{className:`grid grid-cols-1 md:grid-cols-3 gap-3`,children:[(0,M.jsxs)(`div`,{className:`p-3 rounded-lg border border-krona-danger/40 bg-krona-danger/10 flex flex-col justify-between`,children:[(0,M.jsxs)(`div`,{children:[(0,M.jsxs)(`div`,{className:`flex items-center gap-1.5 text-xs font-semibold text-krona-danger`,children:[(0,M.jsx)(m,{className:`w-4 h-4`}),(0,M.jsx)(`span`,{children:`Критический остаток`})]}),(0,M.jsxs)(`p`,{className:`text-xs text-krona-primary mt-1.5 leading-relaxed`,children:[`Лосось охлажденный: осталось `,(0,M.jsx)(`strong`,{children:`2.4 кг`}),` (порог 6 кг). Хватит на ~2.5 часа работы кухни.`]})]}),(0,M.jsxs)(n,{variant:`outline`,size:`sm`,className:`mt-3 bg-krona-surface text-xs justify-between`,onClick:()=>V(`/operations/inventory`),children:[(0,M.jsx)(`span`,{children:`Заявка поставщику`}),(0,M.jsx)(p,{className:`w-3.5 h-3.5`})]})]}),(0,M.jsxs)(`div`,{className:`p-3 rounded-lg border border-krona-warning/40 bg-krona-warning/10 flex flex-col justify-between`,children:[(0,M.jsxs)(`div`,{children:[(0,M.jsxs)(`div`,{className:`flex items-center gap-1.5 text-xs font-semibold text-krona-warning`,children:[(0,M.jsx)(c,{className:`w-4 h-4`}),(0,M.jsx)(`span`,{children:`Задержка на кухне (KDS)`})]}),(0,M.jsxs)(`p`,{className:`text-xs text-krona-primary mt-1.5 leading-relaxed`,children:[`Заказ #104 на `,(0,M.jsx)(`strong`,{children:`Стол 4`}),` находится в работе уже 18 минут при норме 12 минут.`]})]}),(0,M.jsxs)(n,{variant:`outline`,size:`sm`,className:`mt-3 bg-krona-surface text-xs justify-between`,onClick:()=>V(`/operations/kds`),children:[(0,M.jsx)(`span`,{children:`Открыть KDS кухни`}),(0,M.jsx)(p,{className:`w-3.5 h-3.5`})]})]}),(0,M.jsxs)(`div`,{className:`p-3 rounded-lg border border-krona-info/40 bg-krona-info/10 flex flex-col justify-between`,children:[(0,M.jsxs)(`div`,{children:[(0,M.jsxs)(`div`,{className:`flex items-center gap-1.5 text-xs font-semibold text-krona-info`,children:[(0,M.jsx)(o,{className:`w-4 h-4`}),(0,M.jsx)(`span`,{children:`Наличные у курьера`})]}),(0,M.jsxs)(`p`,{className:`text-xs text-krona-primary mt-1.5 leading-relaxed`,children:[`Курьер Алексей Смирнов держит `,(0,M.jsx)(`strong`,{children:`24 500 ₽`}),` наличными после 7 доставок.`]})]}),(0,M.jsxs)(n,{variant:`outline`,size:`sm`,className:`mt-3 bg-krona-surface text-xs justify-between`,onClick:()=>V(`/operations/delivery`),children:[(0,M.jsx)(`span`,{children:`Принять инкассацию`}),(0,M.jsx)(p,{className:`w-3.5 h-3.5`})]})]})]})]}),(0,M.jsxs)(`div`,{className:`grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-3.5`,children:[B.dining&&(0,M.jsxs)(`div`,{className:`bg-krona-surface border border-krona-border rounded-lg p-3.5 shadow-krona-soft`,children:[(0,M.jsxs)(`div`,{className:`flex items-center justify-between text-xs mb-2`,children:[(0,M.jsx)(`span`,{className:`font-semibold text-krona-primary`,children:`Зал и столы`}),(0,M.jsx)(r,{variant:`green`,size:`sm`,children:`82% занято`})]}),(0,M.jsxs)(`div`,{className:`text-xs text-krona-secondary space-y-1`,children:[(0,M.jsxs)(`div`,{className:`flex justify-between`,children:[(0,M.jsx)(`span`,{children:`Открытых чеков:`}),(0,M.jsx)(`span`,{className:`font-medium text-krona-primary`,children:`11 столов`})]}),(0,M.jsxs)(`div`,{className:`flex justify-between`,children:[(0,M.jsx)(`span`,{children:`Среднее время посадки:`}),(0,M.jsx)(`span`,{className:`font-medium text-krona-primary`,children:`48 минут`})]})]}),(0,M.jsx)(`button`,{onClick:()=>V(`/operations/dining`),className:`mt-2.5 text-xs text-krona-green font-medium hover:underline block`,children:`Схема зала →`})]}),B.kds&&(0,M.jsxs)(`div`,{className:`bg-krona-surface border border-krona-border rounded-lg p-3.5 shadow-krona-soft`,children:[(0,M.jsxs)(`div`,{className:`flex items-center justify-between text-xs mb-2`,children:[(0,M.jsx)(`span`,{className:`font-semibold text-krona-primary`,children:`Кухня (KDS)`}),(0,M.jsxs)(r,{variant:`gold`,size:`sm`,children:[I.length,` в работе`]})]}),(0,M.jsxs)(`div`,{className:`text-xs text-krona-secondary space-y-1`,children:[(0,M.jsxs)(`div`,{className:`flex justify-between`,children:[(0,M.jsx)(`span`,{children:`Суши-цех:`}),(0,M.jsx)(`span`,{className:`font-medium text-krona-primary`,children:`4 блюда`})]}),(0,M.jsxs)(`div`,{className:`flex justify-between`,children:[(0,M.jsx)(`span`,{children:`Горячий цех:`}),(0,M.jsx)(`span`,{className:`font-medium text-krona-primary`,children:`2 блюда`})]})]}),(0,M.jsx)(`button`,{onClick:()=>V(`/operations/kds`),className:`mt-2.5 text-xs text-krona-green font-medium hover:underline block`,children:`Кухонный экран →`})]}),B.delivery&&(0,M.jsxs)(`div`,{className:`bg-krona-surface border border-krona-border rounded-lg p-3.5 shadow-krona-soft`,children:[(0,M.jsxs)(`div`,{className:`flex items-center justify-between text-xs mb-2`,children:[(0,M.jsx)(`span`,{className:`font-semibold text-krona-primary`,children:`Доставка & Курьеры`}),(0,M.jsx)(r,{variant:`info`,size:`sm`,children:`3 в пути`})]}),(0,M.jsxs)(`div`,{className:`text-xs text-krona-secondary space-y-1`,children:[(0,M.jsxs)(`div`,{className:`flex justify-between`,children:[(0,M.jsx)(`span`,{children:`Среднее время доставки:`}),(0,M.jsx)(`span`,{className:`font-medium text-krona-primary`,children:`34 мин`})]}),(0,M.jsxs)(`div`,{className:`flex justify-between`,children:[(0,M.jsx)(`span`,{children:`Курьеров на линии:`}),(0,M.jsx)(`span`,{className:`font-medium text-krona-primary`,children:`4 сотрудника`})]})]}),(0,M.jsx)(`button`,{onClick:()=>V(`/operations/delivery`),className:`mt-2.5 text-xs text-krona-green font-medium hover:underline block`,children:`Управление доставкой →`})]}),(0,M.jsxs)(`div`,{className:`bg-krona-surface border border-krona-border rounded-lg p-3.5 shadow-krona-soft`,children:[(0,M.jsxs)(`div`,{className:`flex items-center justify-between text-xs mb-2`,children:[(0,M.jsx)(`span`,{className:`font-semibold text-krona-primary`,children:`Финансы & Кассы`}),(0,M.jsx)(r,{variant:`green`,size:`sm`,children:`Смены открыты`})]}),(0,M.jsxs)(`div`,{className:`text-xs text-krona-secondary space-y-1`,children:[(0,M.jsxs)(`div`,{className:`flex justify-between`,children:[(0,M.jsx)(`span`,{children:`Наличные в кассе:`}),(0,M.jsx)(`span`,{className:`font-medium text-krona-primary`,children:`42 800 ₽`})]}),(0,M.jsxs)(`div`,{className:`flex justify-between`,children:[(0,M.jsx)(`span`,{children:`Безнал / Эквайринг:`}),(0,M.jsx)(`span`,{className:`font-medium text-krona-primary`,children:`141 700 ₽`})]})]}),(0,M.jsx)(`button`,{onClick:()=>V(`/finance`),className:`mt-2.5 text-xs text-krona-green font-medium hover:underline block`,children:`ДДС & Сальдо →`})]})]})]})};export{F as DynamicDashboard}; \ No newline at end of file diff --git a/dist/assets/DynamicDashboard-CEusXfUQ.js b/dist/assets/DynamicDashboard-CEusXfUQ.js deleted file mode 100644 index c0eafe1..0000000 --- a/dist/assets/DynamicDashboard-CEusXfUQ.js +++ /dev/null @@ -1 +0,0 @@ -import{f as e,h as t,i as n,r,s as i}from"./useToast-CS8pZhce.js";import{t as a}from"./dollar-sign-Bf6JneNn.js";import{t as o}from"./truck-D5o8mTsH.js";import{t as s}from"./utensils-BhILG_B7.js";import{B as c,E as l,K as u,R as d,V as f,X as p,c as m,ft as h,g,i as _,j as v,lt as y,o as b,s as x,t as S}from"./index-CNnq9VO5.js";import{t as C}from"./formatters-WvGQLZg0.js";import{O as w,d as T,f as E,ft as D,l as O,t as k,u as A}from"./AreaChart-BnzyacT3.js";var j=t(e(),1),M=i(),N=[{time:`10:00`,revenue:14200,orders:4},{time:`12:00`,revenue:38400,orders:12},{time:`14:00`,revenue:76e3,orders:24},{time:`16:00`,revenue:104500,orders:32},{time:`18:00`,revenue:149e3,orders:45},{time:`20:00`,revenue:184500,orders:58}],P=[{time:`Пн`,revenue:142e3,orders:48},{time:`Вт`,revenue:156e3,orders:52},{time:`Ср`,revenue:168e3,orders:56},{time:`Чт`,revenue:174e3,orders:59},{time:`Пт`,revenue:245e3,orders:84},{time:`Сб`,revenue:29e4,orders:98},{time:`Вс`,revenue:26e4,orders:89}],F=()=>{let{getActiveProfile:e,getActiveCapabilities:t,activeLocation:i,setIsQuickActionsOpen:F,kdsTickets:I,deliveries:L,workOrders:R}=y(),z=e(),B=t(),V=h(),[H,U]=(0,j.useState)(`today`);return(0,M.jsxs)(`div`,{className:`space-y-5 animate-fade-in`,children:[(0,M.jsxs)(`div`,{className:`flex flex-col sm:flex-row sm:items-center justify-between gap-3 bg-krona-surface border border-krona-border rounded-xl p-4 shadow-krona-soft`,children:[(0,M.jsxs)(`div`,{children:[(0,M.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,M.jsxs)(`h1`,{className:`text-lg font-bold text-krona-primary tracking-tight`,children:[`Операционный центр • `,z.companyName]}),(0,M.jsx)(r,{variant:`gold`,size:`sm`,children:z.category}),(0,M.jsx)(S,{level:`pilot1`,size:`sm`})]}),(0,M.jsxs)(`p`,{className:`text-xs text-krona-secondary mt-1`,children:[`Локация: `,(0,M.jsx)(`span`,{className:`font-semibold text-krona-primary`,children:i}),` • Контур реального времени синхронизирован`]})]}),(0,M.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,M.jsx)(n,{variant:`outline`,size:`sm`,onClick:()=>V(`/operations`),children:`Открыть рабочий стол`}),(0,M.jsx)(n,{variant:`primary`,size:`sm`,onClick:()=>F(!0),children:`+ Быстрое действие`})]})]}),(()=>{switch(z.id){case`car_wash`:return(0,M.jsxs)(`div`,{className:`grid grid-cols-2 lg:grid-cols-4 gap-3.5`,children:[(0,M.jsx)(_,{title:`Машин в работе`,value:`${R.filter(e=>e.status===`in_progress`).length||4} авто`,change:{value:`+2`,trend:`up`},subtitle:`2 бокса на въезде`,icon:(0,M.jsx)(u,{className:`w-4 h-4 text-krona-info`})}),(0,M.jsx)(_,{title:`Загрузка боксов`,value:`83%`,change:{value:`+5%`,trend:`up`},subtitle:`5 из 6 боксов заняты`,icon:(0,M.jsx)(v,{className:`w-4 h-4 text-krona-gold`})}),(0,M.jsx)(_,{title:`Средний чек мойки`,value:C(1850),change:{value:`+12%`,trend:`up`},subtitle:`Комплекс + воск`,icon:(0,M.jsx)(m,{className:`w-4 h-4 text-krona-green`})}),(0,M.jsx)(_,{title:`Время на пост`,value:`28 минут`,change:{value:`-3 мин`,trend:`up`},subtitle:`Норматив: 30 мин`,icon:(0,M.jsx)(d,{className:`w-4 h-4 text-krona-green`})})]});case`auto_service`:return(0,M.jsxs)(`div`,{className:`grid grid-cols-2 lg:grid-cols-4 gap-3.5`,children:[(0,M.jsx)(_,{title:`Авто на постах`,value:`${R.length} авто`,change:{value:`+3`,trend:`up`},subtitle:`В работе: 3 • Ожидают: 1`,icon:(0,M.jsx)(u,{className:`w-4 h-4 text-krona-info`})}),(0,M.jsx)(_,{title:`Подъемники`,value:`4 из 4 заняты`,change:{value:`100%`,trend:`up`},subtitle:`Очередь: 2 авто`,icon:(0,M.jsx)(v,{className:`w-4 h-4 text-krona-gold`})}),(0,M.jsx)(_,{title:`Нормо-часы`,value:`42.5 н-ч`,change:{value:`+6.5`,trend:`up`},subtitle:`Ставка: 2 100 ₽/н-ч`,icon:(0,M.jsx)(d,{className:`w-4 h-4 text-krona-green`})}),(0,M.jsx)(_,{title:`Запчасти в нарядах`,value:C(186400),change:{value:`+18%`,trend:`up`},subtitle:`На складе: 94% позиций`,icon:(0,M.jsx)(a,{className:`w-4 h-4 text-krona-green`})})]});case`restaurant_delivery_only`:return(0,M.jsxs)(`div`,{className:`grid grid-cols-2 lg:grid-cols-4 gap-3.5`,children:[(0,M.jsx)(_,{title:`Выручка доставки`,value:C(142800),change:{value:`+22%`,trend:`up`},subtitle:`План: 130 000 ₽`,icon:(0,M.jsx)(a,{className:`w-4 h-4 text-krona-green`})}),(0,M.jsx)(_,{title:`Курьеров на линии`,value:`${L.filter(e=>e.status===`in_transit`).length+3} курьера`,change:{value:`+2`,trend:`up`},subtitle:`3 на авто, 2 самокат`,icon:(0,M.jsx)(o,{className:`w-4 h-4 text-krona-gold`})}),(0,M.jsx)(_,{title:`Среднее время доставки`,value:`34 мин`,change:{value:`-4 мин`,trend:`up`},subtitle:`Готовка 14 мин + путь 20 мин`,icon:(0,M.jsx)(d,{className:`w-4 h-4 text-krona-green`})}),(0,M.jsx)(_,{title:`Онлайн-чеков`,value:`${L.length+38} заказов`,change:{value:`+14`,trend:`up`},subtitle:`Сайт: 60% • Бот: 40%`,icon:(0,M.jsx)(g,{className:`w-4 h-4 text-krona-info`})})]});case`fitness`:return(0,M.jsxs)(`div`,{className:`grid grid-cols-2 lg:grid-cols-4 gap-3.5`,children:[(0,M.jsx)(_,{title:`Активных абонементов`,value:`840 карт`,change:{value:`+32`,trend:`up`},subtitle:`Продлений в мес: 78%`,icon:(0,M.jsx)(b,{className:`w-4 h-4 text-krona-green`})}),(0,M.jsx)(_,{title:`Загрузка залов`,value:`72%`,change:{value:`+8%`,trend:`up`},subtitle:`Пик: 18:00 - 21:00`,icon:(0,M.jsx)(v,{className:`w-4 h-4 text-krona-gold`})}),(0,M.jsx)(_,{title:`Тренировок сегодня`,value:`18 занятий`,subtitle:`Персональных: 12`,icon:(0,M.jsx)(d,{className:`w-4 h-4 text-krona-info`})}),(0,M.jsx)(_,{title:`Выручка сегодня`,value:C(92e3),change:{value:`+15%`,trend:`up`},subtitle:`Карты + спортбар`,icon:(0,M.jsx)(a,{className:`w-4 h-4 text-krona-green`})})]});case`clinic`:return(0,M.jsxs)(`div`,{className:`grid grid-cols-2 lg:grid-cols-4 gap-3.5`,children:[(0,M.jsx)(_,{title:`Приёмов сегодня`,value:`36 пациентов`,change:{value:`+4`,trend:`up`},subtitle:`Подтверждено: 34`,icon:(0,M.jsx)(b,{className:`w-4 h-4 text-krona-green`})}),(0,M.jsx)(_,{title:`Занятость кабинетов`,value:`90%`,change:{value:`+6%`,trend:`up`},subtitle:`9 из 10 кабинетов`,icon:(0,M.jsx)(v,{className:`w-4 h-4 text-krona-gold`})}),(0,M.jsx)(_,{title:`Средний чек приема`,value:C(3400),change:{value:`+300 ₽`,trend:`up`},subtitle:`Первичный + анализы`,icon:(0,M.jsx)(m,{className:`w-4 h-4 text-krona-gold`})}),(0,M.jsx)(_,{title:`Выручка сегодня`,value:C(122400),change:{value:`+11%`,trend:`up`},subtitle:`Оплата картами: 82%`,icon:(0,M.jsx)(a,{className:`w-4 h-4 text-krona-green`})})]});case`coworking`:return(0,M.jsxs)(`div`,{className:`grid grid-cols-2 lg:grid-cols-4 gap-3.5`,children:[(0,M.jsx)(_,{title:`Занятость рабочих мест`,value:`88% (44 из 50)`,change:{value:`+6%`,trend:`up`},subtitle:`Свободно 6 мест`,icon:(0,M.jsx)(v,{className:`w-4 h-4 text-krona-gold`})}),(0,M.jsx)(_,{title:`Брони переговорных`,value:`9 броней`,change:{value:`+2`,trend:`up`},subtitle:`Зал А, Б и Скайп-румы`,icon:(0,M.jsx)(d,{className:`w-4 h-4 text-krona-info`})}),(0,M.jsx)(_,{title:`Активных резидентов`,value:`64 чел`,subtitle:`Командных офисов: 6`,icon:(0,M.jsx)(b,{className:`w-4 h-4 text-krona-green`})}),(0,M.jsx)(_,{title:`Выручка сегодня`,value:C(45e3),change:{value:`+8%`,trend:`up`},subtitle:`Дневные пропуски + кофе`,icon:(0,M.jsx)(a,{className:`w-4 h-4 text-krona-green`})})]});case`logistics`:return(0,M.jsxs)(`div`,{className:`grid grid-cols-2 lg:grid-cols-4 gap-3.5`,children:[(0,M.jsx)(_,{title:`Заказов в пути`,value:`18 отправлений`,change:{value:`+5`,trend:`up`},subtitle:`В доставке прямо сейчас`,icon:(0,M.jsx)(o,{className:`w-4 h-4 text-krona-info`})}),(0,M.jsx)(_,{title:`Доставлено вовремя %`,value:`97.8%`,change:{value:`+0.5%`,trend:`up`},subtitle:`SLA: 95%`,icon:(0,M.jsx)(c,{className:`w-4 h-4 text-krona-green`})}),(0,M.jsx)(_,{title:`Курьеров на маршрутах`,value:`8 курьеров`,subtitle:`Авто: 5, Мото: 3`,icon:(0,M.jsx)(b,{className:`w-4 h-4 text-krona-gold`})}),(0,M.jsx)(_,{title:`Среднее время рейса`,value:`26 минут`,change:{value:`-2 мин`,trend:`up`},subtitle:`Городской экспресс`,icon:(0,M.jsx)(d,{className:`w-4 h-4 text-krona-green`})})]});case`retail`:return(0,M.jsxs)(`div`,{className:`grid grid-cols-2 lg:grid-cols-4 gap-3.5`,children:[(0,M.jsx)(_,{title:`Выручка магазина`,value:C(248e3),change:{value:`+19%`,trend:`up`},subtitle:`Чеков сегодня: 142`,icon:(0,M.jsx)(g,{className:`w-4 h-4 text-krona-green`})}),(0,M.jsx)(_,{title:`Средний чек`,value:C(1746),change:{value:`+4%`,trend:`up`},subtitle:`Товаров в чеке: 3.2`,icon:(0,M.jsx)(m,{className:`w-4 h-4 text-krona-gold`})}),(0,M.jsx)(_,{title:`Товарных позиций на складе`,value:`1 420 SKU`,subtitle:`Критический остаток: 4 SKU`,icon:(0,M.jsx)(l,{className:`w-4 h-4 text-krona-info`})}),(0,M.jsx)(_,{title:`Оборачиваемость склада`,value:`14.2 дня`,change:{value:`-1.5 дн`,trend:`up`},subtitle:`Маржинальность: 42.4%`,icon:(0,M.jsx)(a,{className:`w-4 h-4 text-krona-green`})})]});case`beauty_services`:return(0,M.jsxs)(`div`,{className:`grid grid-cols-2 lg:grid-cols-4 gap-3.5`,children:[(0,M.jsx)(_,{title:`Выручка салона`,value:C(124e3),change:{value:`+12%`,trend:`up`},subtitle:`18 визитов сегодня`,icon:(0,M.jsx)(a,{className:`w-4 h-4 text-krona-green`})}),(0,M.jsx)(_,{title:`Загрузка мастеров`,value:`86%`,change:{value:`+5%`,trend:`up`},subtitle:`5 мастеров на смене`,icon:(0,M.jsx)(b,{className:`w-4 h-4 text-krona-gold`})}),(0,M.jsx)(_,{title:`Записей на сегодня`,value:`22 клиента`,subtitle:`Подтверждено: 19`,icon:(0,M.jsx)(d,{className:`w-4 h-4 text-krona-info`})}),(0,M.jsx)(_,{title:`Средний чек визита`,value:C(4850),change:{value:`+350 ₽`,trend:`up`},subtitle:`Услуги + уход дома`,icon:(0,M.jsx)(m,{className:`w-4 h-4 text-krona-green`})})]});case`wholesale_b2b`:return(0,M.jsxs)(`div`,{className:`grid grid-cols-2 lg:grid-cols-4 gap-3.5`,children:[(0,M.jsx)(_,{title:`Объем отгрузок сегодня`,value:C(145e4),change:{value:`+24%`,trend:`up`},subtitle:`9 партий сформировано`,icon:(0,M.jsx)(a,{className:`w-4 h-4 text-krona-green`})}),(0,M.jsx)(_,{title:`Активные B2B контракты`,value:`42 контрагента`,subtitle:`В согласовании: 3`,icon:(0,M.jsx)(b,{className:`w-4 h-4 text-krona-info`})}),(0,M.jsx)(_,{title:`Дебиторская задолженность`,value:C(84e4),change:{value:`-8%`,trend:`up`},subtitle:`Просрочено: 95 000 ₽`,icon:(0,M.jsx)(m,{className:`w-4 h-4 text-krona-gold`})}),(0,M.jsx)(_,{title:`Загрузка распредцентра`,value:`84%`,subtitle:`Свободно 320 паллетомест`,icon:(0,M.jsx)(l,{className:`w-4 h-4 text-krona-green`})})]});default:return(0,M.jsxs)(`div`,{className:`grid grid-cols-2 lg:grid-cols-5 gap-3.5`,children:[(0,M.jsx)(_,{title:`Выручка сегодня`,value:C(184500),change:{value:`+14%`,trend:`up`},subtitle:`План: 170 000 ₽ (108%)`,icon:(0,M.jsx)(a,{className:`w-4 h-4 text-krona-green`})}),(0,M.jsx)(_,{title:`Заказы`,value:`58 чеков`,change:{value:`+8`,trend:`up`},subtitle:`Зал: 34 • Доставка: 24`,icon:(0,M.jsx)(s,{className:`w-4 h-4 text-krona-gold`})}),(0,M.jsx)(_,{title:`Средний чек`,value:C(3180),change:{value:`+6.2%`,trend:`up`},subtitle:`Зал: 3 650 ₽ • Онлайн: 2 450 ₽`,icon:(0,M.jsx)(m,{className:`w-4 h-4 text-krona-green`})}),(0,M.jsx)(_,{title:`Загрузка зала`,value:`82%`,change:{value:`+12%`,trend:`up`},subtitle:`11 из 14 столов заняты`,icon:(0,M.jsx)(b,{className:`w-4 h-4 text-krona-info`})}),(0,M.jsx)(_,{title:`Food Cost / Маржа`,value:`29.4%`,change:{value:`-0.8%`,trend:`up`},subtitle:`Маржинальность: 70.6%`,icon:(0,M.jsx)(l,{className:`w-4 h-4 text-krona-green`})})]})}})(),(0,M.jsxs)(`div`,{className:`bg-krona-surface border border-krona-border rounded-xl p-4 shadow-krona-soft`,children:[(0,M.jsxs)(`div`,{className:`flex items-center justify-between mb-4`,children:[(0,M.jsxs)(`div`,{children:[(0,M.jsx)(`h3`,{className:`text-sm font-semibold text-krona-primary`,children:`Динамика выручки и среднего чека`}),(0,M.jsx)(`p`,{className:`text-xs text-krona-secondary`,children:`Почасовая разбивка с кассовых узлов и онлайн-заказов`})]}),(0,M.jsxs)(`div`,{className:`flex items-center gap-1 bg-krona-workspace p-1 rounded-lg border border-krona-border text-xs`,children:[(0,M.jsx)(`button`,{onClick:()=>U(`today`),className:`px-3 py-1 rounded font-medium transition-colors ${H===`today`?`bg-[#2F684C] text-white`:`text-krona-secondary hover:text-krona-primary`}`,children:`Сегодня`}),(0,M.jsx)(`button`,{onClick:()=>U(`week`),className:`px-3 py-1 rounded font-medium transition-colors ${H===`week`?`bg-[#2F684C] text-white`:`text-krona-secondary hover:text-krona-primary`}`,children:`Неделя`})]})]}),(0,M.jsx)(`div`,{className:`h-64 w-full`,children:(0,M.jsx)(D,{width:`100%`,height:`100%`,children:(0,M.jsxs)(k,{data:H===`today`?N:P,children:[(0,M.jsx)(`defs`,{children:(0,M.jsxs)(`linearGradient`,{id:`colorRev`,x1:`0`,y1:`0`,x2:`0`,y2:`1`,children:[(0,M.jsx)(`stop`,{offset:`5%`,stopColor:`#2F684C`,stopOpacity:.4}),(0,M.jsx)(`stop`,{offset:`95%`,stopColor:`#2F684C`,stopOpacity:0})]})}),(0,M.jsx)(E,{strokeDasharray:`3 3`,stroke:`#D8D5CB`,opacity:.4}),(0,M.jsx)(A,{dataKey:`time`,stroke:`#686C65`,fontSize:11}),(0,M.jsx)(O,{stroke:`#686C65`,fontSize:11,tickFormatter:e=>`${e/1e3}k`}),(0,M.jsx)(w,{formatter:e=>[C(Number(e)),`Выручка`],contentStyle:{backgroundColor:`#F8F6F0`,borderColor:`#D8D5CB`,borderRadius:8,fontSize:12}}),(0,M.jsx)(T,{type:`monotone`,dataKey:`revenue`,stroke:`#2F684C`,strokeWidth:2.5,fillOpacity:1,fill:`url(#colorRev)`})]})})})]}),(0,M.jsxs)(`div`,{className:`bg-krona-surface border border-krona-border rounded-xl p-4 shadow-krona-soft`,children:[(0,M.jsxs)(`div`,{className:`flex items-center justify-between mb-3`,children:[(0,M.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,M.jsx)(x,{className:`w-4 h-4 text-krona-warning`}),(0,M.jsx)(`h3`,{className:`text-sm font-semibold text-krona-primary`,children:`Требует внимания управляющего`})]}),(0,M.jsx)(`span`,{className:`text-xs text-krona-secondary`,children:`3 критических инцидента`})]}),(0,M.jsxs)(`div`,{className:`grid grid-cols-1 md:grid-cols-3 gap-3`,children:[(0,M.jsxs)(`div`,{className:`p-3 rounded-lg border border-krona-danger/40 bg-krona-danger/10 flex flex-col justify-between`,children:[(0,M.jsxs)(`div`,{children:[(0,M.jsxs)(`div`,{className:`flex items-center gap-1.5 text-xs font-semibold text-krona-danger`,children:[(0,M.jsx)(f,{className:`w-4 h-4`}),(0,M.jsx)(`span`,{children:`Критический остаток`})]}),(0,M.jsxs)(`p`,{className:`text-xs text-krona-primary mt-1.5 leading-relaxed`,children:[`Лосось охлажденный: осталось `,(0,M.jsx)(`strong`,{children:`2.4 кг`}),` (порог 6 кг). Хватит на ~2.5 часа работы кухни.`]})]}),(0,M.jsxs)(n,{variant:`outline`,size:`sm`,className:`mt-3 bg-krona-surface text-xs justify-between`,onClick:()=>V(`/operations/inventory`),children:[(0,M.jsx)(`span`,{children:`Заявка поставщику`}),(0,M.jsx)(p,{className:`w-3.5 h-3.5`})]})]}),(0,M.jsxs)(`div`,{className:`p-3 rounded-lg border border-krona-warning/40 bg-krona-warning/10 flex flex-col justify-between`,children:[(0,M.jsxs)(`div`,{children:[(0,M.jsxs)(`div`,{className:`flex items-center gap-1.5 text-xs font-semibold text-krona-warning`,children:[(0,M.jsx)(d,{className:`w-4 h-4`}),(0,M.jsx)(`span`,{children:`Задержка на кухне (KDS)`})]}),(0,M.jsxs)(`p`,{className:`text-xs text-krona-primary mt-1.5 leading-relaxed`,children:[`Заказ #104 на `,(0,M.jsx)(`strong`,{children:`Стол 4`}),` находится в работе уже 18 минут при норме 12 минут.`]})]}),(0,M.jsxs)(n,{variant:`outline`,size:`sm`,className:`mt-3 bg-krona-surface text-xs justify-between`,onClick:()=>V(`/operations/kds`),children:[(0,M.jsx)(`span`,{children:`Открыть KDS кухни`}),(0,M.jsx)(p,{className:`w-3.5 h-3.5`})]})]}),(0,M.jsxs)(`div`,{className:`p-3 rounded-lg border border-krona-info/40 bg-krona-info/10 flex flex-col justify-between`,children:[(0,M.jsxs)(`div`,{children:[(0,M.jsxs)(`div`,{className:`flex items-center gap-1.5 text-xs font-semibold text-krona-info`,children:[(0,M.jsx)(o,{className:`w-4 h-4`}),(0,M.jsx)(`span`,{children:`Наличные у курьера`})]}),(0,M.jsxs)(`p`,{className:`text-xs text-krona-primary mt-1.5 leading-relaxed`,children:[`Курьер Алексей Смирнов держит `,(0,M.jsx)(`strong`,{children:`24 500 ₽`}),` наличными после 7 доставок.`]})]}),(0,M.jsxs)(n,{variant:`outline`,size:`sm`,className:`mt-3 bg-krona-surface text-xs justify-between`,onClick:()=>V(`/operations/delivery`),children:[(0,M.jsx)(`span`,{children:`Принять инкассацию`}),(0,M.jsx)(p,{className:`w-3.5 h-3.5`})]})]})]})]}),(0,M.jsxs)(`div`,{className:`grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-3.5`,children:[B.dining&&(0,M.jsxs)(`div`,{className:`bg-krona-surface border border-krona-border rounded-lg p-3.5 shadow-krona-soft`,children:[(0,M.jsxs)(`div`,{className:`flex items-center justify-between text-xs mb-2`,children:[(0,M.jsx)(`span`,{className:`font-semibold text-krona-primary`,children:`Зал и столы`}),(0,M.jsx)(r,{variant:`green`,size:`sm`,children:`82% занято`})]}),(0,M.jsxs)(`div`,{className:`text-xs text-krona-secondary space-y-1`,children:[(0,M.jsxs)(`div`,{className:`flex justify-between`,children:[(0,M.jsx)(`span`,{children:`Открытых чеков:`}),(0,M.jsx)(`span`,{className:`font-medium text-krona-primary`,children:`11 столов`})]}),(0,M.jsxs)(`div`,{className:`flex justify-between`,children:[(0,M.jsx)(`span`,{children:`Среднее время посадки:`}),(0,M.jsx)(`span`,{className:`font-medium text-krona-primary`,children:`48 минут`})]})]}),(0,M.jsx)(`button`,{onClick:()=>V(`/operations/dining`),className:`mt-2.5 text-xs text-krona-green font-medium hover:underline block`,children:`Схема зала →`})]}),B.kds&&(0,M.jsxs)(`div`,{className:`bg-krona-surface border border-krona-border rounded-lg p-3.5 shadow-krona-soft`,children:[(0,M.jsxs)(`div`,{className:`flex items-center justify-between text-xs mb-2`,children:[(0,M.jsx)(`span`,{className:`font-semibold text-krona-primary`,children:`Кухня (KDS)`}),(0,M.jsxs)(r,{variant:`gold`,size:`sm`,children:[I.length,` в работе`]})]}),(0,M.jsxs)(`div`,{className:`text-xs text-krona-secondary space-y-1`,children:[(0,M.jsxs)(`div`,{className:`flex justify-between`,children:[(0,M.jsx)(`span`,{children:`Суши-цех:`}),(0,M.jsx)(`span`,{className:`font-medium text-krona-primary`,children:`4 блюда`})]}),(0,M.jsxs)(`div`,{className:`flex justify-between`,children:[(0,M.jsx)(`span`,{children:`Горячий цех:`}),(0,M.jsx)(`span`,{className:`font-medium text-krona-primary`,children:`2 блюда`})]})]}),(0,M.jsx)(`button`,{onClick:()=>V(`/operations/kds`),className:`mt-2.5 text-xs text-krona-green font-medium hover:underline block`,children:`Кухонный экран →`})]}),B.delivery&&(0,M.jsxs)(`div`,{className:`bg-krona-surface border border-krona-border rounded-lg p-3.5 shadow-krona-soft`,children:[(0,M.jsxs)(`div`,{className:`flex items-center justify-between text-xs mb-2`,children:[(0,M.jsx)(`span`,{className:`font-semibold text-krona-primary`,children:`Доставка & Курьеры`}),(0,M.jsx)(r,{variant:`info`,size:`sm`,children:`3 в пути`})]}),(0,M.jsxs)(`div`,{className:`text-xs text-krona-secondary space-y-1`,children:[(0,M.jsxs)(`div`,{className:`flex justify-between`,children:[(0,M.jsx)(`span`,{children:`Среднее время доставки:`}),(0,M.jsx)(`span`,{className:`font-medium text-krona-primary`,children:`34 мин`})]}),(0,M.jsxs)(`div`,{className:`flex justify-between`,children:[(0,M.jsx)(`span`,{children:`Курьеров на линии:`}),(0,M.jsx)(`span`,{className:`font-medium text-krona-primary`,children:`4 сотрудника`})]})]}),(0,M.jsx)(`button`,{onClick:()=>V(`/operations/delivery`),className:`mt-2.5 text-xs text-krona-green font-medium hover:underline block`,children:`Управление доставкой →`})]}),(0,M.jsxs)(`div`,{className:`bg-krona-surface border border-krona-border rounded-lg p-3.5 shadow-krona-soft`,children:[(0,M.jsxs)(`div`,{className:`flex items-center justify-between text-xs mb-2`,children:[(0,M.jsx)(`span`,{className:`font-semibold text-krona-primary`,children:`Финансы & Кассы`}),(0,M.jsx)(r,{variant:`green`,size:`sm`,children:`Смены открыты`})]}),(0,M.jsxs)(`div`,{className:`text-xs text-krona-secondary space-y-1`,children:[(0,M.jsxs)(`div`,{className:`flex justify-between`,children:[(0,M.jsx)(`span`,{children:`Наличные в кассе:`}),(0,M.jsx)(`span`,{className:`font-medium text-krona-primary`,children:`42 800 ₽`})]}),(0,M.jsxs)(`div`,{className:`flex justify-between`,children:[(0,M.jsx)(`span`,{children:`Безнал / Эквайринг:`}),(0,M.jsx)(`span`,{className:`font-medium text-krona-primary`,children:`141 700 ₽`})]})]}),(0,M.jsx)(`button`,{onClick:()=>V(`/finance`),className:`mt-2.5 text-xs text-krona-green font-medium hover:underline block`,children:`ДДС & Сальдо →`})]})]})]})};export{F as DynamicDashboard}; \ No newline at end of file diff --git a/dist/assets/DynamicFormRenderer-u2RREFCE.js b/dist/assets/DynamicFormRenderer-0ioSXYKX.js similarity index 99% rename from dist/assets/DynamicFormRenderer-u2RREFCE.js rename to dist/assets/DynamicFormRenderer-0ioSXYKX.js index 60c1222..c10372e 100644 --- a/dist/assets/DynamicFormRenderer-u2RREFCE.js +++ b/dist/assets/DynamicFormRenderer-0ioSXYKX.js @@ -1,3 +1,3 @@ -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,u as c}from"./useToast-CS8pZhce.js";import{i as l,n as u,r as d,t as f}from"./types-DMl_5q2N.js";import{t as p}from"./file-text-DR21jZDS.js";import{t as m}from"./list-XDoRqfJ2.js";import{t as h}from"./star-B6hvSjuv.js";import{t as g}from"./upload-CY2IsfiN.js";import{F as _,V as v,k as y,ot as b,st as x}from"./index-CNnq9VO5.js";import{n as S,t as C}from"./currency-DdDs82F5.js";var w={name:`bold`,size:24,node:[[`path`,{d:`M6 12h9a4 4 0 0 1 0 8H7a1 1 0 0 1-1-1V5a1 1 0 0 1 1-1h7a4 4 0 0 1 0 8`,key:`mg9rjx`}]]};w.node;var T=i(w),E={name:`italic`,size:24,node:[[`line`,{x1:`19`,x2:`10`,y1:`4`,y2:`4`,key:`15jd3p`}],[`line`,{x1:`14`,x2:`5`,y1:`20`,y2:`20`,key:`bu0au3`}],[`line`,{x1:`15`,x2:`9`,y1:`4`,y2:`20`,key:`uljnxc`}]]};E.node;var D=i(E),O={name:`quote`,size:24,node:[[`path`,{d:`M16 3a2 2 0 0 0-2 2v6a2 2 0 0 0 2 2 1 1 0 0 1 1 1v1a2 2 0 0 1-2 2 1 1 0 0 0-1 1v2a1 1 0 0 0 1 1 6 6 0 0 0 6-6V5a2 2 0 0 0-2-2z`,key:`rib7q0`}],[`path`,{d:`M5 3a2 2 0 0 0-2 2v6a2 2 0 0 0 2 2 1 1 0 0 1 1 1v1a2 2 0 0 1-2 2 1 1 0 0 0-1 1v2a1 1 0 0 0 1 1 6 6 0 0 0 6-6V5a2 2 0 0 0-2-2z`,key:`1ymkrd`}]]};O.node;var k=i(O),A=n(t(),1),j=new Set([`eval`,`function`,`constructor`,`prototype`,`window`,`document`,`global`,`globalthis`,`process`,`require`,`import`,`this`,`class`,`var`,`let`,`const`,`return`,`while`,`for`,`if`]),M=new Set([`round`,`floor`,`ceil`,`abs`,`min`,`max`,`sqrt`]);function N(e){let t=[],n=0;for(;nn.maxLength)return{valid:!1,error:`Максимальная длина: ${n.maxLength} симв.`};if(n?.pattern)try{if(!new RegExp(n.pattern).test(t))return{valid:!1,error:n.customMessage||`Значение не соответствует формату`}}catch{}}switch(i){case`integer`:{if(typeof t==`number`){if(!Number.isInteger(t))return{valid:!1,error:`Должно быть целым числом`}}else if(typeof t==`string`){if(!/^-?\d+$/.test(t.trim()))return{valid:!1,error:`Должно быть целым числом`}}else return{valid:!1,error:`Неверный числовой формат`};let e=Number(t);return n?.min!==void 0&&en.max?{valid:!1,error:`Максимум ${n.max}`}:{valid:!0}}case`decimal`:case`percentage`:case`money`:{let e=Number(typeof t==`object`&&t&&`minor`in t?t.minor:t);return isNaN(e)?{valid:!1,error:`Должно быть корректным числом`}:i===`percentage`&&(e<0||e>100)?{valid:!1,error:`Процент должен быть в диапазоне 0–100%`}:n?.min!==void 0&&en.max?{valid:!1,error:`Максимум ${n.max}`}:{valid:!0}}case`rating`:{let e=Number(t);return!Number.isInteger(e)||e<1||e>5?{valid:!1,error:`Рейтинг должен быть целым числом от 1 до 5`}:{valid:!0}}case`email`:{let e=String(t).trim();return/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(e)?{valid:!0}:{valid:!1,error:`Введите корректный адрес электронной почты (например name@company.ru)`}}case`url`:{let e=String(t).trim();try{let t=new URL(e);if(![`http:`,`https:`].includes(t.protocol))return{valid:!1,error:`URL должен начинаться с http:// или https://`}}catch{return{valid:!1,error:`Некорректный веб-адрес URL`}}return{valid:!0}}case`phone`:{let e=String(t).trim().replace(/\D/g,``);return e.length<6||e.length>16?{valid:!1,error:`Номер телефона должен содержать от 6 до 16 цифр`}:{valid:!0}}case`color`:{let e=String(t).trim();return/^#([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$/.test(e)?{valid:!0}:{valid:!1,error:`Цвет должен быть в формате HEX (#RGB или #RRGGBB)`}}case`time`:{let e=String(t).trim();return/^\d{2}:\d{2}(:\d{2})?$/.test(e)?{valid:!0}:{valid:!1,error:`Время должно быть в формате ЧЧ:ММ`}}case`json`:if(typeof t==`object`&&t)return{valid:!0};try{return JSON.parse(String(t)),{valid:!0}}catch{return{valid:!1,error:`Синтаксическая ошибка в структуре JSON`}}case`multi_select`:case`checkbox_group`:return Array.isArray(t)?{valid:!0}:{valid:!1,error:`Значение должно быть массивом вариантов`};case`location`:if(typeof t==`object`&&t){let e=t;if(typeof e.lat==`number`&&typeof e.lng==`number`)return e.lat<-90||e.lat>90?{valid:!1,error:`Широта (lat) должна быть от -90 до +90`}:e.lng<-180||e.lng>180?{valid:!1,error:`Долгота (lng) должна быть от -180 до +180`}:{valid:!0}}if(typeof t==`string`){let e=t.split(`,`).map(e=>parseFloat(e.trim()));if(e.length===2&&!isNaN(e[0])&&!isNaN(e[1]))return e[0]<-90||e[0]>90?{valid:!1,error:`Широта должна быть от -90 до +90`}:e[1]<-180||e[1]>180?{valid:!1,error:`Долгота должна быть от -180 до +180`}:{valid:!0}}return{valid:!1,error:`Укажите координаты в формате: широта, долгота`};default:return{valid:!0}}}function R(e,t){let n=f(e);if(t==null)return null;switch(n){case`integer`:return typeof t==`number`?Math.round(t):parseInt(String(t),10)||0;case`decimal`:case`percentage`:case`money`:return typeof t==`number`?t:parseFloat(String(t))||0;case`boolean`:return!!t;case`multi_select`:case`checkbox_group`:return Array.isArray(t)?t.map(String):[];case`json`:if(typeof t==`string`)try{return JSON.parse(t)}catch{return t}return t;case`address`:return typeof t==`object`&&t?t:{street:String(t),city:``,postalCode:``,country:``};case`location`:if(typeof t==`object`&&t)return t;if(typeof t==`string`){let e=t.split(`,`).map(e=>parseFloat(e.trim()));if(e.length===2&&!isNaN(e[0])&&!isNaN(e[1]))return{lat:e[0],lng:e[1]}}return{lat:0,lng:0};default:return t}}function z(e,t,n){if(t==null||t===``)return`—`;switch(f(e)){case`money`:{let e=typeof t==`object`&&t&&`minor`in t?t.minor:Number(t);return C(isNaN(e)?0:e)}case`percentage`:{let e=Number(t);return`${isNaN(e)?0:e}%`}case`boolean`:return t?`Да`:`Нет`;case`date`:return b(String(t));case`datetime`:return x(String(t));case`time`:return String(t);case`rating`:{let e=Math.min(5,Math.max(0,Number(t)||0));return`★`.repeat(e)+`☆`.repeat(5-e)}case`multi_select`:case`checkbox_group`:if(Array.isArray(t)){if(n?.options){let e=new Map(n.options.map(e=>[e.value,e.label]));return t.map(t=>e.get(String(t))||String(t)).join(`, `)}return t.join(`, `)}return String(t);case`select`:case`radio`:case`status`:if(n?.options){let e=n.options.find(e=>e.value===t);if(e)return e.label}return String(t);case`color`:return String(t);case`address`:if(typeof t==`object`&&t){let e=t;return[e.street,e.city,e.postalCode,e.country].filter(Boolean).join(`, `)||`—`}return String(t);case`location`:if(typeof t==`object`&&t){let e=t;return`${e.lat.toFixed(4)}, ${e.lng.toFixed(4)}`}return String(t);case`file`:case`image`:return typeof t==`object`&&t&&`name`in t?String(t.name):`Файл`;case`json`:return typeof t==`object`?JSON.stringify(t):String(t);default:return String(t)}}var B=o(),V={user:[{value:`usr_01`,label:`Иван Иванов (Администратор)`},{value:`usr_02`,label:`Анна Смирнова (Менеджер)`},{value:`usr_03`,label:`Михаил Соколов (Аналитик)`},{value:`usr_04`,label:`Елена Кузнецова (Оператор)`}],employee:[{value:`emp_01`,label:`Дмитрий Кузнецов (Ведущий инженер)`},{value:`emp_02`,label:`Ольга Морозова (Менеджер проекта)`},{value:`emp_03`,label:`Сергей Попов (Разработчик)`}],team:[{value:`team_01`,label:`Отдел продаж и работы с клиентами`},{value:`team_02`,label:`Департамент разработки ПО`},{value:`team_03`,label:`Служба логистики и снабжения`},{value:`team_04`,label:`Финансово-экономический отдел`}],company:[{value:`comp_01`,label:`ООО «Северная Звезда»`},{value:`comp_02`,label:`АО «ПромИнвестХолдинг»`},{value:`comp_03`,label:`ПАО «ТехноСфера»`},{value:`comp_04`,label:`ИП Сидоров А.В.`}],contact:[{value:`cont_01`,label:`Алексей Петров (+7 900 111-22-33)`},{value:`cont_02`,label:`Екатерина Васильева (e.vas@prom.ru)`},{value:`cont_03`,label:`Николай Федоров (+7 911 444-55-66)`}],product:[{value:`prod_01`,label:`Лицензия Krona Enterprise (Годовая)`},{value:`prod_02`,label:`Модуль расширенной бизнес-аналитики`},{value:`prod_03`,label:`Консалтинг по интеграции ERP/CRM`},{value:`prod_04`,label:`Пакет технической поддержки 24/7`}],entity_relation:[{value:`rel_01`,label:`Связанный документ #01`},{value:`rel_02`,label:`Связанный договор #02`},{value:`rel_03`,label:`Связанный контрагент #03`}]},H=[`#2F684C`,`#2563EB`,`#D97706`,`#DC2626`,`#7C3AED`,`#4B5563`,`#059669`,`#0891B2`],U=({entity:t,record:n,layout:i,mode:o=`create`,onSave:b,onCancel:x,isLoading:w=!1})=>{let{showToast:E}=s(),O=(0,A.useCallback)((e,t)=>{let n={};return e.fields.forEach(e=>{t&&t[e.key]!==void 0?n[e.key]=t[e.key]:n[e.key]=I(e.type,e)}),n},[]),[j,M]=(0,A.useState)(()=>O(t,n)),[N,P]=(0,A.useState)({}),z=(0,A.useRef)(n?.id);(0,A.useEffect)(()=>{n?.id!==z.current&&(z.current=n?.id,Promise.resolve().then(()=>{M(O(t,n)),P({})}))},[t,n,O]);let U=(0,A.useMemo)(()=>{let e=new Map;return t.fields.forEach(t=>e.set(t.key,t)),e},[t]),W=(0,A.useMemo)(()=>i?.sections&&i.sections.length>0?i.sections:[{id:`sec_default`,title:`Основные данные`,columns:2,fieldKeys:t.fields.map(e=>e.key)}],[i,t]),G=(0,A.useCallback)(e=>{if(e.hidden)return!1;if(!e.conditionalVisibility||!e.conditionalVisibility.fieldKey)return!0;let{fieldKey:t,operator:n,value:r}=e.conditionalVisibility,i=j[t];switch(n){case`eq`:return String(i??``)===String(r??``);case`neq`:return String(i??``)!==String(r??``);case`contains`:return String(i??``).includes(String(r??``));default:return!0}},[j]),K=(e,t)=>{M(n=>({...n,[e]:t})),N[e]&&P(t=>{let n={...t};return delete n[e],n})},q=()=>{let e={};return t.fields.forEach(t=>{if(!G(t))return;let n=j[t.key],r=L(t.type,n,t.validation,t);r.valid||(r.error===`Обязательное поле для заполнения`?e[t.key]=`Поле «${t.label}» обязательно для заполнения`:e[t.key]=r.error||`Поле «${t.label}» заполнено неверно`)}),P(e),Object.keys(e).length===0},J=async e=>{if(e.preventDefault(),o!==`readonly`){if(!q()){E({type:`error`,title:`Проверьте правильность заполнения формы`});return}try{let e={};t.fields.forEach(t=>{j[t.key]!==void 0&&(e[t.key]=R(t.type,j[t.key]))}),Object.keys(j).forEach(t=>{e[t]===void 0&&(e[t]=j[t])}),await b(e)}catch(e){E({type:`error`,title:`Ошибка сохранения записи`,message:e instanceof Error?e.message:String(e)})}}},Y=t=>{let n=j[t.key],r=o===`readonly`||t.readOnly,i=!!N[t.key],s=f(t.type);if(s===`money`){let e=typeof n==`number`?n:0,a=(e/100).toString();return r?(0,B.jsx)(`div`,{className:`font-semibold text-xs text-krona-primary p-2 bg-krona-workspace rounded border border-krona-border/60`,children:C(e)}):(0,B.jsxs)(`div`,{className:`relative`,children:[(0,B.jsx)(`input`,{type:`number`,step:`0.01`,value:a===`0`&&n===``?``:a,onChange:e=>{let n=S(e.target.value);K(t.key,n)},placeholder:t.placeholder||`0.00`,disabled:r,className:`w-full bg-krona-surface text-krona-primary border rounded-md px-3 py-2 text-xs focus:outline-none focus:border-krona-green pr-8 ${i?`border-krona-danger`:`border-krona-border`}`}),(0,B.jsx)(`span`,{className:`absolute right-3 top-2.5 text-xs text-krona-secondary font-medium`,children:`₽`})]})}if(s===`select`||s===`status`){if(r){let e=t.options?.find(e=>e.value===n);return(0,B.jsx)(`div`,{className:`text-xs font-medium text-krona-primary p-2 bg-krona-workspace rounded border border-krona-border/60`,children:e?.label||String(n||`—`)})}return(0,B.jsxs)(`select`,{value:String(n??``),onChange:e=>K(t.key,e.target.value),disabled:r,className:`w-full bg-krona-surface text-krona-primary border rounded-md px-3 py-2 text-xs focus:outline-none focus:border-krona-green ${i?`border-krona-danger`:`border-krona-border`}`,children:[(0,B.jsx)(`option`,{value:``,children:`Выберите значение...`}),t.options?.map(e=>(0,B.jsx)(`option`,{value:e.value,children:e.label},e.value))]})}if(s===`radio`){let e=t.options||[{value:`option_1`,label:`Вариант 1`},{value:`option_2`,label:`Вариант 2`}];if(r){let t=e.find(e=>e.value===n);return(0,B.jsx)(`div`,{className:`text-xs font-medium text-krona-primary p-2 bg-krona-workspace rounded border border-krona-border/60`,children:t?.label||String(n||`—`)})}return(0,B.jsx)(`div`,{className:`space-y-1.5 pt-1`,children:e.map(e=>(0,B.jsxs)(`label`,{className:`flex items-center gap-2 cursor-pointer text-xs text-krona-primary`,children:[(0,B.jsx)(`input`,{type:`radio`,name:`radio_${t.key}`,value:e.value,checked:n===e.value,onChange:()=>K(t.key,e.value),disabled:r,className:`text-krona-green focus:ring-krona-green`}),(0,B.jsx)(`span`,{children:e.label})]},e.value))})}if(s===`multi_select`){let o=Array.isArray(n)?n:[],s=t.options||[];if(r)return(0,B.jsx)(`div`,{className:`flex flex-wrap gap-1.5 p-2 bg-krona-workspace rounded border border-krona-border/60`,children:o.length>0?o.map(e=>{let t=s.find(t=>t.value===e)?.label||e;return(0,B.jsx)(a,{variant:`neutral`,size:`sm`,children:t},e)}):(0,B.jsx)(`span`,{className:`text-xs text-krona-secondary`,children:`Ничего не выбрано`})});let c=s.filter(e=>!o.includes(e.value));return(0,B.jsxs)(`div`,{className:`space-y-2`,children:[o.length>0&&(0,B.jsx)(`div`,{className:`flex flex-wrap gap-1.5 p-2 bg-krona-workspace/60 rounded border border-krona-border/60`,children:o.map(n=>{let r=s.find(e=>e.value===n)?.label||n;return(0,B.jsxs)(`span`,{className:`inline-flex items-center gap-1 px-2 py-0.5 rounded-full text-xs font-medium bg-krona-green/10 text-krona-green border border-krona-green/20`,children:[r,(0,B.jsx)(`button`,{type:`button`,onClick:()=>K(t.key,o.filter(e=>e!==n)),className:`hover:text-krona-danger ml-0.5`,children:(0,B.jsx)(e,{className:`w-3 h-3`})})]},n)})}),(0,B.jsxs)(`select`,{value:``,onChange:e=>{e.target.value&&K(t.key,[...o,e.target.value])},disabled:r,className:`w-full bg-krona-surface text-krona-primary border rounded-md px-3 py-2 text-xs focus:outline-none focus:border-krona-green ${i?`border-krona-danger`:`border-krona-border`}`,children:[(0,B.jsx)(`option`,{value:``,children:`+ Добавить вариант...`}),c.map(e=>(0,B.jsx)(`option`,{value:e.value,children:e.label},e.value))]})]})}if(s===`checkbox_group`){let e=Array.isArray(n)?n:[],i=t.options||[{value:`opt_1`,label:`Вариант А`},{value:`opt_2`,label:`Вариант Б`},{value:`opt_3`,label:`Вариант В`}];return(0,B.jsx)(`div`,{className:`space-y-1.5 pt-1`,children:i.map(n=>{let i=e.includes(n.value);return(0,B.jsxs)(`label`,{className:`flex items-center gap-2 cursor-pointer text-xs text-krona-primary`,children:[(0,B.jsx)(`input`,{type:`checkbox`,checked:i,disabled:r,onChange:r=>{r.target.checked?K(t.key,[...e,n.value]):K(t.key,e.filter(e=>e!==n.value))},className:`rounded text-krona-green focus:ring-krona-green`}),(0,B.jsx)(`span`,{children:n.label})]},n.value)})})}if(s===`rating`){let e=Math.min(5,Math.max(1,Number(n)||5));return(0,B.jsxs)(`div`,{className:`flex items-center gap-1.5 py-1`,children:[[1,2,3,4,5].map(n=>(0,B.jsx)(`button`,{type:`button`,disabled:r,onClick:()=>K(t.key,n),"aria-label":`Оценка ${n} из 5 звёзд`,className:`p-1 rounded transition-transform ${r?`cursor-default`:`hover:scale-125 cursor-pointer`}`,children:(0,B.jsx)(h,{className:`w-5 h-5 ${n<=e?`fill-amber-400 text-amber-400`:`text-krona-secondary opacity-30`}`})},n)),(0,B.jsxs)(`span`,{className:`text-xs font-semibold text-krona-primary ml-2`,children:[e,` / 5`]})]})}if(s===`boolean`)return(0,B.jsxs)(`label`,{className:`flex items-center gap-2.5 cursor-pointer text-xs font-medium text-krona-primary py-1`,children:[(0,B.jsx)(`input`,{type:`checkbox`,checked:!!n,onChange:e=>K(t.key,e.target.checked),disabled:r,className:`w-4 h-4 rounded text-krona-green focus:ring-krona-green`}),(0,B.jsx)(`span`,{children:n?`Да (активно)`:`Нет`})]});if(s===`date`||s===`datetime`||s===`time`)return(0,B.jsx)(`input`,{type:s===`datetime`?`datetime-local`:s===`time`?`time`:`date`,value:String(n??``),onChange:e=>K(t.key,e.target.value),disabled:r,className:`w-full bg-krona-surface text-krona-primary border rounded-md px-3 py-2 text-xs focus:outline-none focus:border-krona-green ${i?`border-krona-danger`:`border-krona-border`}`});if(s===`url`)return(0,B.jsxs)(`div`,{className:`relative flex items-center`,children:[(0,B.jsx)(`input`,{type:`url`,value:String(n??``),onChange:e=>K(t.key,e.target.value),disabled:r,placeholder:t.placeholder||`https://example.com`,className:`w-full bg-krona-surface text-krona-primary border rounded-md px-3 py-2 text-xs focus:outline-none focus:border-krona-green pr-8 ${i?`border-krona-danger`:`border-krona-border`}`}),n?(0,B.jsx)(`a`,{href:String(n),target:`_blank`,rel:`noopener noreferrer`,className:`absolute right-2.5 text-krona-secondary hover:text-krona-green`,title:`Открыть ссылку`,children:(0,B.jsx)(_,{className:`w-3.5 h-3.5`})}):null]});if(s===`color`){let e=String(n||`#2F684C`),a=/^#([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$/.test(e)?e:`#2F684C`;return r?(0,B.jsxs)(`div`,{className:`flex items-center gap-2 p-1.5 bg-krona-workspace rounded border border-krona-border/60`,children:[(0,B.jsx)(`div`,{className:`w-5 h-5 rounded border border-krona-border/60`,style:{backgroundColor:a}}),(0,B.jsx)(`span`,{className:`font-mono text-xs text-krona-primary`,children:e})]}):(0,B.jsx)(`div`,{className:`space-y-2`,children:(0,B.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,B.jsx)(`input`,{type:`color`,value:a.length===7?a:`#2F684C`,onChange:e=>K(t.key,e.target.value),disabled:r,className:`w-8 h-8 rounded cursor-pointer border border-krona-border bg-transparent p-0.5`}),(0,B.jsx)(`input`,{type:`text`,value:e,onChange:e=>K(t.key,e.target.value),disabled:r,placeholder:`#2F684C`,maxLength:7,className:`w-28 font-mono text-xs uppercase bg-krona-surface text-krona-primary border rounded-md px-2.5 py-1.5 focus:outline-none focus:border-krona-green ${i?`border-krona-danger`:`border-krona-border`}`}),(0,B.jsx)(`div`,{className:`flex items-center gap-1.5 ml-2`,children:H.map(e=>(0,B.jsx)(`button`,{type:`button`,onClick:()=>K(t.key,e),style:{backgroundColor:e},className:`w-5 h-5 rounded-full border border-krona-border/60 hover:scale-110 transition-transform`,title:e},e))})]})})}if(s===`file`||s===`image`){let i=n&&typeof n==`object`?n:null;return i?(0,B.jsxs)(`div`,{className:`p-3 bg-krona-workspace/60 rounded-lg border border-krona-border/60 flex items-center justify-between gap-3`,children:[(0,B.jsxs)(`div`,{className:`flex items-center gap-2.5 min-w-0`,children:[s===`image`&&i.url?(0,B.jsx)(`img`,{src:i.url,alt:i.name,className:`w-10 h-10 rounded object-cover border border-krona-border shrink-0`}):(0,B.jsx)(p,{className:`w-6 h-6 text-krona-green shrink-0`}),(0,B.jsxs)(`div`,{className:`truncate`,children:[(0,B.jsx)(`p`,{className:`text-xs font-semibold text-krona-primary truncate`,children:i.name}),(0,B.jsxs)(`p`,{className:`text-[11px] text-krona-secondary font-mono`,children:[(i.size/1024).toFixed(1),` КБ • `,i.mimeType]})]})]}),!r&&(0,B.jsx)(`button`,{type:`button`,onClick:()=>K(t.key,null),className:`p-1 text-krona-secondary hover:text-krona-danger rounded transition-colors`,title:`Удалить файл`,children:(0,B.jsx)(e,{className:`w-4 h-4`})})]}):r?(0,B.jsx)(`div`,{className:`text-xs text-krona-secondary p-2 bg-krona-workspace rounded`,children:`Файл не прикреплен`}):(0,B.jsxs)(`label`,{className:`flex flex-col items-center justify-center p-4 border-2 border-dashed border-krona-border rounded-lg cursor-pointer hover:bg-krona-workspace/40 transition-colors`,children:[(0,B.jsx)(g,{className:`w-5 h-5 text-krona-secondary mb-1.5`}),(0,B.jsx)(`span`,{className:`text-xs font-medium text-krona-primary`,children:s===`image`?`Нажмите для загрузки изображения`:`Нажмите для загрузки документа`}),(0,B.jsx)(`span`,{className:`text-[10px] text-krona-secondary mt-0.5`,children:`PNG, JPG, PDF, DOCX до 10 МБ`}),(0,B.jsx)(`input`,{type:`file`,accept:s===`image`?`image/*`:void 0,onChange:e=>{let n=e.target.files?.[0];if(!n)return;let r=new FileReader;r.onload=e=>{let r={id:c(),name:n.name,size:n.size,mimeType:n.type||`application/octet-stream`,url:String(e.target?.result||``),uploadedAt:new Date().toISOString()};K(t.key,r)},r.readAsDataURL(n)},className:`hidden`})]})}if(s===`address`){let e=typeof n==`object`&&n?n:{street:String(n||``),city:``,postalCode:``,country:`Россия`};if(r){let t=[e.city,e.street,e.postalCode,e.country].filter(Boolean);return(0,B.jsxs)(`div`,{className:`flex items-center gap-1.5 text-xs text-krona-primary p-2 bg-krona-workspace rounded border border-krona-border/60`,children:[(0,B.jsx)(y,{className:`w-3.5 h-3.5 text-krona-green shrink-0`}),(0,B.jsx)(`span`,{children:t.join(`, `)||`—`})]})}return(0,B.jsxs)(`div`,{className:`space-y-2 p-2.5 bg-krona-workspace/40 rounded-lg border border-krona-border/60`,children:[(0,B.jsxs)(`div`,{className:`grid grid-cols-2 gap-2`,children:[(0,B.jsx)(`input`,{type:`text`,placeholder:`Город (напр. Москва)`,value:e.city||``,onChange:n=>K(t.key,{...e,city:n.target.value}),className:`bg-krona-surface text-krona-primary border border-krona-border rounded px-2 py-1 text-xs focus:outline-none focus:border-krona-green`}),(0,B.jsx)(`input`,{type:`text`,placeholder:`Индекс (напр. 101000)`,value:e.postalCode||``,onChange:n=>K(t.key,{...e,postalCode:n.target.value}),className:`bg-krona-surface text-krona-primary border border-krona-border rounded px-2 py-1 text-xs focus:outline-none focus:border-krona-green`})]}),(0,B.jsx)(`input`,{type:`text`,placeholder:`Улица, дом, офис (напр. Тверская ул., д. 12, оф. 405)`,value:e.street||``,onChange:n=>K(t.key,{...e,street:n.target.value}),className:`w-full bg-krona-surface text-krona-primary border border-krona-border rounded px-2 py-1 text-xs focus:outline-none focus:border-krona-green`})]})}if(s===`location`){let e=typeof n==`object`&&n?n:{lat:0,lng:0};return r?(0,B.jsxs)(`div`,{className:`flex items-center gap-1.5 text-xs text-krona-primary p-2 bg-krona-workspace rounded border border-krona-border/60`,children:[(0,B.jsx)(u,{className:`w-3.5 h-3.5 text-krona-green shrink-0`}),(0,B.jsxs)(`span`,{children:[`Широта: `,e.lat.toFixed(4),`, Долгота: `,e.lng.toFixed(4)]})]}):(0,B.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,B.jsxs)(`div`,{className:`relative flex-1`,children:[(0,B.jsx)(`input`,{type:`number`,step:`0.0001`,min:`-90`,max:`90`,placeholder:`Широта (Lat)`,value:e.lat||``,onChange:n=>K(t.key,{...e,lat:parseFloat(n.target.value)||0}),className:`w-full bg-krona-surface text-krona-primary border border-krona-border rounded-md px-2.5 py-1.5 text-xs focus:outline-none focus:border-krona-green`}),(0,B.jsx)(`span`,{className:`absolute right-2 top-2 text-[10px] text-krona-secondary font-mono`,children:`LAT`})]}),(0,B.jsxs)(`div`,{className:`relative flex-1`,children:[(0,B.jsx)(`input`,{type:`number`,step:`0.0001`,min:`-180`,max:`180`,placeholder:`Долгота (Lng)`,value:e.lng||``,onChange:n=>K(t.key,{...e,lng:parseFloat(n.target.value)||0}),className:`w-full bg-krona-surface text-krona-primary border border-krona-border rounded-md px-2.5 py-1.5 text-xs focus:outline-none focus:border-krona-green`}),(0,B.jsx)(`span`,{className:`absolute right-2 top-2 text-[10px] text-krona-secondary font-mono`,children:`LNG`})]})]})}if(s===`user`||s===`employee`||s===`team`||s===`company`||s===`contact`||s===`product`||s===`entity_relation`){let e=t.options&&t.options.length>0?t.options:V[s]||[];if(r){let t=e.find(e=>e.value===n);return(0,B.jsx)(`div`,{className:`text-xs font-medium text-krona-primary p-2 bg-krona-workspace rounded border border-krona-border/60`,children:t?.label||String(n||`—`)})}return(0,B.jsxs)(`select`,{value:String(n??``),onChange:e=>K(t.key,e.target.value),disabled:r,className:`w-full bg-krona-surface text-krona-primary border rounded-md px-3 py-2 text-xs focus:outline-none focus:border-krona-green ${i?`border-krona-danger`:`border-krona-border`}`,children:[(0,B.jsx)(`option`,{value:``,children:`Выберите запись...`}),e.map(e=>(0,B.jsx)(`option`,{value:e.value,children:e.label},e.value))]})}if(s===`formula`){let e=F(t.formula||``,j);return(0,B.jsxs)(`div`,{className:`p-2.5 bg-krona-workspace/80 border border-krona-border rounded-md flex items-center justify-between`,children:[(0,B.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,B.jsx)(l,{className:`w-4 h-4 text-krona-green shrink-0`}),(0,B.jsxs)(`div`,{children:[(0,B.jsx)(`div`,{className:`text-xs font-bold text-krona-primary font-mono`,children:e===null?`—`:e.toLocaleString(`ru-RU`)}),(0,B.jsxs)(`div`,{className:`text-[10px] text-krona-secondary font-mono`,children:[`f(x) = `,t.formula||`не задана`]})]})]}),(0,B.jsx)(a,{variant:`neutral`,size:`sm`,children:`Вычисляемое поле`})]})}if(s===`autonumber`)return(0,B.jsx)(`div`,{className:`p-2 bg-krona-workspace rounded border border-krona-border/60 font-mono text-xs font-semibold text-krona-primary`,children:String(n||`AUTO-[Генерируется]`)});if(s===`json`){let e=typeof n==`object`?JSON.stringify(n,null,2):String(n??`{}`),i=!0;try{JSON.parse(e)}catch{i=!1}return(0,B.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,B.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,B.jsxs)(`span`,{className:`text-[10px] font-mono text-krona-secondary flex items-center gap-1`,children:[(0,B.jsx)(d,{className:`w-3 h-3`}),` JSON редактор`]}),(0,B.jsx)(`span`,{className:`text-[10px] font-medium px-2 py-0.5 rounded ${i?`bg-krona-green/10 text-krona-green`:`bg-krona-danger/10 text-krona-danger`}`,children:i?`JSON валиден`:`Ошибка синтаксиса JSON`})]}),(0,B.jsx)(`textarea`,{rows:4,value:e,onChange:e=>K(t.key,e.target.value),disabled:r,className:`w-full font-mono text-xs bg-krona-surface text-krona-primary border rounded-md p-2.5 focus:outline-none focus:border-krona-green ${i?`border-krona-border`:`border-krona-danger`}`})]})}if(s===`rich_text`){let e=String(n??``),a=(n,r=n)=>{K(t.key,`${e} ${n}текст${r}`)};return(0,B.jsxs)(`div`,{className:`space-y-1.5`,children:[!r&&(0,B.jsxs)(`div`,{className:`flex items-center gap-1 border border-krona-border/60 rounded p-1 bg-krona-workspace/60 w-fit`,children:[(0,B.jsx)(`button`,{type:`button`,onClick:()=>a(`**`,`**`),className:`p-1 hover:bg-krona-surface rounded text-krona-secondary hover:text-krona-primary`,title:`Жирный`,children:(0,B.jsx)(T,{className:`w-3 h-3`})}),(0,B.jsx)(`button`,{type:`button`,onClick:()=>a(`*`,`*`),className:`p-1 hover:bg-krona-surface rounded text-krona-secondary hover:text-krona-primary`,title:`Курсив`,children:(0,B.jsx)(D,{className:`w-3 h-3`})}),(0,B.jsx)(`button`,{type:`button`,onClick:()=>a(` +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,u as c}from"./useToast-CS8pZhce.js";import{i as l,n as u,r as d,t as f}from"./types-DMl_5q2N.js";import{t as p}from"./file-text-DR21jZDS.js";import{t as m}from"./list-XDoRqfJ2.js";import{t as h}from"./star-B6hvSjuv.js";import{t as g}from"./upload-CY2IsfiN.js";import{A as _,I as v,U as y,ct as b,lt as x}from"./index-CrJKtV0u.js";import{n as S,t as C}from"./currency-DdDs82F5.js";var w={name:`bold`,size:24,node:[[`path`,{d:`M6 12h9a4 4 0 0 1 0 8H7a1 1 0 0 1-1-1V5a1 1 0 0 1 1-1h7a4 4 0 0 1 0 8`,key:`mg9rjx`}]]};w.node;var T=i(w),E={name:`italic`,size:24,node:[[`line`,{x1:`19`,x2:`10`,y1:`4`,y2:`4`,key:`15jd3p`}],[`line`,{x1:`14`,x2:`5`,y1:`20`,y2:`20`,key:`bu0au3`}],[`line`,{x1:`15`,x2:`9`,y1:`4`,y2:`20`,key:`uljnxc`}]]};E.node;var D=i(E),O={name:`quote`,size:24,node:[[`path`,{d:`M16 3a2 2 0 0 0-2 2v6a2 2 0 0 0 2 2 1 1 0 0 1 1 1v1a2 2 0 0 1-2 2 1 1 0 0 0-1 1v2a1 1 0 0 0 1 1 6 6 0 0 0 6-6V5a2 2 0 0 0-2-2z`,key:`rib7q0`}],[`path`,{d:`M5 3a2 2 0 0 0-2 2v6a2 2 0 0 0 2 2 1 1 0 0 1 1 1v1a2 2 0 0 1-2 2 1 1 0 0 0-1 1v2a1 1 0 0 0 1 1 6 6 0 0 0 6-6V5a2 2 0 0 0-2-2z`,key:`1ymkrd`}]]};O.node;var k=i(O),A=n(t(),1),j=new Set([`eval`,`function`,`constructor`,`prototype`,`window`,`document`,`global`,`globalthis`,`process`,`require`,`import`,`this`,`class`,`var`,`let`,`const`,`return`,`while`,`for`,`if`]),M=new Set([`round`,`floor`,`ceil`,`abs`,`min`,`max`,`sqrt`]);function N(e){let t=[],n=0;for(;nn.maxLength)return{valid:!1,error:`Максимальная длина: ${n.maxLength} симв.`};if(n?.pattern)try{if(!new RegExp(n.pattern).test(t))return{valid:!1,error:n.customMessage||`Значение не соответствует формату`}}catch{}}switch(i){case`integer`:{if(typeof t==`number`){if(!Number.isInteger(t))return{valid:!1,error:`Должно быть целым числом`}}else if(typeof t==`string`){if(!/^-?\d+$/.test(t.trim()))return{valid:!1,error:`Должно быть целым числом`}}else return{valid:!1,error:`Неверный числовой формат`};let e=Number(t);return n?.min!==void 0&&en.max?{valid:!1,error:`Максимум ${n.max}`}:{valid:!0}}case`decimal`:case`percentage`:case`money`:{let e=Number(typeof t==`object`&&t&&`minor`in t?t.minor:t);return isNaN(e)?{valid:!1,error:`Должно быть корректным числом`}:i===`percentage`&&(e<0||e>100)?{valid:!1,error:`Процент должен быть в диапазоне 0–100%`}:n?.min!==void 0&&en.max?{valid:!1,error:`Максимум ${n.max}`}:{valid:!0}}case`rating`:{let e=Number(t);return!Number.isInteger(e)||e<1||e>5?{valid:!1,error:`Рейтинг должен быть целым числом от 1 до 5`}:{valid:!0}}case`email`:{let e=String(t).trim();return/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(e)?{valid:!0}:{valid:!1,error:`Введите корректный адрес электронной почты (например name@company.ru)`}}case`url`:{let e=String(t).trim();try{let t=new URL(e);if(![`http:`,`https:`].includes(t.protocol))return{valid:!1,error:`URL должен начинаться с http:// или https://`}}catch{return{valid:!1,error:`Некорректный веб-адрес URL`}}return{valid:!0}}case`phone`:{let e=String(t).trim().replace(/\D/g,``);return e.length<6||e.length>16?{valid:!1,error:`Номер телефона должен содержать от 6 до 16 цифр`}:{valid:!0}}case`color`:{let e=String(t).trim();return/^#([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$/.test(e)?{valid:!0}:{valid:!1,error:`Цвет должен быть в формате HEX (#RGB или #RRGGBB)`}}case`time`:{let e=String(t).trim();return/^\d{2}:\d{2}(:\d{2})?$/.test(e)?{valid:!0}:{valid:!1,error:`Время должно быть в формате ЧЧ:ММ`}}case`json`:if(typeof t==`object`&&t)return{valid:!0};try{return JSON.parse(String(t)),{valid:!0}}catch{return{valid:!1,error:`Синтаксическая ошибка в структуре JSON`}}case`multi_select`:case`checkbox_group`:return Array.isArray(t)?{valid:!0}:{valid:!1,error:`Значение должно быть массивом вариантов`};case`location`:if(typeof t==`object`&&t){let e=t;if(typeof e.lat==`number`&&typeof e.lng==`number`)return e.lat<-90||e.lat>90?{valid:!1,error:`Широта (lat) должна быть от -90 до +90`}:e.lng<-180||e.lng>180?{valid:!1,error:`Долгота (lng) должна быть от -180 до +180`}:{valid:!0}}if(typeof t==`string`){let e=t.split(`,`).map(e=>parseFloat(e.trim()));if(e.length===2&&!isNaN(e[0])&&!isNaN(e[1]))return e[0]<-90||e[0]>90?{valid:!1,error:`Широта должна быть от -90 до +90`}:e[1]<-180||e[1]>180?{valid:!1,error:`Долгота должна быть от -180 до +180`}:{valid:!0}}return{valid:!1,error:`Укажите координаты в формате: широта, долгота`};default:return{valid:!0}}}function R(e,t){let n=f(e);if(t==null)return null;switch(n){case`integer`:return typeof t==`number`?Math.round(t):parseInt(String(t),10)||0;case`decimal`:case`percentage`:case`money`:return typeof t==`number`?t:parseFloat(String(t))||0;case`boolean`:return!!t;case`multi_select`:case`checkbox_group`:return Array.isArray(t)?t.map(String):[];case`json`:if(typeof t==`string`)try{return JSON.parse(t)}catch{return t}return t;case`address`:return typeof t==`object`&&t?t:{street:String(t),city:``,postalCode:``,country:``};case`location`:if(typeof t==`object`&&t)return t;if(typeof t==`string`){let e=t.split(`,`).map(e=>parseFloat(e.trim()));if(e.length===2&&!isNaN(e[0])&&!isNaN(e[1]))return{lat:e[0],lng:e[1]}}return{lat:0,lng:0};default:return t}}function z(e,t,n){if(t==null||t===``)return`—`;switch(f(e)){case`money`:{let e=typeof t==`object`&&t&&`minor`in t?t.minor:Number(t);return C(isNaN(e)?0:e)}case`percentage`:{let e=Number(t);return`${isNaN(e)?0:e}%`}case`boolean`:return t?`Да`:`Нет`;case`date`:return b(String(t));case`datetime`:return x(String(t));case`time`:return String(t);case`rating`:{let e=Math.min(5,Math.max(0,Number(t)||0));return`★`.repeat(e)+`☆`.repeat(5-e)}case`multi_select`:case`checkbox_group`:if(Array.isArray(t)){if(n?.options){let e=new Map(n.options.map(e=>[e.value,e.label]));return t.map(t=>e.get(String(t))||String(t)).join(`, `)}return t.join(`, `)}return String(t);case`select`:case`radio`:case`status`:if(n?.options){let e=n.options.find(e=>e.value===t);if(e)return e.label}return String(t);case`color`:return String(t);case`address`:if(typeof t==`object`&&t){let e=t;return[e.street,e.city,e.postalCode,e.country].filter(Boolean).join(`, `)||`—`}return String(t);case`location`:if(typeof t==`object`&&t){let e=t;return`${e.lat.toFixed(4)}, ${e.lng.toFixed(4)}`}return String(t);case`file`:case`image`:return typeof t==`object`&&t&&`name`in t?String(t.name):`Файл`;case`json`:return typeof t==`object`?JSON.stringify(t):String(t);default:return String(t)}}var B=o(),V={user:[{value:`usr_01`,label:`Иван Иванов (Администратор)`},{value:`usr_02`,label:`Анна Смирнова (Менеджер)`},{value:`usr_03`,label:`Михаил Соколов (Аналитик)`},{value:`usr_04`,label:`Елена Кузнецова (Оператор)`}],employee:[{value:`emp_01`,label:`Дмитрий Кузнецов (Ведущий инженер)`},{value:`emp_02`,label:`Ольга Морозова (Менеджер проекта)`},{value:`emp_03`,label:`Сергей Попов (Разработчик)`}],team:[{value:`team_01`,label:`Отдел продаж и работы с клиентами`},{value:`team_02`,label:`Департамент разработки ПО`},{value:`team_03`,label:`Служба логистики и снабжения`},{value:`team_04`,label:`Финансово-экономический отдел`}],company:[{value:`comp_01`,label:`ООО «Северная Звезда»`},{value:`comp_02`,label:`АО «ПромИнвестХолдинг»`},{value:`comp_03`,label:`ПАО «ТехноСфера»`},{value:`comp_04`,label:`ИП Сидоров А.В.`}],contact:[{value:`cont_01`,label:`Алексей Петров (+7 900 111-22-33)`},{value:`cont_02`,label:`Екатерина Васильева (e.vas@prom.ru)`},{value:`cont_03`,label:`Николай Федоров (+7 911 444-55-66)`}],product:[{value:`prod_01`,label:`Лицензия Krona Enterprise (Годовая)`},{value:`prod_02`,label:`Модуль расширенной бизнес-аналитики`},{value:`prod_03`,label:`Консалтинг по интеграции ERP/CRM`},{value:`prod_04`,label:`Пакет технической поддержки 24/7`}],entity_relation:[{value:`rel_01`,label:`Связанный документ #01`},{value:`rel_02`,label:`Связанный договор #02`},{value:`rel_03`,label:`Связанный контрагент #03`}]},H=[`#2F684C`,`#2563EB`,`#D97706`,`#DC2626`,`#7C3AED`,`#4B5563`,`#059669`,`#0891B2`],U=({entity:t,record:n,layout:i,mode:o=`create`,onSave:b,onCancel:x,isLoading:w=!1})=>{let{showToast:E}=s(),O=(0,A.useCallback)((e,t)=>{let n={};return e.fields.forEach(e=>{t&&t[e.key]!==void 0?n[e.key]=t[e.key]:n[e.key]=I(e.type,e)}),n},[]),[j,M]=(0,A.useState)(()=>O(t,n)),[N,P]=(0,A.useState)({}),z=(0,A.useRef)(n?.id);(0,A.useEffect)(()=>{n?.id!==z.current&&(z.current=n?.id,Promise.resolve().then(()=>{M(O(t,n)),P({})}))},[t,n,O]);let U=(0,A.useMemo)(()=>{let e=new Map;return t.fields.forEach(t=>e.set(t.key,t)),e},[t]),W=(0,A.useMemo)(()=>i?.sections&&i.sections.length>0?i.sections:[{id:`sec_default`,title:`Основные данные`,columns:2,fieldKeys:t.fields.map(e=>e.key)}],[i,t]),G=(0,A.useCallback)(e=>{if(e.hidden)return!1;if(!e.conditionalVisibility||!e.conditionalVisibility.fieldKey)return!0;let{fieldKey:t,operator:n,value:r}=e.conditionalVisibility,i=j[t];switch(n){case`eq`:return String(i??``)===String(r??``);case`neq`:return String(i??``)!==String(r??``);case`contains`:return String(i??``).includes(String(r??``));default:return!0}},[j]),K=(e,t)=>{M(n=>({...n,[e]:t})),N[e]&&P(t=>{let n={...t};return delete n[e],n})},q=()=>{let e={};return t.fields.forEach(t=>{if(!G(t))return;let n=j[t.key],r=L(t.type,n,t.validation,t);r.valid||(r.error===`Обязательное поле для заполнения`?e[t.key]=`Поле «${t.label}» обязательно для заполнения`:e[t.key]=r.error||`Поле «${t.label}» заполнено неверно`)}),P(e),Object.keys(e).length===0},J=async e=>{if(e.preventDefault(),o!==`readonly`){if(!q()){E({type:`error`,title:`Проверьте правильность заполнения формы`});return}try{let e={};t.fields.forEach(t=>{j[t.key]!==void 0&&(e[t.key]=R(t.type,j[t.key]))}),Object.keys(j).forEach(t=>{e[t]===void 0&&(e[t]=j[t])}),await b(e)}catch(e){E({type:`error`,title:`Ошибка сохранения записи`,message:e instanceof Error?e.message:String(e)})}}},Y=t=>{let n=j[t.key],r=o===`readonly`||t.readOnly,i=!!N[t.key],s=f(t.type);if(s===`money`){let e=typeof n==`number`?n:0,a=(e/100).toString();return r?(0,B.jsx)(`div`,{className:`font-semibold text-xs text-krona-primary p-2 bg-krona-workspace rounded border border-krona-border/60`,children:C(e)}):(0,B.jsxs)(`div`,{className:`relative`,children:[(0,B.jsx)(`input`,{type:`number`,step:`0.01`,value:a===`0`&&n===``?``:a,onChange:e=>{let n=S(e.target.value);K(t.key,n)},placeholder:t.placeholder||`0.00`,disabled:r,className:`w-full bg-krona-surface text-krona-primary border rounded-md px-3 py-2 text-xs focus:outline-none focus:border-krona-green pr-8 ${i?`border-krona-danger`:`border-krona-border`}`}),(0,B.jsx)(`span`,{className:`absolute right-3 top-2.5 text-xs text-krona-secondary font-medium`,children:`₽`})]})}if(s===`select`||s===`status`){if(r){let e=t.options?.find(e=>e.value===n);return(0,B.jsx)(`div`,{className:`text-xs font-medium text-krona-primary p-2 bg-krona-workspace rounded border border-krona-border/60`,children:e?.label||String(n||`—`)})}return(0,B.jsxs)(`select`,{value:String(n??``),onChange:e=>K(t.key,e.target.value),disabled:r,className:`w-full bg-krona-surface text-krona-primary border rounded-md px-3 py-2 text-xs focus:outline-none focus:border-krona-green ${i?`border-krona-danger`:`border-krona-border`}`,children:[(0,B.jsx)(`option`,{value:``,children:`Выберите значение...`}),t.options?.map(e=>(0,B.jsx)(`option`,{value:e.value,children:e.label},e.value))]})}if(s===`radio`){let e=t.options||[{value:`option_1`,label:`Вариант 1`},{value:`option_2`,label:`Вариант 2`}];if(r){let t=e.find(e=>e.value===n);return(0,B.jsx)(`div`,{className:`text-xs font-medium text-krona-primary p-2 bg-krona-workspace rounded border border-krona-border/60`,children:t?.label||String(n||`—`)})}return(0,B.jsx)(`div`,{className:`space-y-1.5 pt-1`,children:e.map(e=>(0,B.jsxs)(`label`,{className:`flex items-center gap-2 cursor-pointer text-xs text-krona-primary`,children:[(0,B.jsx)(`input`,{type:`radio`,name:`radio_${t.key}`,value:e.value,checked:n===e.value,onChange:()=>K(t.key,e.value),disabled:r,className:`text-krona-green focus:ring-krona-green`}),(0,B.jsx)(`span`,{children:e.label})]},e.value))})}if(s===`multi_select`){let o=Array.isArray(n)?n:[],s=t.options||[];if(r)return(0,B.jsx)(`div`,{className:`flex flex-wrap gap-1.5 p-2 bg-krona-workspace rounded border border-krona-border/60`,children:o.length>0?o.map(e=>{let t=s.find(t=>t.value===e)?.label||e;return(0,B.jsx)(a,{variant:`neutral`,size:`sm`,children:t},e)}):(0,B.jsx)(`span`,{className:`text-xs text-krona-secondary`,children:`Ничего не выбрано`})});let c=s.filter(e=>!o.includes(e.value));return(0,B.jsxs)(`div`,{className:`space-y-2`,children:[o.length>0&&(0,B.jsx)(`div`,{className:`flex flex-wrap gap-1.5 p-2 bg-krona-workspace/60 rounded border border-krona-border/60`,children:o.map(n=>{let r=s.find(e=>e.value===n)?.label||n;return(0,B.jsxs)(`span`,{className:`inline-flex items-center gap-1 px-2 py-0.5 rounded-full text-xs font-medium bg-krona-green/10 text-krona-green border border-krona-green/20`,children:[r,(0,B.jsx)(`button`,{type:`button`,onClick:()=>K(t.key,o.filter(e=>e!==n)),className:`hover:text-krona-danger ml-0.5`,children:(0,B.jsx)(e,{className:`w-3 h-3`})})]},n)})}),(0,B.jsxs)(`select`,{value:``,onChange:e=>{e.target.value&&K(t.key,[...o,e.target.value])},disabled:r,className:`w-full bg-krona-surface text-krona-primary border rounded-md px-3 py-2 text-xs focus:outline-none focus:border-krona-green ${i?`border-krona-danger`:`border-krona-border`}`,children:[(0,B.jsx)(`option`,{value:``,children:`+ Добавить вариант...`}),c.map(e=>(0,B.jsx)(`option`,{value:e.value,children:e.label},e.value))]})]})}if(s===`checkbox_group`){let e=Array.isArray(n)?n:[],i=t.options||[{value:`opt_1`,label:`Вариант А`},{value:`opt_2`,label:`Вариант Б`},{value:`opt_3`,label:`Вариант В`}];return(0,B.jsx)(`div`,{className:`space-y-1.5 pt-1`,children:i.map(n=>{let i=e.includes(n.value);return(0,B.jsxs)(`label`,{className:`flex items-center gap-2 cursor-pointer text-xs text-krona-primary`,children:[(0,B.jsx)(`input`,{type:`checkbox`,checked:i,disabled:r,onChange:r=>{r.target.checked?K(t.key,[...e,n.value]):K(t.key,e.filter(e=>e!==n.value))},className:`rounded text-krona-green focus:ring-krona-green`}),(0,B.jsx)(`span`,{children:n.label})]},n.value)})})}if(s===`rating`){let e=Math.min(5,Math.max(1,Number(n)||5));return(0,B.jsxs)(`div`,{className:`flex items-center gap-1.5 py-1`,children:[[1,2,3,4,5].map(n=>(0,B.jsx)(`button`,{type:`button`,disabled:r,onClick:()=>K(t.key,n),"aria-label":`Оценка ${n} из 5 звёзд`,className:`p-1 rounded transition-transform ${r?`cursor-default`:`hover:scale-125 cursor-pointer`}`,children:(0,B.jsx)(h,{className:`w-5 h-5 ${n<=e?`fill-amber-400 text-amber-400`:`text-krona-secondary opacity-30`}`})},n)),(0,B.jsxs)(`span`,{className:`text-xs font-semibold text-krona-primary ml-2`,children:[e,` / 5`]})]})}if(s===`boolean`)return(0,B.jsxs)(`label`,{className:`flex items-center gap-2.5 cursor-pointer text-xs font-medium text-krona-primary py-1`,children:[(0,B.jsx)(`input`,{type:`checkbox`,checked:!!n,onChange:e=>K(t.key,e.target.checked),disabled:r,className:`w-4 h-4 rounded text-krona-green focus:ring-krona-green`}),(0,B.jsx)(`span`,{children:n?`Да (активно)`:`Нет`})]});if(s===`date`||s===`datetime`||s===`time`)return(0,B.jsx)(`input`,{type:s===`datetime`?`datetime-local`:s===`time`?`time`:`date`,value:String(n??``),onChange:e=>K(t.key,e.target.value),disabled:r,className:`w-full bg-krona-surface text-krona-primary border rounded-md px-3 py-2 text-xs focus:outline-none focus:border-krona-green ${i?`border-krona-danger`:`border-krona-border`}`});if(s===`url`)return(0,B.jsxs)(`div`,{className:`relative flex items-center`,children:[(0,B.jsx)(`input`,{type:`url`,value:String(n??``),onChange:e=>K(t.key,e.target.value),disabled:r,placeholder:t.placeholder||`https://example.com`,className:`w-full bg-krona-surface text-krona-primary border rounded-md px-3 py-2 text-xs focus:outline-none focus:border-krona-green pr-8 ${i?`border-krona-danger`:`border-krona-border`}`}),n?(0,B.jsx)(`a`,{href:String(n),target:`_blank`,rel:`noopener noreferrer`,className:`absolute right-2.5 text-krona-secondary hover:text-krona-green`,title:`Открыть ссылку`,children:(0,B.jsx)(v,{className:`w-3.5 h-3.5`})}):null]});if(s===`color`){let e=String(n||`#2F684C`),a=/^#([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$/.test(e)?e:`#2F684C`;return r?(0,B.jsxs)(`div`,{className:`flex items-center gap-2 p-1.5 bg-krona-workspace rounded border border-krona-border/60`,children:[(0,B.jsx)(`div`,{className:`w-5 h-5 rounded border border-krona-border/60`,style:{backgroundColor:a}}),(0,B.jsx)(`span`,{className:`font-mono text-xs text-krona-primary`,children:e})]}):(0,B.jsx)(`div`,{className:`space-y-2`,children:(0,B.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,B.jsx)(`input`,{type:`color`,value:a.length===7?a:`#2F684C`,onChange:e=>K(t.key,e.target.value),disabled:r,className:`w-8 h-8 rounded cursor-pointer border border-krona-border bg-transparent p-0.5`}),(0,B.jsx)(`input`,{type:`text`,value:e,onChange:e=>K(t.key,e.target.value),disabled:r,placeholder:`#2F684C`,maxLength:7,className:`w-28 font-mono text-xs uppercase bg-krona-surface text-krona-primary border rounded-md px-2.5 py-1.5 focus:outline-none focus:border-krona-green ${i?`border-krona-danger`:`border-krona-border`}`}),(0,B.jsx)(`div`,{className:`flex items-center gap-1.5 ml-2`,children:H.map(e=>(0,B.jsx)(`button`,{type:`button`,onClick:()=>K(t.key,e),style:{backgroundColor:e},className:`w-5 h-5 rounded-full border border-krona-border/60 hover:scale-110 transition-transform`,title:e},e))})]})})}if(s===`file`||s===`image`){let i=n&&typeof n==`object`?n:null;return i?(0,B.jsxs)(`div`,{className:`p-3 bg-krona-workspace/60 rounded-lg border border-krona-border/60 flex items-center justify-between gap-3`,children:[(0,B.jsxs)(`div`,{className:`flex items-center gap-2.5 min-w-0`,children:[s===`image`&&i.url?(0,B.jsx)(`img`,{src:i.url,alt:i.name,className:`w-10 h-10 rounded object-cover border border-krona-border shrink-0`}):(0,B.jsx)(p,{className:`w-6 h-6 text-krona-green shrink-0`}),(0,B.jsxs)(`div`,{className:`truncate`,children:[(0,B.jsx)(`p`,{className:`text-xs font-semibold text-krona-primary truncate`,children:i.name}),(0,B.jsxs)(`p`,{className:`text-[11px] text-krona-secondary font-mono`,children:[(i.size/1024).toFixed(1),` КБ • `,i.mimeType]})]})]}),!r&&(0,B.jsx)(`button`,{type:`button`,onClick:()=>K(t.key,null),className:`p-1 text-krona-secondary hover:text-krona-danger rounded transition-colors`,title:`Удалить файл`,children:(0,B.jsx)(e,{className:`w-4 h-4`})})]}):r?(0,B.jsx)(`div`,{className:`text-xs text-krona-secondary p-2 bg-krona-workspace rounded`,children:`Файл не прикреплен`}):(0,B.jsxs)(`label`,{className:`flex flex-col items-center justify-center p-4 border-2 border-dashed border-krona-border rounded-lg cursor-pointer hover:bg-krona-workspace/40 transition-colors`,children:[(0,B.jsx)(g,{className:`w-5 h-5 text-krona-secondary mb-1.5`}),(0,B.jsx)(`span`,{className:`text-xs font-medium text-krona-primary`,children:s===`image`?`Нажмите для загрузки изображения`:`Нажмите для загрузки документа`}),(0,B.jsx)(`span`,{className:`text-[10px] text-krona-secondary mt-0.5`,children:`PNG, JPG, PDF, DOCX до 10 МБ`}),(0,B.jsx)(`input`,{type:`file`,accept:s===`image`?`image/*`:void 0,onChange:e=>{let n=e.target.files?.[0];if(!n)return;let r=new FileReader;r.onload=e=>{let r={id:c(),name:n.name,size:n.size,mimeType:n.type||`application/octet-stream`,url:String(e.target?.result||``),uploadedAt:new Date().toISOString()};K(t.key,r)},r.readAsDataURL(n)},className:`hidden`})]})}if(s===`address`){let e=typeof n==`object`&&n?n:{street:String(n||``),city:``,postalCode:``,country:`Россия`};if(r){let t=[e.city,e.street,e.postalCode,e.country].filter(Boolean);return(0,B.jsxs)(`div`,{className:`flex items-center gap-1.5 text-xs text-krona-primary p-2 bg-krona-workspace rounded border border-krona-border/60`,children:[(0,B.jsx)(_,{className:`w-3.5 h-3.5 text-krona-green shrink-0`}),(0,B.jsx)(`span`,{children:t.join(`, `)||`—`})]})}return(0,B.jsxs)(`div`,{className:`space-y-2 p-2.5 bg-krona-workspace/40 rounded-lg border border-krona-border/60`,children:[(0,B.jsxs)(`div`,{className:`grid grid-cols-2 gap-2`,children:[(0,B.jsx)(`input`,{type:`text`,placeholder:`Город (напр. Москва)`,value:e.city||``,onChange:n=>K(t.key,{...e,city:n.target.value}),className:`bg-krona-surface text-krona-primary border border-krona-border rounded px-2 py-1 text-xs focus:outline-none focus:border-krona-green`}),(0,B.jsx)(`input`,{type:`text`,placeholder:`Индекс (напр. 101000)`,value:e.postalCode||``,onChange:n=>K(t.key,{...e,postalCode:n.target.value}),className:`bg-krona-surface text-krona-primary border border-krona-border rounded px-2 py-1 text-xs focus:outline-none focus:border-krona-green`})]}),(0,B.jsx)(`input`,{type:`text`,placeholder:`Улица, дом, офис (напр. Тверская ул., д. 12, оф. 405)`,value:e.street||``,onChange:n=>K(t.key,{...e,street:n.target.value}),className:`w-full bg-krona-surface text-krona-primary border border-krona-border rounded px-2 py-1 text-xs focus:outline-none focus:border-krona-green`})]})}if(s===`location`){let e=typeof n==`object`&&n?n:{lat:0,lng:0};return r?(0,B.jsxs)(`div`,{className:`flex items-center gap-1.5 text-xs text-krona-primary p-2 bg-krona-workspace rounded border border-krona-border/60`,children:[(0,B.jsx)(u,{className:`w-3.5 h-3.5 text-krona-green shrink-0`}),(0,B.jsxs)(`span`,{children:[`Широта: `,e.lat.toFixed(4),`, Долгота: `,e.lng.toFixed(4)]})]}):(0,B.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,B.jsxs)(`div`,{className:`relative flex-1`,children:[(0,B.jsx)(`input`,{type:`number`,step:`0.0001`,min:`-90`,max:`90`,placeholder:`Широта (Lat)`,value:e.lat||``,onChange:n=>K(t.key,{...e,lat:parseFloat(n.target.value)||0}),className:`w-full bg-krona-surface text-krona-primary border border-krona-border rounded-md px-2.5 py-1.5 text-xs focus:outline-none focus:border-krona-green`}),(0,B.jsx)(`span`,{className:`absolute right-2 top-2 text-[10px] text-krona-secondary font-mono`,children:`LAT`})]}),(0,B.jsxs)(`div`,{className:`relative flex-1`,children:[(0,B.jsx)(`input`,{type:`number`,step:`0.0001`,min:`-180`,max:`180`,placeholder:`Долгота (Lng)`,value:e.lng||``,onChange:n=>K(t.key,{...e,lng:parseFloat(n.target.value)||0}),className:`w-full bg-krona-surface text-krona-primary border border-krona-border rounded-md px-2.5 py-1.5 text-xs focus:outline-none focus:border-krona-green`}),(0,B.jsx)(`span`,{className:`absolute right-2 top-2 text-[10px] text-krona-secondary font-mono`,children:`LNG`})]})]})}if(s===`user`||s===`employee`||s===`team`||s===`company`||s===`contact`||s===`product`||s===`entity_relation`){let e=t.options&&t.options.length>0?t.options:V[s]||[];if(r){let t=e.find(e=>e.value===n);return(0,B.jsx)(`div`,{className:`text-xs font-medium text-krona-primary p-2 bg-krona-workspace rounded border border-krona-border/60`,children:t?.label||String(n||`—`)})}return(0,B.jsxs)(`select`,{value:String(n??``),onChange:e=>K(t.key,e.target.value),disabled:r,className:`w-full bg-krona-surface text-krona-primary border rounded-md px-3 py-2 text-xs focus:outline-none focus:border-krona-green ${i?`border-krona-danger`:`border-krona-border`}`,children:[(0,B.jsx)(`option`,{value:``,children:`Выберите запись...`}),e.map(e=>(0,B.jsx)(`option`,{value:e.value,children:e.label},e.value))]})}if(s===`formula`){let e=F(t.formula||``,j);return(0,B.jsxs)(`div`,{className:`p-2.5 bg-krona-workspace/80 border border-krona-border rounded-md flex items-center justify-between`,children:[(0,B.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,B.jsx)(l,{className:`w-4 h-4 text-krona-green shrink-0`}),(0,B.jsxs)(`div`,{children:[(0,B.jsx)(`div`,{className:`text-xs font-bold text-krona-primary font-mono`,children:e===null?`—`:e.toLocaleString(`ru-RU`)}),(0,B.jsxs)(`div`,{className:`text-[10px] text-krona-secondary font-mono`,children:[`f(x) = `,t.formula||`не задана`]})]})]}),(0,B.jsx)(a,{variant:`neutral`,size:`sm`,children:`Вычисляемое поле`})]})}if(s===`autonumber`)return(0,B.jsx)(`div`,{className:`p-2 bg-krona-workspace rounded border border-krona-border/60 font-mono text-xs font-semibold text-krona-primary`,children:String(n||`AUTO-[Генерируется]`)});if(s===`json`){let e=typeof n==`object`?JSON.stringify(n,null,2):String(n??`{}`),i=!0;try{JSON.parse(e)}catch{i=!1}return(0,B.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,B.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,B.jsxs)(`span`,{className:`text-[10px] font-mono text-krona-secondary flex items-center gap-1`,children:[(0,B.jsx)(d,{className:`w-3 h-3`}),` JSON редактор`]}),(0,B.jsx)(`span`,{className:`text-[10px] font-medium px-2 py-0.5 rounded ${i?`bg-krona-green/10 text-krona-green`:`bg-krona-danger/10 text-krona-danger`}`,children:i?`JSON валиден`:`Ошибка синтаксиса JSON`})]}),(0,B.jsx)(`textarea`,{rows:4,value:e,onChange:e=>K(t.key,e.target.value),disabled:r,className:`w-full font-mono text-xs bg-krona-surface text-krona-primary border rounded-md p-2.5 focus:outline-none focus:border-krona-green ${i?`border-krona-border`:`border-krona-danger`}`})]})}if(s===`rich_text`){let e=String(n??``),a=(n,r=n)=>{K(t.key,`${e} ${n}текст${r}`)};return(0,B.jsxs)(`div`,{className:`space-y-1.5`,children:[!r&&(0,B.jsxs)(`div`,{className:`flex items-center gap-1 border border-krona-border/60 rounded p-1 bg-krona-workspace/60 w-fit`,children:[(0,B.jsx)(`button`,{type:`button`,onClick:()=>a(`**`,`**`),className:`p-1 hover:bg-krona-surface rounded text-krona-secondary hover:text-krona-primary`,title:`Жирный`,children:(0,B.jsx)(T,{className:`w-3 h-3`})}),(0,B.jsx)(`button`,{type:`button`,onClick:()=>a(`*`,`*`),className:`p-1 hover:bg-krona-surface rounded text-krona-secondary hover:text-krona-primary`,title:`Курсив`,children:(0,B.jsx)(D,{className:`w-3 h-3`})}),(0,B.jsx)(`button`,{type:`button`,onClick:()=>a(` - `),className:`p-1 hover:bg-krona-surface rounded text-krona-secondary hover:text-krona-primary`,title:`Список`,children:(0,B.jsx)(m,{className:`w-3 h-3`})}),(0,B.jsx)(`button`,{type:`button`,onClick:()=>a(` -> `),className:`p-1 hover:bg-krona-surface rounded text-krona-secondary hover:text-krona-primary`,title:`Цитата`,children:(0,B.jsx)(k,{className:`w-3 h-3`})})]}),(0,B.jsx)(`textarea`,{rows:3,value:e,onChange:e=>K(t.key,e.target.value),disabled:r,placeholder:t.placeholder||`Введите форматированный текст...`,className:`w-full bg-krona-surface text-krona-primary border rounded-md px-3 py-2 text-xs focus:outline-none focus:border-krona-green ${i?`border-krona-danger`:`border-krona-border`}`})]})}return s===`long_text`?(0,B.jsx)(`textarea`,{rows:3,value:String(n??``),onChange:e=>K(t.key,e.target.value),disabled:r,placeholder:t.placeholder||`Введите текст...`,className:`w-full bg-krona-surface text-krona-primary border rounded-md px-3 py-2 text-xs focus:outline-none focus:border-krona-green ${i?`border-krona-danger`:`border-krona-border`}`}):s===`integer`||s===`decimal`||s===`percentage`?(0,B.jsxs)(`div`,{className:`relative`,children:[(0,B.jsx)(`input`,{type:`number`,step:s===`integer`?`1`:`0.01`,value:n==null?``:String(n),onChange:e=>K(t.key,e.target.value===``?``:Number(e.target.value)),disabled:r,placeholder:t.placeholder||`0`,className:`w-full bg-krona-surface text-krona-primary border rounded-md px-3 py-2 text-xs focus:outline-none focus:border-krona-green ${s===`percentage`?`pr-8`:``} ${i?`border-krona-danger`:`border-krona-border`}`}),s===`percentage`&&(0,B.jsx)(`span`,{className:`absolute right-3 top-2.5 text-xs text-krona-secondary font-medium`,children:`%`})]}):(0,B.jsx)(`input`,{type:s===`email`?`email`:s===`phone`?`tel`:`text`,value:String(n??``),onChange:e=>K(t.key,e.target.value),disabled:r,placeholder:t.placeholder||``,className:`w-full bg-krona-surface text-krona-primary border rounded-md px-3 py-2 text-xs focus:outline-none focus:border-krona-green ${i?`border-krona-danger`:`border-krona-border`}`})};return(0,B.jsxs)(`form`,{onSubmit:J,className:`space-y-5`,children:[W.map(e=>{let t=e.fieldKeys.map(e=>U.get(e)).filter(e=>!!(e&&G(e)));if(t.length===0)return null;let n={1:`grid-cols-1`,2:`grid-cols-1 sm:grid-cols-2`,3:`grid-cols-1 sm:grid-cols-3`,4:`grid-cols-1 sm:grid-cols-4`}[e.columns||2];return(0,B.jsxs)(`div`,{className:`p-4 bg-krona-surface border border-krona-border rounded-xl shadow-krona-soft space-y-3`,children:[e.title&&(0,B.jsx)(`h3`,{className:`text-xs font-bold text-krona-primary uppercase tracking-wider pb-2 border-b border-krona-border/60`,children:e.title}),(0,B.jsx)(`div`,{className:`grid ${n} gap-3`,children:t.map(e=>(0,B.jsxs)(`div`,{className:`space-y-1 text-left`,children:[(0,B.jsx)(`div`,{className:`flex items-center justify-between`,children:(0,B.jsxs)(`label`,{className:`text-xs font-semibold text-krona-primary select-none flex items-center gap-1`,children:[e.label,e.required&&(0,B.jsx)(`span`,{className:`text-krona-danger font-bold`,title:`Обязательное поле`,children:`*`})]})}),Y(e),N[e.key]?(0,B.jsxs)(`p`,{className:`text-[11px] text-krona-danger flex items-center gap-1 mt-0.5`,children:[(0,B.jsx)(v,{className:`w-3 h-3 shrink-0`}),N[e.key]]}):e.description?(0,B.jsx)(`p`,{className:`text-[10px] text-krona-secondary mt-0.5`,children:e.description}):null]},e.key))})]},e.id)}),o!==`readonly`&&(0,B.jsxs)(`div`,{className:`flex items-center justify-end gap-2.5 pt-3 border-t border-krona-border`,children:[x&&(0,B.jsx)(r,{variant:`outline`,size:`md`,type:`button`,onClick:x,children:`Отмена`}),(0,B.jsx)(r,{variant:`primary`,size:`md`,type:`submit`,"data-testid":`dynamic-form-submit`,disabled:w,children:w?`Сохранение...`:o===`create`?`Создать запись`:`Сохранить изменения`})]})]})};export{F as n,z as r,U as t}; \ No newline at end of file +> `),className:`p-1 hover:bg-krona-surface rounded text-krona-secondary hover:text-krona-primary`,title:`Цитата`,children:(0,B.jsx)(k,{className:`w-3 h-3`})})]}),(0,B.jsx)(`textarea`,{rows:3,value:e,onChange:e=>K(t.key,e.target.value),disabled:r,placeholder:t.placeholder||`Введите форматированный текст...`,className:`w-full bg-krona-surface text-krona-primary border rounded-md px-3 py-2 text-xs focus:outline-none focus:border-krona-green ${i?`border-krona-danger`:`border-krona-border`}`})]})}return s===`long_text`?(0,B.jsx)(`textarea`,{rows:3,value:String(n??``),onChange:e=>K(t.key,e.target.value),disabled:r,placeholder:t.placeholder||`Введите текст...`,className:`w-full bg-krona-surface text-krona-primary border rounded-md px-3 py-2 text-xs focus:outline-none focus:border-krona-green ${i?`border-krona-danger`:`border-krona-border`}`}):s===`integer`||s===`decimal`||s===`percentage`?(0,B.jsxs)(`div`,{className:`relative`,children:[(0,B.jsx)(`input`,{type:`number`,step:s===`integer`?`1`:`0.01`,value:n==null?``:String(n),onChange:e=>K(t.key,e.target.value===``?``:Number(e.target.value)),disabled:r,placeholder:t.placeholder||`0`,className:`w-full bg-krona-surface text-krona-primary border rounded-md px-3 py-2 text-xs focus:outline-none focus:border-krona-green ${s===`percentage`?`pr-8`:``} ${i?`border-krona-danger`:`border-krona-border`}`}),s===`percentage`&&(0,B.jsx)(`span`,{className:`absolute right-3 top-2.5 text-xs text-krona-secondary font-medium`,children:`%`})]}):(0,B.jsx)(`input`,{type:s===`email`?`email`:s===`phone`?`tel`:`text`,value:String(n??``),onChange:e=>K(t.key,e.target.value),disabled:r,placeholder:t.placeholder||``,className:`w-full bg-krona-surface text-krona-primary border rounded-md px-3 py-2 text-xs focus:outline-none focus:border-krona-green ${i?`border-krona-danger`:`border-krona-border`}`})};return(0,B.jsxs)(`form`,{onSubmit:J,className:`space-y-5`,children:[W.map(e=>{let t=e.fieldKeys.map(e=>U.get(e)).filter(e=>!!(e&&G(e)));if(t.length===0)return null;let n={1:`grid-cols-1`,2:`grid-cols-1 sm:grid-cols-2`,3:`grid-cols-1 sm:grid-cols-3`,4:`grid-cols-1 sm:grid-cols-4`}[e.columns||2];return(0,B.jsxs)(`div`,{className:`p-4 bg-krona-surface border border-krona-border rounded-xl shadow-krona-soft space-y-3`,children:[e.title&&(0,B.jsx)(`h3`,{className:`text-xs font-bold text-krona-primary uppercase tracking-wider pb-2 border-b border-krona-border/60`,children:e.title}),(0,B.jsx)(`div`,{className:`grid ${n} gap-3`,children:t.map(e=>(0,B.jsxs)(`div`,{className:`space-y-1 text-left`,children:[(0,B.jsx)(`div`,{className:`flex items-center justify-between`,children:(0,B.jsxs)(`label`,{className:`text-xs font-semibold text-krona-primary select-none flex items-center gap-1`,children:[e.label,e.required&&(0,B.jsx)(`span`,{className:`text-krona-danger font-bold`,title:`Обязательное поле`,children:`*`})]})}),Y(e),N[e.key]?(0,B.jsxs)(`p`,{className:`text-[11px] text-krona-danger flex items-center gap-1 mt-0.5`,children:[(0,B.jsx)(y,{className:`w-3 h-3 shrink-0`}),N[e.key]]}):e.description?(0,B.jsx)(`p`,{className:`text-[10px] text-krona-secondary mt-0.5`,children:e.description}):null]},e.key))})]},e.id)}),o!==`readonly`&&(0,B.jsxs)(`div`,{className:`flex items-center justify-end gap-2.5 pt-3 border-t border-krona-border`,children:[x&&(0,B.jsx)(r,{variant:`outline`,size:`md`,type:`button`,onClick:x,children:`Отмена`}),(0,B.jsx)(r,{variant:`primary`,size:`md`,type:`submit`,"data-testid":`dynamic-form-submit`,disabled:w,children:w?`Сохранение...`:o===`create`?`Создать запись`:`Сохранить изменения`})]})]})};export{F as n,z as r,U as t}; \ No newline at end of file diff --git a/dist/assets/EmployeesModule-BFNtlVZT.js b/dist/assets/EmployeesModule-70hl9DMi.js similarity index 96% rename from dist/assets/EmployeesModule-BFNtlVZT.js rename to dist/assets/EmployeesModule-70hl9DMi.js index d508693..cf23dae 100644 --- a/dist/assets/EmployeesModule-BFNtlVZT.js +++ b/dist/assets/EmployeesModule-70hl9DMi.js @@ -1 +1 @@ -import{f as e,h as t,i as n,r,s as i,t as a}from"./useToast-CS8pZhce.js";import{t as o}from"./phone-DpnQw4if.js";import{t as s}from"./star-B6hvSjuv.js";import{R as c,q as l,r as u,s as d,t as f,w as p,y as m}from"./index-CNnq9VO5.js";import{a as h}from"./mockData-DAqQG5te.js";var g=t(e(),1),_=i(),v=[`Пн`,`Вт`,`Ср`,`Чт`,`Пт`,`Сб`,`Вс`],y=[{employeeId:`emp-1`,day:`Пн`,shiftText:`10:00 - 22:00`,hours:12},{employeeId:`emp-1`,day:`Вт`,shiftText:`10:00 - 22:00`,hours:12},{employeeId:`emp-1`,day:`Ср`,shiftText:`10:00 - 22:00`,hours:12},{employeeId:`emp-1`,day:`Чт`,shiftText:`10:00 - 22:00`,hours:12},{employeeId:`emp-1`,day:`Пт`,shiftText:`09:00 - 23:00`,hours:14,hasConflict:!0,conflictReason:`Смена превышает 12 ч (ТК РФ)`},{employeeId:`emp-2`,day:`Вт`,shiftText:`11:00 - 23:00`,hours:12},{employeeId:`emp-2`,day:`Ср`,shiftText:`11:00 - 23:00`,hours:12},{employeeId:`emp-2`,day:`Чт`,shiftText:`11:00 - 23:00`,hours:12},{employeeId:`emp-2`,day:`Сб`,shiftText:`11:00 - 23:00`,hours:12},{employeeId:`emp-2`,day:`Вс`,shiftText:`11:00 - 23:00`,hours:12},{employeeId:`emp-3`,day:`Пн`,shiftText:`10:00 - 22:00`,hours:12},{employeeId:`emp-3`,day:`Чт`,shiftText:`10:00 - 22:00`,hours:12},{employeeId:`emp-3`,day:`Пт`,shiftText:`10:00 - 22:00`,hours:12},{employeeId:`emp-3`,day:`Сб`,shiftText:`10:00 - 22:00`,hours:12},{employeeId:`emp-4`,day:`Пн`,shiftText:`12:00 - 00:00`,hours:12},{employeeId:`emp-4`,day:`Вт`,shiftText:`12:00 - 00:00`,hours:12},{employeeId:`emp-4`,day:`Пт`,shiftText:`12:00 - 00:00`,hours:12},{employeeId:`emp-4`,day:`Сб`,shiftText:`12:00 - 00:00`,hours:12}],b=()=>{let{showToast:e}=a(),[t,i]=(0,g.useState)(`employees`),[b,x]=(0,g.useState)(h),[S,C]=(0,g.useState)(y),[w,T]=(0,g.useState)(``),[E,D]=(0,g.useState)(!1),[O,k]=(0,g.useState)(``),[A,j]=(0,g.useState)(`Официант`),[M,N]=(0,g.useState)(`+7 (913) `),[P,F]=(0,g.useState)(250),[I,L]=(0,g.useState)(null),R=b.filter(e=>e.name.toLowerCase().includes(w.toLowerCase())||e.role.toLowerCase().includes(w.toLowerCase())),z=t=>{if(t.preventDefault(),!O.trim())return;let n=O.split(` `).map(e=>e[0]).join(``).slice(0,2).toUpperCase()||`НС`,r={id:`emp-${Date.now()}`,name:O.trim(),role:A,status:`off_shift`,shiftHours:`09:00 - 21:00`,salesToday:0,rating:5,phone:M,avatarInitials:n};x(e=>[r,...e]),D(!1),k(``),e({title:`Сотрудник добавлен`,message:`Карточка «${r.name}» (${r.role}) успешно создана`,type:`success`})},B=()=>{if(!I)return;let t=I.hours>12,n=t?`Смена превышает 12 ч (ТК РФ)`:void 0;C(e=>{let r=e.filter(e=>e.employeeId!==I.empId||e.day!==I.day);return I.shiftText===`Выходной`||I.hours===0?r:[...r,{employeeId:I.empId,day:I.day,shiftText:I.shiftText,hours:I.hours,hasConflict:t,conflictReason:n}]}),L(null),e({title:`Смена обновлена`,message:`График на ${I.day} сохранен`,type:`success`})},V=S.filter(e=>e.hasConflict).length;return(0,_.jsxs)(`div`,{className:`space-y-4 animate-fade-in`,children:[(0,_.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,_.jsxs)(`div`,{children:[(0,_.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,_.jsx)(`h2`,{className:`text-sm font-bold text-krona-primary`,children:`Сотрудники, графики и табель учета смен`}),(0,_.jsx)(f,{level:`target`,size:`sm`})]}),(0,_.jsx)(`p`,{className:`text-xs text-krona-secondary mt-0.5`,children:`Управление персоналом, планировщик смен, контроль переработок и предупреждения о конфликтах расписания`})]}),(0,_.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,_.jsxs)(`div`,{className:`flex items-center bg-krona-workspace p-1 rounded-lg border border-krona-border text-xs`,children:[(0,_.jsxs)(`button`,{onClick:()=>i(`employees`),className:`px-3 py-1 rounded font-medium transition-colors ${t===`employees`?`bg-[#2F684C] text-white shadow-sm`:`text-krona-secondary`}`,children:[`Сотрудники (`,b.length,`)`]}),(0,_.jsxs)(`button`,{onClick:()=>i(`schedule`),className:`px-3 py-1 rounded font-medium transition-colors flex items-center gap-1.5 ${t===`schedule`?`bg-[#2F684C] text-white shadow-sm`:`text-krona-secondary`}`,children:[`График смен`,V>0&&(0,_.jsx)(`span`,{className:`w-4 h-4 rounded-full bg-rose-500 text-white text-[10px] flex items-center justify-center font-bold`,children:V})]})]}),(0,_.jsxs)(n,{variant:`primary`,size:`sm`,onClick:()=>D(!0),children:[(0,_.jsx)(p,{className:`w-3.5 h-3.5 mr-1`}),`Добавить сотрудника`]})]})]}),t===`employees`&&(0,_.jsxs)(`div`,{className:`space-y-4`,children:[(0,_.jsxs)(`div`,{className:`flex flex-col sm:flex-row sm:items-center justify-between gap-3`,children:[(0,_.jsxs)(`div`,{className:`relative w-72`,children:[(0,_.jsx)(m,{className:`w-3.5 h-3.5 absolute left-2.5 top-2.5 text-krona-secondary`}),(0,_.jsx)(`input`,{type:`text`,value:w,onChange:e=>T(e.target.value),placeholder:`Поиск по имени или должности...`,className:`w-full pl-8 pr-3 py-1.5 text-xs bg-krona-surface border border-krona-border rounded-lg text-krona-primary placeholder:text-krona-secondary focus:outline-none focus:border-krona-green`})]}),(0,_.jsxs)(`div`,{className:`flex items-center gap-2 text-xs text-krona-secondary`,children:[(0,_.jsxs)(r,{variant:`green`,size:`md`,children:[`На смене: `,b.filter(e=>e.status===`on_shift`).length]}),(0,_.jsxs)(r,{variant:`neutral`,size:`md`,children:[`Выходной: `,b.filter(e=>e.status!==`on_shift`).length]})]})]}),(0,_.jsx)(`div`,{className:`grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-3.5`,children:R.map(e=>(0,_.jsxs)(`div`,{className:`p-4 rounded-xl border border-krona-border bg-krona-surface shadow-krona-soft space-y-3 hover:border-krona-border-strong transition-all`,children:[(0,_.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,_.jsxs)(`div`,{className:`flex items-center gap-2.5`,children:[(0,_.jsx)(`div`,{className:`w-10 h-10 rounded-full bg-krona-workspace border border-krona-border flex items-center justify-center font-bold text-sm text-krona-primary`,children:e.avatarInitials}),(0,_.jsxs)(`div`,{children:[(0,_.jsx)(`h4`,{className:`text-xs font-bold text-krona-primary`,children:e.name}),(0,_.jsx)(`span`,{className:`text-[11px] text-krona-secondary`,children:e.role})]})]}),(0,_.jsx)(r,{variant:e.status===`on_shift`?`green`:`neutral`,size:`sm`,children:e.status===`on_shift`?`На смене`:`Выходной`})]}),(0,_.jsxs)(`div`,{className:`grid grid-cols-2 gap-2 text-xs py-1 border-y border-krona-border/50`,children:[(0,_.jsxs)(`div`,{children:[(0,_.jsx)(`span`,{className:`text-krona-secondary block text-[10px]`,children:`График сегодня:`}),(0,_.jsxs)(`span`,{className:`font-semibold text-krona-primary flex items-center gap-1`,children:[(0,_.jsx)(c,{className:`w-3 h-3 text-krona-gold`}),e.shiftHours]})]}),(0,_.jsxs)(`div`,{children:[(0,_.jsx)(`span`,{className:`text-krona-secondary block text-[10px]`,children:`Рейтинг качества:`}),(0,_.jsxs)(`span`,{className:`font-semibold text-krona-primary flex items-center gap-1`,children:[(0,_.jsx)(s,{className:`w-3 h-3 text-krona-gold fill-krona-gold`}),e.rating,` / 5.0`]})]})]}),(0,_.jsxs)(`div`,{className:`flex items-center justify-between text-xs pt-1`,children:[(0,_.jsxs)(`div`,{className:`flex items-center gap-1 text-krona-secondary`,children:[(0,_.jsx)(o,{className:`w-3.5 h-3.5`}),(0,_.jsx)(`span`,{className:`font-mono font-medium text-krona-primary`,children:e.phone})]}),(0,_.jsx)(`button`,{onClick:()=>{x(b.map(t=>t.id===e.id?{...t,status:t.status===`on_shift`?`off_shift`:`on_shift`}:t))},className:`text-xs text-krona-green font-medium hover:underline`,children:e.status===`on_shift`?`Завершить смену`:`Вывести на смену`})]})]},e.id))})]}),t===`schedule`&&(0,_.jsxs)(`div`,{className:`space-y-4`,children:[(0,_.jsxs)(`div`,{className:`flex flex-col sm:flex-row sm:items-center justify-between gap-3 bg-krona-surface p-3 rounded-xl border border-krona-border`,children:[(0,_.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,_.jsx)(l,{className:`w-4 h-4 text-krona-gold`}),(0,_.jsx)(`span`,{className:`font-bold text-xs text-krona-primary`,children:`Недельный график смен (07.09.2026 — 13.09.2026)`}),V>0?(0,_.jsxs)(r,{variant:`danger`,size:`sm`,children:[V,` конфликт расписания!`]}):(0,_.jsx)(r,{variant:`green`,size:`sm`,children:`Конфликтов нет`})]}),(0,_.jsx)(`p`,{className:`text-[11px] text-krona-secondary`,children:`Кликните по ячейке для назначения или изменения времени смены сотрудника`})]}),(0,_.jsx)(`div`,{className:`bg-krona-surface border border-krona-border rounded-xl shadow-krona-soft overflow-hidden`,children:(0,_.jsx)(`div`,{className:`overflow-x-auto`,children:(0,_.jsxs)(`table`,{className:`w-full text-left text-xs border-collapse min-w-[700px]`,children:[(0,_.jsx)(`thead`,{className:`bg-krona-workspace/80 text-krona-secondary border-b border-krona-border`,children:(0,_.jsxs)(`tr`,{children:[(0,_.jsx)(`th`,{className:`p-3 font-semibold w-48`,children:`Сотрудник / Должность`}),v.map(e=>(0,_.jsx)(`th`,{className:`p-3 font-semibold text-center border-l border-krona-border/40`,children:e},e)),(0,_.jsx)(`th`,{className:`p-3 font-semibold text-center border-l border-krona-border/40 w-24`,children:`Часы / нед.`})]})}),(0,_.jsx)(`tbody`,{className:`divide-y divide-krona-border/50`,children:b.map(e=>{let t=S.filter(t=>t.employeeId===e.id),n=t.reduce((e,t)=>e+t.hours,0);return(0,_.jsxs)(`tr`,{className:`hover:bg-krona-workspace/40 transition-colors`,children:[(0,_.jsxs)(`td`,{className:`p-3 font-medium text-krona-primary`,children:[(0,_.jsx)(`div`,{className:`font-semibold`,children:e.name}),(0,_.jsx)(`div`,{className:`text-[11px] text-krona-secondary`,children:e.role})]}),v.map(n=>{let r=t.find(e=>e.day===n);return(0,_.jsx)(`td`,{onClick:()=>{L({empId:e.id,day:n,shiftText:r?r.shiftText:`10:00 - 22:00`,hours:r?r.hours:12})},className:`p-2 border-l border-krona-border/40 text-center cursor-pointer hover:bg-krona-workspace transition-colors`,children:r?(0,_.jsxs)(`div`,{className:`p-1.5 rounded-lg border text-[11px] font-mono leading-tight ${r.hasConflict?`bg-rose-500/15 border-rose-500/50 text-rose-700 dark:text-rose-300 font-bold`:`bg-emerald-500/10 border-emerald-500/30 text-emerald-800 dark:text-emerald-300 font-medium`}`,title:r.conflictReason||`Смена подтверждена`,children:[(0,_.jsx)(`div`,{children:r.shiftText}),(0,_.jsxs)(`div`,{className:`text-[9px] opacity-75`,children:[r.hours,` ч`]}),r.hasConflict&&(0,_.jsxs)(`div`,{className:`flex items-center justify-center gap-0.5 mt-0.5 text-rose-600 font-bold text-[9px]`,children:[(0,_.jsx)(d,{className:`w-2.5 h-2.5`}),` Превышение!`]})]}):(0,_.jsx)(`span`,{className:`text-[11px] text-krona-secondary/60 hover:text-krona-primary`,children:`—`})},n)}),(0,_.jsx)(`td`,{className:`p-3 border-l border-krona-border/40 text-center font-mono font-bold`,children:(0,_.jsxs)(`span`,{className:n>40?`text-amber-600`:`text-krona-primary`,children:[n,` ч`]})})]},e.id)})})]})})})]}),E&&(0,_.jsx)(u,{isOpen:E,onClose:()=>D(!1),title:`Новый сотрудник`,subtitle:`Создание профиля и назначение должности`,maxWidth:`sm`,footer:(0,_.jsxs)(`div`,{className:`flex gap-2 w-full justify-end`,children:[(0,_.jsx)(n,{variant:`secondary`,onClick:()=>D(!1),children:`Отмена`}),(0,_.jsx)(n,{variant:`primary`,onClick:z,children:`Сохранить`})]}),children:(0,_.jsxs)(`div`,{className:`space-y-3 text-xs`,children:[(0,_.jsxs)(`div`,{className:`space-y-1`,children:[(0,_.jsx)(`label`,{className:`font-semibold text-krona-primary`,children:`ФИО сотрудника:`}),(0,_.jsx)(`input`,{type:`text`,value:O,onChange:e=>k(e.target.value),placeholder:`Иванова Екатерина Сергеевна`,className:`w-full p-2 bg-krona-workspace border border-krona-border rounded-lg text-krona-primary focus:outline-none focus:border-krona-green`})]}),(0,_.jsxs)(`div`,{className:`grid grid-cols-2 gap-3`,children:[(0,_.jsxs)(`div`,{className:`space-y-1`,children:[(0,_.jsx)(`label`,{className:`font-semibold text-krona-primary`,children:`Должность:`}),(0,_.jsxs)(`select`,{value:A,onChange:e=>j(e.target.value),className:`w-full p-2 bg-krona-workspace border border-krona-border rounded-lg text-krona-primary focus:outline-none focus:border-krona-green`,children:[(0,_.jsx)(`option`,{value:`Официант`,children:`Официант`}),(0,_.jsx)(`option`,{value:`Су-шеф`,children:`Су-шеф`}),(0,_.jsx)(`option`,{value:`Повар-сушист`,children:`Повар-сушист`}),(0,_.jsx)(`option`,{value:`Курьер`,children:`Курьер`}),(0,_.jsx)(`option`,{value:`Администратор`,children:`Администратор`}),(0,_.jsx)(`option`,{value:`Бармен`,children:`Бармен`})]})]}),(0,_.jsxs)(`div`,{className:`space-y-1`,children:[(0,_.jsx)(`label`,{className:`font-semibold text-krona-primary`,children:`Ставка в час (₽):`}),(0,_.jsx)(`input`,{type:`number`,value:P,onChange:e=>F(Number(e.target.value)),className:`w-full p-2 bg-krona-workspace border border-krona-border rounded-lg text-krona-primary focus:outline-none focus:border-krona-green`})]})]}),(0,_.jsxs)(`div`,{className:`space-y-1`,children:[(0,_.jsx)(`label`,{className:`font-semibold text-krona-primary`,children:`Контактный телефон:`}),(0,_.jsx)(`input`,{type:`text`,value:M,onChange:e=>N(e.target.value),className:`w-full p-2 bg-krona-workspace border border-krona-border rounded-lg text-krona-primary focus:outline-none focus:border-krona-green`})]})]})}),I&&(0,_.jsx)(u,{isOpen:!!I,onClose:()=>L(null),title:`Назначение смены: ${I.day}`,subtitle:`Сотрудник: ${b.find(e=>e.id===I.empId)?.name}`,maxWidth:`sm`,footer:(0,_.jsxs)(`div`,{className:`flex gap-2 w-full justify-between`,children:[(0,_.jsx)(n,{variant:`danger`,size:`sm`,onClick:()=>{L({...I,shiftText:`Выходной`,hours:0}),setTimeout(B,50)},children:`Сделать выходным`}),(0,_.jsxs)(`div`,{className:`flex gap-2`,children:[(0,_.jsx)(n,{variant:`secondary`,onClick:()=>L(null),children:`Отмена`}),(0,_.jsx)(n,{variant:`primary`,onClick:B,children:`Сохранить смену`})]})]}),children:(0,_.jsxs)(`div`,{className:`space-y-3 text-xs`,children:[(0,_.jsxs)(`div`,{className:`space-y-1`,children:[(0,_.jsx)(`label`,{className:`font-semibold text-krona-primary`,children:`Время смены:`}),(0,_.jsxs)(`select`,{value:I.shiftText,onChange:e=>{let t=e.target.value,n=12;t.includes(`09:00 - 23:00`)?n=14:t.includes(`10:00 - 18:00`)?n=8:t===`Выходной`&&(n=0),L({...I,shiftText:t,hours:n})},className:`w-full p-2 bg-krona-workspace border border-krona-border rounded-lg text-krona-primary focus:outline-none focus:border-krona-green`,children:[(0,_.jsx)(`option`,{value:`10:00 - 22:00`,children:`10:00 - 22:00 (12 часов, норма)`}),(0,_.jsx)(`option`,{value:`11:00 - 23:00`,children:`11:00 - 23:00 (12 часов, норма)`}),(0,_.jsx)(`option`,{value:`12:00 - 00:00`,children:`12:00 - 00:00 (12 часов, норма)`}),(0,_.jsx)(`option`,{value:`10:00 - 18:00`,children:`10:00 - 18:00 (8 часов, сокращенная)`}),(0,_.jsx)(`option`,{value:`09:00 - 23:00`,children:`09:00 - 23:00 (14 часов, переработка!)`}),(0,_.jsx)(`option`,{value:`Выходной`,children:`Выходной (0 часов)`})]})]}),I.hours>12&&(0,_.jsxs)(`div`,{className:`p-2.5 bg-rose-500/10 border border-rose-500/30 rounded-lg flex items-center gap-2 text-rose-700 dark:text-rose-300`,children:[(0,_.jsx)(d,{className:`w-4 h-4 shrink-0 text-rose-600`}),(0,_.jsxs)(`span`,{children:[`Внимание: смена длится `,I.hours,` часов. Согласно Трудовому кодексу, стандартная смена не должна превышать 12 часов.`]})]})]})})]})};export{b as EmployeesModule}; \ No newline at end of file +import{f as e,h as t,i as n,r,s as i,t as a}from"./useToast-CS8pZhce.js";import{t as o}from"./phone-DpnQw4if.js";import{t as s}from"./star-B6hvSjuv.js";import{B as c,T as l,Y as u,b as d,r as f,s as p,t as m}from"./index-CrJKtV0u.js";import{a as h}from"./mockData-DAqQG5te.js";var g=t(e(),1),_=i(),v=[`Пн`,`Вт`,`Ср`,`Чт`,`Пт`,`Сб`,`Вс`],y=[{employeeId:`emp-1`,day:`Пн`,shiftText:`10:00 - 22:00`,hours:12},{employeeId:`emp-1`,day:`Вт`,shiftText:`10:00 - 22:00`,hours:12},{employeeId:`emp-1`,day:`Ср`,shiftText:`10:00 - 22:00`,hours:12},{employeeId:`emp-1`,day:`Чт`,shiftText:`10:00 - 22:00`,hours:12},{employeeId:`emp-1`,day:`Пт`,shiftText:`09:00 - 23:00`,hours:14,hasConflict:!0,conflictReason:`Смена превышает 12 ч (ТК РФ)`},{employeeId:`emp-2`,day:`Вт`,shiftText:`11:00 - 23:00`,hours:12},{employeeId:`emp-2`,day:`Ср`,shiftText:`11:00 - 23:00`,hours:12},{employeeId:`emp-2`,day:`Чт`,shiftText:`11:00 - 23:00`,hours:12},{employeeId:`emp-2`,day:`Сб`,shiftText:`11:00 - 23:00`,hours:12},{employeeId:`emp-2`,day:`Вс`,shiftText:`11:00 - 23:00`,hours:12},{employeeId:`emp-3`,day:`Пн`,shiftText:`10:00 - 22:00`,hours:12},{employeeId:`emp-3`,day:`Чт`,shiftText:`10:00 - 22:00`,hours:12},{employeeId:`emp-3`,day:`Пт`,shiftText:`10:00 - 22:00`,hours:12},{employeeId:`emp-3`,day:`Сб`,shiftText:`10:00 - 22:00`,hours:12},{employeeId:`emp-4`,day:`Пн`,shiftText:`12:00 - 00:00`,hours:12},{employeeId:`emp-4`,day:`Вт`,shiftText:`12:00 - 00:00`,hours:12},{employeeId:`emp-4`,day:`Пт`,shiftText:`12:00 - 00:00`,hours:12},{employeeId:`emp-4`,day:`Сб`,shiftText:`12:00 - 00:00`,hours:12}],b=()=>{let{showToast:e}=a(),[t,i]=(0,g.useState)(`employees`),[b,x]=(0,g.useState)(h),[S,C]=(0,g.useState)(y),[w,T]=(0,g.useState)(``),[E,D]=(0,g.useState)(!1),[O,k]=(0,g.useState)(``),[A,j]=(0,g.useState)(`Официант`),[M,N]=(0,g.useState)(`+7 (913) `),[P,F]=(0,g.useState)(250),[I,L]=(0,g.useState)(null),R=b.filter(e=>e.name.toLowerCase().includes(w.toLowerCase())||e.role.toLowerCase().includes(w.toLowerCase())),z=t=>{if(t.preventDefault(),!O.trim())return;let n=O.split(` `).map(e=>e[0]).join(``).slice(0,2).toUpperCase()||`НС`,r={id:`emp-${Date.now()}`,name:O.trim(),role:A,status:`off_shift`,shiftHours:`09:00 - 21:00`,salesToday:0,rating:5,phone:M,avatarInitials:n};x(e=>[r,...e]),D(!1),k(``),e({title:`Сотрудник добавлен`,message:`Карточка «${r.name}» (${r.role}) успешно создана`,type:`success`})},B=()=>{if(!I)return;let t=I.hours>12,n=t?`Смена превышает 12 ч (ТК РФ)`:void 0;C(e=>{let r=e.filter(e=>e.employeeId!==I.empId||e.day!==I.day);return I.shiftText===`Выходной`||I.hours===0?r:[...r,{employeeId:I.empId,day:I.day,shiftText:I.shiftText,hours:I.hours,hasConflict:t,conflictReason:n}]}),L(null),e({title:`Смена обновлена`,message:`График на ${I.day} сохранен`,type:`success`})},V=S.filter(e=>e.hasConflict).length;return(0,_.jsxs)(`div`,{className:`space-y-4 animate-fade-in`,children:[(0,_.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,_.jsxs)(`div`,{children:[(0,_.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,_.jsx)(`h2`,{className:`text-sm font-bold text-krona-primary`,children:`Сотрудники, графики и табель учета смен`}),(0,_.jsx)(m,{level:`target`,size:`sm`})]}),(0,_.jsx)(`p`,{className:`text-xs text-krona-secondary mt-0.5`,children:`Управление персоналом, планировщик смен, контроль переработок и предупреждения о конфликтах расписания`})]}),(0,_.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,_.jsxs)(`div`,{className:`flex items-center bg-krona-workspace p-1 rounded-lg border border-krona-border text-xs`,children:[(0,_.jsxs)(`button`,{onClick:()=>i(`employees`),className:`px-3 py-1 rounded font-medium transition-colors ${t===`employees`?`bg-[#2F684C] text-white shadow-sm`:`text-krona-secondary`}`,children:[`Сотрудники (`,b.length,`)`]}),(0,_.jsxs)(`button`,{onClick:()=>i(`schedule`),className:`px-3 py-1 rounded font-medium transition-colors flex items-center gap-1.5 ${t===`schedule`?`bg-[#2F684C] text-white shadow-sm`:`text-krona-secondary`}`,children:[`График смен`,V>0&&(0,_.jsx)(`span`,{className:`w-4 h-4 rounded-full bg-rose-500 text-white text-[10px] flex items-center justify-center font-bold`,children:V})]})]}),(0,_.jsxs)(n,{variant:`primary`,size:`sm`,onClick:()=>D(!0),children:[(0,_.jsx)(l,{className:`w-3.5 h-3.5 mr-1`}),`Добавить сотрудника`]})]})]}),t===`employees`&&(0,_.jsxs)(`div`,{className:`space-y-4`,children:[(0,_.jsxs)(`div`,{className:`flex flex-col sm:flex-row sm:items-center justify-between gap-3`,children:[(0,_.jsxs)(`div`,{className:`relative w-72`,children:[(0,_.jsx)(d,{className:`w-3.5 h-3.5 absolute left-2.5 top-2.5 text-krona-secondary`}),(0,_.jsx)(`input`,{type:`text`,value:w,onChange:e=>T(e.target.value),placeholder:`Поиск по имени или должности...`,className:`w-full pl-8 pr-3 py-1.5 text-xs bg-krona-surface border border-krona-border rounded-lg text-krona-primary placeholder:text-krona-secondary focus:outline-none focus:border-krona-green`})]}),(0,_.jsxs)(`div`,{className:`flex items-center gap-2 text-xs text-krona-secondary`,children:[(0,_.jsxs)(r,{variant:`green`,size:`md`,children:[`На смене: `,b.filter(e=>e.status===`on_shift`).length]}),(0,_.jsxs)(r,{variant:`neutral`,size:`md`,children:[`Выходной: `,b.filter(e=>e.status!==`on_shift`).length]})]})]}),(0,_.jsx)(`div`,{className:`grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-3.5`,children:R.map(e=>(0,_.jsxs)(`div`,{className:`p-4 rounded-xl border border-krona-border bg-krona-surface shadow-krona-soft space-y-3 hover:border-krona-border-strong transition-all`,children:[(0,_.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,_.jsxs)(`div`,{className:`flex items-center gap-2.5`,children:[(0,_.jsx)(`div`,{className:`w-10 h-10 rounded-full bg-krona-workspace border border-krona-border flex items-center justify-center font-bold text-sm text-krona-primary`,children:e.avatarInitials}),(0,_.jsxs)(`div`,{children:[(0,_.jsx)(`h4`,{className:`text-xs font-bold text-krona-primary`,children:e.name}),(0,_.jsx)(`span`,{className:`text-[11px] text-krona-secondary`,children:e.role})]})]}),(0,_.jsx)(r,{variant:e.status===`on_shift`?`green`:`neutral`,size:`sm`,children:e.status===`on_shift`?`На смене`:`Выходной`})]}),(0,_.jsxs)(`div`,{className:`grid grid-cols-2 gap-2 text-xs py-1 border-y border-krona-border/50`,children:[(0,_.jsxs)(`div`,{children:[(0,_.jsx)(`span`,{className:`text-krona-secondary block text-[10px]`,children:`График сегодня:`}),(0,_.jsxs)(`span`,{className:`font-semibold text-krona-primary flex items-center gap-1`,children:[(0,_.jsx)(c,{className:`w-3 h-3 text-krona-gold`}),e.shiftHours]})]}),(0,_.jsxs)(`div`,{children:[(0,_.jsx)(`span`,{className:`text-krona-secondary block text-[10px]`,children:`Рейтинг качества:`}),(0,_.jsxs)(`span`,{className:`font-semibold text-krona-primary flex items-center gap-1`,children:[(0,_.jsx)(s,{className:`w-3 h-3 text-krona-gold fill-krona-gold`}),e.rating,` / 5.0`]})]})]}),(0,_.jsxs)(`div`,{className:`flex items-center justify-between text-xs pt-1`,children:[(0,_.jsxs)(`div`,{className:`flex items-center gap-1 text-krona-secondary`,children:[(0,_.jsx)(o,{className:`w-3.5 h-3.5`}),(0,_.jsx)(`span`,{className:`font-mono font-medium text-krona-primary`,children:e.phone})]}),(0,_.jsx)(`button`,{onClick:()=>{x(b.map(t=>t.id===e.id?{...t,status:t.status===`on_shift`?`off_shift`:`on_shift`}:t))},className:`text-xs text-krona-green font-medium hover:underline`,children:e.status===`on_shift`?`Завершить смену`:`Вывести на смену`})]})]},e.id))})]}),t===`schedule`&&(0,_.jsxs)(`div`,{className:`space-y-4`,children:[(0,_.jsxs)(`div`,{className:`flex flex-col sm:flex-row sm:items-center justify-between gap-3 bg-krona-surface p-3 rounded-xl border border-krona-border`,children:[(0,_.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,_.jsx)(u,{className:`w-4 h-4 text-krona-gold`}),(0,_.jsx)(`span`,{className:`font-bold text-xs text-krona-primary`,children:`Недельный график смен (07.09.2026 — 13.09.2026)`}),V>0?(0,_.jsxs)(r,{variant:`danger`,size:`sm`,children:[V,` конфликт расписания!`]}):(0,_.jsx)(r,{variant:`green`,size:`sm`,children:`Конфликтов нет`})]}),(0,_.jsx)(`p`,{className:`text-[11px] text-krona-secondary`,children:`Кликните по ячейке для назначения или изменения времени смены сотрудника`})]}),(0,_.jsx)(`div`,{className:`bg-krona-surface border border-krona-border rounded-xl shadow-krona-soft overflow-hidden`,children:(0,_.jsx)(`div`,{className:`overflow-x-auto`,children:(0,_.jsxs)(`table`,{className:`w-full text-left text-xs border-collapse min-w-[700px]`,children:[(0,_.jsx)(`thead`,{className:`bg-krona-workspace/80 text-krona-secondary border-b border-krona-border`,children:(0,_.jsxs)(`tr`,{children:[(0,_.jsx)(`th`,{className:`p-3 font-semibold w-48`,children:`Сотрудник / Должность`}),v.map(e=>(0,_.jsx)(`th`,{className:`p-3 font-semibold text-center border-l border-krona-border/40`,children:e},e)),(0,_.jsx)(`th`,{className:`p-3 font-semibold text-center border-l border-krona-border/40 w-24`,children:`Часы / нед.`})]})}),(0,_.jsx)(`tbody`,{className:`divide-y divide-krona-border/50`,children:b.map(e=>{let t=S.filter(t=>t.employeeId===e.id),n=t.reduce((e,t)=>e+t.hours,0);return(0,_.jsxs)(`tr`,{className:`hover:bg-krona-workspace/40 transition-colors`,children:[(0,_.jsxs)(`td`,{className:`p-3 font-medium text-krona-primary`,children:[(0,_.jsx)(`div`,{className:`font-semibold`,children:e.name}),(0,_.jsx)(`div`,{className:`text-[11px] text-krona-secondary`,children:e.role})]}),v.map(n=>{let r=t.find(e=>e.day===n);return(0,_.jsx)(`td`,{onClick:()=>{L({empId:e.id,day:n,shiftText:r?r.shiftText:`10:00 - 22:00`,hours:r?r.hours:12})},className:`p-2 border-l border-krona-border/40 text-center cursor-pointer hover:bg-krona-workspace transition-colors`,children:r?(0,_.jsxs)(`div`,{className:`p-1.5 rounded-lg border text-[11px] font-mono leading-tight ${r.hasConflict?`bg-rose-500/15 border-rose-500/50 text-rose-700 dark:text-rose-300 font-bold`:`bg-emerald-500/10 border-emerald-500/30 text-emerald-800 dark:text-emerald-300 font-medium`}`,title:r.conflictReason||`Смена подтверждена`,children:[(0,_.jsx)(`div`,{children:r.shiftText}),(0,_.jsxs)(`div`,{className:`text-[9px] opacity-75`,children:[r.hours,` ч`]}),r.hasConflict&&(0,_.jsxs)(`div`,{className:`flex items-center justify-center gap-0.5 mt-0.5 text-rose-600 font-bold text-[9px]`,children:[(0,_.jsx)(p,{className:`w-2.5 h-2.5`}),` Превышение!`]})]}):(0,_.jsx)(`span`,{className:`text-[11px] text-krona-secondary/60 hover:text-krona-primary`,children:`—`})},n)}),(0,_.jsx)(`td`,{className:`p-3 border-l border-krona-border/40 text-center font-mono font-bold`,children:(0,_.jsxs)(`span`,{className:n>40?`text-amber-600`:`text-krona-primary`,children:[n,` ч`]})})]},e.id)})})]})})})]}),E&&(0,_.jsx)(f,{isOpen:E,onClose:()=>D(!1),title:`Новый сотрудник`,subtitle:`Создание профиля и назначение должности`,maxWidth:`sm`,footer:(0,_.jsxs)(`div`,{className:`flex gap-2 w-full justify-end`,children:[(0,_.jsx)(n,{variant:`secondary`,onClick:()=>D(!1),children:`Отмена`}),(0,_.jsx)(n,{variant:`primary`,onClick:z,children:`Сохранить`})]}),children:(0,_.jsxs)(`div`,{className:`space-y-3 text-xs`,children:[(0,_.jsxs)(`div`,{className:`space-y-1`,children:[(0,_.jsx)(`label`,{className:`font-semibold text-krona-primary`,children:`ФИО сотрудника:`}),(0,_.jsx)(`input`,{type:`text`,value:O,onChange:e=>k(e.target.value),placeholder:`Иванова Екатерина Сергеевна`,className:`w-full p-2 bg-krona-workspace border border-krona-border rounded-lg text-krona-primary focus:outline-none focus:border-krona-green`})]}),(0,_.jsxs)(`div`,{className:`grid grid-cols-2 gap-3`,children:[(0,_.jsxs)(`div`,{className:`space-y-1`,children:[(0,_.jsx)(`label`,{className:`font-semibold text-krona-primary`,children:`Должность:`}),(0,_.jsxs)(`select`,{value:A,onChange:e=>j(e.target.value),className:`w-full p-2 bg-krona-workspace border border-krona-border rounded-lg text-krona-primary focus:outline-none focus:border-krona-green`,children:[(0,_.jsx)(`option`,{value:`Официант`,children:`Официант`}),(0,_.jsx)(`option`,{value:`Су-шеф`,children:`Су-шеф`}),(0,_.jsx)(`option`,{value:`Повар-сушист`,children:`Повар-сушист`}),(0,_.jsx)(`option`,{value:`Курьер`,children:`Курьер`}),(0,_.jsx)(`option`,{value:`Администратор`,children:`Администратор`}),(0,_.jsx)(`option`,{value:`Бармен`,children:`Бармен`})]})]}),(0,_.jsxs)(`div`,{className:`space-y-1`,children:[(0,_.jsx)(`label`,{className:`font-semibold text-krona-primary`,children:`Ставка в час (₽):`}),(0,_.jsx)(`input`,{type:`number`,value:P,onChange:e=>F(Number(e.target.value)),className:`w-full p-2 bg-krona-workspace border border-krona-border rounded-lg text-krona-primary focus:outline-none focus:border-krona-green`})]})]}),(0,_.jsxs)(`div`,{className:`space-y-1`,children:[(0,_.jsx)(`label`,{className:`font-semibold text-krona-primary`,children:`Контактный телефон:`}),(0,_.jsx)(`input`,{type:`text`,value:M,onChange:e=>N(e.target.value),className:`w-full p-2 bg-krona-workspace border border-krona-border rounded-lg text-krona-primary focus:outline-none focus:border-krona-green`})]})]})}),I&&(0,_.jsx)(f,{isOpen:!!I,onClose:()=>L(null),title:`Назначение смены: ${I.day}`,subtitle:`Сотрудник: ${b.find(e=>e.id===I.empId)?.name}`,maxWidth:`sm`,footer:(0,_.jsxs)(`div`,{className:`flex gap-2 w-full justify-between`,children:[(0,_.jsx)(n,{variant:`danger`,size:`sm`,onClick:()=>{L({...I,shiftText:`Выходной`,hours:0}),setTimeout(B,50)},children:`Сделать выходным`}),(0,_.jsxs)(`div`,{className:`flex gap-2`,children:[(0,_.jsx)(n,{variant:`secondary`,onClick:()=>L(null),children:`Отмена`}),(0,_.jsx)(n,{variant:`primary`,onClick:B,children:`Сохранить смену`})]})]}),children:(0,_.jsxs)(`div`,{className:`space-y-3 text-xs`,children:[(0,_.jsxs)(`div`,{className:`space-y-1`,children:[(0,_.jsx)(`label`,{className:`font-semibold text-krona-primary`,children:`Время смены:`}),(0,_.jsxs)(`select`,{value:I.shiftText,onChange:e=>{let t=e.target.value,n=12;t.includes(`09:00 - 23:00`)?n=14:t.includes(`10:00 - 18:00`)?n=8:t===`Выходной`&&(n=0),L({...I,shiftText:t,hours:n})},className:`w-full p-2 bg-krona-workspace border border-krona-border rounded-lg text-krona-primary focus:outline-none focus:border-krona-green`,children:[(0,_.jsx)(`option`,{value:`10:00 - 22:00`,children:`10:00 - 22:00 (12 часов, норма)`}),(0,_.jsx)(`option`,{value:`11:00 - 23:00`,children:`11:00 - 23:00 (12 часов, норма)`}),(0,_.jsx)(`option`,{value:`12:00 - 00:00`,children:`12:00 - 00:00 (12 часов, норма)`}),(0,_.jsx)(`option`,{value:`10:00 - 18:00`,children:`10:00 - 18:00 (8 часов, сокращенная)`}),(0,_.jsx)(`option`,{value:`09:00 - 23:00`,children:`09:00 - 23:00 (14 часов, переработка!)`}),(0,_.jsx)(`option`,{value:`Выходной`,children:`Выходной (0 часов)`})]})]}),I.hours>12&&(0,_.jsxs)(`div`,{className:`p-2.5 bg-rose-500/10 border border-rose-500/30 rounded-lg flex items-center gap-2 text-rose-700 dark:text-rose-300`,children:[(0,_.jsx)(p,{className:`w-4 h-4 shrink-0 text-rose-600`}),(0,_.jsxs)(`span`,{children:[`Внимание: смена длится `,I.hours,` часов. Согласно Трудовому кодексу, стандартная смена не должна превышать 12 часов.`]})]})]})})]})};export{b as EmployeesModule}; \ No newline at end of file diff --git a/dist/assets/EntityCatalog-_fN1VjC6.js b/dist/assets/EntityCatalog-CAg8Pzny.js similarity index 91% rename from dist/assets/EntityCatalog-_fN1VjC6.js rename to dist/assets/EntityCatalog-CAg8Pzny.js index 9440ab5..6aa54c5 100644 --- a/dist/assets/EntityCatalog-_fN1VjC6.js +++ b/dist/assets/EntityCatalog-CAg8Pzny.js @@ -1 +1 @@ -import{f as e,h as t,i as n,r,s as i,t as a}from"./useToast-CS8pZhce.js";import{t as o}from"./panels-top-left-BomsDlf9.js";import{t as s}from"./table-_fqSCPRE.js";import{A as c,L as l,a as u,et as d,ft as f,h as p,j as m,p as h,r as g,s as _,t as v,u as y,w as b,y as x}from"./index-CNnq9VO5.js";var S=t(e(),1),C=i(),w=()=>{let e=f(),{entities:t,loading:i,createEntity:w,deleteEntity:T}=d(),{showToast:E}=a(),[D,O]=(0,S.useState)(``),[k,A]=(0,S.useState)(`all`),[j,M]=(0,S.useState)(!1),[N,P]=(0,S.useState)(!1),[F,I]=(0,S.useState)({name:``,pluralName:``,code:``,description:``,category:`custom`,primaryFieldKey:`name`,autonumberingEnabled:!1,autonumberFormat:`DOC-{YYYY}-{0000}`}),[L,R]=(0,S.useState)(null),z=(0,S.useMemo)(()=>t.filter(e=>{let t=e.name.toLowerCase().includes(D.toLowerCase())||e.code.toLowerCase().includes(D.toLowerCase())||e.description&&e.description.toLowerCase().includes(D.toLowerCase()),n=k===`all`||k===`system`&&e.isSystem||k===`custom`&&!e.isSystem||e.category===k;return t&&n}),[t,D,k]),B=(0,S.useMemo)(()=>{let e=t.length,n=t.filter(e=>e.isSystem).length;return{total:e,system:n,custom:e-n,totalFields:t.reduce((e,t)=>e+(t.fields?.length||0),0)}},[t]),V=e=>{let t={а:`a`,б:`b`,в:`v`,г:`g`,д:`d`,е:`e`,ё:`yo`,ж:`zh`,з:`z`,и:`i`,й:`y`,к:`k`,л:`l`,м:`m`,н:`n`,о:`o`,п:`p`,р:`r`,с:`s`,т:`t`,у:`u`,ф:`f`,х:`kh`,ц:`ts`,ч:`ch`,ш:`sh`,щ:`shch`,ъ:``,ы:`y`,ь:``,э:`e`,ю:`yu`,я:`ya`};return e.toLowerCase().split(``).map(e=>t[e]||e).join(``).replace(/[^a-z0-9_]/g,`_`).replace(/_{2,}/g,`_`).replace(/^_|_$/g,``)},H=e=>{let t=V(e);I(n=>({...n,name:e,pluralName:n.pluralName||`${e}ы`,code:N?n.code:t}))};return(0,C.jsxs)(`div`,{className:`space-y-5 animate-fade-in`,children:[(0,C.jsxs)(`div`,{className:`flex flex-col sm:flex-row sm:items-center justify-between gap-4 p-5 bg-krona-surface border border-krona-border rounded-xl shadow-krona-soft`,children:[(0,C.jsxs)(`div`,{children:[(0,C.jsxs)(`div`,{className:`flex items-center gap-2 mb-1`,children:[(0,C.jsx)(m,{className:`w-5 h-5 text-krona-green`}),(0,C.jsx)(`h1`,{className:`text-base font-bold text-krona-primary`,children:`Configuration Engine: Каталог сущностей`}),(0,C.jsx)(v,{level:`pilot1`,size:`sm`})]}),(0,C.jsx)(`p`,{className:`text-xs text-krona-secondary max-w-2xl`,children:`Центральный конструктор моделей данных: создание системных и пользовательских сущностей, настройка 39+ типов полей, визуальный drag-and-drop редактор форм, карточек и сохранённых представлений.`})]}),(0,C.jsxs)(n,{variant:`primary`,size:`md`,"data-testid":`create-entity-btn`,onClick:()=>M(!0),className:`shrink-0`,children:[(0,C.jsx)(b,{className:`w-4 h-4 mr-1.5`}),`Создать сущность`]})]}),(0,C.jsxs)(`div`,{className:`grid grid-cols-2 md:grid-cols-4 gap-3`,children:[(0,C.jsxs)(`div`,{className:`p-3.5 bg-krona-surface border border-krona-border rounded-xl`,children:[(0,C.jsx)(`span`,{className:`text-xs text-krona-secondary`,children:`Всего сущностей`}),(0,C.jsx)(`p`,{className:`text-xl font-bold text-krona-primary mt-1`,children:B.total})]}),(0,C.jsxs)(`div`,{className:`p-3.5 bg-krona-surface border border-krona-border rounded-xl`,children:[(0,C.jsx)(`span`,{className:`text-xs text-krona-secondary`,children:`Системных сущностей`}),(0,C.jsx)(`p`,{className:`text-xl font-bold text-krona-green mt-1`,children:B.system})]}),(0,C.jsxs)(`div`,{className:`p-3.5 bg-krona-surface border border-krona-border rounded-xl`,children:[(0,C.jsx)(`span`,{className:`text-xs text-krona-secondary`,children:`Пользовательских (Custom)`}),(0,C.jsx)(`p`,{className:`text-xl font-bold text-krona-gold mt-1`,children:B.custom})]}),(0,C.jsxs)(`div`,{className:`p-3.5 bg-krona-surface border border-krona-border rounded-xl`,children:[(0,C.jsx)(`span`,{className:`text-xs text-krona-secondary`,children:`Активных полей`}),(0,C.jsx)(`p`,{className:`text-xl font-bold text-krona-primary mt-1`,children:B.totalFields})]})]}),(0,C.jsxs)(`div`,{className:`flex flex-col sm:flex-row sm:items-center justify-between gap-3 p-3.5 bg-krona-surface border border-krona-border rounded-xl`,children:[(0,C.jsx)(`div`,{className:`relative w-full sm:w-80`,children:(0,C.jsx)(u,{value:D,onChange:e=>O(e.target.value),placeholder:`Поиск по названию или коду...`,icon:(0,C.jsx)(x,{className:`w-4 h-4`})})}),(0,C.jsx)(`div`,{className:`flex flex-wrap gap-1.5`,children:[{id:`all`,label:`Все сущности`},{id:`system`,label:`Системные`},{id:`custom`,label:`Пользовательские`},{id:`crm`,label:`CRM`},{id:`commerce`,label:`Коммерция`},{id:`inventory`,label:`Склад`},{id:`finance`,label:`Финансы`}].map(e=>(0,C.jsx)(`button`,{onClick:()=>A(e.id),className:`px-3 py-1.5 rounded-lg text-xs font-medium transition-colors cursor-pointer ${k===e.id?`bg-krona-green text-white shadow-sm`:`bg-krona-surface-muted text-krona-secondary hover:text-krona-primary`}`,children:e.label},e.id))})]}),(0,C.jsx)(`div`,{className:`grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4`,children:z.map(t=>{let i=t.fields?.length||0;return(0,C.jsxs)(`div`,{className:`bg-krona-surface border border-krona-border rounded-xl p-4 shadow-krona-soft hover:border-krona-border-strong transition-all flex flex-col justify-between group`,children:[(0,C.jsxs)(`div`,{children:[(0,C.jsxs)(`div`,{className:`flex items-start justify-between gap-2 mb-2`,children:[(0,C.jsxs)(`div`,{className:`flex items-center gap-2.5`,children:[(0,C.jsx)(`div`,{className:`w-8 h-8 rounded-lg bg-krona-workspace flex items-center justify-center text-krona-primary border border-krona-border/60`,children:(0,C.jsx)(m,{className:`w-4 h-4 text-krona-green`})}),(0,C.jsxs)(`div`,{children:[(0,C.jsx)(`h3`,{className:`text-sm font-semibold text-krona-primary leading-tight`,children:t.name}),(0,C.jsx)(`p`,{className:`text-[11px] font-mono text-krona-secondary`,children:t.code})]})]}),(0,C.jsx)(`div`,{className:`flex items-center gap-1.5`,children:t.isSystem?(0,C.jsxs)(r,{variant:`neutral`,size:`sm`,children:[(0,C.jsx)(c,{className:`w-2.5 h-2.5 mr-1`}),`System`]}):(0,C.jsxs)(r,{variant:`gold`,size:`sm`,children:[(0,C.jsx)(h,{className:`w-2.5 h-2.5 mr-1`}),`Custom`]})})]}),(0,C.jsx)(`p`,{className:`text-xs text-krona-secondary line-clamp-2 min-h-[32px] mb-3`,children:t.description||`Пользовательская сущность бизнес-платформы Krona`}),(0,C.jsxs)(`div`,{className:`flex items-center gap-2 py-2 border-t border-b border-krona-border/60 text-xs text-krona-secondary mb-3`,children:[(0,C.jsxs)(`span`,{children:[`Полей: `,(0,C.jsx)(`strong`,{className:`text-krona-primary font-semibold`,children:i})]}),(0,C.jsx)(`span`,{children:`•`}),(0,C.jsxs)(`span`,{children:[`Категория: `,(0,C.jsx)(`strong`,{className:`text-krona-primary font-semibold capitalize`,children:t.category})]})]})]}),(0,C.jsxs)(`div`,{className:`space-y-2`,children:[(0,C.jsxs)(`div`,{className:`grid grid-cols-5 gap-1`,children:[(0,C.jsxs)(n,{variant:`primary`,size:`sm`,className:`text-[11px] px-1 py-1.5`,"data-testid":`open-entity-${t.code}-btn`,onClick:()=>e(`/entities/${t.code}`),title:`Перейти к записям сущности`,children:[(0,C.jsx)(m,{className:`w-3 h-3 mr-0.5`}),`Записи`]}),(0,C.jsxs)(n,{variant:`outline`,size:`sm`,className:`text-[11px] px-1 py-1.5`,onClick:()=>e(`/settings/entities/${t.code}/fields`),title:`Конструктор полей`,children:[(0,C.jsx)(p,{className:`w-3 h-3 mr-1 text-krona-green`}),`Поля`]}),(0,C.jsxs)(n,{variant:`outline`,size:`sm`,className:`text-[11px] px-1 py-1.5`,onClick:()=>e(`/settings/entities/${t.code}/forms`),title:`Конструктор форм`,children:[(0,C.jsx)(o,{className:`w-3 h-3 mr-1 text-krona-gold`}),`Формы`]}),(0,C.jsxs)(n,{variant:`outline`,size:`sm`,className:`text-[11px] px-1 py-1.5`,onClick:()=>e(`/settings/entities/${t.code}/card`),title:`Конструктор карточки`,children:[(0,C.jsx)(l,{className:`w-3 h-3 mr-1 text-krona-info`}),`Карточка`]}),(0,C.jsxs)(n,{variant:`outline`,size:`sm`,className:`text-[11px] px-1 py-1.5`,onClick:()=>e(`/settings/entities/${t.code}/views`),title:`Конструктор списков и представлений`,children:[(0,C.jsx)(s,{className:`w-3 h-3 mr-1 text-krona-primary`}),`Списки`]})]}),!t.isSystem&&(0,C.jsx)(`div`,{className:`flex justify-end pt-1`,children:(0,C.jsxs)(`button`,{type:`button`,onClick:()=>R(t),className:`text-[11px] text-krona-danger hover:text-krona-danger/80 flex items-center gap-1 font-medium cursor-pointer`,children:[(0,C.jsx)(y,{className:`w-3 h-3`}),`Удалить сущность`]})})]})]},t.code)})}),z.length===0&&!i&&(0,C.jsxs)(`div`,{className:`text-center py-12 p-6 bg-krona-surface border border-dashed border-krona-border rounded-xl`,children:[(0,C.jsx)(m,{className:`w-8 h-8 text-krona-secondary mx-auto mb-2 opacity-50`}),(0,C.jsx)(`h3`,{className:`text-sm font-semibold text-krona-primary mb-1`,children:`Сущности не найдены`}),(0,C.jsxs)(`p`,{className:`text-xs text-krona-secondary mb-4`,children:[`По вашему запросу «`,D,`» ничего не найдено.`]}),(0,C.jsx)(n,{variant:`secondary`,size:`sm`,onClick:()=>O(``),children:`Сбросить фильтр`})]}),(0,C.jsx)(g,{isOpen:j,onClose:()=>M(!1),title:`Создание новой сущности`,subtitle:`Задайте базовые параметры и системный API-идентификатор`,maxWidth:`lg`,closeOnBackdropClick:!1,children:(0,C.jsxs)(`form`,{onSubmit:async e=>{if(e.preventDefault(),!F.name||!F.code){E({type:`error`,title:`Заполните обязательные поля: название и код`});return}let n=F.code.trim().toLowerCase();if(t.some(e=>e.code===n)){E({type:`error`,title:`Сущность с таким системным кодом уже существует`});return}try{let e=[{id:`f_${n}_name`,key:F.primaryFieldKey||`name`,label:`Наименование`,type:`text`,required:!0,system:!0,searchable:!0,sortable:!0},{id:`f_${n}_status`,key:`status`,label:`Статус`,type:`status`,required:!1,system:!0,options:[{label:`Новый`,value:`new`,color:`neutral`},{label:`В работе`,value:`in_progress`,color:`warning`},{label:`Завершён`,value:`completed`,color:`green`}]}];await w({code:n,name:F.name.trim(),pluralName:F.pluralName.trim()||`${F.name}ы`,description:F.description.trim(),category:F.category,isSystem:!1,maturity:`target_prototype`,primaryFieldKey:F.primaryFieldKey||`name`,autonumberingEnabled:F.autonumberingEnabled,autonumberFormat:F.autonumberFormat,fields:e,defaultView:`table`}),E({type:`success`,title:`Сущность «${F.name}» создана`,message:`Теперь вы можете добавить пользовательские поля, настроить формы и списки.`}),M(!1),P(!1),I({name:``,pluralName:``,code:``,description:``,category:`custom`,primaryFieldKey:`name`,autonumberingEnabled:!1,autonumberFormat:`DOC-{YYYY}-{0000}`})}catch(e){E({type:`error`,title:`Ошибка создания сущности`,message:e instanceof Error?e.message:String(e)})}},className:`space-y-4`,children:[(0,C.jsxs)(`div`,{className:`grid grid-cols-1 sm:grid-cols-2 gap-3`,children:[(0,C.jsx)(u,{label:`Наименование (ед. число) *`,placeholder:`Например: Договор`,"data-testid":`new-entity-name-input`,value:F.name,onChange:e=>H(e.target.value),required:!0}),(0,C.jsx)(u,{label:`Наименование (мн. число) *`,placeholder:`Например: Договоры`,"data-testid":`new-entity-plural-input`,value:F.pluralName,onChange:e=>I(t=>({...t,pluralName:e.target.value})),required:!0})]}),(0,C.jsxs)(`div`,{className:`grid grid-cols-1 sm:grid-cols-2 gap-3`,children:[(0,C.jsx)(u,{label:`Системный код (API Name) *`,placeholder:`contract`,"data-testid":`new-entity-code-input`,value:F.code,onChange:e=>{P(!0),I(t=>({...t,code:e.target.value.toLowerCase().replace(/[^a-z0-9_]/g,``)}))},helperText:`Используется в URL, API и индексах (только a-z, 0-9, _)`,required:!0}),(0,C.jsxs)(`div`,{className:`flex flex-col gap-1.5 text-left`,children:[(0,C.jsx)(`label`,{className:`text-xs font-medium text-krona-secondary select-none`,children:`Категория`}),(0,C.jsxs)(`select`,{className:`w-full bg-krona-surface text-krona-primary border border-krona-border rounded-md px-3 py-2 text-sm focus:outline-none focus:border-krona-green`,value:F.category,onChange:e=>I(t=>({...t,category:e.target.value})),children:[(0,C.jsx)(`option`,{value:`custom`,children:`Пользовательская (Custom)`}),(0,C.jsx)(`option`,{value:`crm`,children:`CRM & Продажи`}),(0,C.jsx)(`option`,{value:`commerce`,children:`Коммерция`}),(0,C.jsx)(`option`,{value:`inventory`,children:`Склад & Запасы`}),(0,C.jsx)(`option`,{value:`finance`,children:`Финансы`}),(0,C.jsx)(`option`,{value:`operations`,children:`Операции`})]})]})]}),(0,C.jsx)(u,{label:`Описание назначения сущности`,placeholder:`Для каких бизнес-процессов предназначена сущность...`,value:F.description,onChange:e=>I(t=>({...t,description:e.target.value}))}),(0,C.jsxs)(`div`,{className:`p-3.5 bg-krona-workspace rounded-lg border border-krona-border/60 space-y-3`,children:[(0,C.jsxs)(`label`,{className:`flex items-center gap-2 cursor-pointer text-xs font-semibold text-krona-primary`,children:[(0,C.jsx)(`input`,{type:`checkbox`,checked:F.autonumberingEnabled,onChange:e=>I(t=>({...t,autonumberingEnabled:e.target.checked})),className:`rounded text-krona-green`}),`Включить автоматическую нумерацию записей`]}),F.autonumberingEnabled&&(0,C.jsx)(u,{label:`Шаблон нумератора`,value:F.autonumberFormat,onChange:e=>I(t=>({...t,autonumberFormat:e.target.value})),helperText:`Теги: {YYYY} - год, {MM} - месяц, {0000} - порядковый номер`})]}),(0,C.jsxs)(`div`,{className:`flex justify-end gap-2.5 pt-3 border-t border-krona-border/60`,children:[(0,C.jsx)(n,{variant:`outline`,size:`md`,type:`button`,onClick:()=>M(!1),children:`Отмена`}),(0,C.jsx)(n,{variant:`primary`,size:`md`,type:`submit`,"data-testid":`submit-create-entity-btn`,children:`Создать и перейти к полям`})]})]})}),(0,C.jsx)(g,{isOpen:!!L,onClose:()=>R(null),title:`Подтверждение удаления сущности`,subtitle:`Вы собираетесь удалить пользовательскую сущность «${L?.name}»`,maxWidth:`md`,children:(0,C.jsxs)(`div`,{className:`space-y-4`,children:[(0,C.jsxs)(`div`,{className:`p-4 bg-krona-danger/10 border border-krona-danger/30 rounded-lg text-xs text-krona-danger flex items-start gap-3`,children:[(0,C.jsx)(_,{className:`w-5 h-5 shrink-0 mt-0.5`}),(0,C.jsxs)(`div`,{children:[(0,C.jsx)(`p`,{className:`font-semibold mb-1`,children:`Внимание! Проверка зависимостей (Dependency Impact)`}),(0,C.jsxs)(`p`,{children:[`Будут удалены все связанные определения полей (`,L?.fields?.length||0,` шт.), сохраненные формы, представления списков и записи из базы данных.`]})]})]}),(0,C.jsxs)(`div`,{className:`p-3 bg-krona-workspace rounded-lg text-xs text-krona-secondary space-y-1`,children:[(0,C.jsxs)(`p`,{children:[`Код сущности: `,(0,C.jsx)(`code`,{className:`font-mono text-krona-primary`,children:L?.code})]}),(0,C.jsxs)(`p`,{children:[`Категория: `,(0,C.jsx)(`span`,{className:`text-krona-primary`,children:L?.category})]})]}),(0,C.jsxs)(`div`,{className:`flex justify-end gap-2.5 pt-3 border-t border-krona-border/60`,children:[(0,C.jsx)(n,{variant:`outline`,size:`md`,onClick:()=>R(null),children:`Отмена`}),(0,C.jsx)(n,{variant:`danger`,size:`md`,onClick:async()=>{if(L){if(L.isSystem){E({type:`error`,title:`Нельзя удалить системную сущность платформы`});return}try{await T(L.code),E({type:`success`,title:`Сущность «${L.name}» удалена`}),R(null)}catch(e){E({type:`error`,title:`Ошибка удаления сущности`,message:e instanceof Error?e.message:String(e)})}}},children:`Да, удалить сущность`})]})]})})]})};export{w as EntityCatalog,w as default}; \ No newline at end of file +import{f as e,h as t,i as n,r,s as i,t as a}from"./useToast-CS8pZhce.js";import{t as o}from"./panels-top-left-BomsDlf9.js";import{t as s}from"./table-_fqSCPRE.js";import{M as c,R as l,T as u,a as d,b as f,g as p,j as m,m as h,mt as g,nt as _,r as v,s as y,t as b,u as x}from"./index-CrJKtV0u.js";var S=t(e(),1),C=i(),w=()=>{let e=g(),{entities:t,loading:i,createEntity:w,deleteEntity:T}=_(),{showToast:E}=a(),[D,O]=(0,S.useState)(``),[k,A]=(0,S.useState)(`all`),[j,M]=(0,S.useState)(!1),[N,P]=(0,S.useState)(!1),[F,I]=(0,S.useState)({name:``,pluralName:``,code:``,description:``,category:`custom`,primaryFieldKey:`name`,autonumberingEnabled:!1,autonumberFormat:`DOC-{YYYY}-{0000}`}),[L,R]=(0,S.useState)(null),z=(0,S.useMemo)(()=>t.filter(e=>{let t=e.name.toLowerCase().includes(D.toLowerCase())||e.code.toLowerCase().includes(D.toLowerCase())||e.description&&e.description.toLowerCase().includes(D.toLowerCase()),n=k===`all`||k===`system`&&e.isSystem||k===`custom`&&!e.isSystem||e.category===k;return t&&n}),[t,D,k]),B=(0,S.useMemo)(()=>{let e=t.length,n=t.filter(e=>e.isSystem).length;return{total:e,system:n,custom:e-n,totalFields:t.reduce((e,t)=>e+(t.fields?.length||0),0)}},[t]),V=e=>{let t={а:`a`,б:`b`,в:`v`,г:`g`,д:`d`,е:`e`,ё:`yo`,ж:`zh`,з:`z`,и:`i`,й:`y`,к:`k`,л:`l`,м:`m`,н:`n`,о:`o`,п:`p`,р:`r`,с:`s`,т:`t`,у:`u`,ф:`f`,х:`kh`,ц:`ts`,ч:`ch`,ш:`sh`,щ:`shch`,ъ:``,ы:`y`,ь:``,э:`e`,ю:`yu`,я:`ya`};return e.toLowerCase().split(``).map(e=>t[e]||e).join(``).replace(/[^a-z0-9_]/g,`_`).replace(/_{2,}/g,`_`).replace(/^_|_$/g,``)},H=e=>{let t=V(e);I(n=>({...n,name:e,pluralName:n.pluralName||`${e}ы`,code:N?n.code:t}))};return(0,C.jsxs)(`div`,{className:`space-y-5 animate-fade-in`,children:[(0,C.jsxs)(`div`,{className:`flex flex-col sm:flex-row sm:items-center justify-between gap-4 p-5 bg-krona-surface border border-krona-border rounded-xl shadow-krona-soft`,children:[(0,C.jsxs)(`div`,{children:[(0,C.jsxs)(`div`,{className:`flex items-center gap-2 mb-1`,children:[(0,C.jsx)(c,{className:`w-5 h-5 text-krona-green`}),(0,C.jsx)(`h1`,{className:`text-base font-bold text-krona-primary`,children:`Configuration Engine: Каталог сущностей`}),(0,C.jsx)(b,{level:`pilot1`,size:`sm`})]}),(0,C.jsx)(`p`,{className:`text-xs text-krona-secondary max-w-2xl`,children:`Центральный конструктор моделей данных: создание системных и пользовательских сущностей, настройка 39+ типов полей, визуальный drag-and-drop редактор форм, карточек и сохранённых представлений.`})]}),(0,C.jsxs)(n,{variant:`primary`,size:`md`,"data-testid":`create-entity-btn`,onClick:()=>M(!0),className:`shrink-0`,children:[(0,C.jsx)(u,{className:`w-4 h-4 mr-1.5`}),`Создать сущность`]})]}),(0,C.jsxs)(`div`,{className:`grid grid-cols-2 md:grid-cols-4 gap-3`,children:[(0,C.jsxs)(`div`,{className:`p-3.5 bg-krona-surface border border-krona-border rounded-xl`,children:[(0,C.jsx)(`span`,{className:`text-xs text-krona-secondary`,children:`Всего сущностей`}),(0,C.jsx)(`p`,{className:`text-xl font-bold text-krona-primary mt-1`,children:B.total})]}),(0,C.jsxs)(`div`,{className:`p-3.5 bg-krona-surface border border-krona-border rounded-xl`,children:[(0,C.jsx)(`span`,{className:`text-xs text-krona-secondary`,children:`Системных сущностей`}),(0,C.jsx)(`p`,{className:`text-xl font-bold text-krona-green mt-1`,children:B.system})]}),(0,C.jsxs)(`div`,{className:`p-3.5 bg-krona-surface border border-krona-border rounded-xl`,children:[(0,C.jsx)(`span`,{className:`text-xs text-krona-secondary`,children:`Пользовательских (Custom)`}),(0,C.jsx)(`p`,{className:`text-xl font-bold text-krona-gold mt-1`,children:B.custom})]}),(0,C.jsxs)(`div`,{className:`p-3.5 bg-krona-surface border border-krona-border rounded-xl`,children:[(0,C.jsx)(`span`,{className:`text-xs text-krona-secondary`,children:`Активных полей`}),(0,C.jsx)(`p`,{className:`text-xl font-bold text-krona-primary mt-1`,children:B.totalFields})]})]}),(0,C.jsxs)(`div`,{className:`flex flex-col sm:flex-row sm:items-center justify-between gap-3 p-3.5 bg-krona-surface border border-krona-border rounded-xl`,children:[(0,C.jsx)(`div`,{className:`relative w-full sm:w-80`,children:(0,C.jsx)(d,{value:D,onChange:e=>O(e.target.value),placeholder:`Поиск по названию или коду...`,icon:(0,C.jsx)(f,{className:`w-4 h-4`})})}),(0,C.jsx)(`div`,{className:`flex flex-wrap gap-1.5`,children:[{id:`all`,label:`Все сущности`},{id:`system`,label:`Системные`},{id:`custom`,label:`Пользовательские`},{id:`crm`,label:`CRM`},{id:`commerce`,label:`Коммерция`},{id:`inventory`,label:`Склад`},{id:`finance`,label:`Финансы`}].map(e=>(0,C.jsx)(`button`,{onClick:()=>A(e.id),className:`px-3 py-1.5 rounded-lg text-xs font-medium transition-colors cursor-pointer ${k===e.id?`bg-krona-green text-white shadow-sm`:`bg-krona-surface-muted text-krona-secondary hover:text-krona-primary`}`,children:e.label},e.id))})]}),(0,C.jsx)(`div`,{className:`grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4`,children:z.map(t=>{let i=t.fields?.length||0;return(0,C.jsxs)(`div`,{className:`bg-krona-surface border border-krona-border rounded-xl p-4 shadow-krona-soft hover:border-krona-border-strong transition-all flex flex-col justify-between group`,children:[(0,C.jsxs)(`div`,{children:[(0,C.jsxs)(`div`,{className:`flex items-start justify-between gap-2 mb-2`,children:[(0,C.jsxs)(`div`,{className:`flex items-center gap-2.5`,children:[(0,C.jsx)(`div`,{className:`w-8 h-8 rounded-lg bg-krona-workspace flex items-center justify-center text-krona-primary border border-krona-border/60`,children:(0,C.jsx)(c,{className:`w-4 h-4 text-krona-green`})}),(0,C.jsxs)(`div`,{children:[(0,C.jsx)(`h3`,{className:`text-sm font-semibold text-krona-primary leading-tight`,children:t.name}),(0,C.jsx)(`p`,{className:`text-[11px] font-mono text-krona-secondary`,children:t.code})]})]}),(0,C.jsx)(`div`,{className:`flex items-center gap-1.5`,children:t.isSystem?(0,C.jsxs)(r,{variant:`neutral`,size:`sm`,children:[(0,C.jsx)(m,{className:`w-2.5 h-2.5 mr-1`}),`System`]}):(0,C.jsxs)(r,{variant:`gold`,size:`sm`,children:[(0,C.jsx)(h,{className:`w-2.5 h-2.5 mr-1`}),`Custom`]})})]}),(0,C.jsx)(`p`,{className:`text-xs text-krona-secondary line-clamp-2 min-h-[32px] mb-3`,children:t.description||`Пользовательская сущность бизнес-платформы Krona`}),(0,C.jsxs)(`div`,{className:`flex items-center gap-2 py-2 border-t border-b border-krona-border/60 text-xs text-krona-secondary mb-3`,children:[(0,C.jsxs)(`span`,{children:[`Полей: `,(0,C.jsx)(`strong`,{className:`text-krona-primary font-semibold`,children:i})]}),(0,C.jsx)(`span`,{children:`•`}),(0,C.jsxs)(`span`,{children:[`Категория: `,(0,C.jsx)(`strong`,{className:`text-krona-primary font-semibold capitalize`,children:t.category})]})]})]}),(0,C.jsxs)(`div`,{className:`space-y-2`,children:[(0,C.jsxs)(`div`,{className:`grid grid-cols-5 gap-1`,children:[(0,C.jsxs)(n,{variant:`primary`,size:`sm`,className:`text-[11px] px-1 py-1.5`,"data-testid":`open-entity-${t.code}-btn`,onClick:()=>e(`/entities/${t.code}`),title:`Перейти к записям сущности`,children:[(0,C.jsx)(c,{className:`w-3 h-3 mr-0.5`}),`Записи`]}),(0,C.jsxs)(n,{variant:`outline`,size:`sm`,className:`text-[11px] px-1 py-1.5`,onClick:()=>e(`/settings/entities/${t.code}/fields`),title:`Конструктор полей`,children:[(0,C.jsx)(p,{className:`w-3 h-3 mr-1 text-krona-green`}),`Поля`]}),(0,C.jsxs)(n,{variant:`outline`,size:`sm`,className:`text-[11px] px-1 py-1.5`,onClick:()=>e(`/settings/entities/${t.code}/forms`),title:`Конструктор форм`,children:[(0,C.jsx)(o,{className:`w-3 h-3 mr-1 text-krona-gold`}),`Формы`]}),(0,C.jsxs)(n,{variant:`outline`,size:`sm`,className:`text-[11px] px-1 py-1.5`,onClick:()=>e(`/settings/entities/${t.code}/card`),title:`Конструктор карточки`,children:[(0,C.jsx)(l,{className:`w-3 h-3 mr-1 text-krona-info`}),`Карточка`]}),(0,C.jsxs)(n,{variant:`outline`,size:`sm`,className:`text-[11px] px-1 py-1.5`,onClick:()=>e(`/settings/entities/${t.code}/views`),title:`Конструктор списков и представлений`,children:[(0,C.jsx)(s,{className:`w-3 h-3 mr-1 text-krona-primary`}),`Списки`]})]}),!t.isSystem&&(0,C.jsx)(`div`,{className:`flex justify-end pt-1`,children:(0,C.jsxs)(`button`,{type:`button`,onClick:()=>R(t),className:`text-[11px] text-krona-danger hover:text-krona-danger/80 flex items-center gap-1 font-medium cursor-pointer`,children:[(0,C.jsx)(x,{className:`w-3 h-3`}),`Удалить сущность`]})})]})]},t.code)})}),z.length===0&&!i&&(0,C.jsxs)(`div`,{className:`text-center py-12 p-6 bg-krona-surface border border-dashed border-krona-border rounded-xl`,children:[(0,C.jsx)(c,{className:`w-8 h-8 text-krona-secondary mx-auto mb-2 opacity-50`}),(0,C.jsx)(`h3`,{className:`text-sm font-semibold text-krona-primary mb-1`,children:`Сущности не найдены`}),(0,C.jsxs)(`p`,{className:`text-xs text-krona-secondary mb-4`,children:[`По вашему запросу «`,D,`» ничего не найдено.`]}),(0,C.jsx)(n,{variant:`secondary`,size:`sm`,onClick:()=>O(``),children:`Сбросить фильтр`})]}),(0,C.jsx)(v,{isOpen:j,onClose:()=>M(!1),title:`Создание новой сущности`,subtitle:`Задайте базовые параметры и системный API-идентификатор`,maxWidth:`lg`,closeOnBackdropClick:!1,children:(0,C.jsxs)(`form`,{onSubmit:async e=>{if(e.preventDefault(),!F.name||!F.code){E({type:`error`,title:`Заполните обязательные поля: название и код`});return}let n=F.code.trim().toLowerCase();if(t.some(e=>e.code===n)){E({type:`error`,title:`Сущность с таким системным кодом уже существует`});return}try{let e=[{id:`f_${n}_name`,key:F.primaryFieldKey||`name`,label:`Наименование`,type:`text`,required:!0,system:!0,searchable:!0,sortable:!0},{id:`f_${n}_status`,key:`status`,label:`Статус`,type:`status`,required:!1,system:!0,options:[{label:`Новый`,value:`new`,color:`neutral`},{label:`В работе`,value:`in_progress`,color:`warning`},{label:`Завершён`,value:`completed`,color:`green`}]}];await w({code:n,name:F.name.trim(),pluralName:F.pluralName.trim()||`${F.name}ы`,description:F.description.trim(),category:F.category,isSystem:!1,maturity:`target_prototype`,primaryFieldKey:F.primaryFieldKey||`name`,autonumberingEnabled:F.autonumberingEnabled,autonumberFormat:F.autonumberFormat,fields:e,defaultView:`table`}),E({type:`success`,title:`Сущность «${F.name}» создана`,message:`Теперь вы можете добавить пользовательские поля, настроить формы и списки.`}),M(!1),P(!1),I({name:``,pluralName:``,code:``,description:``,category:`custom`,primaryFieldKey:`name`,autonumberingEnabled:!1,autonumberFormat:`DOC-{YYYY}-{0000}`})}catch(e){E({type:`error`,title:`Ошибка создания сущности`,message:e instanceof Error?e.message:String(e)})}},className:`space-y-4`,children:[(0,C.jsxs)(`div`,{className:`grid grid-cols-1 sm:grid-cols-2 gap-3`,children:[(0,C.jsx)(d,{label:`Наименование (ед. число) *`,placeholder:`Например: Договор`,"data-testid":`new-entity-name-input`,value:F.name,onChange:e=>H(e.target.value),required:!0}),(0,C.jsx)(d,{label:`Наименование (мн. число) *`,placeholder:`Например: Договоры`,"data-testid":`new-entity-plural-input`,value:F.pluralName,onChange:e=>I(t=>({...t,pluralName:e.target.value})),required:!0})]}),(0,C.jsxs)(`div`,{className:`grid grid-cols-1 sm:grid-cols-2 gap-3`,children:[(0,C.jsx)(d,{label:`Системный код (API Name) *`,placeholder:`contract`,"data-testid":`new-entity-code-input`,value:F.code,onChange:e=>{P(!0),I(t=>({...t,code:e.target.value.toLowerCase().replace(/[^a-z0-9_]/g,``)}))},helperText:`Используется в URL, API и индексах (только a-z, 0-9, _)`,required:!0}),(0,C.jsxs)(`div`,{className:`flex flex-col gap-1.5 text-left`,children:[(0,C.jsx)(`label`,{className:`text-xs font-medium text-krona-secondary select-none`,children:`Категория`}),(0,C.jsxs)(`select`,{className:`w-full bg-krona-surface text-krona-primary border border-krona-border rounded-md px-3 py-2 text-sm focus:outline-none focus:border-krona-green`,value:F.category,onChange:e=>I(t=>({...t,category:e.target.value})),children:[(0,C.jsx)(`option`,{value:`custom`,children:`Пользовательская (Custom)`}),(0,C.jsx)(`option`,{value:`crm`,children:`CRM & Продажи`}),(0,C.jsx)(`option`,{value:`commerce`,children:`Коммерция`}),(0,C.jsx)(`option`,{value:`inventory`,children:`Склад & Запасы`}),(0,C.jsx)(`option`,{value:`finance`,children:`Финансы`}),(0,C.jsx)(`option`,{value:`operations`,children:`Операции`})]})]})]}),(0,C.jsx)(d,{label:`Описание назначения сущности`,placeholder:`Для каких бизнес-процессов предназначена сущность...`,value:F.description,onChange:e=>I(t=>({...t,description:e.target.value}))}),(0,C.jsxs)(`div`,{className:`p-3.5 bg-krona-workspace rounded-lg border border-krona-border/60 space-y-3`,children:[(0,C.jsxs)(`label`,{className:`flex items-center gap-2 cursor-pointer text-xs font-semibold text-krona-primary`,children:[(0,C.jsx)(`input`,{type:`checkbox`,checked:F.autonumberingEnabled,onChange:e=>I(t=>({...t,autonumberingEnabled:e.target.checked})),className:`rounded text-krona-green`}),`Включить автоматическую нумерацию записей`]}),F.autonumberingEnabled&&(0,C.jsx)(d,{label:`Шаблон нумератора`,value:F.autonumberFormat,onChange:e=>I(t=>({...t,autonumberFormat:e.target.value})),helperText:`Теги: {YYYY} - год, {MM} - месяц, {0000} - порядковый номер`})]}),(0,C.jsxs)(`div`,{className:`flex justify-end gap-2.5 pt-3 border-t border-krona-border/60`,children:[(0,C.jsx)(n,{variant:`outline`,size:`md`,type:`button`,onClick:()=>M(!1),children:`Отмена`}),(0,C.jsx)(n,{variant:`primary`,size:`md`,type:`submit`,"data-testid":`submit-create-entity-btn`,children:`Создать и перейти к полям`})]})]})}),(0,C.jsx)(v,{isOpen:!!L,onClose:()=>R(null),title:`Подтверждение удаления сущности`,subtitle:`Вы собираетесь удалить пользовательскую сущность «${L?.name}»`,maxWidth:`md`,children:(0,C.jsxs)(`div`,{className:`space-y-4`,children:[(0,C.jsxs)(`div`,{className:`p-4 bg-krona-danger/10 border border-krona-danger/30 rounded-lg text-xs text-krona-danger flex items-start gap-3`,children:[(0,C.jsx)(y,{className:`w-5 h-5 shrink-0 mt-0.5`}),(0,C.jsxs)(`div`,{children:[(0,C.jsx)(`p`,{className:`font-semibold mb-1`,children:`Внимание! Проверка зависимостей (Dependency Impact)`}),(0,C.jsxs)(`p`,{children:[`Будут удалены все связанные определения полей (`,L?.fields?.length||0,` шт.), сохраненные формы, представления списков и записи из базы данных.`]})]})]}),(0,C.jsxs)(`div`,{className:`p-3 bg-krona-workspace rounded-lg text-xs text-krona-secondary space-y-1`,children:[(0,C.jsxs)(`p`,{children:[`Код сущности: `,(0,C.jsx)(`code`,{className:`font-mono text-krona-primary`,children:L?.code})]}),(0,C.jsxs)(`p`,{children:[`Категория: `,(0,C.jsx)(`span`,{className:`text-krona-primary`,children:L?.category})]})]}),(0,C.jsxs)(`div`,{className:`flex justify-end gap-2.5 pt-3 border-t border-krona-border/60`,children:[(0,C.jsx)(n,{variant:`outline`,size:`md`,onClick:()=>R(null),children:`Отмена`}),(0,C.jsx)(n,{variant:`danger`,size:`md`,onClick:async()=>{if(L){if(L.isSystem){E({type:`error`,title:`Нельзя удалить системную сущность платформы`});return}try{await T(L.code),E({type:`success`,title:`Сущность «${L.name}» удалена`}),R(null)}catch(e){E({type:`error`,title:`Ошибка удаления сущности`,message:e instanceof Error?e.message:String(e)})}}},children:`Да, удалить сущность`})]})]})})]})};export{w as EntityCatalog,w as default}; \ No newline at end of file diff --git a/dist/assets/FieldBuilder-iF06Nk4x.js b/dist/assets/FieldBuilder-CLdLCeVX.js similarity index 94% rename from dist/assets/FieldBuilder-iF06Nk4x.js rename to dist/assets/FieldBuilder-CLdLCeVX.js index 5e438b4..d30130e 100644 --- a/dist/assets/FieldBuilder-iF06Nk4x.js +++ b/dist/assets/FieldBuilder-CLdLCeVX.js @@ -1 +1 @@ -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{n as s,r as c,t as l}from"./fieldTypesMeta-BWfaDuCZ.js";import{t as u}from"./eye-CkF1gwUX.js";import{t as d}from"./pen-D8SS70u3.js";import{A as f,Z as p,a as m,et as h,ft as g,n as _,pt as v,u as y,w as b,y as x}from"./index-CNnq9VO5.js";var S={name:`grip-vertical`,size:24,node:[[`circle`,{cx:`9`,cy:`12`,r:`1`,key:`1vctgf`}],[`circle`,{cx:`9`,cy:`5`,r:`1`,key:`hp0tcf`}],[`circle`,{cx:`9`,cy:`19`,r:`1`,key:`fkjjf6`}],[`circle`,{cx:`15`,cy:`12`,r:`1`,key:`1tmaij`}],[`circle`,{cx:`15`,cy:`5`,r:`1`,key:`19l28e`}],[`circle`,{cx:`15`,cy:`19`,r:`1`,key:`f4zoj3`}]]};S.node;var C=r(S),w=t(e(),1);function T(e,t,n){if(t===n||t<0||n<0||t>=e.length||n>=e.length)return e;let r=Array.from(e),[i]=r.splice(t,1);return r.splice(n,0,i),r}function E(e,t,n,r){if(e.key===`ArrowUp`&&(e.altKey||e.ctrlKey||e.metaKey)){if(e.preventDefault(),t>0)return r(t,t-1),!0}else if(e.key===`ArrowDown`&&(e.altKey||e.ctrlKey||e.metaKey)){if(e.preventDefault(),t0)return r(t,0),!0}else if(e.key===`End`&&(e.altKey||e.ctrlKey||e.metaKey)&&(e.preventDefault(),t{let{entityCode:e}=v(),t=g(),{currentEntity:r,addField:a,updateField:S,deleteField:O,updateEntity:k}=h(e),{showToast:A}=o(),[j,M]=(0,w.useState)(``),[N,P]=(0,w.useState)(!1),[F,I]=(0,w.useState)(null),[L,R]=(0,w.useState)(`edit`),z={label:``,key:``,type:`text`,description:``,placeholder:``,defaultValue:``,required:!1,unique:!1,readOnly:!1,hidden:!1,searchable:!0,filterable:!0,sortable:!0,options:[{label:`Вариант 1`,value:`opt_1`,color:`#2F684C`},{label:`Вариант 2`,value:`opt_2`,color:`#B78335`}],validation:{min:void 0,max:void 0,minLength:void 0,maxLength:void 0,pattern:``},conditionalVisibility:{fieldKey:``,operator:`eq`,value:``},permissions:{viewRoles:[`*`],editRoles:[`*`]}},[B,V]=(0,w.useState)(z),H=(0,w.useMemo)(()=>r?.fields||[],[r]),U=(0,w.useMemo)(()=>{if(!j.trim())return H;let e=j.toLowerCase();return H.filter(t=>t.label.toLowerCase().includes(e)||t.key.toLowerCase().includes(e)||t.type.toLowerCase().includes(e))},[H,j]),W=()=>{I(null),V({...z,key:`custom_${Date.now().toString(36)}`}),P(!0)},G=e=>{I(e.id),V({...e,options:e.options?[...e.options]:z.options,validation:{...e.validation||z.validation},conditionalVisibility:{...e.conditionalVisibility||z.conditionalVisibility},permissions:{...e.permissions||z.permissions}}),P(!0)},K=async()=>{if(!B.label||!B.key||!e){A({type:`error`,title:`Укажите название и системный код поля`});return}try{F?(await S(e,F,B),A({type:`success`,title:`Поле «${B.label}» обновлено`})):(await a(e,B),A({type:`success`,title:`Поле «${B.label}» добавлено`})),P(!1)}catch(e){A({type:`error`,title:`Ошибка сохранения поля`,message:e instanceof Error?e.message:String(e)})}},q=async t=>{if(e){if(t.system){A({type:`error`,title:`Защита инвариантов платформы`,message:`Системное поле «${t.label}» (${t.key}) является обязательным для целостности схемы и не может быть удалено.`});return}if(confirm(`Удалить поле «${t.label}» (${t.key})?`))try{await O(e,t.id),A({type:`success`,title:`Поле «${t.label}» удалено`})}catch(e){A({type:`error`,title:`Ошибка удаления поля`,message:e instanceof Error?e.message:String(e)})}}},J=async(t,n)=>{if(!e||!r)return;let i=T(H,t,n);await k(e,{fields:i})},Y=()=>{let e={label:`Новый вариант ${(B.options?.length||0)+1}`,value:`opt_${Date.now().toString(36)}`,color:`#527286`};V(t=>({...t,options:[...t.options||[],e]}))},X=(e,t)=>{V(n=>{let r=[...n.options||[]];return r[e]={...r[e],...t},{...n,options:r}})},Z=e=>{V(t=>({...t,options:(t.options||[]).filter((t,n)=>n!==e)}))},Q=c(B.type||`text`);return(0,D.jsxs)(`div`,{className:`space-y-4 animate-fade-in`,children:[(0,D.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,D.jsxs)(`div`,{className:`flex items-center gap-3`,children:[(0,D.jsxs)(n,{variant:`ghost`,size:`sm`,onClick:()=>t(`/settings/entities`),className:`p-1.5`,children:[(0,D.jsx)(p,{className:`w-4 h-4 mr-1`}),`Каталог`]}),(0,D.jsxs)(`div`,{children:[(0,D.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,D.jsxs)(`h1`,{className:`text-base font-bold text-krona-primary`,children:[`Поля сущности: `,r?.name||e]}),(0,D.jsx)(i,{variant:`neutral`,size:`sm`,children:(0,D.jsx)(`code`,{children:e})})]}),(0,D.jsx)(`p`,{className:`text-xs text-krona-secondary`,children:`Управление атрибутами, типами данных, правилами валидации и опциями выбора`})]})]}),(0,D.jsx)(`div`,{className:`flex items-center gap-2`,children:(0,D.jsxs)(n,{variant:`primary`,size:`sm`,onClick:W,children:[(0,D.jsx)(b,{className:`w-4 h-4 mr-1.5`}),`Добавить поле`]})})]}),(0,D.jsxs)(`div`,{className:`flex items-center justify-between gap-3 p-3 bg-krona-surface border border-krona-border rounded-xl`,children:[(0,D.jsx)(`div`,{className:`relative w-72`,children:(0,D.jsx)(m,{value:j,onChange:e=>M(e.target.value),placeholder:`Поиск по названию или коду...`,icon:(0,D.jsx)(x,{className:`w-3.5 h-3.5`})})}),(0,D.jsxs)(`div`,{className:`text-xs text-krona-secondary`,children:[`Всего полей: `,(0,D.jsx)(`strong`,{className:`text-krona-primary`,children:H.length}),` (из них`,` `,H.filter(e=>e.system).length,` системных)`]})]}),(0,D.jsx)(`div`,{className:`bg-krona-surface border border-krona-border rounded-xl shadow-krona-soft overflow-hidden`,children:(0,D.jsx)(`div`,{className:`divide-y divide-krona-border/60`,children:U.map((e,t)=>{let r=c(e.type),a=r.icon;return(0,D.jsxs)(`div`,{tabIndex:0,onKeyDown:e=>E(e,t,H.length,J),className:`flex items-center justify-between p-3 hover:bg-krona-workspace/50 transition-colors group`,children:[(0,D.jsxs)(`div`,{className:`flex items-center gap-3 min-w-0`,children:[(0,D.jsx)(`div`,{className:`text-krona-secondary hover:text-krona-primary cursor-grab active:cursor-grabbing p-1`,title:`Alt + Стрелки для перемещения с клавиатуры`,children:(0,D.jsx)(C,{className:`w-4 h-4 opacity-40 group-hover:opacity-100`})}),(0,D.jsx)(`div`,{className:`w-7 h-7 rounded-md bg-krona-workspace flex items-center justify-center text-krona-primary border border-krona-border/60 shrink-0`,children:(0,D.jsx)(a,{className:`w-3.5 h-3.5 text-krona-green`})}),(0,D.jsxs)(`div`,{className:`min-w-0`,children:[(0,D.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,D.jsx)(`span`,{className:`text-sm font-medium text-krona-primary truncate`,children:e.label}),e.required&&(0,D.jsx)(`span`,{className:`text-xs text-krona-danger font-bold`,title:`Обязательное поле`,children:`*`})]}),(0,D.jsxs)(`div`,{className:`flex items-center gap-2 text-xs font-mono text-krona-secondary`,children:[(0,D.jsx)(`span`,{children:e.key}),e.description&&(0,D.jsxs)(D.Fragment,{children:[(0,D.jsx)(`span`,{children:`•`}),(0,D.jsx)(`span`,{className:`font-sans text-[11px] truncate max-w-xs`,children:e.description})]})]})]})]}),(0,D.jsxs)(`div`,{className:`flex items-center gap-3 shrink-0`,children:[(0,D.jsx)(i,{variant:`neutral`,size:`sm`,className:`hidden sm:inline-flex`,children:r.label}),e.system?(0,D.jsxs)(i,{variant:`neutral`,size:`sm`,children:[(0,D.jsx)(f,{className:`w-2.5 h-2.5 mr-1`}),`System`]}):(0,D.jsx)(i,{variant:`gold`,size:`sm`,children:`Custom`}),(0,D.jsxs)(`div`,{className:`flex items-center gap-1 opacity-80 group-hover:opacity-100`,children:[(0,D.jsx)(n,{variant:`ghost`,size:`icon`,onClick:()=>G(e),title:`Редактировать поле`,children:(0,D.jsx)(d,{className:`w-3.5 h-3.5`})}),!e.system&&(0,D.jsx)(n,{variant:`ghost`,size:`icon`,onClick:()=>q(e),className:`text-krona-danger hover:bg-krona-danger/10`,title:`Удалить поле`,children:(0,D.jsx)(y,{className:`w-3.5 h-3.5`})})]})]})]},e.id)})})}),(0,D.jsx)(_,{isOpen:N,onClose:()=>P(!1),title:F?`Редактирование поля: ${B.label}`:`Добавление нового поля`,subtitle:`Сущность: ${r?.name||e}`,width:`lg`,children:(0,D.jsxs)(`div`,{className:`space-y-5 pb-6`,children:[(0,D.jsxs)(`div`,{className:`p-3 bg-krona-workspace rounded-xl border border-krona-border/80 space-y-2`,children:[(0,D.jsxs)(`div`,{className:`flex items-center justify-between text-xs text-krona-secondary`,children:[(0,D.jsxs)(`span`,{className:`font-semibold text-krona-primary flex items-center gap-1.5`,children:[(0,D.jsx)(u,{className:`w-3.5 h-3.5 text-krona-gold`}),`Интерактивное превью поля`]}),(0,D.jsx)(`div`,{className:`flex gap-1`,children:[`edit`,`readonly`,`create`].map(e=>(0,D.jsx)(`button`,{onClick:()=>R(e),className:`px-2 py-0.5 rounded text-[10px] font-medium uppercase ${L===e?`bg-krona-green text-white`:`bg-krona-surface text-krona-secondary`}`,children:e},e))})]}),(0,D.jsxs)(`div`,{className:`p-3 bg-krona-surface border border-krona-border rounded-lg`,children:[(0,D.jsxs)(`label`,{className:`text-xs font-semibold text-krona-primary block mb-1`,children:[B.label||`Название поля`,B.required&&(0,D.jsx)(`span`,{className:`text-krona-danger ml-1`,children:`*`})]}),L===`readonly`?(0,D.jsx)(`div`,{className:`text-xs text-krona-secondary font-mono bg-krona-workspace p-2 rounded`,children:B.defaultValue?String(B.defaultValue):`— (значение не заполнено)`}):Q.supportsOptions?(0,D.jsx)(`select`,{className:`w-full bg-krona-surface border border-krona-border rounded-md px-3 py-1.5 text-xs text-krona-primary`,children:B.options?.map(e=>(0,D.jsx)(`option`,{value:e.value,children:e.label},e.value))}):(0,D.jsx)(`input`,{type:B.type===`integer`||B.type===`number`?`number`:`text`,placeholder:B.placeholder||`Введите значение...`,className:`w-full bg-krona-surface border border-krona-border rounded-md px-3 py-1.5 text-xs text-krona-primary focus:outline-none focus:border-krona-green`,defaultValue:String(B.defaultValue||``)}),B.description&&(0,D.jsx)(`p`,{className:`text-[11px] text-krona-secondary mt-1`,children:B.description})]})]}),(0,D.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,D.jsx)(`label`,{className:`text-xs font-semibold text-krona-primary`,children:`Тип данных поля (все 39+ типов из спецификации) *`}),(0,D.jsx)(`select`,{value:B.type,onChange:e=>{let t=e.target.value,n=c(t);V(e=>({...e,type:t,defaultValue:n.defaultValue}))},disabled:!!F&&B.system,className:`w-full bg-krona-surface text-krona-primary border border-krona-border rounded-md px-3 py-2 text-xs focus:outline-none focus:border-krona-green`,children:s.map(e=>(0,D.jsx)(`optgroup`,{label:e.label,children:l.filter(t=>t.category===e.id).map(e=>(0,D.jsxs)(`option`,{value:e.type,children:[e.label,` (`,e.type,`)`]},e.type))},e.id))}),(0,D.jsx)(`p`,{className:`text-[11px] text-krona-secondary`,children:Q.description})]}),(0,D.jsxs)(`div`,{className:`grid grid-cols-1 sm:grid-cols-2 gap-3`,children:[(0,D.jsx)(m,{label:`Отображаемое название (Label) *`,value:B.label,onChange:e=>V(t=>({...t,label:e.target.value})),placeholder:`Например: Номер договора`,required:!0}),(0,D.jsx)(m,{label:`Системный код (API Name) *`,value:B.key,onChange:e=>V(t=>({...t,key:e.target.value.toLowerCase().replace(/[^a-z0-9_]/g,``)})),placeholder:`contract_number`,disabled:!!F&&B.system,helperText:B.system?`Системный инвариант (неизменяемый)`:void 0,required:!0})]}),(0,D.jsxs)(`div`,{className:`grid grid-cols-1 sm:grid-cols-2 gap-3`,children:[(0,D.jsx)(m,{label:`Подсказка (Placeholder)`,value:B.placeholder||``,onChange:e=>V(t=>({...t,placeholder:e.target.value})),placeholder:`Подсказка внутри поля`}),(0,D.jsx)(m,{label:`Значение по умолчанию`,value:String(B.defaultValue||``),onChange:e=>V(t=>({...t,defaultValue:e.target.value})),placeholder:`Значение по умолчанию`})]}),(0,D.jsx)(m,{label:`Описание для пользователя (Tooltip / Helper)`,value:B.description||``,onChange:e=>V(t=>({...t,description:e.target.value})),placeholder:`Пояснение к заполнению поля`}),(0,D.jsxs)(`div`,{className:`space-y-2 p-3.5 bg-krona-workspace rounded-xl border border-krona-border/60`,children:[(0,D.jsx)(`h4`,{className:`text-xs font-bold text-krona-primary uppercase tracking-wider mb-2`,children:`Флаги поведения поля`}),(0,D.jsxs)(`div`,{className:`grid grid-cols-2 sm:grid-cols-3 gap-2 text-xs`,children:[(0,D.jsxs)(`label`,{className:`flex items-center gap-2 cursor-pointer`,children:[(0,D.jsx)(`input`,{type:`checkbox`,checked:B.required||!1,onChange:e=>V(t=>({...t,required:e.target.checked}))}),`Обязательное`]}),(0,D.jsxs)(`label`,{className:`flex items-center gap-2 cursor-pointer`,children:[(0,D.jsx)(`input`,{type:`checkbox`,checked:B.unique||!1,onChange:e=>V(t=>({...t,unique:e.target.checked}))}),`Уникальное`]}),(0,D.jsxs)(`label`,{className:`flex items-center gap-2 cursor-pointer`,children:[(0,D.jsx)(`input`,{type:`checkbox`,checked:B.readOnly||!1,onChange:e=>V(t=>({...t,readOnly:e.target.checked}))}),`Только чтение`]}),(0,D.jsxs)(`label`,{className:`flex items-center gap-2 cursor-pointer`,children:[(0,D.jsx)(`input`,{type:`checkbox`,checked:B.searchable!==!1,onChange:e=>V(t=>({...t,searchable:e.target.checked}))}),`Полнотекстовый поиск`]}),(0,D.jsxs)(`label`,{className:`flex items-center gap-2 cursor-pointer`,children:[(0,D.jsx)(`input`,{type:`checkbox`,checked:B.filterable!==!1,onChange:e=>V(t=>({...t,filterable:e.target.checked}))}),`Фильтрация в списках`]}),(0,D.jsxs)(`label`,{className:`flex items-center gap-2 cursor-pointer`,children:[(0,D.jsx)(`input`,{type:`checkbox`,checked:B.sortable!==!1,onChange:e=>V(t=>({...t,sortable:e.target.checked}))}),`Сортировка`]})]})]}),Q.supportsOptions&&(0,D.jsxs)(`div`,{className:`space-y-3 p-3.5 bg-krona-workspace rounded-xl border border-krona-border/60`,children:[(0,D.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,D.jsx)(`h4`,{className:`text-xs font-bold text-krona-primary uppercase tracking-wider`,children:`Варианты выбора (Options Editor)`}),(0,D.jsxs)(n,{variant:`secondary`,size:`sm`,onClick:Y,children:[(0,D.jsx)(b,{className:`w-3.5 h-3.5 mr-1`}),`Добавить вариант`]})]}),(0,D.jsx)(`div`,{className:`space-y-2`,children:B.options?.map((e,t)=>(0,D.jsxs)(`div`,{className:`flex items-center gap-2 bg-krona-surface p-2 rounded border border-krona-border`,children:[(0,D.jsx)(m,{value:e.label,onChange:e=>X(t,{label:e.target.value}),placeholder:`Подпись варианта`,className:`text-xs py-1`}),(0,D.jsx)(m,{value:e.value,onChange:e=>X(t,{value:e.target.value}),placeholder:`Код значения`,className:`text-xs py-1 w-32 font-mono`}),(0,D.jsx)(`input`,{type:`color`,value:e.color||`#2F684C`,onChange:e=>X(t,{color:e.target.value}),className:`w-7 h-7 rounded border border-krona-border cursor-pointer p-0 shrink-0`,title:`Цвет бейджа`}),(0,D.jsx)(`button`,{type:`button`,onClick:()=>Z(t),className:`p-1 text-krona-danger hover:bg-krona-danger/10 rounded`,children:(0,D.jsx)(y,{className:`w-3.5 h-3.5`})})]},t))})]}),(0,D.jsxs)(`div`,{className:`space-y-2 p-3.5 bg-krona-workspace rounded-xl border border-krona-border/60`,children:[(0,D.jsx)(`h4`,{className:`text-xs font-bold text-krona-primary uppercase tracking-wider mb-2`,children:`Правила валидации (Validation Rules)`}),(0,D.jsxs)(`div`,{className:`grid grid-cols-2 gap-3`,children:[(0,D.jsx)(m,{label:`Мин. значение / длина`,type:`number`,value:B.validation?.min??B.validation?.minLength??``,onChange:e=>V(t=>({...t,validation:{...t.validation,min:Number(e.target.value)}}))}),(0,D.jsx)(m,{label:`Макс. значение / длина`,type:`number`,value:B.validation?.max??B.validation?.maxLength??``,onChange:e=>V(t=>({...t,validation:{...t.validation,max:Number(e.target.value)}}))})]}),(0,D.jsx)(m,{label:`RegEx паттерн проверки`,value:B.validation?.pattern||``,onChange:e=>V(t=>({...t,validation:{...t.validation,pattern:e.target.value}})),placeholder:`^[A-Z0-9_-]+$`,className:`font-mono text-xs`})]}),(0,D.jsxs)(`div`,{className:`flex justify-end gap-2 pt-4 border-t border-krona-border/60`,children:[(0,D.jsx)(n,{variant:`outline`,size:`md`,onClick:()=>P(!1),children:`Отмена`}),(0,D.jsx)(n,{variant:`primary`,size:`md`,onClick:K,children:`Сохранить поле`})]})]})})]})};export{O as FieldBuilder,O as default}; \ No newline at end of file +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{n as s,r as c,t as l}from"./fieldTypesMeta-BCSfJ-2N.js";import{t as u}from"./eye-CkF1gwUX.js";import{t as d}from"./pen-D8SS70u3.js";import{$ as f,T as p,a as m,b as h,ht as g,j as _,mt as v,n as y,nt as b,u as x}from"./index-CrJKtV0u.js";var S={name:`grip-vertical`,size:24,node:[[`circle`,{cx:`9`,cy:`12`,r:`1`,key:`1vctgf`}],[`circle`,{cx:`9`,cy:`5`,r:`1`,key:`hp0tcf`}],[`circle`,{cx:`9`,cy:`19`,r:`1`,key:`fkjjf6`}],[`circle`,{cx:`15`,cy:`12`,r:`1`,key:`1tmaij`}],[`circle`,{cx:`15`,cy:`5`,r:`1`,key:`19l28e`}],[`circle`,{cx:`15`,cy:`19`,r:`1`,key:`f4zoj3`}]]};S.node;var C=r(S),w=t(e(),1);function T(e,t,n){if(t===n||t<0||n<0||t>=e.length||n>=e.length)return e;let r=Array.from(e),[i]=r.splice(t,1);return r.splice(n,0,i),r}function E(e,t,n,r){if(e.key===`ArrowUp`&&(e.altKey||e.ctrlKey||e.metaKey)){if(e.preventDefault(),t>0)return r(t,t-1),!0}else if(e.key===`ArrowDown`&&(e.altKey||e.ctrlKey||e.metaKey)){if(e.preventDefault(),t0)return r(t,0),!0}else if(e.key===`End`&&(e.altKey||e.ctrlKey||e.metaKey)&&(e.preventDefault(),t{let{entityCode:e}=g(),t=v(),{currentEntity:r,addField:a,updateField:S,deleteField:O,updateEntity:k}=b(e),{showToast:A}=o(),[j,M]=(0,w.useState)(``),[N,P]=(0,w.useState)(!1),[F,I]=(0,w.useState)(null),[L,R]=(0,w.useState)(`edit`),z={label:``,key:``,type:`text`,description:``,placeholder:``,defaultValue:``,required:!1,unique:!1,readOnly:!1,hidden:!1,searchable:!0,filterable:!0,sortable:!0,options:[{label:`Вариант 1`,value:`opt_1`,color:`#2F684C`},{label:`Вариант 2`,value:`opt_2`,color:`#B78335`}],validation:{min:void 0,max:void 0,minLength:void 0,maxLength:void 0,pattern:``},conditionalVisibility:{fieldKey:``,operator:`eq`,value:``},permissions:{viewRoles:[`*`],editRoles:[`*`]}},[B,V]=(0,w.useState)(z),H=(0,w.useMemo)(()=>r?.fields||[],[r]),U=(0,w.useMemo)(()=>{if(!j.trim())return H;let e=j.toLowerCase();return H.filter(t=>t.label.toLowerCase().includes(e)||t.key.toLowerCase().includes(e)||t.type.toLowerCase().includes(e))},[H,j]),W=()=>{I(null),V({...z,key:`custom_${Date.now().toString(36)}`}),P(!0)},G=e=>{I(e.id),V({...e,options:e.options?[...e.options]:z.options,validation:{...e.validation||z.validation},conditionalVisibility:{...e.conditionalVisibility||z.conditionalVisibility},permissions:{...e.permissions||z.permissions}}),P(!0)},K=async()=>{if(!B.label||!B.key||!e){A({type:`error`,title:`Укажите название и системный код поля`});return}try{F?(await S(e,F,B),A({type:`success`,title:`Поле «${B.label}» обновлено`})):(await a(e,B),A({type:`success`,title:`Поле «${B.label}» добавлено`})),P(!1)}catch(e){A({type:`error`,title:`Ошибка сохранения поля`,message:e instanceof Error?e.message:String(e)})}},q=async t=>{if(e){if(t.system){A({type:`error`,title:`Защита инвариантов платформы`,message:`Системное поле «${t.label}» (${t.key}) является обязательным для целостности схемы и не может быть удалено.`});return}if(confirm(`Удалить поле «${t.label}» (${t.key})?`))try{await O(e,t.id),A({type:`success`,title:`Поле «${t.label}» удалено`})}catch(e){A({type:`error`,title:`Ошибка удаления поля`,message:e instanceof Error?e.message:String(e)})}}},J=async(t,n)=>{if(!e||!r)return;let i=T(H,t,n);await k(e,{fields:i})},Y=()=>{let e={label:`Новый вариант ${(B.options?.length||0)+1}`,value:`opt_${Date.now().toString(36)}`,color:`#527286`};V(t=>({...t,options:[...t.options||[],e]}))},X=(e,t)=>{V(n=>{let r=[...n.options||[]];return r[e]={...r[e],...t},{...n,options:r}})},Z=e=>{V(t=>({...t,options:(t.options||[]).filter((t,n)=>n!==e)}))},Q=c(B.type||`text`);return(0,D.jsxs)(`div`,{className:`space-y-4 animate-fade-in`,children:[(0,D.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,D.jsxs)(`div`,{className:`flex items-center gap-3`,children:[(0,D.jsxs)(n,{variant:`ghost`,size:`sm`,onClick:()=>t(`/settings/entities`),className:`p-1.5`,children:[(0,D.jsx)(f,{className:`w-4 h-4 mr-1`}),`Каталог`]}),(0,D.jsxs)(`div`,{children:[(0,D.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,D.jsxs)(`h1`,{className:`text-base font-bold text-krona-primary`,children:[`Поля сущности: `,r?.name||e]}),(0,D.jsx)(i,{variant:`neutral`,size:`sm`,children:(0,D.jsx)(`code`,{children:e})})]}),(0,D.jsx)(`p`,{className:`text-xs text-krona-secondary`,children:`Управление атрибутами, типами данных, правилами валидации и опциями выбора`})]})]}),(0,D.jsx)(`div`,{className:`flex items-center gap-2`,children:(0,D.jsxs)(n,{variant:`primary`,size:`sm`,onClick:W,children:[(0,D.jsx)(p,{className:`w-4 h-4 mr-1.5`}),`Добавить поле`]})})]}),(0,D.jsxs)(`div`,{className:`flex items-center justify-between gap-3 p-3 bg-krona-surface border border-krona-border rounded-xl`,children:[(0,D.jsx)(`div`,{className:`relative w-72`,children:(0,D.jsx)(m,{value:j,onChange:e=>M(e.target.value),placeholder:`Поиск по названию или коду...`,icon:(0,D.jsx)(h,{className:`w-3.5 h-3.5`})})}),(0,D.jsxs)(`div`,{className:`text-xs text-krona-secondary`,children:[`Всего полей: `,(0,D.jsx)(`strong`,{className:`text-krona-primary`,children:H.length}),` (из них`,` `,H.filter(e=>e.system).length,` системных)`]})]}),(0,D.jsx)(`div`,{className:`bg-krona-surface border border-krona-border rounded-xl shadow-krona-soft overflow-hidden`,children:(0,D.jsx)(`div`,{className:`divide-y divide-krona-border/60`,children:U.map((e,t)=>{let r=c(e.type),a=r.icon;return(0,D.jsxs)(`div`,{tabIndex:0,onKeyDown:e=>E(e,t,H.length,J),className:`flex items-center justify-between p-3 hover:bg-krona-workspace/50 transition-colors group`,children:[(0,D.jsxs)(`div`,{className:`flex items-center gap-3 min-w-0`,children:[(0,D.jsx)(`div`,{className:`text-krona-secondary hover:text-krona-primary cursor-grab active:cursor-grabbing p-1`,title:`Alt + Стрелки для перемещения с клавиатуры`,children:(0,D.jsx)(C,{className:`w-4 h-4 opacity-40 group-hover:opacity-100`})}),(0,D.jsx)(`div`,{className:`w-7 h-7 rounded-md bg-krona-workspace flex items-center justify-center text-krona-primary border border-krona-border/60 shrink-0`,children:(0,D.jsx)(a,{className:`w-3.5 h-3.5 text-krona-green`})}),(0,D.jsxs)(`div`,{className:`min-w-0`,children:[(0,D.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,D.jsx)(`span`,{className:`text-sm font-medium text-krona-primary truncate`,children:e.label}),e.required&&(0,D.jsx)(`span`,{className:`text-xs text-krona-danger font-bold`,title:`Обязательное поле`,children:`*`})]}),(0,D.jsxs)(`div`,{className:`flex items-center gap-2 text-xs font-mono text-krona-secondary`,children:[(0,D.jsx)(`span`,{children:e.key}),e.description&&(0,D.jsxs)(D.Fragment,{children:[(0,D.jsx)(`span`,{children:`•`}),(0,D.jsx)(`span`,{className:`font-sans text-[11px] truncate max-w-xs`,children:e.description})]})]})]})]}),(0,D.jsxs)(`div`,{className:`flex items-center gap-3 shrink-0`,children:[(0,D.jsx)(i,{variant:`neutral`,size:`sm`,className:`hidden sm:inline-flex`,children:r.label}),e.system?(0,D.jsxs)(i,{variant:`neutral`,size:`sm`,children:[(0,D.jsx)(_,{className:`w-2.5 h-2.5 mr-1`}),`System`]}):(0,D.jsx)(i,{variant:`gold`,size:`sm`,children:`Custom`}),(0,D.jsxs)(`div`,{className:`flex items-center gap-1 opacity-80 group-hover:opacity-100`,children:[(0,D.jsx)(n,{variant:`ghost`,size:`icon`,onClick:()=>G(e),title:`Редактировать поле`,children:(0,D.jsx)(d,{className:`w-3.5 h-3.5`})}),!e.system&&(0,D.jsx)(n,{variant:`ghost`,size:`icon`,onClick:()=>q(e),className:`text-krona-danger hover:bg-krona-danger/10`,title:`Удалить поле`,children:(0,D.jsx)(x,{className:`w-3.5 h-3.5`})})]})]})]},e.id)})})}),(0,D.jsx)(y,{isOpen:N,onClose:()=>P(!1),title:F?`Редактирование поля: ${B.label}`:`Добавление нового поля`,subtitle:`Сущность: ${r?.name||e}`,width:`lg`,children:(0,D.jsxs)(`div`,{className:`space-y-5 pb-6`,children:[(0,D.jsxs)(`div`,{className:`p-3 bg-krona-workspace rounded-xl border border-krona-border/80 space-y-2`,children:[(0,D.jsxs)(`div`,{className:`flex items-center justify-between text-xs text-krona-secondary`,children:[(0,D.jsxs)(`span`,{className:`font-semibold text-krona-primary flex items-center gap-1.5`,children:[(0,D.jsx)(u,{className:`w-3.5 h-3.5 text-krona-gold`}),`Интерактивное превью поля`]}),(0,D.jsx)(`div`,{className:`flex gap-1`,children:[`edit`,`readonly`,`create`].map(e=>(0,D.jsx)(`button`,{onClick:()=>R(e),className:`px-2 py-0.5 rounded text-[10px] font-medium uppercase ${L===e?`bg-krona-green text-white`:`bg-krona-surface text-krona-secondary`}`,children:e},e))})]}),(0,D.jsxs)(`div`,{className:`p-3 bg-krona-surface border border-krona-border rounded-lg`,children:[(0,D.jsxs)(`label`,{className:`text-xs font-semibold text-krona-primary block mb-1`,children:[B.label||`Название поля`,B.required&&(0,D.jsx)(`span`,{className:`text-krona-danger ml-1`,children:`*`})]}),L===`readonly`?(0,D.jsx)(`div`,{className:`text-xs text-krona-secondary font-mono bg-krona-workspace p-2 rounded`,children:B.defaultValue?String(B.defaultValue):`— (значение не заполнено)`}):Q.supportsOptions?(0,D.jsx)(`select`,{className:`w-full bg-krona-surface border border-krona-border rounded-md px-3 py-1.5 text-xs text-krona-primary`,children:B.options?.map(e=>(0,D.jsx)(`option`,{value:e.value,children:e.label},e.value))}):(0,D.jsx)(`input`,{type:B.type===`integer`||B.type===`number`?`number`:`text`,placeholder:B.placeholder||`Введите значение...`,className:`w-full bg-krona-surface border border-krona-border rounded-md px-3 py-1.5 text-xs text-krona-primary focus:outline-none focus:border-krona-green`,defaultValue:String(B.defaultValue||``)}),B.description&&(0,D.jsx)(`p`,{className:`text-[11px] text-krona-secondary mt-1`,children:B.description})]})]}),(0,D.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,D.jsx)(`label`,{className:`text-xs font-semibold text-krona-primary`,children:`Тип данных поля (все 39+ типов из спецификации) *`}),(0,D.jsx)(`select`,{value:B.type,onChange:e=>{let t=e.target.value,n=c(t);V(e=>({...e,type:t,defaultValue:n.defaultValue}))},disabled:!!F&&B.system,className:`w-full bg-krona-surface text-krona-primary border border-krona-border rounded-md px-3 py-2 text-xs focus:outline-none focus:border-krona-green`,children:s.map(e=>(0,D.jsx)(`optgroup`,{label:e.label,children:l.filter(t=>t.category===e.id).map(e=>(0,D.jsxs)(`option`,{value:e.type,children:[e.label,` (`,e.type,`)`]},e.type))},e.id))}),(0,D.jsx)(`p`,{className:`text-[11px] text-krona-secondary`,children:Q.description})]}),(0,D.jsxs)(`div`,{className:`grid grid-cols-1 sm:grid-cols-2 gap-3`,children:[(0,D.jsx)(m,{label:`Отображаемое название (Label) *`,value:B.label,onChange:e=>V(t=>({...t,label:e.target.value})),placeholder:`Например: Номер договора`,required:!0}),(0,D.jsx)(m,{label:`Системный код (API Name) *`,value:B.key,onChange:e=>V(t=>({...t,key:e.target.value.toLowerCase().replace(/[^a-z0-9_]/g,``)})),placeholder:`contract_number`,disabled:!!F&&B.system,helperText:B.system?`Системный инвариант (неизменяемый)`:void 0,required:!0})]}),(0,D.jsxs)(`div`,{className:`grid grid-cols-1 sm:grid-cols-2 gap-3`,children:[(0,D.jsx)(m,{label:`Подсказка (Placeholder)`,value:B.placeholder||``,onChange:e=>V(t=>({...t,placeholder:e.target.value})),placeholder:`Подсказка внутри поля`}),(0,D.jsx)(m,{label:`Значение по умолчанию`,value:String(B.defaultValue||``),onChange:e=>V(t=>({...t,defaultValue:e.target.value})),placeholder:`Значение по умолчанию`})]}),(0,D.jsx)(m,{label:`Описание для пользователя (Tooltip / Helper)`,value:B.description||``,onChange:e=>V(t=>({...t,description:e.target.value})),placeholder:`Пояснение к заполнению поля`}),(0,D.jsxs)(`div`,{className:`space-y-2 p-3.5 bg-krona-workspace rounded-xl border border-krona-border/60`,children:[(0,D.jsx)(`h4`,{className:`text-xs font-bold text-krona-primary uppercase tracking-wider mb-2`,children:`Флаги поведения поля`}),(0,D.jsxs)(`div`,{className:`grid grid-cols-2 sm:grid-cols-3 gap-2 text-xs`,children:[(0,D.jsxs)(`label`,{className:`flex items-center gap-2 cursor-pointer`,children:[(0,D.jsx)(`input`,{type:`checkbox`,checked:B.required||!1,onChange:e=>V(t=>({...t,required:e.target.checked}))}),`Обязательное`]}),(0,D.jsxs)(`label`,{className:`flex items-center gap-2 cursor-pointer`,children:[(0,D.jsx)(`input`,{type:`checkbox`,checked:B.unique||!1,onChange:e=>V(t=>({...t,unique:e.target.checked}))}),`Уникальное`]}),(0,D.jsxs)(`label`,{className:`flex items-center gap-2 cursor-pointer`,children:[(0,D.jsx)(`input`,{type:`checkbox`,checked:B.readOnly||!1,onChange:e=>V(t=>({...t,readOnly:e.target.checked}))}),`Только чтение`]}),(0,D.jsxs)(`label`,{className:`flex items-center gap-2 cursor-pointer`,children:[(0,D.jsx)(`input`,{type:`checkbox`,checked:B.searchable!==!1,onChange:e=>V(t=>({...t,searchable:e.target.checked}))}),`Полнотекстовый поиск`]}),(0,D.jsxs)(`label`,{className:`flex items-center gap-2 cursor-pointer`,children:[(0,D.jsx)(`input`,{type:`checkbox`,checked:B.filterable!==!1,onChange:e=>V(t=>({...t,filterable:e.target.checked}))}),`Фильтрация в списках`]}),(0,D.jsxs)(`label`,{className:`flex items-center gap-2 cursor-pointer`,children:[(0,D.jsx)(`input`,{type:`checkbox`,checked:B.sortable!==!1,onChange:e=>V(t=>({...t,sortable:e.target.checked}))}),`Сортировка`]})]})]}),Q.supportsOptions&&(0,D.jsxs)(`div`,{className:`space-y-3 p-3.5 bg-krona-workspace rounded-xl border border-krona-border/60`,children:[(0,D.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,D.jsx)(`h4`,{className:`text-xs font-bold text-krona-primary uppercase tracking-wider`,children:`Варианты выбора (Options Editor)`}),(0,D.jsxs)(n,{variant:`secondary`,size:`sm`,onClick:Y,children:[(0,D.jsx)(p,{className:`w-3.5 h-3.5 mr-1`}),`Добавить вариант`]})]}),(0,D.jsx)(`div`,{className:`space-y-2`,children:B.options?.map((e,t)=>(0,D.jsxs)(`div`,{className:`flex items-center gap-2 bg-krona-surface p-2 rounded border border-krona-border`,children:[(0,D.jsx)(m,{value:e.label,onChange:e=>X(t,{label:e.target.value}),placeholder:`Подпись варианта`,className:`text-xs py-1`}),(0,D.jsx)(m,{value:e.value,onChange:e=>X(t,{value:e.target.value}),placeholder:`Код значения`,className:`text-xs py-1 w-32 font-mono`}),(0,D.jsx)(`input`,{type:`color`,value:e.color||`#2F684C`,onChange:e=>X(t,{color:e.target.value}),className:`w-7 h-7 rounded border border-krona-border cursor-pointer p-0 shrink-0`,title:`Цвет бейджа`}),(0,D.jsx)(`button`,{type:`button`,onClick:()=>Z(t),className:`p-1 text-krona-danger hover:bg-krona-danger/10 rounded`,children:(0,D.jsx)(x,{className:`w-3.5 h-3.5`})})]},t))})]}),(0,D.jsxs)(`div`,{className:`space-y-2 p-3.5 bg-krona-workspace rounded-xl border border-krona-border/60`,children:[(0,D.jsx)(`h4`,{className:`text-xs font-bold text-krona-primary uppercase tracking-wider mb-2`,children:`Правила валидации (Validation Rules)`}),(0,D.jsxs)(`div`,{className:`grid grid-cols-2 gap-3`,children:[(0,D.jsx)(m,{label:`Мин. значение / длина`,type:`number`,value:B.validation?.min??B.validation?.minLength??``,onChange:e=>V(t=>({...t,validation:{...t.validation,min:Number(e.target.value)}}))}),(0,D.jsx)(m,{label:`Макс. значение / длина`,type:`number`,value:B.validation?.max??B.validation?.maxLength??``,onChange:e=>V(t=>({...t,validation:{...t.validation,max:Number(e.target.value)}}))})]}),(0,D.jsx)(m,{label:`RegEx паттерн проверки`,value:B.validation?.pattern||``,onChange:e=>V(t=>({...t,validation:{...t.validation,pattern:e.target.value}})),placeholder:`^[A-Z0-9_-]+$`,className:`font-mono text-xs`})]}),(0,D.jsxs)(`div`,{className:`flex justify-end gap-2 pt-4 border-t border-krona-border/60`,children:[(0,D.jsx)(n,{variant:`outline`,size:`md`,onClick:()=>P(!1),children:`Отмена`}),(0,D.jsx)(n,{variant:`primary`,size:`md`,onClick:K,children:`Сохранить поле`})]})]})})]})};export{O as FieldBuilder,O as default}; \ No newline at end of file diff --git a/dist/assets/FinanceModule-D-3_6PUg.js b/dist/assets/FinanceModule-D-3_6PUg.js new file mode 100644 index 0000000..a6c97f9 --- /dev/null +++ b/dist/assets/FinanceModule-D-3_6PUg.js @@ -0,0 +1 @@ +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{t as s}from"./building-BdUpGLM5.js";import{R as c,T as l,X as u,Z as d,b as f,c as p,l as m,lt as h,ot as g,r as _,rt as v,t as y}from"./index-CrJKtV0u.js";import{t as b}from"./currency-DdDs82F5.js";var x={name:`arrow-down-left`,size:24,node:[[`path`,{d:`M17 7 7 17`,key:`15tmo1`}],[`path`,{d:`M17 17H7V7`,key:`1org7z`}]]};x.node;var S=r(x),C={name:`chart-pie`,size:24,node:[[`path`,{d:`M21 12c.552 0 1.005-.449.95-.998a10 10 0 0 0-8.953-8.951c-.55-.055-.998.398-.998.95v8a1 1 0 0 0 1 1z`,key:`pzmjnu`}],[`path`,{d:`M21.21 15.89A10 10 0 1 1 8 2.83`,key:`k2fpak`}]],aliases:[`pie-chart`]};C.node;var w=r(C),T={name:`wallet`,size:24,node:[[`path`,{d:`M19 7V4a1 1 0 0 0-1-1H5a2 2 0 0 0 0 4h15a1 1 0 0 1 1 1v4h-3a2 2 0 0 0 0 4h3a1 1 0 0 0 1-1v-2a1 1 0 0 0-1-1`,key:`18etb6`}],[`path`,{d:`M3 5v14a2 2 0 0 0 2 2h15a1 1 0 0 0 1-1v-4`,key:`xoc0q4`}]]};T.node;var E=r(T),D=t(e(),1);function O(){let[e,t]=(0,D.useState)([]),[n,r]=(0,D.useState)([]),[i,a]=(0,D.useState)(null),[o,s]=(0,D.useState)(!0),[c,l]=(0,D.useState)(null),u=(0,D.useCallback)(async()=>{try{s(!0),l(null);let[e,n,i]=await Promise.all([g.accounts.list({pageSize:50}),g.transactions.list({pageSize:200}),g.getPnLMetrics()]);t(e.items),r(n.items),a(i)}catch(e){l(e instanceof Error?e:Error(String(e)))}finally{s(!1)}},[]);return(0,D.useEffect)(()=>{let e=!0;return Promise.resolve().then(()=>{e&&u()}),()=>{e=!1}},[u]),v(`records:changed`,e=>{(e.entityType===`account`||e.entityType===`cash_flow_transaction`||e.entityType===`payment`)&&u()}),v(`storage:reset`,u),v(`snapshot:imported`,u),{accounts:e,transactions:n,pnlMetrics:i,loading:o,error:c,refetch:u,createTransactionFromPayment:(0,D.useCallback)(async(e,t,n)=>g.createTransactionFromPayment(e,t,n),[]),createTransactionFromReturn:(0,D.useCallback)(async(e,t,n)=>g.createTransactionFromReturn(e,t,n),[]),createManualTransaction:(0,D.useCallback)(async(e,t,n,r,i)=>{let a=await g.accounts.getById(r),o=a?.name||`Банковский счет`,s=await g.transactions.create({transactionNumber:`CFT-${Date.now().toString().slice(-6)}`,type:e,category:t,amount:n,accountId:r,accountName:o,description:i,timestamp:new Date().toISOString()});if(a){let t=e===`inflow`?a.balance.minor+n.minor:Math.max(0,a.balance.minor-n.minor);await g.accounts.update(r,{balance:{minor:t,currency:a.balance.currency}})}return s},[])}}var k=a(),A=()=>{let{showToast:e}=o(),{accounts:t,transactions:r,pnlMetrics:a,createManualTransaction:g}=O(),[v,x]=(0,D.useState)(`transactions`),[C,T]=(0,D.useState)(``),[A,j]=(0,D.useState)(`all`),[M,N]=(0,D.useState)(!1),[P,F]=(0,D.useState)(`inflow`),[I,L]=(0,D.useState)(`sales_revenue`),[R,z]=(0,D.useState)(15e5),[B,V]=(0,D.useState)(``),[H,U]=(0,D.useState)(``),W=(0,D.useMemo)(()=>r.filter(e=>e.type===`inflow`).reduce((e,t)=>e+t.amount.minor,0),[r]),G=(0,D.useMemo)(()=>r.filter(e=>e.type===`outflow`).reduce((e,t)=>e+t.amount.minor,0),[r]),K=W-G,q=(0,D.useMemo)(()=>[...r].filter(e=>{let t=A===`all`||e.type===A,n=!C||e.description.toLowerCase().includes(C.toLowerCase())||e.transactionNumber.toLowerCase().includes(C.toLowerCase())||e.accountName.toLowerCase().includes(C.toLowerCase());return t&&n}).sort((e,t)=>t.timestamp>e.timestamp?1:-1),[r,A,C]),J=async n=>{n.preventDefault();let r=B||t[0]?.id||`acc_default`;try{await g(P,I,{minor:R,currency:`RUB`},r,H||(P===`inflow`?`Внереализационный доход`:`Хозяйственные расходы`)),e(`Финансовая проводка успешно записана в ДДС!`,`success`),N(!1),U(``)}catch(t){e(`Ошибка: ${t instanceof Error?t.message:String(t)}`,`error`)}},Y=e=>{switch(e){case`sales_revenue`:return`Выручка от продаж (Заказ)`;case`refund`:return`Возврат клиенту (Заказ)`;case`supplier_payment`:return`Оплата поставщику`;case`payroll`:return`Заработная плата`;case`rent`:return`Аренда помещений`;case`taxes`:return`Налоги и сборы`;case`utilities`:return`Коммунальные услуги`;default:return`Прочие операции`}};return(0,k.jsxs)(`div`,{className:`space-y-4 animate-fade-in`,children:[(0,k.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,k.jsxs)(`div`,{children:[(0,k.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,k.jsx)(`h1`,{className:`text-sm font-bold text-krona-primary`,children:`Финансы, Казначейство & ДДС (Cash Flow)`}),(0,k.jsx)(y,{level:`pilot1`,size:`sm`})]}),(0,k.jsx)(`p`,{className:`text-xs text-krona-secondary mt-0.5`,children:`Сквозной учет движения денежных средств (ДДС): автоматические платежи и возвраты по заказам, балансы расчетных счетов`})]}),(0,k.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,k.jsxs)(n,{variant:`secondary`,size:`sm`,onClick:()=>{F(`outflow`),L(`supplier_payment`),N(!0)},children:[(0,k.jsx)(l,{className:`w-3.5 h-3.5 mr-1`}),` Расходный ордер`]}),(0,k.jsxs)(n,{variant:`primary`,size:`sm`,onClick:()=>{F(`inflow`),L(`sales_revenue`),N(!0)},children:[(0,k.jsx)(l,{className:`w-3.5 h-3.5 mr-1`}),` Приход денег`]})]})]}),(0,k.jsxs)(`div`,{className:`grid grid-cols-1 sm:grid-cols-4 gap-3.5`,children:[(0,k.jsxs)(`div`,{className:`bg-krona-surface border border-krona-border rounded-xl p-4 shadow-krona-soft`,children:[(0,k.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,k.jsx)(`span`,{className:`text-xs text-krona-secondary font-medium`,children:`Поступления (Inflow)`}),(0,k.jsx)(`div`,{className:`w-7 h-7 rounded-lg bg-emerald-500/10 text-emerald-600 dark:text-emerald-400 flex items-center justify-center`,children:(0,k.jsx)(p,{className:`w-4 h-4`})})]}),(0,k.jsx)(`div`,{className:`text-xl font-bold text-krona-green mt-2`,children:b(W)}),(0,k.jsx)(`div`,{className:`text-[11px] text-krona-secondary mt-1`,children:`Оплаты заказов и выручка`})]}),(0,k.jsxs)(`div`,{className:`bg-krona-surface border border-krona-border rounded-xl p-4 shadow-krona-soft`,children:[(0,k.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,k.jsx)(`span`,{className:`text-xs text-krona-secondary font-medium`,children:`Выплаты (Outflow)`}),(0,k.jsx)(`div`,{className:`w-7 h-7 rounded-lg bg-rose-500/10 text-rose-600 dark:text-rose-400 flex items-center justify-center`,children:(0,k.jsx)(m,{className:`w-4 h-4`})})]}),(0,k.jsx)(`div`,{className:`text-xl font-bold text-rose-600 dark:text-rose-400 mt-2`,children:b(G)}),(0,k.jsx)(`div`,{className:`text-[11px] text-krona-secondary mt-1`,children:`Возвраты, закупки, расходы`})]}),(0,k.jsxs)(`div`,{className:`bg-krona-surface border border-krona-border rounded-xl p-4 shadow-krona-soft`,children:[(0,k.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,k.jsx)(`span`,{className:`text-xs text-krona-secondary font-medium`,children:`Чистый поток (Net Cash Flow)`}),(0,k.jsx)(`div`,{className:`w-7 h-7 rounded-lg bg-[#2F684C]/10 text-krona-primary flex items-center justify-center`,children:(0,k.jsx)(u,{className:`w-4 h-4`})})]}),(0,k.jsx)(`div`,{className:`text-xl font-bold mt-2 ${K>=0?`text-krona-green`:`text-rose-600 dark:text-rose-400`}`,children:b(K)}),(0,k.jsx)(`div`,{className:`text-[11px] text-krona-secondary mt-1`,children:`Сальдо движения денег`})]}),(0,k.jsxs)(`div`,{className:`bg-krona-surface border border-krona-border rounded-xl p-4 shadow-krona-soft`,children:[(0,k.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,k.jsx)(`span`,{className:`text-xs text-krona-secondary font-medium`,children:`Рентабельность (P&L Margin)`}),(0,k.jsx)(`div`,{className:`w-7 h-7 rounded-lg bg-amber-500/10 text-amber-600 flex items-center justify-center`,children:(0,k.jsx)(w,{className:`w-4 h-4`})})]}),(0,k.jsx)(`div`,{className:`text-xl font-bold text-krona-primary mt-2`,children:a?`${a.operatingMarginPercent}%`:`58.0%`}),(0,k.jsx)(`div`,{className:`text-[11px] text-krona-secondary mt-1`,children:`Маржинальность операций`})]})]}),(0,k.jsx)(`div`,{className:`grid grid-cols-1 sm:grid-cols-3 gap-3`,children:t.map(e=>(0,k.jsxs)(`div`,{className:`bg-krona-surface border border-krona-border rounded-xl p-3.5 shadow-krona-soft flex items-center justify-between`,children:[(0,k.jsxs)(`div`,{className:`flex items-center gap-3`,children:[(0,k.jsx)(`div`,{className:`w-9 h-9 rounded-lg bg-krona-workspace text-krona-primary flex items-center justify-center border border-krona-border`,children:e.type===`bank`?(0,k.jsx)(s,{className:`w-4 h-4`}):e.type===`cash_desk`?(0,k.jsx)(E,{className:`w-4 h-4`}):(0,k.jsx)(c,{className:`w-4 h-4`})}),(0,k.jsxs)(`div`,{children:[(0,k.jsx)(`div`,{className:`text-xs font-bold text-krona-primary`,children:e.name}),(0,k.jsx)(`div`,{className:`text-[11px] text-krona-secondary`,children:e.type===`bank`?`Расчетный счет`:e.type===`cash_desk`?`Операционная касса`:`Эквайринг`})]})]}),(0,k.jsxs)(`div`,{className:`text-right`,children:[(0,k.jsx)(`div`,{className:`text-sm font-bold text-krona-green`,children:b(e.balance.minor)}),(0,k.jsx)(i,{variant:e.isDefault?`gold`:`gray`,size:`sm`,children:e.isDefault?`Основной`:`Активен`})]})]},e.id))}),(0,k.jsxs)(`div`,{className:`flex flex-col sm:flex-row sm:items-center justify-between gap-3`,children:[(0,k.jsxs)(`div`,{className:`flex items-center gap-1.5 overflow-x-auto text-xs`,children:[(0,k.jsxs)(`button`,{onClick:()=>x(`transactions`),className:`px-3 py-1.5 rounded-lg font-medium transition-colors ${v===`transactions`?`bg-krona-green text-white shadow-sm`:`bg-krona-surface text-krona-secondary hover:text-krona-primary border border-krona-border`}`,children:[`Движение денежных средств (ДДС) (`,r.length,`)`]}),(0,k.jsx)(`button`,{onClick:()=>x(`pnl`),className:`px-3 py-1.5 rounded-lg font-medium transition-colors ${v===`pnl`?`bg-krona-green text-white shadow-sm`:`bg-krona-surface text-krona-secondary hover:text-krona-primary border border-krona-border`}`,children:`Отчет о прибылях и убытках (P&L)`}),(0,k.jsxs)(`button`,{onClick:()=>x(`accounts`),className:`px-3 py-1.5 rounded-lg font-medium transition-colors ${v===`accounts`?`bg-krona-green text-white shadow-sm`:`bg-krona-surface text-krona-secondary hover:text-krona-primary border border-krona-border`}`,children:[`Банковские счета и кассы (`,t.length,`)`]})]}),v===`transactions`&&(0,k.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,k.jsxs)(`select`,{value:A,onChange:e=>j(e.target.value),className:`px-2.5 py-1.5 text-xs bg-krona-surface border border-krona-border rounded-lg text-krona-primary focus:outline-none`,children:[(0,k.jsx)(`option`,{value:`all`,children:`Все операции`}),(0,k.jsx)(`option`,{value:`inflow`,children:`Только приход (+)`}),(0,k.jsx)(`option`,{value:`outflow`,children:`Только расход (-)`})]}),(0,k.jsxs)(`div`,{className:`relative w-56`,children:[(0,k.jsx)(f,{className:`w-3.5 h-3.5 absolute left-2.5 top-2.5 text-krona-secondary`}),(0,k.jsx)(`input`,{type:`text`,value:C,onChange:e=>T(e.target.value),placeholder:`Поиск по описанию, счету...`,className:`w-full pl-8 pr-3 py-1.5 text-xs bg-krona-surface border border-krona-border rounded-lg text-krona-primary focus:outline-none`})]})]})]}),v===`transactions`&&(0,k.jsx)(`div`,{className:`bg-krona-surface border border-krona-border rounded-xl shadow-krona-soft overflow-hidden`,children:(0,k.jsxs)(`table`,{className:`w-full text-xs text-left`,children:[(0,k.jsx)(`thead`,{className:`bg-krona-workspace text-krona-secondary border-b border-krona-border`,children:(0,k.jsxs)(`tr`,{children:[(0,k.jsx)(`th`,{className:`p-3 font-semibold`,children:`Номер транзакции`}),(0,k.jsx)(`th`,{className:`p-3 font-semibold`,children:`Дата и время`}),(0,k.jsx)(`th`,{className:`p-3 font-semibold`,children:`Тип операции`}),(0,k.jsx)(`th`,{className:`p-3 font-semibold`,children:`Статья / Категория`}),(0,k.jsx)(`th`,{className:`p-3 font-semibold`,children:`Счет / Касса`}),(0,k.jsx)(`th`,{className:`p-3 font-semibold`,children:`Основание / Описание`}),(0,k.jsx)(`th`,{className:`p-3 font-semibold text-right`,children:`Сумма`})]})}),(0,k.jsxs)(`tbody`,{className:`divide-y divide-krona-border`,children:[q.map(e=>(0,k.jsxs)(`tr`,{className:`hover:bg-krona-workspace/50 transition-colors`,children:[(0,k.jsx)(`td`,{className:`p-3 font-mono font-bold text-krona-primary`,children:e.transactionNumber}),(0,k.jsx)(`td`,{className:`p-3 font-mono text-krona-secondary`,children:h(e.timestamp)}),(0,k.jsx)(`td`,{className:`p-3`,children:e.type===`inflow`?(0,k.jsxs)(`span`,{className:`inline-flex items-center gap-1 font-bold text-emerald-600 dark:text-emerald-400 bg-emerald-500/10 px-2 py-0.5 rounded text-[11px]`,children:[(0,k.jsx)(S,{className:`w-3 h-3`}),` Приход (+)`]}):(0,k.jsxs)(`span`,{className:`inline-flex items-center gap-1 font-bold text-rose-600 dark:text-rose-400 bg-rose-500/10 px-2 py-0.5 rounded text-[11px]`,children:[(0,k.jsx)(d,{className:`w-3 h-3`}),` Расход (-)`]})}),(0,k.jsx)(`td`,{className:`p-3 text-krona-primary font-medium`,children:Y(e.category)}),(0,k.jsx)(`td`,{className:`p-3 text-krona-secondary`,children:e.accountName}),(0,k.jsx)(`td`,{className:`p-3 text-krona-secondary`,children:e.description}),(0,k.jsx)(`td`,{className:`p-3 text-right font-bold font-mono`,children:(0,k.jsxs)(`span`,{className:e.type===`inflow`?`text-krona-green`:`text-rose-600 dark:text-rose-400`,children:[e.type===`inflow`?`+`:`-`,b(e.amount.minor)]})})]},e.id)),q.length===0&&(0,k.jsx)(`tr`,{children:(0,k.jsx)(`td`,{colSpan:7,className:`p-8 text-center text-krona-secondary text-xs italic`,children:`Финансовые проводки не найдены`})})]})]})}),v===`pnl`&&(0,k.jsxs)(`div`,{className:`bg-krona-surface border border-krona-border rounded-xl shadow-krona-soft p-5 space-y-4 max-w-3xl`,children:[(0,k.jsxs)(`div`,{className:`border-b border-krona-border pb-3`,children:[(0,k.jsx)(`h2`,{className:`text-sm font-bold text-krona-primary`,children:`Отчет о финансовых результатах (P&L / ОПУ)`}),(0,k.jsx)(`p`,{className:`text-xs text-krona-secondary mt-0.5`,children:`Текущий отчетный период на базе реальных проведенных операций в системе Krona`})]}),(0,k.jsxs)(`div`,{className:`space-y-2 text-xs`,children:[(0,k.jsxs)(`div`,{className:`flex justify-between items-center py-2 border-b border-krona-border/60`,children:[(0,k.jsx)(`span`,{className:`font-semibold text-krona-primary`,children:`1. Выручка от продаж (Revenue)`}),(0,k.jsx)(`span`,{className:`font-bold text-krona-green text-sm`,children:b(a?.revenue.minor||W)})]}),(0,k.jsxs)(`div`,{className:`flex justify-between items-center py-2 border-b border-krona-border/60 text-krona-secondary pl-4`,children:[(0,k.jsx)(`span`,{children:`Себестоимость проданных товаров (COGS, 42%)`}),(0,k.jsxs)(`span`,{children:[`-`,b(a?.costOfGoodsSold.minor||Math.round(W*.42))]})]}),(0,k.jsxs)(`div`,{className:`flex justify-between items-center py-2 bg-krona-workspace px-3 rounded-lg font-bold text-krona-primary`,children:[(0,k.jsx)(`span`,{children:`2. Валовая прибыль (Gross Profit)`}),(0,k.jsx)(`span`,{className:`text-krona-green`,children:b(a?.grossProfit.minor||Math.round(W*.58))})]}),(0,k.jsxs)(`div`,{className:`flex justify-between items-center py-2 border-b border-krona-border/60 text-krona-secondary pl-4`,children:[(0,k.jsx)(`span`,{children:`Операционные и административные расходы (OPEX)`}),(0,k.jsxs)(`span`,{children:[`-`,b(a?.operatingExpenses.minor||G)]})]}),(0,k.jsxs)(`div`,{className:`flex justify-between items-center py-3 bg-emerald-500/10 px-4 rounded-xl font-bold text-sm text-krona-primary border border-emerald-500/30`,children:[(0,k.jsxs)(`div`,{children:[(0,k.jsx)(`div`,{children:`3. Чистая прибыль (Net Profit)`}),(0,k.jsxs)(`div`,{className:`text-[11px] font-normal text-krona-secondary`,children:[`Рентабельность: `,a?.operatingMarginPercent||58,`%`]})]}),(0,k.jsx)(`div`,{className:`text-krona-green text-base`,children:b(a?.netProfit.minor||W-G)})]})]})]}),v===`accounts`&&(0,k.jsx)(`div`,{className:`bg-krona-surface border border-krona-border rounded-xl shadow-krona-soft overflow-hidden`,children:(0,k.jsxs)(`table`,{className:`w-full text-xs text-left`,children:[(0,k.jsx)(`thead`,{className:`bg-krona-workspace text-krona-secondary border-b border-krona-border`,children:(0,k.jsxs)(`tr`,{children:[(0,k.jsx)(`th`,{className:`p-3 font-semibold`,children:`Наименование счета`}),(0,k.jsx)(`th`,{className:`p-3 font-semibold`,children:`Тип счета`}),(0,k.jsx)(`th`,{className:`p-3 font-semibold`,children:`Банк`}),(0,k.jsx)(`th`,{className:`p-3 font-semibold`,children:`Номер счета`}),(0,k.jsx)(`th`,{className:`p-3 font-semibold`,children:`Текущий баланс`}),(0,k.jsx)(`th`,{className:`p-3 font-semibold text-center`,children:`Статус`})]})}),(0,k.jsx)(`tbody`,{className:`divide-y divide-krona-border`,children:t.map(e=>(0,k.jsxs)(`tr`,{className:`hover:bg-krona-workspace/50 transition-colors`,children:[(0,k.jsx)(`td`,{className:`p-3 font-bold text-krona-primary`,children:e.name}),(0,k.jsx)(`td`,{className:`p-3 text-krona-secondary`,children:e.type===`bank`?`Расчетный счет`:e.type===`cash_desk`?`Касса`:`Эквайринг`}),(0,k.jsx)(`td`,{className:`p-3 text-krona-secondary`,children:e.bankName||`ПАО Сбербанк`}),(0,k.jsx)(`td`,{className:`p-3 font-mono text-krona-secondary`,children:e.accountNumber||`40702810900000012345`}),(0,k.jsx)(`td`,{className:`p-3 font-bold text-krona-green text-sm`,children:b(e.balance.minor)}),(0,k.jsx)(`td`,{className:`p-3 text-center`,children:(0,k.jsx)(i,{variant:e.isDefault?`gold`:`green`,size:`sm`,children:e.isDefault?`Основной`:`Активен`})})]},e.id))})]})}),(0,k.jsx)(_,{isOpen:M,onClose:()=>N(!1),title:P===`inflow`?`Оформление прихода денежных средств`:`Оформление расходного кассового ордера`,size:`md`,children:(0,k.jsxs)(`form`,{onSubmit:J,className:`space-y-4 text-xs`,children:[(0,k.jsxs)(`div`,{children:[(0,k.jsx)(`label`,{className:`block font-semibold text-krona-primary mb-1`,children:`Счет / Касса:`}),(0,k.jsx)(`select`,{value:B,onChange:e=>V(e.target.value),className:`w-full px-3 py-1.5 bg-krona-workspace border border-krona-border rounded-lg text-krona-primary`,children:t.map(e=>(0,k.jsxs)(`option`,{value:e.id,children:[e.name,` (остаток: `,b(e.balance.minor),`)`]},e.id))})]}),(0,k.jsxs)(`div`,{children:[(0,k.jsx)(`label`,{className:`block font-semibold text-krona-primary mb-1`,children:`Категория операции:`}),(0,k.jsx)(`select`,{value:I,onChange:e=>L(e.target.value),className:`w-full px-3 py-1.5 bg-krona-workspace border border-krona-border rounded-lg text-krona-primary`,children:P===`inflow`?(0,k.jsxs)(k.Fragment,{children:[(0,k.jsx)(`option`,{value:`sales_revenue`,children:`Выручка от продаж`}),(0,k.jsx)(`option`,{value:`other`,children:`Прочие поступления`})]}):(0,k.jsxs)(k.Fragment,{children:[(0,k.jsx)(`option`,{value:`supplier_payment`,children:`Оплата поставщику`}),(0,k.jsx)(`option`,{value:`refund`,children:`Возврат средств покупателю`}),(0,k.jsx)(`option`,{value:`payroll`,children:`Заработная плата`}),(0,k.jsx)(`option`,{value:`rent`,children:`Аренда`}),(0,k.jsx)(`option`,{value:`taxes`,children:`Налоги`}),(0,k.jsx)(`option`,{value:`utilities`,children:`Коммунальные платежи`}),(0,k.jsx)(`option`,{value:`other`,children:`Хозяйственные расходы`})]})})]}),(0,k.jsxs)(`div`,{children:[(0,k.jsx)(`label`,{className:`block font-semibold text-krona-primary mb-1`,children:`Сумма (в копейках):`}),(0,k.jsx)(`input`,{type:`number`,min:100,step:100,value:R,onChange:e=>z(Number(e.target.value)||0),className:`w-full px-3 py-1.5 bg-krona-workspace border border-krona-border rounded-lg text-krona-primary font-bold`}),(0,k.jsxs)(`div`,{className:`text-[11px] text-krona-secondary mt-1`,children:[`Эквивалент:`,` `,(0,k.jsx)(`strong`,{className:`text-krona-green`,children:b(R)})]})]}),(0,k.jsxs)(`div`,{children:[(0,k.jsx)(`label`,{className:`block font-semibold text-krona-primary mb-1`,children:`Назначение платежа / Комментарий:`}),(0,k.jsx)(`input`,{type:`text`,required:!0,value:H,onChange:e=>U(e.target.value),placeholder:`Например: Оплата счета за кофе по договору...`,className:`w-full px-3 py-1.5 bg-krona-workspace border border-krona-border rounded-lg text-krona-primary`})]}),(0,k.jsxs)(`div`,{className:`flex justify-end gap-2 pt-2 border-t border-krona-border`,children:[(0,k.jsx)(n,{variant:`secondary`,size:`sm`,type:`button`,onClick:()=>N(!1),children:`Отмена`}),(0,k.jsx)(n,{variant:`primary`,size:`sm`,type:`submit`,children:`Провести операцию`})]})]})})]})};export{A as FinanceModule}; \ No newline at end of file diff --git a/dist/assets/FinanceModule-DiPGlGDb.js b/dist/assets/FinanceModule-DiPGlGDb.js deleted file mode 100644 index 5721a6a..0000000 --- a/dist/assets/FinanceModule-DiPGlGDb.js +++ /dev/null @@ -1 +0,0 @@ -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{t as s}from"./building-BdUpGLM5.js";import{J as c,L as l,Y as u,c as d,it as f,l as p,r as m,st as h,t as g,tt as _,w as v,y}from"./index-CNnq9VO5.js";import{t as b}from"./currency-DdDs82F5.js";var x={name:`arrow-down-left`,size:24,node:[[`path`,{d:`M17 7 7 17`,key:`15tmo1`}],[`path`,{d:`M17 17H7V7`,key:`1org7z`}]]};x.node;var S=r(x),C={name:`chart-pie`,size:24,node:[[`path`,{d:`M21 12c.552 0 1.005-.449.95-.998a10 10 0 0 0-8.953-8.951c-.55-.055-.998.398-.998.95v8a1 1 0 0 0 1 1z`,key:`pzmjnu`}],[`path`,{d:`M21.21 15.89A10 10 0 1 1 8 2.83`,key:`k2fpak`}]],aliases:[`pie-chart`]};C.node;var w=r(C),T={name:`wallet`,size:24,node:[[`path`,{d:`M19 7V4a1 1 0 0 0-1-1H5a2 2 0 0 0 0 4h15a1 1 0 0 1 1 1v4h-3a2 2 0 0 0 0 4h3a1 1 0 0 0 1-1v-2a1 1 0 0 0-1-1`,key:`18etb6`}],[`path`,{d:`M3 5v14a2 2 0 0 0 2 2h15a1 1 0 0 0 1-1v-4`,key:`xoc0q4`}]]};T.node;var E=r(T),D=t(e(),1);function O(){let[e,t]=(0,D.useState)([]),[n,r]=(0,D.useState)([]),[i,a]=(0,D.useState)(null),[o,s]=(0,D.useState)(!0),[c,l]=(0,D.useState)(null),u=(0,D.useCallback)(async()=>{try{s(!0),l(null);let[e,n,i]=await Promise.all([f.accounts.list({pageSize:50}),f.transactions.list({pageSize:200}),f.getPnLMetrics()]);t(e.items),r(n.items),a(i)}catch(e){l(e instanceof Error?e:Error(String(e)))}finally{s(!1)}},[]);return(0,D.useEffect)(()=>{let e=!0;return Promise.resolve().then(()=>{e&&u()}),()=>{e=!1}},[u]),_(`records:changed`,e=>{(e.entityType===`account`||e.entityType===`cash_flow_transaction`||e.entityType===`payment`)&&u()}),_(`storage:reset`,u),_(`snapshot:imported`,u),{accounts:e,transactions:n,pnlMetrics:i,loading:o,error:c,refetch:u,createTransactionFromPayment:(0,D.useCallback)(async(e,t,n)=>f.createTransactionFromPayment(e,t,n),[]),createTransactionFromReturn:(0,D.useCallback)(async(e,t,n)=>f.createTransactionFromReturn(e,t,n),[]),createManualTransaction:(0,D.useCallback)(async(e,t,n,r,i)=>{let a=await f.accounts.getById(r),o=a?.name||`Банковский счет`,s=await f.transactions.create({transactionNumber:`CFT-${Date.now().toString().slice(-6)}`,type:e,category:t,amount:n,accountId:r,accountName:o,description:i,timestamp:new Date().toISOString()});if(a){let t=e===`inflow`?a.balance.minor+n.minor:Math.max(0,a.balance.minor-n.minor);await f.accounts.update(r,{balance:{minor:t,currency:a.balance.currency}})}return s},[])}}var k=a(),A=()=>{let{showToast:e}=o(),{accounts:t,transactions:r,pnlMetrics:a,createManualTransaction:f}=O(),[_,x]=(0,D.useState)(`transactions`),[C,T]=(0,D.useState)(``),[A,j]=(0,D.useState)(`all`),[M,N]=(0,D.useState)(!1),[P,F]=(0,D.useState)(`inflow`),[I,L]=(0,D.useState)(`sales_revenue`),[R,z]=(0,D.useState)(15e5),[B,V]=(0,D.useState)(``),[H,U]=(0,D.useState)(``),W=(0,D.useMemo)(()=>r.filter(e=>e.type===`inflow`).reduce((e,t)=>e+t.amount.minor,0),[r]),G=(0,D.useMemo)(()=>r.filter(e=>e.type===`outflow`).reduce((e,t)=>e+t.amount.minor,0),[r]),K=W-G,q=(0,D.useMemo)(()=>[...r].filter(e=>{let t=A===`all`||e.type===A,n=!C||e.description.toLowerCase().includes(C.toLowerCase())||e.transactionNumber.toLowerCase().includes(C.toLowerCase())||e.accountName.toLowerCase().includes(C.toLowerCase());return t&&n}).sort((e,t)=>t.timestamp>e.timestamp?1:-1),[r,A,C]),J=async n=>{n.preventDefault();let r=B||t[0]?.id||`acc_default`;try{await f(P,I,{minor:R,currency:`RUB`},r,H||(P===`inflow`?`Внереализационный доход`:`Хозяйственные расходы`)),e(`Финансовая проводка успешно записана в ДДС!`,`success`),N(!1),U(``)}catch(t){e(`Ошибка: ${t instanceof Error?t.message:String(t)}`,`error`)}},Y=e=>{switch(e){case`sales_revenue`:return`Выручка от продаж (Заказ)`;case`refund`:return`Возврат клиенту (Заказ)`;case`supplier_payment`:return`Оплата поставщику`;case`payroll`:return`Заработная плата`;case`rent`:return`Аренда помещений`;case`taxes`:return`Налоги и сборы`;case`utilities`:return`Коммунальные услуги`;default:return`Прочие операции`}};return(0,k.jsxs)(`div`,{className:`space-y-4 animate-fade-in`,children:[(0,k.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,k.jsxs)(`div`,{children:[(0,k.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,k.jsx)(`h1`,{className:`text-sm font-bold text-krona-primary`,children:`Финансы, Казначейство & ДДС (Cash Flow)`}),(0,k.jsx)(g,{level:`pilot1`,size:`sm`})]}),(0,k.jsx)(`p`,{className:`text-xs text-krona-secondary mt-0.5`,children:`Сквозной учет движения денежных средств (ДДС): автоматические платежи и возвраты по заказам, балансы расчетных счетов`})]}),(0,k.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,k.jsxs)(n,{variant:`secondary`,size:`sm`,onClick:()=>{F(`outflow`),L(`supplier_payment`),N(!0)},children:[(0,k.jsx)(v,{className:`w-3.5 h-3.5 mr-1`}),` Расходный ордер`]}),(0,k.jsxs)(n,{variant:`primary`,size:`sm`,onClick:()=>{F(`inflow`),L(`sales_revenue`),N(!0)},children:[(0,k.jsx)(v,{className:`w-3.5 h-3.5 mr-1`}),` Приход денег`]})]})]}),(0,k.jsxs)(`div`,{className:`grid grid-cols-1 sm:grid-cols-4 gap-3.5`,children:[(0,k.jsxs)(`div`,{className:`bg-krona-surface border border-krona-border rounded-xl p-4 shadow-krona-soft`,children:[(0,k.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,k.jsx)(`span`,{className:`text-xs text-krona-secondary font-medium`,children:`Поступления (Inflow)`}),(0,k.jsx)(`div`,{className:`w-7 h-7 rounded-lg bg-emerald-500/10 text-emerald-600 dark:text-emerald-400 flex items-center justify-center`,children:(0,k.jsx)(d,{className:`w-4 h-4`})})]}),(0,k.jsx)(`div`,{className:`text-xl font-bold text-krona-green mt-2`,children:b(W)}),(0,k.jsx)(`div`,{className:`text-[11px] text-krona-secondary mt-1`,children:`Оплаты заказов и выручка`})]}),(0,k.jsxs)(`div`,{className:`bg-krona-surface border border-krona-border rounded-xl p-4 shadow-krona-soft`,children:[(0,k.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,k.jsx)(`span`,{className:`text-xs text-krona-secondary font-medium`,children:`Выплаты (Outflow)`}),(0,k.jsx)(`div`,{className:`w-7 h-7 rounded-lg bg-rose-500/10 text-rose-600 dark:text-rose-400 flex items-center justify-center`,children:(0,k.jsx)(p,{className:`w-4 h-4`})})]}),(0,k.jsx)(`div`,{className:`text-xl font-bold text-rose-600 dark:text-rose-400 mt-2`,children:b(G)}),(0,k.jsx)(`div`,{className:`text-[11px] text-krona-secondary mt-1`,children:`Возвраты, закупки, расходы`})]}),(0,k.jsxs)(`div`,{className:`bg-krona-surface border border-krona-border rounded-xl p-4 shadow-krona-soft`,children:[(0,k.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,k.jsx)(`span`,{className:`text-xs text-krona-secondary font-medium`,children:`Чистый поток (Net Cash Flow)`}),(0,k.jsx)(`div`,{className:`w-7 h-7 rounded-lg bg-[#2F684C]/10 text-krona-primary flex items-center justify-center`,children:(0,k.jsx)(c,{className:`w-4 h-4`})})]}),(0,k.jsx)(`div`,{className:`text-xl font-bold mt-2 ${K>=0?`text-krona-green`:`text-rose-600 dark:text-rose-400`}`,children:b(K)}),(0,k.jsx)(`div`,{className:`text-[11px] text-krona-secondary mt-1`,children:`Сальдо движения денег`})]}),(0,k.jsxs)(`div`,{className:`bg-krona-surface border border-krona-border rounded-xl p-4 shadow-krona-soft`,children:[(0,k.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,k.jsx)(`span`,{className:`text-xs text-krona-secondary font-medium`,children:`Рентабельность (P&L Margin)`}),(0,k.jsx)(`div`,{className:`w-7 h-7 rounded-lg bg-amber-500/10 text-amber-600 flex items-center justify-center`,children:(0,k.jsx)(w,{className:`w-4 h-4`})})]}),(0,k.jsx)(`div`,{className:`text-xl font-bold text-krona-primary mt-2`,children:a?`${a.operatingMarginPercent}%`:`58.0%`}),(0,k.jsx)(`div`,{className:`text-[11px] text-krona-secondary mt-1`,children:`Маржинальность операций`})]})]}),(0,k.jsx)(`div`,{className:`grid grid-cols-1 sm:grid-cols-3 gap-3`,children:t.map(e=>(0,k.jsxs)(`div`,{className:`bg-krona-surface border border-krona-border rounded-xl p-3.5 shadow-krona-soft flex items-center justify-between`,children:[(0,k.jsxs)(`div`,{className:`flex items-center gap-3`,children:[(0,k.jsx)(`div`,{className:`w-9 h-9 rounded-lg bg-krona-workspace text-krona-primary flex items-center justify-center border border-krona-border`,children:e.type===`bank`?(0,k.jsx)(s,{className:`w-4 h-4`}):e.type===`cash_desk`?(0,k.jsx)(E,{className:`w-4 h-4`}):(0,k.jsx)(l,{className:`w-4 h-4`})}),(0,k.jsxs)(`div`,{children:[(0,k.jsx)(`div`,{className:`text-xs font-bold text-krona-primary`,children:e.name}),(0,k.jsx)(`div`,{className:`text-[11px] text-krona-secondary`,children:e.type===`bank`?`Расчетный счет`:e.type===`cash_desk`?`Операционная касса`:`Эквайринг`})]})]}),(0,k.jsxs)(`div`,{className:`text-right`,children:[(0,k.jsx)(`div`,{className:`text-sm font-bold text-krona-green`,children:b(e.balance.minor)}),(0,k.jsx)(i,{variant:e.isDefault?`gold`:`gray`,size:`sm`,children:e.isDefault?`Основной`:`Активен`})]})]},e.id))}),(0,k.jsxs)(`div`,{className:`flex flex-col sm:flex-row sm:items-center justify-between gap-3`,children:[(0,k.jsxs)(`div`,{className:`flex items-center gap-1.5 overflow-x-auto text-xs`,children:[(0,k.jsxs)(`button`,{onClick:()=>x(`transactions`),className:`px-3 py-1.5 rounded-lg font-medium transition-colors ${_===`transactions`?`bg-krona-green text-white shadow-sm`:`bg-krona-surface text-krona-secondary hover:text-krona-primary border border-krona-border`}`,children:[`Движение денежных средств (ДДС) (`,r.length,`)`]}),(0,k.jsx)(`button`,{onClick:()=>x(`pnl`),className:`px-3 py-1.5 rounded-lg font-medium transition-colors ${_===`pnl`?`bg-krona-green text-white shadow-sm`:`bg-krona-surface text-krona-secondary hover:text-krona-primary border border-krona-border`}`,children:`Отчет о прибылях и убытках (P&L)`}),(0,k.jsxs)(`button`,{onClick:()=>x(`accounts`),className:`px-3 py-1.5 rounded-lg font-medium transition-colors ${_===`accounts`?`bg-krona-green text-white shadow-sm`:`bg-krona-surface text-krona-secondary hover:text-krona-primary border border-krona-border`}`,children:[`Банковские счета и кассы (`,t.length,`)`]})]}),_===`transactions`&&(0,k.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,k.jsxs)(`select`,{value:A,onChange:e=>j(e.target.value),className:`px-2.5 py-1.5 text-xs bg-krona-surface border border-krona-border rounded-lg text-krona-primary focus:outline-none`,children:[(0,k.jsx)(`option`,{value:`all`,children:`Все операции`}),(0,k.jsx)(`option`,{value:`inflow`,children:`Только приход (+)`}),(0,k.jsx)(`option`,{value:`outflow`,children:`Только расход (-)`})]}),(0,k.jsxs)(`div`,{className:`relative w-56`,children:[(0,k.jsx)(y,{className:`w-3.5 h-3.5 absolute left-2.5 top-2.5 text-krona-secondary`}),(0,k.jsx)(`input`,{type:`text`,value:C,onChange:e=>T(e.target.value),placeholder:`Поиск по описанию, счету...`,className:`w-full pl-8 pr-3 py-1.5 text-xs bg-krona-surface border border-krona-border rounded-lg text-krona-primary focus:outline-none`})]})]})]}),_===`transactions`&&(0,k.jsx)(`div`,{className:`bg-krona-surface border border-krona-border rounded-xl shadow-krona-soft overflow-hidden`,children:(0,k.jsxs)(`table`,{className:`w-full text-xs text-left`,children:[(0,k.jsx)(`thead`,{className:`bg-krona-workspace text-krona-secondary border-b border-krona-border`,children:(0,k.jsxs)(`tr`,{children:[(0,k.jsx)(`th`,{className:`p-3 font-semibold`,children:`Номер транзакции`}),(0,k.jsx)(`th`,{className:`p-3 font-semibold`,children:`Дата и время`}),(0,k.jsx)(`th`,{className:`p-3 font-semibold`,children:`Тип операции`}),(0,k.jsx)(`th`,{className:`p-3 font-semibold`,children:`Статья / Категория`}),(0,k.jsx)(`th`,{className:`p-3 font-semibold`,children:`Счет / Касса`}),(0,k.jsx)(`th`,{className:`p-3 font-semibold`,children:`Основание / Описание`}),(0,k.jsx)(`th`,{className:`p-3 font-semibold text-right`,children:`Сумма`})]})}),(0,k.jsxs)(`tbody`,{className:`divide-y divide-krona-border`,children:[q.map(e=>(0,k.jsxs)(`tr`,{className:`hover:bg-krona-workspace/50 transition-colors`,children:[(0,k.jsx)(`td`,{className:`p-3 font-mono font-bold text-krona-primary`,children:e.transactionNumber}),(0,k.jsx)(`td`,{className:`p-3 font-mono text-krona-secondary`,children:h(e.timestamp)}),(0,k.jsx)(`td`,{className:`p-3`,children:e.type===`inflow`?(0,k.jsxs)(`span`,{className:`inline-flex items-center gap-1 font-bold text-emerald-600 dark:text-emerald-400 bg-emerald-500/10 px-2 py-0.5 rounded text-[11px]`,children:[(0,k.jsx)(S,{className:`w-3 h-3`}),` Приход (+)`]}):(0,k.jsxs)(`span`,{className:`inline-flex items-center gap-1 font-bold text-rose-600 dark:text-rose-400 bg-rose-500/10 px-2 py-0.5 rounded text-[11px]`,children:[(0,k.jsx)(u,{className:`w-3 h-3`}),` Расход (-)`]})}),(0,k.jsx)(`td`,{className:`p-3 text-krona-primary font-medium`,children:Y(e.category)}),(0,k.jsx)(`td`,{className:`p-3 text-krona-secondary`,children:e.accountName}),(0,k.jsx)(`td`,{className:`p-3 text-krona-secondary`,children:e.description}),(0,k.jsx)(`td`,{className:`p-3 text-right font-bold font-mono`,children:(0,k.jsxs)(`span`,{className:e.type===`inflow`?`text-krona-green`:`text-rose-600 dark:text-rose-400`,children:[e.type===`inflow`?`+`:`-`,b(e.amount.minor)]})})]},e.id)),q.length===0&&(0,k.jsx)(`tr`,{children:(0,k.jsx)(`td`,{colSpan:7,className:`p-8 text-center text-krona-secondary text-xs italic`,children:`Финансовые проводки не найдены`})})]})]})}),_===`pnl`&&(0,k.jsxs)(`div`,{className:`bg-krona-surface border border-krona-border rounded-xl shadow-krona-soft p-5 space-y-4 max-w-3xl`,children:[(0,k.jsxs)(`div`,{className:`border-b border-krona-border pb-3`,children:[(0,k.jsx)(`h2`,{className:`text-sm font-bold text-krona-primary`,children:`Отчет о финансовых результатах (P&L / ОПУ)`}),(0,k.jsx)(`p`,{className:`text-xs text-krona-secondary mt-0.5`,children:`Текущий отчетный период на базе реальных проведенных операций в системе Krona`})]}),(0,k.jsxs)(`div`,{className:`space-y-2 text-xs`,children:[(0,k.jsxs)(`div`,{className:`flex justify-between items-center py-2 border-b border-krona-border/60`,children:[(0,k.jsx)(`span`,{className:`font-semibold text-krona-primary`,children:`1. Выручка от продаж (Revenue)`}),(0,k.jsx)(`span`,{className:`font-bold text-krona-green text-sm`,children:b(a?.revenue.minor||W)})]}),(0,k.jsxs)(`div`,{className:`flex justify-between items-center py-2 border-b border-krona-border/60 text-krona-secondary pl-4`,children:[(0,k.jsx)(`span`,{children:`Себестоимость проданных товаров (COGS, 42%)`}),(0,k.jsxs)(`span`,{children:[`-`,b(a?.costOfGoodsSold.minor||Math.round(W*.42))]})]}),(0,k.jsxs)(`div`,{className:`flex justify-between items-center py-2 bg-krona-workspace px-3 rounded-lg font-bold text-krona-primary`,children:[(0,k.jsx)(`span`,{children:`2. Валовая прибыль (Gross Profit)`}),(0,k.jsx)(`span`,{className:`text-krona-green`,children:b(a?.grossProfit.minor||Math.round(W*.58))})]}),(0,k.jsxs)(`div`,{className:`flex justify-between items-center py-2 border-b border-krona-border/60 text-krona-secondary pl-4`,children:[(0,k.jsx)(`span`,{children:`Операционные и административные расходы (OPEX)`}),(0,k.jsxs)(`span`,{children:[`-`,b(a?.operatingExpenses.minor||G)]})]}),(0,k.jsxs)(`div`,{className:`flex justify-between items-center py-3 bg-emerald-500/10 px-4 rounded-xl font-bold text-sm text-krona-primary border border-emerald-500/30`,children:[(0,k.jsxs)(`div`,{children:[(0,k.jsx)(`div`,{children:`3. Чистая прибыль (Net Profit)`}),(0,k.jsxs)(`div`,{className:`text-[11px] font-normal text-krona-secondary`,children:[`Рентабельность: `,a?.operatingMarginPercent||58,`%`]})]}),(0,k.jsx)(`div`,{className:`text-krona-green text-base`,children:b(a?.netProfit.minor||W-G)})]})]})]}),_===`accounts`&&(0,k.jsx)(`div`,{className:`bg-krona-surface border border-krona-border rounded-xl shadow-krona-soft overflow-hidden`,children:(0,k.jsxs)(`table`,{className:`w-full text-xs text-left`,children:[(0,k.jsx)(`thead`,{className:`bg-krona-workspace text-krona-secondary border-b border-krona-border`,children:(0,k.jsxs)(`tr`,{children:[(0,k.jsx)(`th`,{className:`p-3 font-semibold`,children:`Наименование счета`}),(0,k.jsx)(`th`,{className:`p-3 font-semibold`,children:`Тип счета`}),(0,k.jsx)(`th`,{className:`p-3 font-semibold`,children:`Банк`}),(0,k.jsx)(`th`,{className:`p-3 font-semibold`,children:`Номер счета`}),(0,k.jsx)(`th`,{className:`p-3 font-semibold`,children:`Текущий баланс`}),(0,k.jsx)(`th`,{className:`p-3 font-semibold text-center`,children:`Статус`})]})}),(0,k.jsx)(`tbody`,{className:`divide-y divide-krona-border`,children:t.map(e=>(0,k.jsxs)(`tr`,{className:`hover:bg-krona-workspace/50 transition-colors`,children:[(0,k.jsx)(`td`,{className:`p-3 font-bold text-krona-primary`,children:e.name}),(0,k.jsx)(`td`,{className:`p-3 text-krona-secondary`,children:e.type===`bank`?`Расчетный счет`:e.type===`cash_desk`?`Касса`:`Эквайринг`}),(0,k.jsx)(`td`,{className:`p-3 text-krona-secondary`,children:e.bankName||`ПАО Сбербанк`}),(0,k.jsx)(`td`,{className:`p-3 font-mono text-krona-secondary`,children:e.accountNumber||`40702810900000012345`}),(0,k.jsx)(`td`,{className:`p-3 font-bold text-krona-green text-sm`,children:b(e.balance.minor)}),(0,k.jsx)(`td`,{className:`p-3 text-center`,children:(0,k.jsx)(i,{variant:e.isDefault?`gold`:`green`,size:`sm`,children:e.isDefault?`Основной`:`Активен`})})]},e.id))})]})}),(0,k.jsx)(m,{isOpen:M,onClose:()=>N(!1),title:P===`inflow`?`Оформление прихода денежных средств`:`Оформление расходного кассового ордера`,size:`md`,children:(0,k.jsxs)(`form`,{onSubmit:J,className:`space-y-4 text-xs`,children:[(0,k.jsxs)(`div`,{children:[(0,k.jsx)(`label`,{className:`block font-semibold text-krona-primary mb-1`,children:`Счет / Касса:`}),(0,k.jsx)(`select`,{value:B,onChange:e=>V(e.target.value),className:`w-full px-3 py-1.5 bg-krona-workspace border border-krona-border rounded-lg text-krona-primary`,children:t.map(e=>(0,k.jsxs)(`option`,{value:e.id,children:[e.name,` (остаток: `,b(e.balance.minor),`)`]},e.id))})]}),(0,k.jsxs)(`div`,{children:[(0,k.jsx)(`label`,{className:`block font-semibold text-krona-primary mb-1`,children:`Категория операции:`}),(0,k.jsx)(`select`,{value:I,onChange:e=>L(e.target.value),className:`w-full px-3 py-1.5 bg-krona-workspace border border-krona-border rounded-lg text-krona-primary`,children:P===`inflow`?(0,k.jsxs)(k.Fragment,{children:[(0,k.jsx)(`option`,{value:`sales_revenue`,children:`Выручка от продаж`}),(0,k.jsx)(`option`,{value:`other`,children:`Прочие поступления`})]}):(0,k.jsxs)(k.Fragment,{children:[(0,k.jsx)(`option`,{value:`supplier_payment`,children:`Оплата поставщику`}),(0,k.jsx)(`option`,{value:`refund`,children:`Возврат средств покупателю`}),(0,k.jsx)(`option`,{value:`payroll`,children:`Заработная плата`}),(0,k.jsx)(`option`,{value:`rent`,children:`Аренда`}),(0,k.jsx)(`option`,{value:`taxes`,children:`Налоги`}),(0,k.jsx)(`option`,{value:`utilities`,children:`Коммунальные платежи`}),(0,k.jsx)(`option`,{value:`other`,children:`Хозяйственные расходы`})]})})]}),(0,k.jsxs)(`div`,{children:[(0,k.jsx)(`label`,{className:`block font-semibold text-krona-primary mb-1`,children:`Сумма (в копейках):`}),(0,k.jsx)(`input`,{type:`number`,min:100,step:100,value:R,onChange:e=>z(Number(e.target.value)||0),className:`w-full px-3 py-1.5 bg-krona-workspace border border-krona-border rounded-lg text-krona-primary font-bold`}),(0,k.jsxs)(`div`,{className:`text-[11px] text-krona-secondary mt-1`,children:[`Эквивалент:`,` `,(0,k.jsx)(`strong`,{className:`text-krona-green`,children:b(R)})]})]}),(0,k.jsxs)(`div`,{children:[(0,k.jsx)(`label`,{className:`block font-semibold text-krona-primary mb-1`,children:`Назначение платежа / Комментарий:`}),(0,k.jsx)(`input`,{type:`text`,required:!0,value:H,onChange:e=>U(e.target.value),placeholder:`Например: Оплата счета за кофе по договору...`,className:`w-full px-3 py-1.5 bg-krona-workspace border border-krona-border rounded-lg text-krona-primary`})]}),(0,k.jsxs)(`div`,{className:`flex justify-end gap-2 pt-2 border-t border-krona-border`,children:[(0,k.jsx)(n,{variant:`secondary`,size:`sm`,type:`button`,onClick:()=>N(!1),children:`Отмена`}),(0,k.jsx)(n,{variant:`primary`,size:`sm`,type:`submit`,children:`Провести операцию`})]})]})})]})};export{A as FinanceModule}; \ No newline at end of file diff --git a/dist/assets/FormBuilder-d4z6JEl5.js b/dist/assets/FormBuilder-d4z6JEl5.js new file mode 100644 index 0000000..d62c487 --- /dev/null +++ b/dist/assets/FormBuilder-d4z6JEl5.js @@ -0,0 +1 @@ +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{r as s}from"./fieldTypesMeta-BCSfJ-2N.js";import{t as c}from"./eye-CkF1gwUX.js";import{n as l,t as u}from"./move-up-qiRY8MuU.js";import{t as d}from"./save-D8euL60I.js";import{$ as ee,M as te,O as f,T as p,a as m,b as h,f as g,h as ne,ht as re,mt as ie,n as _,nt as v,u as y}from"./index-CrJKtV0u.js";var b={name:`redo-2`,size:24,node:[[`path`,{d:`m15 14 5-5-5-5`,key:`12vg1m`}],[`path`,{d:`M20 9H9.5A5.5 5.5 0 0 0 4 14.5A5.5 5.5 0 0 0 9.5 20H13`,key:`6uklza`}]]};b.node;var x=r(b),S={name:`undo-2`,size:24,node:[[`path`,{d:`M9 14 4 9l5-5`,key:`102s5s`}],[`path`,{d:`M4 9h10.5a5.5 5.5 0 0 1 5.5 5.5a5.5 5.5 0 0 1-5.5 5.5H11`,key:`f3b9sd`}]]};S.node;var C=r(S),w=t(e(),1),T=a(),E=()=>{let{entityCode:e}=re(),t=ie(),{currentEntity:r,layouts:a,saveLayout:b}=v(e),{showToast:S}=o(),[E,D]=(0,w.useState)(`desktop`),[O,k]=(0,w.useState)(!1),[A,j]=(0,w.useState)(``),[M,N]=(0,w.useState)(null),[P,F]=(0,w.useState)({}),[I,L]=(0,w.useState)(null),[R,z]=(0,w.useState)(!1),[B,V]=(0,w.useState)([]),[H,U]=(0,w.useState)(-1);(0,w.useEffect)(()=>{r&&!I&&Promise.resolve().then(()=>{let t=a.find(t=>t.entityCode===e&&t.isDefault)||a[0];if(t)L(t),V([t]),U(0);else{let t={id:`layout_${e}_default`,entityCode:e||``,name:`Основная форма`,isDefault:!0,type:`form`,sections:[{id:`sec_main`,title:`Основные сведения`,columns:2,fieldKeys:r.fields.map(e=>e.key)}]};L(t),V([t]),U(0)}})},[r,a,e,I]);let W=(0,w.useCallback)(e=>{V(t=>{let n=[...t.slice(0,H+1),e];return n.length>50&&n.shift(),n}),U(e=>Math.min(e+1,49)),L(e),z(!0)},[H]),G=(0,w.useCallback)(()=>{if(H>0){let e=H-1;U(e),L(B[e]),z(!0)}},[H,B]),K=(0,w.useCallback)(()=>{if(H{let e=e=>{(e.ctrlKey||e.metaKey)&&e.key===`z`&&!e.shiftKey?(e.preventDefault(),G()):((e.ctrlKey||e.metaKey)&&e.key===`y`||(e.ctrlKey||e.metaKey)&&e.shiftKey&&e.key===`z`)&&(e.preventDefault(),K())};return window.addEventListener(`keydown`,e),()=>window.removeEventListener(`keydown`,e)},[G,K]);let q=(0,w.useMemo)(()=>r?.fields||[],[r]),J=(0,w.useMemo)(()=>{let e=new Map;return q.forEach(t=>e.set(t.key,t)),e},[q]),ae=(0,w.useMemo)(()=>{let e=new Set;return I?.sections.forEach(t=>{t.fieldKeys.forEach(t=>e.add(t))}),e},[I]),oe=(0,w.useMemo)(()=>q.filter(e=>e.label.toLowerCase().includes(A.toLowerCase())||e.key.toLowerCase().includes(A.toLowerCase())||e.type.toLowerCase().includes(A.toLowerCase())),[q,A]),se=(e,t)=>{if(!I)return;let n=t?I.sections.find(e=>e.id===t):I.sections[0];if(!n)return;let r=I.sections.map(t=>t.id===n.id&&!t.fieldKeys.includes(e)?{...t,fieldKeys:[...t.fieldKeys,e]}:t);W({...I,sections:r})},ce=(e,t)=>{if(!I)return;let n=I.sections.map(n=>n.id===e?{...n,fieldKeys:n.fieldKeys.filter(e=>e!==t)}:n);M===t&&N(null),W({...I,sections:n})},Y=(e,t,n)=>{if(!I)return;let r=I.sections.map(r=>{if(r.id===e){let e=[...r.fieldKeys],[i]=e.splice(t,1);return e.splice(n,0,i),{...r,fieldKeys:e}}return r});W({...I,sections:r})},le=(e,t,n)=>{if(!I||e===t)return;let r=I.sections.map(r=>r.id===e?{...r,fieldKeys:r.fieldKeys.filter(e=>e!==n)}:r.id===t?{...r,fieldKeys:[...r.fieldKeys,n]}:r);W({...I,sections:r})},ue=()=>{if(!I)return;let e={id:`sec_${Date.now().toString(36)}`,title:`Новая секция ${I.sections.length+1}`,columns:2,fieldKeys:[]};W({...I,sections:[...I.sections,e]})},X=(e,t)=>{if(!I)return;let n=I.sections.map(n=>n.id===e?{...n,...t}:n);W({...I,sections:n})},de=e=>{if(!I||I.sections.length<=1){S({type:`error`,title:`Форма должна содержать минимум одну секцию`});return}let t=I.sections.filter(t=>t.id!==e);W({...I,sections:t})},Z=(e,t)=>{if(!I)return;let n=[...I.sections],[r]=n.splice(e,1);n.splice(t,0,r),W({...I,sections:n})},fe=async()=>{if(I)try{await b(I),z(!1),S({type:`success`,title:`Макет формы успешно сохранён`})}catch(e){S({type:`error`,title:`Ошибка сохранения макета`,message:e instanceof Error?e.message:String(e)})}},pe={desktop:`w-full max-w-5xl`,tablet:`w-full max-w-[768px]`,mobile:`w-full max-w-[390px]`}[E],Q=M?J.get(M):null,$=M&&P[M]||{};return(0,T.jsxs)(`div`,{className:`space-y-4 animate-fade-in`,children:[(0,T.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,T.jsxs)(`div`,{className:`flex items-center gap-3`,children:[(0,T.jsxs)(n,{variant:`ghost`,size:`sm`,onClick:()=>t(`/settings/entities`),className:`p-1.5`,children:[(0,T.jsx)(ee,{className:`w-4 h-4 mr-1`}),`Каталог`]}),(0,T.jsxs)(`div`,{children:[(0,T.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,T.jsxs)(`h1`,{className:`text-base font-bold text-krona-primary`,children:[`Конструктор форм: `,r?.name||e]}),R&&(0,T.jsx)(i,{variant:`warning`,size:`sm`,children:`Несохранённые изменения`})]}),(0,T.jsx)(`p`,{className:`text-xs text-krona-secondary`,children:`Визуальное проектирование экранных форм, секций, колонок и адаптивности`})]})]}),(0,T.jsxs)(`div`,{className:`flex items-center flex-wrap gap-2`,children:[(0,T.jsxs)(`div`,{className:`flex items-center bg-krona-workspace rounded-lg border border-krona-border/80 p-0.5`,children:[(0,T.jsx)(`button`,{onClick:G,disabled:H<=0,className:`p-1.5 rounded text-krona-secondary hover:text-krona-primary disabled:opacity-30 disabled:cursor-not-allowed`,title:`Отменить (Ctrl+Z)`,children:(0,T.jsx)(C,{className:`w-4 h-4`})}),(0,T.jsx)(`button`,{onClick:K,disabled:H>=B.length-1,className:`p-1.5 rounded text-krona-secondary hover:text-krona-primary disabled:opacity-30 disabled:cursor-not-allowed`,title:`Повторить (Ctrl+Y)`,children:(0,T.jsx)(x,{className:`w-4 h-4`})})]}),(0,T.jsxs)(`div`,{className:`flex items-center bg-krona-workspace rounded-lg border border-krona-border/80 p-0.5`,children:[(0,T.jsx)(`button`,{onClick:()=>D(`desktop`),className:`p-1.5 rounded ${E===`desktop`?`bg-krona-surface text-krona-green shadow-sm`:`text-krona-secondary`}`,title:`Десктоп (1440px)`,children:(0,T.jsx)(f,{className:`w-4 h-4`})}),(0,T.jsx)(`button`,{onClick:()=>D(`tablet`),className:`p-1.5 rounded ${E===`tablet`?`bg-krona-surface text-krona-green shadow-sm`:`text-krona-secondary`}`,title:`Планшет (768px)`,children:(0,T.jsx)(g,{className:`w-4 h-4`})}),(0,T.jsx)(`button`,{onClick:()=>D(`mobile`),className:`p-1.5 rounded ${E===`mobile`?`bg-krona-surface text-krona-green shadow-sm`:`text-krona-secondary`}`,title:`Мобильный (390px)`,children:(0,T.jsx)(ne,{className:`w-4 h-4`})})]}),(0,T.jsxs)(n,{variant:O?`secondary`:`outline`,size:`sm`,onClick:()=>k(!O),children:[(0,T.jsx)(c,{className:`w-3.5 h-3.5 mr-1 text-krona-gold`}),O?`В редактор`:`Предпросмотр`]}),(0,T.jsxs)(n,{variant:`primary`,size:`sm`,onClick:fe,disabled:!R&&!I,children:[(0,T.jsx)(d,{className:`w-3.5 h-3.5 mr-1`}),`Сохранить`]})]})]}),(0,T.jsxs)(`div`,{className:`grid grid-cols-1 lg:grid-cols-12 gap-4 items-start`,children:[!O&&(0,T.jsxs)(`div`,{className:`lg:col-span-3 bg-krona-surface border border-krona-border rounded-xl p-3.5 shadow-krona-soft space-y-3 sticky top-4`,children:[(0,T.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,T.jsxs)(`span`,{className:`text-xs font-bold text-krona-primary uppercase tracking-wider flex items-center gap-1.5`,children:[(0,T.jsx)(te,{className:`w-3.5 h-3.5 text-krona-green`}),`Палитра полей`]}),(0,T.jsx)(i,{variant:`neutral`,size:`sm`,children:q.length})]}),(0,T.jsx)(`div`,{className:`relative`,children:(0,T.jsx)(m,{value:A,onChange:e=>j(e.target.value),placeholder:`Поиск полей...`,icon:(0,T.jsx)(h,{className:`w-3 h-3`}),className:`text-xs py-1`})}),(0,T.jsx)(`div`,{className:`space-y-1.5 max-h-[520px] overflow-y-auto pr-1`,children:oe.map(e=>{let t=ae.has(e.key),n=s(e.type).icon;return(0,T.jsxs)(`div`,{className:`flex items-center justify-between p-2 rounded-lg border text-xs transition-all ${t?`bg-krona-workspace/40 border-krona-border/40 opacity-60`:`bg-krona-surface border-krona-border hover:border-krona-green hover:shadow-xs`}`,children:[(0,T.jsxs)(`div`,{className:`flex items-center gap-2 min-w-0`,children:[(0,T.jsx)(`div`,{className:`w-6 h-6 rounded bg-krona-workspace flex items-center justify-center shrink-0 border border-krona-border/50`,children:(0,T.jsx)(n,{className:`w-3 h-3 text-krona-green`})}),(0,T.jsxs)(`div`,{className:`min-w-0`,children:[(0,T.jsx)(`p`,{className:`font-medium text-krona-primary truncate leading-snug`,children:e.label}),(0,T.jsx)(`p`,{className:`font-mono text-[10px] text-krona-secondary truncate`,children:e.key})]})]}),(0,T.jsx)(`button`,{type:`button`,disabled:t,onClick:()=>se(e.key),className:`px-2 py-1 rounded text-[10px] font-semibold shrink-0 cursor-pointer ${t?`text-krona-secondary cursor-not-allowed`:`bg-krona-green/10 text-krona-green hover:bg-krona-green hover:text-white`}`,title:t?`Уже на форме`:`Добавить в секцию`,children:t?`Добавлено`:`+ Добавить`})]},e.key)})}),(0,T.jsx)(`div`,{className:`pt-2 border-t border-krona-border/60`,children:(0,T.jsxs)(n,{variant:`outline`,size:`sm`,className:`w-full text-xs`,onClick:ue,children:[(0,T.jsx)(p,{className:`w-3.5 h-3.5 mr-1`}),`Создать секцию`]})})]}),(0,T.jsx)(`div`,{className:`${O?`lg:col-span-12`:`lg:col-span-9`} flex flex-col items-center transition-all`,children:(0,T.jsxs)(`div`,{className:`${pe} transition-all duration-200 space-y-4`,children:[(0,T.jsxs)(`div`,{className:`flex items-center justify-between px-3 py-1.5 bg-krona-surface-muted/60 border border-krona-border rounded-lg text-xs text-krona-secondary`,children:[(0,T.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,T.jsxs)(`span`,{className:`font-semibold text-krona-primary capitalize`,children:[`Режим: `,E]}),(0,T.jsx)(`span`,{children:`•`}),(0,T.jsx)(`span`,{children:E===`desktop`?`1440px`:E===`tablet`?`768px`:`390px`})]}),O&&(0,T.jsx)(i,{variant:`gold`,size:`sm`,children:`Режим интерактивного тестирования`})]}),I?.sections.map((e,t)=>{let n={1:`grid-cols-1`,2:`grid-cols-1 md:grid-cols-2`,3:`grid-cols-1 md:grid-cols-3`,4:`grid-cols-1 md:grid-cols-4`}[E===`mobile`?1:e.columns];return(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 gap-2 pb-2 border-b border-krona-border/60`,children:[O?(0,T.jsx)(`h3`,{className:`font-semibold text-sm text-krona-primary`,children:e.title}):(0,T.jsx)(`div`,{className:`flex items-center gap-2 flex-1`,children:(0,T.jsx)(`input`,{type:`text`,value:e.title,onChange:t=>X(e.id,{title:t.target.value}),className:`font-semibold text-sm text-krona-primary bg-transparent border-b border-transparent hover:border-krona-border focus:border-krona-green focus:outline-none px-1 py-0.5 rounded`})}),!O&&(0,T.jsxs)(`div`,{className:`flex items-center gap-1.5`,children:[(0,T.jsx)(`div`,{className:`flex items-center gap-1 bg-krona-workspace rounded p-0.5 border border-krona-border`,children:[1,2,3,4].map(t=>(0,T.jsxs)(`button`,{onClick:()=>X(e.id,{columns:t}),className:`px-1.5 py-0.5 text-[10px] font-bold rounded ${e.columns===t?`bg-krona-green text-white`:`text-krona-secondary hover:text-krona-primary`}`,title:`${t} колонок`,children:[t,`C`]},t))}),(0,T.jsx)(`button`,{onClick:()=>Z(t,t-1),disabled:t===0,className:`p-1 text-krona-secondary hover:text-krona-primary disabled:opacity-30`,title:`Переместить секцию вверх`,children:(0,T.jsx)(u,{className:`w-3.5 h-3.5`})}),(0,T.jsx)(`button`,{onClick:()=>Z(t,t+1),disabled:t===I.sections.length-1,className:`p-1 text-krona-secondary hover:text-krona-primary disabled:opacity-30`,title:`Переместить секцию вниз`,children:(0,T.jsx)(l,{className:`w-3.5 h-3.5`})}),(0,T.jsx)(`button`,{onClick:()=>de(e.id),className:`p-1 text-krona-danger hover:bg-krona-danger/10 rounded`,title:`Удалить секцию`,children:(0,T.jsx)(y,{className:`w-3.5 h-3.5`})})]})]}),(0,T.jsxs)(`div`,{className:`grid ${n} gap-3 min-h-[50px]`,children:[e.fieldKeys.map((t,n)=>{let r=J.get(t);if(!r)return null;let a=s(r.type),o=a.icon,c=P[t]||{},l=M===t;return O?(0,T.jsxs)(`div`,{className:`p-3 bg-krona-workspace/40 rounded-lg border border-krona-border/60 space-y-1`,children:[(0,T.jsxs)(`label`,{className:`text-xs font-semibold text-krona-primary block`,children:[c.label||r.label,(c.required??r.required)&&(0,T.jsx)(`span`,{className:`text-krona-danger ml-1`,children:`*`})]}),r.type===`status`||r.type===`select`?(0,T.jsxs)(`select`,{className:`w-full bg-krona-surface border border-krona-border rounded-md px-2.5 py-1.5 text-xs text-krona-primary`,children:[(0,T.jsx)(`option`,{value:``,children:`Выберите вариант...`}),r.options?.map(e=>(0,T.jsx)(`option`,{value:e.value,children:e.label},e.value))]}):r.type===`boolean`?(0,T.jsxs)(`div`,{className:`flex items-center gap-2 pt-1`,children:[(0,T.jsx)(`input`,{type:`checkbox`,className:`rounded text-krona-green`}),(0,T.jsx)(`span`,{className:`text-xs text-krona-secondary`,children:`Да / Нет`})]}):r.type===`long_text`||r.type===`rich_text`?(0,T.jsx)(`textarea`,{placeholder:c.placeholder||r.placeholder||`Введите текст...`,className:`w-full bg-krona-surface border border-krona-border rounded-md px-2.5 py-1.5 text-xs text-krona-primary`,rows:2}):(0,T.jsx)(`input`,{type:r.type===`number`||r.type===`integer`?`number`:`text`,placeholder:c.placeholder||r.placeholder||`Значение...`,className:`w-full bg-krona-surface border border-krona-border rounded-md px-2.5 py-1.5 text-xs text-krona-primary`}),(c.helpText||r.description)&&(0,T.jsx)(`p`,{className:`text-[10px] text-krona-secondary`,children:c.helpText||r.description})]},t):(0,T.jsxs)(`div`,{onClick:()=>N(t),className:`flex flex-col justify-between p-3 rounded-lg border text-xs cursor-pointer transition-all ${l?`bg-krona-green/5 border-krona-green ring-1 ring-krona-green`:`bg-krona-workspace/60 border-krona-border hover:border-krona-secondary`}`,children:[(0,T.jsxs)(`div`,{className:`flex items-start justify-between gap-1.5 mb-2`,children:[(0,T.jsxs)(`div`,{className:`flex items-center gap-2 min-w-0`,children:[(0,T.jsx)(`div`,{className:`w-6 h-6 rounded bg-krona-surface flex items-center justify-center border border-krona-border/60 shrink-0`,children:(0,T.jsx)(o,{className:`w-3.5 h-3.5 text-krona-green`})}),(0,T.jsxs)(`div`,{className:`min-w-0`,children:[(0,T.jsxs)(`span`,{className:`font-semibold text-krona-primary truncate block`,children:[c.label||r.label,(c.required??r.required)&&(0,T.jsx)(`span`,{className:`text-krona-danger ml-0.5`,children:`*`})]}),(0,T.jsx)(`span`,{className:`font-mono text-[10px] text-krona-secondary block truncate`,children:r.key})]})]}),(0,T.jsx)(i,{variant:`neutral`,size:`sm`,className:`text-[10px] shrink-0`,children:a.label})]}),(0,T.jsxs)(`div`,{className:`flex items-center justify-between pt-1 border-t border-krona-border/40 text-[11px] text-krona-secondary`,children:[(0,T.jsxs)(`div`,{className:`flex items-center gap-1`,children:[(0,T.jsx)(`button`,{type:`button`,onClick:t=>{t.stopPropagation(),Y(e.id,n,Math.max(0,n-1))},disabled:n===0,className:`p-0.5 hover:text-krona-primary disabled:opacity-20`,title:`Переместить влево/вверх`,children:`←`}),(0,T.jsx)(`button`,{type:`button`,onClick:t=>{t.stopPropagation(),Y(e.id,n,Math.min(e.fieldKeys.length-1,n+1))},disabled:n===e.fieldKeys.length-1,className:`p-0.5 hover:text-krona-primary disabled:opacity-20`,title:`Переместить вправо/вниз`,children:`→`})]}),(0,T.jsxs)(`div`,{className:`flex items-center gap-1`,children:[I.sections.length>1&&(0,T.jsxs)(`select`,{onClick:e=>e.stopPropagation(),onChange:n=>{le(e.id,n.target.value,t)},value:``,className:`text-[10px] bg-krona-surface border border-krona-border rounded px-1 py-0.5`,title:`Перенести в другую секцию`,children:[(0,T.jsx)(`option`,{value:``,disabled:!0,children:`Перенести...`}),I.sections.filter(t=>t.id!==e.id).map(e=>(0,T.jsx)(`option`,{value:e.id,children:e.title},e.id))]}),(0,T.jsx)(`button`,{type:`button`,onClick:n=>{n.stopPropagation(),ce(e.id,t)},className:`p-0.5 text-krona-danger hover:bg-krona-danger/10 rounded`,title:`Убрать с формы`,children:(0,T.jsx)(y,{className:`w-3 h-3`})})]})]})]},t)}),e.fieldKeys.length===0&&!O&&(0,T.jsx)(`div`,{className:`col-span-full py-6 text-center border border-dashed border-krona-border rounded-lg text-xs text-krona-secondary`,children:`Секция пуста. Нажмите «+ Добавить» в левой палитре полей.`})]})]},e.id)})]})})]}),(0,T.jsx)(_,{isOpen:!!Q&&!O,onClose:()=>N(null),title:Q?`Свойства поля: ${Q.label}`:`Свойства`,subtitle:`Код: ${M} | Тип: ${Q?.type}`,width:`md`,children:Q&&(0,T.jsxs)(`div`,{className:`space-y-4 text-xs`,children:[(0,T.jsx)(m,{label:`Пользовательский заголовок (Label Override)`,value:$.label??Q.label,onChange:e=>F(t=>({...t,[Q.key]:{...t[Q.key],label:e.target.value}})),placeholder:Q.label}),(0,T.jsx)(m,{label:`Подсказка (Placeholder)`,value:$.placeholder??Q.placeholder??``,onChange:e=>F(t=>({...t,[Q.key]:{...t[Q.key],placeholder:e.target.value}})),placeholder:`Введите текст подсказки...`}),(0,T.jsx)(m,{label:`Текст справки / описания`,value:$.helpText??Q.description??``,onChange:e=>F(t=>({...t,[Q.key]:{...t[Q.key],helpText:e.target.value}})),placeholder:`Пояснение для пользователя...`}),(0,T.jsxs)(`div`,{className:`p-3 bg-krona-workspace rounded-lg border border-krona-border space-y-2`,children:[(0,T.jsxs)(`label`,{className:`flex items-center gap-2 cursor-pointer font-medium text-krona-primary`,children:[(0,T.jsx)(`input`,{type:`checkbox`,checked:$.required??Q.required??!1,onChange:e=>F(t=>({...t,[Q.key]:{...t[Q.key],required:e.target.checked}})),className:`rounded text-krona-green`}),`Обязательно для заполнения на этой форме`]}),(0,T.jsxs)(`label`,{className:`flex items-center gap-2 cursor-pointer font-medium text-krona-primary`,children:[(0,T.jsx)(`input`,{type:`checkbox`,checked:$.readOnly??Q.readOnly??!1,onChange:e=>F(t=>({...t,[Q.key]:{...t[Q.key],readOnly:e.target.checked}})),className:`rounded text-krona-green`}),`Только чтение (Read-Only)`]})]}),(0,T.jsxs)(`div`,{className:`p-3 bg-krona-workspace rounded-lg border border-krona-border space-y-2`,children:[(0,T.jsx)(`span`,{className:`font-semibold text-krona-primary block`,children:`Условное отображение (Conditional Logic)`}),(0,T.jsx)(`p`,{className:`text-[11px] text-krona-secondary`,children:`Показывать поле только при соблюдении условия:`}),(0,T.jsxs)(`div`,{className:`space-y-2`,children:[(0,T.jsxs)(`select`,{value:$.conditionFieldKey||``,onChange:e=>F(t=>({...t,[Q.key]:{...t[Q.key],conditionFieldKey:e.target.value}})),className:`w-full bg-krona-surface text-krona-primary border border-krona-border rounded px-2 py-1`,children:[(0,T.jsx)(`option`,{value:``,children:`Без условий (всегда отображать)`}),q.filter(e=>e.key!==Q.key).map(e=>(0,T.jsxs)(`option`,{value:e.key,children:[`Если `,e.label,` (`,e.key,`)`]},e.key))]}),$.conditionFieldKey&&(0,T.jsxs)(`div`,{className:`grid grid-cols-2 gap-2`,children:[(0,T.jsxs)(`select`,{value:$.conditionOperator||`eq`,onChange:e=>F(t=>({...t,[Q.key]:{...t[Q.key],conditionOperator:e.target.value}})),className:`bg-krona-surface text-krona-primary border border-krona-border rounded px-2 py-1`,children:[(0,T.jsx)(`option`,{value:`eq`,children:`равно (=)`}),(0,T.jsx)(`option`,{value:`neq`,children:`не равно (≠)`}),(0,T.jsx)(`option`,{value:`contains`,children:`содержит`})]}),(0,T.jsx)(`input`,{type:`text`,placeholder:`Значение...`,value:$.conditionValue||``,onChange:e=>F(t=>({...t,[Q.key]:{...t[Q.key],conditionValue:e.target.value}})),className:`bg-krona-surface text-krona-primary border border-krona-border rounded px-2 py-1`})]})]})]}),(0,T.jsx)(`div`,{className:`flex justify-end gap-2 pt-3 border-t border-krona-border`,children:(0,T.jsx)(n,{variant:`primary`,size:`sm`,onClick:()=>N(null),children:`Готово`})})]})})]})};export{E as FormBuilder,E as default}; \ No newline at end of file diff --git a/dist/assets/FormBuilder-hvNl7u0G.js b/dist/assets/FormBuilder-hvNl7u0G.js deleted file mode 100644 index 21a3835..0000000 --- a/dist/assets/FormBuilder-hvNl7u0G.js +++ /dev/null @@ -1 +0,0 @@ -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{r as s}from"./fieldTypesMeta-BWfaDuCZ.js";import{t as c}from"./eye-CkF1gwUX.js";import{n as l,t as u}from"./move-up-qiRY8MuU.js";import{t as d}from"./save-D8euL60I.js";import{D as ee,Z as te,a as f,d as p,et as m,ft as h,j as g,m as ne,n as re,pt as ie,u as _,w as v,y}from"./index-CNnq9VO5.js";var b={name:`redo-2`,size:24,node:[[`path`,{d:`m15 14 5-5-5-5`,key:`12vg1m`}],[`path`,{d:`M20 9H9.5A5.5 5.5 0 0 0 4 14.5A5.5 5.5 0 0 0 9.5 20H13`,key:`6uklza`}]]};b.node;var x=r(b),S={name:`undo-2`,size:24,node:[[`path`,{d:`M9 14 4 9l5-5`,key:`102s5s`}],[`path`,{d:`M4 9h10.5a5.5 5.5 0 0 1 5.5 5.5a5.5 5.5 0 0 1-5.5 5.5H11`,key:`f3b9sd`}]]};S.node;var C=r(S),w=t(e(),1),T=a(),E=()=>{let{entityCode:e}=ie(),t=h(),{currentEntity:r,layouts:a,saveLayout:b}=m(e),{showToast:S}=o(),[E,D]=(0,w.useState)(`desktop`),[O,k]=(0,w.useState)(!1),[A,j]=(0,w.useState)(``),[M,N]=(0,w.useState)(null),[P,F]=(0,w.useState)({}),[I,L]=(0,w.useState)(null),[R,z]=(0,w.useState)(!1),[B,V]=(0,w.useState)([]),[H,U]=(0,w.useState)(-1);(0,w.useEffect)(()=>{r&&!I&&Promise.resolve().then(()=>{let t=a.find(t=>t.entityCode===e&&t.isDefault)||a[0];if(t)L(t),V([t]),U(0);else{let t={id:`layout_${e}_default`,entityCode:e||``,name:`Основная форма`,isDefault:!0,type:`form`,sections:[{id:`sec_main`,title:`Основные сведения`,columns:2,fieldKeys:r.fields.map(e=>e.key)}]};L(t),V([t]),U(0)}})},[r,a,e,I]);let W=(0,w.useCallback)(e=>{V(t=>{let n=[...t.slice(0,H+1),e];return n.length>50&&n.shift(),n}),U(e=>Math.min(e+1,49)),L(e),z(!0)},[H]),G=(0,w.useCallback)(()=>{if(H>0){let e=H-1;U(e),L(B[e]),z(!0)}},[H,B]),K=(0,w.useCallback)(()=>{if(H{let e=e=>{(e.ctrlKey||e.metaKey)&&e.key===`z`&&!e.shiftKey?(e.preventDefault(),G()):((e.ctrlKey||e.metaKey)&&e.key===`y`||(e.ctrlKey||e.metaKey)&&e.shiftKey&&e.key===`z`)&&(e.preventDefault(),K())};return window.addEventListener(`keydown`,e),()=>window.removeEventListener(`keydown`,e)},[G,K]);let q=(0,w.useMemo)(()=>r?.fields||[],[r]),J=(0,w.useMemo)(()=>{let e=new Map;return q.forEach(t=>e.set(t.key,t)),e},[q]),ae=(0,w.useMemo)(()=>{let e=new Set;return I?.sections.forEach(t=>{t.fieldKeys.forEach(t=>e.add(t))}),e},[I]),oe=(0,w.useMemo)(()=>q.filter(e=>e.label.toLowerCase().includes(A.toLowerCase())||e.key.toLowerCase().includes(A.toLowerCase())||e.type.toLowerCase().includes(A.toLowerCase())),[q,A]),se=(e,t)=>{if(!I)return;let n=t?I.sections.find(e=>e.id===t):I.sections[0];if(!n)return;let r=I.sections.map(t=>t.id===n.id&&!t.fieldKeys.includes(e)?{...t,fieldKeys:[...t.fieldKeys,e]}:t);W({...I,sections:r})},ce=(e,t)=>{if(!I)return;let n=I.sections.map(n=>n.id===e?{...n,fieldKeys:n.fieldKeys.filter(e=>e!==t)}:n);M===t&&N(null),W({...I,sections:n})},Y=(e,t,n)=>{if(!I)return;let r=I.sections.map(r=>{if(r.id===e){let e=[...r.fieldKeys],[i]=e.splice(t,1);return e.splice(n,0,i),{...r,fieldKeys:e}}return r});W({...I,sections:r})},le=(e,t,n)=>{if(!I||e===t)return;let r=I.sections.map(r=>r.id===e?{...r,fieldKeys:r.fieldKeys.filter(e=>e!==n)}:r.id===t?{...r,fieldKeys:[...r.fieldKeys,n]}:r);W({...I,sections:r})},ue=()=>{if(!I)return;let e={id:`sec_${Date.now().toString(36)}`,title:`Новая секция ${I.sections.length+1}`,columns:2,fieldKeys:[]};W({...I,sections:[...I.sections,e]})},X=(e,t)=>{if(!I)return;let n=I.sections.map(n=>n.id===e?{...n,...t}:n);W({...I,sections:n})},de=e=>{if(!I||I.sections.length<=1){S({type:`error`,title:`Форма должна содержать минимум одну секцию`});return}let t=I.sections.filter(t=>t.id!==e);W({...I,sections:t})},Z=(e,t)=>{if(!I)return;let n=[...I.sections],[r]=n.splice(e,1);n.splice(t,0,r),W({...I,sections:n})},fe=async()=>{if(I)try{await b(I),z(!1),S({type:`success`,title:`Макет формы успешно сохранён`})}catch(e){S({type:`error`,title:`Ошибка сохранения макета`,message:e instanceof Error?e.message:String(e)})}},pe={desktop:`w-full max-w-5xl`,tablet:`w-full max-w-[768px]`,mobile:`w-full max-w-[390px]`}[E],Q=M?J.get(M):null,$=M&&P[M]||{};return(0,T.jsxs)(`div`,{className:`space-y-4 animate-fade-in`,children:[(0,T.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,T.jsxs)(`div`,{className:`flex items-center gap-3`,children:[(0,T.jsxs)(n,{variant:`ghost`,size:`sm`,onClick:()=>t(`/settings/entities`),className:`p-1.5`,children:[(0,T.jsx)(te,{className:`w-4 h-4 mr-1`}),`Каталог`]}),(0,T.jsxs)(`div`,{children:[(0,T.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,T.jsxs)(`h1`,{className:`text-base font-bold text-krona-primary`,children:[`Конструктор форм: `,r?.name||e]}),R&&(0,T.jsx)(i,{variant:`warning`,size:`sm`,children:`Несохранённые изменения`})]}),(0,T.jsx)(`p`,{className:`text-xs text-krona-secondary`,children:`Визуальное проектирование экранных форм, секций, колонок и адаптивности`})]})]}),(0,T.jsxs)(`div`,{className:`flex items-center flex-wrap gap-2`,children:[(0,T.jsxs)(`div`,{className:`flex items-center bg-krona-workspace rounded-lg border border-krona-border/80 p-0.5`,children:[(0,T.jsx)(`button`,{onClick:G,disabled:H<=0,className:`p-1.5 rounded text-krona-secondary hover:text-krona-primary disabled:opacity-30 disabled:cursor-not-allowed`,title:`Отменить (Ctrl+Z)`,children:(0,T.jsx)(C,{className:`w-4 h-4`})}),(0,T.jsx)(`button`,{onClick:K,disabled:H>=B.length-1,className:`p-1.5 rounded text-krona-secondary hover:text-krona-primary disabled:opacity-30 disabled:cursor-not-allowed`,title:`Повторить (Ctrl+Y)`,children:(0,T.jsx)(x,{className:`w-4 h-4`})})]}),(0,T.jsxs)(`div`,{className:`flex items-center bg-krona-workspace rounded-lg border border-krona-border/80 p-0.5`,children:[(0,T.jsx)(`button`,{onClick:()=>D(`desktop`),className:`p-1.5 rounded ${E===`desktop`?`bg-krona-surface text-krona-green shadow-sm`:`text-krona-secondary`}`,title:`Десктоп (1440px)`,children:(0,T.jsx)(ee,{className:`w-4 h-4`})}),(0,T.jsx)(`button`,{onClick:()=>D(`tablet`),className:`p-1.5 rounded ${E===`tablet`?`bg-krona-surface text-krona-green shadow-sm`:`text-krona-secondary`}`,title:`Планшет (768px)`,children:(0,T.jsx)(p,{className:`w-4 h-4`})}),(0,T.jsx)(`button`,{onClick:()=>D(`mobile`),className:`p-1.5 rounded ${E===`mobile`?`bg-krona-surface text-krona-green shadow-sm`:`text-krona-secondary`}`,title:`Мобильный (390px)`,children:(0,T.jsx)(ne,{className:`w-4 h-4`})})]}),(0,T.jsxs)(n,{variant:O?`secondary`:`outline`,size:`sm`,onClick:()=>k(!O),children:[(0,T.jsx)(c,{className:`w-3.5 h-3.5 mr-1 text-krona-gold`}),O?`В редактор`:`Предпросмотр`]}),(0,T.jsxs)(n,{variant:`primary`,size:`sm`,onClick:fe,disabled:!R&&!I,children:[(0,T.jsx)(d,{className:`w-3.5 h-3.5 mr-1`}),`Сохранить`]})]})]}),(0,T.jsxs)(`div`,{className:`grid grid-cols-1 lg:grid-cols-12 gap-4 items-start`,children:[!O&&(0,T.jsxs)(`div`,{className:`lg:col-span-3 bg-krona-surface border border-krona-border rounded-xl p-3.5 shadow-krona-soft space-y-3 sticky top-4`,children:[(0,T.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,T.jsxs)(`span`,{className:`text-xs font-bold text-krona-primary uppercase tracking-wider flex items-center gap-1.5`,children:[(0,T.jsx)(g,{className:`w-3.5 h-3.5 text-krona-green`}),`Палитра полей`]}),(0,T.jsx)(i,{variant:`neutral`,size:`sm`,children:q.length})]}),(0,T.jsx)(`div`,{className:`relative`,children:(0,T.jsx)(f,{value:A,onChange:e=>j(e.target.value),placeholder:`Поиск полей...`,icon:(0,T.jsx)(y,{className:`w-3 h-3`}),className:`text-xs py-1`})}),(0,T.jsx)(`div`,{className:`space-y-1.5 max-h-[520px] overflow-y-auto pr-1`,children:oe.map(e=>{let t=ae.has(e.key),n=s(e.type).icon;return(0,T.jsxs)(`div`,{className:`flex items-center justify-between p-2 rounded-lg border text-xs transition-all ${t?`bg-krona-workspace/40 border-krona-border/40 opacity-60`:`bg-krona-surface border-krona-border hover:border-krona-green hover:shadow-xs`}`,children:[(0,T.jsxs)(`div`,{className:`flex items-center gap-2 min-w-0`,children:[(0,T.jsx)(`div`,{className:`w-6 h-6 rounded bg-krona-workspace flex items-center justify-center shrink-0 border border-krona-border/50`,children:(0,T.jsx)(n,{className:`w-3 h-3 text-krona-green`})}),(0,T.jsxs)(`div`,{className:`min-w-0`,children:[(0,T.jsx)(`p`,{className:`font-medium text-krona-primary truncate leading-snug`,children:e.label}),(0,T.jsx)(`p`,{className:`font-mono text-[10px] text-krona-secondary truncate`,children:e.key})]})]}),(0,T.jsx)(`button`,{type:`button`,disabled:t,onClick:()=>se(e.key),className:`px-2 py-1 rounded text-[10px] font-semibold shrink-0 cursor-pointer ${t?`text-krona-secondary cursor-not-allowed`:`bg-krona-green/10 text-krona-green hover:bg-krona-green hover:text-white`}`,title:t?`Уже на форме`:`Добавить в секцию`,children:t?`Добавлено`:`+ Добавить`})]},e.key)})}),(0,T.jsx)(`div`,{className:`pt-2 border-t border-krona-border/60`,children:(0,T.jsxs)(n,{variant:`outline`,size:`sm`,className:`w-full text-xs`,onClick:ue,children:[(0,T.jsx)(v,{className:`w-3.5 h-3.5 mr-1`}),`Создать секцию`]})})]}),(0,T.jsx)(`div`,{className:`${O?`lg:col-span-12`:`lg:col-span-9`} flex flex-col items-center transition-all`,children:(0,T.jsxs)(`div`,{className:`${pe} transition-all duration-200 space-y-4`,children:[(0,T.jsxs)(`div`,{className:`flex items-center justify-between px-3 py-1.5 bg-krona-surface-muted/60 border border-krona-border rounded-lg text-xs text-krona-secondary`,children:[(0,T.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,T.jsxs)(`span`,{className:`font-semibold text-krona-primary capitalize`,children:[`Режим: `,E]}),(0,T.jsx)(`span`,{children:`•`}),(0,T.jsx)(`span`,{children:E===`desktop`?`1440px`:E===`tablet`?`768px`:`390px`})]}),O&&(0,T.jsx)(i,{variant:`gold`,size:`sm`,children:`Режим интерактивного тестирования`})]}),I?.sections.map((e,t)=>{let n={1:`grid-cols-1`,2:`grid-cols-1 md:grid-cols-2`,3:`grid-cols-1 md:grid-cols-3`,4:`grid-cols-1 md:grid-cols-4`}[E===`mobile`?1:e.columns];return(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 gap-2 pb-2 border-b border-krona-border/60`,children:[O?(0,T.jsx)(`h3`,{className:`font-semibold text-sm text-krona-primary`,children:e.title}):(0,T.jsx)(`div`,{className:`flex items-center gap-2 flex-1`,children:(0,T.jsx)(`input`,{type:`text`,value:e.title,onChange:t=>X(e.id,{title:t.target.value}),className:`font-semibold text-sm text-krona-primary bg-transparent border-b border-transparent hover:border-krona-border focus:border-krona-green focus:outline-none px-1 py-0.5 rounded`})}),!O&&(0,T.jsxs)(`div`,{className:`flex items-center gap-1.5`,children:[(0,T.jsx)(`div`,{className:`flex items-center gap-1 bg-krona-workspace rounded p-0.5 border border-krona-border`,children:[1,2,3,4].map(t=>(0,T.jsxs)(`button`,{onClick:()=>X(e.id,{columns:t}),className:`px-1.5 py-0.5 text-[10px] font-bold rounded ${e.columns===t?`bg-krona-green text-white`:`text-krona-secondary hover:text-krona-primary`}`,title:`${t} колонок`,children:[t,`C`]},t))}),(0,T.jsx)(`button`,{onClick:()=>Z(t,t-1),disabled:t===0,className:`p-1 text-krona-secondary hover:text-krona-primary disabled:opacity-30`,title:`Переместить секцию вверх`,children:(0,T.jsx)(u,{className:`w-3.5 h-3.5`})}),(0,T.jsx)(`button`,{onClick:()=>Z(t,t+1),disabled:t===I.sections.length-1,className:`p-1 text-krona-secondary hover:text-krona-primary disabled:opacity-30`,title:`Переместить секцию вниз`,children:(0,T.jsx)(l,{className:`w-3.5 h-3.5`})}),(0,T.jsx)(`button`,{onClick:()=>de(e.id),className:`p-1 text-krona-danger hover:bg-krona-danger/10 rounded`,title:`Удалить секцию`,children:(0,T.jsx)(_,{className:`w-3.5 h-3.5`})})]})]}),(0,T.jsxs)(`div`,{className:`grid ${n} gap-3 min-h-[50px]`,children:[e.fieldKeys.map((t,n)=>{let r=J.get(t);if(!r)return null;let a=s(r.type),o=a.icon,c=P[t]||{},l=M===t;return O?(0,T.jsxs)(`div`,{className:`p-3 bg-krona-workspace/40 rounded-lg border border-krona-border/60 space-y-1`,children:[(0,T.jsxs)(`label`,{className:`text-xs font-semibold text-krona-primary block`,children:[c.label||r.label,(c.required??r.required)&&(0,T.jsx)(`span`,{className:`text-krona-danger ml-1`,children:`*`})]}),r.type===`status`||r.type===`select`?(0,T.jsxs)(`select`,{className:`w-full bg-krona-surface border border-krona-border rounded-md px-2.5 py-1.5 text-xs text-krona-primary`,children:[(0,T.jsx)(`option`,{value:``,children:`Выберите вариант...`}),r.options?.map(e=>(0,T.jsx)(`option`,{value:e.value,children:e.label},e.value))]}):r.type===`boolean`?(0,T.jsxs)(`div`,{className:`flex items-center gap-2 pt-1`,children:[(0,T.jsx)(`input`,{type:`checkbox`,className:`rounded text-krona-green`}),(0,T.jsx)(`span`,{className:`text-xs text-krona-secondary`,children:`Да / Нет`})]}):r.type===`long_text`||r.type===`rich_text`?(0,T.jsx)(`textarea`,{placeholder:c.placeholder||r.placeholder||`Введите текст...`,className:`w-full bg-krona-surface border border-krona-border rounded-md px-2.5 py-1.5 text-xs text-krona-primary`,rows:2}):(0,T.jsx)(`input`,{type:r.type===`number`||r.type===`integer`?`number`:`text`,placeholder:c.placeholder||r.placeholder||`Значение...`,className:`w-full bg-krona-surface border border-krona-border rounded-md px-2.5 py-1.5 text-xs text-krona-primary`}),(c.helpText||r.description)&&(0,T.jsx)(`p`,{className:`text-[10px] text-krona-secondary`,children:c.helpText||r.description})]},t):(0,T.jsxs)(`div`,{onClick:()=>N(t),className:`flex flex-col justify-between p-3 rounded-lg border text-xs cursor-pointer transition-all ${l?`bg-krona-green/5 border-krona-green ring-1 ring-krona-green`:`bg-krona-workspace/60 border-krona-border hover:border-krona-secondary`}`,children:[(0,T.jsxs)(`div`,{className:`flex items-start justify-between gap-1.5 mb-2`,children:[(0,T.jsxs)(`div`,{className:`flex items-center gap-2 min-w-0`,children:[(0,T.jsx)(`div`,{className:`w-6 h-6 rounded bg-krona-surface flex items-center justify-center border border-krona-border/60 shrink-0`,children:(0,T.jsx)(o,{className:`w-3.5 h-3.5 text-krona-green`})}),(0,T.jsxs)(`div`,{className:`min-w-0`,children:[(0,T.jsxs)(`span`,{className:`font-semibold text-krona-primary truncate block`,children:[c.label||r.label,(c.required??r.required)&&(0,T.jsx)(`span`,{className:`text-krona-danger ml-0.5`,children:`*`})]}),(0,T.jsx)(`span`,{className:`font-mono text-[10px] text-krona-secondary block truncate`,children:r.key})]})]}),(0,T.jsx)(i,{variant:`neutral`,size:`sm`,className:`text-[10px] shrink-0`,children:a.label})]}),(0,T.jsxs)(`div`,{className:`flex items-center justify-between pt-1 border-t border-krona-border/40 text-[11px] text-krona-secondary`,children:[(0,T.jsxs)(`div`,{className:`flex items-center gap-1`,children:[(0,T.jsx)(`button`,{type:`button`,onClick:t=>{t.stopPropagation(),Y(e.id,n,Math.max(0,n-1))},disabled:n===0,className:`p-0.5 hover:text-krona-primary disabled:opacity-20`,title:`Переместить влево/вверх`,children:`←`}),(0,T.jsx)(`button`,{type:`button`,onClick:t=>{t.stopPropagation(),Y(e.id,n,Math.min(e.fieldKeys.length-1,n+1))},disabled:n===e.fieldKeys.length-1,className:`p-0.5 hover:text-krona-primary disabled:opacity-20`,title:`Переместить вправо/вниз`,children:`→`})]}),(0,T.jsxs)(`div`,{className:`flex items-center gap-1`,children:[I.sections.length>1&&(0,T.jsxs)(`select`,{onClick:e=>e.stopPropagation(),onChange:n=>{le(e.id,n.target.value,t)},value:``,className:`text-[10px] bg-krona-surface border border-krona-border rounded px-1 py-0.5`,title:`Перенести в другую секцию`,children:[(0,T.jsx)(`option`,{value:``,disabled:!0,children:`Перенести...`}),I.sections.filter(t=>t.id!==e.id).map(e=>(0,T.jsx)(`option`,{value:e.id,children:e.title},e.id))]}),(0,T.jsx)(`button`,{type:`button`,onClick:n=>{n.stopPropagation(),ce(e.id,t)},className:`p-0.5 text-krona-danger hover:bg-krona-danger/10 rounded`,title:`Убрать с формы`,children:(0,T.jsx)(_,{className:`w-3 h-3`})})]})]})]},t)}),e.fieldKeys.length===0&&!O&&(0,T.jsx)(`div`,{className:`col-span-full py-6 text-center border border-dashed border-krona-border rounded-lg text-xs text-krona-secondary`,children:`Секция пуста. Нажмите «+ Добавить» в левой палитре полей.`})]})]},e.id)})]})})]}),(0,T.jsx)(re,{isOpen:!!Q&&!O,onClose:()=>N(null),title:Q?`Свойства поля: ${Q.label}`:`Свойства`,subtitle:`Код: ${M} | Тип: ${Q?.type}`,width:`md`,children:Q&&(0,T.jsxs)(`div`,{className:`space-y-4 text-xs`,children:[(0,T.jsx)(f,{label:`Пользовательский заголовок (Label Override)`,value:$.label??Q.label,onChange:e=>F(t=>({...t,[Q.key]:{...t[Q.key],label:e.target.value}})),placeholder:Q.label}),(0,T.jsx)(f,{label:`Подсказка (Placeholder)`,value:$.placeholder??Q.placeholder??``,onChange:e=>F(t=>({...t,[Q.key]:{...t[Q.key],placeholder:e.target.value}})),placeholder:`Введите текст подсказки...`}),(0,T.jsx)(f,{label:`Текст справки / описания`,value:$.helpText??Q.description??``,onChange:e=>F(t=>({...t,[Q.key]:{...t[Q.key],helpText:e.target.value}})),placeholder:`Пояснение для пользователя...`}),(0,T.jsxs)(`div`,{className:`p-3 bg-krona-workspace rounded-lg border border-krona-border space-y-2`,children:[(0,T.jsxs)(`label`,{className:`flex items-center gap-2 cursor-pointer font-medium text-krona-primary`,children:[(0,T.jsx)(`input`,{type:`checkbox`,checked:$.required??Q.required??!1,onChange:e=>F(t=>({...t,[Q.key]:{...t[Q.key],required:e.target.checked}})),className:`rounded text-krona-green`}),`Обязательно для заполнения на этой форме`]}),(0,T.jsxs)(`label`,{className:`flex items-center gap-2 cursor-pointer font-medium text-krona-primary`,children:[(0,T.jsx)(`input`,{type:`checkbox`,checked:$.readOnly??Q.readOnly??!1,onChange:e=>F(t=>({...t,[Q.key]:{...t[Q.key],readOnly:e.target.checked}})),className:`rounded text-krona-green`}),`Только чтение (Read-Only)`]})]}),(0,T.jsxs)(`div`,{className:`p-3 bg-krona-workspace rounded-lg border border-krona-border space-y-2`,children:[(0,T.jsx)(`span`,{className:`font-semibold text-krona-primary block`,children:`Условное отображение (Conditional Logic)`}),(0,T.jsx)(`p`,{className:`text-[11px] text-krona-secondary`,children:`Показывать поле только при соблюдении условия:`}),(0,T.jsxs)(`div`,{className:`space-y-2`,children:[(0,T.jsxs)(`select`,{value:$.conditionFieldKey||``,onChange:e=>F(t=>({...t,[Q.key]:{...t[Q.key],conditionFieldKey:e.target.value}})),className:`w-full bg-krona-surface text-krona-primary border border-krona-border rounded px-2 py-1`,children:[(0,T.jsx)(`option`,{value:``,children:`Без условий (всегда отображать)`}),q.filter(e=>e.key!==Q.key).map(e=>(0,T.jsxs)(`option`,{value:e.key,children:[`Если `,e.label,` (`,e.key,`)`]},e.key))]}),$.conditionFieldKey&&(0,T.jsxs)(`div`,{className:`grid grid-cols-2 gap-2`,children:[(0,T.jsxs)(`select`,{value:$.conditionOperator||`eq`,onChange:e=>F(t=>({...t,[Q.key]:{...t[Q.key],conditionOperator:e.target.value}})),className:`bg-krona-surface text-krona-primary border border-krona-border rounded px-2 py-1`,children:[(0,T.jsx)(`option`,{value:`eq`,children:`равно (=)`}),(0,T.jsx)(`option`,{value:`neq`,children:`не равно (≠)`}),(0,T.jsx)(`option`,{value:`contains`,children:`содержит`})]}),(0,T.jsx)(`input`,{type:`text`,placeholder:`Значение...`,value:$.conditionValue||``,onChange:e=>F(t=>({...t,[Q.key]:{...t[Q.key],conditionValue:e.target.value}})),className:`bg-krona-surface text-krona-primary border border-krona-border rounded px-2 py-1`})]})]})]}),(0,T.jsx)(`div`,{className:`flex justify-end gap-2 pt-3 border-t border-krona-border`,children:(0,T.jsx)(n,{variant:`primary`,size:`sm`,onClick:()=>N(null),children:`Готово`})})]})})]})};export{E as FormBuilder,E as default}; \ No newline at end of file diff --git a/dist/assets/HelpDeskModule-B1p0xcj-.js b/dist/assets/HelpDeskModule-BIrYP26C.js similarity index 94% rename from dist/assets/HelpDeskModule-B1p0xcj-.js rename to dist/assets/HelpDeskModule-BIrYP26C.js index 3871946..ae4bc5c 100644 --- a/dist/assets/HelpDeskModule-B1p0xcj-.js +++ b/dist/assets/HelpDeskModule-BIrYP26C.js @@ -1 +1 @@ -import{f as e,h as t,i as n,r,s as i,t as a}from"./useToast-CS8pZhce.js";import{A as o,P as s,R as c,V as l,p as u,r as d,t as f,v as p,y as m}from"./index-CNnq9VO5.js";import{u as h}from"./mockData-DAqQG5te.js";var g=t(e(),1),_=i(),v=h.map((e,t)=>({...e,status:t===0?`in_progress`:t===1?`new`:`resolved`,internalNotes:[{text:`Проверили чек в кассе — соусы действительно не были вложены комплектовщиком смены.`,author:`Менеджер смены`,time:`Вчера 16:35`}],publicReplies:[{text:`Здравствуйте, Анна! Приносим искренние извинения за ситуацию.`,author:`Поддержка Кроны`,time:`Вчера 16:40`}]})),y=[`Алина Соколова`,`Артем Васильев`,`Екатерина Иванова`,`Сергей Петров (Старший менеджер)`],b=()=>{let{showToast:e}=a(),[t,i]=(0,g.useState)(v),[h,b]=(0,g.useState)(null),[x,S]=(0,g.useState)(``),[C,w]=(0,g.useState)(`all`),[T,E]=(0,g.useState)(`public`),[D,O]=(0,g.useState)(``),k=t.filter(e=>{let t=C===`all`||e.status===C,n=!x||e.subject.toLowerCase().includes(x.toLowerCase())||e.clientName.toLowerCase().includes(x.toLowerCase())||e.id.toLowerCase().includes(x.toLowerCase());return t&&n}),A=e=>{switch(e){case`urgent`:return(0,_.jsx)(r,{variant:`danger`,size:`sm`,children:`Срочно (15 мин SLA)`});case`high`:return(0,_.jsx)(r,{variant:`warning`,size:`sm`,children:`Высокий`});case`medium`:return(0,_.jsx)(r,{variant:`gold`,size:`sm`,children:`Средний`});default:return(0,_.jsx)(r,{variant:`neutral`,size:`sm`,children:`Обычный`})}},j=e=>{switch(e){case`new`:return(0,_.jsx)(r,{variant:`neutral`,size:`sm`,children:`Новый`});case`in_progress`:return(0,_.jsx)(r,{variant:`warning`,size:`sm`,children:`В работе`});case`waiting`:return(0,_.jsx)(r,{variant:`info`,size:`sm`,children:`Ожидает ответа`});case`resolved`:return(0,_.jsx)(r,{variant:`green`,size:`sm`,children:`Решен`});case`closed`:return(0,_.jsx)(r,{variant:`gray`,size:`sm`,children:`Закрыт`})}},M=e=>e<=0?(0,_.jsxs)(`span`,{className:`inline-flex items-center gap-1 font-mono text-[11px] font-bold text-rose-600 bg-rose-500/10 px-2 py-0.5 rounded border border-rose-500/30`,children:[(0,_.jsx)(l,{className:`w-3 h-3`}),` SLA: Нарушен!`]}):e<15?(0,_.jsxs)(`span`,{className:`inline-flex items-center gap-1 font-mono text-[11px] font-bold text-rose-600 bg-rose-500/10 px-2 py-0.5 rounded border border-rose-500/30`,children:[(0,_.jsx)(c,{className:`w-3 h-3`}),` SLA: `,e,` мин осталось`]}):e<=60?(0,_.jsxs)(`span`,{className:`inline-flex items-center gap-1 font-mono text-[11px] font-medium text-amber-600 bg-amber-500/10 px-2 py-0.5 rounded border border-amber-500/30`,children:[(0,_.jsx)(c,{className:`w-3 h-3`}),` SLA: `,e,` мин`]}):(0,_.jsxs)(`span`,{className:`inline-flex items-center gap-1 font-mono text-[11px] font-medium text-emerald-700 bg-emerald-500/10 px-2 py-0.5 rounded border border-emerald-500/30`,children:[(0,_.jsx)(c,{className:`w-3 h-3`}),` SLA: `,Math.floor(e/60),`ч `,e%60,`м`]}),N=(t,n)=>{i(e=>e.map(e=>e.id===t?{...e,status:n}:e)),h&&h.id===t&&b({...h,status:n}),e({title:`Статус обновлен`,message:`Тикет переведен в статус «${n}»`,type:`success`})},P=(t,n)=>{i(e=>e.map(e=>e.id===t?{...e,assignee:n}:e)),h&&h.id===t&&b({...h,assignee:n}),e({title:`Ответственный назначен`,message:`Назначен сотрудник: ${n}`,type:`info`})};return(0,_.jsxs)(`div`,{className:`space-y-4 animate-fade-in`,children:[(0,_.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,_.jsxs)(`div`,{children:[(0,_.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,_.jsx)(`h2`,{className:`text-sm font-bold text-krona-primary`,children:`HelpDesk & Центр решения обращений и жалоб гостей`}),(0,_.jsx)(f,{level:`target`,size:`sm`})]}),(0,_.jsx)(`p`,{className:`text-xs text-krona-secondary mt-0.5`,children:`Очередь обращений, контроль жестких SLA нормативов, база знаний и AI-рекомендации`})]}),(0,_.jsxs)(`div`,{className:`flex items-center gap-2 text-xs`,children:[(0,_.jsx)(r,{variant:`danger`,size:`md`,children:`1 срочный тикет`}),(0,_.jsx)(r,{variant:`green`,size:`md`,children:`SLA 98.4% выполнения`})]})]}),(0,_.jsxs)(`div`,{className:`flex flex-col sm:flex-row sm:items-center justify-between gap-3`,children:[(0,_.jsx)(`div`,{className:`flex items-center gap-1.5 overflow-x-auto text-xs`,children:[{id:`all`,label:`Все обращения`},{id:`new`,label:`Новые`},{id:`in_progress`,label:`В работе`},{id:`waiting`,label:`Ожидают`},{id:`resolved`,label:`Решенные`}].map(e=>(0,_.jsx)(`button`,{onClick:()=>w(e.id),className:`px-3 py-1.5 rounded-lg font-medium transition-colors whitespace-nowrap ${C===e.id?`bg-[#2F684C] text-white shadow-sm`:`bg-krona-surface text-krona-secondary hover:text-krona-primary border border-krona-border`}`,children:e.label},e.id))}),(0,_.jsxs)(`div`,{className:`relative w-64`,children:[(0,_.jsx)(m,{className:`w-3.5 h-3.5 absolute left-2.5 top-2.5 text-krona-secondary`}),(0,_.jsx)(`input`,{type:`text`,value:x,onChange:e=>S(e.target.value),placeholder:`Поиск обращений...`,className:`w-full pl-8 pr-3 py-1.5 text-xs bg-krona-surface border border-krona-border rounded-lg text-krona-primary placeholder:text-krona-secondary focus:outline-none focus:border-krona-green`})]})]}),(0,_.jsx)(`div`,{className:`grid grid-cols-1 md:grid-cols-3 gap-4`,children:k.map(e=>(0,_.jsxs)(`div`,{onClick:()=>b(e),className:`p-4 rounded-xl border border-krona-border bg-krona-surface hover:border-krona-border-strong shadow-krona-soft cursor-pointer transition-all flex flex-col justify-between space-y-3`,children:[(0,_.jsxs)(`div`,{children:[(0,_.jsxs)(`div`,{className:`flex items-center justify-between mb-1.5`,children:[(0,_.jsx)(`span`,{className:`font-mono font-bold text-xs text-krona-secondary`,children:e.id}),(0,_.jsxs)(`div`,{className:`flex items-center gap-1`,children:[j(e.status),A(e.priority)]})]}),(0,_.jsx)(`h4`,{className:`text-xs font-bold text-krona-primary leading-snug line-clamp-2`,children:e.subject}),(0,_.jsxs)(`div`,{className:`space-y-1 text-xs text-krona-secondary border-t border-krona-border/40 pt-2.5 mt-2.5`,children:[(0,_.jsxs)(`div`,{className:`flex justify-between`,children:[(0,_.jsx)(`span`,{children:`Клиент:`}),(0,_.jsx)(`span`,{className:`font-medium text-krona-primary`,children:e.clientName})]}),(0,_.jsxs)(`div`,{className:`flex justify-between`,children:[(0,_.jsx)(`span`,{children:`Канал:`}),(0,_.jsx)(`span`,{className:`capitalize`,children:e.channel})]}),(0,_.jsxs)(`div`,{className:`flex justify-between`,children:[(0,_.jsx)(`span`,{children:`Ответственный:`}),(0,_.jsx)(`span`,{className:`font-medium text-krona-primary truncate max-w-[140px]`,children:e.assignee})]})]})]}),(0,_.jsxs)(`div`,{className:`pt-2 border-t border-krona-border/40 flex items-center justify-between`,children:[M(e.slaMinutesLeft),(0,_.jsx)(`span`,{className:`text-xs text-krona-green font-medium hover:underline`,children:`Открыть →`})]})]},e.id))}),h&&(0,_.jsx)(d,{isOpen:!!h,onClose:()=>b(null),title:`Обращение: ${h.id}`,subtitle:`Клиент: ${h.clientName} • ${h.createdTime}`,maxWidth:`lg`,children:(0,_.jsxs)(`div`,{className:`space-y-4 text-xs`,children:[(0,_.jsxs)(`div`,{className:`p-3 bg-krona-workspace rounded-xl border border-krona-border grid grid-cols-1 sm:grid-cols-3 gap-3`,children:[(0,_.jsxs)(`div`,{children:[(0,_.jsx)(`label`,{className:`text-[10px] text-krona-secondary block mb-1`,children:`Статус инцидента:`}),(0,_.jsxs)(`select`,{value:h.status,onChange:e=>N(h.id,e.target.value),className:`w-full p-1.5 bg-krona-surface border border-krona-border rounded-lg text-xs font-semibold text-krona-primary focus:outline-none`,children:[(0,_.jsx)(`option`,{value:`new`,children:`Новый`}),(0,_.jsx)(`option`,{value:`in_progress`,children:`В работе`}),(0,_.jsx)(`option`,{value:`waiting`,children:`Ожидает ответа`}),(0,_.jsx)(`option`,{value:`resolved`,children:`Решен`}),(0,_.jsx)(`option`,{value:`closed`,children:`Закрыт`})]})]}),(0,_.jsxs)(`div`,{children:[(0,_.jsx)(`label`,{className:`text-[10px] text-krona-secondary block mb-1`,children:`Назначить сотрудника:`}),(0,_.jsx)(`select`,{value:h.assignee,onChange:e=>P(h.id,e.target.value),className:`w-full p-1.5 bg-krona-surface border border-krona-border rounded-lg text-xs font-semibold text-krona-primary focus:outline-none`,children:y.map(e=>(0,_.jsx)(`option`,{value:e,children:e},e))})]}),(0,_.jsxs)(`div`,{children:[(0,_.jsx)(`label`,{className:`text-[10px] text-krona-secondary block mb-1`,children:`Контроль SLA:`}),(0,_.jsx)(`div`,{children:M(h.slaMinutesLeft)})]})]}),(0,_.jsxs)(`div`,{className:`p-3 bg-krona-surface rounded-xl border border-krona-border space-y-1.5`,children:[(0,_.jsx)(`h4`,{className:`font-bold text-sm text-krona-primary`,children:h.subject}),(0,_.jsxs)(`p`,{className:`text-krona-secondary leading-relaxed`,children:[`Обращение зарегистрировано через канал `,h.channel,`. Заказ привязан к локации: Красный пр-т 186а.`]})]}),(0,_.jsxs)(`div`,{className:`p-3 bg-krona-gold/10 border border-krona-gold/30 rounded-xl space-y-1.5`,children:[(0,_.jsxs)(`div`,{className:`flex items-center gap-1.5 text-krona-gold-text font-bold text-xs`,children:[(0,_.jsx)(u,{className:`w-3.5 h-3.5 text-krona-gold`}),(0,_.jsx)(`span`,{children:`Рекомендация Krona AI:`})]}),(0,_.jsx)(`p`,{className:`text-krona-primary leading-relaxed`,children:`Начислить клиенту 300 бонусных баллов с извинениями и отправить курьера с недостающими соусами и комплиментом (морс 0.5л). Клиент относится к категории VIP (LTV 84 200 ₽).`})]}),(0,_.jsxs)(`div`,{className:`space-y-2`,children:[(0,_.jsx)(`h5`,{className:`font-bold text-krona-primary`,children:`История переписки и служебных заметок:`}),(0,_.jsxs)(`div`,{className:`space-y-2 max-h-48 overflow-y-auto pr-1`,children:[h.publicReplies?.map((e,t)=>(0,_.jsxs)(`div`,{className:`p-2.5 rounded-lg bg-emerald-500/5 border border-emerald-500/20 text-xs`,children:[(0,_.jsxs)(`div`,{className:`flex justify-between items-center text-[10px] text-emerald-800 dark:text-emerald-300 font-semibold mb-1`,children:[(0,_.jsxs)(`span`,{className:`flex items-center gap-1`,children:[(0,_.jsx)(s,{className:`w-3 h-3`}),` Ответ гостю (`,e.author,`)`]}),(0,_.jsx)(`span`,{children:e.time})]}),(0,_.jsx)(`p`,{className:`text-krona-primary`,children:e.text})]},t)),h.internalNotes?.map((e,t)=>(0,_.jsxs)(`div`,{className:`p-2.5 rounded-lg bg-amber-500/10 border border-amber-500/30 text-xs`,children:[(0,_.jsxs)(`div`,{className:`flex justify-between items-center text-[10px] text-amber-800 dark:text-amber-300 font-semibold mb-1`,children:[(0,_.jsxs)(`span`,{className:`flex items-center gap-1`,children:[(0,_.jsx)(o,{className:`w-3 h-3`}),` Внутренняя заметка команды (`,e.author,`)`]}),(0,_.jsx)(`span`,{children:e.time})]}),(0,_.jsx)(`p`,{className:`text-krona-primary`,children:e.text})]},t))]})]}),(0,_.jsxs)(`form`,{onSubmit:t=>{if(t.preventDefault(),!D.trim()||!h)return;let n={text:D.trim(),author:`Вы (Оператор службы заботы)`,time:`Только что`},r={...h,...T===`internal`?{internalNotes:[...h.internalNotes||[],n]}:{publicReplies:[...h.publicReplies||[],n]}};i(e=>e.map(e=>e.id===h.id?r:e)),b(r),O(``),e({title:T===`internal`?`Внутренняя заметка сохранена`:`Ответ отправлен клиенту`,message:T===`internal`?`Заметка видна только сотрудникам`:`Сообщение отправлено в канал связи гостя`,type:`success`})},className:`space-y-2 pt-2 border-t border-krona-border`,children:[(0,_.jsx)(`div`,{className:`flex items-center justify-between`,children:(0,_.jsxs)(`div`,{className:`flex items-center gap-1 bg-krona-workspace p-0.5 rounded-lg border border-krona-border text-[11px]`,children:[(0,_.jsxs)(`button`,{type:`button`,onClick:()=>E(`public`),className:`px-2.5 py-1 rounded transition-colors flex items-center gap-1 ${T===`public`?`bg-[#2F684C] text-white shadow-sm font-medium`:`text-krona-secondary`}`,children:[(0,_.jsx)(s,{className:`w-3 h-3`}),` Публичный ответ клиенту`]}),(0,_.jsxs)(`button`,{type:`button`,onClick:()=>E(`internal`),className:`px-2.5 py-1 rounded transition-colors flex items-center gap-1 ${T===`internal`?`bg-amber-600 text-white shadow-sm font-medium`:`text-krona-secondary`}`,children:[(0,_.jsx)(o,{className:`w-3 h-3`}),` Внутренняя заметка (для коллег)`]})]})}),(0,_.jsxs)(`div`,{className:`flex gap-2`,children:[(0,_.jsx)(`input`,{type:`text`,value:D,onChange:e=>O(e.target.value),placeholder:T===`public`?`Напишите публичный ответ клиенту...`:`Напишите служебную заметку для коллег...`,className:`flex-1 p-2 bg-krona-workspace border border-krona-border rounded-lg text-xs text-krona-primary focus:outline-none focus:border-krona-green`}),(0,_.jsxs)(n,{type:`submit`,variant:T===`internal`?`gold`:`primary`,size:`sm`,className:`px-3`,children:[(0,_.jsx)(p,{className:`w-3.5 h-3.5 mr-1`}),T===`internal`?`Сохранить заметку`:`Отправить ответ`]})]})]})]})})]})};export{b as HelpDeskModule}; \ No newline at end of file +import{f as e,h as t,i as n,r,s as i,t as a}from"./useToast-CS8pZhce.js";import{B as o,F as s,U as c,b as l,j as u,m as d,r as f,t as p,y as m}from"./index-CrJKtV0u.js";import{u as h}from"./mockData-DAqQG5te.js";var g=t(e(),1),_=i(),v=h.map((e,t)=>({...e,status:t===0?`in_progress`:t===1?`new`:`resolved`,internalNotes:[{text:`Проверили чек в кассе — соусы действительно не были вложены комплектовщиком смены.`,author:`Менеджер смены`,time:`Вчера 16:35`}],publicReplies:[{text:`Здравствуйте, Анна! Приносим искренние извинения за ситуацию.`,author:`Поддержка Кроны`,time:`Вчера 16:40`}]})),y=[`Алина Соколова`,`Артем Васильев`,`Екатерина Иванова`,`Сергей Петров (Старший менеджер)`],b=()=>{let{showToast:e}=a(),[t,i]=(0,g.useState)(v),[h,b]=(0,g.useState)(null),[x,S]=(0,g.useState)(``),[C,w]=(0,g.useState)(`all`),[T,E]=(0,g.useState)(`public`),[D,O]=(0,g.useState)(``),k=t.filter(e=>{let t=C===`all`||e.status===C,n=!x||e.subject.toLowerCase().includes(x.toLowerCase())||e.clientName.toLowerCase().includes(x.toLowerCase())||e.id.toLowerCase().includes(x.toLowerCase());return t&&n}),A=e=>{switch(e){case`urgent`:return(0,_.jsx)(r,{variant:`danger`,size:`sm`,children:`Срочно (15 мин SLA)`});case`high`:return(0,_.jsx)(r,{variant:`warning`,size:`sm`,children:`Высокий`});case`medium`:return(0,_.jsx)(r,{variant:`gold`,size:`sm`,children:`Средний`});default:return(0,_.jsx)(r,{variant:`neutral`,size:`sm`,children:`Обычный`})}},j=e=>{switch(e){case`new`:return(0,_.jsx)(r,{variant:`neutral`,size:`sm`,children:`Новый`});case`in_progress`:return(0,_.jsx)(r,{variant:`warning`,size:`sm`,children:`В работе`});case`waiting`:return(0,_.jsx)(r,{variant:`info`,size:`sm`,children:`Ожидает ответа`});case`resolved`:return(0,_.jsx)(r,{variant:`green`,size:`sm`,children:`Решен`});case`closed`:return(0,_.jsx)(r,{variant:`gray`,size:`sm`,children:`Закрыт`})}},M=e=>e<=0?(0,_.jsxs)(`span`,{className:`inline-flex items-center gap-1 font-mono text-[11px] font-bold text-rose-600 bg-rose-500/10 px-2 py-0.5 rounded border border-rose-500/30`,children:[(0,_.jsx)(c,{className:`w-3 h-3`}),` SLA: Нарушен!`]}):e<15?(0,_.jsxs)(`span`,{className:`inline-flex items-center gap-1 font-mono text-[11px] font-bold text-rose-600 bg-rose-500/10 px-2 py-0.5 rounded border border-rose-500/30`,children:[(0,_.jsx)(o,{className:`w-3 h-3`}),` SLA: `,e,` мин осталось`]}):e<=60?(0,_.jsxs)(`span`,{className:`inline-flex items-center gap-1 font-mono text-[11px] font-medium text-amber-600 bg-amber-500/10 px-2 py-0.5 rounded border border-amber-500/30`,children:[(0,_.jsx)(o,{className:`w-3 h-3`}),` SLA: `,e,` мин`]}):(0,_.jsxs)(`span`,{className:`inline-flex items-center gap-1 font-mono text-[11px] font-medium text-emerald-700 bg-emerald-500/10 px-2 py-0.5 rounded border border-emerald-500/30`,children:[(0,_.jsx)(o,{className:`w-3 h-3`}),` SLA: `,Math.floor(e/60),`ч `,e%60,`м`]}),N=(t,n)=>{i(e=>e.map(e=>e.id===t?{...e,status:n}:e)),h&&h.id===t&&b({...h,status:n}),e({title:`Статус обновлен`,message:`Тикет переведен в статус «${n}»`,type:`success`})},P=(t,n)=>{i(e=>e.map(e=>e.id===t?{...e,assignee:n}:e)),h&&h.id===t&&b({...h,assignee:n}),e({title:`Ответственный назначен`,message:`Назначен сотрудник: ${n}`,type:`info`})};return(0,_.jsxs)(`div`,{className:`space-y-4 animate-fade-in`,children:[(0,_.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,_.jsxs)(`div`,{children:[(0,_.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,_.jsx)(`h2`,{className:`text-sm font-bold text-krona-primary`,children:`HelpDesk & Центр решения обращений и жалоб гостей`}),(0,_.jsx)(p,{level:`target`,size:`sm`})]}),(0,_.jsx)(`p`,{className:`text-xs text-krona-secondary mt-0.5`,children:`Очередь обращений, контроль жестких SLA нормативов, база знаний и AI-рекомендации`})]}),(0,_.jsxs)(`div`,{className:`flex items-center gap-2 text-xs`,children:[(0,_.jsx)(r,{variant:`danger`,size:`md`,children:`1 срочный тикет`}),(0,_.jsx)(r,{variant:`green`,size:`md`,children:`SLA 98.4% выполнения`})]})]}),(0,_.jsxs)(`div`,{className:`flex flex-col sm:flex-row sm:items-center justify-between gap-3`,children:[(0,_.jsx)(`div`,{className:`flex items-center gap-1.5 overflow-x-auto text-xs`,children:[{id:`all`,label:`Все обращения`},{id:`new`,label:`Новые`},{id:`in_progress`,label:`В работе`},{id:`waiting`,label:`Ожидают`},{id:`resolved`,label:`Решенные`}].map(e=>(0,_.jsx)(`button`,{onClick:()=>w(e.id),className:`px-3 py-1.5 rounded-lg font-medium transition-colors whitespace-nowrap ${C===e.id?`bg-[#2F684C] text-white shadow-sm`:`bg-krona-surface text-krona-secondary hover:text-krona-primary border border-krona-border`}`,children:e.label},e.id))}),(0,_.jsxs)(`div`,{className:`relative w-64`,children:[(0,_.jsx)(l,{className:`w-3.5 h-3.5 absolute left-2.5 top-2.5 text-krona-secondary`}),(0,_.jsx)(`input`,{type:`text`,value:x,onChange:e=>S(e.target.value),placeholder:`Поиск обращений...`,className:`w-full pl-8 pr-3 py-1.5 text-xs bg-krona-surface border border-krona-border rounded-lg text-krona-primary placeholder:text-krona-secondary focus:outline-none focus:border-krona-green`})]})]}),(0,_.jsx)(`div`,{className:`grid grid-cols-1 md:grid-cols-3 gap-4`,children:k.map(e=>(0,_.jsxs)(`div`,{onClick:()=>b(e),className:`p-4 rounded-xl border border-krona-border bg-krona-surface hover:border-krona-border-strong shadow-krona-soft cursor-pointer transition-all flex flex-col justify-between space-y-3`,children:[(0,_.jsxs)(`div`,{children:[(0,_.jsxs)(`div`,{className:`flex items-center justify-between mb-1.5`,children:[(0,_.jsx)(`span`,{className:`font-mono font-bold text-xs text-krona-secondary`,children:e.id}),(0,_.jsxs)(`div`,{className:`flex items-center gap-1`,children:[j(e.status),A(e.priority)]})]}),(0,_.jsx)(`h4`,{className:`text-xs font-bold text-krona-primary leading-snug line-clamp-2`,children:e.subject}),(0,_.jsxs)(`div`,{className:`space-y-1 text-xs text-krona-secondary border-t border-krona-border/40 pt-2.5 mt-2.5`,children:[(0,_.jsxs)(`div`,{className:`flex justify-between`,children:[(0,_.jsx)(`span`,{children:`Клиент:`}),(0,_.jsx)(`span`,{className:`font-medium text-krona-primary`,children:e.clientName})]}),(0,_.jsxs)(`div`,{className:`flex justify-between`,children:[(0,_.jsx)(`span`,{children:`Канал:`}),(0,_.jsx)(`span`,{className:`capitalize`,children:e.channel})]}),(0,_.jsxs)(`div`,{className:`flex justify-between`,children:[(0,_.jsx)(`span`,{children:`Ответственный:`}),(0,_.jsx)(`span`,{className:`font-medium text-krona-primary truncate max-w-[140px]`,children:e.assignee})]})]})]}),(0,_.jsxs)(`div`,{className:`pt-2 border-t border-krona-border/40 flex items-center justify-between`,children:[M(e.slaMinutesLeft),(0,_.jsx)(`span`,{className:`text-xs text-krona-green font-medium hover:underline`,children:`Открыть →`})]})]},e.id))}),h&&(0,_.jsx)(f,{isOpen:!!h,onClose:()=>b(null),title:`Обращение: ${h.id}`,subtitle:`Клиент: ${h.clientName} • ${h.createdTime}`,maxWidth:`lg`,children:(0,_.jsxs)(`div`,{className:`space-y-4 text-xs`,children:[(0,_.jsxs)(`div`,{className:`p-3 bg-krona-workspace rounded-xl border border-krona-border grid grid-cols-1 sm:grid-cols-3 gap-3`,children:[(0,_.jsxs)(`div`,{children:[(0,_.jsx)(`label`,{className:`text-[10px] text-krona-secondary block mb-1`,children:`Статус инцидента:`}),(0,_.jsxs)(`select`,{value:h.status,onChange:e=>N(h.id,e.target.value),className:`w-full p-1.5 bg-krona-surface border border-krona-border rounded-lg text-xs font-semibold text-krona-primary focus:outline-none`,children:[(0,_.jsx)(`option`,{value:`new`,children:`Новый`}),(0,_.jsx)(`option`,{value:`in_progress`,children:`В работе`}),(0,_.jsx)(`option`,{value:`waiting`,children:`Ожидает ответа`}),(0,_.jsx)(`option`,{value:`resolved`,children:`Решен`}),(0,_.jsx)(`option`,{value:`closed`,children:`Закрыт`})]})]}),(0,_.jsxs)(`div`,{children:[(0,_.jsx)(`label`,{className:`text-[10px] text-krona-secondary block mb-1`,children:`Назначить сотрудника:`}),(0,_.jsx)(`select`,{value:h.assignee,onChange:e=>P(h.id,e.target.value),className:`w-full p-1.5 bg-krona-surface border border-krona-border rounded-lg text-xs font-semibold text-krona-primary focus:outline-none`,children:y.map(e=>(0,_.jsx)(`option`,{value:e,children:e},e))})]}),(0,_.jsxs)(`div`,{children:[(0,_.jsx)(`label`,{className:`text-[10px] text-krona-secondary block mb-1`,children:`Контроль SLA:`}),(0,_.jsx)(`div`,{children:M(h.slaMinutesLeft)})]})]}),(0,_.jsxs)(`div`,{className:`p-3 bg-krona-surface rounded-xl border border-krona-border space-y-1.5`,children:[(0,_.jsx)(`h4`,{className:`font-bold text-sm text-krona-primary`,children:h.subject}),(0,_.jsxs)(`p`,{className:`text-krona-secondary leading-relaxed`,children:[`Обращение зарегистрировано через канал `,h.channel,`. Заказ привязан к локации: Красный пр-т 186а.`]})]}),(0,_.jsxs)(`div`,{className:`p-3 bg-krona-gold/10 border border-krona-gold/30 rounded-xl space-y-1.5`,children:[(0,_.jsxs)(`div`,{className:`flex items-center gap-1.5 text-krona-gold-text font-bold text-xs`,children:[(0,_.jsx)(d,{className:`w-3.5 h-3.5 text-krona-gold`}),(0,_.jsx)(`span`,{children:`Рекомендация Krona AI:`})]}),(0,_.jsx)(`p`,{className:`text-krona-primary leading-relaxed`,children:`Начислить клиенту 300 бонусных баллов с извинениями и отправить курьера с недостающими соусами и комплиментом (морс 0.5л). Клиент относится к категории VIP (LTV 84 200 ₽).`})]}),(0,_.jsxs)(`div`,{className:`space-y-2`,children:[(0,_.jsx)(`h5`,{className:`font-bold text-krona-primary`,children:`История переписки и служебных заметок:`}),(0,_.jsxs)(`div`,{className:`space-y-2 max-h-48 overflow-y-auto pr-1`,children:[h.publicReplies?.map((e,t)=>(0,_.jsxs)(`div`,{className:`p-2.5 rounded-lg bg-emerald-500/5 border border-emerald-500/20 text-xs`,children:[(0,_.jsxs)(`div`,{className:`flex justify-between items-center text-[10px] text-emerald-800 dark:text-emerald-300 font-semibold mb-1`,children:[(0,_.jsxs)(`span`,{className:`flex items-center gap-1`,children:[(0,_.jsx)(s,{className:`w-3 h-3`}),` Ответ гостю (`,e.author,`)`]}),(0,_.jsx)(`span`,{children:e.time})]}),(0,_.jsx)(`p`,{className:`text-krona-primary`,children:e.text})]},t)),h.internalNotes?.map((e,t)=>(0,_.jsxs)(`div`,{className:`p-2.5 rounded-lg bg-amber-500/10 border border-amber-500/30 text-xs`,children:[(0,_.jsxs)(`div`,{className:`flex justify-between items-center text-[10px] text-amber-800 dark:text-amber-300 font-semibold mb-1`,children:[(0,_.jsxs)(`span`,{className:`flex items-center gap-1`,children:[(0,_.jsx)(u,{className:`w-3 h-3`}),` Внутренняя заметка команды (`,e.author,`)`]}),(0,_.jsx)(`span`,{children:e.time})]}),(0,_.jsx)(`p`,{className:`text-krona-primary`,children:e.text})]},t))]})]}),(0,_.jsxs)(`form`,{onSubmit:t=>{if(t.preventDefault(),!D.trim()||!h)return;let n={text:D.trim(),author:`Вы (Оператор службы заботы)`,time:`Только что`},r={...h,...T===`internal`?{internalNotes:[...h.internalNotes||[],n]}:{publicReplies:[...h.publicReplies||[],n]}};i(e=>e.map(e=>e.id===h.id?r:e)),b(r),O(``),e({title:T===`internal`?`Внутренняя заметка сохранена`:`Ответ отправлен клиенту`,message:T===`internal`?`Заметка видна только сотрудникам`:`Сообщение отправлено в канал связи гостя`,type:`success`})},className:`space-y-2 pt-2 border-t border-krona-border`,children:[(0,_.jsx)(`div`,{className:`flex items-center justify-between`,children:(0,_.jsxs)(`div`,{className:`flex items-center gap-1 bg-krona-workspace p-0.5 rounded-lg border border-krona-border text-[11px]`,children:[(0,_.jsxs)(`button`,{type:`button`,onClick:()=>E(`public`),className:`px-2.5 py-1 rounded transition-colors flex items-center gap-1 ${T===`public`?`bg-[#2F684C] text-white shadow-sm font-medium`:`text-krona-secondary`}`,children:[(0,_.jsx)(s,{className:`w-3 h-3`}),` Публичный ответ клиенту`]}),(0,_.jsxs)(`button`,{type:`button`,onClick:()=>E(`internal`),className:`px-2.5 py-1 rounded transition-colors flex items-center gap-1 ${T===`internal`?`bg-amber-600 text-white shadow-sm font-medium`:`text-krona-secondary`}`,children:[(0,_.jsx)(u,{className:`w-3 h-3`}),` Внутренняя заметка (для коллег)`]})]})}),(0,_.jsxs)(`div`,{className:`flex gap-2`,children:[(0,_.jsx)(`input`,{type:`text`,value:D,onChange:e=>O(e.target.value),placeholder:T===`public`?`Напишите публичный ответ клиенту...`:`Напишите служебную заметку для коллег...`,className:`flex-1 p-2 bg-krona-workspace border border-krona-border rounded-lg text-xs text-krona-primary focus:outline-none focus:border-krona-green`}),(0,_.jsxs)(n,{type:`submit`,variant:T===`internal`?`gold`:`primary`,size:`sm`,className:`px-3`,children:[(0,_.jsx)(m,{className:`w-3.5 h-3.5 mr-1`}),T===`internal`?`Сохранить заметку`:`Отправить ответ`]})]})]})]})})]})};export{b as HelpDeskModule}; \ No newline at end of file diff --git a/dist/assets/InventoryModule-B2QbjtwQ.js b/dist/assets/InventoryModule-VpTxuRuh.js similarity index 95% rename from dist/assets/InventoryModule-B2QbjtwQ.js rename to dist/assets/InventoryModule-VpTxuRuh.js index 03c38a1..2a2b8d9 100644 --- a/dist/assets/InventoryModule-B2QbjtwQ.js +++ b/dist/assets/InventoryModule-VpTxuRuh.js @@ -1 +1 @@ -import{f as e,h as t,i as n,r,s as i,t as a}from"./useToast-CS8pZhce.js";import{r as o,st as s,t as c,w as l,y as u}from"./index-CNnq9VO5.js";import{t as d}from"./useOrders-Dp-LV7vp.js";import{t as f}from"./currency-DdDs82F5.js";import{t as p}from"./useInventory-BwKK4D-W.js";var m=t(e(),1),h=i(),g=()=>{let{showToast:e}=a(),{warehouses:t,stockItems:i,movements:g,receipts:_,adjustStock:v,createAndReceiveGoods:y}=p(),{products:b}=d(),[x,S]=(0,m.useState)(`balances`),[C,w]=(0,m.useState)(``),[T,E]=(0,m.useState)(`all`),[D,O]=(0,m.useState)(!1),[k,A]=(0,m.useState)(!1),[j,M]=(0,m.useState)(``),[N,P]=(0,m.useState)(`wh_main`),[F,I]=(0,m.useState)(``),[L,R]=(0,m.useState)(50),[z,B]=(0,m.useState)(12e4),[V,H]=(0,m.useState)(null),[U,W]=(0,m.useState)(`-1`),[G,K]=(0,m.useState)(`Порча / Срок годности`),q=(0,m.useMemo)(()=>i.filter(e=>{let t=T===`all`||e.warehouseId===T,n=!C||e.productName.toLowerCase().includes(C.toLowerCase())||e.sku.toLowerCase().includes(C.toLowerCase());return t&&n}),[i,T,C]),J=(0,m.useMemo)(()=>[...g].sort((e,t)=>t.timestamp>e.timestamp?1:-1),[g]),Y=async t=>{t.preventDefault();let n=b.find(e=>e.id===F)||b[0];if(!n){e(`Выберите товар`,`error`);return}try{let t=`REC-${Date.now().toString().slice(-6)}`,r=[{productId:n.id,sku:n.sku,name:n.name,quantity:L,costPrice:{minor:z,currency:`RUB`}}];await y(N,t,j||`ООО «Поставщик Продукт»`,r),e(`Поступление по накладной №${t} проведено! Остатки увеличены.`,`success`),O(!1),M(``)}catch(t){e(`Ошибка: ${t instanceof Error?t.message:String(t)}`,`error`)}},X=async t=>{if(t.preventDefault(),V)try{let t=Number(U);await v(V.warehouseId,V.productId,t,G),e(t<0?`Списание со склада проведено.`:`Корректировка остатка проведена.`,`success`),A(!1),H(null)}catch(t){e(`Ошибка: ${t instanceof Error?t.message:String(t)}`,`error`)}},Z=e=>{switch(e){case`receipt`:return(0,h.jsx)(r,{variant:`green`,size:`sm`,children:`Поступление (+)`});case`shipment`:return(0,h.jsx)(r,{variant:`blue`,size:`sm`,children:`Отгрузка (-)`});case`transfer`:return(0,h.jsx)(r,{variant:`gold`,size:`sm`,children:`Резерв / Трансфер`});case`loss`:return(0,h.jsx)(r,{variant:`danger`,size:`sm`,children:`Списание (-)`});default:return(0,h.jsx)(r,{variant:`gray`,size:`sm`,children:`Коррекция`})}};return(0,h.jsxs)(`div`,{className:`space-y-4 animate-fade-in`,children:[(0,h.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,h.jsxs)(`div`,{children:[(0,h.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,h.jsx)(`h1`,{className:`text-sm font-bold text-krona-primary`,children:`Складской учет, остатки и движение партий`}),(0,h.jsx)(c,{level:`pilot1`,size:`sm`})]}),(0,h.jsx)(`p`,{className:`text-xs text-krona-secondary mt-0.5`,children:`Точный баланс: Физический остаток, Резервы заказов, Доступное количество и Складской журнал`})]}),(0,h.jsx)(`div`,{className:`flex items-center gap-2`,children:(0,h.jsxs)(n,{variant:`primary`,size:`sm`,onClick:()=>O(!0),children:[(0,h.jsx)(l,{className:`w-3.5 h-3.5 mr-1`}),` Приходная накладная`]})})]}),(0,h.jsxs)(`div`,{className:`flex flex-col sm:flex-row sm:items-center justify-between gap-3`,children:[(0,h.jsxs)(`div`,{className:`flex items-center gap-1.5 overflow-x-auto text-xs`,children:[(0,h.jsxs)(`button`,{onClick:()=>S(`balances`),className:`px-3 py-1.5 rounded-lg font-medium transition-colors ${x===`balances`?`bg-krona-green text-white shadow-sm`:`bg-krona-surface text-krona-secondary hover:text-krona-primary border border-krona-border`}`,children:[`Остатки на складах (`,i.length,`)`]}),(0,h.jsxs)(`button`,{onClick:()=>S(`movements`),className:`px-3 py-1.5 rounded-lg font-medium transition-colors ${x===`movements`?`bg-krona-green text-white shadow-sm`:`bg-krona-surface text-krona-secondary hover:text-krona-primary border border-krona-border`}`,children:[`Журнал движений (`,g.length,`)`]}),(0,h.jsxs)(`button`,{onClick:()=>S(`receipts`),className:`px-3 py-1.5 rounded-lg font-medium transition-colors ${x===`receipts`?`bg-krona-green text-white shadow-sm`:`bg-krona-surface text-krona-secondary hover:text-krona-primary border border-krona-border`}`,children:[`Поступления (`,_.length,`)`]})]}),(0,h.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,h.jsxs)(`select`,{value:T,onChange:e=>E(e.target.value),className:`px-2.5 py-1.5 text-xs bg-krona-surface border border-krona-border rounded-lg text-krona-primary focus:outline-none focus:border-krona-green`,children:[(0,h.jsx)(`option`,{value:`all`,children:`Все склады`}),t.map(e=>(0,h.jsx)(`option`,{value:e.id,children:e.name},e.id))]}),(0,h.jsxs)(`div`,{className:`relative w-60`,children:[(0,h.jsx)(u,{className:`w-3.5 h-3.5 absolute left-2.5 top-2.5 text-krona-secondary`}),(0,h.jsx)(`input`,{type:`text`,value:C,onChange:e=>w(e.target.value),placeholder:`Поиск по артикулу или товару...`,className:`w-full pl-8 pr-3 py-1.5 text-xs bg-krona-surface border border-krona-border rounded-lg text-krona-primary focus:outline-none focus:border-krona-green`})]})]})]}),x===`balances`&&(0,h.jsx)(`div`,{className:`bg-krona-surface border border-krona-border rounded-xl shadow-krona-soft overflow-hidden`,children:(0,h.jsxs)(`table`,{className:`w-full text-xs text-left`,children:[(0,h.jsx)(`thead`,{className:`bg-krona-workspace text-krona-secondary border-b border-krona-border`,children:(0,h.jsxs)(`tr`,{children:[(0,h.jsx)(`th`,{className:`p-3 font-semibold`,children:`Артикул (SKU)`}),(0,h.jsx)(`th`,{className:`p-3 font-semibold`,children:`Наименование товара`}),(0,h.jsx)(`th`,{className:`p-3 font-semibold`,children:`Склад`}),(0,h.jsx)(`th`,{className:`p-3 font-semibold text-center`,children:`Физический остаток (On Hand)`}),(0,h.jsx)(`th`,{className:`p-3 font-semibold text-center`,children:`В резерве (Reserved)`}),(0,h.jsx)(`th`,{className:`p-3 font-semibold text-center`,children:`Доступно к заказу (Available)`}),(0,h.jsx)(`th`,{className:`p-3 font-semibold`,children:`Мин. порог`}),(0,h.jsx)(`th`,{className:`p-3 font-semibold text-right`,children:`Действие`})]})}),(0,h.jsxs)(`tbody`,{className:`divide-y divide-krona-border`,children:[q.map(e=>{let t=e.minThreshold!==void 0&&e.available<=e.minThreshold;return(0,h.jsxs)(`tr`,{className:`hover:bg-krona-workspace/50 transition-colors`,children:[(0,h.jsx)(`td`,{className:`p-3 font-mono font-semibold text-krona-secondary`,children:e.sku}),(0,h.jsx)(`td`,{className:`p-3 font-medium text-krona-primary`,children:e.productName}),(0,h.jsx)(`td`,{className:`p-3 text-krona-secondary`,children:e.warehouseName}),(0,h.jsxs)(`td`,{className:`p-3 font-bold text-krona-primary text-center`,children:[e.onHand,` `,e.unit]}),(0,h.jsx)(`td`,{className:`p-3 font-semibold text-amber-600 dark:text-amber-400 text-center`,children:e.reserved>0?`${e.reserved} ${e.unit}`:`0`}),(0,h.jsx)(`td`,{className:`p-3 text-center`,children:(0,h.jsxs)(`span`,{className:`font-bold px-2 py-0.5 rounded ${e.available>0?`bg-emerald-500/10 text-emerald-600 dark:text-emerald-400`:`bg-rose-500/10 text-rose-600 dark:text-rose-400`}`,children:[e.available,` `,e.unit]})}),(0,h.jsx)(`td`,{className:`p-3`,children:e.minThreshold===void 0?`—`:(0,h.jsxs)(`div`,{className:`flex items-center gap-1`,children:[(0,h.jsxs)(`span`,{children:[e.minThreshold,` `,e.unit]}),t&&(0,h.jsx)(r,{variant:`warning`,size:`sm`,children:`Мало`})]})}),(0,h.jsx)(`td`,{className:`p-3 text-right`,children:(0,h.jsx)(n,{variant:`secondary`,size:`sm`,onClick:()=>{H(e),W(`-1`),A(!0)},children:`Коррекция / Списание`})})]},e.id)}),q.length===0&&(0,h.jsx)(`tr`,{children:(0,h.jsx)(`td`,{colSpan:8,className:`p-8 text-center text-krona-secondary text-xs italic`,children:`Остатки не найдены`})})]})]})}),x===`movements`&&(0,h.jsx)(`div`,{className:`bg-krona-surface border border-krona-border rounded-xl shadow-krona-soft overflow-hidden`,children:(0,h.jsxs)(`table`,{className:`w-full text-xs text-left`,children:[(0,h.jsx)(`thead`,{className:`bg-krona-workspace text-krona-secondary border-b border-krona-border`,children:(0,h.jsxs)(`tr`,{children:[(0,h.jsx)(`th`,{className:`p-3 font-semibold`,children:`Дата / Время`}),(0,h.jsx)(`th`,{className:`p-3 font-semibold`,children:`Тип движения`}),(0,h.jsx)(`th`,{className:`p-3 font-semibold`,children:`Артикул`}),(0,h.jsx)(`th`,{className:`p-3 font-semibold`,children:`Товар`}),(0,h.jsx)(`th`,{className:`p-3 font-semibold`,children:`Количество`}),(0,h.jsx)(`th`,{className:`p-3 font-semibold`,children:`Основание / Примечание`})]})}),(0,h.jsxs)(`tbody`,{className:`divide-y divide-krona-border`,children:[J.map(e=>(0,h.jsxs)(`tr`,{className:`hover:bg-krona-workspace/50 transition-colors`,children:[(0,h.jsx)(`td`,{className:`p-3 font-mono text-krona-secondary`,children:s(e.timestamp)}),(0,h.jsx)(`td`,{className:`p-3`,children:Z(e.type)}),(0,h.jsx)(`td`,{className:`p-3 font-mono text-krona-secondary`,children:e.sku}),(0,h.jsx)(`td`,{className:`p-3 font-medium text-krona-primary`,children:e.productName}),(0,h.jsxs)(`td`,{className:`p-3 font-bold text-krona-primary`,children:[e.type===`receipt`?`+${e.quantity}`:e.type===`shipment`||e.type===`loss`?`-${e.quantity}`:`${e.quantity}`,` шт.`]}),(0,h.jsx)(`td`,{className:`p-3 text-krona-secondary`,children:e.notes||`—`})]},e.id)),J.length===0&&(0,h.jsx)(`tr`,{children:(0,h.jsx)(`td`,{colSpan:6,className:`p-8 text-center text-krona-secondary text-xs italic`,children:`Записи в складском журнале отсутствуют`})})]})]})}),x===`receipts`&&(0,h.jsx)(`div`,{className:`bg-krona-surface border border-krona-border rounded-xl shadow-krona-soft overflow-hidden`,children:(0,h.jsxs)(`table`,{className:`w-full text-xs text-left`,children:[(0,h.jsx)(`thead`,{className:`bg-krona-workspace text-krona-secondary border-b border-krona-border`,children:(0,h.jsxs)(`tr`,{children:[(0,h.jsx)(`th`,{className:`p-3 font-semibold`,children:`Номер накладной`}),(0,h.jsx)(`th`,{className:`p-3 font-semibold`,children:`Поставщик`}),(0,h.jsx)(`th`,{className:`p-3 font-semibold`,children:`Дата поступления`}),(0,h.jsx)(`th`,{className:`p-3 font-semibold`,children:`Позиций`}),(0,h.jsx)(`th`,{className:`p-3 font-semibold`,children:`Сумма поставки`}),(0,h.jsx)(`th`,{className:`p-3 font-semibold text-center`,children:`Статус`})]})}),(0,h.jsxs)(`tbody`,{className:`divide-y divide-krona-border`,children:[_.map(e=>(0,h.jsxs)(`tr`,{className:`hover:bg-krona-workspace/50 transition-colors`,children:[(0,h.jsx)(`td`,{className:`p-3 font-mono font-bold text-krona-primary`,children:e.receiptNumber}),(0,h.jsx)(`td`,{className:`p-3 font-medium text-krona-primary`,children:e.supplierName||`Поставщик`}),(0,h.jsx)(`td`,{className:`p-3 font-mono text-krona-secondary`,children:e.receivedAt?s(e.receivedAt):`—`}),(0,h.jsxs)(`td`,{className:`p-3 text-krona-secondary`,children:[e.items.length,` поз.`]}),(0,h.jsx)(`td`,{className:`p-3 font-bold text-krona-green`,children:f(e.totalCost.minor)}),(0,h.jsx)(`td`,{className:`p-3 text-center`,children:(0,h.jsx)(r,{variant:`green`,size:`sm`,children:`Оприходовано`})})]},e.id)),_.length===0&&(0,h.jsx)(`tr`,{children:(0,h.jsx)(`td`,{colSpan:6,className:`p-8 text-center text-krona-secondary text-xs italic`,children:`Приходные накладные отсутствуют`})})]})]})}),(0,h.jsx)(o,{isOpen:D,onClose:()=>O(!1),title:`Оформление приходной накладной (Поступление товаров)`,size:`md`,children:(0,h.jsxs)(`form`,{onSubmit:Y,className:`space-y-4 text-xs`,children:[(0,h.jsxs)(`div`,{children:[(0,h.jsx)(`label`,{className:`block font-semibold text-krona-primary mb-1`,children:`Поставщик:`}),(0,h.jsx)(`input`,{type:`text`,required:!0,value:j,onChange:e=>M(e.target.value),placeholder:`Например: ООО «Кофе Импорт Трейд»`,className:`w-full px-3 py-1.5 bg-krona-workspace border border-krona-border rounded-lg text-krona-primary`})]}),(0,h.jsxs)(`div`,{children:[(0,h.jsx)(`label`,{className:`block font-semibold text-krona-primary mb-1`,children:`Склад приемки:`}),(0,h.jsx)(`select`,{value:N,onChange:e=>P(e.target.value),className:`w-full px-3 py-1.5 bg-krona-workspace border border-krona-border rounded-lg text-krona-primary`,children:t.map(e=>(0,h.jsx)(`option`,{value:e.id,children:e.name},e.id))})]}),(0,h.jsxs)(`div`,{children:[(0,h.jsx)(`label`,{className:`block font-semibold text-krona-primary mb-1`,children:`Товар:`}),(0,h.jsx)(`select`,{value:F,onChange:e=>I(e.target.value),className:`w-full px-3 py-1.5 bg-krona-workspace border border-krona-border rounded-lg text-krona-primary`,children:b.map(e=>(0,h.jsxs)(`option`,{value:e.id,children:[e.name,` (`,e.sku,`)`]},e.id))})]}),(0,h.jsxs)(`div`,{className:`grid grid-cols-2 gap-3`,children:[(0,h.jsxs)(`div`,{children:[(0,h.jsx)(`label`,{className:`block font-semibold text-krona-primary mb-1`,children:`Количество (шт.):`}),(0,h.jsx)(`input`,{type:`number`,min:1,value:L,onChange:e=>R(Number(e.target.value)||1),className:`w-full px-3 py-1.5 bg-krona-workspace border border-krona-border rounded-lg text-krona-primary`})]}),(0,h.jsxs)(`div`,{children:[(0,h.jsx)(`label`,{className:`block font-semibold text-krona-primary mb-1`,children:`Закупочная цена (коп.):`}),(0,h.jsx)(`input`,{type:`number`,min:1,value:z,onChange:e=>B(Number(e.target.value)||0),className:`w-full px-3 py-1.5 bg-krona-workspace border border-krona-border rounded-lg text-krona-primary`})]})]}),(0,h.jsxs)(`div`,{className:`p-3 bg-emerald-500/10 border border-emerald-500/30 rounded-lg text-emerald-800 dark:text-emerald-300`,children:[`После подтверждения накладной физический и доступный остаток на складе увеличится на`,` `,(0,h.jsxs)(`strong`,{children:[L,` шт.`]}),`, а запись появится в Журнале складских движений.`]}),(0,h.jsxs)(`div`,{className:`flex justify-end gap-2 pt-2 border-t border-krona-border`,children:[(0,h.jsx)(n,{variant:`secondary`,size:`sm`,type:`button`,onClick:()=>O(!1),children:`Отмена`}),(0,h.jsxs)(n,{variant:`primary`,size:`sm`,type:`submit`,children:[(0,h.jsx)(l,{className:`w-3.5 h-3.5 mr-1`}),` Оприходовать на склад`]})]})]})}),(0,h.jsx)(o,{isOpen:k,onClose:()=>A(!1),title:V?`Коррекция остатка: ${V.productName}`:``,size:`md`,children:V&&(0,h.jsxs)(`form`,{onSubmit:X,className:`space-y-4 text-xs`,children:[(0,h.jsxs)(`div`,{className:`p-3 bg-krona-workspace rounded-lg border border-krona-border space-y-1`,children:[(0,h.jsxs)(`div`,{children:[(0,h.jsx)(`span`,{className:`text-krona-secondary`,children:`Склад:`}),` `,(0,h.jsx)(`strong`,{children:V.warehouseName})]}),(0,h.jsxs)(`div`,{children:[(0,h.jsx)(`span`,{className:`text-krona-secondary`,children:`Текущий физический остаток:`}),` `,(0,h.jsxs)(`strong`,{children:[V.onHand,` `,V.unit]})]})]}),(0,h.jsxs)(`div`,{children:[(0,h.jsx)(`label`,{className:`block font-semibold text-krona-primary mb-1`,children:`Изменение количества (+ для прихода, - для списания):`}),(0,h.jsx)(`input`,{type:`number`,value:U,onChange:e=>W(e.target.value),className:`w-full px-3 py-1.5 bg-krona-workspace border border-krona-border rounded-lg text-krona-primary font-bold`})]}),(0,h.jsxs)(`div`,{children:[(0,h.jsx)(`label`,{className:`block font-semibold text-krona-primary mb-1`,children:`Причина корректировки:`}),(0,h.jsx)(`input`,{type:`text`,required:!0,value:G,onChange:e=>K(e.target.value),className:`w-full px-3 py-1.5 bg-krona-workspace border border-krona-border rounded-lg text-krona-primary`})]}),(0,h.jsxs)(`div`,{className:`flex justify-end gap-2 pt-2 border-t border-krona-border`,children:[(0,h.jsx)(n,{variant:`secondary`,size:`sm`,type:`button`,onClick:()=>A(!1),children:`Отмена`}),(0,h.jsx)(n,{variant:`primary`,size:`sm`,type:`submit`,children:`Сохранить изменение`})]})]})})]})};export{g as InventoryModule}; \ No newline at end of file +import{f as e,h as t,i as n,r,s as i,t as a}from"./useToast-CS8pZhce.js";import{T as o,b as s,lt as c,r as l,t as u}from"./index-CrJKtV0u.js";import{t as d}from"./useOrders-TRZWcao8.js";import{t as f}from"./currency-DdDs82F5.js";import{t as p}from"./useInventory-C7Fo8GE1.js";var m=t(e(),1),h=i(),g=()=>{let{showToast:e}=a(),{warehouses:t,stockItems:i,movements:g,receipts:_,adjustStock:v,createAndReceiveGoods:y}=p(),{products:b}=d(),[x,S]=(0,m.useState)(`balances`),[C,w]=(0,m.useState)(``),[T,E]=(0,m.useState)(`all`),[D,O]=(0,m.useState)(!1),[k,A]=(0,m.useState)(!1),[j,M]=(0,m.useState)(``),[N,P]=(0,m.useState)(`wh_main`),[F,I]=(0,m.useState)(``),[L,R]=(0,m.useState)(50),[z,B]=(0,m.useState)(12e4),[V,H]=(0,m.useState)(null),[U,W]=(0,m.useState)(`-1`),[G,K]=(0,m.useState)(`Порча / Срок годности`),q=(0,m.useMemo)(()=>i.filter(e=>{let t=T===`all`||e.warehouseId===T,n=!C||e.productName.toLowerCase().includes(C.toLowerCase())||e.sku.toLowerCase().includes(C.toLowerCase());return t&&n}),[i,T,C]),J=(0,m.useMemo)(()=>[...g].sort((e,t)=>t.timestamp>e.timestamp?1:-1),[g]),Y=async t=>{t.preventDefault();let n=b.find(e=>e.id===F)||b[0];if(!n){e(`Выберите товар`,`error`);return}try{let t=`REC-${Date.now().toString().slice(-6)}`,r=[{productId:n.id,sku:n.sku,name:n.name,quantity:L,costPrice:{minor:z,currency:`RUB`}}];await y(N,t,j||`ООО «Поставщик Продукт»`,r),e(`Поступление по накладной №${t} проведено! Остатки увеличены.`,`success`),O(!1),M(``)}catch(t){e(`Ошибка: ${t instanceof Error?t.message:String(t)}`,`error`)}},X=async t=>{if(t.preventDefault(),V)try{let t=Number(U);await v(V.warehouseId,V.productId,t,G),e(t<0?`Списание со склада проведено.`:`Корректировка остатка проведена.`,`success`),A(!1),H(null)}catch(t){e(`Ошибка: ${t instanceof Error?t.message:String(t)}`,`error`)}},Z=e=>{switch(e){case`receipt`:return(0,h.jsx)(r,{variant:`green`,size:`sm`,children:`Поступление (+)`});case`shipment`:return(0,h.jsx)(r,{variant:`blue`,size:`sm`,children:`Отгрузка (-)`});case`transfer`:return(0,h.jsx)(r,{variant:`gold`,size:`sm`,children:`Резерв / Трансфер`});case`loss`:return(0,h.jsx)(r,{variant:`danger`,size:`sm`,children:`Списание (-)`});default:return(0,h.jsx)(r,{variant:`gray`,size:`sm`,children:`Коррекция`})}};return(0,h.jsxs)(`div`,{className:`space-y-4 animate-fade-in`,children:[(0,h.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,h.jsxs)(`div`,{children:[(0,h.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,h.jsx)(`h1`,{className:`text-sm font-bold text-krona-primary`,children:`Складской учет, остатки и движение партий`}),(0,h.jsx)(u,{level:`pilot1`,size:`sm`})]}),(0,h.jsx)(`p`,{className:`text-xs text-krona-secondary mt-0.5`,children:`Точный баланс: Физический остаток, Резервы заказов, Доступное количество и Складской журнал`})]}),(0,h.jsx)(`div`,{className:`flex items-center gap-2`,children:(0,h.jsxs)(n,{variant:`primary`,size:`sm`,onClick:()=>O(!0),children:[(0,h.jsx)(o,{className:`w-3.5 h-3.5 mr-1`}),` Приходная накладная`]})})]}),(0,h.jsxs)(`div`,{className:`flex flex-col sm:flex-row sm:items-center justify-between gap-3`,children:[(0,h.jsxs)(`div`,{className:`flex items-center gap-1.5 overflow-x-auto text-xs`,children:[(0,h.jsxs)(`button`,{onClick:()=>S(`balances`),className:`px-3 py-1.5 rounded-lg font-medium transition-colors ${x===`balances`?`bg-krona-green text-white shadow-sm`:`bg-krona-surface text-krona-secondary hover:text-krona-primary border border-krona-border`}`,children:[`Остатки на складах (`,i.length,`)`]}),(0,h.jsxs)(`button`,{onClick:()=>S(`movements`),className:`px-3 py-1.5 rounded-lg font-medium transition-colors ${x===`movements`?`bg-krona-green text-white shadow-sm`:`bg-krona-surface text-krona-secondary hover:text-krona-primary border border-krona-border`}`,children:[`Журнал движений (`,g.length,`)`]}),(0,h.jsxs)(`button`,{onClick:()=>S(`receipts`),className:`px-3 py-1.5 rounded-lg font-medium transition-colors ${x===`receipts`?`bg-krona-green text-white shadow-sm`:`bg-krona-surface text-krona-secondary hover:text-krona-primary border border-krona-border`}`,children:[`Поступления (`,_.length,`)`]})]}),(0,h.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,h.jsxs)(`select`,{value:T,onChange:e=>E(e.target.value),className:`px-2.5 py-1.5 text-xs bg-krona-surface border border-krona-border rounded-lg text-krona-primary focus:outline-none focus:border-krona-green`,children:[(0,h.jsx)(`option`,{value:`all`,children:`Все склады`}),t.map(e=>(0,h.jsx)(`option`,{value:e.id,children:e.name},e.id))]}),(0,h.jsxs)(`div`,{className:`relative w-60`,children:[(0,h.jsx)(s,{className:`w-3.5 h-3.5 absolute left-2.5 top-2.5 text-krona-secondary`}),(0,h.jsx)(`input`,{type:`text`,value:C,onChange:e=>w(e.target.value),placeholder:`Поиск по артикулу или товару...`,className:`w-full pl-8 pr-3 py-1.5 text-xs bg-krona-surface border border-krona-border rounded-lg text-krona-primary focus:outline-none focus:border-krona-green`})]})]})]}),x===`balances`&&(0,h.jsx)(`div`,{className:`bg-krona-surface border border-krona-border rounded-xl shadow-krona-soft overflow-hidden`,children:(0,h.jsxs)(`table`,{className:`w-full text-xs text-left`,children:[(0,h.jsx)(`thead`,{className:`bg-krona-workspace text-krona-secondary border-b border-krona-border`,children:(0,h.jsxs)(`tr`,{children:[(0,h.jsx)(`th`,{className:`p-3 font-semibold`,children:`Артикул (SKU)`}),(0,h.jsx)(`th`,{className:`p-3 font-semibold`,children:`Наименование товара`}),(0,h.jsx)(`th`,{className:`p-3 font-semibold`,children:`Склад`}),(0,h.jsx)(`th`,{className:`p-3 font-semibold text-center`,children:`Физический остаток (On Hand)`}),(0,h.jsx)(`th`,{className:`p-3 font-semibold text-center`,children:`В резерве (Reserved)`}),(0,h.jsx)(`th`,{className:`p-3 font-semibold text-center`,children:`Доступно к заказу (Available)`}),(0,h.jsx)(`th`,{className:`p-3 font-semibold`,children:`Мин. порог`}),(0,h.jsx)(`th`,{className:`p-3 font-semibold text-right`,children:`Действие`})]})}),(0,h.jsxs)(`tbody`,{className:`divide-y divide-krona-border`,children:[q.map(e=>{let t=e.minThreshold!==void 0&&e.available<=e.minThreshold;return(0,h.jsxs)(`tr`,{className:`hover:bg-krona-workspace/50 transition-colors`,children:[(0,h.jsx)(`td`,{className:`p-3 font-mono font-semibold text-krona-secondary`,children:e.sku}),(0,h.jsx)(`td`,{className:`p-3 font-medium text-krona-primary`,children:e.productName}),(0,h.jsx)(`td`,{className:`p-3 text-krona-secondary`,children:e.warehouseName}),(0,h.jsxs)(`td`,{className:`p-3 font-bold text-krona-primary text-center`,children:[e.onHand,` `,e.unit]}),(0,h.jsx)(`td`,{className:`p-3 font-semibold text-amber-600 dark:text-amber-400 text-center`,children:e.reserved>0?`${e.reserved} ${e.unit}`:`0`}),(0,h.jsx)(`td`,{className:`p-3 text-center`,children:(0,h.jsxs)(`span`,{className:`font-bold px-2 py-0.5 rounded ${e.available>0?`bg-emerald-500/10 text-emerald-600 dark:text-emerald-400`:`bg-rose-500/10 text-rose-600 dark:text-rose-400`}`,children:[e.available,` `,e.unit]})}),(0,h.jsx)(`td`,{className:`p-3`,children:e.minThreshold===void 0?`—`:(0,h.jsxs)(`div`,{className:`flex items-center gap-1`,children:[(0,h.jsxs)(`span`,{children:[e.minThreshold,` `,e.unit]}),t&&(0,h.jsx)(r,{variant:`warning`,size:`sm`,children:`Мало`})]})}),(0,h.jsx)(`td`,{className:`p-3 text-right`,children:(0,h.jsx)(n,{variant:`secondary`,size:`sm`,onClick:()=>{H(e),W(`-1`),A(!0)},children:`Коррекция / Списание`})})]},e.id)}),q.length===0&&(0,h.jsx)(`tr`,{children:(0,h.jsx)(`td`,{colSpan:8,className:`p-8 text-center text-krona-secondary text-xs italic`,children:`Остатки не найдены`})})]})]})}),x===`movements`&&(0,h.jsx)(`div`,{className:`bg-krona-surface border border-krona-border rounded-xl shadow-krona-soft overflow-hidden`,children:(0,h.jsxs)(`table`,{className:`w-full text-xs text-left`,children:[(0,h.jsx)(`thead`,{className:`bg-krona-workspace text-krona-secondary border-b border-krona-border`,children:(0,h.jsxs)(`tr`,{children:[(0,h.jsx)(`th`,{className:`p-3 font-semibold`,children:`Дата / Время`}),(0,h.jsx)(`th`,{className:`p-3 font-semibold`,children:`Тип движения`}),(0,h.jsx)(`th`,{className:`p-3 font-semibold`,children:`Артикул`}),(0,h.jsx)(`th`,{className:`p-3 font-semibold`,children:`Товар`}),(0,h.jsx)(`th`,{className:`p-3 font-semibold`,children:`Количество`}),(0,h.jsx)(`th`,{className:`p-3 font-semibold`,children:`Основание / Примечание`})]})}),(0,h.jsxs)(`tbody`,{className:`divide-y divide-krona-border`,children:[J.map(e=>(0,h.jsxs)(`tr`,{className:`hover:bg-krona-workspace/50 transition-colors`,children:[(0,h.jsx)(`td`,{className:`p-3 font-mono text-krona-secondary`,children:c(e.timestamp)}),(0,h.jsx)(`td`,{className:`p-3`,children:Z(e.type)}),(0,h.jsx)(`td`,{className:`p-3 font-mono text-krona-secondary`,children:e.sku}),(0,h.jsx)(`td`,{className:`p-3 font-medium text-krona-primary`,children:e.productName}),(0,h.jsxs)(`td`,{className:`p-3 font-bold text-krona-primary`,children:[e.type===`receipt`?`+${e.quantity}`:e.type===`shipment`||e.type===`loss`?`-${e.quantity}`:`${e.quantity}`,` шт.`]}),(0,h.jsx)(`td`,{className:`p-3 text-krona-secondary`,children:e.notes||`—`})]},e.id)),J.length===0&&(0,h.jsx)(`tr`,{children:(0,h.jsx)(`td`,{colSpan:6,className:`p-8 text-center text-krona-secondary text-xs italic`,children:`Записи в складском журнале отсутствуют`})})]})]})}),x===`receipts`&&(0,h.jsx)(`div`,{className:`bg-krona-surface border border-krona-border rounded-xl shadow-krona-soft overflow-hidden`,children:(0,h.jsxs)(`table`,{className:`w-full text-xs text-left`,children:[(0,h.jsx)(`thead`,{className:`bg-krona-workspace text-krona-secondary border-b border-krona-border`,children:(0,h.jsxs)(`tr`,{children:[(0,h.jsx)(`th`,{className:`p-3 font-semibold`,children:`Номер накладной`}),(0,h.jsx)(`th`,{className:`p-3 font-semibold`,children:`Поставщик`}),(0,h.jsx)(`th`,{className:`p-3 font-semibold`,children:`Дата поступления`}),(0,h.jsx)(`th`,{className:`p-3 font-semibold`,children:`Позиций`}),(0,h.jsx)(`th`,{className:`p-3 font-semibold`,children:`Сумма поставки`}),(0,h.jsx)(`th`,{className:`p-3 font-semibold text-center`,children:`Статус`})]})}),(0,h.jsxs)(`tbody`,{className:`divide-y divide-krona-border`,children:[_.map(e=>(0,h.jsxs)(`tr`,{className:`hover:bg-krona-workspace/50 transition-colors`,children:[(0,h.jsx)(`td`,{className:`p-3 font-mono font-bold text-krona-primary`,children:e.receiptNumber}),(0,h.jsx)(`td`,{className:`p-3 font-medium text-krona-primary`,children:e.supplierName||`Поставщик`}),(0,h.jsx)(`td`,{className:`p-3 font-mono text-krona-secondary`,children:e.receivedAt?c(e.receivedAt):`—`}),(0,h.jsxs)(`td`,{className:`p-3 text-krona-secondary`,children:[e.items.length,` поз.`]}),(0,h.jsx)(`td`,{className:`p-3 font-bold text-krona-green`,children:f(e.totalCost.minor)}),(0,h.jsx)(`td`,{className:`p-3 text-center`,children:(0,h.jsx)(r,{variant:`green`,size:`sm`,children:`Оприходовано`})})]},e.id)),_.length===0&&(0,h.jsx)(`tr`,{children:(0,h.jsx)(`td`,{colSpan:6,className:`p-8 text-center text-krona-secondary text-xs italic`,children:`Приходные накладные отсутствуют`})})]})]})}),(0,h.jsx)(l,{isOpen:D,onClose:()=>O(!1),title:`Оформление приходной накладной (Поступление товаров)`,size:`md`,children:(0,h.jsxs)(`form`,{onSubmit:Y,className:`space-y-4 text-xs`,children:[(0,h.jsxs)(`div`,{children:[(0,h.jsx)(`label`,{className:`block font-semibold text-krona-primary mb-1`,children:`Поставщик:`}),(0,h.jsx)(`input`,{type:`text`,required:!0,value:j,onChange:e=>M(e.target.value),placeholder:`Например: ООО «Кофе Импорт Трейд»`,className:`w-full px-3 py-1.5 bg-krona-workspace border border-krona-border rounded-lg text-krona-primary`})]}),(0,h.jsxs)(`div`,{children:[(0,h.jsx)(`label`,{className:`block font-semibold text-krona-primary mb-1`,children:`Склад приемки:`}),(0,h.jsx)(`select`,{value:N,onChange:e=>P(e.target.value),className:`w-full px-3 py-1.5 bg-krona-workspace border border-krona-border rounded-lg text-krona-primary`,children:t.map(e=>(0,h.jsx)(`option`,{value:e.id,children:e.name},e.id))})]}),(0,h.jsxs)(`div`,{children:[(0,h.jsx)(`label`,{className:`block font-semibold text-krona-primary mb-1`,children:`Товар:`}),(0,h.jsx)(`select`,{value:F,onChange:e=>I(e.target.value),className:`w-full px-3 py-1.5 bg-krona-workspace border border-krona-border rounded-lg text-krona-primary`,children:b.map(e=>(0,h.jsxs)(`option`,{value:e.id,children:[e.name,` (`,e.sku,`)`]},e.id))})]}),(0,h.jsxs)(`div`,{className:`grid grid-cols-2 gap-3`,children:[(0,h.jsxs)(`div`,{children:[(0,h.jsx)(`label`,{className:`block font-semibold text-krona-primary mb-1`,children:`Количество (шт.):`}),(0,h.jsx)(`input`,{type:`number`,min:1,value:L,onChange:e=>R(Number(e.target.value)||1),className:`w-full px-3 py-1.5 bg-krona-workspace border border-krona-border rounded-lg text-krona-primary`})]}),(0,h.jsxs)(`div`,{children:[(0,h.jsx)(`label`,{className:`block font-semibold text-krona-primary mb-1`,children:`Закупочная цена (коп.):`}),(0,h.jsx)(`input`,{type:`number`,min:1,value:z,onChange:e=>B(Number(e.target.value)||0),className:`w-full px-3 py-1.5 bg-krona-workspace border border-krona-border rounded-lg text-krona-primary`})]})]}),(0,h.jsxs)(`div`,{className:`p-3 bg-emerald-500/10 border border-emerald-500/30 rounded-lg text-emerald-800 dark:text-emerald-300`,children:[`После подтверждения накладной физический и доступный остаток на складе увеличится на`,` `,(0,h.jsxs)(`strong`,{children:[L,` шт.`]}),`, а запись появится в Журнале складских движений.`]}),(0,h.jsxs)(`div`,{className:`flex justify-end gap-2 pt-2 border-t border-krona-border`,children:[(0,h.jsx)(n,{variant:`secondary`,size:`sm`,type:`button`,onClick:()=>O(!1),children:`Отмена`}),(0,h.jsxs)(n,{variant:`primary`,size:`sm`,type:`submit`,children:[(0,h.jsx)(o,{className:`w-3.5 h-3.5 mr-1`}),` Оприходовать на склад`]})]})]})}),(0,h.jsx)(l,{isOpen:k,onClose:()=>A(!1),title:V?`Коррекция остатка: ${V.productName}`:``,size:`md`,children:V&&(0,h.jsxs)(`form`,{onSubmit:X,className:`space-y-4 text-xs`,children:[(0,h.jsxs)(`div`,{className:`p-3 bg-krona-workspace rounded-lg border border-krona-border space-y-1`,children:[(0,h.jsxs)(`div`,{children:[(0,h.jsx)(`span`,{className:`text-krona-secondary`,children:`Склад:`}),` `,(0,h.jsx)(`strong`,{children:V.warehouseName})]}),(0,h.jsxs)(`div`,{children:[(0,h.jsx)(`span`,{className:`text-krona-secondary`,children:`Текущий физический остаток:`}),` `,(0,h.jsxs)(`strong`,{children:[V.onHand,` `,V.unit]})]})]}),(0,h.jsxs)(`div`,{children:[(0,h.jsx)(`label`,{className:`block font-semibold text-krona-primary mb-1`,children:`Изменение количества (+ для прихода, - для списания):`}),(0,h.jsx)(`input`,{type:`number`,value:U,onChange:e=>W(e.target.value),className:`w-full px-3 py-1.5 bg-krona-workspace border border-krona-border rounded-lg text-krona-primary font-bold`})]}),(0,h.jsxs)(`div`,{children:[(0,h.jsx)(`label`,{className:`block font-semibold text-krona-primary mb-1`,children:`Причина корректировки:`}),(0,h.jsx)(`input`,{type:`text`,required:!0,value:G,onChange:e=>K(e.target.value),className:`w-full px-3 py-1.5 bg-krona-workspace border border-krona-border rounded-lg text-krona-primary`})]}),(0,h.jsxs)(`div`,{className:`flex justify-end gap-2 pt-2 border-t border-krona-border`,children:[(0,h.jsx)(n,{variant:`secondary`,size:`sm`,type:`button`,onClick:()=>A(!1),children:`Отмена`}),(0,h.jsx)(n,{variant:`primary`,size:`sm`,type:`submit`,children:`Сохранить изменение`})]})]})})]})};export{g as InventoryModule}; \ No newline at end of file diff --git a/dist/assets/MarketingModule-D28ZVpJ3.js b/dist/assets/MarketingModule-D28ZVpJ3.js deleted file mode 100644 index 2ad1246..0000000 --- a/dist/assets/MarketingModule-D28ZVpJ3.js +++ /dev/null @@ -1 +0,0 @@ -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{T as s,c,i as l,o as u,p as d,r as f,t as p,v as m,w as h}from"./index-CNnq9VO5.js";import{t as g}from"./formatters-WvGQLZg0.js";var _={name:`tag`,size:24,node:[[`path`,{d:`M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z`,key:`vktsd0`}],[`circle`,{cx:`7.5`,cy:`7.5`,r:`.5`,fill:`currentColor`,key:`kqv944`}]]};_.node;var v=r(_),y=t(e(),1),b=a(),x=[{id:`camp-1`,title:`Осенний промокод AUTUMN20 (-20% на роллы)`,type:`promo`,segment:`Все зарегистрированные гости`,channel:`Telegram`,status:`active`,sentCount:640,openRate:68.4,revenue:98e3,promoCode:`AUTUMN20`,discountPercent:20},{id:`camp-2`,title:`Реактивация «Мы соскучились!» (+ ролл в подарок)`,type:`reactivation`,segment:`Без заказов более 30 дней`,channel:`WhatsApp`,status:`active`,sentCount:185,openRate:74.2,revenue:48200,promoCode:`COMEBACK`,discountPercent:15},{id:`camp-3`,title:`Приглашение на дегустацию вин и сетов шефа`,type:`broadcast`,segment:`VIP гости с чеком от 5 000 ₽`,channel:`Telegram`,status:`completed`,sentCount:94,openRate:89.1,revenue:142e3}],S=()=>{let{showToast:e}=o(),[t,r]=(0,y.useState)(x),[a,_]=(0,y.useState)(`campaigns`),[S,C]=(0,y.useState)(!1),[w,T]=(0,y.useState)(0),[E,D]=(0,y.useState)(null),[O,k]=(0,y.useState)(!1),[A,j]=(0,y.useState)(``),[M,N]=(0,y.useState)(`Без заказов более 30 дней`),[P,F]=(0,y.useState)(`Telegram`),[I,L]=(0,y.useState)(`SALE15`),[R,z]=(0,y.useState)(3e3),[B,V]=(0,y.useState)(30),[H,U]=(0,y.useState)(248);return(0,b.jsxs)(`div`,{className:`space-y-4 animate-fade-in`,children:[(0,b.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,b.jsxs)(`div`,{children:[(0,b.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,b.jsx)(`h2`,{className:`text-sm font-bold text-krona-primary`,children:`Маркетинг, промо-акции и удержание гостей`}),(0,b.jsx)(p,{level:`target`,size:`sm`})]}),(0,b.jsx)(`p`,{className:`text-xs text-krona-secondary mt-0.5`,children:`Управление промокодами, триггерными рассылками, сегментацией гостей и расчет LTV`})]}),(0,b.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,b.jsxs)(`div`,{className:`flex items-center bg-krona-workspace p-1 rounded-lg border border-krona-border text-xs`,children:[(0,b.jsxs)(`button`,{onClick:()=>_(`campaigns`),className:`px-3 py-1 rounded font-medium transition-colors ${a===`campaigns`?`bg-[#2F684C] text-white shadow-sm`:`text-krona-secondary`}`,children:[`Кампании (`,t.length,`)`]}),(0,b.jsx)(`button`,{onClick:()=>_(`segments`),className:`px-3 py-1 rounded font-medium transition-colors ${a===`segments`?`bg-[#2F684C] text-white shadow-sm`:`text-krona-secondary`}`,children:`Конструктор сегментов`})]}),(0,b.jsxs)(n,{variant:`primary`,size:`sm`,onClick:()=>k(!0),children:[(0,b.jsx)(h,{className:`w-3.5 h-3.5 mr-1`}),`Создать кампанию`]})]})]}),(0,b.jsxs)(`div`,{className:`grid grid-cols-1 sm:grid-cols-3 gap-3.5`,children:[(0,b.jsx)(l,{title:`Выручка по промокодам`,value:g(288200),change:{value:`+24%`,trend:`up`},subtitle:`Сентябрьская кампания`,icon:(0,b.jsx)(v,{className:`w-4 h-4 text-krona-gold`})}),(0,b.jsx)(l,{title:`Конверсия из рассылки в заказ`,value:`19.4%`,change:{value:`+3.1%`,trend:`up`},subtitle:`Telegram & WhatsApp`,icon:(0,b.jsx)(c,{className:`w-4 h-4 text-krona-green`})}),(0,b.jsx)(l,{title:`Возвращено 'спящих' клиентов`,value:`48 гостей`,subtitle:`После авто-триггера 'Мы соскучились'`,icon:(0,b.jsx)(u,{className:`w-4 h-4 text-krona-info`})})]}),a===`campaigns`&&(0,b.jsxs)(`div`,{className:`space-y-4`,children:[(0,b.jsxs)(`div`,{className:`p-4 rounded-xl border border-krona-gold/40 bg-krona-gold/5 space-y-3`,children:[(0,b.jsxs)(`div`,{className:`flex flex-col sm:flex-row sm:items-center justify-between gap-3`,children:[(0,b.jsxs)(`div`,{children:[(0,b.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,b.jsx)(d,{className:`w-4 h-4 text-krona-gold`}),(0,b.jsx)(`h4`,{className:`font-bold text-xs text-krona-primary`,children:`Интерактивная симуляция запуска триггерной рассылки`})]}),(0,b.jsx)(`p`,{className:`text-[11px] text-krona-secondary mt-0.5`,children:`Протестируйте отправку рассылки с промокодом по сегменту «Спящие клиенты» (340 получателей в базе)`})]}),(0,b.jsxs)(n,{variant:`gold`,size:`sm`,disabled:S,onClick:()=>{C(!0),T(10),D({sent:50,delivered:48,opened:32,clicked:12,orders:4,revenue:8400}),setTimeout(()=>{T(50),D({sent:180,delivered:176,opened:130,clicked:54,orders:18,revenue:38200})},600),setTimeout(()=>{T(100),C(!1),D({sent:340,delivered:334,opened:254,clicked:98,orders:34,revenue:74800}),e({title:`Рассылка успешно завершена!`,message:`340 сообщений отправлено в Telegram-бот. Оформлено 34 новых заказа.`,type:`success`})},1200)},className:`shrink-0`,children:[(0,b.jsx)(s,{className:`w-3.5 h-3.5 mr-1`}),S?`Отправка (${w}%)...`:`Запустить симуляцию`]})]}),S&&(0,b.jsxs)(`div`,{className:`space-y-1`,children:[(0,b.jsx)(`div`,{className:`w-full bg-krona-workspace rounded-full h-2 overflow-hidden border border-krona-border`,children:(0,b.jsx)(`div`,{className:`bg-krona-gold h-2 transition-all duration-300 rounded-full`,style:{width:`${w}%`}})}),(0,b.jsxs)(`div`,{className:`flex justify-between text-[10px] text-krona-secondary`,children:[(0,b.jsx)(`span`,{children:`Отправка через шлюз Telegram Bot API...`}),(0,b.jsxs)(`span`,{className:`font-mono font-bold`,children:[w,`%`]})]})]}),E&&(0,b.jsxs)(`div`,{className:`pt-2 border-t border-krona-border/60 grid grid-cols-2 sm:grid-cols-6 gap-2 text-xs`,children:[(0,b.jsxs)(`div`,{className:`p-2 bg-krona-surface rounded-lg border border-krona-border`,children:[(0,b.jsx)(`span`,{className:`text-[10px] text-krona-secondary block`,children:`Отправлено:`}),(0,b.jsx)(`span`,{className:`font-bold font-mono text-krona-primary`,children:E.sent})]}),(0,b.jsxs)(`div`,{className:`p-2 bg-krona-surface rounded-lg border border-krona-border`,children:[(0,b.jsx)(`span`,{className:`text-[10px] text-krona-secondary block`,children:`Доставлено:`}),(0,b.jsx)(`span`,{className:`font-bold font-mono text-emerald-600`,children:E.delivered})]}),(0,b.jsxs)(`div`,{className:`p-2 bg-krona-surface rounded-lg border border-krona-border`,children:[(0,b.jsx)(`span`,{className:`text-[10px] text-krona-secondary block`,children:`Открыто:`}),(0,b.jsx)(`span`,{className:`font-bold font-mono text-sky-600`,children:E.opened})]}),(0,b.jsxs)(`div`,{className:`p-2 bg-krona-surface rounded-lg border border-krona-border`,children:[(0,b.jsx)(`span`,{className:`text-[10px] text-krona-secondary block`,children:`Кликов:`}),(0,b.jsx)(`span`,{className:`font-bold font-mono text-amber-600`,children:E.clicked})]}),(0,b.jsxs)(`div`,{className:`p-2 bg-krona-surface rounded-lg border border-krona-border`,children:[(0,b.jsx)(`span`,{className:`text-[10px] text-krona-secondary block`,children:`Заказов:`}),(0,b.jsx)(`span`,{className:`font-bold font-mono text-emerald-700`,children:E.orders})]}),(0,b.jsxs)(`div`,{className:`p-2 bg-krona-surface rounded-lg border border-krona-border`,children:[(0,b.jsx)(`span`,{className:`text-[10px] text-krona-secondary block`,children:`Выручка:`}),(0,b.jsx)(`span`,{className:`font-bold font-mono text-krona-green`,children:g(E.revenue)})]})]})]}),(0,b.jsxs)(`div`,{className:`bg-krona-surface border border-krona-border rounded-xl shadow-krona-soft p-4 space-y-3`,children:[(0,b.jsx)(`h4`,{className:`text-xs font-bold text-krona-primary uppercase tracking-wider`,children:`Список рекламных кампаний и промо-акций`}),(0,b.jsx)(`div`,{className:`space-y-2 text-xs`,children:t.map(e=>(0,b.jsxs)(`div`,{className:`p-3.5 rounded-xl border border-krona-border bg-krona-workspace flex flex-col sm:flex-row sm:items-center justify-between gap-3 hover:border-krona-border-strong transition-all`,children:[(0,b.jsxs)(`div`,{className:`flex items-start gap-3`,children:[(0,b.jsx)(`div`,{className:`p-2.5 rounded-xl bg-krona-gold/10 text-krona-gold shrink-0`,children:e.type===`promo`?(0,b.jsx)(v,{className:`w-5 h-5`}):(0,b.jsx)(m,{className:`w-5 h-5`})}),(0,b.jsxs)(`div`,{children:[(0,b.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,b.jsx)(`h5`,{className:`font-bold text-xs text-krona-primary`,children:e.title}),e.promoCode&&(0,b.jsx)(`span`,{className:`px-1.5 py-0.5 rounded bg-krona-surface border border-krona-border font-mono font-bold text-[10px]`,children:e.promoCode})]}),(0,b.jsxs)(`div`,{className:`text-[11px] text-krona-secondary mt-0.5`,children:[`Канал: `,(0,b.jsx)(`strong`,{children:e.channel}),` • Сегмент: `,e.segment]})]})]}),(0,b.jsxs)(`div`,{className:`flex items-center justify-between sm:justify-end gap-4 shrink-0 pt-2 sm:pt-0 border-t sm:border-t-0 border-krona-border/50`,children:[(0,b.jsxs)(`div`,{className:`text-right`,children:[(0,b.jsx)(`div`,{className:`font-mono font-bold text-krona-primary`,children:g(e.revenue)}),(0,b.jsxs)(`div`,{className:`text-[10px] text-krona-secondary`,children:[e.sentCount,` получ. • Open `,e.openRate,`%`]})]}),(0,b.jsx)(i,{variant:e.status===`active`?`green`:`neutral`,size:`sm`,children:e.status===`active`?`Активна`:`Завершена`})]})]},e.id))})]})]}),a===`segments`&&(0,b.jsxs)(`div`,{className:`bg-krona-surface border border-krona-border rounded-xl p-4 shadow-krona-soft space-y-4 text-xs`,children:[(0,b.jsxs)(`div`,{className:`pb-2 border-b border-krona-border`,children:[(0,b.jsx)(`h4`,{className:`font-bold text-sm text-krona-primary`,children:`Конструктор аудиторных сегментов`}),(0,b.jsx)(`p`,{className:`text-[11px] text-krona-secondary`,children:`Настройте правила фильтрации клиентской базы для автоматического таргетинга акций`})]}),(0,b.jsxs)(`div`,{className:`grid grid-cols-1 md:grid-cols-2 gap-4`,children:[(0,b.jsxs)(`div`,{className:`space-y-3 p-3.5 bg-krona-workspace rounded-xl border border-krona-border`,children:[(0,b.jsx)(`span`,{className:`font-bold text-krona-primary block`,children:`Параметры фильтрации:`}),(0,b.jsxs)(`div`,{className:`space-y-1`,children:[(0,b.jsxs)(`label`,{className:`text-krona-secondary flex justify-between`,children:[(0,b.jsx)(`span`,{children:`Минимальная сумма покупок (LTV):`}),(0,b.jsx)(`span`,{className:`font-mono font-bold text-krona-primary`,children:g(R)})]}),(0,b.jsx)(`input`,{type:`range`,min:1e3,max:2e4,step:500,value:R,onChange:e=>{let t=Number(e.target.value);z(t),U(Math.max(20,Math.floor(500-t/50)))},className:`w-full accent-krona-green`})]}),(0,b.jsxs)(`div`,{className:`space-y-1`,children:[(0,b.jsxs)(`label`,{className:`text-krona-secondary flex justify-between`,children:[(0,b.jsx)(`span`,{children:`Не заказывали более:`}),(0,b.jsxs)(`span`,{className:`font-mono font-bold text-krona-primary`,children:[B,` дней`]})]}),(0,b.jsx)(`input`,{type:`range`,min:7,max:90,step:1,value:B,onChange:e=>{let t=Number(e.target.value);V(t),U(Math.max(15,Math.floor(H+t/3)))},className:`w-full accent-krona-green`})]})]}),(0,b.jsxs)(`div`,{className:`p-4 bg-krona-surface rounded-xl border border-krona-border flex flex-col justify-between space-y-3`,children:[(0,b.jsxs)(`div`,{children:[(0,b.jsx)(`span`,{className:`text-[10px] uppercase font-bold text-krona-secondary block`,children:`Размер сегмента по фильтрам:`}),(0,b.jsxs)(`div`,{className:`text-2xl font-bold font-mono text-krona-green mt-1`,children:[H,` гостей`]}),(0,b.jsx)(`p`,{className:`text-[11px] text-krona-secondary mt-1`,children:`~14.2% от общей базы активных контактов CRM`})]}),(0,b.jsx)(`div`,{className:`pt-2 border-t border-krona-border flex gap-2`,children:(0,b.jsx)(n,{variant:`primary`,size:`sm`,onClick:()=>{k(!0),N(`Чек от ${g(R)}, без визитов > ${B}дн`)},className:`w-full`,children:`Создать рассылку для этого сегмента`})})]})]})]}),O&&(0,b.jsx)(f,{isOpen:O,onClose:()=>k(!1),title:`Новая промо-кампания`,subtitle:`Настройка параметров рассылки и промокода`,maxWidth:`sm`,footer:(0,b.jsxs)(`div`,{className:`flex gap-2 w-full justify-end`,children:[(0,b.jsx)(n,{variant:`secondary`,onClick:()=>k(!1),children:`Отмена`}),(0,b.jsx)(n,{variant:`primary`,onClick:t=>{if(t.preventDefault(),!A.trim())return;let n={id:`camp-${Date.now()}`,title:A.trim(),type:`promo`,segment:M,channel:P,status:`active`,sentCount:H,openRate:0,revenue:0,promoCode:I.toUpperCase(),discountPercent:15};r(e=>[n,...e]),k(!1),j(``),e({title:`Кампания создана`,message:`Кампания «${n.title}» добавлена в очередь отправки`,type:`success`})},children:`Запустить кампанию`})]}),children:(0,b.jsxs)(`div`,{className:`space-y-3 text-xs`,children:[(0,b.jsxs)(`div`,{className:`space-y-1`,children:[(0,b.jsx)(`label`,{className:`font-semibold text-krona-primary`,children:`Название акции:`}),(0,b.jsx)(`input`,{type:`text`,value:A,onChange:e=>j(e.target.value),placeholder:`Например: Скидка 15% на роллы в будни`,className:`w-full p-2 bg-krona-workspace border border-krona-border rounded-lg text-krona-primary focus:outline-none focus:border-krona-green`})]}),(0,b.jsxs)(`div`,{className:`space-y-1`,children:[(0,b.jsx)(`label`,{className:`font-semibold text-krona-primary`,children:`Целевой сегмент:`}),(0,b.jsx)(`input`,{type:`text`,value:M,onChange:e=>N(e.target.value),className:`w-full p-2 bg-krona-workspace border border-krona-border rounded-lg text-krona-primary focus:outline-none focus:border-krona-green`})]}),(0,b.jsxs)(`div`,{className:`grid grid-cols-2 gap-3`,children:[(0,b.jsxs)(`div`,{className:`space-y-1`,children:[(0,b.jsx)(`label`,{className:`font-semibold text-krona-primary`,children:`Канал отправки:`}),(0,b.jsxs)(`select`,{value:P,onChange:e=>F(e.target.value),className:`w-full p-2 bg-krona-workspace border border-krona-border rounded-lg text-krona-primary focus:outline-none focus:border-krona-green`,children:[(0,b.jsx)(`option`,{value:`Telegram`,children:`Telegram`}),(0,b.jsx)(`option`,{value:`WhatsApp`,children:`WhatsApp`}),(0,b.jsx)(`option`,{value:`Push & SMS`,children:`Push & SMS`})]})]}),(0,b.jsxs)(`div`,{className:`space-y-1`,children:[(0,b.jsx)(`label`,{className:`font-semibold text-krona-primary`,children:`Промокод:`}),(0,b.jsx)(`input`,{type:`text`,value:I,onChange:e=>L(e.target.value),className:`w-full p-2 bg-krona-workspace border border-krona-border rounded-lg font-mono font-bold text-krona-primary focus:outline-none focus:border-krona-green uppercase`})]})]})]})})]})};export{S as MarketingModule}; \ No newline at end of file diff --git a/dist/assets/MarketingModule-DyvYzuoi.js b/dist/assets/MarketingModule-DyvYzuoi.js new file mode 100644 index 0000000..4594996 --- /dev/null +++ b/dist/assets/MarketingModule-DyvYzuoi.js @@ -0,0 +1 @@ +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{E as s,T as c,c as l,i as u,m as d,o as f,r as p,t as m,y as h}from"./index-CrJKtV0u.js";import{t as g}from"./formatters-WvGQLZg0.js";var _={name:`tag`,size:24,node:[[`path`,{d:`M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z`,key:`vktsd0`}],[`circle`,{cx:`7.5`,cy:`7.5`,r:`.5`,fill:`currentColor`,key:`kqv944`}]]};_.node;var v=r(_),y=t(e(),1),b=a(),x=[{id:`camp-1`,title:`Осенний промокод AUTUMN20 (-20% на роллы)`,type:`promo`,segment:`Все зарегистрированные гости`,channel:`Telegram`,status:`active`,sentCount:640,openRate:68.4,revenue:98e3,promoCode:`AUTUMN20`,discountPercent:20},{id:`camp-2`,title:`Реактивация «Мы соскучились!» (+ ролл в подарок)`,type:`reactivation`,segment:`Без заказов более 30 дней`,channel:`WhatsApp`,status:`active`,sentCount:185,openRate:74.2,revenue:48200,promoCode:`COMEBACK`,discountPercent:15},{id:`camp-3`,title:`Приглашение на дегустацию вин и сетов шефа`,type:`broadcast`,segment:`VIP гости с чеком от 5 000 ₽`,channel:`Telegram`,status:`completed`,sentCount:94,openRate:89.1,revenue:142e3}],S=()=>{let{showToast:e}=o(),[t,r]=(0,y.useState)(x),[a,_]=(0,y.useState)(`campaigns`),[S,C]=(0,y.useState)(!1),[w,T]=(0,y.useState)(0),[E,D]=(0,y.useState)(null),[O,k]=(0,y.useState)(!1),[A,j]=(0,y.useState)(``),[M,N]=(0,y.useState)(`Без заказов более 30 дней`),[P,F]=(0,y.useState)(`Telegram`),[I,L]=(0,y.useState)(`SALE15`),[R,z]=(0,y.useState)(3e3),[B,V]=(0,y.useState)(30),[H,U]=(0,y.useState)(248);return(0,b.jsxs)(`div`,{className:`space-y-4 animate-fade-in`,children:[(0,b.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,b.jsxs)(`div`,{children:[(0,b.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,b.jsx)(`h2`,{className:`text-sm font-bold text-krona-primary`,children:`Маркетинг, промо-акции и удержание гостей`}),(0,b.jsx)(m,{level:`target`,size:`sm`})]}),(0,b.jsx)(`p`,{className:`text-xs text-krona-secondary mt-0.5`,children:`Управление промокодами, триггерными рассылками, сегментацией гостей и расчет LTV`})]}),(0,b.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,b.jsxs)(`div`,{className:`flex items-center bg-krona-workspace p-1 rounded-lg border border-krona-border text-xs`,children:[(0,b.jsxs)(`button`,{onClick:()=>_(`campaigns`),className:`px-3 py-1 rounded font-medium transition-colors ${a===`campaigns`?`bg-[#2F684C] text-white shadow-sm`:`text-krona-secondary`}`,children:[`Кампании (`,t.length,`)`]}),(0,b.jsx)(`button`,{onClick:()=>_(`segments`),className:`px-3 py-1 rounded font-medium transition-colors ${a===`segments`?`bg-[#2F684C] text-white shadow-sm`:`text-krona-secondary`}`,children:`Конструктор сегментов`})]}),(0,b.jsxs)(n,{variant:`primary`,size:`sm`,onClick:()=>k(!0),children:[(0,b.jsx)(c,{className:`w-3.5 h-3.5 mr-1`}),`Создать кампанию`]})]})]}),(0,b.jsxs)(`div`,{className:`grid grid-cols-1 sm:grid-cols-3 gap-3.5`,children:[(0,b.jsx)(u,{title:`Выручка по промокодам`,value:g(288200),change:{value:`+24%`,trend:`up`},subtitle:`Сентябрьская кампания`,icon:(0,b.jsx)(v,{className:`w-4 h-4 text-krona-gold`})}),(0,b.jsx)(u,{title:`Конверсия из рассылки в заказ`,value:`19.4%`,change:{value:`+3.1%`,trend:`up`},subtitle:`Telegram & WhatsApp`,icon:(0,b.jsx)(l,{className:`w-4 h-4 text-krona-green`})}),(0,b.jsx)(u,{title:`Возвращено 'спящих' клиентов`,value:`48 гостей`,subtitle:`После авто-триггера 'Мы соскучились'`,icon:(0,b.jsx)(f,{className:`w-4 h-4 text-krona-info`})})]}),a===`campaigns`&&(0,b.jsxs)(`div`,{className:`space-y-4`,children:[(0,b.jsxs)(`div`,{className:`p-4 rounded-xl border border-krona-gold/40 bg-krona-gold/5 space-y-3`,children:[(0,b.jsxs)(`div`,{className:`flex flex-col sm:flex-row sm:items-center justify-between gap-3`,children:[(0,b.jsxs)(`div`,{children:[(0,b.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,b.jsx)(d,{className:`w-4 h-4 text-krona-gold`}),(0,b.jsx)(`h4`,{className:`font-bold text-xs text-krona-primary`,children:`Интерактивная симуляция запуска триггерной рассылки`})]}),(0,b.jsx)(`p`,{className:`text-[11px] text-krona-secondary mt-0.5`,children:`Протестируйте отправку рассылки с промокодом по сегменту «Спящие клиенты» (340 получателей в базе)`})]}),(0,b.jsxs)(n,{variant:`gold`,size:`sm`,disabled:S,onClick:()=>{C(!0),T(10),D({sent:50,delivered:48,opened:32,clicked:12,orders:4,revenue:8400}),setTimeout(()=>{T(50),D({sent:180,delivered:176,opened:130,clicked:54,orders:18,revenue:38200})},600),setTimeout(()=>{T(100),C(!1),D({sent:340,delivered:334,opened:254,clicked:98,orders:34,revenue:74800}),e({title:`Рассылка успешно завершена!`,message:`340 сообщений отправлено в Telegram-бот. Оформлено 34 новых заказа.`,type:`success`})},1200)},className:`shrink-0`,children:[(0,b.jsx)(s,{className:`w-3.5 h-3.5 mr-1`}),S?`Отправка (${w}%)...`:`Запустить симуляцию`]})]}),S&&(0,b.jsxs)(`div`,{className:`space-y-1`,children:[(0,b.jsx)(`div`,{className:`w-full bg-krona-workspace rounded-full h-2 overflow-hidden border border-krona-border`,children:(0,b.jsx)(`div`,{className:`bg-krona-gold h-2 transition-all duration-300 rounded-full`,style:{width:`${w}%`}})}),(0,b.jsxs)(`div`,{className:`flex justify-between text-[10px] text-krona-secondary`,children:[(0,b.jsx)(`span`,{children:`Отправка через шлюз Telegram Bot API...`}),(0,b.jsxs)(`span`,{className:`font-mono font-bold`,children:[w,`%`]})]})]}),E&&(0,b.jsxs)(`div`,{className:`pt-2 border-t border-krona-border/60 grid grid-cols-2 sm:grid-cols-6 gap-2 text-xs`,children:[(0,b.jsxs)(`div`,{className:`p-2 bg-krona-surface rounded-lg border border-krona-border`,children:[(0,b.jsx)(`span`,{className:`text-[10px] text-krona-secondary block`,children:`Отправлено:`}),(0,b.jsx)(`span`,{className:`font-bold font-mono text-krona-primary`,children:E.sent})]}),(0,b.jsxs)(`div`,{className:`p-2 bg-krona-surface rounded-lg border border-krona-border`,children:[(0,b.jsx)(`span`,{className:`text-[10px] text-krona-secondary block`,children:`Доставлено:`}),(0,b.jsx)(`span`,{className:`font-bold font-mono text-emerald-600`,children:E.delivered})]}),(0,b.jsxs)(`div`,{className:`p-2 bg-krona-surface rounded-lg border border-krona-border`,children:[(0,b.jsx)(`span`,{className:`text-[10px] text-krona-secondary block`,children:`Открыто:`}),(0,b.jsx)(`span`,{className:`font-bold font-mono text-sky-600`,children:E.opened})]}),(0,b.jsxs)(`div`,{className:`p-2 bg-krona-surface rounded-lg border border-krona-border`,children:[(0,b.jsx)(`span`,{className:`text-[10px] text-krona-secondary block`,children:`Кликов:`}),(0,b.jsx)(`span`,{className:`font-bold font-mono text-amber-600`,children:E.clicked})]}),(0,b.jsxs)(`div`,{className:`p-2 bg-krona-surface rounded-lg border border-krona-border`,children:[(0,b.jsx)(`span`,{className:`text-[10px] text-krona-secondary block`,children:`Заказов:`}),(0,b.jsx)(`span`,{className:`font-bold font-mono text-emerald-700`,children:E.orders})]}),(0,b.jsxs)(`div`,{className:`p-2 bg-krona-surface rounded-lg border border-krona-border`,children:[(0,b.jsx)(`span`,{className:`text-[10px] text-krona-secondary block`,children:`Выручка:`}),(0,b.jsx)(`span`,{className:`font-bold font-mono text-krona-green`,children:g(E.revenue)})]})]})]}),(0,b.jsxs)(`div`,{className:`bg-krona-surface border border-krona-border rounded-xl shadow-krona-soft p-4 space-y-3`,children:[(0,b.jsx)(`h4`,{className:`text-xs font-bold text-krona-primary uppercase tracking-wider`,children:`Список рекламных кампаний и промо-акций`}),(0,b.jsx)(`div`,{className:`space-y-2 text-xs`,children:t.map(e=>(0,b.jsxs)(`div`,{className:`p-3.5 rounded-xl border border-krona-border bg-krona-workspace flex flex-col sm:flex-row sm:items-center justify-between gap-3 hover:border-krona-border-strong transition-all`,children:[(0,b.jsxs)(`div`,{className:`flex items-start gap-3`,children:[(0,b.jsx)(`div`,{className:`p-2.5 rounded-xl bg-krona-gold/10 text-krona-gold shrink-0`,children:e.type===`promo`?(0,b.jsx)(v,{className:`w-5 h-5`}):(0,b.jsx)(h,{className:`w-5 h-5`})}),(0,b.jsxs)(`div`,{children:[(0,b.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,b.jsx)(`h5`,{className:`font-bold text-xs text-krona-primary`,children:e.title}),e.promoCode&&(0,b.jsx)(`span`,{className:`px-1.5 py-0.5 rounded bg-krona-surface border border-krona-border font-mono font-bold text-[10px]`,children:e.promoCode})]}),(0,b.jsxs)(`div`,{className:`text-[11px] text-krona-secondary mt-0.5`,children:[`Канал: `,(0,b.jsx)(`strong`,{children:e.channel}),` • Сегмент: `,e.segment]})]})]}),(0,b.jsxs)(`div`,{className:`flex items-center justify-between sm:justify-end gap-4 shrink-0 pt-2 sm:pt-0 border-t sm:border-t-0 border-krona-border/50`,children:[(0,b.jsxs)(`div`,{className:`text-right`,children:[(0,b.jsx)(`div`,{className:`font-mono font-bold text-krona-primary`,children:g(e.revenue)}),(0,b.jsxs)(`div`,{className:`text-[10px] text-krona-secondary`,children:[e.sentCount,` получ. • Open `,e.openRate,`%`]})]}),(0,b.jsx)(i,{variant:e.status===`active`?`green`:`neutral`,size:`sm`,children:e.status===`active`?`Активна`:`Завершена`})]})]},e.id))})]})]}),a===`segments`&&(0,b.jsxs)(`div`,{className:`bg-krona-surface border border-krona-border rounded-xl p-4 shadow-krona-soft space-y-4 text-xs`,children:[(0,b.jsxs)(`div`,{className:`pb-2 border-b border-krona-border`,children:[(0,b.jsx)(`h4`,{className:`font-bold text-sm text-krona-primary`,children:`Конструктор аудиторных сегментов`}),(0,b.jsx)(`p`,{className:`text-[11px] text-krona-secondary`,children:`Настройте правила фильтрации клиентской базы для автоматического таргетинга акций`})]}),(0,b.jsxs)(`div`,{className:`grid grid-cols-1 md:grid-cols-2 gap-4`,children:[(0,b.jsxs)(`div`,{className:`space-y-3 p-3.5 bg-krona-workspace rounded-xl border border-krona-border`,children:[(0,b.jsx)(`span`,{className:`font-bold text-krona-primary block`,children:`Параметры фильтрации:`}),(0,b.jsxs)(`div`,{className:`space-y-1`,children:[(0,b.jsxs)(`label`,{className:`text-krona-secondary flex justify-between`,children:[(0,b.jsx)(`span`,{children:`Минимальная сумма покупок (LTV):`}),(0,b.jsx)(`span`,{className:`font-mono font-bold text-krona-primary`,children:g(R)})]}),(0,b.jsx)(`input`,{type:`range`,min:1e3,max:2e4,step:500,value:R,onChange:e=>{let t=Number(e.target.value);z(t),U(Math.max(20,Math.floor(500-t/50)))},className:`w-full accent-krona-green`})]}),(0,b.jsxs)(`div`,{className:`space-y-1`,children:[(0,b.jsxs)(`label`,{className:`text-krona-secondary flex justify-between`,children:[(0,b.jsx)(`span`,{children:`Не заказывали более:`}),(0,b.jsxs)(`span`,{className:`font-mono font-bold text-krona-primary`,children:[B,` дней`]})]}),(0,b.jsx)(`input`,{type:`range`,min:7,max:90,step:1,value:B,onChange:e=>{let t=Number(e.target.value);V(t),U(Math.max(15,Math.floor(H+t/3)))},className:`w-full accent-krona-green`})]})]}),(0,b.jsxs)(`div`,{className:`p-4 bg-krona-surface rounded-xl border border-krona-border flex flex-col justify-between space-y-3`,children:[(0,b.jsxs)(`div`,{children:[(0,b.jsx)(`span`,{className:`text-[10px] uppercase font-bold text-krona-secondary block`,children:`Размер сегмента по фильтрам:`}),(0,b.jsxs)(`div`,{className:`text-2xl font-bold font-mono text-krona-green mt-1`,children:[H,` гостей`]}),(0,b.jsx)(`p`,{className:`text-[11px] text-krona-secondary mt-1`,children:`~14.2% от общей базы активных контактов CRM`})]}),(0,b.jsx)(`div`,{className:`pt-2 border-t border-krona-border flex gap-2`,children:(0,b.jsx)(n,{variant:`primary`,size:`sm`,onClick:()=>{k(!0),N(`Чек от ${g(R)}, без визитов > ${B}дн`)},className:`w-full`,children:`Создать рассылку для этого сегмента`})})]})]})]}),O&&(0,b.jsx)(p,{isOpen:O,onClose:()=>k(!1),title:`Новая промо-кампания`,subtitle:`Настройка параметров рассылки и промокода`,maxWidth:`sm`,footer:(0,b.jsxs)(`div`,{className:`flex gap-2 w-full justify-end`,children:[(0,b.jsx)(n,{variant:`secondary`,onClick:()=>k(!1),children:`Отмена`}),(0,b.jsx)(n,{variant:`primary`,onClick:t=>{if(t.preventDefault(),!A.trim())return;let n={id:`camp-${Date.now()}`,title:A.trim(),type:`promo`,segment:M,channel:P,status:`active`,sentCount:H,openRate:0,revenue:0,promoCode:I.toUpperCase(),discountPercent:15};r(e=>[n,...e]),k(!1),j(``),e({title:`Кампания создана`,message:`Кампания «${n.title}» добавлена в очередь отправки`,type:`success`})},children:`Запустить кампанию`})]}),children:(0,b.jsxs)(`div`,{className:`space-y-3 text-xs`,children:[(0,b.jsxs)(`div`,{className:`space-y-1`,children:[(0,b.jsx)(`label`,{className:`font-semibold text-krona-primary`,children:`Название акции:`}),(0,b.jsx)(`input`,{type:`text`,value:A,onChange:e=>j(e.target.value),placeholder:`Например: Скидка 15% на роллы в будни`,className:`w-full p-2 bg-krona-workspace border border-krona-border rounded-lg text-krona-primary focus:outline-none focus:border-krona-green`})]}),(0,b.jsxs)(`div`,{className:`space-y-1`,children:[(0,b.jsx)(`label`,{className:`font-semibold text-krona-primary`,children:`Целевой сегмент:`}),(0,b.jsx)(`input`,{type:`text`,value:M,onChange:e=>N(e.target.value),className:`w-full p-2 bg-krona-workspace border border-krona-border rounded-lg text-krona-primary focus:outline-none focus:border-krona-green`})]}),(0,b.jsxs)(`div`,{className:`grid grid-cols-2 gap-3`,children:[(0,b.jsxs)(`div`,{className:`space-y-1`,children:[(0,b.jsx)(`label`,{className:`font-semibold text-krona-primary`,children:`Канал отправки:`}),(0,b.jsxs)(`select`,{value:P,onChange:e=>F(e.target.value),className:`w-full p-2 bg-krona-workspace border border-krona-border rounded-lg text-krona-primary focus:outline-none focus:border-krona-green`,children:[(0,b.jsx)(`option`,{value:`Telegram`,children:`Telegram`}),(0,b.jsx)(`option`,{value:`WhatsApp`,children:`WhatsApp`}),(0,b.jsx)(`option`,{value:`Push & SMS`,children:`Push & SMS`})]})]}),(0,b.jsxs)(`div`,{className:`space-y-1`,children:[(0,b.jsx)(`label`,{className:`font-semibold text-krona-primary`,children:`Промокод:`}),(0,b.jsx)(`input`,{type:`text`,value:I,onChange:e=>L(e.target.value),className:`w-full p-2 bg-krona-workspace border border-krona-border rounded-lg font-mono font-bold text-krona-primary focus:outline-none focus:border-krona-green uppercase`})]})]})]})})]})};export{S as MarketingModule}; \ No newline at end of file diff --git a/dist/assets/OperationsModule-DlDaJDmo.js b/dist/assets/OperationsModule-DlDaJDmo.js new file mode 100644 index 0000000..2eb75fa --- /dev/null +++ b/dist/assets/OperationsModule-DlDaJDmo.js @@ -0,0 +1 @@ +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{t as s}from"./building-BdUpGLM5.js";import{t as c}from"./dollar-sign-Bf6JneNn.js";import{t as l}from"./phone-DpnQw4if.js";import{t as u}from"./truck-D5o8mTsH.js";import{t as d}from"./user-CuEEaB8a.js";import{t as f}from"./utensils-BhILG_B7.js";import{A as p,B as m,C as h,G as g,H as _,J as v,K as y,R as b,T as x,U as S,Y as ee,a as C,b as te,dt as w,h as T,i as E,k as ne,mt as D,o as re,pt as O,r as k,t as A,u as j,x as M}from"./index-CrJKtV0u.js";import{t as N}from"./formatters-WvGQLZg0.js";import{c as P,t as F}from"./mockData-DAqQG5te.js";import{InventoryModule as ie}from"./InventoryModule-VpTxuRuh.js";import{SalesModule as I}from"./SalesModule-Cf0nSO8B.js";var L={name:`banknote`,size:24,node:[[`rect`,{width:`20`,height:`12`,x:`2`,y:`6`,rx:`2`,key:`9lu3g6`}],[`circle`,{cx:`12`,cy:`12`,r:`2`,key:`1c9p78`}],[`path`,{d:`M6 12h.01M18 12h.01`,key:`113zkx`}]]};L.node;var ae=r(L),R={name:`chef-hat`,size:24,node:[[`path`,{d:`M17 21a1 1 0 0 0 1-1v-5.35c0-.457.316-.844.727-1.041a4 4 0 0 0-2.134-7.589 5 5 0 0 0-9.186 0 4 4 0 0 0-2.134 7.588c.411.198.727.585.727 1.041V20a1 1 0 0 0 1 1Z`,key:`1qvrer`}],[`path`,{d:`M6 17h12`,key:`1jwigz`}]]};R.node;var z=r(R),B={name:`flame`,size:24,node:[[`path`,{d:`M12 3q1 4 4 6.5t3 5.5a1 1 0 0 1-14 0 5 5 0 0 1 1-3 1 1 0 0 0 5 0c0-2-1.5-3-1.5-5q0-2 2.5-4`,key:`1slcih`}]]};B.node;var V=r(B),H={name:`printer`,size:24,node:[[`path`,{d:`M6 18H4a2 2 0 0 1-2-2v-5a2 2 0 0 1 2-2h16a2 2 0 0 1 2 2v5a2 2 0 0 1-2 2h-2`,key:`143wyd`}],[`path`,{d:`M6 9V3a1 1 0 0 1 1-1h10a1 1 0 0 1 1 1v6`,key:`1itne7`}],[`rect`,{x:`6`,y:`14`,width:`12`,height:`8`,rx:`1`,key:`1ue0tg`}]]};H.node;var oe=r(H),U={name:`qr-code`,size:24,node:[[`rect`,{width:`5`,height:`5`,x:`3`,y:`3`,rx:`1`,key:`1tu5fj`}],[`rect`,{width:`5`,height:`5`,x:`16`,y:`3`,rx:`1`,key:`1v8r4q`}],[`rect`,{width:`5`,height:`5`,x:`3`,y:`16`,rx:`1`,key:`1x03jg`}],[`path`,{d:`M21 16h-3a2 2 0 0 0-2 2v3`,key:`177gqh`}],[`path`,{d:`M21 21v.01`,key:`ents32`}],[`path`,{d:`M12 7v3a2 2 0 0 1-2 2H7`,key:`8crl2c`}],[`path`,{d:`M3 12h.01`,key:`nlz23k`}],[`path`,{d:`M12 3h.01`,key:`n36tog`}],[`path`,{d:`M12 16v.01`,key:`133mhm`}],[`path`,{d:`M16 12h1`,key:`1slzba`}],[`path`,{d:`M21 12v.01`,key:`1lwtk9`}],[`path`,{d:`M12 21v-1`,key:`1880an`}]]};U.node;var se=r(U),W={name:`volume-2`,size:24,node:[[`path`,{d:`M11 4.702a.705.705 0 0 0-1.203-.498L6.413 7.587A1.4 1.4 0 0 1 5.416 8H3a1 1 0 0 0-1 1v6a1 1 0 0 0 1 1h2.416a1.4 1.4 0 0 1 .997.413l3.383 3.384A.705.705 0 0 0 11 19.298z`,key:`uqj9uw`}],[`path`,{d:`M16 9a5 5 0 0 1 0 6`,key:`1q6k2b`}],[`path`,{d:`M19.364 18.364a9 9 0 0 0 0-12.728`,key:`ijwkga`}]]};W.node;var G=r(W),K={name:`volume-x`,size:24,node:[[`path`,{d:`M11 4.702a.7.7 0 0 0-1.203-.498L6.413 7.587A1.4 1.4 0 0 1 5.416 8H3a1 1 0 0 0-1 1v6a1 1 0 0 0 1 1h2.416a1.4 1.4 0 0 1 .997.413l3.383 3.384A.7.7 0 0 0 11 19.298z`,key:`1p7khw`}],[`path`,{d:`m16.5 14.5 5-5`,key:`cul3yw`}],[`path`,{d:`m16.5 9.5 5 5`,key:`1akey5`}]]};K.node;var q=r(K),J=t(e(),1),Y=a(),ce=[{name:`Александр Романов`,phone:`+7 (913) 900-11-22`,tag:`VIP • Скидка 10%`},{name:`Елена Морозова`,phone:`+7 (923) 456-78-90`,tag:`Постоянный гость`},{name:`Михаил Васильев`,phone:`+7 (905) 111-22-33`,tag:`Бонусная карта 5%`},{name:`ООО Альфа Консалт`,phone:`+7 (383) 200-40-50`,tag:`B2B безнал`}],le=()=>{let{showToast:e}=o(),{posCart:t,addToCart:r,removeFromCart:a,updateCartQuantity:s,clearCart:c,posDiscountPercent:l,setPosDiscount:u,posCustomerName:f,setPosCustomer:p,posOrderType:m,setPosOrderType:v,posTableNumber:y,setPosTableNumber:ee,posPaymentModalOpen:C,setPosPaymentModalOpen:T,posLastReceipt:E,completeCheckout:D,getActiveProfile:re,activeLocation:O}=w(),M=re(),[P,ie]=(0,J.useState)(`Все`),[I,L]=(0,J.useState)(``),[R,z]=(0,J.useState)(!1),[B,V]=(0,J.useState)(!1),[H,U]=(0,J.useState)(!1),[W,G]=(0,J.useState)(0),[K,q]=(0,J.useState)(0),le=[`Все`,`Роллы`,`Горячее`,`Супы`,`Автоуслуги`,`Автосервис`],ue=F.filter(e=>{let t=P===`Все`||e.category===P,n=e.name.toLowerCase().includes(I.toLowerCase());return t&&n}),X=t.reduce((e,t)=>e+t.price*t.quantity,0),de=X*l/100,Z=Math.max(0,X-de),fe=()=>{t.length!==0&&(U(!1),T(!0))},pe=()=>{let e=Math.round(Z/2);G(e),q(Z-e),U(!0)},me=()=>{W+K===Z&&(T(!1),U(!1),D(`split`),z(!0))},Q=e=>{if(e===`split`){pe();return}T(!1),D(e),z(!0)},he=()=>{e({title:`Печать фискального чека`,message:`Чек ${E?.orderNumber||``} отправлен на кассовый регистратор (Атол 54-Ф)`,type:`success`})},$=Z-(W+K);return(0,Y.jsxs)(`div`,{className:`h-[calc(100vh-8.5rem)] flex flex-col md:flex-row gap-4 animate-fade-in overflow-hidden`,children:[(0,Y.jsxs)(`div`,{className:`flex-1 flex flex-col min-w-0 bg-krona-surface border border-krona-border rounded-xl shadow-krona-soft overflow-hidden`,children:[(0,Y.jsxs)(`div`,{className:`p-3 border-b border-krona-border flex flex-wrap items-center justify-between gap-3 bg-krona-surface/70`,children:[(0,Y.jsx)(`div`,{className:`flex items-center gap-1.5 overflow-x-auto`,children:le.map(e=>(0,Y.jsx)(`button`,{onClick:()=>ie(e),className:`px-3 py-1.5 rounded-lg text-xs font-medium transition-colors ${P===e?`bg-[#2F684C] text-[#F8F6F0] shadow-sm`:`bg-krona-workspace text-krona-secondary hover:text-krona-primary border border-krona-border`}`,children:e},e))}),(0,Y.jsxs)(`div`,{className:`relative w-56`,children:[(0,Y.jsx)(te,{className:`w-3.5 h-3.5 absolute left-2.5 top-2.5 text-krona-secondary`}),(0,Y.jsx)(`input`,{type:`text`,value:I,onChange:e=>L(e.target.value),placeholder:`Поиск по названию...`,className:`w-full pl-8 pr-3 py-1.5 text-xs bg-krona-workspace border border-krona-border rounded-lg text-krona-primary placeholder:text-krona-secondary focus:outline-none focus:border-krona-green`})]})]}),(0,Y.jsx)(`div`,{className:`flex-1 overflow-y-auto p-4 grid grid-cols-2 sm:grid-cols-3 xl:grid-cols-4 gap-3`,children:ue.map(e=>{let n=t.find(t=>t.id===e.id),a=e.isStopListed;return(0,Y.jsxs)(`div`,{onClick:()=>!a&&r(e),className:`group relative p-3.5 rounded-xl border flex flex-col justify-between transition-all select-none ${a?`opacity-50 border-krona-danger/40 bg-krona-danger/5 cursor-not-allowed`:`cursor-pointer border-krona-border bg-krona-surface hover:border-krona-green/60 hover:shadow-krona-soft active:scale-[0.99]`} ${n?`ring-2 ring-krona-green/40`:``}`,children:[(0,Y.jsxs)(`div`,{children:[(0,Y.jsxs)(`div`,{className:`flex items-center justify-between gap-1 mb-1.5`,children:[(0,Y.jsx)(`span`,{className:`text-[10px] text-krona-secondary uppercase font-semibold`,children:e.category}),a?(0,Y.jsx)(i,{variant:`danger`,size:`sm`,children:`Стоп-лист`}):n?(0,Y.jsxs)(i,{variant:`green`,size:`sm`,children:[n.quantity,` в чеке`]}):null]}),(0,Y.jsx)(`h4`,{className:`text-xs font-bold text-krona-primary leading-snug line-clamp-2`,children:e.name}),e.description&&(0,Y.jsx)(`p`,{className:`text-[11px] text-krona-secondary line-clamp-2 mt-1`,children:e.description})]}),(0,Y.jsxs)(`div`,{className:`mt-3 pt-2.5 border-t border-krona-border/40 flex items-baseline justify-between`,children:[(0,Y.jsx)(`span`,{className:`text-sm font-bold text-krona-primary`,children:N(e.price)}),(0,Y.jsxs)(`span`,{className:`text-[10px] text-krona-secondary`,children:[`Себест: `,e.cost,` ₽ (`,e.marginPercent,`%)`]})]})]},e.id)})})]}),(0,Y.jsxs)(`div`,{className:`w-full md:w-80 lg:w-96 flex flex-col bg-krona-surface border border-krona-border rounded-xl shadow-krona-soft overflow-hidden`,children:[(0,Y.jsxs)(`div`,{className:`p-3 border-b border-krona-border bg-krona-surface/80 space-y-2`,children:[(0,Y.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,Y.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,Y.jsx)(`span`,{className:`text-xs font-bold text-krona-primary uppercase tracking-wider`,children:`Текущий чек`}),(0,Y.jsx)(A,{level:`target`,size:`sm`})]}),(0,Y.jsx)(`span`,{className:`text-xs text-krona-secondary`,children:O})]}),(0,Y.jsxs)(`div`,{className:`grid grid-cols-3 gap-1 bg-krona-workspace p-1 rounded-lg border border-krona-border text-xs`,children:[(0,Y.jsx)(`button`,{onClick:()=>v(`hall`),className:`py-1 rounded font-medium transition-colors ${m===`hall`?`bg-[#2F684C] text-white shadow-sm`:`text-krona-secondary`}`,children:`В зале`}),(0,Y.jsx)(`button`,{onClick:()=>v(`takeaway`),className:`py-1 rounded font-medium transition-colors ${m===`takeaway`?`bg-[#2F684C] text-white shadow-sm`:`text-krona-secondary`}`,children:`Навынос`}),(0,Y.jsx)(`button`,{onClick:()=>v(`delivery`),className:`py-1 rounded font-medium transition-colors ${m===`delivery`?`bg-[#2F684C] text-white shadow-sm`:`text-krona-secondary`}`,children:`Доставка`})]}),(0,Y.jsxs)(`div`,{className:`relative`,children:[(0,Y.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,Y.jsxs)(`div`,{className:`flex-1 flex items-center gap-1.5 px-2.5 py-1 bg-krona-workspace border border-krona-border rounded-md text-xs`,children:[(0,Y.jsx)(d,{className:`w-3.5 h-3.5 text-krona-secondary`}),(0,Y.jsx)(`input`,{type:`text`,value:f,onChange:e=>p(e.target.value),placeholder:`Клиент / Выбрать...`,className:`w-full bg-transparent focus:outline-none text-xs text-krona-primary`}),(0,Y.jsx)(`button`,{type:`button`,onClick:()=>V(!B),className:`text-krona-secondary hover:text-krona-primary`,title:`Выбрать из справочника`,children:(0,Y.jsx)(g,{className:`w-3.5 h-3.5`})})]}),m===`hall`&&(0,Y.jsx)(`div`,{className:`w-24`,children:(0,Y.jsx)(`input`,{type:`text`,value:y,onChange:e=>ee(e.target.value),placeholder:`Стол...`,className:`w-full px-2 py-1 bg-krona-workspace border border-krona-border rounded-md text-xs text-krona-primary text-center font-medium focus:outline-none`})})]}),B&&(0,Y.jsxs)(`div`,{className:`absolute left-0 right-0 top-full mt-1 bg-krona-surface border border-krona-border rounded-xl shadow-lg z-20 p-2 space-y-1 text-xs`,children:[(0,Y.jsx)(`div`,{className:`text-[10px] font-bold text-krona-secondary px-2 py-1 uppercase`,children:`Быстрый выбор клиента CRM`}),ce.map((e,t)=>(0,Y.jsxs)(`button`,{type:`button`,onClick:()=>{p(e.name),V(!1),e.tag.includes(`10%`)?u(10):e.tag.includes(`5%`)&&u(5)},className:`w-full text-left p-2 rounded-lg hover:bg-krona-workspace flex items-center justify-between text-xs transition-colors`,children:[(0,Y.jsxs)(`div`,{children:[(0,Y.jsx)(`div`,{className:`font-semibold text-krona-primary`,children:e.name}),(0,Y.jsx)(`div`,{className:`text-[10px] text-krona-secondary`,children:e.phone})]}),(0,Y.jsx)(i,{variant:`gold`,size:`sm`,children:e.tag})]},t)),(0,Y.jsx)(`div`,{className:`pt-1 border-t border-krona-border/50 text-center`,children:(0,Y.jsx)(`button`,{type:`button`,onClick:()=>V(!1),className:`text-[11px] text-krona-secondary hover:text-krona-primary`,children:`Закрыть список`})})]})]})]}),(0,Y.jsx)(`div`,{className:`flex-1 overflow-y-auto p-3 divide-y divide-krona-border/40`,children:t.length===0?(0,Y.jsxs)(`div`,{className:`py-16 text-center text-xs text-krona-secondary`,children:[(0,Y.jsx)(h,{className:`w-8 h-8 mx-auto mb-2 opacity-30`}),`Чек пуст. Добавьте позиции из каталога слева.`]}):t.map(e=>(0,Y.jsxs)(`div`,{className:`py-2.5 first:pt-0 last:pb-0 flex items-center justify-between gap-2 text-xs`,children:[(0,Y.jsxs)(`div`,{className:`flex-1 min-w-0`,children:[(0,Y.jsx)(`div`,{className:`font-semibold text-krona-primary truncate`,children:e.name}),(0,Y.jsxs)(`div`,{className:`text-[11px] text-krona-secondary`,children:[N(e.price),` × `,e.quantity,` = `,N(e.price*e.quantity)]})]}),(0,Y.jsxs)(`div`,{className:`flex items-center gap-1 shrink-0`,children:[(0,Y.jsx)(`button`,{onClick:()=>s(e.id,-1),className:`w-6 h-6 rounded bg-krona-workspace border border-krona-border flex items-center justify-center hover:bg-krona-border/50 text-krona-primary`,"aria-label":`Уменьшить количество ${e.name}`,children:(0,Y.jsx)(ne,{className:`w-3 h-3`})}),(0,Y.jsx)(`span`,{className:`w-6 text-center font-semibold text-xs text-krona-primary`,children:e.quantity}),(0,Y.jsx)(`button`,{onClick:()=>s(e.id,1),className:`w-6 h-6 rounded bg-krona-workspace border border-krona-border flex items-center justify-center hover:bg-krona-border/50 text-krona-primary`,"aria-label":`Увеличить количество ${e.name}`,children:(0,Y.jsx)(x,{className:`w-3 h-3`})}),(0,Y.jsx)(`button`,{onClick:()=>a(e.id),className:`p-1 text-krona-secondary hover:text-krona-danger ml-1`,"aria-label":`Удалить ${e.name} из чека`,children:(0,Y.jsx)(j,{className:`w-3.5 h-3.5`})})]})]},e.id))}),(0,Y.jsxs)(`div`,{className:`p-3.5 border-t border-krona-border bg-krona-surface/80 space-y-2 text-xs`,children:[(0,Y.jsxs)(`div`,{className:`flex items-center justify-between gap-1 text-[11px]`,children:[(0,Y.jsx)(`span`,{className:`text-krona-secondary`,children:`Скидка:`}),(0,Y.jsx)(`div`,{className:`flex items-center gap-1`,children:[0,5,10,15,20].map(e=>(0,Y.jsxs)(`button`,{onClick:()=>u(e),className:`px-2 py-0.5 rounded border transition-colors ${l===e?`bg-krona-gold text-white font-bold border-krona-gold`:`bg-krona-workspace border-krona-border text-krona-secondary`}`,children:[e,`%`]},e))})]}),(0,Y.jsxs)(`div`,{className:`space-y-1 pt-1`,children:[(0,Y.jsxs)(`div`,{className:`flex justify-between text-krona-secondary`,children:[(0,Y.jsx)(`span`,{children:`Сумма позиций:`}),(0,Y.jsx)(`span`,{children:N(X)})]}),l>0&&(0,Y.jsxs)(`div`,{className:`flex justify-between text-krona-danger`,children:[(0,Y.jsxs)(`span`,{children:[`Скидка (`,l,`%):`]}),(0,Y.jsxs)(`span`,{children:[`-`,N(de)]})]}),(0,Y.jsxs)(`div`,{className:`flex justify-between text-base font-bold text-krona-primary pt-1 border-t border-krona-border`,children:[(0,Y.jsx)(`span`,{children:`К оплате:`}),(0,Y.jsx)(`span`,{className:`text-krona-green`,children:N(Z)})]})]}),(0,Y.jsxs)(`div`,{className:`pt-2 flex gap-2`,children:[(0,Y.jsx)(n,{variant:`secondary`,size:`md`,onClick:c,disabled:t.length===0,className:`px-3`,title:`Очистить чек`,children:`Сброс`}),(0,Y.jsxs)(n,{variant:`primary`,size:`md`,onClick:fe,disabled:t.length===0,className:`flex-1 text-sm font-semibold`,children:[`Оплатить `,N(Z)]})]})]})]}),(0,Y.jsx)(k,{isOpen:C,onClose:()=>{T(!1),U(!1)},title:H?`Смешанная оплата (Наличные + Карта)`:`Оплата заказа`,subtitle:`Сумма к оплате: ${N(Z)}`,maxWidth:`md`,children:H?(0,Y.jsxs)(`div`,{className:`space-y-4 text-xs`,children:[(0,Y.jsxs)(`div`,{className:`bg-krona-workspace p-3 rounded-lg border border-krona-border space-y-2`,children:[(0,Y.jsxs)(`div`,{className:`flex justify-between font-bold text-krona-primary`,children:[(0,Y.jsx)(`span`,{children:`Общая сумма к оплате:`}),(0,Y.jsx)(`span`,{children:N(Z)})]}),(0,Y.jsx)(`p`,{className:`text-[11px] text-krona-secondary`,children:`Распределите сумму между наличным расчетом и банковской картой:`})]}),(0,Y.jsxs)(`div`,{className:`grid grid-cols-2 gap-3`,children:[(0,Y.jsxs)(`div`,{className:`space-y-1`,children:[(0,Y.jsxs)(`label`,{className:`text-[11px] font-semibold text-krona-secondary flex items-center gap-1`,children:[(0,Y.jsx)(ae,{className:`w-3.5 h-3.5 text-krona-green`}),` Сумма наличными (₽):`]}),(0,Y.jsx)(`input`,{type:`number`,min:0,max:Z,value:W,onChange:e=>{let t=Math.max(0,Number(e.target.value));G(t),q(Math.max(0,Z-t))},className:`w-full p-2 bg-krona-surface border border-krona-border rounded-lg font-mono font-bold text-sm text-krona-primary focus:outline-none focus:border-krona-green`})]}),(0,Y.jsxs)(`div`,{className:`space-y-1`,children:[(0,Y.jsxs)(`label`,{className:`text-[11px] font-semibold text-krona-secondary flex items-center gap-1`,children:[(0,Y.jsx)(b,{className:`w-3.5 h-3.5 text-sky-600`}),` Сумма картой (₽):`]}),(0,Y.jsx)(`input`,{type:`number`,min:0,max:Z,value:K,onChange:e=>{let t=Math.max(0,Number(e.target.value));q(t),G(Math.max(0,Z-t))},className:`w-full p-2 bg-krona-surface border border-krona-border rounded-lg font-mono font-bold text-sm text-krona-primary focus:outline-none focus:border-krona-green`})]})]}),(0,Y.jsxs)(`div`,{className:`p-2.5 rounded-lg border flex items-center justify-between ${$===0?`bg-emerald-500/10 border-emerald-500/30 text-emerald-700 dark:text-emerald-300`:`bg-rose-500/10 border-rose-500/30 text-rose-700 dark:text-rose-300`}`,children:[(0,Y.jsx)(`div`,{className:`flex items-center gap-1.5 font-medium`,children:$===0?(0,Y.jsxs)(Y.Fragment,{children:[(0,Y.jsx)(_,{className:`w-4 h-4 text-emerald-600`}),(0,Y.jsx)(`span`,{children:`Сумма распределена верно (100%)`})]}):(0,Y.jsxs)(Y.Fragment,{children:[(0,Y.jsx)(S,{className:`w-4 h-4 text-rose-600`}),(0,Y.jsx)(`span`,{children:$>0?`Не распределено: ${N($)}`:`Переплата: ${N(Math.abs($))}`})]})}),(0,Y.jsxs)(`span`,{className:`font-mono font-bold`,children:[N(W+K),` / `,N(Z)]})]}),(0,Y.jsxs)(`div`,{className:`flex gap-2 pt-2 border-t border-krona-border`,children:[(0,Y.jsx)(n,{variant:`secondary`,size:`md`,onClick:()=>U(!1),className:`w-1/3`,children:`Назад`}),(0,Y.jsx)(n,{variant:`primary`,size:`md`,onClick:me,disabled:$!==0,className:`flex-1`,children:`Подтвердить раздельную оплату`})]})]}):(0,Y.jsxs)(`div`,{className:`space-y-3`,children:[(0,Y.jsxs)(`p`,{className:`text-xs text-krona-secondary`,children:[`Выберите способ расчета клиента на кассе точки «`,O,`»:`]}),(0,Y.jsxs)(`div`,{className:`grid grid-cols-2 gap-3 pt-1`,children:[(0,Y.jsxs)(`button`,{onClick:()=>Q(`card`),className:`p-4 rounded-xl border border-krona-border hover:border-krona-green hover:bg-krona-green/5 text-left flex flex-col items-center justify-center gap-2 group transition-all`,children:[(0,Y.jsx)(b,{className:`w-8 h-8 text-krona-green group-hover:scale-110 transition-transform`}),(0,Y.jsx)(`div`,{className:`text-xs font-bold text-krona-primary`,children:`Банковская карта`}),(0,Y.jsx)(`div`,{className:`text-[10px] text-krona-secondary`,children:`Терминал эквайринга`})]}),(0,Y.jsxs)(`button`,{onClick:()=>Q(`cash`),className:`p-4 rounded-xl border border-krona-border hover:border-krona-green hover:bg-krona-green/5 text-left flex flex-col items-center justify-center gap-2 group transition-all`,children:[(0,Y.jsx)(ae,{className:`w-8 h-8 text-krona-green group-hover:scale-110 transition-transform`}),(0,Y.jsx)(`div`,{className:`text-xs font-bold text-krona-primary`,children:`Наличные`}),(0,Y.jsx)(`div`,{className:`text-[10px] text-krona-secondary`,children:`С выдачей сдачи`})]}),(0,Y.jsxs)(`button`,{onClick:()=>Q(`qr`),className:`p-4 rounded-xl border border-krona-border hover:border-krona-green hover:bg-krona-green/5 text-left flex flex-col items-center justify-center gap-2 group transition-all`,children:[(0,Y.jsx)(se,{className:`w-8 h-8 text-krona-gold group-hover:scale-110 transition-transform`}),(0,Y.jsx)(`div`,{className:`text-xs font-bold text-krona-primary`,children:`СБП / QR-код`}),(0,Y.jsx)(`div`,{className:`text-[10px] text-krona-secondary`,children:`Мгновенное зачисление`})]}),(0,Y.jsxs)(`button`,{onClick:()=>Q(`split`),className:`p-4 rounded-xl border border-krona-border hover:border-krona-green hover:bg-krona-green/5 text-left flex flex-col items-center justify-center gap-2 group transition-all`,children:[(0,Y.jsx)(h,{className:`w-8 h-8 text-krona-secondary group-hover:scale-110 transition-transform`}),(0,Y.jsx)(`div`,{className:`text-xs font-bold text-krona-primary`,children:`Смешанная оплата`}),(0,Y.jsx)(`div`,{className:`text-[10px] text-krona-secondary`,children:`Часть нал + часть карта`})]})]})]})}),R&&E&&(0,Y.jsx)(k,{isOpen:R,onClose:()=>z(!1),title:`Чек успешно пробит!`,subtitle:`Заказ ${E.orderNumber} • ${E.timestamp}`,maxWidth:`sm`,footer:(0,Y.jsxs)(`div`,{className:`flex gap-2 w-full`,children:[(0,Y.jsxs)(n,{variant:`secondary`,onClick:he,className:`flex-1 flex items-center justify-center gap-1.5`,children:[(0,Y.jsx)(oe,{className:`w-4 h-4`}),`Распечатать чек`]}),(0,Y.jsx)(n,{variant:`primary`,onClick:()=>z(!1),className:`flex-1`,children:`Новый заказ`})]}),children:(0,Y.jsxs)(`div`,{className:`font-mono text-xs bg-krona-workspace p-3.5 rounded-lg border border-krona-border space-y-2`,children:[(0,Y.jsxs)(`div`,{className:`text-center font-bold pb-1 border-b border-dashed border-krona-border`,children:[M.companyName,(0,Y.jsx)(`div`,{className:`text-[10px] font-normal text-krona-secondary`,children:E.location}),(0,Y.jsx)(`div`,{className:`text-[10px] text-krona-secondary font-normal`,children:`Касса №1 • Смена открыта`})]}),(0,Y.jsx)(`div`,{className:`space-y-1 py-1`,children:E.items.map((e,t)=>(0,Y.jsxs)(`div`,{className:`flex justify-between`,children:[(0,Y.jsxs)(`span`,{children:[e.name,` × `,e.quantity]}),(0,Y.jsx)(`span`,{children:N(e.price*e.quantity)})]},t))}),(0,Y.jsxs)(`div`,{className:`pt-2 border-t border-dashed border-krona-border space-y-1`,children:[(0,Y.jsxs)(`div`,{className:`flex justify-between`,children:[(0,Y.jsx)(`span`,{children:`Сумма:`}),(0,Y.jsx)(`span`,{children:N(E.subtotal)})]}),E.discount>0&&(0,Y.jsxs)(`div`,{className:`flex justify-between text-krona-danger`,children:[(0,Y.jsx)(`span`,{children:`Скидка:`}),(0,Y.jsxs)(`span`,{children:[`-`,N(E.discount)]})]}),(0,Y.jsxs)(`div`,{className:`flex justify-between font-bold text-sm pt-1 border-t border-dotted border-krona-border`,children:[(0,Y.jsx)(`span`,{children:`ИТОГ К ОПЛАТЕ:`}),(0,Y.jsx)(`span`,{children:N(E.total)})]}),(0,Y.jsxs)(`div`,{className:`flex justify-between text-[11px] text-krona-secondary`,children:[(0,Y.jsx)(`span`,{children:`Способ оплаты:`}),(0,Y.jsx)(`span`,{className:`uppercase font-semibold`,children:E.paymentType})]}),E.customer&&(0,Y.jsxs)(`div`,{className:`flex justify-between text-[11px] text-krona-secondary`,children:[(0,Y.jsx)(`span`,{children:`Клиент:`}),(0,Y.jsx)(`span`,{children:E.customer})]}),(0,Y.jsxs)(`div`,{className:`flex justify-between text-[10px] text-krona-secondary pt-1`,children:[(0,Y.jsx)(`span`,{children:`ФП (фискальный признак):`}),(0,Y.jsx)(`span`,{children:`ФП: 49204910283`})]}),(0,Y.jsx)(`div`,{className:`flex justify-between text-[10px] text-krona-secondary`,children:(0,Y.jsx)(`span`,{children:`ФН: 996044030198 • РН ККТ: 00049281001`})})]}),(0,Y.jsxs)(`div`,{className:`pt-2 text-center text-[10px] text-krona-secondary border-t border-dashed border-krona-border`,children:[`Спасибо за заказ в «`,M.companyName,`»!`]})]})})]})},ue=()=>{let{kdsTickets:e,updateKdsTicketStatus:t}=w(),{showToast:r}=o(),[a,s]=(0,J.useState)(!0),[c,l]=(0,J.useState)(`Все цеха`),[u,d]=(0,J.useState)(0);(0,J.useEffect)(()=>{let e=setInterval(()=>{d(e=>e+1)},1e3);return()=>clearInterval(e)},[]);let f=()=>{let e=!a;s(e),r({title:e?`Звуковые оповещения включены`:`Звук отключен`,message:e?`Звуковой сигнал будет воспроизводиться при поступлении нового заказа`:`Уведомления без звука`,type:`info`})},p=[`Все цеха`,`Суши-цех`,`Кухня`,`Горячий цех`],h=e.filter(e=>c===`Все цеха`||e.items.some(e=>e.station===c)),g=h.filter(e=>e.status===`new`),v=h.filter(e=>e.status===`cooking`),b=h.filter(e=>e.status===`ready`),x=e=>{let r=e.elapsedMinutes+Math.floor(u/60),a=r>20,o=r>10&&r<=20;return(0,Y.jsxs)(`div`,{className:`p-3.5 rounded-xl border flex flex-col justify-between transition-all shadow-krona-soft bg-krona-surface ${e.isUrgent?`border-rose-500/80 bg-rose-500/5 ring-1 ring-rose-500/40 animate-pulse`:a?`border-rose-500/70 bg-rose-500/5`:o?`border-amber-500/70`:`border-krona-border`}`,children:[(0,Y.jsxs)(`div`,{children:[(0,Y.jsxs)(`div`,{className:`flex items-center justify-between pb-2 border-b border-krona-border/60`,children:[(0,Y.jsxs)(`div`,{className:`flex items-center gap-1.5`,children:[(0,Y.jsx)(`span`,{className:`font-bold text-sm text-krona-primary`,children:e.orderNumber}),(0,Y.jsx)(i,{variant:`neutral`,size:`sm`,children:e.tableOrChannel}),e.isUrgent&&(0,Y.jsx)(i,{variant:`danger`,size:`sm`,children:`Срочно`})]}),(0,Y.jsxs)(`div`,{className:`flex items-center gap-1`,children:[(0,Y.jsx)(m,{className:`w-3.5 h-3.5 ${a?`text-rose-600`:o?`text-amber-600`:`text-krona-secondary`}`}),(0,Y.jsxs)(`span`,{className:`text-xs font-mono font-bold ${a?`text-rose-600`:o?`text-amber-600`:`text-krona-secondary`}`,children:[r,` мин`]})]})]}),(0,Y.jsx)(`div`,{className:`py-2.5 space-y-2 text-xs`,children:e.items.map((e,t)=>(0,Y.jsxs)(`div`,{className:`flex items-start justify-between gap-2`,children:[(0,Y.jsxs)(`div`,{className:`flex items-center gap-1.5 font-medium text-krona-primary`,children:[(0,Y.jsx)(`span`,{className:`w-5 h-5 rounded bg-krona-workspace border border-krona-border flex items-center justify-center font-bold text-xs`,children:e.quantity}),(0,Y.jsx)(`span`,{children:e.name})]}),(0,Y.jsx)(`span`,{className:`text-[10px] px-1.5 py-0.5 rounded bg-krona-muted text-krona-secondary`,children:e.station})]},t))})]}),(0,Y.jsxs)(`div`,{className:`pt-2.5 border-t border-krona-border/60 flex items-center justify-between gap-2`,children:[e.status===`new`&&(0,Y.jsxs)(n,{variant:`gold`,size:`sm`,className:`w-full text-xs`,onClick:()=>t(e.id,`cooking`),children:[(0,Y.jsx)(V,{className:`w-3.5 h-3.5 mr-1.5`}),`В работу (Начать готовить)`]}),e.status===`cooking`&&(0,Y.jsxs)(`div`,{className:`flex items-center gap-1.5 w-full`,children:[(0,Y.jsx)(n,{variant:`secondary`,size:`sm`,className:`px-2`,title:`Вернуть в новые`,onClick:()=>t(e.id,`new`),children:(0,Y.jsx)(M,{className:`w-3 h-3 text-krona-secondary`})}),(0,Y.jsxs)(n,{variant:`primary`,size:`sm`,className:`flex-1 text-xs`,onClick:()=>t(e.id,`ready`),children:[(0,Y.jsx)(y,{className:`w-3.5 h-3.5 mr-1.5`}),`Готово к выдаче`]})]}),e.status===`ready`&&(0,Y.jsxs)(`div`,{className:`flex items-center gap-1.5 w-full`,children:[(0,Y.jsx)(n,{variant:`secondary`,size:`sm`,className:`px-2`,title:`Вернуть в готовку`,onClick:()=>t(e.id,`cooking`),children:(0,Y.jsx)(M,{className:`w-3 h-3 text-krona-secondary`})}),(0,Y.jsxs)(n,{variant:`secondary`,size:`sm`,className:`flex-1 text-xs hover:bg-emerald-500/10 hover:border-emerald-500/50`,onClick:()=>t(e.id,`served`),children:[(0,Y.jsx)(_,{className:`w-3.5 h-3.5 mr-1.5 text-emerald-600`}),`Выдано гостю / курьеру`]})]})]})]},e.id)};return(0,Y.jsxs)(`div`,{className:`space-y-4 animate-fade-in`,children:[(0,Y.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,Y.jsxs)(`div`,{children:[(0,Y.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,Y.jsx)(`h2`,{className:`text-sm font-bold text-krona-primary`,children:`Кухонный монитор заказов & Экран цехов (KDS)`}),(0,Y.jsx)(A,{level:`target`,size:`sm`})]}),(0,Y.jsx)(`p`,{className:`text-xs text-krona-secondary mt-0.5`,children:`Управление очередью приготовления блюд по станциям в реальном времени с таймерами готовки`})]}),(0,Y.jsxs)(`div`,{className:`flex items-center gap-2 text-xs flex-wrap`,children:[(0,Y.jsx)(`div`,{className:`flex items-center gap-1 bg-krona-workspace p-1 rounded-lg border border-krona-border`,children:p.map(e=>(0,Y.jsx)(`button`,{onClick:()=>l(e),className:`px-2.5 py-1 rounded text-xs font-medium transition-colors ${c===e?`bg-[#2F684C] text-white shadow-sm`:`text-krona-secondary hover:text-krona-primary`}`,children:e},e))}),(0,Y.jsx)(n,{variant:`secondary`,size:`sm`,onClick:f,title:a?`Звук включен`:`Звук выключен`,className:`px-2.5`,children:a?(0,Y.jsx)(G,{className:`w-3.5 h-3.5 text-emerald-600`}):(0,Y.jsx)(q,{className:`w-3.5 h-3.5 text-krona-secondary`})}),(0,Y.jsxs)(i,{variant:`warning`,size:`md`,children:[`В работе: `,v.length]}),(0,Y.jsxs)(i,{variant:`green`,size:`md`,children:[`Готово: `,b.length]})]})]}),(0,Y.jsxs)(`div`,{className:`grid grid-cols-1 md:grid-cols-3 gap-4`,children:[(0,Y.jsxs)(`div`,{className:`bg-krona-workspace/80 border border-krona-border rounded-xl p-3 flex flex-col min-h-[500px]`,children:[(0,Y.jsxs)(`div`,{className:`flex items-center justify-between pb-2 mb-2 border-b border-krona-border`,children:[(0,Y.jsxs)(`span`,{className:`text-xs font-bold text-krona-primary flex items-center gap-1.5`,children:[(0,Y.jsx)(`span`,{className:`w-2 h-2 rounded-full bg-sky-500`}),`Новые заказы`]}),(0,Y.jsx)(`span`,{className:`text-xs font-mono font-bold text-krona-secondary`,children:g.length})]}),(0,Y.jsx)(`div`,{className:`space-y-3 flex-1 overflow-y-auto`,children:g.length===0?(0,Y.jsx)(`div`,{className:`text-center py-16 text-xs text-krona-secondary`,children:`Нет новых заказов в цехе`}):g.map(x)})]}),(0,Y.jsxs)(`div`,{className:`bg-krona-workspace/80 border border-krona-border rounded-xl p-3 flex flex-col min-h-[500px]`,children:[(0,Y.jsxs)(`div`,{className:`flex items-center justify-between pb-2 mb-2 border-b border-krona-border`,children:[(0,Y.jsxs)(`span`,{className:`text-xs font-bold text-krona-primary flex items-center gap-1.5`,children:[(0,Y.jsx)(`span`,{className:`w-2 h-2 rounded-full bg-amber-500`}),`Готовятся на кухне`]}),(0,Y.jsx)(`span`,{className:`text-xs font-mono font-bold text-krona-secondary`,children:v.length})]}),(0,Y.jsx)(`div`,{className:`space-y-3 flex-1 overflow-y-auto`,children:v.length===0?(0,Y.jsx)(`div`,{className:`text-center py-16 text-xs text-krona-secondary`,children:`Цех свободен`}):v.map(x)})]}),(0,Y.jsxs)(`div`,{className:`bg-krona-workspace/80 border border-krona-border rounded-xl p-3 flex flex-col min-h-[500px]`,children:[(0,Y.jsxs)(`div`,{className:`flex items-center justify-between pb-2 mb-2 border-b border-krona-border`,children:[(0,Y.jsxs)(`span`,{className:`text-xs font-bold text-krona-primary flex items-center gap-1.5`,children:[(0,Y.jsx)(`span`,{className:`w-2 h-2 rounded-full bg-emerald-500`}),`Готовы к выдаче`]}),(0,Y.jsx)(`span`,{className:`text-xs font-mono font-bold text-krona-secondary`,children:b.length})]}),(0,Y.jsx)(`div`,{className:`space-y-3 flex-1 overflow-y-auto`,children:b.length===0?(0,Y.jsx)(`div`,{className:`text-center py-16 text-xs text-krona-secondary`,children:`Нет готовых к выдаче`}):b.map(x)})]})]})]})},X=[{id:`t1`,name:`Стол 1 (VIP)`,zone:`VIP-зона`,capacity:6,status:`occupied`,waiter:`Алина Соколова`,seatedMinutes:45,currentTotal:6850,guestsCount:5,items:[{name:`Филадельфия Премиум`,qty:2,price:950},{name:`Том Ям с морепродуктами`,qty:2,price:680},{name:`Сет Дракон`,qty:1,price:2190},{name:`Морс клюквенный 1л`,qty:2,price:350}]},{id:`t2`,name:`Стол 2`,zone:`Основной зал`,capacity:2,status:`occupied`,waiter:`Артем Васильев`,seatedMinutes:22,currentTotal:2450,guestsCount:2,items:[{name:`Калифорния краб`,qty:2,price:790},{name:`Рамен Тонкоцу`,qty:1,price:590},{name:`Зеленый чай Сентя`,qty:1,price:280}]},{id:`t3`,name:`Стол 3`,zone:`Основной зал`,capacity:4,status:`free`},{id:`t4`,name:`Стол 4 (у окна)`,zone:`Основной зал`,capacity:4,status:`occupied`,waiter:`Алина Соколова`,seatedMinutes:18,currentTotal:4200,guestsCount:3,items:[{name:`Гёдза со свининой`,qty:3,price:420},{name:`Сет Горячая Шестерка`,qty:1,price:2450},{name:`Лимонад Юдзу`,qty:1,price:490}]},{id:`t5`,name:`Стол 5 (диван)`,zone:`Основной зал`,capacity:6,status:`reserved`,reservationTime:`19:00`,reservationClient:`Анна Воронина (3 чел)`},{id:`t6`,name:`Стол 6`,zone:`Основной зал`,capacity:2,status:`free`},{id:`t7`,name:`Стол 7`,zone:`Терраса`,capacity:4,status:`bill_printed`,waiter:`Артем Васильев`,seatedMinutes:62,currentTotal:5100,guestsCount:4,items:[{name:`Сет Филадельфия Мания`,qty:1,price:2890},{name:`Салат Чука с ореховым соусом`,qty:2,price:450},{name:`Чайник Эрл Грей`,qty:1,price:350},{name:`Десерт Моти ассорти`,qty:2,price:480}]},{id:`t8`,name:`Стол 8`,zone:`Терраса`,capacity:4,status:`free`},{id:`bar1`,name:`Барная стойка 1-3`,zone:`Бар`,capacity:3,status:`occupied`,waiter:`Бармен`,seatedMinutes:12,currentTotal:1800,guestsCount:2,items:[{name:`Коктейль Саке Сауэр`,qty:2,price:650},{name:`Эдамаме с морской солью`,qty:1,price:350}]}],de=()=>{let[e,t]=(0,J.useState)(X),[r,a]=(0,J.useState)(null),[s,c]=(0,J.useState)(`Все зоны`),[l,u]=(0,J.useState)(!1),[d,p]=(0,J.useState)(``),[h,g]=(0,J.useState)(`20:00`),[_,v]=(0,J.useState)(2),{setPosTableNumber:y}=w(),{showToast:b}=o(),x=D(),S=[`Все зоны`,`Основной зал`,`VIP-зона`,`Терраса`,`Бар`],C=e.filter(e=>s===`Все зоны`||e.zone===s),te=e=>{y(e.name),x(`/operations/pos`)},T=e=>{t(t=>t.map(t=>t.id===e?{...t,status:`bill_printed`}:t)),r&&r.id===e&&a({...r,status:`bill_printed`}),b({title:`Пречек напечатан`,message:`Предварительный счет для стола «${r?.name||e}» отправлен на печать`,type:`success`})},E=e=>{t(t=>t.map(t=>t.id===e?{...t,status:`free`,currentTotal:0,guestsCount:void 0,waiter:void 0,seatedMinutes:void 0,items:[]}:t)),a(null),b({title:`Стол освобожден`,message:`Стол готов к приему новых гостей`,type:`info`})},ne=e=>{t(t=>t.map(t=>t.id===e?{...t,status:`occupied`,waiter:`Дежурный официант`,seatedMinutes:1,guestsCount:t.capacity,currentTotal:0,items:[]}:t)),r&&r.id===e&&a({...r,status:`occupied`,waiter:`Дежурный официант`,seatedMinutes:1,guestsCount:r.capacity,currentTotal:0,items:[]}),b({title:`Гости рассажены`,message:`Стол ${r?.name||``} переведен в статус «Занят»`,type:`success`})},O=()=>{r&&(t(e=>e.map(e=>e.id===r.id?{...e,status:`reserved`,reservationTime:h,reservationClient:`${d} (${_} чел)`}:e)),u(!1),a(null),b({title:`Бронь подтверждена`,message:`Бронь на время ${h} для ${d} сохранена`,type:`success`}))},j=e=>{switch(e){case`occupied`:return(0,Y.jsx)(i,{variant:`green`,size:`sm`,children:`Занят`});case`reserved`:return(0,Y.jsx)(i,{variant:`gold`,size:`sm`,children:`Бронь`});case`bill_printed`:return(0,Y.jsx)(i,{variant:`warning`,size:`sm`,children:`Пречек`});default:return(0,Y.jsx)(i,{variant:`neutral`,size:`sm`,children:`Свободен`})}},M=e.filter(e=>e.status===`occupied`||e.status===`bill_printed`).length,P=e.filter(e=>e.status===`reserved`).length,F=e.filter(e=>e.status===`free`).length;return(0,Y.jsxs)(`div`,{className:`space-y-4 animate-fade-in`,children:[(0,Y.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,Y.jsxs)(`div`,{children:[(0,Y.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,Y.jsx)(`h2`,{className:`text-sm font-bold text-krona-primary`,children:`Схема залов, столы и обслуживание гостей`}),(0,Y.jsx)(A,{level:`target`,size:`sm`})]}),(0,Y.jsx)(`p`,{className:`text-xs text-krona-secondary mt-0.5`,children:`Интерактивная карта посадочных мест, статусы чеков, пречеки и назначенные официанты`})]}),(0,Y.jsxs)(`div`,{className:`flex items-center gap-2 flex-wrap`,children:[(0,Y.jsx)(`div`,{className:`flex items-center gap-1 bg-krona-workspace p-1 rounded-lg border border-krona-border text-xs`,children:S.map(e=>(0,Y.jsx)(`button`,{onClick:()=>c(e),className:`px-2.5 py-1 rounded font-medium transition-colors ${s===e?`bg-[#2F684C] text-white shadow-sm`:`text-krona-secondary hover:text-krona-primary`}`,children:e},e))}),(0,Y.jsxs)(i,{variant:`green`,size:`md`,children:[`Занято: `,M]}),(0,Y.jsxs)(i,{variant:`gold`,size:`md`,children:[`Бронь: `,P]}),(0,Y.jsxs)(i,{variant:`neutral`,size:`md`,children:[`Свободно: `,F]})]})]}),(0,Y.jsx)(`div`,{className:`grid grid-cols-2 sm:grid-cols-3 lg:grid-cols-4 gap-4`,children:C.map(e=>{let t=e.status===`occupied`||e.status===`bill_printed`;return(0,Y.jsxs)(`div`,{onClick:()=>a(e),className:`p-4 rounded-xl border flex flex-col justify-between transition-all cursor-pointer shadow-krona-soft select-none ${e.status===`occupied`?`border-emerald-500/70 bg-emerald-500/5 hover:border-emerald-500`:e.status===`bill_printed`?`border-amber-500/70 bg-amber-500/5 hover:border-amber-500`:e.status===`reserved`?`border-krona-gold/70 bg-krona-gold/5 hover:border-krona-gold`:`border-krona-border bg-krona-surface hover:border-krona-border-strong`}`,children:[(0,Y.jsxs)(`div`,{children:[(0,Y.jsxs)(`div`,{className:`flex items-center justify-between mb-2`,children:[(0,Y.jsx)(`span`,{className:`font-bold text-sm text-krona-primary`,children:e.name}),j(e.status)]}),(0,Y.jsxs)(`div`,{className:`flex items-center justify-between text-xs text-krona-secondary mb-2`,children:[(0,Y.jsxs)(`div`,{className:`flex items-center gap-1`,children:[(0,Y.jsx)(re,{className:`w-3.5 h-3.5`}),(0,Y.jsxs)(`span`,{children:[`До `,e.capacity,` гостей`]})]}),(0,Y.jsx)(`span`,{className:`text-[10px] bg-krona-workspace px-1.5 py-0.5 rounded border border-krona-border/50`,children:e.zone})]}),t&&(0,Y.jsxs)(`div`,{className:`space-y-1 py-1 text-xs`,children:[(0,Y.jsxs)(`div`,{className:`flex justify-between font-bold text-krona-primary`,children:[(0,Y.jsx)(`span`,{children:`Счет:`}),(0,Y.jsx)(`span`,{children:N(e.currentTotal||0)})]}),(0,Y.jsxs)(`div`,{className:`flex justify-between text-krona-secondary text-[11px]`,children:[(0,Y.jsx)(`span`,{children:`Официант:`}),(0,Y.jsx)(`span`,{className:`truncate`,children:e.waiter})]}),(0,Y.jsxs)(`div`,{className:`flex justify-between text-krona-secondary text-[11px]`,children:[(0,Y.jsx)(`span`,{children:`Время:`}),(0,Y.jsxs)(`span`,{children:[e.seatedMinutes,` мин`]})]})]}),e.status===`reserved`&&(0,Y.jsxs)(`div`,{className:`py-1 text-xs text-krona-gold-text bg-krona-gold/10 p-2 rounded-lg space-y-1`,children:[(0,Y.jsxs)(`div`,{className:`font-semibold flex items-center gap-1`,children:[(0,Y.jsx)(m,{className:`w-3.5 h-3.5`}),` `,e.reservationTime]}),(0,Y.jsx)(`div`,{className:`text-[11px] truncate`,children:e.reservationClient})]}),e.status===`free`&&(0,Y.jsx)(`div`,{className:`py-4 text-center text-xs text-krona-secondary`,children:`Готов к посадке`})]}),(0,Y.jsxs)(`div`,{className:`pt-2 border-t border-krona-border/50 flex justify-between items-center text-xs text-krona-green font-medium`,children:[(0,Y.jsx)(`span`,{children:`Подробнее`}),(0,Y.jsx)(`span`,{children:`→`})]})]},e.id)})}),r&&!l&&(0,Y.jsx)(k,{isOpen:!!r,onClose:()=>a(null),title:`Управление столом: ${r.name}`,subtitle:`${r.zone} • Вместимость: ${r.capacity} персон`,maxWidth:`md`,children:(0,Y.jsxs)(`div`,{className:`space-y-4 text-xs`,children:[(0,Y.jsxs)(`div`,{className:`flex items-center justify-between p-3 bg-krona-workspace rounded-lg border border-krona-border`,children:[(0,Y.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,Y.jsx)(`span`,{className:`text-krona-secondary`,children:`Текущий статус:`}),j(r.status)]}),r.waiter&&(0,Y.jsxs)(`div`,{className:`text-krona-secondary`,children:[`Официант: `,(0,Y.jsx)(`strong`,{className:`text-krona-primary`,children:r.waiter})]})]}),(r.status===`occupied`||r.status===`bill_printed`)&&(0,Y.jsxs)(`div`,{className:`space-y-3`,children:[(0,Y.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,Y.jsx)(`h4`,{className:`font-bold text-krona-primary`,children:`Заказ стола:`}),(0,Y.jsx)(`span`,{className:`font-mono font-bold text-sm text-krona-green`,children:N(r.currentTotal||0)})]}),(0,Y.jsx)(`div`,{className:`bg-krona-surface border border-krona-border rounded-lg divide-y divide-krona-border/50 max-h-48 overflow-y-auto`,children:r.items&&r.items.length>0?r.items.map((e,t)=>(0,Y.jsxs)(`div`,{className:`p-2.5 flex items-center justify-between`,children:[(0,Y.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,Y.jsx)(`span`,{className:`w-5 h-5 rounded bg-krona-workspace flex items-center justify-center font-bold text-[11px]`,children:e.qty}),(0,Y.jsx)(`span`,{className:`font-medium text-krona-primary`,children:e.name})]}),(0,Y.jsx)(`span`,{className:`font-mono font-medium text-krona-primary`,children:N(e.price*e.qty)})]},t)):(0,Y.jsx)(`div`,{className:`p-4 text-center text-krona-secondary text-xs`,children:`Заказ еще формируется на кассе`})}),(0,Y.jsxs)(`div`,{className:`grid grid-cols-2 sm:grid-cols-3 gap-2 pt-2`,children:[(0,Y.jsx)(n,{variant:`primary`,size:`sm`,onClick:()=>te(r),children:`Открыть в кассе POS`}),(0,Y.jsxs)(n,{variant:`secondary`,size:`sm`,onClick:()=>T(r.id),children:[(0,Y.jsx)(oe,{className:`w-3.5 h-3.5 mr-1`}),`Напечатать пречек`]}),(0,Y.jsx)(n,{variant:`danger`,size:`sm`,onClick:()=>E(r.id),children:`Освободить стол`})]})]}),r.status===`free`&&(0,Y.jsxs)(`div`,{className:`space-y-3 py-2 text-center`,children:[(0,Y.jsx)(`p`,{className:`text-krona-secondary`,children:`Стол свободен и готов принять гостей. Выберите действие:`}),(0,Y.jsxs)(`div`,{className:`flex justify-center gap-3`,children:[(0,Y.jsxs)(n,{variant:`primary`,size:`md`,onClick:()=>ne(r.id),children:[(0,Y.jsx)(f,{className:`w-4 h-4 mr-1.5`}),`Посадить гостей (Занять стол)`]}),(0,Y.jsxs)(n,{variant:`gold`,size:`md`,onClick:()=>{v(r.capacity),u(!0)},children:[(0,Y.jsx)(ee,{className:`w-4 h-4 mr-1.5`}),`Забронировать стол`]})]})]}),r.status===`reserved`&&(0,Y.jsxs)(`div`,{className:`space-y-3`,children:[(0,Y.jsxs)(`div`,{className:`p-3 bg-krona-gold/10 border border-krona-gold/30 rounded-lg`,children:[(0,Y.jsx)(`div`,{className:`font-bold text-krona-primary mb-1`,children:`Детали бронирования:`}),(0,Y.jsxs)(`div`,{className:`text-krona-secondary`,children:[`Время: `,(0,Y.jsx)(`strong`,{children:r.reservationTime})]}),(0,Y.jsxs)(`div`,{className:`text-krona-secondary`,children:[`Гость: `,(0,Y.jsx)(`strong`,{children:r.reservationClient})]})]}),(0,Y.jsxs)(`div`,{className:`flex justify-end gap-2 pt-2`,children:[(0,Y.jsx)(n,{variant:`secondary`,size:`sm`,onClick:()=>E(r.id),children:`Отменить бронь`}),(0,Y.jsx)(n,{variant:`primary`,size:`sm`,onClick:()=>ne(r.id),children:`Гости прибыли (Посадить за стол)`})]})]})]})}),l&&r&&(0,Y.jsx)(k,{isOpen:l,onClose:()=>u(!1),title:`Бронирование: ${r.name}`,subtitle:`Внесение записи в журнал бронирования столов`,maxWidth:`sm`,footer:(0,Y.jsxs)(`div`,{className:`flex gap-2 w-full justify-end`,children:[(0,Y.jsx)(n,{variant:`secondary`,onClick:()=>u(!1),children:`Отмена`}),(0,Y.jsx)(n,{variant:`primary`,onClick:O,disabled:!d.trim(),children:`Сохранить бронь`})]}),children:(0,Y.jsxs)(`div`,{className:`space-y-3 text-xs`,children:[(0,Y.jsxs)(`div`,{className:`space-y-1`,children:[(0,Y.jsx)(`label`,{className:`font-semibold text-krona-primary`,children:`Имя и телефон гостя:`}),(0,Y.jsx)(`input`,{type:`text`,value:d,onChange:e=>p(e.target.value),placeholder:`Иван Петров, +7 913...`,className:`w-full p-2 bg-krona-workspace border border-krona-border rounded-lg text-krona-primary focus:outline-none focus:border-krona-green`})]}),(0,Y.jsxs)(`div`,{className:`grid grid-cols-2 gap-3`,children:[(0,Y.jsxs)(`div`,{className:`space-y-1`,children:[(0,Y.jsx)(`label`,{className:`font-semibold text-krona-primary`,children:`Время брони:`}),(0,Y.jsx)(`input`,{type:`text`,value:h,onChange:e=>g(e.target.value),placeholder:`19:30`,className:`w-full p-2 bg-krona-workspace border border-krona-border rounded-lg text-krona-primary focus:outline-none focus:border-krona-green`})]}),(0,Y.jsxs)(`div`,{className:`space-y-1`,children:[(0,Y.jsx)(`label`,{className:`font-semibold text-krona-primary`,children:`Количество персон:`}),(0,Y.jsx)(`input`,{type:`number`,min:1,max:r.capacity,value:_,onChange:e=>v(Number(e.target.value)),className:`w-full p-2 bg-krona-workspace border border-krona-border rounded-lg text-krona-primary focus:outline-none focus:border-krona-green`})]})]})]})})]})},Z=()=>{let{workOrders:e,updateWorkOrderStatus:t,setIsQuickActionsOpen:r}=w(),[a,o]=(0,J.useState)(null),s=e=>{switch(e){case`in_progress`:return(0,Y.jsx)(i,{variant:`warning`,size:`sm`,children:`В работе на посту`});case`ready`:return(0,Y.jsx)(i,{variant:`gold`,size:`sm`,children:`Готов к выдаче`});case`paid`:return(0,Y.jsx)(i,{variant:`green`,size:`sm`,children:`Оплачен и выдан`});default:return(0,Y.jsx)(i,{variant:`neutral`,size:`sm`,children:`Черновик / Заезд`})}};return(0,Y.jsxs)(`div`,{className:`space-y-4 animate-fade-in`,children:[(0,Y.jsxs)(`div`,{className:`flex items-center justify-between bg-krona-surface p-3.5 rounded-xl border border-krona-border shadow-krona-soft`,children:[(0,Y.jsxs)(`div`,{children:[(0,Y.jsx)(`h2`,{className:`text-sm font-bold text-krona-primary`,children:`Заказ-наряды автокомплекса и постов`}),(0,Y.jsx)(`p`,{className:`text-xs text-krona-secondary`,children:`Учет автомобилей, выполненных работ, списанных запчастей и нормо-часов`})]}),(0,Y.jsxs)(n,{variant:`primary`,size:`sm`,onClick:()=>r(!0),children:[(0,Y.jsx)(x,{className:`w-3.5 h-3.5 mr-1.5`}),`Новый заказ-наряд`]})]}),(0,Y.jsx)(`div`,{className:`grid grid-cols-1 md:grid-cols-2 gap-4`,children:e.map(e=>{let r=e.partsAmount+e.laborAmount;return(0,Y.jsxs)(`div`,{onClick:()=>o(e),className:`p-4 rounded-xl border border-krona-border bg-krona-surface hover:border-krona-border-strong shadow-krona-soft cursor-pointer transition-all space-y-3`,children:[(0,Y.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,Y.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,Y.jsx)(`div`,{className:`p-2 rounded-lg bg-krona-workspace text-krona-info border border-krona-border`,children:(0,Y.jsx)(v,{className:`w-4 h-4`})}),(0,Y.jsxs)(`div`,{children:[(0,Y.jsx)(`h4`,{className:`text-sm font-bold text-krona-primary`,children:e.vehicle}),(0,Y.jsxs)(`span`,{className:`text-xs text-krona-secondary font-mono`,children:[e.id,` • `,e.bay]})]})]}),s(e.status)]}),(0,Y.jsxs)(`div`,{className:`grid grid-cols-2 gap-2 text-xs py-1`,children:[(0,Y.jsxs)(`div`,{children:[(0,Y.jsx)(`span`,{className:`text-krona-secondary block text-[11px]`,children:`Владелец:`}),(0,Y.jsx)(`span`,{className:`font-medium text-krona-primary`,children:e.ownerName})]}),(0,Y.jsxs)(`div`,{children:[(0,Y.jsx)(`span`,{className:`text-krona-secondary block text-[11px]`,children:`Мастер поста:`}),(0,Y.jsx)(`span`,{className:`font-medium text-krona-primary`,children:e.masterName})]})]}),(0,Y.jsxs)(`div`,{className:`p-2.5 rounded-lg bg-krona-workspace text-xs space-y-1`,children:[(0,Y.jsx)(`span`,{className:`text-[11px] font-semibold text-krona-secondary uppercase`,children:`Работы и услуги:`}),(0,Y.jsx)(`ul`,{className:`list-disc list-inside space-y-0.5 text-krona-primary`,children:e.services.map((e,t)=>(0,Y.jsx)(`li`,{className:`truncate`,children:e},t))})]}),(0,Y.jsxs)(`div`,{className:`pt-2 border-t border-krona-border/60 flex items-center justify-between text-xs`,children:[(0,Y.jsxs)(`div`,{children:[(0,Y.jsx)(`span`,{className:`text-krona-secondary block text-[10px]`,children:`Итоговая стоимость:`}),(0,Y.jsx)(`span`,{className:`text-sm font-bold text-krona-green`,children:N(r)})]}),(0,Y.jsxs)(`div`,{className:`flex gap-2`,children:[e.status===`in_progress`&&(0,Y.jsx)(n,{variant:`primary`,size:`sm`,onClick:n=>{n.stopPropagation(),t(e.id,`ready`)},children:`Готово`}),e.status===`ready`&&(0,Y.jsx)(n,{variant:`gold`,size:`sm`,onClick:n=>{n.stopPropagation(),t(e.id,`paid`)},children:`Принять оплату`})]})]})]},e.id)})}),a&&(0,Y.jsx)(k,{isOpen:!!a,onClose:()=>o(null),title:`Заказ-наряд ${a.id}`,subtitle:`${a.vehicle} • ${a.bay}`,maxWidth:`md`,footer:(0,Y.jsx)(n,{variant:`secondary`,onClick:()=>o(null),children:`Закрыть`}),children:(0,Y.jsxs)(`div`,{className:`space-y-4 text-xs`,children:[(0,Y.jsxs)(`div`,{className:`grid grid-cols-2 gap-3 p-3 rounded-lg bg-krona-workspace`,children:[(0,Y.jsxs)(`div`,{children:[(0,Y.jsx)(`span`,{className:`text-krona-secondary block`,children:`Владелец:`}),(0,Y.jsx)(`span`,{className:`font-semibold text-krona-primary`,children:a.ownerName}),(0,Y.jsx)(`span`,{className:`text-krona-secondary block text-[11px]`,children:a.phone})]}),(0,Y.jsxs)(`div`,{children:[(0,Y.jsx)(`span`,{className:`text-krona-secondary block`,children:`Ответственный специалист:`}),(0,Y.jsx)(`span`,{className:`font-semibold text-krona-primary`,children:a.masterName}),(0,Y.jsx)(`span`,{className:`text-krona-secondary block text-[11px]`,children:a.bay})]})]}),(0,Y.jsxs)(`div`,{children:[(0,Y.jsx)(`span`,{className:`font-semibold text-krona-primary block mb-1`,children:`Калькуляция:`}),(0,Y.jsxs)(`div`,{className:`p-3 border border-krona-border rounded-lg space-y-1.5`,children:[(0,Y.jsxs)(`div`,{className:`flex justify-between`,children:[(0,Y.jsx)(`span`,{className:`text-krona-secondary`,children:`Работы мастера:`}),(0,Y.jsx)(`span`,{className:`font-medium`,children:N(a.laborAmount)})]}),(0,Y.jsxs)(`div`,{className:`flex justify-between`,children:[(0,Y.jsx)(`span`,{className:`text-krona-secondary`,children:`Материалы и запчасти:`}),(0,Y.jsx)(`span`,{className:`font-medium`,children:N(a.partsAmount)})]}),(0,Y.jsxs)(`div`,{className:`flex justify-between pt-1 border-t border-krona-border font-bold text-sm`,children:[(0,Y.jsx)(`span`,{children:`ИТОГО К ОПЛАТЕ:`}),(0,Y.jsx)(`span`,{className:`text-krona-green`,children:N(a.laborAmount+a.partsAmount)})]})]})]})]})})]})},fe=()=>{let{bookings:e,updateBookingStatus:t,setIsQuickActionsOpen:r,getActiveProfile:a}=w(),o=a(),s=e=>{switch(e){case`confirmed`:return(0,Y.jsx)(i,{variant:`gold`,size:`sm`,children:`Подтверждена`});case`seated`:return(0,Y.jsx)(i,{variant:`green`,size:`sm`,children:`Гость пришел / Заезд`});case`completed`:return(0,Y.jsx)(i,{variant:`neutral`,size:`sm`,children:`Завершено`});case`cancelled`:return(0,Y.jsx)(i,{variant:`danger`,size:`sm`,children:`Отменена / No-Show`})}};return(0,Y.jsxs)(`div`,{className:`space-y-4 animate-fade-in`,children:[(0,Y.jsxs)(`div`,{className:`flex items-center justify-between bg-krona-surface p-3.5 rounded-xl border border-krona-border shadow-krona-soft`,children:[(0,Y.jsxs)(`div`,{children:[(0,Y.jsxs)(`h2`,{className:`text-sm font-bold text-krona-primary`,children:[`Журнал бронирования & Запись ресурсов (`,o.terminology.bookingResourceLabel,`)`]}),(0,Y.jsx)(`p`,{className:`text-xs text-krona-secondary`,children:`Сетка временных слотов, подтверждение депозитов и контроль неявок (no-show)`})]}),(0,Y.jsxs)(n,{variant:`primary`,size:`sm`,onClick:()=>r(!0),children:[(0,Y.jsx)(x,{className:`w-3.5 h-3.5 mr-1.5`}),`Записать клиента`]})]}),(0,Y.jsx)(`div`,{className:`grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-3.5`,children:e.map(e=>(0,Y.jsxs)(`div`,{className:`p-4 rounded-xl border border-krona-border bg-krona-surface shadow-krona-soft flex flex-col justify-between space-y-3`,children:[(0,Y.jsxs)(`div`,{children:[(0,Y.jsxs)(`div`,{className:`flex items-center justify-between pb-2 border-b border-krona-border/60`,children:[(0,Y.jsxs)(`div`,{className:`flex items-center gap-1.5 font-bold text-sm text-krona-primary`,children:[(0,Y.jsx)(m,{className:`w-4 h-4 text-krona-gold`}),(0,Y.jsx)(`span`,{children:e.time})]}),s(e.status)]}),(0,Y.jsxs)(`div`,{className:`py-2 space-y-1.5 text-xs`,children:[(0,Y.jsxs)(`div`,{children:[(0,Y.jsxs)(`span`,{className:`text-[10px] text-krona-secondary uppercase font-semibold`,children:[o.terminology.bookingResourceLabel,`:`]}),(0,Y.jsx)(`div`,{className:`font-semibold text-krona-primary`,children:e.resourceName})]}),(0,Y.jsxs)(`div`,{children:[(0,Y.jsx)(`span`,{className:`text-[10px] text-krona-secondary uppercase font-semibold`,children:`Клиент:`}),(0,Y.jsx)(`div`,{className:`text-krona-primary font-medium`,children:e.clientName}),(0,Y.jsx)(`div`,{className:`text-[11px] text-krona-secondary font-mono`,children:e.clientPhone}),e.guestsOrCar&&(0,Y.jsx)(`div`,{className:`text-[11px] text-krona-secondary italic mt-0.5`,children:e.guestsOrCar})]}),e.deposit>0&&(0,Y.jsxs)(`div`,{className:`flex justify-between pt-1 border-t border-krona-border/40 text-[11px]`,children:[(0,Y.jsx)(`span`,{className:`text-krona-secondary`,children:`Внесен депозит:`}),(0,Y.jsx)(`span`,{className:`font-semibold text-krona-green`,children:N(e.deposit)})]})]})]}),(0,Y.jsxs)(`div`,{className:`pt-2 border-t border-krona-border/60 flex items-center justify-end gap-2`,children:[e.status===`confirmed`&&(0,Y.jsxs)(Y.Fragment,{children:[(0,Y.jsx)(n,{variant:`outline`,size:`sm`,className:`text-xs`,onClick:()=>t(e.id,`cancelled`),children:`No-Show`}),(0,Y.jsx)(n,{variant:`primary`,size:`sm`,className:`text-xs`,onClick:()=>t(e.id,`seated`),children:`Прибыл`})]}),e.status===`seated`&&(0,Y.jsx)(n,{variant:`secondary`,size:`sm`,className:`w-full text-xs`,onClick:()=>t(e.id,`completed`),children:`Завершить визит`})]})]},e.id))})]})},pe=({initialMobile:e=!1})=>{let{deliveries:t,updateDeliveryStatus:r}=w(),[a,o]=(0,J.useState)(e),s=e=>{switch(e){case`in_transit`:return(0,Y.jsx)(i,{variant:`info`,size:`sm`,children:`Курьер в пути`});case`delivered`:return(0,Y.jsx)(i,{variant:`green`,size:`sm`,children:`Доставлен`});default:return(0,Y.jsx)(i,{variant:`warning`,size:`sm`,children:`Ожидает курьера`})}};return(0,Y.jsxs)(`div`,{className:`space-y-4 animate-fade-in`,children:[(0,Y.jsxs)(`div`,{className:`flex items-center justify-between bg-krona-surface p-3.5 rounded-xl border border-krona-border shadow-krona-soft`,children:[(0,Y.jsxs)(`div`,{children:[(0,Y.jsx)(`h2`,{className:`text-sm font-bold text-krona-primary`,children:`Управление доставкой & Мониторинг курьеров`}),(0,Y.jsx)(`p`,{className:`text-xs text-krona-secondary`,children:`Логистический контур: распределение заказов, расчет времени прибытия (ETA) и контроль налички`})]}),(0,Y.jsxs)(n,{variant:a?`gold`:`secondary`,size:`sm`,onClick:()=>o(!a),children:[(0,Y.jsx)(T,{className:`w-3.5 h-3.5 mr-1.5`}),a?`Обычный диспетчерский вид`:`Экран курьера (Mobile View)`]})]}),a?(0,Y.jsxs)(`div`,{className:`max-w-md mx-auto bg-krona-surface border-2 border-krona-gold/60 rounded-2xl p-4 shadow-xl space-y-4`,children:[(0,Y.jsxs)(`div`,{className:`flex items-center justify-between pb-3 border-b border-krona-border`,children:[(0,Y.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,Y.jsx)(`div`,{className:`w-8 h-8 rounded-full bg-krona-gold/20 flex items-center justify-center text-krona-gold`,children:(0,Y.jsx)(u,{className:`w-4 h-4`})}),(0,Y.jsxs)(`div`,{children:[(0,Y.jsx)(`h4`,{className:`text-xs font-bold text-krona-primary`,children:`Алексей Смирнов (Авто)`}),(0,Y.jsx)(`span`,{className:`text-[10px] text-krona-secondary`,children:`Смена активна • Наличные: 24 500 ₽`})]})]}),(0,Y.jsx)(i,{variant:`green`,size:`sm`,children:`Онлайн`})]}),(0,Y.jsxs)(`div`,{className:`space-y-3`,children:[(0,Y.jsxs)(`span`,{className:`text-xs font-semibold uppercase tracking-wider text-krona-secondary block`,children:[`Мои текущие доставки (`,t.filter(e=>e.status!==`delivered`).length,`)`]}),t.map(e=>(0,Y.jsxs)(`div`,{className:`p-3.5 rounded-xl border border-krona-border bg-krona-workspace space-y-2.5`,children:[(0,Y.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,Y.jsx)(`span`,{className:`font-bold text-xs text-krona-primary`,children:e.orderId}),s(e.status)]}),(0,Y.jsxs)(`div`,{className:`space-y-1 text-xs`,children:[(0,Y.jsxs)(`div`,{className:`flex items-start gap-1.5 text-krona-primary font-medium`,children:[(0,Y.jsx)(p,{className:`w-3.5 h-3.5 text-krona-danger shrink-0 mt-0.5`}),(0,Y.jsx)(`span`,{children:e.address})]}),(0,Y.jsxs)(`div`,{className:`flex items-center justify-between pt-1 text-[11px] text-krona-secondary`,children:[(0,Y.jsx)(`span`,{children:e.recipientName}),(0,Y.jsxs)(`a`,{href:`tel:${e.phone}`,className:`text-krona-green font-semibold flex items-center gap-1`,children:[(0,Y.jsx)(l,{className:`w-3 h-3`}),e.phone]})]}),(0,Y.jsxs)(`div`,{className:`flex items-center justify-between pt-1 border-t border-krona-border/60`,children:[(0,Y.jsx)(`span`,{className:`text-krona-secondary`,children:`К оплате:`}),(0,Y.jsxs)(`span`,{className:`font-bold text-krona-primary`,children:[N(e.amount),` (`,e.paymentMethod,`)`]})]})]}),(0,Y.jsxs)(`div`,{className:`pt-2 flex gap-2`,children:[e.status===`pending`&&(0,Y.jsx)(n,{variant:`primary`,size:`sm`,className:`w-full text-xs`,onClick:()=>r(e.id,`in_transit`),children:`Заказ забрал, еду к клиенту`}),e.status===`in_transit`&&(0,Y.jsxs)(n,{variant:`gold`,size:`sm`,className:`w-full text-xs`,onClick:()=>r(e.id,`delivered`),children:[(0,Y.jsx)(_,{className:`w-3.5 h-3.5 mr-1`}),`Заказ вручен и оплачен`]})]})]},e.id))]})]}):(0,Y.jsx)(`div`,{className:`grid grid-cols-1 md:grid-cols-3 gap-4`,children:t.map(e=>(0,Y.jsxs)(`div`,{className:`p-4 rounded-xl border border-krona-border bg-krona-surface shadow-krona-soft space-y-3`,children:[(0,Y.jsxs)(`div`,{className:`flex items-center justify-between pb-2 border-b border-krona-border/60`,children:[(0,Y.jsx)(`span`,{className:`font-bold text-sm text-krona-primary`,children:e.orderId}),s(e.status)]}),(0,Y.jsxs)(`div`,{className:`space-y-1.5 text-xs`,children:[(0,Y.jsxs)(`div`,{className:`flex items-start gap-1.5`,children:[(0,Y.jsx)(p,{className:`w-3.5 h-3.5 text-krona-danger shrink-0 mt-0.5`}),(0,Y.jsx)(`span`,{className:`text-krona-primary font-medium leading-tight`,children:e.address})]}),(0,Y.jsxs)(`div`,{className:`pt-1 text-krona-secondary`,children:[(0,Y.jsxs)(`div`,{children:[`Получатель: `,(0,Y.jsx)(`strong`,{className:`text-krona-primary`,children:e.recipientName})]}),(0,Y.jsxs)(`div`,{children:[`Телефон: `,(0,Y.jsx)(`span`,{className:`font-mono`,children:e.phone})]}),(0,Y.jsxs)(`div`,{children:[`Курьер: `,(0,Y.jsx)(`strong`,{className:`text-krona-primary`,children:e.courierName})]})]}),(0,Y.jsxs)(`div`,{className:`flex justify-between pt-1 border-t border-krona-border/40 font-bold`,children:[(0,Y.jsx)(`span`,{children:`Сумма:`}),(0,Y.jsx)(`span`,{className:`text-krona-green`,children:N(e.amount)})]})]}),(0,Y.jsxs)(`div`,{className:`pt-2 border-t border-krona-border/60 flex justify-end gap-2`,children:[e.status===`pending`&&(0,Y.jsx)(n,{variant:`primary`,size:`sm`,className:`w-full text-xs`,onClick:()=>r(e.id,`in_transit`),children:`Передать курьеру`}),e.status===`in_transit`&&(0,Y.jsx)(n,{variant:`secondary`,size:`sm`,className:`w-full text-xs`,onClick:()=>r(e.id,`delivered`),children:`Отметить вручение`}),e.status===`delivered`&&(0,Y.jsx)(`div`,{className:`w-full text-center text-xs text-krona-green font-semibold py-1`,children:`✓ Успешно доставлен`})]})]},e.id))})]})},me=()=>{let[e]=(0,J.useState)(P),[t,r]=(0,J.useState)(null);return(0,Y.jsxs)(`div`,{className:`space-y-4 animate-fade-in`,children:[(0,Y.jsxs)(`div`,{className:`flex items-center justify-between bg-krona-surface p-3.5 rounded-xl border border-krona-border shadow-krona-soft`,children:[(0,Y.jsxs)(`div`,{children:[(0,Y.jsx)(`h2`,{className:`text-sm font-bold text-krona-primary`,children:`Технологические карты & Калькуляция (BOM)`}),(0,Y.jsx)(`p`,{className:`text-xs text-krona-secondary`,children:`Нормы расхода сырья, расчет food cost %, плановая себестоимость и маржинальность`})]}),(0,Y.jsxs)(n,{variant:`primary`,size:`sm`,onClick:()=>r(e[0]),children:[(0,Y.jsx)(z,{className:`w-3.5 h-3.5 mr-1.5`}),`Посмотреть калькуляцию`]})]}),(0,Y.jsx)(`div`,{className:`grid grid-cols-1 md:grid-cols-2 gap-4`,children:e.map(e=>(0,Y.jsxs)(`div`,{onClick:()=>r(e),className:`p-4 rounded-xl border border-krona-border bg-krona-surface hover:border-krona-border-strong shadow-krona-soft cursor-pointer transition-all space-y-3`,children:[(0,Y.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,Y.jsxs)(`div`,{children:[(0,Y.jsx)(`h4`,{className:`text-sm font-bold text-krona-primary`,children:e.name}),(0,Y.jsxs)(`span`,{className:`text-xs text-krona-secondary`,children:[`Выход: `,e.yieldWeight,` • `,e.category]})]}),(0,Y.jsxs)(i,{variant:`green`,size:`sm`,children:[`Food Cost: `,e.foodCostPercent,`%`]})]}),(0,Y.jsxs)(`div`,{className:`grid grid-cols-3 gap-2 p-2.5 rounded-lg bg-krona-workspace text-xs`,children:[(0,Y.jsxs)(`div`,{children:[(0,Y.jsx)(`span`,{className:`text-krona-secondary block text-[10px]`,children:`Себестоимость:`}),(0,Y.jsx)(`span`,{className:`font-bold text-krona-primary`,children:N(e.primeCost)})]}),(0,Y.jsxs)(`div`,{children:[(0,Y.jsx)(`span`,{className:`text-krona-secondary block text-[10px]`,children:`Цена продажи:`}),(0,Y.jsx)(`span`,{className:`font-bold text-krona-green`,children:N(e.sellingPrice)})]}),(0,Y.jsxs)(`div`,{children:[(0,Y.jsx)(`span`,{className:`text-krona-secondary block text-[10px]`,children:`Маржа (руб):`}),(0,Y.jsx)(`span`,{className:`font-bold text-krona-gold`,children:N(e.marginRub)})]})]}),(0,Y.jsxs)(`div`,{className:`text-xs text-krona-secondary`,children:[(0,Y.jsxs)(`span`,{className:`font-medium text-krona-primary`,children:[`Ингредиенты (`,e.ingredients.length,`): `]}),e.ingredients.map(e=>e.name).join(`, `)]})]},e.id))}),t&&(0,Y.jsx)(k,{isOpen:!!t,onClose:()=>r(null),title:`Техкарта: ${t.name}`,subtitle:`Выход готового блюда: ${t.yieldWeight}`,maxWidth:`lg`,footer:(0,Y.jsx)(n,{variant:`secondary`,onClick:()=>r(null),children:`Закрыть`}),children:(0,Y.jsxs)(`div`,{className:`space-y-4 text-xs`,children:[(0,Y.jsxs)(`div`,{className:`grid grid-cols-4 gap-2 p-3 bg-krona-workspace rounded-lg text-center`,children:[(0,Y.jsxs)(`div`,{children:[(0,Y.jsx)(`span`,{className:`text-krona-secondary block text-[10px]`,children:`Цена в меню:`}),(0,Y.jsx)(`span`,{className:`font-bold text-sm text-krona-primary`,children:N(t.sellingPrice)})]}),(0,Y.jsxs)(`div`,{children:[(0,Y.jsx)(`span`,{className:`text-krona-secondary block text-[10px]`,children:`Себестоимость:`}),(0,Y.jsx)(`span`,{className:`font-bold text-sm text-krona-danger`,children:N(t.primeCost)})]}),(0,Y.jsxs)(`div`,{children:[(0,Y.jsx)(`span`,{className:`text-krona-secondary block text-[10px]`,children:`Food Cost %:`}),(0,Y.jsxs)(`span`,{className:`font-bold text-sm text-krona-green`,children:[t.foodCostPercent,`%`]})]}),(0,Y.jsxs)(`div`,{children:[(0,Y.jsx)(`span`,{className:`text-krona-secondary block text-[10px]`,children:`Маржинальный доход:`}),(0,Y.jsx)(`span`,{className:`font-bold text-sm text-krona-gold`,children:N(t.marginRub)})]})]}),(0,Y.jsxs)(`div`,{children:[(0,Y.jsx)(`h5`,{className:`font-semibold text-krona-primary mb-2`,children:`Расход сырья и калькуляция:`}),(0,Y.jsxs)(`table`,{className:`w-full text-left border-collapse`,children:[(0,Y.jsx)(`thead`,{children:(0,Y.jsxs)(`tr`,{className:`border-b border-krona-border text-krona-secondary text-[11px]`,children:[(0,Y.jsx)(`th`,{className:`pb-1.5 font-medium`,children:`Ингредиент`}),(0,Y.jsx)(`th`,{className:`pb-1.5 font-medium`,children:`Брутто`}),(0,Y.jsx)(`th`,{className:`pb-1.5 font-medium`,children:`Нетто`}),(0,Y.jsx)(`th`,{className:`pb-1.5 font-medium text-right`,children:`Стоимость`})]})}),(0,Y.jsx)(`tbody`,{className:`divide-y divide-krona-border/40`,children:t.ingredients.map((e,t)=>(0,Y.jsxs)(`tr`,{className:`py-1.5`,children:[(0,Y.jsx)(`td`,{className:`py-1.5 font-medium text-krona-primary`,children:e.name}),(0,Y.jsx)(`td`,{className:`py-1.5 text-krona-secondary`,children:e.gross}),(0,Y.jsx)(`td`,{className:`py-1.5 text-krona-secondary`,children:e.net}),(0,Y.jsx)(`td`,{className:`py-1.5 font-semibold text-right text-krona-primary`,children:N(e.cost)})]},t))})]})]})]})})]})},Q=[{id:`sup-1`,name:`СибРыбТорг`,category:`Рыба и морепродукты`,phone:`+7 (383) 310-20-40`,contactPerson:`Олег Васильев`,debt:48500,deliveryDays:`Пн, Ср, Пт (до 11:00)`},{id:`sup-2`,name:`Хорека Логистик`,category:`Сыры, молочная продукция`,phone:`+7 (383) 220-11-88`,contactPerson:`Елена Белова`,debt:12400,deliveryDays:`Вторник, Четверг`},{id:`sup-3`,name:`Восточный Экспресс`,category:`Рис, соусы, водоросли, специи`,phone:`+7 (383) 299-44-33`,contactPerson:`Алексей Чэнь`,debt:0,deliveryDays:`По заявке (1 день)`},{id:`sup-4`,name:`ЭкоУпаковка Сибирь`,category:`Контейнеры, пакеты, палочки`,phone:`+7 (383) 345-67-89`,contactPerson:`Мария Семенова`,debt:3200,deliveryDays:`Среда`}],he=[{id:`PO-901`,supplierName:`СибРыбТорг`,date:`10.09.2026`,itemsCount:3,totalAmount:48500,status:`in_transit`,deliveryEta:`Сегодня к 15:30`},{id:`PO-900`,supplierName:`Хорека Логистик`,date:`09.09.2026`,itemsCount:2,totalAmount:23600,status:`received`,deliveryEta:`Получен 09.09`},{id:`PO-899`,supplierName:`Восточный Экспресс`,date:`08.09.2026`,itemsCount:5,totalAmount:38400,status:`received`,deliveryEta:`Получен 08.09`},{id:`PO-902`,supplierName:`ЭкоУпаковка Сибирь`,date:`10.09.2026`,itemsCount:4,totalAmount:14200,status:`sent`,deliveryEta:`Завтра к 12:00`}],$=()=>{let[e]=(0,J.useState)(Q),[t,r]=(0,J.useState)(he),[a,o]=(0,J.useState)(`orders`),[l,d]=(0,J.useState)(!1),[f,p]=(0,J.useState)(Q[0].name),[m,h]=(0,J.useState)(`25000`),[g,_]=(0,J.useState)(`3`),[v,y]=(0,J.useState)(`Завтра к 11:00`),b=e.reduce((e,t)=>e+t.debt,0),S=e=>{e.preventDefault();let n={id:`PO-${Math.floor(903+Math.random()*90)}`,supplierName:f,date:new Date().toLocaleDateString(`ru-RU`),itemsCount:Number(g)||1,totalAmount:Number(m)||0,status:`sent`,deliveryEta:v};r([n,...t]),d(!1)},ee=e=>{switch(e){case`received`:return(0,Y.jsx)(i,{variant:`green`,size:`sm`,children:`Принят на склад`});case`in_transit`:return(0,Y.jsx)(i,{variant:`info`,size:`sm`,children:`В пути / Доставка`});case`sent`:return(0,Y.jsx)(i,{variant:`gold`,size:`sm`,children:`Отправлен поставщику`});default:return(0,Y.jsx)(i,{variant:`neutral`,size:`sm`,children:`Черновик`})}};return(0,Y.jsxs)(`div`,{className:`space-y-4 animate-fade-in`,children:[(0,Y.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,Y.jsxs)(`div`,{children:[(0,Y.jsx)(`h2`,{className:`text-sm font-bold text-krona-primary`,children:`Закупки, заказы поставщикам и приходные накладные`}),(0,Y.jsx)(`p`,{className:`text-xs text-krona-secondary`,children:`Управление контрагентами, графиками поставок сырья и расчетами`})]}),(0,Y.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,Y.jsxs)(`div`,{className:`flex items-center bg-krona-workspace p-1 rounded-lg border border-krona-border text-xs`,children:[(0,Y.jsxs)(`button`,{onClick:()=>o(`orders`),className:`px-3 py-1 rounded font-medium transition-colors ${a===`orders`?`bg-[#2F684C] text-white shadow-sm`:`text-krona-secondary`}`,children:[`Заказы (`,t.length,`)`]}),(0,Y.jsxs)(`button`,{onClick:()=>o(`suppliers`),className:`px-3 py-1 rounded font-medium transition-colors ${a===`suppliers`?`bg-[#2F684C] text-white shadow-sm`:`text-krona-secondary`}`,children:[`Поставщики (`,e.length,`)`]})]}),(0,Y.jsxs)(n,{variant:`primary`,size:`sm`,onClick:()=>d(!0),children:[(0,Y.jsx)(x,{className:`w-3.5 h-3.5 mr-1`}),`Новый заказ поставщику`]})]})]}),(0,Y.jsxs)(`div`,{className:`grid grid-cols-1 sm:grid-cols-3 gap-3.5`,children:[(0,Y.jsx)(E,{title:`Задолженность перед поставщиками`,value:N(b),change:{value:`-12%`,trend:`neutral`},subtitle:`Срок оплаты: до 15.09`,icon:(0,Y.jsx)(c,{className:`w-4 h-4 text-krona-gold`})}),(0,Y.jsx)(E,{title:`Заказов в пути`,value:`${t.filter(e=>e.status===`in_transit`).length} поставки`,subtitle:`Ожидаются сегодня`,icon:(0,Y.jsx)(u,{className:`w-4 h-4 text-krona-info`})}),(0,Y.jsx)(E,{title:`Активных поставщиков`,value:`${e.length} контрагента`,subtitle:`Регулярные поставки сырья`,icon:(0,Y.jsx)(s,{className:`w-4 h-4 text-krona-green`})})]}),a===`orders`?(0,Y.jsxs)(`div`,{className:`bg-krona-surface border border-krona-border rounded-xl shadow-krona-soft overflow-hidden p-4 space-y-3`,children:[(0,Y.jsx)(`h4`,{className:`text-xs font-bold text-krona-primary uppercase tracking-wider`,children:`Журнал заказов поставщикам`}),(0,Y.jsx)(`div`,{className:`overflow-x-auto`,children:(0,Y.jsxs)(`table`,{className:`w-full text-left text-xs border-collapse`,children:[(0,Y.jsx)(`thead`,{className:`bg-krona-workspace/80 text-krona-secondary border-b border-krona-border`,children:(0,Y.jsxs)(`tr`,{children:[(0,Y.jsx)(`th`,{className:`p-3 font-semibold`,children:`Номер заказа`}),(0,Y.jsx)(`th`,{className:`p-3 font-semibold`,children:`Поставщик`}),(0,Y.jsx)(`th`,{className:`p-3 font-semibold`,children:`Дата`}),(0,Y.jsx)(`th`,{className:`p-3 font-semibold`,children:`Позиций сырья`}),(0,Y.jsx)(`th`,{className:`p-3 font-semibold`,children:`Сумма заказа`}),(0,Y.jsx)(`th`,{className:`p-3 font-semibold`,children:`Ожидаемая поставка`}),(0,Y.jsx)(`th`,{className:`p-3 font-semibold`,children:`Статус`})]})}),(0,Y.jsx)(`tbody`,{className:`divide-y divide-krona-border/50`,children:t.map(e=>(0,Y.jsxs)(`tr`,{className:`hover:bg-krona-workspace/50 transition-colors`,children:[(0,Y.jsx)(`td`,{className:`p-3 font-mono font-bold text-krona-primary`,children:e.id}),(0,Y.jsx)(`td`,{className:`p-3 font-medium text-krona-primary`,children:e.supplierName}),(0,Y.jsx)(`td`,{className:`p-3 text-krona-secondary`,children:e.date}),(0,Y.jsxs)(`td`,{className:`p-3 text-krona-secondary`,children:[e.itemsCount,` наим.`]}),(0,Y.jsx)(`td`,{className:`p-3 font-bold text-krona-primary`,children:N(e.totalAmount)}),(0,Y.jsx)(`td`,{className:`p-3 text-krona-secondary`,children:e.deliveryEta}),(0,Y.jsx)(`td`,{className:`p-3`,children:ee(e.status)})]},e.id))})]})})]}):(0,Y.jsx)(`div`,{className:`grid grid-cols-1 md:grid-cols-2 gap-4`,children:e.map(e=>(0,Y.jsxs)(`div`,{className:`p-4 rounded-xl border border-krona-border bg-krona-surface shadow-krona-soft space-y-3`,children:[(0,Y.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,Y.jsxs)(`div`,{children:[(0,Y.jsx)(`h4`,{className:`text-sm font-bold text-krona-primary`,children:e.name}),(0,Y.jsx)(`span`,{className:`text-xs text-krona-secondary`,children:e.category})]}),e.debt>0?(0,Y.jsxs)(i,{variant:`warning`,size:`sm`,children:[`Долг: `,N(e.debt)]}):(0,Y.jsx)(i,{variant:`green`,size:`sm`,children:`Сверено (0 ₽)`})]}),(0,Y.jsxs)(`div`,{className:`space-y-1 text-xs text-krona-secondary pt-1 border-t border-krona-border/40`,children:[(0,Y.jsxs)(`div`,{className:`flex justify-between`,children:[(0,Y.jsx)(`span`,{children:`Контактное лицо:`}),(0,Y.jsx)(`span`,{className:`font-medium text-krona-primary`,children:e.contactPerson})]}),(0,Y.jsxs)(`div`,{className:`flex justify-between`,children:[(0,Y.jsx)(`span`,{children:`Телефон:`}),(0,Y.jsx)(`span`,{className:`font-mono text-krona-primary`,children:e.phone})]}),(0,Y.jsxs)(`div`,{className:`flex justify-between`,children:[(0,Y.jsx)(`span`,{children:`Дни доставки:`}),(0,Y.jsx)(`span`,{className:`text-krona-primary`,children:e.deliveryDays})]})]})]},e.id))}),l&&(0,Y.jsx)(k,{isOpen:l,onClose:()=>d(!1),title:`Новый заказ поставщику`,subtitle:`Формирование заявки на поставку сырья и материалов`,maxWidth:`sm`,children:(0,Y.jsxs)(`form`,{onSubmit:S,className:`space-y-3 text-xs`,children:[(0,Y.jsxs)(`div`,{className:`flex flex-col gap-1.5 text-left`,children:[(0,Y.jsx)(`label`,{className:`text-xs font-medium text-krona-secondary`,children:`Поставщик`}),(0,Y.jsx)(`select`,{value:f,onChange:e=>p(e.target.value),className:`w-full bg-krona-surface border border-krona-border rounded-md px-3 py-2 text-xs text-krona-primary`,children:e.map(e=>(0,Y.jsxs)(`option`,{value:e.name,children:[e.name,` (`,e.category,`)`]},e.id))})]}),(0,Y.jsx)(C,{label:`Количество позиций в заявке`,type:`number`,value:g,onChange:e=>_(e.target.value),required:!0}),(0,Y.jsx)(C,{label:`Плановая сумма заказа (₽)`,type:`number`,value:m,onChange:e=>h(e.target.value),required:!0}),(0,Y.jsx)(C,{label:`Желаемый срок доставки`,value:v,onChange:e=>y(e.target.value),placeholder:`Завтра к 10:00`,required:!0}),(0,Y.jsxs)(`div`,{className:`pt-2 flex justify-end gap-2`,children:[(0,Y.jsx)(n,{type:`button`,variant:`secondary`,onClick:()=>d(!1),children:`Отмена`}),(0,Y.jsx)(n,{type:`submit`,variant:`primary`,children:`Отправить заказ`})]})]})})]})},ge=[{id:`b1`,name:`Пост 1 (Мойка + Детейлинг)`,type:`Моечный пост`,status:`busy`,vehicleOrMaster:`BMW X5 (А001АА 154)`,orderNumber:`WO-880`,timeRemaining:`12 мин`,workOrderType:`Комплекс Люкс`},{id:`b2`,name:`Пост 2 (Подъёмник гидравлический)`,type:`Слесарный пост`,status:`busy`,vehicleOrMaster:`Toyota Land Cruiser (Р777УУ 154)`,orderNumber:`WO-881`,timeRemaining:`25 мин`,workOrderType:`Замена масла + колодки`},{id:`b3`,name:`Пост 3 (Подъёмник 4-стоечный / Сход-развал)`,type:`Сход-развал`,status:`free`},{id:`b4`,name:`Пост 4 (Детейлинг бокс / Керамика)`,type:`Детейлинг`,status:`busy`,vehicleOrMaster:`Porsche Cayenne (В500ВВ 154)`,orderNumber:`WO-882`,timeRemaining:`45 мин`,workOrderType:`Керамика кузова`},{id:`b5`,name:`Пост 5 (Быстрая мойка кузова)`,type:`Моечный пост`,status:`free`},{id:`b6`,name:`Пост 6 (Шиномонтаж / Балансировка)`,type:`Шиномонтаж`,status:`free`}],_e=()=>{let{getActiveProfile:e,setIsQuickActionsOpen:t}=w(),r=e(),a=D();return(0,Y.jsxs)(`div`,{className:`space-y-4 animate-fade-in`,children:[(0,Y.jsxs)(`div`,{className:`flex items-center justify-between bg-krona-surface p-3.5 rounded-xl border border-krona-border shadow-krona-soft`,children:[(0,Y.jsxs)(`div`,{children:[(0,Y.jsxs)(`h2`,{className:`text-sm font-bold text-krona-primary`,children:[`Посты, подъемники и рабочие зоны (`,r.terminology.bookingResourceLabel,`)`]}),(0,Y.jsx)(`p`,{className:`text-xs text-krona-secondary`,children:`Мониторинг загрузки постов, времени обслуживания и закрепленных заказ-нарядов`})]}),(0,Y.jsxs)(n,{variant:`primary`,size:`sm`,onClick:()=>t(!0),children:[(0,Y.jsx)(x,{className:`w-3.5 h-3.5 mr-1`}),`Заезд на пост`]})]}),(0,Y.jsx)(`div`,{className:`grid grid-cols-1 md:grid-cols-3 gap-4`,children:ge.map(e=>{let r=e.status===`busy`;return(0,Y.jsxs)(`div`,{className:`p-4 rounded-xl border shadow-krona-soft flex flex-col justify-between space-y-3 transition-all ${r?`border-krona-gold/60 bg-krona-surface`:`border-krona-border bg-krona-surface/60 opacity-90`}`,children:[(0,Y.jsxs)(`div`,{children:[(0,Y.jsxs)(`div`,{className:`flex items-center justify-between mb-2`,children:[(0,Y.jsx)(`span`,{className:`font-bold text-xs text-krona-primary`,children:e.name}),(0,Y.jsx)(i,{variant:r?`gold`:`green`,size:`sm`,children:r?`Занят`:`Свободен`})]}),(0,Y.jsx)(`div`,{className:`text-[11px] text-krona-secondary mb-2`,children:e.type}),r?(0,Y.jsxs)(`div`,{className:`p-3 rounded-lg bg-krona-workspace space-y-1.5 text-xs`,children:[(0,Y.jsxs)(`div`,{className:`flex items-center gap-1.5 font-bold text-krona-primary`,children:[(0,Y.jsx)(v,{className:`w-3.5 h-3.5 text-krona-info`}),(0,Y.jsx)(`span`,{children:e.vehicleOrMaster})]}),(0,Y.jsx)(`div`,{className:`text-krona-secondary text-[11px]`,children:e.workOrderType}),(0,Y.jsxs)(`div`,{className:`flex items-center justify-between pt-1 border-t border-krona-border/60 text-[11px]`,children:[(0,Y.jsx)(`span`,{className:`text-krona-secondary font-mono`,children:e.orderNumber}),(0,Y.jsxs)(`span`,{className:`text-krona-warning font-semibold flex items-center gap-1`,children:[(0,Y.jsx)(m,{className:`w-3 h-3`}),`Осталось `,e.timeRemaining]})]})]}):(0,Y.jsx)(`div`,{className:`py-6 text-center text-xs text-krona-secondary`,children:`Пост свободен. Готов к приему автомобиля.`})]}),(0,Y.jsx)(`div`,{className:`pt-2 border-t border-krona-border/60 flex justify-end gap-2`,children:r?(0,Y.jsx)(n,{variant:`outline`,size:`sm`,className:`w-full text-xs`,onClick:()=>a(`/operations/work-orders`),children:`Открыть заказ-наряд`}):(0,Y.jsx)(n,{variant:`primary`,size:`sm`,className:`w-full text-xs`,onClick:()=>t(!0),children:`Назначить автомобиль`})})]},e.id)})})]})},ve=()=>{let e=O(),t=D(),{getActiveProfile:r,getActiveCapabilities:a,setIsQuickActionsOpen:o,activeLocation:s}=w(),c=r(),l=a(),u=e.pathname;return u===`/operations/pos`?(0,Y.jsx)(le,{}):u===`/operations/kds`?(0,Y.jsx)(ue,{}):u===`/operations/dining`?(0,Y.jsx)(de,{}):u===`/operations/work-orders`?(0,Y.jsx)(Z,{}):u===`/operations/booking`?(0,Y.jsx)(fe,{}):u===`/operations/delivery`?(0,Y.jsx)(pe,{}):u===`/operations/courier`?(0,Y.jsx)(pe,{initialMobile:!0}):u===`/operations/recipes`?(0,Y.jsx)(me,{}):u===`/operations/inventory`?(0,Y.jsx)(ie,{}):u===`/operations/orders`?(0,Y.jsx)(I,{}):u===`/operations/purchasing`?(0,Y.jsx)($,{}):u===`/operations/bays`?(0,Y.jsx)(_e,{}):u===`/operations/catalog`?(0,Y.jsxs)(`div`,{className:`space-y-4 animate-fade-in`,children:[(0,Y.jsxs)(`div`,{className:`flex items-center justify-between bg-krona-surface p-3.5 rounded-xl border border-krona-border shadow-krona-soft`,children:[(0,Y.jsxs)(`div`,{children:[(0,Y.jsxs)(`h2`,{className:`text-sm font-bold text-krona-primary`,children:[c.terminology.itemsLabel,` (`,s,`)`]}),(0,Y.jsx)(`p`,{className:`text-xs text-krona-secondary`,children:`Управление ассортиментом, ценами продажи, себестоимостью и стоп-листом`})]}),(0,Y.jsxs)(n,{variant:`primary`,size:`sm`,onClick:()=>o(!0),children:[`+ Добавить `,c.terminology.itemLabel.toLowerCase()]})]}),(0,Y.jsx)(`div`,{className:`bg-krona-surface border border-krona-border rounded-xl shadow-krona-soft overflow-hidden`,children:(0,Y.jsxs)(`table`,{className:`w-full text-left text-xs border-collapse`,children:[(0,Y.jsx)(`thead`,{className:`bg-krona-workspace/80 text-krona-secondary border-b border-krona-border`,children:(0,Y.jsxs)(`tr`,{children:[(0,Y.jsx)(`th`,{className:`p-3 font-semibold`,children:`Наименование`}),(0,Y.jsx)(`th`,{className:`p-3 font-semibold`,children:`Категория`}),(0,Y.jsx)(`th`,{className:`p-3 font-semibold`,children:`Цена продажи`}),(0,Y.jsx)(`th`,{className:`p-3 font-semibold`,children:`Себестоимость`}),(0,Y.jsx)(`th`,{className:`p-3 font-semibold`,children:`Маржа %`}),(0,Y.jsx)(`th`,{className:`p-3 font-semibold text-center`,children:`Статус в меню`})]})}),(0,Y.jsx)(`tbody`,{className:`divide-y divide-krona-border/50`,children:F.map(e=>(0,Y.jsxs)(`tr`,{className:`hover:bg-krona-workspace/50 transition-colors`,children:[(0,Y.jsxs)(`td`,{className:`p-3 font-medium text-krona-primary`,children:[(0,Y.jsx)(`div`,{children:e.name}),e.description&&(0,Y.jsx)(`div`,{className:`text-[11px] text-krona-secondary`,children:e.description})]}),(0,Y.jsx)(`td`,{className:`p-3 text-krona-secondary`,children:e.category}),(0,Y.jsx)(`td`,{className:`p-3 font-bold text-krona-primary`,children:N(e.price)}),(0,Y.jsx)(`td`,{className:`p-3 text-krona-secondary`,children:N(e.cost)}),(0,Y.jsxs)(`td`,{className:`p-3 font-semibold text-krona-green`,children:[e.marginPercent,`%`]}),(0,Y.jsx)(`td`,{className:`p-3 text-center`,children:e.isStopListed?(0,Y.jsx)(i,{variant:`danger`,size:`sm`,children:`В стоп-листе`}):(0,Y.jsx)(i,{variant:`green`,size:`sm`,children:`Доступно`})})]},e.id))})]})})]}):(0,Y.jsxs)(`div`,{className:`space-y-4 animate-fade-in`,children:[(0,Y.jsxs)(`div`,{className:`flex flex-col sm:flex-row sm:items-center justify-between gap-3 bg-krona-surface p-4 rounded-xl border border-krona-border shadow-krona-soft`,children:[(0,Y.jsxs)(`div`,{children:[(0,Y.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,Y.jsxs)(`h1`,{className:`text-base font-bold text-krona-primary`,children:[`Операционный хаб: `,c.name]}),(0,Y.jsx)(A,{level:`target`,size:`sm`})]}),(0,Y.jsxs)(`p`,{className:`text-xs text-krona-secondary mt-0.5`,children:[`Точка: `,(0,Y.jsx)(`strong`,{className:`text-krona-primary`,children:s}),` • Отраслевой рабочий контур с быстрым доступом`]})]}),(0,Y.jsxs)(`div`,{className:`flex items-center gap-2`,children:[l.pos&&(0,Y.jsx)(n,{variant:`primary`,size:`sm`,onClick:()=>t(`/operations/pos`),children:`Открыть кассу (POS)`}),l.kds&&(0,Y.jsx)(n,{variant:`gold`,size:`sm`,onClick:()=>t(`/operations/kds`),children:`Кухонный экран (KDS)`})]})]}),(0,Y.jsx)(`div`,{className:`grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-3.5`,children:c.operationsTabs.filter(e=>e.id!==`overview`).map(e=>(0,Y.jsxs)(`div`,{onClick:()=>t(e.route),className:`p-4 rounded-xl border border-krona-border bg-krona-surface hover:border-krona-green/70 hover:shadow-krona-soft cursor-pointer transition-all space-y-2 group`,children:[(0,Y.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,Y.jsx)(`span`,{className:`font-bold text-sm text-krona-primary group-hover:text-krona-green transition-colors`,children:e.label}),e.badge&&(0,Y.jsx)(i,{variant:`gold`,size:`sm`,children:e.badge})]}),(0,Y.jsxs)(`p`,{className:`text-xs text-krona-secondary`,children:[`Перейти в рабочий экран «`,e.label,`» для текущей смены`]}),(0,Y.jsx)(`div`,{className:`text-xs text-krona-green font-medium pt-1`,children:`Открыть раздел →`})]},e.id))})]})};export{ve as OperationsModule}; \ No newline at end of file diff --git a/dist/assets/OperationsModule-aDLWk78D.js b/dist/assets/OperationsModule-aDLWk78D.js deleted file mode 100644 index 4d1475e..0000000 --- a/dist/assets/OperationsModule-aDLWk78D.js +++ /dev/null @@ -1 +0,0 @@ -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{t as s}from"./building-BdUpGLM5.js";import{t as c}from"./dollar-sign-Bf6JneNn.js";import{t as l}from"./phone-DpnQw4if.js";import{t as u}from"./truck-D5o8mTsH.js";import{t as d}from"./user-CuEEaB8a.js";import{t as f}from"./utensils-BhILG_B7.js";import{B as p,K as m,L as h,O as g,R as _,S as v,U as y,V as b,W as x,a as S,b as C,dt as w,ft as T,i as E,k as D,lt as O,m as k,o as ee,q as te,r as A,t as j,u as ne,w as M,y as re}from"./index-CNnq9VO5.js";import{t as N}from"./formatters-WvGQLZg0.js";import{c as P,t as F}from"./mockData-DAqQG5te.js";import{InventoryModule as ie}from"./InventoryModule-B2QbjtwQ.js";import{SalesModule as I}from"./SalesModule-2VZC1D5Y.js";var L={name:`banknote`,size:24,node:[[`rect`,{width:`20`,height:`12`,x:`2`,y:`6`,rx:`2`,key:`9lu3g6`}],[`circle`,{cx:`12`,cy:`12`,r:`2`,key:`1c9p78`}],[`path`,{d:`M6 12h.01M18 12h.01`,key:`113zkx`}]]};L.node;var ae=r(L),R={name:`chef-hat`,size:24,node:[[`path`,{d:`M17 21a1 1 0 0 0 1-1v-5.35c0-.457.316-.844.727-1.041a4 4 0 0 0-2.134-7.589 5 5 0 0 0-9.186 0 4 4 0 0 0-2.134 7.588c.411.198.727.585.727 1.041V20a1 1 0 0 0 1 1Z`,key:`1qvrer`}],[`path`,{d:`M6 17h12`,key:`1jwigz`}]]};R.node;var z=r(R),B={name:`flame`,size:24,node:[[`path`,{d:`M12 3q1 4 4 6.5t3 5.5a1 1 0 0 1-14 0 5 5 0 0 1 1-3 1 1 0 0 0 5 0c0-2-1.5-3-1.5-5q0-2 2.5-4`,key:`1slcih`}]]};B.node;var V=r(B),H={name:`printer`,size:24,node:[[`path`,{d:`M6 18H4a2 2 0 0 1-2-2v-5a2 2 0 0 1 2-2h16a2 2 0 0 1 2 2v5a2 2 0 0 1-2 2h-2`,key:`143wyd`}],[`path`,{d:`M6 9V3a1 1 0 0 1 1-1h10a1 1 0 0 1 1 1v6`,key:`1itne7`}],[`rect`,{x:`6`,y:`14`,width:`12`,height:`8`,rx:`1`,key:`1ue0tg`}]]};H.node;var oe=r(H),U={name:`qr-code`,size:24,node:[[`rect`,{width:`5`,height:`5`,x:`3`,y:`3`,rx:`1`,key:`1tu5fj`}],[`rect`,{width:`5`,height:`5`,x:`16`,y:`3`,rx:`1`,key:`1v8r4q`}],[`rect`,{width:`5`,height:`5`,x:`3`,y:`16`,rx:`1`,key:`1x03jg`}],[`path`,{d:`M21 16h-3a2 2 0 0 0-2 2v3`,key:`177gqh`}],[`path`,{d:`M21 21v.01`,key:`ents32`}],[`path`,{d:`M12 7v3a2 2 0 0 1-2 2H7`,key:`8crl2c`}],[`path`,{d:`M3 12h.01`,key:`nlz23k`}],[`path`,{d:`M12 3h.01`,key:`n36tog`}],[`path`,{d:`M12 16v.01`,key:`133mhm`}],[`path`,{d:`M16 12h1`,key:`1slzba`}],[`path`,{d:`M21 12v.01`,key:`1lwtk9`}],[`path`,{d:`M12 21v-1`,key:`1880an`}]]};U.node;var se=r(U),W={name:`volume-2`,size:24,node:[[`path`,{d:`M11 4.702a.705.705 0 0 0-1.203-.498L6.413 7.587A1.4 1.4 0 0 1 5.416 8H3a1 1 0 0 0-1 1v6a1 1 0 0 0 1 1h2.416a1.4 1.4 0 0 1 .997.413l3.383 3.384A.705.705 0 0 0 11 19.298z`,key:`uqj9uw`}],[`path`,{d:`M16 9a5 5 0 0 1 0 6`,key:`1q6k2b`}],[`path`,{d:`M19.364 18.364a9 9 0 0 0 0-12.728`,key:`ijwkga`}]]};W.node;var G=r(W),K={name:`volume-x`,size:24,node:[[`path`,{d:`M11 4.702a.7.7 0 0 0-1.203-.498L6.413 7.587A1.4 1.4 0 0 1 5.416 8H3a1 1 0 0 0-1 1v6a1 1 0 0 0 1 1h2.416a1.4 1.4 0 0 1 .997.413l3.383 3.384A.7.7 0 0 0 11 19.298z`,key:`1p7khw`}],[`path`,{d:`m16.5 14.5 5-5`,key:`cul3yw`}],[`path`,{d:`m16.5 9.5 5 5`,key:`1akey5`}]]};K.node;var q=r(K),J=t(e(),1),Y=a(),ce=[{name:`Александр Романов`,phone:`+7 (913) 900-11-22`,tag:`VIP • Скидка 10%`},{name:`Елена Морозова`,phone:`+7 (923) 456-78-90`,tag:`Постоянный гость`},{name:`Михаил Васильев`,phone:`+7 (905) 111-22-33`,tag:`Бонусная карта 5%`},{name:`ООО Альфа Консалт`,phone:`+7 (383) 200-40-50`,tag:`B2B безнал`}],le=()=>{let{showToast:e}=o(),{posCart:t,addToCart:r,removeFromCart:a,updateCartQuantity:s,clearCart:c,posDiscountPercent:l,setPosDiscount:u,posCustomerName:f,setPosCustomer:m,posOrderType:_,setPosOrderType:x,posTableNumber:S,setPosTableNumber:C,posPaymentModalOpen:w,setPosPaymentModalOpen:T,posLastReceipt:E,completeCheckout:D,getActiveProfile:k,activeLocation:ee}=O(),te=k(),[P,ie]=(0,J.useState)(`Все`),[I,L]=(0,J.useState)(``),[R,z]=(0,J.useState)(!1),[B,V]=(0,J.useState)(!1),[H,U]=(0,J.useState)(!1),[W,G]=(0,J.useState)(0),[K,q]=(0,J.useState)(0),le=[`Все`,`Роллы`,`Горячее`,`Супы`,`Автоуслуги`,`Автосервис`],ue=F.filter(e=>{let t=P===`Все`||e.category===P,n=e.name.toLowerCase().includes(I.toLowerCase());return t&&n}),X=t.reduce((e,t)=>e+t.price*t.quantity,0),de=X*l/100,Z=Math.max(0,X-de),fe=()=>{t.length!==0&&(U(!1),T(!0))},pe=()=>{let e=Math.round(Z/2);G(e),q(Z-e),U(!0)},me=()=>{W+K===Z&&(T(!1),U(!1),D(`split`),z(!0))},Q=e=>{if(e===`split`){pe();return}T(!1),D(e),z(!0)},he=()=>{e({title:`Печать фискального чека`,message:`Чек ${E?.orderNumber||``} отправлен на кассовый регистратор (Атол 54-Ф)`,type:`success`})},$=Z-(W+K);return(0,Y.jsxs)(`div`,{className:`h-[calc(100vh-8.5rem)] flex flex-col md:flex-row gap-4 animate-fade-in overflow-hidden`,children:[(0,Y.jsxs)(`div`,{className:`flex-1 flex flex-col min-w-0 bg-krona-surface border border-krona-border rounded-xl shadow-krona-soft overflow-hidden`,children:[(0,Y.jsxs)(`div`,{className:`p-3 border-b border-krona-border flex flex-wrap items-center justify-between gap-3 bg-krona-surface/70`,children:[(0,Y.jsx)(`div`,{className:`flex items-center gap-1.5 overflow-x-auto`,children:le.map(e=>(0,Y.jsx)(`button`,{onClick:()=>ie(e),className:`px-3 py-1.5 rounded-lg text-xs font-medium transition-colors ${P===e?`bg-[#2F684C] text-[#F8F6F0] shadow-sm`:`bg-krona-workspace text-krona-secondary hover:text-krona-primary border border-krona-border`}`,children:e},e))}),(0,Y.jsxs)(`div`,{className:`relative w-56`,children:[(0,Y.jsx)(re,{className:`w-3.5 h-3.5 absolute left-2.5 top-2.5 text-krona-secondary`}),(0,Y.jsx)(`input`,{type:`text`,value:I,onChange:e=>L(e.target.value),placeholder:`Поиск по названию...`,className:`w-full pl-8 pr-3 py-1.5 text-xs bg-krona-workspace border border-krona-border rounded-lg text-krona-primary placeholder:text-krona-secondary focus:outline-none focus:border-krona-green`})]})]}),(0,Y.jsx)(`div`,{className:`flex-1 overflow-y-auto p-4 grid grid-cols-2 sm:grid-cols-3 xl:grid-cols-4 gap-3`,children:ue.map(e=>{let n=t.find(t=>t.id===e.id),a=e.isStopListed;return(0,Y.jsxs)(`div`,{onClick:()=>!a&&r(e),className:`group relative p-3.5 rounded-xl border flex flex-col justify-between transition-all select-none ${a?`opacity-50 border-krona-danger/40 bg-krona-danger/5 cursor-not-allowed`:`cursor-pointer border-krona-border bg-krona-surface hover:border-krona-green/60 hover:shadow-krona-soft active:scale-[0.99]`} ${n?`ring-2 ring-krona-green/40`:``}`,children:[(0,Y.jsxs)(`div`,{children:[(0,Y.jsxs)(`div`,{className:`flex items-center justify-between gap-1 mb-1.5`,children:[(0,Y.jsx)(`span`,{className:`text-[10px] text-krona-secondary uppercase font-semibold`,children:e.category}),a?(0,Y.jsx)(i,{variant:`danger`,size:`sm`,children:`Стоп-лист`}):n?(0,Y.jsxs)(i,{variant:`green`,size:`sm`,children:[n.quantity,` в чеке`]}):null]}),(0,Y.jsx)(`h4`,{className:`text-xs font-bold text-krona-primary leading-snug line-clamp-2`,children:e.name}),e.description&&(0,Y.jsx)(`p`,{className:`text-[11px] text-krona-secondary line-clamp-2 mt-1`,children:e.description})]}),(0,Y.jsxs)(`div`,{className:`mt-3 pt-2.5 border-t border-krona-border/40 flex items-baseline justify-between`,children:[(0,Y.jsx)(`span`,{className:`text-sm font-bold text-krona-primary`,children:N(e.price)}),(0,Y.jsxs)(`span`,{className:`text-[10px] text-krona-secondary`,children:[`Себест: `,e.cost,` ₽ (`,e.marginPercent,`%)`]})]})]},e.id)})})]}),(0,Y.jsxs)(`div`,{className:`w-full md:w-80 lg:w-96 flex flex-col bg-krona-surface border border-krona-border rounded-xl shadow-krona-soft overflow-hidden`,children:[(0,Y.jsxs)(`div`,{className:`p-3 border-b border-krona-border bg-krona-surface/80 space-y-2`,children:[(0,Y.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,Y.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,Y.jsx)(`span`,{className:`text-xs font-bold text-krona-primary uppercase tracking-wider`,children:`Текущий чек`}),(0,Y.jsx)(j,{level:`target`,size:`sm`})]}),(0,Y.jsx)(`span`,{className:`text-xs text-krona-secondary`,children:ee})]}),(0,Y.jsxs)(`div`,{className:`grid grid-cols-3 gap-1 bg-krona-workspace p-1 rounded-lg border border-krona-border text-xs`,children:[(0,Y.jsx)(`button`,{onClick:()=>x(`hall`),className:`py-1 rounded font-medium transition-colors ${_===`hall`?`bg-[#2F684C] text-white shadow-sm`:`text-krona-secondary`}`,children:`В зале`}),(0,Y.jsx)(`button`,{onClick:()=>x(`takeaway`),className:`py-1 rounded font-medium transition-colors ${_===`takeaway`?`bg-[#2F684C] text-white shadow-sm`:`text-krona-secondary`}`,children:`Навынос`}),(0,Y.jsx)(`button`,{onClick:()=>x(`delivery`),className:`py-1 rounded font-medium transition-colors ${_===`delivery`?`bg-[#2F684C] text-white shadow-sm`:`text-krona-secondary`}`,children:`Доставка`})]}),(0,Y.jsxs)(`div`,{className:`relative`,children:[(0,Y.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,Y.jsxs)(`div`,{className:`flex-1 flex items-center gap-1.5 px-2.5 py-1 bg-krona-workspace border border-krona-border rounded-md text-xs`,children:[(0,Y.jsx)(d,{className:`w-3.5 h-3.5 text-krona-secondary`}),(0,Y.jsx)(`input`,{type:`text`,value:f,onChange:e=>m(e.target.value),placeholder:`Клиент / Выбрать...`,className:`w-full bg-transparent focus:outline-none text-xs text-krona-primary`}),(0,Y.jsx)(`button`,{type:`button`,onClick:()=>V(!B),className:`text-krona-secondary hover:text-krona-primary`,title:`Выбрать из справочника`,children:(0,Y.jsx)(y,{className:`w-3.5 h-3.5`})})]}),_===`hall`&&(0,Y.jsx)(`div`,{className:`w-24`,children:(0,Y.jsx)(`input`,{type:`text`,value:S,onChange:e=>C(e.target.value),placeholder:`Стол...`,className:`w-full px-2 py-1 bg-krona-workspace border border-krona-border rounded-md text-xs text-krona-primary text-center font-medium focus:outline-none`})})]}),B&&(0,Y.jsxs)(`div`,{className:`absolute left-0 right-0 top-full mt-1 bg-krona-surface border border-krona-border rounded-xl shadow-lg z-20 p-2 space-y-1 text-xs`,children:[(0,Y.jsx)(`div`,{className:`text-[10px] font-bold text-krona-secondary px-2 py-1 uppercase`,children:`Быстрый выбор клиента CRM`}),ce.map((e,t)=>(0,Y.jsxs)(`button`,{type:`button`,onClick:()=>{m(e.name),V(!1),e.tag.includes(`10%`)?u(10):e.tag.includes(`5%`)&&u(5)},className:`w-full text-left p-2 rounded-lg hover:bg-krona-workspace flex items-center justify-between text-xs transition-colors`,children:[(0,Y.jsxs)(`div`,{children:[(0,Y.jsx)(`div`,{className:`font-semibold text-krona-primary`,children:e.name}),(0,Y.jsx)(`div`,{className:`text-[10px] text-krona-secondary`,children:e.phone})]}),(0,Y.jsx)(i,{variant:`gold`,size:`sm`,children:e.tag})]},t)),(0,Y.jsx)(`div`,{className:`pt-1 border-t border-krona-border/50 text-center`,children:(0,Y.jsx)(`button`,{type:`button`,onClick:()=>V(!1),className:`text-[11px] text-krona-secondary hover:text-krona-primary`,children:`Закрыть список`})})]})]})]}),(0,Y.jsx)(`div`,{className:`flex-1 overflow-y-auto p-3 divide-y divide-krona-border/40`,children:t.length===0?(0,Y.jsxs)(`div`,{className:`py-16 text-center text-xs text-krona-secondary`,children:[(0,Y.jsx)(v,{className:`w-8 h-8 mx-auto mb-2 opacity-30`}),`Чек пуст. Добавьте позиции из каталога слева.`]}):t.map(e=>(0,Y.jsxs)(`div`,{className:`py-2.5 first:pt-0 last:pb-0 flex items-center justify-between gap-2 text-xs`,children:[(0,Y.jsxs)(`div`,{className:`flex-1 min-w-0`,children:[(0,Y.jsx)(`div`,{className:`font-semibold text-krona-primary truncate`,children:e.name}),(0,Y.jsxs)(`div`,{className:`text-[11px] text-krona-secondary`,children:[N(e.price),` × `,e.quantity,` = `,N(e.price*e.quantity)]})]}),(0,Y.jsxs)(`div`,{className:`flex items-center gap-1 shrink-0`,children:[(0,Y.jsx)(`button`,{onClick:()=>s(e.id,-1),className:`w-6 h-6 rounded bg-krona-workspace border border-krona-border flex items-center justify-center hover:bg-krona-border/50 text-krona-primary`,"aria-label":`Уменьшить количество ${e.name}`,children:(0,Y.jsx)(g,{className:`w-3 h-3`})}),(0,Y.jsx)(`span`,{className:`w-6 text-center font-semibold text-xs text-krona-primary`,children:e.quantity}),(0,Y.jsx)(`button`,{onClick:()=>s(e.id,1),className:`w-6 h-6 rounded bg-krona-workspace border border-krona-border flex items-center justify-center hover:bg-krona-border/50 text-krona-primary`,"aria-label":`Увеличить количество ${e.name}`,children:(0,Y.jsx)(M,{className:`w-3 h-3`})}),(0,Y.jsx)(`button`,{onClick:()=>a(e.id),className:`p-1 text-krona-secondary hover:text-krona-danger ml-1`,"aria-label":`Удалить ${e.name} из чека`,children:(0,Y.jsx)(ne,{className:`w-3.5 h-3.5`})})]})]},e.id))}),(0,Y.jsxs)(`div`,{className:`p-3.5 border-t border-krona-border bg-krona-surface/80 space-y-2 text-xs`,children:[(0,Y.jsxs)(`div`,{className:`flex items-center justify-between gap-1 text-[11px]`,children:[(0,Y.jsx)(`span`,{className:`text-krona-secondary`,children:`Скидка:`}),(0,Y.jsx)(`div`,{className:`flex items-center gap-1`,children:[0,5,10,15,20].map(e=>(0,Y.jsxs)(`button`,{onClick:()=>u(e),className:`px-2 py-0.5 rounded border transition-colors ${l===e?`bg-krona-gold text-white font-bold border-krona-gold`:`bg-krona-workspace border-krona-border text-krona-secondary`}`,children:[e,`%`]},e))})]}),(0,Y.jsxs)(`div`,{className:`space-y-1 pt-1`,children:[(0,Y.jsxs)(`div`,{className:`flex justify-between text-krona-secondary`,children:[(0,Y.jsx)(`span`,{children:`Сумма позиций:`}),(0,Y.jsx)(`span`,{children:N(X)})]}),l>0&&(0,Y.jsxs)(`div`,{className:`flex justify-between text-krona-danger`,children:[(0,Y.jsxs)(`span`,{children:[`Скидка (`,l,`%):`]}),(0,Y.jsxs)(`span`,{children:[`-`,N(de)]})]}),(0,Y.jsxs)(`div`,{className:`flex justify-between text-base font-bold text-krona-primary pt-1 border-t border-krona-border`,children:[(0,Y.jsx)(`span`,{children:`К оплате:`}),(0,Y.jsx)(`span`,{className:`text-krona-green`,children:N(Z)})]})]}),(0,Y.jsxs)(`div`,{className:`pt-2 flex gap-2`,children:[(0,Y.jsx)(n,{variant:`secondary`,size:`md`,onClick:c,disabled:t.length===0,className:`px-3`,title:`Очистить чек`,children:`Сброс`}),(0,Y.jsxs)(n,{variant:`primary`,size:`md`,onClick:fe,disabled:t.length===0,className:`flex-1 text-sm font-semibold`,children:[`Оплатить `,N(Z)]})]})]})]}),(0,Y.jsx)(A,{isOpen:w,onClose:()=>{T(!1),U(!1)},title:H?`Смешанная оплата (Наличные + Карта)`:`Оплата заказа`,subtitle:`Сумма к оплате: ${N(Z)}`,maxWidth:`md`,children:H?(0,Y.jsxs)(`div`,{className:`space-y-4 text-xs`,children:[(0,Y.jsxs)(`div`,{className:`bg-krona-workspace p-3 rounded-lg border border-krona-border space-y-2`,children:[(0,Y.jsxs)(`div`,{className:`flex justify-between font-bold text-krona-primary`,children:[(0,Y.jsx)(`span`,{children:`Общая сумма к оплате:`}),(0,Y.jsx)(`span`,{children:N(Z)})]}),(0,Y.jsx)(`p`,{className:`text-[11px] text-krona-secondary`,children:`Распределите сумму между наличным расчетом и банковской картой:`})]}),(0,Y.jsxs)(`div`,{className:`grid grid-cols-2 gap-3`,children:[(0,Y.jsxs)(`div`,{className:`space-y-1`,children:[(0,Y.jsxs)(`label`,{className:`text-[11px] font-semibold text-krona-secondary flex items-center gap-1`,children:[(0,Y.jsx)(ae,{className:`w-3.5 h-3.5 text-krona-green`}),` Сумма наличными (₽):`]}),(0,Y.jsx)(`input`,{type:`number`,min:0,max:Z,value:W,onChange:e=>{let t=Math.max(0,Number(e.target.value));G(t),q(Math.max(0,Z-t))},className:`w-full p-2 bg-krona-surface border border-krona-border rounded-lg font-mono font-bold text-sm text-krona-primary focus:outline-none focus:border-krona-green`})]}),(0,Y.jsxs)(`div`,{className:`space-y-1`,children:[(0,Y.jsxs)(`label`,{className:`text-[11px] font-semibold text-krona-secondary flex items-center gap-1`,children:[(0,Y.jsx)(h,{className:`w-3.5 h-3.5 text-sky-600`}),` Сумма картой (₽):`]}),(0,Y.jsx)(`input`,{type:`number`,min:0,max:Z,value:K,onChange:e=>{let t=Math.max(0,Number(e.target.value));q(t),G(Math.max(0,Z-t))},className:`w-full p-2 bg-krona-surface border border-krona-border rounded-lg font-mono font-bold text-sm text-krona-primary focus:outline-none focus:border-krona-green`})]})]}),(0,Y.jsxs)(`div`,{className:`p-2.5 rounded-lg border flex items-center justify-between ${$===0?`bg-emerald-500/10 border-emerald-500/30 text-emerald-700 dark:text-emerald-300`:`bg-rose-500/10 border-rose-500/30 text-rose-700 dark:text-rose-300`}`,children:[(0,Y.jsx)(`div`,{className:`flex items-center gap-1.5 font-medium`,children:$===0?(0,Y.jsxs)(Y.Fragment,{children:[(0,Y.jsx)(p,{className:`w-4 h-4 text-emerald-600`}),(0,Y.jsx)(`span`,{children:`Сумма распределена верно (100%)`})]}):(0,Y.jsxs)(Y.Fragment,{children:[(0,Y.jsx)(b,{className:`w-4 h-4 text-rose-600`}),(0,Y.jsx)(`span`,{children:$>0?`Не распределено: ${N($)}`:`Переплата: ${N(Math.abs($))}`})]})}),(0,Y.jsxs)(`span`,{className:`font-mono font-bold`,children:[N(W+K),` / `,N(Z)]})]}),(0,Y.jsxs)(`div`,{className:`flex gap-2 pt-2 border-t border-krona-border`,children:[(0,Y.jsx)(n,{variant:`secondary`,size:`md`,onClick:()=>U(!1),className:`w-1/3`,children:`Назад`}),(0,Y.jsx)(n,{variant:`primary`,size:`md`,onClick:me,disabled:$!==0,className:`flex-1`,children:`Подтвердить раздельную оплату`})]})]}):(0,Y.jsxs)(`div`,{className:`space-y-3`,children:[(0,Y.jsxs)(`p`,{className:`text-xs text-krona-secondary`,children:[`Выберите способ расчета клиента на кассе точки «`,ee,`»:`]}),(0,Y.jsxs)(`div`,{className:`grid grid-cols-2 gap-3 pt-1`,children:[(0,Y.jsxs)(`button`,{onClick:()=>Q(`card`),className:`p-4 rounded-xl border border-krona-border hover:border-krona-green hover:bg-krona-green/5 text-left flex flex-col items-center justify-center gap-2 group transition-all`,children:[(0,Y.jsx)(h,{className:`w-8 h-8 text-krona-green group-hover:scale-110 transition-transform`}),(0,Y.jsx)(`div`,{className:`text-xs font-bold text-krona-primary`,children:`Банковская карта`}),(0,Y.jsx)(`div`,{className:`text-[10px] text-krona-secondary`,children:`Терминал эквайринга`})]}),(0,Y.jsxs)(`button`,{onClick:()=>Q(`cash`),className:`p-4 rounded-xl border border-krona-border hover:border-krona-green hover:bg-krona-green/5 text-left flex flex-col items-center justify-center gap-2 group transition-all`,children:[(0,Y.jsx)(ae,{className:`w-8 h-8 text-krona-green group-hover:scale-110 transition-transform`}),(0,Y.jsx)(`div`,{className:`text-xs font-bold text-krona-primary`,children:`Наличные`}),(0,Y.jsx)(`div`,{className:`text-[10px] text-krona-secondary`,children:`С выдачей сдачи`})]}),(0,Y.jsxs)(`button`,{onClick:()=>Q(`qr`),className:`p-4 rounded-xl border border-krona-border hover:border-krona-green hover:bg-krona-green/5 text-left flex flex-col items-center justify-center gap-2 group transition-all`,children:[(0,Y.jsx)(se,{className:`w-8 h-8 text-krona-gold group-hover:scale-110 transition-transform`}),(0,Y.jsx)(`div`,{className:`text-xs font-bold text-krona-primary`,children:`СБП / QR-код`}),(0,Y.jsx)(`div`,{className:`text-[10px] text-krona-secondary`,children:`Мгновенное зачисление`})]}),(0,Y.jsxs)(`button`,{onClick:()=>Q(`split`),className:`p-4 rounded-xl border border-krona-border hover:border-krona-green hover:bg-krona-green/5 text-left flex flex-col items-center justify-center gap-2 group transition-all`,children:[(0,Y.jsx)(v,{className:`w-8 h-8 text-krona-secondary group-hover:scale-110 transition-transform`}),(0,Y.jsx)(`div`,{className:`text-xs font-bold text-krona-primary`,children:`Смешанная оплата`}),(0,Y.jsx)(`div`,{className:`text-[10px] text-krona-secondary`,children:`Часть нал + часть карта`})]})]})]})}),R&&E&&(0,Y.jsx)(A,{isOpen:R,onClose:()=>z(!1),title:`Чек успешно пробит!`,subtitle:`Заказ ${E.orderNumber} • ${E.timestamp}`,maxWidth:`sm`,footer:(0,Y.jsxs)(`div`,{className:`flex gap-2 w-full`,children:[(0,Y.jsxs)(n,{variant:`secondary`,onClick:he,className:`flex-1 flex items-center justify-center gap-1.5`,children:[(0,Y.jsx)(oe,{className:`w-4 h-4`}),`Распечатать чек`]}),(0,Y.jsx)(n,{variant:`primary`,onClick:()=>z(!1),className:`flex-1`,children:`Новый заказ`})]}),children:(0,Y.jsxs)(`div`,{className:`font-mono text-xs bg-krona-workspace p-3.5 rounded-lg border border-krona-border space-y-2`,children:[(0,Y.jsxs)(`div`,{className:`text-center font-bold pb-1 border-b border-dashed border-krona-border`,children:[te.companyName,(0,Y.jsx)(`div`,{className:`text-[10px] font-normal text-krona-secondary`,children:E.location}),(0,Y.jsx)(`div`,{className:`text-[10px] text-krona-secondary font-normal`,children:`Касса №1 • Смена открыта`})]}),(0,Y.jsx)(`div`,{className:`space-y-1 py-1`,children:E.items.map((e,t)=>(0,Y.jsxs)(`div`,{className:`flex justify-between`,children:[(0,Y.jsxs)(`span`,{children:[e.name,` × `,e.quantity]}),(0,Y.jsx)(`span`,{children:N(e.price*e.quantity)})]},t))}),(0,Y.jsxs)(`div`,{className:`pt-2 border-t border-dashed border-krona-border space-y-1`,children:[(0,Y.jsxs)(`div`,{className:`flex justify-between`,children:[(0,Y.jsx)(`span`,{children:`Сумма:`}),(0,Y.jsx)(`span`,{children:N(E.subtotal)})]}),E.discount>0&&(0,Y.jsxs)(`div`,{className:`flex justify-between text-krona-danger`,children:[(0,Y.jsx)(`span`,{children:`Скидка:`}),(0,Y.jsxs)(`span`,{children:[`-`,N(E.discount)]})]}),(0,Y.jsxs)(`div`,{className:`flex justify-between font-bold text-sm pt-1 border-t border-dotted border-krona-border`,children:[(0,Y.jsx)(`span`,{children:`ИТОГ К ОПЛАТЕ:`}),(0,Y.jsx)(`span`,{children:N(E.total)})]}),(0,Y.jsxs)(`div`,{className:`flex justify-between text-[11px] text-krona-secondary`,children:[(0,Y.jsx)(`span`,{children:`Способ оплаты:`}),(0,Y.jsx)(`span`,{className:`uppercase font-semibold`,children:E.paymentType})]}),E.customer&&(0,Y.jsxs)(`div`,{className:`flex justify-between text-[11px] text-krona-secondary`,children:[(0,Y.jsx)(`span`,{children:`Клиент:`}),(0,Y.jsx)(`span`,{children:E.customer})]}),(0,Y.jsxs)(`div`,{className:`flex justify-between text-[10px] text-krona-secondary pt-1`,children:[(0,Y.jsx)(`span`,{children:`ФП (фискальный признак):`}),(0,Y.jsx)(`span`,{children:`ФП: 49204910283`})]}),(0,Y.jsx)(`div`,{className:`flex justify-between text-[10px] text-krona-secondary`,children:(0,Y.jsx)(`span`,{children:`ФН: 996044030198 • РН ККТ: 00049281001`})})]}),(0,Y.jsxs)(`div`,{className:`pt-2 text-center text-[10px] text-krona-secondary border-t border-dashed border-krona-border`,children:[`Спасибо за заказ в «`,te.companyName,`»!`]})]})})]})},ue=()=>{let{kdsTickets:e,updateKdsTicketStatus:t}=O(),{showToast:r}=o(),[a,s]=(0,J.useState)(!0),[c,l]=(0,J.useState)(`Все цеха`),[u,d]=(0,J.useState)(0);(0,J.useEffect)(()=>{let e=setInterval(()=>{d(e=>e+1)},1e3);return()=>clearInterval(e)},[]);let f=()=>{let e=!a;s(e),r({title:e?`Звуковые оповещения включены`:`Звук отключен`,message:e?`Звуковой сигнал будет воспроизводиться при поступлении нового заказа`:`Уведомления без звука`,type:`info`})},m=[`Все цеха`,`Суши-цех`,`Кухня`,`Горячий цех`],h=e.filter(e=>c===`Все цеха`||e.items.some(e=>e.station===c)),g=h.filter(e=>e.status===`new`),v=h.filter(e=>e.status===`cooking`),y=h.filter(e=>e.status===`ready`),b=e=>{let r=e.elapsedMinutes+Math.floor(u/60),a=r>20,o=r>10&&r<=20;return(0,Y.jsxs)(`div`,{className:`p-3.5 rounded-xl border flex flex-col justify-between transition-all shadow-krona-soft bg-krona-surface ${e.isUrgent?`border-rose-500/80 bg-rose-500/5 ring-1 ring-rose-500/40 animate-pulse`:a?`border-rose-500/70 bg-rose-500/5`:o?`border-amber-500/70`:`border-krona-border`}`,children:[(0,Y.jsxs)(`div`,{children:[(0,Y.jsxs)(`div`,{className:`flex items-center justify-between pb-2 border-b border-krona-border/60`,children:[(0,Y.jsxs)(`div`,{className:`flex items-center gap-1.5`,children:[(0,Y.jsx)(`span`,{className:`font-bold text-sm text-krona-primary`,children:e.orderNumber}),(0,Y.jsx)(i,{variant:`neutral`,size:`sm`,children:e.tableOrChannel}),e.isUrgent&&(0,Y.jsx)(i,{variant:`danger`,size:`sm`,children:`Срочно`})]}),(0,Y.jsxs)(`div`,{className:`flex items-center gap-1`,children:[(0,Y.jsx)(_,{className:`w-3.5 h-3.5 ${a?`text-rose-600`:o?`text-amber-600`:`text-krona-secondary`}`}),(0,Y.jsxs)(`span`,{className:`text-xs font-mono font-bold ${a?`text-rose-600`:o?`text-amber-600`:`text-krona-secondary`}`,children:[r,` мин`]})]})]}),(0,Y.jsx)(`div`,{className:`py-2.5 space-y-2 text-xs`,children:e.items.map((e,t)=>(0,Y.jsxs)(`div`,{className:`flex items-start justify-between gap-2`,children:[(0,Y.jsxs)(`div`,{className:`flex items-center gap-1.5 font-medium text-krona-primary`,children:[(0,Y.jsx)(`span`,{className:`w-5 h-5 rounded bg-krona-workspace border border-krona-border flex items-center justify-center font-bold text-xs`,children:e.quantity}),(0,Y.jsx)(`span`,{children:e.name})]}),(0,Y.jsx)(`span`,{className:`text-[10px] px-1.5 py-0.5 rounded bg-krona-muted text-krona-secondary`,children:e.station})]},t))})]}),(0,Y.jsxs)(`div`,{className:`pt-2.5 border-t border-krona-border/60 flex items-center justify-between gap-2`,children:[e.status===`new`&&(0,Y.jsxs)(n,{variant:`gold`,size:`sm`,className:`w-full text-xs`,onClick:()=>t(e.id,`cooking`),children:[(0,Y.jsx)(V,{className:`w-3.5 h-3.5 mr-1.5`}),`В работу (Начать готовить)`]}),e.status===`cooking`&&(0,Y.jsxs)(`div`,{className:`flex items-center gap-1.5 w-full`,children:[(0,Y.jsx)(n,{variant:`secondary`,size:`sm`,className:`px-2`,title:`Вернуть в новые`,onClick:()=>t(e.id,`new`),children:(0,Y.jsx)(C,{className:`w-3 h-3 text-krona-secondary`})}),(0,Y.jsxs)(n,{variant:`primary`,size:`sm`,className:`flex-1 text-xs`,onClick:()=>t(e.id,`ready`),children:[(0,Y.jsx)(x,{className:`w-3.5 h-3.5 mr-1.5`}),`Готово к выдаче`]})]}),e.status===`ready`&&(0,Y.jsxs)(`div`,{className:`flex items-center gap-1.5 w-full`,children:[(0,Y.jsx)(n,{variant:`secondary`,size:`sm`,className:`px-2`,title:`Вернуть в готовку`,onClick:()=>t(e.id,`cooking`),children:(0,Y.jsx)(C,{className:`w-3 h-3 text-krona-secondary`})}),(0,Y.jsxs)(n,{variant:`secondary`,size:`sm`,className:`flex-1 text-xs hover:bg-emerald-500/10 hover:border-emerald-500/50`,onClick:()=>t(e.id,`served`),children:[(0,Y.jsx)(p,{className:`w-3.5 h-3.5 mr-1.5 text-emerald-600`}),`Выдано гостю / курьеру`]})]})]})]},e.id)};return(0,Y.jsxs)(`div`,{className:`space-y-4 animate-fade-in`,children:[(0,Y.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,Y.jsxs)(`div`,{children:[(0,Y.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,Y.jsx)(`h2`,{className:`text-sm font-bold text-krona-primary`,children:`Кухонный монитор заказов & Экран цехов (KDS)`}),(0,Y.jsx)(j,{level:`target`,size:`sm`})]}),(0,Y.jsx)(`p`,{className:`text-xs text-krona-secondary mt-0.5`,children:`Управление очередью приготовления блюд по станциям в реальном времени с таймерами готовки`})]}),(0,Y.jsxs)(`div`,{className:`flex items-center gap-2 text-xs flex-wrap`,children:[(0,Y.jsx)(`div`,{className:`flex items-center gap-1 bg-krona-workspace p-1 rounded-lg border border-krona-border`,children:m.map(e=>(0,Y.jsx)(`button`,{onClick:()=>l(e),className:`px-2.5 py-1 rounded text-xs font-medium transition-colors ${c===e?`bg-[#2F684C] text-white shadow-sm`:`text-krona-secondary hover:text-krona-primary`}`,children:e},e))}),(0,Y.jsx)(n,{variant:`secondary`,size:`sm`,onClick:f,title:a?`Звук включен`:`Звук выключен`,className:`px-2.5`,children:a?(0,Y.jsx)(G,{className:`w-3.5 h-3.5 text-emerald-600`}):(0,Y.jsx)(q,{className:`w-3.5 h-3.5 text-krona-secondary`})}),(0,Y.jsxs)(i,{variant:`warning`,size:`md`,children:[`В работе: `,v.length]}),(0,Y.jsxs)(i,{variant:`green`,size:`md`,children:[`Готово: `,y.length]})]})]}),(0,Y.jsxs)(`div`,{className:`grid grid-cols-1 md:grid-cols-3 gap-4`,children:[(0,Y.jsxs)(`div`,{className:`bg-krona-workspace/80 border border-krona-border rounded-xl p-3 flex flex-col min-h-[500px]`,children:[(0,Y.jsxs)(`div`,{className:`flex items-center justify-between pb-2 mb-2 border-b border-krona-border`,children:[(0,Y.jsxs)(`span`,{className:`text-xs font-bold text-krona-primary flex items-center gap-1.5`,children:[(0,Y.jsx)(`span`,{className:`w-2 h-2 rounded-full bg-sky-500`}),`Новые заказы`]}),(0,Y.jsx)(`span`,{className:`text-xs font-mono font-bold text-krona-secondary`,children:g.length})]}),(0,Y.jsx)(`div`,{className:`space-y-3 flex-1 overflow-y-auto`,children:g.length===0?(0,Y.jsx)(`div`,{className:`text-center py-16 text-xs text-krona-secondary`,children:`Нет новых заказов в цехе`}):g.map(b)})]}),(0,Y.jsxs)(`div`,{className:`bg-krona-workspace/80 border border-krona-border rounded-xl p-3 flex flex-col min-h-[500px]`,children:[(0,Y.jsxs)(`div`,{className:`flex items-center justify-between pb-2 mb-2 border-b border-krona-border`,children:[(0,Y.jsxs)(`span`,{className:`text-xs font-bold text-krona-primary flex items-center gap-1.5`,children:[(0,Y.jsx)(`span`,{className:`w-2 h-2 rounded-full bg-amber-500`}),`Готовятся на кухне`]}),(0,Y.jsx)(`span`,{className:`text-xs font-mono font-bold text-krona-secondary`,children:v.length})]}),(0,Y.jsx)(`div`,{className:`space-y-3 flex-1 overflow-y-auto`,children:v.length===0?(0,Y.jsx)(`div`,{className:`text-center py-16 text-xs text-krona-secondary`,children:`Цех свободен`}):v.map(b)})]}),(0,Y.jsxs)(`div`,{className:`bg-krona-workspace/80 border border-krona-border rounded-xl p-3 flex flex-col min-h-[500px]`,children:[(0,Y.jsxs)(`div`,{className:`flex items-center justify-between pb-2 mb-2 border-b border-krona-border`,children:[(0,Y.jsxs)(`span`,{className:`text-xs font-bold text-krona-primary flex items-center gap-1.5`,children:[(0,Y.jsx)(`span`,{className:`w-2 h-2 rounded-full bg-emerald-500`}),`Готовы к выдаче`]}),(0,Y.jsx)(`span`,{className:`text-xs font-mono font-bold text-krona-secondary`,children:y.length})]}),(0,Y.jsx)(`div`,{className:`space-y-3 flex-1 overflow-y-auto`,children:y.length===0?(0,Y.jsx)(`div`,{className:`text-center py-16 text-xs text-krona-secondary`,children:`Нет готовых к выдаче`}):y.map(b)})]})]})]})},X=[{id:`t1`,name:`Стол 1 (VIP)`,zone:`VIP-зона`,capacity:6,status:`occupied`,waiter:`Алина Соколова`,seatedMinutes:45,currentTotal:6850,guestsCount:5,items:[{name:`Филадельфия Премиум`,qty:2,price:950},{name:`Том Ям с морепродуктами`,qty:2,price:680},{name:`Сет Дракон`,qty:1,price:2190},{name:`Морс клюквенный 1л`,qty:2,price:350}]},{id:`t2`,name:`Стол 2`,zone:`Основной зал`,capacity:2,status:`occupied`,waiter:`Артем Васильев`,seatedMinutes:22,currentTotal:2450,guestsCount:2,items:[{name:`Калифорния краб`,qty:2,price:790},{name:`Рамен Тонкоцу`,qty:1,price:590},{name:`Зеленый чай Сентя`,qty:1,price:280}]},{id:`t3`,name:`Стол 3`,zone:`Основной зал`,capacity:4,status:`free`},{id:`t4`,name:`Стол 4 (у окна)`,zone:`Основной зал`,capacity:4,status:`occupied`,waiter:`Алина Соколова`,seatedMinutes:18,currentTotal:4200,guestsCount:3,items:[{name:`Гёдза со свининой`,qty:3,price:420},{name:`Сет Горячая Шестерка`,qty:1,price:2450},{name:`Лимонад Юдзу`,qty:1,price:490}]},{id:`t5`,name:`Стол 5 (диван)`,zone:`Основной зал`,capacity:6,status:`reserved`,reservationTime:`19:00`,reservationClient:`Анна Воронина (3 чел)`},{id:`t6`,name:`Стол 6`,zone:`Основной зал`,capacity:2,status:`free`},{id:`t7`,name:`Стол 7`,zone:`Терраса`,capacity:4,status:`bill_printed`,waiter:`Артем Васильев`,seatedMinutes:62,currentTotal:5100,guestsCount:4,items:[{name:`Сет Филадельфия Мания`,qty:1,price:2890},{name:`Салат Чука с ореховым соусом`,qty:2,price:450},{name:`Чайник Эрл Грей`,qty:1,price:350},{name:`Десерт Моти ассорти`,qty:2,price:480}]},{id:`t8`,name:`Стол 8`,zone:`Терраса`,capacity:4,status:`free`},{id:`bar1`,name:`Барная стойка 1-3`,zone:`Бар`,capacity:3,status:`occupied`,waiter:`Бармен`,seatedMinutes:12,currentTotal:1800,guestsCount:2,items:[{name:`Коктейль Саке Сауэр`,qty:2,price:650},{name:`Эдамаме с морской солью`,qty:1,price:350}]}],de=()=>{let[e,t]=(0,J.useState)(X),[r,a]=(0,J.useState)(null),[s,c]=(0,J.useState)(`Все зоны`),[l,u]=(0,J.useState)(!1),[d,p]=(0,J.useState)(``),[m,h]=(0,J.useState)(`20:00`),[g,v]=(0,J.useState)(2),{setPosTableNumber:y}=O(),{showToast:b}=o(),x=T(),S=[`Все зоны`,`Основной зал`,`VIP-зона`,`Терраса`,`Бар`],C=e.filter(e=>s===`Все зоны`||e.zone===s),w=e=>{y(e.name),x(`/operations/pos`)},E=e=>{t(t=>t.map(t=>t.id===e?{...t,status:`bill_printed`}:t)),r&&r.id===e&&a({...r,status:`bill_printed`}),b({title:`Пречек напечатан`,message:`Предварительный счет для стола «${r?.name||e}» отправлен на печать`,type:`success`})},D=e=>{t(t=>t.map(t=>t.id===e?{...t,status:`free`,currentTotal:0,guestsCount:void 0,waiter:void 0,seatedMinutes:void 0,items:[]}:t)),a(null),b({title:`Стол освобожден`,message:`Стол готов к приему новых гостей`,type:`info`})},k=e=>{t(t=>t.map(t=>t.id===e?{...t,status:`occupied`,waiter:`Дежурный официант`,seatedMinutes:1,guestsCount:t.capacity,currentTotal:0,items:[]}:t)),r&&r.id===e&&a({...r,status:`occupied`,waiter:`Дежурный официант`,seatedMinutes:1,guestsCount:r.capacity,currentTotal:0,items:[]}),b({title:`Гости рассажены`,message:`Стол ${r?.name||``} переведен в статус «Занят»`,type:`success`})},ne=()=>{r&&(t(e=>e.map(e=>e.id===r.id?{...e,status:`reserved`,reservationTime:m,reservationClient:`${d} (${g} чел)`}:e)),u(!1),a(null),b({title:`Бронь подтверждена`,message:`Бронь на время ${m} для ${d} сохранена`,type:`success`}))},M=e=>{switch(e){case`occupied`:return(0,Y.jsx)(i,{variant:`green`,size:`sm`,children:`Занят`});case`reserved`:return(0,Y.jsx)(i,{variant:`gold`,size:`sm`,children:`Бронь`});case`bill_printed`:return(0,Y.jsx)(i,{variant:`warning`,size:`sm`,children:`Пречек`});default:return(0,Y.jsx)(i,{variant:`neutral`,size:`sm`,children:`Свободен`})}},re=e.filter(e=>e.status===`occupied`||e.status===`bill_printed`).length,P=e.filter(e=>e.status===`reserved`).length,F=e.filter(e=>e.status===`free`).length;return(0,Y.jsxs)(`div`,{className:`space-y-4 animate-fade-in`,children:[(0,Y.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,Y.jsxs)(`div`,{children:[(0,Y.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,Y.jsx)(`h2`,{className:`text-sm font-bold text-krona-primary`,children:`Схема залов, столы и обслуживание гостей`}),(0,Y.jsx)(j,{level:`target`,size:`sm`})]}),(0,Y.jsx)(`p`,{className:`text-xs text-krona-secondary mt-0.5`,children:`Интерактивная карта посадочных мест, статусы чеков, пречеки и назначенные официанты`})]}),(0,Y.jsxs)(`div`,{className:`flex items-center gap-2 flex-wrap`,children:[(0,Y.jsx)(`div`,{className:`flex items-center gap-1 bg-krona-workspace p-1 rounded-lg border border-krona-border text-xs`,children:S.map(e=>(0,Y.jsx)(`button`,{onClick:()=>c(e),className:`px-2.5 py-1 rounded font-medium transition-colors ${s===e?`bg-[#2F684C] text-white shadow-sm`:`text-krona-secondary hover:text-krona-primary`}`,children:e},e))}),(0,Y.jsxs)(i,{variant:`green`,size:`md`,children:[`Занято: `,re]}),(0,Y.jsxs)(i,{variant:`gold`,size:`md`,children:[`Бронь: `,P]}),(0,Y.jsxs)(i,{variant:`neutral`,size:`md`,children:[`Свободно: `,F]})]})]}),(0,Y.jsx)(`div`,{className:`grid grid-cols-2 sm:grid-cols-3 lg:grid-cols-4 gap-4`,children:C.map(e=>{let t=e.status===`occupied`||e.status===`bill_printed`;return(0,Y.jsxs)(`div`,{onClick:()=>a(e),className:`p-4 rounded-xl border flex flex-col justify-between transition-all cursor-pointer shadow-krona-soft select-none ${e.status===`occupied`?`border-emerald-500/70 bg-emerald-500/5 hover:border-emerald-500`:e.status===`bill_printed`?`border-amber-500/70 bg-amber-500/5 hover:border-amber-500`:e.status===`reserved`?`border-krona-gold/70 bg-krona-gold/5 hover:border-krona-gold`:`border-krona-border bg-krona-surface hover:border-krona-border-strong`}`,children:[(0,Y.jsxs)(`div`,{children:[(0,Y.jsxs)(`div`,{className:`flex items-center justify-between mb-2`,children:[(0,Y.jsx)(`span`,{className:`font-bold text-sm text-krona-primary`,children:e.name}),M(e.status)]}),(0,Y.jsxs)(`div`,{className:`flex items-center justify-between text-xs text-krona-secondary mb-2`,children:[(0,Y.jsxs)(`div`,{className:`flex items-center gap-1`,children:[(0,Y.jsx)(ee,{className:`w-3.5 h-3.5`}),(0,Y.jsxs)(`span`,{children:[`До `,e.capacity,` гостей`]})]}),(0,Y.jsx)(`span`,{className:`text-[10px] bg-krona-workspace px-1.5 py-0.5 rounded border border-krona-border/50`,children:e.zone})]}),t&&(0,Y.jsxs)(`div`,{className:`space-y-1 py-1 text-xs`,children:[(0,Y.jsxs)(`div`,{className:`flex justify-between font-bold text-krona-primary`,children:[(0,Y.jsx)(`span`,{children:`Счет:`}),(0,Y.jsx)(`span`,{children:N(e.currentTotal||0)})]}),(0,Y.jsxs)(`div`,{className:`flex justify-between text-krona-secondary text-[11px]`,children:[(0,Y.jsx)(`span`,{children:`Официант:`}),(0,Y.jsx)(`span`,{className:`truncate`,children:e.waiter})]}),(0,Y.jsxs)(`div`,{className:`flex justify-between text-krona-secondary text-[11px]`,children:[(0,Y.jsx)(`span`,{children:`Время:`}),(0,Y.jsxs)(`span`,{children:[e.seatedMinutes,` мин`]})]})]}),e.status===`reserved`&&(0,Y.jsxs)(`div`,{className:`py-1 text-xs text-krona-gold-text bg-krona-gold/10 p-2 rounded-lg space-y-1`,children:[(0,Y.jsxs)(`div`,{className:`font-semibold flex items-center gap-1`,children:[(0,Y.jsx)(_,{className:`w-3.5 h-3.5`}),` `,e.reservationTime]}),(0,Y.jsx)(`div`,{className:`text-[11px] truncate`,children:e.reservationClient})]}),e.status===`free`&&(0,Y.jsx)(`div`,{className:`py-4 text-center text-xs text-krona-secondary`,children:`Готов к посадке`})]}),(0,Y.jsxs)(`div`,{className:`pt-2 border-t border-krona-border/50 flex justify-between items-center text-xs text-krona-green font-medium`,children:[(0,Y.jsx)(`span`,{children:`Подробнее`}),(0,Y.jsx)(`span`,{children:`→`})]})]},e.id)})}),r&&!l&&(0,Y.jsx)(A,{isOpen:!!r,onClose:()=>a(null),title:`Управление столом: ${r.name}`,subtitle:`${r.zone} • Вместимость: ${r.capacity} персон`,maxWidth:`md`,children:(0,Y.jsxs)(`div`,{className:`space-y-4 text-xs`,children:[(0,Y.jsxs)(`div`,{className:`flex items-center justify-between p-3 bg-krona-workspace rounded-lg border border-krona-border`,children:[(0,Y.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,Y.jsx)(`span`,{className:`text-krona-secondary`,children:`Текущий статус:`}),M(r.status)]}),r.waiter&&(0,Y.jsxs)(`div`,{className:`text-krona-secondary`,children:[`Официант: `,(0,Y.jsx)(`strong`,{className:`text-krona-primary`,children:r.waiter})]})]}),(r.status===`occupied`||r.status===`bill_printed`)&&(0,Y.jsxs)(`div`,{className:`space-y-3`,children:[(0,Y.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,Y.jsx)(`h4`,{className:`font-bold text-krona-primary`,children:`Заказ стола:`}),(0,Y.jsx)(`span`,{className:`font-mono font-bold text-sm text-krona-green`,children:N(r.currentTotal||0)})]}),(0,Y.jsx)(`div`,{className:`bg-krona-surface border border-krona-border rounded-lg divide-y divide-krona-border/50 max-h-48 overflow-y-auto`,children:r.items&&r.items.length>0?r.items.map((e,t)=>(0,Y.jsxs)(`div`,{className:`p-2.5 flex items-center justify-between`,children:[(0,Y.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,Y.jsx)(`span`,{className:`w-5 h-5 rounded bg-krona-workspace flex items-center justify-center font-bold text-[11px]`,children:e.qty}),(0,Y.jsx)(`span`,{className:`font-medium text-krona-primary`,children:e.name})]}),(0,Y.jsx)(`span`,{className:`font-mono font-medium text-krona-primary`,children:N(e.price*e.qty)})]},t)):(0,Y.jsx)(`div`,{className:`p-4 text-center text-krona-secondary text-xs`,children:`Заказ еще формируется на кассе`})}),(0,Y.jsxs)(`div`,{className:`grid grid-cols-2 sm:grid-cols-3 gap-2 pt-2`,children:[(0,Y.jsx)(n,{variant:`primary`,size:`sm`,onClick:()=>w(r),children:`Открыть в кассе POS`}),(0,Y.jsxs)(n,{variant:`secondary`,size:`sm`,onClick:()=>E(r.id),children:[(0,Y.jsx)(oe,{className:`w-3.5 h-3.5 mr-1`}),`Напечатать пречек`]}),(0,Y.jsx)(n,{variant:`danger`,size:`sm`,onClick:()=>D(r.id),children:`Освободить стол`})]})]}),r.status===`free`&&(0,Y.jsxs)(`div`,{className:`space-y-3 py-2 text-center`,children:[(0,Y.jsx)(`p`,{className:`text-krona-secondary`,children:`Стол свободен и готов принять гостей. Выберите действие:`}),(0,Y.jsxs)(`div`,{className:`flex justify-center gap-3`,children:[(0,Y.jsxs)(n,{variant:`primary`,size:`md`,onClick:()=>k(r.id),children:[(0,Y.jsx)(f,{className:`w-4 h-4 mr-1.5`}),`Посадить гостей (Занять стол)`]}),(0,Y.jsxs)(n,{variant:`gold`,size:`md`,onClick:()=>{v(r.capacity),u(!0)},children:[(0,Y.jsx)(te,{className:`w-4 h-4 mr-1.5`}),`Забронировать стол`]})]})]}),r.status===`reserved`&&(0,Y.jsxs)(`div`,{className:`space-y-3`,children:[(0,Y.jsxs)(`div`,{className:`p-3 bg-krona-gold/10 border border-krona-gold/30 rounded-lg`,children:[(0,Y.jsx)(`div`,{className:`font-bold text-krona-primary mb-1`,children:`Детали бронирования:`}),(0,Y.jsxs)(`div`,{className:`text-krona-secondary`,children:[`Время: `,(0,Y.jsx)(`strong`,{children:r.reservationTime})]}),(0,Y.jsxs)(`div`,{className:`text-krona-secondary`,children:[`Гость: `,(0,Y.jsx)(`strong`,{children:r.reservationClient})]})]}),(0,Y.jsxs)(`div`,{className:`flex justify-end gap-2 pt-2`,children:[(0,Y.jsx)(n,{variant:`secondary`,size:`sm`,onClick:()=>D(r.id),children:`Отменить бронь`}),(0,Y.jsx)(n,{variant:`primary`,size:`sm`,onClick:()=>k(r.id),children:`Гости прибыли (Посадить за стол)`})]})]})]})}),l&&r&&(0,Y.jsx)(A,{isOpen:l,onClose:()=>u(!1),title:`Бронирование: ${r.name}`,subtitle:`Внесение записи в журнал бронирования столов`,maxWidth:`sm`,footer:(0,Y.jsxs)(`div`,{className:`flex gap-2 w-full justify-end`,children:[(0,Y.jsx)(n,{variant:`secondary`,onClick:()=>u(!1),children:`Отмена`}),(0,Y.jsx)(n,{variant:`primary`,onClick:ne,disabled:!d.trim(),children:`Сохранить бронь`})]}),children:(0,Y.jsxs)(`div`,{className:`space-y-3 text-xs`,children:[(0,Y.jsxs)(`div`,{className:`space-y-1`,children:[(0,Y.jsx)(`label`,{className:`font-semibold text-krona-primary`,children:`Имя и телефон гостя:`}),(0,Y.jsx)(`input`,{type:`text`,value:d,onChange:e=>p(e.target.value),placeholder:`Иван Петров, +7 913...`,className:`w-full p-2 bg-krona-workspace border border-krona-border rounded-lg text-krona-primary focus:outline-none focus:border-krona-green`})]}),(0,Y.jsxs)(`div`,{className:`grid grid-cols-2 gap-3`,children:[(0,Y.jsxs)(`div`,{className:`space-y-1`,children:[(0,Y.jsx)(`label`,{className:`font-semibold text-krona-primary`,children:`Время брони:`}),(0,Y.jsx)(`input`,{type:`text`,value:m,onChange:e=>h(e.target.value),placeholder:`19:30`,className:`w-full p-2 bg-krona-workspace border border-krona-border rounded-lg text-krona-primary focus:outline-none focus:border-krona-green`})]}),(0,Y.jsxs)(`div`,{className:`space-y-1`,children:[(0,Y.jsx)(`label`,{className:`font-semibold text-krona-primary`,children:`Количество персон:`}),(0,Y.jsx)(`input`,{type:`number`,min:1,max:r.capacity,value:g,onChange:e=>v(Number(e.target.value)),className:`w-full p-2 bg-krona-workspace border border-krona-border rounded-lg text-krona-primary focus:outline-none focus:border-krona-green`})]})]})]})})]})},Z=()=>{let{workOrders:e,updateWorkOrderStatus:t,setIsQuickActionsOpen:r}=O(),[a,o]=(0,J.useState)(null),s=e=>{switch(e){case`in_progress`:return(0,Y.jsx)(i,{variant:`warning`,size:`sm`,children:`В работе на посту`});case`ready`:return(0,Y.jsx)(i,{variant:`gold`,size:`sm`,children:`Готов к выдаче`});case`paid`:return(0,Y.jsx)(i,{variant:`green`,size:`sm`,children:`Оплачен и выдан`});default:return(0,Y.jsx)(i,{variant:`neutral`,size:`sm`,children:`Черновик / Заезд`})}};return(0,Y.jsxs)(`div`,{className:`space-y-4 animate-fade-in`,children:[(0,Y.jsxs)(`div`,{className:`flex items-center justify-between bg-krona-surface p-3.5 rounded-xl border border-krona-border shadow-krona-soft`,children:[(0,Y.jsxs)(`div`,{children:[(0,Y.jsx)(`h2`,{className:`text-sm font-bold text-krona-primary`,children:`Заказ-наряды автокомплекса и постов`}),(0,Y.jsx)(`p`,{className:`text-xs text-krona-secondary`,children:`Учет автомобилей, выполненных работ, списанных запчастей и нормо-часов`})]}),(0,Y.jsxs)(n,{variant:`primary`,size:`sm`,onClick:()=>r(!0),children:[(0,Y.jsx)(M,{className:`w-3.5 h-3.5 mr-1.5`}),`Новый заказ-наряд`]})]}),(0,Y.jsx)(`div`,{className:`grid grid-cols-1 md:grid-cols-2 gap-4`,children:e.map(e=>{let r=e.partsAmount+e.laborAmount;return(0,Y.jsxs)(`div`,{onClick:()=>o(e),className:`p-4 rounded-xl border border-krona-border bg-krona-surface hover:border-krona-border-strong shadow-krona-soft cursor-pointer transition-all space-y-3`,children:[(0,Y.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,Y.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,Y.jsx)(`div`,{className:`p-2 rounded-lg bg-krona-workspace text-krona-info border border-krona-border`,children:(0,Y.jsx)(m,{className:`w-4 h-4`})}),(0,Y.jsxs)(`div`,{children:[(0,Y.jsx)(`h4`,{className:`text-sm font-bold text-krona-primary`,children:e.vehicle}),(0,Y.jsxs)(`span`,{className:`text-xs text-krona-secondary font-mono`,children:[e.id,` • `,e.bay]})]})]}),s(e.status)]}),(0,Y.jsxs)(`div`,{className:`grid grid-cols-2 gap-2 text-xs py-1`,children:[(0,Y.jsxs)(`div`,{children:[(0,Y.jsx)(`span`,{className:`text-krona-secondary block text-[11px]`,children:`Владелец:`}),(0,Y.jsx)(`span`,{className:`font-medium text-krona-primary`,children:e.ownerName})]}),(0,Y.jsxs)(`div`,{children:[(0,Y.jsx)(`span`,{className:`text-krona-secondary block text-[11px]`,children:`Мастер поста:`}),(0,Y.jsx)(`span`,{className:`font-medium text-krona-primary`,children:e.masterName})]})]}),(0,Y.jsxs)(`div`,{className:`p-2.5 rounded-lg bg-krona-workspace text-xs space-y-1`,children:[(0,Y.jsx)(`span`,{className:`text-[11px] font-semibold text-krona-secondary uppercase`,children:`Работы и услуги:`}),(0,Y.jsx)(`ul`,{className:`list-disc list-inside space-y-0.5 text-krona-primary`,children:e.services.map((e,t)=>(0,Y.jsx)(`li`,{className:`truncate`,children:e},t))})]}),(0,Y.jsxs)(`div`,{className:`pt-2 border-t border-krona-border/60 flex items-center justify-between text-xs`,children:[(0,Y.jsxs)(`div`,{children:[(0,Y.jsx)(`span`,{className:`text-krona-secondary block text-[10px]`,children:`Итоговая стоимость:`}),(0,Y.jsx)(`span`,{className:`text-sm font-bold text-krona-green`,children:N(r)})]}),(0,Y.jsxs)(`div`,{className:`flex gap-2`,children:[e.status===`in_progress`&&(0,Y.jsx)(n,{variant:`primary`,size:`sm`,onClick:n=>{n.stopPropagation(),t(e.id,`ready`)},children:`Готово`}),e.status===`ready`&&(0,Y.jsx)(n,{variant:`gold`,size:`sm`,onClick:n=>{n.stopPropagation(),t(e.id,`paid`)},children:`Принять оплату`})]})]})]},e.id)})}),a&&(0,Y.jsx)(A,{isOpen:!!a,onClose:()=>o(null),title:`Заказ-наряд ${a.id}`,subtitle:`${a.vehicle} • ${a.bay}`,maxWidth:`md`,footer:(0,Y.jsx)(n,{variant:`secondary`,onClick:()=>o(null),children:`Закрыть`}),children:(0,Y.jsxs)(`div`,{className:`space-y-4 text-xs`,children:[(0,Y.jsxs)(`div`,{className:`grid grid-cols-2 gap-3 p-3 rounded-lg bg-krona-workspace`,children:[(0,Y.jsxs)(`div`,{children:[(0,Y.jsx)(`span`,{className:`text-krona-secondary block`,children:`Владелец:`}),(0,Y.jsx)(`span`,{className:`font-semibold text-krona-primary`,children:a.ownerName}),(0,Y.jsx)(`span`,{className:`text-krona-secondary block text-[11px]`,children:a.phone})]}),(0,Y.jsxs)(`div`,{children:[(0,Y.jsx)(`span`,{className:`text-krona-secondary block`,children:`Ответственный специалист:`}),(0,Y.jsx)(`span`,{className:`font-semibold text-krona-primary`,children:a.masterName}),(0,Y.jsx)(`span`,{className:`text-krona-secondary block text-[11px]`,children:a.bay})]})]}),(0,Y.jsxs)(`div`,{children:[(0,Y.jsx)(`span`,{className:`font-semibold text-krona-primary block mb-1`,children:`Калькуляция:`}),(0,Y.jsxs)(`div`,{className:`p-3 border border-krona-border rounded-lg space-y-1.5`,children:[(0,Y.jsxs)(`div`,{className:`flex justify-between`,children:[(0,Y.jsx)(`span`,{className:`text-krona-secondary`,children:`Работы мастера:`}),(0,Y.jsx)(`span`,{className:`font-medium`,children:N(a.laborAmount)})]}),(0,Y.jsxs)(`div`,{className:`flex justify-between`,children:[(0,Y.jsx)(`span`,{className:`text-krona-secondary`,children:`Материалы и запчасти:`}),(0,Y.jsx)(`span`,{className:`font-medium`,children:N(a.partsAmount)})]}),(0,Y.jsxs)(`div`,{className:`flex justify-between pt-1 border-t border-krona-border font-bold text-sm`,children:[(0,Y.jsx)(`span`,{children:`ИТОГО К ОПЛАТЕ:`}),(0,Y.jsx)(`span`,{className:`text-krona-green`,children:N(a.laborAmount+a.partsAmount)})]})]})]})]})})]})},fe=()=>{let{bookings:e,updateBookingStatus:t,setIsQuickActionsOpen:r,getActiveProfile:a}=O(),o=a(),s=e=>{switch(e){case`confirmed`:return(0,Y.jsx)(i,{variant:`gold`,size:`sm`,children:`Подтверждена`});case`seated`:return(0,Y.jsx)(i,{variant:`green`,size:`sm`,children:`Гость пришел / Заезд`});case`completed`:return(0,Y.jsx)(i,{variant:`neutral`,size:`sm`,children:`Завершено`});case`cancelled`:return(0,Y.jsx)(i,{variant:`danger`,size:`sm`,children:`Отменена / No-Show`})}};return(0,Y.jsxs)(`div`,{className:`space-y-4 animate-fade-in`,children:[(0,Y.jsxs)(`div`,{className:`flex items-center justify-between bg-krona-surface p-3.5 rounded-xl border border-krona-border shadow-krona-soft`,children:[(0,Y.jsxs)(`div`,{children:[(0,Y.jsxs)(`h2`,{className:`text-sm font-bold text-krona-primary`,children:[`Журнал бронирования & Запись ресурсов (`,o.terminology.bookingResourceLabel,`)`]}),(0,Y.jsx)(`p`,{className:`text-xs text-krona-secondary`,children:`Сетка временных слотов, подтверждение депозитов и контроль неявок (no-show)`})]}),(0,Y.jsxs)(n,{variant:`primary`,size:`sm`,onClick:()=>r(!0),children:[(0,Y.jsx)(M,{className:`w-3.5 h-3.5 mr-1.5`}),`Записать клиента`]})]}),(0,Y.jsx)(`div`,{className:`grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-3.5`,children:e.map(e=>(0,Y.jsxs)(`div`,{className:`p-4 rounded-xl border border-krona-border bg-krona-surface shadow-krona-soft flex flex-col justify-between space-y-3`,children:[(0,Y.jsxs)(`div`,{children:[(0,Y.jsxs)(`div`,{className:`flex items-center justify-between pb-2 border-b border-krona-border/60`,children:[(0,Y.jsxs)(`div`,{className:`flex items-center gap-1.5 font-bold text-sm text-krona-primary`,children:[(0,Y.jsx)(_,{className:`w-4 h-4 text-krona-gold`}),(0,Y.jsx)(`span`,{children:e.time})]}),s(e.status)]}),(0,Y.jsxs)(`div`,{className:`py-2 space-y-1.5 text-xs`,children:[(0,Y.jsxs)(`div`,{children:[(0,Y.jsxs)(`span`,{className:`text-[10px] text-krona-secondary uppercase font-semibold`,children:[o.terminology.bookingResourceLabel,`:`]}),(0,Y.jsx)(`div`,{className:`font-semibold text-krona-primary`,children:e.resourceName})]}),(0,Y.jsxs)(`div`,{children:[(0,Y.jsx)(`span`,{className:`text-[10px] text-krona-secondary uppercase font-semibold`,children:`Клиент:`}),(0,Y.jsx)(`div`,{className:`text-krona-primary font-medium`,children:e.clientName}),(0,Y.jsx)(`div`,{className:`text-[11px] text-krona-secondary font-mono`,children:e.clientPhone}),e.guestsOrCar&&(0,Y.jsx)(`div`,{className:`text-[11px] text-krona-secondary italic mt-0.5`,children:e.guestsOrCar})]}),e.deposit>0&&(0,Y.jsxs)(`div`,{className:`flex justify-between pt-1 border-t border-krona-border/40 text-[11px]`,children:[(0,Y.jsx)(`span`,{className:`text-krona-secondary`,children:`Внесен депозит:`}),(0,Y.jsx)(`span`,{className:`font-semibold text-krona-green`,children:N(e.deposit)})]})]})]}),(0,Y.jsxs)(`div`,{className:`pt-2 border-t border-krona-border/60 flex items-center justify-end gap-2`,children:[e.status===`confirmed`&&(0,Y.jsxs)(Y.Fragment,{children:[(0,Y.jsx)(n,{variant:`outline`,size:`sm`,className:`text-xs`,onClick:()=>t(e.id,`cancelled`),children:`No-Show`}),(0,Y.jsx)(n,{variant:`primary`,size:`sm`,className:`text-xs`,onClick:()=>t(e.id,`seated`),children:`Прибыл`})]}),e.status===`seated`&&(0,Y.jsx)(n,{variant:`secondary`,size:`sm`,className:`w-full text-xs`,onClick:()=>t(e.id,`completed`),children:`Завершить визит`})]})]},e.id))})]})},pe=({initialMobile:e=!1})=>{let{deliveries:t,updateDeliveryStatus:r}=O(),[a,o]=(0,J.useState)(e),s=e=>{switch(e){case`in_transit`:return(0,Y.jsx)(i,{variant:`info`,size:`sm`,children:`Курьер в пути`});case`delivered`:return(0,Y.jsx)(i,{variant:`green`,size:`sm`,children:`Доставлен`});default:return(0,Y.jsx)(i,{variant:`warning`,size:`sm`,children:`Ожидает курьера`})}};return(0,Y.jsxs)(`div`,{className:`space-y-4 animate-fade-in`,children:[(0,Y.jsxs)(`div`,{className:`flex items-center justify-between bg-krona-surface p-3.5 rounded-xl border border-krona-border shadow-krona-soft`,children:[(0,Y.jsxs)(`div`,{children:[(0,Y.jsx)(`h2`,{className:`text-sm font-bold text-krona-primary`,children:`Управление доставкой & Мониторинг курьеров`}),(0,Y.jsx)(`p`,{className:`text-xs text-krona-secondary`,children:`Логистический контур: распределение заказов, расчет времени прибытия (ETA) и контроль налички`})]}),(0,Y.jsxs)(n,{variant:a?`gold`:`secondary`,size:`sm`,onClick:()=>o(!a),children:[(0,Y.jsx)(k,{className:`w-3.5 h-3.5 mr-1.5`}),a?`Обычный диспетчерский вид`:`Экран курьера (Mobile View)`]})]}),a?(0,Y.jsxs)(`div`,{className:`max-w-md mx-auto bg-krona-surface border-2 border-krona-gold/60 rounded-2xl p-4 shadow-xl space-y-4`,children:[(0,Y.jsxs)(`div`,{className:`flex items-center justify-between pb-3 border-b border-krona-border`,children:[(0,Y.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,Y.jsx)(`div`,{className:`w-8 h-8 rounded-full bg-krona-gold/20 flex items-center justify-center text-krona-gold`,children:(0,Y.jsx)(u,{className:`w-4 h-4`})}),(0,Y.jsxs)(`div`,{children:[(0,Y.jsx)(`h4`,{className:`text-xs font-bold text-krona-primary`,children:`Алексей Смирнов (Авто)`}),(0,Y.jsx)(`span`,{className:`text-[10px] text-krona-secondary`,children:`Смена активна • Наличные: 24 500 ₽`})]})]}),(0,Y.jsx)(i,{variant:`green`,size:`sm`,children:`Онлайн`})]}),(0,Y.jsxs)(`div`,{className:`space-y-3`,children:[(0,Y.jsxs)(`span`,{className:`text-xs font-semibold uppercase tracking-wider text-krona-secondary block`,children:[`Мои текущие доставки (`,t.filter(e=>e.status!==`delivered`).length,`)`]}),t.map(e=>(0,Y.jsxs)(`div`,{className:`p-3.5 rounded-xl border border-krona-border bg-krona-workspace space-y-2.5`,children:[(0,Y.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,Y.jsx)(`span`,{className:`font-bold text-xs text-krona-primary`,children:e.orderId}),s(e.status)]}),(0,Y.jsxs)(`div`,{className:`space-y-1 text-xs`,children:[(0,Y.jsxs)(`div`,{className:`flex items-start gap-1.5 text-krona-primary font-medium`,children:[(0,Y.jsx)(D,{className:`w-3.5 h-3.5 text-krona-danger shrink-0 mt-0.5`}),(0,Y.jsx)(`span`,{children:e.address})]}),(0,Y.jsxs)(`div`,{className:`flex items-center justify-between pt-1 text-[11px] text-krona-secondary`,children:[(0,Y.jsx)(`span`,{children:e.recipientName}),(0,Y.jsxs)(`a`,{href:`tel:${e.phone}`,className:`text-krona-green font-semibold flex items-center gap-1`,children:[(0,Y.jsx)(l,{className:`w-3 h-3`}),e.phone]})]}),(0,Y.jsxs)(`div`,{className:`flex items-center justify-between pt-1 border-t border-krona-border/60`,children:[(0,Y.jsx)(`span`,{className:`text-krona-secondary`,children:`К оплате:`}),(0,Y.jsxs)(`span`,{className:`font-bold text-krona-primary`,children:[N(e.amount),` (`,e.paymentMethod,`)`]})]})]}),(0,Y.jsxs)(`div`,{className:`pt-2 flex gap-2`,children:[e.status===`pending`&&(0,Y.jsx)(n,{variant:`primary`,size:`sm`,className:`w-full text-xs`,onClick:()=>r(e.id,`in_transit`),children:`Заказ забрал, еду к клиенту`}),e.status===`in_transit`&&(0,Y.jsxs)(n,{variant:`gold`,size:`sm`,className:`w-full text-xs`,onClick:()=>r(e.id,`delivered`),children:[(0,Y.jsx)(p,{className:`w-3.5 h-3.5 mr-1`}),`Заказ вручен и оплачен`]})]})]},e.id))]})]}):(0,Y.jsx)(`div`,{className:`grid grid-cols-1 md:grid-cols-3 gap-4`,children:t.map(e=>(0,Y.jsxs)(`div`,{className:`p-4 rounded-xl border border-krona-border bg-krona-surface shadow-krona-soft space-y-3`,children:[(0,Y.jsxs)(`div`,{className:`flex items-center justify-between pb-2 border-b border-krona-border/60`,children:[(0,Y.jsx)(`span`,{className:`font-bold text-sm text-krona-primary`,children:e.orderId}),s(e.status)]}),(0,Y.jsxs)(`div`,{className:`space-y-1.5 text-xs`,children:[(0,Y.jsxs)(`div`,{className:`flex items-start gap-1.5`,children:[(0,Y.jsx)(D,{className:`w-3.5 h-3.5 text-krona-danger shrink-0 mt-0.5`}),(0,Y.jsx)(`span`,{className:`text-krona-primary font-medium leading-tight`,children:e.address})]}),(0,Y.jsxs)(`div`,{className:`pt-1 text-krona-secondary`,children:[(0,Y.jsxs)(`div`,{children:[`Получатель: `,(0,Y.jsx)(`strong`,{className:`text-krona-primary`,children:e.recipientName})]}),(0,Y.jsxs)(`div`,{children:[`Телефон: `,(0,Y.jsx)(`span`,{className:`font-mono`,children:e.phone})]}),(0,Y.jsxs)(`div`,{children:[`Курьер: `,(0,Y.jsx)(`strong`,{className:`text-krona-primary`,children:e.courierName})]})]}),(0,Y.jsxs)(`div`,{className:`flex justify-between pt-1 border-t border-krona-border/40 font-bold`,children:[(0,Y.jsx)(`span`,{children:`Сумма:`}),(0,Y.jsx)(`span`,{className:`text-krona-green`,children:N(e.amount)})]})]}),(0,Y.jsxs)(`div`,{className:`pt-2 border-t border-krona-border/60 flex justify-end gap-2`,children:[e.status===`pending`&&(0,Y.jsx)(n,{variant:`primary`,size:`sm`,className:`w-full text-xs`,onClick:()=>r(e.id,`in_transit`),children:`Передать курьеру`}),e.status===`in_transit`&&(0,Y.jsx)(n,{variant:`secondary`,size:`sm`,className:`w-full text-xs`,onClick:()=>r(e.id,`delivered`),children:`Отметить вручение`}),e.status===`delivered`&&(0,Y.jsx)(`div`,{className:`w-full text-center text-xs text-krona-green font-semibold py-1`,children:`✓ Успешно доставлен`})]})]},e.id))})]})},me=()=>{let[e]=(0,J.useState)(P),[t,r]=(0,J.useState)(null);return(0,Y.jsxs)(`div`,{className:`space-y-4 animate-fade-in`,children:[(0,Y.jsxs)(`div`,{className:`flex items-center justify-between bg-krona-surface p-3.5 rounded-xl border border-krona-border shadow-krona-soft`,children:[(0,Y.jsxs)(`div`,{children:[(0,Y.jsx)(`h2`,{className:`text-sm font-bold text-krona-primary`,children:`Технологические карты & Калькуляция (BOM)`}),(0,Y.jsx)(`p`,{className:`text-xs text-krona-secondary`,children:`Нормы расхода сырья, расчет food cost %, плановая себестоимость и маржинальность`})]}),(0,Y.jsxs)(n,{variant:`primary`,size:`sm`,onClick:()=>r(e[0]),children:[(0,Y.jsx)(z,{className:`w-3.5 h-3.5 mr-1.5`}),`Посмотреть калькуляцию`]})]}),(0,Y.jsx)(`div`,{className:`grid grid-cols-1 md:grid-cols-2 gap-4`,children:e.map(e=>(0,Y.jsxs)(`div`,{onClick:()=>r(e),className:`p-4 rounded-xl border border-krona-border bg-krona-surface hover:border-krona-border-strong shadow-krona-soft cursor-pointer transition-all space-y-3`,children:[(0,Y.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,Y.jsxs)(`div`,{children:[(0,Y.jsx)(`h4`,{className:`text-sm font-bold text-krona-primary`,children:e.name}),(0,Y.jsxs)(`span`,{className:`text-xs text-krona-secondary`,children:[`Выход: `,e.yieldWeight,` • `,e.category]})]}),(0,Y.jsxs)(i,{variant:`green`,size:`sm`,children:[`Food Cost: `,e.foodCostPercent,`%`]})]}),(0,Y.jsxs)(`div`,{className:`grid grid-cols-3 gap-2 p-2.5 rounded-lg bg-krona-workspace text-xs`,children:[(0,Y.jsxs)(`div`,{children:[(0,Y.jsx)(`span`,{className:`text-krona-secondary block text-[10px]`,children:`Себестоимость:`}),(0,Y.jsx)(`span`,{className:`font-bold text-krona-primary`,children:N(e.primeCost)})]}),(0,Y.jsxs)(`div`,{children:[(0,Y.jsx)(`span`,{className:`text-krona-secondary block text-[10px]`,children:`Цена продажи:`}),(0,Y.jsx)(`span`,{className:`font-bold text-krona-green`,children:N(e.sellingPrice)})]}),(0,Y.jsxs)(`div`,{children:[(0,Y.jsx)(`span`,{className:`text-krona-secondary block text-[10px]`,children:`Маржа (руб):`}),(0,Y.jsx)(`span`,{className:`font-bold text-krona-gold`,children:N(e.marginRub)})]})]}),(0,Y.jsxs)(`div`,{className:`text-xs text-krona-secondary`,children:[(0,Y.jsxs)(`span`,{className:`font-medium text-krona-primary`,children:[`Ингредиенты (`,e.ingredients.length,`): `]}),e.ingredients.map(e=>e.name).join(`, `)]})]},e.id))}),t&&(0,Y.jsx)(A,{isOpen:!!t,onClose:()=>r(null),title:`Техкарта: ${t.name}`,subtitle:`Выход готового блюда: ${t.yieldWeight}`,maxWidth:`lg`,footer:(0,Y.jsx)(n,{variant:`secondary`,onClick:()=>r(null),children:`Закрыть`}),children:(0,Y.jsxs)(`div`,{className:`space-y-4 text-xs`,children:[(0,Y.jsxs)(`div`,{className:`grid grid-cols-4 gap-2 p-3 bg-krona-workspace rounded-lg text-center`,children:[(0,Y.jsxs)(`div`,{children:[(0,Y.jsx)(`span`,{className:`text-krona-secondary block text-[10px]`,children:`Цена в меню:`}),(0,Y.jsx)(`span`,{className:`font-bold text-sm text-krona-primary`,children:N(t.sellingPrice)})]}),(0,Y.jsxs)(`div`,{children:[(0,Y.jsx)(`span`,{className:`text-krona-secondary block text-[10px]`,children:`Себестоимость:`}),(0,Y.jsx)(`span`,{className:`font-bold text-sm text-krona-danger`,children:N(t.primeCost)})]}),(0,Y.jsxs)(`div`,{children:[(0,Y.jsx)(`span`,{className:`text-krona-secondary block text-[10px]`,children:`Food Cost %:`}),(0,Y.jsxs)(`span`,{className:`font-bold text-sm text-krona-green`,children:[t.foodCostPercent,`%`]})]}),(0,Y.jsxs)(`div`,{children:[(0,Y.jsx)(`span`,{className:`text-krona-secondary block text-[10px]`,children:`Маржинальный доход:`}),(0,Y.jsx)(`span`,{className:`font-bold text-sm text-krona-gold`,children:N(t.marginRub)})]})]}),(0,Y.jsxs)(`div`,{children:[(0,Y.jsx)(`h5`,{className:`font-semibold text-krona-primary mb-2`,children:`Расход сырья и калькуляция:`}),(0,Y.jsxs)(`table`,{className:`w-full text-left border-collapse`,children:[(0,Y.jsx)(`thead`,{children:(0,Y.jsxs)(`tr`,{className:`border-b border-krona-border text-krona-secondary text-[11px]`,children:[(0,Y.jsx)(`th`,{className:`pb-1.5 font-medium`,children:`Ингредиент`}),(0,Y.jsx)(`th`,{className:`pb-1.5 font-medium`,children:`Брутто`}),(0,Y.jsx)(`th`,{className:`pb-1.5 font-medium`,children:`Нетто`}),(0,Y.jsx)(`th`,{className:`pb-1.5 font-medium text-right`,children:`Стоимость`})]})}),(0,Y.jsx)(`tbody`,{className:`divide-y divide-krona-border/40`,children:t.ingredients.map((e,t)=>(0,Y.jsxs)(`tr`,{className:`py-1.5`,children:[(0,Y.jsx)(`td`,{className:`py-1.5 font-medium text-krona-primary`,children:e.name}),(0,Y.jsx)(`td`,{className:`py-1.5 text-krona-secondary`,children:e.gross}),(0,Y.jsx)(`td`,{className:`py-1.5 text-krona-secondary`,children:e.net}),(0,Y.jsx)(`td`,{className:`py-1.5 font-semibold text-right text-krona-primary`,children:N(e.cost)})]},t))})]})]})]})})]})},Q=[{id:`sup-1`,name:`СибРыбТорг`,category:`Рыба и морепродукты`,phone:`+7 (383) 310-20-40`,contactPerson:`Олег Васильев`,debt:48500,deliveryDays:`Пн, Ср, Пт (до 11:00)`},{id:`sup-2`,name:`Хорека Логистик`,category:`Сыры, молочная продукция`,phone:`+7 (383) 220-11-88`,contactPerson:`Елена Белова`,debt:12400,deliveryDays:`Вторник, Четверг`},{id:`sup-3`,name:`Восточный Экспресс`,category:`Рис, соусы, водоросли, специи`,phone:`+7 (383) 299-44-33`,contactPerson:`Алексей Чэнь`,debt:0,deliveryDays:`По заявке (1 день)`},{id:`sup-4`,name:`ЭкоУпаковка Сибирь`,category:`Контейнеры, пакеты, палочки`,phone:`+7 (383) 345-67-89`,contactPerson:`Мария Семенова`,debt:3200,deliveryDays:`Среда`}],he=[{id:`PO-901`,supplierName:`СибРыбТорг`,date:`10.09.2026`,itemsCount:3,totalAmount:48500,status:`in_transit`,deliveryEta:`Сегодня к 15:30`},{id:`PO-900`,supplierName:`Хорека Логистик`,date:`09.09.2026`,itemsCount:2,totalAmount:23600,status:`received`,deliveryEta:`Получен 09.09`},{id:`PO-899`,supplierName:`Восточный Экспресс`,date:`08.09.2026`,itemsCount:5,totalAmount:38400,status:`received`,deliveryEta:`Получен 08.09`},{id:`PO-902`,supplierName:`ЭкоУпаковка Сибирь`,date:`10.09.2026`,itemsCount:4,totalAmount:14200,status:`sent`,deliveryEta:`Завтра к 12:00`}],$=()=>{let[e]=(0,J.useState)(Q),[t,r]=(0,J.useState)(he),[a,o]=(0,J.useState)(`orders`),[l,d]=(0,J.useState)(!1),[f,p]=(0,J.useState)(Q[0].name),[m,h]=(0,J.useState)(`25000`),[g,_]=(0,J.useState)(`3`),[v,y]=(0,J.useState)(`Завтра к 11:00`),b=e.reduce((e,t)=>e+t.debt,0),x=e=>{e.preventDefault();let n={id:`PO-${Math.floor(903+Math.random()*90)}`,supplierName:f,date:new Date().toLocaleDateString(`ru-RU`),itemsCount:Number(g)||1,totalAmount:Number(m)||0,status:`sent`,deliveryEta:v};r([n,...t]),d(!1)},C=e=>{switch(e){case`received`:return(0,Y.jsx)(i,{variant:`green`,size:`sm`,children:`Принят на склад`});case`in_transit`:return(0,Y.jsx)(i,{variant:`info`,size:`sm`,children:`В пути / Доставка`});case`sent`:return(0,Y.jsx)(i,{variant:`gold`,size:`sm`,children:`Отправлен поставщику`});default:return(0,Y.jsx)(i,{variant:`neutral`,size:`sm`,children:`Черновик`})}};return(0,Y.jsxs)(`div`,{className:`space-y-4 animate-fade-in`,children:[(0,Y.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,Y.jsxs)(`div`,{children:[(0,Y.jsx)(`h2`,{className:`text-sm font-bold text-krona-primary`,children:`Закупки, заказы поставщикам и приходные накладные`}),(0,Y.jsx)(`p`,{className:`text-xs text-krona-secondary`,children:`Управление контрагентами, графиками поставок сырья и расчетами`})]}),(0,Y.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,Y.jsxs)(`div`,{className:`flex items-center bg-krona-workspace p-1 rounded-lg border border-krona-border text-xs`,children:[(0,Y.jsxs)(`button`,{onClick:()=>o(`orders`),className:`px-3 py-1 rounded font-medium transition-colors ${a===`orders`?`bg-[#2F684C] text-white shadow-sm`:`text-krona-secondary`}`,children:[`Заказы (`,t.length,`)`]}),(0,Y.jsxs)(`button`,{onClick:()=>o(`suppliers`),className:`px-3 py-1 rounded font-medium transition-colors ${a===`suppliers`?`bg-[#2F684C] text-white shadow-sm`:`text-krona-secondary`}`,children:[`Поставщики (`,e.length,`)`]})]}),(0,Y.jsxs)(n,{variant:`primary`,size:`sm`,onClick:()=>d(!0),children:[(0,Y.jsx)(M,{className:`w-3.5 h-3.5 mr-1`}),`Новый заказ поставщику`]})]})]}),(0,Y.jsxs)(`div`,{className:`grid grid-cols-1 sm:grid-cols-3 gap-3.5`,children:[(0,Y.jsx)(E,{title:`Задолженность перед поставщиками`,value:N(b),change:{value:`-12%`,trend:`neutral`},subtitle:`Срок оплаты: до 15.09`,icon:(0,Y.jsx)(c,{className:`w-4 h-4 text-krona-gold`})}),(0,Y.jsx)(E,{title:`Заказов в пути`,value:`${t.filter(e=>e.status===`in_transit`).length} поставки`,subtitle:`Ожидаются сегодня`,icon:(0,Y.jsx)(u,{className:`w-4 h-4 text-krona-info`})}),(0,Y.jsx)(E,{title:`Активных поставщиков`,value:`${e.length} контрагента`,subtitle:`Регулярные поставки сырья`,icon:(0,Y.jsx)(s,{className:`w-4 h-4 text-krona-green`})})]}),a===`orders`?(0,Y.jsxs)(`div`,{className:`bg-krona-surface border border-krona-border rounded-xl shadow-krona-soft overflow-hidden p-4 space-y-3`,children:[(0,Y.jsx)(`h4`,{className:`text-xs font-bold text-krona-primary uppercase tracking-wider`,children:`Журнал заказов поставщикам`}),(0,Y.jsx)(`div`,{className:`overflow-x-auto`,children:(0,Y.jsxs)(`table`,{className:`w-full text-left text-xs border-collapse`,children:[(0,Y.jsx)(`thead`,{className:`bg-krona-workspace/80 text-krona-secondary border-b border-krona-border`,children:(0,Y.jsxs)(`tr`,{children:[(0,Y.jsx)(`th`,{className:`p-3 font-semibold`,children:`Номер заказа`}),(0,Y.jsx)(`th`,{className:`p-3 font-semibold`,children:`Поставщик`}),(0,Y.jsx)(`th`,{className:`p-3 font-semibold`,children:`Дата`}),(0,Y.jsx)(`th`,{className:`p-3 font-semibold`,children:`Позиций сырья`}),(0,Y.jsx)(`th`,{className:`p-3 font-semibold`,children:`Сумма заказа`}),(0,Y.jsx)(`th`,{className:`p-3 font-semibold`,children:`Ожидаемая поставка`}),(0,Y.jsx)(`th`,{className:`p-3 font-semibold`,children:`Статус`})]})}),(0,Y.jsx)(`tbody`,{className:`divide-y divide-krona-border/50`,children:t.map(e=>(0,Y.jsxs)(`tr`,{className:`hover:bg-krona-workspace/50 transition-colors`,children:[(0,Y.jsx)(`td`,{className:`p-3 font-mono font-bold text-krona-primary`,children:e.id}),(0,Y.jsx)(`td`,{className:`p-3 font-medium text-krona-primary`,children:e.supplierName}),(0,Y.jsx)(`td`,{className:`p-3 text-krona-secondary`,children:e.date}),(0,Y.jsxs)(`td`,{className:`p-3 text-krona-secondary`,children:[e.itemsCount,` наим.`]}),(0,Y.jsx)(`td`,{className:`p-3 font-bold text-krona-primary`,children:N(e.totalAmount)}),(0,Y.jsx)(`td`,{className:`p-3 text-krona-secondary`,children:e.deliveryEta}),(0,Y.jsx)(`td`,{className:`p-3`,children:C(e.status)})]},e.id))})]})})]}):(0,Y.jsx)(`div`,{className:`grid grid-cols-1 md:grid-cols-2 gap-4`,children:e.map(e=>(0,Y.jsxs)(`div`,{className:`p-4 rounded-xl border border-krona-border bg-krona-surface shadow-krona-soft space-y-3`,children:[(0,Y.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,Y.jsxs)(`div`,{children:[(0,Y.jsx)(`h4`,{className:`text-sm font-bold text-krona-primary`,children:e.name}),(0,Y.jsx)(`span`,{className:`text-xs text-krona-secondary`,children:e.category})]}),e.debt>0?(0,Y.jsxs)(i,{variant:`warning`,size:`sm`,children:[`Долг: `,N(e.debt)]}):(0,Y.jsx)(i,{variant:`green`,size:`sm`,children:`Сверено (0 ₽)`})]}),(0,Y.jsxs)(`div`,{className:`space-y-1 text-xs text-krona-secondary pt-1 border-t border-krona-border/40`,children:[(0,Y.jsxs)(`div`,{className:`flex justify-between`,children:[(0,Y.jsx)(`span`,{children:`Контактное лицо:`}),(0,Y.jsx)(`span`,{className:`font-medium text-krona-primary`,children:e.contactPerson})]}),(0,Y.jsxs)(`div`,{className:`flex justify-between`,children:[(0,Y.jsx)(`span`,{children:`Телефон:`}),(0,Y.jsx)(`span`,{className:`font-mono text-krona-primary`,children:e.phone})]}),(0,Y.jsxs)(`div`,{className:`flex justify-between`,children:[(0,Y.jsx)(`span`,{children:`Дни доставки:`}),(0,Y.jsx)(`span`,{className:`text-krona-primary`,children:e.deliveryDays})]})]})]},e.id))}),l&&(0,Y.jsx)(A,{isOpen:l,onClose:()=>d(!1),title:`Новый заказ поставщику`,subtitle:`Формирование заявки на поставку сырья и материалов`,maxWidth:`sm`,children:(0,Y.jsxs)(`form`,{onSubmit:x,className:`space-y-3 text-xs`,children:[(0,Y.jsxs)(`div`,{className:`flex flex-col gap-1.5 text-left`,children:[(0,Y.jsx)(`label`,{className:`text-xs font-medium text-krona-secondary`,children:`Поставщик`}),(0,Y.jsx)(`select`,{value:f,onChange:e=>p(e.target.value),className:`w-full bg-krona-surface border border-krona-border rounded-md px-3 py-2 text-xs text-krona-primary`,children:e.map(e=>(0,Y.jsxs)(`option`,{value:e.name,children:[e.name,` (`,e.category,`)`]},e.id))})]}),(0,Y.jsx)(S,{label:`Количество позиций в заявке`,type:`number`,value:g,onChange:e=>_(e.target.value),required:!0}),(0,Y.jsx)(S,{label:`Плановая сумма заказа (₽)`,type:`number`,value:m,onChange:e=>h(e.target.value),required:!0}),(0,Y.jsx)(S,{label:`Желаемый срок доставки`,value:v,onChange:e=>y(e.target.value),placeholder:`Завтра к 10:00`,required:!0}),(0,Y.jsxs)(`div`,{className:`pt-2 flex justify-end gap-2`,children:[(0,Y.jsx)(n,{type:`button`,variant:`secondary`,onClick:()=>d(!1),children:`Отмена`}),(0,Y.jsx)(n,{type:`submit`,variant:`primary`,children:`Отправить заказ`})]})]})})]})},ge=[{id:`b1`,name:`Пост 1 (Мойка + Детейлинг)`,type:`Моечный пост`,status:`busy`,vehicleOrMaster:`BMW X5 (А001АА 154)`,orderNumber:`WO-880`,timeRemaining:`12 мин`,workOrderType:`Комплекс Люкс`},{id:`b2`,name:`Пост 2 (Подъёмник гидравлический)`,type:`Слесарный пост`,status:`busy`,vehicleOrMaster:`Toyota Land Cruiser (Р777УУ 154)`,orderNumber:`WO-881`,timeRemaining:`25 мин`,workOrderType:`Замена масла + колодки`},{id:`b3`,name:`Пост 3 (Подъёмник 4-стоечный / Сход-развал)`,type:`Сход-развал`,status:`free`},{id:`b4`,name:`Пост 4 (Детейлинг бокс / Керамика)`,type:`Детейлинг`,status:`busy`,vehicleOrMaster:`Porsche Cayenne (В500ВВ 154)`,orderNumber:`WO-882`,timeRemaining:`45 мин`,workOrderType:`Керамика кузова`},{id:`b5`,name:`Пост 5 (Быстрая мойка кузова)`,type:`Моечный пост`,status:`free`},{id:`b6`,name:`Пост 6 (Шиномонтаж / Балансировка)`,type:`Шиномонтаж`,status:`free`}],_e=()=>{let{getActiveProfile:e,setIsQuickActionsOpen:t}=O(),r=e(),a=T();return(0,Y.jsxs)(`div`,{className:`space-y-4 animate-fade-in`,children:[(0,Y.jsxs)(`div`,{className:`flex items-center justify-between bg-krona-surface p-3.5 rounded-xl border border-krona-border shadow-krona-soft`,children:[(0,Y.jsxs)(`div`,{children:[(0,Y.jsxs)(`h2`,{className:`text-sm font-bold text-krona-primary`,children:[`Посты, подъемники и рабочие зоны (`,r.terminology.bookingResourceLabel,`)`]}),(0,Y.jsx)(`p`,{className:`text-xs text-krona-secondary`,children:`Мониторинг загрузки постов, времени обслуживания и закрепленных заказ-нарядов`})]}),(0,Y.jsxs)(n,{variant:`primary`,size:`sm`,onClick:()=>t(!0),children:[(0,Y.jsx)(M,{className:`w-3.5 h-3.5 mr-1`}),`Заезд на пост`]})]}),(0,Y.jsx)(`div`,{className:`grid grid-cols-1 md:grid-cols-3 gap-4`,children:ge.map(e=>{let r=e.status===`busy`;return(0,Y.jsxs)(`div`,{className:`p-4 rounded-xl border shadow-krona-soft flex flex-col justify-between space-y-3 transition-all ${r?`border-krona-gold/60 bg-krona-surface`:`border-krona-border bg-krona-surface/60 opacity-90`}`,children:[(0,Y.jsxs)(`div`,{children:[(0,Y.jsxs)(`div`,{className:`flex items-center justify-between mb-2`,children:[(0,Y.jsx)(`span`,{className:`font-bold text-xs text-krona-primary`,children:e.name}),(0,Y.jsx)(i,{variant:r?`gold`:`green`,size:`sm`,children:r?`Занят`:`Свободен`})]}),(0,Y.jsx)(`div`,{className:`text-[11px] text-krona-secondary mb-2`,children:e.type}),r?(0,Y.jsxs)(`div`,{className:`p-3 rounded-lg bg-krona-workspace space-y-1.5 text-xs`,children:[(0,Y.jsxs)(`div`,{className:`flex items-center gap-1.5 font-bold text-krona-primary`,children:[(0,Y.jsx)(m,{className:`w-3.5 h-3.5 text-krona-info`}),(0,Y.jsx)(`span`,{children:e.vehicleOrMaster})]}),(0,Y.jsx)(`div`,{className:`text-krona-secondary text-[11px]`,children:e.workOrderType}),(0,Y.jsxs)(`div`,{className:`flex items-center justify-between pt-1 border-t border-krona-border/60 text-[11px]`,children:[(0,Y.jsx)(`span`,{className:`text-krona-secondary font-mono`,children:e.orderNumber}),(0,Y.jsxs)(`span`,{className:`text-krona-warning font-semibold flex items-center gap-1`,children:[(0,Y.jsx)(_,{className:`w-3 h-3`}),`Осталось `,e.timeRemaining]})]})]}):(0,Y.jsx)(`div`,{className:`py-6 text-center text-xs text-krona-secondary`,children:`Пост свободен. Готов к приему автомобиля.`})]}),(0,Y.jsx)(`div`,{className:`pt-2 border-t border-krona-border/60 flex justify-end gap-2`,children:r?(0,Y.jsx)(n,{variant:`outline`,size:`sm`,className:`w-full text-xs`,onClick:()=>a(`/operations/work-orders`),children:`Открыть заказ-наряд`}):(0,Y.jsx)(n,{variant:`primary`,size:`sm`,className:`w-full text-xs`,onClick:()=>t(!0),children:`Назначить автомобиль`})})]},e.id)})})]})},ve=()=>{let e=w(),t=T(),{getActiveProfile:r,getActiveCapabilities:a,setIsQuickActionsOpen:o,activeLocation:s}=O(),c=r(),l=a(),u=e.pathname;return u===`/operations/pos`?(0,Y.jsx)(le,{}):u===`/operations/kds`?(0,Y.jsx)(ue,{}):u===`/operations/dining`?(0,Y.jsx)(de,{}):u===`/operations/work-orders`?(0,Y.jsx)(Z,{}):u===`/operations/booking`?(0,Y.jsx)(fe,{}):u===`/operations/delivery`?(0,Y.jsx)(pe,{}):u===`/operations/courier`?(0,Y.jsx)(pe,{initialMobile:!0}):u===`/operations/recipes`?(0,Y.jsx)(me,{}):u===`/operations/inventory`?(0,Y.jsx)(ie,{}):u===`/operations/orders`?(0,Y.jsx)(I,{}):u===`/operations/purchasing`?(0,Y.jsx)($,{}):u===`/operations/bays`?(0,Y.jsx)(_e,{}):u===`/operations/catalog`?(0,Y.jsxs)(`div`,{className:`space-y-4 animate-fade-in`,children:[(0,Y.jsxs)(`div`,{className:`flex items-center justify-between bg-krona-surface p-3.5 rounded-xl border border-krona-border shadow-krona-soft`,children:[(0,Y.jsxs)(`div`,{children:[(0,Y.jsxs)(`h2`,{className:`text-sm font-bold text-krona-primary`,children:[c.terminology.itemsLabel,` (`,s,`)`]}),(0,Y.jsx)(`p`,{className:`text-xs text-krona-secondary`,children:`Управление ассортиментом, ценами продажи, себестоимостью и стоп-листом`})]}),(0,Y.jsxs)(n,{variant:`primary`,size:`sm`,onClick:()=>o(!0),children:[`+ Добавить `,c.terminology.itemLabel.toLowerCase()]})]}),(0,Y.jsx)(`div`,{className:`bg-krona-surface border border-krona-border rounded-xl shadow-krona-soft overflow-hidden`,children:(0,Y.jsxs)(`table`,{className:`w-full text-left text-xs border-collapse`,children:[(0,Y.jsx)(`thead`,{className:`bg-krona-workspace/80 text-krona-secondary border-b border-krona-border`,children:(0,Y.jsxs)(`tr`,{children:[(0,Y.jsx)(`th`,{className:`p-3 font-semibold`,children:`Наименование`}),(0,Y.jsx)(`th`,{className:`p-3 font-semibold`,children:`Категория`}),(0,Y.jsx)(`th`,{className:`p-3 font-semibold`,children:`Цена продажи`}),(0,Y.jsx)(`th`,{className:`p-3 font-semibold`,children:`Себестоимость`}),(0,Y.jsx)(`th`,{className:`p-3 font-semibold`,children:`Маржа %`}),(0,Y.jsx)(`th`,{className:`p-3 font-semibold text-center`,children:`Статус в меню`})]})}),(0,Y.jsx)(`tbody`,{className:`divide-y divide-krona-border/50`,children:F.map(e=>(0,Y.jsxs)(`tr`,{className:`hover:bg-krona-workspace/50 transition-colors`,children:[(0,Y.jsxs)(`td`,{className:`p-3 font-medium text-krona-primary`,children:[(0,Y.jsx)(`div`,{children:e.name}),e.description&&(0,Y.jsx)(`div`,{className:`text-[11px] text-krona-secondary`,children:e.description})]}),(0,Y.jsx)(`td`,{className:`p-3 text-krona-secondary`,children:e.category}),(0,Y.jsx)(`td`,{className:`p-3 font-bold text-krona-primary`,children:N(e.price)}),(0,Y.jsx)(`td`,{className:`p-3 text-krona-secondary`,children:N(e.cost)}),(0,Y.jsxs)(`td`,{className:`p-3 font-semibold text-krona-green`,children:[e.marginPercent,`%`]}),(0,Y.jsx)(`td`,{className:`p-3 text-center`,children:e.isStopListed?(0,Y.jsx)(i,{variant:`danger`,size:`sm`,children:`В стоп-листе`}):(0,Y.jsx)(i,{variant:`green`,size:`sm`,children:`Доступно`})})]},e.id))})]})})]}):(0,Y.jsxs)(`div`,{className:`space-y-4 animate-fade-in`,children:[(0,Y.jsxs)(`div`,{className:`flex flex-col sm:flex-row sm:items-center justify-between gap-3 bg-krona-surface p-4 rounded-xl border border-krona-border shadow-krona-soft`,children:[(0,Y.jsxs)(`div`,{children:[(0,Y.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,Y.jsxs)(`h1`,{className:`text-base font-bold text-krona-primary`,children:[`Операционный хаб: `,c.name]}),(0,Y.jsx)(j,{level:`target`,size:`sm`})]}),(0,Y.jsxs)(`p`,{className:`text-xs text-krona-secondary mt-0.5`,children:[`Точка: `,(0,Y.jsx)(`strong`,{className:`text-krona-primary`,children:s}),` • Отраслевой рабочий контур с быстрым доступом`]})]}),(0,Y.jsxs)(`div`,{className:`flex items-center gap-2`,children:[l.pos&&(0,Y.jsx)(n,{variant:`primary`,size:`sm`,onClick:()=>t(`/operations/pos`),children:`Открыть кассу (POS)`}),l.kds&&(0,Y.jsx)(n,{variant:`gold`,size:`sm`,onClick:()=>t(`/operations/kds`),children:`Кухонный экран (KDS)`})]})]}),(0,Y.jsx)(`div`,{className:`grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-3.5`,children:c.operationsTabs.filter(e=>e.id!==`overview`).map(e=>(0,Y.jsxs)(`div`,{onClick:()=>t(e.route),className:`p-4 rounded-xl border border-krona-border bg-krona-surface hover:border-krona-green/70 hover:shadow-krona-soft cursor-pointer transition-all space-y-2 group`,children:[(0,Y.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,Y.jsx)(`span`,{className:`font-bold text-sm text-krona-primary group-hover:text-krona-green transition-colors`,children:e.label}),e.badge&&(0,Y.jsx)(i,{variant:`gold`,size:`sm`,children:e.badge})]}),(0,Y.jsxs)(`p`,{className:`text-xs text-krona-secondary`,children:[`Перейти в рабочий экран «`,e.label,`» для текущей смены`]}),(0,Y.jsx)(`div`,{className:`text-xs text-krona-green font-medium pt-1`,children:`Открыть раздел →`})]},e.id))})]})};export{ve as OperationsModule}; \ No newline at end of file diff --git a/dist/assets/SalesModule-2VZC1D5Y.js b/dist/assets/SalesModule-2VZC1D5Y.js deleted file mode 100644 index 15b2ad7..0000000 --- a/dist/assets/SalesModule-2VZC1D5Y.js +++ /dev/null @@ -1 +0,0 @@ -import{f as e,h as t,i as n,r,s as i,t as a}from"./useToast-CS8pZhce.js";import{t as o}from"./truck-D5o8mTsH.js";import{B as s,E as c,H as ee,L as l,b as u,g as d,n as f,r as p,st as m,t as h,w as g,y as te,z as ne}from"./index-CNnq9VO5.js";import{t as re}from"./useOrders-Dp-LV7vp.js";import{t as _}from"./currency-DdDs82F5.js";import{t as v}from"./useInventory-BwKK4D-W.js";var y=t(e(),1),b=i(),x=()=>{let{showToast:e}=a(),{orders:t,products:i,payments:x,shipments:S,createOrder:C,confirmOrder:w,cancelOrder:T,createPayment:E,createShipment:ie,processReturn:ae}=re(),{warehouses:D}=v(),[O,oe]=(0,y.useState)(``),[k,se]=(0,y.useState)(`all`),[A,j]=(0,y.useState)(null),[M,N]=(0,y.useState)(!1),[P,F]=(0,y.useState)(!1),[I,L]=(0,y.useState)(!1),[R,z]=(0,y.useState)(!1),[B,V]=(0,y.useState)(``),[H,U]=(0,y.useState)(``),[W,G]=(0,y.useState)(1),[K,ce]=(0,y.useState)(`bank_transfer`),[q,J]=(0,y.useState)(`wh_main`),[Y,le]=(0,y.useState)(`Не подошел размер / брак`),X=(0,y.useMemo)(()=>A?t.find(e=>e.id===A.id)||A:null,[t,A]),Z=(0,y.useMemo)(()=>t.filter(e=>{let t=k===`all`||e.status===k,n=!O||e.orderNumber.toLowerCase().includes(O.toLowerCase())||e.customerName.toLowerCase().includes(O.toLowerCase());return t&&n}),[t,k,O]),Q=async t=>{try{await w(t,q),e(`Заказ подтвержден! Зарезервирован остаток на складе.`,`success`)}catch(t){e(`Ошибка: ${t instanceof Error?t.message:String(t)}`,`error`)}},ue=async()=>{if(X)try{await E(X.id,X.total,K,!0),F(!1),e(`Оплата успешно принята! Поступление отражено в ДДС Финансов.`,`success`)}catch(t){e(`Ошибка оплаты: ${t instanceof Error?t.message:String(t)}`,`error`)}},de=async()=>{if(X)try{await ie(X.id,q),L(!1),e(`Отгрузка сформирована! Товар списан со склада.`,`success`)}catch(t){e(`Ошибка отгрузки: ${t instanceof Error?t.message:String(t)}`,`error`)}},fe=async t=>{try{await T(t),e(`Заказ отменен. Резервы на складе освобождены.`,`info`)}catch(t){e(`Ошибка отмены: ${t instanceof Error?t.message:String(t)}`,`error`)}},pe=async()=>{if(X)try{let t=X.items.map(e=>({productId:e.productId,sku:e.sku,name:e.name,quantity:e.quantity,refundAmount:e.totalPrice}));await ae(X.id,Y,t,q,!0),z(!1),e(`Возврат оформлен! Товар возвращен на склад, расход отражен в ДДС.`,`success`)}catch(t){e(`Ошибка возврата: ${t instanceof Error?t.message:String(t)}`,`error`)}},me=async t=>{t.preventDefault();let n=i.find(e=>e.id===H)||i[0];if(!n)return;let r=n.price.minor,a=r*W,o=`ORD-${Date.now().toString().slice(-5)}`;await C({orderNumber:o,customerType:`contact`,customerId:`cnt_custom`,customerName:B||`Розничный покупатель`,status:`draft`,paymentStatus:`pending`,fulfillmentStatus:`unfulfilled`,items:[{id:`item_${Date.now()}`,productId:n.id,sku:n.sku,name:n.name,quantity:W,unitPrice:{minor:r,currency:`RUB`},discountMinor:0,totalPrice:{minor:a,currency:`RUB`}}],subtotal:{minor:a,currency:`RUB`},discountMinor:0,taxMinor:Math.round(a*.2),shippingMinor:0,total:{minor:a,currency:`RUB`},channel:`b2b`}),N(!1),V(``),G(1),e(`Заказ ${o} успешно создан`,`success`)},$=e=>{switch(e){case`confirmed`:return(0,b.jsx)(r,{variant:`gold`,size:`sm`,children:`Подтвержден (Резерв)`});case`shipped`:return(0,b.jsx)(r,{variant:`blue`,size:`sm`,children:`Отгружен со склада`});case`delivered`:return(0,b.jsx)(r,{variant:`green`,size:`sm`,children:`Доставлен`});case`cancelled`:return(0,b.jsx)(r,{variant:`danger`,size:`sm`,children:`Отменен`});default:return(0,b.jsx)(r,{variant:`gray`,size:`sm`,children:`Черновик`})}};return(0,b.jsxs)(`div`,{className:`space-y-4 animate-fade-in`,children:[(0,b.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,b.jsxs)(`div`,{children:[(0,b.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,b.jsx)(`h1`,{className:`text-sm font-bold text-krona-primary`,children:`Коммерция & Продажи: Управление Заказами`}),(0,b.jsx)(h,{level:`pilot1`,size:`sm`})]}),(0,b.jsx)(`p`,{className:`text-xs text-krona-secondary mt-0.5`,children:`Жизненный цикл заказа: Черновик → Подтверждение (резерв) → Оплата (ДДС) → Отгрузка (списание со склада) → Доставка / Возврат`})]}),(0,b.jsx)(`div`,{className:`flex items-center gap-2`,children:(0,b.jsxs)(n,{variant:`primary`,size:`sm`,onClick:()=>N(!0),children:[(0,b.jsx)(g,{className:`w-3.5 h-3.5 mr-1`}),` Новый заказ`]})})]}),(0,b.jsxs)(`div`,{className:`flex flex-col sm:flex-row sm:items-center justify-between gap-3`,children:[(0,b.jsx)(`div`,{className:`flex items-center gap-1 overflow-x-auto text-xs`,children:[{key:`all`,label:`Все заказы`},{key:`draft`,label:`Черновики`},{key:`confirmed`,label:`Подтвержденные`},{key:`shipped`,label:`Отгруженные`},{key:`delivered`,label:`Доставленные`},{key:`cancelled`,label:`Отмененные`}].map(e=>(0,b.jsx)(`button`,{onClick:()=>se(e.key),className:`px-3 py-1.5 rounded-lg font-medium transition-colors ${k===e.key?`bg-krona-green text-white shadow-sm`:`bg-krona-surface text-krona-secondary hover:text-krona-primary border border-krona-border`}`,children:e.label},e.key))}),(0,b.jsxs)(`div`,{className:`relative w-64`,children:[(0,b.jsx)(te,{className:`w-3.5 h-3.5 absolute left-2.5 top-2.5 text-krona-secondary`}),(0,b.jsx)(`input`,{type:`text`,value:O,onChange:e=>oe(e.target.value),placeholder:`Поиск по номеру или клиенту...`,className:`w-full pl-8 pr-3 py-1.5 text-xs bg-krona-surface border border-krona-border rounded-lg text-krona-primary focus:outline-none focus:border-krona-green`})]})]}),(0,b.jsx)(`div`,{className:`bg-krona-surface border border-krona-border rounded-xl shadow-krona-soft overflow-hidden`,children:(0,b.jsxs)(`table`,{className:`w-full text-xs text-left`,children:[(0,b.jsx)(`thead`,{className:`bg-krona-workspace text-krona-secondary border-b border-krona-border`,children:(0,b.jsxs)(`tr`,{children:[(0,b.jsx)(`th`,{className:`p-3 font-semibold`,children:`Номер заказа`}),(0,b.jsx)(`th`,{className:`p-3 font-semibold`,children:`Клиент`}),(0,b.jsx)(`th`,{className:`p-3 font-semibold`,children:`Позиций`}),(0,b.jsx)(`th`,{className:`p-3 font-semibold`,children:`Сумма заказа`}),(0,b.jsx)(`th`,{className:`p-3 font-semibold`,children:`Статус заказа`}),(0,b.jsx)(`th`,{className:`p-3 font-semibold`,children:`Оплата`}),(0,b.jsx)(`th`,{className:`p-3 font-semibold`,children:`Складской статус`}),(0,b.jsx)(`th`,{className:`p-3 font-semibold text-right`,children:`Действие`})]})}),(0,b.jsxs)(`tbody`,{className:`divide-y divide-krona-border`,children:[Z.map(e=>(0,b.jsxs)(`tr`,{"data-testid":`order-row-${e.id}`,onClick:()=>j(e),className:`hover:bg-krona-workspace/50 cursor-pointer transition-colors`,children:[(0,b.jsx)(`td`,{className:`p-3 font-mono font-bold text-krona-primary`,children:e.orderNumber}),(0,b.jsx)(`td`,{className:`p-3 font-medium text-krona-primary`,children:e.customerName}),(0,b.jsxs)(`td`,{className:`p-3 text-krona-secondary`,children:[e.items.length,` поз.`]}),(0,b.jsx)(`td`,{className:`p-3 font-bold text-krona-green`,children:_(e.total.minor)}),(0,b.jsx)(`td`,{className:`p-3`,children:$(e.status)}),(0,b.jsx)(`td`,{className:`p-3`,children:(0,b.jsx)(r,{variant:e.paymentStatus===`paid`?`green`:e.paymentStatus===`refunded`?`danger`:`warning`,size:`sm`,children:e.paymentStatus===`paid`?`Оплачен`:e.paymentStatus===`refunded`?`Возврат`:`Ожидает оплаты`})}),(0,b.jsx)(`td`,{className:`p-3`,children:(0,b.jsx)(r,{variant:e.fulfillmentStatus===`fulfilled`?`green`:e.fulfillmentStatus===`returned`?`danger`:`gray`,size:`sm`,children:e.fulfillmentStatus===`fulfilled`?`Отгружен`:e.fulfillmentStatus===`returned`?`Возвращен`:`Не отгружен`})}),(0,b.jsx)(`td`,{className:`p-3 text-right`,children:(0,b.jsxs)(n,{variant:`ghost`,size:`sm`,children:[`Управление `,(0,b.jsx)(ee,{className:`w-3.5 h-3.5 ml-1`})]})})]},e.id)),Z.length===0&&(0,b.jsx)(`tr`,{children:(0,b.jsx)(`td`,{colSpan:8,className:`p-8 text-center text-krona-secondary text-xs italic`,children:`Заказы не найдены`})})]})]})}),(0,b.jsx)(f,{isOpen:!!X,onClose:()=>j(null),title:X?`Заказ ${X.orderNumber}`:``,size:`lg`,children:X&&(0,b.jsxs)(`div`,{className:`space-y-5 text-xs`,children:[(0,b.jsxs)(`div`,{className:`p-3.5 bg-krona-workspace rounded-xl border border-krona-border space-y-3`,children:[(0,b.jsx)(`div`,{className:`text-[11px] font-bold uppercase text-krona-secondary tracking-wider`,children:`Управление жизненным циклом заказа:`}),(0,b.jsxs)(`div`,{className:`flex flex-wrap items-center gap-2`,children:[X.status===`draft`&&(0,b.jsxs)(n,{variant:`primary`,size:`sm`,"data-testid":`confirm-order-btn`,onClick:()=>Q(X.id),children:[(0,b.jsx)(s,{className:`w-3.5 h-3.5 mr-1`}),` Подтвердить заказ (Резерв на складе)`]}),X.paymentStatus===`pending`&&X.status!==`cancelled`&&(0,b.jsxs)(n,{variant:`gold`,size:`sm`,"data-testid":`record-payment-btn`,onClick:()=>F(!0),children:[(0,b.jsx)(l,{className:`w-3.5 h-3.5 mr-1`}),` Зафиксировать оплату (ДДС)`]}),(X.status===`confirmed`||X.paymentStatus===`paid`)&&X.fulfillmentStatus===`unfulfilled`&&X.status!==`cancelled`&&(0,b.jsxs)(n,{variant:`primary`,size:`sm`,"data-testid":`create-shipment-btn`,onClick:()=>L(!0),children:[(0,b.jsx)(o,{className:`w-3.5 h-3.5 mr-1`}),` Сформировать отгрузку (Списать со склада)`]}),X.status===`shipped`&&(0,b.jsxs)(n,{variant:`secondary`,size:`sm`,onClick:()=>Q(X.id),children:[(0,b.jsx)(s,{className:`w-3.5 h-3.5 mr-1`}),` Доставлен покупателю`]}),X.fulfillmentStatus===`fulfilled`&&(0,b.jsxs)(n,{variant:`secondary`,size:`sm`,onClick:()=>z(!0),children:[(0,b.jsx)(u,{className:`w-3.5 h-3.5 mr-1 text-rose-500`}),` Оформить возврат (Возврат на склад & ДДС)`]}),X.status!==`cancelled`&&X.status!==`shipped`&&X.fulfillmentStatus!==`fulfilled`&&(0,b.jsxs)(n,{variant:`ghost`,size:`sm`,className:`text-rose-600 hover:text-rose-700 hover:bg-rose-500/10 ml-auto`,onClick:()=>fe(X.id),children:[(0,b.jsx)(ne,{className:`w-3.5 h-3.5 mr-1`}),` Отменить заказ (Снять резерв)`]})]})]}),(0,b.jsxs)(`div`,{className:`grid grid-cols-2 sm:grid-cols-4 gap-3 bg-krona-surface p-3.5 rounded-xl border border-krona-border`,children:[(0,b.jsxs)(`div`,{children:[(0,b.jsx)(`span`,{className:`text-krona-secondary`,children:`Клиент:`}),(0,b.jsx)(`div`,{className:`font-bold text-krona-primary mt-0.5`,children:X.customerName})]}),(0,b.jsxs)(`div`,{children:[(0,b.jsx)(`span`,{className:`text-krona-secondary`,children:`Сумма:`}),(0,b.jsx)(`div`,{className:`font-bold text-krona-green mt-0.5`,children:_(X.total.minor)})]}),(0,b.jsxs)(`div`,{children:[(0,b.jsx)(`span`,{className:`text-krona-secondary`,children:`Статус заказа:`}),(0,b.jsx)(`div`,{className:`mt-0.5`,children:$(X.status)})]}),(0,b.jsxs)(`div`,{children:[(0,b.jsx)(`span`,{className:`text-krona-secondary`,children:`Оплата:`}),(0,b.jsx)(`div`,{className:`mt-0.5`,children:(0,b.jsx)(r,{variant:X.paymentStatus===`paid`?`green`:`warning`,size:`sm`,children:X.paymentStatus})})]})]}),(0,b.jsxs)(`div`,{children:[(0,b.jsxs)(`div`,{className:`font-bold text-krona-primary mb-2 flex items-center gap-1.5`,children:[(0,b.jsx)(c,{className:`w-4 h-4 text-krona-secondary`}),` Состав заказа:`]}),(0,b.jsx)(`div`,{className:`border border-krona-border rounded-lg overflow-hidden`,children:(0,b.jsxs)(`table`,{className:`w-full text-xs text-left`,children:[(0,b.jsx)(`thead`,{className:`bg-krona-workspace text-krona-secondary border-b border-krona-border`,children:(0,b.jsxs)(`tr`,{children:[(0,b.jsx)(`th`,{className:`p-2.5 font-semibold`,children:`Артикул`}),(0,b.jsx)(`th`,{className:`p-2.5 font-semibold`,children:`Наименование`}),(0,b.jsx)(`th`,{className:`p-2.5 font-semibold`,children:`Кол-во`}),(0,b.jsx)(`th`,{className:`p-2.5 font-semibold`,children:`Цена за ед.`}),(0,b.jsx)(`th`,{className:`p-2.5 font-semibold text-right`,children:`Сумма`})]})}),(0,b.jsx)(`tbody`,{className:`divide-y divide-krona-border`,children:X.items.map(e=>(0,b.jsxs)(`tr`,{children:[(0,b.jsx)(`td`,{className:`p-2.5 font-mono text-krona-secondary`,children:e.sku}),(0,b.jsx)(`td`,{className:`p-2.5 font-medium text-krona-primary`,children:e.name}),(0,b.jsxs)(`td`,{className:`p-2.5 font-bold`,children:[e.quantity,` шт.`]}),(0,b.jsx)(`td`,{className:`p-2.5 text-krona-secondary`,children:_(e.unitPrice.minor)}),(0,b.jsx)(`td`,{className:`p-2.5 font-bold text-krona-primary text-right`,children:_(e.totalPrice.minor)})]},e.id))})]})})]}),(0,b.jsxs)(`div`,{className:`p-3 bg-krona-workspace rounded-lg border border-krona-border space-y-1.5`,children:[(0,b.jsxs)(`div`,{className:`flex justify-between text-krona-secondary`,children:[(0,b.jsx)(`span`,{children:`Промежуточный итог:`}),(0,b.jsx)(`span`,{children:_(X.subtotal.minor)})]}),(0,b.jsxs)(`div`,{className:`flex justify-between text-krona-secondary`,children:[(0,b.jsx)(`span`,{children:`НДС (20%):`}),(0,b.jsx)(`span`,{children:_(X.taxMinor)})]}),(0,b.jsxs)(`div`,{className:`flex justify-between font-bold text-sm text-krona-primary border-t border-krona-border pt-1`,children:[(0,b.jsx)(`span`,{children:`Итого к оплате:`}),(0,b.jsx)(`span`,{className:`text-krona-green`,children:_(X.total.minor)})]})]}),(0,b.jsxs)(`div`,{className:`space-y-2`,children:[(0,b.jsx)(`div`,{className:`font-bold text-krona-primary`,children:`Связанные документы:`}),(0,b.jsxs)(`div`,{className:`grid grid-cols-1 sm:grid-cols-2 gap-2 text-[11px]`,children:[x.filter(e=>e.orderId===X.id).map(e=>(0,b.jsxs)(`div`,{className:`p-2.5 rounded-lg border border-krona-border bg-emerald-500/5 flex items-center justify-between`,children:[(0,b.jsxs)(`div`,{children:[(0,b.jsxs)(`div`,{className:`font-bold text-emerald-700 dark:text-emerald-300`,children:[`Оплата `,e.transactionId]}),(0,b.jsxs)(`div`,{className:`text-krona-secondary`,children:[e.method,` • `,m(e.paidAt)]})]}),(0,b.jsx)(`span`,{className:`font-bold text-krona-green`,children:_(e.amount.minor)})]},e.id)),S.filter(e=>e.orderId===X.id).map(e=>(0,b.jsxs)(`div`,{className:`p-2.5 rounded-lg border border-krona-border bg-blue-500/5 flex items-center justify-between`,children:[(0,b.jsxs)(`div`,{children:[(0,b.jsxs)(`div`,{className:`font-bold text-blue-700 dark:text-blue-300`,children:[`Отгрузка `,e.trackingNumber]}),(0,b.jsxs)(`div`,{className:`text-krona-secondary`,children:[e.carrier,` • `,e.items.length,` поз.`]})]}),(0,b.jsx)(r,{variant:`blue`,size:`sm`,children:e.status})]},e.id))]})]})]})}),(0,b.jsx)(p,{isOpen:P,onClose:()=>F(!1),title:`Зафиксировать оплату по заказу`,size:`md`,children:X&&(0,b.jsxs)(`div`,{className:`space-y-4 text-xs`,children:[(0,b.jsxs)(`p`,{className:`text-krona-secondary`,children:[`Оплата заказа `,(0,b.jsx)(`strong`,{className:`text-krona-primary`,children:X.orderNumber}),` на сумму`,` `,(0,b.jsx)(`strong`,{className:`text-krona-green`,children:_(X.total.minor)}),`. Поступление денежных средств будет мгновенно отражено в модуле Финансы (ДДС) и увеличит остаток расчетного счета.`]}),(0,b.jsxs)(`div`,{children:[(0,b.jsx)(`label`,{className:`block font-semibold text-krona-primary mb-1`,children:`Способ оплаты:`}),(0,b.jsxs)(`select`,{value:K,onChange:e=>ce(e.target.value),className:`w-full px-3 py-1.5 bg-krona-workspace border border-krona-border rounded-lg text-krona-primary`,children:[(0,b.jsx)(`option`,{value:`bank_transfer`,children:`Безналичный расчет (Счет)`}),(0,b.jsx)(`option`,{value:`card`,children:`Банковская карта (Эквайринг)`}),(0,b.jsx)(`option`,{value:`online`,children:`СБП / Онлайн`}),(0,b.jsx)(`option`,{value:`cash`,children:`Наличные в кассу`})]})]}),(0,b.jsxs)(`div`,{className:`flex justify-end gap-2 pt-2 border-t border-krona-border`,children:[(0,b.jsx)(n,{variant:`secondary`,size:`sm`,onClick:()=>F(!1),children:`Отмена`}),(0,b.jsxs)(n,{variant:`primary`,size:`sm`,"data-testid":`submit-payment-btn`,onClick:ue,children:[(0,b.jsx)(l,{className:`w-3.5 h-3.5 mr-1`}),` Провести платеж`]})]})]})}),(0,b.jsx)(p,{isOpen:I,onClose:()=>L(!1),title:`Формирование складской отгрузки`,size:`md`,children:X&&(0,b.jsxs)(`div`,{className:`space-y-4 text-xs`,children:[(0,b.jsxs)(`p`,{className:`text-krona-secondary`,children:[`Формирование накладной на отгрузку для заказа `,(0,b.jsx)(`strong`,{className:`text-krona-primary`,children:X.orderNumber}),`. При отгрузке зарезервированные товары будут списаны с физического складского остатка.`]}),(0,b.jsxs)(`div`,{children:[(0,b.jsx)(`label`,{className:`block font-semibold text-krona-primary mb-1`,children:`Склад списания:`}),(0,b.jsx)(`select`,{value:q,onChange:e=>J(e.target.value),className:`w-full px-3 py-1.5 bg-krona-workspace border border-krona-border rounded-lg text-krona-primary`,children:D.map(e=>(0,b.jsxs)(`option`,{value:e.id,children:[e.name,` (`,e.address,`)`]},e.id))})]}),(0,b.jsxs)(`div`,{className:`flex justify-end gap-2 pt-2 border-t border-krona-border`,children:[(0,b.jsx)(n,{variant:`secondary`,size:`sm`,onClick:()=>L(!1),children:`Отмена`}),(0,b.jsxs)(n,{variant:`primary`,size:`sm`,"data-testid":`submit-shipment-btn`,onClick:de,children:[(0,b.jsx)(o,{className:`w-3.5 h-3.5 mr-1`}),` Сформировать отгрузку`]})]})]})}),(0,b.jsx)(p,{isOpen:R,onClose:()=>z(!1),title:`Оформление возврата товара`,size:`md`,children:X&&(0,b.jsxs)(`div`,{className:`space-y-4 text-xs`,children:[(0,b.jsxs)(`div`,{className:`p-3 bg-rose-500/10 border border-rose-500/30 rounded-lg text-rose-800 dark:text-rose-300`,children:[`При возврате товара остаток на складе будет автоматически восстановлен, а в модуле Финансы (ДДС) сформируется выплата возврата клиенту на сумму `,(0,b.jsx)(`strong`,{className:`font-bold`,children:_(X.total.minor)}),`.`]}),(0,b.jsxs)(`div`,{children:[(0,b.jsx)(`label`,{className:`block font-semibold text-krona-primary mb-1`,children:`Причина возврата:`}),(0,b.jsx)(`input`,{type:`text`,value:Y,onChange:e=>le(e.target.value),className:`w-full px-3 py-1.5 bg-krona-workspace border border-krona-border rounded-lg text-krona-primary`})]}),(0,b.jsxs)(`div`,{children:[(0,b.jsx)(`label`,{className:`block font-semibold text-krona-primary mb-1`,children:`Склад возврата:`}),(0,b.jsx)(`select`,{value:q,onChange:e=>J(e.target.value),className:`w-full px-3 py-1.5 bg-krona-workspace border border-krona-border rounded-lg text-krona-primary`,children:D.map(e=>(0,b.jsx)(`option`,{value:e.id,children:e.name},e.id))})]}),(0,b.jsxs)(`div`,{className:`flex justify-end gap-2 pt-2 border-t border-krona-border`,children:[(0,b.jsx)(n,{variant:`secondary`,size:`sm`,onClick:()=>z(!1),children:`Отмена`}),(0,b.jsxs)(n,{variant:`danger`,size:`sm`,onClick:pe,children:[(0,b.jsx)(u,{className:`w-3.5 h-3.5 mr-1`}),` Провести возврат`]})]})]})}),(0,b.jsx)(p,{isOpen:M,onClose:()=>N(!1),title:`Создание нового коммерческого заказа`,size:`md`,children:(0,b.jsxs)(`form`,{onSubmit:me,className:`space-y-4 text-xs`,children:[(0,b.jsxs)(`div`,{children:[(0,b.jsx)(`label`,{className:`block font-semibold text-krona-primary mb-1`,children:`Клиент (ФИО или название компании):`}),(0,b.jsx)(`input`,{type:`text`,required:!0,placeholder:`Например: ООО «СеверТорг» или Иванов Иван`,value:B,onChange:e=>V(e.target.value),className:`w-full px-3 py-1.5 bg-krona-workspace border border-krona-border rounded-lg text-krona-primary`})]}),(0,b.jsxs)(`div`,{children:[(0,b.jsx)(`label`,{className:`block font-semibold text-krona-primary mb-1`,children:`Товарная позиция:`}),(0,b.jsx)(`select`,{value:H,onChange:e=>U(e.target.value),className:`w-full px-3 py-1.5 bg-krona-workspace border border-krona-border rounded-lg text-krona-primary`,children:i.map(e=>(0,b.jsxs)(`option`,{value:e.id,children:[e.name,` — `,_(e.price.minor)]},e.id))})]}),(0,b.jsxs)(`div`,{children:[(0,b.jsx)(`label`,{className:`block font-semibold text-krona-primary mb-1`,children:`Количество (шт.):`}),(0,b.jsx)(`input`,{type:`number`,min:1,value:W,onChange:e=>G(Number(e.target.value)||1),className:`w-32 px-3 py-1.5 bg-krona-workspace border border-krona-border rounded-lg text-krona-primary`})]}),(0,b.jsxs)(`div`,{className:`flex justify-end gap-2 pt-2 border-t border-krona-border`,children:[(0,b.jsx)(n,{variant:`secondary`,size:`sm`,type:`button`,onClick:()=>N(!1),children:`Отмена`}),(0,b.jsxs)(n,{variant:`primary`,size:`sm`,type:`submit`,children:[(0,b.jsx)(d,{className:`w-3.5 h-3.5 mr-1`}),` Создать заказ`]})]})]})})]})};export{x as SalesModule}; \ No newline at end of file diff --git a/dist/assets/SalesModule-Cf0nSO8B.js b/dist/assets/SalesModule-Cf0nSO8B.js new file mode 100644 index 0000000..d67f90e --- /dev/null +++ b/dist/assets/SalesModule-Cf0nSO8B.js @@ -0,0 +1 @@ +import{f as e,h as t,i as n,r,s as i,t as a}from"./useToast-CS8pZhce.js";import{t as o}from"./truck-D5o8mTsH.js";import{D as s,H as c,R as l,T as ee,V as te,W as u,_ as d,b as f,lt as ne,n as re,r as p,t as m,x as h}from"./index-CrJKtV0u.js";import{t as ie}from"./useOrders-TRZWcao8.js";import{t as g}from"./currency-DdDs82F5.js";import{t as ae}from"./useInventory-C7Fo8GE1.js";var _=t(e(),1),v=i(),y=()=>{let{showToast:e}=a(),{orders:t,products:i,payments:y,shipments:b,createOrder:x,confirmOrder:S,cancelOrder:C,createPayment:w,createShipment:T,processReturn:E}=ie(),{warehouses:D}=ae(),[O,oe]=(0,_.useState)(``),[k,se]=(0,_.useState)(`all`),[A,j]=(0,_.useState)(null),[M,N]=(0,_.useState)(!1),[P,F]=(0,_.useState)(!1),[I,L]=(0,_.useState)(!1),[R,z]=(0,_.useState)(!1),[B,V]=(0,_.useState)(``),[H,U]=(0,_.useState)(``),[W,G]=(0,_.useState)(1),[K,ce]=(0,_.useState)(`bank_transfer`),[q,J]=(0,_.useState)(`wh_main`),[Y,le]=(0,_.useState)(`Не подошел размер / брак`),X=(0,_.useMemo)(()=>A?t.find(e=>e.id===A.id)||A:null,[t,A]),Z=(0,_.useMemo)(()=>t.filter(e=>{let t=k===`all`||e.status===k,n=!O||e.orderNumber.toLowerCase().includes(O.toLowerCase())||e.customerName.toLowerCase().includes(O.toLowerCase());return t&&n}),[t,k,O]),Q=async t=>{try{await S(t,q),e(`Заказ подтвержден! Зарезервирован остаток на складе.`,`success`)}catch(t){e(`Ошибка: ${t instanceof Error?t.message:String(t)}`,`error`)}},ue=async()=>{if(X)try{await w(X.id,X.total,K,!0),F(!1),e(`Оплата успешно принята! Поступление отражено в ДДС Финансов.`,`success`)}catch(t){e(`Ошибка оплаты: ${t instanceof Error?t.message:String(t)}`,`error`)}},de=async()=>{if(X)try{await T(X.id,q),L(!1),e(`Отгрузка сформирована! Товар списан со склада.`,`success`)}catch(t){e(`Ошибка отгрузки: ${t instanceof Error?t.message:String(t)}`,`error`)}},fe=async t=>{try{await C(t),e(`Заказ отменен. Резервы на складе освобождены.`,`info`)}catch(t){e(`Ошибка отмены: ${t instanceof Error?t.message:String(t)}`,`error`)}},pe=async()=>{if(X)try{let t=X.items.map(e=>({productId:e.productId,sku:e.sku,name:e.name,quantity:e.quantity,refundAmount:e.totalPrice}));await E(X.id,Y,t,q,!0),z(!1),e(`Возврат оформлен! Товар возвращен на склад, расход отражен в ДДС.`,`success`)}catch(t){e(`Ошибка возврата: ${t instanceof Error?t.message:String(t)}`,`error`)}},me=async t=>{t.preventDefault();let n=i.find(e=>e.id===H)||i[0];if(!n)return;let r=n.price.minor,a=r*W,o=`ORD-${Date.now().toString().slice(-5)}`;await x({orderNumber:o,customerType:`contact`,customerId:`cnt_custom`,customerName:B||`Розничный покупатель`,status:`draft`,paymentStatus:`pending`,fulfillmentStatus:`unfulfilled`,items:[{id:`item_${Date.now()}`,productId:n.id,sku:n.sku,name:n.name,quantity:W,unitPrice:{minor:r,currency:`RUB`},discountMinor:0,totalPrice:{minor:a,currency:`RUB`}}],subtotal:{minor:a,currency:`RUB`},discountMinor:0,taxMinor:Math.round(a*.2),shippingMinor:0,total:{minor:a,currency:`RUB`},channel:`b2b`}),N(!1),V(``),G(1),e(`Заказ ${o} успешно создан`,`success`)},$=e=>{switch(e){case`confirmed`:return(0,v.jsx)(r,{variant:`gold`,size:`sm`,children:`Подтвержден (Резерв)`});case`shipped`:return(0,v.jsx)(r,{variant:`blue`,size:`sm`,children:`Отгружен со склада`});case`delivered`:return(0,v.jsx)(r,{variant:`green`,size:`sm`,children:`Доставлен`});case`cancelled`:return(0,v.jsx)(r,{variant:`danger`,size:`sm`,children:`Отменен`});default:return(0,v.jsx)(r,{variant:`gray`,size:`sm`,children:`Черновик`})}};return(0,v.jsxs)(`div`,{className:`space-y-4 animate-fade-in`,children:[(0,v.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,v.jsxs)(`div`,{children:[(0,v.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,v.jsx)(`h1`,{className:`text-sm font-bold text-krona-primary`,children:`Коммерция & Продажи: Управление Заказами`}),(0,v.jsx)(m,{level:`pilot1`,size:`sm`})]}),(0,v.jsx)(`p`,{className:`text-xs text-krona-secondary mt-0.5`,children:`Жизненный цикл заказа: Черновик → Подтверждение (резерв) → Оплата (ДДС) → Отгрузка (списание со склада) → Доставка / Возврат`})]}),(0,v.jsx)(`div`,{className:`flex items-center gap-2`,children:(0,v.jsxs)(n,{variant:`primary`,size:`sm`,onClick:()=>N(!0),children:[(0,v.jsx)(ee,{className:`w-3.5 h-3.5 mr-1`}),` Новый заказ`]})})]}),(0,v.jsxs)(`div`,{className:`flex flex-col sm:flex-row sm:items-center justify-between gap-3`,children:[(0,v.jsx)(`div`,{className:`flex items-center gap-1 overflow-x-auto text-xs`,children:[{key:`all`,label:`Все заказы`},{key:`draft`,label:`Черновики`},{key:`confirmed`,label:`Подтвержденные`},{key:`shipped`,label:`Отгруженные`},{key:`delivered`,label:`Доставленные`},{key:`cancelled`,label:`Отмененные`}].map(e=>(0,v.jsx)(`button`,{onClick:()=>se(e.key),className:`px-3 py-1.5 rounded-lg font-medium transition-colors ${k===e.key?`bg-krona-green text-white shadow-sm`:`bg-krona-surface text-krona-secondary hover:text-krona-primary border border-krona-border`}`,children:e.label},e.key))}),(0,v.jsxs)(`div`,{className:`relative w-64`,children:[(0,v.jsx)(f,{className:`w-3.5 h-3.5 absolute left-2.5 top-2.5 text-krona-secondary`}),(0,v.jsx)(`input`,{type:`text`,value:O,onChange:e=>oe(e.target.value),placeholder:`Поиск по номеру или клиенту...`,className:`w-full pl-8 pr-3 py-1.5 text-xs bg-krona-surface border border-krona-border rounded-lg text-krona-primary focus:outline-none focus:border-krona-green`})]})]}),(0,v.jsx)(`div`,{className:`bg-krona-surface border border-krona-border rounded-xl shadow-krona-soft overflow-hidden`,children:(0,v.jsxs)(`table`,{className:`w-full text-xs text-left`,children:[(0,v.jsx)(`thead`,{className:`bg-krona-workspace text-krona-secondary border-b border-krona-border`,children:(0,v.jsxs)(`tr`,{children:[(0,v.jsx)(`th`,{className:`p-3 font-semibold`,children:`Номер заказа`}),(0,v.jsx)(`th`,{className:`p-3 font-semibold`,children:`Клиент`}),(0,v.jsx)(`th`,{className:`p-3 font-semibold`,children:`Позиций`}),(0,v.jsx)(`th`,{className:`p-3 font-semibold`,children:`Сумма заказа`}),(0,v.jsx)(`th`,{className:`p-3 font-semibold`,children:`Статус заказа`}),(0,v.jsx)(`th`,{className:`p-3 font-semibold`,children:`Оплата`}),(0,v.jsx)(`th`,{className:`p-3 font-semibold`,children:`Складской статус`}),(0,v.jsx)(`th`,{className:`p-3 font-semibold text-right`,children:`Действие`})]})}),(0,v.jsxs)(`tbody`,{className:`divide-y divide-krona-border`,children:[Z.map(e=>(0,v.jsxs)(`tr`,{"data-testid":`order-row-${e.id}`,onClick:()=>j(e),className:`hover:bg-krona-workspace/50 cursor-pointer transition-colors`,children:[(0,v.jsx)(`td`,{className:`p-3 font-mono font-bold text-krona-primary`,children:e.orderNumber}),(0,v.jsx)(`td`,{className:`p-3 font-medium text-krona-primary`,children:e.customerName}),(0,v.jsxs)(`td`,{className:`p-3 text-krona-secondary`,children:[e.items.length,` поз.`]}),(0,v.jsx)(`td`,{className:`p-3 font-bold text-krona-green`,children:g(e.total.minor)}),(0,v.jsx)(`td`,{className:`p-3`,children:$(e.status)}),(0,v.jsx)(`td`,{className:`p-3`,children:(0,v.jsx)(r,{variant:e.paymentStatus===`paid`?`green`:e.paymentStatus===`refunded`?`danger`:`warning`,size:`sm`,children:e.paymentStatus===`paid`?`Оплачен`:e.paymentStatus===`refunded`?`Возврат`:`Ожидает оплаты`})}),(0,v.jsx)(`td`,{className:`p-3`,children:(0,v.jsx)(r,{variant:e.fulfillmentStatus===`fulfilled`?`green`:e.fulfillmentStatus===`returned`?`danger`:`gray`,size:`sm`,children:e.fulfillmentStatus===`fulfilled`?`Отгружен`:e.fulfillmentStatus===`returned`?`Возвращен`:`Не отгружен`})}),(0,v.jsx)(`td`,{className:`p-3 text-right`,children:(0,v.jsxs)(n,{variant:`ghost`,size:`sm`,children:[`Управление `,(0,v.jsx)(u,{className:`w-3.5 h-3.5 ml-1`})]})})]},e.id)),Z.length===0&&(0,v.jsx)(`tr`,{children:(0,v.jsx)(`td`,{colSpan:8,className:`p-8 text-center text-krona-secondary text-xs italic`,children:`Заказы не найдены`})})]})]})}),(0,v.jsx)(re,{isOpen:!!X,onClose:()=>j(null),title:X?`Заказ ${X.orderNumber}`:``,size:`lg`,children:X&&(0,v.jsxs)(`div`,{className:`space-y-5 text-xs`,children:[(0,v.jsxs)(`div`,{className:`p-3.5 bg-krona-workspace rounded-xl border border-krona-border space-y-3`,children:[(0,v.jsx)(`div`,{className:`text-[11px] font-bold uppercase text-krona-secondary tracking-wider`,children:`Управление жизненным циклом заказа:`}),(0,v.jsxs)(`div`,{className:`flex flex-wrap items-center gap-2`,children:[X.status===`draft`&&(0,v.jsxs)(n,{variant:`primary`,size:`sm`,"data-testid":`confirm-order-btn`,onClick:()=>Q(X.id),children:[(0,v.jsx)(c,{className:`w-3.5 h-3.5 mr-1`}),` Подтвердить заказ (Резерв на складе)`]}),X.paymentStatus===`pending`&&X.status!==`cancelled`&&(0,v.jsxs)(n,{variant:`gold`,size:`sm`,"data-testid":`record-payment-btn`,onClick:()=>F(!0),children:[(0,v.jsx)(l,{className:`w-3.5 h-3.5 mr-1`}),` Зафиксировать оплату (ДДС)`]}),(X.status===`confirmed`||X.paymentStatus===`paid`)&&X.fulfillmentStatus===`unfulfilled`&&X.status!==`cancelled`&&(0,v.jsxs)(n,{variant:`primary`,size:`sm`,"data-testid":`create-shipment-btn`,onClick:()=>L(!0),children:[(0,v.jsx)(o,{className:`w-3.5 h-3.5 mr-1`}),` Сформировать отгрузку (Списать со склада)`]}),X.status===`shipped`&&(0,v.jsxs)(n,{variant:`secondary`,size:`sm`,onClick:()=>Q(X.id),children:[(0,v.jsx)(c,{className:`w-3.5 h-3.5 mr-1`}),` Доставлен покупателю`]}),X.fulfillmentStatus===`fulfilled`&&(0,v.jsxs)(n,{variant:`secondary`,size:`sm`,onClick:()=>z(!0),children:[(0,v.jsx)(h,{className:`w-3.5 h-3.5 mr-1 text-rose-500`}),` Оформить возврат (Возврат на склад & ДДС)`]}),X.status!==`cancelled`&&X.status!==`shipped`&&X.fulfillmentStatus!==`fulfilled`&&(0,v.jsxs)(n,{variant:`ghost`,size:`sm`,className:`text-rose-600 hover:text-rose-700 hover:bg-rose-500/10 ml-auto`,onClick:()=>fe(X.id),children:[(0,v.jsx)(te,{className:`w-3.5 h-3.5 mr-1`}),` Отменить заказ (Снять резерв)`]})]})]}),(0,v.jsxs)(`div`,{className:`grid grid-cols-2 sm:grid-cols-4 gap-3 bg-krona-surface p-3.5 rounded-xl border border-krona-border`,children:[(0,v.jsxs)(`div`,{children:[(0,v.jsx)(`span`,{className:`text-krona-secondary`,children:`Клиент:`}),(0,v.jsx)(`div`,{className:`font-bold text-krona-primary mt-0.5`,children:X.customerName})]}),(0,v.jsxs)(`div`,{children:[(0,v.jsx)(`span`,{className:`text-krona-secondary`,children:`Сумма:`}),(0,v.jsx)(`div`,{className:`font-bold text-krona-green mt-0.5`,children:g(X.total.minor)})]}),(0,v.jsxs)(`div`,{children:[(0,v.jsx)(`span`,{className:`text-krona-secondary`,children:`Статус заказа:`}),(0,v.jsx)(`div`,{className:`mt-0.5`,children:$(X.status)})]}),(0,v.jsxs)(`div`,{children:[(0,v.jsx)(`span`,{className:`text-krona-secondary`,children:`Оплата:`}),(0,v.jsx)(`div`,{className:`mt-0.5`,children:(0,v.jsx)(r,{variant:X.paymentStatus===`paid`?`green`:`warning`,size:`sm`,children:X.paymentStatus})})]})]}),(0,v.jsxs)(`div`,{children:[(0,v.jsxs)(`div`,{className:`font-bold text-krona-primary mb-2 flex items-center gap-1.5`,children:[(0,v.jsx)(s,{className:`w-4 h-4 text-krona-secondary`}),` Состав заказа:`]}),(0,v.jsx)(`div`,{className:`border border-krona-border rounded-lg overflow-hidden`,children:(0,v.jsxs)(`table`,{className:`w-full text-xs text-left`,children:[(0,v.jsx)(`thead`,{className:`bg-krona-workspace text-krona-secondary border-b border-krona-border`,children:(0,v.jsxs)(`tr`,{children:[(0,v.jsx)(`th`,{className:`p-2.5 font-semibold`,children:`Артикул`}),(0,v.jsx)(`th`,{className:`p-2.5 font-semibold`,children:`Наименование`}),(0,v.jsx)(`th`,{className:`p-2.5 font-semibold`,children:`Кол-во`}),(0,v.jsx)(`th`,{className:`p-2.5 font-semibold`,children:`Цена за ед.`}),(0,v.jsx)(`th`,{className:`p-2.5 font-semibold text-right`,children:`Сумма`})]})}),(0,v.jsx)(`tbody`,{className:`divide-y divide-krona-border`,children:X.items.map(e=>(0,v.jsxs)(`tr`,{children:[(0,v.jsx)(`td`,{className:`p-2.5 font-mono text-krona-secondary`,children:e.sku}),(0,v.jsx)(`td`,{className:`p-2.5 font-medium text-krona-primary`,children:e.name}),(0,v.jsxs)(`td`,{className:`p-2.5 font-bold`,children:[e.quantity,` шт.`]}),(0,v.jsx)(`td`,{className:`p-2.5 text-krona-secondary`,children:g(e.unitPrice.minor)}),(0,v.jsx)(`td`,{className:`p-2.5 font-bold text-krona-primary text-right`,children:g(e.totalPrice.minor)})]},e.id))})]})})]}),(0,v.jsxs)(`div`,{className:`p-3 bg-krona-workspace rounded-lg border border-krona-border space-y-1.5`,children:[(0,v.jsxs)(`div`,{className:`flex justify-between text-krona-secondary`,children:[(0,v.jsx)(`span`,{children:`Промежуточный итог:`}),(0,v.jsx)(`span`,{children:g(X.subtotal.minor)})]}),(0,v.jsxs)(`div`,{className:`flex justify-between text-krona-secondary`,children:[(0,v.jsx)(`span`,{children:`НДС (20%):`}),(0,v.jsx)(`span`,{children:g(X.taxMinor)})]}),(0,v.jsxs)(`div`,{className:`flex justify-between font-bold text-sm text-krona-primary border-t border-krona-border pt-1`,children:[(0,v.jsx)(`span`,{children:`Итого к оплате:`}),(0,v.jsx)(`span`,{className:`text-krona-green`,children:g(X.total.minor)})]})]}),(0,v.jsxs)(`div`,{className:`space-y-2`,children:[(0,v.jsx)(`div`,{className:`font-bold text-krona-primary`,children:`Связанные документы:`}),(0,v.jsxs)(`div`,{className:`grid grid-cols-1 sm:grid-cols-2 gap-2 text-[11px]`,children:[y.filter(e=>e.orderId===X.id).map(e=>(0,v.jsxs)(`div`,{className:`p-2.5 rounded-lg border border-krona-border bg-emerald-500/5 flex items-center justify-between`,children:[(0,v.jsxs)(`div`,{children:[(0,v.jsxs)(`div`,{className:`font-bold text-emerald-700 dark:text-emerald-300`,children:[`Оплата `,e.transactionId]}),(0,v.jsxs)(`div`,{className:`text-krona-secondary`,children:[e.method,` • `,ne(e.paidAt)]})]}),(0,v.jsx)(`span`,{className:`font-bold text-krona-green`,children:g(e.amount.minor)})]},e.id)),b.filter(e=>e.orderId===X.id).map(e=>(0,v.jsxs)(`div`,{className:`p-2.5 rounded-lg border border-krona-border bg-blue-500/5 flex items-center justify-between`,children:[(0,v.jsxs)(`div`,{children:[(0,v.jsxs)(`div`,{className:`font-bold text-blue-700 dark:text-blue-300`,children:[`Отгрузка `,e.trackingNumber]}),(0,v.jsxs)(`div`,{className:`text-krona-secondary`,children:[e.carrier,` • `,e.items.length,` поз.`]})]}),(0,v.jsx)(r,{variant:`blue`,size:`sm`,children:e.status})]},e.id))]})]})]})}),(0,v.jsx)(p,{isOpen:P,onClose:()=>F(!1),title:`Зафиксировать оплату по заказу`,size:`md`,children:X&&(0,v.jsxs)(`div`,{className:`space-y-4 text-xs`,children:[(0,v.jsxs)(`p`,{className:`text-krona-secondary`,children:[`Оплата заказа `,(0,v.jsx)(`strong`,{className:`text-krona-primary`,children:X.orderNumber}),` на сумму`,` `,(0,v.jsx)(`strong`,{className:`text-krona-green`,children:g(X.total.minor)}),`. Поступление денежных средств будет мгновенно отражено в модуле Финансы (ДДС) и увеличит остаток расчетного счета.`]}),(0,v.jsxs)(`div`,{children:[(0,v.jsx)(`label`,{className:`block font-semibold text-krona-primary mb-1`,children:`Способ оплаты:`}),(0,v.jsxs)(`select`,{value:K,onChange:e=>ce(e.target.value),className:`w-full px-3 py-1.5 bg-krona-workspace border border-krona-border rounded-lg text-krona-primary`,children:[(0,v.jsx)(`option`,{value:`bank_transfer`,children:`Безналичный расчет (Счет)`}),(0,v.jsx)(`option`,{value:`card`,children:`Банковская карта (Эквайринг)`}),(0,v.jsx)(`option`,{value:`online`,children:`СБП / Онлайн`}),(0,v.jsx)(`option`,{value:`cash`,children:`Наличные в кассу`})]})]}),(0,v.jsxs)(`div`,{className:`flex justify-end gap-2 pt-2 border-t border-krona-border`,children:[(0,v.jsx)(n,{variant:`secondary`,size:`sm`,onClick:()=>F(!1),children:`Отмена`}),(0,v.jsxs)(n,{variant:`primary`,size:`sm`,"data-testid":`submit-payment-btn`,onClick:ue,children:[(0,v.jsx)(l,{className:`w-3.5 h-3.5 mr-1`}),` Провести платеж`]})]})]})}),(0,v.jsx)(p,{isOpen:I,onClose:()=>L(!1),title:`Формирование складской отгрузки`,size:`md`,children:X&&(0,v.jsxs)(`div`,{className:`space-y-4 text-xs`,children:[(0,v.jsxs)(`p`,{className:`text-krona-secondary`,children:[`Формирование накладной на отгрузку для заказа `,(0,v.jsx)(`strong`,{className:`text-krona-primary`,children:X.orderNumber}),`. При отгрузке зарезервированные товары будут списаны с физического складского остатка.`]}),(0,v.jsxs)(`div`,{children:[(0,v.jsx)(`label`,{className:`block font-semibold text-krona-primary mb-1`,children:`Склад списания:`}),(0,v.jsx)(`select`,{value:q,onChange:e=>J(e.target.value),className:`w-full px-3 py-1.5 bg-krona-workspace border border-krona-border rounded-lg text-krona-primary`,children:D.map(e=>(0,v.jsxs)(`option`,{value:e.id,children:[e.name,` (`,e.address,`)`]},e.id))})]}),(0,v.jsxs)(`div`,{className:`flex justify-end gap-2 pt-2 border-t border-krona-border`,children:[(0,v.jsx)(n,{variant:`secondary`,size:`sm`,onClick:()=>L(!1),children:`Отмена`}),(0,v.jsxs)(n,{variant:`primary`,size:`sm`,"data-testid":`submit-shipment-btn`,onClick:de,children:[(0,v.jsx)(o,{className:`w-3.5 h-3.5 mr-1`}),` Сформировать отгрузку`]})]})]})}),(0,v.jsx)(p,{isOpen:R,onClose:()=>z(!1),title:`Оформление возврата товара`,size:`md`,children:X&&(0,v.jsxs)(`div`,{className:`space-y-4 text-xs`,children:[(0,v.jsxs)(`div`,{className:`p-3 bg-rose-500/10 border border-rose-500/30 rounded-lg text-rose-800 dark:text-rose-300`,children:[`При возврате товара остаток на складе будет автоматически восстановлен, а в модуле Финансы (ДДС) сформируется выплата возврата клиенту на сумму `,(0,v.jsx)(`strong`,{className:`font-bold`,children:g(X.total.minor)}),`.`]}),(0,v.jsxs)(`div`,{children:[(0,v.jsx)(`label`,{className:`block font-semibold text-krona-primary mb-1`,children:`Причина возврата:`}),(0,v.jsx)(`input`,{type:`text`,value:Y,onChange:e=>le(e.target.value),className:`w-full px-3 py-1.5 bg-krona-workspace border border-krona-border rounded-lg text-krona-primary`})]}),(0,v.jsxs)(`div`,{children:[(0,v.jsx)(`label`,{className:`block font-semibold text-krona-primary mb-1`,children:`Склад возврата:`}),(0,v.jsx)(`select`,{value:q,onChange:e=>J(e.target.value),className:`w-full px-3 py-1.5 bg-krona-workspace border border-krona-border rounded-lg text-krona-primary`,children:D.map(e=>(0,v.jsx)(`option`,{value:e.id,children:e.name},e.id))})]}),(0,v.jsxs)(`div`,{className:`flex justify-end gap-2 pt-2 border-t border-krona-border`,children:[(0,v.jsx)(n,{variant:`secondary`,size:`sm`,onClick:()=>z(!1),children:`Отмена`}),(0,v.jsxs)(n,{variant:`danger`,size:`sm`,onClick:pe,children:[(0,v.jsx)(h,{className:`w-3.5 h-3.5 mr-1`}),` Провести возврат`]})]})]})}),(0,v.jsx)(p,{isOpen:M,onClose:()=>N(!1),title:`Создание нового коммерческого заказа`,size:`md`,children:(0,v.jsxs)(`form`,{onSubmit:me,className:`space-y-4 text-xs`,children:[(0,v.jsxs)(`div`,{children:[(0,v.jsx)(`label`,{className:`block font-semibold text-krona-primary mb-1`,children:`Клиент (ФИО или название компании):`}),(0,v.jsx)(`input`,{type:`text`,required:!0,placeholder:`Например: ООО «СеверТорг» или Иванов Иван`,value:B,onChange:e=>V(e.target.value),className:`w-full px-3 py-1.5 bg-krona-workspace border border-krona-border rounded-lg text-krona-primary`})]}),(0,v.jsxs)(`div`,{children:[(0,v.jsx)(`label`,{className:`block font-semibold text-krona-primary mb-1`,children:`Товарная позиция:`}),(0,v.jsx)(`select`,{value:H,onChange:e=>U(e.target.value),className:`w-full px-3 py-1.5 bg-krona-workspace border border-krona-border rounded-lg text-krona-primary`,children:i.map(e=>(0,v.jsxs)(`option`,{value:e.id,children:[e.name,` — `,g(e.price.minor)]},e.id))})]}),(0,v.jsxs)(`div`,{children:[(0,v.jsx)(`label`,{className:`block font-semibold text-krona-primary mb-1`,children:`Количество (шт.):`}),(0,v.jsx)(`input`,{type:`number`,min:1,value:W,onChange:e=>G(Number(e.target.value)||1),className:`w-32 px-3 py-1.5 bg-krona-workspace border border-krona-border rounded-lg text-krona-primary`})]}),(0,v.jsxs)(`div`,{className:`flex justify-end gap-2 pt-2 border-t border-krona-border`,children:[(0,v.jsx)(n,{variant:`secondary`,size:`sm`,type:`button`,onClick:()=>N(!1),children:`Отмена`}),(0,v.jsxs)(n,{variant:`primary`,size:`sm`,type:`submit`,children:[(0,v.jsx)(d,{className:`w-3.5 h-3.5 mr-1`}),` Создать заказ`]})]})]})})]})};export{y as SalesModule}; \ No newline at end of file diff --git a/dist/assets/SettingsModule-BbqUjWn1.js b/dist/assets/SettingsModule-BbqUjWn1.js new file mode 100644 index 0000000..a26f375 --- /dev/null +++ b/dist/assets/SettingsModule-BbqUjWn1.js @@ -0,0 +1 @@ +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{L as f,S as p,dt as m,ft as h,g,t as _,tt as v,v as y,x as b}from"./index-CrJKtV0u.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}=m(),{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)(_,{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)(p,{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)(g,{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(h).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)(g,{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)(y,{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(v).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)(b,{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}; \ No newline at end of file diff --git a/dist/assets/SettingsModule-C5LrdOmz.js b/dist/assets/SettingsModule-C5LrdOmz.js deleted file mode 100644 index c7f9451..0000000 --- a/dist/assets/SettingsModule-C5LrdOmz.js +++ /dev/null @@ -1 +0,0 @@ -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{$ as f,I as p,_ as m,b as h,h as g,lt as _,t as v,ut as y,x as b}from"./index-CNnq9VO5.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}=_(),{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)(v,{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)(g,{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(y).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)(g,{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(f).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)(p,{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}; \ No newline at end of file diff --git a/dist/assets/TasksModule-3oA5V8YP.js b/dist/assets/TasksModule-D4E78liD.js similarity index 95% rename from dist/assets/TasksModule-3oA5V8YP.js rename to dist/assets/TasksModule-D4E78liD.js index be5089d..8821a20 100644 --- a/dist/assets/TasksModule-3oA5V8YP.js +++ b/dist/assets/TasksModule-D4E78liD.js @@ -1 +1 @@ -import{f as e,h as t,i as n,r,s as i}from"./useToast-CS8pZhce.js";import{t as a}from"./link-DOg0dLYA.js";import{B as o,R as s,W as c,r as l,t as u,v as d,w as f}from"./index-CNnq9VO5.js";import{l as p}from"./mockData-DAqQG5te.js";var m=t(e(),1),h=i(),g=()=>{let[e,t]=(0,m.useState)(p),[i,g]=(0,m.useState)(`kanban`),[_,v]=(0,m.useState)(null),[y,b]=(0,m.useState)([{id:`st-1`,text:`Сверить расчетную себестоимость и маржинальность`,completed:!0},{id:`st-2`,text:`Согласовать тайминг подачи с шеф-поваром`,completed:!1},{id:`st-3`,text:`Выставить предварительный счет клиенту`,completed:!1}]),[x,S]=(0,m.useState)([{id:`c-1`,author:`Ольга Власова`,text:`Клиент подтвердил количество 60 персон. Ждем аванс.`,time:`Вчера, 16:20`},{id:`c-2`,author:`Артур Ким (Шеф)`,text:`Продукты зарезервированы на основном складе.`,time:`Сегодня, 10:15`}]),[C,w]=(0,m.useState)(``),T=(n,r)=>{t(e.map(e=>e.id===n?{...e,status:r}:e)),_&&_.id===n&&v({..._,status:r})},E=e=>{b(t=>t.map(t=>t.id===e?{...t,completed:!t.completed}:t))};return(0,h.jsxs)(`div`,{className:`space-y-4 animate-fade-in`,children:[(0,h.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,h.jsxs)(`div`,{children:[(0,h.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,h.jsx)(`h2`,{className:`text-sm font-bold text-krona-primary`,children:`Задачи, поручения и проекты команды`}),(0,h.jsx)(u,{level:`target`,size:`sm`})]}),(0,h.jsx)(`p`,{className:`text-xs text-krona-secondary mt-0.5`,children:`Канбан-доска исполнения, дедлайны, привязка к CRM и ответственные`})]}),(0,h.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,h.jsxs)(`div`,{className:`flex items-center bg-krona-workspace p-1 rounded-lg border border-krona-border text-xs`,children:[(0,h.jsx)(`button`,{onClick:()=>g(`kanban`),className:`px-3 py-1 rounded font-medium transition-colors ${i===`kanban`?`bg-[#2F684C] text-white shadow-sm`:`text-krona-secondary`}`,children:`Канбан`}),(0,h.jsx)(`button`,{onClick:()=>g(`list`),className:`px-3 py-1 rounded font-medium transition-colors ${i===`list`?`bg-[#2F684C] text-white shadow-sm`:`text-krona-secondary`}`,children:`Список`})]}),(0,h.jsxs)(n,{variant:`primary`,size:`sm`,children:[(0,h.jsx)(f,{className:`w-3.5 h-3.5 mr-1`}),`Создать задачу`]})]})]}),i===`kanban`?(0,h.jsx)(`div`,{className:`grid grid-cols-1 md:grid-cols-4 gap-3.5`,children:[`todo`,`in_progress`,`review`,`done`].map(t=>{let n=e.filter(e=>e.status===t);return(0,h.jsxs)(`div`,{onDragOver:e=>e.preventDefault(),onDrop:e=>{e.preventDefault();let n=e.dataTransfer.getData(`text/plain`);n&&T(n,t)},className:`bg-krona-workspace/80 border border-krona-border rounded-xl p-3 flex flex-col min-h-[420px]`,children:[(0,h.jsxs)(`div`,{className:`flex items-center justify-between pb-2 mb-2 border-b border-krona-border`,children:[(0,h.jsx)(`span`,{className:`text-xs font-bold text-krona-primary`,children:{todo:`К выполнению`,in_progress:`В работе`,review:`На проверке`,done:`Выполнено`}[t]}),(0,h.jsx)(`span`,{className:`text-xs font-mono font-bold text-krona-secondary`,children:n.length})]}),(0,h.jsx)(`div`,{className:`space-y-2.5 flex-1 overflow-y-auto`,children:n.map(e=>(0,h.jsxs)(`div`,{draggable:!0,onDragStart:t=>{t.dataTransfer.setData(`text/plain`,e.id)},onClick:()=>v(e),className:`p-3 rounded-lg border border-krona-border bg-krona-surface shadow-krona-soft space-y-2 cursor-pointer hover:border-krona-green/70 transition-all group active:scale-[0.99]`,children:[(0,h.jsxs)(`div`,{className:`flex items-center justify-between text-[10px] text-krona-secondary`,children:[(0,h.jsx)(`span`,{className:`font-semibold uppercase`,children:e.project}),(0,h.jsx)(r,{variant:e.priority===`high`?`danger`:`neutral`,size:`sm`,children:e.priority===`high`?`Срочно`:`Обычный`})]}),(0,h.jsx)(`h5`,{className:`text-xs font-bold text-krona-primary leading-snug group-hover:text-krona-green transition-colors`,children:e.title}),(0,h.jsxs)(`div`,{className:`flex items-center justify-between pt-1 border-t border-krona-border/60 text-[11px] text-krona-secondary`,children:[(0,h.jsx)(`span`,{children:e.assignee}),(0,h.jsxs)(`span`,{className:`flex items-center gap-1 font-mono`,children:[(0,h.jsx)(s,{className:`w-3 h-3`}),e.dueDate]})]}),t!==`done`&&(0,h.jsx)(`div`,{className:`pt-1 flex justify-end`,children:(0,h.jsx)(`button`,{onClick:n=>{n.stopPropagation(),T(e.id,t===`todo`?`in_progress`:t===`in_progress`?`review`:`done`)},className:`text-[11px] text-krona-green font-medium hover:underline`,children:`Сдвинуть вперед →`})})]},e.id))})]},t)})}):(0,h.jsx)(`div`,{className:`bg-krona-surface border border-krona-border rounded-xl shadow-krona-soft p-4`,children:(0,h.jsxs)(`table`,{className:`w-full text-left text-xs border-collapse`,children:[(0,h.jsx)(`thead`,{className:`bg-krona-workspace/80 text-krona-secondary border-b border-krona-border`,children:(0,h.jsxs)(`tr`,{children:[(0,h.jsx)(`th`,{className:`p-3 font-semibold`,children:`Название задачи`}),(0,h.jsx)(`th`,{className:`p-3 font-semibold`,children:`Проект`}),(0,h.jsx)(`th`,{className:`p-3 font-semibold`,children:`Ответственный`}),(0,h.jsx)(`th`,{className:`p-3 font-semibold`,children:`Срок`}),(0,h.jsx)(`th`,{className:`p-3 font-semibold`,children:`Приоритет`}),(0,h.jsx)(`th`,{className:`p-3 font-semibold`,children:`Статус`})]})}),(0,h.jsx)(`tbody`,{className:`divide-y divide-krona-border/50`,children:e.map(e=>(0,h.jsxs)(`tr`,{onClick:()=>v(e),className:`hover:bg-krona-workspace/50 transition-colors cursor-pointer`,children:[(0,h.jsx)(`td`,{className:`p-3 font-medium text-krona-primary`,children:e.title}),(0,h.jsx)(`td`,{className:`p-3 text-krona-secondary`,children:e.project}),(0,h.jsx)(`td`,{className:`p-3 font-medium text-krona-primary`,children:e.assignee}),(0,h.jsx)(`td`,{className:`p-3 text-krona-secondary font-mono`,children:e.dueDate}),(0,h.jsx)(`td`,{className:`p-3`,children:(0,h.jsx)(r,{variant:e.priority===`high`?`danger`:`neutral`,size:`sm`,children:e.priority===`high`?`Высокий`:`Обычный`})}),(0,h.jsx)(`td`,{className:`p-3`,children:(0,h.jsx)(r,{variant:`gold`,size:`sm`,children:e.status})})]},e.id))})]})}),_&&(0,h.jsx)(l,{isOpen:!!_,onClose:()=>v(null),title:`Задача: ${_.title}`,subtitle:`Проект: ${_.project} • Исполнитель: ${_.assignee}`,maxWidth:`lg`,footer:(0,h.jsxs)(`div`,{className:`flex items-center justify-between w-full`,children:[(0,h.jsx)(`div`,{className:`flex gap-2`,children:(0,h.jsxs)(n,{variant:`primary`,size:`sm`,onClick:()=>T(_.id,`done`),children:[(0,h.jsx)(o,{className:`w-3.5 h-3.5 mr-1`}),`Отметить выполненной`]})}),(0,h.jsx)(n,{variant:`secondary`,size:`sm`,onClick:()=>v(null),children:`Закрыть`})]}),children:(0,h.jsxs)(`div`,{className:`space-y-4 text-xs`,children:[(0,h.jsxs)(`div`,{className:`grid grid-cols-3 gap-3 p-3 rounded-lg bg-krona-workspace border border-krona-border`,children:[(0,h.jsxs)(`div`,{children:[(0,h.jsx)(`span`,{className:`text-krona-secondary block text-[10px]`,children:`Ответственный:`}),(0,h.jsx)(`span`,{className:`font-semibold text-krona-primary`,children:_.assignee})]}),(0,h.jsxs)(`div`,{children:[(0,h.jsx)(`span`,{className:`text-krona-secondary block text-[10px]`,children:`Срок завершения:`}),(0,h.jsx)(`span`,{className:`font-semibold text-krona-primary font-mono`,children:_.dueDate})]}),(0,h.jsxs)(`div`,{children:[(0,h.jsx)(`span`,{className:`text-krona-secondary block text-[10px]`,children:`Приоритет:`}),(0,h.jsx)(r,{variant:_.priority===`high`?`danger`:`neutral`,size:`sm`,children:_.priority===`high`?`Высокий (Срочно)`:`Обычный`})]})]}),(0,h.jsxs)(`div`,{className:`p-3 rounded-lg border border-krona-border bg-krona-surface flex items-center justify-between`,children:[(0,h.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,h.jsx)(a,{className:`w-4 h-4 text-krona-gold shrink-0`}),(0,h.jsxs)(`div`,{children:[(0,h.jsx)(`span`,{className:`font-bold text-krona-primary`,children:`Связанный CRM контрагент:`}),(0,h.jsx)(`div`,{className:`text-[11px] text-krona-secondary`,children:`ООО "Сибирский Ритейл" (Сделка: Банкет на 60 персон)`})]})]}),(0,h.jsx)(r,{variant:`gold`,size:`sm`,children:`CRM Link`})]}),(0,h.jsxs)(`div`,{className:`space-y-2`,children:[(0,h.jsxs)(`span`,{className:`text-[10px] font-bold uppercase tracking-wider text-krona-secondary block`,children:[`Чек-лист подзадач (`,y.filter(e=>e.completed).length,` из `,y.length,`):`]}),(0,h.jsx)(`div`,{className:`space-y-1.5 p-3 rounded-lg border border-krona-border bg-krona-workspace`,children:y.map(e=>(0,h.jsxs)(`div`,{onClick:()=>E(e.id),className:`flex items-center gap-2 cursor-pointer p-1 rounded hover:bg-krona-surface/60 transition-colors select-none`,children:[(0,h.jsx)(`div`,{className:`w-4 h-4 rounded border flex items-center justify-center transition-colors ${e.completed?`bg-krona-green border-krona-green text-white`:`border-krona-border bg-krona-surface`}`,children:e.completed&&(0,h.jsx)(c,{className:`w-3 h-3 stroke-[3]`})}),(0,h.jsx)(`span`,{className:`text-xs ${e.completed?`line-through text-krona-secondary`:`text-krona-primary`}`,children:e.text})]},e.id))})]}),(0,h.jsxs)(`div`,{className:`space-y-2`,children:[(0,h.jsxs)(`span`,{className:`text-[10px] font-bold uppercase tracking-wider text-krona-secondary block`,children:[`Обсуждение задачи (`,x.length,`):`]}),(0,h.jsx)(`div`,{className:`space-y-2 max-h-40 overflow-y-auto p-2 rounded-lg bg-krona-workspace border border-krona-border`,children:x.map(e=>(0,h.jsxs)(`div`,{className:`p-2 rounded bg-krona-surface border border-krona-border/60 text-[11px] space-y-0.5`,children:[(0,h.jsxs)(`div`,{className:`flex items-center justify-between text-krona-secondary`,children:[(0,h.jsx)(`span`,{className:`font-semibold text-krona-primary`,children:e.author}),(0,h.jsx)(`span`,{className:`text-[10px]`,children:e.time})]}),(0,h.jsx)(`p`,{className:`text-krona-primary`,children:e.text})]},e.id))}),(0,h.jsxs)(`form`,{onSubmit:e=>{e.preventDefault(),C.trim()&&(S(e=>[...e,{id:`c-${Date.now()}`,author:`Вы (Текущий пользователь)`,text:C,time:`Только что`}]),w(``))},className:`flex gap-2 pt-1`,children:[(0,h.jsx)(`input`,{type:`text`,value:C,onChange:e=>w(e.target.value),placeholder:`Добавить комментарий к задаче...`,className:`flex-1 bg-krona-workspace border border-krona-border rounded-lg px-3 py-1.5 text-xs text-krona-primary placeholder:text-krona-secondary focus:outline-none focus:border-krona-green`}),(0,h.jsx)(n,{type:`submit`,variant:`primary`,size:`sm`,children:(0,h.jsx)(d,{className:`w-3.5 h-3.5`})})]})]})]})})]})};export{g as TasksModule}; \ No newline at end of file +import{f as e,h as t,i as n,r,s as i}from"./useToast-CS8pZhce.js";import{t as a}from"./link-DOg0dLYA.js";import{B as o,H as s,K as c,T as l,r as u,t as d,y as f}from"./index-CrJKtV0u.js";import{l as p}from"./mockData-DAqQG5te.js";var m=t(e(),1),h=i(),g=()=>{let[e,t]=(0,m.useState)(p),[i,g]=(0,m.useState)(`kanban`),[_,v]=(0,m.useState)(null),[y,b]=(0,m.useState)([{id:`st-1`,text:`Сверить расчетную себестоимость и маржинальность`,completed:!0},{id:`st-2`,text:`Согласовать тайминг подачи с шеф-поваром`,completed:!1},{id:`st-3`,text:`Выставить предварительный счет клиенту`,completed:!1}]),[x,S]=(0,m.useState)([{id:`c-1`,author:`Ольга Власова`,text:`Клиент подтвердил количество 60 персон. Ждем аванс.`,time:`Вчера, 16:20`},{id:`c-2`,author:`Артур Ким (Шеф)`,text:`Продукты зарезервированы на основном складе.`,time:`Сегодня, 10:15`}]),[C,w]=(0,m.useState)(``),T=(n,r)=>{t(e.map(e=>e.id===n?{...e,status:r}:e)),_&&_.id===n&&v({..._,status:r})},E=e=>{b(t=>t.map(t=>t.id===e?{...t,completed:!t.completed}:t))};return(0,h.jsxs)(`div`,{className:`space-y-4 animate-fade-in`,children:[(0,h.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,h.jsxs)(`div`,{children:[(0,h.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,h.jsx)(`h2`,{className:`text-sm font-bold text-krona-primary`,children:`Задачи, поручения и проекты команды`}),(0,h.jsx)(d,{level:`target`,size:`sm`})]}),(0,h.jsx)(`p`,{className:`text-xs text-krona-secondary mt-0.5`,children:`Канбан-доска исполнения, дедлайны, привязка к CRM и ответственные`})]}),(0,h.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,h.jsxs)(`div`,{className:`flex items-center bg-krona-workspace p-1 rounded-lg border border-krona-border text-xs`,children:[(0,h.jsx)(`button`,{onClick:()=>g(`kanban`),className:`px-3 py-1 rounded font-medium transition-colors ${i===`kanban`?`bg-[#2F684C] text-white shadow-sm`:`text-krona-secondary`}`,children:`Канбан`}),(0,h.jsx)(`button`,{onClick:()=>g(`list`),className:`px-3 py-1 rounded font-medium transition-colors ${i===`list`?`bg-[#2F684C] text-white shadow-sm`:`text-krona-secondary`}`,children:`Список`})]}),(0,h.jsxs)(n,{variant:`primary`,size:`sm`,children:[(0,h.jsx)(l,{className:`w-3.5 h-3.5 mr-1`}),`Создать задачу`]})]})]}),i===`kanban`?(0,h.jsx)(`div`,{className:`grid grid-cols-1 md:grid-cols-4 gap-3.5`,children:[`todo`,`in_progress`,`review`,`done`].map(t=>{let n=e.filter(e=>e.status===t);return(0,h.jsxs)(`div`,{onDragOver:e=>e.preventDefault(),onDrop:e=>{e.preventDefault();let n=e.dataTransfer.getData(`text/plain`);n&&T(n,t)},className:`bg-krona-workspace/80 border border-krona-border rounded-xl p-3 flex flex-col min-h-[420px]`,children:[(0,h.jsxs)(`div`,{className:`flex items-center justify-between pb-2 mb-2 border-b border-krona-border`,children:[(0,h.jsx)(`span`,{className:`text-xs font-bold text-krona-primary`,children:{todo:`К выполнению`,in_progress:`В работе`,review:`На проверке`,done:`Выполнено`}[t]}),(0,h.jsx)(`span`,{className:`text-xs font-mono font-bold text-krona-secondary`,children:n.length})]}),(0,h.jsx)(`div`,{className:`space-y-2.5 flex-1 overflow-y-auto`,children:n.map(e=>(0,h.jsxs)(`div`,{draggable:!0,onDragStart:t=>{t.dataTransfer.setData(`text/plain`,e.id)},onClick:()=>v(e),className:`p-3 rounded-lg border border-krona-border bg-krona-surface shadow-krona-soft space-y-2 cursor-pointer hover:border-krona-green/70 transition-all group active:scale-[0.99]`,children:[(0,h.jsxs)(`div`,{className:`flex items-center justify-between text-[10px] text-krona-secondary`,children:[(0,h.jsx)(`span`,{className:`font-semibold uppercase`,children:e.project}),(0,h.jsx)(r,{variant:e.priority===`high`?`danger`:`neutral`,size:`sm`,children:e.priority===`high`?`Срочно`:`Обычный`})]}),(0,h.jsx)(`h5`,{className:`text-xs font-bold text-krona-primary leading-snug group-hover:text-krona-green transition-colors`,children:e.title}),(0,h.jsxs)(`div`,{className:`flex items-center justify-between pt-1 border-t border-krona-border/60 text-[11px] text-krona-secondary`,children:[(0,h.jsx)(`span`,{children:e.assignee}),(0,h.jsxs)(`span`,{className:`flex items-center gap-1 font-mono`,children:[(0,h.jsx)(o,{className:`w-3 h-3`}),e.dueDate]})]}),t!==`done`&&(0,h.jsx)(`div`,{className:`pt-1 flex justify-end`,children:(0,h.jsx)(`button`,{onClick:n=>{n.stopPropagation(),T(e.id,t===`todo`?`in_progress`:t===`in_progress`?`review`:`done`)},className:`text-[11px] text-krona-green font-medium hover:underline`,children:`Сдвинуть вперед →`})})]},e.id))})]},t)})}):(0,h.jsx)(`div`,{className:`bg-krona-surface border border-krona-border rounded-xl shadow-krona-soft p-4`,children:(0,h.jsxs)(`table`,{className:`w-full text-left text-xs border-collapse`,children:[(0,h.jsx)(`thead`,{className:`bg-krona-workspace/80 text-krona-secondary border-b border-krona-border`,children:(0,h.jsxs)(`tr`,{children:[(0,h.jsx)(`th`,{className:`p-3 font-semibold`,children:`Название задачи`}),(0,h.jsx)(`th`,{className:`p-3 font-semibold`,children:`Проект`}),(0,h.jsx)(`th`,{className:`p-3 font-semibold`,children:`Ответственный`}),(0,h.jsx)(`th`,{className:`p-3 font-semibold`,children:`Срок`}),(0,h.jsx)(`th`,{className:`p-3 font-semibold`,children:`Приоритет`}),(0,h.jsx)(`th`,{className:`p-3 font-semibold`,children:`Статус`})]})}),(0,h.jsx)(`tbody`,{className:`divide-y divide-krona-border/50`,children:e.map(e=>(0,h.jsxs)(`tr`,{onClick:()=>v(e),className:`hover:bg-krona-workspace/50 transition-colors cursor-pointer`,children:[(0,h.jsx)(`td`,{className:`p-3 font-medium text-krona-primary`,children:e.title}),(0,h.jsx)(`td`,{className:`p-3 text-krona-secondary`,children:e.project}),(0,h.jsx)(`td`,{className:`p-3 font-medium text-krona-primary`,children:e.assignee}),(0,h.jsx)(`td`,{className:`p-3 text-krona-secondary font-mono`,children:e.dueDate}),(0,h.jsx)(`td`,{className:`p-3`,children:(0,h.jsx)(r,{variant:e.priority===`high`?`danger`:`neutral`,size:`sm`,children:e.priority===`high`?`Высокий`:`Обычный`})}),(0,h.jsx)(`td`,{className:`p-3`,children:(0,h.jsx)(r,{variant:`gold`,size:`sm`,children:e.status})})]},e.id))})]})}),_&&(0,h.jsx)(u,{isOpen:!!_,onClose:()=>v(null),title:`Задача: ${_.title}`,subtitle:`Проект: ${_.project} • Исполнитель: ${_.assignee}`,maxWidth:`lg`,footer:(0,h.jsxs)(`div`,{className:`flex items-center justify-between w-full`,children:[(0,h.jsx)(`div`,{className:`flex gap-2`,children:(0,h.jsxs)(n,{variant:`primary`,size:`sm`,onClick:()=>T(_.id,`done`),children:[(0,h.jsx)(s,{className:`w-3.5 h-3.5 mr-1`}),`Отметить выполненной`]})}),(0,h.jsx)(n,{variant:`secondary`,size:`sm`,onClick:()=>v(null),children:`Закрыть`})]}),children:(0,h.jsxs)(`div`,{className:`space-y-4 text-xs`,children:[(0,h.jsxs)(`div`,{className:`grid grid-cols-3 gap-3 p-3 rounded-lg bg-krona-workspace border border-krona-border`,children:[(0,h.jsxs)(`div`,{children:[(0,h.jsx)(`span`,{className:`text-krona-secondary block text-[10px]`,children:`Ответственный:`}),(0,h.jsx)(`span`,{className:`font-semibold text-krona-primary`,children:_.assignee})]}),(0,h.jsxs)(`div`,{children:[(0,h.jsx)(`span`,{className:`text-krona-secondary block text-[10px]`,children:`Срок завершения:`}),(0,h.jsx)(`span`,{className:`font-semibold text-krona-primary font-mono`,children:_.dueDate})]}),(0,h.jsxs)(`div`,{children:[(0,h.jsx)(`span`,{className:`text-krona-secondary block text-[10px]`,children:`Приоритет:`}),(0,h.jsx)(r,{variant:_.priority===`high`?`danger`:`neutral`,size:`sm`,children:_.priority===`high`?`Высокий (Срочно)`:`Обычный`})]})]}),(0,h.jsxs)(`div`,{className:`p-3 rounded-lg border border-krona-border bg-krona-surface flex items-center justify-between`,children:[(0,h.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,h.jsx)(a,{className:`w-4 h-4 text-krona-gold shrink-0`}),(0,h.jsxs)(`div`,{children:[(0,h.jsx)(`span`,{className:`font-bold text-krona-primary`,children:`Связанный CRM контрагент:`}),(0,h.jsx)(`div`,{className:`text-[11px] text-krona-secondary`,children:`ООО "Сибирский Ритейл" (Сделка: Банкет на 60 персон)`})]})]}),(0,h.jsx)(r,{variant:`gold`,size:`sm`,children:`CRM Link`})]}),(0,h.jsxs)(`div`,{className:`space-y-2`,children:[(0,h.jsxs)(`span`,{className:`text-[10px] font-bold uppercase tracking-wider text-krona-secondary block`,children:[`Чек-лист подзадач (`,y.filter(e=>e.completed).length,` из `,y.length,`):`]}),(0,h.jsx)(`div`,{className:`space-y-1.5 p-3 rounded-lg border border-krona-border bg-krona-workspace`,children:y.map(e=>(0,h.jsxs)(`div`,{onClick:()=>E(e.id),className:`flex items-center gap-2 cursor-pointer p-1 rounded hover:bg-krona-surface/60 transition-colors select-none`,children:[(0,h.jsx)(`div`,{className:`w-4 h-4 rounded border flex items-center justify-center transition-colors ${e.completed?`bg-krona-green border-krona-green text-white`:`border-krona-border bg-krona-surface`}`,children:e.completed&&(0,h.jsx)(c,{className:`w-3 h-3 stroke-[3]`})}),(0,h.jsx)(`span`,{className:`text-xs ${e.completed?`line-through text-krona-secondary`:`text-krona-primary`}`,children:e.text})]},e.id))})]}),(0,h.jsxs)(`div`,{className:`space-y-2`,children:[(0,h.jsxs)(`span`,{className:`text-[10px] font-bold uppercase tracking-wider text-krona-secondary block`,children:[`Обсуждение задачи (`,x.length,`):`]}),(0,h.jsx)(`div`,{className:`space-y-2 max-h-40 overflow-y-auto p-2 rounded-lg bg-krona-workspace border border-krona-border`,children:x.map(e=>(0,h.jsxs)(`div`,{className:`p-2 rounded bg-krona-surface border border-krona-border/60 text-[11px] space-y-0.5`,children:[(0,h.jsxs)(`div`,{className:`flex items-center justify-between text-krona-secondary`,children:[(0,h.jsx)(`span`,{className:`font-semibold text-krona-primary`,children:e.author}),(0,h.jsx)(`span`,{className:`text-[10px]`,children:e.time})]}),(0,h.jsx)(`p`,{className:`text-krona-primary`,children:e.text})]},e.id))}),(0,h.jsxs)(`form`,{onSubmit:e=>{e.preventDefault(),C.trim()&&(S(e=>[...e,{id:`c-${Date.now()}`,author:`Вы (Текущий пользователь)`,text:C,time:`Только что`}]),w(``))},className:`flex gap-2 pt-1`,children:[(0,h.jsx)(`input`,{type:`text`,value:C,onChange:e=>w(e.target.value),placeholder:`Добавить комментарий к задаче...`,className:`flex-1 bg-krona-workspace border border-krona-border rounded-lg px-3 py-1.5 text-xs text-krona-primary placeholder:text-krona-secondary focus:outline-none focus:border-krona-green`}),(0,h.jsx)(n,{type:`submit`,variant:`primary`,size:`sm`,children:(0,h.jsx)(f,{className:`w-3.5 h-3.5`})})]})]})]})})]})};export{g as TasksModule}; \ No newline at end of file diff --git a/dist/assets/ViewBuilder-BPVOktaa.js b/dist/assets/ViewBuilder-zR702NRL.js similarity index 94% rename from dist/assets/ViewBuilder-BPVOktaa.js rename to dist/assets/ViewBuilder-zR702NRL.js index c1c8c44..dba97da 100644 --- a/dist/assets/ViewBuilder-BPVOktaa.js +++ b/dist/assets/ViewBuilder-zR702NRL.js @@ -1,2 +1,2 @@ -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"./arrow-up-down--M136cK3.js";import{t as l}from"./eye-CkF1gwUX.js";import{t as u}from"./save-D8euL60I.js";import{t as d}from"./table-_fqSCPRE.js";import{I as f,Z as p,a as m,et as h,ft as g,pt as _,r as v,st as y,u as b,w as x}from"./index-CNnq9VO5.js";import{t as S}from"./currency-DdDs82F5.js";var C={name:`columns-2`,size:24,node:[[`rect`,{width:`18`,height:`18`,x:`3`,y:`3`,rx:`2`,key:`afitv7`}],[`path`,{d:`M12 3v18`,key:`108xh3`}]],aliases:[`columns`]};C.node;var w=r(C),T={name:`funnel`,size:24,node:[[`path`,{d:`M10 20a1 1 0 0 0 .553.895l2 1A1 1 0 0 0 14 21v-7a2 2 0 0 1 .517-1.341L21.74 4.67A1 1 0 0 0 21 3H3a1 1 0 0 0-.742 1.67l7.225 7.989A2 2 0 0 1 10 14z`,key:`sc7q7i`}]],aliases:[`filter`]};T.node;var E=r(T),D={name:`move-right`,size:24,node:[[`path`,{d:`M18 8L22 12L18 16`,key:`1r0oui`}],[`path`,{d:`M2 12H22`,key:`1m8cig`}]]};D.node;var O=r(D),k={name:`move-left`,size:24,node:[[`path`,{d:`M6 8L2 12L6 16`,key:`kyvwex`}],[`path`,{d:`M2 12H22`,key:`1m8cig`}]]};k.node;var A=r(k),j=t(e(),1),M=a(),N=()=>{let{entityCode:e}=_(),t=g(),{currentEntity:r,views:a,saveView:C,deleteView:T}=h(e),{showToast:D}=o(),k=(0,j.useMemo)(()=>r?.fields||[],[r]),N=(0,j.useMemo)(()=>{let e=new Map;return k.forEach(t=>e.set(t.key,t)),e},[k]),[P,F]=(0,j.useState)(``),[I,L]=(0,j.useState)(null),[R,z]=(0,j.useState)(!1),[B,V]=(0,j.useState)(!1),[H,U]=(0,j.useState)(``),[W,G]=(0,j.useState)([]);(0,j.useEffect)(()=>{Promise.resolve().then(()=>{if(r&&r.fields&&r.fields.length!==0){if(!a||a.length===0){if(e){let t={id:`view_${e}_default`,entityCode:e,name:`Все записи`,type:`table`,isDefault:!0,visibleFieldKeys:r.fields.slice(0,6).map(e=>e.key),filters:[],filterConjunction:`AND`,sortBy:`updatedAt`,sortOrder:`desc`};L(t),F(t.id)}return}if(P){let e=a.find(e=>e.id===P);if(e&&!R){let t=e.visibleFieldKeys&&e.visibleFieldKeys.length>0?e.visibleFieldKeys:r.fields.slice(0,6).map(e=>e.key);L({...e,visibleFieldKeys:t})}}else{let e=a.find(e=>e.isDefault)||a[0],t=e.visibleFieldKeys&&e.visibleFieldKeys.length>0?e.visibleFieldKeys:r.fields.slice(0,6).map(e=>e.key);F(e.id),L({...e,visibleFieldKeys:t})}}})},[a,P,e,r,R]);let K=(0,j.useCallback)(async()=>{if(!e)return;let t=await s(e,{pageSize:50});G(t.items)},[e]);(0,j.useEffect)(()=>{Promise.resolve().then(()=>{K()})},[K]);let q=(0,j.useMemo)(()=>{if(!I)return W;let e=[...W];if(I.filters&&I.filters.length>0){let t=I.filterConjunction||`AND`;e=e.filter(e=>{let n=I.filters.map(t=>{let n=e[t.field],r=t.value;switch(t.operator){case`eq`:return String(n??``).toLowerCase()===String(r??``).toLowerCase();case`neq`:return String(n??``).toLowerCase()!==String(r??``).toLowerCase();case`contains`:return String(n??``).toLowerCase().includes(String(r??``).toLowerCase());case`gt`:return Number(n)>Number(r);case`lt`:return Number(n){let i=e[t],a=r[t];if(i===a)return 0;if(i==null)return 1;if(a==null)return-1;let o=i>a?1:-1;return n===`desc`?-o:o})}return e},[W,I]),J=e=>{if(!I)return;let t=I.visibleFieldKeys||[],n;if(t.includes(e)){if(t.length<=1){D({type:`error`,title:`В представлении должна быть минимум 1 колонка`});return}n=t.filter(t=>t!==e)}else n=[...t,e];L({...I,visibleFieldKeys:n}),z(!0)},Y=(e,t)=>{if(!I)return;let n=[...I.visibleFieldKeys],[r]=n.splice(e,1);n.splice(t,0,r),L({...I,visibleFieldKeys:n}),z(!0)},X=()=>{if(!I)return;let e={field:k[0]?.key||`name`,operator:`contains`,value:``};L({...I,filters:[...I.filters||[],e]}),z(!0)},Z=(e,t)=>{if(!I)return;let n=[...I.filters||[]];n[e]={...n[e],...t},L({...I,filters:n}),z(!0)},Q=e=>{I&&(L({...I,filters:I.filters.filter((t,n)=>n!==e)}),z(!0))};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)(p,{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)(d,{className:`w-4 h-4 text-krona-green`}),(0,M.jsxs)(`h1`,{className:`text-base font-bold text-krona-primary`,children:[`Конструктор представлений: `,r?.name||e]}),R&&(0,M.jsx)(i,{variant:`warning`,size:`sm`,children:`Несохранённые изменения`})]}),(0,M.jsx)(`p`,{className:`text-xs text-krona-secondary`,children:`Настройка колонок таблицы, расширенной фильтрации (AND/OR), сортировки и сохранённых видов`})]})]}),(0,M.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,M.jsxs)(n,{variant:`outline`,size:`sm`,onClick:()=>{if(!I||q.length===0){D({type:`info`,title:`Нет записей для экспорта`});return}let t=I.visibleFieldKeys.map(e=>N.get(e)||{key:e,label:e}),n=``+[t.map(e=>`"${e.label.replace(/"/g,`""`)}"`).join(`,`),...q.map(e=>t.map(t=>{let n=e[t.key];return n==null?`""`:`"${String(n).replace(/"/g,`""`)}"`}).join(`,`))].join(`\r -`),r=new Blob([n],{type:`text/csv;charset=utf-8;`}),i=URL.createObjectURL(r),a=document.createElement(`a`);a.setAttribute(`href`,i),a.setAttribute(`download`,`${e}_export_${new Date().toISOString().slice(0,10)}.csv`),document.body.appendChild(a),a.click(),document.body.removeChild(a),D({type:`success`,title:`Файл CSV успешно сформирован и загружен`})},children:[(0,M.jsx)(f,{className:`w-3.5 h-3.5 mr-1`}),`Экспорт CSV`]}),(0,M.jsxs)(n,{variant:`primary`,size:`sm`,"data-testid":`save-view-btn`,onClick:async()=>{if(I)try{await C(I),z(!1),D({type:`success`,title:`Представление «${I.name}» сохранено`})}catch(e){D({type:`error`,title:`Ошибка сохранения представления`,message:e instanceof Error?e.message:String(e)})}},disabled:!I,children:[(0,M.jsx)(u,{className:`w-3.5 h-3.5 mr-1`}),`Сохранить вид`]})]})]}),(0,M.jsxs)(`div`,{className:`flex items-center justify-between gap-2 p-2 bg-krona-surface border border-krona-border rounded-xl overflow-x-auto`,children:[(0,M.jsxs)(`div`,{className:`flex items-center gap-1`,children:[a.map(e=>(0,M.jsxs)(`button`,{onClick:()=>{F(e.id),L({...e}),z(!1)},className:`px-3 py-1.5 rounded-lg text-xs font-medium cursor-pointer transition-all flex items-center gap-1.5 ${P===e.id?`bg-krona-green text-white shadow-sm`:`bg-krona-workspace text-krona-secondary hover:text-krona-primary`}`,children:[(0,M.jsx)(`span`,{children:e.name}),e.isDefault&&(0,M.jsx)(`span`,{className:`text-[10px] opacity-80`,title:`По умолчанию`,children:`★`})]},e.id)),(0,M.jsxs)(`button`,{onClick:()=>V(!0),className:`px-2.5 py-1.5 rounded-lg text-xs font-medium bg-krona-workspace hover:bg-krona-surface-muted text-krona-secondary hover:text-krona-primary flex items-center gap-1 border border-dashed border-krona-border cursor-pointer`,children:[(0,M.jsx)(x,{className:`w-3 h-3`}),`Создать вид`]})]}),I&&!I.isDefault&&(0,M.jsxs)(`button`,{onClick:async()=>{if(I){if(I.isDefault){D({type:`error`,title:`Нельзя удалить представление по умолчанию`});return}if(confirm(`Удалить сохранённое представление «${I.name}»?`))try{await T(I.id),D({type:`success`,title:`Представление удалено`}),F(``),L(null)}catch(e){D({type:`error`,title:`Ошибка удаления`,message:e instanceof Error?e.message:String(e)})}}},className:`text-xs text-krona-danger hover:underline px-2 py-1 flex items-center gap-1 cursor-pointer`,children:[(0,M.jsx)(b,{className:`w-3.5 h-3.5`}),`Удалить этот вид`]})]}),I&&(0,M.jsxs)(`div`,{className:`grid grid-cols-1 lg:grid-cols-12 gap-4`,children:[(0,M.jsxs)(`div`,{className:`lg:col-span-4 space-y-4`,children:[(0,M.jsxs)(`div`,{className:`p-3.5 bg-krona-surface border border-krona-border rounded-xl space-y-3`,children:[(0,M.jsx)(m,{label:`Название представления`,value:I.name,onChange:e=>{L({...I,name:e.target.value}),z(!0)}}),(0,M.jsxs)(`label`,{className:`flex items-center gap-2 cursor-pointer text-xs font-medium text-krona-primary`,children:[(0,M.jsx)(`input`,{type:`checkbox`,checked:I.isDefault||!1,onChange:e=>{L({...I,isDefault:e.target.checked}),z(!0)},className:`rounded text-krona-green`}),`Представление по умолчанию для всех`]})]}),(0,M.jsxs)(`div`,{className:`p-3.5 bg-krona-surface border border-krona-border rounded-xl space-y-3`,children:[(0,M.jsx)(`div`,{className:`flex items-center justify-between`,children:(0,M.jsxs)(`span`,{className:`text-xs font-bold text-krona-primary uppercase tracking-wider flex items-center gap-1.5`,children:[(0,M.jsx)(w,{className:`w-3.5 h-3.5 text-krona-green`}),`Колонки таблицы (`,I.visibleFieldKeys.length,`)`]})}),(0,M.jsx)(`div`,{className:`space-y-1.5 max-h-56 overflow-y-auto pr-1`,children:I.visibleFieldKeys.map((e,t)=>{let n=N.get(e);return(0,M.jsxs)(`div`,{"data-testid":`column-pill-${e}`,draggable:!0,onDragStart:e=>{e.dataTransfer.setData(`text/plain`,String(t))},onDragOver:e=>e.preventDefault(),onDrop:e=>{e.preventDefault();let n=Number(e.dataTransfer.getData(`text/plain`));!isNaN(n)&&n!==t&&Y(n,t)},className:`flex items-center justify-between p-2 rounded bg-krona-workspace text-xs border border-krona-border/60 cursor-grab active:cursor-grabbing`,children:[(0,M.jsx)(`span`,{className:`font-medium text-krona-primary truncate`,children:n?.label||e}),(0,M.jsxs)(`div`,{className:`flex items-center gap-1`,children:[(0,M.jsx)(`button`,{type:`button`,onClick:()=>Y(t,t-1),disabled:t===0,className:`p-1 text-krona-secondary hover:text-krona-primary disabled:opacity-20`,title:`Влево`,children:(0,M.jsx)(A,{className:`w-3 h-3`})}),(0,M.jsx)(`button`,{type:`button`,onClick:()=>Y(t,t+1),disabled:t===I.visibleFieldKeys.length-1,className:`p-1 text-krona-secondary hover:text-krona-primary disabled:opacity-20`,title:`Вправо`,children:(0,M.jsx)(O,{className:`w-3 h-3`})}),(0,M.jsx)(`button`,{type:`button`,onClick:()=>J(e),className:`p-1 text-krona-danger hover:bg-krona-danger/10 rounded`,title:`Скрыть колонку`,children:`✕`})]})]},e)})}),(0,M.jsxs)(`div`,{className:`pt-2 border-t border-krona-border/60`,children:[(0,M.jsx)(`span`,{className:`text-[11px] font-semibold text-krona-secondary block mb-1.5`,children:`Доступные поля сущности:`}),(0,M.jsx)(`div`,{className:`space-y-1 max-h-36 overflow-y-auto text-xs`,children:k.map(e=>{let t=I.visibleFieldKeys.includes(e.key);return(0,M.jsxs)(`label`,{className:`flex items-center gap-2 p-1 rounded hover:bg-krona-workspace cursor-pointer`,children:[(0,M.jsx)(`input`,{type:`checkbox`,checked:t,onChange:()=>J(e.key),className:`rounded text-krona-green`}),(0,M.jsx)(`span`,{className:`truncate text-krona-primary`,children:e.label}),(0,M.jsx)(`span`,{className:`text-[10px] font-mono text-krona-secondary ml-auto`,children:e.key})]},e.key)})})]})]}),(0,M.jsxs)(`div`,{className:`p-3.5 bg-krona-surface border border-krona-border rounded-xl space-y-3`,children:[(0,M.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,M.jsxs)(`span`,{className:`text-xs font-bold text-krona-primary uppercase tracking-wider flex items-center gap-1.5`,children:[(0,M.jsx)(E,{className:`w-3.5 h-3.5 text-krona-gold`}),`Фильтрация (`,I.filters?.length||0,`)`]}),(0,M.jsx)(`div`,{className:`flex items-center gap-1 bg-krona-workspace rounded p-0.5 border border-krona-border`,children:[`AND`,`OR`].map(e=>(0,M.jsx)(`button`,{onClick:()=>{L({...I,filterConjunction:e}),z(!0)},className:`px-2 py-0.5 text-[10px] font-bold rounded ${(I.filterConjunction||`AND`)===e?`bg-krona-green text-white`:`text-krona-secondary`}`,children:e===`AND`?`И`:`ИЛИ`},e))})]}),(0,M.jsx)(`div`,{className:`space-y-2`,children:I.filters?.map((e,t)=>(0,M.jsxs)(`div`,{className:`p-2 bg-krona-workspace rounded-lg border border-krona-border/60 space-y-1.5`,children:[(0,M.jsxs)(`div`,{className:`flex items-center justify-between gap-1`,children:[(0,M.jsx)(`select`,{value:e.field,onChange:e=>Z(t,{field:e.target.value}),className:`bg-krona-surface text-krona-primary border border-krona-border rounded px-2 py-1 text-xs w-full`,children:k.map(e=>(0,M.jsx)(`option`,{value:e.key,children:e.label},e.key))}),(0,M.jsx)(`button`,{type:`button`,onClick:()=>Q(t),className:`p-1 text-krona-danger hover:bg-krona-danger/10 rounded`,title:`Удалить фильтр`,children:(0,M.jsx)(b,{className:`w-3.5 h-3.5`})})]}),(0,M.jsxs)(`div`,{className:`grid grid-cols-2 gap-1.5`,children:[(0,M.jsxs)(`select`,{value:e.operator,onChange:e=>Z(t,{operator:e.target.value}),className:`bg-krona-surface text-krona-primary border border-krona-border rounded px-2 py-1 text-xs`,children:[(0,M.jsx)(`option`,{value:`contains`,children:`содержит`}),(0,M.jsx)(`option`,{value:`eq`,children:`равно`}),(0,M.jsx)(`option`,{value:`neq`,children:`не равно`}),(0,M.jsx)(`option`,{value:`gt`,children:`больше (>)`}),(0,M.jsx)(`option`,{value:`lt`,children:`меньше (<)`}),(0,M.jsx)(`option`,{value:`is_empty`,children:`пусто`}),(0,M.jsx)(`option`,{value:`is_not_empty`,children:`не пусто`})]}),e.operator!==`is_empty`&&e.operator!==`is_not_empty`&&(0,M.jsx)(`input`,{type:`text`,placeholder:`Значение...`,value:String(e.value??``),onChange:e=>Z(t,{value:e.target.value}),className:`bg-krona-surface text-krona-primary border border-krona-border rounded px-2 py-1 text-xs`})]})]},t))}),(0,M.jsxs)(n,{variant:`outline`,size:`sm`,className:`w-full text-xs`,onClick:X,children:[(0,M.jsx)(x,{className:`w-3 h-3 mr-1`}),`Добавить условие`]})]}),(0,M.jsxs)(`div`,{className:`p-3.5 bg-krona-surface border border-krona-border rounded-xl space-y-2`,children:[(0,M.jsxs)(`span`,{className:`text-xs font-bold text-krona-primary uppercase tracking-wider flex items-center gap-1.5`,children:[(0,M.jsx)(c,{className:`w-3.5 h-3.5 text-krona-info`}),`Сортировка`]}),(0,M.jsxs)(`div`,{className:`grid grid-cols-2 gap-2`,children:[(0,M.jsxs)(`select`,{value:I.sortBy||``,onChange:e=>{L({...I,sortBy:e.target.value}),z(!0)},className:`bg-krona-surface text-krona-primary border border-krona-border rounded px-2 py-1.5 text-xs`,children:[(0,M.jsx)(`option`,{value:``,children:`Без сортировки`}),k.map(e=>(0,M.jsx)(`option`,{value:e.key,children:e.label},e.key))]}),(0,M.jsxs)(`select`,{value:I.sortOrder||`asc`,onChange:e=>{L({...I,sortOrder:e.target.value}),z(!0)},className:`bg-krona-surface text-krona-primary border border-krona-border rounded px-2 py-1.5 text-xs`,children:[(0,M.jsx)(`option`,{value:`asc`,children:`По возрастанию (А-Я)`}),(0,M.jsx)(`option`,{value:`desc`,children:`По убыванию (Я-А)`})]})]})]})]}),(0,M.jsx)(`div`,{className:`lg:col-span-8 space-y-3`,children:(0,M.jsxs)(`div`,{className:`p-3.5 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 text-xs`,children:[(0,M.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,M.jsx)(l,{className:`w-4 h-4 text-krona-gold`}),(0,M.jsx)(`span`,{className:`font-semibold text-krona-primary`,children:`Интерактивное превью таблицы данных`})]}),(0,M.jsxs)(`span`,{className:`text-krona-secondary`,children:[`Отображается записей: `,(0,M.jsx)(`strong`,{children:q.length}),` (всего в базе:`,` `,W.length,`)`]})]}),(0,M.jsx)(`div`,{className:`overflow-x-auto border border-krona-border rounded-lg max-h-[550px]`,children:(0,M.jsxs)(`table`,{className:`w-full text-left text-xs border-collapse`,children:[(0,M.jsx)(`thead`,{className:`bg-krona-workspace sticky top-0 border-b border-krona-border`,children:(0,M.jsx)(`tr`,{children:I.visibleFieldKeys.map(e=>{let t=N.get(e);return(0,M.jsx)(`th`,{className:`p-2.5 font-semibold text-krona-primary border-r border-krona-border/60 last:border-r-0 whitespace-nowrap`,children:t?.label||e},e)})})}),(0,M.jsxs)(`tbody`,{className:`divide-y divide-krona-border/60 bg-krona-surface`,children:[q.map(e=>(0,M.jsx)(`tr`,{className:`hover:bg-krona-workspace/50 transition-colors`,children:I.visibleFieldKeys.map(t=>{let n=N.get(t),r=e[t],a=`—`;return r!=null&&r!==``&&(a=n?.type===`money`?typeof r==`number`?S(r):String(r):n?.type===`boolean`?r?`Да`:`Нет`:n?.type===`date`||n?.type===`datetime`?y(String(r)):String(r)),(0,M.jsx)(`td`,{className:`p-2.5 text-krona-secondary truncate max-w-xs border-r border-krona-border/40 last:border-r-0`,children:t===`status`?(0,M.jsx)(i,{variant:`neutral`,size:`sm`,children:a}):(0,M.jsx)(`span`,{className:`text-krona-primary font-medium`,children:a})},t)})},e.id)),q.length===0&&(0,M.jsx)(`tr`,{children:(0,M.jsx)(`td`,{colSpan:I.visibleFieldKeys.length,className:`text-center py-10 text-krona-secondary`,children:`Записи не найдены или отфильтрованы`})})]})]})})]})})]}),(0,M.jsx)(v,{isOpen:B,onClose:()=>V(!1),title:`Новое представление`,subtitle:`Создайте сохранённый вид таблицы с индивидуальными фильтрами и колонками`,maxWidth:`sm`,children:(0,M.jsxs)(`div`,{className:`space-y-4`,children:[(0,M.jsx)(m,{label:`Название представления *`,value:H,onChange:e=>U(e.target.value),placeholder:`Например: Мои активные заявки`,autoFocus:!0}),(0,M.jsxs)(`div`,{className:`flex justify-end gap-2 pt-3 border-t border-krona-border`,children:[(0,M.jsx)(n,{variant:`outline`,size:`sm`,onClick:()=>V(!1),children:`Отмена`}),(0,M.jsx)(n,{variant:`primary`,size:`sm`,onClick:async()=>{if(!H.trim()||!e)return;let t=`view_${Date.now().toString(36)}`,n={id:t,entityCode:e,name:H.trim(),type:`table`,isDefault:!1,visibleFieldKeys:k.slice(0,5).map(e=>e.key),filters:[],filterConjunction:`AND`};try{await C(n),F(t),L(n),V(!1),U(``),D({type:`success`,title:`Представление «${n.name}» создано`})}catch(e){D({type:`error`,title:`Ошибка создания представления`,message:e instanceof Error?e.message:String(e)})}},children:`Создать`})]})]})})]})};export{N as ViewBuilder,N as default}; \ No newline at end of file +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"./arrow-up-down--M136cK3.js";import{t as l}from"./eye-CkF1gwUX.js";import{t as u}from"./save-D8euL60I.js";import{t as d}from"./table-_fqSCPRE.js";import{$ as f,L as p,T as m,a as h,ht as g,lt as _,mt as v,nt as y,r as b,u as x}from"./index-CrJKtV0u.js";import{t as S}from"./currency-DdDs82F5.js";var C={name:`columns-2`,size:24,node:[[`rect`,{width:`18`,height:`18`,x:`3`,y:`3`,rx:`2`,key:`afitv7`}],[`path`,{d:`M12 3v18`,key:`108xh3`}]],aliases:[`columns`]};C.node;var w=r(C),T={name:`funnel`,size:24,node:[[`path`,{d:`M10 20a1 1 0 0 0 .553.895l2 1A1 1 0 0 0 14 21v-7a2 2 0 0 1 .517-1.341L21.74 4.67A1 1 0 0 0 21 3H3a1 1 0 0 0-.742 1.67l7.225 7.989A2 2 0 0 1 10 14z`,key:`sc7q7i`}]],aliases:[`filter`]};T.node;var E=r(T),D={name:`move-right`,size:24,node:[[`path`,{d:`M18 8L22 12L18 16`,key:`1r0oui`}],[`path`,{d:`M2 12H22`,key:`1m8cig`}]]};D.node;var O=r(D),k={name:`move-left`,size:24,node:[[`path`,{d:`M6 8L2 12L6 16`,key:`kyvwex`}],[`path`,{d:`M2 12H22`,key:`1m8cig`}]]};k.node;var A=r(k),j=t(e(),1),M=a(),N=()=>{let{entityCode:e}=g(),t=v(),{currentEntity:r,views:a,saveView:C,deleteView:T}=y(e),{showToast:D}=o(),k=(0,j.useMemo)(()=>r?.fields||[],[r]),N=(0,j.useMemo)(()=>{let e=new Map;return k.forEach(t=>e.set(t.key,t)),e},[k]),[P,F]=(0,j.useState)(``),[I,L]=(0,j.useState)(null),[R,z]=(0,j.useState)(!1),[B,V]=(0,j.useState)(!1),[H,U]=(0,j.useState)(``),[W,G]=(0,j.useState)([]);(0,j.useEffect)(()=>{Promise.resolve().then(()=>{if(r&&r.fields&&r.fields.length!==0){if(!a||a.length===0){if(e){let t={id:`view_${e}_default`,entityCode:e,name:`Все записи`,type:`table`,isDefault:!0,visibleFieldKeys:r.fields.slice(0,6).map(e=>e.key),filters:[],filterConjunction:`AND`,sortBy:`updatedAt`,sortOrder:`desc`};L(t),F(t.id)}return}if(P){let e=a.find(e=>e.id===P);if(e&&!R){let t=e.visibleFieldKeys&&e.visibleFieldKeys.length>0?e.visibleFieldKeys:r.fields.slice(0,6).map(e=>e.key);L({...e,visibleFieldKeys:t})}}else{let e=a.find(e=>e.isDefault)||a[0],t=e.visibleFieldKeys&&e.visibleFieldKeys.length>0?e.visibleFieldKeys:r.fields.slice(0,6).map(e=>e.key);F(e.id),L({...e,visibleFieldKeys:t})}}})},[a,P,e,r,R]);let K=(0,j.useCallback)(async()=>{if(!e)return;let t=await s(e,{pageSize:50});G(t.items)},[e]);(0,j.useEffect)(()=>{Promise.resolve().then(()=>{K()})},[K]);let q=(0,j.useMemo)(()=>{if(!I)return W;let e=[...W];if(I.filters&&I.filters.length>0){let t=I.filterConjunction||`AND`;e=e.filter(e=>{let n=I.filters.map(t=>{let n=e[t.field],r=t.value;switch(t.operator){case`eq`:return String(n??``).toLowerCase()===String(r??``).toLowerCase();case`neq`:return String(n??``).toLowerCase()!==String(r??``).toLowerCase();case`contains`:return String(n??``).toLowerCase().includes(String(r??``).toLowerCase());case`gt`:return Number(n)>Number(r);case`lt`:return Number(n){let i=e[t],a=r[t];if(i===a)return 0;if(i==null)return 1;if(a==null)return-1;let o=i>a?1:-1;return n===`desc`?-o:o})}return e},[W,I]),J=e=>{if(!I)return;let t=I.visibleFieldKeys||[],n;if(t.includes(e)){if(t.length<=1){D({type:`error`,title:`В представлении должна быть минимум 1 колонка`});return}n=t.filter(t=>t!==e)}else n=[...t,e];L({...I,visibleFieldKeys:n}),z(!0)},Y=(e,t)=>{if(!I)return;let n=[...I.visibleFieldKeys],[r]=n.splice(e,1);n.splice(t,0,r),L({...I,visibleFieldKeys:n}),z(!0)},X=()=>{if(!I)return;let e={field:k[0]?.key||`name`,operator:`contains`,value:``};L({...I,filters:[...I.filters||[],e]}),z(!0)},Z=(e,t)=>{if(!I)return;let n=[...I.filters||[]];n[e]={...n[e],...t},L({...I,filters:n}),z(!0)},Q=e=>{I&&(L({...I,filters:I.filters.filter((t,n)=>n!==e)}),z(!0))};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)(f,{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)(d,{className:`w-4 h-4 text-krona-green`}),(0,M.jsxs)(`h1`,{className:`text-base font-bold text-krona-primary`,children:[`Конструктор представлений: `,r?.name||e]}),R&&(0,M.jsx)(i,{variant:`warning`,size:`sm`,children:`Несохранённые изменения`})]}),(0,M.jsx)(`p`,{className:`text-xs text-krona-secondary`,children:`Настройка колонок таблицы, расширенной фильтрации (AND/OR), сортировки и сохранённых видов`})]})]}),(0,M.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,M.jsxs)(n,{variant:`outline`,size:`sm`,onClick:()=>{if(!I||q.length===0){D({type:`info`,title:`Нет записей для экспорта`});return}let t=I.visibleFieldKeys.map(e=>N.get(e)||{key:e,label:e}),n=``+[t.map(e=>`"${e.label.replace(/"/g,`""`)}"`).join(`,`),...q.map(e=>t.map(t=>{let n=e[t.key];return n==null?`""`:`"${String(n).replace(/"/g,`""`)}"`}).join(`,`))].join(`\r +`),r=new Blob([n],{type:`text/csv;charset=utf-8;`}),i=URL.createObjectURL(r),a=document.createElement(`a`);a.setAttribute(`href`,i),a.setAttribute(`download`,`${e}_export_${new Date().toISOString().slice(0,10)}.csv`),document.body.appendChild(a),a.click(),document.body.removeChild(a),D({type:`success`,title:`Файл CSV успешно сформирован и загружен`})},children:[(0,M.jsx)(p,{className:`w-3.5 h-3.5 mr-1`}),`Экспорт CSV`]}),(0,M.jsxs)(n,{variant:`primary`,size:`sm`,"data-testid":`save-view-btn`,onClick:async()=>{if(I)try{await C(I),z(!1),D({type:`success`,title:`Представление «${I.name}» сохранено`})}catch(e){D({type:`error`,title:`Ошибка сохранения представления`,message:e instanceof Error?e.message:String(e)})}},disabled:!I,children:[(0,M.jsx)(u,{className:`w-3.5 h-3.5 mr-1`}),`Сохранить вид`]})]})]}),(0,M.jsxs)(`div`,{className:`flex items-center justify-between gap-2 p-2 bg-krona-surface border border-krona-border rounded-xl overflow-x-auto`,children:[(0,M.jsxs)(`div`,{className:`flex items-center gap-1`,children:[a.map(e=>(0,M.jsxs)(`button`,{onClick:()=>{F(e.id),L({...e}),z(!1)},className:`px-3 py-1.5 rounded-lg text-xs font-medium cursor-pointer transition-all flex items-center gap-1.5 ${P===e.id?`bg-krona-green text-white shadow-sm`:`bg-krona-workspace text-krona-secondary hover:text-krona-primary`}`,children:[(0,M.jsx)(`span`,{children:e.name}),e.isDefault&&(0,M.jsx)(`span`,{className:`text-[10px] opacity-80`,title:`По умолчанию`,children:`★`})]},e.id)),(0,M.jsxs)(`button`,{onClick:()=>V(!0),className:`px-2.5 py-1.5 rounded-lg text-xs font-medium bg-krona-workspace hover:bg-krona-surface-muted text-krona-secondary hover:text-krona-primary flex items-center gap-1 border border-dashed border-krona-border cursor-pointer`,children:[(0,M.jsx)(m,{className:`w-3 h-3`}),`Создать вид`]})]}),I&&!I.isDefault&&(0,M.jsxs)(`button`,{onClick:async()=>{if(I){if(I.isDefault){D({type:`error`,title:`Нельзя удалить представление по умолчанию`});return}if(confirm(`Удалить сохранённое представление «${I.name}»?`))try{await T(I.id),D({type:`success`,title:`Представление удалено`}),F(``),L(null)}catch(e){D({type:`error`,title:`Ошибка удаления`,message:e instanceof Error?e.message:String(e)})}}},className:`text-xs text-krona-danger hover:underline px-2 py-1 flex items-center gap-1 cursor-pointer`,children:[(0,M.jsx)(x,{className:`w-3.5 h-3.5`}),`Удалить этот вид`]})]}),I&&(0,M.jsxs)(`div`,{className:`grid grid-cols-1 lg:grid-cols-12 gap-4`,children:[(0,M.jsxs)(`div`,{className:`lg:col-span-4 space-y-4`,children:[(0,M.jsxs)(`div`,{className:`p-3.5 bg-krona-surface border border-krona-border rounded-xl space-y-3`,children:[(0,M.jsx)(h,{label:`Название представления`,value:I.name,onChange:e=>{L({...I,name:e.target.value}),z(!0)}}),(0,M.jsxs)(`label`,{className:`flex items-center gap-2 cursor-pointer text-xs font-medium text-krona-primary`,children:[(0,M.jsx)(`input`,{type:`checkbox`,checked:I.isDefault||!1,onChange:e=>{L({...I,isDefault:e.target.checked}),z(!0)},className:`rounded text-krona-green`}),`Представление по умолчанию для всех`]})]}),(0,M.jsxs)(`div`,{className:`p-3.5 bg-krona-surface border border-krona-border rounded-xl space-y-3`,children:[(0,M.jsx)(`div`,{className:`flex items-center justify-between`,children:(0,M.jsxs)(`span`,{className:`text-xs font-bold text-krona-primary uppercase tracking-wider flex items-center gap-1.5`,children:[(0,M.jsx)(w,{className:`w-3.5 h-3.5 text-krona-green`}),`Колонки таблицы (`,I.visibleFieldKeys.length,`)`]})}),(0,M.jsx)(`div`,{className:`space-y-1.5 max-h-56 overflow-y-auto pr-1`,children:I.visibleFieldKeys.map((e,t)=>{let n=N.get(e);return(0,M.jsxs)(`div`,{"data-testid":`column-pill-${e}`,draggable:!0,onDragStart:e=>{e.dataTransfer.setData(`text/plain`,String(t))},onDragOver:e=>e.preventDefault(),onDrop:e=>{e.preventDefault();let n=Number(e.dataTransfer.getData(`text/plain`));!isNaN(n)&&n!==t&&Y(n,t)},className:`flex items-center justify-between p-2 rounded bg-krona-workspace text-xs border border-krona-border/60 cursor-grab active:cursor-grabbing`,children:[(0,M.jsx)(`span`,{className:`font-medium text-krona-primary truncate`,children:n?.label||e}),(0,M.jsxs)(`div`,{className:`flex items-center gap-1`,children:[(0,M.jsx)(`button`,{type:`button`,onClick:()=>Y(t,t-1),disabled:t===0,className:`p-1 text-krona-secondary hover:text-krona-primary disabled:opacity-20`,title:`Влево`,children:(0,M.jsx)(A,{className:`w-3 h-3`})}),(0,M.jsx)(`button`,{type:`button`,onClick:()=>Y(t,t+1),disabled:t===I.visibleFieldKeys.length-1,className:`p-1 text-krona-secondary hover:text-krona-primary disabled:opacity-20`,title:`Вправо`,children:(0,M.jsx)(O,{className:`w-3 h-3`})}),(0,M.jsx)(`button`,{type:`button`,onClick:()=>J(e),className:`p-1 text-krona-danger hover:bg-krona-danger/10 rounded`,title:`Скрыть колонку`,children:`✕`})]})]},e)})}),(0,M.jsxs)(`div`,{className:`pt-2 border-t border-krona-border/60`,children:[(0,M.jsx)(`span`,{className:`text-[11px] font-semibold text-krona-secondary block mb-1.5`,children:`Доступные поля сущности:`}),(0,M.jsx)(`div`,{className:`space-y-1 max-h-36 overflow-y-auto text-xs`,children:k.map(e=>{let t=I.visibleFieldKeys.includes(e.key);return(0,M.jsxs)(`label`,{className:`flex items-center gap-2 p-1 rounded hover:bg-krona-workspace cursor-pointer`,children:[(0,M.jsx)(`input`,{type:`checkbox`,checked:t,onChange:()=>J(e.key),className:`rounded text-krona-green`}),(0,M.jsx)(`span`,{className:`truncate text-krona-primary`,children:e.label}),(0,M.jsx)(`span`,{className:`text-[10px] font-mono text-krona-secondary ml-auto`,children:e.key})]},e.key)})})]})]}),(0,M.jsxs)(`div`,{className:`p-3.5 bg-krona-surface border border-krona-border rounded-xl space-y-3`,children:[(0,M.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,M.jsxs)(`span`,{className:`text-xs font-bold text-krona-primary uppercase tracking-wider flex items-center gap-1.5`,children:[(0,M.jsx)(E,{className:`w-3.5 h-3.5 text-krona-gold`}),`Фильтрация (`,I.filters?.length||0,`)`]}),(0,M.jsx)(`div`,{className:`flex items-center gap-1 bg-krona-workspace rounded p-0.5 border border-krona-border`,children:[`AND`,`OR`].map(e=>(0,M.jsx)(`button`,{onClick:()=>{L({...I,filterConjunction:e}),z(!0)},className:`px-2 py-0.5 text-[10px] font-bold rounded ${(I.filterConjunction||`AND`)===e?`bg-krona-green text-white`:`text-krona-secondary`}`,children:e===`AND`?`И`:`ИЛИ`},e))})]}),(0,M.jsx)(`div`,{className:`space-y-2`,children:I.filters?.map((e,t)=>(0,M.jsxs)(`div`,{className:`p-2 bg-krona-workspace rounded-lg border border-krona-border/60 space-y-1.5`,children:[(0,M.jsxs)(`div`,{className:`flex items-center justify-between gap-1`,children:[(0,M.jsx)(`select`,{value:e.field,onChange:e=>Z(t,{field:e.target.value}),className:`bg-krona-surface text-krona-primary border border-krona-border rounded px-2 py-1 text-xs w-full`,children:k.map(e=>(0,M.jsx)(`option`,{value:e.key,children:e.label},e.key))}),(0,M.jsx)(`button`,{type:`button`,onClick:()=>Q(t),className:`p-1 text-krona-danger hover:bg-krona-danger/10 rounded`,title:`Удалить фильтр`,children:(0,M.jsx)(x,{className:`w-3.5 h-3.5`})})]}),(0,M.jsxs)(`div`,{className:`grid grid-cols-2 gap-1.5`,children:[(0,M.jsxs)(`select`,{value:e.operator,onChange:e=>Z(t,{operator:e.target.value}),className:`bg-krona-surface text-krona-primary border border-krona-border rounded px-2 py-1 text-xs`,children:[(0,M.jsx)(`option`,{value:`contains`,children:`содержит`}),(0,M.jsx)(`option`,{value:`eq`,children:`равно`}),(0,M.jsx)(`option`,{value:`neq`,children:`не равно`}),(0,M.jsx)(`option`,{value:`gt`,children:`больше (>)`}),(0,M.jsx)(`option`,{value:`lt`,children:`меньше (<)`}),(0,M.jsx)(`option`,{value:`is_empty`,children:`пусто`}),(0,M.jsx)(`option`,{value:`is_not_empty`,children:`не пусто`})]}),e.operator!==`is_empty`&&e.operator!==`is_not_empty`&&(0,M.jsx)(`input`,{type:`text`,placeholder:`Значение...`,value:String(e.value??``),onChange:e=>Z(t,{value:e.target.value}),className:`bg-krona-surface text-krona-primary border border-krona-border rounded px-2 py-1 text-xs`})]})]},t))}),(0,M.jsxs)(n,{variant:`outline`,size:`sm`,className:`w-full text-xs`,onClick:X,children:[(0,M.jsx)(m,{className:`w-3 h-3 mr-1`}),`Добавить условие`]})]}),(0,M.jsxs)(`div`,{className:`p-3.5 bg-krona-surface border border-krona-border rounded-xl space-y-2`,children:[(0,M.jsxs)(`span`,{className:`text-xs font-bold text-krona-primary uppercase tracking-wider flex items-center gap-1.5`,children:[(0,M.jsx)(c,{className:`w-3.5 h-3.5 text-krona-info`}),`Сортировка`]}),(0,M.jsxs)(`div`,{className:`grid grid-cols-2 gap-2`,children:[(0,M.jsxs)(`select`,{value:I.sortBy||``,onChange:e=>{L({...I,sortBy:e.target.value}),z(!0)},className:`bg-krona-surface text-krona-primary border border-krona-border rounded px-2 py-1.5 text-xs`,children:[(0,M.jsx)(`option`,{value:``,children:`Без сортировки`}),k.map(e=>(0,M.jsx)(`option`,{value:e.key,children:e.label},e.key))]}),(0,M.jsxs)(`select`,{value:I.sortOrder||`asc`,onChange:e=>{L({...I,sortOrder:e.target.value}),z(!0)},className:`bg-krona-surface text-krona-primary border border-krona-border rounded px-2 py-1.5 text-xs`,children:[(0,M.jsx)(`option`,{value:`asc`,children:`По возрастанию (А-Я)`}),(0,M.jsx)(`option`,{value:`desc`,children:`По убыванию (Я-А)`})]})]})]})]}),(0,M.jsx)(`div`,{className:`lg:col-span-8 space-y-3`,children:(0,M.jsxs)(`div`,{className:`p-3.5 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 text-xs`,children:[(0,M.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,M.jsx)(l,{className:`w-4 h-4 text-krona-gold`}),(0,M.jsx)(`span`,{className:`font-semibold text-krona-primary`,children:`Интерактивное превью таблицы данных`})]}),(0,M.jsxs)(`span`,{className:`text-krona-secondary`,children:[`Отображается записей: `,(0,M.jsx)(`strong`,{children:q.length}),` (всего в базе:`,` `,W.length,`)`]})]}),(0,M.jsx)(`div`,{className:`overflow-x-auto border border-krona-border rounded-lg max-h-[550px]`,children:(0,M.jsxs)(`table`,{className:`w-full text-left text-xs border-collapse`,children:[(0,M.jsx)(`thead`,{className:`bg-krona-workspace sticky top-0 border-b border-krona-border`,children:(0,M.jsx)(`tr`,{children:I.visibleFieldKeys.map(e=>{let t=N.get(e);return(0,M.jsx)(`th`,{className:`p-2.5 font-semibold text-krona-primary border-r border-krona-border/60 last:border-r-0 whitespace-nowrap`,children:t?.label||e},e)})})}),(0,M.jsxs)(`tbody`,{className:`divide-y divide-krona-border/60 bg-krona-surface`,children:[q.map(e=>(0,M.jsx)(`tr`,{className:`hover:bg-krona-workspace/50 transition-colors`,children:I.visibleFieldKeys.map(t=>{let n=N.get(t),r=e[t],a=`—`;return r!=null&&r!==``&&(a=n?.type===`money`?typeof r==`number`?S(r):String(r):n?.type===`boolean`?r?`Да`:`Нет`:n?.type===`date`||n?.type===`datetime`?_(String(r)):String(r)),(0,M.jsx)(`td`,{className:`p-2.5 text-krona-secondary truncate max-w-xs border-r border-krona-border/40 last:border-r-0`,children:t===`status`?(0,M.jsx)(i,{variant:`neutral`,size:`sm`,children:a}):(0,M.jsx)(`span`,{className:`text-krona-primary font-medium`,children:a})},t)})},e.id)),q.length===0&&(0,M.jsx)(`tr`,{children:(0,M.jsx)(`td`,{colSpan:I.visibleFieldKeys.length,className:`text-center py-10 text-krona-secondary`,children:`Записи не найдены или отфильтрованы`})})]})]})})]})})]}),(0,M.jsx)(b,{isOpen:B,onClose:()=>V(!1),title:`Новое представление`,subtitle:`Создайте сохранённый вид таблицы с индивидуальными фильтрами и колонками`,maxWidth:`sm`,children:(0,M.jsxs)(`div`,{className:`space-y-4`,children:[(0,M.jsx)(h,{label:`Название представления *`,value:H,onChange:e=>U(e.target.value),placeholder:`Например: Мои активные заявки`,autoFocus:!0}),(0,M.jsxs)(`div`,{className:`flex justify-end gap-2 pt-3 border-t border-krona-border`,children:[(0,M.jsx)(n,{variant:`outline`,size:`sm`,onClick:()=>V(!1),children:`Отмена`}),(0,M.jsx)(n,{variant:`primary`,size:`sm`,onClick:async()=>{if(!H.trim()||!e)return;let t=`view_${Date.now().toString(36)}`,n={id:t,entityCode:e,name:H.trim(),type:`table`,isDefault:!1,visibleFieldKeys:k.slice(0,5).map(e=>e.key),filters:[],filterConjunction:`AND`};try{await C(n),F(t),L(n),V(!1),U(``),D({type:`success`,title:`Представление «${n.name}» создано`})}catch(e){D({type:`error`,title:`Ошибка создания представления`,message:e instanceof Error?e.message:String(e)})}},children:`Создать`})]})]})})]})};export{N as ViewBuilder,N as default}; \ No newline at end of file diff --git a/dist/assets/fieldTypesMeta-BWfaDuCZ.js b/dist/assets/fieldTypesMeta-BCSfJ-2N.js similarity index 90% rename from dist/assets/fieldTypesMeta-BWfaDuCZ.js rename to dist/assets/fieldTypesMeta-BCSfJ-2N.js index a1ecaed..b90e5b7 100644 --- a/dist/assets/fieldTypesMeta-BWfaDuCZ.js +++ b/dist/assets/fieldTypesMeta-BCSfJ-2N.js @@ -1 +1 @@ -import{l as e}from"./useToast-CS8pZhce.js";import{i as t,n,r,t as i}from"./types-DMl_5q2N.js";import{t as a}from"./building-BdUpGLM5.js";import{t as o}from"./file-text-DR21jZDS.js";import{t as s}from"./image-B_RO1I7c.js";import{t as c}from"./link-DOg0dLYA.js";import{t as l}from"./list-XDoRqfJ2.js";import{t as u}from"./mail-DOD5KO1v.js";import{t as d}from"./phone-DpnQw4if.js";import{t as f}from"./star-B6hvSjuv.js";import{t as p}from"./user-CuEEaB8a.js";import{C as m,E as h,N as g,P as _,R as v,f as y,k as b,o as x,q as S}from"./index-CNnq9VO5.js";var C={name:`briefcase`,size:24,node:[[`path`,{d:`M16 20V4a2 2 0 0 0-2-2h-4a2 2 0 0 0-2 2v16`,key:`jecpp`}],[`rect`,{width:`20`,height:`14`,x:`2`,y:`6`,rx:`2`,key:`i6l2r4`}]]};C.node;var w=e(C),T={name:`coins`,size:24,node:[[`path`,{d:`M13.744 17.736a6 6 0 1 1-7.48-7.48`,key:`bq4yh3`}],[`path`,{d:`M15 6h1v4`,key:`11y1tn`}],[`path`,{d:`m6.134 14.768.866-.5 2 3.464`,key:`17snzx`}],[`circle`,{cx:`16`,cy:`8`,r:`6`,key:`14bfc9`}]]};T.node;var E=e(T),D={name:`contact`,size:24,node:[[`path`,{d:`M16 2v2`,key:`scm5qe`}],[`path`,{d:`M7 21v-2a2 2 0 012-2h6a2 2 0 012 2v2`,key:`k82dct`}],[`path`,{d:`M8 2v2`,key:`pbkmx`}],[`circle`,{cx:`12`,cy:`10`,r:`3`,key:`ilqhr7`}],[`rect`,{x:`3`,y:`3`,width:`18`,height:`18`,rx:`2`,key:`h1oib`}]]};D.node;var O=e(D),k={name:`file-up`,size:24,node:[[`path`,{d:`M6 22a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.704.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2z`,key:`1oefj6`}],[`path`,{d:`M14 2v5a1 1 0 0 0 1 1h5`,key:`wfsgrz`}],[`path`,{d:`M12 12v6`,key:`3ahymv`}],[`path`,{d:`m15 15-3-3-3 3`,key:`15xj92`}]]};k.node;var A=e(k),j={name:`palette`,size:24,node:[[`path`,{d:`M12 22a1 1 0 0 1 0-20 10 9 0 0 1 10 9 5 5 0 0 1-5 5h-2.25a1.75 1.75 0 0 0-1.4 2.8l.3.4a1.75 1.75 0 0 1-1.4 2.8z`,key:`e79jfc`}],[`circle`,{cx:`13.5`,cy:`6.5`,r:`.5`,fill:`currentColor`,key:`1okk4w`}],[`circle`,{cx:`17.5`,cy:`10.5`,r:`.5`,fill:`currentColor`,key:`f64h9f`}],[`circle`,{cx:`6.5`,cy:`12.5`,r:`.5`,fill:`currentColor`,key:`qy21gx`}],[`circle`,{cx:`8.5`,cy:`7.5`,r:`.5`,fill:`currentColor`,key:`fotxhn`}]]};j.node;var M=e(j),N={name:`percent`,size:24,node:[[`line`,{x1:`19`,x2:`5`,y1:`5`,y2:`19`,key:`1x9vlm`}],[`circle`,{cx:`6.5`,cy:`6.5`,r:`2.5`,key:`4mh3h7`}],[`circle`,{cx:`17.5`,cy:`17.5`,r:`2.5`,key:`1mdrzq`}]]};N.node;var P=e(N),F={name:`text-align-start`,size:24,node:[[`path`,{d:`M21 5H3`,key:`1fi0y6`}],[`path`,{d:`M15 12H3`,key:`6jk70r`}],[`path`,{d:`M17 19H3`,key:`z6ezky`}]],aliases:[`text`,`align-left`]};F.node;var I=e(F),L={name:`toggle-left`,size:24,node:[[`circle`,{cx:`9`,cy:`12`,r:`3`,key:`u3jwor`}],[`rect`,{width:`20`,height:`14`,x:`2`,y:`5`,rx:`7`,key:`g7kal2`}]]};L.node;var R=e(L),z={name:`type`,size:24,node:[[`path`,{d:`M12 4v16`,key:`1654pz`}],[`path`,{d:`M4 7V5a1 1 0 0 1 1-1h14a1 1 0 0 1 1 1v2`,key:`e0r10z`}],[`path`,{d:`M9 20h6`,key:`s66wpe`}]]};z.node;var B=e(z),V=[{id:`text`,label:`Текстовые поля`,description:`Строки, форматированный текст, описания`},{id:`numeric`,label:`Числовые и денежные`,description:`Целые, дробные, валюты в minor units, проценты`},{id:`logic`,label:`Логические`,description:`Переключатели да/нет, флаги`},{id:`datetime`,label:`Дата и время`,description:`Календарные даты, время, таймштампы`},{id:`selection`,label:`Выбор и статусы`,description:`Списки, радиокнопки, статусы, рейтинги`},{id:`communication`,label:`Контакты и веб`,description:`Телефоны, email, ссылки`},{id:`geo`,label:`География и адреса`,description:`Адреса, координаты`},{id:`media`,label:`Медиа и файлы`,description:`Документы, изображения, выбор цвета`},{id:`relations`,label:`Связи и сущности`,description:`Пользователи, компании, контакты, товары, связи 1:1, 1:N`},{id:`advanced`,label:`Вычисляемые и системные`,description:`Формулы, автонумерация, JSON`}],H=[{type:`text`,label:`Короткий текст`,category:`text`,icon:B,description:`Строка до 255 символов`,supportsValidation:!0,defaultValue:``},{type:`long_text`,label:`Многострочный текст`,category:`text`,icon:I,description:`Длинное текстовое описание, заметки`,supportsValidation:!0,defaultValue:``},{type:`rich_text`,label:`Форматированный текст (HTML)`,category:`text`,icon:o,description:`Текст со стилями, заголовками и списками`,defaultValue:``},{type:`integer`,label:`Целое число`,category:`numeric`,icon:g,description:`Количество, штуки, целые числа`,supportsValidation:!0,defaultValue:0},{type:`decimal`,label:`Десятичное число`,category:`numeric`,icon:g,description:`Дробные значения (веса, объёмы, метры)`,supportsValidation:!0,defaultValue:0},{type:`money`,label:`Денежное значение`,category:`numeric`,icon:E,description:`Сумма в minor units (копейки) с валютой ISO 4217`,supportsValidation:!0,defaultValue:0},{type:`percentage`,label:`Процент`,category:`numeric`,icon:P,description:`Процентное значение (0–100%)`,supportsValidation:!0,defaultValue:0},{type:`number`,label:`Число`,category:`numeric`,icon:g,description:`Числовой ввод`,supportsValidation:!0,defaultValue:0},{type:`boolean`,label:`Флаг (Да/Нет)`,category:`logic`,icon:R,description:`Чекбокс или переключатель true/false`,defaultValue:!1},{type:`date`,label:`Дата`,category:`datetime`,icon:S,description:`Календарная дата (ГГГГ-ММ-ДД)`,supportsValidation:!0,defaultValue:``},{type:`datetime`,label:`Дата и время`,category:`datetime`,icon:S,description:`Дата со временем с точностью до минуты`,supportsValidation:!0,defaultValue:``},{type:`time`,label:`Время`,category:`datetime`,icon:v,description:`Время суток (ЧЧ:ММ)`,supportsValidation:!0,defaultValue:``},{type:`select`,label:`Выпадающий список`,category:`selection`,icon:l,description:`Одиночный выбор из списка вариантов`,supportsOptions:!0,defaultValue:``},{type:`single_select`,label:`Одиночный выбор`,category:`selection`,icon:l,description:`Одиночный выбор из списка вариантов`,supportsOptions:!0,defaultValue:``},{type:`multiselect`,label:`Множественный выбор`,category:`selection`,icon:y,description:`Несколько значений из списка`,supportsOptions:!0,defaultValue:[]},{type:`multi_select`,label:`Множественный список`,category:`selection`,icon:y,description:`Несколько значений из списка`,supportsOptions:!0,defaultValue:[]},{type:`radio`,label:`Радио-кнопки`,category:`selection`,icon:m,description:`Одиночный выбор на форме в виде переключателей`,supportsOptions:!0,defaultValue:``},{type:`checkbox_group`,label:`Группа чекбоксов`,category:`selection`,icon:y,description:`Список чекбоксов для выбора`,supportsOptions:!0,defaultValue:[]},{type:`status`,label:`Жизненный статус`,category:`selection`,icon:y,description:`Статус этапа с цветными бейджами`,supportsOptions:!0,defaultValue:``},{type:`rating`,label:`Рейтинг (Звёзды)`,category:`selection`,icon:f,description:`Оценка от 1 до 5 звёзд`,supportsValidation:!0,defaultValue:5},{type:`phone`,label:`Телефонный номер`,category:`communication`,icon:d,description:`Номер телефона в международном формате`,supportsValidation:!0,defaultValue:``},{type:`email`,label:`Электронная почта`,category:`communication`,icon:u,description:`Адрес электронной почты`,supportsValidation:!0,defaultValue:``},{type:`url`,label:`Веб-ссылка (URL)`,category:`communication`,icon:_,description:`Ссылка на внешний сайт или страницу`,supportsValidation:!0,defaultValue:``},{type:`address`,label:`Физический адрес`,category:`geo`,icon:b,description:`Строка адреса с городом, улицей и домом`,defaultValue:``},{type:`location`,label:`Геолокация (Широта, Долгота)`,category:`geo`,icon:n,description:`Координаты на карте`,defaultValue:``},{type:`file`,label:`Файл / Вложение`,category:`media`,icon:A,description:`Произвольный файл или документ`,defaultValue:null},{type:`image`,label:`Изображение / Фото`,category:`media`,icon:s,description:`Картинка или аватар`,defaultValue:null},{type:`color`,label:`Цветовой код`,category:`media`,icon:M,description:`HEX цвет для маркировки`,defaultValue:`#2F684C`},{type:`user`,label:`Пользователь системы`,category:`relations`,icon:p,description:`Ответственный сотрудник или оператор`,defaultValue:``},{type:`employee`,label:`Сотрудник штата`,category:`relations`,icon:x,description:`Привязка к штатному сотруднику`,defaultValue:``},{type:`team`,label:`Отдел / Команда`,category:`relations`,icon:w,description:`Привязка к подразделению`,defaultValue:``},{type:`company`,label:`Компания / Контрагент`,category:`relations`,icon:a,description:`Связь с юридическим лицом`,defaultValue:``},{type:`contact`,label:`Контактное лицо`,category:`relations`,icon:O,description:`Связь с физическим лицом`,defaultValue:``},{type:`product`,label:`Товар или услуга`,category:`relations`,icon:h,description:`Связь с номенклатурой`,defaultValue:``},{type:`entity_relation`,label:`Связь с сущностью (1:1, 1:N, N:M)`,category:`relations`,icon:c,description:`Связь с любой системной или кастомной сущностью`,defaultValue:``},{type:`entity_ref`,label:`Ссылка на запись`,category:`relations`,icon:c,description:`Связь со справочником`,defaultValue:``},{type:`lookup`,label:`Связь со справочником (Lookup)`,category:`relations`,icon:c,description:`Связь со справочником`,defaultValue:``},{type:`formula`,label:`Вычисляемая формула`,category:`advanced`,icon:t,description:`Автоматический расчёт на основе других полей`,defaultValue:``},{type:`autonumber`,label:`Автонумерация`,category:`advanced`,icon:g,description:`Генератор последовательных номеров по маске`,defaultValue:``},{type:`json`,label:`JSON структура`,category:`advanced`,icon:r,description:`Произвольный структурированный объект (Dev)`,defaultValue:`{}`}];function U(e){let t=H.find(t=>t.type===e);if(t)return t;let n=i(e);return H.find(e=>e.type===n)||{type:n,label:e,category:`text`,icon:B,description:`Поле типа ${e}`,defaultValue:``}}export{V as n,U as r,H as t}; \ No newline at end of file +import{l as e}from"./useToast-CS8pZhce.js";import{i as t,n,r,t as i}from"./types-DMl_5q2N.js";import{t as a}from"./building-BdUpGLM5.js";import{t as o}from"./file-text-DR21jZDS.js";import{t as s}from"./image-B_RO1I7c.js";import{t as c}from"./link-DOg0dLYA.js";import{t as l}from"./list-XDoRqfJ2.js";import{t as u}from"./mail-DOD5KO1v.js";import{t as d}from"./phone-DpnQw4if.js";import{t as f}from"./star-B6hvSjuv.js";import{t as p}from"./user-CuEEaB8a.js";import{A as m,B as h,D as g,F as _,P as v,Y as y,o as b,p as x,w as S}from"./index-CrJKtV0u.js";var C={name:`briefcase`,size:24,node:[[`path`,{d:`M16 20V4a2 2 0 0 0-2-2h-4a2 2 0 0 0-2 2v16`,key:`jecpp`}],[`rect`,{width:`20`,height:`14`,x:`2`,y:`6`,rx:`2`,key:`i6l2r4`}]]};C.node;var w=e(C),T={name:`coins`,size:24,node:[[`path`,{d:`M13.744 17.736a6 6 0 1 1-7.48-7.48`,key:`bq4yh3`}],[`path`,{d:`M15 6h1v4`,key:`11y1tn`}],[`path`,{d:`m6.134 14.768.866-.5 2 3.464`,key:`17snzx`}],[`circle`,{cx:`16`,cy:`8`,r:`6`,key:`14bfc9`}]]};T.node;var E=e(T),D={name:`contact`,size:24,node:[[`path`,{d:`M16 2v2`,key:`scm5qe`}],[`path`,{d:`M7 21v-2a2 2 0 012-2h6a2 2 0 012 2v2`,key:`k82dct`}],[`path`,{d:`M8 2v2`,key:`pbkmx`}],[`circle`,{cx:`12`,cy:`10`,r:`3`,key:`ilqhr7`}],[`rect`,{x:`3`,y:`3`,width:`18`,height:`18`,rx:`2`,key:`h1oib`}]]};D.node;var O=e(D),k={name:`file-up`,size:24,node:[[`path`,{d:`M6 22a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.704.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2z`,key:`1oefj6`}],[`path`,{d:`M14 2v5a1 1 0 0 0 1 1h5`,key:`wfsgrz`}],[`path`,{d:`M12 12v6`,key:`3ahymv`}],[`path`,{d:`m15 15-3-3-3 3`,key:`15xj92`}]]};k.node;var A=e(k),j={name:`palette`,size:24,node:[[`path`,{d:`M12 22a1 1 0 0 1 0-20 10 9 0 0 1 10 9 5 5 0 0 1-5 5h-2.25a1.75 1.75 0 0 0-1.4 2.8l.3.4a1.75 1.75 0 0 1-1.4 2.8z`,key:`e79jfc`}],[`circle`,{cx:`13.5`,cy:`6.5`,r:`.5`,fill:`currentColor`,key:`1okk4w`}],[`circle`,{cx:`17.5`,cy:`10.5`,r:`.5`,fill:`currentColor`,key:`f64h9f`}],[`circle`,{cx:`6.5`,cy:`12.5`,r:`.5`,fill:`currentColor`,key:`qy21gx`}],[`circle`,{cx:`8.5`,cy:`7.5`,r:`.5`,fill:`currentColor`,key:`fotxhn`}]]};j.node;var M=e(j),N={name:`percent`,size:24,node:[[`line`,{x1:`19`,x2:`5`,y1:`5`,y2:`19`,key:`1x9vlm`}],[`circle`,{cx:`6.5`,cy:`6.5`,r:`2.5`,key:`4mh3h7`}],[`circle`,{cx:`17.5`,cy:`17.5`,r:`2.5`,key:`1mdrzq`}]]};N.node;var P=e(N),F={name:`text-align-start`,size:24,node:[[`path`,{d:`M21 5H3`,key:`1fi0y6`}],[`path`,{d:`M15 12H3`,key:`6jk70r`}],[`path`,{d:`M17 19H3`,key:`z6ezky`}]],aliases:[`text`,`align-left`]};F.node;var I=e(F),L={name:`toggle-left`,size:24,node:[[`circle`,{cx:`9`,cy:`12`,r:`3`,key:`u3jwor`}],[`rect`,{width:`20`,height:`14`,x:`2`,y:`5`,rx:`7`,key:`g7kal2`}]]};L.node;var R=e(L),z={name:`type`,size:24,node:[[`path`,{d:`M12 4v16`,key:`1654pz`}],[`path`,{d:`M4 7V5a1 1 0 0 1 1-1h14a1 1 0 0 1 1 1v2`,key:`e0r10z`}],[`path`,{d:`M9 20h6`,key:`s66wpe`}]]};z.node;var B=e(z),V=[{id:`text`,label:`Текстовые поля`,description:`Строки, форматированный текст, описания`},{id:`numeric`,label:`Числовые и денежные`,description:`Целые, дробные, валюты в minor units, проценты`},{id:`logic`,label:`Логические`,description:`Переключатели да/нет, флаги`},{id:`datetime`,label:`Дата и время`,description:`Календарные даты, время, таймштампы`},{id:`selection`,label:`Выбор и статусы`,description:`Списки, радиокнопки, статусы, рейтинги`},{id:`communication`,label:`Контакты и веб`,description:`Телефоны, email, ссылки`},{id:`geo`,label:`География и адреса`,description:`Адреса, координаты`},{id:`media`,label:`Медиа и файлы`,description:`Документы, изображения, выбор цвета`},{id:`relations`,label:`Связи и сущности`,description:`Пользователи, компании, контакты, товары, связи 1:1, 1:N`},{id:`advanced`,label:`Вычисляемые и системные`,description:`Формулы, автонумерация, JSON`}],H=[{type:`text`,label:`Короткий текст`,category:`text`,icon:B,description:`Строка до 255 символов`,supportsValidation:!0,defaultValue:``},{type:`long_text`,label:`Многострочный текст`,category:`text`,icon:I,description:`Длинное текстовое описание, заметки`,supportsValidation:!0,defaultValue:``},{type:`rich_text`,label:`Форматированный текст (HTML)`,category:`text`,icon:o,description:`Текст со стилями, заголовками и списками`,defaultValue:``},{type:`integer`,label:`Целое число`,category:`numeric`,icon:v,description:`Количество, штуки, целые числа`,supportsValidation:!0,defaultValue:0},{type:`decimal`,label:`Десятичное число`,category:`numeric`,icon:v,description:`Дробные значения (веса, объёмы, метры)`,supportsValidation:!0,defaultValue:0},{type:`money`,label:`Денежное значение`,category:`numeric`,icon:E,description:`Сумма в minor units (копейки) с валютой ISO 4217`,supportsValidation:!0,defaultValue:0},{type:`percentage`,label:`Процент`,category:`numeric`,icon:P,description:`Процентное значение (0–100%)`,supportsValidation:!0,defaultValue:0},{type:`number`,label:`Число`,category:`numeric`,icon:v,description:`Числовой ввод`,supportsValidation:!0,defaultValue:0},{type:`boolean`,label:`Флаг (Да/Нет)`,category:`logic`,icon:R,description:`Чекбокс или переключатель true/false`,defaultValue:!1},{type:`date`,label:`Дата`,category:`datetime`,icon:y,description:`Календарная дата (ГГГГ-ММ-ДД)`,supportsValidation:!0,defaultValue:``},{type:`datetime`,label:`Дата и время`,category:`datetime`,icon:y,description:`Дата со временем с точностью до минуты`,supportsValidation:!0,defaultValue:``},{type:`time`,label:`Время`,category:`datetime`,icon:h,description:`Время суток (ЧЧ:ММ)`,supportsValidation:!0,defaultValue:``},{type:`select`,label:`Выпадающий список`,category:`selection`,icon:l,description:`Одиночный выбор из списка вариантов`,supportsOptions:!0,defaultValue:``},{type:`single_select`,label:`Одиночный выбор`,category:`selection`,icon:l,description:`Одиночный выбор из списка вариантов`,supportsOptions:!0,defaultValue:``},{type:`multiselect`,label:`Множественный выбор`,category:`selection`,icon:x,description:`Несколько значений из списка`,supportsOptions:!0,defaultValue:[]},{type:`multi_select`,label:`Множественный список`,category:`selection`,icon:x,description:`Несколько значений из списка`,supportsOptions:!0,defaultValue:[]},{type:`radio`,label:`Радио-кнопки`,category:`selection`,icon:S,description:`Одиночный выбор на форме в виде переключателей`,supportsOptions:!0,defaultValue:``},{type:`checkbox_group`,label:`Группа чекбоксов`,category:`selection`,icon:x,description:`Список чекбоксов для выбора`,supportsOptions:!0,defaultValue:[]},{type:`status`,label:`Жизненный статус`,category:`selection`,icon:x,description:`Статус этапа с цветными бейджами`,supportsOptions:!0,defaultValue:``},{type:`rating`,label:`Рейтинг (Звёзды)`,category:`selection`,icon:f,description:`Оценка от 1 до 5 звёзд`,supportsValidation:!0,defaultValue:5},{type:`phone`,label:`Телефонный номер`,category:`communication`,icon:d,description:`Номер телефона в международном формате`,supportsValidation:!0,defaultValue:``},{type:`email`,label:`Электронная почта`,category:`communication`,icon:u,description:`Адрес электронной почты`,supportsValidation:!0,defaultValue:``},{type:`url`,label:`Веб-ссылка (URL)`,category:`communication`,icon:_,description:`Ссылка на внешний сайт или страницу`,supportsValidation:!0,defaultValue:``},{type:`address`,label:`Физический адрес`,category:`geo`,icon:m,description:`Строка адреса с городом, улицей и домом`,defaultValue:``},{type:`location`,label:`Геолокация (Широта, Долгота)`,category:`geo`,icon:n,description:`Координаты на карте`,defaultValue:``},{type:`file`,label:`Файл / Вложение`,category:`media`,icon:A,description:`Произвольный файл или документ`,defaultValue:null},{type:`image`,label:`Изображение / Фото`,category:`media`,icon:s,description:`Картинка или аватар`,defaultValue:null},{type:`color`,label:`Цветовой код`,category:`media`,icon:M,description:`HEX цвет для маркировки`,defaultValue:`#2F684C`},{type:`user`,label:`Пользователь системы`,category:`relations`,icon:p,description:`Ответственный сотрудник или оператор`,defaultValue:``},{type:`employee`,label:`Сотрудник штата`,category:`relations`,icon:b,description:`Привязка к штатному сотруднику`,defaultValue:``},{type:`team`,label:`Отдел / Команда`,category:`relations`,icon:w,description:`Привязка к подразделению`,defaultValue:``},{type:`company`,label:`Компания / Контрагент`,category:`relations`,icon:a,description:`Связь с юридическим лицом`,defaultValue:``},{type:`contact`,label:`Контактное лицо`,category:`relations`,icon:O,description:`Связь с физическим лицом`,defaultValue:``},{type:`product`,label:`Товар или услуга`,category:`relations`,icon:g,description:`Связь с номенклатурой`,defaultValue:``},{type:`entity_relation`,label:`Связь с сущностью (1:1, 1:N, N:M)`,category:`relations`,icon:c,description:`Связь с любой системной или кастомной сущностью`,defaultValue:``},{type:`entity_ref`,label:`Ссылка на запись`,category:`relations`,icon:c,description:`Связь со справочником`,defaultValue:``},{type:`lookup`,label:`Связь со справочником (Lookup)`,category:`relations`,icon:c,description:`Связь со справочником`,defaultValue:``},{type:`formula`,label:`Вычисляемая формула`,category:`advanced`,icon:t,description:`Автоматический расчёт на основе других полей`,defaultValue:``},{type:`autonumber`,label:`Автонумерация`,category:`advanced`,icon:v,description:`Генератор последовательных номеров по маске`,defaultValue:``},{type:`json`,label:`JSON структура`,category:`advanced`,icon:r,description:`Произвольный структурированный объект (Dev)`,defaultValue:`{}`}];function U(e){let t=H.find(t=>t.type===e);if(t)return t;let n=i(e);return H.find(e=>e.type===n)||{type:n,label:e,category:`text`,icon:B,description:`Поле типа ${e}`,defaultValue:``}}export{V as n,U as r,H as t}; \ No newline at end of file diff --git a/dist/assets/index-Bb0d9GEE.css b/dist/assets/index-Bb0d9GEE.css new file mode 100644 index 0000000..0607687 --- /dev/null +++ b/dist/assets/index-Bb0d9GEE.css @@ -0,0 +1 @@ +*,:before,:after,::backdrop{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:#3b82f680;--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }*,:before,:after{box-sizing:border-box;border:0 solid #e5e7eb}:before,:after{--tw-content:""}html,:host{-webkit-text-size-adjust:100%;tab-size:4;font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent;font-family:Inter,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica,Arial,sans-serif;line-height:1.5}body{line-height:inherit;margin:0}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-feature-settings:normal;font-variation-settings:normal;font-family:JetBrains Mono,Consolas,monospace;font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-feature-settings:inherit;font-variation-settings:inherit;font-family:inherit;font-size:100%;font-weight:inherit;line-height:inherit;letter-spacing:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}button,input:where([type=button]),input:where([type=reset]),input:where([type=submit]){-webkit-appearance:button;background-color:#0000;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dl,dd,h1,h2,h3,h4,h5,h6,hr,figure,p,pre{margin:0}fieldset{margin:0;padding:0}legend{padding:0}ol,ul,menu{margin:0;padding:0;list-style:none}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder{opacity:1;color:#9ca3af}textarea::-moz-placeholder{opacity:1;color:#9ca3af}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}button,[role=button]{cursor:pointer}:disabled{cursor:default}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}[hidden]:where(:not([hidden=until-found])){display:none}.container{width:100%}@media (width>=640px){.container{max-width:640px}}@media (width>=768px){.container{max-width:768px}}@media (width>=1024px){.container{max-width:1024px}}@media (width>=1280px){.container{max-width:1280px}}@media (width>=1536px){.container{max-width:1536px}}.sr-only{clip:rect(0, 0, 0, 0);white-space:nowrap;border-width:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.pointer-events-none{pointer-events:none}.pointer-events-auto{pointer-events:auto}.visible{visibility:visible}.static{position:static}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.sticky{position:sticky}.inset-0{inset:0}.inset-x-0{left:0;right:0}.inset-y-0{top:0;bottom:0}.-left-\[17px\]{left:-17px}.-right-1{right:-.25rem}.-top-1{top:-.25rem}.bottom-0{bottom:0}.bottom-1\.5{bottom:.375rem}.bottom-4{bottom:1rem}.left-0{left:0}.left-2\.5{left:.625rem}.left-3{left:.75rem}.right-0{right:0}.right-2{right:.5rem}.right-2\.5{right:.625rem}.right-3{right:.75rem}.right-4{right:1rem}.top-0{top:0}.top-1{top:.25rem}.top-1\.5{top:.375rem}.top-1\/2{top:50%}.top-2{top:.5rem}.top-2\.5{top:.625rem}.top-20{top:5rem}.top-4{top:1rem}.top-full{top:100%}.z-10{z-index:10}.z-20{z-index:20}.z-30{z-index:30}.z-40{z-index:40}.z-50{z-index:50}.col-span-2{grid-column:span 2/span 2}.col-span-full{grid-column:1/-1}.m-1{margin:.25rem}.-mx-1{margin-left:-.25rem;margin-right:-.25rem}.mx-auto{margin-left:auto;margin-right:auto}.my-0\.5{margin-top:.125rem;margin-bottom:.125rem}.my-4{margin-top:1rem;margin-bottom:1rem}.my-6{margin-top:1.5rem;margin-bottom:1.5rem}.my-auto{margin-top:auto;margin-bottom:auto}.-ml-0\.5{margin-left:-.125rem}.-mt-5{margin-top:-1.25rem}.mb-0\.5{margin-bottom:.125rem}.mb-1{margin-bottom:.25rem}.mb-1\.5{margin-bottom:.375rem}.mb-2{margin-bottom:.5rem}.mb-3{margin-bottom:.75rem}.mb-4{margin-bottom:1rem}.mb-5{margin-bottom:1.25rem}.mb-6{margin-bottom:1.5rem}.ml-0\.5{margin-left:.125rem}.ml-1{margin-left:.25rem}.ml-2{margin-left:.5rem}.ml-2\.5{margin-left:.625rem}.ml-3{margin-left:.75rem}.ml-auto{margin-left:auto}.mr-0\.5{margin-right:.125rem}.mr-1{margin-right:.25rem}.mr-1\.5{margin-right:.375rem}.mr-2{margin-right:.5rem}.mt-0\.5{margin-top:.125rem}.mt-1{margin-top:.25rem}.mt-1\.5{margin-top:.375rem}.mt-2{margin-top:.5rem}.mt-2\.5{margin-top:.625rem}.mt-3{margin-top:.75rem}.line-clamp-1{-webkit-line-clamp:1;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.line-clamp-2{-webkit-line-clamp:2;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.block{display:block}.inline-block{display:inline-block}.inline{display:inline}.flex{display:flex}.inline-flex{display:inline-flex}.table{display:table}.grid{display:grid}.hidden{display:none}.aspect-square{aspect-ratio:1}.h-0\.5{height:.125rem}.h-1\.5{height:.375rem}.h-10{height:2.5rem}.h-11{height:2.75rem}.h-12{height:3rem}.h-14{height:3.5rem}.h-16{height:4rem}.h-2{height:.5rem}.h-2\.5{height:.625rem}.h-28{height:7rem}.h-3{height:.75rem}.h-3\.5{height:.875rem}.h-4{height:1rem}.h-44{height:11rem}.h-5{height:1.25rem}.h-6{height:1.5rem}.h-64{height:16rem}.h-7{height:1.75rem}.h-8{height:2rem}.h-9{height:2.25rem}.h-\[1050px\]{height:1050px}.h-\[540px\]{height:540px}.h-\[800px\]{height:800px}.h-\[85vh\]{height:85vh}.h-\[880px\]{height:880px}.h-\[calc\(100vh-13rem\)\]{height:calc(100vh - 13rem)}.h-\[calc\(100vh-3\.5rem\)\]{height:calc(100vh - 3.5rem)}.h-\[calc\(100vh-8\.5rem\)\]{height:calc(100vh - 8.5rem)}.h-full{height:100%}.h-screen{height:100vh}.max-h-36{max-height:9rem}.max-h-40{max-height:10rem}.max-h-48{max-height:12rem}.max-h-56{max-height:14rem}.max-h-72{max-height:18rem}.max-h-80{max-height:20rem}.max-h-96{max-height:24rem}.max-h-\[460px\]{max-height:460px}.max-h-\[480px\]{max-height:480px}.max-h-\[520px\]{max-height:520px}.max-h-\[550px\]{max-height:550px}.max-h-\[70vh\]{max-height:70vh}.max-h-\[750px\]{max-height:750px}.max-h-\[75vh\]{max-height:75vh}.max-h-\[80vh\]{max-height:80vh}.max-h-\[85vh\]{max-height:85vh}.max-h-\[90vh\]{max-height:90vh}.max-h-screen{max-height:100vh}.min-h-0{min-height:0}.min-h-\[320px\]{min-height:320px}.min-h-\[32px\]{min-height:32px}.min-h-\[36px\]{min-height:36px}.min-h-\[38px\]{min-height:38px}.min-h-\[40px\]{min-height:40px}.min-h-\[420px\]{min-height:420px}.min-h-\[44px\]{min-height:44px}.min-h-\[48px\]{min-height:48px}.min-h-\[500px\]{min-height:500px}.min-h-\[50px\]{min-height:50px}.min-h-\[560px\]{min-height:560px}.min-h-\[70vh\]{min-height:70vh}.min-h-screen{min-height:100vh}.w-1{width:.25rem}.w-1\.5{width:.375rem}.w-1\/3{width:33.3333%}.w-10{width:2.5rem}.w-11{width:2.75rem}.w-12{width:3rem}.w-14{width:3.5rem}.w-16{width:4rem}.w-2{width:.5rem}.w-2\.5{width:.625rem}.w-24{width:6rem}.w-28{width:7rem}.w-3{width:.75rem}.w-3\.5{width:.875rem}.w-32{width:8rem}.w-4{width:1rem}.w-48{width:12rem}.w-5{width:1.25rem}.w-56{width:14rem}.w-6{width:1.5rem}.w-60{width:15rem}.w-64{width:16rem}.w-7{width:1.75rem}.w-72{width:18rem}.w-8{width:2rem}.w-80{width:20rem}.w-9{width:2.25rem}.w-fit{width:fit-content}.w-full{width:100%}.w-screen{width:100vw}.min-w-0{min-width:0}.min-w-\[110px\]{min-width:110px}.min-w-\[120px\]{min-width:120px}.min-w-\[200px\]{min-width:200px}.min-w-\[36px\]{min-width:36px}.min-w-\[40px\]{min-width:40px}.min-w-\[44px\]{min-width:44px}.min-w-\[700px\]{min-width:700px}.max-w-2xl{max-width:42rem}.max-w-3xl{max-width:48rem}.max-w-4xl{max-width:56rem}.max-w-5xl{max-width:64rem}.max-w-7xl{max-width:80rem}.max-w-\[1180px\]{max-width:1180px}.max-w-\[130px\]{max-width:130px}.max-w-\[140px\]{max-width:140px}.max-w-\[170px\]{max-width:170px}.max-w-\[180px\]{max-width:180px}.max-w-\[375px\]{max-width:375px}.max-w-\[390px\]{max-width:390px}.max-w-\[420px\]{max-width:420px}.max-w-\[640px\]{max-width:640px}.max-w-\[64px\]{max-width:64px}.max-w-\[75\%\]{max-width:75%}.max-w-\[768px\]{max-width:768px}.max-w-\[80\%\]{max-width:80%}.max-w-\[80px\]{max-width:80px}.max-w-\[82\%\]{max-width:82%}.max-w-\[820px\]{max-width:820px}.max-w-\[85\%\]{max-width:85%}.max-w-\[90px\]{max-width:90px}.max-w-\[calc\(100vw-2rem\)\]{max-width:calc(100vw - 2rem)}.max-w-full{max-width:100%}.max-w-lg{max-width:32rem}.max-w-md{max-width:28rem}.max-w-sm{max-width:24rem}.max-w-xl{max-width:36rem}.max-w-xs{max-width:20rem}.flex-1{flex:1}.flex-shrink-0,.shrink-0{flex-shrink:0}.border-collapse{border-collapse:collapse}.-translate-y-1\/2{--tw-translate-y:-50%;transform:translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-x-0{--tw-translate-x:0px;transform:translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-x-5{--tw-translate-x:1.25rem;transform:translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.rotate-180{--tw-rotate:180deg;transform:translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.rotate-90{--tw-rotate:90deg;transform:translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}@keyframes ping{75%,to{opacity:0;transform:scale(2)}}.animate-ping{animation:1s cubic-bezier(0,0,.2,1) infinite ping}@keyframes pulse{50%{opacity:.5}}.animate-pulse{animation:2s cubic-bezier(.4,0,.6,1) infinite pulse}@keyframes spin{to{transform:rotate(360deg)}}.animate-spin{animation:1s linear infinite spin}.cursor-default{cursor:default}.cursor-grab{cursor:grab}.cursor-not-allowed{cursor:not-allowed}.cursor-pointer{cursor:pointer}.select-none{-webkit-user-select:none;user-select:none}.select-text{-webkit-user-select:text;user-select:text}.resize-none{resize:none}.list-inside{list-style-position:inside}.list-disc{list-style-type:disc}.appearance-none{appearance:none}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.grid-cols-5{grid-template-columns:repeat(5,minmax(0,1fr))}.flex-col{flex-direction:column}.flex-col-reverse{flex-direction:column-reverse}.flex-wrap{flex-wrap:wrap}.items-start{align-items:flex-start}.items-end{align-items:flex-end}.items-center{align-items:center}.items-baseline{align-items:baseline}.items-stretch{align-items:stretch}.justify-start{justify-content:flex-start}.justify-end{justify-content:flex-end}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.justify-around{justify-content:space-around}.gap-0\.5{gap:.125rem}.gap-1{gap:.25rem}.gap-1\.5{gap:.375rem}.gap-2{gap:.5rem}.gap-2\.5{gap:.625rem}.gap-3{gap:.75rem}.gap-3\.5{gap:.875rem}.gap-4{gap:1rem}.space-y-0\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.125rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.125rem * var(--tw-space-y-reverse))}.space-y-1>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.25rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.25rem * var(--tw-space-y-reverse))}.space-y-1\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.375rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.375rem * var(--tw-space-y-reverse))}.space-y-2>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.5rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.5rem * var(--tw-space-y-reverse))}.space-y-2\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.625rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.625rem * var(--tw-space-y-reverse))}.space-y-3>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.75rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.75rem * var(--tw-space-y-reverse))}.space-y-3\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.875rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.875rem * var(--tw-space-y-reverse))}.space-y-4>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(1rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1rem * var(--tw-space-y-reverse))}.space-y-5>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(1.25rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1.25rem * var(--tw-space-y-reverse))}.space-y-6>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(1.5rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1.5rem * var(--tw-space-y-reverse))}.divide-y>:not([hidden])~:not([hidden]){--tw-divide-y-reverse:0;border-top-width:calc(1px * calc(1 - var(--tw-divide-y-reverse)));border-bottom-width:calc(1px * var(--tw-divide-y-reverse))}.divide-krona-border>:not([hidden])~:not([hidden]){border-color:var(--border-default)}.self-start{align-self:flex-start}.self-stretch{align-self:stretch}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.overflow-x-hidden{overflow-x:hidden}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.whitespace-nowrap{white-space:nowrap}.whitespace-pre-wrap{white-space:pre-wrap}.break-words{overflow-wrap:break-word}.break-all{word-break:break-all}.rounded{border-radius:.25rem}.rounded-2xl{border-radius:1rem}.rounded-\[24px\]{border-radius:24px}.rounded-\[28px\]{border-radius:28px}.rounded-\[36px\]{border-radius:36px}.rounded-full{border-radius:9999px}.rounded-lg{border-radius:.5rem}.rounded-md{border-radius:.375rem}.rounded-sm{border-radius:.125rem}.rounded-xl{border-radius:.75rem}.rounded-l-lg{border-top-left-radius:.5rem;border-bottom-left-radius:.5rem}.rounded-r{border-top-right-radius:.25rem;border-bottom-right-radius:.25rem}.rounded-t-2xl{border-top-left-radius:1rem;border-top-right-radius:1rem}.rounded-t-lg{border-top-left-radius:.5rem;border-top-right-radius:.5rem}.rounded-bl-none{border-bottom-left-radius:0}.rounded-br-none{border-bottom-right-radius:0}.border{border-width:1px}.border-2{border-width:2px}.border-8{border-width:8px}.border-x{border-left-width:1px;border-right-width:1px}.border-y{border-top-width:1px;border-bottom-width:1px}.border-b{border-bottom-width:1px}.border-b-2{border-bottom-width:2px}.border-l{border-left-width:1px}.border-l-2{border-left-width:2px}.border-r{border-right-width:1px}.border-t{border-top-width:1px}.border-solid{border-style:solid}.border-dashed{border-style:dashed}.border-dotted{border-style:dotted}.border-\[\#3A3D35\]{--tw-border-opacity:1;border-color:rgb(58 61 53/var(--tw-border-opacity,1))}.border-\[\#3A3D35\]\/80{border-color:#3a3d35cc}.border-amber-500{--tw-border-opacity:1;border-color:rgb(245 158 11/var(--tw-border-opacity,1))}.border-amber-500\/30{border-color:#f59e0b4d}.border-amber-500\/40{border-color:#f59e0b66}.border-amber-500\/50{border-color:#f59e0b80}.border-amber-500\/70{border-color:#f59e0bb3}.border-emerald-300{--tw-border-opacity:1;border-color:rgb(110 231 183/var(--tw-border-opacity,1))}.border-emerald-500\/20{border-color:#10b98133}.border-emerald-500\/30{border-color:#10b9814d}.border-emerald-500\/40{border-color:#10b98166}.border-emerald-500\/60{border-color:#10b98199}.border-emerald-500\/70{border-color:#10b981b3}.border-gray-700{--tw-border-opacity:1;border-color:rgb(55 65 81/var(--tw-border-opacity,1))}.border-gray-700\/60{border-color:#37415199}.border-gray-800{--tw-border-opacity:1;border-color:rgb(31 41 55/var(--tw-border-opacity,1))}.border-gray-800\/80{border-color:#1f2937cc}.border-indigo-500\/40{border-color:#6366f166}.border-krona-border{border-color:var(--border-default)}.border-krona-danger{border-color:var(--color-danger)}.border-krona-gold{border-color:var(--color-gold)}.border-krona-gold-border{border-color:var(--color-gold-border)}.border-krona-green{border-color:var(--color-green)}.border-orange-500\/40{border-color:#f9731666}.border-purple-300{--tw-border-opacity:1;border-color:rgb(216 180 254/var(--tw-border-opacity,1))}.border-purple-400\/50{border-color:#c084fc80}.border-purple-500\/40{border-color:#a855f766}.border-rose-500\/30{border-color:#f43f5e4d}.border-rose-500\/40{border-color:#f43f5e66}.border-rose-500\/50{border-color:#f43f5e80}.border-rose-500\/70{border-color:#f43f5eb3}.border-rose-500\/80{border-color:#f43f5ecc}.border-sky-300{--tw-border-opacity:1;border-color:rgb(125 211 252/var(--tw-border-opacity,1))}.border-sky-500\/40{border-color:#0ea5e966}.border-status-danger-border{border-color:var(--color-danger-border)}.border-status-info-border{border-color:var(--color-info-border)}.border-status-success-border{border-color:var(--color-green-border)}.border-status-warning-border{border-color:var(--color-warning-border)}.border-transparent{border-color:#0000}.border-zinc-700{--tw-border-opacity:1;border-color:rgb(63 63 70/var(--tw-border-opacity,1))}.border-zinc-800{--tw-border-opacity:1;border-color:rgb(39 39 42/var(--tw-border-opacity,1))}.border-t-transparent{border-top-color:#0000}.bg-\[\#07130e\]{--tw-bg-opacity:1;background-color:rgb(7 19 14/var(--tw-bg-opacity,1))}.bg-\[\#191B18\]{--tw-bg-opacity:1;background-color:rgb(25 27 24/var(--tw-bg-opacity,1))}.bg-\[\#20221E\]{--tw-bg-opacity:1;background-color:rgb(32 34 30/var(--tw-bg-opacity,1))}.bg-\[\#20221E\]\/60{background-color:#20221e99}.bg-\[\#252722\]{--tw-bg-opacity:1;background-color:rgb(37 39 34/var(--tw-bg-opacity,1))}.bg-\[\#2F684C\]{--tw-bg-opacity:1;background-color:rgb(47 104 76/var(--tw-bg-opacity,1))}.bg-\[\#2F684C\]\/10{background-color:#2f684c1a}.bg-\[\#2F684C\]\/20{background-color:#2f684c33}.bg-\[\#34382F\]{--tw-bg-opacity:1;background-color:rgb(52 56 47/var(--tw-bg-opacity,1))}.bg-\[\#3A3D35\]{--tw-bg-opacity:1;background-color:rgb(58 61 53/var(--tw-bg-opacity,1))}.bg-\[\#B78335\]{--tw-bg-opacity:1;background-color:rgb(183 131 53/var(--tw-bg-opacity,1))}.bg-\[\#D8D5CB\]{--tw-bg-opacity:1;background-color:rgb(216 213 203/var(--tw-bg-opacity,1))}.bg-amber-400{--tw-bg-opacity:1;background-color:rgb(251 191 36/var(--tw-bg-opacity,1))}.bg-amber-500{--tw-bg-opacity:1;background-color:rgb(245 158 11/var(--tw-bg-opacity,1))}.bg-amber-500\/10{background-color:#f59e0b1a}.bg-amber-500\/15{background-color:#f59e0b26}.bg-amber-500\/20{background-color:#f59e0b33}.bg-amber-500\/5{background-color:#f59e0b0d}.bg-amber-500\/80{background-color:#f59e0bcc}.bg-amber-600{--tw-bg-opacity:1;background-color:rgb(217 119 6/var(--tw-bg-opacity,1))}.bg-black\/60{background-color:#0009}.bg-black\/75{background-color:#000000bf}.bg-blue-500{--tw-bg-opacity:1;background-color:rgb(59 130 246/var(--tw-bg-opacity,1))}.bg-blue-500\/5{background-color:#3b82f60d}.bg-emerald-50{--tw-bg-opacity:1;background-color:rgb(236 253 245/var(--tw-bg-opacity,1))}.bg-emerald-500{--tw-bg-opacity:1;background-color:rgb(16 185 129/var(--tw-bg-opacity,1))}.bg-emerald-500\/10{background-color:#10b9811a}.bg-emerald-500\/15{background-color:#10b98126}.bg-emerald-500\/20{background-color:#10b98133}.bg-emerald-500\/5{background-color:#10b9810d}.bg-emerald-500\/80{background-color:#10b981cc}.bg-emerald-600{--tw-bg-opacity:1;background-color:rgb(5 150 105/var(--tw-bg-opacity,1))}.bg-gray-800{--tw-bg-opacity:1;background-color:rgb(31 41 55/var(--tw-bg-opacity,1))}.bg-gray-900{--tw-bg-opacity:1;background-color:rgb(17 24 39/var(--tw-bg-opacity,1))}.bg-gray-900\/60{background-color:#11182799}.bg-gray-950{--tw-bg-opacity:1;background-color:rgb(3 7 18/var(--tw-bg-opacity,1))}.bg-green-500{--tw-bg-opacity:1;background-color:rgb(34 197 94/var(--tw-bg-opacity,1))}.bg-krona-app{background-color:var(--bg-app)}.bg-krona-border{background-color:var(--border-default)}.bg-krona-danger{background-color:var(--color-danger)}.bg-krona-gold{background-color:var(--color-gold)}.bg-krona-gold-soft{background-color:var(--color-gold-soft)}.bg-krona-green{background-color:var(--color-green)}.bg-krona-muted{background-color:var(--surface-muted)}.bg-krona-raised{background-color:var(--surface-raised)}.bg-krona-surface{background-color:var(--surface-default)}.bg-krona-workspace{background-color:var(--bg-workspace)}.bg-purple-50{--tw-bg-opacity:1;background-color:rgb(250 245 255/var(--tw-bg-opacity,1))}.bg-purple-500\/10{background-color:#a855f71a}.bg-red-500{--tw-bg-opacity:1;background-color:rgb(239 68 68/var(--tw-bg-opacity,1))}.bg-rose-500{--tw-bg-opacity:1;background-color:rgb(244 63 94/var(--tw-bg-opacity,1))}.bg-rose-500\/10{background-color:#f43f5e1a}.bg-rose-500\/15{background-color:#f43f5e26}.bg-rose-500\/5{background-color:#f43f5e0d}.bg-rose-500\/80{background-color:#f43f5ecc}.bg-sky-50{--tw-bg-opacity:1;background-color:rgb(240 249 255/var(--tw-bg-opacity,1))}.bg-sky-500{--tw-bg-opacity:1;background-color:rgb(14 165 233/var(--tw-bg-opacity,1))}.bg-sky-500\/15{background-color:#0ea5e926}.bg-status-danger-soft{background-color:var(--color-danger-soft)}.bg-status-danger-text{background-color:var(--color-danger-text)}.bg-status-info-soft{background-color:var(--color-info-soft)}.bg-status-info-text{background-color:var(--color-info-text)}.bg-status-success-soft{background-color:var(--color-green-soft)}.bg-status-success-text{background-color:var(--color-green-text)}.bg-status-warning-soft{background-color:var(--color-warning-soft)}.bg-status-warning-text{background-color:var(--color-warning-text)}.bg-transparent{background-color:#0000}.bg-white{--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity,1))}.bg-white\/20{background-color:#fff3}.bg-zinc-600{--tw-bg-opacity:1;background-color:rgb(82 82 91/var(--tw-bg-opacity,1))}.bg-zinc-700{--tw-bg-opacity:1;background-color:rgb(63 63 70/var(--tw-bg-opacity,1))}.bg-zinc-950{--tw-bg-opacity:1;background-color:rgb(9 9 11/var(--tw-bg-opacity,1))}.fill-amber-400{fill:#fbbf24}.fill-krona-gold{fill:var(--color-gold)}.stroke-\[2\.5\]{stroke-width:2.5px}.stroke-\[3\]{stroke-width:3px}.object-contain{-o-object-fit:contain;object-fit:contain}.object-cover{-o-object-fit:cover;object-fit:cover}.p-0{padding:0}.p-0\.5{padding:.125rem}.p-1{padding:.25rem}.p-1\.5{padding:.375rem}.p-12{padding:3rem}.p-2{padding:.5rem}.p-2\.5{padding:.625rem}.p-3{padding:.75rem}.p-3\.5{padding:.875rem}.p-4{padding:1rem}.p-5{padding:1.25rem}.p-6{padding:1.5rem}.p-8{padding:2rem}.px-1{padding-left:.25rem;padding-right:.25rem}.px-1\.5{padding-left:.375rem;padding-right:.375rem}.px-2{padding-left:.5rem;padding-right:.5rem}.px-2\.5{padding-left:.625rem;padding-right:.625rem}.px-3{padding-left:.75rem;padding-right:.75rem}.px-3\.5{padding-left:.875rem;padding-right:.875rem}.px-4{padding-left:1rem;padding-right:1rem}.px-5{padding-left:1.25rem;padding-right:1.25rem}.px-6{padding-left:1.5rem;padding-right:1.5rem}.py-0\.5{padding-top:.125rem;padding-bottom:.125rem}.py-1{padding-top:.25rem;padding-bottom:.25rem}.py-1\.5{padding-top:.375rem;padding-bottom:.375rem}.py-10{padding-top:2.5rem;padding-bottom:2.5rem}.py-12{padding-top:3rem;padding-bottom:3rem}.py-16{padding-top:4rem;padding-bottom:4rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.py-2\.5{padding-top:.625rem;padding-bottom:.625rem}.py-20{padding-top:5rem;padding-bottom:5rem}.py-3{padding-top:.75rem;padding-bottom:.75rem}.py-3\.5{padding-top:.875rem;padding-bottom:.875rem}.py-4{padding-top:1rem;padding-bottom:1rem}.py-5{padding-top:1.25rem;padding-bottom:1.25rem}.py-6{padding-top:1.5rem;padding-bottom:1.5rem}.py-8{padding-top:2rem;padding-bottom:2rem}.pb-1{padding-bottom:.25rem}.pb-1\.5{padding-bottom:.375rem}.pb-2{padding-bottom:.5rem}.pb-2\.5{padding-bottom:.625rem}.pb-20{padding-bottom:5rem}.pb-3{padding-bottom:.75rem}.pb-4{padding-bottom:1rem}.pb-6{padding-bottom:1.5rem}.pb-8{padding-bottom:2rem}.pl-10{padding-left:2.5rem}.pl-2{padding-left:.5rem}.pl-3{padding-left:.75rem}.pl-4{padding-left:1rem}.pl-8{padding-left:2rem}.pl-9{padding-left:2.25rem}.pr-0\.5{padding-right:.125rem}.pr-1{padding-right:.25rem}.pr-10{padding-right:2.5rem}.pr-3{padding-right:.75rem}.pr-8{padding-right:2rem}.pr-9{padding-right:2.25rem}.pt-1{padding-top:.25rem}.pt-2{padding-top:.5rem}.pt-2\.5{padding-top:.625rem}.pt-20{padding-top:5rem}.pt-3{padding-top:.75rem}.pt-4{padding-top:1rem}.text-left{text-align:left}.text-center{text-align:center}.text-right{text-align:right}.font-mono{font-family:JetBrains Mono,Consolas,monospace}.font-sans{font-family:Inter,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica,Arial,sans-serif}.text-2xl{font-size:1.5rem;line-height:2rem}.text-\[10px\]{font-size:10px}.text-\[11px\]{font-size:11px}.text-\[9px\]{font-size:9px}.text-base{font-size:1rem;line-height:1.5rem}.text-lg{font-size:1.125rem;line-height:1.75rem}.text-sm{font-size:.875rem;line-height:1.25rem}.text-xl{font-size:1.25rem;line-height:1.75rem}.text-xs{font-size:.75rem;line-height:1rem}.font-black{font-weight:900}.font-bold{font-weight:700}.font-extrabold{font-weight:800}.font-medium{font-weight:500}.font-normal{font-weight:400}.font-semibold{font-weight:600}.uppercase{text-transform:uppercase}.capitalize{text-transform:capitalize}.italic{font-style:italic}.tabular-nums{--tw-numeric-spacing:tabular-nums;font-variant-numeric:var(--tw-ordinal) var(--tw-slashed-zero) var(--tw-numeric-figure) var(--tw-numeric-spacing) var(--tw-numeric-fraction)}.leading-none{line-height:1}.leading-normal{line-height:1.5}.leading-relaxed{line-height:1.625}.leading-snug{line-height:1.375}.leading-tight{line-height:1.25}.tracking-tight{letter-spacing:-.025em}.tracking-wider{letter-spacing:.05em}.tracking-widest{letter-spacing:.1em}.text-\[\#858980\]{--tw-text-opacity:1;color:rgb(133 137 128/var(--tw-text-opacity,1))}.text-\[\#B78335\]{--tw-text-opacity:1;color:rgb(183 131 53/var(--tw-text-opacity,1))}.text-\[\#BFC1B9\]{--tw-text-opacity:1;color:rgb(191 193 185/var(--tw-text-opacity,1))}.text-\[\#D4B16D\]{--tw-text-opacity:1;color:rgb(212 177 109/var(--tw-text-opacity,1))}.text-\[\#D8D8D0\]{--tw-text-opacity:1;color:rgb(216 216 208/var(--tw-text-opacity,1))}.text-\[\#E5B842\]{--tw-text-opacity:1;color:rgb(229 184 66/var(--tw-text-opacity,1))}.text-\[\#F5F0E5\]{--tw-text-opacity:1;color:rgb(245 240 229/var(--tw-text-opacity,1))}.text-\[\#F8F6F0\]{--tw-text-opacity:1;color:rgb(248 246 240/var(--tw-text-opacity,1))}.text-amber-400{--tw-text-opacity:1;color:rgb(251 191 36/var(--tw-text-opacity,1))}.text-amber-500{--tw-text-opacity:1;color:rgb(245 158 11/var(--tw-text-opacity,1))}.text-amber-600{--tw-text-opacity:1;color:rgb(217 119 6/var(--tw-text-opacity,1))}.text-amber-800{--tw-text-opacity:1;color:rgb(146 64 14/var(--tw-text-opacity,1))}.text-blue-600{--tw-text-opacity:1;color:rgb(37 99 235/var(--tw-text-opacity,1))}.text-blue-700{--tw-text-opacity:1;color:rgb(29 78 216/var(--tw-text-opacity,1))}.text-current{color:currentColor}.text-emerald-400{--tw-text-opacity:1;color:rgb(52 211 153/var(--tw-text-opacity,1))}.text-emerald-500{--tw-text-opacity:1;color:rgb(16 185 129/var(--tw-text-opacity,1))}.text-emerald-600{--tw-text-opacity:1;color:rgb(5 150 105/var(--tw-text-opacity,1))}.text-emerald-600\/80{color:#059669cc}.text-emerald-700{--tw-text-opacity:1;color:rgb(4 120 87/var(--tw-text-opacity,1))}.text-emerald-800{--tw-text-opacity:1;color:rgb(6 95 70/var(--tw-text-opacity,1))}.text-gray-100{--tw-text-opacity:1;color:rgb(243 244 246/var(--tw-text-opacity,1))}.text-gray-200{--tw-text-opacity:1;color:rgb(229 231 235/var(--tw-text-opacity,1))}.text-gray-300{--tw-text-opacity:1;color:rgb(209 213 219/var(--tw-text-opacity,1))}.text-gray-400{--tw-text-opacity:1;color:rgb(156 163 175/var(--tw-text-opacity,1))}.text-gray-500{--tw-text-opacity:1;color:rgb(107 114 128/var(--tw-text-opacity,1))}.text-gray-600{--tw-text-opacity:1;color:rgb(75 85 99/var(--tw-text-opacity,1))}.text-krona-danger{color:var(--color-danger)}.text-krona-gold{color:var(--color-gold)}.text-krona-gold-text{color:var(--color-gold-text)}.text-krona-green{color:var(--color-green)}.text-krona-green-text{color:var(--color-green-text)}.text-krona-info{color:var(--color-info)}.text-krona-primary{color:var(--text-primary)}.text-krona-secondary{color:var(--text-secondary)}.text-krona-surface{color:var(--surface-default)}.text-krona-tertiary{color:var(--text-tertiary)}.text-krona-warning{color:var(--color-warning)}.text-purple-600{--tw-text-opacity:1;color:rgb(147 51 234/var(--tw-text-opacity,1))}.text-purple-800{--tw-text-opacity:1;color:rgb(107 33 168/var(--tw-text-opacity,1))}.text-purple-900{--tw-text-opacity:1;color:rgb(88 28 135/var(--tw-text-opacity,1))}.text-rose-500{--tw-text-opacity:1;color:rgb(244 63 94/var(--tw-text-opacity,1))}.text-rose-600{--tw-text-opacity:1;color:rgb(225 29 72/var(--tw-text-opacity,1))}.text-rose-700{--tw-text-opacity:1;color:rgb(190 18 60/var(--tw-text-opacity,1))}.text-rose-800{--tw-text-opacity:1;color:rgb(159 18 57/var(--tw-text-opacity,1))}.text-sky-400{--tw-text-opacity:1;color:rgb(56 189 248/var(--tw-text-opacity,1))}.text-sky-500{--tw-text-opacity:1;color:rgb(14 165 233/var(--tw-text-opacity,1))}.text-sky-600{--tw-text-opacity:1;color:rgb(2 132 199/var(--tw-text-opacity,1))}.text-sky-800{--tw-text-opacity:1;color:rgb(7 89 133/var(--tw-text-opacity,1))}.text-status-danger-text{color:var(--color-danger-text)}.text-status-info-text{color:var(--color-info-text)}.text-status-success-text{color:var(--color-green-text)}.text-status-warning-text{color:var(--color-warning-text)}.text-white{--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity,1))}.text-white\/70{color:#ffffffb3}.text-zinc-100{--tw-text-opacity:1;color:rgb(244 244 245/var(--tw-text-opacity,1))}.text-zinc-200{--tw-text-opacity:1;color:rgb(228 228 231/var(--tw-text-opacity,1))}.text-zinc-300{--tw-text-opacity:1;color:rgb(212 212 216/var(--tw-text-opacity,1))}.text-zinc-400{--tw-text-opacity:1;color:rgb(161 161 170/var(--tw-text-opacity,1))}.text-zinc-500{--tw-text-opacity:1;color:rgb(113 113 122/var(--tw-text-opacity,1))}.text-zinc-950{--tw-text-opacity:1;color:rgb(9 9 11/var(--tw-text-opacity,1))}.underline{text-decoration-line:underline}.line-through{text-decoration-line:line-through}.underline-offset-4{text-underline-offset:4px}.antialiased{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.placeholder-krona-tertiary::placeholder{color:var(--text-tertiary)}.accent-krona-green{accent-color:var(--color-green)}.opacity-0{opacity:0}.opacity-25{opacity:.25}.opacity-30{opacity:.3}.opacity-40{opacity:.4}.opacity-50{opacity:.5}.opacity-60{opacity:.6}.opacity-70{opacity:.7}.opacity-75{opacity:.75}.opacity-80{opacity:.8}.opacity-90{opacity:.9}.shadow-2xl{--tw-shadow:0 25px 50px -12px #00000040;--tw-shadow-colored:0 25px 50px -12px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000), var(--tw-ring-shadow,0 0 #0000), var(--tw-shadow)}.shadow-krona-modal{--tw-shadow:0 12px 32px #2a271f29, 0 4px 8px #2a271f14;--tw-shadow-colored:0 12px 32px var(--tw-shadow-color), 0 4px 8px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000), var(--tw-ring-shadow,0 0 #0000), var(--tw-shadow)}.shadow-krona-raised{--tw-shadow:0 4px 12px #36322814, 0 2px 4px #3632280a;--tw-shadow-colored:0 4px 12px var(--tw-shadow-color), 0 2px 4px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000), var(--tw-ring-shadow,0 0 #0000), var(--tw-shadow)}.shadow-krona-soft{--tw-shadow:0 1px 3px #3632280d, 0 1px 2px #36322808;--tw-shadow-colored:0 1px 3px var(--tw-shadow-color), 0 1px 2px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000), var(--tw-ring-shadow,0 0 #0000), var(--tw-shadow)}.shadow-lg{--tw-shadow:0 10px 15px -3px #0000001a, 0 4px 6px -4px #0000001a;--tw-shadow-colored:0 10px 15px -3px var(--tw-shadow-color), 0 4px 6px -4px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000), var(--tw-ring-shadow,0 0 #0000), var(--tw-shadow)}.shadow-md{--tw-shadow:0 4px 6px -1px #0000001a, 0 2px 4px -2px #0000001a;--tw-shadow-colored:0 4px 6px -1px var(--tw-shadow-color), 0 2px 4px -2px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000), var(--tw-ring-shadow,0 0 #0000), var(--tw-shadow)}.shadow-sm{--tw-shadow:0 1px 2px 0 #0000000d;--tw-shadow-colored:0 1px 2px 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000), var(--tw-ring-shadow,0 0 #0000), var(--tw-shadow)}.shadow-xl{--tw-shadow:0 20px 25px -5px #0000001a, 0 8px 10px -6px #0000001a;--tw-shadow-colored:0 20px 25px -5px var(--tw-shadow-color), 0 8px 10px -6px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000), var(--tw-ring-shadow,0 0 #0000), var(--tw-shadow)}.shadow-krona-raised{--tw-shadow-color:var(--surface-raised);--tw-shadow:var(--tw-shadow-colored)}.outline{outline-style:solid}.ring-1{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow,0 0 #0000)}.ring-2{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow,0 0 #0000)}.ring-krona-green{--tw-ring-color:var(--color-green)}.ring-rose-500\/40{--tw-ring-color:#f43f5e66}.\!filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)!important}.filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.backdrop-blur-md{--tw-backdrop-blur:blur(12px);-webkit-backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.backdrop-blur-sm{--tw-backdrop-blur:blur(4px);-webkit-backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.transition{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-backdrop-filter,backdrop-filter;transition-duration:.15s;transition-timing-function:cubic-bezier(.4,0,.2,1)}.transition-all{transition-property:all;transition-duration:.15s;transition-timing-function:cubic-bezier(.4,0,.2,1)}.transition-colors{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-duration:.15s;transition-timing-function:cubic-bezier(.4,0,.2,1)}.transition-opacity{transition-property:opacity;transition-duration:.15s;transition-timing-function:cubic-bezier(.4,0,.2,1)}.transition-transform{transition-property:transform;transition-duration:.15s;transition-timing-function:cubic-bezier(.4,0,.2,1)}.duration-150{transition-duration:.15s}.duration-200{transition-duration:.2s}.duration-300{transition-duration:.3s}.ease-in-out{transition-timing-function:cubic-bezier(.4,0,.2,1)}.\[writing-mode\:vertical-rl\]{writing-mode:vertical-rl}:root,[data-theme=soft-light]{--bg-app:#efeee8;--bg-workspace:#f3f1eb;--bg-section:#f0eee8;--surface-default:#f8f6f0;--surface-raised:#fbf9f3;--surface-muted:#e9e7e0;--surface-sunken:#e5e3dc;--surface-hover:#eeece5;--surface-selected:#e2e9e1;--surface-disabled:#e7e5df;--sidebar-bg:#252722;--sidebar-deep:#20221e;--sidebar-surface:#2b2d27;--sidebar-hover:#30332c;--sidebar-active:#34382f;--sidebar-border:#3a3d35;--sidebar-text:#d8d8d0;--sidebar-text-secondary:#a9aca3;--sidebar-text-muted:#858980;--sidebar-text-active:#f5f0e5;--sidebar-icon:#bfc1b9;--sidebar-icon-active:#d4b16d;--sidebar-indicator:#b78335;--text-primary:#252824;--text-secondary:#686c65;--text-tertiary:#7c8078;--text-muted:#8a8d86;--text-disabled:#aaaca6;--text-inverse:#f4f2eb;--text-brand:#805923;--text-link:#2f684c;--text-link-hover:#214b37;--border-subtle:#e3e0d7;--border-default:#d8d5cb;--border-strong:#c6c3b9;--border-focus:#5d8d6d;--color-green:#2f684c;--color-green-hover:#285a42;--color-green-active:#214b37;--color-green-soft:#dde9df;--color-green-border:#bdd4c3;--color-green-text:#315f46;--color-gold:#b78335;--color-gold-hover:#9e702d;--color-gold-active:#805923;--color-gold-soft:#efe3cd;--color-gold-border:#dfc79c;--color-gold-text:#805923;--color-danger:#a6534e;--color-danger-soft:#f1dfdc;--color-danger-border:#dab6b1;--color-danger-text:#873f3b;--color-warning:#a8752f;--color-warning-soft:#f2e7d3;--color-warning-border:#dec59b;--color-warning-text:#80571f;--color-info:#527286;--color-info-soft:#dfe7ea;--color-info-border:#bacbd1;--color-info-text:#405f70;--color-primary:var(--color-green);--color-primary-hover:var(--color-green-hover);--color-primary-active:var(--color-green-active);--color-primary-soft:var(--color-green-soft);--color-primary-text:var(--color-green-text);--color-accent:var(--color-gold);--color-accent-hover:var(--color-gold-hover);--color-accent-active:var(--color-gold-active);--color-accent-soft:var(--color-gold-soft);--color-surface:var(--surface-default);--color-surface-raised:var(--surface-raised);--color-surface-muted:var(--surface-muted);--color-surface-sunken:var(--surface-sunken);--color-surface-hover:var(--surface-hover)}[data-theme=light]{--bg-app:#f5f4ef;--bg-workspace:#f8f7f2;--bg-section:#f2f0e8;--surface-default:#fcfaf5;--surface-raised:#fff;--surface-muted:#efeee8;--surface-sunken:#e7e5dd;--surface-hover:#f2efe8;--surface-selected:#e2eae1;--surface-disabled:#ebe9e2;--sidebar-bg:#eceae3;--sidebar-deep:#e4e1d8;--sidebar-surface:#f2efe8;--sidebar-hover:#dfddd4;--sidebar-active:#d6d2c7;--sidebar-border:#d3cfca;--sidebar-text:#3c4039;--sidebar-text-secondary:#686c65;--sidebar-text-muted:#8a8d86;--sidebar-text-active:#1d201c;--sidebar-icon:#555951;--sidebar-icon-active:#b78335;--sidebar-indicator:#b78335;--text-primary:#252824;--text-secondary:#686c65;--text-tertiary:#7c8078;--text-muted:#8a8d86;--text-disabled:#aaaca6;--text-inverse:#f4f2eb;--text-brand:#805923;--text-link:#2f684c;--text-link-hover:#214b37;--border-subtle:#e8e5dd;--border-default:#dddad1;--border-strong:#c8c5bb;--border-focus:#5d8d6d;--color-green:#2f684c;--color-green-hover:#285a42;--color-green-active:#214b37;--color-green-soft:#e1ebe2;--color-green-border:#bdd4c3;--color-green-text:#315f46;--color-gold:#b78335;--color-gold-hover:#9e702d;--color-gold-active:#805923;--color-gold-soft:#f4ead8;--color-gold-border:#dfc79c;--color-gold-text:#805923;--color-danger:#a6534e;--color-danger-soft:#f5e5e3;--color-danger-border:#dab6b1;--color-danger-text:#873f3b;--color-warning:#a8752f;--color-warning-soft:#f7eedb;--color-warning-border:#dec59b;--color-warning-text:#80571f;--color-info:#527286;--color-info-soft:#e3ebef;--color-info-border:#bacbd1;--color-info-text:#405f70;--color-primary:var(--color-green);--color-primary-hover:var(--color-green-hover);--color-primary-active:var(--color-green-active);--color-primary-soft:var(--color-green-soft);--color-primary-text:var(--color-green-text);--color-accent:var(--color-gold);--color-accent-hover:var(--color-gold-hover);--color-accent-active:var(--color-gold-active);--color-accent-soft:var(--color-gold-soft);--color-surface:var(--surface-default);--color-surface-raised:var(--surface-raised);--color-surface-muted:var(--surface-muted);--color-surface-sunken:var(--surface-sunken);--color-surface-hover:var(--surface-hover)}[data-theme=dark]{--bg-app:#1d1f1b;--bg-workspace:#22241f;--bg-section:#252822;--surface-default:#292b26;--surface-raised:#30322c;--surface-muted:#252722;--surface-sunken:#1f211d;--surface-hover:#343730;--surface-selected:#2d3a30;--surface-disabled:#2b2e28;--sidebar-bg:#191b18;--sidebar-deep:#151714;--sidebar-surface:#20221e;--sidebar-hover:#272a24;--sidebar-active:#2f332c;--sidebar-border:#2d302a;--sidebar-text:#b2b4ac;--sidebar-text-secondary:#888c83;--sidebar-text-muted:#6e726a;--sidebar-text-active:#e8e6de;--sidebar-icon:#9fa29a;--sidebar-icon-active:#c99a4d;--sidebar-indicator:#c99a4d;--text-primary:#e8e6de;--text-secondary:#b2b4ac;--text-tertiary:#888c83;--text-muted:#72766d;--text-disabled:#585b53;--text-inverse:#1d1f1b;--text-brand:#c99a4d;--text-link:#6f9e7c;--text-link-hover:#8ab796;--border-subtle:#34372f;--border-default:#3c3f37;--border-strong:#4d5146;--border-focus:#6f9e7c;--color-green:#3d7a58;--color-green-hover:#488e67;--color-green-active:#2f684c;--color-green-soft:#233529;--color-green-border:#2d4c3a;--color-green-text:#8fc9a6;--color-gold:#c99a4d;--color-gold-hover:#d7ab61;--color-gold-active:#b78335;--color-gold-soft:#382f1e;--color-gold-border:#56472d;--color-gold-text:#e5c384;--color-danger:#b85853;--color-danger-soft:#382423;--color-danger-border:#59312f;--color-danger-text:#e58d89;--color-warning:#b78335;--color-warning-soft:#382f1e;--color-warning-border:#56472d;--color-warning-text:#deaf62;--color-info:#5b8096;--color-info-soft:#212f38;--color-info-border:#304856;--color-info-text:#8eafc2;--color-primary:var(--color-green);--color-primary-hover:var(--color-green-hover);--color-primary-active:var(--color-green-active);--color-primary-soft:var(--color-green-soft);--color-primary-text:var(--color-green-text);--color-accent:var(--color-gold);--color-accent-hover:var(--color-gold-hover);--color-accent-active:var(--color-gold-active);--color-accent-soft:var(--color-gold-soft);--color-surface:var(--surface-default);--color-surface-raised:var(--surface-raised);--color-surface-muted:var(--surface-muted);--color-surface-sunken:var(--surface-sunken);--color-surface-hover:var(--surface-hover)}html,body{background-color:var(--bg-app);color:var(--text-primary);max-width:100%;min-height:100vh;margin:0;padding:0;font-family:Inter,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif;overflow-x:hidden}::-webkit-scrollbar{width:6px;height:6px}::-webkit-scrollbar-track{background:0 0}::-webkit-scrollbar-thumb{background:var(--border-strong);border-radius:3px}::-webkit-scrollbar-thumb:hover{background:var(--text-muted)}@keyframes fadeIn{0%{opacity:0;transform:translateY(4px)}to{opacity:1;transform:translateY(0)}}.animate-fade-in{animation:.2s cubic-bezier(.16,1,.3,1) forwards fadeIn}.krona-overlay{-webkit-backdrop-filter:blur(2px);backdrop-filter:blur(2px);background-color:#1e1f1b6b}.selection\:bg-krona-gold ::selection{background-color:var(--color-gold)}.selection\:text-krona-gold-text ::selection{color:var(--color-gold-text)}.selection\:text-zinc-950 ::selection{--tw-text-opacity:1;color:rgb(9 9 11/var(--tw-text-opacity,1))}.selection\:bg-krona-gold::selection{background-color:var(--color-gold)}.selection\:text-krona-gold-text::selection{color:var(--color-gold-text)}.selection\:text-zinc-950::selection{--tw-text-opacity:1;color:rgb(9 9 11/var(--tw-text-opacity,1))}.placeholder\:text-krona-disabled::placeholder{color:var(--text-disabled)}.placeholder\:text-krona-secondary::placeholder{color:var(--text-secondary)}.first\:pt-0:first-child{padding-top:0}.last\:border-r-0:last-child{border-right-width:0}.last\:pb-0:last-child{padding-bottom:0}.focus-within\:border-emerald-500:focus-within{--tw-border-opacity:1;border-color:rgb(16 185 129/var(--tw-border-opacity,1))}.hover\:scale-110:hover{--tw-scale-x:1.1;--tw-scale-y:1.1;transform:translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.hover\:scale-125:hover{--tw-scale-x:1.25;--tw-scale-y:1.25;transform:translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.hover\:border-amber-500:hover{--tw-border-opacity:1;border-color:rgb(245 158 11/var(--tw-border-opacity,1))}.hover\:border-amber-500\/50:hover{border-color:#f59e0b80}.hover\:border-emerald-500:hover{--tw-border-opacity:1;border-color:rgb(16 185 129/var(--tw-border-opacity,1))}.hover\:border-emerald-500\/50:hover{border-color:#10b98180}.hover\:border-krona-border:hover{border-color:var(--border-default)}.hover\:border-krona-border-strong:hover{border-color:var(--border-strong)}.hover\:border-krona-gold:hover{border-color:var(--color-gold)}.hover\:border-krona-green:hover{border-color:var(--color-green)}.hover\:border-krona-secondary:hover{border-color:var(--text-secondary)}.hover\:bg-\[\#285A42\]:hover{--tw-bg-opacity:1;background-color:rgb(40 90 66/var(--tw-bg-opacity,1))}.hover\:bg-\[\#30332C\]:hover{--tw-bg-opacity:1;background-color:rgb(48 51 44/var(--tw-bg-opacity,1))}.hover\:bg-amber-300:hover{--tw-bg-opacity:1;background-color:rgb(252 211 77/var(--tw-bg-opacity,1))}.hover\:bg-amber-400:hover{--tw-bg-opacity:1;background-color:rgb(251 191 36/var(--tw-bg-opacity,1))}.hover\:bg-amber-500\/20:hover{background-color:#f59e0b33}.hover\:bg-amber-500\/25:hover{background-color:#f59e0b40}.hover\:bg-emerald-400:hover{--tw-bg-opacity:1;background-color:rgb(52 211 153/var(--tw-bg-opacity,1))}.hover\:bg-emerald-500:hover{--tw-bg-opacity:1;background-color:rgb(16 185 129/var(--tw-bg-opacity,1))}.hover\:bg-emerald-500\/10:hover{background-color:#10b9811a}.hover\:bg-emerald-500\/20:hover{background-color:#10b98133}.hover\:bg-emerald-500\/25:hover{background-color:#10b98140}.hover\:bg-emerald-600:hover{--tw-bg-opacity:1;background-color:rgb(5 150 105/var(--tw-bg-opacity,1))}.hover\:bg-gray-700:hover{--tw-bg-opacity:1;background-color:rgb(55 65 81/var(--tw-bg-opacity,1))}.hover\:bg-gray-800:hover{--tw-bg-opacity:1;background-color:rgb(31 41 55/var(--tw-bg-opacity,1))}.hover\:bg-krona-danger-text:hover{background-color:var(--color-danger-text)}.hover\:bg-krona-gold-hover:hover{background-color:var(--color-gold-hover)}.hover\:bg-krona-green:hover{background-color:var(--color-green)}.hover\:bg-krona-green-hover:hover{background-color:var(--color-green-hover)}.hover\:bg-krona-hover:hover{background-color:var(--surface-hover)}.hover\:bg-krona-surface:hover{background-color:var(--surface-default)}.hover\:bg-krona-workspace:hover{background-color:var(--bg-workspace)}.hover\:bg-rose-400:hover{--tw-bg-opacity:1;background-color:rgb(251 113 133/var(--tw-bg-opacity,1))}.hover\:bg-rose-500\/10:hover{background-color:#f43f5e1a}.hover\:bg-rose-500\/20:hover{background-color:#f43f5e33}.hover\:bg-rose-500\/25:hover{background-color:#f43f5e40}.hover\:bg-zinc-600:hover{--tw-bg-opacity:1;background-color:rgb(82 82 91/var(--tw-bg-opacity,1))}.hover\:text-\[\#D8D8D0\]:hover{--tw-text-opacity:1;color:rgb(216 216 208/var(--tw-text-opacity,1))}.hover\:text-\[\#F5F0E5\]:hover{--tw-text-opacity:1;color:rgb(245 240 229/var(--tw-text-opacity,1))}.hover\:text-amber-500:hover{--tw-text-opacity:1;color:rgb(245 158 11/var(--tw-text-opacity,1))}.hover\:text-amber-600:hover{--tw-text-opacity:1;color:rgb(217 119 6/var(--tw-text-opacity,1))}.hover\:text-emerald-300:hover{--tw-text-opacity:1;color:rgb(110 231 183/var(--tw-text-opacity,1))}.hover\:text-emerald-400:hover{--tw-text-opacity:1;color:rgb(52 211 153/var(--tw-text-opacity,1))}.hover\:text-gray-200:hover{--tw-text-opacity:1;color:rgb(229 231 235/var(--tw-text-opacity,1))}.hover\:text-krona-danger:hover{color:var(--color-danger)}.hover\:text-krona-gold:hover{color:var(--color-gold)}.hover\:text-krona-green:hover{color:var(--color-green)}.hover\:text-krona-green-hover:hover{color:var(--color-green-hover)}.hover\:text-krona-primary:hover{color:var(--text-primary)}.hover\:text-krona-secondary:hover{color:var(--text-secondary)}.hover\:text-rose-400:hover{--tw-text-opacity:1;color:rgb(251 113 133/var(--tw-text-opacity,1))}.hover\:text-rose-600:hover{--tw-text-opacity:1;color:rgb(225 29 72/var(--tw-text-opacity,1))}.hover\:text-rose-700:hover{--tw-text-opacity:1;color:rgb(190 18 60/var(--tw-text-opacity,1))}.hover\:text-white:hover{--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity,1))}.hover\:underline:hover{text-decoration-line:underline}.hover\:opacity-100:hover{opacity:1}.hover\:opacity-95:hover{opacity:.95}.hover\:shadow-krona-soft:hover{--tw-shadow:0 1px 3px #3632280d, 0 1px 2px #36322808;--tw-shadow-colored:0 1px 3px var(--tw-shadow-color), 0 1px 2px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000), var(--tw-ring-shadow,0 0 #0000), var(--tw-shadow)}.hover\:brightness-110:hover{--tw-brightness:brightness(1.1);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.focus\:border-amber-500:focus{--tw-border-opacity:1;border-color:rgb(245 158 11/var(--tw-border-opacity,1))}.focus\:border-krona-danger:focus{border-color:var(--color-danger)}.focus\:border-krona-gold:focus{border-color:var(--color-gold)}.focus\:border-krona-green:focus{border-color:var(--color-green)}.focus\:outline-none:focus{outline-offset:2px;outline:2px solid #0000}.focus\:ring-1:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow,0 0 #0000)}.focus\:ring-2:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow,0 0 #0000)}.focus\:ring-amber-500:focus{--tw-ring-opacity:1;--tw-ring-color:rgb(245 158 11/var(--tw-ring-opacity,1))}.focus\:ring-krona-gold:focus{--tw-ring-color:var(--color-gold)}.focus\:ring-krona-green:focus{--tw-ring-color:var(--color-green)}.active\:scale-95:active{--tw-scale-x:.95;--tw-scale-y:.95;transform:translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.active\:scale-\[0\.98\]:active{--tw-scale-x:.98;--tw-scale-y:.98;transform:translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.active\:scale-\[0\.99\]:active{--tw-scale-x:.99;--tw-scale-y:.99;transform:translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.active\:cursor-grabbing:active{cursor:grabbing}.active\:bg-krona-danger-text:active{background-color:var(--color-danger-text)}.active\:bg-krona-gold-active:active{background-color:var(--color-gold-active)}.active\:bg-krona-green-active:active{background-color:var(--color-green-active)}.disabled\:pointer-events-none:disabled{pointer-events:none}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:opacity-20:disabled{opacity:.2}.disabled\:opacity-30:disabled{opacity:.3}.disabled\:opacity-40:disabled{opacity:.4}.disabled\:opacity-50:disabled{opacity:.5}.group:hover .group-hover\:block{display:block}.group:hover .group-hover\:translate-x-0\.5{--tw-translate-x:.125rem;transform:translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.group:hover .group-hover\:scale-110{--tw-scale-x:1.1;--tw-scale-y:1.1;transform:translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.group:hover .group-hover\:text-amber-500{--tw-text-opacity:1;color:rgb(245 158 11/var(--tw-text-opacity,1))}.group:hover .group-hover\:text-krona-gold{color:var(--color-gold)}.group:hover .group-hover\:text-krona-green{color:var(--color-green)}.group:hover .group-hover\:text-krona-primary{color:var(--text-primary)}.group:hover .group-hover\:opacity-100{opacity:1}.peer:checked~.peer-checked\:border-krona-green{border-color:var(--color-green)}.peer:checked~.peer-checked\:bg-krona-green{background-color:var(--color-green)}.peer:focus-visible~.peer-focus-visible\:ring-2{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow,0 0 #0000)}.peer:disabled~.peer-disabled\:cursor-not-allowed{cursor:not-allowed}.peer:disabled~.peer-disabled\:opacity-50{opacity:.5}@media (width>=640px){.sm\:col-span-1{grid-column:span 1/span 1}.sm\:block{display:block}.sm\:inline-block{display:inline-block}.sm\:inline{display:inline}.sm\:flex{display:flex}.sm\:inline-flex{display:inline-flex}.sm\:w-80{width:20rem}.sm\:w-auto{width:auto}.sm\:max-w-xl{max-width:36rem}.sm\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.sm\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.sm\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.sm\:grid-cols-6{grid-template-columns:repeat(6,minmax(0,1fr))}.sm\:flex-row{flex-direction:row}.sm\:items-start{align-items:flex-start}.sm\:items-center{align-items:center}.sm\:justify-end{justify-content:flex-end}.sm\:justify-center{justify-content:center}.sm\:justify-between{justify-content:space-between}.sm\:gap-3{gap:.75rem}.sm\:gap-4{gap:1rem}.sm\:space-y-6>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(1.5rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1.5rem * var(--tw-space-y-reverse))}.sm\:self-auto{align-self:auto}.sm\:border-t-0{border-top-width:0}.sm\:p-4{padding:1rem}.sm\:p-5{padding:1.25rem}.sm\:pt-0{padding-top:0}.sm\:text-right{text-align:right}.sm\:text-\[13px\]{font-size:13px}.sm\:text-sm{font-size:.875rem;line-height:1.25rem}.sm\:text-xl{font-size:1.25rem;line-height:1.75rem}}@media (width>=768px){.md\:col-span-1{grid-column:span 1/span 1}.md\:col-span-2{grid-column:span 2/span 2}.md\:col-span-3{grid-column:span 3/span 3}.md\:line-clamp-none{-webkit-line-clamp:none;-webkit-box-orient:horizontal;display:block;overflow:visible}.md\:block{display:block}.md\:flex{display:flex}.md\:hidden{display:none}.md\:w-80{width:20rem}.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.md\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.md\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.md\:flex-row{flex-direction:row}.md\:items-center{align-items:center}.md\:gap-5{gap:1.25rem}.md\:gap-6{gap:1.5rem}.md\:space-y-6>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(1.5rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1.5rem * var(--tw-space-y-reverse))}.md\:p-4{padding:1rem}.md\:p-5{padding:1.25rem}.md\:p-6{padding:1.5rem}.md\:p-8{padding:2rem}.md\:px-6{padding-left:1.5rem;padding-right:1.5rem}.md\:pb-6{padding-bottom:1.5rem}.md\:text-2xl{font-size:1.5rem;line-height:2rem}.md\:text-lg{font-size:1.125rem;line-height:1.75rem}.md\:text-xl{font-size:1.25rem;line-height:1.75rem}}@media (width>=1024px){.lg\:col-span-12{grid-column:span 12/span 12}.lg\:col-span-2{grid-column:span 2/span 2}.lg\:col-span-3{grid-column:span 3/span 3}.lg\:col-span-4{grid-column:span 4/span 4}.lg\:col-span-5{grid-column:span 5/span 5}.lg\:col-span-6{grid-column:span 6/span 6}.lg\:col-span-7{grid-column:span 7/span 7}.lg\:col-span-8{grid-column:span 8/span 8}.lg\:col-span-9{grid-column:span 9/span 9}.lg\:block{display:block}.lg\:inline{display:inline}.lg\:flex{display:flex}.lg\:hidden{display:none}.lg\:max-h-none{max-height:none}.lg\:w-64{width:16rem}.lg\:w-96{width:24rem}.lg\:grid-cols-12{grid-template-columns:repeat(12,minmax(0,1fr))}.lg\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.lg\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.lg\:grid-cols-5{grid-template-columns:repeat(5,minmax(0,1fr))}.lg\:grid-cols-7{grid-template-columns:repeat(7,minmax(0,1fr))}.lg\:gap-3{gap:.75rem}.lg\:gap-4{gap:1rem}.lg\:p-6{padding:1.5rem}}@media (width>=1280px){.xl\:inline{display:inline}.xl\:flex{display:flex}.xl\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.xl\:grid-cols-6{grid-template-columns:repeat(6,minmax(0,1fr))}}@media (prefers-color-scheme:dark){.dark\:border-emerald-700{--tw-border-opacity:1;border-color:rgb(4 120 87/var(--tw-border-opacity,1))}.dark\:border-purple-700{--tw-border-opacity:1;border-color:rgb(126 34 206/var(--tw-border-opacity,1))}.dark\:border-sky-700{--tw-border-opacity:1;border-color:rgb(3 105 161/var(--tw-border-opacity,1))}.dark\:bg-\[\#3A3D35\]{--tw-bg-opacity:1;background-color:rgb(58 61 53/var(--tw-bg-opacity,1))}.dark\:bg-emerald-950\/40{background-color:#022c2266}.dark\:bg-purple-950\/40{background-color:#3b076466}.dark\:bg-sky-950\/40{background-color:#082f4966}.dark\:text-amber-300{--tw-text-opacity:1;color:rgb(252 211 77/var(--tw-text-opacity,1))}.dark\:text-amber-400{--tw-text-opacity:1;color:rgb(251 191 36/var(--tw-text-opacity,1))}.dark\:text-blue-300{--tw-text-opacity:1;color:rgb(147 197 253/var(--tw-text-opacity,1))}.dark\:text-emerald-300{--tw-text-opacity:1;color:rgb(110 231 183/var(--tw-text-opacity,1))}.dark\:text-emerald-400{--tw-text-opacity:1;color:rgb(52 211 153/var(--tw-text-opacity,1))}.dark\:text-emerald-400\/80{color:#34d399cc}.dark\:text-purple-200{--tw-text-opacity:1;color:rgb(233 213 255/var(--tw-text-opacity,1))}.dark\:text-purple-300{--tw-text-opacity:1;color:rgb(216 180 254/var(--tw-text-opacity,1))}.dark\:text-purple-400{--tw-text-opacity:1;color:rgb(192 132 252/var(--tw-text-opacity,1))}.dark\:text-rose-300{--tw-text-opacity:1;color:rgb(253 164 175/var(--tw-text-opacity,1))}.dark\:text-rose-400{--tw-text-opacity:1;color:rgb(251 113 133/var(--tw-text-opacity,1))}.dark\:text-sky-300{--tw-text-opacity:1;color:rgb(125 211 252/var(--tw-text-opacity,1))}.dark\:text-sky-400{--tw-text-opacity:1;color:rgb(56 189 248/var(--tw-text-opacity,1))}} diff --git a/dist/assets/index-CNnq9VO5.js b/dist/assets/index-CNnq9VO5.js deleted file mode 100644 index cb269df..0000000 --- a/dist/assets/index-CNnq9VO5.js +++ /dev/null @@ -1,13 +0,0 @@ -const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/DynamicDashboard-CEusXfUQ.js","assets/useToast-CS8pZhce.js","assets/dollar-sign-Bf6JneNn.js","assets/truck-D5o8mTsH.js","assets/utensils-BhILG_B7.js","assets/formatters-WvGQLZg0.js","assets/AreaChart-BnzyacT3.js","assets/OperationsModule-aDLWk78D.js","assets/building-BdUpGLM5.js","assets/phone-DpnQw4if.js","assets/user-CuEEaB8a.js","assets/mockData-DAqQG5te.js","assets/InventoryModule-B2QbjtwQ.js","assets/useOrders-Dp-LV7vp.js","assets/currency-DdDs82F5.js","assets/useInventory-BwKK4D-W.js","assets/SalesModule-2VZC1D5Y.js","assets/CrmModule-Cw43Bd0U.js","assets/DynamicFormRenderer-u2RREFCE.js","assets/types-DMl_5q2N.js","assets/file-text-DR21jZDS.js","assets/list-XDoRqfJ2.js","assets/star-B6hvSjuv.js","assets/upload-CY2IsfiN.js","assets/FinanceModule-DiPGlGDb.js","assets/EmployeesModule-BFNtlVZT.js","assets/CommunicationsModule-CVUsOJz5.js","assets/HelpDeskModule-B1p0xcj-.js","assets/TasksModule-3oA5V8YP.js","assets/link-DOg0dLYA.js","assets/CmsModule-qZLJpvR4.js","assets/arrow-down-CWbiHuZO.js","assets/arrow-up-B4Ca-HNG.js","assets/image-B_RO1I7c.js","assets/settings-2-CSojebrG.js","assets/MarketingModule-D28ZVpJ3.js","assets/AnalyticsModule-DwAY229b.js","assets/AutomationModule-CWTQE3B1.js","assets/terminal-CcncyL3J.js","assets/AiCenterModule-TWoGGfS0.js","assets/AppsCatalogModule-Dsu6Y18J.js","assets/types-CTcNpN0z.js","assets/SettingsModule-C5LrdOmz.js","assets/indexedDb-D30TbhA6.js","assets/EntityCatalog-_fN1VjC6.js","assets/panels-top-left-BomsDlf9.js","assets/table-_fqSCPRE.js","assets/FieldBuilder-iF06Nk4x.js","assets/fieldTypesMeta-BWfaDuCZ.js","assets/mail-DOD5KO1v.js","assets/eye-CkF1gwUX.js","assets/pen-D8SS70u3.js","assets/FormBuilder-hvNl7u0G.js","assets/move-up-qiRY8MuU.js","assets/save-D8euL60I.js","assets/CardLayoutBuilder-CM6emXoY.js","assets/ViewBuilder-BPVOktaa.js","assets/arrow-up-down--M136cK3.js","assets/CustomEntityPage-BBlkJ9R4.js"])))=>i.map(i=>d[i]); -import{a as e,c as t,f as n,h as r,i,l as a,n as o,o as s,p as c,r as l,s as u,u as d}from"./useToast-CS8pZhce.js";import{n as f,t as p}from"./demo-D1nHL60J.js";import{S as m,b as h,c as g,f as _,g as v,h as y,i as b,l as x,m as S,n as C,o as w,p as T,r as E,s as ee,t as D,u as O,v as te,x as k,y as ne}from"./indexedDb-D30TbhA6.js";(function(){let e=document.createElement(`link`).relList;if(e&&e.supports&&e.supports(`modulepreload`))return;for(let e of document.querySelectorAll(`link[rel="modulepreload"]`))n(e);new MutationObserver(e=>{for(let t of e)if(t.type===`childList`)for(let e of t.addedNodes)e.tagName===`LINK`&&e.rel===`modulepreload`&&n(e)}).observe(document,{childList:!0,subtree:!0});function t(e){let t={};return e.integrity&&(t.integrity=e.integrity),e.referrerPolicy&&(t.referrerPolicy=e.referrerPolicy),t.credentials=e.crossOrigin===`use-credentials`?`include`:e.crossOrigin===`anonymous`?`omit`:`same-origin`,t}function n(e){if(e.ep)return;e.ep=!0;let n=t(e);fetch(e.href,n)}})();var re=c((e=>{function t(e,t){var n=e.length;e.push(t);a:for(;0>>1,a=e[r];if(0>>1;ri(c,n))li(u,c)?(e[r]=u,e[l]=n,r=l):(e[r]=c,e[s]=n,r=s);else if(li(u,n))e[r]=u,e[l]=n,r=l;else break a}}return t}function i(e,t){var n=e.sortIndex-t.sortIndex;return n===0?e.id-t.id:n}if(e.unstable_now=void 0,typeof performance==`object`&&typeof performance.now==`function`){var a=performance;e.unstable_now=function(){return a.now()}}else{var o=Date,s=o.now();e.unstable_now=function(){return o.now()-s}}var c=[],l=[],u=1,d=null,f=3,p=!1,m=!1,h=!1,g=!1,_=typeof setTimeout==`function`?setTimeout:null,v=typeof clearTimeout==`function`?clearTimeout:null,y=typeof setImmediate<`u`?setImmediate:null;function b(e){for(var i=n(l);i!==null;){if(i.callback===null)r(l);else if(i.startTime<=e)r(l),i.sortIndex=i.expirationTime,t(c,i);else break;i=n(l)}}function x(e){if(h=!1,b(e),!m){if(n(c)!==null)m=!0,S||(S=!0,D());else{var t=n(l);t!==null&&k(x,t.startTime-e)}}}var S=!1,C=-1,w=5,T=-1;function E(){return g?!0:!(e.unstable_now()-Tt&&E());){var o=d.callback;if(typeof o==`function`){d.callback=null,f=d.priorityLevel;var s=o(d.expirationTime<=t);if(t=e.unstable_now(),typeof s==`function`){d.callback=s,b(t),i=!0;break b}d===n(c)&&r(c),b(t)}else r(c);d=n(c)}if(d!==null)i=!0;else{var u=n(l);u!==null&&k(x,u.startTime-t),i=!1}}break a}finally{d=null,f=a,p=!1}i=void 0}}finally{i?D():S=!1}}}var D;if(typeof y==`function`)D=function(){y(ee)};else if(typeof MessageChannel<`u`){var O=new MessageChannel,te=O.port2;O.port1.onmessage=ee,D=function(){te.postMessage(null)}}else D=function(){_(ee,0)};function k(t,n){C=_(function(){t(e.unstable_now())},n)}e.unstable_IdlePriority=5,e.unstable_ImmediatePriority=1,e.unstable_LowPriority=4,e.unstable_NormalPriority=3,e.unstable_Profiling=null,e.unstable_UserBlockingPriority=2,e.unstable_cancelCallback=function(e){e.callback=null},e.unstable_forceFrameRate=function(e){0>e||125o?(r.sortIndex=a,t(l,r),n(c)===null&&r===n(l)&&(h?(v(C),C=-1):h=!0,k(x,a-o))):(r.sortIndex=s,t(c,r),m||p||(m=!0,S||(S=!0,D()))),r},e.unstable_shouldYield=E,e.unstable_wrapCallback=function(e){var t=f;return function(){var n=f;f=t;try{return e.apply(this,arguments)}finally{f=n}}}})),ie=c(((e,t)=>{t.exports=re()})),ae=c((e=>{var t=n();function r(e){var t=`https://react.dev/errors/`+e;if(1{function n(){if(!(typeof __REACT_DEVTOOLS_GLOBAL_HOOK__>`u`||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!=`function`))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(n)}catch(e){console.error(e)}}n(),t.exports=ae()})),se=c((e=>{var t=ie(),r=n(),i=oe();function a(e){var t=`https://react.dev/errors/`+e;if(1be||(e.current=ye[be],ye[be]=null,be--)}function xe(e,t){be++,ye[be]=e.current,e.current=t}var Se=F(null),Ce=F(null),we=F(null),Te=F(null);function Ee(e,t){switch(xe(we,t),xe(Ce,e),xe(Se,null),t.nodeType){case 9:case 11:e=(e=t.documentElement)&&(e=e.namespaceURI)?up(e):0;break;default:if(e=t.tagName,t=t.namespaceURI)t=up(t),e=dp(t,e);else switch(e){case`svg`:e=1;break;case`math`:e=2;break;default:e=0}}I(Se),xe(Se,e)}function De(){I(Se),I(Ce),I(we)}function Oe(e){var t=e.memoizedState;t!==null&&(sh._currentValue=t.memoizedState,xe(Te,e)),t=Se.current;var n=dp(t,e.type);t!==n&&(xe(Ce,e),xe(Se,n))}function ke(e){Ce.current===e&&(I(Se),I(Ce)),Te.current===e&&(I(Te),sh._currentValue=ve)}var Ae,je;function Me(e){if(Ae===void 0)try{throw Error()}catch(e){var t=e.stack.trim().match(/\n( *(at )?)/);Ae=t&&t[1]||``,je=-1)`:-1i||c[r]!==l[i]){var u=` -`+c[r].replace(` at new `,` at `);return e.displayName&&u.includes(``)&&(u=u.replace(``,e.displayName)),u}while(1<=r&&0<=i);break}}}finally{Ne=!1,Error.prepareStackTrace=n}return(n=e?e.displayName||e.name:``)?Me(n):``}function Fe(e,t){switch(e.tag){case 26:case 27:case 5:return Me(e.type);case 16:return Me(`Lazy`);case 13:return e.child!==t&&t!==null?Me(`Suspense Fallback`):Me(`Suspense`);case 19:return Me(`SuspenseList`);case 0:case 15:return Pe(e.type,!1);case 11:return Pe(e.type.render,!1);case 1:return Pe(e.type,!0);case 31:return Me(`Activity`);case 30:return Me(`ViewTransition`);default:return``}}function Ie(e){try{var t=``,n=null;do t+=Fe(e,n),n=e,e=e.return;while(e);return t}catch(e){return` -Error generating stack: `+e.message+` -`+e.stack}}var Le=Object.prototype.hasOwnProperty,Re=t.unstable_scheduleCallback,ze=t.unstable_cancelCallback,Be=t.unstable_shouldYield,Ve=t.unstable_requestPaint,He=t.unstable_now,Ue=t.unstable_getCurrentPriorityLevel,We=t.unstable_ImmediatePriority,Ge=t.unstable_UserBlockingPriority,Ke=t.unstable_NormalPriority,qe=t.unstable_LowPriority,Je=t.unstable_IdlePriority,Ye=t.log,Xe=t.unstable_setDisableYieldValue,Ze=null,Qe=null;function $e(e){if(typeof Ye==`function`&&Xe(e),Qe&&typeof Qe.setStrictMode==`function`)try{Qe.setStrictMode(Ze,e)}catch{}}var et=Math.clz32?Math.clz32:rt,tt=Math.log,nt=Math.LN2;function rt(e){return e>>>=0,e===0?32:31-(tt(e)/nt|0)|0}var it=256,at=262144,ot=4194304;function st(e){var t=e&42;if(t!==0)return t;switch(e&-e){case 1:return 1;case 2:return 2;case 4:return 4;case 8:return 8;case 16:return 16;case 32:return 32;case 64:return 64;case 128:return 128;case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:return e&-e;case 262144:case 524288:case 1048576:case 2097152:return e&3932160;case 4194304:case 8388608:case 16777216:case 33554432:return e&62914560;case 67108864:return 67108864;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 0;default:return e}}function ct(e,t,n){var r=e.pendingLanes;if(r===0)return 0;var i=0,a=e.suspendedLanes,o=e.pingedLanes;e=e.warmLanes;var s=r&134217727;return s===0?(s=r&~a,s===0?o===0?n||(n=r&~e,n!==0&&(i=st(n))):i=st(o):i=st(s)):(r=s&~a,r===0?(o&=s,o===0?n||(n=s&~e,n!==0&&(i=st(n))):i=st(o)):i=st(r)),i===0?0:t!==0&&t!==i&&(t&a)===0&&(a=i&-i,n=t&-t,a>=n||a===32&&n&4194048)?t:i}function lt(e,t){return(e.pendingLanes&~(e.suspendedLanes&~e.pingedLanes)&t)===0}function ut(e,t){t&8&&(t|=t&32);var n=e.entangledLanes;if(n!==0)for(e=e.entanglements,n&=t;0n;n++)t.push(e);return t}function mt(e,t){e.pendingLanes|=t,t!==268435456&&(e.suspendedLanes=0,e.pingedLanes=0,e.warmLanes=0)}function ht(e,t,n,r,i,a){var o=e.pendingLanes;e.pendingLanes=n,e.suspendedLanes=0,e.pingedLanes=0,e.warmLanes=0,e.expiredLanes&=n,e.entangledLanes&=n,e.errorRecoveryDisabledLanes&=n,e.shellSuspendCounter=0;var s=e.entanglements,c=e.expirationTimes,l=e.hiddenUpdates;for(n=o&~n;0`u`||window.document===void 0||window.document.createElement===void 0),An=!1;if(kn)try{var jn={};Object.defineProperty(jn,"passive",{get:function(){An=!0}}),window.addEventListener(`test`,jn,jn),window.removeEventListener(`test`,jn,jn)}catch{An=!1}var Mn=null,Nn=null,Pn=null;function Fn(){if(Pn)return Pn;var e,t=Nn,n=t.length,r,i=`value`in Mn?Mn.value:Mn.textContent,a=i.length;for(e=0;e=mr),_r=` `,vr=!1;function yr(e,t){switch(e){case`keyup`:return fr.indexOf(t.keyCode)!==-1;case`keydown`:return t.keyCode!==229;case`keypress`:case`mousedown`:case`focusout`:return!0;default:return!1}}function br(e){return e=e.detail,typeof e==`object`&&`data`in e?e.data:null}var xr=!1;function Sr(e,t){switch(e){case`compositionend`:return br(t);case`keypress`:return t.which===32?(vr=!0,_r):null;case`textInput`:return e=t.data,e===_r&&vr?null:e;default:return null}}function Cr(e,t){if(xr)return e===`compositionend`||!pr&&yr(e,t)?(e=Fn(),Pn=Nn=Mn=null,xr=!1,e):null;switch(e){case`paste`:return null;case`keypress`:if(!(t.ctrlKey||t.altKey||t.metaKey)||t.ctrlKey&&t.altKey){if(t.char&&1=t)return{node:n,offset:t-e};e=r}a:{for(;n;){if(n.nextSibling){n=n.nextSibling;break a}n=n.parentNode}n=void 0}n=Kr(n)}}function Jr(e,t){return e&&t?e===t?!0:e&&e.nodeType===3?!1:t&&t.nodeType===3?Jr(e,t.parentNode):`contains`in e?e.contains(t):e.compareDocumentPosition?!!(e.compareDocumentPosition(t)&16):!1:!1}function Yr(e){e=e!=null&&e.ownerDocument!=null&&e.ownerDocument.defaultView!=null?e.ownerDocument.defaultView:window;for(var t=Gr(e.document);t instanceof e.HTMLIFrameElement;){try{var n=typeof t.contentWindow.location.href==`string`}catch{n=!1}if(n)e=t.contentWindow;else break;t=Gr(e.document)}return t}function Xr(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return t&&(t===`input`&&(e.type===`text`||e.type===`search`||e.type===`tel`||e.type===`url`||e.type===`password`)||t===`textarea`||e.contentEditable===`true`)}var Zr=kn&&`documentMode`in document&&11>=document.documentMode,Qr=null,$r=null,ei=null,ti=!1;function ni(e,t,n){var r=n.window===n?n.document:n.nodeType===9?n:n.ownerDocument;ti||Qr==null||Qr!==Gr(r)||(r=Qr,`selectionStart`in r&&Xr(r)?r={start:r.selectionStart,end:r.selectionEnd}:(r=(r.ownerDocument&&r.ownerDocument.defaultView||window).getSelection(),r={anchorNode:r.anchorNode,anchorOffset:r.anchorOffset,focusNode:r.focusNode,focusOffset:r.focusOffset}),ei&&Wr(ei,r)||(ei=r,r=Jf($r,`onSelect`),0>=o,i-=o,Qi=1<<32-et(t)+i|n<h?(g=d,d=null):g=d.sibling;var _=p(i,d,s[h],c);if(_===null){d===null&&(d=g);break}e&&d&&_.alternate===null&&t(i,d),a=o(_,a,h),u===null?l=_:u.sibling=_,u=_,d=g}if(h===s.length)return n(i,d),R&&ea(i,h),l;if(d===null){for(;hg?(_=h,h=null):_=h.sibling;var y=p(i,h,v.value,l);if(y===null){h===null&&(h=_);break}e&&h&&y.alternate===null&&t(i,h),s=o(y,s,g),d===null?u=y:d.sibling=y,d=y,h=_}if(v.done)return n(i,h),R&&ea(i,g),u;if(h===null){for(;!v.done;g++,v=c.next())v=f(i,v.value,l),v!==null&&(s=o(v,s,g),d===null?u=v:d.sibling=v,d=v);return R&&ea(i,g),u}for(h=r(h);!v.done;g++,v=c.next())v=m(h,i,g,v.value,l),v!==null&&(e&&(_=v.alternate,_!==null&&h.delete(_.key===null?g:_.key)),s=o(v,s,g),d===null?u=v:d.sibling=v,d=v);return e&&h.forEach(function(e){return t(i,e)}),R&&ea(i,g),u}function _(e,r,o,c){if(typeof o==`object`&&o&&o.type===O&&o.key===null&&o.props.ref===void 0&&(o=o.props.children),typeof o==`object`&&o){switch(o.$$typeof){case ee:a:{for(var l=o.key;r!==null;){if(r.key===l){if(l=o.type,l===O){if(r.tag===7){n(e,r.sibling),c=i(r,o.props.children),lo(c,o),c.return=e,e=c;break a}}else if(r.elementType===l||typeof l==`object`&&l&&l.$$typeof===le&&no(l)===r.type){n(e,r.sibling),c=i(r,o.props),lo(c,o),c.return=e,e=c;break a}n(e,r);break}t(e,r),r=r.sibling}o.type===O?(c=zi(o.props.children,e.mode,c,o.key),lo(c,o),c.return=e,e=c):(c=Ri(o.type,o.key,o.props,null,e.mode,c),lo(c,o),c.return=e,e=c)}return s(e);case D:a:{for(l=o.key;r!==null;){if(r.key===l){if(r.tag===4&&r.stateNode.containerInfo===o.containerInfo&&r.stateNode.implementation===o.implementation){n(e,r.sibling),c=i(r,o.children||[]),c.return=e,e=c;break a}n(e,r);break}t(e,r),r=r.sibling}c=Hi(o,e.mode,c),c.return=e,e=c}return s(e);case le:return o=no(o),_(e,r,o,c)}if(_e(o))return h(e,r,o,c);if(he(o)){if(l=he(o),typeof l!=`function`)throw Error(a(150));return o=l.call(o),g(e,r,o,c)}if(typeof o.then==`function`)return _(e,r,co(o),c);if(o.$$typeof===re)return _(e,r,Oa(e,o),c);uo(e,o)}return typeof o==`string`&&o!==``||typeof o==`number`||typeof o==`bigint`?(o=``+o,r!==null&&r.tag===6?(n(e,r.sibling),c=i(r,o),c.return=e,e=c):(n(e,r),c=Bi(o,e.mode,c),c.return=e,e=c),s(e)):n(e,r)}return function(e,t,n,r){try{so=0;var i=_(e,t,n,r);return oo=null,i}catch(t){if(t===Xa||t===Qa)throw t;var a=Pi(29,t,null,e.mode);return a.lanes=r,a.return=e,a}}}var po=fo(!0),mo=fo(!1),ho=!1;function go(e){e.updateQueue={baseState:e.memoizedState,firstBaseUpdate:null,lastBaseUpdate:null,shared:{pending:null,lanes:0,hiddenCallbacks:null},callbacks:null}}function _o(e,t){e=e.updateQueue,t.updateQueue===e&&(t.updateQueue={baseState:e.baseState,firstBaseUpdate:e.firstBaseUpdate,lastBaseUpdate:e.lastBaseUpdate,shared:e.shared,callbacks:null})}function vo(e){return{lane:e,tag:0,payload:null,callback:null,next:null}}function yo(e,t,n){var r=e.updateQueue;if(r===null)return null;if(r=r.shared,G&2){var i=r.pending;return i===null?t.next=t:(t.next=i.next,i.next=t),r.pending=t,t=ji(e),Ai(e,null,n),t}return Di(e,r,t,n),ji(e)}function bo(e,t,n){if(t=t.updateQueue,t!==null&&(t=t.shared,n&4194048)){var r=t.lanes;r&=e.pendingLanes,n|=r,t.lanes=n,_t(e,n)}}function xo(e,t){var n=e.updateQueue,r=e.alternate;if(r!==null&&(r=r.updateQueue,n===r)){var i=null,a=null;if(n=n.firstBaseUpdate,n!==null){do{var o={lane:n.lane,tag:n.tag,payload:n.payload,callback:null,next:null};a===null?i=a=o:a=a.next=o,n=n.next}while(n!==null);a===null?i=a=t:a=a.next=t}else i=a=t;n={baseState:r.baseState,firstBaseUpdate:i,lastBaseUpdate:a,shared:r.shared,callbacks:r.callbacks},e.updateQueue=n;return}e=n.lastBaseUpdate,e===null?n.firstBaseUpdate=t:e.next=t,n.lastBaseUpdate=t}var So=!1;function Co(){if(So){var e=z;if(e!==null)throw e}}function wo(e,t,n,r){So=!1;var i=e.updateQueue;ho=!1;var a=i.firstBaseUpdate,o=i.lastBaseUpdate,s=i.shared.pending;if(s!==null){i.shared.pending=null;var c=s,l=c.next;c.next=null,o===null?a=l:o.next=l,o=c;var u=e.alternate;u!==null&&(u=u.updateQueue,s=u.lastBaseUpdate,s!==o&&(s===null?u.firstBaseUpdate=l:s.next=l,u.lastBaseUpdate=c))}if(a!==null){var d=i.baseState;o=0,u=l=c=null,s=a;do{var f=s.lane&-536870913,p=f!==s.lane;if(p?(J&f)===f:(r&f)===f){f!==0&&f===Va&&(So=!0),u!==null&&(u=u.next={lane:0,tag:s.tag,payload:s.payload,callback:null,next:null});a:{var m=e,h=s;f=t;var g=n;switch(h.tag){case 1:if(m=h.payload,typeof m==`function`){d=m.call(g,d,f);break a}d=m;break a;case 3:m.flags=m.flags&-65537|128;case 0:if(m=h.payload,f=typeof m==`function`?m.call(g,d,f):m,f==null)break a;d=T({},d,f);break a;case 2:ho=!0}}f=s.callback,f!==null&&(e.flags|=64,p&&(e.flags|=8192),p=i.callbacks,p===null?i.callbacks=[f]:p.push(f))}else p={lane:f,tag:s.tag,payload:s.payload,callback:s.callback,next:null},u===null?(l=u=p,c=d):u=u.next=p,o|=f;if(s=s.next,s===null){if(s=i.shared.pending,s===null)break;p=s,s=p.next,p.next=null,i.lastBaseUpdate=p,i.shared.pending=null}}while(1);u===null&&(c=d),i.baseState=c,i.firstBaseUpdate=l,i.lastBaseUpdate=u,a===null&&(i.shared.lanes=0),od|=o,e.lanes=o,e.memoizedState=d}}function To(e,t){if(typeof e!=`function`)throw Error(a(191,e));e.call(t)}function Eo(e,t){var n=e.callbacks;if(n!==null)for(e.callbacks=null,e=0;ea?a:8;var o=N.T,s={};s.types=o===null?null:o.types,N.T=s,fc(e,!1,t,n);try{var c=i(),l=N.S;l!==null&&l(s,c),typeof c==`object`&&c&&typeof c.then==`function`?dc(e,t,Wa(c,r),jd(e)):dc(e,t,r,jd(e))}catch(n){dc(e,t,{then:function(){},status:`rejected`,reason:n},jd())}finally{P.p=a,o!==null&&s.types!==null&&(o.types=s.types),N.T=o}}function tc(){}function nc(e,t,n,r){if(e.tag!==5)throw Error(a(476));var i=rc(e).queue;ec(e,i,t,ve,n===null?tc:function(){return ic(e),n(r)})}function rc(e){var t=e.memoizedState;if(t!==null)return t;t={memoizedState:ve,baseState:ve,baseQueue:null,queue:{pending:null,lanes:0,dispatch:null,lastRenderedReducer:ps,lastRenderedState:ve},next:null};var n={};return t.next={memoizedState:n,baseState:n,baseQueue:null,queue:{pending:null,lanes:0,dispatch:null,lastRenderedReducer:ps,lastRenderedState:n},next:null},e.memoizedState=t,e=e.alternate,e!==null&&(e.memoizedState=t),t}function ic(e){var t=rc(e);t.next===null&&(t=e.alternate.memoizedState),dc(e,t.next.queue,{},jd())}function ac(){return Da(sh)}function oc(){return cs().memoizedState}function sc(){return cs().memoizedState}function cc(e){for(var t=e.return;t!==null;){switch(t.tag){case 24:case 3:var n=jd();e=vo(n);var r=yo(t,e,n);r!==null&&(Pd(r,t,n),bo(r,t,n)),t={cache:Pa()},e.payload=t;return}t=t.return}}function lc(e,t,n){var r=jd();n={lane:r,revertLane:0,gesture:null,action:n,hasEagerState:!1,eagerState:null,next:null},pc(e)?mc(t,n):(n=Oi(e,t,n,r),n!==null&&(Pd(n,e,r),hc(n,t,r)))}function uc(e,t,n){dc(e,t,n,jd())}function dc(e,t,n,r){var i={lane:r,revertLane:0,gesture:null,action:n,hasEagerState:!1,eagerState:null,next:null};if(pc(e))mc(t,i);else{var a=e.alternate;if(e.lanes===0&&(a===null||a.lanes===0)&&(a=t.lastRenderedReducer,a!==null))try{var o=t.lastRenderedState,s=a(o,n);if(i.hasEagerState=!0,i.eagerState=s,Ur(s,o))return Di(e,t,i,0),K===null&&Ei(),!1}catch{}if(n=Oi(e,t,i,r),n!==null)return Pd(n,e,r),hc(n,t,r),!0}return!1}function fc(e,t,n,r){if(r={lane:2,revertLane:Pf(),gesture:null,action:r,hasEagerState:!1,eagerState:null,next:null},pc(e)){if(t)throw Error(a(479))}else t=Oi(e,n,r,2),t!==null&&Pd(t,e,2)}function pc(e){var t=e.alternate;return e===B||t!==null&&t===B}function mc(e,t){Ko=Go=!0;var n=e.pending;n===null?t.next=t:(t.next=n.next,n.next=t),e.pending=t}function hc(e,t,n){if(n&4194048){var r=t.lanes;r&=e.pendingLanes,n|=r,t.lanes=n,_t(e,n)}}var gc={readContext:Da,use:ds,useCallback:Qo,useContext:Qo,useEffect:Qo,useImperativeHandle:Qo,useLayoutEffect:Qo,useInsertionEffect:Qo,useMemo:Qo,useReducer:Qo,useRef:Qo,useState:Qo,useDebugValue:Qo,useDeferredValue:Qo,useTransition:Qo,useSyncExternalStore:Qo,useId:Qo,useHostTransitionStatus:Qo,useFormState:Qo,useActionState:Qo,useOptimistic:Qo,useMemoCache:Qo,useCacheRefresh:Qo,useEffectEvent:Qo},_c={readContext:Da,use:ds,useCallback:function(e,t){return ss().memoizedState=[e,t===void 0?null:t],e},useContext:Da,useEffect:Vs,useImperativeHandle:function(e,t,n){n=n==null?null:n.concat([e]),zs(4194308,4,qs.bind(null,t,e),n)},useLayoutEffect:function(e,t){return zs(4194308,4,e,t)},useInsertionEffect:function(e,t){zs(4,2,e,t)},useMemo:function(e,t){var n=ss();t=t===void 0?null:t;var r=e();if(qo){$e(!0);try{e()}finally{$e(!1)}}return n.memoizedState=[r,t],r},useReducer:function(e,t,n){var r=ss();if(n!==void 0){var i=n(t);if(qo){$e(!0);try{n(t)}finally{$e(!1)}}}else i=t;return r.memoizedState=r.baseState=i,e={pending:null,lanes:0,dispatch:null,lastRenderedReducer:e,lastRenderedState:i},r.queue=e,e=e.dispatch=lc.bind(null,B,e),[r.memoizedState,e]},useRef:function(e){var t=ss();return e={current:e},t.memoizedState=e},useState:function(e){e=Cs(e);var t=e.queue,n=uc.bind(null,B,t);return t.dispatch=n,[e.memoizedState,n]},useDebugValue:Ys,useDeferredValue:function(e,t){return Qs(ss(),e,t)},useTransition:function(){var e=Cs(!1);return e=ec.bind(null,B,e.queue,!0,!1),ss().memoizedState=e,[!1,e]},useSyncExternalStore:function(e,t,n){var r=B,i=ss();if(R){if(n===void 0)throw Error(a(407));n=n()}else{if(n=t(),K===null)throw Error(a(349));J&127||vs(r,t,n)}i.memoizedState=n;var o={value:n,getSnapshot:t};return i.queue=o,Vs(bs.bind(null,r,o,e),[e]),r.flags|=2048,Ls(9,{destroy:void 0},ys.bind(null,r,o,n,t),null),n},useId:function(){var e=ss(),t=K.identifierPrefix;if(R){var n=$i,r=Qi;n=(r&~(1<<32-et(r)-1)).toString(32)+n,t=`_`+t+`R_`+n,n=Jo++,0<\/script>`,o=o.removeChild(o.firstChild);break;case`select`:o=typeof r.is==`string`?s.createElement(`select`,{is:r.is}):s.createElement(`select`),r.multiple?o.multiple=!0:r.size&&(o.size=r.size);break;default:o=typeof r.is==`string`?s.createElement(i,{is:r.is}):s.createElement(i)}}o[wt]=t,o[Tt]=r;a:for(s=t.child;s!==null;){if(s.tag===5||s.tag===6)o.appendChild(s.stateNode);else if(s.tag!==4&&s.tag!==27&&s.child!==null){s.child.return=s,s=s.child;continue}if(s===t)break a;for(;s.sibling===null;){if(s.return===null||s.return===t)break a;s=s.return}s.sibling.return=s.return,s=s.sibling}t.stateNode=o;a:switch(np(o,i,r),i){case`button`:case`input`:case`select`:case`textarea`:r=!!r.autoFocus;break a;case`img`:r=!0;break a;default:r=!1}r&&ml(t)}}return yl(t),t.subtreeFlags&=-33554433,hl(t,t.type,e===null?null:e.memoizedProps,t.pendingProps,n),null;case 6:if(e&&t.stateNode!=null)e.memoizedProps!==r&&ml(t);else{if(typeof r!=`string`&&t.stateNode===null)throw Error(a(166));if(e=we.current,pa(t)){if(e=t.stateNode,n=t.memoizedProps,r=null,i=aa,i!==null)switch(i.tag){case 27:case 5:r=i.memoizedProps}e[wt]=t,e=!!(e.nodeValue===n||r!==null&&!0===r.suppressHydrationWarning||ep(e.nodeValue,n)),e||ua(t,!0)}else e=lp(e).createTextNode(r),e[wt]=t,t.stateNode=e}return yl(t),null;case 31:if(n=t.memoizedState,e===null||e.memoizedState!==null){if(r=pa(t),n!==null){if(e===null){if(!r)throw Error(a(318));if(e=t.memoizedState,e=e===null?null:e.dehydrated,!e)throw Error(a(557));e[wt]=t}else ma(),!(t.flags&128)&&(t.memoizedState=null),t.flags|=4;yl(t),e=!1}else n=ha(),e!==null&&e.memoizedState!==null&&(e.memoizedState.hydrationErrors=n),e=!0;if(!e)return t.flags&256?(Ro(t),t):(Ro(t),null);if(t.flags&128)throw Error(a(558))}return yl(t),null;case 13:if(r=t.memoizedState,e===null||e.memoizedState!==null&&e.memoizedState.dehydrated!==null){if(i=pa(t),r!==null&&r.dehydrated!==null){if(e===null){if(!i)throw Error(a(318));if(i=t.memoizedState,i=i===null?null:i.dehydrated,!i)throw Error(a(317));i[wt]=t}else ma(),!(t.flags&128)&&(t.memoizedState=null),t.flags|=4;yl(t),i=!1}else i=ha(),e!==null&&e.memoizedState!==null&&(e.memoizedState.hydrationErrors=i),i=!0;if(!i)return t.flags&256?(Ro(t),t):(Ro(t),null)}return Ro(t),t.flags&128?(t.lanes=n,t):(n=r!==null,e=e!==null&&e.memoizedState!==null,n&&(r=t.child,i=null,r.alternate!==null&&r.alternate.memoizedState!==null&&r.alternate.memoizedState.cachePool!==null&&(i=r.alternate.memoizedState.cachePool.pool),o=null,r.memoizedState!==null&&r.memoizedState.cachePool!==null&&(o=r.memoizedState.cachePool.pool),o!==i&&(r.flags|=2048)),n!==e&&n&&(t.child.flags|=8192),_l(t,t.updateQueue),yl(t),null);case 4:return De(),e===null&&Wf(t.stateNode.containerInfo),t.flags|=67108864,yl(t),null;case 10:return xa(t.type),yl(t),null;case 19:if(Vo(t),r=t.memoizedState,r===null)return yl(t),null;if(i=!!(t.flags&128),o=r.rendering,o===null){if(i)vl(r,!1);else{if(ad!==0||e!==null&&e.flags&128)for(e=t.child;e!==null;){if(o=Ho(e),o!==null){for(t.flags|=128,vl(r,!1),e=o.updateQueue,t.updateQueue=e,_l(t,e),t.subtreeFlags=0,e=n,n=t.child;n!==null;)Li(n,e),n=n.sibling;return Bo(t,zo.current&1|2),R&&ea(t,r.treeForkCount),t.child}e=e.sibling}r.tail!==null&&He()>gd&&(t.flags|=128,i=!0,vl(r,!1),t.lanes=4194304)}}else{if(!i){if(e=Ho(o),e!==null){if(t.flags|=128,i=!0,e=e.updateQueue,t.updateQueue=e,_l(t,e),vl(r,!0),r.tail===null&&r.tailMode!==`collapsed`&&r.tailMode!==`visible`&&!o.alternate&&!R)return yl(t),null}else 2*He()-r.renderingStartTime>gd&&n!==536870912&&(t.flags|=128,i=!0,vl(r,!1),t.lanes=4194304)}r.isBackwards?(o.sibling=t.child,t.child=o):(e=r.last,e===null?t.child=o:e.sibling=o,r.last=o)}if(r.tail!==null){e=r.tail;a:{for(n=e;n!==null;){if(n.alternate!==null){n=!1;break a}n=n.sibling}n=!0}return r.rendering=e,r.tail=e.sibling,r.renderingStartTime=He(),e.sibling=null,o=zo.current,o=i?o&1|2:o&1,r.tailMode===`visible`||r.tailMode===`collapsed`||!n||R?Bo(t,o):(n=o,xe(Mo,t),xe(zo,n),No===null&&(No=t)),R&&ea(t,r.treeForkCount),e}return yl(t),null;case 22:case 23:return Ro(t),jo(),r=t.memoizedState!==null,e===null?r&&(t.flags|=8192):e.memoizedState!==null!==r&&(t.flags|=8192),r?n&536870912&&!(t.flags&128)&&(yl(t),t.subtreeFlags&6&&(t.flags|=8192)):yl(t),n=t.updateQueue,n!==null&&_l(t,n.retryQueue),n=null,e!==null&&e.memoizedState!==null&&e.memoizedState.cachePool!==null&&(n=e.memoizedState.cachePool.pool),r=null,t.memoizedState!==null&&t.memoizedState.cachePool!==null&&(r=t.memoizedState.cachePool.pool),r!==n&&(t.flags|=2048),e!==null&&I(Ka),null;case 24:return n=null,e!==null&&(n=e.memoizedState.cache),t.memoizedState.cache!==n&&(t.flags|=2048),xa(Na),yl(t),null;case 25:return null;case 30:return t.flags|=33554432,yl(t),null}throw Error(a(156,t.tag))}function xl(e,t){switch(ra(t),t.tag){case 1:return e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 3:return xa(Na),De(),e=t.flags,e&65536&&!(e&128)?(t.flags=e&-65537|128,t):null;case 26:case 27:case 5:return ke(t),null;case 31:if(t.memoizedState!==null){if(Ro(t),t.alternate===null)throw Error(a(340));ma()}return e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 13:if(Ro(t),e=t.memoizedState,e!==null&&e.dehydrated!==null){if(t.alternate===null)throw Error(a(340));ma()}return e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 19:return Vo(t),e=t.flags,e&65536?(t.flags=e&-65537|128,e=t.memoizedState,e!==null&&(e.rendering=null,e.tail=null),t.flags|=4,t):null;case 4:return De(),null;case 10:return xa(t.type),null;case 22:case 23:return Ro(t),jo(),e!==null&&I(Ka),e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 24:return xa(Na),null;case 25:return null;default:return null}}function Sl(e,t){switch(ra(t),t.tag){case 3:xa(Na),De();break;case 26:case 27:case 5:ke(t);break;case 4:De();break;case 31:t.memoizedState!==null&&Ro(t);break;case 13:Ro(t);break;case 19:Vo(t);break;case 10:xa(t.type);break;case 22:case 23:Ro(t),jo(),e!==null&&I(Ka);break;case 24:xa(Na)}}function Cl(e,t){try{var n=t.updateQueue,r=n===null?null:n.lastEffect;if(r!==null){var i=r.next;n=i;do{if((n.tag&e)===e){r=void 0;var a=n.create,o=n.inst;r=a(),o.destroy=r}n=n.next}while(n!==i)}}catch(e){Z(t,t.return,e)}}function wl(e,t,n){try{var r=t.updateQueue,i=r===null?null:r.lastEffect;if(i!==null){var a=i.next;r=a;do{if((r.tag&e)===e){var o=r.inst,s=o.destroy;if(s!==void 0){o.destroy=void 0,i=t;var c=n,l=s;try{l()}catch(e){Z(i,c,e)}}}r=r.next}while(r!==a)}}catch(e){Z(t,t.return,e)}}function Tl(e){var t=e.updateQueue;if(t!==null){var n=e.stateNode;try{Eo(t,n)}catch(t){Z(e,e.return,t)}}}function El(e,t,n){n.props=wc(e.type,e.memoizedProps),n.state=e.memoizedState;try{n.componentWillUnmount()}catch(n){Z(e,t,n)}}function Dl(e,t){try{var n=e.ref;if(n!==null){switch(e.tag){case 26:case 27:case 5:var r=e.stateNode;break;case 30:var i=e.stateNode,a=yi(e.memoizedProps,i);(i.ref===null||i.ref.name!==a)&&(i.ref=Pp(a)),r=i.ref;break;case 7:if(e.stateNode===null){var o=new Fp(e);p(e.child,!1,Qp,o,void 0,void 0),e.stateNode=o}r=e.stateNode;break;default:r=e.stateNode}typeof n==`function`?e.refCleanup=n(r):n.current=r}}catch(n){Z(e,t,n)}}function Ol(e,t){var n=e.ref,r=e.refCleanup;if(n!==null){if(typeof r==`function`)try{r()}catch(n){Z(e,t,n)}finally{e.refCleanup=null,e=e.alternate,e!=null&&(e.refCleanup=null)}else if(typeof n==`function`)try{n(null)}catch(n){Z(e,t,n)}else n.current=null}}function kl(e,t){if((e.tag===5||e.tag===27||e.tag===6)&&e.alternate===null&&t!==null)for(var n=0;n title`))),np(r,t,n),r[wt]=e,Rt(r),t=r;break a;case`link`:if(o=Gm(`link`,`href`,i).get(t+(n.href||``))){for(s=0;sg&&(o=g,g=h,h=o);var _=qr(s,h),v=qr(s,g);if(_&&v&&(p.rangeCount!==1||p.anchorNode!==_.node||p.anchorOffset!==_.offset||p.focusNode!==v.node||p.focusOffset!==v.offset)){var y=d.createRange();y.setStart(_.node,_.offset),p.removeAllRanges(),h>g?(p.addRange(y),p.extend(v.node,v.offset)):(y.setEnd(v.node,v.offset),p.addRange(y))}}}}for(d=[],p=s;p=p.parentNode;)p.nodeType===1&&d.push({element:p,left:p.scrollLeft,top:p.scrollTop});for(typeof s.focus==`function`&&s.focus(),s=0;sn?32:n,N.T=null,n=wd,wd=null;var o=bd,s=Sd;if(yd=0,xd=bd=null,Sd=0,G&6)throw Error(a(331));var c=G;if(G|=4,Xu(o.current),Uu(o,o.current,s,n),G=c,Df(0,!1),Qe&&typeof Qe.onPostCommitFiberRoot==`function`)try{Qe.onPostCommitFiberRoot(Ze,o)}catch{}return!0}finally{P.p=i,N.T=r,uf(e,t)}}function pf(e,t,n){t=Wi(n,t),t=Ac(e.stateNode,t,2),e=yo(e,t,2),e!==null&&(mt(e,2),Ef(e))}function Z(e,t,n){if(e.tag===3)pf(e,e,n);else for(;t!==null;){if(t.tag===3){pf(t,e,n);break}if(t.tag===1){var r=t.stateNode;if(typeof t.type.getDerivedStateFromError==`function`||typeof r.componentDidCatch==`function`&&(vd===null||!vd.has(r))){e=Wi(n,e),n=jc(2),r=yo(t,n,2),r!==null&&(Mc(n,r,t,e),mt(r,2),Ef(r));break}}t=t.return}}function mf(e,t,n){var r=e.pingCache;if(r===null){r=e.pingCache=new ed;var i=new Set;r.set(t,i)}else i=r.get(t),i===void 0&&(i=new Set,r.set(t,i));i.has(n)||(rd=!0,i.add(n),e=hf.bind(null,e,t,n),t.then(e,e))}function hf(e,t,n){var r=e.pingCache;r!==null&&r.delete(t),e.pingedLanes|=e.suspendedLanes&n,e.warmLanes&=~n,K===e&&(J&n)===n&&(ad===4||ad===3&&(J&62914560)===J&&300>He()-md?G&2?cd|=n:Vd(e,0):cd|=n,ud===J&&(ud=0)),Ef(e)}function gf(e,t){t===0&&(t=ft()),e=ki(e,t),e!==null&&(mt(e,t),Ef(e))}function _f(e){var t=e.memoizedState,n=0;t!==null&&(n=t.retryLane),gf(e,n)}function vf(e,t){var n=0;switch(e.tag){case 31:case 13:var r=e.stateNode,i=e.memoizedState;i!==null&&(n=i.retryLane);break;case 19:r=e.stateNode;break;case 22:r=e.stateNode._retryCache;break;default:throw Error(a(314))}r!==null&&r.delete(t),gf(e,n)}function yf(e,t){return Re(e,t)}var bf=null,xf=null,Sf=!1,Cf=!1,wf=!1,Tf=0;function Ef(e){e!==xf&&e.next===null&&(xf===null?bf=xf=e:xf=xf.next=e),Cf=!0,Sf||(Sf=!0,Nf())}function Df(e,t){if(!wf&&Cf){wf=!0;do for(var n=!1,r=bf;r!==null;){if(!t){if(e!==0){var i=r.pendingLanes;if(i===0)var a=0;else{var o=r.suspendedLanes,s=r.pingedLanes;a=(1<<31-et(42|e)+1)-1,a&=i&~(o&~s),a=a&201326741?a&201326741|1:a?a|2:0}a!==0&&(n=!0,Mf(r,a))}else a=J,a=ct(r,r===K?a:0,r.cancelPendingCommit!==null||r.timeoutHandle!==-1),!(a&3)||lt(r,a)||(n=!0,Mf(r,a))}r=r.next}while(n);wf=!1}}function Of(){kf()}function kf(){Cf=Sf=!1;var e=0;Tf!==0&&hp()&&(e=Tf);for(var t=He(),n=null,r=bf;r!==null;){var i=r.next,a=Af(r,t);a===0?(r.next=null,n===null?bf=i:n.next=i,i===null&&(xf=n)):(n=r,(e!==0||a&3)&&(Cf=!0)),r=i}yd!==0&&yd!==5||Df(e,!1),Tf!==0&&(Tf=0)}function Af(e,t){for(var n=e.suspendedLanes,r=e.pingedLanes,i=e.expirationTimes,a=e.pendingLanes&-62914561;0s)break;var u=c.transferSize,d=c.initiatorType;u&&ap(d)&&(c=c.responseEnd,o+=u*(c$m){s.length=o;break}f=new Promise(jp.bind(f)),s.push(f)}}}if(0`u`?null:document;function Tm(e,t,n){var r=wm;if(r&&typeof t==`string`&&t){var i=an(t);i=`link[rel="`+e+`"][href="`+i+`"]`,typeof n==`string`&&(i+=`[crossorigin="`+n+`"]`),ym.has(i)||(ym.add(i),e={rel:e,crossOrigin:n,href:t},r.querySelector(i)===null&&(t=r.createElement(`link`),np(t,`link`,e),Rt(t),r.head.appendChild(t)))}}function Em(e){xm.D(e),Tm(`dns-prefetch`,e,null)}function Dm(e,t){xm.C(e,t),Tm(`preconnect`,e,t)}function Om(e,t,n){xm.L(e,t,n);var r=wm;if(r&&e&&t){var i=`link[rel="preload"][as="`+an(t)+`"]`;t===`image`&&n&&n.imageSrcSet?(i+=`[imagesrcset="`+an(n.imageSrcSet)+`"]`,typeof n.imageSizes==`string`&&(i+=`[imagesizes="`+an(n.imageSizes)+`"]`)):i+=`[href="`+an(e)+`"]`;var a=i;switch(t){case`style`:a=Pm(e);break;case`script`:a=Rm(e)}if(!(vm.has(a)||(e=T({rel:`preload`,href:t===`image`&&n&&n.imageSrcSet?void 0:e,as:t},n),vm.set(a,e),r.querySelector(i)!==null||t===`style`&&r.querySelector(Fm(a))||t===`script`&&r.querySelector(zm(a))))){var o=r.createElement(`link`);np(o,`link`,e),t===`style`&&(o[Mt]=!0,o.onload=o.onerror=function(){zt(o)}),Rt(o),r.head.appendChild(o)}}}function km(e,t){xm.m(e,t);var n=wm;if(n&&e){var r=t&&typeof t.as==`string`?t.as:`script`,i=`link[rel="modulepreload"][as="`+an(r)+`"][href="`+an(e)+`"]`,a=i;switch(r){case`audioworklet`:case`paintworklet`:case`serviceworker`:case`sharedworker`:case`worker`:case`script`:a=Rm(e)}if(!vm.has(a)&&(e=T({rel:`modulepreload`,href:e},t),vm.set(a,e),n.querySelector(i)===null)){switch(r){case`audioworklet`:case`paintworklet`:case`serviceworker`:case`sharedworker`:case`worker`:case`script`:if(n.querySelector(zm(a)))return}r=n.createElement(`link`),np(r,`link`,e),Rt(r),n.head.appendChild(r)}}}function Am(e,t,n){xm.S(e,t,n);var r=wm;if(r&&e){var i=Lt(r).hoistableStyles,a=Pm(e);t||=`default`;var o=i.get(a);if(!o){var s={loading:0,preload:null};if(o=r.querySelector(Fm(a)))s.loading=5;else{e=T({rel:`stylesheet`,href:e,"data-precedence":t},n),(n=vm.get(a))&&Hm(e,n);var c=o=r.createElement(`link`);Rt(c),np(c,`link`,e),c._p=new Promise(function(e,t){c.onload=e,c.onerror=t}),c.addEventListener(`load`,function(){s.loading|=1}),c.addEventListener(`error`,function(){s.loading|=2}),s.loading|=4,Vm(o,t,r)}o={type:`stylesheet`,instance:o,count:1,state:s},i.set(a,o)}}}function jm(e,t){xm.X(e,t);var n=wm;if(n&&e){var r=Lt(n).hoistableScripts,i=Rm(e),a=r.get(i);a||(a=n.querySelector(zm(i)),a||(e=T({src:e,async:!0},t),(t=vm.get(i))&&Um(e,t),a=n.createElement(`script`),Rt(a),np(a,`link`,e),n.head.appendChild(a)),a={type:`script`,instance:a,count:1,state:null},r.set(i,a))}}function Mm(e,t){xm.M(e,t);var n=wm;if(n&&e){var r=Lt(n).hoistableScripts,i=Rm(e),a=r.get(i);a||(a=n.querySelector(zm(i)),a||(e=T({src:e,async:!0,type:`module`},t),(t=vm.get(i))&&Um(e,t),a=n.createElement(`script`),Rt(a),np(a,`link`,e),n.head.appendChild(a)),a={type:`script`,instance:a,count:1,state:null},r.set(i,a))}}function Nm(e,t,n,r){var i=(i=we.current)?bm(i):null;if(!i)throw Error(a(446));switch(e){case`meta`:case`title`:return null;case`style`:return typeof n.precedence==`string`&&typeof n.href==`string`?(n=Pm(n.href),t=Lt(i).hoistableStyles,r=t.get(n),r||(r={type:`style`,instance:null,count:0,state:null},t.set(n,r)),r):{type:`void`,instance:null,count:0,state:null};case`link`:if(n.rel===`stylesheet`&&typeof n.href==`string`&&typeof n.precedence==`string`){e=Pm(n.href);var o=Lt(i).hoistableStyles,s=o.get(e);if(s||(i=i.ownerDocument||i,s={type:`stylesheet`,instance:null,count:0,state:{loading:0,preload:null}},o.set(e,s),(o=i.querySelector(Fm(e)))?o._p||(s.instance=o,s.state.loading=5):(o=vm.get(e),o||(o={rel:`preload`,as:`style`,href:n.href,crossOrigin:n.crossOrigin,integrity:n.integrity,media:n.media,hrefLang:n.hrefLang,referrerPolicy:n.referrerPolicy},vm.set(e,o)),Lm(i,e,o,s.state))),t&&r===null)throw Error(a(528,``));return s}if(t&&r!==null)throw Error(a(529,``));return null;case`script`:return t=n.async,n=n.src,typeof n==`string`&&t&&typeof t!=`function`&&typeof t!=`symbol`?(n=Rm(n),t=Lt(i).hoistableScripts,r=t.get(n),r||(r={type:`script`,instance:null,count:0,state:null},t.set(n,r)),r):{type:`void`,instance:null,count:0,state:null};default:throw Error(a(444,e))}}function Pm(e){return`href="`+an(e)+`"`}function Fm(e){return`link[rel="stylesheet"][`+e+`]`}function Im(e){return T({},e,{"data-precedence":e.precedence,precedence:null})}function Lm(e,t,n,r){if(t=e.querySelector(`link[rel="preload"][as="style"][`+t+`]`)){if(!0!==t[Mt]){r.loading=1;return}}else t=e.createElement(`link`),t[Mt]=!0,t.onload=t.onerror=zt.bind(null,t),np(t,`link`,n),Rt(t),e.head.appendChild(t);r.preload=t,t.addEventListener(`load`,function(){return r.loading|=1}),t.addEventListener(`error`,function(){return r.loading|=2})}function Rm(e){return`[src="`+an(e)+`"]`}function zm(e){return`script[async]`+e}function Bm(e,t,n){if(t.count++,t.instance===null)switch(t.type){case`style`:var r=e.querySelector(`style[data-href~="`+an(n.href)+`"]`);if(r)return t.instance=r,Rt(r),r;var i=T({},n,{"data-href":n.href,"data-precedence":n.precedence,href:null,precedence:null});return r=(e.ownerDocument||e).createElement(`style`),Rt(r),np(r,`style`,i),Vm(r,n.precedence,e),t.instance=r;case`stylesheet`:i=Pm(n.href);var o=e.querySelector(Fm(i));if(o)return t.state.loading|=4,t.instance=o,Rt(o),o;r=Im(n),(i=vm.get(i))&&Hm(r,i),o=(e.ownerDocument||e).createElement(`link`),Rt(o);var s=o;return s._p=new Promise(function(e,t){s.onload=e,s.onerror=t}),np(o,`link`,r),t.state.loading|=4,Vm(o,n.precedence,e),t.instance=o;case`script`:return o=Rm(n.src),(i=e.querySelector(zm(o)))?(t.instance=i,Rt(i),i):(r=n,(i=vm.get(o))&&(r=T({},n),Um(r,i)),e=e.ownerDocument||e,i=e.createElement(`script`),Rt(i),np(i,`link`,r),e.head.appendChild(i),t.instance=i);case`void`:return null;default:throw Error(a(443,t.type))}else t.type===`stylesheet`&&!(t.state.loading&4)&&(r=t.instance,t.state.loading|=4,Vm(r,n.precedence,e));return t.instance}function Vm(e,t,n){for(var r=n.querySelectorAll(`link[rel="stylesheet"][data-precedence],style[data-precedence]`),i=r.length?r[r.length-1]:null,a=i,o=0;o title`):null)}function qm(e,t,n){if(n===1||t.itemProp!=null)return!1;switch(e){case`meta`:case`title`:return!0;case`style`:if(typeof t.precedence!=`string`||typeof t.href!=`string`||t.href===``)break;return!0;case`link`:if(typeof t.rel!=`string`||typeof t.href!=`string`||t.href===``||t.onLoad||t.onError)break;switch(t.rel){case`stylesheet`:return e=t.disabled,typeof t.precedence==`string`&&e==null;default:return!0}case`script`:if(t.async&&typeof t.async!=`function`&&typeof t.async!=`symbol`&&!t.onLoad&&!t.onError&&t.src&&typeof t.src==`string`)return!0}return!1}function Jm(e,t){return e===`img`&&t.src!=null&&t.src!==``&&t.onLoad==null&&t.loading!==`lazy`}function Ym(e){return!(e.type===`stylesheet`&&!(e.state.loading&3))}function Xm(e){return(e.width||100)*(e.height||100)*(typeof devicePixelRatio==`number`?devicePixelRatio:1)*.25}function Zm(e,t){typeof t.decode==`function`&&(e.imgCount++,t.complete||(e.imgBytes+=Xm(t),e.suspenseyImages.push(t)),e=rh.bind(e),t.decode().then(e,e))}function Qm(e,t,n,r){if(n.type===`stylesheet`&&(typeof r.media!=`string`||!1!==matchMedia(r.media).matches)&&!(n.state.loading&4)){if(n.instance===null){var i=Pm(r.href),a=t.querySelector(Fm(i));if(a){t=a._p,typeof t==`object`&&t&&typeof t.then==`function`&&(e.count++,e=nh.bind(e),t.then(e,e)),n.state.loading|=4,n.instance=a,Rt(a);return}a=t.ownerDocument||t,r=Im(r),(i=vm.get(i))&&Hm(r,i),a=a.createElement(`link`),Rt(a);var o=a;o._p=new Promise(function(e,t){o.onload=e,o.onerror=t}),np(a,`link`,r),n.instance=a}e.stylesheets===null&&(e.stylesheets=new Map),e.stylesheets.set(n,t),(t=n.state.preload)&&!(n.state.loading&3)&&(e.count++,n=nh.bind(e),t.addEventListener(`load`,n),t.addEventListener(`error`,n))}}var $m=0;function eh(e,t){return e.stylesheets&&e.count===0&&ah(e,e.stylesheets),0$m?50:800)+t);return e.unsuspend=n,function(){e.unsuspend=null,clearTimeout(r),clearTimeout(i)}}:null}function th(e){if(e.count===0&&(e.imgCount===0||!e.waitingForImages)){if(e.stylesheets)ah(e,e.stylesheets);else if(e.unsuspend){var t=e.unsuspend;e.unsuspend=null,t()}}}function nh(){this.count--,th(this)}function rh(){this.imgCount--,th(this)}var ih=null;function ah(e,t){e.stylesheets=null,e.unsuspend!==null&&(e.count++,ih=new Map,t.forEach(oh,e),ih=null,nh.call(e))}function oh(e,t){if(!(t.state.loading&4)){var n=ih.get(e);if(n)var r=n.get(null);else{n=new Map,ih.set(e,n);for(var i=e.querySelectorAll(`link[data-precedence],style[data-precedence]`),a=0;a{function n(){if(!(typeof __REACT_DEVTOOLS_GLOBAL_HOOK__>`u`||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!=`function`))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(n)}catch(e){console.error(e)}}n(),t.exports=se()})),A=r(n(),1),le=ce(),ue=`modulepreload`,de=function(e){return`/`+e},fe={},j=function(e,t,n){let r=Promise.resolve();if(t&&t.length>0){let e=document.getElementsByTagName(`link`),i=document.querySelector(`meta[property=csp-nonce]`),a=i?.nonce||i?.getAttribute(`nonce`);function o(e){return Promise.all(e.map(e=>Promise.resolve(e).then(e=>({status:`fulfilled`,value:e}),e=>({status:`rejected`,reason:e}))))}function s(e){return import.meta.resolve?import.meta.resolve(e):new URL(e,import.meta.url).href}r=o(t.map(t=>{if(t=de(t,n),t=s(t),t in fe)return;fe[t]=!0;let r=t.endsWith(`.css`);for(let n=e.length-1;n>=0;n--){let i=e[n];if(i.href===t&&(!r||i.rel===`stylesheet`))return}let i=document.createElement(`link`);if(i.rel=r?`stylesheet`:ue,r||(i.as=`script`),i.crossOrigin=``,i.href=t,a&&i.setAttribute(`nonce`,a),document.head.appendChild(i),r)return new Promise((e,n)=>{i.addEventListener(`load`,e),i.addEventListener(`error`,()=>n(Error(`Unable to preload CSS for ${t}`)))})}))}function i(e){let t=new Event(`vite:preloadError`,{cancelable:!0});if(t.payload=e,window.dispatchEvent(t),!t.defaultPrevented)throw e}return r.then(t=>{for(let e of t||[])e.status===`rejected`&&i(e.reason);return e().catch(i)})},pe=e=>{throw TypeError(e)},me=(e,t,n)=>t.has(e)||pe(`Cannot `+n),he=(e,t,n)=>(me(e,t,`read from private field`),n?n.call(e):t.get(e)),ge=(e,t,n)=>t.has(e)?pe(`Cannot add the same private member more than once`):t instanceof WeakSet?t.add(e):t.set(e,n),M=(e,t,n,r)=>(me(e,t,`write to private field`),r?r.call(e,n):t.set(e,n),n),_e=/^(?:[a-z][a-z0-9+.-]*:|[\\/]{2})/i,N=/^[\\/]{2}/;function P(e,t){return t+e.replace(/\\/g,`/`)}var ve=`popstate`;function ye(e){return typeof e==`object`&&!!e&&`pathname`in e&&`search`in e&&`hash`in e&&`state`in e&&`key`in e}function be(e={}){function t(e,t){let n=t.state?.masked,{pathname:r,search:i,hash:a}=n||e.location;return Ce(``,{pathname:r,search:i,hash:a},t.state&&t.state.usr||null,t.state&&t.state.key||`default`,n?{pathname:e.location.pathname,search:e.location.search,hash:e.location.hash}:void 0)}function n(e,t){return typeof t==`string`?t:we(t)}return Ee(t,n,null,e)}function F(e,t){if(e===!1||e==null)throw Error(t)}function I(e,t){if(!e){typeof console<`u`&&console.warn(t);try{throw Error(t)}catch{}}}function xe(){return Math.random().toString(36).substring(2,10)}function Se(e,t){return{usr:e.state,key:e.key,idx:t,masked:e.mask?{pathname:e.pathname,search:e.search,hash:e.hash}:void 0}}function Ce(e,t,n=null,r,i){return{pathname:typeof e==`string`?e:e.pathname,search:``,hash:``,...typeof t==`string`?Te(t):t,state:n,key:t&&t.key||r||xe(),mask:i}}function we({pathname:e=`/`,search:t=``,hash:n=``}){return t&&t!==`?`&&(e+=t.charAt(0)===`?`?t:`?`+t),n&&n!==`#`&&(e+=n.charAt(0)===`#`?n:`#`+n),e}function Te(e){let t={};if(e){let n=e.indexOf(`#`);n>=0&&(t.hash=e.substring(n),e=e.substring(0,n));let r=e.indexOf(`?`);r>=0&&(t.search=e.substring(r),e=e.substring(0,r)),e&&(t.pathname=e)}return t}function Ee(e,t,n,r={}){let{window:i=document.defaultView,v5Compat:a=!1}=r,o=i.history,s=`POP`,c=null,l=u();l??(l=0,o.replaceState({...o.state,idx:l},``));function u(){return(o.state||{idx:null}).idx}function d(){s=`POP`;let e=u(),t=e==null?null:e-l;l=e,c&&c({action:s,location:h.location,delta:t})}function f(e,t){s=`PUSH`;let r=ye(e)?e:Ce(h.location,e,t);n&&n(r,e),l=u()+1;let d=Se(r,l),f=h.createHref(r.mask||r);try{o.pushState(d,``,f)}catch(e){if(e instanceof DOMException&&e.name===`DataCloneError`)throw e;i.location.assign(f)}a&&c&&c({action:s,location:h.location,delta:1})}function p(e,t){s=`REPLACE`;let r=ye(e)?e:Ce(h.location,e,t);n&&n(r,e),l=u();let i=Se(r,l),d=h.createHref(r.mask||r);o.replaceState(i,``,d),a&&c&&c({action:s,location:h.location,delta:0})}function m(e){return De(i,e)}let h={get action(){return s},get location(){return e(i,o)},listen(e){if(c)throw Error(`A history only accepts one active listener`);return i.addEventListener(ve,d),c=e,()=>{i.removeEventListener(ve,d),c=null}},createHref(e){return t(i,e)},createURL:m,encodeLocation(e){let t=m(e);return{pathname:t.pathname,search:t.search,hash:t.hash}},push:f,replace:p,go(e){return o.go(e)}};return h}function De(e,t,n=!1){let r=`http://localhost`;e&&(r=e.location.origin===`null`?e.location.href:e.location.origin),F(r,`No window.location.(origin|href) available to create URL`);let i=typeof t==`string`?t:we(t);return i=i.replace(/ $/,`%20`),!n&&N.test(i)&&(i=r+i),new URL(i,r)}var Oe,ke=class{constructor(e){if(ge(this,Oe,new Map),e)for(let[t,n]of e)this.set(t,n)}get(e){if(he(this,Oe).has(e))return he(this,Oe).get(e);if(e.defaultValue!==void 0)return e.defaultValue;throw Error(`No value found for context`)}set(e,t){he(this,Oe).set(e,t)}};Oe=new WeakMap;var Ae=new Set([`lazy`,`caseSensitive`,`path`,`id`,`index`,`children`]);function je(e){return Ae.has(e)}var Me=new Set([`lazy`,`caseSensitive`,`path`,`id`,`index`,`middleware`,`children`]);function Ne(e){return Me.has(e)}function Pe(e){return e.index===!0}function Fe(e,t,n=[],r={},i=!1){return e.map((e,a)=>{let o=[...n,String(a)],s=typeof e.id==`string`?e.id:o.join(`-`);if(F(e.index!==!0||!e.children,`Cannot specify children on an index route`),F(i||!r[s],`Found a route id collision on id "${s}". Route id's must be globally unique within Data Router usages`),Pe(e)){let n={...e,id:s};return r[s]=Ie(n,t(n)),n}{let n={...e,id:s,children:void 0};return r[s]=Ie(n,t(n)),e.children&&(n.children=Fe(e.children,t,o,r,i)),n}})}function Ie(e,t){return Object.assign(e,{...t,...typeof t.lazy==`object`&&t.lazy!=null?{lazy:{...e.lazy,...t.lazy}}:{}})}function Le(e,t,n=`/`){return Re(e,t,n,!1)}function Re(e,t,n,r,i){let a=it((typeof t==`string`?Te(t):t).pathname||`/`,n);if(a==null)return null;let o=i??Be(e),s=null,c=rt(a);for(let e=0;s==null&&e{let c={relativePath:s===void 0?e.path||``:s,caseSensitive:e.caseSensitive===!0,childrenIndex:a,route:e};if(c.relativePath.startsWith(`/`)){if(!c.relativePath.startsWith(r)&&o)return;F(c.relativePath.startsWith(r),`Absolute route path "${c.relativePath}" nested under path "${r}" is not valid. An absolute child route path must start with the combined path of all its parent routes.`),c.relativePath=c.relativePath.slice(r.length)}let l=mt([r,c.relativePath]),u=n.concat(c);e.children&&e.children.length>0&&(F(e.index!==!0,`Index routes must not have child routes. Please remove all child routes from route path "${l}".`),Ve(e.children,t,u,l,o)),(e.path!=null||e.index)&&t.push({path:l,score:Ze(l,e.index),routesMeta:u.map((e,t)=>{let[n,r]=nt(e.relativePath,e.caseSensitive,t===u.length-1);return{...e,matcher:n,compiledParams:r}})})};return e.forEach((e,t)=>{if(e.path===``||!e.path?.includes(`?`))a(e,t);else for(let n of He(e.path))a(e,t,!0,n)}),t}function He(e){let t=e.split(`/`);if(t.length===0)return[];let[n,...r]=t,i=n.endsWith(`?`),a=n.replace(/\?$/,``);if(r.length===0)return i?[a,``]:[a];let o=He(r.join(`/`)),s=[];return s.push(...o.map(e=>e===``?a:[a,e].join(`/`))),i&&s.push(...o),s.map(t=>e.startsWith(`/`)&&t===``?`/`:t)}function Ue(e){e.sort((e,t)=>e.score===t.score?Qe(e.routesMeta.map(e=>e.childrenIndex),t.routesMeta.map(e=>e.childrenIndex)):t.score-e.score)}var We=/^:[\w-]+$/,Ge=3,Ke=2,qe=1,Je=10,Ye=-2,Xe=e=>e===`*`;function Ze(e,t){let n=e.split(`/`),r=n.length;return n.some(Xe)&&(r+=Ye),t&&(r+=Ke),n.filter(e=>!Xe(e)).reduce((e,t)=>e+(We.test(t)?Ge:t===``?qe:Je),r)}function Qe(e,t){return e.length===t.length&&e.slice(0,-1).every((e,n)=>e===t[n])?e[e.length-1]-t[t.length-1]:0}function $e(e,t,n=!1){let{routesMeta:r}=e,i={},a=`/`,o=[];for(let e=0;e{if(t===`*`){let e=s[r]||``;o=ht(a.slice(0,a.length-e.length),1)}let i=s[r];return e[t]=n&&!i?void 0:(i||``).replace(/%2F/g,`/`),e},{}),pathname:a,pathnameBase:o,pattern:e}}function nt(e,t=!1,n=!0){I(e===`*`||!e.endsWith(`*`)||e.endsWith(`/*`),`Route path "${e}" will be treated as if it were "${e.replace(/\*$/,`/*`)}" because the \`*\` character must always follow a \`/\` in the pattern. To get rid of this warning, please change the route path to "${e.replace(/\*$/,`/*`)}".`);let r=[],i=`^`+e.replace(/\/*\*?$/,``).replace(/^\/*/,`/`).replace(/[\\.*+^${}|()[\]]/g,`\\$&`).replace(/\/:([\w-]+)(\?)?/g,(e,t,n,i,a)=>{if(r.push({paramName:t,isOptional:n!=null}),n){let t=a.charAt(i+e.length);return t&&t!==`/`?`/([^\\/]*)`:`(?:/([^\\/]*))?`}return`/([^\\/]+)`}).replace(/\/([\w-]+)\?(\/|$)/g,`(/$1)?$2`);return e.endsWith(`*`)?(r.push({paramName:`*`}),i+=e===`*`||e===`/*`?`(.*)$`:`(?:\\/(.+)|\\/*)$`):n?i+=`\\/*$`:e!==``&&e!==`/`&&(i+=`(?:(?=\\/|$))`),[new RegExp(i,t?void 0:`i`),r]}function rt(e){try{return e.split(`/`).map(e=>decodeURIComponent(e).replace(/\//g,`%2F`)).join(`/`)}catch(t){return I(!1,`The URL path "${e}" could not be decoded because it is a malformed URL segment. This is probably due to a bad percent encoding (${t}).`),e}}function it(e,t){if(t===`/`)return e;if(!e.toLowerCase().startsWith(t.toLowerCase()))return null;let n=t.endsWith(`/`)?t.length-1:t.length,r=e.charAt(n);return r&&r!==`/`?null:e.slice(n)||`/`}function at({basename:e,pathname:t}){return t===`/`?e:mt([e,t])}var ot=e=>_e.test(e);function st(e,t=`/`){let{pathname:n,search:r=``,hash:i=``}=typeof e==`string`?Te(e):e,a;return n?(n=pt(n),a=n.startsWith(`/`)||n.startsWith(`\\`)?ct(n.substring(1),`/`):ct(n,t)):a=t,{pathname:a,search:_t(r),hash:vt(i)}}function ct(e,t){let n=ht(t).split(`/`);return e.split(`/`).forEach(e=>{e===`..`?n.length>1&&n.pop():e!==`.`&&n.push(e)}),n.length>1?n.join(`/`):`/`}function lt(e,t,n,r){return`Cannot include a '${e}' character in a manually specified \`to.${t}\` field [${JSON.stringify(r)}]. Please separate it out to the \`to.${n}\` field. Alternatively you may provide the full path as a string in and the router will parse it for you.`}function ut(e){return e.filter((e,t)=>t===0||e.route.path&&e.route.path.length>0)}function dt(e){let t=ut(e);return t.map((e,n)=>n===t.length-1?e.pathname:e.pathnameBase)}function ft(e,t,n,r=!1){let i;typeof e==`string`?i=Te(e):(i={...e},F(!i.pathname||!i.pathname.includes(`?`),lt(`?`,`pathname`,`search`,i)),F(!i.pathname||!i.pathname.includes(`#`),lt(`#`,`pathname`,`hash`,i)),F(!i.search||!i.search.includes(`#`),lt(`#`,`search`,`hash`,i)));let a=e===``||i.pathname===``,o=a?`/`:i.pathname,s;if(o==null)s=n;else{let e=t.length-1;if(!r&&o.startsWith(`..`)){let t=o.split(`/`);for(;t[0]===`..`;)t.shift(),--e;i.pathname=t.join(`/`)}s=e>=0?t[e]:`/`}let c=st(i,s),l=o&&o!==`/`&&o.endsWith(`/`),u=(a||o===`.`)&&n.endsWith(`/`);return!c.pathname.endsWith(`/`)&&(l||u)&&(c.pathname+=`/`),c}var pt=e=>e.replace(/[\\/]{2,}/g,`/`),mt=e=>pt(e.join(`/`));function ht(e,t=0){let n=e.length;for(;n>t&&e.charCodeAt(n-1)===47;)n--;return n===e.length?e:e.slice(0,n)}var gt=e=>ht(e).replace(/^\/*/,`/`),_t=e=>!e||e===`?`?``:e.startsWith(`?`)?e:`?`+e,vt=e=>!e||e===`#`?``:e.startsWith(`#`)?e:`#`+e,yt=[`EvalError`,`RangeError`,`ReferenceError`,`SyntaxError`,`TypeError`,`URIError`],bt=class{constructor(e,t,n,r=!1){this.status=e,this.statusText=t||``,this.internal=r,n instanceof Error?(this.data=n.toString(),this.error=n):this.data=n}};function xt(e){return e!=null&&typeof e.status==`number`&&typeof e.statusText==`string`&&typeof e.internal==`boolean`&&`data`in e}function St(e){return mt(e.map(e=>e.route.path).filter(Boolean))||`/`}var Ct=typeof window<`u`&&window.document!==void 0&&window.document.createElement!==void 0;function wt(e,t){let n=e;if(typeof n!=`string`||!_e.test(n))return{absoluteURL:void 0,isExternal:!1,to:n};let r=n,i=!1;if(Ct)try{let e=new URL(window.location.href),r=N.test(n)?new URL(P(n,e.protocol)):new URL(n),a=it(r.pathname,t);r.origin===e.origin&&a!=null?n=a+r.search+r.hash:i=!0}catch{I(!1,` contains an invalid URL which will probably break when clicked - please update to a valid URL path.`)}return{absoluteURL:r,isExternal:i,to:n}}var Tt=Symbol(`Uninstrumented`);function Et(e,t){let n={lazy:[],"lazy.loader":[],"lazy.action":[],"lazy.middleware":[],middleware:[],loader:[],action:[]};e.forEach(e=>e({id:t.id,index:t.index,path:t.path,instrument(e){let t=Object.keys(n);for(let r of t)e[r]&&n[r].push(e[r])}}));let r={};if(typeof t.lazy==`function`&&n.lazy.length>0){let e=Ot(n.lazy,t.lazy,()=>void 0);e&&(r.lazy=e)}if(typeof t.lazy==`object`){let e=t.lazy;[`middleware`,`loader`,`action`].forEach(t=>{let i=e[t],a=n[`lazy.${t}`];if(typeof i==`function`&&a.length>0){let e=Ot(a,i,()=>void 0);e&&(r.lazy=Object.assign(r.lazy||{},{[t]:e}))}})}return[`loader`,`action`].forEach(e=>{let i=t[e];if(typeof i==`function`&&n[e].length>0){let t=i[Tt]??i,a=Ot(n[e],t,(...e)=>At(e[0]));a&&(e===`loader`&&t.hydrate===!0&&(a.hydrate=!0),a[Tt]=t,r[e]=a)}}),t.middleware&&t.middleware.length>0&&n.middleware.length>0&&(r.middleware=t.middleware.map(e=>{let t=e[Tt]??e,r=Ot(n.middleware,t,(...e)=>At(e[0]));return r?(r[Tt]=t,r):e})),r}function Dt(e,t){let n={navigate:[],fetch:[]};if(t.forEach(e=>e({instrument(e){let t=Object.keys(e);for(let r of t)e[r]&&n[r].push(e[r])}})),n.navigate.length>0){let t=e.navigate[Tt]??e.navigate,r=Ot(n.navigate,t,(...t)=>{let[n,r]=t;return{to:typeof n==`number`||typeof n==`string`?n:n?we(n):`.`,...jt(e,r??{})}});r&&(r[Tt]=t,e.navigate=r)}if(n.fetch.length>0){let t=e.fetch[Tt]??e.fetch,r=Ot(n.fetch,t,(...t)=>{let[n,,r,i]=t;return{href:r??`.`,fetcherKey:n,...jt(e,i??{})}});r&&(r[Tt]=t,e.fetch=r)}return e}function Ot(e,t,n){return e.length===0?null:async(...r)=>{let i=await kt(e,n(...r),()=>t(...r),e.length-1);if(i.type===`error`)throw i.value;return i.value}}async function kt(e,t,n,r){let i=e[r],a;if(i){let o,s=async()=>(o?console.error(`You cannot call instrumented handlers more than once`):o=kt(e,t,n,r-1),a=await o,F(a,`Expected a result`),a.type===`error`&&a.value instanceof Error?{status:`error`,error:a.value}:{status:`success`,error:void 0});try{await i(s,t)}catch(e){console.error(`An instrumentation function threw an error:`,e)}o||await s(),await o}else try{a={type:`success`,value:await n()}}catch(e){a={type:`error`,value:e}}return a||{type:`error`,value:Error(`No result assigned in instrumentation chain.`)}}function At(e){let{request:t,context:n,params:r,pattern:i}=e;return{request:Mt(t),params:{...r},pattern:i,context:Nt(n)}}function jt(e,t){return{currentUrl:we(e.state.location),...`formMethod`in t?{formMethod:t.formMethod}:{},...`formEncType`in t?{formEncType:t.formEncType}:{},...`formData`in t?{formData:t.formData}:{},...`body`in t?{body:t.body}:{}}}function Mt(e){return{method:e.method,url:e.url,headers:{get:(...t)=>e.headers.get(...t)}}}function Nt(e){if(Ft(e)){let t={...e};return Object.freeze(t),t}return{get:t=>e.get(t)}}var Pt=Object.getOwnPropertyNames(Object.prototype).sort().join(`\0`);function Ft(e){if(typeof e!=`object`||!e)return!1;let t=Object.getPrototypeOf(e);return t===Object.prototype||t===null||Object.getOwnPropertyNames(t).sort().join(`\0`)===Pt}var It=new URL(`http://localhost`);function Lt(e){if(e.createURL)return e.createURL(`/`);try{return new URL(e.createHref(`/`),It)}catch{return It}}function Rt(e,t){return e.origin===t.origin&&(e.origin!==`null`||e.protocol===t.protocol&&e.host===t.host)}function zt(e,t){if(e.startsWith(`//`))return!0;let n=t.protocol.toLowerCase();return e.toLowerCase().startsWith(n)?t.host===``||e.slice(n.length).startsWith(`//`):!1}function Bt(e,t,n,r){let i=null;try{i=e==null?null:new URL(e,n)}catch{}let a=new URL(t,n),o=i!=null&&!Rt(i,n),s=!Rt(a,n);if(r===`reject`){if(o||s)throw Error(`External navigation is not allowed`)}else if(s&&(i==null||!zt(e,i)||!Rt(i,a)))throw Error(`External navigation is not allowed`)}var Vt=[`POST`,`PUT`,`PATCH`,`DELETE`],Ht=new Set(Vt),Ut=[`GET`,...Vt],Wt=new Set(Ut),Gt=new Set([301,302,303,307,308]),Kt=new Set([307,308]),qt={state:`idle`,location:void 0,matches:void 0,historyAction:void 0,formMethod:void 0,formAction:void 0,formEncType:void 0,formData:void 0,json:void 0,text:void 0},L={state:`idle`,data:void 0,formMethod:void 0,formAction:void 0,formEncType:void 0,formData:void 0,json:void 0,text:void 0},Jt={state:`unblocked`,proceed:void 0,reset:void 0,location:void 0},Yt=e=>({hasErrorBoundary:!!e.hasErrorBoundary}),Xt=`remix-router-transitions`,Zt=Symbol(`ResetLoaderData`),Qt,$t,en,tn,nn=class{constructor(e){ge(this,Qt),ge(this,$t),ge(this,en),ge(this,tn),M(this,Qt,e),M(this,$t,Be(e))}get stableRoutes(){return he(this,Qt)}get activeRoutes(){return he(this,en)??he(this,Qt)}get branches(){return he(this,tn)??he(this,$t)}get hasHMRRoutes(){return he(this,en)!=null}setRoutes(e){M(this,Qt,e),M(this,$t,Be(e))}setHmrRoutes(e){M(this,en,e),M(this,tn,Be(e))}commitHmrRoutes(){he(this,en)&&(M(this,Qt,he(this,en)),M(this,$t,he(this,tn)),M(this,en,void 0),M(this,tn,void 0))}};Qt=new WeakMap,$t=new WeakMap,en=new WeakMap,tn=new WeakMap;function rn(e){let t=e.window?e.window:typeof window<`u`?window:void 0,n=t!==void 0&&t.document!==void 0&&t.document.createElement!==void 0;F(e.routes.length>0,`You must provide a non-empty routes array to createRouter`);let r=e.hydrationRouteProperties||[],i=e.mapRouteProperties||Yt,a=i;if(e.instrumentations){let t=e.instrumentations;a=e=>({...i(e),...Et(t.map(e=>e.route).filter(Boolean),e)})}let o={},s=new nn(Fe(e.routes,a,void 0,o)),c=e.basename||`/`;c.startsWith(`/`)||(c=`/${c}`);let l=e.dataStrategy||xn,u={...e.future},d=null,f=new Set,p=null,m=null,h=null,g=null,_=e.hydrationData!=null,v=Re(s.activeRoutes,e.history.location,c,!1,s.branches),y=!1,b=null,x,S;if(v==null&&!e.patchRoutesOnNavigation){let t=Kn(404,{pathname:e.history.location.pathname}),{matches:n,route:r}=Gn(s.activeRoutes);x=!0,S=!x,v=n,b={[r.id]:t}}else if(v&&!e.hydrationData&&at(v,s.activeRoutes,e.history.location.pathname).active&&(v=null),!v){x=!1,S=!x,v=[];let t=at(null,s.activeRoutes,e.history.location.pathname);t.active&&t.matches&&(y=!0,v=t.matches)}else if(v.some(e=>e.route.lazy))x=!1,S=!x;else if(!v.some(e=>ln(e.route)))x=!0,S=!x;else{let t=e.hydrationData?e.hydrationData.loaderData:null,n=e.hydrationData?e.hydrationData.errors:null,r=v;if(n){let e=v.findIndex(e=>n[e.route.id]!==void 0);r=r.slice(0,e+1)}S=!1,x=!0,r.forEach(e=>{let r=un(e.route,t,n);S||=r.renderFallback,x&&=!r.shouldLoad})}let C,w={historyAction:e.history.action,location:e.history.location,matches:v,initialized:x,renderFallback:S,navigation:qt,restoreScrollPosition:e.hydrationData==null&&null,preventScrollReset:!1,revalidation:`idle`,loaderData:e.hydrationData&&e.hydrationData.loaderData||{},actionData:e.hydrationData&&e.hydrationData.actionData||null,errors:e.hydrationData&&e.hydrationData.errors||b,fetchers:new Map,blockers:new Map},T=`POP`,E=null,ee=!1,D,O=!1,te=new Map,k=null,ne=!1,re=!1,ie=new Set,ae=new Map,oe=0,se=-1,ce=new Map,A=new Set,le=new Map,ue=new Map,de=new Set,fe=new Map,j,pe=null;function me(){if(d=e.history.listen(({action:t,location:n,delta:r})=>{if(j){j(),j=void 0;return}I(fe.size===0||r!=null,"You are trying to use a blocker on a POP navigation to a location that was not created by @remix-run/router. This will fail silently in production. This can happen if you are navigating outside the router via `window.history.pushState`/`window.location.hash` instead of using router navigation APIs. This can also happen if you are using createHashRouter and the user manually changes the URL.");let i=Qe({currentLocation:w.location,nextLocation:n,historyAction:t});if(i&&r!=null){let t=new Promise(e=>{j=e});e.history.go(r*-1),Ze(i,{state:`blocked`,location:n,proceed(){Ze(i,{state:`proceeding`,proceed:void 0,reset:void 0,location:n}),t.then(()=>e.history.go(r))},reset(){let e=new Map(w.blockers);e.set(i,Jt),M({blockers:e})}}),E?.resolve(),E=null;return}return ye(t,n)}),n){gr(t,te);let e=()=>_r(t,te);t.addEventListener(`pagehide`,e),k=()=>t.removeEventListener(`pagehide`,e)}return w.initialized||ye(`POP`,w.location,{initialHydration:!0}),C}function he(){d&&d(),k&&k(),f.clear(),D&&D.abort(),w.fetchers.forEach((e,t)=>Ue(w.fetchers,t)),w.blockers.forEach((e,t)=>Xe(t))}function ge(e){if(f.add(e),p){let{newErrors:t}=p;p=null,e(w,{deletedFetchers:[],newErrors:t,viewTransitionOpts:void 0,flushSync:!1})}return()=>f.delete(e)}function M(e,t={}){e.matches&&=e.matches.map(e=>{let t=o[e.route.id],n=e.route;return n.element!==t.element||n.errorElement!==t.errorElement||n.hydrateFallbackElement!==t.hydrateFallbackElement?{...e,route:t}:e}),w={...w,...e};let n=[],r=[];w.fetchers.forEach((e,t)=>{e.state===`idle`&&(de.has(t)?n.push(t):r.push(t))}),de.forEach(e=>{!w.fetchers.has(e)&&!ae.has(e)&&n.push(e)}),f.size===0&&(p={newErrors:e.errors??null}),[...f].forEach(r=>r(w,{deletedFetchers:n,newErrors:e.errors??null,viewTransitionOpts:t.viewTransitionOpts,flushSync:t.flushSync===!0})),n.forEach(e=>Ue(w.fetchers,e)),r.forEach(e=>w.fetchers.delete(e))}function _e(t,n,{flushSync:r}={}){let i=w.actionData!=null&&w.navigation.formMethod!=null&&sr(w.navigation.formMethod)&&w.navigation.state===`loading`&&t.state?._isRedirect!==!0,a;a=n.actionData?Object.keys(n.actionData).length>0?n.actionData:null:i?w.actionData:null;let o=n.loaderData?Hn(w.loaderData,n.loaderData,n.matches||[],n.errors):w.loaderData,c=w.blockers;c.size>0&&(c=new Map(c),c.forEach((e,t)=>c.set(t,Jt)));let l=!ne&&rt(t,n.matches||w.matches),u=ee===!0||w.navigation.formMethod!=null&&sr(w.navigation.formMethod)&&t.state?._isRedirect!==!0;s.commitHmrRoutes(),ne||T===`POP`||(T===`PUSH`?e.history.push(t,t.state):T===`REPLACE`&&e.history.replace(t,t.state));let d;if(T===`POP`){let e=te.get(w.location.pathname);e&&e.has(t.pathname)?d={currentLocation:w.location,nextLocation:t}:te.has(t.pathname)&&(d={currentLocation:t,nextLocation:w.location})}else if(O){let e=te.get(w.location.pathname);e?e.add(t.pathname):(e=new Set([t.pathname]),te.set(w.location.pathname,e)),d={currentLocation:w.location,nextLocation:t}}M({...n,actionData:a,loaderData:o,historyAction:T,location:t,initialized:!0,renderFallback:!1,navigation:qt,revalidation:`idle`,restoreScrollPosition:l,preventScrollReset:u,blockers:c},{viewTransitionOpts:d,flushSync:r===!0}),T=`POP`,ee=!1,O=!1,ne=!1,re=!1,E?.resolve(),E=null,pe?.resolve(),pe=null}async function P(t,n){if(E?.resolve(),E=null,typeof t==`number`){E||=vr();let n=E.promise;return e.history.go(t),n}let{path:r,submission:i,error:a}=sn(!1,on(w.location,w.matches,c,t,n?.fromRouteId,n?.relative),n),o;if(n?.mask){let t=typeof n.mask==`string`?Te(n.mask):{...w.location.mask,...n.mask};if(o={pathname:t.pathname??``,search:t.search??``,hash:t.hash??``},N.test(o.pathname))throw Error(`External navigation is not allowed`);o.pathname.startsWith(`\\`)&&(o.pathname=o.pathname.replace(/^\\+/,`/`)),Bt(typeof n.mask==`string`?n.mask:we(n.mask),we(o),e.history.createURL(`/`),`reject`)}let s=w.location,l=Ce(s,r,n&&n.state,void 0,o);l={...l,...e.history.encodeLocation(l)},Bt(t==null?e.history.createHref(w.location):typeof t==`string`?t:we(t),e.history.createHref(l.mask||l),e.history.createURL(`/`),`reject`);let u=n&&n.replace!=null?n.replace:void 0,d=`PUSH`;u===!0?d=`REPLACE`:u===!1||i!=null&&sr(i.formMethod)&&i.formAction===w.location.pathname+w.location.search&&(d=`REPLACE`);let f=n&&`preventScrollReset`in n?n.preventScrollReset===!0:void 0,p=(n&&n.flushSync)===!0,m=Qe({currentLocation:s,nextLocation:l,historyAction:d});if(m){Ze(m,{state:`blocked`,location:l,proceed(){Ze(m,{state:`proceeding`,proceed:void 0,reset:void 0,location:l}),P(t,n)},reset(){let e=new Map(w.blockers);e.set(m,Jt),M({blockers:e})}});return}await ye(d,l,{submission:i,pendingError:a,preventScrollReset:f,replace:n&&n.replace,enableViewTransition:n&&n.viewTransition,flushSync:p,callSiteDefaultShouldRevalidate:n&&n.defaultShouldRevalidate})}function ve(){pe||=vr(),Ie(),M({revalidation:`loading`});let e=pe.promise;return w.navigation.state===`submitting`?e:w.navigation.state===`idle`?(ye(w.historyAction,w.location,{startUninterruptedRevalidation:!0}),e):(ye(T||w.historyAction,w.navigation.location,{overrideNavigation:w.navigation,enableViewTransition:O===!0}),e)}async function ye(t,n,r){D&&D.abort(),D=null,T=t,ne=(r&&r.startUninterruptedRevalidation)===!0,nt(w.location,w.matches),ee=(r&&r.preventScrollReset)===!0,O=(r&&r.enableViewTransition)===!0;let i=s.activeRoutes,a=r?.initialHydration&&w.matches&&w.matches.length>0&&!y?w.matches:Re(i,n,c,!1,s.branches),o=(r&&r.flushSync)===!0;if(a&&w.initialized&&!re&&Yn(w.location,n)&&!(r&&r.submission&&sr(r.submission.formMethod))){_e(n,{matches:a},{flushSync:o});return}let l=at(a,i,n.pathname);if(l.active&&l.matches&&(a=l.matches),!a){let{error:e,notFoundMatches:t,route:r}=$e(n.pathname);_e(n,{matches:t,loaderData:{},errors:{[r.id]:e}},{flushSync:o});return}let u=r&&r.overrideNavigation?{...r.overrideNavigation,matches:a,historyAction:t}:void 0;D=new AbortController;let d=In(e.history,n,D.signal,r&&r.submission),f=e.getContext?await e.getContext():new ke,p;if(r&&r.pendingError)p=[Wn(a).route.id,{type:`error`,error:r.pendingError}];else if(r&&r.submission&&sr(r.submission.formMethod)){let i=await be(d,n,r.submission,a,t,f,l.active,r&&r.initialHydration===!0,{replace:r.replace,flushSync:o});if(i.shortCircuited)return;if(i.pendingActionResult){let[e,t]=i.pendingActionResult;if(er(t)&&xt(t.error)&&t.error.status===404){D=null,_e(n,{matches:i.matches,loaderData:{},errors:{[e]:t.error}});return}}a=i.matches||a,p=i.pendingActionResult,u=dr(n,a,t,r.submission),o=!1,l.active=!1,d=In(e.history,d.url,d.signal)}let{shortCircuited:m,matches:h,loaderData:g,errors:_,workingFetchers:v}=await xe(d,n,a,t,f,l.active,u,r&&r.submission,r&&r.fetcherSubmission,r&&r.replace,r&&r.initialHydration===!0,o,p,r&&r.callSiteDefaultShouldRevalidate);m||(D=null,_e(n,{matches:h||a,...Un(p),loaderData:g,errors:_,...v?{fetchers:v}:{}}))}async function be(t,n,i,l,u,d,f,p,m={}){if(Ie(),M({navigation:fr(n,l,u,i)},{flushSync:m.flushSync===!0}),f){let e=await st(l,n.pathname,t.signal);if(e.type===`aborted`)return{shortCircuited:!0};if(e.type===`error`){if(e.partialMatches.length===0){let{matches:t,route:n}=Gn(s.activeRoutes);return{matches:t,pendingActionResult:[n.id,{type:`error`,error:e.error}]}}let t=Wn(e.partialMatches).route.id;return{matches:e.partialMatches,pendingActionResult:[t,{type:`error`,error:e.error}]}}if(e.matches)l=e.matches;else{let{notFoundMatches:e,error:t,route:r}=$e(n.pathname);return{matches:e,pendingActionResult:[r.id,{type:`error`,error:t}]}}}let h,g=lr(l,n);if(!g.route.action&&!g.route.lazy)h={type:`error`,error:Kn(405,{method:t.method,pathname:n.pathname,routeId:g.route.id})};else{let e=await Ne(t,n,Dn(a,o,t,n,l,g,p?[]:r,d),d,null);if(h=e[g.route.id],!h){for(let t of l)if(e[t.route.id]){h=e[t.route.id];break}}if(t.signal.aborted)return{shortCircuited:!0}}if(tr(h)){let n;return n=m&&m.replace!=null?m.replace:Fn(h.response.headers.get(`Location`),new URL(t.url),c,e.history)===w.location.pathname+w.location.search,await Me(t,h,!0,{submission:i,replace:n}),{shortCircuited:!0}}if(er(h)){let e=Wn(l,g.route.id);return(m&&m.replace)!==!0&&(T=`PUSH`),{matches:l,pendingActionResult:[e.route.id,h,g.route.id]}}return{matches:l,pendingActionResult:[g.route.id,h]}}async function xe(t,n,i,l,u,d,f,p,m,h,g,_,v,y){let b=f||dr(n,i,l,p),x=p||m||ur(b),S=!ne&&!g;if(d){if(S){let e=Se(v);M({navigation:b,...e===void 0?{}:{actionData:e}},{flushSync:_})}let e=await st(i,n.pathname,t.signal);if(e.type===`aborted`)return{shortCircuited:!0};if(e.type===`error`){if(e.partialMatches.length===0){let{matches:t,route:n}=Gn(s.activeRoutes);return{matches:t,loaderData:{},errors:{[n.id]:e.error}}}let t=Wn(e.partialMatches).route.id;return{matches:e.partialMatches,loaderData:{},errors:{[t]:e.error}}}if(e.matches)i=e.matches;else{let{error:e,notFoundMatches:t,route:r}=$e(n.pathname);return{matches:t,loaderData:{},errors:{[r.id]:e}}}}let C=s.activeRoutes,{dsMatches:T,revalidatingFetchers:E}=cn(t,u,a,o,e.history,w,i,x,n,g?[]:r,g===!0,re,ie,de,le,A,C,c,e.patchRoutesOnNavigation!=null,s.branches,v,y);if(se=++oe,!e.dataStrategy&&!T.some(e=>e.shouldLoad)&&!T.some(e=>e.route.middleware&&e.route.middleware.length>0)&&E.length===0){let e=new Map(w.fetchers),t=qe(e);return _e(n,{matches:i,loaderData:{},errors:v&&er(v[1])?{[v[0]]:v[1].error}:null,...Un(v),...t?{fetchers:e}:{}},{flushSync:_}),{shortCircuited:!0}}if(S){let e={};if(!d){e.navigation=b;let t=Se(v);t!==void 0&&(e.actionData=t)}E.length>0&&(e.fetchers=Ee(E)),M(e,{flushSync:_})}E.forEach(e=>{Ge(e.key),e.controller&&ae.set(e.key,e.controller)});let ee=()=>E.forEach(e=>Ge(e.key));D&&D.signal.addEventListener(`abort`,ee);let{loaderResults:O,fetcherResults:te}=await Pe(T,E,t,n,u);if(t.signal.aborted)return{shortCircuited:!0};D&&D.signal.removeEventListener(`abort`,ee),E.forEach(e=>ae.delete(e.key));let k=qn(O);if(k)return await Me(t,k.result,!0,{replace:h}),{shortCircuited:!0};if(k=qn(te),k)return A.add(k.key),await Me(t,k.result,!0,{replace:h}),{shortCircuited:!0};let ce=new Map(w.fetchers),{loaderData:ue,errors:fe}=Vn(w,i,O,v,E,te,ce);g&&w.errors&&(fe={...w.errors,...fe});let j=qe(ce),pe=Je(se,ce),me=j||pe||E.length>0;return{matches:i,loaderData:ue,errors:fe,...me?{workingFetchers:ce}:{}}}function Se(e){if(e&&!er(e[1]))return{[e[0]]:e[1].data};if(w.actionData)return Object.keys(w.actionData).length===0?null:w.actionData}function Ee(e){let t=new Map(w.fetchers);return e.forEach(e=>{let n=t.get(e.key),r=pr(void 0,n?n.data:void 0);t.set(e.key,r)}),t}async function Oe(t,n,r,i){Ge(t);let a=(i&&i.flushSync)===!0,o=s.activeRoutes,l=on(w.location,w.matches,c,r,n,i?.relative),u=Re(o,l,c,!1,s.branches),d=at(u,o,l);if(d.active&&d.matches&&(u=d.matches),!u){Be(t,n,Kn(404,{pathname:l}),{flushSync:a});return}let{path:f,submission:p,error:m}=sn(!0,l,i);if(m){Be(t,n,m,{flushSync:a});return}let h=e.getContext?await e.getContext():new ke,g=(i&&i.preventScrollReset)===!0;if(p&&sr(p.formMethod)){await Ae(t,n,f,u,h,d.active,a,g,p,i&&i.defaultShouldRevalidate);return}le.set(t,{routeId:n,path:f}),await je(t,n,f,u,h,d.active,a,g,p)}async function Ae(t,n,i,l,u,d,f,p,m,h){Ie(),le.delete(t),Le(t,mr(m,w.fetchers.get(t)),{flushSync:f});let g=new AbortController,_=In(e.history,i,g.signal,m);if(d){let e=await st(l,new URL(_.url).pathname,_.signal,t);if(e.type===`aborted`)return;if(e.type===`error`){Be(t,n,e.error,{flushSync:f});return}if(e.matches)l=e.matches;else{Be(t,n,Kn(404,{pathname:i}),{flushSync:f});return}}let v=lr(l,i);if(!v.route.action&&!v.route.lazy){Be(t,n,Kn(405,{method:m.formMethod,pathname:i,routeId:n}),{flushSync:f});return}ae.set(t,g);let y=oe,b=Dn(a,o,_,i,l,v,r,u),x=await Ne(_,i,b,u,t),S=x[v.route.id];if(!S){for(let e of b)if(x[e.route.id]){S=x[e.route.id];break}}if(_.signal.aborted){ae.get(t)===g&&ae.delete(t);return}if(de.has(t)){if(tr(S)||er(S)){Le(t,hr(void 0));return}}else{if(tr(S)){if(ae.delete(t),se>y){Le(t,hr(void 0));return}return A.add(t),Le(t,pr(m)),Me(_,S,!1,{fetcherSubmission:m,preventScrollReset:p})}if(er(S)){Be(t,n,S.error);return}}let C=w.navigation.location||w.location,E=In(e.history,C,g.signal),ee=s.activeRoutes,O=w.navigation.state===`idle`?w.matches:Re(ee,w.navigation.location,c,!1,s.branches);F(O,`Didn't find any matches after fetcher action`);let te=++oe;ce.set(t,te);let{dsMatches:k,revalidatingFetchers:ne}=cn(E,u,a,o,e.history,w,O,m,C,r,!1,re,ie,de,le,A,ee,c,e.patchRoutesOnNavigation!=null,s.branches,[v.route.id,S],h),ue=pr(m,S.data),fe=new Map(w.fetchers);fe.set(t,ue),ne.filter(e=>e.key!==t).forEach(e=>{let t=e.key,n=fe.get(t),r=pr(void 0,n?n.data:void 0);fe.set(t,r),Ge(t),e.controller&&ae.set(t,e.controller)}),M({fetchers:fe});let j=()=>ne.forEach(e=>Ge(e.key));g.signal.addEventListener(`abort`,j);let{loaderResults:pe,fetcherResults:me}=await Pe(k,ne,E,C,u);if(g.signal.aborted)return;g.signal.removeEventListener(`abort`,j),ce.delete(t),ae.delete(t),ne.forEach(e=>ae.delete(e.key));let he=w.fetchers.has(t),ge=e=>{if(!he)return e;let n=new Map(e.fetchers);return n.set(t,hr(S.data)),{...e,fetchers:n}},N=qn(pe);if(N)return w=ge(w),Me(E,N.result,!1,{preventScrollReset:p});if(N=qn(me),N)return A.add(N.key),w=ge(w),Me(E,N.result,!1,{preventScrollReset:p});let P=new Map(w.fetchers);he&&P.set(t,hr(S.data));let{loaderData:ve,errors:ye}=Vn(w,O,pe,void 0,ne,me,P);Je(te,P),w.navigation.state===`loading`&&te>se?(F(T,`Expected pending action`),D&&D.abort(),_e(w.navigation.location,{matches:O,loaderData:ve,errors:ye,fetchers:P})):(M({errors:ye,loaderData:Hn(w.loaderData,ve,O,ye),fetchers:P}),re=!1)}async function je(t,n,i,s,c,l,u,d,f){let p=w.fetchers.get(t);Le(t,pr(f,p?p.data:void 0),{flushSync:u});let m=new AbortController,h=In(e.history,i,m.signal);if(l){let e=await st(s,new URL(h.url).pathname,h.signal,t);if(e.type===`aborted`)return;if(e.type===`error`){Be(t,n,e.error,{flushSync:u});return}if(e.matches)s=e.matches;else{Be(t,n,Kn(404,{pathname:i}),{flushSync:u});return}}let g=lr(s,i);ae.set(t,m);let _=oe,v=await Ne(h,i,Dn(a,o,h,i,s,g,r,c),c,t),y=v[g.route.id];if(!y){for(let e of s)if(v[e.route.id]){y=v[e.route.id];break}}if(ae.get(t)===m&&ae.delete(t),!h.signal.aborted){if(de.has(t)){Le(t,hr(void 0));return}if(tr(y)){if(se>_){Le(t,hr(void 0));return}A.add(t),await Me(h,y,!1,{preventScrollReset:d});return}if(er(y)){Be(t,n,y.error);return}Le(t,hr(y.data))}}async function Me(r,i,a,{submission:o,fetcherSubmission:s,preventScrollReset:l,replace:u}={}){a||(E?.resolve(),E=null),i.response.headers.has(`X-Remix-Revalidate`)&&(re=!0);let d=i.response.headers.get(`Location`);F(d,`Expected a Location header on the redirect Response`);let f=d,p=new URL(r.url);d=Fn(d,p,c,e.history),Bt(f,d,p,`allow-explicit`);let m=Ce(w.location,d,{_isRedirect:!0});if(n){let e=!1;if(i.response.headers.has(`X-Remix-Reload-Document`))e=!0;else if(ot(d)){let n=De(t,d,!0);e=n.origin!==t.location.origin||it(n.pathname,c)==null}if(e){u?t.location.replace(d):t.location.assign(d);return}}D=null;let h=u===!0||i.response.headers.has(`X-Remix-Replace`)?`REPLACE`:`PUSH`,{formMethod:g,formAction:_,formEncType:v}=w.navigation;!o&&!s&&g&&_&&v&&(o=ur(w.navigation));let y=o||s;Kt.has(i.response.status)&&y&&sr(y.formMethod)?await ye(h,m,{submission:{...y,formAction:d},preventScrollReset:l||ee,enableViewTransition:a?O:void 0}):await ye(h,m,{overrideNavigation:dr(m,[],h,o),fetcherSubmission:s,preventScrollReset:l||ee,enableViewTransition:a?O:void 0})}async function Ne(e,t,n,r,i){let a,o={};try{a=await On(l,e,t,n,i,r,!1)}catch(e){return n.filter(e=>e.shouldLoad).forEach(t=>{o[t.route.id]={type:`error`,error:e}}),o}if(e.signal.aborted)return o;if(!sr(e.method))for(let e of n){if(a[e.route.id]?.type===`error`)break;!a.hasOwnProperty(e.route.id)&&!w.loaderData.hasOwnProperty(e.route.id)&&(!w.errors||!w.errors.hasOwnProperty(e.route.id))&&e.shouldCallHandler()&&(a[e.route.id]={type:`error`,result:Error(`No result returned from dataStrategy for route ${e.route.id}`)})}for(let[t,r]of Object.entries(a))if($n(r)){let i=r.result;o[t]={type:`redirect`,response:Mn(i,e,t,n,c)}}else o[t]=await jn(r);return o}async function Pe(e,t,n,r,i){let a=Ne(n,r,e,i,null),o=Promise.all(t.map(async e=>{if(e.matches&&e.match&&e.request&&e.controller){let t=(await Ne(e.request,e.path,e.matches,i,e.key))[e.match.route.id];return{[e.key]:t}}return Promise.resolve({[e.key]:{type:`error`,error:Kn(404,{pathname:e.path})}})}));return{loaderResults:await a,fetcherResults:(await o).reduce((e,t)=>Object.assign(e,t),{})}}function Ie(){re=!0,le.forEach((e,t)=>{ae.has(t)&&ie.add(t),Ge(t)})}function Le(e,t,n={}){let r=new Map(w.fetchers);r.set(e,t),M({fetchers:r},{flushSync:(n&&n.flushSync)===!0})}function Be(e,t,n,r={}){let i=Wn(w.matches,t),a=new Map(w.fetchers);Ue(a,e),M({errors:{[i.route.id]:n},fetchers:a},{flushSync:(r&&r.flushSync)===!0})}function Ve(e){return ue.set(e,(ue.get(e)||0)+1),de.has(e)&&de.delete(e),w.fetchers.get(e)||L}function He(e,t){Ge(e,t?.reason),Le(e,hr(null))}function Ue(e,t){let n=w.fetchers.get(t);ae.has(t)&&!(n&&n.state===`loading`&&ce.has(t))&&Ge(t),le.delete(t),ce.delete(t),A.delete(t),de.delete(t),ie.delete(t),e.delete(t)}function We(e){let t=(ue.get(e)||0)-1;t<=0?(ue.delete(e),de.add(e)):ue.set(e,t),M({fetchers:new Map(w.fetchers)})}function Ge(e,t){let n=ae.get(e);n&&(n.abort(t),ae.delete(e))}function Ke(e,t){for(let n of e){let e=t.get(n);F(e,`Expected fetcher: ${n}`);let r=hr(e.data);t.set(n,r)}}function qe(e){let t=[],n=!1;for(let r of A){let i=e.get(r);F(i,`Expected fetcher: ${r}`),i.state===`loading`&&(A.delete(r),t.push(r),n=!0)}return Ke(t,e),n}function Je(e,t){let n=[];for(let[r,i]of ce)if(i0}function Ye(e,t){let n=w.blockers.get(e)||Jt;return fe.get(e)!==t&&fe.set(e,t),n}function Xe(e){w.blockers.delete(e),fe.delete(e)}function Ze(e,t){let n=w.blockers.get(e)||Jt;F(n.state===`unblocked`&&t.state===`blocked`||n.state===`blocked`&&t.state===`blocked`||n.state===`blocked`&&t.state===`proceeding`||n.state===`blocked`&&t.state===`unblocked`||n.state===`proceeding`&&t.state===`unblocked`,`Invalid blocker state transition: ${n.state} -> ${t.state}`);let r=new Map(w.blockers);r.set(e,t),M({blockers:r})}function Qe({currentLocation:e,nextLocation:t,historyAction:n}){if(fe.size===0)return;fe.size>1&&I(!1,`A router only supports one blocker at a time`);let r=Array.from(fe.entries()),[i,a]=r[r.length-1],o=w.blockers.get(i);if(!(o&&o.state===`proceeding`)&&a({currentLocation:e,nextLocation:t,historyAction:n}))return i}function $e(e){let t=Kn(404,{pathname:e}),n=s.activeRoutes,{matches:r,route:i}=Gn(n);return{notFoundMatches:r,route:i,error:t}}function et(e,t,n){if(m=e,g=t,h=n||null,!_&&w.navigation===qt){_=!0;let e=rt(w.location,w.matches);e!=null&&M({restoreScrollPosition:e})}return()=>{m=null,g=null,h=null}}function tt(e,t){return h&&h(e,t.map(e=>ze(e,w.loaderData)))||e.key}function nt(e,t){if(m&&g){let n=tt(e,t);m[n]=g()}}function rt(e,t){if(m){let n=tt(e,t),r=m[n];if(typeof r==`number`)return r}return null}function at(t,n,r){if(e.patchRoutesOnNavigation){let e=s.branches;if(!t)return{active:!0,matches:Re(n,r,c,!0,e)||[]};if(Object.keys(t[0].params).length>0)return{active:!0,matches:Re(n,r,c,!0,e)}}return{active:!1,matches:null}}async function st(t,n,r,i){if(!e.patchRoutesOnNavigation)return{type:`success`,matches:t};let l=t;for(;;){let t=o;try{await e.patchRoutesOnNavigation({signal:r,path:n,matches:l,fetcherKey:i,patch:(e,n)=>{r.aborted||mn(e,n,s,t,a,!1)}})}catch(e){return{type:`error`,error:e,partialMatches:l}}if(r.aborted)return{type:`aborted`};let u=s.branches,d=Re(s.activeRoutes,n,c,!1,u),f=null;if(d&&(Object.keys(d[0].params).length===0||(f=Re(s.activeRoutes,n,c,!0,u),!(f&&l.lengthe.route.id===t[n].route.id)}function lt(e){o={},s.setHmrRoutes(Fe(e,a,void 0,o))}function ut(e,t,n=!1){mn(e,t,s,o,a,n),s.hasHMRRoutes||M({})}return C={get basename(){return c},get future(){return u},get state(){return w},get routes(){return s.stableRoutes},get branches(){return s.branches},get manifest(){return o},get window(){return t},initialize:me,subscribe:ge,enableScrollRestoration:et,navigate:P,fetch:Oe,revalidate:ve,createHref:t=>e.history.createHref(t),createURL:t=>e.history.createURL(t),encodeLocation:t=>e.history.encodeLocation(t),getFetcher:Ve,resetFetcher:He,deleteFetcher:We,dispose:he,getBlocker:Ye,deleteBlocker:Xe,patchRoutes:ut,_internalFetchControllers:ae,_internalSetRoutes:lt,_internalSetStateDoNotUseOrYouWillBreakYourApp(e){M(e)}},e.instrumentations&&(C=Dt(C,e.instrumentations.map(e=>e.router).filter(Boolean))),C}function an(e){return e!=null&&(`formData`in e&&e.formData!=null||`body`in e&&e.body!==void 0)}function on(e,t,n,r,i,a){let o,s;if(i){o=[];for(let e of t)if(o.push(e),e.route.id===i){s=e;break}}else o=t,s=t[t.length-1];let c=ft(r||`.`,dt(o),it(e.pathname,n)||e.pathname,a===`path`);if(r??(c.search=e.search,c.hash=e.hash),(r==null||r===``||r===`.`)&&s){let e=cr(c.search);if(s.route.index&&!e)c.search=c.search?c.search.replace(/^\?/,`?index&`):`?index`;else if(!s.route.index&&e){let e=new URLSearchParams(c.search),t=e.getAll(`index`);e.delete(`index`),t.filter(e=>e).forEach(t=>e.append(`index`,t));let n=e.toString();c.search=n?`?${n}`:``}}return n!==`/`&&(c.pathname=at({basename:n,pathname:c.pathname})),we(c)}function sn(e,t,n){if(!n||!an(n))return{path:t};if(n.formMethod&&!or(n.formMethod))return{path:t,error:Kn(405,{method:n.formMethod})};let r=()=>({path:t,error:Kn(400,{type:`invalid-body`})}),i=(n.formMethod||`get`).toUpperCase(),a=Jn(t);if(n.body!==void 0){if(n.formEncType===`text/plain`){if(!sr(i))return r();let e=typeof n.body==`string`?n.body:n.body instanceof FormData||n.body instanceof URLSearchParams?Array.from(n.body.entries()).reduce((e,[t,n])=>`${e}${t}=${n} -`,``):String(n.body);return{path:t,submission:{formMethod:i,formAction:a,formEncType:n.formEncType,formData:void 0,json:void 0,text:e}}}if(n.formEncType===`application/json`){if(!sr(i))return r();try{let e=typeof n.body==`string`?JSON.parse(n.body):n.body;return{path:t,submission:{formMethod:i,formAction:a,formEncType:n.formEncType,formData:void 0,json:e,text:void 0}}}catch{return r()}}}F(typeof FormData==`function`,`FormData is not available in this environment`);let o,s;if(n.formData)o=Rn(n.formData),s=n.formData;else if(n.body instanceof FormData)o=Rn(n.body),s=n.body;else if(n.body instanceof URLSearchParams)o=n.body,s=zn(o);else if(n.body==null)o=new URLSearchParams,s=new FormData;else try{o=new URLSearchParams(n.body),s=zn(o)}catch{return r()}let c={formMethod:i,formAction:a,formEncType:n&&n.formEncType||`application/x-www-form-urlencoded`,formData:s,json:void 0,text:void 0};if(sr(c.formMethod))return{path:t,submission:c};let l=Te(t);return e&&l.search&&cr(l.search)&&o.append(`index`,``),l.search=`?${o}`,{path:we(l),submission:c}}function cn(e,t,n,r,i,a,o,s,c,l,u,d,f,p,m,h,g,_,v,y,b,x){let S=b?er(b[1])?b[1].error:b[1].data:void 0,C=i.createURL(a.location),w=i.createURL(c),T;if(u&&a.errors){let e=Object.keys(a.errors)[0];T=o.findIndex(t=>t.route.id===e)}else if(b&&er(b[1])){let e=b[0];T=o.findIndex(t=>t.route.id===e)-1}let E=b?b[1].statusCode:void 0,ee=E&&E>=400,D={currentUrl:C,currentParams:a.matches[0]?.params||{},nextUrl:w,nextParams:o[0].params,...s,actionResult:S,actionStatus:E},O=St(o),te=o.map((i,o)=>{let{route:s}=i,f=null;if(T!=null&&o>T)f=!1;else if(s.lazy)f=!0;else if(!ln(s))f=!1;else if(u){let{shouldLoad:e}=un(s,a.loaderData,a.errors);f=e}else dn(a.loaderData,a.matches[o],i)&&(f=!0);if(f!==null)return En(n,r,e,c,O,i,l,t,f);let p=!1;typeof x==`boolean`?p=x:ee?p=!1:d||C.pathname+C.search===w.pathname+w.search?p=!0:C.search===w.search?fn(a.matches[o],i)&&(p=!0):p=!0;let m={...D,defaultShouldRevalidate:p},h=pn(i,m);return En(n,r,e,c,O,i,l,t,h,m,x)}),k=[];return m.forEach((e,s)=>{if(u||!o.some(t=>t.route.id===e.routeId)||p.has(s))return;let c=a.fetchers.get(s),m=c&&c.state!==`idle`&&c.data===void 0,b=Re(g,e.path,_??`/`,!1,y);if(!b){if(v&&m)return;k.push({key:s,routeId:e.routeId,path:e.path,matches:null,match:null,request:null,controller:null});return}if(h.has(s))return;let S=lr(b,e.path),C=new AbortController,w=In(i,e.path,C.signal),T=null;if(f.has(s))f.delete(s),T=Dn(n,r,w,e.path,b,S,l,t);else if(m)d&&(T=Dn(n,r,w,e.path,b,S,l,t));else{let i;i=typeof x==`boolean`?x:!ee&&d;let a={...D,defaultShouldRevalidate:i};pn(S,a)&&(T=Dn(n,r,w,e.path,b,S,l,t,a))}T&&k.push({key:s,routeId:e.routeId,path:e.path,matches:T,match:S,request:w,controller:C})}),{dsMatches:te,revalidatingFetchers:k}}function ln(e){return e.loader!=null||e.middleware!=null&&e.middleware.length>0}function un(e,t,n){if(e.lazy)return{shouldLoad:!0,renderFallback:!0};if(!ln(e))return{shouldLoad:!1,renderFallback:!1};let r=t!=null&&e.id in t,i=n!=null&&n[e.id]!==void 0;if(!r&&i)return{shouldLoad:!1,renderFallback:!1};if(typeof e.loader==`function`&&e.loader.hydrate===!0)return{shouldLoad:!0,renderFallback:!r};let a=!r&&!i;return{shouldLoad:a,renderFallback:a}}function dn(e,t,n){let r=!t||n.route.id!==t.route.id,i=!e.hasOwnProperty(n.route.id);return r||i}function fn(e,t){let n=e.route.path;return e.pathname!==t.pathname||n!=null&&n.endsWith(`*`)&&e.params[`*`]!==t.params[`*`]}function pn(e,t){if(e.route.shouldRevalidate){let n=e.route.shouldRevalidate(t);if(typeof n==`boolean`)return n}return t.defaultShouldRevalidate}function mn(e,t,n,r,i,a){let o;if(e){let t=r[e];F(t,`No route found to patch children into: routeId = ${e}`),t.children||=[],o=t.children}else o=n.activeRoutes;let s=[],c=[];if(t.forEach(e=>{let t=o.find(t=>hn(e,t));t?c.push({existingRoute:t,newRoute:e}):s.push(e)}),s.length>0){let t=Fe(s,i,[e||`_`,`patch`,String(o?.length||`0`)],r);o.push(...t)}if(a&&c.length>0)for(let e=0;et.children?.some(t=>hn(e,t)))??!1}var gn=new WeakMap,_n=({key:e,route:t,manifest:n,mapRouteProperties:r})=>{let i=n[t.id];if(F(i,`No route found in manifest`),!i.lazy||typeof i.lazy!=`object`)return;let a=i.lazy[e];if(!a)return;let o=gn.get(i);o||(o={},gn.set(i,o));let s=o[e];if(s)return s;let c=(async()=>{let t=je(e),n=i[e]!==void 0&&e!==`hasErrorBoundary`;if(t)I(!t,`Route property `+e+` is not a supported lazy route property. This property will be ignored.`),o[e]=Promise.resolve();else if(n)I(!1,`Route "${i.id}" has a static property "${e}" defined. The lazy property will be ignored.`);else{let t=await a();t!=null&&(Object.assign(i,{[e]:t}),Object.assign(i,r(i)))}typeof i.lazy==`object`&&(i.lazy[e]=void 0,Object.values(i.lazy).every(e=>e===void 0)&&(i.lazy=void 0))})();return o[e]=c,c},vn=new WeakMap;function yn(e,t,n,r,i){let a=n[e.id];if(F(a,`No route found in manifest`),!e.lazy)return{lazyRoutePromise:void 0,lazyHandlerPromise:void 0};if(typeof e.lazy==`function`){let t=vn.get(a);if(t)return{lazyRoutePromise:t,lazyHandlerPromise:t};let n=(async()=>{F(typeof e.lazy==`function`,`No lazy route function found`);let t=await e.lazy(),n={};for(let e in t){let r=t[e];if(r===void 0)continue;let i=Ne(e),o=a[e]!==void 0&&e!==`hasErrorBoundary`;i?I(!i,`Route property `+e+` is not a supported property to be returned from a lazy route function. This property will be ignored.`):o?I(!o,`Route "${a.id}" has a static property "${e}" defined but its lazy function is also returning a value for this property. The lazy route property "${e}" will be ignored.`):n[e]=r}Object.assign(a,n),Object.assign(a,{...r(a),lazy:void 0})})();return vn.set(a,n),n.catch(()=>{}),{lazyRoutePromise:n,lazyHandlerPromise:n}}let o=Object.keys(e.lazy),s=[],c;for(let a of o){if(i&&i.includes(a))continue;let o=_n({key:a,route:e,manifest:n,mapRouteProperties:r});o&&(s.push(o),a===t&&(c=o))}let l=s.length>0?Promise.all(s).then(()=>{}):void 0;return l?.catch(()=>{}),c?.catch(()=>{}),{lazyRoutePromise:l,lazyHandlerPromise:c}}async function bn(e){let t=e.matches.filter(e=>e.shouldLoad),n={};return(await Promise.all(t.map(e=>e.resolve()))).forEach((e,r)=>{n[t[r].route.id]=e}),n}async function xn(e){return e.matches.some(e=>e.route.middleware)?Sn(e,()=>bn(e)):bn(e)}function Sn(e,t){return Cn(e,t,e=>{if(ar(e))throw e;return e},Zn,n);function n(t,n,r){if(r)return Promise.resolve(Object.assign(r.value,{[n]:{type:`error`,result:t}}));{let{matches:r}=e,i=Wn(r,r[Math.min(Math.max(r.findIndex(e=>e.route.id===n),0),Math.max(r.findIndex(e=>e.shouldCallHandler()),0))].route.id).route.id;return Promise.resolve({[i]:{type:`error`,result:t}})}}}async function Cn(e,t,n,r,i){let{matches:a,...o}=e;return await wn(o,a.flatMap(e=>e.route.middleware?e.route.middleware.map(t=>[e.route.id,t]):[]),t,n,r,i)}async function wn(e,t,n,r,i,a,o=0){let{request:s}=e;if(s.signal.aborted)throw s.signal.reason??Error(`Request aborted: ${s.method} ${s.url}`);let c=t[o];if(!c)return await n();let[l,u]=c,d,f=async()=>{if(d)throw Error("You may only call `next()` once per middleware");try{return d={value:await wn(e,t,n,r,i,a,o+1)},d.value}catch(e){return d={value:await a(e,l,d)},d.value}};try{let t=await u(e,f),n=t==null?void 0:r(t);return i(n)?n:d?n??d.value:(d={value:await f()},d.value)}catch(e){return await a(e,l,d)}}function Tn(e,t,n,r,i){let a=_n({key:`middleware`,route:r.route,manifest:t,mapRouteProperties:e}),o=yn(r.route,sr(n.method)?`action`:`loader`,t,e,i);return{middleware:a,route:o.lazyRoutePromise,handler:o.lazyHandlerPromise}}function En(e,t,n,r,i,a,o,s,c,l=null,u){let d=!1,f=Tn(e,t,n,a,o);return{...a,_lazyPromises:f,shouldLoad:c,shouldRevalidateArgs:l,shouldCallHandler(e){return d=!0,l?typeof u==`boolean`?pn(a,{...l,defaultShouldRevalidate:u}):typeof e==`boolean`?pn(a,{...l,defaultShouldRevalidate:e}):pn(a,l):c},resolve(e){let{lazy:t,loader:o,middleware:l}=a.route,u=d||c||e&&!sr(n.method)&&(t||o),p=l&&l.length>0&&!o&&!t;return u&&(sr(n.method)||!p)?kn({request:n,path:r,pattern:i,match:a,lazyHandlerPromise:f?.handler,lazyRoutePromise:f?.route,handlerOverride:e,scopedContext:s}):Promise.resolve({type:`data`,result:void 0})}}}function Dn(e,t,n,r,i,a,o,s,c=null){return i.map(l=>l.route.id===a.route.id?En(e,t,n,r,St(i),l,o,s,!0,c):{...l,shouldLoad:!1,shouldRevalidateArgs:c,shouldCallHandler:()=>!1,_lazyPromises:Tn(e,t,n,l,o),resolve:()=>Promise.resolve({type:`data`,result:void 0})})}async function On(e,t,n,r,i,a,o){r.some(e=>e._lazyPromises?.middleware)&&await Promise.all(r.map(e=>e._lazyPromises?.middleware));let s={request:t,url:Ln(t,n),pattern:St(r),params:r[0].params,context:a,matches:r},c=o?()=>{throw Error("You cannot call `runClientMiddleware()` from a static handler `dataStrategy`. Middleware is run outside of `dataStrategy` during SSR in order to bubble up the Response. You can enable middleware via the `respond` API in `query`/`queryRoute`")}:e=>{let t=s;return Sn(t,()=>e({...t,fetcherKey:i,runClientMiddleware:()=>{throw Error("Cannot call `runClientMiddleware()` from within an `runClientMiddleware` handler")}}))},l=await e({...s,fetcherKey:i,runClientMiddleware:c});try{await Promise.all(r.flatMap(e=>[e._lazyPromises?.handler,e._lazyPromises?.route]))}catch{}return l}async function kn({request:e,path:t,pattern:n,match:r,lazyHandlerPromise:i,lazyRoutePromise:a,handlerOverride:o,scopedContext:s}){let c,l,u=sr(e.method),d=u?`action`:`loader`,f=i=>{let a,c=new Promise((e,t)=>a=t);l=()=>a(),e.signal.addEventListener(`abort`,l);let u=a=>typeof i==`function`?i({request:e,url:Ln(e,t),pattern:n,params:r.params,context:s},...a===void 0?[]:[a]):Promise.reject(Error(`You cannot call the handler for a route which defines a boolean "${d}" [routeId: ${r.route.id}]`)),f=(async()=>{try{return{type:`data`,result:await(o?o(e=>u(e)):u())}}catch(e){return{type:`error`,result:e}}})();return Promise.race([f,c])};try{let t=u?r.route.action:r.route.loader;if(i||a){if(t){let e,[n]=await Promise.all([f(t).catch(t=>{e=t}),i,a]);if(e!==void 0)throw e;c=n}else{await i;let t=u?r.route.action:r.route.loader;if(t)[c]=await Promise.all([f(t),a]);else if(d===`action`){let t=new URL(e.url),n=t.pathname+t.search;throw Kn(405,{method:e.method,pathname:n,routeId:r.route.id})}else return{type:`data`,result:void 0}}}else if(t)c=await f(t);else{let t=new URL(e.url);throw Kn(404,{pathname:t.pathname+t.search})}}catch(e){return{type:`error`,result:e}}finally{l&&e.signal.removeEventListener(`abort`,l)}return c}async function An(e){let t=e.headers.get(`Content-Type`);return t&&/\bapplication\/json\b/.test(t)?e.body==null?null:e.json():e.text()}async function jn(e){let{result:t,type:n}=e;if(rr(t)){let e;try{e=await An(t)}catch(e){return{type:`error`,error:e}}return n===`error`?{type:`error`,error:new bt(t.status,t.statusText,e),statusCode:t.status,headers:t.headers}:{type:`data`,data:e,statusCode:t.status,headers:t.headers}}return n===`error`?nr(t)?t.data instanceof Error?{type:`error`,error:t.data,statusCode:t.init?.status,headers:t.init?.headers?new Headers(t.init.headers):void 0}:{type:`error`,error:Xn(t),statusCode:xt(t)?t.status:void 0,headers:t.init?.headers?new Headers(t.init.headers):void 0}:{type:`error`,error:t,statusCode:xt(t)?t.status:void 0}:nr(t)?{type:`data`,data:t.data,statusCode:t.init?.status,headers:t.init?.headers?new Headers(t.init.headers):void 0}:{type:`data`,data:t}}function Mn(e,t,n,r,i){let a=e.headers.get(`Location`);if(F(a,`Redirects returned/thrown from loaders/actions must have a Location header`),!ot(a)){let o=r.slice(0,r.findIndex(e=>e.route.id===n)+1);a=on(new URL(t.url),o,i,a),e.headers.set(`Location`,a)}return e}var Nn=[`about:`,`blob:`,`chrome:`,`chrome-untrusted:`,`content:`,`data:`,`devtools:`,`file:`,`filesystem:`,`javascript:`];function Pn(e){try{return Nn.includes(new URL(e).protocol)}catch{return!1}}function Fn(e,t,n,r){if(ot(e)){let r=e,i=N.test(r)?new URL(P(r,t.protocol)):new URL(r);if(Pn(i.toString()))throw Error(`Invalid redirect location`);let a=it(i.pathname,n)!=null;if(i.origin===t.origin&&a)return pt(i.pathname)+i.search+i.hash}try{if(Pn(r.createURL(e).toString()))throw Error(`Invalid redirect location`)}catch{}return e}function In(e,t,n,r){let i=e.createURL(Jn(t)).toString(),a={signal:n};if(r&&sr(r.formMethod)){let{formMethod:e,formEncType:t}=r;a.method=e.toUpperCase(),t===`application/json`?(a.headers=new Headers({"Content-Type":t}),a.body=JSON.stringify(r.json)):a.body=t===`text/plain`?r.text:t===`application/x-www-form-urlencoded`&&r.formData?Rn(r.formData):r.formData}return new Request(i,a)}function Ln(e,t){let n=new URL(e.url),r=typeof t==`string`?Te(t):t;if(n.pathname=r.pathname||`/`,r.search){let e=new URLSearchParams(r.search),t=e.getAll(`index`);e.delete(`index`);for(let n of t.filter(Boolean))e.append(`index`,n);n.search=e.size?`?${e.toString()}`:``}else n.search=``;return n.hash=r.hash||``,n}function Rn(e){let t=new URLSearchParams;for(let[n,r]of e.entries())t.append(n,typeof r==`string`?r:r.name);return t}function zn(e){let t=new FormData;for(let[n,r]of e.entries())t.append(n,r);return t}function Bn(e,t,n,r=!1,i=!1){let a={},o=null,s,c=!1,l={},u=n&&er(n[1])?n[1].error:void 0;return e.forEach(n=>{if(!(n.route.id in t))return;let d=n.route.id,f=t[d];if(F(!tr(f),`Cannot handle redirect results in processLoaderData`),er(f)){let t=f.error;if(u!==void 0&&(t=u,u=void 0),o||={},i)o[d]=t;else{let n=Wn(e,d);o[n.route.id]??(o[n.route.id]=t)}r||(a[d]=Zt),c||(c=!0,s=xt(f.error)?f.error.status:500),f.headers&&(l[d]=f.headers)}else a[d]=f.data,f.statusCode&&f.statusCode!==200&&!c&&(s=f.statusCode),f.headers&&(l[d]=f.headers)}),u!==void 0&&n&&(o={[n[0]]:u},n[2]&&(a[n[2]]=void 0)),{loaderData:a,errors:o,statusCode:s||200,loaderHeaders:l}}function Vn(e,t,n,r,i,a,o){let{loaderData:s,errors:c}=Bn(t,n,r);return i.filter(e=>!e.matches||e.matches.some(e=>e.shouldLoad)).forEach(t=>{let{key:n,match:r,controller:i}=t;if(i&&i.signal.aborted)return;let s=a[n];if(F(s,`Did not find corresponding fetcher result`),er(s)){let t=Wn(e.matches,r?.route.id);c&&c[t.route.id]||(c={...c,[t.route.id]:s.error}),o.delete(n)}else if(tr(s))F(!1,`Unhandled fetcher revalidation redirect`);else{let e=hr(s.data);o.set(n,e)}}),{loaderData:s,errors:c}}function Hn(e,t,n,r){let i=Object.entries(t).filter(([,e])=>e!==Zt).reduce((e,[t,n])=>(e[t]=n,e),{});for(let a of n){let n=a.route.id;if(!t.hasOwnProperty(n)&&e.hasOwnProperty(n)&&a.route.loader&&(i[n]=e[n]),r&&r.hasOwnProperty(n))break}return i}function Un(e){return e?er(e[1])?{actionData:{}}:{actionData:{[e[0]]:e[1].data}}:{}}function Wn(e,t){return(t?e.slice(0,e.findIndex(e=>e.route.id===t)+1):[...e]).reverse().find(e=>e.route.hasErrorBoundary===!0)||e[0]}function Gn(e){let t=e.length===1?e[0]:e.find(e=>e.index||!e.path||e.path===`/`)||{id:`__shim-error-route__`};return{matches:[{params:{},pathname:``,pathnameBase:``,route:t}],route:t}}function Kn(e,{pathname:t,routeId:n,method:r,type:i,message:a}={}){let o=`Unknown Server Error`,s=`Unknown @remix-run/router error`;return e===400?(o=`Bad Request`,r&&t&&n?s=`You made a ${r} request to "${t}" but did not provide a \`loader\` for route "${n}", so there is no way to handle the request.`:i===`invalid-body`&&(s=`Unable to encode submission body`)):e===403?(o=`Forbidden`,s=`Route "${n}" does not match URL "${t}"`):e===404?(o=`Not Found`,s=`No route matches URL "${t}"`):e===405&&(o=`Method Not Allowed`,r&&t&&n?s=`You made a ${r.toUpperCase()} request to "${t}" but did not provide an \`action\` for route "${n}", so there is no way to handle the request.`:r&&(s=`Invalid request method "${r.toUpperCase()}"`)),new bt(e||500,o,Error(s),!0)}function qn(e){let t=Object.entries(e);for(let e=t.length-1;e>=0;e--){let[n,r]=t[e];if(tr(r))return{key:n,result:r}}}function Jn(e){return we({...typeof e==`string`?Te(e):e,hash:``})}function Yn(e,t){return e.pathname!==t.pathname||e.search!==t.search?!1:e.hash===``?t.hash!==``:e.hash===t.hash||t.hash!==``}function Xn(e){return new bt(e.init?.status??500,e.init?.statusText??`Internal Server Error`,e.data)}function Zn(e){return typeof e==`object`&&!!e&&Object.entries(e).every(([e,t])=>typeof e==`string`&&Qn(t))}function Qn(e){return typeof e==`object`&&!!e&&`type`in e&&`result`in e&&(e.type===`data`||e.type===`error`)}function $n(e){return rr(e.result)&&Gt.has(e.result.status)}function er(e){return e.type===`error`}function tr(e){return(e&&e.type)===`redirect`}function nr(e){return typeof e==`object`&&!!e&&`type`in e&&`data`in e&&`init`in e&&e.type===`DataWithResponseInit`}function rr(e){return e!=null&&typeof e.status==`number`&&typeof e.statusText==`string`&&typeof e.headers==`object`&&e.body!==void 0}function ir(e){return Gt.has(e)}function ar(e){return rr(e)&&ir(e.status)&&e.headers.has(`Location`)}function or(e){return Wt.has(e.toUpperCase())}function sr(e){return Ht.has(e.toUpperCase())}function cr(e){return new URLSearchParams(e).getAll(`index`).some(e=>e===``)}function lr(e,t){let n=typeof t==`string`?Te(t).search:t.search;if(e[e.length-1].route.index&&cr(n||``))return e[e.length-1];let r=ut(e);return r[r.length-1]}function ur(e){let{formMethod:t,formAction:n,formEncType:r,text:i,formData:a,json:o}=e;if(t&&n&&r){if(i!=null)return{formMethod:t,formAction:n,formEncType:r,formData:void 0,json:void 0,text:i};if(a!=null)return{formMethod:t,formAction:n,formEncType:r,formData:a,json:void 0,text:void 0};if(o!==void 0)return{formMethod:t,formAction:n,formEncType:r,formData:void 0,json:o,text:void 0}}}function dr(e,t,n,r){return r?{state:`loading`,location:e,matches:t,historyAction:n,formMethod:r.formMethod,formAction:r.formAction,formEncType:r.formEncType,formData:r.formData,json:r.json,text:r.text}:{state:`loading`,location:e,matches:t,historyAction:n,formMethod:void 0,formAction:void 0,formEncType:void 0,formData:void 0,json:void 0,text:void 0}}function fr(e,t,n,r){return{state:`submitting`,location:e,matches:t,historyAction:n,formMethod:r.formMethod,formAction:r.formAction,formEncType:r.formEncType,formData:r.formData,json:r.json,text:r.text}}function pr(e,t){return e?{state:`loading`,formMethod:e.formMethod,formAction:e.formAction,formEncType:e.formEncType,formData:e.formData,json:e.json,text:e.text,data:t}:{state:`loading`,formMethod:void 0,formAction:void 0,formEncType:void 0,formData:void 0,json:void 0,text:void 0,data:t}}function mr(e,t){return{state:`submitting`,formMethod:e.formMethod,formAction:e.formAction,formEncType:e.formEncType,formData:e.formData,json:e.json,text:e.text,data:t?t.data:void 0}}function hr(e){return{state:`idle`,formMethod:void 0,formAction:void 0,formEncType:void 0,formData:void 0,json:void 0,text:void 0,data:e}}function gr(e,t){try{let n=e.sessionStorage.getItem(Xt);if(n){let e=JSON.parse(n);for(let[n,r]of Object.entries(e||{}))r&&Array.isArray(r)&&t.set(n,new Set(r||[]))}}catch{}}function _r(e,t){if(t.size>0){let n={};for(let[e,r]of t)n[e]=[...r];try{e.sessionStorage.setItem(Xt,JSON.stringify(n))}catch(e){I(!1,`Failed to save applied view transitions in sessionStorage (${e}).`)}}}function vr(){let e,t,n=new Promise((r,i)=>{e=async e=>{r(e);try{await n}catch{}},t=async e=>{i(e);try{await n}catch{}}});return{promise:n,resolve:e,reject:t}}var yr=A.createContext(null);yr.displayName=`DataRouter`;var br=A.createContext(null);br.displayName=`DataRouterState`;var xr=A.createContext(!1);function Sr(){return A.useContext(xr)}var Cr=A.createContext({isTransitioning:!1});Cr.displayName=`ViewTransition`;var wr=A.createContext(new Map);wr.displayName=`Fetchers`;var Tr=A.createContext(null);Tr.displayName=`Await`;var Er=A.createContext(null);Er.displayName=`Navigation`;var Dr=A.createContext(null);Dr.displayName=`Location`;var Or=A.createContext({outlet:null,matches:[],isDataRoute:!1});Or.displayName=`Route`;var kr=A.createContext(null);kr.displayName=`RouteError`;var Ar=`REACT_ROUTER_ERROR`,jr=`REDIRECT`,Mr=`ROUTE_ERROR_RESPONSE`;function Nr(e){if(e.startsWith(`${Ar}:${jr}:{`))try{let t=JSON.parse(e.slice(28));if(typeof t==`object`&&t&&typeof t.status==`number`&&typeof t.statusText==`string`&&typeof t.location==`string`&&typeof t.reloadDocument==`boolean`&&typeof t.replace==`boolean`)return t}catch{}}function Pr(e){if(e.startsWith(`${Ar}:${Mr}:{`))try{let t=JSON.parse(e.slice(40));if(typeof t==`object`&&t&&typeof t.status==`number`&&typeof t.statusText==`string`)return new bt(t.status,t.statusText,t.data)}catch{}}function Fr(e,{relative:t}={}){F(Ir(),`useHref() may be used only in the context of a component.`);let{basename:n,navigator:r}=A.useContext(Er),{hash:i,pathname:a,search:o}=Gr(e,{relative:t}),s=a;return n!==`/`&&(s=a===`/`?n:mt([n,a])),r.createHref({pathname:s,search:o,hash:i})}function Ir(){return A.useContext(Dr)!=null}function Lr(){return F(Ir(),`useLocation() may be used only in the context of a component.`),A.useContext(Dr).location}var Rr=`You should call navigate() in a React.useEffect(), not when your component is first rendered.`;function zr(e){A.useContext(Er).static||A.useLayoutEffect(e)}function Br(){let{isDataRoute:e}=A.useContext(Or);return e?si():Vr()}function Vr(){F(Ir(),`useNavigate() may be used only in the context of a component.`);let e=A.useContext(yr),{basename:t,navigator:n}=A.useContext(Er),{matches:r}=A.useContext(Or),{pathname:i}=Lr(),a=JSON.stringify(dt(r)),o=A.useRef(!1);return zr(()=>{o.current=!0}),A.useCallback((r,s={})=>{if(I(o.current,Rr),!o.current)return;if(typeof r==`number`){n.go(r);return}let c=ft(r,JSON.parse(a),i,s.relative===`path`);e==null&&t!==`/`&&(c.pathname=c.pathname===`/`?t:mt([t,c.pathname])),Bt(typeof r==`string`?r:we(r),n.createHref(c),Lt(n),`reject`),(s.replace?n.replace:n.push)(c,s.state,s)},[t,n,a,i,e])}var Hr=A.createContext(null);function Ur(e){let t=A.useContext(Or).outlet;return A.useMemo(()=>t&&A.createElement(Hr.Provider,{value:e},t),[t,e])}function Wr(){let{matches:e}=A.useContext(Or);return e[e.length-1]?.params??{}}function Gr(e,{relative:t}={}){let{matches:n}=A.useContext(Or),{pathname:r}=Lr(),i=JSON.stringify(dt(n));return A.useMemo(()=>ft(e,JSON.parse(i),r,t===`path`),[e,i,r,t])}function Kr(e,t,n){F(Ir(),`useRoutes() may be used only in the context of a component.`);let{navigator:r}=A.useContext(Er),{matches:i}=A.useContext(Or),a=i[i.length-1],o=a?a.params:{},s=a?a.pathname:`/`,c=a?a.pathnameBase:`/`,l=a&&a.route;{let e=l&&l.path||``;li(s,!l||e.endsWith(`*`)||e.endsWith(`*?`),`You rendered descendant (or called \`useRoutes()\`) at "${s}" (under ) but the parent route path has no trailing "*". This means if you navigate deeper, the parent won't match anymore and therefore the child routes will never render. - -Please change the parent to .`)}let u=Lr(),d;if(t){let e=typeof t==`string`?Te(t):t;F(c===`/`||e.pathname?.startsWith(c),`When overriding the location using \`\` or \`useRoutes(routes, location)\`, the location pathname must begin with the portion of the URL pathname that was matched by all parent routes. The current pathname base is "${c}" but pathname "${e.pathname}" was given in the \`location\` prop.`),d=e}else d=u;let f=d.pathname||`/`,p=f;if(c!==`/`){let e=c.replace(/^\//,``).split(`/`);p=`/`+f.replace(/^\//,``).split(`/`).slice(e.length).join(`/`)}let m=n&&n.state.matches.length?n.state.matches.map(e=>Object.assign(e,{route:n.manifest[e.route.id]||e.route})):Le(e,{pathname:p});I(l||m!=null,`No routes matched location "${d.pathname}${d.search}${d.hash}" `),I(m==null||m[m.length-1].route.element!==void 0||m[m.length-1].route.Component!==void 0||m[m.length-1].route.lazy!==void 0,`Matched leaf route at location "${d.pathname}${d.search}${d.hash}" does not have an element or Component. This means it will render an with a null value by default resulting in an "empty" page.`);let h=$r(m&&m.map(e=>Object.assign({},e,{params:Object.assign({},o,e.params),pathname:mt([c,r.encodeLocation?r.encodeLocation(e.pathname.replace(/%/g,`%25`).replace(/\?/g,`%3F`).replace(/#/g,`%23`)).pathname:e.pathname]),pathnameBase:e.pathnameBase===`/`?c:mt([c,r.encodeLocation?r.encodeLocation(e.pathnameBase.replace(/%/g,`%25`).replace(/\?/g,`%3F`).replace(/#/g,`%23`)).pathname:e.pathnameBase])})),i,n);return t&&h?A.createElement(Dr.Provider,{value:{location:{pathname:`/`,search:``,hash:``,state:null,key:`default`,mask:void 0,...d},navigationType:`POP`}},h):h}function qr(){let e=oi(),t=xt(e)?`${e.status} ${e.statusText}`:e instanceof Error?e.message:JSON.stringify(e),n=e instanceof Error?e.stack:null,r=`rgba(200,200,200, 0.5)`,i={padding:`0.5rem`,backgroundColor:r},a={padding:`2px 4px`,backgroundColor:r},o=null;return console.error(`Error handled by React Router default ErrorBoundary:`,e),o=A.createElement(A.Fragment,null,A.createElement(`p`,null,`💿 Hey developer 👋`),A.createElement(`p`,null,`You can provide a way better UX than this when your app throws errors by providing your own `,A.createElement(`code`,{style:a},`ErrorBoundary`),` or`,` `,A.createElement(`code`,{style:a},`errorElement`),` prop on your route.`)),A.createElement(A.Fragment,null,A.createElement(`h2`,null,`Unexpected Application Error!`),A.createElement(`h3`,{style:{fontStyle:`italic`}},t),n?A.createElement(`pre`,{style:i},n):null,o)}var Jr=A.createElement(qr,null),Yr=class extends A.Component{constructor(e){super(e),this.state={location:e.location,revalidation:e.revalidation,error:e.error}}static getDerivedStateFromError(e){return{error:e}}static getDerivedStateFromProps(e,t){return t.location!==e.location||t.revalidation!==`idle`&&e.revalidation===`idle`?{error:e.error,location:e.location,revalidation:e.revalidation}:{error:e.error===void 0?t.error:e.error,location:t.location,revalidation:e.revalidation||t.revalidation}}componentDidCatch(e,t){this.props.onError?this.props.onError(e,t):console.error(`React Router caught the following error during render`,e)}render(){let e=this.state.error;if(this.context&&typeof e==`object`&&e&&`digest`in e&&typeof e.digest==`string`){let t=Pr(e.digest);t&&(e=t)}let t=e===void 0?this.props.children:A.createElement(Or.Provider,{value:this.props.routeContext},A.createElement(kr.Provider,{value:e,children:this.props.component}));return this.context?A.createElement(Zr,{error:e},t):t}};Yr.contextType=xr;var Xr=new WeakMap;function Zr({children:e,error:t}){let{basename:n,navigator:r}=A.useContext(Er);if(typeof t==`object`&&t&&`digest`in t&&typeof t.digest==`string`){let e=Nr(t.digest);if(e){let i=Xr.get(t);if(i)throw i;let a=wt(e.location,n),o=a.absoluteURL||a.to;if(Bt(e.location,o,Lt(r),`allow-explicit`),Pn(o))throw Error(`Invalid redirect location`);if(Ct&&!Xr.get(t)){if(a.isExternal||e.reloadDocument)window.location.href=o;else{let n=Promise.resolve().then(()=>window.__reactRouterDataRouter.navigate(a.to,{replace:e.replace}));throw Xr.set(t,n),n}}return A.createElement(`meta`,{httpEquiv:`refresh`,content:`0;url=${o}`})}}return e}function Qr({routeContext:e,match:t,children:n}){let r=A.useContext(yr);return r&&r.static&&r.staticContext&&(t.route.errorElement||t.route.ErrorBoundary)&&(r.staticContext._deepestRenderedBoundaryId=t.route.id),A.createElement(Or.Provider,{value:e},n)}function $r(e,t=[],n){let r=n?.state;if(e==null){if(!r)return null;if(r.errors)e=r.matches;else if(t.length===0&&!r.initialized&&r.matches.length>0)e=r.matches;else return null}let i=e,a=r?.errors;if(a!=null){let e=i.findIndex(e=>e.route.id&&a?.[e.route.id]!==void 0);F(e>=0,`Could not find a matching route for errors on route IDs: ${Object.keys(a).join(`,`)}`),i=i.slice(0,Math.min(i.length,e+1))}let o=!1,s=-1;if(n&&r){o=r.renderFallback;for(let e=0;e=0?i.slice(0,s+1):[i[0]];break}}}}let c=n?.onError,l=r&&c?(e,t)=>{c(e,{location:r.location,params:r.matches?.[0]?.params??{},pattern:St(r.matches),errorInfo:t})}:void 0;return i.reduceRight((e,n,c)=>{let u,d=!1,f=null,p=null;r&&(u=a&&n.route.id?a[n.route.id]:void 0,f=n.route.errorElement||Jr,o&&(s<0&&c===0?(li(`route-fallback`,!1,"No `HydrateFallback` element provided to render during initial hydration"),d=!0,p=null):s===c&&(d=!0,p=n.route.hydrateFallbackElement||null)));let m=t.concat(i.slice(0,c+1)),h=()=>{let t;return t=u?f:d?p:n.route.Component?A.createElement(n.route.Component,null):n.route.element?n.route.element:e,A.createElement(Qr,{match:n,routeContext:{outlet:e,matches:m,isDataRoute:r!=null},children:t})};return r&&(n.route.ErrorBoundary||n.route.errorElement||c===0)?A.createElement(Yr,{location:r.location,revalidation:r.revalidation,component:f,error:u,children:h(),routeContext:{outlet:null,matches:m,isDataRoute:!0},onError:l}):h()},null)}function ei(e){return`${e} must be used within a data router. See https://reactrouter.com/en/main/routers/picking-a-router.`}function ti(e){let t=A.useContext(yr);return F(t,ei(e)),t}function ni(e){let t=A.useContext(br);return F(t,ei(e)),t}function ri(e){let t=A.useContext(Or);return F(t,ei(e)),t}function ii(e){let t=ri(e),n=t.matches[t.matches.length-1];return F(n.route.id,`${e} can only be used on routes that contain a unique "id"`),n.route.id}function ai(){return ii(`useRouteId`)}function oi(){let e=A.useContext(kr),t=ni(`useRouteError`),n=ii(`useRouteError`);return e===void 0?t.errors?.[n]:e}function si(){let{router:e}=ti(`useNavigate`),t=ii(`useNavigate`),n=A.useRef(!1);return zr(()=>{n.current=!0}),A.useCallback(async(r,i={})=>{I(n.current,Rr),n.current&&(typeof r==`number`?await e.navigate(r):await e.navigate(r,{fromRouteId:t,...i}))},[e,t])}var ci={};function li(e,t,n){!t&&!ci[e]&&(ci[e]=!0,I(!1,n))}var ui={};function di(e,t){!e&&!ui[t]&&(ui[t]=!0,console.warn(t))}var fi=A.useOptimistic,pi=()=>void 0;function mi(e){return fi?fi(e):[e,pi]}function hi(e){let t={hasErrorBoundary:e.hasErrorBoundary||e.ErrorBoundary!=null||e.errorElement!=null};return e.Component&&(e.element&&I(!1,"You should not include both `Component` and `element` on your route - `Component` will be used."),Object.assign(t,{element:A.createElement(e.Component),Component:void 0})),e.HydrateFallback&&(e.hydrateFallbackElement&&I(!1,"You should not include both `HydrateFallback` and `hydrateFallbackElement` on your route - `HydrateFallback` will be used."),Object.assign(t,{hydrateFallbackElement:A.createElement(e.HydrateFallback),HydrateFallback:void 0})),e.ErrorBoundary&&(e.errorElement&&I(!1,"You should not include both `ErrorBoundary` and `errorElement` on your route - `ErrorBoundary` will be used."),Object.assign(t,{errorElement:A.createElement(e.ErrorBoundary),ErrorBoundary:void 0})),t}var gi=[`HydrateFallback`,`hydrateFallbackElement`],_i=class{constructor(){this.status=`pending`,this.promise=new Promise((e,t)=>{this.resolve=t=>{this.status===`pending`&&(this.status=`resolved`,e(t))},this.reject=e=>{this.status===`pending`&&(this.status=`rejected`,t(e))}})}};function vi({router:e,flushSync:t,onError:n,useTransitions:r}){r=Sr()||r;let[i,a]=A.useState(e.state),[o,s]=mi(i),[c,l]=A.useState(),[u,d]=A.useState({isTransitioning:!1}),[f,p]=A.useState(),[m,h]=A.useState(),[g,_]=A.useState(),v=A.useRef(new Map),y=A.useCallback((i,{deletedFetchers:o,newErrors:c,flushSync:u,viewTransitionOpts:g})=>{c&&n&&Object.values(c).forEach(e=>n(e,{location:i.location,params:i.matches[0]?.params??{},pattern:St(i.matches)})),i.fetchers.forEach((e,t)=>{e.data!==void 0&&v.current.set(t,e.data)}),o.forEach(e=>v.current.delete(e)),di(u===!1||t!=null,'You provided the `flushSync` option to a router update, but you are not using the `` from `react-router/dom` so `ReactDOM.flushSync()` is unavailable. Please update your app to `import { RouterProvider } from "react-router/dom"` and ensure you have `react-dom` installed as a dependency to use the `flushSync` option.');let y=e.window!=null&&e.window.document!=null&&typeof e.window.document.startViewTransition==`function`;if(di(g==null||y,"You provided the `viewTransition` option to a router update, but you do not appear to be running in a DOM environment as `window.startViewTransition` is not available."),!g||!y){t&&u?t(()=>a(i)):r===!1?a(i):A.startTransition(()=>{r===!0&&s(e=>yi(e,i)),a(i)});return}if(t&&u){t(()=>{m&&(f?.resolve(),m.skipTransition()),d({isTransitioning:!0,flushSync:!0,currentLocation:g.currentLocation,nextLocation:g.nextLocation})});let n=e.window.document.startViewTransition(()=>{t(()=>a(i))});n.finished.finally(()=>{t(()=>{p(void 0),h(void 0),l(void 0),d({isTransitioning:!1})})}),t(()=>h(n));return}m?(f?.resolve(),m.skipTransition(),_({state:i,currentLocation:g.currentLocation,nextLocation:g.nextLocation})):(l(i),d({isTransitioning:!0,flushSync:!1,currentLocation:g.currentLocation,nextLocation:g.nextLocation}))},[e.window,t,m,f,r,s,n]);A.useLayoutEffect(()=>e.subscribe(y),[e,y]),A.useEffect(()=>{u.isTransitioning&&!u.flushSync&&p(new _i)},[u]),A.useEffect(()=>{if(f&&c&&e.window){let t=c,n=f.promise,i=e.window.document.startViewTransition(async()=>{r===!1?a(t):A.startTransition(()=>{r===!0&&s(e=>yi(e,t)),a(t)}),await n});i.finished.finally(()=>{p(void 0),h(void 0),l(void 0),d({isTransitioning:!1})}),h(i)}},[c,f,e.window,r,s]),A.useEffect(()=>{f&&c&&o.location.key===c.location.key&&f.resolve()},[f,m,o.location,c]),A.useEffect(()=>{!u.isTransitioning&&g&&(l(g.state),d({isTransitioning:!0,flushSync:!1,currentLocation:g.currentLocation,nextLocation:g.nextLocation}),_(void 0))},[u.isTransitioning,g]);let b=A.useMemo(()=>({createHref:e.createHref,createURL:e.createURL,encodeLocation:e.encodeLocation,go:t=>e.navigate(t),push:(t,n,r)=>e.navigate(t,{state:n,preventScrollReset:r?.preventScrollReset}),replace:(t,n,r)=>e.navigate(t,{replace:!0,state:n,preventScrollReset:r?.preventScrollReset})}),[e]),x=e.basename||`/`,S=A.useMemo(()=>({router:e,navigator:b,static:!1,basename:x,onError:n}),[e,b,x,n]);return A.createElement(A.Fragment,null,A.createElement(yr.Provider,{value:S},A.createElement(br.Provider,{value:o},A.createElement(wr.Provider,{value:v.current},A.createElement(Cr.Provider,{value:u},A.createElement(wi,{basename:x,location:o.location,navigationType:o.historyAction,navigator:b,useTransitions:r},A.createElement(bi,{routes:e.routes,manifest:e.manifest,future:e.future,state:o,isStatic:!1,onError:n})))))),null)}function yi(e,t){return{...e,navigation:t.navigation.state===`idle`?e.navigation:t.navigation,revalidation:t.revalidation===`idle`?e.revalidation:t.revalidation,actionData:t.navigation.state===`submitting`?e.actionData:t.actionData,fetchers:t.fetchers}}var bi=A.memo(xi);function xi({routes:e,manifest:t,future:n,state:r,isStatic:i,onError:a}){return Kr(e,void 0,{manifest:t,state:r,isStatic:i,onError:a,future:n})}function Si({to:e,replace:t,state:n,relative:r}){F(Ir(),` may be used only in the context of a component.`);let{static:i,navigator:a}=A.useContext(Er);I(!i,` must not be used on the initial render in a . This is a no-op, but you should modify your code so the is only ever rendered in response to some user interaction or state change.`);let{matches:o}=A.useContext(Or),{pathname:s}=Lr(),c=Br(),l=ft(e,dt(o),s,r===`path`);Bt(typeof e==`string`?e:we(e),a.createHref(l),Lt(a),`reject`);let u=JSON.stringify(l);return A.useEffect(()=>{c(JSON.parse(u),{replace:t,state:n,relative:r})},[c,u,r,t,n]),null}function Ci(e){return Ur(e.context)}function wi({basename:e=`/`,children:t=null,location:n,navigationType:r=`POP`,navigator:i,static:a=!1,useTransitions:o}){F(!Ir(),`You cannot render a inside another . You should never have more than one in your app.`);let s=e.replace(/^\/*/,`/`),c=A.useMemo(()=>({basename:s,navigator:i,static:a,useTransitions:o,future:{}}),[s,i,a,o]);typeof n==`string`&&(n=Te(n));let{pathname:l=`/`,search:u=``,hash:d=``,state:f=null,key:p=`default`,mask:m}=n,h=A.useMemo(()=>{let e=it(l,s);return e==null?null:{location:{pathname:e,search:u,hash:d,state:f,key:p,mask:m},navigationType:r}},[s,l,u,d,f,p,r,m]);return I(h!=null,` is not able to match the URL "${l}${u}${d}" because it does not start with the basename, so the won't render anything.`),h==null?null:A.createElement(Er.Provider,{value:c},A.createElement(Dr.Provider,{children:t,value:h}))}A.Component;var Ti=`get`,Ei=`application/x-www-form-urlencoded`;function Di(e){return typeof HTMLElement<`u`&&e instanceof HTMLElement}function Oi(e){return Di(e)&&e.tagName.toLowerCase()===`button`}function ki(e){return Di(e)&&e.tagName.toLowerCase()===`form`}function Ai(e){return Di(e)&&e.tagName.toLowerCase()===`input`}function ji(e){return!!(e.metaKey||e.altKey||e.ctrlKey||e.shiftKey)}function Mi(e,t){return e.button===0&&(!t||t===`_self`)&&!ji(e)}var Ni=null;function Pi(){if(Ni===null)try{new FormData(document.createElement(`form`),0),Ni=!1}catch{Ni=!0}return Ni}var Fi=new Set([`application/x-www-form-urlencoded`,`multipart/form-data`,`text/plain`]);function Ii(e){return e!=null&&!Fi.has(e)?(I(!1,`"${e}" is not a valid \`encType\` for \`
\`/\`\` and will default to "${Ei}"`),null):e}function Li(e,t){let n,r,i,a,o;if(ki(e)){let o=e.getAttribute(`action`);r=o?it(o,t):null,n=e.getAttribute(`method`)||Ti,i=Ii(e.getAttribute(`enctype`))||Ei,a=new FormData(e)}else if(Oi(e)||Ai(e)&&(e.type===`submit`||e.type===`image`)){let o=e.form;if(o==null)throw Error(`Cannot submit a + + + {/* Progress Bar */} +
+
+
+ + {/* Form Body */} +
+ {errorMsg && ( +
+ + {errorMsg} +
+ )} + + {/* STEP 1: General Info */} + {step === 1 && ( +
+
+ + setName(e.target.value)} + placeholder={RU_KCC.connectServer.serverNamePlaceholder} + className="w-full min-h-[44px] px-3 py-2 bg-krona-workspace rounded-xl border border-krona-border text-krona-primary text-xs focus:outline-hidden focus:ring-1 focus:ring-krona-gold" + data-testid="input-server-name" + /> +
+ +
+
+ + setIpAddress(e.target.value)} + placeholder={RU_KCC.connectServer.ipAddressPlaceholder} + className="w-full min-h-[44px] px-3 py-2 bg-krona-workspace rounded-xl border border-krona-border text-krona-primary text-xs font-mono focus:outline-hidden focus:ring-1 focus:ring-krona-gold" + data-testid="input-server-ip" + /> +
+ +
+ + setHostname(e.target.value)} + placeholder={RU_KCC.connectServer.hostnamePlaceholder} + className="w-full min-h-[44px] px-3 py-2 bg-krona-workspace rounded-xl border border-krona-border text-krona-primary text-xs font-mono focus:outline-hidden focus:ring-1 focus:ring-krona-gold" + /> +
+
+ +
+
+ + +
+ +
+ + setRegion(e.target.value)} + placeholder={RU_KCC.connectServer.regionPlaceholder} + className="w-full min-h-[44px] px-3 py-2 bg-krona-workspace rounded-xl border border-krona-border text-krona-primary text-xs focus:outline-hidden focus:ring-1 focus:ring-krona-gold" + /> +
+
+
+ )} + + {/* STEP 2: SSH Settings */} + {step === 2 && ( +
+
+
+ + setPort(Number(e.target.value))} + className="w-full min-h-[44px] px-3 py-2 bg-krona-workspace rounded-xl border border-krona-border text-krona-primary text-xs font-mono focus:outline-hidden focus:ring-1 focus:ring-krona-gold" + data-testid="input-ssh-port" + /> +
+ +
+ + setUsername(e.target.value)} + placeholder="krona или root" + className="w-full min-h-[44px] px-3 py-2 bg-krona-workspace rounded-xl border border-krona-border text-krona-primary text-xs font-mono focus:outline-hidden focus:ring-1 focus:ring-krona-gold" + data-testid="input-ssh-username" + /> +
+
+ +
+ +
+ + + +
+
+ + {authMethod === 'key' ? ( +
+
+ + +
+
+