diff --git a/dist/SmarkForm.esm.js b/dist/SmarkForm.esm.js index a153493..e9ad4e5 100644 --- a/dist/SmarkForm.esm.js +++ b/dist/SmarkForm.esm.js @@ -1 +1 @@ -function t(t,e,n){if("function"==typeof t?t===e:t.has(e))return arguments.length<3?e:n;throw new TypeError("Private element is not present on this object")}function e(t){if(Object(t)!==t)throw TypeError("right-hand side of 'in' should be an object, got "+(null!==t?typeof t:"null"));return t}function n(t,e){(function(t,e){if(e.has(t))throw new TypeError("Cannot initialize the same private elements twice on an object")})(t,e),e.add(t)}function r(t,e,n){return(e=l(e))in t?Object.defineProperty(t,e,{value:n,enumerable:!0,configurable:!0,writable:!0}):t[e]=n,t}function o(t,e){var n=Object.keys(t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(t);e&&(r=r.filter(function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable})),n.push.apply(n,r)}return n}function i(t){for(var e=1;e=0;E--){var _;void 0!==(v=r(w[E],o,g,u,l,c,d,m,p))&&(i(l,v),0===l?_=v:1===l?(_=v.init,N=v.get||m.get,b=v.set||m.set,m={get:N,set:b}):m=v,void 0!==_&&(void 0===f?f=_:"function"==typeof f?f=[f,_]:f.push(_)))}if(0===l||1===l){if(void 0===f)f=function(t,e){return e};else if("function"!=typeof f){var x=f;f=function(t,e){for(var n=e,r=0;r3,N=m>=5,b=r;if(N?(f=t,0!=(m-=5)&&(h=i=i||[]),v&&!a&&(a=function(n){return e(n)===t}),b=a):(f=t.prototype,0!==m&&(h=o=o||[])),0!==m&&!v){var w=N?d:l,E=w.get(y)||0;if(!0===E||3===E&&4!==m||4===E&&3!==m)throw Error("Attempted to decorate a public method/accessor that has the same name as a previously decorated public method/accessor. This is not currently supported by the decorators plugin. Property name was: "+y);!E&&m>2?w.set(y,m):w.set(y,!0)}c(s,f,g,y,m,N,v,h,b)}}return u(s,o),u(s,i),s}function u(t,e){e&&t.push(function(t){for(var n=0;n0){for(var r=[],o=e,a=e.name,s=n.length-1;s>=0;s--){var l={v:!1};try{var c=n[s](o,{kind:"class",name:a,addInitializer:t(r,l)})}finally{l.v=!0}void 0!==c&&(i(10,c),o=c)}return[o,function(){for(var t=0;tnull===t:e=>null===e||e.isSameNode(t);return[...t.querySelectorAll(e)].filter(t=>n(t.parentNode.closest(e)))}function u(t,e){let n=t.parentNode;const r=e>=0?1:-1;for(;n;){if(n.scrollHeight>n.clientHeight*r){var o=n.scrollHeight-n.clientHeight*r;if(e<=o*r)return void(n.scrollTop+=e);n.scrollTop=o,e-=o}n=n.parentNode}}function p(){return Math.random().toString(36).substring(2)}function g(t){try{return JSON.parse(t)}catch(t){}}const f=Symbol("Events"),h=Symbol("allEvents"),m=/^on(?:Before|After)Action_/,y=/^onLocal_/,v=/^onAll_/,N=["keydown","keyup","keypress","beforeinput","input","change","focus","blur","click","dblclick","contextmenu","mousedown","mouseup","mousemove","mouseenter","mouseleave","mouseover","mouseout","focusin","focusout"];function b(t,e,n){return t.has(e)||t.set(e,[]),t.get(e).push(n.bind(this)),this}var w={disEnhance(t){t.targetNode.tagName.toLowerCase()&&t.targetNode.addEventListener("submit",function(t){t.preventDefault()})}};const E=["property_name"];var _;let x;const T={},A=Symbol("smart_component"),k=/^[a-z0-9_]+$/i,I=/[\*\?]/,S=class extends Error{constructor(t,e,n){super("RenderError(".concat(n,"): ").concat(e)),this.code=t,this.path=n,this.stack=this.stack.split("\n").slice(2).join("\n")}};let O;_=class{constructor(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},{property_name:n="smark"}=e,r=a(e,E),o=arguments.length>2?arguments[2]:void 0;const i=this;if(i.validName=function(){let t=0;return function(){if(i.parent.isSingleton)return"";for(var e=arguments.length,n=new Array(e),r=0;rt.replace(/\//g,"_"):"string"==typeof s?t=>s+t.replace(/\//g,"_"):"function"==typeof s&&s),i.onRenderedTasks=[],i.renderedSync=!1,i.rendered=new Promise(t=>l=t),i.children={},i.targetNode[A]=i,(async()=>{await i.render();for(const t of i.onRenderedTasks)await t();i.onRenderedTasks=null,l(!0),setTimeout(()=>i.renderedSync=!0,1),await i.emit("afterRender",{context:i},!1)})(),i.options.onRendered&&i.onRendered(i.options.onRendered)}async unrender(){const t=this;await t.emit("beforeUnrender",{context:t},!1),t.targetNode.remove()}onRendered(t){const e=this;e.onRenderedTasks?e.onRenderedTasks.push(t.bind(e)):t.bind(e)()}getNodeOptions(t,e){const n=this,r=(t.dataset[n.property_name]||"").trim()||null,o=i(i({},e),(()=>{try{const t=JSON.parse(r);if("object"!=typeof t)throw new Error("NO_OBJECT");return t}catch(t){return r.match(k)?{type:r}:{}}})());return o.action||o.type||(o.type=function(t,e){switch(t.tagName.toLowerCase()){case"ul":case"ol":case"table":case"thead":case"tbody":case"tfoot":return"list";case"input":const n=String(t.getAttribute("type")||"").toLowerCase();if(e.isSingleton)return e.options.type;switch(n){case"number":case"date":case"time":case"datetime-local":case"radio":case"color":return n}case"textarea":case"select":return"input";case"label":return"label";default:return"form"}}(t,n)),n.setNodeOptions(t,o),o}setNodeOptions(t,e){t.dataset[this.property_name]=JSON.stringify(e)}async enhance(t,e){const n=this;let r=n.getNodeOptions(t,e);if(w.disEnhance(n),r.action){if(r.type||(r.type="trigger"),"trigger"!=r.type)throw n.renderError("ACTION_IN_NON_TRIGGER",'"action" property is only allowed for "trigger" components but "'.concat(r.type,'" type specified.'))}else if("string"!=typeof r.type)throw n.renderError("NO_TYPE_PROVIDED","Invalid SmarkForm item: type is mandatory for non trigger components.");const o=n.types[r.type];if(!o)throw n.renderError("UNKNOWN_TYPE","Unimplemented SmarkForm component controller: ".concat(r.type));return new o(t,r,n)}getComponent(t){var e;return t[A]||(null===(e=t.parentElement)||void 0===e?void 0:e.closest(this.selector)[A])||null}getPath(){const t=this,e=[...t.parents].map(t=>t.name).reverse();return t.name&&e.push(t.name),e.join("/")||"/"}find(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"";let e=this;for(;!e.name&&null!==e.parent;)e=e.parent;if(t=String(t),"/"==t[0])for(;e.parent;)e=e.parent;const n=t.split("/").filter(t=>t),r=n.findIndex(t=>t.match(I));if(r>=0){const t=(o=n[r],new RegExp("^"+o.replace(/\*+/g,".*").replace(/\?/g,".")+"$")),i=n.slice(0,r).join("/"),a=n.slice(r+1).join("/"),s=e.find(i);return Object.entries(s.children).filter(e=>{let[n,r]=e;return r&&n.match(t)}).map(t=>{let[,e]=t;return e.find(a)}).flat(1/0)}var o;return n.reduce((t,e)=>{if(void 0!==t){if(".."==e)return t.parent;if("."!=e[0])return t.children[e];{if("."==e)return t;if(!t.parent)return;const n=parseInt(e.slice(1));if(isNaN(n))return;if("list"!=t.parent.options.type){const e=Object.keys(t.parent.children),r=e.findIndex(e=>e==t.name),o=e[r+n];return t.parent.children[o]}{const e=parseInt(t.name)+n;if(!isNaN(e))return t.parent.children[e]}}}},e)}inheritedOption(t,e){const n=this;for(const e of[n,...n.parents])if(void 0!==e.options[t])return e.options[t];return e}moveTo(){const t=this;t.targetNode.id||(t.targetNode.id=t.getPath()),document.location.hash=t.targetNode.id,window.history.pushState({},void 0,window.location.pathname)}getTriggers(){const t=this,e=[],n=new Set([arguments.length>0&&void 0!==arguments[0]?arguments[0]:""].flat().map(String).filter(t=>t)),r=n.has("*");for(const o of[t,...t.root.targetNode.querySelectorAll(t.selector)].map(t=>t[A]).filter(t=>t)){const i=o.getTriggerArgs();i&&((Object.is(i.context,t)||Object.is(o,t))&&(r||n.has(i.action))&&e.push(o))}return e}updateId(){const t=this;if(!1===t.genId)return;const e=t.genId(t.getPath());if(t.targetNode.id!=e){t.targetNode.id=e;for(const e of Object.values(t.children))e.updateId()}return t.targetNode.id}focus(){const t=this;for(const e in t.children)return t.children[e].focus();t.targetFieldNode?t.targetFieldNode.focus():t.targetNode.focus()}getTriggerArgs(){}renderError(t,e){var n;const r=this,o=null!==(n=r.parent)&&void 0!==n&&n.isSingleton?r.parent.targetNode:r.targetNode,i=new S(t,e,r.getPath());return function(t,e){const n=document.createElement("div");n.setAttribute("title",e.message),n.setAttribute("style","display: inline-block; padding: .5em 1em; background: red; color: yellow; border-radius: 50% 0%"),n.appendChild(document.createTextNode(e.code));const r=document.createElement("span");r.setAttribute("title","Log the error again"),r.setAttribute("style","cursor: pointer; font-weight: bold; background-color: white; color: red; border-radius: 50%; padding: 0 4px; margin-left: 8px;"),r.textContent="↧",r.addEventListener("click",()=>{console.error(e)}),n.appendChild(r),t.replaceWith(n)}(o,i),i}},[O,x]=c(_,[],[function(t,e){let{kind:n}=e;if("class"==n)return class extends t{constructor(t,e){const n={},r=[];for(const[t,o]of Object.entries(e))t.match(m)?r.push([t.substring(2),o,"onLocal"]):t.match(y)?r.push([t.substring(8),o,"onLocal"]):t.match(v)?r.push([t.substring(6),o,"onAll"]):n[t]=o;for(var o=arguments.length,i=new Array(o>2?o-2:0),a=2;a(e in t||(t[e]=[]),t[e])})}}),e._dynamic}(super.eventHooks),Object.is(s,s.root))for(const t of N)s.targetNode.addEventListener(t,e=>{const n=s.getComponent(e.target),r={type:t,originalEvent:e,context:n,preventDefault:e.preventDefault.bind(e),stopPropagation:e.stopPropagation.bind(e),stopImmediatePropagation:e.stopImmediatePropagation.bind(e)};n.emit(t,r)},!0);for(const[t,e,n]of r)s[n](t,e)}async emit(t,e){let n=!(arguments.length>2&&void 0!==arguments[2])||arguments[2];const r=this;let o=!1,a=!1;const s=i(i({},e),{},{type:t,defaultPrevented:!1});n&&(s.preventDefault=()=>s.defaultPrevented=!0,s.stopPropagation=()=>o=!0,s.stopImmediatePropagation=()=>a=!0);const l=[...r[f].get(t)||[],...r[h].get(t)||[]];for(const t of l){if(a)break;await t(e)}for(const n of r.parents){if(o)break;const r=n[h].get(t)||[];for(const t of r){if(a)break;await t(e)}}for(const n of r.eventHooks[t])await n(e);return!s.defaultPrevented}}}]).c,x();class L extends O{constructor(){if(super(...arguments),this._isField=!0,!Object.is(this,this.root)&&(this.name=this.validName(this.options.name,this.targetNode.getAttribute("name")),this.options.hasOwnProperty("value"))){if(null!==this.targetNode.getAttribute("value"))throw me.renderError("VALUE_CONFLICT",'Initial value specied both as "value" option and HTML "value" attribute.');this.targetFieldNode?this.targetNode.setAttribute("value",this.options.value):this.onRendered(()=>{this.import(this.options.value)})}}}function P(t,e){if(void 0!==T[t])throw new Error("Duplicate component type definition: ".concat(t));if(!(e.prototype instanceof O))throw new Error("Bad component type implementation for: ".concat(t));T[t]=e}class j{constructor(t){const e=this;e.form=t,e.revealed=null;const n=j.onStatusChange.bind(e);e.form.targetNode.addEventListener("keydown",n,!0),e.form.targetNode.addEventListener("keyup",n,!0),e.form.targetNode.addEventListener("focusout",n,!0),e.form.targetNode.addEventListener("focusin",n,!0)}static onStatusChange(t){const e=this;if("keyup"==t.type){if("Control"==t.key)return void e.reveal(!1);if("Alt"!=t.key)return}if("focusout"==t.type)return void(null!==e.revealed&&e.reveal());if("focusin"==t.type&&null===e.revealed)return;const n=t.ctrlKey||"Control"==t.key,r=t.altKey&&"keyup"!=t.type||"Alt"==t.key&&"keydown"==t.type;if(n&&("Control"==t.key||"Alt"==t.key)||"focusin"==t.type){const n=r?2:1;return void e.reveal(t.target,n)}if(e.revealed instanceof Array){const n=e.revealed.find(e=>e.options.hotkey==t.key);n&&(t.preventDefault(),t.stopPropagation(),n.targetNode.disabled||n.targetNode.click())}}reveal(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:1;const n=this;if(null!==n.revealed){for(const t of n.revealed)t.targetNode.removeAttribute("data-hotkey");n.revealed.length=0}if(!1===t&&(n.revealed=null),t){const r=n.form.getComponent(t),o=function(t){const e=[t,...t.parents];return[...e,...e.map(C).flat()]}(r),i=o.map((t,e)=>{const n=[];for(const r of t.getTriggers("*")){const t=String(r.options.hotkey||"");if(""==t)continue;const o=r.getTriggerArgs()||{};n.push({tg:r,distance:e,args:o,hotkey:t})}return n}).flat().sort((t,e)=>{var n,o;const i=null===(n=t.args.target)||void 0===n?void 0:n.targetNode,a=null===(o=e.args.target)||void 0===o?void 0:o.targetNode,s=a?.5*a.contains(r.targetNode):0,l=i?.5*i.contains(r.targetNode):0;return+t.distance-e.distance+s-l}),a=new Map;n.revealed=[];for(const r of i){const[o,i]=a.get(r.hotkey)||[1,0];oe||(Object.is(r.tg.targetNode,t)||r.distance>i)&&(r.tg.targetNode.disabled||r.tg.targetNode.setAttribute("data-hotkey",r.hotkey),n.revealed.push(r.tg),a.set(r.hotkey,[o+1,r.distance]))}}}}function C(t){var e;const n=(null===(e=t.parent)||void 0===e?void 0:e.children)||[],r=Object.keys(n).findIndex(e=>e===t.name),o=Object.values(n),i=o.slice(0,r).reverse();return[...o.slice(r+1),...i]}const D=["action","context","target"],F=function(t,e){let{kind:n,name:r,addInitializer:o}=e;"method"==n&&o(function(){const e=this;this.actions[r]=async function(n){let o=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},i=!1;if(o.data=n,o.silent||(i=!await e.emit("BeforeAction_".concat(r),o),n=o.data),!i)return n=await t.call(e,n,o),o.data=n,o.silent||e.emit("AfterAction_".concat(r),o),n}})};class R extends O{constructor(t,e){delete e.name;for(var n=arguments.length,r=new Array(n>2?n-2:0),o=2;o{var e;const n=t.getTriggerArgs();"function"==typeof(null===(e=n.context)||void 0===e?void 0:e.onTriggerRender)&&n.context.onTriggerRender(n)})}disable(){this.targetNode.disabled=!0}enable(){this.targetNode.disabled=!1}getTriggerArgs(){const t=this,e=[t,...t.parents],n=t.options,{action:r,context:o,target:s}=n,l=a(n,D);if(!r)return;const c=o?t.parent.find(o):e.find(t=>"function"==typeof t.actions[r]),d=s?null==c?void 0:c.find(s):o?null:e.slice(1).find(t=>{var e;return null===(e=t.parent)||void 0===e?void 0:e.targetNode.isSameNode(null==c?void 0:c.targetNode)})||null;return i({action:r,origin:t,context:c,target:d},l)}}async function M(t){const e=this.getComponent(t.target).getTriggerArgs();if(!e)return;const{context:n,action:r,data:o}=e,i=null==n?void 0:n.actions[r];if("function"!=typeof i)throw this.renderError("UNKNOWN_ACTION","Unknown action ".concat(r)+(n?" for ".concat(n.options.type):""));return await i(o,e)}const U=["allow_select"],H=["context","target"];class B extends O{constructor(t,e){let{allow_select:n=!1}=e,r=a(e,U);delete r.name;for(var o=arguments.length,s=new Array(o>2?o-2:0),l=2;l{const t=this;t.nodeType=String(t.targetNode.tagName).toLowerCase();const e=t.getLabelArgs().target||{};if(await e.rendered,e.targetFieldNode&&(e.targetFieldNode.id||(e.targetFieldNode.id=p()),t.targetNode.setAttribute("for",e.targetFieldNode.id)),"label"!=t.nodeType){t.targetNode.id||(t.targetNode.id=p());const n=(e.targetNode.getAttribute("aria-labelledby")||"").split(" ").filter(t=>t);0>n.indexOf(t.targetNode.id)&&n.push(t.targetNode.id),e.targetNode.setAttribute("aria-labelledby",n.join(" "))}else if(!e.targetFieldNode)throw t.renderError("LABEL_FOR_NONFIELD","Native