3 lines
No EOL
36 KiB
JavaScript
3 lines
No EOL
36 KiB
JavaScript
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}; |