krona-front/dist/assets/DynamicFormRenderer-0ioSXYKX.js

3 lines
No EOL
36 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import{c as e,f as t,h as n,i as r,l as i,r as a,s as o,t as s,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(;n<e.length;){let r=e[n];if(/\s/.test(r)){n++;continue}if(r===`{`){let r=e.indexOf(`}`,n);if(r===-1)throw Error(`Незакрытая фигурная скобка в ссылке на поле`);let i=e.slice(n+1,r).trim();t.push({type:`FIELD_REF`,value:i}),n=r+1;continue}if(r===`+`){t.push({type:`PLUS`,value:`+`}),n++;continue}if(r===`-`){t.push({type:`MINUS`,value:`-`}),n++;continue}if(r===`*`){t.push({type:`MUL`,value:`*`}),n++;continue}if(r===`/`){t.push({type:`DIV`,value:`/`}),n++;continue}if(r===`%`){t.push({type:`MOD`,value:`%`}),n++;continue}if(r===`(`){t.push({type:`LPAREN`,value:`(`}),n++;continue}if(r===`)`){t.push({type:`RPAREN`,value:`)`}),n++;continue}if(r===`,`){t.push({type:`COMMA`,value:`,`}),n++;continue}if(/\d/.test(r)||r===`.`&&/\d/.test(e[n+1]||``)){let r=``;for(;n<e.length&&/[\d.]/.test(e[n]);)r+=e[n],n++;t.push({type:`NUMBER`,value:r,num:parseFloat(r)});continue}if(/[a-zA-Z_а-яёА-ЯЁ]/.test(r)){let r=``;for(;n<e.length&&/[a-zA-Z0-9_а-яёА-ЯЁ]/.test(e[n]);)r+=e[n],n++;let i=r.toLowerCase();if(j.has(i))throw Error(`Использование запрещённого идентификатора «${r}» в формуле`);t.push({type:`IDENT`,value:r});continue}throw Error(`Недопустимый символ в формуле: «${r}»`)}return t}var P=class{tokens;pos=0;context;constructor(e,t){this.tokens=e,this.context=t}peek(){return this.tokens[this.pos]}consume(e){let t=this.tokens[this.pos];if(!t)throw Error(`Неожиданный конец формулы`);if(e&&t.type!==e)throw Error(`Ожидался токен ${e}, получено ${t.type}`);return this.pos++,t}parse(){let e=this.parseExpression();if(this.pos<this.tokens.length)throw Error(`Лишние символы после формулы в позиции ${this.pos}`);return e}parseExpression(){let e=this.parseTerm();for(;this.peek()&&(this.peek().type===`PLUS`||this.peek().type===`MINUS`);){let t=this.consume().type,n=this.parseTerm();t===`PLUS`?e+=n:e-=n}return e}parseTerm(){let e=this.parseFactor();for(;this.peek()&&(this.peek().type===`MUL`||this.peek().type===`DIV`||this.peek().type===`MOD`);){let t=this.consume().type,n=this.parseFactor();if(t===`MUL`)e*=n;else if(t===`DIV`){if(n===0)throw Error(`Деление на ноль`);e/=n}else if(t===`MOD`){if(n===0)throw Error(`Деление по модулю на ноль`);e%=n}}return e}parseFactor(){let e=this.peek();if(!e)throw Error(`Неожиданный конец выражения`);return e.type===`PLUS`?(this.consume(),this.parseFactor()):e.type===`MINUS`?(this.consume(),-this.parseFactor()):this.parsePrimary()}parsePrimary(){let e=this.consume();if(e.type===`NUMBER`)return e.num??0;if(e.type===`FIELD_REF`)return this.resolveFieldValue(e.value);if(e.type===`IDENT`){let t=e.value.toLowerCase();return M.has(t)&&this.peek()?.type===`LPAREN`?this.parseFunctionCall(t):this.resolveFieldValue(e.value)}if(e.type===`LPAREN`){let e=this.parseExpression();return this.consume(`RPAREN`),e}throw Error(`Недопустимый элемент выражения: ${e.value}`)}parseFunctionCall(e){this.consume(`LPAREN`);let t=[];if(this.peek()?.type!==`RPAREN`)for(t.push(this.parseExpression());this.peek()?.type===`COMMA`;)this.consume(`COMMA`),t.push(this.parseExpression());switch(this.consume(`RPAREN`),e){case`round`:{let e=t[0]??0,n=10**(t[1]??0);return Math.round(e*n)/n}case`floor`:return Math.floor(t[0]??0);case`ceil`:return Math.ceil(t[0]??0);case`abs`:return Math.abs(t[0]??0);case`sqrt`:{let e=t[0]??0;if(e<0)throw Error(`Квадратный корень из отрицательного числа`);return Math.sqrt(e)}case`min`:return t.length===0?0:Math.min(...t);case`max`:return t.length===0?0:Math.max(...t);default:throw Error(`Неизвестная функция: ${e}`)}}resolveFieldValue(e){let t=this.context[e];if(t==null||t===``)return 0;if(typeof t==`number`)return t;if(typeof t==`boolean`)return+!!t;let n=parseFloat(String(t));return isNaN(n)?0:n}};function F(e,t){if(!e||!e.trim())return null;try{let n=N(e.trim());if(n.length===0)return null;let r=new P(n,t).parse();return isNaN(r)||!isFinite(r)?null:r}catch{return null}}function I(e,t){if(t?.defaultValue!==void 0)return t.defaultValue;switch(f(e)){case`text`:case`long_text`:case`rich_text`:case`phone`:case`email`:case`url`:case`date`:case`datetime`:case`time`:case`select`:case`radio`:case`status`:case`user`:case`employee`:case`team`:case`company`:case`contact`:case`product`:case`entity_relation`:case`autonumber`:case`formula`:return``;case`integer`:case`decimal`:case`percentage`:case`money`:return 0;case`boolean`:return!1;case`rating`:return 5;case`multi_select`:case`checkbox_group`:return[];case`color`:return`#2F684C`;case`file`:case`image`:return null;case`address`:return{street:``,city:``,postalCode:``,country:``};case`location`:return{lat:0,lng:0};case`json`:return`{}`;default:return``}}function L(e,t,n,r){let i=f(e);if(r?.required&&(t==null||t===``||Array.isArray(t)&&t.length===0||typeof t==`object`&&Object.keys(t).length===0))return{valid:!1,error:n?.customMessage||`Обязательное поле для заполнения`};if(t==null||t===``)return{valid:!0};if(typeof t==`string`){if(n?.minLength!==void 0&&t.length<n.minLength)return{valid:!1,error:`Минимальная длина: ${n.minLength} симв.`};if(n?.maxLength!==void 0&&t.length>n.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&&e<n.min?{valid:!1,error:`Минимум ${n.min}`}:n?.max!==void 0&&e>n.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&&e<n.min?{valid:!1,error:`Минимум ${n.min}`}:n?.max!==void 0&&e>n.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)(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};