voc-lib-js 1.0.56 → 1.0.58
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/dist/main.global.js +2 -2
- package/dist/main.js +2 -2
- package/dist/main.mjs +2 -2
- package/package.json +1 -1
package/dist/main.global.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";var VocLibJs=(()=>{var P=Object.defineProperty;var Q=Object.getOwnPropertyDescriptor;var X=Object.getOwnPropertyNames;var Z=Object.prototype.hasOwnProperty;var ee=(s,b)=>{for(var h in b)P(s,h,{get:b[h],enumerable:!0})},te=(s,b,h,y)=>{if(b&&typeof b=="object"||typeof b=="function")for(let d of X(b))!Z.call(s,d)&&d!==h&&P(s,d,{get:()=>b[d],enumerable:!(y=Q(b,d))||y.enumerable});return s};var ae=s=>te(P({},"__esModule",{value:!0}),s);var ce={};ee(ce,{FormsLib:()=>oe,default:()=>ie});function W(s,b,h){let y=b?.style==="bootstrap",d=document.createElement("div");d.className="voc-form-avatar-wrapper",y&&d.classList.add("d-flex","align-items-center","gap-3");let m=document.createElement("img");m.className="voc-form-avatar-preview",m.alt=s.label||"avatar",y&&(m.classList.add("img-thumbnail","rounded-circle"),m.style.width=m.style.height="64px",m.style.objectFit="cover");let L=h!=null?String(h):s.default!==void 0&&s.default!==null?String(s.default):"";L?m.src=L:(m.src="",m.style.display="none");let c=document.createElement("input");c.type="file",c.accept=s.accept||"image/*",c.className="voc-form-avatar-input",y&&c.classList.add("form-control"),(s.key||s.name)&&(c.name=s.name||s.key,s.key&&(c.id=`voc-form-${s.key}`));let f=document.createElement("input");if(f.type="hidden",(s.key||s.name)&&(f.name=(s.name||s.key)+"_url"),f.value=L||"",c.addEventListener("change",g=>{let u=g.target;if(u.files&&u.files.length>0){let x=u.files[0],N=new FileReader;N.onload=()=>{m.src=String(N.result),m.style.display="",f.value=""},N.readAsDataURL(x)}}),y){let g=document.createElement("div");g.style.flex="1",g.appendChild(c),g.appendChild(f),d.appendChild(m),d.appendChild(g)}else d.appendChild(m),d.appendChild(c),d.appendChild(f);return d}function z(s,b,h){let y=b?.style==="bootstrap",d=document.createElement("div");if(d.className="voc-form-audio-select",!s.options||s.options.length===0)return d;let m=s.name||s.key||`audio_select_${Math.random().toString(36).substr(2,6)}`,L;return Array.isArray(h)?L=h[0]:h!==void 0?L=h:s.default!==void 0&&(L=s.default),s.options.forEach((c,f)=>{let g=document.createElement("div");g.className="voc-form-audio-item",y&&g.classList.add("form-check");let u=document.createElement("input");u.type="radio",u.name=m,u.value=c.value,u.className="voc-form-audio-radio",s.key&&(u.id=`voc-form-${s.key}-${f}`),s.required&&f===0&&(u.required=!0),u.style.position="absolute",u.style.width="1px",u.style.height="1px",u.style.margin="0",u.style.padding="0",u.style.clip="rect(0 0 0 0)",u.style.clipPath="inset(50%)",u.style.overflow="hidden",u.style.border="0",L!==void 0&&(Array.isArray(L)?u.checked=L.includes(c.value):u.checked=String(L)===String(c.value));let x=()=>{u.checked?g.classList.add("selected"):g.classList.remove("selected")};u.addEventListener("change",()=>{d.querySelectorAll(".voc-form-audio-item").forEach(n=>n.classList.remove("selected")),x()}),u.checked&&g.classList.add("selected");let N=document.createElement("label");N.className="voc-form-audio-label",y&&N.classList.add("form-check-label"),N.htmlFor=u.id||"",N.textContent=c.label||c.value,N.tabIndex=0;let e=document.createElement("div");e.className="voc-form-audio-control";let l=null;if(c.audio_link){let t=document.createElement("button");t.type="button",t.className="voc-form-audio-play",y&&t.classList.add("btn","btn-sm","btn-outline-secondary"),t.setAttribute("aria-label",`Play ${c.label||c.value}`);let n="http://www.w3.org/2000/svg",i=document.createElementNS(n,"svg");i.setAttribute("viewBox","0 0 24 24"),i.setAttribute("width","16"),i.setAttribute("height","16"),i.setAttribute("aria-hidden","true");let r=document.createElementNS(n,"path");r.setAttribute("d","M8 5v14l11-7z"),r.setAttribute("fill","currentColor"),i.appendChild(r),t.appendChild(i),l=document.createElement("audio"),l.src=c.audio_link,l.preload="none",l.style.display="none";let o=p=>{for(;p.firstChild;)p.removeChild(p.firstChild)},C=()=>{let p="http://www.w3.org/2000/svg",S=document.createElementNS(p,"svg");S.setAttribute("viewBox","0 0 24 24"),S.setAttribute("width","16"),S.setAttribute("height","16"),S.setAttribute("aria-hidden","true");let A=document.createElementNS(p,"path");return A.setAttribute("d","M8 5v14l11-7z"),A.setAttribute("fill","currentColor"),S.appendChild(A),S},F=()=>{let p="http://www.w3.org/2000/svg",S=document.createElementNS(p,"svg");S.setAttribute("viewBox","0 0 24 24"),S.setAttribute("width","16"),S.setAttribute("height","16"),S.setAttribute("aria-hidden","true");let A=document.createElementNS(p,"rect");return A.setAttribute("x","6"),A.setAttribute("y","6"),A.setAttribute("width","12"),A.setAttribute("height","12"),A.setAttribute("fill","currentColor"),S.appendChild(A),S};o(t),t.appendChild(C());let R=p=>{o(t),p?(t.appendChild(F()),t.setAttribute("aria-label",`Stop ${c.label||c.value}`)):(t.appendChild(C()),t.setAttribute("aria-label",`Play ${c.label||c.value}`))};t.addEventListener("click",()=>{try{if(!l)return;let p=d.querySelectorAll("audio");if(!l.paused&&!l.ended){l.pause(),l.currentTime=0;return}p.forEach(A=>{try{A.pause(),A.currentTime=0}catch{}}),d.querySelectorAll(".voc-form-audio-item").forEach(A=>A.classList.remove("is-playing")),l.play()}catch(p){console.warn("audio play failed",p)}}),l.addEventListener("playing",()=>{g.classList.add("is-playing"),R(!0)});let H=()=>{g.classList.remove("is-playing"),R(!1)};l.addEventListener("pause",H),l.addEventListener("ended",H),e.appendChild(t),e.appendChild(l)}let v=document.createElement("div");v.className="voc-form-item-detail",v.style.display="flex",v.style.flexDirection="column",v.style.gap="4px";let a=document.createElement("div");a.className="voc-form-item-top",a.style.display="flex",a.style.alignItems="center",a.style.gap="8px",a.appendChild(u),a.appendChild(N);let E=document.createElement("div");E.className="voc-form-item-description";let k=c.description||c.hint_text||"";k&&(E.textContent=k),v.appendChild(a),v.appendChild(E),e.appendChild(v),g.appendChild(e),a.addEventListener("click",t=>{let n=t.target;n&&n.closest(".voc-form-audio-play")||(u.checked=!0,u.dispatchEvent(new Event("change",{bubbles:!0})))}),g.addEventListener("click",t=>{let n=t.target;n&&n.closest(".voc-form-audio-play")||(u.checked=!0,u.dispatchEvent(new Event("change",{bubbles:!0})))}),d.appendChild(g)}),d}function G(s,b,h){let y=document.createElement("div");y.className="voc-form-table-wrapper";let d=b?.style==="bootstrap",m=document.createElement("input");m.type="hidden",m.name=s.name||s.key,s.key&&(m.id=`voc-form-${s.key}`),y.appendChild(m);let L=document.createElement("table");L.className="voc-form-table",d&&L.classList.add("table","table-bordered");let c=document.createElement("thead"),f=document.createElement("tr"),g=document.createElement("th");g.className="voc-form-table-drag-col",g.textContent="",f.appendChild(g),(s.fields||[]).forEach(n=>{let i=document.createElement("th");i.textContent=n.label||n.key,f.appendChild(i)});let u=document.createElement("th");u.textContent="Actions",f.appendChild(u),c.appendChild(f),L.appendChild(c);let x=document.createElement("tbody");L.appendChild(x),y.appendChild(L);let N=document.createElement("button");N.type="button",N.className="voc-form-table-add",d&&N.classList.add("btn","btn-secondary"),N.textContent="+Add";let e=document.createElement("tfoot"),l=document.createElement("tr"),v=document.createElement("td");v.colSpan=(s.fields?s.fields.length:0)+1,v.appendChild(N),l.appendChild(v),e.appendChild(l),L.appendChild(e),y.appendChild(L);let a=[];function E(){m.value=JSON.stringify(a)}function k(n){let i=[];return s.fields.forEach(r=>{let o=n[r.key];if(r.type==="checkbox"){let C=Array.isArray(o)?o:o?[o]:[];r.required&&C.length===0&&i.push(`${r.label||r.key} is required`);return}r.required&&(o==null||String(o).trim()==="")&&i.push(`${r.label||r.key} is required`),r.type==="email"&&o&&(/^\S+@\S+\.\S+$/.test(String(o))||i.push(`${r.label||r.key} must be a valid email`)),r.type==="number"&&o&&isNaN(Number(o))&&i.push(`${r.label||r.key} must be a number`),r.validation&&r.validation.regex&&o&&(new RegExp(r.validation.regex).test(String(o))||i.push(`${r.label||r.key} invalid format`))}),i}function t(){x.innerHTML="";let n=(i,r)=>{r.draggable=!0,r.addEventListener("mousedown",()=>{r.style.cursor="grabbing"}),r.addEventListener("mouseup",()=>{r.style.cursor="grab"}),r.addEventListener("dragstart",o=>{let C=Number(i.dataset.rowIndex);o.dataTransfer.setData("text/plain",String(C)),i.classList.add("dragging");try{o.dataTransfer?.setDragImage(r,10,10)}catch{}}),r.addEventListener("dragend",()=>{i.classList.remove("dragging"),r.style.cursor="grab"}),i.addEventListener("dragover",o=>{o.preventDefault();let C=o.currentTarget,F=C.getBoundingClientRect(),R=F.top+F.height/2,H=(o.clientY||o.y)>R;C.classList.remove("drag-over-top","drag-over-bottom"),H?(C.classList.add("drag-over-bottom"),C.dataset.dropPosition="after"):(C.classList.add("drag-over-top"),C.dataset.dropPosition="before")}),i.addEventListener("dragleave",o=>{let C=o.currentTarget;C.classList.remove("drag-over-top","drag-over-bottom"),delete C.dataset.dropPosition}),i.addEventListener("drop",o=>{o.preventDefault();let C=o.dataTransfer.getData("text/plain"),F=Number(o.currentTarget.dataset.rowIndex),R=Number(C),H=o.currentTarget.dataset.dropPosition||"before";if(isNaN(R)||isNaN(F))return;let[p]=a.splice(R,1),S=F;R<F&&(S=F-1);let A=H==="after"?S+1:S;a.splice(A,0,p),o.currentTarget.classList.remove("drag-over-top","drag-over-bottom"),delete o.currentTarget.dataset.dropPosition,t(),E()})};a.forEach((i,r)=>{let o=document.createElement("tr");o.dataset.rowIndex=String(r),o.classList.add("voc-form-table-row");let C=document.createElement("td");C.className="voc-form-table-drag-handle";let F=document.createElement("span");F.className="voc-form-drag-handle-icon",F.textContent="\u2630",F.style.cursor="grab",C.appendChild(F),o.appendChild(C),n(o,F),s.fields.forEach(p=>{let S=document.createElement("td"),A,_=(p.type||"text").toLowerCase();if(_==="select"){let w=document.createElement("select");if(w.className="voc-form-table-cell",d&&w.classList.add("form-control"),p.placeholder){let T=document.createElement("option");T.value="",T.textContent=p.placeholder,T.disabled=!0,(i[p.key]===void 0||i[p.key]===null||i[p.key]==="")&&(T.selected=!0),w.appendChild(T)}(p.options||[]).forEach(T=>{let D=document.createElement("option");D.value=T.value,D.textContent=T.label,w.appendChild(D)}),w.value=i[p.key]!==void 0&&i[p.key]!==null?String(i[p.key]):"",p.required&&(w.required=!0),w.addEventListener("change",T=>{a[r][p.key]=T.target.value,E()}),A=w}else if(_==="checkbox"){let w=document.createElement("div");w.className="voc-form-table-checkboxes",d&&w.classList.add("form-check");let B=p.options||[];Array.isArray(a[r][p.key])||(a[r][p.key]=a[r][p.key]?[a[r][p.key]]:[]),B.forEach(T=>{let D=`voc-form-${s.key}-${p.key}-${r}-${T.value}`,$=document.createElement("div");$.className="voc-form-table-checkbox-item",d&&$.classList.add("form-check");let M=document.createElement("input");M.type="checkbox",M.className="voc-form-table-cell",d&&M.classList.add("form-check-input"),M.id=D,M.value=T.value,M.checked=Array.isArray(a[r][p.key])&&a[r][p.key].includes(T.value),M.addEventListener("change",O=>{let K=O.target.checked;Array.isArray(a[r][p.key])||(a[r][p.key]=[]),K?a[r][p.key].includes(T.value)||a[r][p.key].push(T.value):a[r][p.key]=a[r][p.key].filter(Y=>Y!==T.value),E()});let q=document.createElement("label");q.htmlFor=D,q.className="voc-form-table-checkbox-label",d&&q.classList.add("form-check-label"),q.textContent=T.label,$.appendChild(M),$.appendChild(q),w.appendChild($)}),A=w}else if(_==="radio"){let w=document.createElement("div");w.className="voc-form-table-radios",d&&w.classList.add("form-check");let B=p.options||[];a[r][p.key]===void 0&&(a[r][p.key]=""),B.forEach(T=>{let D=`voc-form-${s.key}-${p.key}-${r}-${T.value}`,$=document.createElement("div");$.className="voc-form-table-radio-item",d&&$.classList.add("form-check");let M=document.createElement("input");M.type="radio",M.className="voc-form-table-cell",d&&M.classList.add("form-check-input"),M.id=D,M.name=`voc-form-${s.key}-${p.key}-${r}`,M.value=T.value,M.checked=a[r][p.key]===T.value,M.addEventListener("change",O=>{O.target.checked&&(a[r][p.key]=O.target.value,E())});let q=document.createElement("label");q.htmlFor=D,q.className="voc-form-table-radio-label",d&&q.classList.add("form-check-label"),q.textContent=T.label,$.appendChild(M),$.appendChild(q),w.appendChild($)}),A=w}else{let w=document.createElement("input");_==="number"?w.type="number":_==="email"?w.type="email":_==="tel"?w.type="tel":_==="url"?w.type="url":_==="date"?w.type="date":w.type="text",w.value=i[p.key]!==void 0&&i[p.key]!==null?String(i[p.key]):"",p.placeholder&&(w.placeholder=p.placeholder),p.required&&(w.required=!0),w.className="voc-form-table-cell",d&&w.classList.add("form-control"),w.addEventListener("input",B=>{a[r][p.key]=B.target.value,E()}),A=w}S.appendChild(A),o.appendChild(S)});let R=document.createElement("td"),H=document.createElement("button");H.type="button",H.className="voc-form-table-remove",d&&H.classList.add("btn","btn-danger"),H.textContent="Remove",H.addEventListener("click",()=>{a.splice(r,1),t(),E()}),R.appendChild(H),o.appendChild(R),x.appendChild(o)})}return N.addEventListener("click",()=>{if(s.validation?.max_rows!==void 0&&a.length>=s.validation.max_rows)return;let n={};s.fields.forEach(i=>n[i.key]=""),a.push(n),t(),E()}),Array.isArray(h)&&h.length?a=h.map(n=>({...n})):s.default&&Array.isArray(s.default)&&(a=s.default.map(n=>({...n}))),t(),E(),y.validate=function(){let n=[];return a.forEach((i,r)=>{let o=k(i);o.length&&n.push(`Row ${r+1}: ${o.join("; ")}`)}),s.validation?.min_rows!==void 0&&a.length<s.validation.min_rows&&n.push(`At least ${s.validation.min_rows} rows required`),s.validation?.max_rows!==void 0&&a.length>s.validation.max_rows&&n.push(`No more than ${s.validation.max_rows} rows allowed`),s.validation?.unique_fields&&s.validation.unique_fields.length&&s.validation.unique_fields.forEach(i=>{let r=new Set;a.forEach((o,C)=>{let F=o[i];F!=null&&(r.has(F)&&n.push(`Field ${i} must be unique (duplicate at row ${C+1})`),r.add(F))})}),n},y}async function ne(s){let h=new TextEncoder().encode(s),y=await crypto.subtle.digest("SHA-256",h);return Array.from(new Uint8Array(y)).map(m=>m.toString(16).padStart(2,"0")).join("")}async function re(s){let b=String(s||"").trim().toLowerCase();return b?`https://gravatar.com/avatar/${await ne(b)}?d=mp`:""}function U(s,b,h){let y=b?.style==="bootstrap",d=document.createElement("div");d.className="voc-form-users";let m=document.createElement("div");if(m.className="voc-form-users-header",y&&m.classList.add("mb-2"),s.label){let e=document.createElement("div");if(e.className="voc-form-users-label",y&&e.classList.add("form-label"),e.textContent=s.label,s.required){let l=document.createElement("span");l.className="voc-form-required",l.textContent="*",e.appendChild(l)}m.appendChild(e)}if(s.description){let e=document.createElement("div");e.className="voc-form-users-description",y&&e.classList.add("form-text"),e.textContent=s.description,m.appendChild(e)}d.appendChild(m);let L=document.createElement("div");L.className="voc-form-users-search-wrapper";let c=document.createElement("input");if(c.type="search",c.placeholder="Search users...",c.className="voc-form-users-search",y&&c.classList.add("form-control","mb-2"),L.appendChild(c),d.appendChild(L),!s.options||s.options.length===0)return d;let f=document.createElement("div");f.className="voc-form-users-list",y&&f.classList.add("list-group");let g=s.name||s.key||`users_${Math.random().toString(36).substr(2,6)}`,u=[];Array.isArray(h)?u=h:h!=null?u=[h]:Array.isArray(s.default)&&(u=s.default),s.options.forEach((e,l)=>{let v=document.createElement("div");v.className="voc-form-user-item",v.dataset.label=String(e.label||"").toLowerCase(),v.dataset.email=String(e.email||"").toLowerCase(),v.dataset.value=String(e.value||"").toLowerCase(),y&&v.classList.add("d-flex","align-items-center","gap-2");let a=document.createElement("input");a.type="checkbox",a.name=`${g}[]`,a.value=e.value,a.className="voc-form-user-checkbox",s.key&&(a.id=`voc-form-${s.key}-${l}`),s.required&&l===0&&(a.required=!0),a.style.position="absolute",a.style.width="1px",a.style.height="1px",a.style.margin="0",a.style.padding="0",a.style.clip="rect(0 0 0 0)",a.style.clipPath="inset(50%)",a.style.overflow="hidden",a.style.border="0",u&&Array.isArray(u)&&(a.checked=u.includes(e.value));let E=document.createElement("img");E.className="voc-form-user-avatar",E.alt=e.label||String(e.value||"user"),E.style.width=E.style.height="40px",E.style.objectFit="cover",E.style.borderRadius="50%",E.src="",e.email&&re(e.email).then(i=>{i&&(E.src=i)}).catch(()=>{});let k=document.createElement("div");k.className="voc-form-user-info",k.style.display="flex",k.style.flexDirection="column",k.style.gap="2px";let t=document.createElement("div");t.className="voc-form-user-label",t.textContent=e.label||String(e.value);let n=document.createElement("small");n.className="voc-form-user-email",n.textContent=e.email||"",k.appendChild(t),k.appendChild(n),v.addEventListener("click",i=>{let r=i.target;r&&(r.closest("input")||r.closest("a")||r.closest("button"))||(a.checked=!a.checked,a.dispatchEvent(new Event("change",{bubbles:!0})))}),a.addEventListener("change",()=>{a.checked?v.classList.add("selected"):v.classList.remove("selected")}),a.checked&&v.classList.add("selected"),v.appendChild(a),v.appendChild(E),v.appendChild(k),f.appendChild(v)}),d.appendChild(f);let x=Array.from(f.querySelectorAll(".voc-form-user-item")),N=()=>{let e=String(c.value||"").trim().toLowerCase();if(!e){x.forEach(l=>l.style.setProperty("display","flex","important"));return}x.forEach(l=>{let v=l.dataset.label||"",a=l.dataset.email||"",E=l.dataset.value||"",k=v.includes(e)||a.includes(e)||E.includes(e);l.style.setProperty("display",k?"flex":"none","important")})};return c.addEventListener("input",N),d}function I(s,b=!0){let h=new FormData(s);if(b)return se(h);let y={};return h.forEach((d,m)=>{let L=(d instanceof File,d);Object.prototype.hasOwnProperty.call(y,m)?Array.isArray(y[m])?y[m].push(L):y[m]=[y[m],L]:y[m]=L}),y}function se(s){let b=new FormData;for(let[h,y]of s.entries()){if(y instanceof File){b.append(h,y);continue}let d;try{d=JSON.parse(y)}catch{d=null}Array.isArray(d)?d.length===0?b.append(h,"[]"):d.every(m=>typeof m=="object"&&m!==null)?d.forEach((m,L)=>{for(let[c,f]of Object.entries(m))b.append(`${h}[${L}][${c}]`,f)}):b.append(h,y):b.append(h,y)}return b}async function J(s,b,h){let y=b.url,d={"Content-Type":"application/json"};b?.api_token&&(d.Authorization=`Bearer ${b.api_token}`);let m=I(s);if(b?.additional_data)for(let[f,g]of Object.entries(b.additional_data))m.append(f,g);let L,c=m instanceof FormData;L={method:"POST",headers:{Authorization:`Bearer ${b.api_token}`,...c?{}:{"Content-Type":"application/json"},Accept:"application/json"},body:c?m:JSON.stringify(Object.fromEntries(m.entries()))};try{fetch(y,L).then(async f=>{let g=f.headers.get("content-type");if(!f.ok)try{let x=(await f.json())?.message;throw new Error(x??"Their was an error submitting the form. Check your form and try again.")}catch(u){throw new Error(u.message)}return g&&g.includes("application/json")?f.json():f.text()}).then(f=>{h&&h(f,null)}).catch(f=>{h&&h(null,f)})}catch(f){h&&h(null,f)}}function V(s,b,h){let y=[];if(typeof s=="string"?y=Array.from(document.querySelectorAll(s)):y=[s],y.length===0)return null;function d(){let c=h?.style==="bootstrap",f=document.createElement("form");f.classList.add("voc-form"),c&&f.classList.add("needs-validation"),f.id=b.id;let g=document.createElement("h2");g.className="voc-form-title",c&&g.classList.add("mb-3"),g.textContent=b.form_name,f.appendChild(g);function u(e,l){l&&(l.min_length!==void 0&&(e.minLength=l.min_length),l.max_length!==void 0&&(e.maxLength=l.max_length),l.regex&&(e instanceof HTMLInputElement?e.pattern=l.regex:e.dataset.pattern=l.regex))}function x(e){if(!e.key&&!e.label)return null;let l=b.default_values||{},v=e.name||e.key,a=v?l[v]:void 0,E=document.createElement("div");if(E.className="voc-form-group",c&&E.classList.add("mb-3"),e.label&&e.type!=="users"){let t=document.createElement("label");if(t.classList.add("voc-form-label"),c&&t.classList.add("form-label"),e.key?e.type==="radio"?t.htmlFor="":t.htmlFor=`voc-form-${e.key}`:t.htmlFor="",t.textContent=e.label,e.required){let n=document.createElement("span");n.className="voc-form-required",n.textContent="*",t.appendChild(n)}E.appendChild(t)}let k=null;switch(e.type){case"checkbox":{let t=document.createElement("div");if(t.className="voc-form-checkbox-group "+(e.direction||"vertical"),e.width&&(t.style.width=e.width),e.options)e.options.forEach((n,i)=>{let r=document.createElement("label");r.classList.add("voc-form-checkbox-label"),c&&r.classList.add("form-check"),r.style.display=e.direction==="horizontal"?"inline-block":"block",e.width&&(r.style.width=e.width);let o=document.createElement("input");o.type="checkbox",o.classList.add("voc-form-checkbox"),c&&o.classList.add("form-check-input"),o.name=e.name||e.key||"",o.value=n.value,e.key&&(o.id=`voc-form-${e.key}-${i}`),e.required&&(o.required=!0),Array.isArray(a)?a.includes(n.value)&&(o.checked=!0):a!==void 0?a===n.value&&(o.checked=!0):e.default===n.value&&(o.checked=!0),r.appendChild(o),r.appendChild(document.createTextNode(n.label)),t.appendChild(r)});else{let n=document.createElement("label");n.classList.add("voc-form-checkbox-label"),c&&n.classList.add("form-check"),e.width&&(n.style.width=e.width);let i=document.createElement("input");i.type="checkbox",i.classList.add("voc-form-checkbox"),(e.key||e.name)&&(i.name=e.name||e.key,e.key&&(i.id=`voc-form-${e.key}`)),c&&i.classList.add("form-check-input"),e.required&&(i.required=!0),a!==void 0?i.checked=!!a:e.default&&(i.checked=!!e.default),n.appendChild(i),n.appendChild(document.createTextNode(e.label||"")),t.appendChild(n)}k=t;break}case"textarea":{let t=document.createElement("textarea");t.classList.add("voc-form-textarea"),c&&t.classList.add("form-control"),(e.key||e.name)&&(t.name=e.name||e.key,e.key&&(t.id=`voc-form-${e.key}`)),e.placeholder&&(t.placeholder=e.placeholder),a!=null?t.value=String(a):e.default!==void 0&&e.default!==null&&(t.value=String(e.default));let n=e.default||a||"";if(n){let i=(n.match(/\n/g)||[]).length,r=80,o=n.split(`
|
|
2
|
-
`).reduce((R,H)=>Math.max(R,H.length),0),
|
|
1
|
+
"use strict";var VocLibJs=(()=>{var P=Object.defineProperty;var Q=Object.getOwnPropertyDescriptor;var X=Object.getOwnPropertyNames;var Z=Object.prototype.hasOwnProperty;var ee=(s,b)=>{for(var p in b)P(s,p,{get:b[p],enumerable:!0})},te=(s,b,p,v)=>{if(b&&typeof b=="object"||typeof b=="function")for(let d of X(b))!Z.call(s,d)&&d!==p&&P(s,d,{get:()=>b[d],enumerable:!(v=Q(b,d))||v.enumerable});return s};var ae=s=>te(P({},"__esModule",{value:!0}),s);var ce={};ee(ce,{FormsLib:()=>oe,default:()=>ie});function W(s,b,p){let v=b?.style==="bootstrap",d=document.createElement("div");d.className="voc-form-avatar-wrapper",v&&d.classList.add("d-flex","align-items-center","gap-3");let m=document.createElement("img");m.className="voc-form-avatar-preview",m.alt=s.label||"avatar",v&&(m.classList.add("img-thumbnail","rounded-circle"),m.style.width=m.style.height="64px",m.style.objectFit="cover");let L=p!=null?String(p):s.default!==void 0&&s.default!==null?String(s.default):"";L?m.src=L:(m.src="",m.style.display="none");let c=document.createElement("input");c.type="file",c.accept=s.accept||"image/*",c.className="voc-form-avatar-input",v&&c.classList.add("form-control"),(s.key||s.name)&&(c.name=s.name||s.key,s.key&&(c.id=`voc-form-${s.key}`));let h=document.createElement("input");if(h.type="hidden",(s.key||s.name)&&(h.name=(s.name||s.key)+"_url"),h.value=L||"",c.addEventListener("change",C=>{let f=C.target;if(f.files&&f.files.length>0){let A=f.files[0],k=new FileReader;k.onload=()=>{m.src=String(k.result),m.style.display="",h.value=""},k.readAsDataURL(A)}}),v){let C=document.createElement("div");C.style.flex="1",C.appendChild(c),C.appendChild(h),d.appendChild(m),d.appendChild(C)}else d.appendChild(m),d.appendChild(c),d.appendChild(h);return d}function z(s,b,p){let v=b?.style==="bootstrap",d=document.createElement("div");if(d.className="voc-form-audio-select",!s.options||s.options.length===0)return d;let m=s.name||s.key||`audio_select_${Math.random().toString(36).substr(2,6)}`,L;return Array.isArray(p)?L=p[0]:p!==void 0?L=p:s.default!==void 0&&(L=s.default),s.options.forEach((c,h)=>{let C=document.createElement("div");C.className="voc-form-audio-item",v&&C.classList.add("form-check");let f=document.createElement("input");f.type="radio",f.name=m,f.value=c.value,f.className="voc-form-audio-radio",s.key&&(f.id=`voc-form-${s.key}-${h}`),s.required&&h===0&&(f.required=!0),f.style.position="absolute",f.style.width="1px",f.style.height="1px",f.style.margin="0",f.style.padding="0",f.style.clip="rect(0 0 0 0)",f.style.clipPath="inset(50%)",f.style.overflow="hidden",f.style.border="0",L!==void 0&&(Array.isArray(L)?f.checked=L.includes(c.value):f.checked=String(L)===String(c.value));let A=()=>{f.checked?C.classList.add("selected"):C.classList.remove("selected")};f.addEventListener("change",()=>{d.querySelectorAll(".voc-form-audio-item").forEach(n=>n.classList.remove("selected")),A()}),f.checked&&C.classList.add("selected");let k=document.createElement("label");k.className="voc-form-audio-label",v&&k.classList.add("form-check-label"),k.htmlFor=f.id||"",k.textContent=c.label||c.value,k.tabIndex=0;let e=document.createElement("div");e.className="voc-form-audio-control";let l=null;if(c.audio_link){let t=document.createElement("button");t.type="button",t.className="voc-form-audio-play",v&&t.classList.add("btn","btn-sm","btn-outline-secondary"),t.setAttribute("aria-label",`Play ${c.label||c.value}`);let n="http://www.w3.org/2000/svg",i=document.createElementNS(n,"svg");i.setAttribute("viewBox","0 0 24 24"),i.setAttribute("width","16"),i.setAttribute("height","16"),i.setAttribute("aria-hidden","true");let r=document.createElementNS(n,"path");r.setAttribute("d","M8 5v14l11-7z"),r.setAttribute("fill","currentColor"),i.appendChild(r),t.appendChild(i),l=document.createElement("audio"),l.src=c.audio_link,l.preload="none",l.style.display="none";let o=u=>{for(;u.firstChild;)u.removeChild(u.firstChild)},x=()=>{let u="http://www.w3.org/2000/svg",F=document.createElementNS(u,"svg");F.setAttribute("viewBox","0 0 24 24"),F.setAttribute("width","16"),F.setAttribute("height","16"),F.setAttribute("aria-hidden","true");let N=document.createElementNS(u,"path");return N.setAttribute("d","M8 5v14l11-7z"),N.setAttribute("fill","currentColor"),F.appendChild(N),F},S=()=>{let u="http://www.w3.org/2000/svg",F=document.createElementNS(u,"svg");F.setAttribute("viewBox","0 0 24 24"),F.setAttribute("width","16"),F.setAttribute("height","16"),F.setAttribute("aria-hidden","true");let N=document.createElementNS(u,"rect");return N.setAttribute("x","6"),N.setAttribute("y","6"),N.setAttribute("width","12"),N.setAttribute("height","12"),N.setAttribute("fill","currentColor"),F.appendChild(N),F};o(t),t.appendChild(x());let R=u=>{o(t),u?(t.appendChild(S()),t.setAttribute("aria-label",`Stop ${c.label||c.value}`)):(t.appendChild(x()),t.setAttribute("aria-label",`Play ${c.label||c.value}`))};t.addEventListener("click",()=>{try{if(!l)return;let u=d.querySelectorAll("audio");if(!l.paused&&!l.ended){l.pause(),l.currentTime=0;return}u.forEach(N=>{try{N.pause(),N.currentTime=0}catch{}}),d.querySelectorAll(".voc-form-audio-item").forEach(N=>N.classList.remove("is-playing")),l.play()}catch(u){console.warn("audio play failed",u)}}),l.addEventListener("playing",()=>{C.classList.add("is-playing"),R(!0)});let H=()=>{C.classList.remove("is-playing"),R(!1)};l.addEventListener("pause",H),l.addEventListener("ended",H),e.appendChild(t),e.appendChild(l)}let y=document.createElement("div");y.className="voc-form-item-detail",y.style.display="flex",y.style.flexDirection="column",y.style.gap="4px";let a=document.createElement("div");a.className="voc-form-item-top",a.style.display="flex",a.style.alignItems="center",a.style.gap="8px",a.appendChild(f),a.appendChild(k);let g=document.createElement("div");g.className="voc-form-item-description";let E=c.description||c.hint_text||"";E&&(g.textContent=E),y.appendChild(a),y.appendChild(g),e.appendChild(y),C.appendChild(e),a.addEventListener("click",t=>{let n=t.target;n&&n.closest(".voc-form-audio-play")||(f.checked=!0,f.dispatchEvent(new Event("change",{bubbles:!0})))}),C.addEventListener("click",t=>{let n=t.target;n&&n.closest(".voc-form-audio-play")||(f.checked=!0,f.dispatchEvent(new Event("change",{bubbles:!0})))}),d.appendChild(C)}),d}function G(s,b,p){let v=document.createElement("div");v.className="voc-form-table-wrapper";let d=b?.style==="bootstrap",m=document.createElement("input");m.type="hidden",m.name=s.name||s.key,s.key&&(m.id=`voc-form-${s.key}`),v.appendChild(m);let L=document.createElement("table");L.className="voc-form-table",d&&L.classList.add("table","table-bordered");let c=document.createElement("thead"),h=document.createElement("tr"),C=document.createElement("th");C.className="voc-form-table-drag-col",C.textContent="",h.appendChild(C),(s.fields||[]).forEach(n=>{let i=document.createElement("th");i.textContent=n.label||n.key,h.appendChild(i)});let f=document.createElement("th");f.textContent="Actions",h.appendChild(f),c.appendChild(h),L.appendChild(c);let A=document.createElement("tbody");L.appendChild(A),v.appendChild(L);let k=document.createElement("button");k.type="button",k.className="voc-form-table-add",d&&k.classList.add("btn","btn-secondary"),k.textContent="+Add";let e=document.createElement("tfoot"),l=document.createElement("tr"),y=document.createElement("td");y.colSpan=(s.fields?s.fields.length:0)+1,y.appendChild(k),l.appendChild(y),e.appendChild(l),L.appendChild(e),v.appendChild(L);let a=[];function g(){m.value=JSON.stringify(a)}function E(n){let i=[];return s.fields.forEach(r=>{let o=n[r.key];if(r.type==="checkbox"){let x=Array.isArray(o)?o:o?[o]:[];r.required&&x.length===0&&i.push(`${r.label||r.key} is required`);return}r.required&&(o==null||String(o).trim()==="")&&i.push(`${r.label||r.key} is required`),r.type==="email"&&o&&(/^\S+@\S+\.\S+$/.test(String(o))||i.push(`${r.label||r.key} must be a valid email`)),r.type==="number"&&o&&isNaN(Number(o))&&i.push(`${r.label||r.key} must be a number`),r.validation&&r.validation.regex&&o&&(new RegExp(r.validation.regex).test(String(o))||i.push(`${r.label||r.key} invalid format`))}),i}function t(){A.innerHTML="";let n=(i,r)=>{r.draggable=!0,r.addEventListener("mousedown",()=>{r.style.cursor="grabbing"}),r.addEventListener("mouseup",()=>{r.style.cursor="grab"}),r.addEventListener("dragstart",o=>{let x=Number(i.dataset.rowIndex);o.dataTransfer.setData("text/plain",String(x)),i.classList.add("dragging");try{o.dataTransfer?.setDragImage(r,10,10)}catch{}}),r.addEventListener("dragend",()=>{i.classList.remove("dragging"),r.style.cursor="grab"}),i.addEventListener("dragover",o=>{o.preventDefault();let x=o.currentTarget,S=x.getBoundingClientRect(),R=S.top+S.height/2,H=(o.clientY||o.y)>R;x.classList.remove("drag-over-top","drag-over-bottom"),H?(x.classList.add("drag-over-bottom"),x.dataset.dropPosition="after"):(x.classList.add("drag-over-top"),x.dataset.dropPosition="before")}),i.addEventListener("dragleave",o=>{let x=o.currentTarget;x.classList.remove("drag-over-top","drag-over-bottom"),delete x.dataset.dropPosition}),i.addEventListener("drop",o=>{o.preventDefault();let x=o.dataTransfer.getData("text/plain"),S=Number(o.currentTarget.dataset.rowIndex),R=Number(x),H=o.currentTarget.dataset.dropPosition||"before";if(isNaN(R)||isNaN(S))return;let[u]=a.splice(R,1),F=S;R<S&&(F=S-1);let N=H==="after"?F+1:F;a.splice(N,0,u),o.currentTarget.classList.remove("drag-over-top","drag-over-bottom"),delete o.currentTarget.dataset.dropPosition,t(),g()})};a.forEach((i,r)=>{let o=document.createElement("tr");o.dataset.rowIndex=String(r),o.classList.add("voc-form-table-row");let x=document.createElement("td");x.className="voc-form-table-drag-handle";let S=document.createElement("span");S.className="voc-form-drag-handle-icon",S.textContent="\u2630",S.style.cursor="grab",x.appendChild(S),o.appendChild(x),n(o,S),s.fields.forEach(u=>{let F=document.createElement("td"),N,q=(u.type||"text").toLowerCase();if(q==="select"){let w=document.createElement("select");if(w.className="voc-form-table-cell",d&&w.classList.add("form-control"),u.placeholder){let T=document.createElement("option");T.value="",T.textContent=u.placeholder,T.disabled=!0,(i[u.key]===void 0||i[u.key]===null||i[u.key]==="")&&(T.selected=!0),w.appendChild(T)}(u.options||[]).forEach(T=>{let D=document.createElement("option");D.value=T.value,D.textContent=T.label,w.appendChild(D)}),w.value=i[u.key]!==void 0&&i[u.key]!==null?String(i[u.key]):"",u.required&&(w.required=!0),w.addEventListener("change",T=>{a[r][u.key]=T.target.value,g()}),N=w}else if(q==="checkbox"){let w=document.createElement("div");w.className="voc-form-table-checkboxes",d&&w.classList.add("form-check");let B=u.options||[];Array.isArray(a[r][u.key])||(a[r][u.key]=a[r][u.key]?[a[r][u.key]]:[]),B.forEach(T=>{let D=`voc-form-${s.key}-${u.key}-${r}-${T.value}`,$=document.createElement("div");$.className="voc-form-table-checkbox-item",d&&$.classList.add("form-check");let M=document.createElement("input");M.type="checkbox",M.className="voc-form-table-cell",d&&M.classList.add("form-check-input"),M.id=D,M.value=T.value,M.checked=Array.isArray(a[r][u.key])&&a[r][u.key].includes(T.value),M.addEventListener("change",O=>{let K=O.target.checked;Array.isArray(a[r][u.key])||(a[r][u.key]=[]),K?a[r][u.key].includes(T.value)||a[r][u.key].push(T.value):a[r][u.key]=a[r][u.key].filter(Y=>Y!==T.value),g()});let _=document.createElement("label");_.htmlFor=D,_.className="voc-form-table-checkbox-label",d&&_.classList.add("form-check-label"),_.textContent=T.label,$.appendChild(M),$.appendChild(_),w.appendChild($)}),N=w}else if(q==="radio"){let w=document.createElement("div");w.className="voc-form-table-radios",d&&w.classList.add("form-check");let B=u.options||[];a[r][u.key]===void 0&&(a[r][u.key]=""),B.forEach(T=>{let D=`voc-form-${s.key}-${u.key}-${r}-${T.value}`,$=document.createElement("div");$.className="voc-form-table-radio-item",d&&$.classList.add("form-check");let M=document.createElement("input");M.type="radio",M.className="voc-form-table-cell",d&&M.classList.add("form-check-input"),M.id=D,M.name=`voc-form-${s.key}-${u.key}-${r}`,M.value=T.value,M.checked=a[r][u.key]===T.value,M.addEventListener("change",O=>{O.target.checked&&(a[r][u.key]=O.target.value,g())});let _=document.createElement("label");_.htmlFor=D,_.className="voc-form-table-radio-label",d&&_.classList.add("form-check-label"),_.textContent=T.label,$.appendChild(M),$.appendChild(_),w.appendChild($)}),N=w}else{let w=document.createElement("input");q==="number"?w.type="number":q==="email"?w.type="email":q==="tel"?w.type="tel":q==="url"?w.type="url":q==="date"?w.type="date":w.type="text",w.value=i[u.key]!==void 0&&i[u.key]!==null?String(i[u.key]):"",u.placeholder&&(w.placeholder=u.placeholder),u.required&&(w.required=!0),w.className="voc-form-table-cell",d&&w.classList.add("form-control"),w.addEventListener("input",B=>{a[r][u.key]=B.target.value,g()}),N=w}F.appendChild(N),o.appendChild(F)});let R=document.createElement("td"),H=document.createElement("button");H.type="button",H.className="voc-form-table-remove",d&&H.classList.add("btn","btn-danger"),H.textContent="Remove",H.addEventListener("click",()=>{a.splice(r,1),t(),g()}),R.appendChild(H),o.appendChild(R),A.appendChild(o)})}return k.addEventListener("click",()=>{if(s.validation?.max_rows!==void 0&&a.length>=s.validation.max_rows)return;let n={};s.fields.forEach(i=>n[i.key]=""),a.push(n),t(),g()}),Array.isArray(p)&&p.length?a=p.map(n=>({...n})):s.default&&Array.isArray(s.default)&&(a=s.default.map(n=>({...n}))),t(),g(),v.validate=function(){let n=[];return a.forEach((i,r)=>{let o=E(i);o.length&&n.push(`Row ${r+1}: ${o.join("; ")}`)}),s.validation?.min_rows!==void 0&&a.length<s.validation.min_rows&&n.push(`At least ${s.validation.min_rows} rows required`),s.validation?.max_rows!==void 0&&a.length>s.validation.max_rows&&n.push(`No more than ${s.validation.max_rows} rows allowed`),s.validation?.unique_fields&&s.validation.unique_fields.length&&s.validation.unique_fields.forEach(i=>{let r=new Set;a.forEach((o,x)=>{let S=o[i];S!=null&&(r.has(S)&&n.push(`Field ${i} must be unique (duplicate at row ${x+1})`),r.add(S))})}),n},v}async function ne(s){let p=new TextEncoder().encode(s),v=await crypto.subtle.digest("SHA-256",p);return Array.from(new Uint8Array(v)).map(m=>m.toString(16).padStart(2,"0")).join("")}async function re(s){let b=String(s||"").trim().toLowerCase();return b?`https://gravatar.com/avatar/${await ne(b)}?d=mp`:""}function V(s,b,p){let v=b?.style==="bootstrap",d=document.createElement("div");d.className="voc-form-users";let m=document.createElement("div");if(m.className="voc-form-users-header",v&&m.classList.add("mb-2"),s.label){let e=document.createElement("div");if(e.className="voc-form-users-label",v&&e.classList.add("form-label"),e.textContent=s.label,s.required){let l=document.createElement("span");l.className="voc-form-required",l.textContent="*",e.appendChild(l)}m.appendChild(e)}if(s.description){let e=document.createElement("div");e.className="voc-form-users-description",v&&e.classList.add("form-text"),e.textContent=s.description,m.appendChild(e)}d.appendChild(m);let L=document.createElement("div");L.className="voc-form-users-search-wrapper";let c=document.createElement("input");if(c.type="search",c.placeholder="Search users...",c.className="voc-form-users-search",v&&c.classList.add("form-control","mb-2"),L.appendChild(c),d.appendChild(L),!s.options||s.options.length===0)return d;let h=document.createElement("div");h.className="voc-form-users-list",v&&h.classList.add("list-group");let C=s.name||s.key||`users_${Math.random().toString(36).substr(2,6)}`,f=[];if(Array.isArray(p)?f=p:p!=null?f=[p]:Array.isArray(s.default)&&(f=s.default),s.options.forEach((e,l)=>{let y=document.createElement("div");y.className="voc-form-user-item",y.dataset.label=String(e.label||"").toLowerCase(),y.dataset.email=String(e.email||"").toLowerCase(),y.dataset.value=String(e.value||"").toLowerCase(),v&&y.classList.add("d-flex","align-items-center","gap-2");let a=document.createElement("input");if(a.type="checkbox",a.name=`${C}[]`,a.value=e.value,a.className="voc-form-user-checkbox",s.key&&(a.id=`voc-form-${s.key}-${l}`),a.style.position="absolute",a.style.width="1px",a.style.height="1px",a.style.margin="0",a.style.padding="0",a.style.clip="rect(0 0 0 0)",a.style.clipPath="inset(50%)",a.style.overflow="hidden",a.style.border="0",f&&Array.isArray(f)){let i=f.map(r=>String(r));a.checked=i.includes(String(e.value))}let g=document.createElement("img");g.className="voc-form-user-avatar",g.alt=e.label||String(e.value||"user"),g.style.width=g.style.height="40px",g.style.objectFit="cover",g.style.borderRadius="50%",g.src="",e.email&&re(e.email).then(i=>{i&&(g.src=i)}).catch(()=>{});let E=document.createElement("div");E.className="voc-form-user-info",E.style.display="flex",E.style.flexDirection="column",E.style.gap="2px";let t=document.createElement("div");t.className="voc-form-user-label",t.textContent=e.label||String(e.value);let n=document.createElement("small");n.className="voc-form-user-email",n.textContent=e.email||"",E.appendChild(t),E.appendChild(n),y.addEventListener("click",i=>{let r=i.target;r&&(r.closest("input")||r.closest("a")||r.closest("button"))||(a.checked=!a.checked,a.dispatchEvent(new Event("change",{bubbles:!0})))}),a.addEventListener("change",()=>{a.checked?y.classList.add("selected"):y.classList.remove("selected")}),a.checked&&y.classList.add("selected"),y.appendChild(a),y.appendChild(g),y.appendChild(E),h.appendChild(y)}),d.appendChild(h),s.required){let e=h.querySelectorAll('input[type="checkbox"]'),l=()=>{let y=Array.from(e).some(a=>a.checked);return e.forEach(a=>{y?a.setCustomValidity(""):a.setCustomValidity("At least one option must be selected.")}),y};e.forEach(y=>{y.addEventListener("change",l)}),d._validateCheckboxGroup=l,l()}let A=Array.from(h.querySelectorAll(".voc-form-user-item")),k=()=>{let e=String(c.value||"").trim().toLowerCase();if(!e){A.forEach(l=>l.style.setProperty("display","flex","important"));return}A.forEach(l=>{let y=l.dataset.label||"",a=l.dataset.email||"",g=l.dataset.value||"",E=y.includes(e)||a.includes(e)||g.includes(e);l.style.setProperty("display",E?"flex":"none","important")})};return c.addEventListener("input",k),d}function I(s,b=!0){let p=new FormData(s);if(b)return se(p);let v={};return p.forEach((d,m)=>{let L=(d instanceof File,d);Object.prototype.hasOwnProperty.call(v,m)?Array.isArray(v[m])?v[m].push(L):v[m]=[v[m],L]:v[m]=L}),v}function se(s){let b=new FormData;for(let[p,v]of s.entries()){if(v instanceof File){b.append(p,v);continue}let d;try{d=JSON.parse(v)}catch{d=null}Array.isArray(d)?d.length===0?b.append(p,"[]"):d.every(m=>typeof m=="object"&&m!==null)?d.forEach((m,L)=>{for(let[c,h]of Object.entries(m))b.append(`${p}[${L}][${c}]`,h)}):b.append(p,v):b.append(p,v)}return b}async function U(s,b,p){let v=b.url,d={"Content-Type":"application/json"};b?.api_token&&(d.Authorization=`Bearer ${b.api_token}`);let m=I(s);if(b?.additional_data)for(let[h,C]of Object.entries(b.additional_data))m.append(h,C);let L,c=m instanceof FormData;L={method:"POST",headers:{Authorization:`Bearer ${b.api_token}`,...c?{}:{"Content-Type":"application/json"},Accept:"application/json"},body:c?m:JSON.stringify(Object.fromEntries(m.entries()))};try{fetch(v,L).then(async h=>{let C=h.headers.get("content-type");if(!h.ok)try{let A=(await h.json())?.message;throw new Error(A??"Their was an error submitting the form. Check your form and try again.")}catch(f){throw new Error(f.message)}return C&&C.includes("application/json")?h.json():h.text()}).then(h=>{p&&p(h,null)}).catch(h=>{p&&p(null,h)})}catch(h){p&&p(null,h)}}function J(s,b,p){let v=[];if(typeof s=="string"?v=Array.from(document.querySelectorAll(s)):v=[s],v.length===0)return null;function d(){let c=p?.style==="bootstrap",h=document.createElement("form");h.classList.add("voc-form"),c&&h.classList.add("needs-validation"),h.id=b.id;let C=document.createElement("h2");C.className="voc-form-title",c&&C.classList.add("mb-3"),C.textContent=b.form_name,h.appendChild(C);function f(e,l){l&&(l.min_length!==void 0&&(e.minLength=l.min_length),l.max_length!==void 0&&(e.maxLength=l.max_length),l.regex&&(e instanceof HTMLInputElement?e.pattern=l.regex:e.dataset.pattern=l.regex))}function A(e){if(!e.key&&!e.label)return null;let l=b.default_values||{},y=e.name||e.key,a=y?l[y]:void 0,g=document.createElement("div");if(g.className="voc-form-group",c&&g.classList.add("mb-3"),e.label&&e.type!=="users"){let t=document.createElement("label");if(t.classList.add("voc-form-label"),c&&t.classList.add("form-label"),e.key?e.type==="radio"?t.htmlFor="":t.htmlFor=`voc-form-${e.key}`:t.htmlFor="",t.textContent=e.label,e.required){let n=document.createElement("span");n.className="voc-form-required",n.textContent="*",t.appendChild(n)}g.appendChild(t)}let E=null;switch(e.type){case"checkbox":{let t=document.createElement("div");if(t.className="voc-form-checkbox-group "+(e.direction||"vertical"),e.width&&(t.style.width=e.width),e.options){if(e.options.forEach((n,i)=>{let r=document.createElement("label");r.classList.add("voc-form-checkbox-label"),c&&r.classList.add("form-check"),r.style.display=e.direction==="horizontal"?"inline-block":"block",e.width&&(r.style.width=e.width);let o=document.createElement("input");o.type="checkbox",o.classList.add("voc-form-checkbox"),c&&o.classList.add("form-check-input"),o.name=`${e.name||e.key||""}[]`,o.value=n.value,e.key&&(o.id=`voc-form-${e.key}-${i}`),Array.isArray(a)?a.includes(n.value)&&(o.checked=!0):a!==void 0?a===n.value&&(o.checked=!0):e.default===n.value&&(o.checked=!0),r.appendChild(o),r.appendChild(document.createTextNode(n.label)),t.appendChild(r)}),e.required){let n=t.querySelectorAll('input[type="checkbox"]'),i=()=>{let r=Array.from(n).some(o=>o.checked);return n.forEach(o=>{r?o.setCustomValidity(""):o.setCustomValidity("At least one option must be selected.")}),r};n.forEach(r=>{r.addEventListener("change",i)}),t._validateCheckboxGroup=i,i()}}else{let n=document.createElement("label");n.classList.add("voc-form-checkbox-label"),c&&n.classList.add("form-check"),e.width&&(n.style.width=e.width);let i=document.createElement("input");i.type="checkbox",i.classList.add("voc-form-checkbox"),(e.key||e.name)&&(i.name=e.name||e.key,e.key&&(i.id=`voc-form-${e.key}`)),c&&i.classList.add("form-check-input"),e.required&&(i.required=!0),a!==void 0?i.checked=!!a:e.default&&(i.checked=!!e.default),n.appendChild(i),n.appendChild(document.createTextNode(e.label||"")),t.appendChild(n)}E=t;break}case"textarea":{let t=document.createElement("textarea");t.classList.add("voc-form-textarea"),c&&t.classList.add("form-control"),(e.key||e.name)&&(t.name=e.name||e.key,e.key&&(t.id=`voc-form-${e.key}`)),e.placeholder&&(t.placeholder=e.placeholder),a!=null?t.value=String(a):e.default!==void 0&&e.default!==null&&(t.value=String(e.default));let n=e.default||a||"";if(n){let i=(n.match(/\n/g)||[]).length,r=80,o=n.split(`
|
|
2
|
+
`).reduce((R,H)=>Math.max(R,H.length),0),x=Math.ceil(o/r)||1,S=Math.max(2,i+x);t.rows=S,t.style.resize="vertical"}e.width&&(t.style.width=e.width),e.required&&(t.required=!0),f(t,e.validation),E=t;break}case"select":{let t=document.createElement("select");if(t.classList.add("voc-form-select"),c&&t.classList.add("form-select"),c&&t.classList.add("form-control"),(e.key||e.name)&&(t.name=e.name||e.key,e.key&&(t.id=`voc-form-${e.key}`)),e.placeholder){let n=document.createElement("option");n.value="",n.textContent=e.placeholder,n.disabled=!0,n.selected=!0,t.appendChild(n)}e.required&&(t.required=!0),e.options&&e.options.forEach(n=>{let i=document.createElement("option");i.value=n.value,i.textContent=n.label,Array.isArray(a)?a.includes(n.value)&&(i.selected=!0):a!==void 0?a===n.value&&(i.selected=!0):e.default===n.value&&(i.selected=!0),t.appendChild(i)}),e.width&&(t.style.width=e.width),E=t;break}case"radio":{let t=document.createElement("div");t.className="voc-form-radio-group "+(e.direction||"vertical"),e.width&&(t.style.width=e.width),e.options&&e.options.forEach((n,i)=>{let r=document.createElement("label");r.classList.add("voc-form-radio-label"),c&&r.classList.add("form-check"),r.style.display=e.direction==="horizontal"?"inline-block":"block",e.width&&(r.style.width=e.width);let o=document.createElement("input");o.type="radio",o.classList.add("voc-form-radio"),c&&o.classList.add("form-check-input"),o.name=e.name||e.key||"",o.value=n.value,e.key&&(o.id=`voc-form-${e.key}-${i}`),Array.isArray(a)?a.includes(n.value)&&(o.checked=!0):a!==void 0?a===n.value&&(o.checked=!0):e.default===n.value&&(o.checked=!0),r.appendChild(o),r.appendChild(document.createTextNode(n.label)),t.appendChild(r)}),E=t;break}case"file":{let t=document.createElement("div");t.className="voc-form-file-wrapper",e.width&&(t.style.width=e.width);let n=document.createElement("input");n.type="file",n.classList.add("voc-form-file"),c&&n.classList.add("form-control"),(e.key||e.name)&&(n.name=e.name||e.key,e.key&&(n.id=`voc-form-${e.key}`)),e.width&&(n.style.width=e.width),e.required&&(n.required=!0),e.accept&&(n.accept=e.accept),e.multiple&&(n.multiple=!0),t.appendChild(n),E=t;break}case"avatar":{E=W(e,p||{},a);break}case"table":{E=G(e,p||{},a);break}case"users":{E=V(e,p||{},a);break}case"audio_select":{E=z(e,p||{},a);break}default:{let t=document.createElement("input");t.type=e.type||"text",t.classList.add("voc-form-input"),c&&t.classList.add("form-control"),(e.key||e.name)&&(t.name=e.name||e.key,e.key&&(t.id=`voc-form-${e.key}`)),e.placeholder&&(t.placeholder=e.placeholder),a!=null?t.value=String(a):e.default!==void 0&&e.default!==null&&(t.value=String(e.default)),e.width&&(t.style.width=e.width),e.required&&(t.required=!0),f(t,e.validation),E=t;break}}if(E&&g.appendChild(E),e.hint_text){let t=document.createElement("small");t.className="voc-form-hint",t.textContent=e.hint_text,g.appendChild(t)}return g}b.fields.forEach(e=>{if(e.type==="group"&&"items"in e){let l=e;if(c){let y=document.createElement("div");y.className="card voc-form-group-card mb-3";let a=l.label||l.header?.title,g=l.description||l.header?.description;if(a||g){let t=document.createElement("div");if(t.className="card-header voc-form-group-head",a){let n=document.createElement("h5");n.className="mb-0 voc-form-group-label",n.textContent=a,t.appendChild(n)}if(g){let n=document.createElement("p");n.className="mb-0 voc-form-group-description",n.textContent=g,t.appendChild(n)}y.appendChild(t)}let E=document.createElement("div");E.className="card-body voc-form-group-body",l.items.forEach(t=>{if(t.type==="row"&&"items"in t){let n=t,i=document.createElement("div");if(i.className="voc-form-group voc-form-row mb-3",n.label){let o=document.createElement("h6");o.className="voc-form-row-label",o.textContent=n.label,i.appendChild(o)}let r=document.createElement("div");r.className="voc-form-row-items "+(n.direction||"horizontal"),n.items.forEach(o=>{let x=A(o);x&&r.appendChild(x)}),i.appendChild(r),E.appendChild(i)}else{let n=A(t);n&&E.appendChild(n)}}),y.appendChild(E),h.appendChild(y)}else{let y=document.createElement("div");y.className="voc-form-group voc-form-group-wrapper",c&&y.classList.add("mb-3");let a=l.label||l.header?.title,g=l.description||l.header?.description;if(a||g){let E=document.createElement("div");if(E.className="voc-form-group-head",a){let t=document.createElement("h3");t.className="voc-form-group-label",t.textContent=a,E.appendChild(t)}if(g){let t=document.createElement("p");t.className="voc-form-group-description",t.textContent=g,E.appendChild(t)}y.appendChild(E)}l.items.forEach(E=>{if(E.type==="row"&&"items"in E){let t=E,n=document.createElement("div");if(n.className="voc-form-group voc-form-row",c&&n.classList.add("mb-3"),t.label){let r=document.createElement("h4");r.className="voc-form-row-label",r.textContent=t.label,n.appendChild(r)}let i=document.createElement("div");i.className="voc-form-row-items "+(t.direction||"horizontal"),t.items.forEach(r=>{let o=A(r);o&&i.appendChild(o)}),n.appendChild(i),y.appendChild(n)}else{let t=A(E);t&&y.appendChild(t)}}),h.appendChild(y)}return}if(e.type==="row"&&"items"in e){let l=document.createElement("div");if(l.className="voc-form-group voc-form-row",c&&l.classList.add("mb-3"),e.label){let a=document.createElement("h3");a.className="voc-form-row-label",a.textContent=e.label,l.appendChild(a)}if(e.description){let a=document.createElement("p");a.className="voc-form-row-description",a.textContent=e.description,l.appendChild(a)}let y=document.createElement("div");y.className="voc-form-row-items "+(e.direction||"horizontal"),l.appendChild(y),e.items.forEach(a=>{let g=A(a);g&&y.appendChild(g)}),h.appendChild(l)}else{let l=A(e);l&&h.appendChild(l)}});let k=document.createElement("button");return k.type="submit",k.className="voc-form-submit",k.textContent="Submit",c&&k.classList.add("btn","btn-primary"),h.appendChild(k),h}let m=d();v[0].appendChild(m);let L=b?.submit_config??p?.submit_config??null;return L&&m.addEventListener("submit",c=>{c.preventDefault();let h=Array.from(m.querySelectorAll(".voc-form-checkbox-group, .voc-form-users")),C=[];if(h.forEach(k=>{k&&typeof k._validateCheckboxGroup=="function"&&(k._validateCheckboxGroup()||k.querySelector('input[type="checkbox"]')&&C.push("Please select at least one option"))}),!m.checkValidity()){m.reportValidity(),p?.onSubmitResult&&p.onSubmitResult(null,new Error("Form validation failed"));return}let f=Array.from(m.querySelectorAll(" .voc-form-table-wrapper, .voc-form-table-wrapper")),A=[];if(f.forEach(k=>{if(k&&typeof k.validate=="function"){let e=k.validate();e&&e.length&&A.push(...e)}}),A.length){p?.onSubmitResult&&p.onSubmitResult(null,new Error(A.join("; ")));let k=f[0];k&&k.scrollIntoView({behavior:"smooth",block:"center"});return}if(p?.onSubmit){let k=I(m);p.onSubmit(k)}U(m,L,(k,e)=>{p?.onSubmitResult&&p.onSubmitResult(k,e)})}),{element:m,validate:()=>{let c=[];return m.querySelectorAll(":invalid").forEach(C=>{let f=C.validationMessage;c.push({element:C,message:f})}),c},getValues:()=>I(m),onSubmit:c=>{m.addEventListener("submit",h=>{h.preventDefault();let C=I(m);c(C,h)})}}}var j={renderForm:J};var oe=j,ie={FormsLib:j};return ae(ce);})();
|
package/dist/main.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";var P=Object.defineProperty;var Q=Object.getOwnPropertyDescriptor;var X=Object.getOwnPropertyNames;var Z=Object.prototype.hasOwnProperty;var ee=(s,b)=>{for(var h in b)P(s,h,{get:b[h],enumerable:!0})},te=(s,b,h,y)=>{if(b&&typeof b=="object"||typeof b=="function")for(let d of X(b))!Z.call(s,d)&&d!==h&&P(s,d,{get:()=>b[d],enumerable:!(y=Q(b,d))||y.enumerable});return s};var ae=s=>te(P({},"__esModule",{value:!0}),s);var ce={};ee(ce,{FormsLib:()=>oe,default:()=>ie});module.exports=ae(ce);function W(s,b,h){let y=b?.style==="bootstrap",d=document.createElement("div");d.className="voc-form-avatar-wrapper",y&&d.classList.add("d-flex","align-items-center","gap-3");let m=document.createElement("img");m.className="voc-form-avatar-preview",m.alt=s.label||"avatar",y&&(m.classList.add("img-thumbnail","rounded-circle"),m.style.width=m.style.height="64px",m.style.objectFit="cover");let L=h!=null?String(h):s.default!==void 0&&s.default!==null?String(s.default):"";L?m.src=L:(m.src="",m.style.display="none");let c=document.createElement("input");c.type="file",c.accept=s.accept||"image/*",c.className="voc-form-avatar-input",y&&c.classList.add("form-control"),(s.key||s.name)&&(c.name=s.name||s.key,s.key&&(c.id=`voc-form-${s.key}`));let f=document.createElement("input");if(f.type="hidden",(s.key||s.name)&&(f.name=(s.name||s.key)+"_url"),f.value=L||"",c.addEventListener("change",g=>{let u=g.target;if(u.files&&u.files.length>0){let x=u.files[0],N=new FileReader;N.onload=()=>{m.src=String(N.result),m.style.display="",f.value=""},N.readAsDataURL(x)}}),y){let g=document.createElement("div");g.style.flex="1",g.appendChild(c),g.appendChild(f),d.appendChild(m),d.appendChild(g)}else d.appendChild(m),d.appendChild(c),d.appendChild(f);return d}function z(s,b,h){let y=b?.style==="bootstrap",d=document.createElement("div");if(d.className="voc-form-audio-select",!s.options||s.options.length===0)return d;let m=s.name||s.key||`audio_select_${Math.random().toString(36).substr(2,6)}`,L;return Array.isArray(h)?L=h[0]:h!==void 0?L=h:s.default!==void 0&&(L=s.default),s.options.forEach((c,f)=>{let g=document.createElement("div");g.className="voc-form-audio-item",y&&g.classList.add("form-check");let u=document.createElement("input");u.type="radio",u.name=m,u.value=c.value,u.className="voc-form-audio-radio",s.key&&(u.id=`voc-form-${s.key}-${f}`),s.required&&f===0&&(u.required=!0),u.style.position="absolute",u.style.width="1px",u.style.height="1px",u.style.margin="0",u.style.padding="0",u.style.clip="rect(0 0 0 0)",u.style.clipPath="inset(50%)",u.style.overflow="hidden",u.style.border="0",L!==void 0&&(Array.isArray(L)?u.checked=L.includes(c.value):u.checked=String(L)===String(c.value));let x=()=>{u.checked?g.classList.add("selected"):g.classList.remove("selected")};u.addEventListener("change",()=>{d.querySelectorAll(".voc-form-audio-item").forEach(n=>n.classList.remove("selected")),x()}),u.checked&&g.classList.add("selected");let N=document.createElement("label");N.className="voc-form-audio-label",y&&N.classList.add("form-check-label"),N.htmlFor=u.id||"",N.textContent=c.label||c.value,N.tabIndex=0;let e=document.createElement("div");e.className="voc-form-audio-control";let l=null;if(c.audio_link){let t=document.createElement("button");t.type="button",t.className="voc-form-audio-play",y&&t.classList.add("btn","btn-sm","btn-outline-secondary"),t.setAttribute("aria-label",`Play ${c.label||c.value}`);let n="http://www.w3.org/2000/svg",i=document.createElementNS(n,"svg");i.setAttribute("viewBox","0 0 24 24"),i.setAttribute("width","16"),i.setAttribute("height","16"),i.setAttribute("aria-hidden","true");let r=document.createElementNS(n,"path");r.setAttribute("d","M8 5v14l11-7z"),r.setAttribute("fill","currentColor"),i.appendChild(r),t.appendChild(i),l=document.createElement("audio"),l.src=c.audio_link,l.preload="none",l.style.display="none";let o=p=>{for(;p.firstChild;)p.removeChild(p.firstChild)},C=()=>{let p="http://www.w3.org/2000/svg",S=document.createElementNS(p,"svg");S.setAttribute("viewBox","0 0 24 24"),S.setAttribute("width","16"),S.setAttribute("height","16"),S.setAttribute("aria-hidden","true");let A=document.createElementNS(p,"path");return A.setAttribute("d","M8 5v14l11-7z"),A.setAttribute("fill","currentColor"),S.appendChild(A),S},F=()=>{let p="http://www.w3.org/2000/svg",S=document.createElementNS(p,"svg");S.setAttribute("viewBox","0 0 24 24"),S.setAttribute("width","16"),S.setAttribute("height","16"),S.setAttribute("aria-hidden","true");let A=document.createElementNS(p,"rect");return A.setAttribute("x","6"),A.setAttribute("y","6"),A.setAttribute("width","12"),A.setAttribute("height","12"),A.setAttribute("fill","currentColor"),S.appendChild(A),S};o(t),t.appendChild(C());let R=p=>{o(t),p?(t.appendChild(F()),t.setAttribute("aria-label",`Stop ${c.label||c.value}`)):(t.appendChild(C()),t.setAttribute("aria-label",`Play ${c.label||c.value}`))};t.addEventListener("click",()=>{try{if(!l)return;let p=d.querySelectorAll("audio");if(!l.paused&&!l.ended){l.pause(),l.currentTime=0;return}p.forEach(A=>{try{A.pause(),A.currentTime=0}catch{}}),d.querySelectorAll(".voc-form-audio-item").forEach(A=>A.classList.remove("is-playing")),l.play()}catch(p){console.warn("audio play failed",p)}}),l.addEventListener("playing",()=>{g.classList.add("is-playing"),R(!0)});let H=()=>{g.classList.remove("is-playing"),R(!1)};l.addEventListener("pause",H),l.addEventListener("ended",H),e.appendChild(t),e.appendChild(l)}let v=document.createElement("div");v.className="voc-form-item-detail",v.style.display="flex",v.style.flexDirection="column",v.style.gap="4px";let a=document.createElement("div");a.className="voc-form-item-top",a.style.display="flex",a.style.alignItems="center",a.style.gap="8px",a.appendChild(u),a.appendChild(N);let E=document.createElement("div");E.className="voc-form-item-description";let k=c.description||c.hint_text||"";k&&(E.textContent=k),v.appendChild(a),v.appendChild(E),e.appendChild(v),g.appendChild(e),a.addEventListener("click",t=>{let n=t.target;n&&n.closest(".voc-form-audio-play")||(u.checked=!0,u.dispatchEvent(new Event("change",{bubbles:!0})))}),g.addEventListener("click",t=>{let n=t.target;n&&n.closest(".voc-form-audio-play")||(u.checked=!0,u.dispatchEvent(new Event("change",{bubbles:!0})))}),d.appendChild(g)}),d}function G(s,b,h){let y=document.createElement("div");y.className="voc-form-table-wrapper";let d=b?.style==="bootstrap",m=document.createElement("input");m.type="hidden",m.name=s.name||s.key,s.key&&(m.id=`voc-form-${s.key}`),y.appendChild(m);let L=document.createElement("table");L.className="voc-form-table",d&&L.classList.add("table","table-bordered");let c=document.createElement("thead"),f=document.createElement("tr"),g=document.createElement("th");g.className="voc-form-table-drag-col",g.textContent="",f.appendChild(g),(s.fields||[]).forEach(n=>{let i=document.createElement("th");i.textContent=n.label||n.key,f.appendChild(i)});let u=document.createElement("th");u.textContent="Actions",f.appendChild(u),c.appendChild(f),L.appendChild(c);let x=document.createElement("tbody");L.appendChild(x),y.appendChild(L);let N=document.createElement("button");N.type="button",N.className="voc-form-table-add",d&&N.classList.add("btn","btn-secondary"),N.textContent="+Add";let e=document.createElement("tfoot"),l=document.createElement("tr"),v=document.createElement("td");v.colSpan=(s.fields?s.fields.length:0)+1,v.appendChild(N),l.appendChild(v),e.appendChild(l),L.appendChild(e),y.appendChild(L);let a=[];function E(){m.value=JSON.stringify(a)}function k(n){let i=[];return s.fields.forEach(r=>{let o=n[r.key];if(r.type==="checkbox"){let C=Array.isArray(o)?o:o?[o]:[];r.required&&C.length===0&&i.push(`${r.label||r.key} is required`);return}r.required&&(o==null||String(o).trim()==="")&&i.push(`${r.label||r.key} is required`),r.type==="email"&&o&&(/^\S+@\S+\.\S+$/.test(String(o))||i.push(`${r.label||r.key} must be a valid email`)),r.type==="number"&&o&&isNaN(Number(o))&&i.push(`${r.label||r.key} must be a number`),r.validation&&r.validation.regex&&o&&(new RegExp(r.validation.regex).test(String(o))||i.push(`${r.label||r.key} invalid format`))}),i}function t(){x.innerHTML="";let n=(i,r)=>{r.draggable=!0,r.addEventListener("mousedown",()=>{r.style.cursor="grabbing"}),r.addEventListener("mouseup",()=>{r.style.cursor="grab"}),r.addEventListener("dragstart",o=>{let C=Number(i.dataset.rowIndex);o.dataTransfer.setData("text/plain",String(C)),i.classList.add("dragging");try{o.dataTransfer?.setDragImage(r,10,10)}catch{}}),r.addEventListener("dragend",()=>{i.classList.remove("dragging"),r.style.cursor="grab"}),i.addEventListener("dragover",o=>{o.preventDefault();let C=o.currentTarget,F=C.getBoundingClientRect(),R=F.top+F.height/2,H=(o.clientY||o.y)>R;C.classList.remove("drag-over-top","drag-over-bottom"),H?(C.classList.add("drag-over-bottom"),C.dataset.dropPosition="after"):(C.classList.add("drag-over-top"),C.dataset.dropPosition="before")}),i.addEventListener("dragleave",o=>{let C=o.currentTarget;C.classList.remove("drag-over-top","drag-over-bottom"),delete C.dataset.dropPosition}),i.addEventListener("drop",o=>{o.preventDefault();let C=o.dataTransfer.getData("text/plain"),F=Number(o.currentTarget.dataset.rowIndex),R=Number(C),H=o.currentTarget.dataset.dropPosition||"before";if(isNaN(R)||isNaN(F))return;let[p]=a.splice(R,1),S=F;R<F&&(S=F-1);let A=H==="after"?S+1:S;a.splice(A,0,p),o.currentTarget.classList.remove("drag-over-top","drag-over-bottom"),delete o.currentTarget.dataset.dropPosition,t(),E()})};a.forEach((i,r)=>{let o=document.createElement("tr");o.dataset.rowIndex=String(r),o.classList.add("voc-form-table-row");let C=document.createElement("td");C.className="voc-form-table-drag-handle";let F=document.createElement("span");F.className="voc-form-drag-handle-icon",F.textContent="\u2630",F.style.cursor="grab",C.appendChild(F),o.appendChild(C),n(o,F),s.fields.forEach(p=>{let S=document.createElement("td"),A,_=(p.type||"text").toLowerCase();if(_==="select"){let w=document.createElement("select");if(w.className="voc-form-table-cell",d&&w.classList.add("form-control"),p.placeholder){let T=document.createElement("option");T.value="",T.textContent=p.placeholder,T.disabled=!0,(i[p.key]===void 0||i[p.key]===null||i[p.key]==="")&&(T.selected=!0),w.appendChild(T)}(p.options||[]).forEach(T=>{let D=document.createElement("option");D.value=T.value,D.textContent=T.label,w.appendChild(D)}),w.value=i[p.key]!==void 0&&i[p.key]!==null?String(i[p.key]):"",p.required&&(w.required=!0),w.addEventListener("change",T=>{a[r][p.key]=T.target.value,E()}),A=w}else if(_==="checkbox"){let w=document.createElement("div");w.className="voc-form-table-checkboxes",d&&w.classList.add("form-check");let B=p.options||[];Array.isArray(a[r][p.key])||(a[r][p.key]=a[r][p.key]?[a[r][p.key]]:[]),B.forEach(T=>{let D=`voc-form-${s.key}-${p.key}-${r}-${T.value}`,$=document.createElement("div");$.className="voc-form-table-checkbox-item",d&&$.classList.add("form-check");let M=document.createElement("input");M.type="checkbox",M.className="voc-form-table-cell",d&&M.classList.add("form-check-input"),M.id=D,M.value=T.value,M.checked=Array.isArray(a[r][p.key])&&a[r][p.key].includes(T.value),M.addEventListener("change",O=>{let K=O.target.checked;Array.isArray(a[r][p.key])||(a[r][p.key]=[]),K?a[r][p.key].includes(T.value)||a[r][p.key].push(T.value):a[r][p.key]=a[r][p.key].filter(Y=>Y!==T.value),E()});let q=document.createElement("label");q.htmlFor=D,q.className="voc-form-table-checkbox-label",d&&q.classList.add("form-check-label"),q.textContent=T.label,$.appendChild(M),$.appendChild(q),w.appendChild($)}),A=w}else if(_==="radio"){let w=document.createElement("div");w.className="voc-form-table-radios",d&&w.classList.add("form-check");let B=p.options||[];a[r][p.key]===void 0&&(a[r][p.key]=""),B.forEach(T=>{let D=`voc-form-${s.key}-${p.key}-${r}-${T.value}`,$=document.createElement("div");$.className="voc-form-table-radio-item",d&&$.classList.add("form-check");let M=document.createElement("input");M.type="radio",M.className="voc-form-table-cell",d&&M.classList.add("form-check-input"),M.id=D,M.name=`voc-form-${s.key}-${p.key}-${r}`,M.value=T.value,M.checked=a[r][p.key]===T.value,M.addEventListener("change",O=>{O.target.checked&&(a[r][p.key]=O.target.value,E())});let q=document.createElement("label");q.htmlFor=D,q.className="voc-form-table-radio-label",d&&q.classList.add("form-check-label"),q.textContent=T.label,$.appendChild(M),$.appendChild(q),w.appendChild($)}),A=w}else{let w=document.createElement("input");_==="number"?w.type="number":_==="email"?w.type="email":_==="tel"?w.type="tel":_==="url"?w.type="url":_==="date"?w.type="date":w.type="text",w.value=i[p.key]!==void 0&&i[p.key]!==null?String(i[p.key]):"",p.placeholder&&(w.placeholder=p.placeholder),p.required&&(w.required=!0),w.className="voc-form-table-cell",d&&w.classList.add("form-control"),w.addEventListener("input",B=>{a[r][p.key]=B.target.value,E()}),A=w}S.appendChild(A),o.appendChild(S)});let R=document.createElement("td"),H=document.createElement("button");H.type="button",H.className="voc-form-table-remove",d&&H.classList.add("btn","btn-danger"),H.textContent="Remove",H.addEventListener("click",()=>{a.splice(r,1),t(),E()}),R.appendChild(H),o.appendChild(R),x.appendChild(o)})}return N.addEventListener("click",()=>{if(s.validation?.max_rows!==void 0&&a.length>=s.validation.max_rows)return;let n={};s.fields.forEach(i=>n[i.key]=""),a.push(n),t(),E()}),Array.isArray(h)&&h.length?a=h.map(n=>({...n})):s.default&&Array.isArray(s.default)&&(a=s.default.map(n=>({...n}))),t(),E(),y.validate=function(){let n=[];return a.forEach((i,r)=>{let o=k(i);o.length&&n.push(`Row ${r+1}: ${o.join("; ")}`)}),s.validation?.min_rows!==void 0&&a.length<s.validation.min_rows&&n.push(`At least ${s.validation.min_rows} rows required`),s.validation?.max_rows!==void 0&&a.length>s.validation.max_rows&&n.push(`No more than ${s.validation.max_rows} rows allowed`),s.validation?.unique_fields&&s.validation.unique_fields.length&&s.validation.unique_fields.forEach(i=>{let r=new Set;a.forEach((o,C)=>{let F=o[i];F!=null&&(r.has(F)&&n.push(`Field ${i} must be unique (duplicate at row ${C+1})`),r.add(F))})}),n},y}async function ne(s){let h=new TextEncoder().encode(s),y=await crypto.subtle.digest("SHA-256",h);return Array.from(new Uint8Array(y)).map(m=>m.toString(16).padStart(2,"0")).join("")}async function re(s){let b=String(s||"").trim().toLowerCase();return b?`https://gravatar.com/avatar/${await ne(b)}?d=mp`:""}function U(s,b,h){let y=b?.style==="bootstrap",d=document.createElement("div");d.className="voc-form-users";let m=document.createElement("div");if(m.className="voc-form-users-header",y&&m.classList.add("mb-2"),s.label){let e=document.createElement("div");if(e.className="voc-form-users-label",y&&e.classList.add("form-label"),e.textContent=s.label,s.required){let l=document.createElement("span");l.className="voc-form-required",l.textContent="*",e.appendChild(l)}m.appendChild(e)}if(s.description){let e=document.createElement("div");e.className="voc-form-users-description",y&&e.classList.add("form-text"),e.textContent=s.description,m.appendChild(e)}d.appendChild(m);let L=document.createElement("div");L.className="voc-form-users-search-wrapper";let c=document.createElement("input");if(c.type="search",c.placeholder="Search users...",c.className="voc-form-users-search",y&&c.classList.add("form-control","mb-2"),L.appendChild(c),d.appendChild(L),!s.options||s.options.length===0)return d;let f=document.createElement("div");f.className="voc-form-users-list",y&&f.classList.add("list-group");let g=s.name||s.key||`users_${Math.random().toString(36).substr(2,6)}`,u=[];Array.isArray(h)?u=h:h!=null?u=[h]:Array.isArray(s.default)&&(u=s.default),s.options.forEach((e,l)=>{let v=document.createElement("div");v.className="voc-form-user-item",v.dataset.label=String(e.label||"").toLowerCase(),v.dataset.email=String(e.email||"").toLowerCase(),v.dataset.value=String(e.value||"").toLowerCase(),y&&v.classList.add("d-flex","align-items-center","gap-2");let a=document.createElement("input");a.type="checkbox",a.name=`${g}[]`,a.value=e.value,a.className="voc-form-user-checkbox",s.key&&(a.id=`voc-form-${s.key}-${l}`),s.required&&l===0&&(a.required=!0),a.style.position="absolute",a.style.width="1px",a.style.height="1px",a.style.margin="0",a.style.padding="0",a.style.clip="rect(0 0 0 0)",a.style.clipPath="inset(50%)",a.style.overflow="hidden",a.style.border="0",u&&Array.isArray(u)&&(a.checked=u.includes(e.value));let E=document.createElement("img");E.className="voc-form-user-avatar",E.alt=e.label||String(e.value||"user"),E.style.width=E.style.height="40px",E.style.objectFit="cover",E.style.borderRadius="50%",E.src="",e.email&&re(e.email).then(i=>{i&&(E.src=i)}).catch(()=>{});let k=document.createElement("div");k.className="voc-form-user-info",k.style.display="flex",k.style.flexDirection="column",k.style.gap="2px";let t=document.createElement("div");t.className="voc-form-user-label",t.textContent=e.label||String(e.value);let n=document.createElement("small");n.className="voc-form-user-email",n.textContent=e.email||"",k.appendChild(t),k.appendChild(n),v.addEventListener("click",i=>{let r=i.target;r&&(r.closest("input")||r.closest("a")||r.closest("button"))||(a.checked=!a.checked,a.dispatchEvent(new Event("change",{bubbles:!0})))}),a.addEventListener("change",()=>{a.checked?v.classList.add("selected"):v.classList.remove("selected")}),a.checked&&v.classList.add("selected"),v.appendChild(a),v.appendChild(E),v.appendChild(k),f.appendChild(v)}),d.appendChild(f);let x=Array.from(f.querySelectorAll(".voc-form-user-item")),N=()=>{let e=String(c.value||"").trim().toLowerCase();if(!e){x.forEach(l=>l.style.setProperty("display","flex","important"));return}x.forEach(l=>{let v=l.dataset.label||"",a=l.dataset.email||"",E=l.dataset.value||"",k=v.includes(e)||a.includes(e)||E.includes(e);l.style.setProperty("display",k?"flex":"none","important")})};return c.addEventListener("input",N),d}function I(s,b=!0){let h=new FormData(s);if(b)return se(h);let y={};return h.forEach((d,m)=>{let L=(d instanceof File,d);Object.prototype.hasOwnProperty.call(y,m)?Array.isArray(y[m])?y[m].push(L):y[m]=[y[m],L]:y[m]=L}),y}function se(s){let b=new FormData;for(let[h,y]of s.entries()){if(y instanceof File){b.append(h,y);continue}let d;try{d=JSON.parse(y)}catch{d=null}Array.isArray(d)?d.length===0?b.append(h,"[]"):d.every(m=>typeof m=="object"&&m!==null)?d.forEach((m,L)=>{for(let[c,f]of Object.entries(m))b.append(`${h}[${L}][${c}]`,f)}):b.append(h,y):b.append(h,y)}return b}async function J(s,b,h){let y=b.url,d={"Content-Type":"application/json"};b?.api_token&&(d.Authorization=`Bearer ${b.api_token}`);let m=I(s);if(b?.additional_data)for(let[f,g]of Object.entries(b.additional_data))m.append(f,g);let L,c=m instanceof FormData;L={method:"POST",headers:{Authorization:`Bearer ${b.api_token}`,...c?{}:{"Content-Type":"application/json"},Accept:"application/json"},body:c?m:JSON.stringify(Object.fromEntries(m.entries()))};try{fetch(y,L).then(async f=>{let g=f.headers.get("content-type");if(!f.ok)try{let x=(await f.json())?.message;throw new Error(x??"Their was an error submitting the form. Check your form and try again.")}catch(u){throw new Error(u.message)}return g&&g.includes("application/json")?f.json():f.text()}).then(f=>{h&&h(f,null)}).catch(f=>{h&&h(null,f)})}catch(f){h&&h(null,f)}}function V(s,b,h){let y=[];if(typeof s=="string"?y=Array.from(document.querySelectorAll(s)):y=[s],y.length===0)return null;function d(){let c=h?.style==="bootstrap",f=document.createElement("form");f.classList.add("voc-form"),c&&f.classList.add("needs-validation"),f.id=b.id;let g=document.createElement("h2");g.className="voc-form-title",c&&g.classList.add("mb-3"),g.textContent=b.form_name,f.appendChild(g);function u(e,l){l&&(l.min_length!==void 0&&(e.minLength=l.min_length),l.max_length!==void 0&&(e.maxLength=l.max_length),l.regex&&(e instanceof HTMLInputElement?e.pattern=l.regex:e.dataset.pattern=l.regex))}function x(e){if(!e.key&&!e.label)return null;let l=b.default_values||{},v=e.name||e.key,a=v?l[v]:void 0,E=document.createElement("div");if(E.className="voc-form-group",c&&E.classList.add("mb-3"),e.label&&e.type!=="users"){let t=document.createElement("label");if(t.classList.add("voc-form-label"),c&&t.classList.add("form-label"),e.key?e.type==="radio"?t.htmlFor="":t.htmlFor=`voc-form-${e.key}`:t.htmlFor="",t.textContent=e.label,e.required){let n=document.createElement("span");n.className="voc-form-required",n.textContent="*",t.appendChild(n)}E.appendChild(t)}let k=null;switch(e.type){case"checkbox":{let t=document.createElement("div");if(t.className="voc-form-checkbox-group "+(e.direction||"vertical"),e.width&&(t.style.width=e.width),e.options)e.options.forEach((n,i)=>{let r=document.createElement("label");r.classList.add("voc-form-checkbox-label"),c&&r.classList.add("form-check"),r.style.display=e.direction==="horizontal"?"inline-block":"block",e.width&&(r.style.width=e.width);let o=document.createElement("input");o.type="checkbox",o.classList.add("voc-form-checkbox"),c&&o.classList.add("form-check-input"),o.name=e.name||e.key||"",o.value=n.value,e.key&&(o.id=`voc-form-${e.key}-${i}`),e.required&&(o.required=!0),Array.isArray(a)?a.includes(n.value)&&(o.checked=!0):a!==void 0?a===n.value&&(o.checked=!0):e.default===n.value&&(o.checked=!0),r.appendChild(o),r.appendChild(document.createTextNode(n.label)),t.appendChild(r)});else{let n=document.createElement("label");n.classList.add("voc-form-checkbox-label"),c&&n.classList.add("form-check"),e.width&&(n.style.width=e.width);let i=document.createElement("input");i.type="checkbox",i.classList.add("voc-form-checkbox"),(e.key||e.name)&&(i.name=e.name||e.key,e.key&&(i.id=`voc-form-${e.key}`)),c&&i.classList.add("form-check-input"),e.required&&(i.required=!0),a!==void 0?i.checked=!!a:e.default&&(i.checked=!!e.default),n.appendChild(i),n.appendChild(document.createTextNode(e.label||"")),t.appendChild(n)}k=t;break}case"textarea":{let t=document.createElement("textarea");t.classList.add("voc-form-textarea"),c&&t.classList.add("form-control"),(e.key||e.name)&&(t.name=e.name||e.key,e.key&&(t.id=`voc-form-${e.key}`)),e.placeholder&&(t.placeholder=e.placeholder),a!=null?t.value=String(a):e.default!==void 0&&e.default!==null&&(t.value=String(e.default));let n=e.default||a||"";if(n){let i=(n.match(/\n/g)||[]).length,r=80,o=n.split(`
|
|
2
|
-
`).reduce((R,H)=>Math.max(R,H.length),0),
|
|
1
|
+
"use strict";var P=Object.defineProperty;var Q=Object.getOwnPropertyDescriptor;var X=Object.getOwnPropertyNames;var Z=Object.prototype.hasOwnProperty;var ee=(s,b)=>{for(var p in b)P(s,p,{get:b[p],enumerable:!0})},te=(s,b,p,v)=>{if(b&&typeof b=="object"||typeof b=="function")for(let d of X(b))!Z.call(s,d)&&d!==p&&P(s,d,{get:()=>b[d],enumerable:!(v=Q(b,d))||v.enumerable});return s};var ae=s=>te(P({},"__esModule",{value:!0}),s);var ce={};ee(ce,{FormsLib:()=>oe,default:()=>ie});module.exports=ae(ce);function W(s,b,p){let v=b?.style==="bootstrap",d=document.createElement("div");d.className="voc-form-avatar-wrapper",v&&d.classList.add("d-flex","align-items-center","gap-3");let m=document.createElement("img");m.className="voc-form-avatar-preview",m.alt=s.label||"avatar",v&&(m.classList.add("img-thumbnail","rounded-circle"),m.style.width=m.style.height="64px",m.style.objectFit="cover");let L=p!=null?String(p):s.default!==void 0&&s.default!==null?String(s.default):"";L?m.src=L:(m.src="",m.style.display="none");let c=document.createElement("input");c.type="file",c.accept=s.accept||"image/*",c.className="voc-form-avatar-input",v&&c.classList.add("form-control"),(s.key||s.name)&&(c.name=s.name||s.key,s.key&&(c.id=`voc-form-${s.key}`));let h=document.createElement("input");if(h.type="hidden",(s.key||s.name)&&(h.name=(s.name||s.key)+"_url"),h.value=L||"",c.addEventListener("change",C=>{let f=C.target;if(f.files&&f.files.length>0){let A=f.files[0],k=new FileReader;k.onload=()=>{m.src=String(k.result),m.style.display="",h.value=""},k.readAsDataURL(A)}}),v){let C=document.createElement("div");C.style.flex="1",C.appendChild(c),C.appendChild(h),d.appendChild(m),d.appendChild(C)}else d.appendChild(m),d.appendChild(c),d.appendChild(h);return d}function z(s,b,p){let v=b?.style==="bootstrap",d=document.createElement("div");if(d.className="voc-form-audio-select",!s.options||s.options.length===0)return d;let m=s.name||s.key||`audio_select_${Math.random().toString(36).substr(2,6)}`,L;return Array.isArray(p)?L=p[0]:p!==void 0?L=p:s.default!==void 0&&(L=s.default),s.options.forEach((c,h)=>{let C=document.createElement("div");C.className="voc-form-audio-item",v&&C.classList.add("form-check");let f=document.createElement("input");f.type="radio",f.name=m,f.value=c.value,f.className="voc-form-audio-radio",s.key&&(f.id=`voc-form-${s.key}-${h}`),s.required&&h===0&&(f.required=!0),f.style.position="absolute",f.style.width="1px",f.style.height="1px",f.style.margin="0",f.style.padding="0",f.style.clip="rect(0 0 0 0)",f.style.clipPath="inset(50%)",f.style.overflow="hidden",f.style.border="0",L!==void 0&&(Array.isArray(L)?f.checked=L.includes(c.value):f.checked=String(L)===String(c.value));let A=()=>{f.checked?C.classList.add("selected"):C.classList.remove("selected")};f.addEventListener("change",()=>{d.querySelectorAll(".voc-form-audio-item").forEach(n=>n.classList.remove("selected")),A()}),f.checked&&C.classList.add("selected");let k=document.createElement("label");k.className="voc-form-audio-label",v&&k.classList.add("form-check-label"),k.htmlFor=f.id||"",k.textContent=c.label||c.value,k.tabIndex=0;let e=document.createElement("div");e.className="voc-form-audio-control";let l=null;if(c.audio_link){let t=document.createElement("button");t.type="button",t.className="voc-form-audio-play",v&&t.classList.add("btn","btn-sm","btn-outline-secondary"),t.setAttribute("aria-label",`Play ${c.label||c.value}`);let n="http://www.w3.org/2000/svg",i=document.createElementNS(n,"svg");i.setAttribute("viewBox","0 0 24 24"),i.setAttribute("width","16"),i.setAttribute("height","16"),i.setAttribute("aria-hidden","true");let r=document.createElementNS(n,"path");r.setAttribute("d","M8 5v14l11-7z"),r.setAttribute("fill","currentColor"),i.appendChild(r),t.appendChild(i),l=document.createElement("audio"),l.src=c.audio_link,l.preload="none",l.style.display="none";let o=u=>{for(;u.firstChild;)u.removeChild(u.firstChild)},x=()=>{let u="http://www.w3.org/2000/svg",F=document.createElementNS(u,"svg");F.setAttribute("viewBox","0 0 24 24"),F.setAttribute("width","16"),F.setAttribute("height","16"),F.setAttribute("aria-hidden","true");let N=document.createElementNS(u,"path");return N.setAttribute("d","M8 5v14l11-7z"),N.setAttribute("fill","currentColor"),F.appendChild(N),F},S=()=>{let u="http://www.w3.org/2000/svg",F=document.createElementNS(u,"svg");F.setAttribute("viewBox","0 0 24 24"),F.setAttribute("width","16"),F.setAttribute("height","16"),F.setAttribute("aria-hidden","true");let N=document.createElementNS(u,"rect");return N.setAttribute("x","6"),N.setAttribute("y","6"),N.setAttribute("width","12"),N.setAttribute("height","12"),N.setAttribute("fill","currentColor"),F.appendChild(N),F};o(t),t.appendChild(x());let R=u=>{o(t),u?(t.appendChild(S()),t.setAttribute("aria-label",`Stop ${c.label||c.value}`)):(t.appendChild(x()),t.setAttribute("aria-label",`Play ${c.label||c.value}`))};t.addEventListener("click",()=>{try{if(!l)return;let u=d.querySelectorAll("audio");if(!l.paused&&!l.ended){l.pause(),l.currentTime=0;return}u.forEach(N=>{try{N.pause(),N.currentTime=0}catch{}}),d.querySelectorAll(".voc-form-audio-item").forEach(N=>N.classList.remove("is-playing")),l.play()}catch(u){console.warn("audio play failed",u)}}),l.addEventListener("playing",()=>{C.classList.add("is-playing"),R(!0)});let H=()=>{C.classList.remove("is-playing"),R(!1)};l.addEventListener("pause",H),l.addEventListener("ended",H),e.appendChild(t),e.appendChild(l)}let y=document.createElement("div");y.className="voc-form-item-detail",y.style.display="flex",y.style.flexDirection="column",y.style.gap="4px";let a=document.createElement("div");a.className="voc-form-item-top",a.style.display="flex",a.style.alignItems="center",a.style.gap="8px",a.appendChild(f),a.appendChild(k);let g=document.createElement("div");g.className="voc-form-item-description";let E=c.description||c.hint_text||"";E&&(g.textContent=E),y.appendChild(a),y.appendChild(g),e.appendChild(y),C.appendChild(e),a.addEventListener("click",t=>{let n=t.target;n&&n.closest(".voc-form-audio-play")||(f.checked=!0,f.dispatchEvent(new Event("change",{bubbles:!0})))}),C.addEventListener("click",t=>{let n=t.target;n&&n.closest(".voc-form-audio-play")||(f.checked=!0,f.dispatchEvent(new Event("change",{bubbles:!0})))}),d.appendChild(C)}),d}function G(s,b,p){let v=document.createElement("div");v.className="voc-form-table-wrapper";let d=b?.style==="bootstrap",m=document.createElement("input");m.type="hidden",m.name=s.name||s.key,s.key&&(m.id=`voc-form-${s.key}`),v.appendChild(m);let L=document.createElement("table");L.className="voc-form-table",d&&L.classList.add("table","table-bordered");let c=document.createElement("thead"),h=document.createElement("tr"),C=document.createElement("th");C.className="voc-form-table-drag-col",C.textContent="",h.appendChild(C),(s.fields||[]).forEach(n=>{let i=document.createElement("th");i.textContent=n.label||n.key,h.appendChild(i)});let f=document.createElement("th");f.textContent="Actions",h.appendChild(f),c.appendChild(h),L.appendChild(c);let A=document.createElement("tbody");L.appendChild(A),v.appendChild(L);let k=document.createElement("button");k.type="button",k.className="voc-form-table-add",d&&k.classList.add("btn","btn-secondary"),k.textContent="+Add";let e=document.createElement("tfoot"),l=document.createElement("tr"),y=document.createElement("td");y.colSpan=(s.fields?s.fields.length:0)+1,y.appendChild(k),l.appendChild(y),e.appendChild(l),L.appendChild(e),v.appendChild(L);let a=[];function g(){m.value=JSON.stringify(a)}function E(n){let i=[];return s.fields.forEach(r=>{let o=n[r.key];if(r.type==="checkbox"){let x=Array.isArray(o)?o:o?[o]:[];r.required&&x.length===0&&i.push(`${r.label||r.key} is required`);return}r.required&&(o==null||String(o).trim()==="")&&i.push(`${r.label||r.key} is required`),r.type==="email"&&o&&(/^\S+@\S+\.\S+$/.test(String(o))||i.push(`${r.label||r.key} must be a valid email`)),r.type==="number"&&o&&isNaN(Number(o))&&i.push(`${r.label||r.key} must be a number`),r.validation&&r.validation.regex&&o&&(new RegExp(r.validation.regex).test(String(o))||i.push(`${r.label||r.key} invalid format`))}),i}function t(){A.innerHTML="";let n=(i,r)=>{r.draggable=!0,r.addEventListener("mousedown",()=>{r.style.cursor="grabbing"}),r.addEventListener("mouseup",()=>{r.style.cursor="grab"}),r.addEventListener("dragstart",o=>{let x=Number(i.dataset.rowIndex);o.dataTransfer.setData("text/plain",String(x)),i.classList.add("dragging");try{o.dataTransfer?.setDragImage(r,10,10)}catch{}}),r.addEventListener("dragend",()=>{i.classList.remove("dragging"),r.style.cursor="grab"}),i.addEventListener("dragover",o=>{o.preventDefault();let x=o.currentTarget,S=x.getBoundingClientRect(),R=S.top+S.height/2,H=(o.clientY||o.y)>R;x.classList.remove("drag-over-top","drag-over-bottom"),H?(x.classList.add("drag-over-bottom"),x.dataset.dropPosition="after"):(x.classList.add("drag-over-top"),x.dataset.dropPosition="before")}),i.addEventListener("dragleave",o=>{let x=o.currentTarget;x.classList.remove("drag-over-top","drag-over-bottom"),delete x.dataset.dropPosition}),i.addEventListener("drop",o=>{o.preventDefault();let x=o.dataTransfer.getData("text/plain"),S=Number(o.currentTarget.dataset.rowIndex),R=Number(x),H=o.currentTarget.dataset.dropPosition||"before";if(isNaN(R)||isNaN(S))return;let[u]=a.splice(R,1),F=S;R<S&&(F=S-1);let N=H==="after"?F+1:F;a.splice(N,0,u),o.currentTarget.classList.remove("drag-over-top","drag-over-bottom"),delete o.currentTarget.dataset.dropPosition,t(),g()})};a.forEach((i,r)=>{let o=document.createElement("tr");o.dataset.rowIndex=String(r),o.classList.add("voc-form-table-row");let x=document.createElement("td");x.className="voc-form-table-drag-handle";let S=document.createElement("span");S.className="voc-form-drag-handle-icon",S.textContent="\u2630",S.style.cursor="grab",x.appendChild(S),o.appendChild(x),n(o,S),s.fields.forEach(u=>{let F=document.createElement("td"),N,q=(u.type||"text").toLowerCase();if(q==="select"){let w=document.createElement("select");if(w.className="voc-form-table-cell",d&&w.classList.add("form-control"),u.placeholder){let T=document.createElement("option");T.value="",T.textContent=u.placeholder,T.disabled=!0,(i[u.key]===void 0||i[u.key]===null||i[u.key]==="")&&(T.selected=!0),w.appendChild(T)}(u.options||[]).forEach(T=>{let D=document.createElement("option");D.value=T.value,D.textContent=T.label,w.appendChild(D)}),w.value=i[u.key]!==void 0&&i[u.key]!==null?String(i[u.key]):"",u.required&&(w.required=!0),w.addEventListener("change",T=>{a[r][u.key]=T.target.value,g()}),N=w}else if(q==="checkbox"){let w=document.createElement("div");w.className="voc-form-table-checkboxes",d&&w.classList.add("form-check");let B=u.options||[];Array.isArray(a[r][u.key])||(a[r][u.key]=a[r][u.key]?[a[r][u.key]]:[]),B.forEach(T=>{let D=`voc-form-${s.key}-${u.key}-${r}-${T.value}`,$=document.createElement("div");$.className="voc-form-table-checkbox-item",d&&$.classList.add("form-check");let M=document.createElement("input");M.type="checkbox",M.className="voc-form-table-cell",d&&M.classList.add("form-check-input"),M.id=D,M.value=T.value,M.checked=Array.isArray(a[r][u.key])&&a[r][u.key].includes(T.value),M.addEventListener("change",O=>{let K=O.target.checked;Array.isArray(a[r][u.key])||(a[r][u.key]=[]),K?a[r][u.key].includes(T.value)||a[r][u.key].push(T.value):a[r][u.key]=a[r][u.key].filter(Y=>Y!==T.value),g()});let _=document.createElement("label");_.htmlFor=D,_.className="voc-form-table-checkbox-label",d&&_.classList.add("form-check-label"),_.textContent=T.label,$.appendChild(M),$.appendChild(_),w.appendChild($)}),N=w}else if(q==="radio"){let w=document.createElement("div");w.className="voc-form-table-radios",d&&w.classList.add("form-check");let B=u.options||[];a[r][u.key]===void 0&&(a[r][u.key]=""),B.forEach(T=>{let D=`voc-form-${s.key}-${u.key}-${r}-${T.value}`,$=document.createElement("div");$.className="voc-form-table-radio-item",d&&$.classList.add("form-check");let M=document.createElement("input");M.type="radio",M.className="voc-form-table-cell",d&&M.classList.add("form-check-input"),M.id=D,M.name=`voc-form-${s.key}-${u.key}-${r}`,M.value=T.value,M.checked=a[r][u.key]===T.value,M.addEventListener("change",O=>{O.target.checked&&(a[r][u.key]=O.target.value,g())});let _=document.createElement("label");_.htmlFor=D,_.className="voc-form-table-radio-label",d&&_.classList.add("form-check-label"),_.textContent=T.label,$.appendChild(M),$.appendChild(_),w.appendChild($)}),N=w}else{let w=document.createElement("input");q==="number"?w.type="number":q==="email"?w.type="email":q==="tel"?w.type="tel":q==="url"?w.type="url":q==="date"?w.type="date":w.type="text",w.value=i[u.key]!==void 0&&i[u.key]!==null?String(i[u.key]):"",u.placeholder&&(w.placeholder=u.placeholder),u.required&&(w.required=!0),w.className="voc-form-table-cell",d&&w.classList.add("form-control"),w.addEventListener("input",B=>{a[r][u.key]=B.target.value,g()}),N=w}F.appendChild(N),o.appendChild(F)});let R=document.createElement("td"),H=document.createElement("button");H.type="button",H.className="voc-form-table-remove",d&&H.classList.add("btn","btn-danger"),H.textContent="Remove",H.addEventListener("click",()=>{a.splice(r,1),t(),g()}),R.appendChild(H),o.appendChild(R),A.appendChild(o)})}return k.addEventListener("click",()=>{if(s.validation?.max_rows!==void 0&&a.length>=s.validation.max_rows)return;let n={};s.fields.forEach(i=>n[i.key]=""),a.push(n),t(),g()}),Array.isArray(p)&&p.length?a=p.map(n=>({...n})):s.default&&Array.isArray(s.default)&&(a=s.default.map(n=>({...n}))),t(),g(),v.validate=function(){let n=[];return a.forEach((i,r)=>{let o=E(i);o.length&&n.push(`Row ${r+1}: ${o.join("; ")}`)}),s.validation?.min_rows!==void 0&&a.length<s.validation.min_rows&&n.push(`At least ${s.validation.min_rows} rows required`),s.validation?.max_rows!==void 0&&a.length>s.validation.max_rows&&n.push(`No more than ${s.validation.max_rows} rows allowed`),s.validation?.unique_fields&&s.validation.unique_fields.length&&s.validation.unique_fields.forEach(i=>{let r=new Set;a.forEach((o,x)=>{let S=o[i];S!=null&&(r.has(S)&&n.push(`Field ${i} must be unique (duplicate at row ${x+1})`),r.add(S))})}),n},v}async function ne(s){let p=new TextEncoder().encode(s),v=await crypto.subtle.digest("SHA-256",p);return Array.from(new Uint8Array(v)).map(m=>m.toString(16).padStart(2,"0")).join("")}async function re(s){let b=String(s||"").trim().toLowerCase();return b?`https://gravatar.com/avatar/${await ne(b)}?d=mp`:""}function V(s,b,p){let v=b?.style==="bootstrap",d=document.createElement("div");d.className="voc-form-users";let m=document.createElement("div");if(m.className="voc-form-users-header",v&&m.classList.add("mb-2"),s.label){let e=document.createElement("div");if(e.className="voc-form-users-label",v&&e.classList.add("form-label"),e.textContent=s.label,s.required){let l=document.createElement("span");l.className="voc-form-required",l.textContent="*",e.appendChild(l)}m.appendChild(e)}if(s.description){let e=document.createElement("div");e.className="voc-form-users-description",v&&e.classList.add("form-text"),e.textContent=s.description,m.appendChild(e)}d.appendChild(m);let L=document.createElement("div");L.className="voc-form-users-search-wrapper";let c=document.createElement("input");if(c.type="search",c.placeholder="Search users...",c.className="voc-form-users-search",v&&c.classList.add("form-control","mb-2"),L.appendChild(c),d.appendChild(L),!s.options||s.options.length===0)return d;let h=document.createElement("div");h.className="voc-form-users-list",v&&h.classList.add("list-group");let C=s.name||s.key||`users_${Math.random().toString(36).substr(2,6)}`,f=[];if(Array.isArray(p)?f=p:p!=null?f=[p]:Array.isArray(s.default)&&(f=s.default),s.options.forEach((e,l)=>{let y=document.createElement("div");y.className="voc-form-user-item",y.dataset.label=String(e.label||"").toLowerCase(),y.dataset.email=String(e.email||"").toLowerCase(),y.dataset.value=String(e.value||"").toLowerCase(),v&&y.classList.add("d-flex","align-items-center","gap-2");let a=document.createElement("input");if(a.type="checkbox",a.name=`${C}[]`,a.value=e.value,a.className="voc-form-user-checkbox",s.key&&(a.id=`voc-form-${s.key}-${l}`),a.style.position="absolute",a.style.width="1px",a.style.height="1px",a.style.margin="0",a.style.padding="0",a.style.clip="rect(0 0 0 0)",a.style.clipPath="inset(50%)",a.style.overflow="hidden",a.style.border="0",f&&Array.isArray(f)){let i=f.map(r=>String(r));a.checked=i.includes(String(e.value))}let g=document.createElement("img");g.className="voc-form-user-avatar",g.alt=e.label||String(e.value||"user"),g.style.width=g.style.height="40px",g.style.objectFit="cover",g.style.borderRadius="50%",g.src="",e.email&&re(e.email).then(i=>{i&&(g.src=i)}).catch(()=>{});let E=document.createElement("div");E.className="voc-form-user-info",E.style.display="flex",E.style.flexDirection="column",E.style.gap="2px";let t=document.createElement("div");t.className="voc-form-user-label",t.textContent=e.label||String(e.value);let n=document.createElement("small");n.className="voc-form-user-email",n.textContent=e.email||"",E.appendChild(t),E.appendChild(n),y.addEventListener("click",i=>{let r=i.target;r&&(r.closest("input")||r.closest("a")||r.closest("button"))||(a.checked=!a.checked,a.dispatchEvent(new Event("change",{bubbles:!0})))}),a.addEventListener("change",()=>{a.checked?y.classList.add("selected"):y.classList.remove("selected")}),a.checked&&y.classList.add("selected"),y.appendChild(a),y.appendChild(g),y.appendChild(E),h.appendChild(y)}),d.appendChild(h),s.required){let e=h.querySelectorAll('input[type="checkbox"]'),l=()=>{let y=Array.from(e).some(a=>a.checked);return e.forEach(a=>{y?a.setCustomValidity(""):a.setCustomValidity("At least one option must be selected.")}),y};e.forEach(y=>{y.addEventListener("change",l)}),d._validateCheckboxGroup=l,l()}let A=Array.from(h.querySelectorAll(".voc-form-user-item")),k=()=>{let e=String(c.value||"").trim().toLowerCase();if(!e){A.forEach(l=>l.style.setProperty("display","flex","important"));return}A.forEach(l=>{let y=l.dataset.label||"",a=l.dataset.email||"",g=l.dataset.value||"",E=y.includes(e)||a.includes(e)||g.includes(e);l.style.setProperty("display",E?"flex":"none","important")})};return c.addEventListener("input",k),d}function I(s,b=!0){let p=new FormData(s);if(b)return se(p);let v={};return p.forEach((d,m)=>{let L=(d instanceof File,d);Object.prototype.hasOwnProperty.call(v,m)?Array.isArray(v[m])?v[m].push(L):v[m]=[v[m],L]:v[m]=L}),v}function se(s){let b=new FormData;for(let[p,v]of s.entries()){if(v instanceof File){b.append(p,v);continue}let d;try{d=JSON.parse(v)}catch{d=null}Array.isArray(d)?d.length===0?b.append(p,"[]"):d.every(m=>typeof m=="object"&&m!==null)?d.forEach((m,L)=>{for(let[c,h]of Object.entries(m))b.append(`${p}[${L}][${c}]`,h)}):b.append(p,v):b.append(p,v)}return b}async function U(s,b,p){let v=b.url,d={"Content-Type":"application/json"};b?.api_token&&(d.Authorization=`Bearer ${b.api_token}`);let m=I(s);if(b?.additional_data)for(let[h,C]of Object.entries(b.additional_data))m.append(h,C);let L,c=m instanceof FormData;L={method:"POST",headers:{Authorization:`Bearer ${b.api_token}`,...c?{}:{"Content-Type":"application/json"},Accept:"application/json"},body:c?m:JSON.stringify(Object.fromEntries(m.entries()))};try{fetch(v,L).then(async h=>{let C=h.headers.get("content-type");if(!h.ok)try{let A=(await h.json())?.message;throw new Error(A??"Their was an error submitting the form. Check your form and try again.")}catch(f){throw new Error(f.message)}return C&&C.includes("application/json")?h.json():h.text()}).then(h=>{p&&p(h,null)}).catch(h=>{p&&p(null,h)})}catch(h){p&&p(null,h)}}function J(s,b,p){let v=[];if(typeof s=="string"?v=Array.from(document.querySelectorAll(s)):v=[s],v.length===0)return null;function d(){let c=p?.style==="bootstrap",h=document.createElement("form");h.classList.add("voc-form"),c&&h.classList.add("needs-validation"),h.id=b.id;let C=document.createElement("h2");C.className="voc-form-title",c&&C.classList.add("mb-3"),C.textContent=b.form_name,h.appendChild(C);function f(e,l){l&&(l.min_length!==void 0&&(e.minLength=l.min_length),l.max_length!==void 0&&(e.maxLength=l.max_length),l.regex&&(e instanceof HTMLInputElement?e.pattern=l.regex:e.dataset.pattern=l.regex))}function A(e){if(!e.key&&!e.label)return null;let l=b.default_values||{},y=e.name||e.key,a=y?l[y]:void 0,g=document.createElement("div");if(g.className="voc-form-group",c&&g.classList.add("mb-3"),e.label&&e.type!=="users"){let t=document.createElement("label");if(t.classList.add("voc-form-label"),c&&t.classList.add("form-label"),e.key?e.type==="radio"?t.htmlFor="":t.htmlFor=`voc-form-${e.key}`:t.htmlFor="",t.textContent=e.label,e.required){let n=document.createElement("span");n.className="voc-form-required",n.textContent="*",t.appendChild(n)}g.appendChild(t)}let E=null;switch(e.type){case"checkbox":{let t=document.createElement("div");if(t.className="voc-form-checkbox-group "+(e.direction||"vertical"),e.width&&(t.style.width=e.width),e.options){if(e.options.forEach((n,i)=>{let r=document.createElement("label");r.classList.add("voc-form-checkbox-label"),c&&r.classList.add("form-check"),r.style.display=e.direction==="horizontal"?"inline-block":"block",e.width&&(r.style.width=e.width);let o=document.createElement("input");o.type="checkbox",o.classList.add("voc-form-checkbox"),c&&o.classList.add("form-check-input"),o.name=`${e.name||e.key||""}[]`,o.value=n.value,e.key&&(o.id=`voc-form-${e.key}-${i}`),Array.isArray(a)?a.includes(n.value)&&(o.checked=!0):a!==void 0?a===n.value&&(o.checked=!0):e.default===n.value&&(o.checked=!0),r.appendChild(o),r.appendChild(document.createTextNode(n.label)),t.appendChild(r)}),e.required){let n=t.querySelectorAll('input[type="checkbox"]'),i=()=>{let r=Array.from(n).some(o=>o.checked);return n.forEach(o=>{r?o.setCustomValidity(""):o.setCustomValidity("At least one option must be selected.")}),r};n.forEach(r=>{r.addEventListener("change",i)}),t._validateCheckboxGroup=i,i()}}else{let n=document.createElement("label");n.classList.add("voc-form-checkbox-label"),c&&n.classList.add("form-check"),e.width&&(n.style.width=e.width);let i=document.createElement("input");i.type="checkbox",i.classList.add("voc-form-checkbox"),(e.key||e.name)&&(i.name=e.name||e.key,e.key&&(i.id=`voc-form-${e.key}`)),c&&i.classList.add("form-check-input"),e.required&&(i.required=!0),a!==void 0?i.checked=!!a:e.default&&(i.checked=!!e.default),n.appendChild(i),n.appendChild(document.createTextNode(e.label||"")),t.appendChild(n)}E=t;break}case"textarea":{let t=document.createElement("textarea");t.classList.add("voc-form-textarea"),c&&t.classList.add("form-control"),(e.key||e.name)&&(t.name=e.name||e.key,e.key&&(t.id=`voc-form-${e.key}`)),e.placeholder&&(t.placeholder=e.placeholder),a!=null?t.value=String(a):e.default!==void 0&&e.default!==null&&(t.value=String(e.default));let n=e.default||a||"";if(n){let i=(n.match(/\n/g)||[]).length,r=80,o=n.split(`
|
|
2
|
+
`).reduce((R,H)=>Math.max(R,H.length),0),x=Math.ceil(o/r)||1,S=Math.max(2,i+x);t.rows=S,t.style.resize="vertical"}e.width&&(t.style.width=e.width),e.required&&(t.required=!0),f(t,e.validation),E=t;break}case"select":{let t=document.createElement("select");if(t.classList.add("voc-form-select"),c&&t.classList.add("form-select"),c&&t.classList.add("form-control"),(e.key||e.name)&&(t.name=e.name||e.key,e.key&&(t.id=`voc-form-${e.key}`)),e.placeholder){let n=document.createElement("option");n.value="",n.textContent=e.placeholder,n.disabled=!0,n.selected=!0,t.appendChild(n)}e.required&&(t.required=!0),e.options&&e.options.forEach(n=>{let i=document.createElement("option");i.value=n.value,i.textContent=n.label,Array.isArray(a)?a.includes(n.value)&&(i.selected=!0):a!==void 0?a===n.value&&(i.selected=!0):e.default===n.value&&(i.selected=!0),t.appendChild(i)}),e.width&&(t.style.width=e.width),E=t;break}case"radio":{let t=document.createElement("div");t.className="voc-form-radio-group "+(e.direction||"vertical"),e.width&&(t.style.width=e.width),e.options&&e.options.forEach((n,i)=>{let r=document.createElement("label");r.classList.add("voc-form-radio-label"),c&&r.classList.add("form-check"),r.style.display=e.direction==="horizontal"?"inline-block":"block",e.width&&(r.style.width=e.width);let o=document.createElement("input");o.type="radio",o.classList.add("voc-form-radio"),c&&o.classList.add("form-check-input"),o.name=e.name||e.key||"",o.value=n.value,e.key&&(o.id=`voc-form-${e.key}-${i}`),Array.isArray(a)?a.includes(n.value)&&(o.checked=!0):a!==void 0?a===n.value&&(o.checked=!0):e.default===n.value&&(o.checked=!0),r.appendChild(o),r.appendChild(document.createTextNode(n.label)),t.appendChild(r)}),E=t;break}case"file":{let t=document.createElement("div");t.className="voc-form-file-wrapper",e.width&&(t.style.width=e.width);let n=document.createElement("input");n.type="file",n.classList.add("voc-form-file"),c&&n.classList.add("form-control"),(e.key||e.name)&&(n.name=e.name||e.key,e.key&&(n.id=`voc-form-${e.key}`)),e.width&&(n.style.width=e.width),e.required&&(n.required=!0),e.accept&&(n.accept=e.accept),e.multiple&&(n.multiple=!0),t.appendChild(n),E=t;break}case"avatar":{E=W(e,p||{},a);break}case"table":{E=G(e,p||{},a);break}case"users":{E=V(e,p||{},a);break}case"audio_select":{E=z(e,p||{},a);break}default:{let t=document.createElement("input");t.type=e.type||"text",t.classList.add("voc-form-input"),c&&t.classList.add("form-control"),(e.key||e.name)&&(t.name=e.name||e.key,e.key&&(t.id=`voc-form-${e.key}`)),e.placeholder&&(t.placeholder=e.placeholder),a!=null?t.value=String(a):e.default!==void 0&&e.default!==null&&(t.value=String(e.default)),e.width&&(t.style.width=e.width),e.required&&(t.required=!0),f(t,e.validation),E=t;break}}if(E&&g.appendChild(E),e.hint_text){let t=document.createElement("small");t.className="voc-form-hint",t.textContent=e.hint_text,g.appendChild(t)}return g}b.fields.forEach(e=>{if(e.type==="group"&&"items"in e){let l=e;if(c){let y=document.createElement("div");y.className="card voc-form-group-card mb-3";let a=l.label||l.header?.title,g=l.description||l.header?.description;if(a||g){let t=document.createElement("div");if(t.className="card-header voc-form-group-head",a){let n=document.createElement("h5");n.className="mb-0 voc-form-group-label",n.textContent=a,t.appendChild(n)}if(g){let n=document.createElement("p");n.className="mb-0 voc-form-group-description",n.textContent=g,t.appendChild(n)}y.appendChild(t)}let E=document.createElement("div");E.className="card-body voc-form-group-body",l.items.forEach(t=>{if(t.type==="row"&&"items"in t){let n=t,i=document.createElement("div");if(i.className="voc-form-group voc-form-row mb-3",n.label){let o=document.createElement("h6");o.className="voc-form-row-label",o.textContent=n.label,i.appendChild(o)}let r=document.createElement("div");r.className="voc-form-row-items "+(n.direction||"horizontal"),n.items.forEach(o=>{let x=A(o);x&&r.appendChild(x)}),i.appendChild(r),E.appendChild(i)}else{let n=A(t);n&&E.appendChild(n)}}),y.appendChild(E),h.appendChild(y)}else{let y=document.createElement("div");y.className="voc-form-group voc-form-group-wrapper",c&&y.classList.add("mb-3");let a=l.label||l.header?.title,g=l.description||l.header?.description;if(a||g){let E=document.createElement("div");if(E.className="voc-form-group-head",a){let t=document.createElement("h3");t.className="voc-form-group-label",t.textContent=a,E.appendChild(t)}if(g){let t=document.createElement("p");t.className="voc-form-group-description",t.textContent=g,E.appendChild(t)}y.appendChild(E)}l.items.forEach(E=>{if(E.type==="row"&&"items"in E){let t=E,n=document.createElement("div");if(n.className="voc-form-group voc-form-row",c&&n.classList.add("mb-3"),t.label){let r=document.createElement("h4");r.className="voc-form-row-label",r.textContent=t.label,n.appendChild(r)}let i=document.createElement("div");i.className="voc-form-row-items "+(t.direction||"horizontal"),t.items.forEach(r=>{let o=A(r);o&&i.appendChild(o)}),n.appendChild(i),y.appendChild(n)}else{let t=A(E);t&&y.appendChild(t)}}),h.appendChild(y)}return}if(e.type==="row"&&"items"in e){let l=document.createElement("div");if(l.className="voc-form-group voc-form-row",c&&l.classList.add("mb-3"),e.label){let a=document.createElement("h3");a.className="voc-form-row-label",a.textContent=e.label,l.appendChild(a)}if(e.description){let a=document.createElement("p");a.className="voc-form-row-description",a.textContent=e.description,l.appendChild(a)}let y=document.createElement("div");y.className="voc-form-row-items "+(e.direction||"horizontal"),l.appendChild(y),e.items.forEach(a=>{let g=A(a);g&&y.appendChild(g)}),h.appendChild(l)}else{let l=A(e);l&&h.appendChild(l)}});let k=document.createElement("button");return k.type="submit",k.className="voc-form-submit",k.textContent="Submit",c&&k.classList.add("btn","btn-primary"),h.appendChild(k),h}let m=d();v[0].appendChild(m);let L=b?.submit_config??p?.submit_config??null;return L&&m.addEventListener("submit",c=>{c.preventDefault();let h=Array.from(m.querySelectorAll(".voc-form-checkbox-group, .voc-form-users")),C=[];if(h.forEach(k=>{k&&typeof k._validateCheckboxGroup=="function"&&(k._validateCheckboxGroup()||k.querySelector('input[type="checkbox"]')&&C.push("Please select at least one option"))}),!m.checkValidity()){m.reportValidity(),p?.onSubmitResult&&p.onSubmitResult(null,new Error("Form validation failed"));return}let f=Array.from(m.querySelectorAll(" .voc-form-table-wrapper, .voc-form-table-wrapper")),A=[];if(f.forEach(k=>{if(k&&typeof k.validate=="function"){let e=k.validate();e&&e.length&&A.push(...e)}}),A.length){p?.onSubmitResult&&p.onSubmitResult(null,new Error(A.join("; ")));let k=f[0];k&&k.scrollIntoView({behavior:"smooth",block:"center"});return}if(p?.onSubmit){let k=I(m);p.onSubmit(k)}U(m,L,(k,e)=>{p?.onSubmitResult&&p.onSubmitResult(k,e)})}),{element:m,validate:()=>{let c=[];return m.querySelectorAll(":invalid").forEach(C=>{let f=C.validationMessage;c.push({element:C,message:f})}),c},getValues:()=>I(m),onSubmit:c=>{m.addEventListener("submit",h=>{h.preventDefault();let C=I(m);c(C,h)})}}}var j={renderForm:J};var oe=j,ie={FormsLib:j};0&&(module.exports={FormsLib});
|
package/dist/main.mjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
function j(s,L,f){let v=L?.style==="bootstrap",h=document.createElement("div");h.className="voc-form-avatar-wrapper",v&&h.classList.add("d-flex","align-items-center","gap-3");let d=document.createElement("img");d.className="voc-form-avatar-preview",d.alt=s.label||"avatar",v&&(d.classList.add("img-thumbnail","rounded-circle"),d.style.width=d.style.height="64px",d.style.objectFit="cover");let k=f!=null?String(f):s.default!==void 0&&s.default!==null?String(s.default):"";k?d.src=k:(d.src="",d.style.display="none");let c=document.createElement("input");c.type="file",c.accept=s.accept||"image/*",c.className="voc-form-avatar-input",v&&c.classList.add("form-control"),(s.key||s.name)&&(c.name=s.name||s.key,s.key&&(c.id=`voc-form-${s.key}`));let p=document.createElement("input");if(p.type="hidden",(s.key||s.name)&&(p.name=(s.name||s.key)+"_url"),p.value=k||"",c.addEventListener("change",b=>{let m=b.target;if(m.files&&m.files.length>0){let x=m.files[0],N=new FileReader;N.onload=()=>{d.src=String(N.result),d.style.display="",p.value=""},N.readAsDataURL(x)}}),v){let b=document.createElement("div");b.style.flex="1",b.appendChild(c),b.appendChild(p),h.appendChild(d),h.appendChild(b)}else h.appendChild(d),h.appendChild(c),h.appendChild(p);return h}function W(s,L,f){let v=L?.style==="bootstrap",h=document.createElement("div");if(h.className="voc-form-audio-select",!s.options||s.options.length===0)return h;let d=s.name||s.key||`audio_select_${Math.random().toString(36).substr(2,6)}`,k;return Array.isArray(f)?k=f[0]:f!==void 0?k=f:s.default!==void 0&&(k=s.default),s.options.forEach((c,p)=>{let b=document.createElement("div");b.className="voc-form-audio-item",v&&b.classList.add("form-check");let m=document.createElement("input");m.type="radio",m.name=d,m.value=c.value,m.className="voc-form-audio-radio",s.key&&(m.id=`voc-form-${s.key}-${p}`),s.required&&p===0&&(m.required=!0),m.style.position="absolute",m.style.width="1px",m.style.height="1px",m.style.margin="0",m.style.padding="0",m.style.clip="rect(0 0 0 0)",m.style.clipPath="inset(50%)",m.style.overflow="hidden",m.style.border="0",k!==void 0&&(Array.isArray(k)?m.checked=k.includes(c.value):m.checked=String(k)===String(c.value));let x=()=>{m.checked?b.classList.add("selected"):b.classList.remove("selected")};m.addEventListener("change",()=>{h.querySelectorAll(".voc-form-audio-item").forEach(n=>n.classList.remove("selected")),x()}),m.checked&&b.classList.add("selected");let N=document.createElement("label");N.className="voc-form-audio-label",v&&N.classList.add("form-check-label"),N.htmlFor=m.id||"",N.textContent=c.label||c.value,N.tabIndex=0;let e=document.createElement("div");e.className="voc-form-audio-control";let l=null;if(c.audio_link){let t=document.createElement("button");t.type="button",t.className="voc-form-audio-play",v&&t.classList.add("btn","btn-sm","btn-outline-secondary"),t.setAttribute("aria-label",`Play ${c.label||c.value}`);let n="http://www.w3.org/2000/svg",i=document.createElementNS(n,"svg");i.setAttribute("viewBox","0 0 24 24"),i.setAttribute("width","16"),i.setAttribute("height","16"),i.setAttribute("aria-hidden","true");let r=document.createElementNS(n,"path");r.setAttribute("d","M8 5v14l11-7z"),r.setAttribute("fill","currentColor"),i.appendChild(r),t.appendChild(i),l=document.createElement("audio"),l.src=c.audio_link,l.preload="none",l.style.display="none";let o=u=>{for(;u.firstChild;)u.removeChild(u.firstChild)},C=()=>{let u="http://www.w3.org/2000/svg",S=document.createElementNS(u,"svg");S.setAttribute("viewBox","0 0 24 24"),S.setAttribute("width","16"),S.setAttribute("height","16"),S.setAttribute("aria-hidden","true");let A=document.createElementNS(u,"path");return A.setAttribute("d","M8 5v14l11-7z"),A.setAttribute("fill","currentColor"),S.appendChild(A),S},F=()=>{let u="http://www.w3.org/2000/svg",S=document.createElementNS(u,"svg");S.setAttribute("viewBox","0 0 24 24"),S.setAttribute("width","16"),S.setAttribute("height","16"),S.setAttribute("aria-hidden","true");let A=document.createElementNS(u,"rect");return A.setAttribute("x","6"),A.setAttribute("y","6"),A.setAttribute("width","12"),A.setAttribute("height","12"),A.setAttribute("fill","currentColor"),S.appendChild(A),S};o(t),t.appendChild(C());let R=u=>{o(t),u?(t.appendChild(F()),t.setAttribute("aria-label",`Stop ${c.label||c.value}`)):(t.appendChild(C()),t.setAttribute("aria-label",`Play ${c.label||c.value}`))};t.addEventListener("click",()=>{try{if(!l)return;let u=h.querySelectorAll("audio");if(!l.paused&&!l.ended){l.pause(),l.currentTime=0;return}u.forEach(A=>{try{A.pause(),A.currentTime=0}catch{}}),h.querySelectorAll(".voc-form-audio-item").forEach(A=>A.classList.remove("is-playing")),l.play()}catch(u){console.warn("audio play failed",u)}}),l.addEventListener("playing",()=>{b.classList.add("is-playing"),R(!0)});let H=()=>{b.classList.remove("is-playing"),R(!1)};l.addEventListener("pause",H),l.addEventListener("ended",H),e.appendChild(t),e.appendChild(l)}let y=document.createElement("div");y.className="voc-form-item-detail",y.style.display="flex",y.style.flexDirection="column",y.style.gap="4px";let a=document.createElement("div");a.className="voc-form-item-top",a.style.display="flex",a.style.alignItems="center",a.style.gap="8px",a.appendChild(m),a.appendChild(N);let g=document.createElement("div");g.className="voc-form-item-description";let E=c.description||c.hint_text||"";E&&(g.textContent=E),y.appendChild(a),y.appendChild(g),e.appendChild(y),b.appendChild(e),a.addEventListener("click",t=>{let n=t.target;n&&n.closest(".voc-form-audio-play")||(m.checked=!0,m.dispatchEvent(new Event("change",{bubbles:!0})))}),b.addEventListener("click",t=>{let n=t.target;n&&n.closest(".voc-form-audio-play")||(m.checked=!0,m.dispatchEvent(new Event("change",{bubbles:!0})))}),h.appendChild(b)}),h}function z(s,L,f){let v=document.createElement("div");v.className="voc-form-table-wrapper";let h=L?.style==="bootstrap",d=document.createElement("input");d.type="hidden",d.name=s.name||s.key,s.key&&(d.id=`voc-form-${s.key}`),v.appendChild(d);let k=document.createElement("table");k.className="voc-form-table",h&&k.classList.add("table","table-bordered");let c=document.createElement("thead"),p=document.createElement("tr"),b=document.createElement("th");b.className="voc-form-table-drag-col",b.textContent="",p.appendChild(b),(s.fields||[]).forEach(n=>{let i=document.createElement("th");i.textContent=n.label||n.key,p.appendChild(i)});let m=document.createElement("th");m.textContent="Actions",p.appendChild(m),c.appendChild(p),k.appendChild(c);let x=document.createElement("tbody");k.appendChild(x),v.appendChild(k);let N=document.createElement("button");N.type="button",N.className="voc-form-table-add",h&&N.classList.add("btn","btn-secondary"),N.textContent="+Add";let e=document.createElement("tfoot"),l=document.createElement("tr"),y=document.createElement("td");y.colSpan=(s.fields?s.fields.length:0)+1,y.appendChild(N),l.appendChild(y),e.appendChild(l),k.appendChild(e),v.appendChild(k);let a=[];function g(){d.value=JSON.stringify(a)}function E(n){let i=[];return s.fields.forEach(r=>{let o=n[r.key];if(r.type==="checkbox"){let C=Array.isArray(o)?o:o?[o]:[];r.required&&C.length===0&&i.push(`${r.label||r.key} is required`);return}r.required&&(o==null||String(o).trim()==="")&&i.push(`${r.label||r.key} is required`),r.type==="email"&&o&&(/^\S+@\S+\.\S+$/.test(String(o))||i.push(`${r.label||r.key} must be a valid email`)),r.type==="number"&&o&&isNaN(Number(o))&&i.push(`${r.label||r.key} must be a number`),r.validation&&r.validation.regex&&o&&(new RegExp(r.validation.regex).test(String(o))||i.push(`${r.label||r.key} invalid format`))}),i}function t(){x.innerHTML="";let n=(i,r)=>{r.draggable=!0,r.addEventListener("mousedown",()=>{r.style.cursor="grabbing"}),r.addEventListener("mouseup",()=>{r.style.cursor="grab"}),r.addEventListener("dragstart",o=>{let C=Number(i.dataset.rowIndex);o.dataTransfer.setData("text/plain",String(C)),i.classList.add("dragging");try{o.dataTransfer?.setDragImage(r,10,10)}catch{}}),r.addEventListener("dragend",()=>{i.classList.remove("dragging"),r.style.cursor="grab"}),i.addEventListener("dragover",o=>{o.preventDefault();let C=o.currentTarget,F=C.getBoundingClientRect(),R=F.top+F.height/2,H=(o.clientY||o.y)>R;C.classList.remove("drag-over-top","drag-over-bottom"),H?(C.classList.add("drag-over-bottom"),C.dataset.dropPosition="after"):(C.classList.add("drag-over-top"),C.dataset.dropPosition="before")}),i.addEventListener("dragleave",o=>{let C=o.currentTarget;C.classList.remove("drag-over-top","drag-over-bottom"),delete C.dataset.dropPosition}),i.addEventListener("drop",o=>{o.preventDefault();let C=o.dataTransfer.getData("text/plain"),F=Number(o.currentTarget.dataset.rowIndex),R=Number(C),H=o.currentTarget.dataset.dropPosition||"before";if(isNaN(R)||isNaN(F))return;let[u]=a.splice(R,1),S=F;R<F&&(S=F-1);let A=H==="after"?S+1:S;a.splice(A,0,u),o.currentTarget.classList.remove("drag-over-top","drag-over-bottom"),delete o.currentTarget.dataset.dropPosition,t(),g()})};a.forEach((i,r)=>{let o=document.createElement("tr");o.dataset.rowIndex=String(r),o.classList.add("voc-form-table-row");let C=document.createElement("td");C.className="voc-form-table-drag-handle";let F=document.createElement("span");F.className="voc-form-drag-handle-icon",F.textContent="\u2630",F.style.cursor="grab",C.appendChild(F),o.appendChild(C),n(o,F),s.fields.forEach(u=>{let S=document.createElement("td"),A,_=(u.type||"text").toLowerCase();if(_==="select"){let w=document.createElement("select");if(w.className="voc-form-table-cell",h&&w.classList.add("form-control"),u.placeholder){let T=document.createElement("option");T.value="",T.textContent=u.placeholder,T.disabled=!0,(i[u.key]===void 0||i[u.key]===null||i[u.key]==="")&&(T.selected=!0),w.appendChild(T)}(u.options||[]).forEach(T=>{let D=document.createElement("option");D.value=T.value,D.textContent=T.label,w.appendChild(D)}),w.value=i[u.key]!==void 0&&i[u.key]!==null?String(i[u.key]):"",u.required&&(w.required=!0),w.addEventListener("change",T=>{a[r][u.key]=T.target.value,g()}),A=w}else if(_==="checkbox"){let w=document.createElement("div");w.className="voc-form-table-checkboxes",h&&w.classList.add("form-check");let B=u.options||[];Array.isArray(a[r][u.key])||(a[r][u.key]=a[r][u.key]?[a[r][u.key]]:[]),B.forEach(T=>{let D=`voc-form-${s.key}-${u.key}-${r}-${T.value}`,$=document.createElement("div");$.className="voc-form-table-checkbox-item",h&&$.classList.add("form-check");let M=document.createElement("input");M.type="checkbox",M.className="voc-form-table-cell",h&&M.classList.add("form-check-input"),M.id=D,M.value=T.value,M.checked=Array.isArray(a[r][u.key])&&a[r][u.key].includes(T.value),M.addEventListener("change",O=>{let V=O.target.checked;Array.isArray(a[r][u.key])||(a[r][u.key]=[]),V?a[r][u.key].includes(T.value)||a[r][u.key].push(T.value):a[r][u.key]=a[r][u.key].filter(K=>K!==T.value),g()});let q=document.createElement("label");q.htmlFor=D,q.className="voc-form-table-checkbox-label",h&&q.classList.add("form-check-label"),q.textContent=T.label,$.appendChild(M),$.appendChild(q),w.appendChild($)}),A=w}else if(_==="radio"){let w=document.createElement("div");w.className="voc-form-table-radios",h&&w.classList.add("form-check");let B=u.options||[];a[r][u.key]===void 0&&(a[r][u.key]=""),B.forEach(T=>{let D=`voc-form-${s.key}-${u.key}-${r}-${T.value}`,$=document.createElement("div");$.className="voc-form-table-radio-item",h&&$.classList.add("form-check");let M=document.createElement("input");M.type="radio",M.className="voc-form-table-cell",h&&M.classList.add("form-check-input"),M.id=D,M.name=`voc-form-${s.key}-${u.key}-${r}`,M.value=T.value,M.checked=a[r][u.key]===T.value,M.addEventListener("change",O=>{O.target.checked&&(a[r][u.key]=O.target.value,g())});let q=document.createElement("label");q.htmlFor=D,q.className="voc-form-table-radio-label",h&&q.classList.add("form-check-label"),q.textContent=T.label,$.appendChild(M),$.appendChild(q),w.appendChild($)}),A=w}else{let w=document.createElement("input");_==="number"?w.type="number":_==="email"?w.type="email":_==="tel"?w.type="tel":_==="url"?w.type="url":_==="date"?w.type="date":w.type="text",w.value=i[u.key]!==void 0&&i[u.key]!==null?String(i[u.key]):"",u.placeholder&&(w.placeholder=u.placeholder),u.required&&(w.required=!0),w.className="voc-form-table-cell",h&&w.classList.add("form-control"),w.addEventListener("input",B=>{a[r][u.key]=B.target.value,g()}),A=w}S.appendChild(A),o.appendChild(S)});let R=document.createElement("td"),H=document.createElement("button");H.type="button",H.className="voc-form-table-remove",h&&H.classList.add("btn","btn-danger"),H.textContent="Remove",H.addEventListener("click",()=>{a.splice(r,1),t(),g()}),R.appendChild(H),o.appendChild(R),x.appendChild(o)})}return N.addEventListener("click",()=>{if(s.validation?.max_rows!==void 0&&a.length>=s.validation.max_rows)return;let n={};s.fields.forEach(i=>n[i.key]=""),a.push(n),t(),g()}),Array.isArray(f)&&f.length?a=f.map(n=>({...n})):s.default&&Array.isArray(s.default)&&(a=s.default.map(n=>({...n}))),t(),g(),v.validate=function(){let n=[];return a.forEach((i,r)=>{let o=E(i);o.length&&n.push(`Row ${r+1}: ${o.join("; ")}`)}),s.validation?.min_rows!==void 0&&a.length<s.validation.min_rows&&n.push(`At least ${s.validation.min_rows} rows required`),s.validation?.max_rows!==void 0&&a.length>s.validation.max_rows&&n.push(`No more than ${s.validation.max_rows} rows allowed`),s.validation?.unique_fields&&s.validation.unique_fields.length&&s.validation.unique_fields.forEach(i=>{let r=new Set;a.forEach((o,C)=>{let F=o[i];F!=null&&(r.has(F)&&n.push(`Field ${i} must be unique (duplicate at row ${C+1})`),r.add(F))})}),n},v}async function Y(s){let f=new TextEncoder().encode(s),v=await crypto.subtle.digest("SHA-256",f);return Array.from(new Uint8Array(v)).map(d=>d.toString(16).padStart(2,"0")).join("")}async function Q(s){let L=String(s||"").trim().toLowerCase();return L?`https://gravatar.com/avatar/${await Y(L)}?d=mp`:""}function G(s,L,f){let v=L?.style==="bootstrap",h=document.createElement("div");h.className="voc-form-users";let d=document.createElement("div");if(d.className="voc-form-users-header",v&&d.classList.add("mb-2"),s.label){let e=document.createElement("div");if(e.className="voc-form-users-label",v&&e.classList.add("form-label"),e.textContent=s.label,s.required){let l=document.createElement("span");l.className="voc-form-required",l.textContent="*",e.appendChild(l)}d.appendChild(e)}if(s.description){let e=document.createElement("div");e.className="voc-form-users-description",v&&e.classList.add("form-text"),e.textContent=s.description,d.appendChild(e)}h.appendChild(d);let k=document.createElement("div");k.className="voc-form-users-search-wrapper";let c=document.createElement("input");if(c.type="search",c.placeholder="Search users...",c.className="voc-form-users-search",v&&c.classList.add("form-control","mb-2"),k.appendChild(c),h.appendChild(k),!s.options||s.options.length===0)return h;let p=document.createElement("div");p.className="voc-form-users-list",v&&p.classList.add("list-group");let b=s.name||s.key||`users_${Math.random().toString(36).substr(2,6)}`,m=[];Array.isArray(f)?m=f:f!=null?m=[f]:Array.isArray(s.default)&&(m=s.default),s.options.forEach((e,l)=>{let y=document.createElement("div");y.className="voc-form-user-item",y.dataset.label=String(e.label||"").toLowerCase(),y.dataset.email=String(e.email||"").toLowerCase(),y.dataset.value=String(e.value||"").toLowerCase(),v&&y.classList.add("d-flex","align-items-center","gap-2");let a=document.createElement("input");a.type="checkbox",a.name=`${b}[]`,a.value=e.value,a.className="voc-form-user-checkbox",s.key&&(a.id=`voc-form-${s.key}-${l}`),s.required&&l===0&&(a.required=!0),a.style.position="absolute",a.style.width="1px",a.style.height="1px",a.style.margin="0",a.style.padding="0",a.style.clip="rect(0 0 0 0)",a.style.clipPath="inset(50%)",a.style.overflow="hidden",a.style.border="0",m&&Array.isArray(m)&&(a.checked=m.includes(e.value));let g=document.createElement("img");g.className="voc-form-user-avatar",g.alt=e.label||String(e.value||"user"),g.style.width=g.style.height="40px",g.style.objectFit="cover",g.style.borderRadius="50%",g.src="",e.email&&Q(e.email).then(i=>{i&&(g.src=i)}).catch(()=>{});let E=document.createElement("div");E.className="voc-form-user-info",E.style.display="flex",E.style.flexDirection="column",E.style.gap="2px";let t=document.createElement("div");t.className="voc-form-user-label",t.textContent=e.label||String(e.value);let n=document.createElement("small");n.className="voc-form-user-email",n.textContent=e.email||"",E.appendChild(t),E.appendChild(n),y.addEventListener("click",i=>{let r=i.target;r&&(r.closest("input")||r.closest("a")||r.closest("button"))||(a.checked=!a.checked,a.dispatchEvent(new Event("change",{bubbles:!0})))}),a.addEventListener("change",()=>{a.checked?y.classList.add("selected"):y.classList.remove("selected")}),a.checked&&y.classList.add("selected"),y.appendChild(a),y.appendChild(g),y.appendChild(E),p.appendChild(y)}),h.appendChild(p);let x=Array.from(p.querySelectorAll(".voc-form-user-item")),N=()=>{let e=String(c.value||"").trim().toLowerCase();if(!e){x.forEach(l=>l.style.setProperty("display","flex","important"));return}x.forEach(l=>{let y=l.dataset.label||"",a=l.dataset.email||"",g=l.dataset.value||"",E=y.includes(e)||a.includes(e)||g.includes(e);l.style.setProperty("display",E?"flex":"none","important")})};return c.addEventListener("input",N),h}function I(s,L=!0){let f=new FormData(s);if(L)return X(f);let v={};return f.forEach((h,d)=>{let k=(h instanceof File,h);Object.prototype.hasOwnProperty.call(v,d)?Array.isArray(v[d])?v[d].push(k):v[d]=[v[d],k]:v[d]=k}),v}function X(s){let L=new FormData;for(let[f,v]of s.entries()){if(v instanceof File){L.append(f,v);continue}let h;try{h=JSON.parse(v)}catch{h=null}Array.isArray(h)?h.length===0?L.append(f,"[]"):h.every(d=>typeof d=="object"&&d!==null)?h.forEach((d,k)=>{for(let[c,p]of Object.entries(d))L.append(`${f}[${k}][${c}]`,p)}):L.append(f,v):L.append(f,v)}return L}async function U(s,L,f){let v=L.url,h={"Content-Type":"application/json"};L?.api_token&&(h.Authorization=`Bearer ${L.api_token}`);let d=I(s);if(L?.additional_data)for(let[p,b]of Object.entries(L.additional_data))d.append(p,b);let k,c=d instanceof FormData;k={method:"POST",headers:{Authorization:`Bearer ${L.api_token}`,...c?{}:{"Content-Type":"application/json"},Accept:"application/json"},body:c?d:JSON.stringify(Object.fromEntries(d.entries()))};try{fetch(v,k).then(async p=>{let b=p.headers.get("content-type");if(!p.ok)try{let x=(await p.json())?.message;throw new Error(x??"Their was an error submitting the form. Check your form and try again.")}catch(m){throw new Error(m.message)}return b&&b.includes("application/json")?p.json():p.text()}).then(p=>{f&&f(p,null)}).catch(p=>{f&&f(null,p)})}catch(p){f&&f(null,p)}}function J(s,L,f){let v=[];if(typeof s=="string"?v=Array.from(document.querySelectorAll(s)):v=[s],v.length===0)return null;function h(){let c=f?.style==="bootstrap",p=document.createElement("form");p.classList.add("voc-form"),c&&p.classList.add("needs-validation"),p.id=L.id;let b=document.createElement("h2");b.className="voc-form-title",c&&b.classList.add("mb-3"),b.textContent=L.form_name,p.appendChild(b);function m(e,l){l&&(l.min_length!==void 0&&(e.minLength=l.min_length),l.max_length!==void 0&&(e.maxLength=l.max_length),l.regex&&(e instanceof HTMLInputElement?e.pattern=l.regex:e.dataset.pattern=l.regex))}function x(e){if(!e.key&&!e.label)return null;let l=L.default_values||{},y=e.name||e.key,a=y?l[y]:void 0,g=document.createElement("div");if(g.className="voc-form-group",c&&g.classList.add("mb-3"),e.label&&e.type!=="users"){let t=document.createElement("label");if(t.classList.add("voc-form-label"),c&&t.classList.add("form-label"),e.key?e.type==="radio"?t.htmlFor="":t.htmlFor=`voc-form-${e.key}`:t.htmlFor="",t.textContent=e.label,e.required){let n=document.createElement("span");n.className="voc-form-required",n.textContent="*",t.appendChild(n)}g.appendChild(t)}let E=null;switch(e.type){case"checkbox":{let t=document.createElement("div");if(t.className="voc-form-checkbox-group "+(e.direction||"vertical"),e.width&&(t.style.width=e.width),e.options)e.options.forEach((n,i)=>{let r=document.createElement("label");r.classList.add("voc-form-checkbox-label"),c&&r.classList.add("form-check"),r.style.display=e.direction==="horizontal"?"inline-block":"block",e.width&&(r.style.width=e.width);let o=document.createElement("input");o.type="checkbox",o.classList.add("voc-form-checkbox"),c&&o.classList.add("form-check-input"),o.name=e.name||e.key||"",o.value=n.value,e.key&&(o.id=`voc-form-${e.key}-${i}`),e.required&&(o.required=!0),Array.isArray(a)?a.includes(n.value)&&(o.checked=!0):a!==void 0?a===n.value&&(o.checked=!0):e.default===n.value&&(o.checked=!0),r.appendChild(o),r.appendChild(document.createTextNode(n.label)),t.appendChild(r)});else{let n=document.createElement("label");n.classList.add("voc-form-checkbox-label"),c&&n.classList.add("form-check"),e.width&&(n.style.width=e.width);let i=document.createElement("input");i.type="checkbox",i.classList.add("voc-form-checkbox"),(e.key||e.name)&&(i.name=e.name||e.key,e.key&&(i.id=`voc-form-${e.key}`)),c&&i.classList.add("form-check-input"),e.required&&(i.required=!0),a!==void 0?i.checked=!!a:e.default&&(i.checked=!!e.default),n.appendChild(i),n.appendChild(document.createTextNode(e.label||"")),t.appendChild(n)}E=t;break}case"textarea":{let t=document.createElement("textarea");t.classList.add("voc-form-textarea"),c&&t.classList.add("form-control"),(e.key||e.name)&&(t.name=e.name||e.key,e.key&&(t.id=`voc-form-${e.key}`)),e.placeholder&&(t.placeholder=e.placeholder),a!=null?t.value=String(a):e.default!==void 0&&e.default!==null&&(t.value=String(e.default));let n=e.default||a||"";if(n){let i=(n.match(/\n/g)||[]).length,r=80,o=n.split(`
|
|
2
|
-
`).reduce((R,H)=>Math.max(R,H.length),0),
|
|
1
|
+
function j(s,L,h){let v=L?.style==="bootstrap",u=document.createElement("div");u.className="voc-form-avatar-wrapper",v&&u.classList.add("d-flex","align-items-center","gap-3");let d=document.createElement("img");d.className="voc-form-avatar-preview",d.alt=s.label||"avatar",v&&(d.classList.add("img-thumbnail","rounded-circle"),d.style.width=d.style.height="64px",d.style.objectFit="cover");let C=h!=null?String(h):s.default!==void 0&&s.default!==null?String(s.default):"";C?d.src=C:(d.src="",d.style.display="none");let c=document.createElement("input");c.type="file",c.accept=s.accept||"image/*",c.className="voc-form-avatar-input",v&&c.classList.add("form-control"),(s.key||s.name)&&(c.name=s.name||s.key,s.key&&(c.id=`voc-form-${s.key}`));let p=document.createElement("input");if(p.type="hidden",(s.key||s.name)&&(p.name=(s.name||s.key)+"_url"),p.value=C||"",c.addEventListener("change",k=>{let f=k.target;if(f.files&&f.files.length>0){let A=f.files[0],E=new FileReader;E.onload=()=>{d.src=String(E.result),d.style.display="",p.value=""},E.readAsDataURL(A)}}),v){let k=document.createElement("div");k.style.flex="1",k.appendChild(c),k.appendChild(p),u.appendChild(d),u.appendChild(k)}else u.appendChild(d),u.appendChild(c),u.appendChild(p);return u}function W(s,L,h){let v=L?.style==="bootstrap",u=document.createElement("div");if(u.className="voc-form-audio-select",!s.options||s.options.length===0)return u;let d=s.name||s.key||`audio_select_${Math.random().toString(36).substr(2,6)}`,C;return Array.isArray(h)?C=h[0]:h!==void 0?C=h:s.default!==void 0&&(C=s.default),s.options.forEach((c,p)=>{let k=document.createElement("div");k.className="voc-form-audio-item",v&&k.classList.add("form-check");let f=document.createElement("input");f.type="radio",f.name=d,f.value=c.value,f.className="voc-form-audio-radio",s.key&&(f.id=`voc-form-${s.key}-${p}`),s.required&&p===0&&(f.required=!0),f.style.position="absolute",f.style.width="1px",f.style.height="1px",f.style.margin="0",f.style.padding="0",f.style.clip="rect(0 0 0 0)",f.style.clipPath="inset(50%)",f.style.overflow="hidden",f.style.border="0",C!==void 0&&(Array.isArray(C)?f.checked=C.includes(c.value):f.checked=String(C)===String(c.value));let A=()=>{f.checked?k.classList.add("selected"):k.classList.remove("selected")};f.addEventListener("change",()=>{u.querySelectorAll(".voc-form-audio-item").forEach(n=>n.classList.remove("selected")),A()}),f.checked&&k.classList.add("selected");let E=document.createElement("label");E.className="voc-form-audio-label",v&&E.classList.add("form-check-label"),E.htmlFor=f.id||"",E.textContent=c.label||c.value,E.tabIndex=0;let e=document.createElement("div");e.className="voc-form-audio-control";let l=null;if(c.audio_link){let t=document.createElement("button");t.type="button",t.className="voc-form-audio-play",v&&t.classList.add("btn","btn-sm","btn-outline-secondary"),t.setAttribute("aria-label",`Play ${c.label||c.value}`);let n="http://www.w3.org/2000/svg",i=document.createElementNS(n,"svg");i.setAttribute("viewBox","0 0 24 24"),i.setAttribute("width","16"),i.setAttribute("height","16"),i.setAttribute("aria-hidden","true");let r=document.createElementNS(n,"path");r.setAttribute("d","M8 5v14l11-7z"),r.setAttribute("fill","currentColor"),i.appendChild(r),t.appendChild(i),l=document.createElement("audio"),l.src=c.audio_link,l.preload="none",l.style.display="none";let o=m=>{for(;m.firstChild;)m.removeChild(m.firstChild)},x=()=>{let m="http://www.w3.org/2000/svg",F=document.createElementNS(m,"svg");F.setAttribute("viewBox","0 0 24 24"),F.setAttribute("width","16"),F.setAttribute("height","16"),F.setAttribute("aria-hidden","true");let N=document.createElementNS(m,"path");return N.setAttribute("d","M8 5v14l11-7z"),N.setAttribute("fill","currentColor"),F.appendChild(N),F},S=()=>{let m="http://www.w3.org/2000/svg",F=document.createElementNS(m,"svg");F.setAttribute("viewBox","0 0 24 24"),F.setAttribute("width","16"),F.setAttribute("height","16"),F.setAttribute("aria-hidden","true");let N=document.createElementNS(m,"rect");return N.setAttribute("x","6"),N.setAttribute("y","6"),N.setAttribute("width","12"),N.setAttribute("height","12"),N.setAttribute("fill","currentColor"),F.appendChild(N),F};o(t),t.appendChild(x());let R=m=>{o(t),m?(t.appendChild(S()),t.setAttribute("aria-label",`Stop ${c.label||c.value}`)):(t.appendChild(x()),t.setAttribute("aria-label",`Play ${c.label||c.value}`))};t.addEventListener("click",()=>{try{if(!l)return;let m=u.querySelectorAll("audio");if(!l.paused&&!l.ended){l.pause(),l.currentTime=0;return}m.forEach(N=>{try{N.pause(),N.currentTime=0}catch{}}),u.querySelectorAll(".voc-form-audio-item").forEach(N=>N.classList.remove("is-playing")),l.play()}catch(m){console.warn("audio play failed",m)}}),l.addEventListener("playing",()=>{k.classList.add("is-playing"),R(!0)});let H=()=>{k.classList.remove("is-playing"),R(!1)};l.addEventListener("pause",H),l.addEventListener("ended",H),e.appendChild(t),e.appendChild(l)}let y=document.createElement("div");y.className="voc-form-item-detail",y.style.display="flex",y.style.flexDirection="column",y.style.gap="4px";let a=document.createElement("div");a.className="voc-form-item-top",a.style.display="flex",a.style.alignItems="center",a.style.gap="8px",a.appendChild(f),a.appendChild(E);let b=document.createElement("div");b.className="voc-form-item-description";let g=c.description||c.hint_text||"";g&&(b.textContent=g),y.appendChild(a),y.appendChild(b),e.appendChild(y),k.appendChild(e),a.addEventListener("click",t=>{let n=t.target;n&&n.closest(".voc-form-audio-play")||(f.checked=!0,f.dispatchEvent(new Event("change",{bubbles:!0})))}),k.addEventListener("click",t=>{let n=t.target;n&&n.closest(".voc-form-audio-play")||(f.checked=!0,f.dispatchEvent(new Event("change",{bubbles:!0})))}),u.appendChild(k)}),u}function z(s,L,h){let v=document.createElement("div");v.className="voc-form-table-wrapper";let u=L?.style==="bootstrap",d=document.createElement("input");d.type="hidden",d.name=s.name||s.key,s.key&&(d.id=`voc-form-${s.key}`),v.appendChild(d);let C=document.createElement("table");C.className="voc-form-table",u&&C.classList.add("table","table-bordered");let c=document.createElement("thead"),p=document.createElement("tr"),k=document.createElement("th");k.className="voc-form-table-drag-col",k.textContent="",p.appendChild(k),(s.fields||[]).forEach(n=>{let i=document.createElement("th");i.textContent=n.label||n.key,p.appendChild(i)});let f=document.createElement("th");f.textContent="Actions",p.appendChild(f),c.appendChild(p),C.appendChild(c);let A=document.createElement("tbody");C.appendChild(A),v.appendChild(C);let E=document.createElement("button");E.type="button",E.className="voc-form-table-add",u&&E.classList.add("btn","btn-secondary"),E.textContent="+Add";let e=document.createElement("tfoot"),l=document.createElement("tr"),y=document.createElement("td");y.colSpan=(s.fields?s.fields.length:0)+1,y.appendChild(E),l.appendChild(y),e.appendChild(l),C.appendChild(e),v.appendChild(C);let a=[];function b(){d.value=JSON.stringify(a)}function g(n){let i=[];return s.fields.forEach(r=>{let o=n[r.key];if(r.type==="checkbox"){let x=Array.isArray(o)?o:o?[o]:[];r.required&&x.length===0&&i.push(`${r.label||r.key} is required`);return}r.required&&(o==null||String(o).trim()==="")&&i.push(`${r.label||r.key} is required`),r.type==="email"&&o&&(/^\S+@\S+\.\S+$/.test(String(o))||i.push(`${r.label||r.key} must be a valid email`)),r.type==="number"&&o&&isNaN(Number(o))&&i.push(`${r.label||r.key} must be a number`),r.validation&&r.validation.regex&&o&&(new RegExp(r.validation.regex).test(String(o))||i.push(`${r.label||r.key} invalid format`))}),i}function t(){A.innerHTML="";let n=(i,r)=>{r.draggable=!0,r.addEventListener("mousedown",()=>{r.style.cursor="grabbing"}),r.addEventListener("mouseup",()=>{r.style.cursor="grab"}),r.addEventListener("dragstart",o=>{let x=Number(i.dataset.rowIndex);o.dataTransfer.setData("text/plain",String(x)),i.classList.add("dragging");try{o.dataTransfer?.setDragImage(r,10,10)}catch{}}),r.addEventListener("dragend",()=>{i.classList.remove("dragging"),r.style.cursor="grab"}),i.addEventListener("dragover",o=>{o.preventDefault();let x=o.currentTarget,S=x.getBoundingClientRect(),R=S.top+S.height/2,H=(o.clientY||o.y)>R;x.classList.remove("drag-over-top","drag-over-bottom"),H?(x.classList.add("drag-over-bottom"),x.dataset.dropPosition="after"):(x.classList.add("drag-over-top"),x.dataset.dropPosition="before")}),i.addEventListener("dragleave",o=>{let x=o.currentTarget;x.classList.remove("drag-over-top","drag-over-bottom"),delete x.dataset.dropPosition}),i.addEventListener("drop",o=>{o.preventDefault();let x=o.dataTransfer.getData("text/plain"),S=Number(o.currentTarget.dataset.rowIndex),R=Number(x),H=o.currentTarget.dataset.dropPosition||"before";if(isNaN(R)||isNaN(S))return;let[m]=a.splice(R,1),F=S;R<S&&(F=S-1);let N=H==="after"?F+1:F;a.splice(N,0,m),o.currentTarget.classList.remove("drag-over-top","drag-over-bottom"),delete o.currentTarget.dataset.dropPosition,t(),b()})};a.forEach((i,r)=>{let o=document.createElement("tr");o.dataset.rowIndex=String(r),o.classList.add("voc-form-table-row");let x=document.createElement("td");x.className="voc-form-table-drag-handle";let S=document.createElement("span");S.className="voc-form-drag-handle-icon",S.textContent="\u2630",S.style.cursor="grab",x.appendChild(S),o.appendChild(x),n(o,S),s.fields.forEach(m=>{let F=document.createElement("td"),N,q=(m.type||"text").toLowerCase();if(q==="select"){let w=document.createElement("select");if(w.className="voc-form-table-cell",u&&w.classList.add("form-control"),m.placeholder){let T=document.createElement("option");T.value="",T.textContent=m.placeholder,T.disabled=!0,(i[m.key]===void 0||i[m.key]===null||i[m.key]==="")&&(T.selected=!0),w.appendChild(T)}(m.options||[]).forEach(T=>{let D=document.createElement("option");D.value=T.value,D.textContent=T.label,w.appendChild(D)}),w.value=i[m.key]!==void 0&&i[m.key]!==null?String(i[m.key]):"",m.required&&(w.required=!0),w.addEventListener("change",T=>{a[r][m.key]=T.target.value,b()}),N=w}else if(q==="checkbox"){let w=document.createElement("div");w.className="voc-form-table-checkboxes",u&&w.classList.add("form-check");let B=m.options||[];Array.isArray(a[r][m.key])||(a[r][m.key]=a[r][m.key]?[a[r][m.key]]:[]),B.forEach(T=>{let D=`voc-form-${s.key}-${m.key}-${r}-${T.value}`,$=document.createElement("div");$.className="voc-form-table-checkbox-item",u&&$.classList.add("form-check");let M=document.createElement("input");M.type="checkbox",M.className="voc-form-table-cell",u&&M.classList.add("form-check-input"),M.id=D,M.value=T.value,M.checked=Array.isArray(a[r][m.key])&&a[r][m.key].includes(T.value),M.addEventListener("change",O=>{let J=O.target.checked;Array.isArray(a[r][m.key])||(a[r][m.key]=[]),J?a[r][m.key].includes(T.value)||a[r][m.key].push(T.value):a[r][m.key]=a[r][m.key].filter(K=>K!==T.value),b()});let _=document.createElement("label");_.htmlFor=D,_.className="voc-form-table-checkbox-label",u&&_.classList.add("form-check-label"),_.textContent=T.label,$.appendChild(M),$.appendChild(_),w.appendChild($)}),N=w}else if(q==="radio"){let w=document.createElement("div");w.className="voc-form-table-radios",u&&w.classList.add("form-check");let B=m.options||[];a[r][m.key]===void 0&&(a[r][m.key]=""),B.forEach(T=>{let D=`voc-form-${s.key}-${m.key}-${r}-${T.value}`,$=document.createElement("div");$.className="voc-form-table-radio-item",u&&$.classList.add("form-check");let M=document.createElement("input");M.type="radio",M.className="voc-form-table-cell",u&&M.classList.add("form-check-input"),M.id=D,M.name=`voc-form-${s.key}-${m.key}-${r}`,M.value=T.value,M.checked=a[r][m.key]===T.value,M.addEventListener("change",O=>{O.target.checked&&(a[r][m.key]=O.target.value,b())});let _=document.createElement("label");_.htmlFor=D,_.className="voc-form-table-radio-label",u&&_.classList.add("form-check-label"),_.textContent=T.label,$.appendChild(M),$.appendChild(_),w.appendChild($)}),N=w}else{let w=document.createElement("input");q==="number"?w.type="number":q==="email"?w.type="email":q==="tel"?w.type="tel":q==="url"?w.type="url":q==="date"?w.type="date":w.type="text",w.value=i[m.key]!==void 0&&i[m.key]!==null?String(i[m.key]):"",m.placeholder&&(w.placeholder=m.placeholder),m.required&&(w.required=!0),w.className="voc-form-table-cell",u&&w.classList.add("form-control"),w.addEventListener("input",B=>{a[r][m.key]=B.target.value,b()}),N=w}F.appendChild(N),o.appendChild(F)});let R=document.createElement("td"),H=document.createElement("button");H.type="button",H.className="voc-form-table-remove",u&&H.classList.add("btn","btn-danger"),H.textContent="Remove",H.addEventListener("click",()=>{a.splice(r,1),t(),b()}),R.appendChild(H),o.appendChild(R),A.appendChild(o)})}return E.addEventListener("click",()=>{if(s.validation?.max_rows!==void 0&&a.length>=s.validation.max_rows)return;let n={};s.fields.forEach(i=>n[i.key]=""),a.push(n),t(),b()}),Array.isArray(h)&&h.length?a=h.map(n=>({...n})):s.default&&Array.isArray(s.default)&&(a=s.default.map(n=>({...n}))),t(),b(),v.validate=function(){let n=[];return a.forEach((i,r)=>{let o=g(i);o.length&&n.push(`Row ${r+1}: ${o.join("; ")}`)}),s.validation?.min_rows!==void 0&&a.length<s.validation.min_rows&&n.push(`At least ${s.validation.min_rows} rows required`),s.validation?.max_rows!==void 0&&a.length>s.validation.max_rows&&n.push(`No more than ${s.validation.max_rows} rows allowed`),s.validation?.unique_fields&&s.validation.unique_fields.length&&s.validation.unique_fields.forEach(i=>{let r=new Set;a.forEach((o,x)=>{let S=o[i];S!=null&&(r.has(S)&&n.push(`Field ${i} must be unique (duplicate at row ${x+1})`),r.add(S))})}),n},v}async function Y(s){let h=new TextEncoder().encode(s),v=await crypto.subtle.digest("SHA-256",h);return Array.from(new Uint8Array(v)).map(d=>d.toString(16).padStart(2,"0")).join("")}async function Q(s){let L=String(s||"").trim().toLowerCase();return L?`https://gravatar.com/avatar/${await Y(L)}?d=mp`:""}function G(s,L,h){let v=L?.style==="bootstrap",u=document.createElement("div");u.className="voc-form-users";let d=document.createElement("div");if(d.className="voc-form-users-header",v&&d.classList.add("mb-2"),s.label){let e=document.createElement("div");if(e.className="voc-form-users-label",v&&e.classList.add("form-label"),e.textContent=s.label,s.required){let l=document.createElement("span");l.className="voc-form-required",l.textContent="*",e.appendChild(l)}d.appendChild(e)}if(s.description){let e=document.createElement("div");e.className="voc-form-users-description",v&&e.classList.add("form-text"),e.textContent=s.description,d.appendChild(e)}u.appendChild(d);let C=document.createElement("div");C.className="voc-form-users-search-wrapper";let c=document.createElement("input");if(c.type="search",c.placeholder="Search users...",c.className="voc-form-users-search",v&&c.classList.add("form-control","mb-2"),C.appendChild(c),u.appendChild(C),!s.options||s.options.length===0)return u;let p=document.createElement("div");p.className="voc-form-users-list",v&&p.classList.add("list-group");let k=s.name||s.key||`users_${Math.random().toString(36).substr(2,6)}`,f=[];if(Array.isArray(h)?f=h:h!=null?f=[h]:Array.isArray(s.default)&&(f=s.default),s.options.forEach((e,l)=>{let y=document.createElement("div");y.className="voc-form-user-item",y.dataset.label=String(e.label||"").toLowerCase(),y.dataset.email=String(e.email||"").toLowerCase(),y.dataset.value=String(e.value||"").toLowerCase(),v&&y.classList.add("d-flex","align-items-center","gap-2");let a=document.createElement("input");if(a.type="checkbox",a.name=`${k}[]`,a.value=e.value,a.className="voc-form-user-checkbox",s.key&&(a.id=`voc-form-${s.key}-${l}`),a.style.position="absolute",a.style.width="1px",a.style.height="1px",a.style.margin="0",a.style.padding="0",a.style.clip="rect(0 0 0 0)",a.style.clipPath="inset(50%)",a.style.overflow="hidden",a.style.border="0",f&&Array.isArray(f)){let i=f.map(r=>String(r));a.checked=i.includes(String(e.value))}let b=document.createElement("img");b.className="voc-form-user-avatar",b.alt=e.label||String(e.value||"user"),b.style.width=b.style.height="40px",b.style.objectFit="cover",b.style.borderRadius="50%",b.src="",e.email&&Q(e.email).then(i=>{i&&(b.src=i)}).catch(()=>{});let g=document.createElement("div");g.className="voc-form-user-info",g.style.display="flex",g.style.flexDirection="column",g.style.gap="2px";let t=document.createElement("div");t.className="voc-form-user-label",t.textContent=e.label||String(e.value);let n=document.createElement("small");n.className="voc-form-user-email",n.textContent=e.email||"",g.appendChild(t),g.appendChild(n),y.addEventListener("click",i=>{let r=i.target;r&&(r.closest("input")||r.closest("a")||r.closest("button"))||(a.checked=!a.checked,a.dispatchEvent(new Event("change",{bubbles:!0})))}),a.addEventListener("change",()=>{a.checked?y.classList.add("selected"):y.classList.remove("selected")}),a.checked&&y.classList.add("selected"),y.appendChild(a),y.appendChild(b),y.appendChild(g),p.appendChild(y)}),u.appendChild(p),s.required){let e=p.querySelectorAll('input[type="checkbox"]'),l=()=>{let y=Array.from(e).some(a=>a.checked);return e.forEach(a=>{y?a.setCustomValidity(""):a.setCustomValidity("At least one option must be selected.")}),y};e.forEach(y=>{y.addEventListener("change",l)}),u._validateCheckboxGroup=l,l()}let A=Array.from(p.querySelectorAll(".voc-form-user-item")),E=()=>{let e=String(c.value||"").trim().toLowerCase();if(!e){A.forEach(l=>l.style.setProperty("display","flex","important"));return}A.forEach(l=>{let y=l.dataset.label||"",a=l.dataset.email||"",b=l.dataset.value||"",g=y.includes(e)||a.includes(e)||b.includes(e);l.style.setProperty("display",g?"flex":"none","important")})};return c.addEventListener("input",E),u}function I(s,L=!0){let h=new FormData(s);if(L)return X(h);let v={};return h.forEach((u,d)=>{let C=(u instanceof File,u);Object.prototype.hasOwnProperty.call(v,d)?Array.isArray(v[d])?v[d].push(C):v[d]=[v[d],C]:v[d]=C}),v}function X(s){let L=new FormData;for(let[h,v]of s.entries()){if(v instanceof File){L.append(h,v);continue}let u;try{u=JSON.parse(v)}catch{u=null}Array.isArray(u)?u.length===0?L.append(h,"[]"):u.every(d=>typeof d=="object"&&d!==null)?u.forEach((d,C)=>{for(let[c,p]of Object.entries(d))L.append(`${h}[${C}][${c}]`,p)}):L.append(h,v):L.append(h,v)}return L}async function V(s,L,h){let v=L.url,u={"Content-Type":"application/json"};L?.api_token&&(u.Authorization=`Bearer ${L.api_token}`);let d=I(s);if(L?.additional_data)for(let[p,k]of Object.entries(L.additional_data))d.append(p,k);let C,c=d instanceof FormData;C={method:"POST",headers:{Authorization:`Bearer ${L.api_token}`,...c?{}:{"Content-Type":"application/json"},Accept:"application/json"},body:c?d:JSON.stringify(Object.fromEntries(d.entries()))};try{fetch(v,C).then(async p=>{let k=p.headers.get("content-type");if(!p.ok)try{let A=(await p.json())?.message;throw new Error(A??"Their was an error submitting the form. Check your form and try again.")}catch(f){throw new Error(f.message)}return k&&k.includes("application/json")?p.json():p.text()}).then(p=>{h&&h(p,null)}).catch(p=>{h&&h(null,p)})}catch(p){h&&h(null,p)}}function U(s,L,h){let v=[];if(typeof s=="string"?v=Array.from(document.querySelectorAll(s)):v=[s],v.length===0)return null;function u(){let c=h?.style==="bootstrap",p=document.createElement("form");p.classList.add("voc-form"),c&&p.classList.add("needs-validation"),p.id=L.id;let k=document.createElement("h2");k.className="voc-form-title",c&&k.classList.add("mb-3"),k.textContent=L.form_name,p.appendChild(k);function f(e,l){l&&(l.min_length!==void 0&&(e.minLength=l.min_length),l.max_length!==void 0&&(e.maxLength=l.max_length),l.regex&&(e instanceof HTMLInputElement?e.pattern=l.regex:e.dataset.pattern=l.regex))}function A(e){if(!e.key&&!e.label)return null;let l=L.default_values||{},y=e.name||e.key,a=y?l[y]:void 0,b=document.createElement("div");if(b.className="voc-form-group",c&&b.classList.add("mb-3"),e.label&&e.type!=="users"){let t=document.createElement("label");if(t.classList.add("voc-form-label"),c&&t.classList.add("form-label"),e.key?e.type==="radio"?t.htmlFor="":t.htmlFor=`voc-form-${e.key}`:t.htmlFor="",t.textContent=e.label,e.required){let n=document.createElement("span");n.className="voc-form-required",n.textContent="*",t.appendChild(n)}b.appendChild(t)}let g=null;switch(e.type){case"checkbox":{let t=document.createElement("div");if(t.className="voc-form-checkbox-group "+(e.direction||"vertical"),e.width&&(t.style.width=e.width),e.options){if(e.options.forEach((n,i)=>{let r=document.createElement("label");r.classList.add("voc-form-checkbox-label"),c&&r.classList.add("form-check"),r.style.display=e.direction==="horizontal"?"inline-block":"block",e.width&&(r.style.width=e.width);let o=document.createElement("input");o.type="checkbox",o.classList.add("voc-form-checkbox"),c&&o.classList.add("form-check-input"),o.name=`${e.name||e.key||""}[]`,o.value=n.value,e.key&&(o.id=`voc-form-${e.key}-${i}`),Array.isArray(a)?a.includes(n.value)&&(o.checked=!0):a!==void 0?a===n.value&&(o.checked=!0):e.default===n.value&&(o.checked=!0),r.appendChild(o),r.appendChild(document.createTextNode(n.label)),t.appendChild(r)}),e.required){let n=t.querySelectorAll('input[type="checkbox"]'),i=()=>{let r=Array.from(n).some(o=>o.checked);return n.forEach(o=>{r?o.setCustomValidity(""):o.setCustomValidity("At least one option must be selected.")}),r};n.forEach(r=>{r.addEventListener("change",i)}),t._validateCheckboxGroup=i,i()}}else{let n=document.createElement("label");n.classList.add("voc-form-checkbox-label"),c&&n.classList.add("form-check"),e.width&&(n.style.width=e.width);let i=document.createElement("input");i.type="checkbox",i.classList.add("voc-form-checkbox"),(e.key||e.name)&&(i.name=e.name||e.key,e.key&&(i.id=`voc-form-${e.key}`)),c&&i.classList.add("form-check-input"),e.required&&(i.required=!0),a!==void 0?i.checked=!!a:e.default&&(i.checked=!!e.default),n.appendChild(i),n.appendChild(document.createTextNode(e.label||"")),t.appendChild(n)}g=t;break}case"textarea":{let t=document.createElement("textarea");t.classList.add("voc-form-textarea"),c&&t.classList.add("form-control"),(e.key||e.name)&&(t.name=e.name||e.key,e.key&&(t.id=`voc-form-${e.key}`)),e.placeholder&&(t.placeholder=e.placeholder),a!=null?t.value=String(a):e.default!==void 0&&e.default!==null&&(t.value=String(e.default));let n=e.default||a||"";if(n){let i=(n.match(/\n/g)||[]).length,r=80,o=n.split(`
|
|
2
|
+
`).reduce((R,H)=>Math.max(R,H.length),0),x=Math.ceil(o/r)||1,S=Math.max(2,i+x);t.rows=S,t.style.resize="vertical"}e.width&&(t.style.width=e.width),e.required&&(t.required=!0),f(t,e.validation),g=t;break}case"select":{let t=document.createElement("select");if(t.classList.add("voc-form-select"),c&&t.classList.add("form-select"),c&&t.classList.add("form-control"),(e.key||e.name)&&(t.name=e.name||e.key,e.key&&(t.id=`voc-form-${e.key}`)),e.placeholder){let n=document.createElement("option");n.value="",n.textContent=e.placeholder,n.disabled=!0,n.selected=!0,t.appendChild(n)}e.required&&(t.required=!0),e.options&&e.options.forEach(n=>{let i=document.createElement("option");i.value=n.value,i.textContent=n.label,Array.isArray(a)?a.includes(n.value)&&(i.selected=!0):a!==void 0?a===n.value&&(i.selected=!0):e.default===n.value&&(i.selected=!0),t.appendChild(i)}),e.width&&(t.style.width=e.width),g=t;break}case"radio":{let t=document.createElement("div");t.className="voc-form-radio-group "+(e.direction||"vertical"),e.width&&(t.style.width=e.width),e.options&&e.options.forEach((n,i)=>{let r=document.createElement("label");r.classList.add("voc-form-radio-label"),c&&r.classList.add("form-check"),r.style.display=e.direction==="horizontal"?"inline-block":"block",e.width&&(r.style.width=e.width);let o=document.createElement("input");o.type="radio",o.classList.add("voc-form-radio"),c&&o.classList.add("form-check-input"),o.name=e.name||e.key||"",o.value=n.value,e.key&&(o.id=`voc-form-${e.key}-${i}`),Array.isArray(a)?a.includes(n.value)&&(o.checked=!0):a!==void 0?a===n.value&&(o.checked=!0):e.default===n.value&&(o.checked=!0),r.appendChild(o),r.appendChild(document.createTextNode(n.label)),t.appendChild(r)}),g=t;break}case"file":{let t=document.createElement("div");t.className="voc-form-file-wrapper",e.width&&(t.style.width=e.width);let n=document.createElement("input");n.type="file",n.classList.add("voc-form-file"),c&&n.classList.add("form-control"),(e.key||e.name)&&(n.name=e.name||e.key,e.key&&(n.id=`voc-form-${e.key}`)),e.width&&(n.style.width=e.width),e.required&&(n.required=!0),e.accept&&(n.accept=e.accept),e.multiple&&(n.multiple=!0),t.appendChild(n),g=t;break}case"avatar":{g=j(e,h||{},a);break}case"table":{g=z(e,h||{},a);break}case"users":{g=G(e,h||{},a);break}case"audio_select":{g=W(e,h||{},a);break}default:{let t=document.createElement("input");t.type=e.type||"text",t.classList.add("voc-form-input"),c&&t.classList.add("form-control"),(e.key||e.name)&&(t.name=e.name||e.key,e.key&&(t.id=`voc-form-${e.key}`)),e.placeholder&&(t.placeholder=e.placeholder),a!=null?t.value=String(a):e.default!==void 0&&e.default!==null&&(t.value=String(e.default)),e.width&&(t.style.width=e.width),e.required&&(t.required=!0),f(t,e.validation),g=t;break}}if(g&&b.appendChild(g),e.hint_text){let t=document.createElement("small");t.className="voc-form-hint",t.textContent=e.hint_text,b.appendChild(t)}return b}L.fields.forEach(e=>{if(e.type==="group"&&"items"in e){let l=e;if(c){let y=document.createElement("div");y.className="card voc-form-group-card mb-3";let a=l.label||l.header?.title,b=l.description||l.header?.description;if(a||b){let t=document.createElement("div");if(t.className="card-header voc-form-group-head",a){let n=document.createElement("h5");n.className="mb-0 voc-form-group-label",n.textContent=a,t.appendChild(n)}if(b){let n=document.createElement("p");n.className="mb-0 voc-form-group-description",n.textContent=b,t.appendChild(n)}y.appendChild(t)}let g=document.createElement("div");g.className="card-body voc-form-group-body",l.items.forEach(t=>{if(t.type==="row"&&"items"in t){let n=t,i=document.createElement("div");if(i.className="voc-form-group voc-form-row mb-3",n.label){let o=document.createElement("h6");o.className="voc-form-row-label",o.textContent=n.label,i.appendChild(o)}let r=document.createElement("div");r.className="voc-form-row-items "+(n.direction||"horizontal"),n.items.forEach(o=>{let x=A(o);x&&r.appendChild(x)}),i.appendChild(r),g.appendChild(i)}else{let n=A(t);n&&g.appendChild(n)}}),y.appendChild(g),p.appendChild(y)}else{let y=document.createElement("div");y.className="voc-form-group voc-form-group-wrapper",c&&y.classList.add("mb-3");let a=l.label||l.header?.title,b=l.description||l.header?.description;if(a||b){let g=document.createElement("div");if(g.className="voc-form-group-head",a){let t=document.createElement("h3");t.className="voc-form-group-label",t.textContent=a,g.appendChild(t)}if(b){let t=document.createElement("p");t.className="voc-form-group-description",t.textContent=b,g.appendChild(t)}y.appendChild(g)}l.items.forEach(g=>{if(g.type==="row"&&"items"in g){let t=g,n=document.createElement("div");if(n.className="voc-form-group voc-form-row",c&&n.classList.add("mb-3"),t.label){let r=document.createElement("h4");r.className="voc-form-row-label",r.textContent=t.label,n.appendChild(r)}let i=document.createElement("div");i.className="voc-form-row-items "+(t.direction||"horizontal"),t.items.forEach(r=>{let o=A(r);o&&i.appendChild(o)}),n.appendChild(i),y.appendChild(n)}else{let t=A(g);t&&y.appendChild(t)}}),p.appendChild(y)}return}if(e.type==="row"&&"items"in e){let l=document.createElement("div");if(l.className="voc-form-group voc-form-row",c&&l.classList.add("mb-3"),e.label){let a=document.createElement("h3");a.className="voc-form-row-label",a.textContent=e.label,l.appendChild(a)}if(e.description){let a=document.createElement("p");a.className="voc-form-row-description",a.textContent=e.description,l.appendChild(a)}let y=document.createElement("div");y.className="voc-form-row-items "+(e.direction||"horizontal"),l.appendChild(y),e.items.forEach(a=>{let b=A(a);b&&y.appendChild(b)}),p.appendChild(l)}else{let l=A(e);l&&p.appendChild(l)}});let E=document.createElement("button");return E.type="submit",E.className="voc-form-submit",E.textContent="Submit",c&&E.classList.add("btn","btn-primary"),p.appendChild(E),p}let d=u();v[0].appendChild(d);let C=L?.submit_config??h?.submit_config??null;return C&&d.addEventListener("submit",c=>{c.preventDefault();let p=Array.from(d.querySelectorAll(".voc-form-checkbox-group, .voc-form-users")),k=[];if(p.forEach(E=>{E&&typeof E._validateCheckboxGroup=="function"&&(E._validateCheckboxGroup()||E.querySelector('input[type="checkbox"]')&&k.push("Please select at least one option"))}),!d.checkValidity()){d.reportValidity(),h?.onSubmitResult&&h.onSubmitResult(null,new Error("Form validation failed"));return}let f=Array.from(d.querySelectorAll(" .voc-form-table-wrapper, .voc-form-table-wrapper")),A=[];if(f.forEach(E=>{if(E&&typeof E.validate=="function"){let e=E.validate();e&&e.length&&A.push(...e)}}),A.length){h?.onSubmitResult&&h.onSubmitResult(null,new Error(A.join("; ")));let E=f[0];E&&E.scrollIntoView({behavior:"smooth",block:"center"});return}if(h?.onSubmit){let E=I(d);h.onSubmit(E)}V(d,C,(E,e)=>{h?.onSubmitResult&&h.onSubmitResult(E,e)})}),{element:d,validate:()=>{let c=[];return d.querySelectorAll(":invalid").forEach(k=>{let f=k.validationMessage;c.push({element:k,message:f})}),c},getValues:()=>I(d),onSubmit:c=>{d.addEventListener("submit",p=>{p.preventDefault();let k=I(d);c(k,p)})}}}var P={renderForm:U};var ye=P,ve={FormsLib:P};export{ye as FormsLib,ve as default};
|