@node-projects/web-component-designer-visualization-addons 1.1.3 → 1.1.4
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.
|
@@ -840,7 +840,7 @@ export class BindingsHelper {
|
|
|
840
840
|
return bindResolvedSource(source, index);
|
|
841
841
|
const prefix = source[0];
|
|
842
842
|
if ((prefix !== '?' && prefix !== '#') || source[1] === prefix)
|
|
843
|
-
return bindResolvedSource(source[1] === prefix ? source.substring(1) : source, index);
|
|
843
|
+
return bindResolvedSource((prefix === '?' || prefix === '#') && source[1] === prefix ? source.substring(1) : source, index);
|
|
844
844
|
const owner = prefix === '?' ? root : element;
|
|
845
845
|
if (!owner)
|
|
846
846
|
return () => { };
|
package/dist/index-min.js
CHANGED
|
@@ -1295,7 +1295,7 @@ ${H('{ "source": "parameter", "name": "myParam" }')} <span class="cs-comment">/
|
|
|
1295
1295
|
<input value="[[this._getRelativeSignalsPath(item)]]" @keypress="[[this._changeRelativeSignalsPath(event, item)]]" placeholder="relative signals path" title="relative signals path" style="min-width: 50px; flex-basis: 20px; flex-grow: 1;" class="mth" type="text">
|
|
1296
1296
|
<button css:background="[[this._hasParameters(item) ? 'lime' : '']]" style="display: flex; padding: 0; flex-grow: 0;" title="parameter" @click="[[this._editParameter(event, item)]]">p</button>
|
|
1297
1297
|
</div>`;static scriptTypeColors={js:"purple",blockly:"yellow",script:"lightgreen",empty:"pink"};static is="node-projects-visualization-event-assignment";constructor(){super(),this._restoreCachedInititalValues()}ready(){this._bindingsParse()}_blocklyToolbox;_instanceServiceContainer;_selectionChangedHandler;_selectedItems;_visualizationHandler;_visualizationShell;_scriptCommandsTypeInfo;_propertiesTypeInfo;_commandDescriptions;events;initialize(e,t,i,s,l,a){this._visualizationHandler=e,this._visualizationShell=t,this._scriptCommandsTypeInfo=i,this._propertiesTypeInfo=s,this._blocklyToolbox=l,this._commandDescriptions=a}set instanceServiceContainer(e){this._instanceServiceContainer=e,this._selectionChangedHandler?.dispose(),this._selectionChangedHandler=this._instanceServiceContainer?.selectionService.onSelectionChanged.on(t=>{this.selectedItems=t.selectedElements}),this.selectedItems=this._instanceServiceContainer?.selectionService.selectedElements??[]}dispose(){this.instanceServiceContainer=null}_createControlsForScript(e){switch(this._getScriptType(e)){case"none":return""}return this.constructor.editRowTemplate.content.cloneNode(!0)}_getScriptName(e){if(this.selectedItems[0].hasAttribute("@"+e.name)){let t=this.selectedItems[0].getAttribute("@"+e.name);if(t[0]==="{"){if(t.includes("name"))return JSON.parse(t).name}else return t}return null}async _changeScriptName(e,t){if(e.key=="Enter"&&this.selectedItems&&this.selectedItems.length&&this.selectedItems[0].hasAttribute("@"+t.name)){let i=e.target.value,s=this.selectedItems[0].getAttribute("@"+t.name);if(s.startsWith("{")){let l=JSON.parse(s);l.name=i,this._selectedItems[0].setAttribute("@"+t.name,JSON.stringify(l))}else this._selectedItems[0].setAttribute("@"+t.name,i)}}_getRelativeSignalsPath(e){if(this.selectedItems[0].hasAttribute("@"+e.name)){let t=this.selectedItems[0].getAttribute("@"+e.name);if(t[0]==="{"&&t.includes("relativeSignalsPath"))return JSON.parse(t).relativeSignalsPath}return null}async _changeRelativeSignalsPath(e,t){if(e.key=="Enter"&&this.selectedItems&&this.selectedItems.length&&this.selectedItems[0].hasAttribute("@"+t.name)){let i=e.target.value,s=this.selectedItems[0].getAttribute("@"+t.name);if(s.startsWith("{")){let l=JSON.parse(s);l.relativeSignalsPath=i,this._selectedItems[0].setAttribute("@"+t.name,JSON.stringify(l))}else{let l={name:s,relativeSignalsPath:i};this._selectedItems[0].setAttribute("@"+t.name,JSON.stringify(l))}}}_hasParameters(e){return this.selectedItems[0].hasAttribute("@"+e.name)?this.selectedItems[0].getAttribute("@"+e.name).includes("parameters"):!1}_getScriptTypeColor(e){let t=this._getScriptType(e);return r.scriptTypeColors[t]??"white"}_getScriptType(e){if(e.designItem.hasAttribute("@"+e.name)){let t=e.designItem.getAttribute("@"+e.name);if(t.startsWith("{")){let i=JSON.parse(t);return"blocks"in i?"blockly":"commands"in i?"script":"js"}else return t==""?"empty":"js"}return"none"}_getEventMethodname(e){return this.selectedItems.length?this.selectedItems[0].getAttribute("@"+e.name):""}_inputMthName(e,t){let i=e.target;this.selectedItems[0].setAttribute("@"+t.name,i.value)}_ctxMenu(e,t){e.preventDefault();let i=this._getScriptType(t);if(i=="empty")this._showContextMenuAssignScript(e,t,!0);else if(i!="none"){let s=[{title:"remove",action:()=>{this.selectedItems[0].removeAttribute("@"+t.name),this._bindingsRefresh()}},{title:"-"},{title:"copy",action:()=>{je(this.selectedItems[0].getAttribute("@"+t.name))}},{title:"paste",action:async()=>{this.selectedItems[0].setAttribute("@"+t.name,await Pe()),this._bindingsRefresh()}}];Le.show(s,e)}else this._showContextMenuAssignScript(e,t,!0)}async _addEvent(e){if(e.key=="Enter"){let t=this._getDomElement("addEventInput");this._selectedItems[0].setAttribute("@"+Wt.camelToDashCase(t.value.replaceAll(" ","-")),""),t.value="",this.scrollTop=0,this.refresh()}}_createAssignScriptContextMenu(e,t){let i=[{title:"Simple Script",action:()=>{this._editEvent("script",e,t)}},{title:"Javascript",action:()=>{let l=prompt("name of function ?");l&&(this._selectedItems[0].setAttribute("@"+t.name,l),this.refresh(),this._editEvent("js",null,t))}},{title:"Blockly",action:()=>{this._editBlockly(null,t)}}],s=this._getScriptType(t);return s!="none"&&(i.push({title:"-"}),i.push({title:"remove",action:()=>{this.selectedItems[0].removeAttribute("@"+t.name),this._bindingsRefresh()}})),s!="empty"&&i.push({title:"-"},{title:"copy",action:()=>{je(this.selectedItems[0].getAttribute("@"+t.name))}},{title:"paste",action:async()=>{this.selectedItems[0].setAttribute("@"+t.name,await Pe()),this._bindingsRefresh()}}),i}async _showContextMenuAssignScript(e,t,i){e.preventDefault();let s=this._getScriptType(t);if(s!="none"&&s!="empty"&&!i)this._editEvent(s,e,t);else{let l=this._createAssignScriptContextMenu(e,t);Le.show(l,e)}}async _editParameter(e,t){let i=new ie,s={};i.title="ParameterEditor for '"+t.name+"' of '"+t.designItem.name+"'";let l=t.designItem.getAttribute("@"+t.name);if(l&&l[0]=="{")try{s=JSON.parse(l).parameters}catch{}if(i.setParametersObject(s),await this._visualizationShell.openConfirmation(i,{x:100,y:100,width:700,height:500})){let n=i.getParametersObject(),o={name:l,parameters:n};l&&l[0]=="{"&&(o=JSON.parse(l),o.parameters=n),n==null&&delete o.parameters;let c=JSON.stringify(o);t.designItem.setAttribute("@"+t.name,c),this._bindingsRefresh()}}async _editBlockly(e,t){let i=new Y(this._blocklyToolbox);i.title="Blockly Script for '"+t.name+"' of '"+t.designItem.name+"'";let s=t.designItem.getAttribute("@"+t.name),l=null,a=null;if(s){let o=JSON.parse(s);l=o.parameters,a=o.relativeSignalsPath,i.load(o)}if(await this._visualizationShell.openConfirmation(i,{x:100,y:100,width:700,height:500})){let o=i.save();l&&(o.parameters=l),a&&(o.relativeSignalsPath=a),t.designItem.setAttribute("@"+t.name,JSON.stringify(o)),this._bindingsRefresh()}}async _editJavascript(e,t){}async _editSimpleScript(e,t){let i=t.designItem.getAttribute("@"+t.name);if(!i||i.startsWith("{")){let s={commands:[]},l=null,a=null;i&&(s=JSON.parse(i),l=s.parameters,a=s.relativeSignalsPath);let n=new te;if(n.serviceContainer=t.designItem.serviceContainer,n.instanceServiceContainer=t.designItem.instanceServiceContainer,n.scriptCommandsTypeInfo=this._scriptCommandsTypeInfo,n.propertiesTypeInfo=this._propertiesTypeInfo,n.visualizationShell=this._visualizationShell,n.visualizationHandler=this._visualizationHandler,this._commandDescriptions&&(n.commandDescriptions={...n.commandDescriptions,...this._commandDescriptions}),n.loadScript(s),n.title="Script '"+t.name+"' on "+t.designItem.name,await this._visualizationShell.openConfirmation(n,{title:n.title,width:600,height:500})){let c=n.getScriptCommands();if(c&&c.length){let p={commands:c};l&&(p.parameters=l),a&&(p.relativeSignalsPath=a);let d=JSON.stringify(p);t.designItem.setAttribute("@"+t.name,d),this._bindingsRefresh()}}}}async _editEvent(e,t,i){e=="js"?this._editJavascript(t,i):e=="blockly"?this._editBlockly(t,i):this._editSimpleScript(t,i)}refresh(){this._selectedItems!=null&&this._selectedItems.length?this.events=this._selectedItems[0].serviceContainer.getLastServiceWhere("eventsService",e=>e.isHandledElementFromEventsService(this._selectedItems[0])).getPossibleEvents(this._selectedItems[0]).map(e=>({...e,designItem:this._selectedItems[0]})):this.events=[],this._bindingsRefresh()}get selectedItems(){return this._selectedItems}set selectedItems(e){this._selectedItems!=e&&(this._selectedItems=e,this.refresh())}};customElements.define(ge.is,ge);import{TypedEvent as Ft,cssFromString as Me}from"@node-projects/base-custom-webcomponent";import{BindingTarget as y}from"@node-projects/web-component-designer/dist/elements/item/BindingTarget.js";import{PropertiesHelper as O}from"@node-projects/web-component-designer/dist/elements/services/propertiesService/services/PropertiesHelper.js";var se="bind-prop:",le="bind-attr:",ce="bind-class:",pe="bind-css:",ne="bind-cssvar:",J="bind-content:",Se="bind-visible:",We="bind(",Ht="--tmpBinding_",bs=/{{(.*)}}/;function de(r){return r.constructor?.elementProperties!=null}function Ce(r){let e=[],t=[],i=0;for(let s=0;s<r.length;s++)r[s]=="{"?(e.push(r.substring(i,s)),i=s+1):r[s]=="}"&&(t.push(r.substring(i,s)),i=s+1);return e.push(r.substring(i)),{parts:e,signals:t}}function He(r,e,t,i){let s=!0,l=0,a=()=>{let o=++l,c=r.valueProvider(e,t);c instanceof Promise?c.then(p=>s&&o===l&&i(p)):s&&i(c)};a(),r.valueChangedCallbacks||(r.valueChangedCallbacks=new Map);let n=r.valueChangedCallbacks.get(e);return n||(n=[],r.valueChangedCallbacks.set(e,n)),n.push(a),()=>{s=!1;let o=n.indexOf(a);o>=0&&n.splice(o,1),n.length===0&&r.valueChangedCallbacks.get(e)===n&&r.valueChangedCallbacks.delete(e)}}function Jt(r,e){let t=e.split("."),i=r;for(let s of t){if(i==null||typeof i!="object")return;i=i[s]}return i}function fe(r,e,t,i,s=!1){let l=s&&t.includes("."),a=l?()=>Jt(e,t):()=>e[t];if(i(a()),l)return()=>{};let n=()=>i(a()),o=r.getChangedEventName(e,t);return e.addEventListener(o,n),()=>e.removeEventListener(o,n)}function Je(r,e,t){t(r.getAttribute(e));let i=new MutationObserver(()=>t(r.getAttribute(e)));return i.observe(r,{attributes:!0,attributeFilter:[e]}),()=>i.disconnect()}var ke=class{bindingsHelper;parts;signals;values;unsubscribeTargetValue;cleanupCalls=[];combinedName;disposed=!1;valueChangedCb;visualizationHandler;element;relativeSignalPath;constructor(e,t,i,s,l,a,n,o){this.bindingsHelper=e,this.visualizationHandler=t,this.valueChangedCb=s,this.element=l,this.relativeSignalPath=a,this.parseIndirectBinding(i),this.values=new Array(this.signals.length);let c=(p,d,h)=>{let u,g=()=>{},f=w=>{let x=w;if(typeof x=="string"&&x[0]==="."&&(x=t.getNormalizedSignalName(x,a,l)),x!==u)if(g(),u=x,typeof x=="string"){let T=(z,P)=>this.handleValueChanged(P.val,h);g=e.subscribeToState(x,T)}else g=()=>{}};this.cleanupCalls.push(fe(e,p,d,f,!0)),this.cleanupCalls.push(()=>g())};try{for(let p=0;p<this.signals.length;p++){let d=this.signals[p];if(d.startsWith("?@")||d.startsWith("#@")){let h=d[0]==="?"?n:l;this.cleanupCalls.push(Je(h,d.substring(2),u=>this.handleValueChanged(u,p)))}else if(d.startsWith("??")||d.startsWith("##")||d.startsWith("?$")||d.startsWith("#$")){let h=d[0]==="?"?n:l;this.cleanupCalls.push(fe(e,h,d.substring(2),u=>this.handleValueChanged(u,p),!0))}else if(d[0]==="\xA7"){let h=d.substring(1);if(!o)throw new Error(`No special value handler registered for "${d}"`);this.cleanupCalls.push(He(o,h,{element:l,relativeSignalPath:a,root:n},u=>this.handleValueChanged(u,p)))}else if(d[0]==="?"||d[0]==="#")c(d[0]==="?"?n:l,d.substring(1),p);else{let h=(u,g)=>this.handleValueChanged(g.val,p);this.cleanupCalls.push(e.subscribeToState(d,h))}}}catch(p){throw this.dispose(),p}}parseIndirectBinding(e){let{parts:t,signals:i}=Ce(e);this.parts=t,this.signals=i;for(let s=0;s<i.length;s++)i[s][0]=="."&&(i[s]=this.visualizationHandler.getNormalizedSignalName(i[s],this.relativeSignalPath,this.element))}handleValueChanged(e,t){if(this.disposed)return;this.values[t]=e;let i=this.parts[0];for(let s=0;s<this.parts.length-1;s++){let l=this.values[s];if(l==null)return;i+=l+this.parts[s+1]}if(i[0]=="."&&(i=this.visualizationHandler.getNormalizedSignalName(i,this.relativeSignalPath,this.element)),this.combinedName!=i&&(this.unsubscribeTargetValue&&this.unsubscribeTargetValue(),!this.disposed)){this.combinedName=i;let s=(l,a)=>this.valueChangedCb(a);this.unsubscribeTargetValue=this.bindingsHelper.subscribeToState(i,s)}}dispose(){this.disposed=!0,this.unsubscribeTargetValue&&(this.unsubscribeTargetValue(),this.unsubscribeTargetValue=null);for(let e of this.cleanupCalls)e();this.cleanupCalls.length=0}setState(e){!this.disposed&&this.combinedName&&this.visualizationHandler.setState(this.combinedName,e)}},Fe=class r{_visualizationHandler;namedConverterCallback;_stateSubscriptions=new Map;_scheduledUpdates=new Set;_updateFlushScheduled=!1;_compiledConverters=new WeakMap;constructor(e){this._visualizationHandler=e}scheduleUpdate(e){this._scheduledUpdates.add(e),!this._updateFlushScheduled&&(this._updateFlushScheduled=!0,queueMicrotask(()=>{this._updateFlushScheduled=!1;let t=[...this._scheduledUpdates];this._scheduledUpdates.clear();for(let i of t)i()}))}getChangedEventName(e,t){let i=t.indexOf("::");if(i>=0)return t.substring(i+2);if(e instanceof HTMLInputElement||e instanceof HTMLSelectElement)return"change";let s=O.camelToDashCase(t);return de(e)?s:s+"-changed"}getParsedTargetName(e,t){return t===y.cssvar||t===y.class?r.dotToCamelCase(e):t===y.attribute?e:O.dashToCamelCase(e)}parseBinding(e,t,i,s,l){let a=t.substring(l.length);if(s===y.cssvar&&(a="--"+a),!i.startsWith("{")){let o={signal:i,target:s};if(i[0]==="="){if(i=i.substring(1),o.signal=i,i.includes("::")){let c=i.split("::");i=c[0],o.signal=i,o.events=c[1].split(",")}o.twoWay=!0,o.events||(o.events=[this.getChangedEventName(e,a)],!(e instanceof HTMLInputElement)&&!(e instanceof HTMLSelectElement)&&!de(e)&&(o.maybeLitElement=!0,o.litEventNames=o.events))}if(i[0]==="!"&&(o.signal=i.substring(1),o.inverted=!0),o.signal.includes(";")){let c=o.signal.split(";");o.expression=c.pop(),o.signal=c.join(";")}return[this.getParsedTargetName(a,s),o]}let n=JSON.parse(i);return n.target=s,n.twoWay&&(n.events==null||n.events.length==0)&&(n.events=[this.getChangedEventName(e,a)]),[this.getParsedTargetName(a,s),n]}serializeBinding(e,t,i){let s={...i};delete s.type,i.twoWay?i.events!=null&&i.events.length==1&&((e instanceof HTMLInputElement||e instanceof HTMLSelectElement)&&i.events?.[0]=="change"||de(e)&&i.events?.[0]==t||!de(e)&&i.events?.[0]==t+"-changed")&&delete s.events:(delete s.events,delete s.expressionTwoWay);let l=s.twoWay&&s.events?.length>0?"::"+s.events.join(","):"",a=l!==""&&!!i.expression?.includes("::")||!!i.expressionTwoWay?.includes("::")||i.signal.trim()[0]=="{",n=i.target==y.property||i.target==y.attribute||i.target==y.class||i.target==y.css||i.target==y.cssvar,o=!a&&n&&!i.expressionTwoWay&&i.converter==null&&!i.historic&&!i.writeBackSignal;if(o&&!i.expression){let c=this.getShortBindingAttributeName(t,i.target,!1),d=((i.target==y.property||i.target==y.attribute)&&i.twoWay?"=":"")+(i.inverted?"!":"")+i.signal+(!i.twoWay&&i.signal.includes(";")?";":"")+l;return[c,d]}if(o&&i.expression&&!i.expression.includes(`
|
|
1298
|
-
`)&&!i.expression.includes(";")){let c=this.getShortBindingAttributeName(t,i.target,!0),d=((i.target==y.attribute||i.target==y.property&&t!="textContent"&&t!="innerHTML")&&i.twoWay?"=":"")+(i.inverted?"!":"")+i.signal+";"+i.expression+l;return[c,d]}return(i.inverted===null||i.inverted===!1)&&delete s.inverted,(i.expression===null||i.expression==="")&&delete s.expression,(i.expressionTwoWay===null||i.expressionTwoWay==="")&&delete s.expressionTwoWay,i.writeBackSignal||delete s.writeBackSignal,(i.twoWay===null||i.twoWay===!1)&&delete s.twoWay,delete s.target,i.historic||delete s.historic,[this.getJsonBindingAttributeName(t,i.target),JSON.stringify(s)]}getShortBindingAttributeName(e,t,i){return t==y.property&&e=="textContent"?J+"text":t==y.property&&e=="innerHTML"?J+"html":t==y.attribute?le+O.camelToDashCase(e):t==y.class?ce+O.camelToDashCase(e):t==y.css?pe+O.camelToDashCase(e):t==y.cssvar?i?ne+O.camelToDashCase(e):ne+r.camelToDotCase(e.substring(2)):se+O.camelToDashCase(e)}getJsonBindingAttributeName(e,t){return t==y.content||t==y.property&&e=="innerHTML"?J+"html":t==y.property&&e=="textContent"?J+"text":t==y.attribute?le+O.camelToDashCase(e):t==y.class?ce+r.camelToDotCase(e):t==y.css?pe+O.camelToDashCase(e):t==y.cssvar?ne+r.camelToDotCase(e.substring(2)):se+O.camelToDashCase(e)}getBindingAttributeName(e,t,i){return i==y.attribute?le+O.camelToDashCase(t):i==y.class?ce+r.camelToDotCase(t):i==y.css?pe+O.camelToDashCase(t):i==y.visible?Se:i==y.cssvar?ne+r.camelToDotCase(t):i==y.property&&t=="innerHTML"?J+"html":i==y.property&&t=="textContent"?J+"text":se+O.camelToDashCase(t)}*getBindings(e){if(e.attributes)for(let t of e.attributes)t.name.startsWith(se)?yield this.parseBinding(e,t.name,t.value,y.property,se):t.name.startsWith(J)?yield this.parseBinding(e,t.name==="bind-content:html"?"bind-prop:inner-h-t-m-l":"bind-prop:text-content",t.value,y.property,se):t.name.startsWith(le)?yield this.parseBinding(e,t.name,t.value,y.attribute,le):t.name.startsWith(ce)?yield this.parseBinding(e,t.name,t.value,y.class,ce):t.name.startsWith(pe)?yield this.parseBinding(e,t.name,t.value,y.css,pe):t.name.startsWith(ne)?yield this.parseBinding(e,t.name,t.value,y.cssvar,ne):t.name.startsWith(Se)&&(yield this.parseBinding(e,t.name,t.value,y.visible,Se))}applyAllBindings(e,t,i,s,l){let a=[],n=document.createTreeWalker(e,NodeFilter.SHOW_ELEMENT),o=n.nextNode();for(;o;){let c=this.getBindings(o);for(let p of c)try{let d=this.applyBinding(o,p,t,i,s),h=!1,u=()=>{h||(h=!0,d())};if(a.push(u),p[1].maybeLitElement&&o.localName.includes("-")&&!customElements.get(o.localName)){let g=o,f=p;customElements.whenDefined(o.localName).then(()=>{!h&&de(g)&&(h=!0,d(),f[1].events=f[1].litEventNames,a.push(this.applyBinding(g,f,t,i,s)))})}}catch(d){console.warn("error applying binding",o,p,d)}if(l&&l(o)){let p=n.nextSibling();for(;!p&&o;)o=n.parentNode(),p=n.nextSibling();o=p}else o=n.nextNode()}return a}static#e=0;async parseCssBindings(e,t,i,s){if(!e.includes(We))return[Me(e),[]];let l=await import("@node-projects/css-parser"),a=l.parse(e),n=[];for(let c of a.stylesheet.rules)if(c.type===l.CssTypes.rule){for(let p of c.declarations)if(p.type===l.CssTypes.declaration&&p.value.includes(We)){let d=this.parseCssBinding(p.value,t,i,s);p.value=d[0],n.push(...d[1])}}let o=l.stringify(a,{indent:"",compress:!0});return[Me(o),n]}parseCssBinding(e,t,i,s,l){e=e.trim();let a="",n="",o=!1,c="",p=!1,d=null,h=[];for(let u=0;u<e.length;u++){let g=e[u];if(o)if(p)c+=g,p=!1;else if(d&&g==="\\")p=!0;else if(g===d)d=null;else if(d===null&&g===")"){let f=r.#e++,w=Ht+f,x=[w,{signal:c,target:y.cssvar}];c.startsWith("{")&&(x=JSON.parse(c)),h.push(this.applyBinding(t,x,i,s,l)),a+="var("+w+")",o=!1,c=""}else c+=g;else g==="("?(n!=="bind"?(a+=n,a+=g):(o=!0,e[u+1]==="'"||e[u+1]==='"'?(u++,d=e[u]):d=null),n=""):g===" "||g===","||g==="("||g==="+"||g==="-"||g==="*"||g==="/"?(a+=n+g,n=""):n+=g}return[a+n,h]}subscribeToState(e,t){let i=this._stateSubscriptions.get(e);if(i){if(i.callbacks.add(t),i.hasValue){let l=i.value;queueMicrotask(()=>i.callbacks.has(t)&&t(e,l))}}else{i={callbacks:new Set([t]),callback:null,subscriptionResult:null,revision:0,hasValue:!1},i.callback=(l,a)=>{i.revision++,i.hasValue=!0,i.value=a;for(let n of i.callbacks)n(l,a)},this._stateSubscriptions.set(e,i);try{i.subscriptionResult=this._visualizationHandler.subscribeState(e,i.callback);let l=i.revision;this._visualizationHandler.getState(e).then(a=>{this._stateSubscriptions.get(e)===i&&i.revision===l&&i.callback(e,a)})}catch(l){throw this._stateSubscriptions.delete(e),i.subscriptionResult!=null&&this._visualizationHandler.unsubscribeState(e,i.callback,i.subscriptionResult),l}}let s=!0;return()=>{s&&(s=!1,i.callbacks.delete(t),i.callbacks.size===0&&this._stateSubscriptions.get(e)===i&&(this._stateSubscriptions.delete(e),this._visualizationHandler.unsubscribeState(e,i.callback,i.subscriptionResult)))}}applyBinding(e,t,i,s,l){let a=[],n=!0,o=()=>{if(n){n=!1,this._scheduledUpdates.delete(X);for(let m=a.length-1;m>=0;m--)a[m]();a.length=0}},c=m=>a.push(m),p=t[1].signal.split(";"),d=new Array(p.length);for(let m=0;m<p.length;m++){let b=p[m];d[m]="__"+m;let v=b.indexOf(":");v>=0&&(d[m]=b.substring(0,v),b=b.substring(v+1),p[m]=b)}let h=new Array(p.length),u=[...d,"__res","__ctx"];t[1].expression&&!t[1].compiledExpression&&(t[1].compiledExpression=t[1].expression.includes("return ")?new Function(u,t[1].expression):new Function(u,"return "+t[1].expression));let g=this.getCompiledConverter(t[1],u),f={element:e,root:s,boundNames:t[1].signal,boundTargetName:t[0],boundTargetType:t[1].target},w=this.createTargetWriter(e,t),x=t[1].writeBackSignal;x?.[0]==="."&&(x=i+x);let T,z,P,G=!1,q=!1,M=!1,X=()=>{if(M=!1,!n)return;let m=T;t[1].compiledExpression&&(m=t[1].compiledExpression(...h,z,f),z=m),t[1].converter&&(typeof t[1].converter=="string"?m=this.namedConverterCallback(t[1].converter,m,e,t):m=this.applyCompiledConverter(m,g,h,z,f,t[1].converterDefault)),t[1].inverted&&(m=!m),q=!0,!(G&&(m===null||typeof m!="object")&&Object.is(P,m))&&(G=!0,P=m,x&&this._visualizationHandler.setState(x,m,!0),w(m))},I=(m,b,v)=>{n&&(!v&&b===0&&(m=r.parseValueWithType(m,t)),h[b]=m,T=m,!q&&p.length===1?X():M||(M=!0,this.scheduleUpdate(X)))},L=new Array(p.length),oe=(m,b)=>(L[m]=b,()=>{L[m]===b&&(L[m]=null)}),k=(m,b,v)=>{let V=oe(v,S=>m[b]=S),R=fe(this,m,b,S=>I(S,v,!1));return()=>{R(),V()}},N=(m,b,v)=>{let V=oe(v,S=>S==null?m.removeAttribute(b):m.setAttribute(b,S)),R=Je(m,b,S=>I(S,v,!1));return()=>{R(),V()}},E=(m,b)=>{if(m.startsWith("?@")||m.startsWith("#@")){let _=m[0]==="?"?s:e;return _?N(_,m.substring(2),b):()=>{}}if(m.startsWith("?$")||m.startsWith("#$")){let _=m[0]==="?"?s:e;return _?k(_,m.substring(2),b):()=>{}}if(m[0]==="?"||m[0]==="#"){let _=m[0]==="?"?s:e;return _?k(_,m.substring(1),b):()=>{}}if(m[0]==="$"){let _=m.substring(1);_[0]==="."&&(_=this._visualizationHandler.getNormalizedSignalName(_,i,e));let D=!0;return this._visualizationHandler.getObject(_).then(A=>{D&&I(A,b,!0)}),()=>D=!1}if(m[0]==="\xA7"){if(!l)throw new Error(`No special value handler registered for "${m}"`);return He(l,m.substring(1),{element:e,binding:t,relativeSignalPath:i,root:s},_=>I(_,b,!0))}if(m.includes("{")){let _=new ke(this,this._visualizationHandler,m,A=>I(A.val,b,!1),e,i,s,l),D=oe(b,A=>_.setState(A));return()=>{_.dispose(),D()}}let v=m;if(v[0]==="."&&(v=this._visualizationHandler.getNormalizedSignalName(v,i,e)),t[1].historic){let _=t[1].historic;if(_.reloadInterval){let A=!0,W=null,F=async()=>{let at=await this._visualizationHandler.getHistoricData(v,_);!n||!A||(I(at?.values,b,!0),W=setTimeout(F,_.reloadInterval))};return F(),()=>{A=!1,W!==null&&clearTimeout(W),W=null}}let D=!0;return this._visualizationHandler.getHistoricData(v,_).then(A=>{D&&I(A?.values,b,!0)}),()=>D=!1}let V=(_,D)=>I(D?.val,b,!1),R=this.subscribeToState(v,V),S=oe(b,_=>this._visualizationHandler.setState(v,_));return()=>{R(),S()}},B=(m,b)=>{if(m.startsWith("?@")||m.startsWith("#@")||m.startsWith("?$")||m.startsWith("#$"))return E(m,b);let v=m[0];if(v!=="?"&&v!=="#"||m[1]===v)return E(m[1]===v?m.substring(1):m,b);let V=v==="?"?s:e;if(!V)return()=>{};let R=m.substring(1),S=()=>{},_,A=fe(this,V,R,W=>{let F=typeof W=="string"?W:null;F!==_&&(S(),_=F,S=F?E(F,b):()=>{})});return()=>{A(),S()}};try{t[1].twoWay&&c(this.addTwoWayBinding(t,e,m=>L[0]?.(m)));for(let m=0;m<p.length;m++)typeof p[m]=="string"&&c(B(p[m],m))}catch(m){throw o(),m}return o}addTwoWayBinding(e,t,i){e[1].expressionTwoWay&&!e[1].compiledExpressionTwoWay&&(e[1].compiledExpressionTwoWay=e[1].expressionTwoWay.includes("return ")?new Function(["value"],e[1].expressionTwoWay):new Function(["value"],"return "+e[1].expressionTwoWay));let s=[],l=()=>{let a=e[1].target==y.attribute?t.getAttribute(e[0]):t[e[0]];a=r.parseValueWithType(a,e),e[1].compiledExpressionTwoWay&&(a=e[1].compiledExpressionTwoWay(a)),i(a)};for(let a of e[1].events??[]){let n=t[a];if(n instanceof Ft){let o=n.on(l);s.push(()=>o.dispose())}else t.addEventListener(a,l),s.push(()=>t.removeEventListener(a,l))}return()=>{for(let a of s)a();s.length=0}}static parseValueWithType(e,t){if(t[1].type)switch(t[1].type){case"number":return parseFloat(e);case"boolean":return e===!0||e==="true"||!!parseInt(e);case"string":return e?.toString();case"integer":return parseInt(e)}return e}compileConverter(e,t){let i=new Map,s=[],l=a=>{if(typeof a!="string")return{value:a};let n=new Function(t,"return `"+a+"`");return{value:a,evaluate:(o,c,p)=>n(...o,c,p)}};for(let a in e){let n=l(e[a]);if(i.set(a,n),a.startsWith(">=")){let o=parseFloat(a.substring(2));s.push({matches:c=>c>=o,value:n})}else if(a.startsWith("<=")){let o=parseFloat(a.substring(2));s.push({matches:c=>c<=o,value:n})}else if(a[0]===">"){let o=parseFloat(a.substring(1));s.push({matches:c=>c>o,value:n})}else if(a[0]==="<"){let o=parseFloat(a.substring(1));s.push({matches:c=>c<o,value:n})}else{let o=a.split("-");if(o.length>1){let c=o[0]===""?null:parseFloat(o[0]),p=o[1]===""?null:parseFloat(o[1]);s.push({matches:d=>(c===null||d>=c)&&(p===null||p>=d),value:n})}}}return{exactValues:i,conditions:s}}getCompiledConverter(e,t){if(!e.converter||typeof e.converter!="object")return null;let i=t.join("\0"),s=this._compiledConverters.get(e);if(s?.converter===e.converter&&s.argumentsKey===i)return s.compiled;let l=this.compileConverter(e.converter,t);return this._compiledConverters.set(e,{converter:e.converter,argumentsKey:i,compiled:l}),l}applyCompiledConverter(e,t,i,s,l,a){let n=String(e),o=t.exactValues.get(n),c=t.exactValues.has(n);if(!c){let p=parseFloat(e);for(let d of t.conditions)if(d.matches(p)){o=d.value,c=!0;break}}return c?o.evaluate?o.evaluate(i,s,l):o.value:a!==void 0?a:e}createTargetWriter(e,t){let i=t[0];switch(t[1].target){case y.property:return s=>e[i]=s;case y.attribute:return s=>{typeof s=="boolean"?s?e.setAttribute(i,""):e.removeAttribute(i):e.setAttribute(i,s)};case y.css:return s=>e.style[i]=s;case y.cssvar:return s=>e.style.setProperty(i,s);case y.class:return s=>e.classList.toggle(i,!!s);case y.visible:return s=>e.style.visibility=s?"":"collapse";default:return()=>{}}}static camelToDotCase(e){return e.replace(/([A-Z])/g,t=>`.${t[0].toLowerCase()}`)}static dotToCamelCase(e){return e.replace(/\.([a-z])/g,t=>t[1].toUpperCase())}};var Ue=class{name;relativeSignalsPath;commands;parameters};import{deepValue as U,setDeepValue as $e,sleep as Ut}from"@node-projects/web-component-designer/dist/elements/helper/Helper.js";import ae from"long";var ye="cyclic",$t={pointerdown:"pointerup",pointerenter:"pointerleave",mouseenter:"mouseleave",mouseover:"mouseout",focus:"blur",focusin:"focusout",keydown:"keyup"},Ge=class{_visualizationHandler;_subscriptionCallback=()=>{};constructor(r){this._visualizationHandler=r}async execute(r,e){let t=-1,i=!1,s=!1,l=e.event?.type,a=l?$t[l]:null;if(a){let n=e.element;l=="pointerdown"&&(n=window),n.addEventListener(a,()=>{i=!0},{once:!0})}for(let n=0;n<r.length;n++){let o=r[n];if(o.type=="Exit"){s=!0;break}else if(o.type=="If"){let p=(await this.evaluateIfFormula(o,e)?o.trueCommands:o.elseCommands)??[];if(!await this.execute(p,e)){s=!0;break}}else if(o.type=="Goto"){let c=await this.getValue(o.label,e);if(n=r.findIndex(p=>p.type=="Label"&&p.label==c),n<0)break}else if(o.type=="Condition"){let c=await this.getValue(o.value1,e),p=await this.getValue(o.value2,e),d=await this.getValue(o.comparisonType,e),h=!1;switch(d){case"==null":h=c==null;break;case"!=null":h=c!=null;break;case"==true":h=c==!0;break;case"==false":h=c==!1;break;case"==":h=c==p;break;case"!=":h=c!=p;break;case">":h=c>p;break;case"<":h=c<p;break;case">=":h=c>=p;break;case"<=":h=c<=p;break;case"&&":h=c&&p;break;case"||":h=c||p;break}if(h){await this.runExternalScript(await this.getValue(o.trueScriptName,e),await this.getValue(o.trueScriptType,e));let u=await this.getValue(o.trueGotoLabel,e);if(u&&(n=r.findIndex(g=>g.type=="Label"&&g.label==u),n<0))break}else{await this.runExternalScript(await this.getValue(o.falseScriptName,e),await this.getValue(o.falseScriptType,e));let u=await this.getValue(o.falseGotoLabel,e);if(u&&(n=r.findIndex(g=>g.type=="Label"&&g.label==u),n<0))break}}else if(o.type=="Repeat"){let c=await this.getValue(o.label,e),p=await this.getValue(o.count,e);if(await this.getValue(o.mode,e)=="eventValid"&&i){i=!1;continue}if(p!=0&&t==-1&&(t=p-1),t==0||(t>0&&t--,n=-1,c&&(n=r.findIndex(h=>h.type=="Label"&&h.label==c),n<0)))continue}else if(!await this.runScriptCommand(o,e)){s=!0;break}}return!s}async getValueFromTarget(r,e,t){return r==="property"?U(t.root,e):r==="elementProperty"?U(t.element,e):(await this._visualizationHandler.getState(this.getSignalName(e,t)))?.val}async setValueOnTarget(r,e,t,i){r==="property"?$e(t.root,e,i):r==="elementProperty"?$e(t.element,e,i):await this._visualizationHandler.setState(this.getSignalName(e,t),i)}async runExternalScript(r,e){}async runScriptCommand(command,context){switch(command.type){case"Comment":case"Label":case"Condition":case"If":case"Goto":case"Exit":case"Repeat":break;case"OpenUrl":{window.open(await this.getValue(command.url,context),command.target);break}case"Delay":{let r=await this.getValue(command.value??500,context);await Ut(r);break}case"Console":{let r=await this.getValue(command.target??"log",context),e=await this.getValue(command.message,context);console[r](e);break}case"ToggleSignalValue":{let r=await this.getValue(command.signal,context),e=await this.getValue(command.target,context),t=await this.getValueFromTarget(e,r,context);await this._visualizationHandler.setState(this.getSignalName(r,context),!t);break}case"ToggleSignalValueThroughList":{let r=await this.getValue(command.valueList,context),e=await this.getValue(command.signal,context),t=await this.getValue(command.target,context),i=await this.getValueFromTarget(t,e,context),s=r.indexOf(i)+1;s>=r.length&&(s=0);let l=r[s];await this._visualizationHandler.setState(this.getSignalName(e,context),l);break}case"SetSignalValue":{let r=await this.getValue(command.signal,context),e=await this.getValue(command.target,context);await this.setValueOnTarget(e,r,context,await this.getValue(command.value,context));break}case"IncrementSignalValue":{let r=await this.getValue(command.signal,context),e=await this.getValue(command.target,context),i=await this.getValueFromTarget(e,r,context)+await this.getValue(command.value,context);await this.setValueOnTarget(e,r,context,i);break}case"DecrementSignalValue":{let r=await this.getValue(command.signal,context),e=await this.getValue(command.target,context),i=await this.getValueFromTarget(e,r,context)-await this.getValue(command.value,context);await this.setValueOnTarget(e,r,context,i);break}case"CalculateSignalValue":{let formula=await this.getValue(command.formula,context),target=await this.getValue(command.target,context),targetSignal=await this.getValue(command.targetSignal,context),nm=await this.parseStringWithValues(formula,context),result=eval(nm);await this.setValueOnTarget(target,targetSignal,context,result);break}case"SetBitInSignal":{let r=await this.getValue(command.signal,context),e=await this.getValue(command.bitNumber??0,context),t=await this.getValue(command.target,context),i=await this.getValueFromTarget(t,r,context),s=ae.fromNumber(1).shiftLeft(e),l=ae.fromNumber(i).or(s).toNumber();await this.setValueOnTarget(t,r,context,l);break}case"ClearBitInSignal":{let r=await this.getValue(command.signal,context),e=await this.getValue(command.bitNumber??0,context),t=await this.getValue(command.target,context),i=await this.getValueFromTarget(t,r,context),s=ae.fromNumber(1).shiftLeft(e);s.negate();let l=ae.fromNumber(i).and(s).toNumber();await this.setValueOnTarget(t,r,context,l);break}case"ToggleBitInSignal":{let r=await this.getValue(command.signal,context),e=await this.getValue(command.bitNumber??0,context),t=await this.getValue(command.target,context),i=await this.getValueFromTarget(t,r,context),s=ae.fromNumber(1).shiftLeft(e),l=ae.fromNumber(i).xor(s).toNumber();await this.setValueOnTarget(t,r,context,l);break}case"Javascript":{let r=await this.getValue(command.script,context),e=context;e.shadowRoot=context.element.getRootNode(),e.instance=context.shadowRoot.host,command.compiledScript||(command.compiledScript=new Function("context",r)),command.compiledScript(e);break}case"SetElementProperty":{command=Q.upgradeSetElementProperty(command);let r=await this.getValue(command.name,context);r===""&&(r=null);let e=await this.getValue(command.value,context),t=await this.getValue(command.parentIndex??0,context),i=await this.getValue(command.target??"property",context),s=await this.getValue(command.targetSelectorTarget??"container",context),l=await this.getValue(command.targetSelector,context),a=await this.getValue(command.mode??"toggle",context),n=this.getTargetFromTargetSelector(context,s,t,l);for(let o of n)i=="attribute"?o.setAttribute(r,e):i=="property"?o[r]=e:i=="css"?o.style[r]=e:i=="class"&&(a==="toggle"?o.classList.toggle(r??e):a==="remove"?o.classList.remove(r??e):o.classList.add(r??e));break}case"SubscribeSignal":{let r=await this.getValue(command.signal,context);if(await this.getValue(command.oneTime,context)){let t=()=>{this._visualizationHandler.unsubscribeState(r,t,null)};this._visualizationHandler.subscribeState(r,t)}else this._visualizationHandler.subscribeState(r,this._subscriptionCallback);break}case"UnsubscribeSignal":{let r=await this.getValue(command.signal,context);this._visualizationHandler.unsubscribeState(r,this._subscriptionCallback,null);break}case"WriteSignalsInGroup":{let r=await this.getValue(command.group,context);this._visualizationHandler.writeSignalsInGroup(r);break}case"ClearSignalsInGroup":{let r=await this.getValue(command.group,context);this._visualizationHandler.clearSignalsInGroup(r);break}case"RunScript":{let r=await this.getValue(command.name,context),e=await this.getValue(command.scriptType,context);this.runExternalScript(r,e);break}case"ShowMessageBox":{let r=null,e=await this.getValue(command.exitScriptOnCancel,context);if(await this.getValue(command.buttons,context)=="yesNo"){let s=await this.getValue(command.message,context);confirm(s)?r=1:r=2}else{let s=await this.getValue(command.message,context);alert(s),r=1}let i=await this.getValue(command.resultSignal,context);if(i&&this._visualizationHandler.setState(i,r),e&&r!=1)return!1;break}case"ShowPrompt":{let r=await this.getValue(command.message,context),e=await this.getValue(command.default,context),t=prompt(r,e),i=await this.getValue(command.resultSignal,context);i&&t&&this._visualizationHandler.setState(i,t);break}case"Login":case"Logout":case"CloseDialog":case"OpenDialog":case"OpenScreen":case"SwitchLanguage":case"CopySignalValuesFromFolder":case"ExportSignalValuesAsJson":case"ImportSignalValuesFromJson":{alert('command: "'+command.type+'" is not yet implemented');break}}return!0}getTarget(r,e,t){if(e==="container"){let i=r.element.getRootNode().host;for(let s=0;s<(t??0);s++)i=i.getRootNode().host;return i}else if(e==="element"){let i=r.element;for(let s=0;s<(t??0);s++)i=i.parentElement;return i}return null}getTargetFromTargetSelector(r,e,t,i){let s=this.getTarget(r,e,t),l=[s];return i&&(e==="container"?l=s.shadowRoot.querySelectorAll(i):l=s.querySelectorAll(i)),l}async getValue(value,outerContext){if(value==null)return null;if(typeof value=="object")switch(value.source){case"property":return U(outerContext.root,value.name);case"elementProperty":return U(outerContext.element,value.name);case"signal":return(await this._visualizationHandler.getState(this.getSignalName(value.name,outerContext)))?.val;case"signalInProperty":{let r=U(outerContext.root,value.name);return(await this._visualizationHandler.getState(this.getSignalName(r,outerContext)))?.val}case"event":{let r=outerContext.event;return value.name&&(r=U(r,value.name)),r}case"parameter":return outerContext.parameters[value.name];case"context":return U(outerContext,value.name);case"complexString":{let r=value.name;return r!=null?await this.parseStringWithValues(r,outerContext):null}case"complexSignal":{let r=value.name;if(r!=null){let e=await this.parseStringWithValues(r,outerContext);return(await this._visualizationHandler.getState(this.getSignalName(e,outerContext)))?.val}return null}case"expression":{var ctx=outerContext;return eval(value.name)}}return value}async getStateOrFieldOrParameter(name,context){if(name[0]==="\xA7"){var ctx=context;return eval("ctx."+name.substring(1))}else{if(name[0]==="?"&&name[1]==="?")return context.root[name.substring(2)];if(name[0]==="?")return await this._visualizationHandler.getState(this.getSignalName(context.root[name.substring(1)],context))}return await this._visualizationHandler.getState(this.getSignalName(name,context))}async parseStringWithValues(r,e){let t=Ce(r),i=await Promise.all(t.signals.map(l=>this.getStateOrFieldOrParameter(this.getSignalName(l,e),e))),s=t.parts[0];for(let l=0;l<t.parts.length-1;l++){let a=i[l];typeof a=="object"&&(a=a.val),a==null&&(a=""),s+=a+t.parts[l+1]}return s}async evaluateIfFormula(r,e){let t=r.signals??[],i=t.map((a,n)=>a.varName?.trim()||"__"+n),s=await Promise.all(t.map(a=>this.getValue(a,e))),l=await this.getValue(r.formula,e);return(!r.compiledFormula||r._compiledFormulaSrc!==l)&&(r.compiledFormula=new Function(...i,"return ("+l+");"),r._compiledFormulaSrc=l),!!r.compiledFormula(...s)}getSignalName(r,e){return r[0]==="."?e.relativeSignalsPath+r:r}createScriptContext(r,e,t,i,s){return{root:r,event:e,element:t,parameters:i,relativeSignalsPath:s}}async assignAllScripts(r,e,t,i,s,l,a,n){l??=this.createScriptContext;let o=await this.loadAndInitJsObject(r,e,t,i,n);for(let c of t.querySelectorAll("*"))for(let p of c.attributes)if(p.name[0]==="@")try{let d=p.name.substring(1),h=p.value.trim(),u=d.startsWith(ye),g=u?parseInt(d.substring(d.indexOf(":")+1)):null,f=await this.resolveHandler(h,o,c,t,i,s,l,a,d);f&&this.bindHandler(c,d,u,g,f)}catch{console.warn("error assigning script",c,p)}return o}async loadAndInitJsObject(r,e,t,i,s){if(!e)return null;try{let a=await import(URL.createObjectURL(new Blob([e],{type:"application/javascript"})));return s?s(a):a.init?.(i,t),a}catch(l){return console.error("error parsing javascript - "+r,l),null}}async resolveHandler(r,e,t,i,s,l,a,n,o){if(r[0]!=="{")return p=>{e?.[r]?e[r](p,t,i,s):console.warn(`javascript function named: "${r}" not found, maybe missing a "export" ?`)};let c=JSON.parse(r);if("commands"in c)return p=>this.execute(c.commands,a(s,p,t,c.parameters,c.relativeSignalsPath));if("blocks"in c){let p=null;return async d=>{p??=await Ee(c),p(d,i,c.parameters,c.relativeSignalsPath??"",l,a(s,d,t,c.parameters,c.relativeSignalsPath))}}if("name"in c){if(n)return n(t,o,c),null;let p=c.name;return d=>{e?.[p]?e[p](d,t,i,s,c.parameters):console.warn(`javascript function named: "${p}" not found, maybe missing a "export" ?`)}}return null}bindHandler(r,e,t,i,s){if(!t){r.addEventListener(e,s);return}let l=setInterval(()=>{r.isConnected?s(null):clearInterval(l)},i)}};import{OverlayLayer as Gt,DesignItem as $,InsertAction as qt,BindingTarget as j,PropertyType as be}from"@node-projects/web-component-designer";var qe=class{constructor(e,t){this._bindingsHelper=e,this._visualizationHandler=t}_bindingsHelper;_visualizationHandler;rectMap=new Map;rect;dragEnter(e,t,i){let s=$.GetDesignItem(i);if(s&&!s.isRootItem){let l=e.getNormalizedElementCoordinates(i);this.rect=e.overlayLayer.drawRect("IobrokerWebuiBindableObjectDragDropService",l.x,l.y,l.width,l.height,"",null,Gt.Background),this.rect.style.fill="#ff0000",this.rect.style.opacity="0.3",this.rectMap.set(i,this.rect)}}dragLeave(e,t,i){let s=$.GetDesignItem(i);if(s&&!s.isRootItem){let l=this.rectMap.get(i);e.overlayLayer.removeOverlay(l),this.rectMap.delete(i)}}dragOver(e,t,i){return"copy"}async drop(e,t,i,s){for(let o of this.rectMap.values())e.overlayLayer.removeOverlay(o);this.rectMap.clear();let l=$.GetDesignItem(s),a=await this._visualizationHandler.getObject(i.fullName),n=this._visualizationHandler.getSignalInformation(a);if(l&&!l.isRootItem)if(s instanceof HTMLInputElement){let o={signal:i.fullName,target:j.property},c=this._bindingsHelper.serializeBinding(s,s.type=="checkbox"?"checked":"value",o);l.setAttribute(c[0],c[1])}else{let o={signal:i.fullName,target:j.content},c=this._bindingsHelper.serializeBinding(s,null,o);l.setAttribute(c[0],c[1])}else{let o=e.getNormalizedEventCoordinates(t),c,p,d=await this._visualizationHandler.getState(i.fullName);if(n.role==="url"&&typeof d?.val=="string")if(d.val.endsWith("jpg")||d.val.endsWith("jpeg")||d.val.endsWith("png")||d.val.endsWith("gif")||d.val.endsWith("svg")){let h=document.createElement("img");c=$.createDesignItemFromInstance(h,e.serviceContainer,e.instanceServiceContainer),p=c.openGroup("Insert");let u={signal:i.fullName,target:j.property},g=this._bindingsHelper.serializeBinding(h,"src",u);c.setAttribute(g[0],g[1]),c.element.src=d.val}else if(d.val.endsWith("mp4")){let h=document.createElement("video");c=$.createDesignItemFromInstance(h,e.serviceContainer,e.instanceServiceContainer),p=c.openGroup("Insert");let u={signal:i.fullName,target:j.property},g=this._bindingsHelper.serializeBinding(h,"src",u);c.setAttribute(g[0],g[1]),c.element.src=d.val}else{let h=document.createElement("iframe");c=$.createDesignItemFromInstance(h,e.serviceContainer,e.instanceServiceContainer),p=c.openGroup("Insert");let u={signal:i.fullName,target:j.property},g=this._bindingsHelper.serializeBinding(h,"src",u);c.setAttribute(g[0],g[1]),c.element.src=d.val}if(!c){let h=document.createElement("input");c=$.createDesignItemFromInstance(h,e.serviceContainer,e.instanceServiceContainer),p=c.openGroup("Insert");let u=n.writeable!==!1,g={signal:i.fullName,target:j.property,twoWay:u},f=this._bindingsHelper.serializeBinding(h,"value",g);n.type==="boolean"?(f=this._bindingsHelper.serializeBinding(h,"checked",g),c.setAttribute("type","checkbox")):n.role=="date"?(g.twoWay=u,f=this._bindingsHelper.serializeBinding(h,"value-as-number",g),c.setAttribute("type","date"),c.setAttribute("readonly","")):n.role=="datetime"&&(g.twoWay=u,f=this._bindingsHelper.serializeBinding(h,"value-as-number",g),c.setAttribute("type","datetime-local"),c.setAttribute("readonly","")),c.setAttribute(f[0],f[1])}c.setStyle("position","absolute"),c.setStyle("left",o.x+"px"),c.setStyle("top",o.y+"px"),e.instanceServiceContainer.undoService.execute(new qt(e.rootDesignItem,e.rootDesignItem.childCount,c)),p.commit(),requestAnimationFrame(()=>e.instanceServiceContainer.selectionService.setSelectedElements([c]))}}dragOverOnProperty(e,t,i){return"copy"}dropOnProperty(e,t,i,s){if(t.type=="signal"){t.service.setValue(s,t,i.fullName);return}let l={signal:i.fullName,target:j.property};t.propertyType==be.attribute&&(l.target=j.attribute),t.propertyType==be.cssValue&&(l.target=j.css),l.signal=i.fullName,l.twoWay=t.propertyType==be.property||t.propertyType==be.propertyAndAttribute;let a=s[0].openGroup("drop binding");for(let n of s){let o=this._bindingsHelper.serializeBinding(n.element,t.name,l);n.setAttribute(o[0],o[1])}a.commit()}};import{BindingMode as Te,BindingTarget as Xe,PropertiesHelper as Xt}from"@node-projects/web-component-designer";var Ye=class r{constructor(e){this._bindingsHelper=e}_bindingsHelper;static type="visualization-binding";getBindings(e){return Array.from(this._bindingsHelper.getBindings(e.element)).map(i=>({targetName:i[1].target===Xe.css||i[1].target===Xe.attribute?Xt.camelToDashCase(i[0]):i[0],target:i[1].target,mode:i[1].twoWay?Te.twoWay:Te.oneWay,invert:i[1].inverted,bindableObjectNames:i[1].signal.split(";"),expression:i[1].expression,expressionTwoWay:i[1].expressionTwoWay,converter:i[1].converter,converters:i[1].converter,type:r.type,service:this,changedEvents:i[1].events,historic:i[1].historic,writeBackSignal:i[1].writeBackSignal}))}setBinding(e,t){let i={signal:t.bindableObjectNames.join(";"),target:t.target};i.inverted=t.invert,i.twoWay=t.mode==Te.twoWay,i.expression=t.expression,i.expressionTwoWay=t.expressionTwoWay,i.historic=t.historic,i.type=t.type,typeof t.converters=="string"?i.converter=t.converters:Array.isArray(t.converters)&&t.converters.length>0?i.converter=Object.fromEntries(t.converters.map(a=>[a.key,a.value])):t.converters!=null&&(i.converter=t.converters),i.target=t.target,i.events=t.changedEvents,i.writeBackSignal=t.writeBackSignal;let s=this._bindingsHelper.serializeBinding(e.element,t.targetName,i),l=e.openGroup("edit_binding");return e.setAttribute(s[0],s[1]),l.commit(),!0}clearBinding(e,t,i){let s=this._bindingsHelper.getBindingAttributeName(e.element,t,i);return e.removeAttribute(s),!0}};var Yt=[{prefix:"?@",itemType:"attribute"},{prefix:"#@",itemType:"attribute"},{prefix:"?$",itemType:"signalObject"},{prefix:"#$",itemType:"signalObject"},{prefix:"??",itemType:"property"},{prefix:"##",itemType:"property"},{prefix:"?",itemType:"property"},{prefix:"#",itemType:"property"}];function Ke(r){let e=Yt.find(t=>r.startsWith(t.prefix));return e?{name:r.substring(e.prefix.length),...e}:{name:r,prefix:"",itemType:"signal"}}var Ze=class{getRefactorings(e){let t=[];for(let i of e){let s=i.serviceContainer.bindingService.getBindings(i);if(s)for(let l of s)for(let a of l.bindableObjectNames)if(a.includes(":")){let n=a.split(":")[0],o=Ke(a.substring(n.length+1));t.push({service:this,name:o.name,itemType:o.itemType,designItem:i,type:"binding",sourceObject:l,display:l.target+"/"+l.targetName+" - "+n+":",shortName:n,prefix:o.prefix})}else{let n=Ke(a);t.push({service:this,name:n.name,itemType:n.itemType,designItem:i,type:"binding",sourceObject:l,display:l.target+"/"+l.targetName,prefix:n.prefix})}}return t}refactor(e,t,i){let s=e.sourceObject;e.shortName?s.bindableObjectNames=s.bindableObjectNames.map(l=>l==e.shortName+":"+e.prefix+t?e.shortName+":"+e.prefix+i:l):s.bindableObjectNames=s.bindableObjectNames.map(l=>l==e.prefix+t?e.prefix+i:l),e.designItem.serviceContainer.bindingService.setBinding(e.designItem,s)}};var Qe=class{dragOverOnProperty(e,t,i){return"copy"}dropOnProperty(e,t,i,s){t.service.setValue(s,t,i.text)}};import{BindingTarget as C}from"@node-projects/web-component-designer";var et=class{getRefactorings(e){let t=[];for(let i of e)for(let s of i.attributes())if(s[0][0]=="@"){let l=s[1];if(l[0]=="{"){let a=JSON.parse(l);if("commands"in a)for(let n of a.commands){for(let o in n){let c=n[o];if(c!=null&&typeof c=="object"){let p=c;if(p.source==="signal")t.push({name:p.name,itemType:"signal",target:C.event,targetName:s[0],service:this,designItem:i,type:"script",sourceObject:a,display:n.type+"/"+s[0].substring(1)+"/"+o+"[signal]",refactor:d=>p.name=d});else if(p.source==="property")t.push({name:p.name,itemType:"property",target:C.event,targetName:s[0],service:this,designItem:i,type:"script",sourceObject:a,display:n.type+"/"+s[0].substring(1)+"/"+o+"[property]",refactor:d=>p.name=d});else if(p.source==="complexString")for(let d of p.name.matchAll(/\{(.*?)\}/g)){let h=d[0],u=d[1];if(u[0]==="?"){let g="?";u=u.substring(1),u[0]==="?"&&(g="??",u=u.substring(1)),t.push({name:u,itemType:"property",target:C.event,targetName:s[0],service:this,designItem:i,type:"script",sourceObject:a,display:n.type+"/"+s[0].substring(1)+"/"+o+"[complexString]->property",refactor:f=>p.name=p.name.replace(h,"{"+g+f+"}")})}else t.push({name:u,itemType:"signal",target:C.event,targetName:s[0],service:this,designItem:i,type:"script",sourceObject:a,display:n.type+"/"+s[0].substring(1)+"/"+o+"[complexString]->signal",refactor:g=>p.name=p.name.replace(h,"{"+g+"}")})}}}switch(n.type){case"SetSignalValue":n.signal&&typeof n.signal=="string"&&t.push({name:n.signal,itemType:"signal",target:C.event,targetName:s[0],display:n.type+"/"+s[0].substring(1)+"/signal",service:this,designItem:i,type:"script",sourceObject:a,refactor:o=>n.signal=o});break;case"ToggleSignalValue":n.signal&&typeof n.signal=="string"&&t.push({name:n.signal,itemType:"signal",target:C.event,targetName:s[0],display:n.type+"/"+s[0].substring(1)+"/signal",service:this,designItem:i,type:"script",sourceObject:a,refactor:o=>n.signal=o});break;case"IncrementSignalValue":n.signal&&typeof n.signal=="string"&&t.push({name:n.signal,itemType:"signal",target:C.event,targetName:s[0],display:n.type+"/"+s[0].substring(1)+"/signal",service:this,designItem:i,type:"script",sourceObject:a,refactor:o=>n.signal=o});break;case"DecrementSignalValue":n.signal&&typeof n.signal=="string"&&t.push({name:n.signal,itemType:"signal",target:C.event,targetName:s[0],display:n.type+"/"+s[0].substring(1)+"/signal",service:this,designItem:i,type:"script",sourceObject:a,refactor:o=>n.signal=o});break;case"SetBitInSignal":n.signal&&typeof n.signal=="string"&&t.push({name:n.signal,itemType:"signal",target:C.event,targetName:s[0],display:n.type+"/"+s[0].substring(1)+"/signal",service:this,designItem:i,type:"script",sourceObject:a,refactor:o=>n.signal=o});break;case"ClearBitInSignal":n.signal&&typeof n.signal=="string"&&t.push({name:n.signal,itemType:"signal",target:C.event,targetName:s[0],display:n.type+"/"+s[0].substring(1)+"/signal",service:this,designItem:i,type:"script",sourceObject:a,refactor:o=>n.signal=o});break;case"ToggleBitInSignal":n.signal&&typeof n.signal=="string"&&t.push({name:n.signal,itemType:"signal",target:C.event,targetName:s[0],display:n.type+"/"+s[0].substring(1)+"/signal",service:this,designItem:i,type:"script",sourceObject:a,refactor:o=>n.signal=o});break;case"OpenScreen":n.screen&&typeof n.screen=="string"&&t.push({name:n.screen,itemType:"screen",target:C.event,targetName:s[0],display:n.type+"/"+s[0].substring(1)+"/screen",service:this,designItem:i,type:"script",sourceObject:a,refactor:o=>n.screen=o});break;case"OpenDialog":n.screen&&typeof n.screen=="string"&&t.push({name:n.screen,itemType:"screen",target:C.event,targetName:s[0],display:n.type+"/"+s[0].substring(1)+"/screen",service:this,designItem:i,type:"script",sourceObject:a,refactor:o=>n.screen=o});break;case"CalculateSignalValue":n.targetSignal&&typeof n.targetSignal=="string"&&t.push({name:n.targetSignal,itemType:"signal",target:C.event,targetName:s[0],display:n.type+"/"+s[0].substring(1)+"/targetSignal",service:this,designItem:i,type:"script",sourceObject:a,refactor:o=>n.targetSignal=o});break;case"SubscribeSignal":n.signal&&typeof n.signal=="string"&&t.push({name:n.signal,itemType:"signal",target:C.event,targetName:s[0],display:n.type+"/"+s[0].substring(1)+"/signal",service:this,designItem:i,type:"script",sourceObject:a,refactor:o=>n.signal=o});break;case"UnsubscribeSignal":n.signal&&typeof n.signal=="string"&&t.push({name:n.signal,itemType:"signal",target:C.event,targetName:s[0],display:n.type+"/"+s[0].substring(1)+"/signal",service:this,designItem:i,type:"script",sourceObject:a,refactor:o=>n.signal=o});break;case"ShowMessageBox":n.resultSignal&&typeof n.resultSignal=="string"&&t.push({name:n.resultSignal,itemType:"signal",target:C.event,targetName:s[0],display:n.type+"/"+s[0].substring(1)+"/resultSignal",service:this,designItem:i,type:"script",sourceObject:a,refactor:o=>n.resultSignal=o});break}}else"blocks"in a;if("parameters"in a)for(let n in a.parameters)typeof a.parameters[n]=="string"&&t.push({name:a.parameters[n],itemType:"parameter",target:C.event,targetName:s[0],service:this,designItem:i,type:"script",sourceObject:a,display:s[0].substring(1)+"/parameters/"+n,refactor:o=>a.parameters[n]=o})}}return t}refactor(e,t,i){e.refactor(i);let s=JSON.stringify(e.sourceObject);e.designItem.setAttribute(e.targetName,s)}};import{BasePropertyEditor as Kt}from"@node-projects/web-component-designer";var tt=class extends Kt{_ip;_container;constructor(e,t){super(e),this._container=document.createElement("div"),this._container.style.display="flex",this._ip=document.createElement("input"),this._ip.onchange=s=>this._valueChanged(this._ip.value),this._ip.onfocus=s=>{this._ip.selectionStart=0,this._ip.selectionEnd=this._ip.value?.length},this._container.appendChild(this._ip);let i=document.createElement("button");i.textContent="...",i.onclick=async()=>{let s=t.createBindableObjectBrowser();s.initialize(this.designItems[0].serviceContainer,this.designItems[0].instanceServiceContainer,"property"),s.title="select signal...";let l=new AbortController;s.objectDoubleclicked.on(()=>{l.abort(),this._ip.value=s.selectedObject.fullName,this._valueChanged(this._ip.value)}),await t.openConfirmation(s,{x:100,y:100,width:400,height:300,abortSignal:l.signal})&&(this._ip.value=s.selectedObject.fullName,this._valueChanged(this._ip.value))},this._container.appendChild(i),this.element=this._container}refreshValue(e,t){t==null?this._ip.value="":this._ip.value=t}};import{EventsService as Zt}from"@node-projects/web-component-designer";var it=class r extends Zt{static _cyclicEvent=[{name:`${ye}:100`,propertyName:void 0,eventObjectName:"Event",description:"this event will retrigger itself every 100 ms"}];getPossibleEvents(e){let t=super.getPossibleEvents(e);return t.push(...r._cyclicEvent),t}getEvent(e,t){return t.includes(ye)?r._cyclicEvent.find(s=>s.name==t)??{name:t,propertyName:"on"+t,eventObjectName:"Event"}:super.getEvent(e,t)}};import{PropertyType as oi}from"@node-projects/web-component-designer/dist/elements/services/propertiesService/PropertyType.js";import{BaseCustomWebComponentLazyAppend as ii,css as si}from"@node-projects/base-custom-webcomponent";import{BindingTarget as ni}from"@node-projects/web-component-designer/dist/elements/item/BindingTarget.js";import{ContextMenu as ai}from"@node-projects/web-component-designer/dist/elements/helper/contextMenu/ContextMenu.js";import{BindingTarget as ve}from"@node-projects/web-component-designer/dist/elements/item/BindingTarget.js";import{RefreshMode as Qt}from"@node-projects/web-component-designer/dist/elements/services/propertiesService/IPropertiesService.js";import{PropertyType as ei}from"@node-projects/web-component-designer/dist/elements/services/propertiesService/PropertyType.js";import{ValueType as st}from"@node-projects/web-component-designer/dist/elements/services/propertiesService/ValueType.js";import{AbstractPropertiesService as ti}from"@node-projects/web-component-designer/dist/elements/services/propertiesService/services/AbstractPropertiesService.js";var xe=class extends ti{getRefreshMode(){return Qt.fullOnValueChange}isHandledElement(e){return!e.isRootItem}getBindings(e){return e.serviceContainer.getServices("bindingService").flatMap(t=>(t.getBindings(e)??[]).filter(i=>i.target===ve.class).map(i=>({...i,service:t})))}async getProperties(e){return this.getBindings(e).map(t=>this.createProperty(t.targetName))}async getProperty(e,t){return this.createProperty(t)}createProperty(e){return{name:e,type:"boolean",propertyType:ei.property,service:this}}getPropertyTarget(){return ve.class}getBinding(e,t){return this.getBindings(e[0]).find(i=>i.targetName===t.name)}isSet(e,t){return this.getBinding(e,t)?st.bound:st.none}getValue(e,t){return this.getBinding(e,t)?.expression}validateName(e,t,i){return!t||/[\s"'<>/=]/.test(t)||t!==t.toLowerCase()?"Use a lowercase class name without spaces or HTML attribute delimiters, e.g. is-active.":t!==i&&this.getBindings(e).some(s=>s.targetName===t)?"This class already has a binding.":null}rename(e,t,i){let s=this.validateName(e,i,t.targetName);if(s)throw new Error(s);if(i===t.targetName)return;let l=e.openGroup(`rename class binding: ${t.targetName} to ${i}`);try{if(!t.service.setBinding(e,{...t,targetName:i}))throw new Error("The binding service could not rename this binding.");if(!t.service.clearBinding(e,t.targetName,ve.class))throw new Error("The binding service could not remove the previous binding.");l.commit()}catch(a){throw l.abort(),a}}remove(e,t){let i=e.openGroup(`remove class binding: ${t.targetName}`);try{if(!t.service.clearBinding(e,t.targetName,ve.class))throw new Error("The binding service could not remove this binding.");i.commit()}catch(s){throw i.abort(),s}}};var ue=class extends ii{_items=[];_service=new xe;_rows;_add;_toggle;_signature;_editing=!1;static style=si`
|
|
1298
|
+
`)&&!i.expression.includes(";")){let c=this.getShortBindingAttributeName(t,i.target,!0),d=((i.target==y.attribute||i.target==y.property&&t!="textContent"&&t!="innerHTML")&&i.twoWay?"=":"")+(i.inverted?"!":"")+i.signal+";"+i.expression+l;return[c,d]}return(i.inverted===null||i.inverted===!1)&&delete s.inverted,(i.expression===null||i.expression==="")&&delete s.expression,(i.expressionTwoWay===null||i.expressionTwoWay==="")&&delete s.expressionTwoWay,i.writeBackSignal||delete s.writeBackSignal,(i.twoWay===null||i.twoWay===!1)&&delete s.twoWay,delete s.target,i.historic||delete s.historic,[this.getJsonBindingAttributeName(t,i.target),JSON.stringify(s)]}getShortBindingAttributeName(e,t,i){return t==y.property&&e=="textContent"?J+"text":t==y.property&&e=="innerHTML"?J+"html":t==y.attribute?le+O.camelToDashCase(e):t==y.class?ce+O.camelToDashCase(e):t==y.css?pe+O.camelToDashCase(e):t==y.cssvar?i?ne+O.camelToDashCase(e):ne+r.camelToDotCase(e.substring(2)):se+O.camelToDashCase(e)}getJsonBindingAttributeName(e,t){return t==y.content||t==y.property&&e=="innerHTML"?J+"html":t==y.property&&e=="textContent"?J+"text":t==y.attribute?le+O.camelToDashCase(e):t==y.class?ce+r.camelToDotCase(e):t==y.css?pe+O.camelToDashCase(e):t==y.cssvar?ne+r.camelToDotCase(e.substring(2)):se+O.camelToDashCase(e)}getBindingAttributeName(e,t,i){return i==y.attribute?le+O.camelToDashCase(t):i==y.class?ce+r.camelToDotCase(t):i==y.css?pe+O.camelToDashCase(t):i==y.visible?Se:i==y.cssvar?ne+r.camelToDotCase(t):i==y.property&&t=="innerHTML"?J+"html":i==y.property&&t=="textContent"?J+"text":se+O.camelToDashCase(t)}*getBindings(e){if(e.attributes)for(let t of e.attributes)t.name.startsWith(se)?yield this.parseBinding(e,t.name,t.value,y.property,se):t.name.startsWith(J)?yield this.parseBinding(e,t.name==="bind-content:html"?"bind-prop:inner-h-t-m-l":"bind-prop:text-content",t.value,y.property,se):t.name.startsWith(le)?yield this.parseBinding(e,t.name,t.value,y.attribute,le):t.name.startsWith(ce)?yield this.parseBinding(e,t.name,t.value,y.class,ce):t.name.startsWith(pe)?yield this.parseBinding(e,t.name,t.value,y.css,pe):t.name.startsWith(ne)?yield this.parseBinding(e,t.name,t.value,y.cssvar,ne):t.name.startsWith(Se)&&(yield this.parseBinding(e,t.name,t.value,y.visible,Se))}applyAllBindings(e,t,i,s,l){let a=[],n=document.createTreeWalker(e,NodeFilter.SHOW_ELEMENT),o=n.nextNode();for(;o;){let c=this.getBindings(o);for(let p of c)try{let d=this.applyBinding(o,p,t,i,s),h=!1,u=()=>{h||(h=!0,d())};if(a.push(u),p[1].maybeLitElement&&o.localName.includes("-")&&!customElements.get(o.localName)){let g=o,f=p;customElements.whenDefined(o.localName).then(()=>{!h&&de(g)&&(h=!0,d(),f[1].events=f[1].litEventNames,a.push(this.applyBinding(g,f,t,i,s)))})}}catch(d){console.warn("error applying binding",o,p,d)}if(l&&l(o)){let p=n.nextSibling();for(;!p&&o;)o=n.parentNode(),p=n.nextSibling();o=p}else o=n.nextNode()}return a}static#e=0;async parseCssBindings(e,t,i,s){if(!e.includes(We))return[Me(e),[]];let l=await import("@node-projects/css-parser"),a=l.parse(e),n=[];for(let c of a.stylesheet.rules)if(c.type===l.CssTypes.rule){for(let p of c.declarations)if(p.type===l.CssTypes.declaration&&p.value.includes(We)){let d=this.parseCssBinding(p.value,t,i,s);p.value=d[0],n.push(...d[1])}}let o=l.stringify(a,{indent:"",compress:!0});return[Me(o),n]}parseCssBinding(e,t,i,s,l){e=e.trim();let a="",n="",o=!1,c="",p=!1,d=null,h=[];for(let u=0;u<e.length;u++){let g=e[u];if(o)if(p)c+=g,p=!1;else if(d&&g==="\\")p=!0;else if(g===d)d=null;else if(d===null&&g===")"){let f=r.#e++,w=Ht+f,x=[w,{signal:c,target:y.cssvar}];c.startsWith("{")&&(x=JSON.parse(c)),h.push(this.applyBinding(t,x,i,s,l)),a+="var("+w+")",o=!1,c=""}else c+=g;else g==="("?(n!=="bind"?(a+=n,a+=g):(o=!0,e[u+1]==="'"||e[u+1]==='"'?(u++,d=e[u]):d=null),n=""):g===" "||g===","||g==="("||g==="+"||g==="-"||g==="*"||g==="/"?(a+=n+g,n=""):n+=g}return[a+n,h]}subscribeToState(e,t){let i=this._stateSubscriptions.get(e);if(i){if(i.callbacks.add(t),i.hasValue){let l=i.value;queueMicrotask(()=>i.callbacks.has(t)&&t(e,l))}}else{i={callbacks:new Set([t]),callback:null,subscriptionResult:null,revision:0,hasValue:!1},i.callback=(l,a)=>{i.revision++,i.hasValue=!0,i.value=a;for(let n of i.callbacks)n(l,a)},this._stateSubscriptions.set(e,i);try{i.subscriptionResult=this._visualizationHandler.subscribeState(e,i.callback);let l=i.revision;this._visualizationHandler.getState(e).then(a=>{this._stateSubscriptions.get(e)===i&&i.revision===l&&i.callback(e,a)})}catch(l){throw this._stateSubscriptions.delete(e),i.subscriptionResult!=null&&this._visualizationHandler.unsubscribeState(e,i.callback,i.subscriptionResult),l}}let s=!0;return()=>{s&&(s=!1,i.callbacks.delete(t),i.callbacks.size===0&&this._stateSubscriptions.get(e)===i&&(this._stateSubscriptions.delete(e),this._visualizationHandler.unsubscribeState(e,i.callback,i.subscriptionResult)))}}applyBinding(e,t,i,s,l){let a=[],n=!0,o=()=>{if(n){n=!1,this._scheduledUpdates.delete(X);for(let m=a.length-1;m>=0;m--)a[m]();a.length=0}},c=m=>a.push(m),p=t[1].signal.split(";"),d=new Array(p.length);for(let m=0;m<p.length;m++){let b=p[m];d[m]="__"+m;let v=b.indexOf(":");v>=0&&(d[m]=b.substring(0,v),b=b.substring(v+1),p[m]=b)}let h=new Array(p.length),u=[...d,"__res","__ctx"];t[1].expression&&!t[1].compiledExpression&&(t[1].compiledExpression=t[1].expression.includes("return ")?new Function(u,t[1].expression):new Function(u,"return "+t[1].expression));let g=this.getCompiledConverter(t[1],u),f={element:e,root:s,boundNames:t[1].signal,boundTargetName:t[0],boundTargetType:t[1].target},w=this.createTargetWriter(e,t),x=t[1].writeBackSignal;x?.[0]==="."&&(x=i+x);let T,z,P,G=!1,q=!1,M=!1,X=()=>{if(M=!1,!n)return;let m=T;t[1].compiledExpression&&(m=t[1].compiledExpression(...h,z,f),z=m),t[1].converter&&(typeof t[1].converter=="string"?m=this.namedConverterCallback(t[1].converter,m,e,t):m=this.applyCompiledConverter(m,g,h,z,f,t[1].converterDefault)),t[1].inverted&&(m=!m),q=!0,!(G&&(m===null||typeof m!="object")&&Object.is(P,m))&&(G=!0,P=m,x&&this._visualizationHandler.setState(x,m,!0),w(m))},I=(m,b,v)=>{n&&(!v&&b===0&&(m=r.parseValueWithType(m,t)),h[b]=m,T=m,!q&&p.length===1?X():M||(M=!0,this.scheduleUpdate(X)))},L=new Array(p.length),oe=(m,b)=>(L[m]=b,()=>{L[m]===b&&(L[m]=null)}),k=(m,b,v)=>{let V=oe(v,S=>m[b]=S),R=fe(this,m,b,S=>I(S,v,!1));return()=>{R(),V()}},N=(m,b,v)=>{let V=oe(v,S=>S==null?m.removeAttribute(b):m.setAttribute(b,S)),R=Je(m,b,S=>I(S,v,!1));return()=>{R(),V()}},E=(m,b)=>{if(m.startsWith("?@")||m.startsWith("#@")){let _=m[0]==="?"?s:e;return _?N(_,m.substring(2),b):()=>{}}if(m.startsWith("?$")||m.startsWith("#$")){let _=m[0]==="?"?s:e;return _?k(_,m.substring(2),b):()=>{}}if(m[0]==="?"||m[0]==="#"){let _=m[0]==="?"?s:e;return _?k(_,m.substring(1),b):()=>{}}if(m[0]==="$"){let _=m.substring(1);_[0]==="."&&(_=this._visualizationHandler.getNormalizedSignalName(_,i,e));let D=!0;return this._visualizationHandler.getObject(_).then(A=>{D&&I(A,b,!0)}),()=>D=!1}if(m[0]==="\xA7"){if(!l)throw new Error(`No special value handler registered for "${m}"`);return He(l,m.substring(1),{element:e,binding:t,relativeSignalPath:i,root:s},_=>I(_,b,!0))}if(m.includes("{")){let _=new ke(this,this._visualizationHandler,m,A=>I(A.val,b,!1),e,i,s,l),D=oe(b,A=>_.setState(A));return()=>{_.dispose(),D()}}let v=m;if(v[0]==="."&&(v=this._visualizationHandler.getNormalizedSignalName(v,i,e)),t[1].historic){let _=t[1].historic;if(_.reloadInterval){let A=!0,W=null,F=async()=>{let at=await this._visualizationHandler.getHistoricData(v,_);!n||!A||(I(at?.values,b,!0),W=setTimeout(F,_.reloadInterval))};return F(),()=>{A=!1,W!==null&&clearTimeout(W),W=null}}let D=!0;return this._visualizationHandler.getHistoricData(v,_).then(A=>{D&&I(A?.values,b,!0)}),()=>D=!1}let V=(_,D)=>I(D?.val,b,!1),R=this.subscribeToState(v,V),S=oe(b,_=>this._visualizationHandler.setState(v,_));return()=>{R(),S()}},B=(m,b)=>{if(m.startsWith("?@")||m.startsWith("#@")||m.startsWith("?$")||m.startsWith("#$"))return E(m,b);let v=m[0];if(v!=="?"&&v!=="#"||m[1]===v)return E((v==="?"||v==="#")&&m[1]===v?m.substring(1):m,b);let V=v==="?"?s:e;if(!V)return()=>{};let R=m.substring(1),S=()=>{},_,A=fe(this,V,R,W=>{let F=typeof W=="string"?W:null;F!==_&&(S(),_=F,S=F?E(F,b):()=>{})});return()=>{A(),S()}};try{t[1].twoWay&&c(this.addTwoWayBinding(t,e,m=>L[0]?.(m)));for(let m=0;m<p.length;m++)typeof p[m]=="string"&&c(B(p[m],m))}catch(m){throw o(),m}return o}addTwoWayBinding(e,t,i){e[1].expressionTwoWay&&!e[1].compiledExpressionTwoWay&&(e[1].compiledExpressionTwoWay=e[1].expressionTwoWay.includes("return ")?new Function(["value"],e[1].expressionTwoWay):new Function(["value"],"return "+e[1].expressionTwoWay));let s=[],l=()=>{let a=e[1].target==y.attribute?t.getAttribute(e[0]):t[e[0]];a=r.parseValueWithType(a,e),e[1].compiledExpressionTwoWay&&(a=e[1].compiledExpressionTwoWay(a)),i(a)};for(let a of e[1].events??[]){let n=t[a];if(n instanceof Ft){let o=n.on(l);s.push(()=>o.dispose())}else t.addEventListener(a,l),s.push(()=>t.removeEventListener(a,l))}return()=>{for(let a of s)a();s.length=0}}static parseValueWithType(e,t){if(t[1].type)switch(t[1].type){case"number":return parseFloat(e);case"boolean":return e===!0||e==="true"||!!parseInt(e);case"string":return e?.toString();case"integer":return parseInt(e)}return e}compileConverter(e,t){let i=new Map,s=[],l=a=>{if(typeof a!="string")return{value:a};let n=new Function(t,"return `"+a+"`");return{value:a,evaluate:(o,c,p)=>n(...o,c,p)}};for(let a in e){let n=l(e[a]);if(i.set(a,n),a.startsWith(">=")){let o=parseFloat(a.substring(2));s.push({matches:c=>c>=o,value:n})}else if(a.startsWith("<=")){let o=parseFloat(a.substring(2));s.push({matches:c=>c<=o,value:n})}else if(a[0]===">"){let o=parseFloat(a.substring(1));s.push({matches:c=>c>o,value:n})}else if(a[0]==="<"){let o=parseFloat(a.substring(1));s.push({matches:c=>c<o,value:n})}else{let o=a.split("-");if(o.length>1){let c=o[0]===""?null:parseFloat(o[0]),p=o[1]===""?null:parseFloat(o[1]);s.push({matches:d=>(c===null||d>=c)&&(p===null||p>=d),value:n})}}}return{exactValues:i,conditions:s}}getCompiledConverter(e,t){if(!e.converter||typeof e.converter!="object")return null;let i=t.join("\0"),s=this._compiledConverters.get(e);if(s?.converter===e.converter&&s.argumentsKey===i)return s.compiled;let l=this.compileConverter(e.converter,t);return this._compiledConverters.set(e,{converter:e.converter,argumentsKey:i,compiled:l}),l}applyCompiledConverter(e,t,i,s,l,a){let n=String(e),o=t.exactValues.get(n),c=t.exactValues.has(n);if(!c){let p=parseFloat(e);for(let d of t.conditions)if(d.matches(p)){o=d.value,c=!0;break}}return c?o.evaluate?o.evaluate(i,s,l):o.value:a!==void 0?a:e}createTargetWriter(e,t){let i=t[0];switch(t[1].target){case y.property:return s=>e[i]=s;case y.attribute:return s=>{typeof s=="boolean"?s?e.setAttribute(i,""):e.removeAttribute(i):e.setAttribute(i,s)};case y.css:return s=>e.style[i]=s;case y.cssvar:return s=>e.style.setProperty(i,s);case y.class:return s=>e.classList.toggle(i,!!s);case y.visible:return s=>e.style.visibility=s?"":"collapse";default:return()=>{}}}static camelToDotCase(e){return e.replace(/([A-Z])/g,t=>`.${t[0].toLowerCase()}`)}static dotToCamelCase(e){return e.replace(/\.([a-z])/g,t=>t[1].toUpperCase())}};var Ue=class{name;relativeSignalsPath;commands;parameters};import{deepValue as U,setDeepValue as $e,sleep as Ut}from"@node-projects/web-component-designer/dist/elements/helper/Helper.js";import ae from"long";var ye="cyclic",$t={pointerdown:"pointerup",pointerenter:"pointerleave",mouseenter:"mouseleave",mouseover:"mouseout",focus:"blur",focusin:"focusout",keydown:"keyup"},Ge=class{_visualizationHandler;_subscriptionCallback=()=>{};constructor(r){this._visualizationHandler=r}async execute(r,e){let t=-1,i=!1,s=!1,l=e.event?.type,a=l?$t[l]:null;if(a){let n=e.element;l=="pointerdown"&&(n=window),n.addEventListener(a,()=>{i=!0},{once:!0})}for(let n=0;n<r.length;n++){let o=r[n];if(o.type=="Exit"){s=!0;break}else if(o.type=="If"){let p=(await this.evaluateIfFormula(o,e)?o.trueCommands:o.elseCommands)??[];if(!await this.execute(p,e)){s=!0;break}}else if(o.type=="Goto"){let c=await this.getValue(o.label,e);if(n=r.findIndex(p=>p.type=="Label"&&p.label==c),n<0)break}else if(o.type=="Condition"){let c=await this.getValue(o.value1,e),p=await this.getValue(o.value2,e),d=await this.getValue(o.comparisonType,e),h=!1;switch(d){case"==null":h=c==null;break;case"!=null":h=c!=null;break;case"==true":h=c==!0;break;case"==false":h=c==!1;break;case"==":h=c==p;break;case"!=":h=c!=p;break;case">":h=c>p;break;case"<":h=c<p;break;case">=":h=c>=p;break;case"<=":h=c<=p;break;case"&&":h=c&&p;break;case"||":h=c||p;break}if(h){await this.runExternalScript(await this.getValue(o.trueScriptName,e),await this.getValue(o.trueScriptType,e));let u=await this.getValue(o.trueGotoLabel,e);if(u&&(n=r.findIndex(g=>g.type=="Label"&&g.label==u),n<0))break}else{await this.runExternalScript(await this.getValue(o.falseScriptName,e),await this.getValue(o.falseScriptType,e));let u=await this.getValue(o.falseGotoLabel,e);if(u&&(n=r.findIndex(g=>g.type=="Label"&&g.label==u),n<0))break}}else if(o.type=="Repeat"){let c=await this.getValue(o.label,e),p=await this.getValue(o.count,e);if(await this.getValue(o.mode,e)=="eventValid"&&i){i=!1;continue}if(p!=0&&t==-1&&(t=p-1),t==0||(t>0&&t--,n=-1,c&&(n=r.findIndex(h=>h.type=="Label"&&h.label==c),n<0)))continue}else if(!await this.runScriptCommand(o,e)){s=!0;break}}return!s}async getValueFromTarget(r,e,t){return r==="property"?U(t.root,e):r==="elementProperty"?U(t.element,e):(await this._visualizationHandler.getState(this.getSignalName(e,t)))?.val}async setValueOnTarget(r,e,t,i){r==="property"?$e(t.root,e,i):r==="elementProperty"?$e(t.element,e,i):await this._visualizationHandler.setState(this.getSignalName(e,t),i)}async runExternalScript(r,e){}async runScriptCommand(command,context){switch(command.type){case"Comment":case"Label":case"Condition":case"If":case"Goto":case"Exit":case"Repeat":break;case"OpenUrl":{window.open(await this.getValue(command.url,context),command.target);break}case"Delay":{let r=await this.getValue(command.value??500,context);await Ut(r);break}case"Console":{let r=await this.getValue(command.target??"log",context),e=await this.getValue(command.message,context);console[r](e);break}case"ToggleSignalValue":{let r=await this.getValue(command.signal,context),e=await this.getValue(command.target,context),t=await this.getValueFromTarget(e,r,context);await this._visualizationHandler.setState(this.getSignalName(r,context),!t);break}case"ToggleSignalValueThroughList":{let r=await this.getValue(command.valueList,context),e=await this.getValue(command.signal,context),t=await this.getValue(command.target,context),i=await this.getValueFromTarget(t,e,context),s=r.indexOf(i)+1;s>=r.length&&(s=0);let l=r[s];await this._visualizationHandler.setState(this.getSignalName(e,context),l);break}case"SetSignalValue":{let r=await this.getValue(command.signal,context),e=await this.getValue(command.target,context);await this.setValueOnTarget(e,r,context,await this.getValue(command.value,context));break}case"IncrementSignalValue":{let r=await this.getValue(command.signal,context),e=await this.getValue(command.target,context),i=await this.getValueFromTarget(e,r,context)+await this.getValue(command.value,context);await this.setValueOnTarget(e,r,context,i);break}case"DecrementSignalValue":{let r=await this.getValue(command.signal,context),e=await this.getValue(command.target,context),i=await this.getValueFromTarget(e,r,context)-await this.getValue(command.value,context);await this.setValueOnTarget(e,r,context,i);break}case"CalculateSignalValue":{let formula=await this.getValue(command.formula,context),target=await this.getValue(command.target,context),targetSignal=await this.getValue(command.targetSignal,context),nm=await this.parseStringWithValues(formula,context),result=eval(nm);await this.setValueOnTarget(target,targetSignal,context,result);break}case"SetBitInSignal":{let r=await this.getValue(command.signal,context),e=await this.getValue(command.bitNumber??0,context),t=await this.getValue(command.target,context),i=await this.getValueFromTarget(t,r,context),s=ae.fromNumber(1).shiftLeft(e),l=ae.fromNumber(i).or(s).toNumber();await this.setValueOnTarget(t,r,context,l);break}case"ClearBitInSignal":{let r=await this.getValue(command.signal,context),e=await this.getValue(command.bitNumber??0,context),t=await this.getValue(command.target,context),i=await this.getValueFromTarget(t,r,context),s=ae.fromNumber(1).shiftLeft(e);s.negate();let l=ae.fromNumber(i).and(s).toNumber();await this.setValueOnTarget(t,r,context,l);break}case"ToggleBitInSignal":{let r=await this.getValue(command.signal,context),e=await this.getValue(command.bitNumber??0,context),t=await this.getValue(command.target,context),i=await this.getValueFromTarget(t,r,context),s=ae.fromNumber(1).shiftLeft(e),l=ae.fromNumber(i).xor(s).toNumber();await this.setValueOnTarget(t,r,context,l);break}case"Javascript":{let r=await this.getValue(command.script,context),e=context;e.shadowRoot=context.element.getRootNode(),e.instance=context.shadowRoot.host,command.compiledScript||(command.compiledScript=new Function("context",r)),command.compiledScript(e);break}case"SetElementProperty":{command=Q.upgradeSetElementProperty(command);let r=await this.getValue(command.name,context);r===""&&(r=null);let e=await this.getValue(command.value,context),t=await this.getValue(command.parentIndex??0,context),i=await this.getValue(command.target??"property",context),s=await this.getValue(command.targetSelectorTarget??"container",context),l=await this.getValue(command.targetSelector,context),a=await this.getValue(command.mode??"toggle",context),n=this.getTargetFromTargetSelector(context,s,t,l);for(let o of n)i=="attribute"?o.setAttribute(r,e):i=="property"?o[r]=e:i=="css"?o.style[r]=e:i=="class"&&(a==="toggle"?o.classList.toggle(r??e):a==="remove"?o.classList.remove(r??e):o.classList.add(r??e));break}case"SubscribeSignal":{let r=await this.getValue(command.signal,context);if(await this.getValue(command.oneTime,context)){let t=()=>{this._visualizationHandler.unsubscribeState(r,t,null)};this._visualizationHandler.subscribeState(r,t)}else this._visualizationHandler.subscribeState(r,this._subscriptionCallback);break}case"UnsubscribeSignal":{let r=await this.getValue(command.signal,context);this._visualizationHandler.unsubscribeState(r,this._subscriptionCallback,null);break}case"WriteSignalsInGroup":{let r=await this.getValue(command.group,context);this._visualizationHandler.writeSignalsInGroup(r);break}case"ClearSignalsInGroup":{let r=await this.getValue(command.group,context);this._visualizationHandler.clearSignalsInGroup(r);break}case"RunScript":{let r=await this.getValue(command.name,context),e=await this.getValue(command.scriptType,context);this.runExternalScript(r,e);break}case"ShowMessageBox":{let r=null,e=await this.getValue(command.exitScriptOnCancel,context);if(await this.getValue(command.buttons,context)=="yesNo"){let s=await this.getValue(command.message,context);confirm(s)?r=1:r=2}else{let s=await this.getValue(command.message,context);alert(s),r=1}let i=await this.getValue(command.resultSignal,context);if(i&&this._visualizationHandler.setState(i,r),e&&r!=1)return!1;break}case"ShowPrompt":{let r=await this.getValue(command.message,context),e=await this.getValue(command.default,context),t=prompt(r,e),i=await this.getValue(command.resultSignal,context);i&&t&&this._visualizationHandler.setState(i,t);break}case"Login":case"Logout":case"CloseDialog":case"OpenDialog":case"OpenScreen":case"SwitchLanguage":case"CopySignalValuesFromFolder":case"ExportSignalValuesAsJson":case"ImportSignalValuesFromJson":{alert('command: "'+command.type+'" is not yet implemented');break}}return!0}getTarget(r,e,t){if(e==="container"){let i=r.element.getRootNode().host;for(let s=0;s<(t??0);s++)i=i.getRootNode().host;return i}else if(e==="element"){let i=r.element;for(let s=0;s<(t??0);s++)i=i.parentElement;return i}return null}getTargetFromTargetSelector(r,e,t,i){let s=this.getTarget(r,e,t),l=[s];return i&&(e==="container"?l=s.shadowRoot.querySelectorAll(i):l=s.querySelectorAll(i)),l}async getValue(value,outerContext){if(value==null)return null;if(typeof value=="object")switch(value.source){case"property":return U(outerContext.root,value.name);case"elementProperty":return U(outerContext.element,value.name);case"signal":return(await this._visualizationHandler.getState(this.getSignalName(value.name,outerContext)))?.val;case"signalInProperty":{let r=U(outerContext.root,value.name);return(await this._visualizationHandler.getState(this.getSignalName(r,outerContext)))?.val}case"event":{let r=outerContext.event;return value.name&&(r=U(r,value.name)),r}case"parameter":return outerContext.parameters[value.name];case"context":return U(outerContext,value.name);case"complexString":{let r=value.name;return r!=null?await this.parseStringWithValues(r,outerContext):null}case"complexSignal":{let r=value.name;if(r!=null){let e=await this.parseStringWithValues(r,outerContext);return(await this._visualizationHandler.getState(this.getSignalName(e,outerContext)))?.val}return null}case"expression":{var ctx=outerContext;return eval(value.name)}}return value}async getStateOrFieldOrParameter(name,context){if(name[0]==="\xA7"){var ctx=context;return eval("ctx."+name.substring(1))}else{if(name[0]==="?"&&name[1]==="?")return context.root[name.substring(2)];if(name[0]==="?")return await this._visualizationHandler.getState(this.getSignalName(context.root[name.substring(1)],context))}return await this._visualizationHandler.getState(this.getSignalName(name,context))}async parseStringWithValues(r,e){let t=Ce(r),i=await Promise.all(t.signals.map(l=>this.getStateOrFieldOrParameter(this.getSignalName(l,e),e))),s=t.parts[0];for(let l=0;l<t.parts.length-1;l++){let a=i[l];typeof a=="object"&&(a=a.val),a==null&&(a=""),s+=a+t.parts[l+1]}return s}async evaluateIfFormula(r,e){let t=r.signals??[],i=t.map((a,n)=>a.varName?.trim()||"__"+n),s=await Promise.all(t.map(a=>this.getValue(a,e))),l=await this.getValue(r.formula,e);return(!r.compiledFormula||r._compiledFormulaSrc!==l)&&(r.compiledFormula=new Function(...i,"return ("+l+");"),r._compiledFormulaSrc=l),!!r.compiledFormula(...s)}getSignalName(r,e){return r[0]==="."?e.relativeSignalsPath+r:r}createScriptContext(r,e,t,i,s){return{root:r,event:e,element:t,parameters:i,relativeSignalsPath:s}}async assignAllScripts(r,e,t,i,s,l,a,n){l??=this.createScriptContext;let o=await this.loadAndInitJsObject(r,e,t,i,n);for(let c of t.querySelectorAll("*"))for(let p of c.attributes)if(p.name[0]==="@")try{let d=p.name.substring(1),h=p.value.trim(),u=d.startsWith(ye),g=u?parseInt(d.substring(d.indexOf(":")+1)):null,f=await this.resolveHandler(h,o,c,t,i,s,l,a,d);f&&this.bindHandler(c,d,u,g,f)}catch{console.warn("error assigning script",c,p)}return o}async loadAndInitJsObject(r,e,t,i,s){if(!e)return null;try{let a=await import(URL.createObjectURL(new Blob([e],{type:"application/javascript"})));return s?s(a):a.init?.(i,t),a}catch(l){return console.error("error parsing javascript - "+r,l),null}}async resolveHandler(r,e,t,i,s,l,a,n,o){if(r[0]!=="{")return p=>{e?.[r]?e[r](p,t,i,s):console.warn(`javascript function named: "${r}" not found, maybe missing a "export" ?`)};let c=JSON.parse(r);if("commands"in c)return p=>this.execute(c.commands,a(s,p,t,c.parameters,c.relativeSignalsPath));if("blocks"in c){let p=null;return async d=>{p??=await Ee(c),p(d,i,c.parameters,c.relativeSignalsPath??"",l,a(s,d,t,c.parameters,c.relativeSignalsPath))}}if("name"in c){if(n)return n(t,o,c),null;let p=c.name;return d=>{e?.[p]?e[p](d,t,i,s,c.parameters):console.warn(`javascript function named: "${p}" not found, maybe missing a "export" ?`)}}return null}bindHandler(r,e,t,i,s){if(!t){r.addEventListener(e,s);return}let l=setInterval(()=>{r.isConnected?s(null):clearInterval(l)},i)}};import{OverlayLayer as Gt,DesignItem as $,InsertAction as qt,BindingTarget as j,PropertyType as be}from"@node-projects/web-component-designer";var qe=class{constructor(e,t){this._bindingsHelper=e,this._visualizationHandler=t}_bindingsHelper;_visualizationHandler;rectMap=new Map;rect;dragEnter(e,t,i){let s=$.GetDesignItem(i);if(s&&!s.isRootItem){let l=e.getNormalizedElementCoordinates(i);this.rect=e.overlayLayer.drawRect("IobrokerWebuiBindableObjectDragDropService",l.x,l.y,l.width,l.height,"",null,Gt.Background),this.rect.style.fill="#ff0000",this.rect.style.opacity="0.3",this.rectMap.set(i,this.rect)}}dragLeave(e,t,i){let s=$.GetDesignItem(i);if(s&&!s.isRootItem){let l=this.rectMap.get(i);e.overlayLayer.removeOverlay(l),this.rectMap.delete(i)}}dragOver(e,t,i){return"copy"}async drop(e,t,i,s){for(let o of this.rectMap.values())e.overlayLayer.removeOverlay(o);this.rectMap.clear();let l=$.GetDesignItem(s),a=await this._visualizationHandler.getObject(i.fullName),n=this._visualizationHandler.getSignalInformation(a);if(l&&!l.isRootItem)if(s instanceof HTMLInputElement){let o={signal:i.fullName,target:j.property},c=this._bindingsHelper.serializeBinding(s,s.type=="checkbox"?"checked":"value",o);l.setAttribute(c[0],c[1])}else{let o={signal:i.fullName,target:j.content},c=this._bindingsHelper.serializeBinding(s,null,o);l.setAttribute(c[0],c[1])}else{let o=e.getNormalizedEventCoordinates(t),c,p,d=await this._visualizationHandler.getState(i.fullName);if(n.role==="url"&&typeof d?.val=="string")if(d.val.endsWith("jpg")||d.val.endsWith("jpeg")||d.val.endsWith("png")||d.val.endsWith("gif")||d.val.endsWith("svg")){let h=document.createElement("img");c=$.createDesignItemFromInstance(h,e.serviceContainer,e.instanceServiceContainer),p=c.openGroup("Insert");let u={signal:i.fullName,target:j.property},g=this._bindingsHelper.serializeBinding(h,"src",u);c.setAttribute(g[0],g[1]),c.element.src=d.val}else if(d.val.endsWith("mp4")){let h=document.createElement("video");c=$.createDesignItemFromInstance(h,e.serviceContainer,e.instanceServiceContainer),p=c.openGroup("Insert");let u={signal:i.fullName,target:j.property},g=this._bindingsHelper.serializeBinding(h,"src",u);c.setAttribute(g[0],g[1]),c.element.src=d.val}else{let h=document.createElement("iframe");c=$.createDesignItemFromInstance(h,e.serviceContainer,e.instanceServiceContainer),p=c.openGroup("Insert");let u={signal:i.fullName,target:j.property},g=this._bindingsHelper.serializeBinding(h,"src",u);c.setAttribute(g[0],g[1]),c.element.src=d.val}if(!c){let h=document.createElement("input");c=$.createDesignItemFromInstance(h,e.serviceContainer,e.instanceServiceContainer),p=c.openGroup("Insert");let u=n.writeable!==!1,g={signal:i.fullName,target:j.property,twoWay:u},f=this._bindingsHelper.serializeBinding(h,"value",g);n.type==="boolean"?(f=this._bindingsHelper.serializeBinding(h,"checked",g),c.setAttribute("type","checkbox")):n.role=="date"?(g.twoWay=u,f=this._bindingsHelper.serializeBinding(h,"value-as-number",g),c.setAttribute("type","date"),c.setAttribute("readonly","")):n.role=="datetime"&&(g.twoWay=u,f=this._bindingsHelper.serializeBinding(h,"value-as-number",g),c.setAttribute("type","datetime-local"),c.setAttribute("readonly","")),c.setAttribute(f[0],f[1])}c.setStyle("position","absolute"),c.setStyle("left",o.x+"px"),c.setStyle("top",o.y+"px"),e.instanceServiceContainer.undoService.execute(new qt(e.rootDesignItem,e.rootDesignItem.childCount,c)),p.commit(),requestAnimationFrame(()=>e.instanceServiceContainer.selectionService.setSelectedElements([c]))}}dragOverOnProperty(e,t,i){return"copy"}dropOnProperty(e,t,i,s){if(t.type=="signal"){t.service.setValue(s,t,i.fullName);return}let l={signal:i.fullName,target:j.property};t.propertyType==be.attribute&&(l.target=j.attribute),t.propertyType==be.cssValue&&(l.target=j.css),l.signal=i.fullName,l.twoWay=t.propertyType==be.property||t.propertyType==be.propertyAndAttribute;let a=s[0].openGroup("drop binding");for(let n of s){let o=this._bindingsHelper.serializeBinding(n.element,t.name,l);n.setAttribute(o[0],o[1])}a.commit()}};import{BindingMode as Te,BindingTarget as Xe,PropertiesHelper as Xt}from"@node-projects/web-component-designer";var Ye=class r{constructor(e){this._bindingsHelper=e}_bindingsHelper;static type="visualization-binding";getBindings(e){return Array.from(this._bindingsHelper.getBindings(e.element)).map(i=>({targetName:i[1].target===Xe.css||i[1].target===Xe.attribute?Xt.camelToDashCase(i[0]):i[0],target:i[1].target,mode:i[1].twoWay?Te.twoWay:Te.oneWay,invert:i[1].inverted,bindableObjectNames:i[1].signal.split(";"),expression:i[1].expression,expressionTwoWay:i[1].expressionTwoWay,converter:i[1].converter,converters:i[1].converter,type:r.type,service:this,changedEvents:i[1].events,historic:i[1].historic,writeBackSignal:i[1].writeBackSignal}))}setBinding(e,t){let i={signal:t.bindableObjectNames.join(";"),target:t.target};i.inverted=t.invert,i.twoWay=t.mode==Te.twoWay,i.expression=t.expression,i.expressionTwoWay=t.expressionTwoWay,i.historic=t.historic,i.type=t.type,typeof t.converters=="string"?i.converter=t.converters:Array.isArray(t.converters)&&t.converters.length>0?i.converter=Object.fromEntries(t.converters.map(a=>[a.key,a.value])):t.converters!=null&&(i.converter=t.converters),i.target=t.target,i.events=t.changedEvents,i.writeBackSignal=t.writeBackSignal;let s=this._bindingsHelper.serializeBinding(e.element,t.targetName,i),l=e.openGroup("edit_binding");return e.setAttribute(s[0],s[1]),l.commit(),!0}clearBinding(e,t,i){let s=this._bindingsHelper.getBindingAttributeName(e.element,t,i);return e.removeAttribute(s),!0}};var Yt=[{prefix:"?@",itemType:"attribute"},{prefix:"#@",itemType:"attribute"},{prefix:"?$",itemType:"signalObject"},{prefix:"#$",itemType:"signalObject"},{prefix:"??",itemType:"property"},{prefix:"##",itemType:"property"},{prefix:"?",itemType:"property"},{prefix:"#",itemType:"property"}];function Ke(r){let e=Yt.find(t=>r.startsWith(t.prefix));return e?{name:r.substring(e.prefix.length),...e}:{name:r,prefix:"",itemType:"signal"}}var Ze=class{getRefactorings(e){let t=[];for(let i of e){let s=i.serviceContainer.bindingService.getBindings(i);if(s)for(let l of s)for(let a of l.bindableObjectNames)if(a.includes(":")){let n=a.split(":")[0],o=Ke(a.substring(n.length+1));t.push({service:this,name:o.name,itemType:o.itemType,designItem:i,type:"binding",sourceObject:l,display:l.target+"/"+l.targetName+" - "+n+":",shortName:n,prefix:o.prefix})}else{let n=Ke(a);t.push({service:this,name:n.name,itemType:n.itemType,designItem:i,type:"binding",sourceObject:l,display:l.target+"/"+l.targetName,prefix:n.prefix})}}return t}refactor(e,t,i){let s=e.sourceObject;e.shortName?s.bindableObjectNames=s.bindableObjectNames.map(l=>l==e.shortName+":"+e.prefix+t?e.shortName+":"+e.prefix+i:l):s.bindableObjectNames=s.bindableObjectNames.map(l=>l==e.prefix+t?e.prefix+i:l),e.designItem.serviceContainer.bindingService.setBinding(e.designItem,s)}};var Qe=class{dragOverOnProperty(e,t,i){return"copy"}dropOnProperty(e,t,i,s){t.service.setValue(s,t,i.text)}};import{BindingTarget as C}from"@node-projects/web-component-designer";var et=class{getRefactorings(e){let t=[];for(let i of e)for(let s of i.attributes())if(s[0][0]=="@"){let l=s[1];if(l[0]=="{"){let a=JSON.parse(l);if("commands"in a)for(let n of a.commands){for(let o in n){let c=n[o];if(c!=null&&typeof c=="object"){let p=c;if(p.source==="signal")t.push({name:p.name,itemType:"signal",target:C.event,targetName:s[0],service:this,designItem:i,type:"script",sourceObject:a,display:n.type+"/"+s[0].substring(1)+"/"+o+"[signal]",refactor:d=>p.name=d});else if(p.source==="property")t.push({name:p.name,itemType:"property",target:C.event,targetName:s[0],service:this,designItem:i,type:"script",sourceObject:a,display:n.type+"/"+s[0].substring(1)+"/"+o+"[property]",refactor:d=>p.name=d});else if(p.source==="complexString")for(let d of p.name.matchAll(/\{(.*?)\}/g)){let h=d[0],u=d[1];if(u[0]==="?"){let g="?";u=u.substring(1),u[0]==="?"&&(g="??",u=u.substring(1)),t.push({name:u,itemType:"property",target:C.event,targetName:s[0],service:this,designItem:i,type:"script",sourceObject:a,display:n.type+"/"+s[0].substring(1)+"/"+o+"[complexString]->property",refactor:f=>p.name=p.name.replace(h,"{"+g+f+"}")})}else t.push({name:u,itemType:"signal",target:C.event,targetName:s[0],service:this,designItem:i,type:"script",sourceObject:a,display:n.type+"/"+s[0].substring(1)+"/"+o+"[complexString]->signal",refactor:g=>p.name=p.name.replace(h,"{"+g+"}")})}}}switch(n.type){case"SetSignalValue":n.signal&&typeof n.signal=="string"&&t.push({name:n.signal,itemType:"signal",target:C.event,targetName:s[0],display:n.type+"/"+s[0].substring(1)+"/signal",service:this,designItem:i,type:"script",sourceObject:a,refactor:o=>n.signal=o});break;case"ToggleSignalValue":n.signal&&typeof n.signal=="string"&&t.push({name:n.signal,itemType:"signal",target:C.event,targetName:s[0],display:n.type+"/"+s[0].substring(1)+"/signal",service:this,designItem:i,type:"script",sourceObject:a,refactor:o=>n.signal=o});break;case"IncrementSignalValue":n.signal&&typeof n.signal=="string"&&t.push({name:n.signal,itemType:"signal",target:C.event,targetName:s[0],display:n.type+"/"+s[0].substring(1)+"/signal",service:this,designItem:i,type:"script",sourceObject:a,refactor:o=>n.signal=o});break;case"DecrementSignalValue":n.signal&&typeof n.signal=="string"&&t.push({name:n.signal,itemType:"signal",target:C.event,targetName:s[0],display:n.type+"/"+s[0].substring(1)+"/signal",service:this,designItem:i,type:"script",sourceObject:a,refactor:o=>n.signal=o});break;case"SetBitInSignal":n.signal&&typeof n.signal=="string"&&t.push({name:n.signal,itemType:"signal",target:C.event,targetName:s[0],display:n.type+"/"+s[0].substring(1)+"/signal",service:this,designItem:i,type:"script",sourceObject:a,refactor:o=>n.signal=o});break;case"ClearBitInSignal":n.signal&&typeof n.signal=="string"&&t.push({name:n.signal,itemType:"signal",target:C.event,targetName:s[0],display:n.type+"/"+s[0].substring(1)+"/signal",service:this,designItem:i,type:"script",sourceObject:a,refactor:o=>n.signal=o});break;case"ToggleBitInSignal":n.signal&&typeof n.signal=="string"&&t.push({name:n.signal,itemType:"signal",target:C.event,targetName:s[0],display:n.type+"/"+s[0].substring(1)+"/signal",service:this,designItem:i,type:"script",sourceObject:a,refactor:o=>n.signal=o});break;case"OpenScreen":n.screen&&typeof n.screen=="string"&&t.push({name:n.screen,itemType:"screen",target:C.event,targetName:s[0],display:n.type+"/"+s[0].substring(1)+"/screen",service:this,designItem:i,type:"script",sourceObject:a,refactor:o=>n.screen=o});break;case"OpenDialog":n.screen&&typeof n.screen=="string"&&t.push({name:n.screen,itemType:"screen",target:C.event,targetName:s[0],display:n.type+"/"+s[0].substring(1)+"/screen",service:this,designItem:i,type:"script",sourceObject:a,refactor:o=>n.screen=o});break;case"CalculateSignalValue":n.targetSignal&&typeof n.targetSignal=="string"&&t.push({name:n.targetSignal,itemType:"signal",target:C.event,targetName:s[0],display:n.type+"/"+s[0].substring(1)+"/targetSignal",service:this,designItem:i,type:"script",sourceObject:a,refactor:o=>n.targetSignal=o});break;case"SubscribeSignal":n.signal&&typeof n.signal=="string"&&t.push({name:n.signal,itemType:"signal",target:C.event,targetName:s[0],display:n.type+"/"+s[0].substring(1)+"/signal",service:this,designItem:i,type:"script",sourceObject:a,refactor:o=>n.signal=o});break;case"UnsubscribeSignal":n.signal&&typeof n.signal=="string"&&t.push({name:n.signal,itemType:"signal",target:C.event,targetName:s[0],display:n.type+"/"+s[0].substring(1)+"/signal",service:this,designItem:i,type:"script",sourceObject:a,refactor:o=>n.signal=o});break;case"ShowMessageBox":n.resultSignal&&typeof n.resultSignal=="string"&&t.push({name:n.resultSignal,itemType:"signal",target:C.event,targetName:s[0],display:n.type+"/"+s[0].substring(1)+"/resultSignal",service:this,designItem:i,type:"script",sourceObject:a,refactor:o=>n.resultSignal=o});break}}else"blocks"in a;if("parameters"in a)for(let n in a.parameters)typeof a.parameters[n]=="string"&&t.push({name:a.parameters[n],itemType:"parameter",target:C.event,targetName:s[0],service:this,designItem:i,type:"script",sourceObject:a,display:s[0].substring(1)+"/parameters/"+n,refactor:o=>a.parameters[n]=o})}}return t}refactor(e,t,i){e.refactor(i);let s=JSON.stringify(e.sourceObject);e.designItem.setAttribute(e.targetName,s)}};import{BasePropertyEditor as Kt}from"@node-projects/web-component-designer";var tt=class extends Kt{_ip;_container;constructor(e,t){super(e),this._container=document.createElement("div"),this._container.style.display="flex",this._ip=document.createElement("input"),this._ip.onchange=s=>this._valueChanged(this._ip.value),this._ip.onfocus=s=>{this._ip.selectionStart=0,this._ip.selectionEnd=this._ip.value?.length},this._container.appendChild(this._ip);let i=document.createElement("button");i.textContent="...",i.onclick=async()=>{let s=t.createBindableObjectBrowser();s.initialize(this.designItems[0].serviceContainer,this.designItems[0].instanceServiceContainer,"property"),s.title="select signal...";let l=new AbortController;s.objectDoubleclicked.on(()=>{l.abort(),this._ip.value=s.selectedObject.fullName,this._valueChanged(this._ip.value)}),await t.openConfirmation(s,{x:100,y:100,width:400,height:300,abortSignal:l.signal})&&(this._ip.value=s.selectedObject.fullName,this._valueChanged(this._ip.value))},this._container.appendChild(i),this.element=this._container}refreshValue(e,t){t==null?this._ip.value="":this._ip.value=t}};import{EventsService as Zt}from"@node-projects/web-component-designer";var it=class r extends Zt{static _cyclicEvent=[{name:`${ye}:100`,propertyName:void 0,eventObjectName:"Event",description:"this event will retrigger itself every 100 ms"}];getPossibleEvents(e){let t=super.getPossibleEvents(e);return t.push(...r._cyclicEvent),t}getEvent(e,t){return t.includes(ye)?r._cyclicEvent.find(s=>s.name==t)??{name:t,propertyName:"on"+t,eventObjectName:"Event"}:super.getEvent(e,t)}};import{PropertyType as oi}from"@node-projects/web-component-designer/dist/elements/services/propertiesService/PropertyType.js";import{BaseCustomWebComponentLazyAppend as ii,css as si}from"@node-projects/base-custom-webcomponent";import{BindingTarget as ni}from"@node-projects/web-component-designer/dist/elements/item/BindingTarget.js";import{ContextMenu as ai}from"@node-projects/web-component-designer/dist/elements/helper/contextMenu/ContextMenu.js";import{BindingTarget as ve}from"@node-projects/web-component-designer/dist/elements/item/BindingTarget.js";import{RefreshMode as Qt}from"@node-projects/web-component-designer/dist/elements/services/propertiesService/IPropertiesService.js";import{PropertyType as ei}from"@node-projects/web-component-designer/dist/elements/services/propertiesService/PropertyType.js";import{ValueType as st}from"@node-projects/web-component-designer/dist/elements/services/propertiesService/ValueType.js";import{AbstractPropertiesService as ti}from"@node-projects/web-component-designer/dist/elements/services/propertiesService/services/AbstractPropertiesService.js";var xe=class extends ti{getRefreshMode(){return Qt.fullOnValueChange}isHandledElement(e){return!e.isRootItem}getBindings(e){return e.serviceContainer.getServices("bindingService").flatMap(t=>(t.getBindings(e)??[]).filter(i=>i.target===ve.class).map(i=>({...i,service:t})))}async getProperties(e){return this.getBindings(e).map(t=>this.createProperty(t.targetName))}async getProperty(e,t){return this.createProperty(t)}createProperty(e){return{name:e,type:"boolean",propertyType:ei.property,service:this}}getPropertyTarget(){return ve.class}getBinding(e,t){return this.getBindings(e[0]).find(i=>i.targetName===t.name)}isSet(e,t){return this.getBinding(e,t)?st.bound:st.none}getValue(e,t){return this.getBinding(e,t)?.expression}validateName(e,t,i){return!t||/[\s"'<>/=]/.test(t)||t!==t.toLowerCase()?"Use a lowercase class name without spaces or HTML attribute delimiters, e.g. is-active.":t!==i&&this.getBindings(e).some(s=>s.targetName===t)?"This class already has a binding.":null}rename(e,t,i){let s=this.validateName(e,i,t.targetName);if(s)throw new Error(s);if(i===t.targetName)return;let l=e.openGroup(`rename class binding: ${t.targetName} to ${i}`);try{if(!t.service.setBinding(e,{...t,targetName:i}))throw new Error("The binding service could not rename this binding.");if(!t.service.clearBinding(e,t.targetName,ve.class))throw new Error("The binding service could not remove the previous binding.");l.commit()}catch(a){throw l.abort(),a}}remove(e,t){let i=e.openGroup(`remove class binding: ${t.targetName}`);try{if(!t.service.clearBinding(e,t.targetName,ve.class))throw new Error("The binding service could not remove this binding.");i.commit()}catch(s){throw i.abort(),s}}};var ue=class extends ii{_items=[];_service=new xe;_rows;_add;_toggle;_signature;_editing=!1;static style=si`
|
|
1299
1299
|
:host { display: block; grid-column: 1 / -1; min-width: 0; color: var(--wcd-color-text, white); }
|
|
1300
1300
|
:host([hidden]) { display: none !important; }
|
|
1301
1301
|
.header, .row { display: flex; align-items: center; gap: 8px; min-height: 28px; }
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"description": "web-component-designer addon for visualizations",
|
|
3
3
|
"name": "@node-projects/web-component-designer-visualization-addons",
|
|
4
|
-
"version": "1.1.
|
|
4
|
+
"version": "1.1.4",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
7
7
|
"author": "jochen.kuehner@gmx.de",
|
|
@@ -19,9 +19,9 @@
|
|
|
19
19
|
"@node-projects/css-parser": "^5.2.0",
|
|
20
20
|
"@node-projects/propertygrid.webcomponent": ">=1.2.3",
|
|
21
21
|
"@node-projects/splitview.webcomponent": ">=1.0.1",
|
|
22
|
-
"@node-projects/web-component-designer": "1.1.
|
|
23
|
-
"@node-projects/web-component-designer-codeview-monaco": "1.1.
|
|
24
|
-
"@node-projects/web-component-designer-widgets-wunderbaum": "1.1.
|
|
22
|
+
"@node-projects/web-component-designer": "1.1.4",
|
|
23
|
+
"@node-projects/web-component-designer-codeview-monaco": "1.1.4",
|
|
24
|
+
"@node-projects/web-component-designer-widgets-wunderbaum": "1.1.4",
|
|
25
25
|
"blockly": ">=13.2.1",
|
|
26
26
|
"long": ">=5.2.3"
|
|
27
27
|
},
|
|
@@ -88,6 +88,69 @@ const flushMicrotasks = async () => {
|
|
|
88
88
|
};
|
|
89
89
|
|
|
90
90
|
describe('BindingsHelper runtime', () => {
|
|
91
|
+
test('preserves local signal names for class and two-way checkbox bindings', async () => {
|
|
92
|
+
const handler = new TestVisualizationHandler();
|
|
93
|
+
handler.values.set('__expandedPkSupply', false);
|
|
94
|
+
handler.values.set('__confirmed', false);
|
|
95
|
+
const helper = new BindingsHelper(handler);
|
|
96
|
+
const element = document.createElement('div');
|
|
97
|
+
const checkbox = document.createElement('input');
|
|
98
|
+
checkbox.type = 'checkbox';
|
|
99
|
+
const disposeClass = helper.applyBinding(element, ['expanded', {
|
|
100
|
+
signal: '__expandedPkSupply',
|
|
101
|
+
target: BindingTarget.class
|
|
102
|
+
}], '', null);
|
|
103
|
+
const disposeCheckbox = helper.applyBinding(checkbox, ['checked', {
|
|
104
|
+
signal: '__confirmed',
|
|
105
|
+
twoWay: true,
|
|
106
|
+
events: ['change'],
|
|
107
|
+
target: BindingTarget.property
|
|
108
|
+
}], '', null);
|
|
109
|
+
await flushMicrotasks();
|
|
110
|
+
|
|
111
|
+
expect(handler.subscribeCalls).toEqual(['__expandedPkSupply', '__confirmed']);
|
|
112
|
+
expect(handler.getStateCalls).toEqual(['__expandedPkSupply', '__confirmed']);
|
|
113
|
+
expect(element.classList.contains('expanded')).toBe(false);
|
|
114
|
+
expect(checkbox.checked).toBe(false);
|
|
115
|
+
|
|
116
|
+
handler.emit('__expandedPkSupply', true);
|
|
117
|
+
handler.emit('__confirmed', true);
|
|
118
|
+
await flushMicrotasks();
|
|
119
|
+
expect(element.classList.contains('expanded')).toBe(true);
|
|
120
|
+
expect(checkbox.checked).toBe(true);
|
|
121
|
+
|
|
122
|
+
checkbox.checked = false;
|
|
123
|
+
checkbox.dispatchEvent(new Event('change'));
|
|
124
|
+
expect(handler.setStateCalls).toEqual([{ id: '__confirmed', value: false, ack: undefined }]);
|
|
125
|
+
|
|
126
|
+
disposeClass();
|
|
127
|
+
disposeCheckbox();
|
|
128
|
+
expect(handler.unsubscribeCalls).toEqual(['__expandedPkSupply', '__confirmed']);
|
|
129
|
+
});
|
|
130
|
+
|
|
131
|
+
test('still resolves doubled question-mark and hash prefixes as direct property bindings', () => {
|
|
132
|
+
const handler = new TestVisualizationHandler();
|
|
133
|
+
const helper = new BindingsHelper(handler);
|
|
134
|
+
const root = document.createElement('div');
|
|
135
|
+
const element = document.createElement('div');
|
|
136
|
+
root['screenValue'] = 7;
|
|
137
|
+
element['targetValue'] = 9;
|
|
138
|
+
const disposeScreen = helper.applyBinding(element, ['fromScreen', {
|
|
139
|
+
signal: '??screenValue',
|
|
140
|
+
target: BindingTarget.property
|
|
141
|
+
}], '', root);
|
|
142
|
+
const disposeTarget = helper.applyBinding(element, ['fromTarget', {
|
|
143
|
+
signal: '##targetValue',
|
|
144
|
+
target: BindingTarget.property
|
|
145
|
+
}], '', root);
|
|
146
|
+
|
|
147
|
+
expect(element['fromScreen']).toBe(7);
|
|
148
|
+
expect(element['fromTarget']).toBe(9);
|
|
149
|
+
expect(handler.subscribeCalls).toEqual([]);
|
|
150
|
+
disposeScreen();
|
|
151
|
+
disposeTarget();
|
|
152
|
+
});
|
|
153
|
+
|
|
91
154
|
test('shares subscriptions and initial reads for the same signal', async () => {
|
|
92
155
|
const handler = new TestVisualizationHandler();
|
|
93
156
|
handler.values.set('shared', 7);
|