@fieldia/viewer 0.7.0 → 0.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bundle/fieldia.js +5 -3
- package/bundle/fieldia.js.map +2 -2
- package/package.json +3 -3
- package/src/lib/viewer.js +3 -0
- package/src/lib/viewer.js.map +1 -1
- package/src/lib/viewer.mjs +3 -0
- package/src/lib/viewer.mjs.map +1 -1
package/bundle/fieldia.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*! Fieldia 0.
|
|
1
|
+
/*! Fieldia 0.8.0 · MIT · https://fieldia.dev */
|
|
2
2
|
"use strict";var Fieldia=(()=>{var tt=Object.defineProperty;var Wn=Object.getOwnPropertyDescriptor;var zn=Object.getOwnPropertyNames;var jn=Object.prototype.hasOwnProperty;var Hn=(e,t,n)=>t in e?tt(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n;var Bn=(e,t)=>{for(var n in t)tt(e,n,{get:t[n],enumerable:!0})},qn=(e,t,n,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let a of zn(t))!jn.call(e,a)&&a!==n&&tt(e,a,{get:()=>t[a],enumerable:!(r=Wn(t,a))||r.enumerable});return e};var Jn=e=>qn(tt({},"__esModule",{value:!0}),e);var Ve=(e,t,n)=>Hn(e,typeof t!="symbol"?t+"":t,n);var jr={};Bn(jr,{DEFAULT_LABELS:()=>On,FIELDIA_CSS:()=>Mn,FIELD_NAME:()=>Zt,FIELD_TYPES:()=>nt,FORMAT_VERSION:()=>it,ICONS:()=>Cn,MESSAGES:()=>Te,VERSION:()=>zr,VIEWER_LABELS:()=>Ce,WIDGET_LABELS:()=>de,binaryWidget:()=>It,browserPreferences:()=>Ut,builtInWidgets:()=>Nn,charTagsWidget:()=>Tt,checkPage:()=>st,checkValue:()=>He,compileModifier:()=>Ae,createForm:()=>pt,createMemoryDataSource:()=>sn,createWidget:()=>ke,displayValue:()=>Vt,drawIcon:()=>et,emptyValue:()=>_e,evaluateModifier:()=>en,expressionContext:()=>Ke,fill:()=>lt,formatBytes:()=>Ye,formatNumber:()=>Pe,hostScheduler:()=>Ge,htmlWidget:()=>Ht,imageWidget:()=>Dt,initialValues:()=>ze,installStyles:()=>Jt,isEmpty:()=>je,isModifierValid:()=>tn,isoWeek:()=>wn,jsonWidget:()=>Bt,kindTextField:()=>mn,labelWidget:()=>Xe,lineForm:()=>gn,lineKind:()=>Me,linesWidget:()=>Ot,linkAddress:()=>Sn,linkCheckboxesWidget:()=>Ct,many2oneWidget:()=>Mt,matchesFilter:()=>ut,memoryPreferences:()=>Tr,mountViewer:()=>Kt,normalizeNumber:()=>At,openFormDialog:()=>St,openSearchDialog:()=>_t,progressbarWidget:()=>Ze,propertiesWidget:()=>zt,referenceWidget:()=>$t,sanitizeHtml:()=>jt,saveProblemOf:()=>ct,saveRefused:()=>on,statusbarWidget:()=>yt,summary:()=>ht,tagsWidget:()=>bt,translatePage:()=>dt,wait:()=>ft,wideColumns:()=>rt,withCalendar:()=>xt});var Zt=/^[A-Za-z_][A-Za-z0-9_]*$/,nt=["char","text","html","integer","float","monetary","boolean","date","datetime","selection","binary","image","many2one","many2many","one2many","reference","properties","json"];function rt(e){return typeof e=="object"?e.wide:e??1}var it="0.1";function Oe(e,t){switch(e.type){case"BinaryOp":return Un(e,t);case"UnaryOp":return _n(e,t);case"Literal":return e.value;case"Identifier":return Kn(t,e.name);default:throw new Error(`Unknown AST node type: ${e.type}`)}}function Un(e,t){let n=Xt(Oe(e.left,t)),r=Xt(Oe(e.right,t)),a=e.operator.toLowerCase(),i=n!==null&&r!==null;switch(a){case"==":return n===r;case"!=":case"<>":return n!==r;case"<":return i&&n<r;case">":return i&&n>r;case"<=":return i&&n<=r;case">=":return i&&n>=r;case"in":return Array.isArray(r)&&r.includes(n);case"not in":return Array.isArray(r)&&!r.includes(n);case"and":return Ee(n)&&Ee(r);case"or":return Ee(n)||Ee(r);default:throw new Error(`Unknown binary operator: ${e.operator}`)}}function _n(e,t){let n=Oe(e.operand,t);if(e.operator.toLowerCase()==="not")return!Ee(n);throw new Error(`Unknown unary operator: ${e.operator}`)}function Xt(e){return e===void 0?null:e}function Ee(e){return Array.isArray(e)?e.length>0:e!==null&&typeof e=="object"?Object.keys(e).length>0:!!e}function Kn(e,t){let n=t.split("."),r=e;for(let a of n){if(r==null)return;r=r[a]}return r}var Rt=new Map([["True",!0],["False",!1],["None",null],["true",!0],["false",!1],["null",null]]);function Je(e){let t=[];if(!e)return t;let n=/(\(|\)|==|!=|<=|>=|<>|<|>|not\s+in\b|in\b|and\b|or\b|not\b|\[[^\]]*\]|'[^']*'|"[^"]*"|-?\d+\.?\d*|\w+(?:\.\w+)*)/iy,r=/\s*/y,a=0;for(;;){if(r.lastIndex=a,r.exec(e),a=r.lastIndex,a>=e.length)return t;n.lastIndex=a;let i=n.exec(e);if(!i)throw new Error(`Unexpected "${e[a]}" at character ${a+1} of: ${e}`);t.push({type:Yn(i[0]),value:i[0],position:t.length}),a=n.lastIndex}}function Yn(e){let t=e.toLowerCase().trim();return Rt.has(e)?"CONSTANT":t==="and"||t==="or"||t==="not"?"LOGICAL":["==","!=","<>","<",">","<=",">="].includes(e)||t==="in"||t==="not in"?"OPERATOR":e==="("||e===")"?"PAREN":e.startsWith("[")?"LIST":e.startsWith("'")||e.startsWith('"')?"STRING":/^-?\d+\.?\d*$/.test(e)?"NUMBER":"IDENTIFIER"}var Ie=class{constructor(t){Ve(this,"tokens");Ve(this,"position",0);this.tokens=t}parse(){if(this.tokens.length===0)throw new Error("Cannot parse empty expression");let t=this.parseOr();if(!this.isAtEnd())throw new Error(`Unexpected token at position ${this.position}: ${this.peek()?.value}`);return t}parseOr(){let t=this.parseAnd();for(;this.matchLogical("or");){let n=this.previous().value,r=this.parseAnd();t={type:"BinaryOp",operator:n.toLowerCase(),left:t,right:r}}return t}parseAnd(){let t=this.parseNot();for(;this.matchLogical("and");){let n=this.previous().value,r=this.parseNot();t={type:"BinaryOp",operator:n.toLowerCase(),left:t,right:r}}return t}parseNot(){if(this.matchLogical("not")){let t=this.previous().value,n=this.parseComparison();return{type:"UnaryOp",operator:t.toLowerCase(),operand:n}}return this.parseComparison()}parseComparison(){let t=this.parseValue(),n=["==","!=","<>","<",">","<=",">=","in","not in"];if(this.matchOperator(...n)){let r=this.previous().value,a=this.parseValue();return{type:"BinaryOp",operator:r.toLowerCase(),left:t,right:a}}return t}parseValue(){if(this.match("PAREN","(")){let t=this.parseOr();return this.consume("PAREN",")","Expected closing parenthesis"),t}if(this.check("STRING"))return{type:"Literal",value:this.advance().value.slice(1,-1)};if(this.check("CONSTANT")){let t=this.advance();return{type:"Literal",value:Rt.get(t.value)??null}}if(this.check("NUMBER")){let t=this.advance();return{type:"Literal",value:Number(t.value)}}if(this.check("LIST")){let t=this.advance();return{type:"Literal",value:Gn(t.value)}}if(this.check("IDENTIFIER"))return{type:"Identifier",name:this.advance().value};throw new Error(`Unexpected token: ${this.peek()?.value||"EOF"}`)}match(t,...n){if(this.check(t)){if(n.length===0)return this.advance(),!0;let r=this.peek();if(r&&n.includes(r.value))return this.advance(),!0}return!1}matchLogical(...t){let n=this.peek();if(n&&n.type==="LOGICAL"){let r=n.value.toLowerCase();if(t.map(a=>a.toLowerCase()).includes(r))return this.advance(),!0}return!1}matchOperator(...t){let n=this.peek();if(n&&n.type==="OPERATOR"){let r=n.value.toLowerCase();if(t.map(a=>a.toLowerCase()).includes(r))return this.advance(),!0}return!1}check(t){return this.peek()?.type===t}advance(){return this.isAtEnd()||this.position++,this.previous()}peek(){return this.isAtEnd()?null:this.tokens[this.position]}previous(){return this.tokens[this.position-1]}isAtEnd(){return this.position>=this.tokens.length}consume(t,n,r){if(this.check(t)){let a=this.peek();if(a&&a.value===n)return this.advance()}throw new Error(r)}};function Gn(e){try{let t=e.slice(1,-1).trim();if(!t)return[];let n=[],r="",a=!1,i="";for(let o=0;o<t.length;o++){let d=t[o];(d==="'"||d==='"')&&(o===0||t[o-1]!=="\\")&&(a?d===i&&(a=!1,i=""):(a=!0,i=d)),d===","&&!a?(n.push(Qt(r.trim())),r=""):r+=d}return r.trim()&&n.push(Qt(r.trim())),n}catch(t){throw new Error(`Cannot read the list ${e}`,{cause:t})}}function Qt(e){return e.startsWith("'")&&e.endsWith("'")||e.startsWith('"')&&e.endsWith('"')?e.slice(1,-1):isNaN(Number(e))?e.toLowerCase()==="true"?!0:e.toLowerCase()==="false"?!1:e:Number(e)}function Ae(e){if(typeof e!="string"){let n=e===!0;return{source:e,fields:[],evaluate:()=>n}}let t=new Ie(Je(e)).parse();return{source:e,fields:Zn(t),evaluate(n){try{return Ee(Oe(t,n))}catch{return!1}}}}function Zn(e){let t=[],n=r=>{switch(r.type){case"Identifier":{let a=r.name.split(".")[0];t.includes(a)||t.push(a);return}case"BinaryOp":n(r.left),n(r.right);return;case"UnaryOp":n(r.operand);return;default:return}};return n(e),t}var at=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),ot=class{constructor(t){Ve(this,"page",t);Ve(this,"issues",[]);Ve(this,"ids",new Map)}run(){return this.checkFields(this.page.fields,"fields"),this.walkRoot(this.page.layout,"layout"),this.issues}report(t,n){this.issues.push({path:t,message:n})}claim(t,n){let r=this.ids.get(t);r!==void 0?this.report(n,`duplicate id "${t}", also used at ${r}`):this.ids.set(t,n)}need(t,n,r=this.page.fields){if(at(r,t))return r[t];this.report(n,`no field "${t}"`)}checkModifiers(t,n,r=["invisible"]){for(let a of r){let i=t[a];if(typeof i!="string")continue;let o;try{o=Ae(i).fields}catch(d){this.report(`${n}.${a}`,`cannot read "${i}": ${d.message}`);continue}for(let d of o)at(this.page.fields,d)||this.report(`${n}.${a}`,`"${i}" reads "${d}", which is not a field of this page`)}}checkFields(t,n){for(let[r,a]of Object.entries(t)){let i=`${n}.${r}`;if(a.type==="monetary"&&a.currencyField!==void 0){let o=this.need(a.currencyField,`${i}.currencyField`,t);o&&!["many2one","selection","char"].includes(o.type)&&this.report(`${i}.currencyField`,`"${a.currencyField}" is a ${o.type}; a currency field must be a many2one, selection or char`)}if((a.type==="many2one"||a.type==="many2many")&&a.filter){let o=(d,s)=>{if("any"in d)return d.any.forEach((l,p)=>o(l,`${s}.any[${p}]`));if("all"in d)return d.all.forEach((l,p)=>o(l,`${s}.all[${p}]`));d.valueFrom!==void 0&&this.need(d.valueFrom,`${s}.valueFrom`,t)};a.filter.forEach((d,s)=>{o(d,`${i}.filter[${s}]`)})}if(a.type==="properties"&&a.definitions){let o=new Set;a.definitions.forEach((d,s)=>{d.type==="selection"&&!d.options&&this.report(`${i}.definitions[${s}].options`,"a choice property needs its choices"),o.has(d.name)&&this.report(`${i}.definitions[${s}].name`,`"${d.name}" is named twice`),o.add(d.name)})}if(a.type==="one2many"&&(this.checkFields(a.fields,`${i}.fields`),a.lineKinds&&this.checkLineKinds(r,a.lineKinds,a.fields,`${i}.lineKinds`),a.sequenceField!==void 0)){let o=a.fields[a.sequenceField];o?o.type!=="integer"&&this.report(`${i}.sequenceField`,`"${a.sequenceField}" is a ${o.type}; the field that keeps the order of lines must be an integer`):this.report(`${i}.sequenceField`,`"${a.sequenceField}" is not a field of the lines of "${r}"`)}}}checkLineKinds(t,n,r,a){let i=r[n.field];if(!i)this.report(`${a}.field`,`"${n.field}" is not a field of the lines of "${t}"`);else if(i.type!=="selection"&&i.type!=="char")this.report(`${a}.field`,`"${n.field}" is a ${i.type}; the field that says what a line is must be a selection or char`);else if(i.type==="selection")for(let d of["section","note"]){let s=n[d]??d;i.options.some(l=>l.value===s)||this.report(`${a}.${d}`,`"${n.field}" has no option "${s}"`)}let o=r[n.text];o?o.type!=="char"&&o.type!=="text"&&this.report(`${a}.text`,`"${n.text}" is a ${o.type}; a section's or note's text must be a char or text field`):this.report(`${a}.text`,`"${n.text}" is not a field of the lines of "${t}"`)}walkRoot(t,n){if(t.type==="tabs")return this.walkNode(t,n);if(this.claim(t.id,n),t.type==="sheet")return this.walkSheet(t,n);if(t.type==="sections")return this.walkChildren(t.children,n);t.children.forEach((r,a)=>{let i=`${n}.children[${a}]`;this.claim(r.id,i),this.checkModifiers(r,i),this.walkChildren(r.children,i)})}walkChildren(t,n){t.forEach((r,a)=>this.walkNode(r,`${n}.children[${a}]`))}walkNode(t,n){switch(this.claim(t.id,n),this.checkModifiers(t,n,t.type==="field"?["invisible","readonly","required"]:t.type==="section"?["invisible","readonly"]:["invisible"]),t.type){case"field":return this.checkFieldNode(t,n);case"section":return t.collapsible&&!t.title&&this.report(n,"a collapsible section needs a title to fold it by"),t.collapsed&&!t.collapsible&&this.report(n,"collapsed needs collapsible: true"),this.walkChildren(t.children,n);case"tabs":return this.walkTabs(t,n);default:return}}walkTabs(t,n){t.children.forEach((r,a)=>{let i=`${n}.children[${a}]`;this.claim(r.id,i),this.checkModifiers(r,i),this.walkChildren(r.children,i)})}walkSheet(t,n){if(t.title&&(this.need(t.title.field,`${n}.title.field`),t.title.subtitleField!==void 0&&this.need(t.title.subtitleField,`${n}.title.subtitleField`),t.title.avatarField!==void 0&&this.need(t.title.avatarField,`${n}.title.avatarField`)),t.statusbar){let{field:r,visibleStates:a}=t.statusbar,i=this.need(r,`${n}.statusbar.field`);if(i&&i.type!=="selection"&&i.type!=="many2one"&&this.report(`${n}.statusbar.field`,`"${r}" is a ${i.type}; a statusbar needs a selection or many2one`),i?.type==="selection"&&a){let o=new Set(i.options.map(d=>d.value));a.forEach((d,s)=>{o.has(d)||this.report(`${n}.statusbar.visibleStates[${s}]`,`"${d}" is not an option of "${r}"`)})}}t.buttons?.forEach((r,a)=>{this.claim(r.id,`${n}.buttons[${a}]`),this.checkModifiers(r,`${n}.buttons[${a}]`)}),t.statButtons?.forEach((r,a)=>{this.claim(r.id,`${n}.statButtons[${a}]`),this.checkModifiers(r,`${n}.statButtons[${a}]`),r.field!==void 0&&this.need(r.field,`${n}.statButtons[${a}].field`)}),t.ribbon&&(this.claim(t.ribbon.id,`${n}.ribbon`),this.checkModifiers(t.ribbon,`${n}.ribbon`)),t.badges?.forEach((r,a)=>{this.claim(r.id,`${n}.badges[${a}]`),this.checkModifiers(r,`${n}.badges[${a}]`)});for(let r of["above","below"])t.title?.[r]?.forEach((a,i)=>this.walkNode(a,`${n}.title.${r}[${i}]`));t.alerts?.forEach((r,a)=>{this.claim(r.id,`${n}.alerts[${a}]`),this.checkModifiers(r,`${n}.alerts[${a}]`)}),this.walkChildren(t.children,n),t.sidePanel&&(this.claim(t.sidePanel.id,`${n}.sidePanel`),this.checkModifiers(t.sidePanel,`${n}.sidePanel`))}checkFieldNode(t,n){let r=this.need(t.field,`${n}.field`);r&&t.totals&&(r.type!=="one2many"?this.report(`${n}.totals`,`totals only apply to one2many fields; "${t.field}" is a ${r.type}`):t.totals.forEach((a,i)=>{let o=at(r.fields,a)?r.fields[a]:void 0;o?["integer","float","monetary"].includes(o.type)||this.report(`${n}.totals[${i}]`,`"${a}" is a ${o.type}; only integer, float and monetary columns add up`):this.report(`${n}.totals[${i}]`,`"${a}" is not a field of the lines of "${t.field}"`)}));for(let[a,i]of Object.entries(t.options??{}))a.endsWith("Field")&&typeof i=="string"&&this.need(i,`${n}.options.${a}`);if(r&&t.editMode&&r.type!=="one2many"&&this.report(`${n}.editMode`,`editMode only applies to one2many fields; "${t.field}" is a ${r.type}`),r&&t.optionalColumns)if(r.type!=="one2many")this.report(`${n}.optionalColumns`,`optional columns only apply to one2many fields; "${t.field}" is a ${r.type}`);else{let a=t.columns??Object.keys(r.fields).filter(i=>i!==r.lineKinds?.field&&i!==r.sequenceField);for(let i of Object.keys(t.optionalColumns))a.includes(i)||this.report(`${n}.optionalColumns.${i}`,`"${i}" is not a column of "${t.field}"`)}!r||!t.columns||(r.type==="one2many"?t.columns.forEach((a,i)=>{at(r.fields,a)||this.report(`${n}.columns[${i}]`,`"${a}" is not a field of the lines of "${t.field}"`)}):r.type!=="many2many"&&this.report(`${n}.columns`,`columns only apply to one2many and many2many fields; "${t.field}" is a ${r.type}`))}};var Ue=e=>e!==null&&typeof e=="object"&&!Array.isArray(e),Xn=["sheet","sections","tabs","wizard"];function st(e){if(!Ue(e))return{ok:!1,issues:[{path:"(page)",message:"a page is a JSON object"}]};let t=[],n=(d,s)=>t.push({path:d,message:s});e.fieldia!=="0.1"&&n("fieldia",`this build reads format ${"0.1"}`),(typeof e.id!="string"||!e.id)&&n("id","a page needs an id");let r=e.data;(!Ue(r)||!(r.kind==="responses"||r.kind==="record"&&typeof r.model=="string"&&r.model))&&n("data",'data is { "kind": "record", "model": \u2026 } or { "kind": "responses" }');let a=e.fields;if(!Ue(a))n("fields","fields is an object of field definitions, by name");else for(let[d,s]of Object.entries(a))(!Ue(s)||!nt.includes(s.type)||typeof s.label!="string")&&n(`fields.${d}`,"a field needs a type Fieldia knows and a label");let i=e.layout;if((!Ue(i)||!Xn.includes(i.type)||!Array.isArray(i.children))&&n("layout","the layout is a sheet, sections, tabs or wizard, with children"),t.length)return{ok:!1,issues:t};let o=e;try{let d=new ot(o).run();return d.length?{ok:!1,issues:d}:{ok:!0,page:o}}catch(d){return{ok:!1,issues:[{path:"(page)",message:`a part of this page cannot be read: ${d.message}`}]}}}var Qn=new Set(["title","description","label","help","placeholder","message","text","confirm","nextLabel","backLabel","finishLabel"]),er=new Set(["lineKinds","filter","default","data"]);function dt(e,t){let n=(r,a)=>{if(typeof r=="string")return a!==null&&Qn.has(a)?t(r):r;if(Array.isArray(r))return r.map(o=>n(o,null));if(r===null||typeof r!="object")return r;let i={};for(let[o,d]of Object.entries(r)){let s=o==="options"&&!Array.isArray(d);i[o]=er.has(o)||s?d:n(d,o)}return i};return n(e,null)}function en(e,t){if(e===void 0)return!1;if(typeof e=="boolean")return e;if(e==="1"||e==="True"||e==="true")return!0;if(e==="0"||e==="False"||e==="false"||e==="")return!1;try{let n=Je(e);if(n.length===0)return!1;let a=new Ie(n).parse(),i=Oe(a,t);return Ee(i)}catch{return!1}}function tn(e){if(e===void 0||typeof e=="boolean"||e==="")return!0;try{let t=Je(e);return t.length===0||new Ie(t).parse(),!0}catch{return!1}}function _e(e){switch(e.type){case"boolean":return!1;case"many2many":case"one2many":return[];case"selection":return e.multiple?[]:null;default:return null}}function ze(e){let t={};for(let[n,r]of Object.entries(e))t[n]=r.default!==void 0?ee(r.default):_e(r);return t}function je(e,t){return t==null?!0:typeof t=="string"?t.trim()==="":Array.isArray(t)?t.length===0:!1}function Ke(e,t){let n={};for(let[r,a]of Object.entries(e)){let i=t[r];n[r]=i?tr(i,a):a}return n}function tr(e,t){if(t==null)return null;switch(e.type){case"many2one":return t.id;case"many2many":return t.map(n=>n.id);case"one2many":return t.map(n=>n.key);case"reference":{let n=t;return`${n.model},${n.id}`}case"binary":case"image":return t.name;default:return t}}function Me(e,t){let n=e.lineKinds;if(!n)return null;let r=t[n.field];return r===(n.section??"section")?"section":r===(n.note??"note")?"note":null}function ee(e){return e===void 0?e:JSON.parse(JSON.stringify(e))}var Te={en:{required:"{label} is required",maxLength:"Maximum {max} characters allowed",pattern:"{label} is not in the expected format",text:"{label} must be text",number:"{label} must be a number",integer:"{label} must be a whole number",min:"{label} must be at least {min}",max:"{label} must be at most {max}",decimals:"Maximum {digits} decimal places allowed",boolean:"{label} must be yes or no",dateFormat:"Invalid date format (expected YYYY-MM-DD)",dateInvalid:"Invalid date (check month/day values)",datetimeFormat:"Invalid date and time format (expected YYYY-MM-DDTHH:MM:SS)",datetimeInvalid:"Invalid date and time (check the values)",choice:"Must be one of: {options}",choices:"{label} must be a list of choices",record:"{label} must be a record",records:"{label} must be a list of records",reference:"{label} must point to {aModels}",file:"{label} must be a file",fileSize:"{label} is larger than {size}",fileType:"{label} must be {aTypes} file",or:"or"},ar:{required:"{label} \u0645\u0637\u0644\u0648\u0628",maxLength:"\u0627\u0644\u062D\u062F \u0627\u0644\u0623\u0642\u0635\u0649 {max} \u062D\u0631\u0641\u064B\u0627",pattern:"\u0635\u064A\u063A\u0629 {label} \u063A\u064A\u0631 \u0635\u062D\u064A\u062D\u0629",text:"\u064A\u062C\u0628 \u0623\u0646 \u064A\u0643\u0648\u0646 {label} \u0646\u0635\u064B\u0627",number:"\u064A\u062C\u0628 \u0623\u0646 \u064A\u0643\u0648\u0646 {label} \u0631\u0642\u0645\u064B\u0627",integer:"\u064A\u062C\u0628 \u0623\u0646 \u064A\u0643\u0648\u0646 {label} \u0631\u0642\u0645\u064B\u0627 \u0635\u062D\u064A\u062D\u064B\u0627",min:"\u064A\u062C\u0628 \u0623\u0644\u0627 \u064A\u0642\u0644 {label} \u0639\u0646 {min}",max:"\u064A\u062C\u0628 \u0623\u0644\u0627 \u064A\u0632\u064A\u062F {label} \u0639\u0646 {max}",decimals:"\u0627\u0644\u062D\u062F \u0627\u0644\u0623\u0642\u0635\u0649 {digits} \u0645\u0646\u0627\u0632\u0644 \u0639\u0634\u0631\u064A\u0629",boolean:"\u064A\u062C\u0628 \u0623\u0646 \u064A\u0643\u0648\u0646 {label} \u0646\u0639\u0645 \u0623\u0648 \u0644\u0627",dateFormat:"\u0635\u064A\u063A\u0629 \u0627\u0644\u062A\u0627\u0631\u064A\u062E \u063A\u064A\u0631 \u0635\u062D\u064A\u062D\u0629 (\u0627\u0644\u0645\u062A\u0648\u0642\u0639 YYYY-MM-DD)",dateInvalid:"\u0627\u0644\u062A\u0627\u0631\u064A\u062E \u063A\u064A\u0631 \u0635\u062D\u064A\u062D (\u062A\u062D\u0642\u0642 \u0645\u0646 \u0627\u0644\u0634\u0647\u0631 \u0648\u0627\u0644\u064A\u0648\u0645)",datetimeFormat:"\u0635\u064A\u063A\u0629 \u0627\u0644\u062A\u0627\u0631\u064A\u062E \u0648\u0627\u0644\u0648\u0642\u062A \u063A\u064A\u0631 \u0635\u062D\u064A\u062D\u0629 (\u0627\u0644\u0645\u062A\u0648\u0642\u0639 YYYY-MM-DDTHH:MM:SS)",datetimeInvalid:"\u0627\u0644\u062A\u0627\u0631\u064A\u062E \u0648\u0627\u0644\u0648\u0642\u062A \u063A\u064A\u0631 \u0635\u062D\u064A\u062D\u064A\u0646",choice:"\u064A\u062C\u0628 \u0623\u0646 \u062A\u0643\u0648\u0646 \u0627\u0644\u0642\u064A\u0645\u0629 \u0648\u0627\u062D\u062F\u0629 \u0645\u0646: {options}",choices:"\u064A\u062C\u0628 \u0623\u0646 \u064A\u0643\u0648\u0646 {label} \u0642\u0627\u0626\u0645\u0629 \u0627\u062E\u062A\u064A\u0627\u0631\u0627\u062A",record:"\u064A\u062C\u0628 \u0623\u0646 \u064A\u0643\u0648\u0646 {label} \u0633\u062C\u0644\u064B\u0627",records:"\u064A\u062C\u0628 \u0623\u0646 \u064A\u0643\u0648\u0646 {label} \u0642\u0627\u0626\u0645\u0629 \u0633\u062C\u0644\u0627\u062A",reference:"\u064A\u062C\u0628 \u0623\u0646 \u064A\u0634\u064A\u0631 {label} \u0625\u0644\u0649 {models}",file:"\u064A\u062C\u0628 \u0623\u0646 \u064A\u0643\u0648\u0646 {label} \u0645\u0644\u0641\u064B\u0627",fileSize:"\u062D\u062C\u0645 {label} \u0623\u0643\u0628\u0631 \u0645\u0646 {size}",fileType:"\u064A\u062C\u0628 \u0623\u0646 \u064A\u0643\u0648\u0646 {label} \u0645\u0644\u0641 {types}",or:"\u0623\u0648"},de:{required:"{label} ist erforderlich",maxLength:"Maximal {max} Zeichen erlaubt",pattern:"{label} hat nicht das erwartete Format",text:"{label} muss Text sein",number:"{label} muss eine Zahl sein",integer:"{label} muss eine ganze Zahl sein",min:"{label} muss mindestens {min} sein",max:"{label} darf h\xF6chstens {max} sein",decimals:"Maximal {digits} Nachkommastellen erlaubt",boolean:"{label} muss ja oder nein sein",dateFormat:"Ung\xFCltiges Datumsformat (erwartet JJJJ-MM-TT)",dateInvalid:"Ung\xFCltiges Datum (Monat und Tag pr\xFCfen)",datetimeFormat:"Ung\xFCltiges Datums- und Zeitformat (erwartet JJJJ-MM-TTTHH:MM:SS)",datetimeInvalid:"Ung\xFCltiges Datum oder ung\xFCltige Uhrzeit",choice:"Muss eines davon sein: {options}",choices:"{label} muss eine Liste von Optionen sein",record:"{label} muss ein Datensatz sein",records:"{label} muss eine Liste von Datens\xE4tzen sein",reference:"{label} muss auf {models} verweisen",file:"{label} muss eine Datei sein",fileSize:"{label} ist gr\xF6\xDFer als {size}",fileType:"{label} muss eine {types}-Datei sein",or:"oder"},fr:{required:"{label} est obligatoire",maxLength:"{max} caract\xE8res au maximum",pattern:"{label} n'a pas le format attendu",text:"{label} doit \xEAtre du texte",number:"{label} doit \xEAtre un nombre",integer:"{label} doit \xEAtre un nombre entier",min:"{label} doit \xEAtre au moins {min}",max:"{label} doit \xEAtre au plus {max}",decimals:"{digits} d\xE9cimales au maximum",boolean:"{label} doit \xEAtre oui ou non",dateFormat:"Format de date invalide (attendu AAAA-MM-JJ)",dateInvalid:"Date invalide (v\xE9rifiez le mois et le jour)",datetimeFormat:"Format de date et heure invalide (attendu AAAA-MM-JJTHH:MM:SS)",datetimeInvalid:"Date ou heure invalide",choice:"Doit \xEAtre parmi : {options}",choices:"{label} doit \xEAtre une liste de choix",record:"{label} doit \xEAtre un enregistrement",records:"{label} doit \xEAtre une liste d'enregistrements",reference:"{label} doit pointer vers {models}",file:"{label} doit \xEAtre un fichier",fileSize:"{label} d\xE9passe {size}",fileType:"{label} doit \xEAtre un fichier {types}",or:"ou"}};function lt(e,t){return e.replace(/\{(\w+)\}/g,(n,r)=>r in t?String(t[r]):n)}function He(e,t,n,r=Te.en){let a=e.label||"This field",i=(o,d={})=>lt(r[o],{label:a,...d});if(je(e,t))return n?i("required"):void 0;switch(e.type){case"char":case"text":case"html":return typeof t!="string"?i("text"):(e.type==="char"||e.type==="text")&&e.size!==void 0&&t.length>e.size?i("maxLength",{max:e.size}):e.type==="char"&&e.pattern!==void 0&&!new RegExp(e.pattern).test(t)?i("pattern"):void 0;case"integer":case"float":case"monetary":return typeof t!="number"||!Number.isFinite(t)?i("number"):e.type==="integer"&&!Number.isInteger(t)?i("integer"):e.min!==void 0&&t<e.min?i("min",{min:e.min}):e.max!==void 0&&t>e.max?i("max",{max:e.max}):e.type!=="integer"&&e.digits&&nr(t)>e.digits[1]?i("decimals",{digits:e.digits[1]}):void 0;case"boolean":return typeof t=="boolean"?void 0:i("boolean");case"date":return rr(t,i);case"datetime":return ar(t,i);case"selection":{let o=new Set(e.options.map(s=>s.value)),d=i("choice",{options:e.options.map(s=>s.label).join(", ")});return e.multiple?Array.isArray(t)?t.every(s=>o.has(s))?void 0:d:i("choices"):o.has(t)?void 0:d}case"many2one":return Ft(t)?void 0:i("record");case"many2many":return Array.isArray(t)&&t.every(Ft)?void 0:i("records");case"reference":{let o=t;if(!Ft(t)||typeof o.model!="string")return i("record");if(!e.models.some(d=>d.value===o.model)){let d=rn(e.models.map(s=>s.label),r.or);return i("reference",{models:d,aModels:an(d)})}return}case"binary":case"image":return or(e,t,i,r);default:return}}function nr(e){let t=String(e);if(t.includes("e-"))return Number(t.split("e-")[1]);let n=t.indexOf(".");return n===-1?0:t.length-n-1}function Ft(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)&&(typeof e.id=="number"||typeof e.id=="string")&&typeof e.label=="string"}function rr(e,t){if(typeof e!="string"||!/^\d{4}-\d{2}-\d{2}$/.test(e))return t("dateFormat");let[n,r,a]=e.split("-").map(Number);return nn(n,r,a)?void 0:t("dateInvalid")}var ir=/^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2})(?::(\d{2})(?:\.\d{1,9})?)?(?:Z|[+-]\d{2}:\d{2})?$/;function ar(e,t){let n=typeof e=="string"?ir.exec(e):null;if(!n)return t("datetimeFormat");let[r,a,i,o,d,s]=n.slice(1).map(l=>Number(l??0));return nn(r,a,i)&&o<24&&d<60&&s<60?void 0:t("datetimeInvalid")}function nn(e,t,n){if(t<1||t>12||n<1)return!1;let r=[31,e%4===0&&(e%100!==0||e%400===0)?29:28,31,30,31,30,31,31,30,31,30,31];return n<=r[t-1]}function or(e,t,n,r){let a=t;if(!sr(t))return n("file");if("maxSize"in e&&e.maxSize!==void 0&&a.size>e.maxSize)return n("fileSize",{size:Ye(e.maxSize)});if(e.type==="binary"&&e.accept&&!e.accept.some(i=>dr(i,a.type))){let i=rn(e.accept.map(lr),r.or);return n("fileType",{types:i,aTypes:an(i)})}}function sr(e){let t=e;return e!==null&&typeof e=="object"&&typeof t.name=="string"&&typeof t.size=="number"}function dr(e,t){return e.endsWith("/*")?t.startsWith(e.slice(0,-1)):e===t}function lr(e){return e.endsWith("/*")?e.slice(0,-2):e==="application/pdf"?"PDF":(e.split("/")[1]??e).toUpperCase()}function rn(e,t){return e.length<=1?e.join(""):`${e.slice(0,-1).join(", ")} ${t} ${e[e.length-1]}`}function an(e){return/^[aeiou]/i.test(e)?`an ${e}`:`a ${e}`}function Ye(e){let t=["bytes","KB","MB","GB"],n=e,r=0;for(;n>=1024&&r<t.length-1;)n/=1024,r++;return`${Number(n.toFixed(1))} ${t[r]}`}function on(e){return Object.assign(new Error(e.message),{problem:e})}function ct(e){let t=e?.problem;if(t&&typeof t.kind=="string")return t;let n=e instanceof Error?e.message:String(e);return e instanceof TypeError&&/fetch|network|load failed/i.test(n)?{kind:"network",message:n}:{kind:"other",message:n}}function ut(e,t){return t.every(n=>Nt(e,n))}function Nt(e,t){return"any"in t?t.any.some(n=>Nt(e,n)):"all"in t?t.all.every(n=>Nt(e,n)):cr(e,t)}function De(e){return e!=null&&e!==""&&e!==!1&&!(Array.isArray(e)&&!e.length)}function cr(e,t){let n=e[t.field],r=n!==null&&typeof n=="object"&&!Array.isArray(n)&&"id"in n?n.id:n,a=t.value,i=String(r??"");switch(t.op){case"=":return r===a;case"!=":return r!==a;case"<":return De(r)&&r<a;case">":return De(r)&&r>a;case"<=":return De(r)&&r<=a;case">=":return De(r)&&r>=a;case"in":return Array.isArray(a)&&a.includes(r);case"not in":return Array.isArray(a)&&!a.includes(r);case"like":return i.includes(String(a));case"ilike":return i.toLowerCase().includes(String(a).toLowerCase());case"startswith":return i.toLowerCase().startsWith(String(a).toLowerCase());case"endswith":return i.toLowerCase().endsWith(String(a).toLowerCase());case"set":return De(n);case"notset":return!De(n);case"between":{if(!De(r)||!Array.isArray(a))return!1;let[o,d]=a;return r>=o&&r<=d}}}var Ge={setTimeout:(e,t)=>globalThis.setTimeout(e,t),clearTimeout:e=>globalThis.clearTimeout(e)};function ft(e,t=Ge){return new Promise(n=>{t.setTimeout(n,e)})}function sn(e={}){let t=ee(e.records??{}),n=[],r=[],a=1e3,i=()=>e.delayMs?ft(e.delayMs,e.scheduler):Promise.resolve(),o=h=>t[h]??(t[h]={}),d=(h,g)=>{let f=o(h)[String(g)]?.[e.labelField?.[h]??"name"];return typeof f=="string"?f:String(g)},s=h=>Math.max(0,...Object.keys(o(h)).map(Number).filter(Number.isFinite))+1,l=h=>Number.isFinite(Number(h))?Number(h):h;function p(h,g){let f=[...h];for(let w of g)w.op==="create"?f.push({key:w.key,id:++a,values:ee(w.values)}):w.op==="update"?f=f.map(b=>b.id===w.id?{...b,values:{...b.values,...ee(w.values)}}:b):f=f.filter(b=>b.id!==w.id);return f}function y(h,g,f){let w=[...h],b=u=>({id:u,label:d(f,u)});for(let u of g)u.op==="link"&&!w.some(E=>E.id===u.id)?w.push(b(u.id)):u.op==="unlink"?w=w.filter(E=>E.id!==u.id):u.op==="set"?w=u.ids.map(b):u.op==="clear"&&(w=[]);return w}function v(h,g){let f=h[g];return f&&"relation"in f?f.relation:g}return{records:t,responses:n,calls:r,async load(h){r.push({method:"load",request:h}),await i();let g=o(h.model)[String(h.id)];if(!g)throw new Error(`No ${h.model} record with id ${h.id}`);return ee(g)},async save(h){r.push({method:"save",request:h}),await i();let g=h.id??s(h.model),f={...o(h.model)[String(g)]??{},...ee(h.changes.values)};for(let[w,b]of Object.entries(h.changes.lines))f[w]=p(f[w]??[],b);for(let[w,b]of Object.entries(h.changes.links))f[w]=y(f[w]??[],b,v(h.fields,w));return o(h.model)[String(g)]=f,{id:g,values:ee(f)}},async onchange(h){r.push({method:"onchange",request:h}),await i();let g=e.onchange?.[h.model]?.[h.changed],f=e.warnings?.[h.model]?.[h.changed],w=g?{values:g(ee(h.values))}:{},b=f?.(ee(h.values));return b?{...w,warning:b}:w},async search(h){r.push({method:"search",request:h}),await i();let g=h.query.trim().toLowerCase();return Object.entries(o(h.model)).filter(([,f])=>ut(f,h.filter??[])).map(([f])=>({id:l(f),label:d(h.model,l(f))})).filter(f=>f.label.toLowerCase().includes(g)).slice(0,h.limit??8)},async create(h){r.push({method:"create",request:h}),await i();let g=o(h.model),f=Object.keys(g).reduce((w,b)=>Math.max(w,Number(b)||0),0)+1;return g[String(f)]={name:h.name},{id:f,label:h.name}},async submit(h){return r.push({method:"submit",request:h}),await i(),n.push(ee(h)),{id:n.length}}}}function pt(e){let{page:t}=e,n=e.scheduler??Ge,r=e.messages??Te.en,a=pr(t.layout),i=t.layout.type==="wizard"?t.layout.children.map(m=>m.id):[],o=()=>`fieldia:draft:${t.id}:${s.recordId??"new"}`,d={...ze(t.fields),...ee(e.values??{})},s={status:e.recordId!=null?"idle":"ready",recordId:e.recordId??null,values:ee(d),errors:{},dirty:[],warning:null,warningField:null,error:null,draft:null,step:i[0]??null,skipped:[],saveProblem:null},l={},p=0,y=0,v=null,h=null,g=new Set,f=new Set,w=null;function b(m){s={...s,...m};for(let x of[...f])x(s)}function u(m){g.add(m);let x=()=>g.delete(m);return m.then(x,x),m}function E(){return w?.values!==s.values&&(w={values:s.values,context:Ke(s.values,t.fields)}),w.context}function k(m){let x=t.fields[m];if(!x)throw new Error(`The page has no field "${m}"`);return x}function F(m){return Object.keys(t.fields).filter(x=>JSON.stringify(m[x]??null)!==JSON.stringify(d[x]??null))}function O(m){let x=a.get(m);if(!x)throw new Error(`The page has no element "${m}"`);let L=E(),S=x.invisible.evaluate(L);for(let z=x.parent;!S&&z;z=a.get(z)?.parent??null)S=a.get(z)?.invisible.evaluate(L)??!1;let N=x.readonly.evaluate(L);for(let z=x.parent;!N&&z;z=a.get(z)?.parent??null)N=a.get(z)?.readonly.evaluate(L)??!1;let T=x.field?t.fields[x.field]:void 0;return{invisible:S,readonly:N||T?.readonly===!0,required:x.required.evaluate(L)||T?.required===!0}}function M(m){let x=S=>{if(!m)return!0;for(let N=S.id;N;N=a.get(N)?.parent??null)if(N===m)return!0;return!1},L=S=>{if(m||!s.skipped.length)return!1;for(let N=S.id;N;N=a.get(N)?.parent??null)if(s.skipped.includes(N))return!0;return!1};return[...a.values()].filter(S=>S.kind==="field"&&x(S)&&!L(S)&&!O(S.id).invisible)}function P(m){let x={};for(let L of M(m)){let S=L.field;if(x[S])continue;let N=t.fields[S],T=He(N,s.values[S],O(L.id).required,r);if(T&&(x[S]=T),N.type==="one2many")for(let z of s.values[S]??[]){let oe=Me(N,z.values);for(let[ae,ue]of Object.entries(N.fields)){if(oe&&ae!==N.lineKinds?.text)continue;let ne=He(ue,z.values[ae],ue.required===!0,r);ne&&(x[`${S}.${z.key}.${ae}`]=ne)}}}return x}function H(m,x={}){let L=Object.keys(s.errors).length?U(m):s.errors;b({values:m,dirty:F(m),errors:L,...x})}function U(m){let x=s;s={...s,values:m};let L=P(s.step??void 0);s=x;let S={};for(let N of Object.keys(s.errors))L[N]&&(S[N]=L[N]);for(let[N,T]of Object.entries(l))JSON.stringify(m[N]??null)===T.value?S[N]??(S[N]=T.message):delete l[N];return S}function re(){let m=e.drafts;m&&(v!==null&&n.clearTimeout(v),v=n.setTimeout(()=>{v=null,m.store.setItem(o(),JSON.stringify({savedAt:new Date().toISOString(),values:s.values}))},m.delayMs??400))}function J(){v!==null&&n.clearTimeout(v),v=null,e.drafts?.store.removeItem(o())}function _(){let m=e.drafts;if(!m)return;let x=m.store.getItem(o());if(!x)return;let L;try{L=JSON.parse(x)}catch{m.store.removeItem(o());return}m.restore==="auto"?H({...s.values,...L.values},{draft:null}):b({draft:{savedAt:L.savedAt}})}function te(){let m=e.autosave;!m||t.data.kind!=="record"||(h!==null&&n.clearTimeout(h),h=n.setTimeout(()=>{h=null,s.dirty.length&&Object.keys(P()).length===0&&u(X())},m.delayMs))}function Z(m){let x=e.dataSource;if(!x?.onchange||t.data.kind!=="record")return;let L=++y,S={model:t.data.model,id:s.recordId,changed:m,values:ee(s.values)};u(x.onchange(S).then(N=>{if(L!==y)return;let T={...s.values,...N.values??{}};H(T,{warning:N.warning??null,warningField:N.warning?m:null})},()=>{}))}function C(m){re(),te(),Z(m)}function $(){let m={values:{},lines:{},links:{}},x=s.recordId===null||s.recordId===void 0,L=x?Object.keys(t.fields).filter(S=>s.dirty.includes(S)||!je(t.fields[S],s.values[S])):s.dirty;for(let S of L){let N=t.fields[S],T=s.values[S],z=x?_e(N):d[S];N.type==="one2many"?m.lines[S]=ur(z??[],T??[]):N.type==="many2many"?m.links[S]=fr(z??[],T??[]):m.values[S]=ee(T)}return m}function W(){let m={};for(let x of M()){let L=x.field;m[L]=ee(s.values[L])}return m}async function X(){let m=P();if(Object.keys(m).length)return b({errors:m}),!1;let x=e.dataSource;l={},b({status:"saving",errors:{},error:null,saveProblem:null});try{if(t.data.kind==="responses"){if(!x?.submit)throw new Error("This page has no data source to send its answers to");return await x.submit({pageId:t.id,values:W()}),J(),b({status:"saved"}),!0}if(!x?.save)throw new Error("This page has no data source to save to");let L=await x.save({model:t.data.model,id:s.recordId,fields:t.fields,changes:$(),values:ee(s.values)});J();let S=L.values?{...s.values,...L.values}:s.values;return d=ee(S),b({status:"saved",recordId:L.id,values:S,dirty:[]}),!0}catch(L){let S=ct(L),N=S.kind==="fields"?S.fields??{}:{};return l=Object.fromEntries(Object.entries(N).map(([T,z])=>[T,{message:z,value:JSON.stringify(s.values[T]??null)}])),b({status:"error",error:S.message,saveProblem:S,errors:{...N}}),!1}}function Q(m){return!e.dataSource?.create||!m||m.readonly?null:m.type==="many2one"||m.type==="many2many"?m.relation:null}async function ce(m,x,L){let S=Q(m),N=e.dataSource;if(!S||!N?.create)throw new Error(`"${x}" cannot make records: its data source has no create, or it is not a link`);return u(N.create({model:S,name:L.trim()}))}async function fe(m,x,L,S,N,T){if(m.type!=="many2one"&&m.type!=="many2many"&&m.type!=="reference")throw new Error(`"${x}" is not a many2one, many2many or reference`);if(m.type==="reference"&&!T)throw new Error(`Searching "${x}" needs a model`);let z=e.dataSource;if(!z?.search)return[];let oe=ne=>"any"in ne?{any:ne.any.map(oe)}:"all"in ne?{all:ne.all.map(oe)}:{field:ne.field,op:ne.op,value:ne.valueFrom!==void 0?L[ne.valueFrom]??null:ne.value??null},ae=m.type==="reference"?void 0:m.filter?.map(oe),ue=m.type==="reference"?T:m.relation;return u(z.search({model:ue,query:S,...ae?{filter:ae}:{},limit:N}))}function pe(m){let x=k(m);if(x.type!=="one2many")throw new Error(`"${m}" is a ${x.type}, not a one2many`);return x}function Se(){return s.step?i.indexOf(s.step):-1}function Fe(m){return a.get(m)?.source?.optional===!0}async function Ne(){let m=e.dataSource;if(!(s.recordId==null||t.data.kind!=="record")){if(!m?.load){b({status:"error",error:"This page has no data source to load from"});return}b({status:"loading",error:null});try{let x=await m.load({model:t.data.model,id:s.recordId,fields:t.fields});d={...ze(t.fields),...x},b({status:"ready",values:ee(d),dirty:[],errors:{}}),_()}catch(x){b({status:"error",error:x.message})}}}let se={page:t,getState:()=>s,subscribe(m){return f.add(m),()=>f.delete(m)},load:()=>u(Ne()),setValue(m,x){k(m),H({...s.values,[m]:ee(x)}),C(m)},node:O,fieldReadonly:m=>k(m).readonly===!0,problem(m){let x=k(m),L=M().filter(S=>S.field===m);return L.length?He(x,s.values[m],L.some(S=>O(S.id).required),r)??null:null},validate(){let m=P();return b({errors:m}),Object.keys(m).length===0},save:()=>u(X()),reset(){J(),l={},b({values:ee(d),dirty:[],errors:{},warning:null,warningField:null,draft:null,step:i[0]??null,skipped:[],saveProblem:null})},changes:$,addLine(m,x={}){let L=pe(m),S=`new-${++p}`,N=s.values[m]??[],T={key:S,values:{...ze(L.fields),...ee(x)}};if(L.sequenceField&&T.values[L.sequenceField]==null){let oe=N.map(ae=>ae.values[L.sequenceField]).filter(ae=>typeof ae=="number");T.values[L.sequenceField]=oe.length?Math.max(...oe)+1:1}let z=[...N,T];return H({...s.values,[m]:z}),C(m),S},updateLine(m,x,L,S){if(!pe(m).fields[L])throw new Error(`The lines of "${m}" have no field "${L}"`);let T=(s.values[m]??[]).map(z=>z.key===x?{...z,values:{...z.values,[L]:ee(S)}}:z);H({...s.values,[m]:T}),C(m)},moveLine(m,x,L){let N=pe(m).sequenceField;if(!N)throw new Error(`The lines of "${m}" keep no order: give the field a sequenceField`);let T=[...s.values[m]??[]],z=T.findIndex(me=>me.key===x);if(z<0)throw new Error(`"${m}" has no line "${x}"`);let oe=Math.max(0,Math.min(L,T.length-1));if(oe===z)return;let ae=T.map(me=>me.values[N]),ue=ae.every((me,be)=>typeof me=="number"&&(be===0||me>ae[be-1]));T.splice(oe,0,...T.splice(z,1));let ne=Math.min(z,oe),Be=Math.max(z,oe),Lt=ue?ae.slice(ne,Be+1):[],Et=T.map((me,be)=>{let ve=ue?be>=ne&&be<=Be?Lt[be-ne]:me.values[N]:be+1;return ve===me.values[N]?me:{...me,values:{...me.values,[N]:ve}}});H({...s.values,[m]:Et}),C(m)},removeLine(m,x){pe(m);let L=(s.values[m]??[]).filter(S=>S.key!==x);H({...s.values,[m]:L}),C(m)},async search(m,x,L=8,S={}){return fe(k(m),m,E(),x,L,S.model)},async previewLine(m,x,L){pe(m);let S=s.values[m]??[],N=S.find(ne=>ne.key===x);if(!N)throw new Error(`"${m}" has no line "${x}"`);let T={...N.values,...L},z=e.dataSource;if(!z?.onchange||t.data.kind!=="record")return T;let oe=S.map(ne=>ne.key===x?{...ne,values:T}:ne),ue=((await z.onchange({model:t.data.model,id:s.recordId,changed:m,values:ee({...s.values,[m]:oe})})).values?.[m]??[]).find(ne=>ne.key===x);return ue?{...T,...ue.values}:T},async searchLine(m,x,L,S,N=8){let T=pe(m),z=T.fields[L];if(!z)throw new Error(`The lines of "${m}" have no field "${L}"`);let oe=(s.values[m]??[]).find(ae=>ae.key===x);if(!oe)throw new Error(`"${m}" has no line "${x}"`);return fe(z,L,Ke(oe.values,T.fields),S,N)},canCreate:m=>Q(t.fields[m])!==null,quickCreate:(m,x)=>ce(t.fields[m],m,x),canCreateLine:(m,x)=>Q(pe(m).fields[x])!==null,quickCreateLine:(m,x,L)=>ce(pe(m).fields[x],x,L),steps:()=>i.filter(m=>!O(m).invisible),next(){if(!s.step)return!1;s.skipped.includes(s.step)&&b({skipped:s.skipped.filter(S=>S!==s.step)});let m=P(s.step);if(Object.keys(m).length)return b({errors:m}),!1;let x=se.steps(),L=i.slice(Se()+1).find(S=>x.includes(S));return L?(b({step:L,errors:{}}),!0):!1},back(){if(!s.step)return!1;let m=se.steps(),x=i.slice(0,Se()).reverse().find(L=>m.includes(L));return x?(b({step:x,errors:{}}),!0):!1},skip(){let m=s.step;if(!m||!Fe(m))return!1;let x=se.steps(),L=x[x.indexOf(m)+1];return L?(b({step:L,errors:{},skipped:[...s.skipped.filter(S=>S!==m),m]}),!0):!1},goTo(m){let x=se.steps(),L=x.indexOf(m),S=s.step?x.indexOf(s.step):-1;if(L===-1||S===-1)return!1;if(L<=S)return b({step:m,errors:{}}),!0;let N=[...s.skipped];for(let T of x.slice(S,L)){if(N.includes(T))continue;let z=P(T);if(Object.keys(z).length){if(Fe(T)){N.push(T);continue}return b({step:T,errors:z,skipped:N}),!1}}return b({step:m,errors:{},skipped:N}),!0},async runAction(m){let x=a.get(m);if(!x||x.kind!=="button"&&x.kind!=="stat")throw new Error(`The page has no button "${m}"`);if(O(m).invisible)return;let L=x.source;await u(Promise.resolve(e.onAction?.({id:m,action:L.action,..."params"in L&&L.params?{params:L.params}:{},recordId:s.recordId,values:ee(s.values)})))},restoreDraft(){let m=e.drafts?.store.getItem(o());if(!m)return;let x=JSON.parse(m);H({...s.values,...x.values},{draft:null})},discardDraft(){J(),b({draft:null})},async settled(){for(;g.size;)await Promise.allSettled([...g])},dispose(){v!==null&&n.clearTimeout(v),h!==null&&n.clearTimeout(h),f.clear()}};return s.recordId==null&&_(),se}function ur(e,t){let n=[],r=new Map(e.filter(i=>i.id!==void 0).map(i=>[i.key,i]));for(let i of t){let o=r.get(i.key);if(i.id===void 0||!o){n.push({op:"create",key:i.key,values:ee(i.values)});continue}let d={};for(let[s,l]of Object.entries(i.values))JSON.stringify(l)!==JSON.stringify(o.values[s])&&(d[s]=ee(l));Object.keys(d).length&&n.push({op:"update",id:i.id,values:d})}let a=new Set(t.map(i=>i.key));for(let i of e)i.id!==void 0&&!a.has(i.key)&&n.push({op:"delete",id:i.id});return n}function fr(e,t){let n=new Set(e.map(a=>a.id)),r=new Set(t.map(a=>a.id));return[...t.filter(a=>!n.has(a.id)).map(a=>({op:"link",id:a.id})),...e.filter(a=>!r.has(a.id)).map(a=>({op:"unlink",id:a.id}))]}function pr(e){let t=new Map,n=(a,i,o,d)=>{t.set(a.id,{id:a.id,parent:i,kind:o,field:d.field,invisible:Ae(d.invisible),readonly:Ae(d.readonly),required:Ae(d.required),source:a})},r=(a,i)=>{for(let o of a)if(o.type==="field")n(o,i,"field",{invisible:o.invisible,readonly:o.readonly,required:o.required,field:o.field});else if(o.type==="button")n(o,i,"button",{invisible:o.invisible});else if(o.type==="tabs"){n(o,i,"other",{invisible:o.invisible});for(let d of o.children)n(d,o.id,"other",{invisible:d.invisible}),r(d.children,d.id)}else o.type==="section"?(n(o,i,"other",{invisible:o.invisible,readonly:o.readonly}),r(o.children,o.id)):n(o,i,"other",{invisible:o.invisible})};if(e.type==="tabs")return r([e],""),t.get(e.id).parent=null,t;if(n(e,null,"other",{}),e.type==="wizard")for(let a of e.children)n(a,e.id,"step",{invisible:a.invisible}),r(a.children,a.id);else if(e.type==="sections")r(e.children,e.id);else{let a=(i,o)=>{o&&n({id:i},e.id,"field",{field:o})};a("#title",e.title?.field),a("#subtitle",e.title?.subtitleField),a("#avatar",e.title?.avatarField),a("#statusbar",e.statusbar?.field);for(let i of e.buttons??[])n(i,e.id,"button",{invisible:i.invisible});for(let i of e.statButtons??[])n(i,e.id,"stat",{invisible:i.invisible});e.ribbon&&n(e.ribbon,e.id,"other",{invisible:e.ribbon.invisible});for(let i of e.alerts??[])n(i,e.id,"other",{invisible:i.invisible});for(let i of e.badges??[])n(i,e.id,"other",{invisible:i.invisible});r([...e.title?.above??[],...e.title?.below??[]],e.id),r(e.children,e.id),e.sidePanel&&n(e.sidePanel,e.id,"other",{invisible:e.sidePanel.invisible})}return t}var dn=new Map;function ln(e,t){let n=`${e}:${t}`,r=dn.get(n);return r||(r=new Intl.NumberFormat(e,{numberingSystem:"latn",minimumFractionDigits:t,maximumFractionDigits:t}),dn.set(n,r)),r}function mr(e){let t=ln(e,1).formatToParts(12345.6);return{group:t.find(n=>n.type==="group")?.value??",",decimal:t.find(n=>n.type==="decimal")?.value??"."}}function Pe(e,t,n="en"){return ln(n,t).format(e)}function At(e,t="en"){let{group:n,decimal:r}=mr(t),a=e.replace(/[٠-٩]/g,i=>String(i.charCodeAt(0)-1632)).replace(/[۰-۹]/g,i=>String(i.charCodeAt(0)-1776)).replace(/٫/g,r).replace(/٬/g,n);return a=a.replace(/[\s\u00a0\u202f]/g,""),n.trim()&&(a=a.split(n).join("")),r==="."?a:a.split(r).join(".")}var de={en:{search:"Search\u2026",noResults:"No results",remove:"Remove {name}",clear:"Clear {label}",addLine:"Add a line",addSection:"Add a section",addNote:"Add a note",deleteLine:"Delete line",total:"Total",lineProblem:"Line {n}: {message}",moreProblems:"and {n} more",chooseColumns:"Choose columns",createNamed:"Create \u201C{name}\u201D",createAndEdit:"Create and edit\u2026",searchMore:"Search more\u2026",openNamed:"Open {name}",openLine:"Open line",chooseDate:"Choose a date",previousMonth:"Previous month",nextMonth:"Next month",weekShort:"Wk",week:"Week",formatting:"Formatting",bold:"Bold",italic:"Italic",underline:"Underline",textStyle:"Text style",paragraph:"Paragraph",heading:"Heading",subheading:"Subheading",bulletList:"Bulleted list",numberList:"Numbered list",alignLeft:"Align left",alignCenter:"Align centre",alignRight:"Align right",link:"Link",linkAddress:"Link address",applyLink:"Apply",removeLink:"Remove link",upload:"Upload a file",uploadImage:"Add a photo",replace:"Replace",removeFile:"Remove",dropHere:"or drop it here",invalidJson:"Not valid JSON"},ar:{search:"\u0628\u062D\u062B\u2026",noResults:"\u0644\u0627 \u062A\u0648\u062C\u062F \u0646\u062A\u0627\u0626\u062C",remove:"\u0625\u0632\u0627\u0644\u0629 {name}",clear:"\u0645\u0633\u062D {label}",addLine:"\u0625\u0636\u0627\u0641\u0629 \u0633\u0637\u0631",addSection:"\u0625\u0636\u0627\u0641\u0629 \u0642\u0633\u0645",addNote:"\u0625\u0636\u0627\u0641\u0629 \u0645\u0644\u0627\u062D\u0638\u0629",deleteLine:"\u062D\u0630\u0641 \u0627\u0644\u0633\u0637\u0631",total:"\u0627\u0644\u0625\u062C\u0645\u0627\u0644\u064A",lineProblem:"\u0627\u0644\u0633\u0637\u0631 {n}: {message}",moreProblems:"\u0648{n} \u0623\u062E\u0631\u0649",chooseColumns:"\u0627\u062E\u062A\u064A\u0627\u0631 \u0627\u0644\u0623\u0639\u0645\u062F\u0629",createNamed:"\u0625\u0646\u0634\u0627\u0621 \xAB{name}\xBB",createAndEdit:"\u0625\u0646\u0634\u0627\u0621 \u0648\u062A\u0639\u062F\u064A\u0644\u2026",searchMore:"\u0628\u062D\u062B \u0645\u0648\u0633\u0651\u0639\u2026",openNamed:"\u0641\u062A\u062D {name}",openLine:"\u0641\u062A\u062D \u0627\u0644\u0633\u0637\u0631",chooseDate:"\u0627\u062E\u062A\u064A\u0627\u0631 \u062A\u0627\u0631\u064A\u062E",previousMonth:"\u0627\u0644\u0634\u0647\u0631 \u0627\u0644\u0633\u0627\u0628\u0642",nextMonth:"\u0627\u0644\u0634\u0647\u0631 \u0627\u0644\u062A\u0627\u0644\u064A",weekShort:"\u0623\u0633\u0628\u0648\u0639",week:"\u0627\u0644\u0623\u0633\u0628\u0648\u0639",formatting:"\u0627\u0644\u062A\u0646\u0633\u064A\u0642",bold:"\u063A\u0627\u0645\u0642",italic:"\u0645\u0627\u0626\u0644",underline:"\u062A\u0633\u0637\u064A\u0631",textStyle:"\u0646\u0645\u0637 \u0627\u0644\u0646\u0635",paragraph:"\u0641\u0642\u0631\u0629",heading:"\u0639\u0646\u0648\u0627\u0646",subheading:"\u0639\u0646\u0648\u0627\u0646 \u0641\u0631\u0639\u064A",bulletList:"\u0642\u0627\u0626\u0645\u0629 \u0646\u0642\u0637\u064A\u0629",numberList:"\u0642\u0627\u0626\u0645\u0629 \u0645\u0631\u0642\u0645\u0629",alignLeft:"\u0645\u062D\u0627\u0630\u0627\u0629 \u0644\u0644\u064A\u0633\u0627\u0631",alignCenter:"\u062A\u0648\u0633\u064A\u0637",alignRight:"\u0645\u062D\u0627\u0630\u0627\u0629 \u0644\u0644\u064A\u0645\u064A\u0646",link:"\u0631\u0627\u0628\u0637",linkAddress:"\u0639\u0646\u0648\u0627\u0646 \u0627\u0644\u0631\u0627\u0628\u0637",applyLink:"\u062A\u0637\u0628\u064A\u0642",removeLink:"\u0625\u0632\u0627\u0644\u0629 \u0627\u0644\u0631\u0627\u0628\u0637",upload:"\u0631\u0641\u0639 \u0645\u0644\u0641",uploadImage:"\u0625\u0636\u0627\u0641\u0629 \u0635\u0648\u0631\u0629",replace:"\u0627\u0633\u062A\u0628\u062F\u0627\u0644",removeFile:"\u0625\u0632\u0627\u0644\u0629",dropHere:"\u0623\u0648 \u0623\u0641\u0644\u062A\u0647 \u0647\u0646\u0627",invalidJson:"\u0644\u064A\u0633 JSON \u0635\u0627\u0644\u062D\u064B\u0627"},de:{search:"Suchen\u2026",noResults:"Keine Ergebnisse",remove:"{name} entfernen",clear:"{label} leeren",addLine:"Zeile hinzuf\xFCgen",addSection:"Abschnitt hinzuf\xFCgen",addNote:"Notiz hinzuf\xFCgen",deleteLine:"Zeile l\xF6schen",total:"Summe",lineProblem:"Zeile {n}: {message}",moreProblems:"und {n} weitere",chooseColumns:"Spalten ausw\xE4hlen",createNamed:"\u201E{name}\u201C anlegen",createAndEdit:"Anlegen und bearbeiten\u2026",searchMore:"Weitere suchen\u2026",openNamed:"{name} \xF6ffnen",openLine:"Zeile \xF6ffnen",chooseDate:"Datum ausw\xE4hlen",previousMonth:"Vorheriger Monat",nextMonth:"N\xE4chster Monat",weekShort:"KW",week:"Kalenderwoche",formatting:"Formatierung",bold:"Fett",italic:"Kursiv",underline:"Unterstrichen",textStyle:"Textstil",paragraph:"Absatz",heading:"\xDCberschrift",subheading:"Unter\xFCberschrift",bulletList:"Aufz\xE4hlung",numberList:"Nummerierte Liste",alignLeft:"Linksb\xFCndig",alignCenter:"Zentriert",alignRight:"Rechtsb\xFCndig",link:"Link",linkAddress:"Linkadresse",applyLink:"\xDCbernehmen",removeLink:"Link entfernen",upload:"Datei hochladen",uploadImage:"Foto hinzuf\xFCgen",replace:"Ersetzen",removeFile:"Entfernen",dropHere:"oder hier ablegen",invalidJson:"Kein g\xFCltiges JSON"},fr:{search:"Rechercher\u2026",noResults:"Aucun r\xE9sultat",remove:"Retirer {name}",clear:"Effacer {label}",addLine:"Ajouter une ligne",addSection:"Ajouter une section",addNote:"Ajouter une note",deleteLine:"Supprimer la ligne",total:"Total",lineProblem:"Ligne {n} : {message}",moreProblems:"et {n} de plus",chooseColumns:"Choisir les colonnes",createNamed:"Cr\xE9er \xAB {name} \xBB",createAndEdit:"Cr\xE9er et modifier\u2026",searchMore:"Rechercher plus\u2026",openNamed:"Ouvrir {name}",openLine:"Ouvrir la ligne",chooseDate:"Choisir une date",previousMonth:"Mois pr\xE9c\xE9dent",nextMonth:"Mois suivant",weekShort:"Sem.",week:"Semaine",formatting:"Mise en forme",bold:"Gras",italic:"Italique",underline:"Soulign\xE9",textStyle:"Style du texte",paragraph:"Paragraphe",heading:"Titre",subheading:"Sous-titre",bulletList:"Liste \xE0 puces",numberList:"Liste num\xE9rot\xE9e",alignLeft:"Aligner \xE0 gauche",alignCenter:"Centrer",alignRight:"Aligner \xE0 droite",link:"Lien",linkAddress:"Adresse du lien",applyLink:"Appliquer",removeLink:"Supprimer le lien",upload:"T\xE9l\xE9verser un fichier",uploadImage:"Ajouter une photo",replace:"Remplacer",removeFile:"Retirer",dropHere:"ou d\xE9posez-le ici",invalidJson:"JSON invalide"}};var gr=180,cn=8;function mt(e,t){return e.replace(/\{(\w+)\}/g,(n,r)=>t[r]??n)}function gt(e){let{document:t,id:n,labels:r}=e,a=`${n}-list`,i=t.createElement("input");Object.assign(i,{id:n,className:"fd-input fd-combo-input",autocomplete:"off"}),i.setAttribute("role","combobox"),i.setAttribute("aria-autocomplete","list"),i.setAttribute("aria-expanded","false"),i.setAttribute("aria-controls",a),i.placeholder=r.search;let o=t.createElement("ul");o.id=a,o.className="fd-listbox",o.setAttribute("role","listbox"),o.hidden=!0;let d=t.createElement("div");d.className="fd-combo",d.append(i,o);let s="",l=null,p="",y=new Map,v=!1,h=[],g=-1,f=0,w,b=!1;function u(){if(o.replaceChildren(),h.forEach((M,P)=>{let H=t.createElement("li");H.id=`${a}-${P}`,H.setAttribute("role","option"),H.setAttribute("aria-selected",String(P===g)),H.className=`fd-option${P===g?" fd-active":""}${M===l||y.has(M)?" fd-option-create":""}`,H.textContent=M.label,H.addEventListener("mousedown",U=>U.preventDefault()),H.addEventListener("click",()=>F(P)),o.append(H)}),!h.length){let M=t.createElement("li");M.className="fd-empty",M.textContent=r.noResults,o.append(M)}g>=0?i.setAttribute("aria-activedescendant",`${a}-${g}`):i.removeAttribute("aria-activedescendant")}function E(){o.hidden=!1,i.setAttribute("aria-expanded","true")}function k(){clearTimeout(w),f++,o.hidden=!0,i.setAttribute("aria-expanded","false"),i.removeAttribute("aria-activedescendant"),g=-1}function F(M){let P=h[M];if(!P)return;let H=p;if(k(),v=!1,P===l&&e.create){e.create(H).then(e.pick,()=>{});return}let U=y.get(P);if(U){U(H).then(re=>re&&e.pick(re),()=>{});return}e.pick(P)}function O(M){clearTimeout(w);let P=++f;w=setTimeout(async()=>{let H=await e.search(M).catch(()=>[]);if(P!==f||t.activeElement!==i)return;let U=h[g],re=U&&U!==l&&!y.has(U)?U.id:void 0,J=e.exclude?.()??new Set,_=H.filter(C=>!J.has(C.id)),te=e.shown!==void 0&&_.length>e.shown;h=te?_.slice(0,e.shown):_;let Z=M.trim();l=null,e.create&&Z&&!H.some(C=>C.label.trim().toLowerCase()===Z.toLowerCase())&&(p=Z,l={id:"__create__",label:mt(r.createNamed,{name:Z})},h=[...h,l]),p=Z,y=new Map((e.more?.(Z,te)??[]).map((C,$)=>[{id:`__more_${$}__`,label:C.label},C.act])),h=[...h,...y.keys()],g=re===void 0?-1:h.findIndex(C=>C.id===re),u(),E()},gr)}return i.addEventListener("input",()=>{v=!0,b||O(i.value)}),i.addEventListener("focus",()=>{b||O("")}),i.addEventListener("keydown",M=>{if(!b)switch(M.key){case"ArrowDown":case"ArrowUp":{if(M.preventDefault(),o.hidden)return O(i.value);if(!h.length)return;g=(g+(M.key==="ArrowDown"?1:-1)+h.length)%h.length,u(),o.children[g]?.scrollIntoView?.({block:"nearest"});return}case"Enter":!o.hidden&&g>=0&&(M.preventDefault(),F(g));return;case"Escape":o.hidden||M.preventDefault(),k(),v=!1,i.value=s;return;case"Backspace":i.value===""&&e.onEmptyBackspace?.();return}}),i.addEventListener("blur",()=>{f++,clearTimeout(w),k();let M=v&&i.value.trim()===""&&s!=="";v=!1,M?e.onCommitEmpty?.():i.value=s}),{element:d,input:i,setText(M){s=M,v||(i.value=M)},setReadonly(M){b=M,i.readOnly=M,M&&k()},close:k}}function un(e,t,n){return n.options?.create!==!1&&e.canCreate(t)?r=>e.quickCreate(t,r):void 0}var Mt=({form:e,name:t,field:n,node:r,id:a,document:i,labels:o=de.en,dialogs:d})=>{let s=n.type==="many2one"?n.relation:"",l=!!d&&d.canOpen(s),p=!1,y=gt({document:i,id:a,labels:o,search:g=>e.search(t,g,cn+1),shown:cn,pick:g=>e.setValue(t,g),onCommitEmpty:()=>e.setValue(t,null),create:un(e,t,r),more:(g,f)=>{if(!d||p)return[];let w=[];return g&&l&&r.options?.create!==!1&&w.push({label:o.createAndEdit,act:b=>d.openRecord(s,{name:b,title:n.label})}),f&&w.push({label:o.searchMore,act:()=>d.searchMore({title:n.label,search:(b,u)=>e.search(t,b,u)})}),w}}),v=l?i.createElement("button"):null;v&&(v.type="button",v.className="fd-combo-open",v.textContent="\u2197",v.hidden=!0,v.addEventListener("click",async()=>{let g=e.getState().values[t];if(!g||!d)return;let f=await d.openRecord(s,{recordId:g.id,title:g.label});f&&f.label!==g.label&&e.setValue(t,f)}));let h=i.createElement("button");return h.type="button",h.className="fd-combo-clear",h.textContent="\xD7",h.setAttribute("aria-label",mt(o.clear,{label:n.label})),h.addEventListener("click",()=>{e.setValue(t,null),y.input.focus()}),y.element.append(h,...v?[v]:[]),{element:y.element,focus:()=>y.input.focus(),update(g){let f=g.value;p=g.readonly,y.setText(f?.label??""),y.setReadonly(g.readonly),h.hidden=!f||g.readonly,v&&(v.hidden=!f,f&&v.setAttribute("aria-label",mt(o.openNamed,{name:f.label}))),y.input.setAttribute("aria-invalid",String(g.invalid)),y.input.setAttribute("aria-required",String(g.required)),g.describedBy&&y.input.setAttribute("aria-describedby",g.describedBy)}}},bt=({form:e,name:t,node:n,id:r,document:a,labels:i=de.en})=>{let o=()=>e.getState().values[t]??[],d=a.createElement("div");d.className="fd-tags",d.setAttribute("role","group");let s=a.createElement("ul");s.className="fd-chips";let l=gt({document:a,id:r,labels:i,search:v=>e.search(t,v),pick:v=>{e.setValue(t,[...o(),v]),l.input.value=""},exclude:()=>new Set(o().map(v=>v.id)),onEmptyBackspace:()=>{let v=o();v.length&&e.setValue(t,v.slice(0,-1))},create:un(e,t,n)});d.append(s,l.element);let p=!1,y="";return{element:d,focus:()=>l.input.focus(),update(v){let h=v.value??[],g=JSON.stringify([v.readonly,h]);p=v.readonly,l.setReadonly(p),l.element.hidden=p,l.input.setAttribute("aria-invalid",String(v.invalid)),v.describedBy&&l.input.setAttribute("aria-describedby",v.describedBy),g!==y&&(y=g,fn(s,h,p,i,f=>e.setValue(t,o().filter(w=>w.id!==f.id))),l.setText(""))}}};function fn(e,t,n,r,a){let i=e.ownerDocument;e.replaceChildren(...t.map(o=>{let d=i.createElement("li");d.className="fd-chip";let s=i.createElement("span");if(s.className="fd-chip-label",s.textContent=o.label,d.append(s),!n){let l=i.createElement("button");l.type="button",l.className="fd-chip-remove",l.textContent="\xD7",l.setAttribute("aria-label",mt(r.remove,{name:o.label})),l.addEventListener("click",()=>a(o)),d.append(l)}return d}))}var Tt=({form:e,name:t,node:n,id:r,document:a,labels:i=de.en})=>{let o=n.options??{},d=typeof o.separator=="string"&&o.separator?o.separator:",",s=Array.isArray(o.suggestions)?o.suggestions.filter(b=>typeof b=="string"):[],l=b=>typeof b=="string"?b.split(d).map(u=>u.trim()).filter(u=>u!==""):[],p=()=>l(e.getState().values[t]),y=b=>e.setValue(t,b.length?b.join(`${d} `):null),v=b=>{let u=b.trim(),E=p();u&&!E.some(k=>k.toLowerCase()===u.toLowerCase())&&y([...E,u])},h=a.createElement("div");h.className="fd-tags",h.setAttribute("role","group");let g=a.createElement("ul");g.className="fd-chips";let f=gt({document:a,id:r,labels:i,search:async b=>{let u=new Set(p().map(k=>k.toLowerCase())),E=b.trim().toLowerCase();return s.filter(k=>!u.has(k.toLowerCase())&&k.toLowerCase().includes(E)).map(k=>({id:k,label:k}))},pick:b=>{v(b.label),f.input.value=""},onEmptyBackspace:()=>{let b=p();b.length&&y(b.slice(0,-1))}});f.input.addEventListener("keydown",b=>{b.key!=="Enter"||b.defaultPrevented||f.input.value.trim()===""||(b.preventDefault(),v(f.input.value),f.input.value="",f.close())}),f.input.addEventListener("input",()=>{let b=f.input.value.split(d);if(!(b.length<2)){for(let u of b.slice(0,-1))v(u);f.input.value=b[b.length-1].trimStart()}}),f.input.addEventListener("change",()=>{f.input.value.trim()&&v(f.input.value)}),h.append(g,f.element);let w="";return{element:h,focus:()=>f.input.focus(),update(b){let u=l(b.value);f.setReadonly(b.readonly),f.element.hidden=b.readonly,f.input.setAttribute("aria-invalid",String(b.invalid)),b.describedBy&&f.input.setAttribute("aria-describedby",b.describedBy);let E=JSON.stringify([b.readonly,u]);E!==w&&(w=E,fn(g,u.map(k=>({id:k,label:k})),b.readonly,i,k=>y(p().filter(F=>F!==k.label))),f.setText(""))}}},Ct=({form:e,name:t,id:n,document:r})=>{let a=r.createElement("div");a.id=n,a.className="fd-choices fd-choices-checkbox",a.setAttribute("role","group");let i=[],o={readonly:!1,value:[]},d=()=>{let s=new Set(o.value.map(l=>l.id));for(let{record:l,box:p}of i)p.checked=s.has(l.id),p.disabled=o.readonly};return e.search(t,"",50).then(s=>{i=s.map((l,p)=>{let y=r.createElement("input");y.type="checkbox",y.id=`${n}-${p}`,y.addEventListener("change",()=>{let g=e.getState().values[t]??[];e.setValue(t,y.checked?[...g,l]:g.filter(f=>f.id!==l.id))});let v=r.createElement("label");v.className="fd-choice",v.htmlFor=y.id;let h=r.createElement("span");return h.textContent=l.label,v.append(y,h),a.append(v),{record:l,box:y}}),d()}),{element:a,focus:()=>a.querySelector("input")?.focus(),update(s){o={readonly:s.readonly,value:s.value??[]},d()}}},$t=e=>{let{form:t,name:n,field:r,id:a,document:i,labels:o=de.en}=e,d=r.type==="reference"?r.models:[],s=i.createElement("div");s.className="fd-reference";let l=i.createElement("select");l.className="fd-input fd-select",l.setAttribute("aria-label",r.label),l.append(i.createElement("option"));for(let v of d){let h=i.createElement("option");h.value=String(v.value),h.textContent=v.label,l.append(h)}let p="";l.addEventListener("change",()=>{p=l.value,t.setValue(n,null)});let y=gt({document:i,id:a,labels:o,search:v=>p?t.search(n,v,8,{model:p}):Promise.resolve([]),pick:v=>t.setValue(n,{model:p,id:v.id,label:v.label}),onCommitEmpty:()=>t.setValue(n,null)});return s.append(l,y.element),{element:s,focus:()=>p?y.input.focus():l.focus(),update(v){let h=v.value;h&&(p=h.model),l.value=p,l.disabled=v.readonly,y.setText(h?.label??""),y.setReadonly(v.readonly||!p)}}};function pn(e){let t=/^(\d{4})-(\d{2})-(\d{2})(?:[T ](\d{2}):(\d{2}))?/.exec(e);if(!t)return null;let[,n,r,a,i,o]=t;return new Date(Number(n),Number(r)-1,Number(a),Number(i??0),Number(o??0))}function Vt(e,t,n={},r="en"){let a=(i,o)=>Pe(i,o,r);if(t==null||t==="")return"";switch(e.type){case"many2one":case"reference":return t.label??"";case"many2many":return(t??[]).map(i=>i.label).join(", ");case"selection":{let i=o=>e.options.find(d=>d.value===o)?.label??String(o);return Array.isArray(t)?t.map(i).join(", "):i(t)}case"integer":return a(Number(t),0);case"float":return a(Number(t),e.digits?.[1]??2);case"monetary":{let i=e.currency??(e.currencyField?n[e.currencyField]?.label:void 0),o=a(Number(t),e.digits?.[1]??2);return i?`${i} ${o}`:o}case"date":{let i=pn(String(t));return i?new Intl.DateTimeFormat(r==="en"?"en-GB":r,{day:"numeric",month:"short",year:"numeric",numberingSystem:"latn"}).format(i):String(t)}case"datetime":{let i=pn(String(t));return i?new Intl.DateTimeFormat(r==="en"?"en-GB":r,{day:"numeric",month:"short",year:"numeric",hour:"2-digit",minute:"2-digit",numberingSystem:"latn"}).format(i):String(t)}case"html":return String(t).replace(/<[^>]*>/g," ").replace(/\s+/g," ").trim();case"binary":case"image":return t.name??"";case"boolean":return t?"\u2713":"";default:return String(t)}}function mn(e,t){return t==="section"?{...e,type:"char"}:{...e,type:"text"}}function gn(e,t,n){let r=()=>(e.getState().values[t]??[]).find(a=>a.key===n)?.values??{};return{...e,getState:()=>({...e.getState(),values:r()}),setValue:(a,i)=>e.updateLine(t,n,a,i),search:(a,i,o)=>e.searchLine(t,n,a,i,o),canCreate:a=>e.canCreateLine(t,a),quickCreate:(a,i)=>e.quickCreateLine(t,a,i)}}var Ot=({form:e,name:t,field:n,node:r,id:a,document:i,labels:o=de.en,locale:d,dialogs:s})=>{let l=n,p=l.lineKinds,y=(r.columns??Object.keys(l.fields)).filter(J=>l.fields[J]&&J!==p?.field&&J!==l.sequenceField&&r.optionalColumns?.[J]!=="hide"),v=i.createElement("div");v.className="fd-lines",v.id=a,v.setAttribute("role","group");let h=i.createElement("div");h.className="fd-lines-scroll";let g=i.createElement("table");g.className="fd-lines-table";let f=i.createElement("thead"),w=i.createElement("tr");for(let J of y){let _=i.createElement("th");_.scope="col",_.textContent=l.fields[J].label,w.append(_)}let b=i.createElement("th");b.className="fd-lines-tools",w.append(b),f.append(w);let u=i.createElement("tbody");g.append(f,u);let E=(r.totals??[]).filter(J=>y.includes(J)),k=new Map;if(E.length){let J=i.createElement("tfoot"),_=i.createElement("tr");_.className="fd-lines-totals",y.forEach((te,Z)=>{let C=i.createElement("td");E.includes(te)?k.set(te,C):Z===0&&(C.textContent=o.total),_.append(C)}),_.append(i.createElement("td")),J.append(_),g.append(J)}h.append(g);let F=i.createElement("div");F.className="fd-lines-adds";let O=(J,_,te)=>{let Z=i.createElement("button");Z.type="button",Z.className="fd-button fd-button-link fd-lines-add",Z.dataset.add=te,Z.textContent=`+ ${J}`,Z.addEventListener("click",()=>{P=e.addLine(t,_);let C=M.get(P);C&&(C.cells[0]?.widget.focus(),P=null)}),F.append(Z)};O(o.addLine,{},"line"),p&&(O(o.addSection,{[p.field]:p.section??"section"},"section"),O(o.addNote,{[p.field]:p.note??"note"},"note")),v.append(h,F);let M=new Map,P=null,H=!1;function U(J,_,te,Z,C=1){let $=`${a}-${_.key}-${te}`,W={type:"field",id:`${r.id}.${_.key}.${te}`,field:te},X=ke({form:gn(e,t,_.key),name:te,field:Z,node:W,id:$,document:i,labels:o,locale:d,dialogs:s}),Q=i.createElement("td");Q.colSpan=C;let ce=i.createElement("label");ce.className="fd-sr-only",ce.htmlFor=$,ce.textContent=Z.label;let fe=i.createElement("div");return fe.className="fd-cell-error",fe.hidden=!0,Q.append(ce,X.element,fe),J.append(Q),{name:te,def:Z,widget:X,error:fe}}function re(J){let _=i.createElement("tr");_.dataset.line=J.key;let te=Me(l,J.values);te&&(_.className=`fd-line-${te}`);let Z=te&&p?[U(_,J,p.text,mn(l.fields[p.text],te),y.length)]:y.map(W=>U(_,J,W,l.fields[W])),C=i.createElement("td");C.className="fd-lines-tools";let $=i.createElement("button");return $.type="button",$.className="fd-line-delete",$.textContent="\xD7",$.setAttribute("aria-label",o.deleteLine),$.addEventListener("click",()=>e.removeLine(t,J.key)),C.append($),_.append(C),{element:_,kind:te,cells:Z,remove:$}}return{element:v,focus:()=>(u.querySelector("input, select, textarea")??F.querySelector("button"))?.focus(),update(J){H=J.readonly,F.hidden=H;let _=J.value??[],te=e.getState().errors,Z=new Set(_.map(C=>C.key));for(let[C,$]of M)Z.has(C)||($.element.remove(),M.delete(C));_.forEach((C,$)=>{let W=M.get(C.key);W&&W.kind!==Me(l,C.values)&&(W.element.remove(),W=void 0),W||(W=re(C),M.set(C.key,W)),u.children[$]!==W.element&&u.insertBefore(W.element,u.children[$]??null),W.remove.hidden=H,H?W.remove.remove():W.remove.isConnected||W.element.lastElementChild?.append(W.remove);for(let X of W.cells){let Q=te[`${t}.${C.key}.${X.name}`];X.error.hidden=!Q,X.error.textContent=Q??"",X.widget.update({value:C.values[X.name],values:C.values,readonly:H||X.def.readonly===!0,required:X.def.required===!0,invalid:!!Q})}});for(let[C,$]of k){let W=_.filter(X=>!Me(l,X.values)).reduce((X,Q)=>X+Number(Q.values[C]??0),0);$.textContent=Vt(l.fields[C],W,_[0]?.values??{},d)}P&&M.has(P)&&(M.get(P)?.cells[0]?.widget.focus(),P=null)}}};function br(e){return new Promise((t,n)=>{let r=new FileReader;r.onload=()=>{let a=String(r.result??"");t({name:e.name,type:e.type,size:e.size,data:a.slice(a.indexOf(",")+1)})},r.onerror=()=>n(r.error),r.readAsDataURL(e)})}function bn(e){return({form:t,name:n,field:r,id:a,document:i,labels:o=de.en})=>{let d=i.createElement("div");d.className=`fd-file fd-file-${e}`;let s=i.createElement("input");s.type="file",s.id=a,s.className="fd-sr-only";let l=r.type==="binary"?r.accept:e==="image"?["image/*"]:void 0;l&&(s.accept=l.join(","));let p=i.createElement("img");p.className="fd-image-preview",p.alt=r.label,p.hidden=!0;let y=i.createElement("label");y.className=e==="image"?"fd-file-pick fd-image-pick":"fd-file-pick",y.htmlFor=a;let v=i.createElement("span");v.className="fd-button",v.textContent=e==="image"?o.uploadImage:o.upload;let h=i.createElement("span");h.className="fd-help",h.textContent=o.dropHere,y.append(v,h);let g=i.createElement("div");g.className="fd-file-chosen";let f=i.createElement("span");f.className="fd-file-name";let w=i.createElement("button");w.type="button",w.className="fd-button fd-button-link",w.textContent=o.replace,w.addEventListener("click",()=>s.click());let b=i.createElement("button");b.type="button",b.className="fd-button fd-button-link",b.textContent=o.removeFile,b.addEventListener("click",()=>t.setValue(n,null)),g.append(f,w,b),d.append(s,...e==="image"?[p]:[],y,g);let u=!1,E=async k=>{!k||u||t.setValue(n,await br(k))};return s.addEventListener("change",()=>{E(s.files?.[0]),s.value=""}),d.addEventListener("dragover",k=>{u||(k.preventDefault(),d.classList.add("fd-dragging"))}),d.addEventListener("dragleave",()=>d.classList.remove("fd-dragging")),d.addEventListener("drop",k=>{k.preventDefault(),d.classList.remove("fd-dragging"),E(k.dataTransfer?.files?.[0])}),{element:d,focus:()=>(y.hidden?w:s).focus(),update(k){u=k.readonly;let F=k.value;if(y.hidden=!!F||u,g.hidden=!F,w.hidden=b.hidden=u,s.disabled=u,s.setAttribute("aria-invalid",String(k.invalid)),k.describedBy&&s.setAttribute("aria-describedby",k.describedBy),f.textContent=F?`${F.name} \xB7 ${Ye(F.size)}`:"",e==="image"){let O=F?F.data?`data:${F.type};base64,${F.data}`:F.url??"":"";p.hidden=!O,p.getAttribute("src")!==O&&(O?p.src=O:p.removeAttribute("src"))}}}}}var It=bn("binary"),Dt=bn("image");var hn=new Map;function yn(e,t){let n=hn.get(t);return n||(n=new Intl.NumberFormat(t,{style:"percent",maximumFractionDigits:0,numberingSystem:"latn"}),hn.set(t,n)),n.format(e/100)}var Ze=e=>{let{node:t,id:n,document:r,locale:a="en"}=e,i=t.options??{},o=typeof i.min=="number"?i.min:0,d=typeof i.max=="number"?i.max:100,s=typeof i.maxField=="string"?i.maxField:null,l=typeof i.color=="string"?i.color:"auto",p=i.showPercent!==!1,y=r.createElement("div");y.className="fd-progressbar",y.setAttribute("role","progressbar");let v=r.createElement("div");v.className="fd-progressbar-fill";let h=r.createElement("span");h.className="fd-progressbar-text",y.append(v,h);let g=null,f=y;return i.editable===!0?(g=ke({...e,node:{...t,widget:void 0}}),y.setAttribute("aria-hidden","true"),f=r.createElement("div"),f.className="fd-progressbar-edit",f.append(y,g.element)):y.id=n,{element:f,focus:()=>g?.focus(),update(w){let b=typeof w.value=="number"?w.value:0,u=s?Number(w.values[s]??0):d,E=u>o?Math.min(100,Math.max(0,(b-o)/(u-o)*100)):0,k=Math.round(E*10)/10;v.style.width=`${k}%`,y.setAttribute("aria-valuenow",String(b)),y.setAttribute("aria-valuemin",String(o)),y.setAttribute("aria-valuemax",String(u)),y.setAttribute("aria-valuetext",yn(E,a)),h.textContent=p?yn(E,a):"",y.dataset.tone=l!=="auto"?l:E<30?"danger":E<70?"warning":"success",g?.update(w)}}};function vn(e){return e==null?"":typeof e=="object"&&"label"in e?e.label:String(e)}var Xe=({field:e,node:t,id:n,document:r,locale:a="en"})=>{let i=t.options??{},o=p=>typeof i[p]=="string"?i[p]:"",d=p=>typeof i[p]=="string"?i[p]:null,s=e.type==="integer"?0:e.type==="float"||e.type==="monetary"?e.digits?.[1]??2:null,l=r.createElement("output");return l.id=n,l.className="fd-value-text",{element:l,focus:()=>{},update({value:p,values:y}){if(p==null||p===""){l.textContent="";return}let v=s!==null&&typeof p=="number"?Pe(p,s,a):ht(p,e),h=d("prefixField"),g=d("suffixField"),f=h?vn(y[h]):o("prefix"),w=g?vn(y[g]):o("suffix");l.textContent=[f,v,w].filter(b=>b!=="").join(" ")}}};var yt=({form:e,name:t,field:n,node:r,id:a,document:i})=>{let o=r.options??{},d=o.clickable===!0,s=Array.isArray(o.visibleStates)?o.visibleStates:null,l=i.createElement("ol");l.className="fd-statusbar",l.id=a,l.setAttribute("aria-label",n.label);let p=f=>f&&typeof f=="object"&&"id"in f?`id:${String(f.id)}`:`v:${String(f)}`,y=n.type==="selection"?n.options.map(f=>({key:p(f.value),label:f.label,value:f.value})):[],v=n.type==="selection",h={value:void 0,readonly:!1};function g(){let{value:f,readonly:w}=h,b=f==null?null:p(f),u=y.filter(E=>!s||s.some(k=>p(k)===E.key)||E.key===b);b&&!u.some(E=>E.key===b)&&f&&typeof f=="object"&&(u=[...u,{key:b,label:f.label,value:f}]),l.replaceChildren(...u.map(E=>{let k=i.createElement("span");k.textContent=E.label;let F=i.createElement(d?"button":"span");F instanceof HTMLButtonElement&&(F.type="button",F.disabled=w,F.addEventListener("click",()=>e.setValue(t,E.value))),F.append(k),E.key===b&&F.setAttribute("aria-current","step");let O=i.createElement("li");return O.append(F),O}))}return{element:l,focus:()=>l.querySelector("button:not([disabled])")?.focus(),update(f){h={value:f.value,readonly:f.readonly},g(),v||(v=!0,e.search(t,"",20).then(w=>{y=w.map(b=>({key:p(b),label:b.label,value:b})),g()}).catch(()=>{}))}}};function wn(e){let t=new Date(Date.UTC(e.getFullYear(),e.getMonth(),e.getDate()));t.setUTCDate(t.getUTCDate()+4-(t.getUTCDay()||7));let n=Date.UTC(t.getUTCFullYear(),0,1);return Math.ceil(((t.getTime()-n)/864e5+1)/7)}var xn=e=>String(e).padStart(2,"0"),Pt=(e,t)=>e.getFullYear()===t.getFullYear()&&e.getMonth()===t.getMonth()&&e.getDate()===t.getDate(),Le=(e,t)=>new Date(e.getFullYear(),e.getMonth(),e.getDate()+t);function vt(e,t){let n=new Date(e.getFullYear(),e.getMonth()+t+1,0).getDate();return new Date(e.getFullYear(),e.getMonth()+t,Math.min(e.getDate(),n))}function Wt(e,t){if(typeof t!="string"||!t)return null;if(e==="date"){let r=/^(\d{4})-(\d{2})-(\d{2})/.exec(t);return r?new Date(Number(r[1]),Number(r[2])-1,Number(r[3])):null}let n=new Date(t);return Number.isNaN(n.getTime())?null:n}function xt(e,t,n){let{form:r,name:a,id:i,document:o,locale:d="en"}=t,s=t.labels??de.en,l=d==="en"?"en-GB":d,p=new Intl.DateTimeFormat(l,{month:"long",year:"numeric",numberingSystem:"latn"}),y=new Intl.DateTimeFormat(l,{weekday:"long",day:"numeric",month:"long",year:"numeric",numberingSystem:"latn"}),v=new Intl.DateTimeFormat(l,{weekday:"short"}),h=new Intl.DateTimeFormat(l,{weekday:"long"}),g=o.createElement("button");g.type="button",g.className="fd-calendar-button";let f="http://www.w3.org/2000/svg",w=o.createElementNS(f,"svg");w.setAttribute("viewBox","0 0 16 16"),w.setAttribute("aria-hidden","true");for(let[$,W]of[["rect",{x:"2",y:"3",width:"12",height:"11",rx:"1.5"}],["path",{d:"M2 6.5h12M5 1.5v3M11 1.5v3"}]]){let X=o.createElementNS(f,$);for(let[Q,ce]of Object.entries(W))X.setAttribute(Q,ce);w.append(X)}g.append(w),g.setAttribute("aria-label",s.chooseDate),g.setAttribute("aria-haspopup","dialog"),g.setAttribute("aria-expanded","false"),g.setAttribute("aria-controls",`${i}-calendar`);let b=o.createElement("div");b.className="fd-calendar",b.id=`${i}-calendar`,b.setAttribute("role","dialog"),b.hidden=!0;let u=o.createElement("div");u.className="fd-calendar-head";let E=o.createElement("button");E.type="button",E.textContent="\u2039",E.setAttribute("aria-label",s.previousMonth);let k=o.createElement("span");k.className="fd-calendar-title",k.setAttribute("aria-live","polite");let F=o.createElement("button");F.type="button",F.textContent="\u203A",F.setAttribute("aria-label",s.nextMonth),u.append(E,k,F);let O=o.createElement("table");O.className="fd-calendar-grid",O.setAttribute("role","grid"),b.append(u,O);let M=o.createElement("span");M.className="fd-date-pick",M.append(e.element,g,b);let P=new Date,H=!1;function U($){if(n==="date")r.setValue(a,`${$.getFullYear()}-${xn($.getMonth()+1)}-${xn($.getDate())}`);else{let W=Wt("datetime",r.getState().values[a]),X=new Date($.getFullYear(),$.getMonth(),$.getDate(),W?.getHours()??0,W?.getMinutes()??0);r.setValue(a,X.toISOString())}Z()}function re($){let W=Wt(n,r.getState().values[a]),X=new Date,Q=p.format(P);k.textContent=Q,b.setAttribute("aria-label",Q);let ce=new Date(P.getFullYear(),P.getMonth(),1),fe=Le(ce,-((ce.getDay()+6)%7)),pe=o.createElement("tr"),Se=o.createElement("th");Se.scope="col",Se.textContent=s.weekShort,Se.setAttribute("abbr",s.week),pe.append(Se);for(let se=0;se<7;se++){let m=Le(fe,se),x=o.createElement("th");x.scope="col",x.textContent=v.format(m).replace(/\.$/,""),x.setAttribute("abbr",h.format(m)),pe.append(x)}let Fe=o.createElement("thead");Fe.append(pe);let Ne=o.createElement("tbody");for(let se=fe;se<=new Date(P.getFullYear(),P.getMonth()+1,0);se=Le(se,7)){let m=o.createElement("tr"),x=o.createElement("th");x.scope="row",x.className="fd-week",x.textContent=String(wn(se)),m.append(x);for(let L=0;L<7;L++){let S=Le(se,L),N=o.createElement("td"),T=o.createElement("button");T.type="button",T.textContent=String(S.getDate()),T.setAttribute("aria-label",y.format(S)),T.tabIndex=Pt(S,P)?0:-1,S.getMonth()!==P.getMonth()&&T.classList.add("fd-outside"),W&&Pt(S,W)&&T.setAttribute("aria-selected","true"),Pt(S,X)&&T.setAttribute("aria-current","date"),T.disabled=H,T.addEventListener("click",()=>U(S)),T.addEventListener("keydown",z=>_(z,S)),N.append(T),m.append(N)}Ne.append(m)}O.replaceChildren(Fe,Ne),$&&O.querySelector('button[tabindex="0"]')?.focus()}function J($){P=$,re(!0)}function _($,W){let X={ArrowLeft:()=>Le(W,-1),ArrowRight:()=>Le(W,1),ArrowUp:()=>Le(W,-7),ArrowDown:()=>Le(W,7),PageUp:()=>vt(W,-1),PageDown:()=>vt(W,1),Home:()=>Le(W,-((W.getDay()+6)%7)),End:()=>Le(W,6-(W.getDay()+6)%7)};X[$.key]?($.preventDefault(),J(X[$.key]())):($.key==="Enter"||$.key===" ")&&($.preventDefault(),U(W))}function te(){P=Wt(n,r.getState().values[a])??new Date,b.hidden=!1,g.setAttribute("aria-expanded","true"),re(!0)}function Z(){b.hidden||(b.hidden=!0,g.setAttribute("aria-expanded","false"),g.focus())}g.addEventListener("click",()=>b.hidden?te():Z()),E.addEventListener("click",()=>{P=vt(P,-1),re(!1)}),F.addEventListener("click",()=>{P=vt(P,1),re(!1)}),b.addEventListener("keydown",$=>{$.key==="Escape"&&($.preventDefault(),$.stopPropagation(),Z())});let C=$=>{!b.hidden&&!M.contains($.target)&&(b.hidden=!0,g.setAttribute("aria-expanded","false"))};return o.addEventListener("mousedown",C),{element:M,focus:()=>e.focus(),update($){H=$.readonly,g.hidden=$.readonly,$.readonly&&(b.hidden=!0),e.update($)},destroy(){o.removeEventListener("mousedown",C),e.destroy?.()}}}var hr=e=>{let t=e.replace(/_/g," ").trim();return t.charAt(0).toUpperCase()+t.slice(1)};function yr(e,t){let n=hr(e);return typeof t=="boolean"?{name:e,label:n,type:"boolean"}:typeof t=="number"?{name:e,label:n,type:Number.isInteger(t)?"integer":"float"}:typeof t=="string"&&/^\d{4}-\d{2}-\d{2}$/.test(t)?{name:e,label:n,type:"date"}:{name:e,label:n,type:"char"}}var zt=e=>{let{form:t,name:n,field:r,node:a,id:i,document:o}=e,d=r.type==="properties"?r.definitions:void 0,s=()=>{let g=t.getState().values[n];return g&&typeof g=="object"&&!Array.isArray(g)?g:{}},l={...t,getState:()=>({...t.getState(),values:s()}),setValue:(g,f)=>t.setValue(n,{...s(),[g]:f})},p=o.createElement("div");p.className="fd-properties",p.setAttribute("role","group");let y=[],v="";function h(g){for(let f of y)f.widget.destroy?.();y=g.map(f=>{let w=`${i}-${f.name}`,b={type:f.type,label:f.label,...f.options?{options:f.options}:{}},u={type:"field",id:`${a.id}.${f.name}`,field:f.name},E=ke({...e,form:l,name:f.name,field:b,node:u,id:w});return{definition:f,widget:E}}),p.replaceChildren(...y.map(({definition:f,widget:w})=>{let b=o.createElement("div");b.className="fd-property",b.dataset.type=f.type;let u=o.createElement("label");return u.htmlFor=`${i}-${f.name}`,u.textContent=f.label,b.append(u,w.element),b}))}return{element:p,focus:()=>y[0]?.widget.focus(),destroy:()=>y.forEach(g=>g.widget.destroy?.()),update(g){let f=s(),w=d??Object.keys(f).map(u=>yr(u,f[u])),b=JSON.stringify(w);b!==v&&(v=b,h(w));for(let{definition:u,widget:E}of y)E.update({value:f[u.name]??null,values:f,readonly:g.readonly,required:!1,invalid:!1})}}};var vr=new Set(["P","BR","B","STRONG","I","EM","U","S","UL","OL","LI","A","H1","H2","H3","H4","BLOCKQUOTE","CODE","PRE","SPAN","DIV"]),xr=new Set(["SCRIPT","STYLE","IFRAME","OBJECT","EMBED","TEMPLATE","NOSCRIPT","SVG","MATH"]),wr=new Set(["P","DIV","H1","H2","H3","H4","LI","BLOCKQUOTE","PRE"]),kr=new Set(["left","center","right","justify","start","end"]);function jt(e,t=globalThis.document){let n=t.createElement("template");n.innerHTML=e;let r=i=>{for(let o of[...i.childNodes]){if(o.nodeType===Node.TEXT_NODE)continue;if(o.nodeType!==Node.ELEMENT_NODE){o.remove();continue}let d=o;if(xr.has(d.tagName)){d.remove();continue}if(r(d),!vr.has(d.tagName)){d.replaceWith(...d.childNodes);continue}let s=d.tagName==="A"?d.getAttribute("href"):null,l=wr.has(d.tagName)?d.style?.textAlign?.trim().toLowerCase():"";for(let p of[...d.attributes])d.removeAttribute(p.name);s&&/^(https?:|mailto:)/i.test(s.trim())&&d.setAttribute("href",s.trim()),l&&kr.has(l)&&d.setAttribute("style",`text-align: ${l};`)}};r(n.content);let a=t.createElement("div");return a.append(n.content),a.innerHTML}function Sn(e){let t=e.trim();return/^(https?:\/\/|mailto:)\S+$/i.test(t)?t:/^[^\s@:/]+@[^\s@:/]+\.[^\s@:/]+$/.test(t)?`mailto:${t}`:/^[\w-]+(\.[\w-]+)+([/?#]\S*)?$/.test(t)?`https://${t}`:null}var kn=[["bold","bold","<b>B</b>"],["italic","italic","<i>I</i>"],["underline","underline","<u>U</u>"],["bulletList","insertUnorderedList",'<svg viewBox="0 0 16 16"><circle cx="3" cy="4" r="1.2"/><circle cx="3" cy="8" r="1.2"/><circle cx="3" cy="12" r="1.2"/><path d="M6 4h8M6 8h8M6 12h8"/></svg>'],["numberList","insertOrderedList",'<svg viewBox="0 0 16 16"><path d="M2.5 3h1v3M2 10.5c.5-.8 2-.8 2 .2 0 .8-2 1.3-2 2.3h2M6 4h8M6 8h8M6 12h8"/></svg>'],["alignLeft","justifyLeft",'<svg viewBox="0 0 16 16"><path d="M2 3.5h12M2 6.5h8M2 9.5h12M2 12.5h8"/></svg>'],["alignCenter","justifyCenter",'<svg viewBox="0 0 16 16"><path d="M2 3.5h12M4 6.5h8M2 9.5h12M4 12.5h8"/></svg>'],["alignRight","justifyRight",'<svg viewBox="0 0 16 16"><path d="M2 3.5h12M6 6.5h8M2 9.5h12M6 12.5h8"/></svg>'],["link","createLink",'<svg viewBox="0 0 16 16"><path d="M7 9a3 3 0 0 0 4.2 0l2.3-2.3a3 3 0 0 0-4.2-4.2L8.2 3.6M9 7a3 3 0 0 0-4.2 0L2.5 9.3a3 3 0 0 0 4.2 4.2l1.1-1.1"/></svg>']],Ht=({form:e,name:t,node:n,id:r,document:a,labels:i=de.en})=>{let o=a.createElement("div");o.id=r,o.className="fd-input fd-richtext",o.setAttribute("role","textbox"),o.setAttribute("aria-multiline","true"),o.setAttribute("contenteditable","true");let d=n.options?.toolbar!==!1,s="";o.addEventListener("input",()=>{let y=jt(o.innerHTML,a);s=y,e.setValue(t,y.trim()===""?null:y)}),o.addEventListener("blur",()=>{o.innerHTML!==s&&(o.innerHTML=s)});let l=d?Sr(o,a,i):null,p=o;return l&&(p=a.createElement("div"),p.className="fd-richtext-box",p.setAttribute("role","group"),o.setAttribute("aria-labelledby",`${r}-label`),p.append(l.bar,l.linkRow,o)),{element:p,focus:()=>o.focus(),destroy:()=>l?.destroy(),update(y){l&&(l.bar.hidden=y.readonly,y.readonly&&(l.linkRow.hidden=!0));let v=jt(typeof y.value=="string"?y.value:"",a);(v!==s||a.activeElement!==o)&&(o.innerHTML!==v&&(o.innerHTML=v),s=v),o.setAttribute("contenteditable",String(!y.readonly)),o.setAttribute("aria-readonly",String(y.readonly)),o.setAttribute("aria-invalid",String(y.invalid)),y.describedBy&&o.setAttribute("aria-describedby",y.describedBy)}}};function Sr(e,t,n){let r=t.createElement("div");r.className="fd-richtext-bar",r.setAttribute("role","toolbar"),r.setAttribute("aria-label",n.formatting);let a=null,i=()=>{e.focus();let f=t.getSelection();a&&f&&(f.removeAllRanges(),f.addRange(a))},o=(f,w)=>{i(),t.execCommand?.(f,!1,w)},d=t.createElement("select");d.className="fd-richtext-style",d.setAttribute("aria-label",n.textStyle);for(let[f,w]of[["p","paragraph"],["h2","heading"],["h3","subheading"]]){let b=t.createElement("option");b.value=f,b.textContent=n[w],d.append(b)}d.addEventListener("change",()=>o("formatBlock",`<${d.value}>`));let s=t.createElement("div");s.className="fd-link-row",s.hidden=!0;let l=t.createElement("input");l.className="fd-input",l.type="url",l.placeholder="https://",l.setAttribute("aria-label",n.linkAddress);let p=t.createElement("button");p.type="button",p.className="fd-button fd-link-apply",p.textContent=n.applyLink;let y=t.createElement("button");y.type="button",y.className="fd-button fd-button-link fd-link-remove",y.textContent=n.removeLink,s.append(l,p,y),p.addEventListener("click",()=>{let f=Sn(l.value);if(!f){l.setAttribute("aria-invalid","true");return}l.setAttribute("aria-invalid","false"),i(),t.execCommand?.("createLink",!1,f),s.hidden=!0}),y.addEventListener("click",()=>{i(),t.execCommand?.("unlink",!1),s.hidden=!0}),l.addEventListener("keydown",f=>{f.key==="Enter"?(f.preventDefault(),p.click()):f.key==="Escape"&&(f.preventDefault(),s.hidden=!0,i())});let v=kn.map(([f,w,b])=>{let u=t.createElement("button");return u.type="button",u.className="fd-richtext-tool",u.setAttribute("aria-label",n[f]),u.title=n[f],u.innerHTML=b,u.querySelector("svg")?.setAttribute("aria-hidden","true"),["bold","italic","underline"].includes(w)&&u.setAttribute("aria-pressed","false"),u.addEventListener("mousedown",E=>E.preventDefault()),u.addEventListener("click",()=>{if(w!=="createLink")return o(w);s.hidden=!1,l.value="",l.focus()}),u});r.append(d,...v);let h=[d,...v];h.forEach((f,w)=>f.tabIndex=w===0?0:-1),r.addEventListener("keydown",f=>{if(f.key!=="ArrowRight"&&f.key!=="ArrowLeft")return;let w=h.indexOf(t.activeElement);if(w<0)return;let b=getComputedStyle(r).direction==="rtl",u=f.key==="ArrowRight"!==b?1:-1,E=h[(w+u+h.length)%h.length];f.preventDefault(),h.forEach(k=>k.tabIndex=k===E?0:-1),E.focus()});let g=()=>{let f=t.getSelection();if(!f||!f.rangeCount||!e.contains(f.anchorNode))return;a=f.getRangeAt(0).cloneRange();for(let b of v){let u=kn[v.indexOf(b)][1];b.hasAttribute("aria-pressed")&&b.setAttribute("aria-pressed",String(t.queryCommandState?.(u)??!1))}let w=String(t.queryCommandValue?.("formatBlock")??"").toLowerCase().replace(/[<>]/g,"");d.value=w==="h2"||w==="h3"?w:"p"};return t.addEventListener("selectionchange",g),{bar:r,linkRow:s,destroy:()=>t.removeEventListener("selectionchange",g)}}var Bt=({form:e,name:t,id:n,document:r,labels:a=de.en})=>{let i=r.createElement("div");i.className="fd-json";let o=r.createElement("textarea");o.id=n,o.className="fd-input fd-textarea fd-code",o.spellcheck=!1;let d=r.createElement("div");return d.className="fd-cell-error",d.hidden=!0,i.append(o,d),o.addEventListener("input",()=>{if(o.value.trim()===""){d.hidden=!0,e.setValue(t,null);return}try{let s=JSON.parse(o.value);d.hidden=!0,e.setValue(t,s)}catch{d.hidden=!1,d.textContent=a.invalidJson}}),{element:i,focus:()=>o.focus(),update(s){if(r.activeElement!==o){let l=s.value===null||s.value===void 0?"":JSON.stringify(s.value,null,2);o.value!==l&&(o.value=l)}o.readOnly=s.readonly,o.setAttribute("aria-invalid",String(s.invalid||!d.hidden))}}};function ke(e,t={}){let{field:n,node:r}=e,a=[r.widget?`${n.type}.${r.widget}`:null,n.type==="selection"&&n.multiple?"selection.checkboxes":null,n.type].filter(i=>i!==null);for(let i of a){let o=t[i]??Nn[i];if(o)return o(e)}return Mr(e)}function le(e,t,n={},...r){let a=e.createElement(t);for(let[i,o]of Object.entries(n))o!==void 0&&a.setAttribute(i,o);return a.append(...r),a}function Re(e,t){e.setAttribute("aria-invalid",String(t.invalid)),e.setAttribute("aria-required",String(t.required)),t.describedBy?e.setAttribute("aria-describedby",t.describedBy):e.removeAttribute("aria-describedby")}var kt=e=>e==null?"":String(e);function Qe(e){return({form:t,name:n,field:r,node:a,id:i,document:o})=>{let d=le(o,"input",{id:i,type:e,class:"fd-input",autocomplete:"off"});return r.type==="char"&&r.size!==void 0&&(d.maxLength=r.size),a.placeholder&&(d.placeholder=a.placeholder),d.addEventListener("input",()=>t.setValue(n,d.value===""?null:d.value)),{element:d,focus:()=>d.focus(),update(s){let l=kt(s.value);d.value!==l&&(d.value=l),d.readOnly=s.readonly,Re(d,s)}}}}var Lr=({form:e,name:t,field:n,node:r,id:a,document:i})=>{let o=le(i,"textarea",{id:a,class:"fd-input fd-textarea",rows:"3"});return n.type==="text"&&n.size!==void 0&&(o.maxLength=n.size),r.placeholder&&(o.placeholder=r.placeholder),o.addEventListener("input",()=>e.setValue(t,o.value===""?null:o.value)),{element:o,focus:()=>o.focus(),update(d){let s=kt(d.value);o.value!==s&&(o.value=s),o.readOnly=d.readonly,Re(o,d)}}},Er=/^-?(\d+\.?\d*|\.\d+)$/,Rr=/^-?\.?$/,qt=e=>{let{form:t,name:n,field:r,node:a,id:i,document:o,locale:d="en"}=e,s=r.type==="integer",l=s?0:(r.type==="float"||r.type==="monetary"?r.digits?.[1]:void 0)??2,p=F=>typeof F=="number"?Pe(F,l,d):kt(F),y=le(o,"input",{id:i,type:"text",class:"fd-input fd-number-input",autocomplete:"off"});y.inputMode=s?"numeric":"decimal",a.placeholder&&(y.placeholder=a.placeholder);let v=F=>{let O=At(F.trim(),d);if(O==="")return null;if(Er.test(O))return Number(O);if(!Rr.test(O))return O};y.addEventListener("input",()=>{let F=v(y.value);F!==void 0&&t.setValue(n,F)}),y.addEventListener("blur",()=>{y.value=p(t.getState().values[n])});let h=a.options??{},g=r.type==="monetary"?r.currencyField:void 0,f=g?t.page.fields[g]:void 0,w=g&&f&&h.pickCurrency===!0?ke({...e,name:g,field:f,node:{type:"field",id:`${a.id}.currency`,field:g},id:`${i}-currency`}):null;w&&f&&w.element.querySelector("input, select")?.setAttribute("aria-label",f.label),w?.element.matches("input, select")&&f&&w.element.setAttribute("aria-label",f.label);let b=r.type==="monetary"&&!w?le(o,"span",{class:"fd-currency","aria-hidden":"true"}):null,u=w?.element??b,E=h.symbol==="after";return{element:u?le(o,"span",{class:`fd-number${E?" fd-currency-after":""}${w?" fd-currency-picked":""}`},...E?[y,u]:[u,y]):y,focus:()=>y.focus(),update(F){let O=o.activeElement===y,M=v(y.value),P=M===void 0||M===F.value;if(!(O&&P)){let H=p(F.value);y.value!==H&&(y.value=H)}if(y.readOnly=F.readonly,Re(y,F),w&&g&&w.update({value:F.values[g],values:F.values,readonly:F.readonly,required:!1,invalid:!1}),b&&r.type==="monetary"){let H=r.currencyField?F.values[r.currencyField]:null;b.textContent=H&&typeof H=="object"&&"label"in H?H.label:typeof H=="string"?H:r.currency??""}}}};function Ln(e){return({form:t,name:n,id:r,document:a})=>{let i=le(a,"input",{id:r,type:"checkbox",class:e?"fd-switch":"fd-checkbox",role:e});return i.addEventListener("change",()=>t.setValue(n,i.checked)),{element:i,focus:()=>i.focus(),update(o){i.checked=o.value===!0,i.disabled=o.readonly,Re(i,o)}}}}function Fn(e){return e.type==="selection"?e.options:[]}var Fr=({form:e,name:t,field:n,id:r,document:a})=>{let i=Fn(n),o=le(a,"select",{id:r,class:"fd-input fd-select"},le(a,"option",{value:""}));return i.forEach((d,s)=>o.append(le(a,"option",{value:String(s)},d.label))),o.addEventListener("change",()=>e.setValue(t,o.value===""?null:i[Number(o.value)].value)),{element:o,focus:()=>o.focus(),update(d){let s=i.findIndex(l=>l.value===d.value);o.value=s===-1?"":String(s),o.disabled=d.readonly,Re(o,d)}}};function En(e){return({form:t,name:n,field:r,id:a,document:i})=>{let o=Fn(r),d=le(i,"div",{id:a,class:`fd-choices fd-choices-${e}`,role:e==="radio"?"radiogroup":"group"}),s=o.map((l,p)=>{let y=le(i,"input",{type:e,name:a,value:String(p),id:`${a}-${p}`});return d.append(le(i,"label",{class:"fd-choice",for:`${a}-${p}`},y,le(i,"span",{},l.label))),y});return d.addEventListener("change",()=>{if(e==="radio"){let l=s.findIndex(p=>p.checked);t.setValue(n,l===-1?null:o[l].value)}else t.setValue(n,o.filter((l,p)=>s[p].checked).map(l=>l.value))}),{element:d,focus:()=>(s.find(l=>l.checked)??s[0])?.focus(),update(l){let p=Array.isArray(l.value)?l.value:[l.value];s.forEach((y,v)=>{y.checked=p.includes(o[v].value),y.disabled=l.readonly}),Re(d,l)}}}}function Rn(e){return({form:t,name:n,field:r,id:a,document:i})=>{let o="min"in r&&r.min!==void 0?r.min:e==="rating"?1:0,d="max"in r&&r.max!==void 0?r.max:e==="rating"?5:10,s=le(i,"div",{id:a,class:`fd-points fd-${e}`,role:"radiogroup"}),l=[];for(let p=o;p<=d;p++){let y=le(i,"button",{type:"button",role:"radio","aria-label":`${p} of ${d}`,"data-value":String(p)},e==="rating"?"\u2605":String(p));e==="scale"&&y.removeAttribute("aria-label"),y.addEventListener("click",()=>t.setValue(n,p)),l.push(y),s.append(y)}return s.addEventListener("keydown",p=>{let y=t.getState().values[n],v=typeof y=="number"?y:o-1,h=p.key==="ArrowRight"||p.key==="ArrowUp"?1:p.key==="ArrowLeft"||p.key==="ArrowDown"?-1:0;if(!h)return;p.preventDefault();let g=Math.min(d,Math.max(o,v+h));t.setValue(n,g),l[g-o]?.focus()}),{element:s,focus:()=>(l.find(p=>p.getAttribute("aria-checked")==="true")??l[0])?.focus(),update(p){let y=typeof p.value=="number"?p.value:null;l.forEach((v,h)=>{let g=o+h;v.setAttribute("aria-checked",String(g===y)),v.classList.toggle("fd-on",e==="rating"?y!==null&&g<=y:g===y),v.tabIndex=g===y||y===null&&h===0?0:-1,v.disabled=p.readonly}),Re(s,p)}}}}var Nr=e=>{let{form:t,name:n,id:r,document:a,node:i}=e,o=le(a,"input",{id:r,type:"date",class:"fd-input fd-date"});o.addEventListener("input",()=>t.setValue(n,o.value||null));let d={element:o,focus:()=>o.focus(),update(s){let l=kt(s.value);o.value!==l&&(o.value=l),o.readOnly=s.readonly,Re(o,s)}};return i.options?.weekNumbers===!0?xt(d,e,"date"):d},wt=e=>String(e).padStart(2,"0"),Ar=e=>{let{form:t,name:n,id:r,document:a,node:i}=e,o=le(a,"input",{id:r,type:"datetime-local",class:"fd-input fd-datetime"}),d=l=>{if(typeof l!="string"||!l)return"";let p=new Date(l);return Number.isNaN(p.getTime())?"":`${p.getFullYear()}-${wt(p.getMonth()+1)}-${wt(p.getDate())}T${wt(p.getHours())}:${wt(p.getMinutes())}`};o.addEventListener("input",()=>{if(!o.value)return t.setValue(n,null);let l=new Date(o.value);Number.isNaN(l.getTime())||t.setValue(n,l.toISOString())});let s={element:o,focus:()=>o.focus(),update(l){let p=d(l.value);o.value!==p&&(o.value=p),o.readOnly=l.readonly,Re(o,l)}};return i.options?.weekNumbers===!0?xt(s,e,"datetime"):s};function Mr({field:e,id:t,document:n}){let r=le(n,"span",{id:t,class:"fd-pending","data-fd-pending":e.type});return{element:r,focus:()=>{},update(a){r.textContent=ht(a.value,e)}}}function ht(e,t){if(e==null)return"";switch(t.type){case"many2one":case"reference":return e.label;case"many2many":return e.map(n=>n.label).join(", ");case"one2many":{let n=e.length;return`${n} ${n===1?"line":"lines"}`}case"binary":case"image":return e.name;case"html":return String(e).replace(/<[^>]*>/g," ").replace(/\s+/g," ").trim();default:return typeof e=="object"?JSON.stringify(e):String(e)}}var Nn={char:Qe("text"),"char.email":Qe("email"),"char.phone":Qe("tel"),"char.url":Qe("url"),"char.password":Qe("password"),"char.tags":Tt,text:Lr,integer:qt,float:qt,monetary:qt,"integer.rating":Rn("rating"),"integer.scale":Rn("scale"),"integer.progressbar":Ze,"integer.label":Xe,"float.label":Xe,"monetary.label":Xe,"float.progressbar":Ze,"monetary.progressbar":Ze,boolean:Ln(),"boolean.toggle":Ln("switch"),selection:Fr,"selection.radio":En("radio"),"selection.checkboxes":En("checkbox"),"selection.statusbar":yt,date:Nr,datetime:Ar,many2one:Mt,"many2one.statusbar":yt,many2many:bt,"many2many.tags":bt,"many2many.checkboxes":Ct,reference:$t,one2many:Ot,binary:It,image:Dt,html:Ht,json:Bt,properties:zt};var Mn=`
|
|
3
3
|
/* .fd-theme carries the same tokens for things outside a form, such as a dialog over the page. */
|
|
4
4
|
.fd-form, .fd-theme {
|
|
@@ -364,9 +364,11 @@
|
|
|
364
364
|
[dir="rtl"] .fd-statusbar button, [dir="rtl"] .fd-statusbar span { transform: scaleX(-1); }
|
|
365
365
|
[dir="rtl"] .fd-statusbar button > *, [dir="rtl"] .fd-statusbar span > * { display: inline-block; transform: scaleX(-1); }
|
|
366
366
|
.fd-sheet-layout { display: grid; grid-template-columns: minmax(0, 1fr); gap: 16px; max-width: var(--fd-page-max, 1180px); margin: 16px auto 0; padding-inline: 16px; }
|
|
367
|
+
/* The sheet keeps its own height: a long side panel beside it must not stretch it. */
|
|
368
|
+
.fd-sheet-layout { align-items: start; }
|
|
367
369
|
/* Save and Discard closing the sheet, when the page puts them at its foot. */
|
|
368
370
|
.fd-sheet-foot { margin: 4px -28px -28px; padding: 12px 28px; border-block-start: 1px solid var(--fd-border); border-end-start-radius: inherit; border-end-end-radius: inherit; }
|
|
369
|
-
.fd-sheet-layout.fd-has-side { grid-template-columns: minmax(0, 1fr) minmax(
|
|
371
|
+
.fd-sheet-layout.fd-has-side { grid-template-columns: minmax(0, 1fr) minmax(260px, 360px); }
|
|
370
372
|
@container (max-width: 860px) { .fd-sheet-layout.fd-has-side { grid-template-columns: minmax(0, 1fr); } }
|
|
371
373
|
.fd-card {
|
|
372
374
|
position: relative; background: var(--fd-surface); border: 1px solid var(--fd-border);
|
|
@@ -604,5 +606,5 @@
|
|
|
604
606
|
@media (prefers-reduced-motion: reduce) { .fd-form *, .fd-form *::before, .fd-form *::after { transition: none !important; } }
|
|
605
607
|
`,An="fieldia-styles";function Jt(e){if(e.getElementById(An))return;let t=e.createElement("style");t.id=An,t.textContent=Mn,(e.head??e.documentElement).append(t)}function Ut(e){let t=()=>{try{return e??globalThis.localStorage??null}catch{return null}};return{get(n){try{let r=t()?.getItem(`fieldia:${n}`);return r==null?null:JSON.parse(r)}catch{return null}},set(n,r){try{t()?.setItem(`fieldia:${n}`,JSON.stringify(r))}catch{}}}}function Tr(){let e=new Map;return{get:t=>e.has(t)?Tn(e.get(t)):null,set:(t,n)=>{e.set(t,Tn(n))}}}var Tn=e=>JSON.parse(JSON.stringify(e));var Cr="http://www.w3.org/2000/svg",Cn={user:'<circle cx="12" cy="8" r="4"/><path d="M4 21c0-4 3.6-6 8-6s8 2 8 6"/>',users:'<circle cx="9" cy="8" r="3.5"/><path d="M2 20c0-3.5 3-5.5 7-5.5s7 2 7 5.5"/><circle cx="17" cy="9" r="2.5"/><path d="M16.5 14.5c3 0 5.5 1.6 5.5 4.5"/>',building:'<rect x="4" y="3" width="16" height="18" rx="1"/><path d="M9 21v-4h6v4M8 7h2M14 7h2M8 11h2M14 11h2"/>',home:'<path d="M3 11l9-7 9 7"/><path d="M5 10v10h14V10"/><path d="M10 20v-6h4v6"/>',phone:'<rect x="7" y="2" width="10" height="20" rx="2"/><path d="M11 18h2"/>',mail:'<rect x="3" y="5" width="18" height="14" rx="2"/><path d="M3 7l9 6 9-6"/>',pin:'<path d="M12 21s-7-6.5-7-12a7 7 0 0 1 14 0c0 5.5-7 12-7 12z"/><circle cx="12" cy="9" r="2.5"/>',globe:'<circle cx="12" cy="12" r="9"/><path d="M3 12h18M12 3c3 3.2 3 14.8 0 18M12 3c-3 3.2-3 14.8 0 18"/>',calendar:'<rect x="3" y="5" width="18" height="16" rx="2"/><path d="M3 10h18M8 3v4M16 3v4"/>',clock:'<circle cx="12" cy="12" r="9"/><path d="M12 7v5l3 3"/>',money:'<rect x="2" y="6" width="20" height="12" rx="2"/><circle cx="12" cy="12" r="3"/><path d="M6 9.5v0M18 14.5v0"/>',cart:'<path d="M3 4h2l2.5 11h11L21 7H6.4"/><circle cx="9" cy="19.5" r="1.5"/><circle cx="17" cy="19.5" r="1.5"/>',box:'<path d="M12 3l8 4.5v9L12 21l-8-4.5v-9z"/><path d="M4 7.5l8 4.5 8-4.5M12 12v9"/>',truck:'<path d="M2 6h12v10H2zM14 9h4l3 3.5V16h-7"/><circle cx="6.5" cy="17.5" r="1.8"/><circle cx="17" cy="17.5" r="1.8"/>',receipt:'<path d="M6 3h12v18l-3-2-3 2-3-2-3 2z"/><path d="M9 8h6M9 12h6"/>',file:'<path d="M6 3h8l4 4v14H6z"/><path d="M14 3v4h4M9 12h6M9 16h6"/>',edit:'<path d="M4 20h4L19 9l-4-4L4 16z"/><path d="M13.5 6.5l4 4"/>',tag:'<path d="M3 12V4h8l10 10-8 8z"/><circle cx="7.5" cy="8" r="1.5"/>',star:'<path d="M12 3l2.8 6 6.2.6-4.7 4.2 1.4 6.2L12 16.8 6.3 20l1.4-6.2L3 9.6 9.2 9z"/>',lock:'<rect x="5" y="11" width="14" height="10" rx="2"/><path d="M8 11V7a4 4 0 0 1 8 0v4"/>',check:'<path d="M5 12.5l4.5 4.5L19 7.5"/>',info:'<circle cx="12" cy="12" r="9"/><path d="M12 11v6M12 7.5v0"/>',warning:'<path d="M12 3l10 18H2z"/><path d="M12 10v5M12 18v0"/>',settings:'<path d="M4 6h9M17 6h3M4 12h3M11 12h9M4 18h11M19 18h1"/><circle cx="15" cy="6" r="2"/><circle cx="9" cy="12" r="2"/><circle cx="17" cy="18" r="2"/>',chart:'<path d="M3 20h18M6 20v-8M11 20V5M16 20v-6"/>',link:'<path d="M10 14a4 4 0 0 0 5.6 0l3-3a4 4 0 0 0-5.6-5.6l-1 1"/><path d="M14 10a4 4 0 0 0-5.6 0l-3 3a4 4 0 0 0 5.6 5.6l1-1"/>',list:'<path d="M8 6h12M8 12h12M8 18h12M4 6v0M4 12v0M4 18v0"/>',chat:'<path d="M4 5h16v11H9l-5 4z"/>'};function et(e,t,n){let r=t?n?.[t]??Cn[t]:void 0;if(r===void 0)return null;let a=e.createElementNS(Cr,"svg");for(let[i,o]of Object.entries({viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"1.8","stroke-linecap":"round","stroke-linejoin":"round","aria-hidden":"true",focusable:"false",class:"fd-icon","data-icon":t}))a.setAttribute(i,o);return a.innerHTML=r,a}var $n=0,$r='button, [href], input, select, textarea, [contenteditable="true"], [tabindex]:not([tabindex="-1"])';function St(e){let t=e.container?.ownerDocument??document,n=e.container??t.body,r=t.activeElement instanceof t.defaultView.HTMLElement?t.activeElement:null,a={...Ce[e.locale??"en"],...e.labels},i=`fd-dialog-${++$n}`,o=(u,E={},k)=>{let F=t.createElement(u);for(let[O,M]of Object.entries(E))F.setAttribute(O,M);return k!==void 0&&(F.textContent=k),F},d=o("h2",{id:`${i}-title`,class:"fd-form-dialog-title"},e.title),s=o("button",{type:"button",class:"fd-dialog-close","aria-label":a.close},"\xD7"),l=o("div",{class:"fd-form-dialog-body"}),p=o("button",{type:"button",class:"fd-button"},a.discard),y=o("button",{type:"button",class:"fd-button fd-button-primary"},a.saveClose),v=o("div",{class:`fd-theme fd-form-dialog fd-size-${e.size??"medium"}`,"data-fd-skin":e.skin??"underline",role:"dialog","aria-modal":"true","aria-labelledby":d.id,tabindex:"-1"});e.dir&&v.setAttribute("dir",e.dir),v.append(o("div",{class:"fd-form-dialog-head"}),l,o("div",{class:"fd-actions fd-actions-end fd-form-dialog-foot"})),v.firstElementChild?.append(d,s),v.lastElementChild?.append(p,y);let h=o("div",{class:"fd-dialog-backdrop fd-form-dialog-backdrop"});h.append(v),n.append(h);let g=Kt(l,{...e,showActions:!1}),f=!1;e.recompute&&Vr(g.form,e.page.fields,e.recompute,()=>f);let w=()=>[...v.querySelectorAll($r)].filter(u=>!u.closest("[hidden], [inert]")&&!u.disabled),b=()=>l.querySelector('input:not([type="hidden"]), select, textarea, [contenteditable="true"]');return(b()??v).focus(),g.form.settled().then(()=>{(t.activeElement===v||!v.contains(t.activeElement))&&b()?.focus()}),new Promise(u=>{let E=k=>{if(f)return;f=!0;let F=g.form.getState(),O={saved:k,recordId:F.recordId??null,values:F.values};g.destroy(),h.remove(),r?.focus(),u(O)};y.addEventListener("click",async()=>{y.disabled=!0;let k=e.mode==="values"?g.check():await g.save();y.disabled=!1,k&&E(!0)}),p.addEventListener("click",()=>E(!1)),s.addEventListener("click",()=>E(!1)),v.addEventListener("keydown",k=>{if(k.key==="Enter"&&(k.ctrlKey||k.metaKey)&&!k.isComposing){if(k.target.closest(".ag-root-wrapper"))return;k.preventDefault(),t.activeElement?.dispatchEvent(new Event("change",{bubbles:!0})),y.click();return}if(!k.defaultPrevented){if(k.key==="Escape")k.preventDefault(),E(!1);else if(k.key==="Tab"){let F=w();if(!F.length)return;let O=F[0],M=F[F.length-1];k.shiftKey&&t.activeElement===O?(k.preventDefault(),M.focus()):!k.shiftKey&&t.activeElement===M&&(k.preventDefault(),O.focus())}}})})}function Vr(e,t,n,r){let a=JSON.stringify(e.getState().values),i=!1;e.subscribe(()=>{let o=e.getState().values,d=JSON.stringify(o);i||d===a||(a=d,n(o).then(s=>{if(!(r()||JSON.stringify(e.getState().values)!==d)){i=!0;for(let[l,p]of Object.entries(s))l in t&&JSON.stringify(o[l]??null)!==JSON.stringify(p??null)&&e.setValue(l,p);i=!1,a=JSON.stringify(e.getState().values)}},()=>{}))})}function _t(e){let t=e.container?.ownerDocument??document,n=e.container??t.body,r=t.activeElement instanceof t.defaultView.HTMLElement?t.activeElement:null,a=Ce[e.locale??"en"],i=de[e.locale??"en"],o=`fd-dialog-${++$n}`,d=(u,E={},k)=>{let F=t.createElement(u);for(let[O,M]of Object.entries(E))F.setAttribute(O,M);return k!==void 0&&(F.textContent=k),F},s=d("h2",{id:`${o}-title`,class:"fd-form-dialog-title"},e.title),l=d("button",{type:"button",class:"fd-dialog-close","aria-label":a.close},"\xD7"),p=d("input",{type:"search",class:"fd-input","aria-label":i.search,placeholder:i.search,"aria-controls":`${o}-list`,autocomplete:"off"}),y=d("ul",{id:`${o}-list`,class:"fd-search-list",role:"listbox","aria-labelledby":s.id}),v=d("button",{type:"button",class:"fd-button"},a.cancel),h=d("div",{class:"fd-theme fd-form-dialog fd-search-dialog fd-size-small","data-fd-skin":e.skin??"underline",role:"dialog","aria-modal":"true","aria-labelledby":s.id});e.dir&&h.setAttribute("dir",e.dir);let g=d("div",{class:"fd-form-dialog-head"});g.append(s,l);let f=d("div",{class:"fd-form-dialog-body fd-search-body"});f.append(p,y);let w=d("div",{class:"fd-actions fd-actions-end fd-form-dialog-foot"});w.append(v),h.append(g,f,w);let b=d("div",{class:"fd-dialog-backdrop fd-form-dialog-backdrop"});return b.append(h),n.append(b),p.focus(),new Promise(u=>{let E=[],k=-1,F=0,O,M=U=>{clearTimeout(O),F++,b.remove(),r?.focus(),u(U)},P=()=>{y.replaceChildren(...E.map((U,re)=>{let J=d("li",{id:`${o}-option-${re}`,role:"option",class:`fd-option${re===k?" fd-active":""}`,"aria-selected":String(re===k)},U.label);return J.addEventListener("click",()=>M(U)),J})),E.length||y.append(d("li",{class:"fd-empty"},i.noResults)),k>=0?p.setAttribute("aria-activedescendant",`${o}-option-${k}`):p.removeAttribute("aria-activedescendant")},H=()=>{clearTimeout(O);let U=++F;O=setTimeout(async()=>{let re=await e.search(p.value,80).catch(()=>[]);U===F&&(E=re,k=-1,P())},180)};p.addEventListener("input",H),p.addEventListener("keydown",U=>{if(U.key==="ArrowDown"||U.key==="ArrowUp"){if(U.preventDefault(),!E.length)return;k=(k+(U.key==="ArrowDown"?1:-1)+E.length)%E.length,P(),y.children[k]?.scrollIntoView?.({block:"nearest"})}else U.key==="Enter"&&k>=0&&(U.preventDefault(),M(E[k]))}),v.addEventListener("click",()=>M(null)),l.addEventListener("click",()=>M(null)),h.addEventListener("keydown",U=>{U.key==="Escape"&&(U.preventDefault(),M(null))}),H()})}function Or(e){return e.layout.type==="sheet"&&e.layout.title?.field?e.layout.title.field:e.fields.name?"name":Object.entries(e.fields).find(([,t])=>t.type==="char")?.[0]??null}function Ir(e,t,n){let r=Object.fromEntries(Object.entries(e).map(([a,i])=>[a,n?{...i,readonly:!0}:i]));return{fieldia:"0.1",id:"values",title:t,data:{kind:"record",model:"values"},fields:r,layout:{type:"sections",id:"values",children:[{type:"section",id:"values-section",columns:2,children:Object.keys(r).map(a=>({type:"field",id:`values-${a}`,field:a}))}]}}}function Dr(e){if(e)return{...e.search?{search:t=>e.search(t)}:{},...e.create?{create:t=>e.create(t)}:{}}}function Vn(e){let t=r=>(typeof e.relatedPages=="function"?e.relatedPages(r):e.relatedPages?.[r])??null,n={locale:e.locale,skin:e.skin,dir:e.dir,widgets:e.widgets,preferences:e.preferences,relatedPages:e.relatedPages,translate:e.translate};return{canOpen:r=>t(r)!==null,async openRecord(r,a){let i=t(r);if(!i)return null;let o=Or(i),d=await St({...n,page:i,dataSource:e.dataSource,recordId:a.recordId??null,values:a.name&&o?{[o]:a.name}:void 0,title:a.title,size:"large"});if(!d.saved||d.recordId===null)return null;let s=o?d.values[o]:null;return{id:d.recordId,label:typeof s=="string"&&s?s:a.name??a.title}},searchMore:r=>_t({title:r.title,search:r.search,locale:e.locale,skin:e.skin,dir:e.dir}),async editValues(r){let a=await St({...n,page:Ir(r.fields,r.title,r.readonly===!0),dataSource:Dr(e.dataSource),values:r.values,title:r.title,mode:"values",...r.recompute?{recompute:r.recompute}:{}});return a.saved?a.values:null}}}var Ce={en:{save:"Save",edit:"Edit",done:"Done",discard:"Discard",saving:"Saving\u2026",saved:"Saved",submit:"Submit",next:"Next",back:"Back",skip:"Skip",steps:"Steps",stepOf:"Step {n} of {total}",submitted:"Thank you. Your answers were sent.",submitAnother:"Submit another response",draftFound:"You have unsaved answers from {time}.",restore:"Restore",discardDraft:"Discard",ok:"OK",cancel:"Cancel",loading:"Loading\u2026",saveClose:"Save & Close",close:"Close",dismiss:"Dismiss",retry:"Retry",notSaved:"Not saved",notSent:"Not sent",checkFields:"{what}. Check: {fields}",offline:"Could not reach the server. Your changes are still here."},ar:{save:"\u062D\u0641\u0638",edit:"\u062A\u0639\u062F\u064A\u0644",done:"\u062A\u0645",discard:"\u062A\u062C\u0627\u0647\u0644",saving:"\u062C\u0627\u0631\u064D \u0627\u0644\u062D\u0641\u0638\u2026",saved:"\u062A\u0645 \u0627\u0644\u062D\u0641\u0638",submit:"\u0625\u0631\u0633\u0627\u0644",next:"\u0627\u0644\u062A\u0627\u0644\u064A",back:"\u0631\u062C\u0648\u0639",skip:"\u062A\u062E\u0637\u064D\u0651",steps:"\u0627\u0644\u062E\u0637\u0648\u0627\u062A",stepOf:"\u0627\u0644\u062E\u0637\u0648\u0629 {n} \u0645\u0646 {total}",submitted:"\u0634\u0643\u0631\u064B\u0627 \u0644\u0643. \u062A\u0645 \u0625\u0631\u0633\u0627\u0644 \u0625\u062C\u0627\u0628\u0627\u062A\u0643.",submitAnother:"\u0625\u0631\u0633\u0627\u0644 \u0625\u062C\u0627\u0628\u0629 \u0623\u062E\u0631\u0649",draftFound:"\u0644\u062F\u064A\u0643 \u0625\u062C\u0627\u0628\u0627\u062A \u063A\u064A\u0631 \u0645\u062D\u0641\u0648\u0638\u0629 \u0645\u0646 {time}.",restore:"\u0627\u0633\u062A\u0639\u0627\u062F\u0629",discardDraft:"\u062A\u062C\u0627\u0647\u0644",ok:"\u0645\u0648\u0627\u0641\u0642",cancel:"\u0625\u0644\u063A\u0627\u0621",loading:"\u062C\u0627\u0631\u064D \u0627\u0644\u062A\u062D\u0645\u064A\u0644\u2026",saveClose:"\u062D\u0641\u0638 \u0648\u0625\u063A\u0644\u0627\u0642",close:"\u0625\u063A\u0644\u0627\u0642",dismiss:"\u0625\u062E\u0641\u0627\u0621",retry:"\u0623\u0639\u062F \u0627\u0644\u0645\u062D\u0627\u0648\u0644\u0629",notSaved:"\u0644\u0645 \u064A\u064F\u062D\u0641\u0638",notSent:"\u0644\u0645 \u064A\u064F\u0631\u0633\u0644",checkFields:"{what}. \u0631\u0627\u062C\u0650\u0639: {fields}",offline:"\u062A\u0639\u0630\u0651\u0631 \u0627\u0644\u0648\u0635\u0648\u0644 \u0625\u0644\u0649 \u0627\u0644\u062E\u0627\u062F\u0645. \u062A\u0639\u062F\u064A\u0644\u0627\u062A\u0643 \u0645\u0627 \u0632\u0627\u0644\u062A \u0647\u0646\u0627."},de:{save:"Speichern",edit:"Bearbeiten",done:"Fertig",discard:"Verwerfen",saving:"Wird gespeichert\u2026",saved:"Gespeichert",submit:"Absenden",next:"Weiter",back:"Zur\xFCck",skip:"\xDCberspringen",steps:"Schritte",stepOf:"Schritt {n} von {total}",submitted:"Vielen Dank. Ihre Antworten wurden gesendet.",submitAnother:"Weitere Antwort senden",draftFound:"Sie haben ungespeicherte Antworten vom {time}.",restore:"Wiederherstellen",discardDraft:"Verwerfen",ok:"OK",cancel:"Abbrechen",loading:"Wird geladen\u2026",saveClose:"Speichern und schlie\xDFen",close:"Schlie\xDFen",dismiss:"Ausblenden",retry:"Erneut versuchen",notSaved:"Nicht gespeichert",notSent:"Nicht gesendet",checkFields:"{what}. Bitte pr\xFCfen: {fields}",offline:"Der Server ist nicht erreichbar. Ihre \xC4nderungen sind noch da."},fr:{save:"Enregistrer",edit:"Modifier",done:"Termin\xE9",discard:"Annuler les modifications",saving:"Enregistrement\u2026",saved:"Enregistr\xE9",submit:"Envoyer",next:"Suivant",back:"Retour",skip:"Passer",steps:"\xC9tapes",stepOf:"\xC9tape {n} sur {total}",submitted:"Merci. Vos r\xE9ponses ont \xE9t\xE9 envoy\xE9es.",submitAnother:"Envoyer une autre r\xE9ponse",draftFound:"Vous avez des r\xE9ponses non enregistr\xE9es du {time}.",restore:"Restaurer",discardDraft:"Ignorer",ok:"OK",cancel:"Annuler",loading:"Chargement\u2026",saveClose:"Enregistrer et fermer",close:"Fermer",dismiss:"Masquer",retry:"R\xE9essayer",notSaved:"Non enregistr\xE9",notSent:"Non envoy\xE9",checkFields:"{what}. \xC0 v\xE9rifier : {fields}",offline:"Le serveur est injoignable. Vos modifications sont toujours l\xE0."}},On=Ce.en;var Pr=0;function Kt(e,t){let n=e.ownerDocument,r=st(t.page);if(!r.ok)throw new Error(`This page cannot be shown:
|
|
606
608
|
${r.issues.map(c=>` ${c.path}: ${c.message}`).join(`
|
|
607
|
-
`)}`);let a=t.translate?dt(r.page,t.translate):r.page,i=t.locale??"en",o=t.preferences??Ut(),d=Vn(t),s=!t.form,l=t.form??pt({...t,page:a,messages:t.messages??Te[i]}),p={...Ce[i],...t.labels},y=de[i],v=t.dir??(i==="ar"?"rtl":void 0),h=`fd${++Pr}`,g=[],f=[],w=c=>`${h}-${c.replace(/[^A-Za-z0-9_-]/g,"_")}`,b=(c,R)=>c.replace(/\{(\w+)\}/g,(A,I)=>String(R[I]??""));Jt(n);function u(c,R={},...A){let I=n.createElement(c);for(let[D,q]of Object.entries(R))q!==void 0&&I.setAttribute(D,q);return I.append(...A),I}function E(c,R){let A=et(n,c,t.icons);return A?[A,R]:[R]}let k=u("form",{class:"fd-form",novalidate:"","data-fd-skin":t.skin??"underline",dir:v,lang:t.locale,"data-max-width":a.maxWidth}),F=t.confirm??Gt;function O(c){let R=a.fields[c.field],A=w(c.id),I=u("div",{class:"fd-field","data-node":c.id,"data-field":c.field,"data-type":R.type});c.colspan&&I.style.setProperty("--fd-span",String(c.colspan));let D=u("label",{class:"fd-label",id:`${A}-label`,for:A},c.label??R.label),q=t.showValid&&!Wr.has(R.type)?et(n,"check"):null;q&&(q.classList.add("fd-valid-mark"),D.append(q));let j=ke({form:l,name:c.field,field:R,node:c,id:A,document:n,labels:y,preferences:o,locale:i,dialogs:d},t.widgets);["INPUT","SELECT","TEXTAREA"].includes(j.element.tagName)||(j.element.getAttribute("role")&&j.element.setAttribute("aria-labelledby",D.id),D.addEventListener("click",()=>j.focus()));let ie=c.help??R.help,Y=ie?u("div",{class:"fd-help",id:`${A}-help`},ie):null,G=u("div",{class:"fd-error",id:`${A}-error`,hidden:""}),he=u("div",{class:"fd-warning",role:"status",hidden:""});return I.append(D,j.element,...Y?[Y]:[],G,he),j.destroy&&f.push(()=>j.destroy?.()),g.push(B=>{let V=l.node(c.id);I.hidden=V.invisible,I.classList.toggle("fd-required",V.required);let K=B.errors[c.field];G.hidden=!K,G.textContent=K??"";let ge=B.warning&&B.warningField===c.field?B.warning:"";if(he.hidden=!ge,he.textContent=ge,q){let we=B.values[c.field],ye=we!=null&&we!==""&&!(Array.isArray(we)&&!we.length),xe=!V.readonly&&!K&&ye&&B.dirty.includes(c.field)&&l.problem(c.field)===null;I.classList.toggle("fd-valid",xe),q.toggleAttribute("hidden",!xe)}j.update({value:B.values[c.field],values:B.values,readonly:V.readonly||C,required:V.required,invalid:!!K,describedBy:[Y?.id,K?G.id:void 0].filter(Boolean).join(" ")||void 0})}),I}function M(c,R){g.push(()=>{c.hidden=l.node(R).invisible})}function P(c){let R=u("button",{type:"button",class:`fd-button fd-button-${c.style??"secondary"}`,"data-node":c.id},...E(c.icon,c.label));return R.addEventListener("click",async()=>{c.confirm&&!await F(c.confirm)||await l.runAction(c.id)}),M(R,c.id),R}function H(c){let R=c.style??"paragraph",A=u(R==="heading"?"h3":"p",{class:`fd-text-${R}`,"data-node":c.id},c.text);return M(A,c.id),A}function U(c){let R=u("div",{class:"fd-slot","data-slot":c.name,"data-node":c.id}),A=t.slots?.[c.name]?.(R,{form:l,name:c.name});return A&&f.push(A),M(R,c.id),R}function re(c,R=1){let A=u("div",{class:"fd-grid"});if(A.style.setProperty("--fd-columns",String(rt(R))),typeof R=="object")for(let I of["medium","narrow"]){let D=R[I];D!==void 0&&(A.setAttribute(`data-columns-${I}`,String(D)),A.style.setProperty(`--fd-columns-${I}`,String(D)))}return A.append(...c.map(Z)),A}let J=new Map;function _(c){let R=u("fieldset",{class:"fd-section","data-node":c.id}),A=c.description?u("p",{class:"fd-section-description"},c.description):null,I=re(c.children,c.columns);if(c.title&&c.collapsible){I.id=w(`${c.id}-content`);let D=u("button",{type:"button",class:"fd-section-toggle","aria-controls":I.id},u("span",{class:"fd-section-chevron","aria-hidden":"true"}),...E(c.icon,c.title)),q=c.collapsed!==!0,j=ie=>{q=ie,D.setAttribute("aria-expanded",String(q)),I.hidden=!q,A&&(A.hidden=!q),R.classList.toggle("fd-section-folded",!q)};D.addEventListener("click",()=>j(!q)),J.set(R,()=>j(!0)),j(q),R.append(u("legend",{class:"fd-section-title"},D))}else c.title&&R.append(u("legend",{class:"fd-section-title"},...E(c.icon,c.title)));return A&&R.append(A),R.append(I),M(R,c.id),R}function te(c){let R=u("div",{class:"fd-tabs","data-node":c.id}),A=u("div",{class:"fd-tablist",role:"tablist"}),I=null,D=c.children[0].id,q=c.children.map(j=>{let ie=w(`${j.id}-tab`),Y=w(`${j.id}-panel`),G=u("button",{type:"button",class:"fd-tab",role:"tab",id:ie,"aria-controls":Y,"data-node":j.id},...E(j.icon,j.label)),he=u("div",{class:"fd-tabpanel",role:"tabpanel",id:Y,"aria-labelledby":ie},re(j.children));return G.addEventListener("click",()=>{I=D=j.id,We(l.getState())}),A.append(G),{tab:j,button:G,panel:he}});return A.addEventListener("keydown",j=>{let ie=q.filter(V=>!V.button.hidden),Y=ie.findIndex(V=>V.tab.id===D),G={ArrowRight:1,ArrowLeft:-1,Home:-Y,End:ie.length-1-Y}[j.key];if(G===void 0||Y===-1)return;j.preventDefault();let he=k.getAttribute("dir")==="rtl"&&(j.key==="ArrowRight"||j.key==="ArrowLeft"),B=ie[(Y+(he?-G:G)+ie.length)%ie.length];I=D=B.tab.id,We(l.getState()),B.button.focus()}),R.append(A,...q.map(j=>j.panel)),g.push(()=>{R.hidden=l.node(c.id).invisible;let j=q.filter(Y=>!l.node(Y.tab.id).invisible);I!==null&&j.some(Y=>Y.tab.id===I)?D=I:j.length&&(D=j[0].tab.id);for(let Y of q){let G=Y.tab.id===D;Y.button.hidden=!j.includes(Y),Y.button.setAttribute("aria-selected",String(G)),Y.button.tabIndex=G?0:-1,Y.panel.hidden=!G}}),R}function Z(c){switch(c.type){case"field":return O(c);case"button":return P(c);case"text":return H(c);case"slot":return U(c);case"section":return _(c);case"tabs":return te(c)}}let C=t.readonly===!0,$=t.editSwitch?u("button",{type:"button",class:"fd-button fd-edit-switch"}):null;$?.addEventListener("click",async()=>{if(C)C=!1;else{if(l.getState().dirty.length&&!await l.save()){l.getState().saveProblem||se(fe(l.getState())),T();return}C=!0}k.toggleAttribute("data-readonly",C),We(l.getState())}),k.toggleAttribute("data-readonly",C),g.push(()=>{$&&($.textContent=C?p.edit:p.done,$.classList.toggle("fd-button-primary",C))});let W=u("div",{class:"fd-status",role:"status","aria-live":"polite"}),X=u("button",{type:"button",class:"fd-button fd-button-link fd-retry",hidden:""},p.retry);X.addEventListener("click",()=>{ue()});let Q=u("div",{class:"fd-status-box"},W,X),ce=()=>a.data.kind==="responses"?p.notSent:p.notSaved;function fe(c){let R=[];for(let I of Object.keys(c.errors)){let D=I.split(".")[0],j=k.querySelector(`.fd-field[data-field="${D}"]:not([hidden]) > .fd-label`)?.firstChild?.textContent??a.fields[D]?.label??D;R.includes(j)||R.push(j)}let A=[...k.querySelectorAll(".fd-field[data-field] > .fd-label")].map(I=>I.firstChild?.textContent??"");return R.sort((I,D)=>(A.indexOf(I)+1||1/0)-(A.indexOf(D)+1||1/0)),R.length?b(p.checkFields,{what:ce(),fields:R.join(", ")}):ce()}let pe;g.push(c=>{let R=c.saveProblem,A=c.status==="saving"?p.saving:c.status==="saved"?p.saved:c.status==="loading"?p.loading:c.status==="error"&&R?R.kind==="fields"?fe(c):R.kind==="other"?R.message:ce():c.status==="error"?c.error??"":"";W.textContent=A,X.hidden=!(c.status==="error"&&R?.kind==="other"),W.classList.toggle("fd-status-error",c.status==="error"),W.classList.toggle("fd-status-saved",c.status==="saved"),t.saveStatus==="toast"&&(clearTimeout(pe),Q.hidden=!A,c.status==="saved"&&(pe=setTimeout(()=>Q.hidden=!0,2500)))});let Se=u("button",{type:"button",class:"fd-button fd-retry"},p.retry);Se.addEventListener("click",()=>{ue()});let Fe=u("div",{class:"fd-banner fd-tone-warning",role:"alert",hidden:""},u("span",{class:"fd-banner-text"},p.offline),Se),Ne=u("div",{class:"fd-announce",role:"alert","aria-live":"assertive"});function se(c){Ne.textContent="",setTimeout(()=>Ne.textContent=c,0)}let m=null;g.push(c=>{c.saveProblem!==m&&(m=c.saveProblem,Fe.hidden=m?.kind!=="network",m&&(m.kind==="rule"?Gt(m.message,!1):m.kind==="fields"?se(fe(c)):m.kind==="other"&&se(m.message)))});let x=u("div",{class:"fd-draft",hidden:""}),L=u("span"),S=u("button",{type:"button",class:"fd-button fd-button-primary"},p.restore),N=u("button",{type:"button",class:"fd-button fd-button-link"},p.discardDraft);S.addEventListener("click",()=>l.restoreDraft()),N.addEventListener("click",()=>l.discardDraft()),x.append(L,S,N),g.push(c=>{x.hidden=!c.draft,c.draft&&(L.textContent=b(p.draftFound,{time:new Date(c.draft.savedAt).toLocaleString()}))});function T(){let c=k.querySelector('[aria-invalid="true"]');if(!c)return;for(let A=c.closest(".fd-section-folded");A;A=A.parentElement?.closest(".fd-section-folded")??null)J.get(A)?.();if(!c.dispatchEvent(new CustomEvent("fd-focus-problem",{cancelable:!0})))return;(c.matches("input, select, textarea, button")?c:c.querySelector("input, select, textarea, button"))?.focus()}let z=u("div",{class:"fd-done",hidden:""},u("p",{class:"fd-done-title"},p.submitted)),oe=u("button",{type:"button",class:"fd-button"},p.submitAnother);z.append(oe);let ae=u("div",{class:"fd-content"});async function ue(){if(!await l.save()){l.getState().saveProblem||se(fe(l.getState())),T();return}a.data.kind==="responses"&&(ae.hidden=!0,z.hidden=!1)}oe.addEventListener("click",()=>{l.reset(),ae.hidden=!1,z.hidden=!0});function ne(){if(!a.title&&!a.description)return null;let c=u("header",{class:"fd-page-head"});return a.title&&c.append(u("h1",{class:"fd-page-title"},a.title)),a.description&&c.append(u("p",{class:"fd-page-description"},a.description)),c}function Be(c){let R=u("div",{class:"fd-sections","data-node":c.id},...c.children.map(Z)),A=u("button",{type:"submit",class:"fd-button fd-button-primary"},a.data.kind==="responses"?p.submit:p.save),I=u("div",{class:"fd-actions fd-actions-end"},Q,A);if(a.data.kind==="record"){let D=u("button",{type:"button",class:"fd-button"},p.discard);D.addEventListener("click",()=>l.reset()),I.insertBefore(D,A),g.push(q=>{let j=q.dirty.length>0&&q.status!=="saving"&&!C;A.hidden=!j,D.hidden=!j})}else g.push(()=>A.hidden=C);return $&&I.prepend($),t.showActions===!1?u("div",{},R):a.actionsPosition==="top"?(I.classList.add("fd-actions-top"),u("div",{},I,R)):u("div",{},R,I)}function Lt(c){let R=u("div",{class:"fd-wizard","data-node":c.id}),A=u("div",{class:"fd-progress-text"}),I=u("span");R.append(u("div",{class:"fd-progress"},A,u("div",{class:"fd-progress-bar"},I)));let D=c.clickable?u("ol",{class:"fd-steps-list"}):null,q=new Map;if(D){for(let V of c.children){let K=u("button",{type:"button",class:"fd-step-link"},...E(V.icon,V.label));K.addEventListener("click",()=>{l.goTo(V.id)?B():T()}),q.set(V.id,K),D.append(u("li",{},K))}R.append(u("nav",{class:"fd-steps","aria-label":p.steps},D))}let j=c.children.map(V=>{let K=u("section",{class:"fd-step","data-node":V.id,"aria-labelledby":w(`${V.id}-title`)});return K.append(u("h2",{class:"fd-step-title",id:w(`${V.id}-title`)},...E(V.icon,V.label))),V.description&&K.append(u("p",{class:"fd-section-description"},V.description)),K.append(re(V.children)),R.append(K),{step:V,panel:K}}),ie=u("button",{type:"button",class:"fd-button"},c.backLabel??p.back),Y=u("button",{type:"button",class:"fd-button fd-button-link"},p.skip),G=u("button",{type:"submit",class:"fd-button fd-button-primary"});R.append(u("div",{class:"fd-wizard-nav"},ie,u("span",{class:"fd-spacer"}),Q,Y,G)),ie.addEventListener("click",()=>{l.back()&&B()}),Y.addEventListener("click",()=>{l.skip()&&B()});let he=()=>{let V=l.steps();return V.indexOf(l.getState().step??"")===V.length-1};be=async()=>{if(he())return ue();l.next()?B():T()};function B(){j.find(K=>K.step.id===l.getState().step)?.panel.querySelector("input, select, textarea, [role=radio]")?.focus()}return g.push(V=>{let K=l.steps(),ge=Math.max(0,K.indexOf(V.step??""));A.textContent=b(p.stepOf,{n:ge+1,total:K.length}),I.style.width=`${(ge+1)/Math.max(1,K.length)*100}%`;for(let{step:ye,panel:xe}of j)xe.hidden=ye.id!==V.step;let we=ge===K.length-1;ie.hidden=ge===0,Y.hidden=we||!c.children.find(ye=>ye.id===V.step)?.optional,G.textContent=we?c.finishLabel??p.submit:c.nextLabel??p.next;for(let[ye,xe]of q){let $e=K.indexOf(ye);xe.parentElement.hidden=$e===-1,xe.classList.toggle("fd-step-done",$e!==-1&&$e<ge),xe.classList.toggle("fd-step-skipped",V.skipped.includes(ye)),ye===V.step?xe.setAttribute("aria-current","step"):xe.removeAttribute("aria-current")}}),R}function Et(c){let R=u("div",{class:"fd-sheet-page","data-node":c.id}),A=u("div",{class:"fd-actions"}),I=u("button",{type:"submit",class:"fd-button fd-button-primary"},p.save),D=u("button",{type:"button",class:"fd-button"},p.discard);D.addEventListener("click",()=>l.reset());let q=a.actionsPosition==="bottom",j=u("div",{class:"fd-actions fd-actions-end fd-sheet-foot"});t.showActions===!1?A.append(...(c.buttons??[]).map(P)):q?(A.append(...(c.buttons??[]).map(P)),j.append(Q,D,I)):A.append(I,D,...(c.buttons??[]).map(P),Q),$&&t.showActions!==!1&&A.prepend($),g.push(B=>{let V=B.dirty.length>0&&B.status!=="saving"&&!C;I.hidden=!V,D.hidden=!V});let ie=u("div",{class:"fd-header"},A),Y=c.statusbar?.position==="title";c.statusbar&&!Y&&ie.append(me(c.statusbar));let G=u("div",{class:"fd-card"});if(c.ribbon){let B=u("div",{class:`fd-ribbon fd-tone-${c.ribbon.tone??"muted"}`,"data-node":c.ribbon.id},c.ribbon.label);M(B,c.ribbon.id),G.append(u("div",{class:"fd-ribbon-frame"},B))}if(c.statButtons?.length){let B=u("div",{class:"fd-stats"});for(let V of c.statButtons){let K=u("span",{class:"fd-stat-value"}),ge=et(n,V.icon,t.icons),we=u("span",{class:"fd-stat-words"},K,u("span",{class:"fd-stat-label"},V.label)),ye=u("button",{type:"button",class:"fd-stat","data-node":V.id},...ge?[ge,we]:[we]);ye.addEventListener("click",()=>{l.runAction(V.id)}),g.push(xe=>{ye.hidden=l.node(V.id).invisible;let $e=V.field?xe.values[V.field]:null;K.textContent=$e==null?"":String($e)}),B.append(ye)}G.append(B)}for(let B of c.alerts??[]){let V=u("div",{class:`fd-alert fd-tone-${B.tone??"info"}`,role:"status","data-node":B.id},u("span",{class:"fd-alert-message"},B.message));if(B.dismissible){let K=!1,ge=u("button",{type:"button",class:"fd-alert-close","aria-label":p.dismiss},"\xD7");ge.addEventListener("click",()=>{K=!0,V.hidden=!0}),V.append(ge),g.push(()=>{V.hidden=K||l.node(B.id).invisible})}else M(V,B.id);G.append(V)}if(c.badges?.length){let B=u("div",{class:"fd-badges"});for(let V of c.badges){let K=u("span",{class:`fd-badge fd-tone-${V.tone??"muted"}`,"data-node":V.id},...E(V.icon,V.label));M(K,V.id),B.append(K)}g.push(()=>{B.hidden=[...B.children].every(V=>V.hidden)}),G.append(B)}if(c.title){let B=u("div",{class:"fd-title"});c.title.above?.length&&B.append(u("div",{class:"fd-title-above"},...c.title.above.map(O))),B.append(O({type:"field",id:"#title",field:c.title.field,placeholder:c.title.placeholder})),c.title.subtitleField&&B.append(O({type:"field",id:"#subtitle",field:c.title.subtitleField})),c.title.below?.length&&B.append(u("div",{class:"fd-title-below"},...c.title.below.map(O)));let V=u("div",{class:"fd-title-row"},B);if(c.title.avatarField){let K=O({type:"field",id:"#avatar",field:c.title.avatarField});K.classList.add("fd-avatar"),V.append(K)}G.append(V)}c.statusbar&&Y&&G.append(u("div",{class:"fd-title-statusbar"},me(c.statusbar))),G.append(re(c.children)),q&&t.showActions!==!1&&(G.append(j),g.push(B=>{j.hidden=B.dirty.length===0&&!W.textContent}));let he=u("div",{class:"fd-sheet-layout"},G);return c.sidePanel&&(he.classList.add("fd-has-side"),he.append(u("aside",{class:"fd-side"},U(c.sidePanel)))),R.append(ie,he),R}function me(c){let R=a.fields[c.field],A={clickable:c.clickable===!0};c.visibleStates&&(A.visibleStates=c.visibleStates);let I={type:"field",id:"#statusbar",field:c.field,widget:"statusbar",options:A},D=ke({form:l,name:c.field,field:R,node:I,id:w("statusbar"),document:n,labels:y,preferences:o,locale:i,dialogs:d},t.widgets);return g.push(q=>D.update({value:q.values[c.field],values:q.values,readonly:l.node("#statusbar").readonly||C,required:!1,invalid:!1})),D.element}let be=null,ve=a.layout,qe;ve.type==="sheet"?qe=Et(ve):ve.type==="wizard"?qe=Lt(ve):ve.type==="tabs"?qe=Be({id:`${ve.id}-page`,children:[ve]}):qe=Be(ve);let Yt=ve.type==="sheet"?null:ne();ae.append(...Yt?[Yt]:[],Fe,x,qe),k.append(ae,z,Ne),t.saveStatus==="toast"?(Q.classList.add("fd-toast"),k.append(Q)):t.saveStatus==="bar"&&(Q.classList.add("fd-status-bar"),ae.prepend(Q)),k.addEventListener("submit",c=>{c.preventDefault(),be?be():ue()});function In(){let c=n.activeElement;c&&k.contains(c)&&(c.tagName==="INPUT"||c.tagName==="TEXTAREA")&&c.dispatchEvent(new Event("change",{bubbles:!0}))}function Dn(c){let R=[...k.querySelectorAll(".fd-field")].filter(D=>!D.closest('[hidden], [data-type="one2many"] .fd-field, .fd-form-dialog')&&!D.parentElement?.closest('[data-type="one2many"]')),A=c.closest(".fd-field"),I=R.slice(R.indexOf(A)+1);for(let D of I){let q=D.querySelector('input:not([type="hidden"]):not([readonly]):not([disabled]), select:not([disabled]), textarea:not([readonly]), [contenteditable="true"]');if(q)return q}return null}k.addEventListener("keydown",c=>{if(c.isComposing||c.key!=="Enter")return;let R=t.keys??{};if(c.ctrlKey||c.metaKey){if(R.saveWithCtrlEnter===!1||t.showActions===!1||c.target.closest(".ag-root-wrapper"))return;c.preventDefault(),In(),be?be():ue();return}if(c.defaultPrevented||!R.enterMovesToNext||c.shiftKey||c.altKey)return;let A=c.target;A.tagName!=="INPUT"&&A.tagName!=="SELECT"||A.closest('[data-type="one2many"]')||["button","submit","reset","file"].includes(A.type)||(c.preventDefault(),Dn(A)?.focus())});function Gt(c,R=!0){return new Promise(A=>{let I=u("p",{id:`${h}-confirm`},c),D=u("button",{type:"button",class:"fd-button"},p.cancel),q=u("button",{type:"button",class:"fd-button fd-button-primary"},p.ok),j=u("div",{class:"fd-dialog",role:"alertdialog","aria-modal":"true","aria-labelledby":I.id},I,u("div",{class:"fd-actions fd-actions-end"},...R?[D,q]:[q])),ie=u("div",{class:"fd-dialog-backdrop"},j),Y=G=>{ie.remove(),A(G)};D.addEventListener("click",()=>Y(!1)),q.addEventListener("click",()=>Y(!0)),ie.addEventListener("keydown",G=>{G.key==="Escape"&&Y(!1)}),k.append(ie),q.focus()})}function We(c){for(let R of g)R(c)}e.append(k);let Pn=l.subscribe(We);return We(l.getState()),l.getState().status==="idle"&&l.load(),{form:l,element:k,setSkin(c){k.setAttribute("data-fd-skin",c)},async save(){let c=await l.save();return c||T(),c},check(){let c=l.validate();return c||T(),c},setReadonly(c){C=c,k.toggleAttribute("data-readonly",C),We(l.getState())},isReadonly:()=>C,destroy(){Pn();for(let c of f)c();k.remove(),s&&l.dispose()}}}var Wr=new Set(["boolean","one2many","binary","image","html","json","properties"]);var zr="0.7.0";return Jn(jr);})();
|
|
609
|
+
`)}`);let a=t.translate?dt(r.page,t.translate):r.page,i=t.locale??"en",o=t.preferences??Ut(),d=Vn(t),s=!t.form,l=t.form??pt({...t,page:a,messages:t.messages??Te[i]}),p={...Ce[i],...t.labels},y=de[i],v=t.dir??(i==="ar"?"rtl":void 0),h=`fd${++Pr}`,g=[],f=[],w=c=>`${h}-${c.replace(/[^A-Za-z0-9_-]/g,"_")}`,b=(c,R)=>c.replace(/\{(\w+)\}/g,(A,I)=>String(R[I]??""));Jt(n);function u(c,R={},...A){let I=n.createElement(c);for(let[D,q]of Object.entries(R))q!==void 0&&I.setAttribute(D,q);return I.append(...A),I}function E(c,R){let A=et(n,c,t.icons);return A?[A,R]:[R]}let k=u("form",{class:"fd-form",novalidate:"","data-fd-skin":t.skin??"underline",dir:v,lang:t.locale,"data-max-width":a.maxWidth}),F=t.confirm??Gt;function O(c){let R=a.fields[c.field],A=w(c.id),I=u("div",{class:"fd-field","data-node":c.id,"data-field":c.field,"data-type":R.type});c.colspan&&I.style.setProperty("--fd-span",String(c.colspan));let D=u("label",{class:"fd-label",id:`${A}-label`,for:A},c.label??R.label),q=t.showValid&&!Wr.has(R.type)?et(n,"check"):null;q&&(q.classList.add("fd-valid-mark"),D.append(q));let j=ke({form:l,name:c.field,field:R,node:c,id:A,document:n,labels:y,preferences:o,locale:i,dialogs:d},t.widgets);["INPUT","SELECT","TEXTAREA"].includes(j.element.tagName)||(j.element.getAttribute("role")&&j.element.setAttribute("aria-labelledby",D.id),D.addEventListener("click",()=>j.focus()));let ie=c.help??R.help,Y=ie?u("div",{class:"fd-help",id:`${A}-help`},ie):null,G=u("div",{class:"fd-error",id:`${A}-error`,hidden:""}),he=u("div",{class:"fd-warning",role:"status",hidden:""});return I.append(D,j.element,...Y?[Y]:[],G,he),j.destroy&&f.push(()=>j.destroy?.()),g.push(B=>{let V=l.node(c.id);I.hidden=V.invisible,I.classList.toggle("fd-required",V.required);let K=B.errors[c.field];G.hidden=!K,G.textContent=K??"";let ge=B.warning&&B.warningField===c.field?B.warning:"";if(he.hidden=!ge,he.textContent=ge,q){let we=B.values[c.field],ye=we!=null&&we!==""&&!(Array.isArray(we)&&!we.length),xe=!V.readonly&&!K&&ye&&B.dirty.includes(c.field)&&l.problem(c.field)===null;I.classList.toggle("fd-valid",xe),q.toggleAttribute("hidden",!xe)}j.update({value:B.values[c.field],values:B.values,readonly:V.readonly||C,required:V.required,invalid:!!K,describedBy:[Y?.id,K?G.id:void 0].filter(Boolean).join(" ")||void 0})}),I}function M(c,R){g.push(()=>{c.hidden=l.node(R).invisible})}function P(c){let R=u("button",{type:"button",class:`fd-button fd-button-${c.style??"secondary"}`,"data-node":c.id},...E(c.icon,c.label));return R.addEventListener("click",async()=>{c.confirm&&!await F(c.confirm)||await l.runAction(c.id)}),M(R,c.id),R}function H(c){let R=c.style??"paragraph",A=u(R==="heading"?"h3":"p",{class:`fd-text-${R}`,"data-node":c.id},c.text);return M(A,c.id),A}function U(c){let R=u("div",{class:"fd-slot","data-slot":c.name,"data-node":c.id}),A=t.slots?.[c.name]?.(R,{form:l,name:c.name});return A&&f.push(A),M(R,c.id),R}function re(c,R=1){let A=u("div",{class:"fd-grid"});if(A.style.setProperty("--fd-columns",String(rt(R))),typeof R=="object")for(let I of["medium","narrow"]){let D=R[I];D!==void 0&&(A.setAttribute(`data-columns-${I}`,String(D)),A.style.setProperty(`--fd-columns-${I}`,String(D)))}return A.append(...c.map(Z)),A}let J=new Map;function _(c){let R=u("fieldset",{class:"fd-section","data-node":c.id}),A=c.description?u("p",{class:"fd-section-description"},c.description):null,I=re(c.children,c.columns);if(c.title&&c.collapsible){I.id=w(`${c.id}-content`);let D=u("button",{type:"button",class:"fd-section-toggle","aria-controls":I.id},u("span",{class:"fd-section-chevron","aria-hidden":"true"}),...E(c.icon,c.title)),q=c.collapsed!==!0,j=ie=>{q=ie,D.setAttribute("aria-expanded",String(q)),I.hidden=!q,A&&(A.hidden=!q),R.classList.toggle("fd-section-folded",!q)};D.addEventListener("click",()=>j(!q)),J.set(R,()=>j(!0)),j(q),R.append(u("legend",{class:"fd-section-title"},D))}else c.title&&R.append(u("legend",{class:"fd-section-title"},...E(c.icon,c.title)));return A&&R.append(A),R.append(I),M(R,c.id),R}function te(c){let R=u("div",{class:"fd-tabs","data-node":c.id}),A=u("div",{class:"fd-tablist",role:"tablist"}),I=null,D=c.children[0].id,q=c.children.map(j=>{let ie=w(`${j.id}-tab`),Y=w(`${j.id}-panel`),G=u("button",{type:"button",class:"fd-tab",role:"tab",id:ie,"aria-controls":Y,"data-node":j.id},...E(j.icon,j.label)),he=u("div",{class:"fd-tabpanel",role:"tabpanel",id:Y,"aria-labelledby":ie},re(j.children));return G.addEventListener("click",()=>{I=D=j.id,We(l.getState())}),A.append(G),{tab:j,button:G,panel:he}});return A.addEventListener("keydown",j=>{let ie=q.filter(V=>!V.button.hidden),Y=ie.findIndex(V=>V.tab.id===D),G={ArrowRight:1,ArrowLeft:-1,Home:-Y,End:ie.length-1-Y}[j.key];if(G===void 0||Y===-1)return;j.preventDefault();let he=k.getAttribute("dir")==="rtl"&&(j.key==="ArrowRight"||j.key==="ArrowLeft"),B=ie[(Y+(he?-G:G)+ie.length)%ie.length];I=D=B.tab.id,We(l.getState()),B.button.focus()}),R.append(A,...q.map(j=>j.panel)),g.push(()=>{R.hidden=l.node(c.id).invisible;let j=q.filter(Y=>!l.node(Y.tab.id).invisible);I!==null&&j.some(Y=>Y.tab.id===I)?D=I:j.length&&(D=j[0].tab.id);for(let Y of q){let G=Y.tab.id===D;Y.button.hidden=!j.includes(Y),Y.button.setAttribute("aria-selected",String(G)),Y.button.tabIndex=G?0:-1,Y.panel.hidden=!G}}),R}function Z(c){switch(c.type){case"field":return O(c);case"button":return P(c);case"text":return H(c);case"slot":return U(c);case"section":return _(c);case"tabs":return te(c)}}let C=t.readonly===!0,$=t.editSwitch?u("button",{type:"button",class:"fd-button fd-edit-switch"}):null;$?.addEventListener("click",async()=>{if(C)C=!1;else{if(l.getState().dirty.length&&!await l.save()){l.getState().saveProblem||se(fe(l.getState())),T();return}C=!0}k.toggleAttribute("data-readonly",C),We(l.getState())}),k.toggleAttribute("data-readonly",C),g.push(()=>{$&&($.textContent=C?p.edit:p.done,$.classList.toggle("fd-button-primary",C))});let W=u("div",{class:"fd-status",role:"status","aria-live":"polite"}),X=u("button",{type:"button",class:"fd-button fd-button-link fd-retry",hidden:""},p.retry);X.addEventListener("click",()=>{ue()});let Q=u("div",{class:"fd-status-box"},W,X),ce=()=>a.data.kind==="responses"?p.notSent:p.notSaved;function fe(c){let R=[];for(let I of Object.keys(c.errors)){let D=I.split(".")[0],j=k.querySelector(`.fd-field[data-field="${D}"]:not([hidden]) > .fd-label`)?.firstChild?.textContent??a.fields[D]?.label??D;R.includes(j)||R.push(j)}let A=[...k.querySelectorAll(".fd-field[data-field] > .fd-label")].map(I=>I.firstChild?.textContent??"");return R.sort((I,D)=>(A.indexOf(I)+1||1/0)-(A.indexOf(D)+1||1/0)),R.length?b(p.checkFields,{what:ce(),fields:R.join(", ")}):ce()}let pe;g.push(c=>{let R=c.saveProblem,A=c.status==="saving"?p.saving:c.status==="saved"?p.saved:c.status==="loading"?p.loading:c.status==="error"&&R?R.kind==="fields"?fe(c):R.kind==="other"?R.message:ce():c.status==="error"?c.error??"":"";W.textContent=A,X.hidden=!(c.status==="error"&&R?.kind==="other"),W.classList.toggle("fd-status-error",c.status==="error"),W.classList.toggle("fd-status-saved",c.status==="saved"),t.saveStatus==="toast"&&(clearTimeout(pe),Q.hidden=!A,c.status==="saved"&&(pe=setTimeout(()=>Q.hidden=!0,2500)))});let Se=u("button",{type:"button",class:"fd-button fd-retry"},p.retry);Se.addEventListener("click",()=>{ue()});let Fe=u("div",{class:"fd-banner fd-tone-warning",role:"alert",hidden:""},u("span",{class:"fd-banner-text"},p.offline),Se),Ne=u("div",{class:"fd-announce",role:"alert","aria-live":"assertive"});function se(c){Ne.textContent="",setTimeout(()=>Ne.textContent=c,0)}let m=null;g.push(c=>{c.saveProblem!==m&&(m=c.saveProblem,Fe.hidden=m?.kind!=="network",m&&(m.kind==="rule"?Gt(m.message,!1):m.kind==="fields"?se(fe(c)):m.kind==="other"&&se(m.message)))});let x=u("div",{class:"fd-draft",hidden:""}),L=u("span"),S=u("button",{type:"button",class:"fd-button fd-button-primary"},p.restore),N=u("button",{type:"button",class:"fd-button fd-button-link"},p.discardDraft);S.addEventListener("click",()=>l.restoreDraft()),N.addEventListener("click",()=>l.discardDraft()),x.append(L,S,N),g.push(c=>{x.hidden=!c.draft,c.draft&&(L.textContent=b(p.draftFound,{time:new Date(c.draft.savedAt).toLocaleString()}))});function T(){let c=k.querySelector('[aria-invalid="true"]');if(!c)return;for(let A=c.closest(".fd-section-folded");A;A=A.parentElement?.closest(".fd-section-folded")??null)J.get(A)?.();if(!c.dispatchEvent(new CustomEvent("fd-focus-problem",{cancelable:!0})))return;(c.matches("input, select, textarea, button")?c:c.querySelector("input, select, textarea, button"))?.focus()}let z=u("div",{class:"fd-done",hidden:""},u("p",{class:"fd-done-title"},p.submitted)),oe=u("button",{type:"button",class:"fd-button"},p.submitAnother);z.append(oe);let ae=u("div",{class:"fd-content"});async function ue(){if(!await l.save()){l.getState().saveProblem||se(fe(l.getState())),T();return}a.data.kind==="responses"&&(ae.hidden=!0,z.hidden=!1)}oe.addEventListener("click",()=>{l.reset(),ae.hidden=!1,z.hidden=!0});function ne(){if(!a.title&&!a.description)return null;let c=u("header",{class:"fd-page-head"});return a.title&&c.append(u("h1",{class:"fd-page-title"},a.title)),a.description&&c.append(u("p",{class:"fd-page-description"},a.description)),c}function Be(c){let R=u("div",{class:"fd-sections","data-node":c.id},...c.children.map(Z)),A=u("button",{type:"submit",class:"fd-button fd-button-primary"},a.data.kind==="responses"?p.submit:p.save),I=u("div",{class:"fd-actions fd-actions-end"},Q,A);if(a.data.kind==="record"){let D=u("button",{type:"button",class:"fd-button"},p.discard);D.addEventListener("click",()=>l.reset()),I.insertBefore(D,A),g.push(q=>{let j=q.dirty.length>0&&q.status!=="saving"&&!C;A.hidden=!j,D.hidden=!j})}else g.push(()=>A.hidden=C);return $&&I.prepend($),t.showActions===!1?u("div",{},R):a.actionsPosition==="top"?(I.classList.add("fd-actions-top"),u("div",{},I,R)):u("div",{},R,I)}function Lt(c){let R=u("div",{class:"fd-wizard","data-node":c.id}),A=u("div",{class:"fd-progress-text"}),I=u("span");R.append(u("div",{class:"fd-progress"},A,u("div",{class:"fd-progress-bar"},I)));let D=c.clickable?u("ol",{class:"fd-steps-list"}):null,q=new Map;if(D){for(let V of c.children){let K=u("button",{type:"button",class:"fd-step-link"},...E(V.icon,V.label));K.addEventListener("click",()=>{l.goTo(V.id)?B():T()}),q.set(V.id,K),D.append(u("li",{},K))}R.append(u("nav",{class:"fd-steps","aria-label":p.steps},D))}let j=c.children.map(V=>{let K=u("section",{class:"fd-step","data-node":V.id,"aria-labelledby":w(`${V.id}-title`)});return K.append(u("h2",{class:"fd-step-title",id:w(`${V.id}-title`)},...E(V.icon,V.label))),V.description&&K.append(u("p",{class:"fd-section-description"},V.description)),K.append(re(V.children)),R.append(K),{step:V,panel:K}}),ie=u("button",{type:"button",class:"fd-button"},c.backLabel??p.back),Y=u("button",{type:"button",class:"fd-button fd-button-link"},p.skip),G=u("button",{type:"submit",class:"fd-button fd-button-primary"});R.append(u("div",{class:"fd-wizard-nav"},ie,u("span",{class:"fd-spacer"}),Q,Y,G)),ie.addEventListener("click",()=>{l.back()&&B()}),Y.addEventListener("click",()=>{l.skip()&&B()});let he=()=>{let V=l.steps();return V.indexOf(l.getState().step??"")===V.length-1};be=async()=>{if(he())return ue();l.next()?B():T()};function B(){j.find(K=>K.step.id===l.getState().step)?.panel.querySelector("input, select, textarea, [role=radio]")?.focus()}return g.push(V=>{let K=l.steps(),ge=Math.max(0,K.indexOf(V.step??""));A.textContent=b(p.stepOf,{n:ge+1,total:K.length}),I.style.width=`${(ge+1)/Math.max(1,K.length)*100}%`;for(let{step:ye,panel:xe}of j)xe.hidden=ye.id!==V.step;let we=ge===K.length-1;ie.hidden=ge===0,Y.hidden=we||!c.children.find(ye=>ye.id===V.step)?.optional,G.textContent=we?c.finishLabel??p.submit:c.nextLabel??p.next;for(let[ye,xe]of q){let $e=K.indexOf(ye);xe.parentElement.hidden=$e===-1,xe.classList.toggle("fd-step-done",$e!==-1&&$e<ge),xe.classList.toggle("fd-step-skipped",V.skipped.includes(ye)),ye===V.step?xe.setAttribute("aria-current","step"):xe.removeAttribute("aria-current")}}),R}function Et(c){let R=u("div",{class:"fd-sheet-page","data-node":c.id}),A=u("div",{class:"fd-actions"}),I=u("button",{type:"submit",class:"fd-button fd-button-primary"},p.save),D=u("button",{type:"button",class:"fd-button"},p.discard);D.addEventListener("click",()=>l.reset());let q=a.actionsPosition==="bottom",j=u("div",{class:"fd-actions fd-actions-end fd-sheet-foot"});t.showActions===!1?A.append(...(c.buttons??[]).map(P)):q?(A.append(...(c.buttons??[]).map(P)),j.append(Q,D,I)):A.append(I,D,...(c.buttons??[]).map(P),Q),$&&t.showActions!==!1&&A.prepend($),g.push(B=>{let V=B.dirty.length>0&&B.status!=="saving"&&!C;I.hidden=!V,D.hidden=!V});let ie=u("div",{class:"fd-header"},A),Y=c.statusbar?.position==="title";c.statusbar&&!Y&&ie.append(me(c.statusbar));let G=u("div",{class:"fd-card"});if(c.ribbon){let B=u("div",{class:`fd-ribbon fd-tone-${c.ribbon.tone??"muted"}`,"data-node":c.ribbon.id},c.ribbon.label);M(B,c.ribbon.id),G.append(u("div",{class:"fd-ribbon-frame"},B))}if(c.statButtons?.length){let B=u("div",{class:"fd-stats"});for(let V of c.statButtons){let K=u("span",{class:"fd-stat-value"}),ge=et(n,V.icon,t.icons),we=u("span",{class:"fd-stat-words"},K,u("span",{class:"fd-stat-label"},V.label)),ye=u("button",{type:"button",class:"fd-stat","data-node":V.id},...ge?[ge,we]:[we]);ye.addEventListener("click",()=>{l.runAction(V.id)}),g.push(xe=>{ye.hidden=l.node(V.id).invisible;let $e=V.field?xe.values[V.field]:null;K.textContent=$e==null?"":String($e)}),B.append(ye)}G.append(B)}for(let B of c.alerts??[]){let V=u("div",{class:`fd-alert fd-tone-${B.tone??"info"}`,role:"status","data-node":B.id},u("span",{class:"fd-alert-message"},B.message));if(B.dismissible){let K=!1,ge=u("button",{type:"button",class:"fd-alert-close","aria-label":p.dismiss},"\xD7");ge.addEventListener("click",()=>{K=!0,V.hidden=!0}),V.append(ge),g.push(()=>{V.hidden=K||l.node(B.id).invisible})}else M(V,B.id);G.append(V)}if(c.badges?.length){let B=u("div",{class:"fd-badges"});for(let V of c.badges){let K=u("span",{class:`fd-badge fd-tone-${V.tone??"muted"}`,"data-node":V.id},...E(V.icon,V.label));M(K,V.id),B.append(K)}g.push(()=>{B.hidden=[...B.children].every(V=>V.hidden)}),G.append(B)}if(c.title){let B=u("div",{class:"fd-title"});c.title.above?.length&&B.append(u("div",{class:"fd-title-above"},...c.title.above.map(O))),B.append(O({type:"field",id:"#title",field:c.title.field,placeholder:c.title.placeholder})),c.title.subtitleField&&B.append(O({type:"field",id:"#subtitle",field:c.title.subtitleField})),c.title.below?.length&&B.append(u("div",{class:"fd-title-below"},...c.title.below.map(O)));let V=u("div",{class:"fd-title-row"},B);if(c.title.avatarField){let K=O({type:"field",id:"#avatar",field:c.title.avatarField});K.classList.add("fd-avatar"),V.append(K)}G.append(V)}c.statusbar&&Y&&G.append(u("div",{class:"fd-title-statusbar"},me(c.statusbar))),G.append(re(c.children)),q&&t.showActions!==!1&&(G.append(j),g.push(B=>{j.hidden=B.dirty.length===0&&!W.textContent}));let he=u("div",{class:"fd-sheet-layout"},G);return c.sidePanel&&(he.classList.add("fd-has-side"),he.append(u("aside",{class:"fd-side"},U(c.sidePanel)))),R.append(ie,he),R}function me(c){let R=a.fields[c.field],A={clickable:c.clickable===!0};c.visibleStates&&(A.visibleStates=c.visibleStates);let I={type:"field",id:"#statusbar",field:c.field,widget:"statusbar",options:A},D=ke({form:l,name:c.field,field:R,node:I,id:w("statusbar"),document:n,labels:y,preferences:o,locale:i,dialogs:d},t.widgets);return g.push(q=>D.update({value:q.values[c.field],values:q.values,readonly:l.node("#statusbar").readonly||C,required:!1,invalid:!1})),D.element}let be=null,ve=a.layout,qe;ve.type==="sheet"?qe=Et(ve):ve.type==="wizard"?qe=Lt(ve):ve.type==="tabs"?qe=Be({id:`${ve.id}-page`,children:[ve]}):qe=Be(ve);let Yt=ve.type==="sheet"?null:ne();ae.append(...Yt?[Yt]:[],Fe,x,qe),k.append(ae,z,Ne),t.saveStatus==="toast"?(Q.classList.add("fd-toast"),k.append(Q)):t.saveStatus==="bar"&&(Q.classList.add("fd-status-bar"),ae.prepend(Q)),k.addEventListener("submit",c=>{c.preventDefault(),be?be():ue()});function In(){let c=n.activeElement;c&&k.contains(c)&&(c.tagName==="INPUT"||c.tagName==="TEXTAREA")&&c.dispatchEvent(new Event("change",{bubbles:!0}))}function Dn(c){let R=[...k.querySelectorAll(".fd-field")].filter(D=>!D.closest('[hidden], [data-type="one2many"] .fd-field, .fd-form-dialog')&&!D.parentElement?.closest('[data-type="one2many"]')),A=c.closest(".fd-field"),I=R.slice(R.indexOf(A)+1);for(let D of I){let q=D.querySelector('input:not([type="hidden"]):not([readonly]):not([disabled]), select:not([disabled]), textarea:not([readonly]), [contenteditable="true"]');if(q)return q}return null}k.addEventListener("keydown",c=>{if(c.isComposing||c.key!=="Enter"||c.target.closest(".fd-slot"))return;let R=t.keys??{};if(c.ctrlKey||c.metaKey){if(R.saveWithCtrlEnter===!1||t.showActions===!1||c.target.closest(".ag-root-wrapper"))return;c.preventDefault(),In(),be?be():ue();return}if(c.defaultPrevented||!R.enterMovesToNext||c.shiftKey||c.altKey)return;let A=c.target;A.tagName!=="INPUT"&&A.tagName!=="SELECT"||A.closest('[data-type="one2many"]')||["button","submit","reset","file"].includes(A.type)||(c.preventDefault(),Dn(A)?.focus())});function Gt(c,R=!0){return new Promise(A=>{let I=u("p",{id:`${h}-confirm`},c),D=u("button",{type:"button",class:"fd-button"},p.cancel),q=u("button",{type:"button",class:"fd-button fd-button-primary"},p.ok),j=u("div",{class:"fd-dialog",role:"alertdialog","aria-modal":"true","aria-labelledby":I.id},I,u("div",{class:"fd-actions fd-actions-end"},...R?[D,q]:[q])),ie=u("div",{class:"fd-dialog-backdrop"},j),Y=G=>{ie.remove(),A(G)};D.addEventListener("click",()=>Y(!1)),q.addEventListener("click",()=>Y(!0)),ie.addEventListener("keydown",G=>{G.key==="Escape"&&Y(!1)}),k.append(ie),q.focus()})}function We(c){for(let R of g)R(c)}e.append(k);let Pn=l.subscribe(We);return We(l.getState()),l.getState().status==="idle"&&l.load(),{form:l,element:k,setSkin(c){k.setAttribute("data-fd-skin",c)},async save(){let c=await l.save();return c||T(),c},check(){let c=l.validate();return c||T(),c},setReadonly(c){C=c,k.toggleAttribute("data-readonly",C),We(l.getState())},isReadonly:()=>C,destroy(){Pn();for(let c of f)c();k.remove(),s&&l.dispose()}}}var Wr=new Set(["boolean","one2many","binary","image","html","json","properties"]);var zr="0.8.0";return Jn(jr);})();
|
|
608
610
|
//# sourceMappingURL=fieldia.js.map
|