@node-projects/web-component-designer-visualization-addons 0.1.149 → 0.1.150
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.
|
@@ -5,8 +5,6 @@ export declare class BlocklyScriptEditor extends BaseCustomWebComponentConstruct
|
|
|
5
5
|
static readonly is = "node-projects-blockly-script-editor";
|
|
6
6
|
blocklyDiv: HTMLDivElement;
|
|
7
7
|
workspace: any;
|
|
8
|
-
static blocklyStyle1: CSSStyleSheet;
|
|
9
|
-
static blocklyStyle2: CSSStyleSheet;
|
|
10
8
|
resizeObserver: ResizeObserver;
|
|
11
9
|
private _toolbox;
|
|
12
10
|
constructor(toolbox: any);
|
|
@@ -15,8 +15,6 @@ export class BlocklyScriptEditor extends BaseCustomWebComponentConstructorAppend
|
|
|
15
15
|
static is = 'node-projects-blockly-script-editor';
|
|
16
16
|
blocklyDiv;
|
|
17
17
|
workspace;
|
|
18
|
-
static blocklyStyle1;
|
|
19
|
-
static blocklyStyle2;
|
|
20
18
|
resizeObserver;
|
|
21
19
|
_toolbox;
|
|
22
20
|
constructor(toolbox) {
|
|
@@ -73,15 +71,6 @@ export class BlocklyScriptEditor extends BaseCustomWebComponentConstructorAppend
|
|
|
73
71
|
},
|
|
74
72
|
maxInstances: { 'start_event': 1 },
|
|
75
73
|
});
|
|
76
|
-
if (!BlocklyScriptEditor.blocklyStyle1) {
|
|
77
|
-
BlocklyScriptEditor.blocklyStyle1 = new CSSStyleSheet();
|
|
78
|
-
//@ts-ignore
|
|
79
|
-
BlocklyScriptEditor.blocklyStyle1.replaceSync(document.getElementById('blockly-renderer-style-' + renderer + '-' + themename).innerText);
|
|
80
|
-
BlocklyScriptEditor.blocklyStyle2 = new CSSStyleSheet();
|
|
81
|
-
//@ts-ignore
|
|
82
|
-
BlocklyScriptEditor.blocklyStyle2.replaceSync(document.getElementById('blockly-common-style').innerText);
|
|
83
|
-
}
|
|
84
|
-
this.shadowRoot.adoptedStyleSheets = [BlocklyScriptEditor.blocklyStyle1, BlocklyScriptEditor.blocklyStyle2, BlocklyScriptEditor.style];
|
|
85
74
|
//@ts-ignore
|
|
86
75
|
const zoomToFit = new ZoomToFitControl(this.workspace);
|
|
87
76
|
zoomToFit.init();
|
package/dist/index-min.js
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
Blockly.Blocks.console={init:function(){this.appendDummyInput().appendField("console").appendField(new Blockly.FieldDropdown([["debug","DEBUG"],["error","ERROR"],["info","INFO"],["log","LOG"],["warn","WARN"]]),"LEVEL"),this.appendValueInput("VALUE").setCheck(null).appendField("value"),this.setInputsInline(!0),this.setPreviousStatement(!0,null),this.setNextStatement(!0,null),this.setColour(230)}};Blockly.JavaScript.forBlock.console=function(
|
|
2
|
-
`};Blockly.Blocks.debugger={init:function(){this.appendDummyInput().appendField("debugger"),this.setPreviousStatement(!0,null),this.setNextStatement(!0,null),this.setColour(230)}};Blockly.JavaScript.forBlock.debugger=function(
|
|
3
|
-
`};Blockly.Blocks.delay={init:function(){this.appendValueInput("DELAY").setCheck("Number").appendField("delay"),this.setInputsInline(!0),this.setPreviousStatement(!0,null),this.setNextStatement(!0,null),this.setColour(230)}};Blockly.JavaScript.forBlock.delay=function(
|
|
4
|
-
`};Blockly.Blocks.get_parameter={init:function(){this.appendValueInput("NAME").setCheck("String").appendField("get_parameter"),this.setInputsInline(!0),this.setOutput(!0,null),this.setColour(230)}};Blockly.JavaScript.forBlock.get_parameter=function(
|
|
1
|
+
Blockly.Blocks.console={init:function(){this.appendDummyInput().appendField("console").appendField(new Blockly.FieldDropdown([["debug","DEBUG"],["error","ERROR"],["info","INFO"],["log","LOG"],["warn","WARN"]]),"LEVEL"),this.appendValueInput("VALUE").setCheck(null).appendField("value"),this.setInputsInline(!0),this.setPreviousStatement(!0,null),this.setNextStatement(!0,null),this.setColour(230)}};Blockly.JavaScript.forBlock.console=function(l,t){var s=l.getFieldValue("LEVEL");let e=Blockly.JavaScript.valueToCode(l,"VALUE",Blockly.JavaScript.ORDER_ATOMIC);return`console['${s.toLowerCase()}'](${e});
|
|
2
|
+
`};Blockly.Blocks.debugger={init:function(){this.appendDummyInput().appendField("debugger"),this.setPreviousStatement(!0,null),this.setNextStatement(!0,null),this.setColour(230)}};Blockly.JavaScript.forBlock.debugger=function(l){return`debugger;
|
|
3
|
+
`};Blockly.Blocks.delay={init:function(){this.appendValueInput("DELAY").setCheck("Number").appendField("delay"),this.setInputsInline(!0),this.setPreviousStatement(!0,null),this.setNextStatement(!0,null),this.setColour(230)}};Blockly.JavaScript.forBlock.delay=function(l){return"await delay("+Blockly.JavaScript.valueToCode(l,"DELAY",Blockly.JavaScript.ORDER_ATOMIC)+`);
|
|
4
|
+
`};Blockly.Blocks.get_parameter={init:function(){this.appendValueInput("NAME").setCheck("String").appendField("get_parameter"),this.setInputsInline(!0),this.setOutput(!0,null),this.setColour(230)}};Blockly.JavaScript.forBlock.get_parameter=function(l,t){return[`context.parameters[${Blockly.JavaScript.valueToCode(l,"NAME",Blockly.JavaScript.ORDER_ATOMIC)}]`,Blockly.JavaScript.ORDER_NONE]};Blockly.Blocks.get_state={init:function(){this.appendValueInput("OID").setCheck("String").appendField("get_state"),this.setInputsInline(!0),this.setOutput(!0,null),this.setColour(230)}};Blockly.JavaScript.forBlock.get_state=function(l,t){let s=Blockly.JavaScript.valueToCode(l,"OID",Blockly.JavaScript.ORDER_ATOMIC);return[`(await visualizationHandler.getState((${s}[0] === '.' ? relativeSignalsPath : '') + ${s})).val`,Blockly.JavaScript.ORDER_NONE]};Blockly.Blocks.get_sub_property={init:function(){this.appendDummyInput().appendField("getSubProperty"),this.appendValueInput("OBJECT").setCheck("Object").appendField("object"),this.appendValueInput("PROPERTYPATH").setCheck("String").appendField("propertypath"),this.setInputsInline(!0),this.setOutput(!0,null),this.setColour(230)}};Blockly.JavaScript.forBlock.get_sub_property=function(l,t){let s=Blockly.JavaScript.valueToCode(l,"OBJECT",Blockly.JavaScript.ORDER_ATOMIC),e=Blockly.JavaScript.valueToCode(l,"PROPERTYPATH",Blockly.JavaScript.ORDER_ATOMIC);return[`extractPart(${s}, ${e})`,Blockly.JavaScript.ORDER_NONE]};Blockly.Blocks.open_screen={init:function(){this.appendDummyInput().appendField("open screen"),this.appendValueInput("SCREEN").setCheck("String").appendField("screen"),this.appendValueInput("RELATIVESIGNALSPATH").setCheck("String").appendField("relativeSignalsPath"),this.appendValueInput("NOHISTORY").setCheck("Boolean").appendField("noHistory"),this.setPreviousStatement(!0,null),this.setNextStatement(!0,null),this.setColour(230)}};Blockly.JavaScript.forBlock.open_screen=function(l){let t=Blockly.JavaScript.valueToCode(l,"SCREEN",Blockly.JavaScript.ORDER_ATOMIC),s=Blockly.JavaScript.valueToCode(l,"RELATIVESIGNALSPATH",Blockly.JavaScript.ORDER_ATOMIC),e=Blockly.JavaScript.valueToCode(l,"NOHISTORY",Blockly.JavaScript.ORDER_ATOMIC);return`RUNTIME.openScreen({screen: ${t}, relativeSignalsPath: ${s}, noHistory: ${e}})`};Blockly.Blocks.query_selector={init:function(){this.appendDummyInput().appendField("querySelector").appendField(new Blockly.FieldDropdown([["currentScreen","CURRENTSCREEN"],["parentScreen","PARENTSCREEN"]]),"SOURCE"),this.appendValueInput("SELECTOR").setCheck("String").appendField("selector"),this.setInputsInline(!0),this.setOutput(!0,"Element"),this.setColour(230)}};Blockly.JavaScript.forBlock.query_selector=function(l,t){var s=l.getFieldValue("SOURCE");let e=Blockly.JavaScript.valueToCode(l,"SELECTOR",Blockly.JavaScript.ORDER_ATOMIC),i;return s==="CURRENTSCREEN"?i=`shadowRoot.querySelector(${e})`:s==="PARENTSCREEN"&&(i=`shadowRoot.host.getRootNode().querySelector(${e})`),[i,Blockly.JavaScript.ORDER_NONE]};Blockly.Blocks.query_selector_all={init:function(){this.appendDummyInput().appendField("querySelectorAll").appendField(new Blockly.FieldDropdown([["currentScreen","CURRENTSCREEN"],["parentScreen","PARENTSCREEN"]]),"SOURCE"),this.appendValueInput("SELECTOR").setCheck("String").appendField("selector"),this.setInputsInline(!0),this.setOutput(!0,"Array"),this.setColour(230)}};Blockly.JavaScript.forBlock.query_selector_all=function(l,t){var s=l.getFieldValue("SOURCE");let e=Blockly.JavaScript.valueToCode(l,"SELECTOR",Blockly.JavaScript.ORDER_ATOMIC),i;return s==="CURRENTSCREEN"?i=`shadowRoot.querySelectorall(${e})`:s==="PARENTSCREEN"&&(i=`shadowRoot.querySelectorall(${e})`),[i,Blockly.JavaScript.ORDER_NONE]};Blockly.Blocks.set_element={init:function(){this.appendDummyInput().appendField("setElement").appendField(new Blockly.FieldDropdown([["property","PROPERTY"],["attribute","ATTRIBUTE"],["style","STYLE"]]),"TARGET"),this.appendValueInput("ELEMENT").setCheck("Element").appendField("element"),this.appendValueInput("NAME").setCheck("String").appendField("name"),this.appendValueInput("VALUE").setCheck(null).appendField("value"),this.setInputsInline(!0),this.setPreviousStatement(!0,null),this.setNextStatement(!0,null),this.setColour(230)}};Blockly.JavaScript.forBlock.set_element=function(l){var t=l.getFieldValue("TARGET");let s=Blockly.JavaScript.valueToCode(l,"ELEMENT",Blockly.JavaScript.ORDER_ATOMIC),e=Blockly.JavaScript.valueToCode(l,"NAME",Blockly.JavaScript.ORDER_ATOMIC),i=Blockly.JavaScript.valueToCode(l,"VALUE",Blockly.JavaScript.ORDER_ATOMIC),n="";return t==="PROPERTY"?n+=s+"["+e+"] = "+i+`;
|
|
5
5
|
`:t==="ATTRIBUTE"?n+=s+".setAttribute("+e+", "+i+`);
|
|
6
6
|
`:t==="STYLE"&&(n+=s+".style["+e+"] = "+i+`;
|
|
7
|
-
`),n};Blockly.Blocks.set_state={init:function(){this.appendValueInput("OID").setCheck("String").appendField("set_state"),this.appendValueInput("VALUE").setCheck(null).appendField("with"),this.setInputsInline(!0),this.setPreviousStatement(!0,null),this.setNextStatement(!0,null),this.setColour(230)}};Blockly.JavaScript.forBlock.set_state=function(
|
|
8
|
-
`};Blockly.defineBlocksWithJsonArray([{type:"start_event",message0:"Event %1",nextStatement:null,style:"hat_blocks",args0:[{type:"field_variable",name:"EVENTVAR",variable:"event"}]}]);Blockly.JavaScript.forBlock.start_event=function(
|
|
7
|
+
`),n};Blockly.Blocks.set_state={init:function(){this.appendValueInput("OID").setCheck("String").appendField("set_state"),this.appendValueInput("VALUE").setCheck(null).appendField("with"),this.setInputsInline(!0),this.setPreviousStatement(!0,null),this.setNextStatement(!0,null),this.setColour(230)}};Blockly.JavaScript.forBlock.set_state=function(l){let t=Blockly.JavaScript.valueToCode(l,"OID",Blockly.JavaScript.ORDER_ATOMIC),s=Blockly.JavaScript.valueToCode(l,"VALUE",Blockly.JavaScript.ORDER_ATOMIC);return`await visualizationHandler.setState((${t}[0] === '.' ? relativeSignalsPath : '') + ${t}, ${s});
|
|
8
|
+
`};Blockly.defineBlocksWithJsonArray([{type:"start_event",message0:"Event %1",nextStatement:null,style:"hat_blocks",args0:[{type:"field_variable",name:"EVENTVAR",variable:"event"}]}]);Blockly.JavaScript.forBlock.start_event=function(l){return Blockly.JavaScript.getVariableName(l.getField("EVENTVAR").variable.name)+` = eventData;
|
|
9
9
|
`};var He=`function extractPart(obj, propertyPath) {
|
|
10
10
|
let retVal = obj;
|
|
11
11
|
for (let p of propertyPath.split('.')) {
|
|
@@ -21,7 +21,7 @@ function delay(ms) {
|
|
|
21
21
|
}
|
|
22
22
|
|
|
23
23
|
export async function run(eventData, shadowRoot, parameters, relativeSignalsPath, visualizationHandler, context) {
|
|
24
|
-
`,Je="}";async function ve(
|
|
24
|
+
`,Je="}";async function ve(l){let t=new Blockly.Workspace;Blockly.serialization.workspaces.load(l,t),Blockly.JavaScript.addReservedWords("eventData"),Blockly.JavaScript.addReservedWords("shadowRoot"),Blockly.JavaScript.addReservedWords("extractPart"),Blockly.JavaScript.addReservedWords("parameters"),Blockly.JavaScript.addReservedWords("relativeSignalsPath"),Blockly.JavaScript.addReservedWords("delay"),Blockly.JavaScript.addReservedWords("visualizationHandler"),Blockly.JavaScript.addReservedWords("context");let s=Blockly.JavaScript.workspaceToCode(t);return(await import(URL.createObjectURL(new Blob([He+s+Je],{type:"application/javascript"})))).run}import{BaseCustomWebComponentConstructorAppend as Ue,html as $e,css as Ge}from"@node-projects/base-custom-webcomponent";var A=class extends Ue{static template=$e`
|
|
25
25
|
<div id="blocklyDiv" style="position: absolute; width: 100%; height: 100%;"></div>
|
|
26
26
|
`;static style=Ge`
|
|
27
27
|
:host {
|
|
@@ -30,7 +30,7 @@ export async function run(eventData, shadowRoot, parameters, relativeSignalsPath
|
|
|
30
30
|
height: 100%;
|
|
31
31
|
width: 100%;
|
|
32
32
|
display: block;
|
|
33
|
-
}`;static is="node-projects-blockly-script-editor";blocklyDiv;workspace;
|
|
33
|
+
}`;static is="node-projects-blockly-script-editor";blocklyDiv;workspace;resizeObserver;_toolbox;constructor(t){super(),super._restoreCachedInititalValues(),this._toolbox=t,this.blocklyDiv=this._getDomElement("blocklyDiv"),this._assignEvents(),this.createBlockly()}createBlockly(){let t="zelos",e=Blockly.Theme.defineTheme("webui",{base:Blockly.Themes.Zelos,blockStyles:{hat_blocks:{colourPrimary:"#4a148c"}},categoryStyles:{start_category:{colour:"#4a148c"},system_category:{colour:"#01579b"}}});this.workspace=Blockly.inject(this.blocklyDiv,{theme:e,toolbox:this._toolbox,renderer:t,trashcan:!0,zoom:{controls:!0,wheel:!1,startScale:.7,maxScale:3,minScale:.3,scaleSpeed:1.2,pinch:!1},move:{scrollbars:{horizontal:!0,vertical:!0},drag:!0,wheel:!0},maxInstances:{start_event:1}}),new ZoomToFitControl(this.workspace).init()}ready(){Blockly.svgResize(this.workspace),this.resizeObserver=new ResizeObserver(t=>{Blockly.svgResize(this.workspace)}),this.resizeObserver.observe(this)}save(){return Blockly.serialization.workspaces.save(this.workspace)}load(t){Blockly.serialization.workspaces.load(t,this.workspace)}};customElements.define(A.is,A);import{BaseCustomWebComponentConstructorAppend as Ze,html as Ke,css as Qe}from"@node-projects/base-custom-webcomponent";import{BindingMode as et,BindingTarget as be,assetsPath as K}from"@node-projects/web-component-designer";import{BaseCustomWebComponentConstructorAppend as qe,html as Xe,css as Ye}from"@node-projects/base-custom-webcomponent";var z=class extends qe{static template=Xe`
|
|
34
34
|
<span style="position:absolute;left:30px;top:26px;">from</span>
|
|
35
35
|
<span style="position:absolute;left:30px;top:77px;">count</span>
|
|
36
36
|
<span style="position:absolute;left:30px;top:123px;">limit</span>
|
|
@@ -327,7 +327,7 @@ __res <span style="color:#6a737d;font-style:italic">// the res
|
|
|
327
327
|
|
|
328
328
|
</div>
|
|
329
329
|
</body>
|
|
330
|
-
</html>`;var Q=class
|
|
330
|
+
</html>`;var Q=class l extends Ze{static template=Ke`
|
|
331
331
|
<div id="root">
|
|
332
332
|
<div class="vertical-grid">
|
|
333
333
|
<div id="full-width-col">
|
|
@@ -629,13 +629,13 @@ __res <span style="color:#6a737d;font-style:italic">// the res
|
|
|
629
629
|
.info-btn:hover {
|
|
630
630
|
background: #eee;
|
|
631
631
|
border-radius: 3px;
|
|
632
|
-
}`;static is="node-projects-visualization-bindings-editor";static properties={twoWayPossible:Boolean,twoWay:Boolean,expression:String,events:String,invert:Boolean,historic:Object};twoWayPossible=!1;twoWay=!1;expression="";writeBackSignal="";expressionTwoWay="";historic;objectNames="";events="";invert=!1;converters=[];static namedConverters=[];static helpSections=[];convertersString;get converter(){if(this.convertersString)return this.convertersString;if(this.converters.length>0)return Object.fromEntries(this.converters.map(t=>[t.key,t.value]))}_property;_binding;_bindingTarget;_serviceContainer;_instanceServiceContainer;_shell;_signals=[];_signalListContainer;_converterListContainer;constructor(t,s,e,i,n,
|
|
632
|
+
}`;static is="node-projects-visualization-bindings-editor";static properties={twoWayPossible:Boolean,twoWay:Boolean,expression:String,events:String,invert:Boolean,historic:Object};twoWayPossible=!1;twoWay=!1;expression="";writeBackSignal="";expressionTwoWay="";historic;objectNames="";events="";invert=!1;converters=[];static namedConverters=[];static helpSections=[];convertersString;get converter(){if(this.convertersString)return this.convertersString;if(this.converters.length>0)return Object.fromEntries(this.converters.map(t=>[t.key,t.value]))}_property;_binding;_bindingTarget;_serviceContainer;_instanceServiceContainer;_shell;_signals=[];_signalListContainer;_converterListContainer;constructor(t,s,e,i,n,r,a={}){super(),super._restoreCachedInititalValues(),this._property=t,this._binding=s,this._bindingTarget=e,this._serviceContainer=i,this._instanceServiceContainer=n,this._shell=r,a?.namedConverters===!1&&(this._getDomElement("namedConverterRow").style.display="none");let c=this._getDomElement("historicBtn");a?.showHistoric===!1?c.style.display="none":a?.historicLabel&&(c.textContent=a.historicLabel)}ready(){if(this._parseAttributesToProperties(),this._assignEvents(),this._signalListContainer=this._getDomElement("signalListContainer"),this._converterListContainer=this._getDomElement("converterListContainer"),this._getDomElement("helpBtn").onclick=()=>this._showHelp(),l.namedConverters.length===0&&(this._getDomElement("namedConverterBrowse").style.display="none"),this.twoWayPossible=!1,(this._bindingTarget==be.property||this._bindingTarget==be.attribute)&&(this.twoWayPossible=!0),this._binding){if(this.twoWay=this._binding.mode==et.twoWay,this.expression=this._binding.expression,this.writeBackSignal=this._binding.writeBackSignal,this.expressionTwoWay=this._binding.expressionTwoWay,this.historic=this._binding.historic,this.invert=this._binding.invert,this._binding.bindableObjectNames&&(this.objectNames=this._binding.bindableObjectNames.join(";")),this._binding.converter)if(typeof this._binding.converter=="string")this.convertersString=this._binding.converter;else for(let t in this._binding.converter)this.converters.push({key:t,value:this._binding.converter[t]});this._binding.changedEvents&&this._binding.changedEvents.length&&(this.events=this._binding.changedEvents.join(";"))}if(this.expression){let t=this._getDomElement("expression");this.expression.indexOf(`
|
|
633
633
|
`)>=0&&(t.style.height="51px")}if(this.expressionTwoWay){let t=this._getDomElement("expression2way");this.expressionTwoWay.indexOf(`
|
|
634
|
-
`)>=0&&(t.style.height="51px")}this._signals=this._parseObjectNames(this.objectNames),this._signals.length===0&&this._signals.push({name:"",signal:""}),this._renderSignalList(),this._renderConverterList(),this._bindingsParse()}_parseObjectNames(t){return t?t.split(";").filter(s=>s.length>0).map(s=>{let e=s.indexOf(":");return e>0?{name:s.slice(0,e),signal:s.slice(e+1)}:{name:"",signal:s}}):[]}_signalsToObjectNames(){return this._signals.map(t=>t.name?t.name+":"+t.signal:t.signal).join(";")}_renderSignalList(){let t=this._signalListContainer;t.innerHTML="",this._signals.forEach((s,e)=>{let i=document.createElement("div");i.className="signal-row";let n=document.createElement("input");n.className="signal-name-input",n.placeholder=`__${e}`,n.value=s.name,n.title="variable name used in the formula (defaults to __"+e+" if empty)",n.oninput=()=>{this._signals[e].name=n.value,this._syncSignals()};let
|
|
635
|
-
</body>`,
|
|
636
|
-
</body>`):de,t.style.cssText="width:100%; height:100%; border:none; display:block;",this._shell.openModal(t,{title:"Bindings Editor Help",parent:this,x:-660,y:-80,width:630,height:580})}};customElements.define(Q.is,Q);import{BaseCustomWebComponentConstructorAppend as pt,TypedEvent as dt,css as ut,html as ht}from"@node-projects/base-custom-webcomponent";import{ContextMenu as mt,assetsPath as ue}from"@node-projects/web-component-designer";import{typeInfoFromJsonSchema as Ce}from"@node-projects/propertygrid.webcomponent";import{defaultOptions as gt,defaultStyle as ft}from"@node-projects/web-component-designer-widgets-wunderbaum";import{Wunderbaum as yt}from"wunderbaum";import vt from"wunderbaum/dist/wunderbaum.css"with{type:"css"};import{PropertyGrid as tt}from"@node-projects/propertygrid.webcomponent";import{CodeViewMonaco as xe}from"@node-projects/web-component-designer-codeview-monaco";var q=class extends tt{serviceContainer;instanceServiceContainer;visualizationHandler;visualizationShell;bindableObjectsTarget="property";constructor(){super()}bindingDoubleClicked;setNameColumnWidth(t){let s=this._tree?.columns?.[0];s&&(s.width=t+"px",this._tree.update("colStructure"))}async getEditorForType(t,s,e,i,n){if(this.getSpecialEditorForType){let
|
|
634
|
+
`)>=0&&(t.style.height="51px")}this._signals=this._parseObjectNames(this.objectNames),this._signals.length===0&&this._signals.push({name:"",signal:""}),this._renderSignalList(),this._renderConverterList(),this._bindingsParse()}_parseObjectNames(t){return t?t.split(";").filter(s=>s.length>0).map(s=>{let e=s.indexOf(":");return e>0?{name:s.slice(0,e),signal:s.slice(e+1)}:{name:"",signal:s}}):[]}_signalsToObjectNames(){return this._signals.map(t=>t.name?t.name+":"+t.signal:t.signal).join(";")}_renderSignalList(){let t=this._signalListContainer;t.innerHTML="",this._signals.forEach((s,e)=>{let i=document.createElement("div");i.className="signal-row";let n=document.createElement("input");n.className="signal-name-input",n.placeholder=`__${e}`,n.value=s.name,n.title="variable name used in the formula (defaults to __"+e+" if empty)",n.oninput=()=>{this._signals[e].name=n.value,this._syncSignals()};let r=document.createElement("input");r.className="signal-path-input",r.value=s.signal,r.placeholder="signal path",r.title="signal path (prefix: ? = signalProperty, ?? = property value, # = target property, ## = target property value)",r.oninput=()=>{this._signals[e].signal=r.value,this._syncSignals()};let a=document.createElement("button");a.className="signal-icon-btn",a.title="Duplicate";let c=document.createElement("img");c.src=K+"icons/copy.svg",c.style.cssText="width:12px; height:12px;",a.appendChild(c),a.onclick=()=>{this._signals.splice(e+1,0,{...this._signals[e]}),this._syncSignals(),this._renderSignalList()};let o=document.createElement("button");o.className="signal-select-btn",o.textContent="...",o.title="Browse signal",o.onclick=()=>this._selectForRow(e,r);let p=document.createElement("button");p.className="signal-icon-btn",p.title="Remove";let h=document.createElement("img");h.src=K+"icons/delete.svg",h.style.cssText="width:12px; height:12px;",p.appendChild(h),p.onclick=()=>{this._signals.splice(e,1),this._syncSignals(),this._renderSignalList()},i.appendChild(n),i.appendChild(r),i.appendChild(o),i.appendChild(a),i.appendChild(p),t.appendChild(i)})}_syncSignals(){this.objectNames=this._signalsToObjectNames(),this._bindingsRefresh()}_addSignal(){this._signals.push({name:"",signal:""}),this._renderSignalList()}async _selectForRow(t,s){let e=this._shell.createBindableObjectBrowser();e.initialize(this._serviceContainer,this._instanceServiceContainer,"binding"),e.title="select signal...";let i=new AbortController;if(e.objectDoubleclicked.on(()=>{i.abort();let r="";e.selectedObject.specialType=="signalProperty"?r="?":e.selectedObject.bindabletype==="property"&&(r="??"),this._signals[t].signal=r+e.selectedObject.fullName,s.value=this._signals[t].signal,this._syncSignals()}),await this._shell.openConfirmation(e,{x:100,y:100,width:400,height:300,parent:this,abortSignal:i.signal})){let r="";e.selectedObject.specialType=="signalProperty"?r="?":e.selectedObject.bindabletype==="property"&&(r="??"),this._signals[t].signal=r+e.selectedObject.fullName,s.value=this._signals[t].signal,this._syncSignals()}}_renderConverterList(){let t=this._converterListContainer;t.innerHTML="";let s=this._property?.type==="color"?"color":"text";this.converters.forEach((e,i)=>{let n=document.createElement("div");n.className="signal-row";let r=document.createElement("input");r.style.cssText="flex:1 1 auto; height:22px; box-sizing:border-box;",r.value=e.key,r.placeholder="condition",r.oninput=()=>{this.converters[i].key=r.value};let a=document.createElement("input");a.type=s,a.style.cssText="flex:1 1 auto; height:22px; box-sizing:border-box;",a.value=e.value,a.placeholder="value",a.oninput=()=>{this.converters[i].value=a.value};let c=document.createElement("button");c.className="signal-icon-btn",c.title="Duplicate";let o=document.createElement("img");o.src=K+"icons/copy.svg",o.style.cssText="width:12px; height:12px;",c.appendChild(o),c.onclick=()=>{this.converters.splice(i+1,0,{...this.converters[i]}),this._renderConverterList()};let p=document.createElement("button");p.className="signal-icon-btn",p.title="Remove";let h=document.createElement("img");h.src=K+"icons/delete.svg",h.style.cssText="width:12px; height:12px;",p.appendChild(h),p.onclick=()=>{this.converters.splice(i,1),this._renderConverterList()},n.appendChild(r),n.appendChild(a),n.appendChild(c),n.appendChild(p),t.appendChild(n)})}_addConverter(){this.converters.push({key:"",value:""}),this._renderConverterList()}async _selectNamedConverter(){let t=l.namedConverters;if(t.length===0)return;let s="",e=null,i=document.createElement("div");i.style.cssText="display:flex; flex-direction:column; height:100%; box-sizing:border-box; font-size:12px;";let n=document.createElement("div");n.style.cssText="padding:6px 8px 4px; color:#666; font-size:11px; border-bottom:1px solid #e0e0e0; flex-shrink:0;",n.textContent="Select a converter and confirm with OK.",i.appendChild(n);let r=document.createElement("div");r.style.cssText="flex:1; overflow-y:auto; padding:4px;",i.appendChild(r);let a=p=>{p.style.background="",p.style.borderLeftColor="transparent"},c=(p,h)=>{e&&a(e),e=p,p.style.background="#e8f4fd",p.style.borderLeftColor="#0078d7",s=h};for(let p of t){let h=document.createElement("div");h.style.cssText="padding:5px 6px 5px 9px; cursor:pointer; border-radius:3px; border-left:3px solid transparent; margin-bottom:2px;";let m=document.createElement("div");if(m.style.cssText="font-family:monospace; font-weight:bold; color:#111;",m.textContent=p.name,h.appendChild(m),p.description){let u=document.createElement("div");u.style.cssText="color:#555; font-size:11px; margin-top:2px;",u.textContent=p.description,h.appendChild(u)}if(p.converter&&Object.keys(p.converter).length>0){let u=document.createElement("div");u.style.cssText="display:grid; grid-template-columns:max-content max-content 1fr; gap:1px 6px; margin-top:4px; padding:4px 6px; background:#f5f5f5; border-radius:2px; font-family:monospace; font-size:11px; color:#333;";for(let[d,g]of Object.entries(p.converter)){let f=document.createElement("span");f.style.cssText="color:#555; text-align:right;",f.textContent=d;let b=document.createElement("span");b.style.cssText="color:#aaa;",b.textContent="\u2192";let _=document.createElement("span");_.style.cssText="color:#0078d7; font-weight:bold;",_.textContent=String(g),u.appendChild(f),u.appendChild(b),u.appendChild(_)}h.appendChild(u)}h.onmouseenter=()=>{h!==e&&(h.style.background="#f5f5f5")},h.onmouseleave=()=>{h!==e&&(h.style.background="")},h.onclick=()=>c(h,p.name),r.appendChild(h)}await this._shell.openConfirmation(i,{x:100,y:100,width:320,height:300,parent:this})&&s&&(this.convertersString=s,this._getDomElement("namedConverterInput").value=s,this._bindingsRefresh())}_refresh(){requestAnimationFrame(()=>{this._bindingsRefresh()})}async showHistoric(){let t=new z(this.historic),s=new AbortController;t.title="Edit historic binding to: "+this._property.name,await this._shell.openConfirmation(t,{x:100,y:100,width:420,height:510,parent:this,abortSignal:s.signal,disableResize:!0,cancelText:"Remove"})?this.historic=t.historic:this.historic=null,this._bindingsRefresh()}_showHelp(){let t=document.createElement("iframe");t.srcdoc=l.helpSections.length>0?de.replace(`</div>
|
|
635
|
+
</body>`,l.helpSections.join("")+`</div>
|
|
636
|
+
</body>`):de,t.style.cssText="width:100%; height:100%; border:none; display:block;",this._shell.openModal(t,{title:"Bindings Editor Help",parent:this,x:-660,y:-80,width:630,height:580})}};customElements.define(Q.is,Q);import{BaseCustomWebComponentConstructorAppend as pt,TypedEvent as dt,css as ut,html as ht}from"@node-projects/base-custom-webcomponent";import{ContextMenu as mt,assetsPath as ue}from"@node-projects/web-component-designer";import{typeInfoFromJsonSchema as Ce}from"@node-projects/propertygrid.webcomponent";import{defaultOptions as gt,defaultStyle as ft}from"@node-projects/web-component-designer-widgets-wunderbaum";import{Wunderbaum as yt}from"wunderbaum";import vt from"wunderbaum/dist/wunderbaum.css"with{type:"css"};import{PropertyGrid as tt}from"@node-projects/propertygrid.webcomponent";import{CodeViewMonaco as xe}from"@node-projects/web-component-designer-codeview-monaco";var q=class extends tt{serviceContainer;instanceServiceContainer;visualizationHandler;visualizationShell;bindableObjectsTarget="property";constructor(){super()}bindingDoubleClicked;setNameColumnWidth(t){let s=this._tree?.columns?.[0];s&&(s.width=t+"px",this._tree.update("colStructure"))}async getEditorForType(t,s,e,i,n){if(this.getSpecialEditorForType){let r=await this.getSpecialEditorForType(t,s,e,i,n);if(r)return r}switch(t.format){case"screen":{let r=document.createElement("select");r.style.width="100%";let a=document.createElement("option");a.value=s??"",a.innerText=s??"",r.appendChild(a);for(let c of await this.visualizationHandler.getAllNames("screen")){if(c==s)continue;let o=document.createElement("option");o.value=c,o.innerText=c,r.appendChild(o)}return r.onchange=()=>{this.setPropertyValue(e,r.value)},r.value=s,r}case"signal":{let r=document.createElement("div");r.style.display="flex";let a=document.createElement("input");a.value=s??"",a.style.flexGrow="1",a.style.width="0",a.onchange=o=>this.setPropertyValue(e,a.value),a.onfocus=o=>{a.selectionStart=0,a.selectionEnd=a.value?.length},r.appendChild(a);let c=document.createElement("button");return c.textContent="...",c.onclick=async()=>{let o=this.visualizationShell.createBindableObjectBrowser();o.initialize(this.serviceContainer,this.instanceServiceContainer,this.bindableObjectsTarget),o.title="select signal...";let p=new AbortController;o.objectDoubleclicked.on(()=>{this.bindingDoubleClicked&&this.bindingDoubleClicked(o.selectedObject),p.abort(),a.value=o.selectedObject.fullName,this.setPropertyValue(e,a.value)}),await this.visualizationShell.openConfirmation(o,{x:100,y:100,width:400,height:300,parent:this,abortSignal:p.signal})&&(a.value=o.selectedObject.fullName,this.setPropertyValue(e,a.value))},r.appendChild(c),r}case"html":case"script":{let r=document.createElement("div");r.style.boxSizing="border-box",r.style.width="100%",r.style.display="flex";let a=document.createElement("textarea");a.style.boxSizing="border-box",a.value=s??"",a.style.width="100%",a.onblur=o=>{this.setPropertyValue(e,a.value)},r.appendChild(a);let c=document.createElement("button");return c.innerHTML="...",c.style.boxSizing="border-box",c.onclick=async()=>{let o=new xe,p=await xe.getMonacoLib();if(t.format=="html")o.language="html";else{let m={content:`declare global {
|
|
637
637
|
var context: { event: Event, element: Element };
|
|
638
|
-
}`,filePath:"global.d.ts"};p.languages.typescript.typescriptDefaults.setExtraLibs([m]),o.language="javascript"}o.code=a.value,o.style.position="relative",await this.visualizationShell.openConfirmation(o,{x:200,y:200,width:600,height:400,parent:this})&&(a.value=o.getText(),this.setPropertyValue(e,a.value))},
|
|
638
|
+
}`,filePath:"global.d.ts"};p.languages.typescript.typescriptDefaults.setExtraLibs([m]),o.language="javascript"}o.code=a.value,o.style.position="relative",await this.visualizationShell.openConfirmation(o,{x:200,y:200,width:600,height:400,parent:this})&&(a.value=o.getText(),this.setPropertyValue(e,a.value))},r.appendChild(c),r}}return super.getEditorForType(t,s,e,i,n)}};customElements.define("node-projects-visualization-property-grid",q);import{CodeViewMonaco as Te}from"@node-projects/web-component-designer-codeview-monaco";import{BaseCustomWebComponentConstructorAppend as it,TypedEvent as we,css as at,html as nt}from"@node-projects/base-custom-webcomponent";import{defaultOptions as ot,defaultStyle as rt}from"@node-projects/web-component-designer-widgets-wunderbaum";import{Wunderbaum as lt}from"wunderbaum";import ct from"wunderbaum/dist/wunderbaum.css"with{type:"css"};function st(l){return l.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">")}function B(l){return st(l).replace(/("(?:\\.|[^"\\])*")(\s*:)?|\b(true|false|null)\b|\b(-?\d+(?:\.\d+)?)\b/g,(s,e,i,n,r)=>e?`<span class="${i?"cs-key":"cs-str"}">${e}</span>${i??""}`:n?`<span class="cs-bool">${n}</span>`:r?`<span class="cs-num">${r}</span>`:s)}var L=class l extends it{static style=at`
|
|
639
639
|
:host {
|
|
640
640
|
display: block;
|
|
641
641
|
background: white;
|
|
@@ -794,14 +794,14 @@ __res <span style="color:#6a737d;font-style:italic">// the res
|
|
|
794
794
|
<button id="closeBtn" @click="[[this.closeClicked()]]">Close</button>
|
|
795
795
|
</div>
|
|
796
796
|
</div>
|
|
797
|
-
`;static is="node-projects-visualization-simple-script-command-picker";_title;get title(){return this._title}set title(t){this._title=t}selectedType;commandTypeChosen=new we;closeRequested=new we;_tree;_filter;_descriptionDiv;_addBtn;_typeInfo;_descriptions;constructor(){super(),this._restoreCachedInititalValues(),this.shadowRoot.adoptedStyleSheets=[ct,rt,
|
|
797
|
+
`;static is="node-projects-visualization-simple-script-command-picker";_title;get title(){return this._title}set title(t){this._title=t}selectedType;commandTypeChosen=new we;closeRequested=new we;_tree;_filter;_descriptionDiv;_addBtn;_typeInfo;_descriptions;constructor(){super(),this._restoreCachedInititalValues(),this.shadowRoot.adoptedStyleSheets=[ct,rt,l.style],this._descriptionDiv=this._getDomElement("description"),this._addBtn=this._getDomElement("addBtn"),this._filter=this._getDomElement("filter"),this._filter.onkeyup=()=>{let t=this._filter.value;this._tree.filterNodes(s=>new RegExp(t,"i").test(s.title),{})},this._tree=new lt({...ot,element:this._getDomElement("commandList"),icon:!1,filter:{autoExpand:!0,mode:"hide",highlight:!0},activate:t=>{this.selectedType=t.node.title,this._addBtn.disabled=!1,this._renderDescription(t.node.title)},dblclick:t=>(this.selectedType=t.node.title,this.commandTypeChosen.emit(),!1),render:t=>{t.isNew&&(t.nodeElem.oncontextmenu=s=>(s.preventDefault(),!1))},dnd:{guessDropEffect:!1,serializeClipboardData:!0,dragStart:t=>(t.event.dataTransfer.effectAllowed="copy",t.event.dataTransfer.dropEffect="copy",!0)}})}async ready(){this._parseAttributesToProperties(),this._bindingsParse(null,!0),this._assignEvents()}addClicked(){this.selectedType&&this.commandTypeChosen.emit()}closeClicked(){this.closeRequested.emit()}_renderDescription(t){let s=this._descriptions?.[t];if(s){this._descriptionDiv.innerHTML=`
|
|
798
798
|
<div class="cmd-title">${t}<span class="hint">${s.description}</span></div>
|
|
799
799
|
<pre class="snippet">${B(s.example)}</pre>
|
|
800
800
|
${s.note?`<div class="note">${s.note}</div>`:""}
|
|
801
801
|
`;return}let e=this._typeInfo?.definitions?.[t]?.description;this._descriptionDiv.innerHTML=`
|
|
802
802
|
<div class="cmd-title">${t}</div>
|
|
803
803
|
${e?`<div class="note">${e}</div>`:""}
|
|
804
|
-
`}loadCommands(t,s){this._typeInfo=t,this._descriptions=s??{};let e=Object.keys(t.definitions).filter(i=>t.definitions[i].type==="object"&&i!=="ScriptCommands");this._tree.root.addChildren(e.map(i=>({title:i})))}};customElements.define(L.is,L);function
|
|
804
|
+
`}loadCommands(t,s){this._typeInfo=t,this._descriptions=s??{};let e=Object.keys(t.definitions).filter(i=>t.definitions[i].type==="object"&&i!=="ScriptCommands");this._tree.root.addChildren(e.map(i=>({title:i})))}};customElements.define(L.is,L);function _e(l,t){return`<span class="cs-attr">${l}</span>='${B(t)}'`}var Se=`<!DOCTYPE html>
|
|
805
805
|
<html>
|
|
806
806
|
<head>
|
|
807
807
|
<meta charset="UTF-8">
|
|
@@ -922,7 +922,7 @@ html, body {
|
|
|
922
922
|
|
|
923
923
|
<div class="content-section">
|
|
924
924
|
<div class="section-title"><span class="section-num">1</span> Basic structure <span class="section-hint">commands array, sequential execution</span></div>
|
|
925
|
-
<pre class="snippet">${
|
|
925
|
+
<pre class="snippet">${_e("@click",`{"commands":[
|
|
926
926
|
{ "type": "SetSignalValue", "signal": ".Some.Signal", "value": true },
|
|
927
927
|
{ "type": "SetSignalValue", "signal": ".Some.Other", "value": false }
|
|
928
928
|
]}`)}</pre>
|
|
@@ -940,7 +940,7 @@ ${B('{ "source": "parameter", "name": "myParam" }')} <span class="cs-comment">/
|
|
|
940
940
|
|
|
941
941
|
<div class="content-section">
|
|
942
942
|
<div class="section-title"><span class="section-num">3</span> Cyclic events <span class="section-hint">re-triggering timer event</span></div>
|
|
943
|
-
<pre class="snippet">${
|
|
943
|
+
<pre class="snippet">${_e("@cyclic:100",`{"commands":[
|
|
944
944
|
{ "type": "SetSignalValue", "signal": ".Local.Tick", "value": true }
|
|
945
945
|
]}`)}</pre>
|
|
946
946
|
<div class="note">A <code>@cyclic:<ms></code> event retriggers itself automatically every <ms> milliseconds.</div>
|
|
@@ -956,7 +956,7 @@ ${B('{ "source": "parameter", "name": "myParam" }')} <span class="cs-comment">/
|
|
|
956
956
|
"targetSelector": ".my-class", "name": "disabled", "value": true }`,note:'target: "property" (default) | "attribute" | "css" | "class". targetSelectorTarget: "container" (screen/customControl, default) | "element" (current element).'},Delay:{description:"pause the script chain",example:'{ "type": "Delay", "value": 500 }'},Console:{description:"write a message to the browser console",example:'{ "type": "Console", "target": "log", "message": "done" }',note:'target: "log" (default) | "info" | "debug" | "warn" | "error".'},SwitchLanguage:{description:"switch the active UI language",example:'{ "type": "SwitchLanguage", "language": "en" }'},Login:{description:"log a user in",example:'{ "type": "Login", "username": "user", "password": "pass" }'},Logout:{description:"log the current user out",example:'{ "type": "Logout" }'},SubscribeSignal:{description:"subscribe to a signal so its updates are pushed to the client",example:'{ "type": "SubscribeSignal", "signal": ".Some.Signal", "oneTime": false }'},UnsubscribeSignal:{description:"unsubscribe from a previously subscribed signal",example:'{ "type": "UnsubscribeSignal", "signal": ".Some.Signal" }'},WriteSignalsInGroup:{description:"write all pending signal values of a named group",example:'{ "type": "WriteSignalsInGroup", "group": "MyGroup" }'},ClearSignalsInGroup:{description:"clear all pending signal values of a named group",example:'{ "type": "ClearSignalsInGroup", "group": "MyGroup" }'},RunScript:{description:"run another named script",example:'{ "type": "RunScript", "name": "MyScript", "scriptType": "SimpleScript" }'},CopySignalValuesFromFolder:{description:"copy signal values from one signal folder to another",example:'{ "type": "CopySignalValuesFromFolder", "sourceFolder": ".Source", "destinationFolder": ".Target" }'},ExportSignalValuesAsJson:{description:"export matching signal values as a downloadable JSON file",example:'{ "type": "ExportSignalValuesAsJson", "regex": "^\\\\.Some\\\\..*", "fileName": "export.json" }'},ImportSignalValuesFromJson:{description:"import signal values from a JSON string",example:'{ "type": "ImportSignalValuesFromJson", "data": "{ \\".Some.Signal\\": true }" }'},Repeat:{description:"jump back to a label a number of times, or indefinitely",example:'{ "type": "Repeat", "label": "lbl_loop", "count": 0, "mode": "eventValid" }',note:'mode: "eventValid" (default, repeats until the event is no longer active) | "always" (repeats until count is 0 or indefinitely when count is 0).'},Condition:{description:"compare two values and jump to a label depending on the result",example:`{ "type": "Condition", "value1": {"source":"signal","name":".Is.On"}, "value2": true,
|
|
957
957
|
"comparisonType": "==", "trueGotoLabel": "lbl_off", "falseGotoLabel": "lbl_on" }`,note:"comparisonType: ==null | !=null | ==true | ==false | == | != | > | < | >= | <= | && | ||."},If:{description:"evaluate a formula and run nested commands depending on the result",example:`{ "type": "If",
|
|
958
958
|
"signals": [{"source":"signal","name":".Is.On"}, {"varName":"ready","source":"signal","name":".Is.Ready"}],
|
|
959
|
-
"formula": "__0 == true && ready == false", "trueCommands": [], "elseCommands": [] }`,note:"signals is a list of values (like Condition.value1). Each is referenced in the formula either positionally as __0, __1, ... or, if varName is set, by that name. trueCommands/elseCommands are edited as nested commands in the tree, not as JSON here."},Exit:{description:"stop executing the current script chain",example:'{ "type": "Exit" }'},Label:{description:"a named jump target for Condition / Goto / Repeat",example:'{ "type": "Label", "label": "lbl_on" }'},Goto:{description:"jump unconditionally to a label",example:'{ "type": "Goto", "label": "lbl_on" }'}};import"@node-projects/splitview.webcomponent";var D=class
|
|
959
|
+
"formula": "__0 == true && ready == false", "trueCommands": [], "elseCommands": [] }`,note:"signals is a list of values (like Condition.value1). Each is referenced in the formula either positionally as __0, __1, ... or, if varName is set, by that name. trueCommands/elseCommands are edited as nested commands in the tree, not as JSON here."},Exit:{description:"stop executing the current script chain",example:'{ "type": "Exit" }'},Label:{description:"a named jump target for Condition / Goto / Repeat",example:'{ "type": "Label", "label": "lbl_on" }'},Goto:{description:"jump unconditionally to a label",example:'{ "type": "Goto", "label": "lbl_on" }'}};import"@node-projects/splitview.webcomponent";var D=class l{static upgradeScriptCommand(t){return t.type==="SetElementProperty"?l.upgradeSetElementProperty(t):(t.type==="If"&&(t.trueCommands=(t.trueCommands??[]).map(s=>l.upgradeScriptCommand(s)),t.elseCommands=(t.elseCommands??[]).map(s=>l.upgradeScriptCommand(s))),t)}static upgradeSetElementProperty(t){return t.targetSelectorTarget==="currentScreen"?t.targetSelectorTarget="container":t.targetSelectorTarget==="parentScreen"?(t.targetSelectorTarget="container",t.parentIndex=1):t.targetSelectorTarget==="currentElement"?t.targetSelectorTarget="element":t.targetSelectorTarget==="parentElement"&&(t.targetSelectorTarget="element",t.parentIndex=1),t}};var j="application/x-simple-script-move",W=class l extends pt{static style=ut`
|
|
960
960
|
:host {
|
|
961
961
|
background: white;
|
|
962
962
|
}
|
|
@@ -1204,8 +1204,8 @@ ${B('{ "source": "parameter", "name": "myParam" }')} <span class="cs-comment">/
|
|
|
1204
1204
|
</node-projects-split-view>
|
|
1205
1205
|
</div>
|
|
1206
1206
|
</div>
|
|
1207
|
-
`;static is="node-projects-visualization-simple-script-editor";_title;get title(){return this._title}set title(t){this._title=t}serviceContainer;instanceServiceContainer;visualizationHandler;visualizationShell;scriptCommandsTypeInfo;propertiesTypeInfo;helpRequested=new dt;commandDescriptions={...ke};_script;_commandListDiv;_commandListFancyTree;_propertygrid;_splitView;_codeView;_codeToggleBtn;_addCommandBtn;_showingCode=!1;_dragFromHandle=!1;_draggedNode=null;constructor(){super(),this._restoreCachedInititalValues(),this._commandListDiv=this._getDomElement("commandList"),this._propertygrid=this._getDomElement("propertygrid"),this._splitView=this._getDomElement("splitView"),this._codeView=this._getDomElement("codeView"),this._codeToggleBtn=this._getDomElement("codeToggleBtn"),this._addCommandBtn=this._getDomElement("addCommandBtn");let t=this._getDomElement("listContent");t.addEventListener("mousedown",s=>{this._dragFromHandle=!!s.target?.closest(".drag-handle")}),document.addEventListener("dragend",()=>{this._draggedNode=null},!0),t.addEventListener("dragover",s=>{if(s.preventDefault(),s.dataTransfer){let e=s.dataTransfer.types.includes(j);s.dataTransfer.dropEffect=e?"move":"copy"}}),t.addEventListener("drop",s=>{if(s.preventDefault(),s.dataTransfer?.types.includes(j)&&this._draggedNode){let i=this._commandListFancyTree.root.children,n=i?.[i.length-1];n&&this._draggedNode.moveTo(n,"after"),this._draggedNode.setClass("wb-drag-source",!1)}else{let i=s.dataTransfer?.getData("text/plain");if(i){let n={type:i};this._commandListFancyTree.root.addChildren(this.createTreeItem(n))}}}),this.shadowRoot.adoptedStyleSheets=[vt,ft,r.style]}async ready(){this._parseAttributesToProperties(),this._bindingsParse(null,!0),this._assignEvents();let t=async c=>{let o=new q;o.visualizationHandler=this.visualizationHandler,o.visualizationShell=this.visualizationShell,o.serviceContainer=this.serviceContainer,o.instanceServiceContainer=this.instanceServiceContainer,o.bindableObjectsTarget="script",o.getTypeInfo=(h,m)=>Ce(this.propertiesTypeInfo,h,m),o.showHead=!1,o.typeName="IScriptMultiplexValue",o.title='Complex for "'+c.propertyPath+'"',typeof c.value=="object"?o.selectedObject=c.value??{}:o.selectedObject={},o.bindingDoubleClicked=h=>{h.bindabletype=="property"?o.setPropertyValue("source","property"):h.bindabletype=="context"?o.setPropertyValue("source","context"):o.setPropertyValue("source","signal"),o.setPropertyValue("name",h.fullName),o.refresh()},await this.visualizationShell.openConfirmation(o,{x:100,y:100,width:400,height:500,parent:this})&&(this._propertygrid.setPropertyValue(c.propertyPath,o.selectedObject),this._propertygrid.refresh())},s=async c=>{let o=new Te;o.language="javascript",o.style.position="relative",o.code=c.value??"",await this.visualizationShell.openConfirmation(o,{title:"Edit formula",x:100,y:50,width:700,height:450,parent:this})&&(this._propertygrid.setPropertyValue(c.propertyPath,o.code),this._propertygrid.refresh())},e=["signal","property","elementProperty","signalInProperty","event","parameter","context","complexString","complexSignal","expression"],i=/^[A-Za-z_$][A-Za-z0-9_$]*$/,n=new Set(["break","case","catch","class","const","continue","debugger","default","delete","do","else","export","extends","finally","for","function","if","import","in","instanceof","new","return","super","switch","this","throw","try","typeof","var","void","while","with","yield","let","static","enum","await","implements","package","protected","interface","private","public","null","true","false","undefined","arguments","eval"]),l={signal:"read the value from a Signal",property:"read the value from a property of the customControl (not usable in screens)",elementProperty:"a property defined on the element raising the event",signalInProperty:"read the value from a Signal (wich name is in the Property)",event:"read the value of a property of the event object",parameter:"a parameter you hand over",context:"a value of the context",complexString:"a string with signals (contained in {})",complexSignal:"read the value from a signal wich name is build here (it can contain other signals in {})",expression:"js expression, 'ctx' is context object"},a=async c=>{let o=(c.value??[]).map(w=>({...w})),p=w=>{let _=(o[w].varName??"").trim();return _?i.test(_)?n.has(_)?`"${_}" is a reserved word and cannot be used as a variable name.`:o.some((k,C)=>C!==w&&(k.varName??"").trim()===_)?`"${_}" is used by more than one signal.`:null:`"${_}" is not a valid JavaScript variable name.`:null},h="height:22px; box-sizing:border-box; font-size:12px;",m=document.createElement("div");m.style.cssText="display:flex; flex-direction:column; gap:6px; padding:8px; height:100%; box-sizing:border-box; overflow-y:auto; font-size:12px;";let u=document.createElement("div");u.style.cssText="display:flex; align-items:center; gap:4px; font-weight:bold;";let d=document.createElement("span");d.textContent="Name",d.style.cssText="flex:0 0 120px;";let g=document.createElement("span");g.textContent="Typ",g.style.cssText="flex:0 0 130px;";let f=document.createElement("span");f.textContent="Signal",f.style.cssText="flex:1 1 auto;";let b=document.createElement("span");b.style.cssText="flex:0 0 22px;",u.append(d,g,f,b),m.appendChild(u);let S=document.createElement("div");S.style.cssText="display:flex; flex-direction:column; gap:4px;",m.appendChild(S);let $=document.createElement("div");$.style.cssText="flex:0 0 auto; margin-top:4px; padding-top:6px; border-top:1px solid #ccc; font-size:12px;";let ae=document.createElement("div");ae.style.cssText="font-weight:bold; margin-bottom:2px;";let ne=document.createElement("div");ne.style.cssText="color:#333; white-space:pre-line;",$.append(ae,ne);let oe=w=>{ae.textContent="Typ: "+w,ne.textContent=l[w]??""},re=[],ye=()=>{o.forEach((w,_)=>{let k=re[_];if(!k)return;let C=p(_);k.title=C??`Variable name used in the formula (defaults to __${_} if empty)`,k.style.borderColor=C?"#c0392b":"",k.style.backgroundColor=C?"#fdecea":""})},le=()=>{S.innerHTML="",re.length=0,o.forEach((w,_)=>{let k=document.createElement("div");k.style.cssText="display:flex; align-items:center; gap:4px;";let C=document.createElement("input");C.value=w.varName??"",C.placeholder="__"+_,C.style.cssText=h+" flex:0 0 120px; min-width: 120px; font-family:monospace;",C.oninput=()=>{w.varName=C.value||void 0,ye()},re.push(C),k.appendChild(C);let N=document.createElement("select");N.style.cssText=h+" flex:0 0 130px;";for(let pe of e){let Z=document.createElement("option");Z.value=pe,Z.textContent=pe,w.source===pe&&(Z.selected=!0),N.appendChild(Z)}N.onchange=()=>{w.source=N.value,oe(N.value)},N.onfocus=()=>oe(N.value),k.appendChild(N);let R=document.createElement("input");R.value=w.name??"",R.placeholder="e.g. srm.rbg{__tagRoot}.error",R.style.cssText=h+" flex:1 1 auto;",R.oninput=()=>{w.name=R.value},k.appendChild(R);let G=document.createElement("button");G.title="Remove signal",G.style.cssText=h+" flex:0 0 22px; width:22px; padding:0; display:flex; align-items:center; justify-content:center;";let ce=document.createElement("img");ce.src=ue+"icons/delete.svg",ce.style.cssText="width:12px; height:12px;",G.appendChild(ce),G.onclick=()=>{o.splice(_,1),le()},k.appendChild(G),S.appendChild(k)}),ye()};le();let Y=document.createElement("button");Y.textContent="+ Add signal",Y.style.cssText=h+" align-self:flex-start; padding:0 8px;",Y.onclick=()=>{o.push({source:"signal",name:""}),le()},m.appendChild(Y),oe(o[0]?.source??"signal"),m.appendChild($),await this.visualizationShell.openConfirmation(m,{title:"Edit signals",x:100,y:50,width:500,height:400,parent:this})&&(this._propertygrid.setPropertyValue(c.propertyPath,o),this._propertygrid.refresh())};this._propertygrid.visualizationHandler=this.visualizationHandler,this._propertygrid.visualizationShell=this.visualizationShell,this._propertygrid.serviceContainer=this.serviceContainer,this._propertygrid.instanceServiceContainer=this.instanceServiceContainer,this._propertygrid.bindableObjectsTarget="script",this._propertygrid.setNameColumnWidth(130),this._propertygrid.getTypeInfo=(c,o)=>{let p=Ce(this.scriptCommandsTypeInfo,c,o);return p&&(o==="If"||c?.type==="If")&&(p.properties=p.properties.filter(h=>h.name!=="trueCommands"&&h.name!=="elseCommands")),p},this._propertygrid.getSpecialEditorForType=async(c,o,p,h,m)=>{if(!c.specialAllreadyAdded&&(c.specialAllreadyAdded=!0,c.format!=="collection"))if(c.format==="signalList"){let u=document.createElement("button");u.style.height="calc(100% - 6px)",u.style.position="relative",u.style.display="flex",u.style.justifyContent="center",u.style.width="20px",u.style.boxSizing="content-box",u.innerText="del",u.onclick=()=>{this._propertygrid.setPropertyValue(p,void 0),this._propertygrid.refresh()},h.nodeElem.insertAdjacentElement("afterbegin",u);let d=Array.isArray(o)?o:[],g=document.createElement("div");g.style.display="flex";let f=document.createElement("span");f.innerText=d.map((S,$)=>(S?.varName||"__"+$)+": "+(S?.source??"")+":"+(S?.name??"")).join(", "),f.style.overflow="hidden",f.style.whiteSpace="nowrap",f.style.textOverflow="ellipsis",f.style.flexGrow="1",f.title=JSON.stringify(d),g.appendChild(f);let b=document.createElement("button");return b.innerText="...",b.onclick=()=>{a({value:d,propertyPath:p})},g.appendChild(b),h.nodeElem.style.display="flex",g}else if(c.format==="formula"){let u=document.createElement("div");u.style.cssText="display:flex; width:100%; height:100%; align-items:stretch;";let d=new Te;d.language="javascript",d.singleRow=!0,d.style.cssText="flex:1 1 auto; min-width:0; height:100%; position:relative; overflow:hidden;",d.code=o??"",d.addEventListener("code-changed",()=>{this._propertygrid.setPropertyValue(p,d.code)}),u.appendChild(d);let g=document.createElement("button");return g.innerText="...",g.title="Open in larger editor",g.style.cssText="flex:0 0 28px; width:20px;",g.onclick=()=>s({value:d.code,propertyPath:p}),u.appendChild(g),h.nodeElem.style.display="flex",u}else if(typeof o=="object"&&o!==null||c.format==="complex"){let u=document.createElement("button");u.style.height="calc(100% - 6px)",u.style.position="relative",u.style.display="flex",u.style.justifyContent="center",u.style.width="20px",u.style.boxSizing="content-box",u.innerText="del",u.onclick=()=>{this._propertygrid.setPropertyValue(p,void 0),this._propertygrid.refresh()},h.nodeElem.insertAdjacentElement("afterbegin",u);let d=document.createElement("div");d.style.display="flex";let g=document.createElement("span");o?g.innerText=(o.source??"")+": "+(o.name??""):g.innerText="",g.style.overflow="hidden",g.style.whiteSpace="nowrap",g.style.textOverflow="ellipsis",g.style.flexGrow="1",g.title=JSON.stringify(o),d.appendChild(g);let f=document.createElement("button");return f.innerText="...",f.onclick=()=>{t({value:o,propertyPath:p})},d.appendChild(f),h.nodeElem.style.display="flex",d}else{let u=document.createElement("button");u.style.height="calc(100% - 6px)",u.style.position="relative",u.style.display="flex",u.style.justifyContent="center",u.style.width="20px",u.style.boxSizing="content-box",u.title="complex property value",u.style.opacity="0.2",u.innerText="...",u.onclick=()=>{t({value:o,propertyPath:p})},h.nodeElem.insertAdjacentElement("afterbegin",u),h.nodeElem.style.display="flex"}return null},this._propertygrid.propertyNodeContextMenu.on(c=>{mt.show([{title:"edit complex value",action:async()=>{t(c)}},{title:"edit string",action:async()=>{let o=prompt("enter value:");o&&(this._propertygrid.setPropertyValue(c.propertyPath,o),this._propertygrid.refresh())}},{title:"remove complex value",action:async()=>{this._propertygrid.setPropertyValue(c.propertyPath,void 0),this._propertygrid.refresh()}}],c.event)})}helpClicked(){let t=document.createElement("iframe");t.srcdoc=_e,t.style.cssText="width:100%; height:100%; border:none; display:block;",this.visualizationShell.openModal(t,{title:"Simple Script Editor Help",parent:this,x:-650,y:-100,width:620,height:620}),this.helpRequested.emit()}toggleCodeView(){if(!this._showingCode){let s=JSON.stringify({commands:this.getScriptCommands()},null,2);this._codeView.update(s),this._showCodeView(!0);return}let t=this._parseCodeViewScript();t&&(this._showCodeView(!1),this.loadScript(t))}_showCodeView(t){this._codeView.classList.toggle("visible",t),this._commandListDiv.classList.toggle("hidden",t),this._splitView.classList.toggle("code-mode",t),this._addCommandBtn.disabled=t,this._codeToggleBtn.innerText=t?"Visual":"Code",this._showingCode=t,t&&requestAnimationFrame(()=>this._codeView.activated())}_parseCodeViewScript(){let t;try{t=JSON.parse(this._codeView.getText())}catch(s){return alert(`Invalid JSON:
|
|
1208
|
-
`+s.message),null}return Array.isArray(t?.commands)?t:(alert('The JSON must have a "commands" array.'),null)}loadScript(t){this._script=t,this._commandListFancyTree&&(this._commandListFancyTree.destroy(),this._commandListDiv=this._getDomElement("commandList"));let s=[];for(let e of this._script.commands)e=D.upgradeScriptCommand(e),s.push(this.createTreeItem(e));this._commandListFancyTree=new yt({...gt,element:this._commandListDiv,icon:!1,source:s,activate:e=>{this._propertygrid.selectedObject=e.node.data.data.item??null},render:e=>{let i=!!e.node.data.data?.branch;if(e.isNew){e.nodeElem.oncontextmenu=a=>(a.preventDefault(),!1);let
|
|
1207
|
+
`;static is="node-projects-visualization-simple-script-editor";_title;get title(){return this._title}set title(t){this._title=t}serviceContainer;instanceServiceContainer;visualizationHandler;visualizationShell;scriptCommandsTypeInfo;propertiesTypeInfo;helpRequested=new dt;commandDescriptions={...ke};_script;_commandListDiv;_commandListFancyTree;_propertygrid;_splitView;_codeView;_codeToggleBtn;_addCommandBtn;_showingCode=!1;_dragFromHandle=!1;_draggedNode=null;constructor(){super(),this._restoreCachedInititalValues(),this._commandListDiv=this._getDomElement("commandList"),this._propertygrid=this._getDomElement("propertygrid"),this._splitView=this._getDomElement("splitView"),this._codeView=this._getDomElement("codeView"),this._codeToggleBtn=this._getDomElement("codeToggleBtn"),this._addCommandBtn=this._getDomElement("addCommandBtn");let t=this._getDomElement("listContent");t.addEventListener("mousedown",s=>{this._dragFromHandle=!!s.target?.closest(".drag-handle")}),document.addEventListener("dragend",()=>{this._draggedNode=null},!0),t.addEventListener("dragover",s=>{if(s.preventDefault(),s.dataTransfer){let e=s.dataTransfer.types.includes(j);s.dataTransfer.dropEffect=e?"move":"copy"}}),t.addEventListener("drop",s=>{if(s.preventDefault(),s.dataTransfer?.types.includes(j)&&this._draggedNode){let i=this._commandListFancyTree.root.children,n=i?.[i.length-1];n&&this._draggedNode.moveTo(n,"after"),this._draggedNode.setClass("wb-drag-source",!1)}else{let i=s.dataTransfer?.getData("text/plain");if(i){let n={type:i};this._commandListFancyTree.root.addChildren(this.createTreeItem(n))}}}),this.shadowRoot.adoptedStyleSheets=[vt,ft,l.style]}async ready(){this._parseAttributesToProperties(),this._bindingsParse(null,!0),this._assignEvents();let t=async c=>{let o=new q;o.visualizationHandler=this.visualizationHandler,o.visualizationShell=this.visualizationShell,o.serviceContainer=this.serviceContainer,o.instanceServiceContainer=this.instanceServiceContainer,o.bindableObjectsTarget="script",o.getTypeInfo=(h,m)=>Ce(this.propertiesTypeInfo,h,m),o.showHead=!1,o.typeName="IScriptMultiplexValue",o.title='Complex for "'+c.propertyPath+'"',typeof c.value=="object"?o.selectedObject=c.value??{}:o.selectedObject={},o.bindingDoubleClicked=h=>{h.bindabletype=="property"?o.setPropertyValue("source","property"):h.bindabletype=="context"?o.setPropertyValue("source","context"):o.setPropertyValue("source","signal"),o.setPropertyValue("name",h.fullName),o.refresh()},await this.visualizationShell.openConfirmation(o,{x:100,y:100,width:400,height:500,parent:this})&&(this._propertygrid.setPropertyValue(c.propertyPath,o.selectedObject),this._propertygrid.refresh())},s=async c=>{let o=new Te;o.language="javascript",o.style.position="relative",o.code=c.value??"",await this.visualizationShell.openConfirmation(o,{title:"Edit formula",x:100,y:50,width:700,height:450,parent:this})&&(this._propertygrid.setPropertyValue(c.propertyPath,o.code),this._propertygrid.refresh())},e=["signal","property","elementProperty","signalInProperty","event","parameter","context","complexString","complexSignal","expression"],i=/^[A-Za-z_$][A-Za-z0-9_$]*$/,n=new Set(["break","case","catch","class","const","continue","debugger","default","delete","do","else","export","extends","finally","for","function","if","import","in","instanceof","new","return","super","switch","this","throw","try","typeof","var","void","while","with","yield","let","static","enum","await","implements","package","protected","interface","private","public","null","true","false","undefined","arguments","eval"]),r={signal:"read the value from a Signal",property:"read the value from a property of the customControl (not usable in screens)",elementProperty:"a property defined on the element raising the event",signalInProperty:"read the value from a Signal (wich name is in the Property)",event:"read the value of a property of the event object",parameter:"a parameter you hand over",context:"a value of the context",complexString:"a string with signals (contained in {})",complexSignal:"read the value from a signal wich name is build here (it can contain other signals in {})",expression:"js expression, 'ctx' is context object"},a=async c=>{let o=(c.value??[]).map(w=>({...w})),p=w=>{let S=(o[w].varName??"").trim();return S?i.test(S)?n.has(S)?`"${S}" is a reserved word and cannot be used as a variable name.`:o.some((k,C)=>C!==w&&(k.varName??"").trim()===S)?`"${S}" is used by more than one signal.`:null:`"${S}" is not a valid JavaScript variable name.`:null},h="height:22px; box-sizing:border-box; font-size:12px;",m=document.createElement("div");m.style.cssText="display:flex; flex-direction:column; gap:6px; padding:8px; height:100%; box-sizing:border-box; overflow-y:auto; font-size:12px;";let u=document.createElement("div");u.style.cssText="display:flex; align-items:center; gap:4px; font-weight:bold;";let d=document.createElement("span");d.textContent="Name",d.style.cssText="flex:0 0 120px;";let g=document.createElement("span");g.textContent="Typ",g.style.cssText="flex:0 0 130px;";let f=document.createElement("span");f.textContent="Signal",f.style.cssText="flex:1 1 auto;";let b=document.createElement("span");b.style.cssText="flex:0 0 22px;",u.append(d,g,f,b),m.appendChild(u);let _=document.createElement("div");_.style.cssText="display:flex; flex-direction:column; gap:4px;",m.appendChild(_);let $=document.createElement("div");$.style.cssText="flex:0 0 auto; margin-top:4px; padding-top:6px; border-top:1px solid #ccc; font-size:12px;";let ae=document.createElement("div");ae.style.cssText="font-weight:bold; margin-bottom:2px;";let ne=document.createElement("div");ne.style.cssText="color:#333; white-space:pre-line;",$.append(ae,ne);let oe=w=>{ae.textContent="Typ: "+w,ne.textContent=r[w]??""},re=[],ye=()=>{o.forEach((w,S)=>{let k=re[S];if(!k)return;let C=p(S);k.title=C??`Variable name used in the formula (defaults to __${S} if empty)`,k.style.borderColor=C?"#c0392b":"",k.style.backgroundColor=C?"#fdecea":""})},le=()=>{_.innerHTML="",re.length=0,o.forEach((w,S)=>{let k=document.createElement("div");k.style.cssText="display:flex; align-items:center; gap:4px;";let C=document.createElement("input");C.value=w.varName??"",C.placeholder="__"+S,C.style.cssText=h+" flex:0 0 120px; min-width: 120px; font-family:monospace;",C.oninput=()=>{w.varName=C.value||void 0,ye()},re.push(C),k.appendChild(C);let N=document.createElement("select");N.style.cssText=h+" flex:0 0 130px;";for(let pe of e){let Z=document.createElement("option");Z.value=pe,Z.textContent=pe,w.source===pe&&(Z.selected=!0),N.appendChild(Z)}N.onchange=()=>{w.source=N.value,oe(N.value)},N.onfocus=()=>oe(N.value),k.appendChild(N);let R=document.createElement("input");R.value=w.name??"",R.placeholder="e.g. srm.rbg{__tagRoot}.error",R.style.cssText=h+" flex:1 1 auto;",R.oninput=()=>{w.name=R.value},k.appendChild(R);let G=document.createElement("button");G.title="Remove signal",G.style.cssText=h+" flex:0 0 22px; width:22px; padding:0; display:flex; align-items:center; justify-content:center;";let ce=document.createElement("img");ce.src=ue+"icons/delete.svg",ce.style.cssText="width:12px; height:12px;",G.appendChild(ce),G.onclick=()=>{o.splice(S,1),le()},k.appendChild(G),_.appendChild(k)}),ye()};le();let Y=document.createElement("button");Y.textContent="+ Add signal",Y.style.cssText=h+" align-self:flex-start; padding:0 8px;",Y.onclick=()=>{o.push({source:"signal",name:""}),le()},m.appendChild(Y),oe(o[0]?.source??"signal"),m.appendChild($),await this.visualizationShell.openConfirmation(m,{title:"Edit signals",x:100,y:50,width:500,height:400,parent:this})&&(this._propertygrid.setPropertyValue(c.propertyPath,o),this._propertygrid.refresh())};this._propertygrid.visualizationHandler=this.visualizationHandler,this._propertygrid.visualizationShell=this.visualizationShell,this._propertygrid.serviceContainer=this.serviceContainer,this._propertygrid.instanceServiceContainer=this.instanceServiceContainer,this._propertygrid.bindableObjectsTarget="script",this._propertygrid.setNameColumnWidth(130),this._propertygrid.getTypeInfo=(c,o)=>{let p=Ce(this.scriptCommandsTypeInfo,c,o);return p&&(o==="If"||c?.type==="If")&&(p.properties=p.properties.filter(h=>h.name!=="trueCommands"&&h.name!=="elseCommands")),p},this._propertygrid.getSpecialEditorForType=async(c,o,p,h,m)=>{if(!c.specialAllreadyAdded&&(c.specialAllreadyAdded=!0,c.format!=="collection"))if(c.format==="signalList"){let u=document.createElement("button");u.style.height="calc(100% - 6px)",u.style.position="relative",u.style.display="flex",u.style.justifyContent="center",u.style.width="20px",u.style.boxSizing="content-box",u.innerText="del",u.onclick=()=>{this._propertygrid.setPropertyValue(p,void 0),this._propertygrid.refresh()},h.nodeElem.insertAdjacentElement("afterbegin",u);let d=Array.isArray(o)?o:[],g=document.createElement("div");g.style.display="flex";let f=document.createElement("span");f.innerText=d.map((_,$)=>(_?.varName||"__"+$)+": "+(_?.source??"")+":"+(_?.name??"")).join(", "),f.style.overflow="hidden",f.style.whiteSpace="nowrap",f.style.textOverflow="ellipsis",f.style.flexGrow="1",f.title=JSON.stringify(d),g.appendChild(f);let b=document.createElement("button");return b.innerText="...",b.onclick=()=>{a({value:d,propertyPath:p})},g.appendChild(b),h.nodeElem.style.display="flex",g}else if(c.format==="formula"){let u=document.createElement("div");u.style.cssText="display:flex; width:100%; height:100%; align-items:stretch;";let d=new Te;d.language="javascript",d.singleRow=!0,d.style.cssText="flex:1 1 auto; min-width:0; height:100%; position:relative; overflow:hidden;",d.code=o??"",d.addEventListener("code-changed",()=>{this._propertygrid.setPropertyValue(p,d.code)}),u.appendChild(d);let g=document.createElement("button");return g.innerText="...",g.title="Open in larger editor",g.style.cssText="flex:0 0 28px; width:20px;",g.onclick=()=>s({value:d.code,propertyPath:p}),u.appendChild(g),h.nodeElem.style.display="flex",u}else if(typeof o=="object"&&o!==null||c.format==="complex"){let u=document.createElement("button");u.style.height="calc(100% - 6px)",u.style.position="relative",u.style.display="flex",u.style.justifyContent="center",u.style.width="20px",u.style.boxSizing="content-box",u.innerText="del",u.onclick=()=>{this._propertygrid.setPropertyValue(p,void 0),this._propertygrid.refresh()},h.nodeElem.insertAdjacentElement("afterbegin",u);let d=document.createElement("div");d.style.display="flex";let g=document.createElement("span");o?g.innerText=(o.source??"")+": "+(o.name??""):g.innerText="",g.style.overflow="hidden",g.style.whiteSpace="nowrap",g.style.textOverflow="ellipsis",g.style.flexGrow="1",g.title=JSON.stringify(o),d.appendChild(g);let f=document.createElement("button");return f.innerText="...",f.onclick=()=>{t({value:o,propertyPath:p})},d.appendChild(f),h.nodeElem.style.display="flex",d}else{let u=document.createElement("button");u.style.height="calc(100% - 6px)",u.style.position="relative",u.style.display="flex",u.style.justifyContent="center",u.style.width="20px",u.style.boxSizing="content-box",u.title="complex property value",u.style.opacity="0.2",u.innerText="...",u.onclick=()=>{t({value:o,propertyPath:p})},h.nodeElem.insertAdjacentElement("afterbegin",u),h.nodeElem.style.display="flex"}return null},this._propertygrid.propertyNodeContextMenu.on(c=>{mt.show([{title:"edit complex value",action:async()=>{t(c)}},{title:"edit string",action:async()=>{let o=prompt("enter value:");o&&(this._propertygrid.setPropertyValue(c.propertyPath,o),this._propertygrid.refresh())}},{title:"remove complex value",action:async()=>{this._propertygrid.setPropertyValue(c.propertyPath,void 0),this._propertygrid.refresh()}}],c.event)})}helpClicked(){let t=document.createElement("iframe");t.srcdoc=Se,t.style.cssText="width:100%; height:100%; border:none; display:block;",this.visualizationShell.openModal(t,{title:"Simple Script Editor Help",parent:this,x:-650,y:-100,width:620,height:620}),this.helpRequested.emit()}toggleCodeView(){if(!this._showingCode){let s=JSON.stringify({commands:this.getScriptCommands()},null,2);this._codeView.update(s),this._showCodeView(!0);return}let t=this._parseCodeViewScript();t&&(this._showCodeView(!1),this.loadScript(t))}_showCodeView(t){this._codeView.classList.toggle("visible",t),this._commandListDiv.classList.toggle("hidden",t),this._splitView.classList.toggle("code-mode",t),this._addCommandBtn.disabled=t,this._codeToggleBtn.innerText=t?"Visual":"Code",this._showingCode=t,t&&requestAnimationFrame(()=>this._codeView.activated())}_parseCodeViewScript(){let t;try{t=JSON.parse(this._codeView.getText())}catch(s){return alert(`Invalid JSON:
|
|
1208
|
+
`+s.message),null}return Array.isArray(t?.commands)?t:(alert('The JSON must have a "commands" array.'),null)}loadScript(t){this._script=t,this._commandListFancyTree&&(this._commandListFancyTree.destroy(),this._commandListDiv=this._getDomElement("commandList"));let s=[];for(let e of this._script.commands)e=D.upgradeScriptCommand(e),s.push(this.createTreeItem(e));this._commandListFancyTree=new yt({...gt,element:this._commandListDiv,icon:!1,source:s,activate:e=>{this._propertygrid.selectedObject=e.node.data.data.item??null},render:e=>{let i=!!e.node.data.data?.branch;if(e.isNew){e.nodeElem.oncontextmenu=a=>(a.preventDefault(),!1);let r=document.createElement("span");if(r.style.cssText="display:inline-block; width:24px;",e.nodeElem.prepend(r),i)e.nodeElem._reservedRowWidth=r.offsetWidth;else{let a=document.createElement("div");a.className="drag-handle",a.title="Drag to reorder",a.innerHTML='<svg viewBox="0 0 24 24" width="14" height="14"><path d="M4 6h16M4 12h16M4 18h16" stroke="currentColor" stroke-width="2" stroke-linecap="round"/></svg>',e.nodeElem.prepend(a);let c=e.nodeElem.parentElement,o=document.createElement("span");o.style.cssText="display:inline-block; width:32px;",e.nodeElem.appendChild(o);let p=document.createElement("div");p.className="cmd";let h=document.createElement("img");h.src=ue+"icons/copy.svg",h.title="Duplicate",h.onclick=()=>{let u=structuredClone(e.node.data.data.item);e.node.parent.addChildren(this.createTreeItem(u)).moveTo(e.node,"after")};let m=document.createElement("img");m.src=ue+"icons/delete.svg",m.title="Remove",m.onclick=()=>e.node.remove(),p.append(h,m),c.appendChild(p),e.nodeElem._reservedRowWidth=r.offsetWidth+o.offsetWidth}}let n=e.nodeElem._reservedRowWidth??0;if(n){let r=e.nodeElem.querySelector("span.wb-title");if(r){let a=parseFloat(r.style.width);isNaN(a)||(r.style.width=Math.max(0,a-n)+"px")}}},dnd:{guessDropEffect:!0,preventRecursion:!0,preventVoidMoves:!1,serializeClipboardData:!1,dragStart:e=>this._dragFromHandle?(this._draggedNode=e.node,e.event.dataTransfer.effectAllowed="move",e.event.dataTransfer.dropEffect="move",e.event.dataTransfer.setData(j,"1"),!0):!1,dragEnd:()=>{this._draggedNode=null},dragEnter:e=>{let i=e.event.dataTransfer?.types.includes(j);return e.event.dataTransfer.dropEffect=i?"move":"copy",!!e.node.data.data?.branch?new Set(["over"]):new Set(["before","after"])},dragOver:e=>{let i=e.event.dataTransfer?.types.includes(j);e.event.dataTransfer.dropEffect=i?"move":"copy"},drop:async e=>{let i=e.event.dataTransfer?.types.includes(j);if(e.region==="over"){if(i&&this._draggedNode)this._draggedNode.moveTo(e.node,"appendChild"),this._draggedNode.setClass("wb-drag-source",!1);else{let r=e.event.dataTransfer?.getData("text/plain");r&&e.node.addChildren(this.createTreeItem({type:r}))}return}let n=e.region=="before"?"before":"after";if(i&&this._draggedNode)this._draggedNode.moveTo(e.node,n),this._draggedNode.setClass("wb-drag-source",!1);else{let r=e.event.dataTransfer?.getData("text/plain");if(r){let a={type:r},c=this.createTreeItem(a);e.node.parent.addChildren(c).moveTo(e.node,n)}}}}}),this._commandListFancyTree.root.children?.[0]?.setActive()}createTreeItem(t){if(t.type==="If"){let s=t;return s.trueCommands??=[],s.elseCommands??=[],{title:"If",expanded:!0,data:{item:t},children:[{title:"true",expanded:!0,data:{branch:"true"},children:s.trueCommands.map(e=>this.createTreeItem(e))},{title:"else",expanded:!0,data:{branch:"else"},children:s.elseCommands.map(e=>this.createTreeItem(e))}]}}return{title:t.type,data:{item:t}}}nodeToCommand(t){let s=t.data.data.item;if(s.type==="If"){let e=t.children?.find(n=>n.data.data?.branch==="true"),i=t.children?.find(n=>n.data.data?.branch==="else");s.trueCommands=(e?.children??[]).map(n=>this.nodeToCommand(n)),s.elseCommands=(i?.children??[]).map(n=>this.nodeToCommand(n))}return s}_getBranchContainerNode(t){let s=t;for(;s;){if(s.data?.data?.branch)return s;s=s.parent}return null}async addCommand(){let t=new L;t.loadCommands(this.scriptCommandsTypeInfo,this.commandDescriptions),t.title="Add Script Command",t.commandTypeChosen.on(()=>{if(t.selectedType){let e={type:t.selectedType},i=this.createTreeItem(e),n=this._getBranchContainerNode(this._commandListFancyTree.activeNode);n?n.addChildren(i):this._commandListFancyTree.addChildren(i)}});let s=new AbortController;t.closeRequested.on(()=>s.abort()),await this.visualizationShell.openModal(t,{title:"Add Script Command",x:300,y:50,width:620,height:400,parent:this,abortSignal:s.signal})}getScriptCommands(){if(this._showingCode){let s=this._parseCodeViewScript();s&&this.loadScript(s)}return this._commandListFancyTree.root.children.map(s=>this.nodeToCommand(s))}};customElements.define(W.is,W);import{BaseCustomWebComponentConstructorAppend as bt,css as xt,html as wt}from"@node-projects/base-custom-webcomponent";var M=class extends bt{static style=xt`
|
|
1209
1209
|
:host {
|
|
1210
1210
|
display: grid;
|
|
1211
1211
|
grid-template-columns: 80px 80px 80px auto;
|
|
@@ -1238,7 +1238,7 @@ ${B('{ "source": "parameter", "name": "myParam" }')} <span class="cs-comment">/
|
|
|
1238
1238
|
<input hidden="[[item.type !== 'boolean']]" type="checkbox" checked="{{item.value}}">
|
|
1239
1239
|
<div hidden="[[item.type !== 'null']]">-null-</div>
|
|
1240
1240
|
</template>
|
|
1241
|
-
<button @click="[[this._add()]]" style="width: 40px; height: 20px; align-self: center;">add</button>`;static is="node-projects-visualization-parameter-editor";constructor(){super(),this._restoreCachedInititalValues()}ready(){this._bindingsParse()}_parameterArray;setParametersObject(t){t!=null?this._parameterArray=Object.keys(t).map(s=>({key:s,type:typeof t[s]=="object"?"null":typeof t[s],value:t[s]})):this._parameterArray=[],this._bindingsRefresh()}getParametersObject(){let t=!1,s={};for(let e of this._parameterArray)if(e.key)switch(t=!0,s[e.key]=null,e.type){case"string":s[e.key]=e.value.toString();break;case"number":let i=parseFloat(e.value);s[e.key]=isNaN(i)?0:i;break;case"boolean":s[e.key]=!!e.value;break}return t?s:null}_remove(t){this._parameterArray.splice(t,1),this._bindingsRefresh()}_add(){this._parameterArray.push({type:"null"}),this._bindingsRefresh()}};customElements.define(M.is,M);import{BaseCustomWebComponentConstructorAppend as
|
|
1241
|
+
<button @click="[[this._add()]]" style="width: 40px; height: 20px; align-self: center;">add</button>`;static is="node-projects-visualization-parameter-editor";constructor(){super(),this._restoreCachedInititalValues()}ready(){this._bindingsParse()}_parameterArray;setParametersObject(t){t!=null?this._parameterArray=Object.keys(t).map(s=>({key:s,type:typeof t[s]=="object"?"null":typeof t[s],value:t[s]})):this._parameterArray=[],this._bindingsRefresh()}getParametersObject(){let t=!1,s={};for(let e of this._parameterArray)if(e.key)switch(t=!0,s[e.key]=null,e.type){case"string":s[e.key]=e.value.toString();break;case"number":let i=parseFloat(e.value);s[e.key]=isNaN(i)?0:i;break;case"boolean":s[e.key]=!!e.value;break}return t?s:null}_remove(t){this._parameterArray.splice(t,1),this._bindingsRefresh()}_add(){this._parameterArray.push({type:"null"}),this._bindingsRefresh()}};customElements.define(M.is,M);import{BaseCustomWebComponentConstructorAppend as _t,css as St,html as Ee}from"@node-projects/base-custom-webcomponent";import{ContextMenu as Ne,copyTextToClipboard as Be,getTextFromClipboard as Ie,PropertiesHelper as kt}from"@node-projects/web-component-designer";var ee=class l extends _t{static style=St`
|
|
1242
1242
|
:host {
|
|
1243
1243
|
display: grid;
|
|
1244
1244
|
grid-template-columns: 20px 1fr auto;
|
|
@@ -1284,10 +1284,10 @@ ${B('{ "source": "parameter", "name": "myParam" }')} <span class="cs-comment">/
|
|
|
1284
1284
|
<input value="[[this._getScriptName(item)]]" @keypress="[[this._changeScriptName(event, item)]]" hidden="[[this._getScriptType(item) !== 'js']]" placeholder="name" title="name" style="min-width: 50px; flex-basis: 30px; flex-grow: 2;" class="mth" type="text">
|
|
1285
1285
|
<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">
|
|
1286
1286
|
<button css:background="[[this._hasParameters(item) ? 'lime' : '']]" style="display: flex; padding: 0; flex-grow: 0;" title="parameter" @click="[[this._editParameter(event, item)]]">p</button>
|
|
1287
|
-
</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(t,s,e,i,n,l){this._visualizationHandler=t,this._visualizationShell=s,this._scriptCommandsTypeInfo=e,this._propertiesTypeInfo=i,this._blocklyToolbox=n,this._commandDescriptions=l}set instanceServiceContainer(t){this._instanceServiceContainer=t,this._selectionChangedHandler?.dispose(),this._selectionChangedHandler=this._instanceServiceContainer.selectionService.onSelectionChanged.on(s=>{this.selectedItems=s.selectedElements}),this.selectedItems=this._instanceServiceContainer.selectionService.selectedElements}_createControlsForScript(t){switch(this._getScriptType(t)){case"none":return""}return this.constructor.editRowTemplate.content.cloneNode(!0)}_getScriptName(t){if(this.selectedItems[0].hasAttribute("@"+t.name)){let s=this.selectedItems[0].getAttribute("@"+t.name);if(s[0]==="{"){if(s.includes("name"))return JSON.parse(s).name}else return s}return null}async _changeScriptName(t,s){if(t.key=="Enter"&&this.selectedItems&&this.selectedItems.length&&this.selectedItems[0].hasAttribute("@"+s.name)){let e=t.target.value,i=this.selectedItems[0].getAttribute("@"+s.name);if(i.startsWith("{")){let n=JSON.parse(i);n.name=e,this._selectedItems[0].setAttribute("@"+s.name,JSON.stringify(n))}else this._selectedItems[0].setAttribute("@"+s.name,e)}}_getRelativeSignalsPath(t){if(this.selectedItems[0].hasAttribute("@"+t.name)){let s=this.selectedItems[0].getAttribute("@"+t.name);if(s[0]==="{"&&s.includes("relativeSignalsPath"))return JSON.parse(s).relativeSignalsPath}return null}async _changeRelativeSignalsPath(t,s){if(t.key=="Enter"&&this.selectedItems&&this.selectedItems.length&&this.selectedItems[0].hasAttribute("@"+s.name)){let e=t.target.value,i=this.selectedItems[0].getAttribute("@"+s.name);if(i.startsWith("{")){let n=JSON.parse(i);n.relativeSignalsPath=e,this._selectedItems[0].setAttribute("@"+s.name,JSON.stringify(n))}else{let n={name:i,relativeSignalsPath:e};this._selectedItems[0].setAttribute("@"+s.name,JSON.stringify(n))}}}_hasParameters(t){return this.selectedItems[0].hasAttribute("@"+t.name)?this.selectedItems[0].getAttribute("@"+t.name).includes("parameters"):!1}_getScriptTypeColor(t){let s=this._getScriptType(t);return r.scriptTypeColors[s]??"white"}_getScriptType(t){if(t.designItem.hasAttribute("@"+t.name)){let s=t.designItem.getAttribute("@"+t.name);if(s.startsWith("{")){let e=JSON.parse(s);return"blocks"in e?"blockly":"commands"in e?"script":"js"}else return s==""?"empty":"js"}return"none"}_getEventMethodname(t){return this.selectedItems.length?this.selectedItems[0].getAttribute("@"+t.name):""}_inputMthName(t,s){let e=t.target;this.selectedItems[0].setAttribute("@"+s.name,e.value)}_ctxMenu(t,s){t.preventDefault();let e=this._getScriptType(s);if(e=="empty")this._showContextMenuAssignScript(t,s,!0);else if(e!="none"){let i=[{title:"remove",action:()=>{this.selectedItems[0].removeAttribute("@"+s.name),this._bindingsRefresh()}},{title:"-"},{title:"copy",action:()=>{Be(this.selectedItems[0].getAttribute("@"+s.name))}},{title:"paste",action:async()=>{this.selectedItems[0].setAttribute("@"+s.name,await Ie()),this._bindingsRefresh()}}];Ne.show(i,t)}else this._showContextMenuAssignScript(t,s,!0)}async _addEvent(t){if(t.key=="Enter"){let s=this._getDomElement("addEventInput");this._selectedItems[0].setAttribute("@"+kt.camelToDashCase(s.value.replaceAll(" ","-")),""),s.value="",this.scrollTop=0,this.refresh()}}_createAssignScriptContextMenu(t,s){let e=[{title:"Simple Script",action:()=>{this._editEvent("script",t,s)}},{title:"Javascript",action:()=>{let n=prompt("name of function ?");n&&(this._selectedItems[0].setAttribute("@"+s.name,n),this.refresh(),this._editEvent("js",null,s))}},{title:"Blockly",action:()=>{this._editBlockly(null,s)}}],i=this._getScriptType(s);return i!="none"&&(e.push({title:"-"}),e.push({title:"remove",action:()=>{this.selectedItems[0].removeAttribute("@"+s.name),this._bindingsRefresh()}})),i!="empty"&&e.push({title:"-"},{title:"copy",action:()=>{Be(this.selectedItems[0].getAttribute("@"+s.name))}},{title:"paste",action:async()=>{this.selectedItems[0].setAttribute("@"+s.name,await Ie()),this._bindingsRefresh()}}),e}async _showContextMenuAssignScript(t,s,e){t.preventDefault();let i=this._getScriptType(s);if(i!="none"&&i!="empty"&&!e)this._editEvent(i,t,s);else{let n=this._createAssignScriptContextMenu(t,s);Ne.show(n,t)}}async _editParameter(t,s){let e=new M,i={};e.title="ParameterEditor for '"+s.name+"' of '"+s.designItem.name+"'";let n=s.designItem.getAttribute("@"+s.name);if(n&&n[0]=="{")try{i=JSON.parse(n).parameters}catch{}if(e.setParametersObject(i),await this._visualizationShell.openConfirmation(e,{x:100,y:100,width:700,height:500})){let a=e.getParametersObject(),c={name:n,parameters:a};n&&n[0]=="{"&&(c=JSON.parse(n),c.parameters=a),a==null&&delete c.parameters;let o=JSON.stringify(c);s.designItem.setAttribute("@"+s.name,o),this._bindingsRefresh()}}async _editBlockly(t,s){let e=new A(this._blocklyToolbox);e.title="Blockly Script for '"+s.name+"' of '"+s.designItem.name+"'";let i=s.designItem.getAttribute("@"+s.name),n=null,l=null;if(i){let c=JSON.parse(i);n=c.parameters,l=c.relativeSignalsPath,e.load(c)}if(await this._visualizationShell.openConfirmation(e,{x:100,y:100,width:700,height:500})){let c=e.save();n&&(c.parameters=n),l&&(c.relativeSignalsPath=l),s.designItem.setAttribute("@"+s.name,JSON.stringify(c)),this._bindingsRefresh()}}async _editJavascript(t,s){}async _editSimpleScript(t,s){let e=s.designItem.getAttribute("@"+s.name);if(!e||e.startsWith("{")){let i={commands:[]},n=null,l=null;e&&(i=JSON.parse(e),n=i.parameters,l=i.relativeSignalsPath);let a=new W;if(a.serviceContainer=s.designItem.serviceContainer,a.instanceServiceContainer=s.designItem.instanceServiceContainer,a.scriptCommandsTypeInfo=this._scriptCommandsTypeInfo,a.propertiesTypeInfo=this._propertiesTypeInfo,a.visualizationShell=this._visualizationShell,a.visualizationHandler=this._visualizationHandler,this._commandDescriptions&&(a.commandDescriptions={...a.commandDescriptions,...this._commandDescriptions}),a.loadScript(i),a.title="Script '"+s.name+"' on "+s.designItem.name,await this._visualizationShell.openConfirmation(a,{title:a.title,width:600,height:500})){let o=a.getScriptCommands();if(o&&o.length){let p={commands:o};n&&(p.parameters=n),l&&(p.relativeSignalsPath=l);let h=JSON.stringify(p);s.designItem.setAttribute("@"+s.name,h),this._bindingsRefresh()}}}}async _editEvent(t,s,e){t=="js"?this._editJavascript(s,e):t=="blockly"?this._editBlockly(s,e):this._editSimpleScript(s,e)}refresh(){this._selectedItems!=null&&this._selectedItems.length?this.events=this._selectedItems[0].serviceContainer.getLastServiceWhere("eventsService",t=>t.isHandledElementFromEventsService(this._selectedItems[0])).getPossibleEvents(this._selectedItems[0]).map(t=>({...t,designItem:this._selectedItems[0]})):this.events=[],this._bindingsRefresh()}get selectedItems(){return this._selectedItems}set selectedItems(t){this._selectedItems!=t&&(this._selectedItems=t,this.refresh())}};customElements.define(ee.is,ee);import{TypedEvent as Ct,cssFromString as Tt}from"@node-projects/base-custom-webcomponent";import{BindingTarget as y}from"@node-projects/web-component-designer/dist/elements/item/BindingTarget.js";import{PropertiesHelper as v}from"@node-projects/web-component-designer/dist/elements/services/propertiesService/services/PropertiesHelper.js";var I="bind-prop:",P="bind-attr:",F="bind-class:",H="bind-css:",J="bind-cssvar:",T="bind-content:",he="bind-visible:",Et="bind(",Nt="--tmpBinding_",qs=/{{(.*)}}/;function X(r){return r.constructor?.elementProperties!=null}function ge(r){let t=[],s=[],e="";for(let i=0;i<r.length;i++)r[i]=="{"?(t.push(e),e=""):r[i]=="}"?(s.push(e),e=""):e+=r[i];return t.push(e),{parts:t,signals:s}}function te(r,t){let s=t.split("."),e=r;for(let i of s){if(e==null||typeof e!="object")return;e=e[i]}return e}var me=class{parts;signals;values;unsubscribeTargetValue;cleanupCalls=[];combinedName;disposed;valueChangedCb;visualizationHandler;element;relativeSignalPath;constructor(t,s,e,i,n,l,a,c){this.visualizationHandler=s,this.valueChangedCb=i,this.element=n,this.relativeSignalPath=l,this.parseIndirectBinding(e),this.values=new Array(this.signals.length);for(let o=0;o<this.signals.length;o++){let p=this.signals[o];if(p[0]==="?"&&p[1]==="?"){let u=p.substring(2);if(u.includes(".")){let d=te(a,u);this.handleValueChanged(d,o)}else{this.handleValueChanged(a[u],o);let d=()=>this.handleValueChanged(a[u],o),g=t.getChangedEventName(a,u);a.addEventListener(g,d),this.cleanupCalls.push(()=>a.removeEventListener(g,d))}continue}else if(p[0]==="#"&&p[1]==="#"){let u=p.substring(2);if(u.includes(".")){let d=te(n,u);this.handleValueChanged(d,o)}else{this.handleValueChanged(n[u],o);let d=()=>this.handleValueChanged(n[u],o),g=t.getChangedEventName(n,u);n.addEventListener(g,d),this.cleanupCalls.push(()=>n.removeEventListener(g,d))}continue}else if(p[0]==="\xA7"){let u=p.substring(1),d=c.valueProvider(u,{element:n,relativeSignalPath:l,root:a});d instanceof Promise?d.then(f=>this.handleValueChanged(f,o)):this.handleValueChanged(d,o),c.valueChangedCallbacks||(c.valueChangedCallbacks=new Map);let g=c.valueChangedCallbacks.get(u);g==null&&(g=[],c.valueChangedCallbacks.set(u,g)),g.push(()=>{let f=c.valueProvider(u,{element:n,relativeSignalPath:l,root:a});f instanceof Promise?f.then(b=>this.handleValueChanged(b,o)):this.handleValueChanged(f,o)})}else(p[0]==="?"||p[0]==="#")&&(p.includes(".")?p=te(a,p.substring(1)):p=a[p.substring(1)]);let h=(u,d)=>this.handleValueChanged(d.val,o),m=this.visualizationHandler.subscribeState(p,h);this.cleanupCalls.push(()=>this.visualizationHandler.unsubscribeState(this.signals[o],h,m))}}parseIndirectBinding(t){let{parts:s,signals:e}=ge(t);this.parts=s,this.signals=e;for(let i=0;i<e.length;i++)e[i][0]=="."&&(e[i]=this.visualizationHandler.getNormalizedSignalName(e[i],this.relativeSignalPath,this.element))}handleValueChanged(t,s){this.values[s]=t;let e=this.parts[0];for(let i=0;i<this.parts.length-1;i++){let n=this.values[i];if(n==null)return;e+=n+this.parts[i+1]}if(e[0]=="."&&(e=this.visualizationHandler.getNormalizedSignalName(e,this.relativeSignalPath,this.element)),this.combinedName!=e&&(this.unsubscribeTargetValue&&this.visualizationHandler.unsubscribeState(this.combinedName,this.unsubscribeTargetValue[0],this.unsubscribeTargetValue[1]),!this.disposed)){this.combinedName=e;let i=(n,l)=>this.valueChangedCb(l);this.unsubscribeTargetValue=[i,this.visualizationHandler.subscribeState(e,i)]}}dispose(){this.disposed=!0,this.unsubscribeTargetValue&&(this.visualizationHandler.unsubscribeState(this.combinedName,this.unsubscribeTargetValue[0],this.unsubscribeTargetValue[1]),this.unsubscribeTargetValue=null);for(let t=0;t<this.signals.length;t++)this.cleanupCalls[t]()}setState(t){this.disposed||this.visualizationHandler.setState(this.combinedName,t)}},Oe=class r{_visualizationHandler;namedConverterCallback;constructor(t){this._visualizationHandler=t}getChangedEventName(t,s){let e=s.indexOf("::");return e>=0?s.substring(e+2):t instanceof HTMLInputElement||t instanceof HTMLSelectElement?"change":X(t)?v.camelToDashCase(s):v.camelToDashCase(s)+"-changed"}parseBinding(t,s,e,i,n){let l=s.substring(n.length);if(i===y.cssvar&&(l="--"+l),!e.startsWith("{")){let c={signal:e,target:i};if(e[0]==="="){if(e=e.substring(1),c.signal=e,e.includes("::")){let o=e.split("::");e=o[0],c.signal=e,c.events=o[1].split(",")}c.twoWay=!0,c.events||(t instanceof HTMLInputElement?c.events=[this.getChangedEventName(t,l)]:t instanceof HTMLSelectElement?c.events=[this.getChangedEventName(t,l)]:X(t)?c.events=[this.getChangedEventName(t,l)]:(c.events=[this.getChangedEventName(t,l)],c.maybeLitElement=!0,c.litEventNames=[this.getChangedEventName(t,l)]))}if(e[0]==="!"&&(c.signal=e.substring(1),c.inverted=!0),c.signal.includes(";")){let o=c.signal.split(";");c.expression=o.pop(),c.signal=o.join(";")}return i===y.cssvar||i===y.class?[r.dotToCamelCase(l),c]:i===y.attribute?[l,c]:[v.dashToCamelCase(l),c]}let a=JSON.parse(e);return a.target=i,a.twoWay&&(a.events==null||a.events.length==0)&&(t instanceof HTMLInputElement?a.events=["change"]:t instanceof HTMLSelectElement?a.events=["change"]:a.events=[this.getChangedEventName(t,l)]),i===y.cssvar||i===y.class?[r.dotToCamelCase(l),a]:i===y.attribute?[l,a]:[v.dashToCamelCase(l),a]}serializeBinding(t,s,e){let i={...e};delete i.type,e.twoWay?e.events!=null&&e.events.length==1&&(t instanceof HTMLInputElement&&e.events?.[0]=="change"||t instanceof HTMLSelectElement&&e.events?.[0]=="change"||X(t)&&e.events?.[0]==s||!X(t)&&e.events?.[0]==s+"-changed")&&delete i.events:(delete i.events,delete i.expressionTwoWay);let n=i.twoWay&&i.events?.length>0?"::"+i.events.join(","):"",l=!1;return(n&&e.expression?.includes("::")||e.expressionTwoWay?.includes("::"))&&(l=!0),e.signal.trim()[0]=="{"&&(l=!0),!l&&e.target==y.property&&!e.expression&&!e.expressionTwoWay&&e.converter==null&&!e.historic&&!e.writeBackSignal?s=="textContent"?[T+"text",(e.twoWay?"=":"")+(e.inverted?"!":"")+e.signal+(!e.twoWay&&e.signal.includes(";")?";":"")+n]:s=="innerHTML"?[T+"html",(e.twoWay?"=":"")+(e.inverted?"!":"")+e.signal+(!e.twoWay&&e.signal.includes(";")?";":"")+n]:[I+v.camelToDashCase(s),(e.twoWay?"=":"")+(e.inverted?"!":"")+e.signal+(!e.twoWay&&e.signal.includes(";")?";":"")+n]:!l&&e.target==y.property&&e.expression&&!e.expression.includes(`
|
|
1288
|
-
`)&&!e.expression.includes(";")&&!e.expressionTwoWay&&e.converter==null&&!e.historic&&!e.writeBackSignal?s=="textContent"?[T+"text",(e.inverted?"!":"")+e.signal+";"+e.expression+n]:s=="innerHTML"?[T+"html",(e.inverted?"!":"")+e.signal+";"+e.expression+n]:[I+v.camelToDashCase(s),(e.twoWay?"=":"")+(e.inverted?"!":"")+e.signal+";"+e.expression+n]:!
|
|
1289
|
-
`)&&!e.expression.includes(";")&&!e.expressionTwoWay&&e.converter==null&&!e.historic&&!e.writeBackSignal?[P+v.camelToDashCase(s),(e.twoWay?"=":"")+(e.inverted?"!":"")+e.signal+";"+e.expression+n]:!
|
|
1290
|
-
`)&&!e.expression.includes(";")&&!e.expressionTwoWay&&e.converter==null&&!e.historic&&!e.writeBackSignal?[F+v.camelToDashCase(s),(e.inverted?"!":"")+e.signal+";"+e.expression+n]:!
|
|
1291
|
-
`)&&!e.expression.includes(";")&&!e.expressionTwoWay&&e.converter==null&&!e.historic&&!e.writeBackSignal?[H+v.camelToDashCase(s),(e.inverted?"!":"")+e.signal+";"+e.expression+n]:!
|
|
1292
|
-
`)&&!e.expression.includes(";")&&!e.expressionTwoWay&&e.converter==null&&!e.historic&&!e.writeBackSignal?[J+v.camelToDashCase(s),(e.inverted?"!":"")+e.signal+";"+e.expression+n]:((e.inverted===null||e.inverted===!1)&&delete i.inverted,(e.expression===null||e.expression==="")&&delete i.expression,(e.expressionTwoWay===null||e.expressionTwoWay==="")&&delete i.expressionTwoWay,(e.twoWay===null||e.twoWay===!1)&&delete i.twoWay,delete i.target,e.historic||delete i.historic,e.target==y.content?[T+"html",JSON.stringify(i)]:e.target==y.attribute?[P+v.camelToDashCase(s),JSON.stringify(i)]:e.target==y.class?[F+r.camelToDotCase(s),JSON.stringify(i)]:e.target==y.css?[H+v.camelToDashCase(s),JSON.stringify(i)]:e.target==y.cssvar?[J+r.camelToDotCase(s.substring(2)),JSON.stringify(i)]:e.target==y.property&&s=="innerHTML"?[T+"html",JSON.stringify(i)]:e.target==y.property&&s=="textContent"?[T+"text",JSON.stringify(i)]:[I+v.camelToDashCase(s),JSON.stringify(i)])}getBindingAttributeName(t,s,e){return e==y.attribute?P+v.camelToDashCase(s):e==y.class?F+r.camelToDotCase(s):e==y.css?H+v.camelToDashCase(s):e==y.visible?he:e==y.cssvar?J+r.camelToDotCase(s):e==y.property&&s=="innerHTML"?T+"html":e==y.property&&s=="textContent"?T+"text":I+v.camelToDashCase(s)}*getBindings(t){if(t.attributes)for(let s of t.attributes)s.name.startsWith(I)?yield this.parseBinding(t,s.name,s.value,y.property,I):s.name.startsWith(T)?yield this.parseBinding(t,s.name==="bind-content:html"?"bind-prop:inner-h-t-m-l":"bind-prop:text-content",s.value,y.property,I):s.name.startsWith(P)?yield this.parseBinding(t,s.name,s.value,y.attribute,P):s.name.startsWith(F)?yield this.parseBinding(t,s.name,s.value,y.class,F):s.name.startsWith(H)?yield this.parseBinding(t,s.name,s.value,y.css,H):s.name.startsWith(J)?yield this.parseBinding(t,s.name,s.value,y.cssvar,J):s.name.startsWith(he)&&(yield this.parseBinding(t,s.name,s.value,y.visible,he))}applyAllBindings(t,s,e,i,n){let l=[],a=document.createTreeWalker(t,NodeFilter.SHOW_ELEMENT),c;for(;c=a.nextNode();){let o=this.getBindings(c);for(let p of o)try{let h=this.applyBinding(c,p,s,e,i);if(l.push(h),p[1].maybeLitElement&&c.localName.includes("-")&&!customElements.get(c.localName)){let m=c,u=p;customElements.whenDefined(c.localName).then(()=>{X(m)&&(h(),u[1].events=u[1].litEventNames,l.push(this.applyBinding(m,u,s,e,i)))})}}catch(h){console.warn("error applying binding",c,p,h)}if(n&&n(c)){c=a.nextSibling();continue}}return l}static#e=0;async parseCssBindings(t,s,e,i){let n=await import("@node-projects/css-parser"),l=n.parse(t),a;for(let o of l.stylesheet.rules)if(o.type===n.CssTypes.rule){for(let p of o.declarations)if(p.type===n.CssTypes.declaration&&p.value.includes(Et)){let h=this.parseCssBinding(p.value,s,e,i);p.value=h[0],a?a.push(...h[1]):a=h[1]}}let c=n.stringify(l,{indent:"",compress:!0});return[Tt(c),a]}parseCssBinding(t,s,e,i,n){t=t.trim();let l="",a="",c=!1,o="",p=!1,h=null,m=[];for(let u=0;u<t.length;u++){let d=t[u];if(c)if(p)o+=d;else if(h&&d==="\\")p=!0;else if(d===h)h=null;else if(h===null&&d===")"){let g=r.#e++,f=Nt+g,b=[f,{signal:o,target:y.cssvar}];o.startsWith("{")&&(b=JSON.parse(o)),m.push(this.applyBinding(s,b,e,i,n)),l+="var("+f+")",c=!1,o=""}else o+=d;else d==="("?(a!=="bind"?(l+=a,l+=d):(c=!0,t[u+1]==="'"||t[u+1]==='"'?(u++,h=t[u]):h=null),a=""):d===" "||d===","||d==="("||d==="+"||d==="-"||d==="*"||d==="/"?(l+=a+d,a=""):a+=d}return[l+a,m]}applyBinding(t,s,e,i,n){let l=[],a,c=()=>{for(let m of l)this._visualizationHandler.unsubscribeState(m[0],m[1],m[2]);if(a)for(let m of a)m()},o=s[1].signal.split(";"),p=new Array(o.length);for(let m=0;m<o.length;m++){let u=o[m];if(p[m]="__"+m,u.includes(":")){let d=u.split(":");p[m]=d[0],u=d[1],o[m]=u}if(u[0]==="?"){if(i){let d=u.substring(1);if(d[0]=="?")o[m]=d;else{o[m]=i[d],d[0]==="$"&&(d=d.substring(1),o[m]="$"+i[d]);let g=()=>{c(),this.applyBinding(t,s,e,i,n)},f=this.getChangedEventName(i,d);i.addEventListener(f,g),a||(a=[]),a.push(()=>i.removeEventListener(f,g))}}}else if(u[0]==="#"){let d=u.substring(1);if(d[0]=="#")o[m]=d;else{o[m]=i[d],d[0]==="$"&&(d=d.substring(1),o[m]="$"+i[d]);let g=()=>{c(),this.applyBinding(t,s,e,i,n)},f=this.getChangedEventName(t,d);i.addEventListener(f,g),a||(a=[]),a.push(()=>i.removeEventListener(f,g))}}u[0]==="."&&(o[m]=this._visualizationHandler.getNormalizedSignalName(u,e,t))}let h=new Array(o.length);for(let m=0;m<o.length;m++){let u=o[m];if(u[0]==="?"){if(i){let d=u.substring(1),g=()=>{let f=!1;f||(f=!0,this.handleValueChanged(t,i,s,i[d],h,m,p,!1,e),f=!1)};i.addEventListener(v.camelToDashCase(d)+"-changed",g),a||(a=[]),a.push(()=>i.removeEventListener(v.camelToDashCase(d)+"-changed",g));try{this.handleValueChanged(t,i,s,i[d],h,m,p,!1,e)}catch(f){console.error(f)}s[1].twoWay&&m==0&&this.addTwoWayBinding(s,t,f=>i[d]=f)}}else if(u[0]==="#"){let d=u.substring(1),g=()=>{let f=!1;f||(f=!0,this.handleValueChanged(t,i,s,t[d],h,m,p,!1,e),f=!1)};t.addEventListener(v.camelToDashCase(d)+"-changed",g),a||(a=[]),a.push(()=>t.removeEventListener(v.camelToDashCase(d)+"-changed",g));try{this.handleValueChanged(t,i,s,t[d],h,m,p,!1,e)}catch(f){console.error(f)}s[1].twoWay&&m==0&&this.addTwoWayBinding(s,t,f=>t[d]=f)}else if(u[0]==="$"){let d=u.substring(1);d[0]==="."&&(d=this._visualizationHandler.getNormalizedSignalName(d,e,t)),this._visualizationHandler.getObject(d).then(g=>{this.handleValueChanged(t,i,s,g,h,m,p,!0,e)})}else if(u[0]==="\xA7"){let d=u.substring(1),g=n.valueProvider(d,{element:t,binding:s,relativeSignalPath:e,root:i});g instanceof Promise?g.then(b=>this.handleValueChanged(t,i,s,b,h,m,p,!0,e)):this.handleValueChanged(t,i,s,g,h,m,p,!0,e),n.valueChangedCallbacks||(n.valueChangedCallbacks=new Map);let f=n.valueChangedCallbacks.get(d);f==null&&(f=[],n.valueChangedCallbacks.set(d,f)),f.push(()=>{let b=n.valueProvider(d,{element:t,binding:s,relativeSignalPath:e,root:i});b instanceof Promise?b.then(S=>this.handleValueChanged(t,i,s,S,h,m,p,!0,e)):this.handleValueChanged(t,i,s,b,h,m,p,!0,e)})}else if(u.includes("{")){let d=new me(this,this._visualizationHandler,u,g=>this.handleValueChanged(t,i,s,g.val,h,m,p,!1,e),t,e,i,n);a||(a=[]),a.push(()=>d.dispose()),s[1].twoWay&&m==0&&this.addTwoWayBinding(s,t,g=>d.setState(g))}else if(s[1].historic)if(s[1].historic.reloadInterval){let d={timerId:-1},g=async()=>{let f=await this._visualizationHandler.getHistoricData(u,s[1].historic);this.handleValueChanged(t,i,s,f?.values,h,m,p,!0,e),d.timerId!==null&&(d.timerId=setTimeout(g,s[1].historic.reloadInterval))};g(),a||(a=[]),a.push(()=>{d.timerId>0&&clearTimeout(d.timerId),d.timerId=null})}else this._visualizationHandler.getHistoricData(u,s[1].historic).then(d=>this.handleValueChanged(t,i,s,d?.values,h,m,p,!0,e));else{let d=(g,f)=>this.handleValueChanged(t,i,s,f.val,h,m,p,!1,e);l.push([u,d,this._visualizationHandler.subscribeState(u,d)]),this._visualizationHandler.getState(u).then(g=>this.handleValueChanged(t,i,s,g?.val,h,m,p,!1,e)),s[1].twoWay&&m==0&&this.addTwoWayBinding(s,t,g=>this._visualizationHandler.setState(u,g))}}return c}addTwoWayBinding(t,s,e){t[1].expressionTwoWay&&(t[1].compiledExpressionTwoWay||(t[1].expressionTwoWay.includes("return ")?t[1].compiledExpressionTwoWay=new Function(["value"],t[1].expressionTwoWay):t[1].compiledExpressionTwoWay=new Function(["value"],"return "+t[1].expressionTwoWay)));for(let i of t[1].events){let n=s[i];n instanceof Ct?n.on(()=>{let l;t[1].target==y.attribute?l=s.getAttribute(t[0]):l=s[t[0]],l=r.parseValueWithType(l,t),t[1].compiledExpressionTwoWay&&(l=t[1].compiledExpressionTwoWay(l)),e(l)}):s.addEventListener(i,l=>{let a;t[1].target==y.attribute?a=s.getAttribute(t[0]):a=s[t[0]],a=r.parseValueWithType(a,t),t[1].compiledExpressionTwoWay&&(a=t[1].compiledExpressionTwoWay(a)),e(a)})}}static parseValueWithType(t,s){if(s[1].type)switch(s[1].type){case"number":return parseFloat(t);case"boolean":return t===!0||t==="true"||!!parseInt(t);case"string":return t?.toString();case"integer":return parseInt(t)}return t}handleValueChanged(t,s,e,i,n,l,a,c,o){let p=i;if(!c&&l==0&&(p=r.parseValueWithType(p,e)),n[l]=p,e[1].expression&&(e[1].compiledExpression||(a.push("__res"),a.push("__ctx"),e[1].expression.includes("return ")?e[1].compiledExpression=new Function(a,e[1].expression):e[1].compiledExpression=new Function(a,"return "+e[1].expression)),n[a.length-1]={element:t,root:s,boundNames:e[1].signal,boundTargetName:e[0],boundTargetType:e[1].target},p=e[1].compiledExpression(...n),n[a.length-1]=p),e[1].converter)if(typeof e[1].converter=="string")p=this.namedConverterCallback(e[1].converter,p,t,e);else{let h=p!=null?p.toString():p;if(h in e[1].converter){let m=e[1].converter[h];typeof m=="string"?p=new Function(a,"return `"+e[1].converter[h]+"`")(...n):p=m}else{let m=!1,u=parseFloat(p);for(let d in e[1].converter)if(d.length>2&&d[0]===">"&&d[1]==="="){let g=parseFloat(d.substring(2));if(u>=g){let f=e[1].converter[d];typeof f=="string"?p=new Function(a,"return `"+e[1].converter[d]+"`")(...n):p=f,m=!0;break}}else if(d.length>2&&d[0]==="<"&&d[1]==="="){let g=parseFloat(d.substring(2));if(u<=g){let f=e[1].converter[d];typeof f=="string"?p=new Function(a,"return `"+e[1].converter[d]+"`")(...n):p=f,m=!0;break}}else if(d.length>1&&d[0]===">"){let g=parseFloat(d.substring(1));if(u>g){let f=e[1].converter[d];typeof f=="string"?p=new Function(a,"return `"+e[1].converter[d]+"`")(...n):p=f,m=!0;break}}else if(d.length>1&&d[0]==="<"){let g=parseFloat(d.substring(1));if(u<g){let f=e[1].converter[d];typeof f=="string"?p=new Function(a,"return `"+e[1].converter[d]+"`")(...n):p=f,m=!0;break}}else{let g=d.split("-");if(g.length>1&&(g[0]===""||u>=parseFloat(g[0]))&&(g[1]===""||parseFloat(g[1])>=u)){let f=e[1].converter[d];typeof f=="string"?p=new Function(a,"return `"+e[1].converter[d]+"`")(...n):p=f,m=!0;break}}!m&&e[1].converterDefault!==void 0&&(p=e[1].converterDefault)}}if(e[1].inverted&&(p=!p),e[1].writeBackSignal){let h=e[1].writeBackSignal;h[0]==="."&&(h=o+h),this._visualizationHandler.setState(h,p,!0)}e[1].target==y.property?t[e[0]]=p:e[1].target==y.attribute?typeof p=="boolean"?p?t.setAttribute(e[0],""):t.removeAttribute(e[0]):t.setAttribute(e[0],p):e[1].target==y.css?t.style[e[0]]=p:e[1].target==y.cssvar?t.style.setProperty(e[0],p):e[1].target==y.class?p?t.classList.add(e[0]):t.classList.remove(e[0]):e[1].target==y.visible&&(t.style.visibility=p?"":"collapse")}static camelToDotCase(t){return t.replace(/([A-Z])/g,s=>`.${s[0].toLowerCase()}`)}static dotToCamelCase(t){return t.replace(/\.([a-z])/g,s=>s[1].toUpperCase())}};var Ve=class{name;relativeSignalsPath;commands;parameters};import{deepValue as O,setDeepValue as Re,sleep as Bt}from"@node-projects/web-component-designer/dist/elements/helper/Helper.js";import U from"long";var se="cyclic",It={pointerdown:"pointerup",pointerenter:"pointerleave",mouseenter:"mouseleave",mouseover:"mouseout",focus:"blur",focusin:"focusout",keydown:"keyup"},Ae=class{_visualizationHandler;_subscriptionCallback=()=>{};constructor(r){this._visualizationHandler=r}async execute(r,t){let s=-1,e=!1,i=!1,n=t.event?.type,l=n?It[n]:null;if(l){let a=t.element;n=="pointerdown"&&(a=window),a.addEventListener(l,()=>{e=!0},{once:!0})}for(let a=0;a<r.length;a++){let c=r[a];if(c.type=="Exit"){i=!0;break}else if(c.type=="If"){let p=(await this.evaluateIfFormula(c,t)?c.trueCommands:c.elseCommands)??[];if(!await this.execute(p,t)){i=!0;break}}else if(c.type=="Goto"){let o=await this.getValue(c.label,t);if(a=r.findIndex(p=>p.type=="Label"&&p.label==o),a<0)break}else if(c.type=="Condition"){let o=await this.getValue(c.value1,t),p=await this.getValue(c.value2,t),h=await this.getValue(c.comparisonType,t),m=!1;switch(h){case"==null":m=o==null;break;case"!=null":m=o!=null;break;case"==true":m=o==!0;break;case"==false":m=o==!1;break;case"==":m=o==p;break;case"!=":m=o!=p;break;case">":m=o>p;break;case"<":m=o<p;break;case">=":m=o>=p;break;case"<=":m=o<=p;break;case"&&":m=o&&p;break;case"||":m=o||p;break}if(m){await this.runExternalScript(await this.getValue(c.trueScriptName,t),await this.getValue(c.trueScriptType,t));let u=await this.getValue(c.trueGotoLabel,t);if(u&&(a=r.findIndex(d=>d.type=="Label"&&d.label==u),a<0))break}else{await this.runExternalScript(await this.getValue(c.falseScriptName,t),await this.getValue(c.falseScriptType,t));let u=await this.getValue(c.falseGotoLabel,t);if(u&&(a=r.findIndex(d=>d.type=="Label"&&d.label==u),a<0))break}}else if(c.type=="Repeat"){let o=await this.getValue(c.label,t),p=await this.getValue(c.count,t);if(await this.getValue(c.mode,t)=="eventValid"&&e){e=!1;continue}if(p!=0&&s==-1&&(s=p-1),s==0||(s>0&&s--,a=-1,o&&(a=r.findIndex(m=>m.type=="Label"&&m.label==o),a<0)))continue}else if(!await this.runScriptCommand(c,t)){i=!0;break}}return!i}async getValueFromTarget(r,t,s){return r==="property"?O(s.root,t):r==="elementProperty"?O(s.element,t):(await this._visualizationHandler.getState(this.getSignalName(t,s)))?.val}async setValueOnTarget(r,t,s,e){r==="property"?Re(s.root,t,e):r==="elementProperty"?Re(s.element,t,e):await this._visualizationHandler.setState(this.getSignalName(t,s),e)}async runExternalScript(r,t){}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 Bt(r);break}case"Console":{let r=await this.getValue(command.target??"log",context),t=await this.getValue(command.message,context);console[r](t);break}case"ToggleSignalValue":{let r=await this.getValue(command.signal,context),t=await this.getValue(command.target,context),s=await this.getValueFromTarget(t,r,context);await this._visualizationHandler.setState(this.getSignalName(r,context),!s);break}case"ToggleSignalValueThroughList":{let r=await this.getValue(command.valueList,context),t=await this.getValue(command.signal,context),s=await this.getValue(command.target,context),e=await this.getValueFromTarget(s,t,context),i=r.indexOf(e)+1;i>=r.length&&(i=0);let n=r[i];await this._visualizationHandler.setState(this.getSignalName(t,context),n);break}case"SetSignalValue":{let r=await this.getValue(command.signal,context),t=await this.getValue(command.target,context);await this.setValueOnTarget(t,r,context,await this.getValue(command.value,context));break}case"IncrementSignalValue":{let r=await this.getValue(command.signal,context),t=await this.getValue(command.target,context),e=await this.getValueFromTarget(t,r,context)+await this.getValue(command.value,context);await this.setValueOnTarget(t,r,context,e);break}case"DecrementSignalValue":{let r=await this.getValue(command.signal,context),t=await this.getValue(command.target,context),e=await this.getValueFromTarget(t,r,context)-await this.getValue(command.value,context);await this.setValueOnTarget(t,r,context,e);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),t=await this.getValue(command.bitNumber??0,context),s=await this.getValue(command.target,context),e=await this.getValueFromTarget(s,r,context),i=U.fromNumber(1).shiftLeft(t),n=U.fromNumber(e).or(i).toNumber();await this.setValueOnTarget(s,r,context,n);break}case"ClearBitInSignal":{let r=await this.getValue(command.signal,context),t=await this.getValue(command.bitNumber??0,context),s=await this.getValue(command.target,context),e=await this.getValueFromTarget(s,r,context),i=U.fromNumber(1).shiftLeft(t);i.negate();let n=U.fromNumber(e).and(i).toNumber();await this.setValueOnTarget(s,r,context,n);break}case"ToggleBitInSignal":{let r=await this.getValue(command.signal,context),t=await this.getValue(command.bitNumber??0,context),s=await this.getValue(command.target,context),e=await this.getValueFromTarget(s,r,context),i=U.fromNumber(1).shiftLeft(t),n=U.fromNumber(e).xor(i).toNumber();await this.setValueOnTarget(s,r,context,n);break}case"Javascript":{let r=await this.getValue(command.script,context),t=context;t.shadowRoot=context.element.getRootNode(),t.instance=context.shadowRoot.host,command.compiledScript||(command.compiledScript=new Function("context",r)),command.compiledScript(t);break}case"SetElementProperty":{command=D.upgradeSetElementProperty(command);let r=await this.getValue(command.name,context);r===""&&(r=null);let t=await this.getValue(command.value,context),s=await this.getValue(command.parentIndex??0,context),e=await this.getValue(command.target??"property",context),i=await this.getValue(command.targetSelectorTarget??"container",context),n=await this.getValue(command.targetSelector,context),l=await this.getValue(command.mode??"toggle",context),a=this.getTargetFromTargetSelector(context,i,s,n);for(let c of a)e=="attribute"?c.setAttribute(r,t):e=="property"?c[r]=t:e=="css"?c.style[r]=t:e=="class"&&(l==="toggle"?c.classList.toggle(r??t):l==="remove"?c.classList.remove(r??t):c.classList.add(r??t));break}case"SubscribeSignal":{let r=await this.getValue(command.signal,context);if(await this.getValue(command.oneTime,context)){let s=()=>{this._visualizationHandler.unsubscribeState(r,s,null)};this._visualizationHandler.subscribeState(r,s)}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),t=await this.getValue(command.scriptType,context);this.runExternalScript(r,t);break}case"ShowMessageBox":{let r=null,t=await this.getValue(command.exitScriptOnCancel,context);if(await this.getValue(command.buttons,context)=="yesNo"){let i=await this.getValue(command.message,context);confirm(i)?r=1:r=2}else{let i=await this.getValue(command.message,context);alert(i),r=1}let e=await this.getValue(command.resultSignal,context);if(e&&this._visualizationHandler.setState(e,r),t&&r!=1)return!1;break}case"ShowPrompt":{let r=await this.getValue(command.message,context),t=await this.getValue(command.default,context),s=prompt(r,t),e=await this.getValue(command.resultSignal,context);e&&s&&this._visualizationHandler.setState(e,s);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,t,s){if(t==="container"){let e=r.element.getRootNode().host;for(let i=0;i<(s??0);i++)e=e.getRootNode().host;return e}else if(t==="element"){let e=r.element;for(let i=0;i<(s??0);i++)e=e.parentElement;return e}return null}getTargetFromTargetSelector(r,t,s,e){let i=this.getTarget(r,t,s),n=[i];return e&&(t==="container"?n=i.shadowRoot.querySelectorAll(e):n=i.querySelectorAll(e)),n}async getValue(value,outerContext){if(value==null)return null;if(typeof value=="object")switch(value.source){case"property":return O(outerContext.root,value.name);case"elementProperty":return O(outerContext.element,value.name);case"signal":return(await this._visualizationHandler.getState(this.getSignalName(value.name,outerContext)))?.val;case"signalInProperty":{let r=O(outerContext.root,value.name);return(await this._visualizationHandler.getState(this.getSignalName(r,outerContext)))?.val}case"event":{let r=outerContext.event;return value.name&&(r=O(r,value.name)),r}case"parameter":return outerContext.parameters[value.name];case"context":return O(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 t=await this.parseStringWithValues(r,outerContext);return(await this._visualizationHandler.getState(this.getSignalName(t,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,t){let s=ge(r),e=await Promise.all(s.signals.map(n=>this.getStateOrFieldOrParameter(this.getSignalName(n,t),t))),i=s.parts[0];for(let n=0;n<s.parts.length-1;n++){let l=e[n];typeof l=="object"&&(l=l.val),l==null&&(l=""),i+=l+s.parts[n+1]}return i}async evaluateIfFormula(r,t){let s=r.signals??[],e=s.map((l,a)=>l.varName?.trim()||"__"+a),i=await Promise.all(s.map(l=>this.getValue(l,t))),n=await this.getValue(r.formula,t);return(!r.compiledFormula||r._compiledFormulaSrc!==n)&&(r.compiledFormula=new Function(...e,"return ("+n+");"),r._compiledFormulaSrc=n),!!r.compiledFormula(...i)}getSignalName(r,t){return r[0]==="."?t.relativeSignalsPath+r:r}createScriptContext(r,t,s,e,i){return{root:r,event:t,element:s,parameters:e,relativeSignalsPath:i}}async assignAllScripts(r,t,s,e,i,n,l,a){n??=this.createScriptContext;let c=await this.loadAndInitJsObject(r,t,s,e,a);for(let o of s.querySelectorAll("*"))for(let p of o.attributes)if(p.name[0]==="@")try{let h=p.name.substring(1),m=p.value.trim(),u=h.startsWith(se),d=u?parseInt(h.substring(h.indexOf(":")+1)):null,g=await this.resolveHandler(m,c,o,s,e,i,n,l,h);g&&this.bindHandler(o,h,u,d,g)}catch{console.warn("error assigning script",o,p)}return c}async loadAndInitJsObject(r,t,s,e,i){if(!t)return null;try{let l=await import(URL.createObjectURL(new Blob([t],{type:"application/javascript"})));return i?i(l):l.init?.(e,s),l}catch(n){return console.error("error parsing javascript - "+r,n),null}}async resolveHandler(r,t,s,e,i,n,l,a,c){if(r[0]!=="{")return p=>{t?.[r]?t[r](p,s,e,i):console.warn(`javascript function named: "${r}" not found, maybe missing a "export" ?`)};let o=JSON.parse(r);if("commands"in o)return p=>this.execute(o.commands,l(i,p,s,o.parameters,o.relativeSignalsPath));if("blocks"in o){let p=null;return async h=>{p??=await ve(o),p(h,e,o.parameters,o.relativeSignalsPath??"",n,l(i,h,s,o.parameters,o.relativeSignalsPath))}}if("name"in o){if(a)return a(s,c,o),null;let p=o.name;return h=>{t?.[p]?t[p](h,s,e,i,o.parameters):console.warn(`javascript function named: "${p}" not found, maybe missing a "export" ?`)}}return null}bindHandler(r,t,s,e,i){if(!s){r.addEventListener(t,i);return}let n=setInterval(()=>{r.isConnected?i(null):clearInterval(n)},e)}};import{OverlayLayer as Ot,DesignItem as V,InsertAction as Vt,BindingTarget as E,PropertyType as ie}from"@node-projects/web-component-designer";var ze=class{constructor(t,s){this._bindingsHelper=t,this._visualizationHandler=s}_bindingsHelper;_visualizationHandler;rectMap=new Map;rect;dragEnter(t,s,e){let i=V.GetDesignItem(e);if(i&&!i.isRootItem){let n=t.getNormalizedElementCoordinates(e);this.rect=t.overlayLayer.drawRect("IobrokerWebuiBindableObjectDragDropService",n.x,n.y,n.width,n.height,"",null,Ot.Background),this.rect.style.fill="#ff0000",this.rect.style.opacity="0.3",this.rectMap.set(e,this.rect)}}dragLeave(t,s,e){let i=V.GetDesignItem(e);if(i&&!i.isRootItem){let n=this.rectMap.get(e);t.overlayLayer.removeOverlay(n),this.rectMap.delete(e)}}dragOver(t,s,e){return"copy"}async drop(t,s,e,i){for(let c of this.rectMap.values())t.overlayLayer.removeOverlay(c);this.rectMap.clear();let n=V.GetDesignItem(i),l=await this._visualizationHandler.getObject(e.fullName),a=this._visualizationHandler.getSignalInformation(l);if(n&&!n.isRootItem)if(i instanceof HTMLInputElement){let c={signal:e.fullName,target:E.property},o=this._bindingsHelper.serializeBinding(i,i.type=="checkbox"?"checked":"value",c);n.setAttribute(o[0],o[1])}else{let c={signal:e.fullName,target:E.content},o=this._bindingsHelper.serializeBinding(i,null,c);n.setAttribute(o[0],o[1])}else{let c=t.getNormalizedEventCoordinates(s),o,p,h=await this._visualizationHandler.getState(e.fullName);if(a.role==="url"&&typeof h?.val=="string")if(h.val.endsWith("jpg")||h.val.endsWith("jpeg")||h.val.endsWith("png")||h.val.endsWith("gif")||h.val.endsWith("svg")){let m=document.createElement("img");o=V.createDesignItemFromInstance(m,t.serviceContainer,t.instanceServiceContainer),p=o.openGroup("Insert");let u={signal:e.fullName,target:E.property},d=this._bindingsHelper.serializeBinding(m,"src",u);o.setAttribute(d[0],d[1]),o.element.src=h.val}else if(h.val.endsWith("mp4")){let m=document.createElement("video");o=V.createDesignItemFromInstance(m,t.serviceContainer,t.instanceServiceContainer),p=o.openGroup("Insert");let u={signal:e.fullName,target:E.property},d=this._bindingsHelper.serializeBinding(m,"src",u);o.setAttribute(d[0],d[1]),o.element.src=h.val}else{let m=document.createElement("iframe");o=V.createDesignItemFromInstance(m,t.serviceContainer,t.instanceServiceContainer),p=o.openGroup("Insert");let u={signal:e.fullName,target:E.property},d=this._bindingsHelper.serializeBinding(m,"src",u);o.setAttribute(d[0],d[1]),o.element.src=h.val}if(!o){let m=document.createElement("input");o=V.createDesignItemFromInstance(m,t.serviceContainer,t.instanceServiceContainer),p=o.openGroup("Insert");let u=a.writeable!==!1,d={signal:e.fullName,target:E.property,twoWay:u},g=this._bindingsHelper.serializeBinding(m,"value",d);a.type==="boolean"?(g=this._bindingsHelper.serializeBinding(m,"checked",d),o.setAttribute("type","checkbox")):a.role=="date"?(d.twoWay=u,g=this._bindingsHelper.serializeBinding(m,"value-as-number",d),o.setAttribute("type","date"),o.setAttribute("readonly","")):a.role=="datetime"&&(d.twoWay=u,g=this._bindingsHelper.serializeBinding(m,"value-as-number",d),o.setAttribute("type","datetime-local"),o.setAttribute("readonly","")),o.setAttribute(g[0],g[1])}o.setStyle("position","absolute"),o.setStyle("left",c.x+"px"),o.setStyle("top",c.y+"px"),t.instanceServiceContainer.undoService.execute(new Vt(t.rootDesignItem,t.rootDesignItem.childCount,o)),p.commit(),requestAnimationFrame(()=>t.instanceServiceContainer.selectionService.setSelectedElements([o]))}}dragOverOnProperty(t,s,e){return"copy"}dropOnProperty(t,s,e,i){if(s.type=="signal"){s.service.setValue(i,s,e.fullName);return}let n={signal:e.fullName,target:E.property};s.propertyType==ie.attribute&&(n.target=E.attribute),s.propertyType==ie.cssValue&&(n.target=E.css),n.signal=e.fullName,n.twoWay=s.propertyType==ie.property||s.propertyType==ie.propertyAndAttribute;let l=i[0].openGroup("drop binding");for(let a of i){let c=this._bindingsHelper.serializeBinding(a.element,s.name,n);a.setAttribute(c[0],c[1])}l.commit()}};import{BindingMode as fe,BindingTarget as Le,PropertiesHelper as Rt}from"@node-projects/web-component-designer";var De=class r{constructor(t){this._bindingsHelper=t}_bindingsHelper;static type="visualization-binding";getBindings(t){return Array.from(this._bindingsHelper.getBindings(t.element)).map(e=>({targetName:e[1].target===Le.css||e[1].target===Le.attribute?Rt.camelToDashCase(e[0]):e[0],target:e[1].target,mode:e[1].twoWay?fe.twoWay:fe.oneWay,invert:e[1].inverted,bindableObjectNames:e[1].signal.split(";"),expression:e[1].expression,expressionTwoWay:e[1].expressionTwoWay,converter:e[1].converter,type:r.type,service:this,changedEvents:e[1].events,historic:e[1].historic,writeBackSignal:e[1].writeBackSignal}))}setBinding(t,s){let e={signal:s.bindableObjectNames.join(";"),target:s.target};e.inverted=s.invert,e.twoWay=s.mode==fe.twoWay,e.expression=s.expression,e.expressionTwoWay=s.expressionTwoWay,e.historic=s.historic,e.type=s.type,typeof s.converters=="string"?e.converter=s.converters:Array.isArray(s.converters)&&s.converters.length>0?e.converter=Object.fromEntries(s.converters.map(l=>[l.key,l.value])):s.converters!=null&&(e.converter=s.converters),e.target=s.target,e.events=s.changedEvents;let i=this._bindingsHelper.serializeBinding(t.element,s.targetName,e),n=t.openGroup("edit_binding");return t.setAttribute(i[0],i[1]),n.commit(),!0}clearBinding(t,s,e){let i=this._bindingsHelper.getBindingAttributeName(t.element,s,e);return t.removeAttribute(i),!0}};var je=class{getRefactorings(t){let s=[];for(let e of t){let i=e.serviceContainer.bindingService.getBindings(e);if(i)for(let n of i)for(let l of n.bindableObjectNames){let a="signal",c="";if(l.includes(":")){let o=l.split(":")[0],p=l.substring(o.length+1);p.startsWith("?")&&(p=p.substring(1),c="?",a="property",p.startsWith("?")&&(p=p.substring(1),c="??")),s.push({service:this,name:p,itemType:a,designItem:e,type:"binding",sourceObject:n,display:n.target+"/"+n.targetName+" - "+o+":",shortName:o,prefix:c})}else l.startsWith("?")&&(l=l.substring(1),c="?",a="property",l.startsWith("?")&&(l=l.substring(1),c="??")),s.push({service:this,name:l,itemType:a,designItem:e,type:"binding",sourceObject:n,display:n.target+"/"+n.targetName,prefix:c})}}return s}refactor(t,s,e){let i=t.sourceObject;t.shortName?i.bindableObjectNames=i.bindableObjectNames.map(n=>n==t.shortName+":"+t.prefix+s?t.shortName+":"+t.prefix+e:n):i.bindableObjectNames=i.bindableObjectNames.map(n=>n==t.prefix+s?t.prefix+e:n),t.designItem.serviceContainer.bindingService.setBinding(t.designItem,i)}};var We=class{dragOverOnProperty(t,s,e){return"copy"}dropOnProperty(t,s,e,i){s.service.setValue(i,s,e.text)}};import{BindingTarget as x}from"@node-projects/web-component-designer";var Me=class{getRefactorings(t){let s=[];for(let e of t)for(let i of e.attributes())if(i[0][0]=="@"){let n=i[1];if(n[0]=="{"){let l=JSON.parse(n);if("commands"in l)for(let a of l.commands){for(let c in a){let o=a[c];if(o!=null&&typeof o=="object"){let p=o;if(p.source==="signal")s.push({name:p.name,itemType:"signal",target:x.event,targetName:i[0],service:this,designItem:e,type:"script",sourceObject:l,display:a.type+"/"+i[0].substring(1)+"/"+c+"[signal]",refactor:h=>p.name=h});else if(p.source==="property")s.push({name:p.name,itemType:"property",target:x.event,targetName:i[0],service:this,designItem:e,type:"script",sourceObject:l,display:a.type+"/"+i[0].substring(1)+"/"+c+"[property]",refactor:h=>p.name=h});else if(p.source==="complexString")for(let h of p.name.matchAll(/\{(.*?)\}/g)){let m=h[0],u=h[1];if(u[0]==="?"){let d="?";u=u.substring(1),u[0]==="?"&&(d="??",u=u.substring(1)),s.push({name:u,itemType:"property",target:x.event,targetName:i[0],service:this,designItem:e,type:"script",sourceObject:l,display:a.type+"/"+i[0].substring(1)+"/"+c+"[complexString]->property",refactor:g=>p.name=p.name.replace(m,"{"+d+g+"}")})}else s.push({name:u,itemType:"signal",target:x.event,targetName:i[0],service:this,designItem:e,type:"script",sourceObject:l,display:a.type+"/"+i[0].substring(1)+"/"+c+"[complexString]->signal",refactor:d=>p.name=p.name.replace(m,"{"+d+"}")})}}}switch(a.type){case"SetSignalValue":a.signal&&typeof a.signal=="string"&&s.push({name:a.signal,itemType:"signal",target:x.event,targetName:i[0],display:a.type+"/"+i[0].substring(1)+"/signal",service:this,designItem:e,type:"script",sourceObject:l,refactor:c=>a.signal=c});break;case"ToggleSignalValue":a.signal&&typeof a.signal=="string"&&s.push({name:a.signal,itemType:"signal",target:x.event,targetName:i[0],display:a.type+"/"+i[0].substring(1)+"/signal",service:this,designItem:e,type:"script",sourceObject:l,refactor:c=>a.signal=c});break;case"IncrementSignalValue":a.signal&&typeof a.signal=="string"&&s.push({name:a.signal,itemType:"signal",target:x.event,targetName:i[0],display:a.type+"/"+i[0].substring(1)+"/signal",service:this,designItem:e,type:"script",sourceObject:l,refactor:c=>a.signal=c});break;case"DecrementSignalValue":a.signal&&typeof a.signal=="string"&&s.push({name:a.signal,itemType:"signal",target:x.event,targetName:i[0],display:a.type+"/"+i[0].substring(1)+"/signal",service:this,designItem:e,type:"script",sourceObject:l,refactor:c=>a.signal=c});break;case"SetBitInSignal":a.signal&&typeof a.signal=="string"&&s.push({name:a.signal,itemType:"signal",target:x.event,targetName:i[0],display:a.type+"/"+i[0].substring(1)+"/signal",service:this,designItem:e,type:"script",sourceObject:l,refactor:c=>a.signal=c});break;case"ClearBitInSignal":a.signal&&typeof a.signal=="string"&&s.push({name:a.signal,itemType:"signal",target:x.event,targetName:i[0],display:a.type+"/"+i[0].substring(1)+"/signal",service:this,designItem:e,type:"script",sourceObject:l,refactor:c=>a.signal=c});break;case"ToggleBitInSignal":a.signal&&typeof a.signal=="string"&&s.push({name:a.signal,itemType:"signal",target:x.event,targetName:i[0],display:a.type+"/"+i[0].substring(1)+"/signal",service:this,designItem:e,type:"script",sourceObject:l,refactor:c=>a.signal=c});break;case"OpenScreen":a.screen&&typeof a.screen=="string"&&s.push({name:a.screen,itemType:"screen",target:x.event,targetName:i[0],display:a.type+"/"+i[0].substring(1)+"/screen",service:this,designItem:e,type:"script",sourceObject:l,refactor:c=>a.screen=c});break;case"OpenDialog":a.screen&&typeof a.screen=="string"&&s.push({name:a.screen,itemType:"screen",target:x.event,targetName:i[0],display:a.type+"/"+i[0].substring(1)+"/screen",service:this,designItem:e,type:"script",sourceObject:l,refactor:c=>a.screen=c});break;case"CalculateSignalValue":a.targetSignal&&typeof a.targetSignal=="string"&&s.push({name:a.targetSignal,itemType:"signal",target:x.event,targetName:i[0],display:a.type+"/"+i[0].substring(1)+"/targetSignal",service:this,designItem:e,type:"script",sourceObject:l,refactor:c=>a.targetSignal=c});break;case"SubscribeSignal":a.signal&&typeof a.signal=="string"&&s.push({name:a.signal,itemType:"signal",target:x.event,targetName:i[0],display:a.type+"/"+i[0].substring(1)+"/signal",service:this,designItem:e,type:"script",sourceObject:l,refactor:c=>a.signal=c});break;case"UnsubscribeSignal":a.signal&&typeof a.signal=="string"&&s.push({name:a.signal,itemType:"signal",target:x.event,targetName:i[0],display:a.type+"/"+i[0].substring(1)+"/signal",service:this,designItem:e,type:"script",sourceObject:l,refactor:c=>a.signal=c});break;case"ShowMessageBox":a.resultSignal&&typeof a.resultSignal=="string"&&s.push({name:a.resultSignal,itemType:"signal",target:x.event,targetName:i[0],display:a.type+"/"+i[0].substring(1)+"/resultSignal",service:this,designItem:e,type:"script",sourceObject:l,refactor:c=>a.resultSignal=c});break}}else"blocks"in l;if("parameters"in l)for(let a in l.parameters)typeof l.parameters[a]=="string"&&s.push({name:l.parameters[a],itemType:"parameter",target:x.event,targetName:i[0],service:this,designItem:e,type:"script",sourceObject:l,display:i[0].substring(1)+"/parameters/"+a,refactor:c=>l.parameters[a]=c})}}return s}refactor(t,s,e){t.refactor(e);let i=JSON.stringify(t.sourceObject);t.designItem.setAttribute(t.targetName,i)}};import{BasePropertyEditor as At}from"@node-projects/web-component-designer";var Pe=class extends At{_ip;_container;constructor(t,s){super(t),this._container=document.createElement("div"),this._container.style.display="flex",this._ip=document.createElement("input"),this._ip.onchange=i=>this._valueChanged(this._ip.value),this._ip.onfocus=i=>{this._ip.selectionStart=0,this._ip.selectionEnd=this._ip.value?.length},this._container.appendChild(this._ip);let e=document.createElement("button");e.textContent="...",e.onclick=async()=>{let i=s.createBindableObjectBrowser();i.initialize(this.designItems[0].serviceContainer,this.designItems[0].instanceServiceContainer,"property"),i.title="select signal...";let n=new AbortController;i.objectDoubleclicked.on(()=>{n.abort(),this._ip.value=i.selectedObject.fullName,this._valueChanged(this._ip.value)}),await s.openConfirmation(i,{x:100,y:100,width:400,height:300,abortSignal:n.signal})&&(this._ip.value=i.selectedObject.fullName,this._valueChanged(this._ip.value))},this._container.appendChild(e),this.element=this._container}refreshValue(t,s){s==null?this._ip.value="":this._ip.value=s}};import{EventsService as zt}from"@node-projects/web-component-designer";var Fe=class r extends zt{static _cyclicEvent=[{name:`${se}:100`,propertyName:void 0,eventObjectName:"Event",description:"this event will retrigger itself every 100 ms"}];getPossibleEvents(t){let s=super.getPossibleEvents(t);return s.push(...r._cyclicEvent),s}getEvent(t,s){return s.includes(se)?r._cyclicEvent.find(i=>i.name==s)??{name:s,propertyName:"on"+s,eventObjectName:"Event"}:super.getEvent(t,s)}};export{ze as BindableObjectDragDropService,Q as BindingsEditor,z as BindingsEditorHistoric,Oe as BindingsHelper,A as BlocklyScriptEditor,ee as EventAssignment,M as ParameterEditor,We as PropertyGridDragDropService,Ve as Script,Me as ScriptRefactorService,Ae as ScriptSystem,Pe as SignalPropertyEditor,L as SimpleScriptCommandPicker,W as SimpleScriptEditor,je as VisualizationBindingsRefactorService,De as VisualizationBindingsService,Fe as VisualizationEventsService,q as VisualizationPropertyGrid,P as bindingPrefixAttribute,F as bindingPrefixClass,T as bindingPrefixContent,H as bindingPrefixCss,J as bindingPrefixCssVar,Et as bindingPrefixInsideCss,Nt as bindingPrefixInsideCssVarName,I as bindingPrefixProperty,he as bindingPrefixVisible,qs as bindingsInCssRegex,se as cyclicAttributeName,ve as generateEventCodeFromBlockly,te as getNestedProperty,X as isLit,ke as nativeScriptCommandDescriptions,ge as parseBindingString,_e as simpleScriptEditorHelpHtml};
|
|
1287
|
+
</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(t,s,e,i,n,r){this._visualizationHandler=t,this._visualizationShell=s,this._scriptCommandsTypeInfo=e,this._propertiesTypeInfo=i,this._blocklyToolbox=n,this._commandDescriptions=r}set instanceServiceContainer(t){this._instanceServiceContainer=t,this._selectionChangedHandler?.dispose(),this._selectionChangedHandler=this._instanceServiceContainer.selectionService.onSelectionChanged.on(s=>{this.selectedItems=s.selectedElements}),this.selectedItems=this._instanceServiceContainer.selectionService.selectedElements}_createControlsForScript(t){switch(this._getScriptType(t)){case"none":return""}return this.constructor.editRowTemplate.content.cloneNode(!0)}_getScriptName(t){if(this.selectedItems[0].hasAttribute("@"+t.name)){let s=this.selectedItems[0].getAttribute("@"+t.name);if(s[0]==="{"){if(s.includes("name"))return JSON.parse(s).name}else return s}return null}async _changeScriptName(t,s){if(t.key=="Enter"&&this.selectedItems&&this.selectedItems.length&&this.selectedItems[0].hasAttribute("@"+s.name)){let e=t.target.value,i=this.selectedItems[0].getAttribute("@"+s.name);if(i.startsWith("{")){let n=JSON.parse(i);n.name=e,this._selectedItems[0].setAttribute("@"+s.name,JSON.stringify(n))}else this._selectedItems[0].setAttribute("@"+s.name,e)}}_getRelativeSignalsPath(t){if(this.selectedItems[0].hasAttribute("@"+t.name)){let s=this.selectedItems[0].getAttribute("@"+t.name);if(s[0]==="{"&&s.includes("relativeSignalsPath"))return JSON.parse(s).relativeSignalsPath}return null}async _changeRelativeSignalsPath(t,s){if(t.key=="Enter"&&this.selectedItems&&this.selectedItems.length&&this.selectedItems[0].hasAttribute("@"+s.name)){let e=t.target.value,i=this.selectedItems[0].getAttribute("@"+s.name);if(i.startsWith("{")){let n=JSON.parse(i);n.relativeSignalsPath=e,this._selectedItems[0].setAttribute("@"+s.name,JSON.stringify(n))}else{let n={name:i,relativeSignalsPath:e};this._selectedItems[0].setAttribute("@"+s.name,JSON.stringify(n))}}}_hasParameters(t){return this.selectedItems[0].hasAttribute("@"+t.name)?this.selectedItems[0].getAttribute("@"+t.name).includes("parameters"):!1}_getScriptTypeColor(t){let s=this._getScriptType(t);return l.scriptTypeColors[s]??"white"}_getScriptType(t){if(t.designItem.hasAttribute("@"+t.name)){let s=t.designItem.getAttribute("@"+t.name);if(s.startsWith("{")){let e=JSON.parse(s);return"blocks"in e?"blockly":"commands"in e?"script":"js"}else return s==""?"empty":"js"}return"none"}_getEventMethodname(t){return this.selectedItems.length?this.selectedItems[0].getAttribute("@"+t.name):""}_inputMthName(t,s){let e=t.target;this.selectedItems[0].setAttribute("@"+s.name,e.value)}_ctxMenu(t,s){t.preventDefault();let e=this._getScriptType(s);if(e=="empty")this._showContextMenuAssignScript(t,s,!0);else if(e!="none"){let i=[{title:"remove",action:()=>{this.selectedItems[0].removeAttribute("@"+s.name),this._bindingsRefresh()}},{title:"-"},{title:"copy",action:()=>{Be(this.selectedItems[0].getAttribute("@"+s.name))}},{title:"paste",action:async()=>{this.selectedItems[0].setAttribute("@"+s.name,await Ie()),this._bindingsRefresh()}}];Ne.show(i,t)}else this._showContextMenuAssignScript(t,s,!0)}async _addEvent(t){if(t.key=="Enter"){let s=this._getDomElement("addEventInput");this._selectedItems[0].setAttribute("@"+kt.camelToDashCase(s.value.replaceAll(" ","-")),""),s.value="",this.scrollTop=0,this.refresh()}}_createAssignScriptContextMenu(t,s){let e=[{title:"Simple Script",action:()=>{this._editEvent("script",t,s)}},{title:"Javascript",action:()=>{let n=prompt("name of function ?");n&&(this._selectedItems[0].setAttribute("@"+s.name,n),this.refresh(),this._editEvent("js",null,s))}},{title:"Blockly",action:()=>{this._editBlockly(null,s)}}],i=this._getScriptType(s);return i!="none"&&(e.push({title:"-"}),e.push({title:"remove",action:()=>{this.selectedItems[0].removeAttribute("@"+s.name),this._bindingsRefresh()}})),i!="empty"&&e.push({title:"-"},{title:"copy",action:()=>{Be(this.selectedItems[0].getAttribute("@"+s.name))}},{title:"paste",action:async()=>{this.selectedItems[0].setAttribute("@"+s.name,await Ie()),this._bindingsRefresh()}}),e}async _showContextMenuAssignScript(t,s,e){t.preventDefault();let i=this._getScriptType(s);if(i!="none"&&i!="empty"&&!e)this._editEvent(i,t,s);else{let n=this._createAssignScriptContextMenu(t,s);Ne.show(n,t)}}async _editParameter(t,s){let e=new M,i={};e.title="ParameterEditor for '"+s.name+"' of '"+s.designItem.name+"'";let n=s.designItem.getAttribute("@"+s.name);if(n&&n[0]=="{")try{i=JSON.parse(n).parameters}catch{}if(e.setParametersObject(i),await this._visualizationShell.openConfirmation(e,{x:100,y:100,width:700,height:500})){let a=e.getParametersObject(),c={name:n,parameters:a};n&&n[0]=="{"&&(c=JSON.parse(n),c.parameters=a),a==null&&delete c.parameters;let o=JSON.stringify(c);s.designItem.setAttribute("@"+s.name,o),this._bindingsRefresh()}}async _editBlockly(t,s){let e=new A(this._blocklyToolbox);e.title="Blockly Script for '"+s.name+"' of '"+s.designItem.name+"'";let i=s.designItem.getAttribute("@"+s.name),n=null,r=null;if(i){let c=JSON.parse(i);n=c.parameters,r=c.relativeSignalsPath,e.load(c)}if(await this._visualizationShell.openConfirmation(e,{x:100,y:100,width:700,height:500})){let c=e.save();n&&(c.parameters=n),r&&(c.relativeSignalsPath=r),s.designItem.setAttribute("@"+s.name,JSON.stringify(c)),this._bindingsRefresh()}}async _editJavascript(t,s){}async _editSimpleScript(t,s){let e=s.designItem.getAttribute("@"+s.name);if(!e||e.startsWith("{")){let i={commands:[]},n=null,r=null;e&&(i=JSON.parse(e),n=i.parameters,r=i.relativeSignalsPath);let a=new W;if(a.serviceContainer=s.designItem.serviceContainer,a.instanceServiceContainer=s.designItem.instanceServiceContainer,a.scriptCommandsTypeInfo=this._scriptCommandsTypeInfo,a.propertiesTypeInfo=this._propertiesTypeInfo,a.visualizationShell=this._visualizationShell,a.visualizationHandler=this._visualizationHandler,this._commandDescriptions&&(a.commandDescriptions={...a.commandDescriptions,...this._commandDescriptions}),a.loadScript(i),a.title="Script '"+s.name+"' on "+s.designItem.name,await this._visualizationShell.openConfirmation(a,{title:a.title,width:600,height:500})){let o=a.getScriptCommands();if(o&&o.length){let p={commands:o};n&&(p.parameters=n),r&&(p.relativeSignalsPath=r);let h=JSON.stringify(p);s.designItem.setAttribute("@"+s.name,h),this._bindingsRefresh()}}}}async _editEvent(t,s,e){t=="js"?this._editJavascript(s,e):t=="blockly"?this._editBlockly(s,e):this._editSimpleScript(s,e)}refresh(){this._selectedItems!=null&&this._selectedItems.length?this.events=this._selectedItems[0].serviceContainer.getLastServiceWhere("eventsService",t=>t.isHandledElementFromEventsService(this._selectedItems[0])).getPossibleEvents(this._selectedItems[0]).map(t=>({...t,designItem:this._selectedItems[0]})):this.events=[],this._bindingsRefresh()}get selectedItems(){return this._selectedItems}set selectedItems(t){this._selectedItems!=t&&(this._selectedItems=t,this.refresh())}};customElements.define(ee.is,ee);import{TypedEvent as Ct,cssFromString as Tt}from"@node-projects/base-custom-webcomponent";import{BindingTarget as y}from"@node-projects/web-component-designer/dist/elements/item/BindingTarget.js";import{PropertiesHelper as v}from"@node-projects/web-component-designer/dist/elements/services/propertiesService/services/PropertiesHelper.js";var I="bind-prop:",P="bind-attr:",F="bind-class:",H="bind-css:",J="bind-cssvar:",T="bind-content:",he="bind-visible:",Et="bind(",Nt="--tmpBinding_",qs=/{{(.*)}}/;function X(l){return l.constructor?.elementProperties!=null}function ge(l){let t=[],s=[],e="";for(let i=0;i<l.length;i++)l[i]=="{"?(t.push(e),e=""):l[i]=="}"?(s.push(e),e=""):e+=l[i];return t.push(e),{parts:t,signals:s}}function te(l,t){let s=t.split("."),e=l;for(let i of s){if(e==null||typeof e!="object")return;e=e[i]}return e}var me=class{parts;signals;values;unsubscribeTargetValue;cleanupCalls=[];combinedName;disposed;valueChangedCb;visualizationHandler;element;relativeSignalPath;constructor(t,s,e,i,n,r,a,c){this.visualizationHandler=s,this.valueChangedCb=i,this.element=n,this.relativeSignalPath=r,this.parseIndirectBinding(e),this.values=new Array(this.signals.length);for(let o=0;o<this.signals.length;o++){let p=this.signals[o];if(p[0]==="?"&&p[1]==="?"){let u=p.substring(2);if(u.includes(".")){let d=te(a,u);this.handleValueChanged(d,o)}else{this.handleValueChanged(a[u],o);let d=()=>this.handleValueChanged(a[u],o),g=t.getChangedEventName(a,u);a.addEventListener(g,d),this.cleanupCalls.push(()=>a.removeEventListener(g,d))}continue}else if(p[0]==="#"&&p[1]==="#"){let u=p.substring(2);if(u.includes(".")){let d=te(n,u);this.handleValueChanged(d,o)}else{this.handleValueChanged(n[u],o);let d=()=>this.handleValueChanged(n[u],o),g=t.getChangedEventName(n,u);n.addEventListener(g,d),this.cleanupCalls.push(()=>n.removeEventListener(g,d))}continue}else if(p[0]==="\xA7"){let u=p.substring(1),d=c.valueProvider(u,{element:n,relativeSignalPath:r,root:a});d instanceof Promise?d.then(f=>this.handleValueChanged(f,o)):this.handleValueChanged(d,o),c.valueChangedCallbacks||(c.valueChangedCallbacks=new Map);let g=c.valueChangedCallbacks.get(u);g==null&&(g=[],c.valueChangedCallbacks.set(u,g)),g.push(()=>{let f=c.valueProvider(u,{element:n,relativeSignalPath:r,root:a});f instanceof Promise?f.then(b=>this.handleValueChanged(b,o)):this.handleValueChanged(f,o)})}else(p[0]==="?"||p[0]==="#")&&(p.includes(".")?p=te(a,p.substring(1)):p=a[p.substring(1)]);let h=(u,d)=>this.handleValueChanged(d.val,o),m=this.visualizationHandler.subscribeState(p,h);this.cleanupCalls.push(()=>this.visualizationHandler.unsubscribeState(this.signals[o],h,m))}}parseIndirectBinding(t){let{parts:s,signals:e}=ge(t);this.parts=s,this.signals=e;for(let i=0;i<e.length;i++)e[i][0]=="."&&(e[i]=this.visualizationHandler.getNormalizedSignalName(e[i],this.relativeSignalPath,this.element))}handleValueChanged(t,s){this.values[s]=t;let e=this.parts[0];for(let i=0;i<this.parts.length-1;i++){let n=this.values[i];if(n==null)return;e+=n+this.parts[i+1]}if(e[0]=="."&&(e=this.visualizationHandler.getNormalizedSignalName(e,this.relativeSignalPath,this.element)),this.combinedName!=e&&(this.unsubscribeTargetValue&&this.visualizationHandler.unsubscribeState(this.combinedName,this.unsubscribeTargetValue[0],this.unsubscribeTargetValue[1]),!this.disposed)){this.combinedName=e;let i=(n,r)=>this.valueChangedCb(r);this.unsubscribeTargetValue=[i,this.visualizationHandler.subscribeState(e,i)]}}dispose(){this.disposed=!0,this.unsubscribeTargetValue&&(this.visualizationHandler.unsubscribeState(this.combinedName,this.unsubscribeTargetValue[0],this.unsubscribeTargetValue[1]),this.unsubscribeTargetValue=null);for(let t=0;t<this.signals.length;t++)this.cleanupCalls[t]()}setState(t){this.disposed||this.visualizationHandler.setState(this.combinedName,t)}},Oe=class l{_visualizationHandler;namedConverterCallback;constructor(t){this._visualizationHandler=t}getChangedEventName(t,s){let e=s.indexOf("::");return e>=0?s.substring(e+2):t instanceof HTMLInputElement||t instanceof HTMLSelectElement?"change":X(t)?v.camelToDashCase(s):v.camelToDashCase(s)+"-changed"}parseBinding(t,s,e,i,n){let r=s.substring(n.length);if(i===y.cssvar&&(r="--"+r),!e.startsWith("{")){let c={signal:e,target:i};if(e[0]==="="){if(e=e.substring(1),c.signal=e,e.includes("::")){let o=e.split("::");e=o[0],c.signal=e,c.events=o[1].split(",")}c.twoWay=!0,c.events||(t instanceof HTMLInputElement?c.events=[this.getChangedEventName(t,r)]:t instanceof HTMLSelectElement?c.events=[this.getChangedEventName(t,r)]:X(t)?c.events=[this.getChangedEventName(t,r)]:(c.events=[this.getChangedEventName(t,r)],c.maybeLitElement=!0,c.litEventNames=[this.getChangedEventName(t,r)]))}if(e[0]==="!"&&(c.signal=e.substring(1),c.inverted=!0),c.signal.includes(";")){let o=c.signal.split(";");c.expression=o.pop(),c.signal=o.join(";")}return i===y.cssvar||i===y.class?[l.dotToCamelCase(r),c]:i===y.attribute?[r,c]:[v.dashToCamelCase(r),c]}let a=JSON.parse(e);return a.target=i,a.twoWay&&(a.events==null||a.events.length==0)&&(t instanceof HTMLInputElement?a.events=["change"]:t instanceof HTMLSelectElement?a.events=["change"]:a.events=[this.getChangedEventName(t,r)]),i===y.cssvar||i===y.class?[l.dotToCamelCase(r),a]:i===y.attribute?[r,a]:[v.dashToCamelCase(r),a]}serializeBinding(t,s,e){let i={...e};delete i.type,e.twoWay?e.events!=null&&e.events.length==1&&(t instanceof HTMLInputElement&&e.events?.[0]=="change"||t instanceof HTMLSelectElement&&e.events?.[0]=="change"||X(t)&&e.events?.[0]==s||!X(t)&&e.events?.[0]==s+"-changed")&&delete i.events:(delete i.events,delete i.expressionTwoWay);let n=i.twoWay&&i.events?.length>0?"::"+i.events.join(","):"",r=!1;return(n&&e.expression?.includes("::")||e.expressionTwoWay?.includes("::"))&&(r=!0),e.signal.trim()[0]=="{"&&(r=!0),!r&&e.target==y.property&&!e.expression&&!e.expressionTwoWay&&e.converter==null&&!e.historic&&!e.writeBackSignal?s=="textContent"?[T+"text",(e.twoWay?"=":"")+(e.inverted?"!":"")+e.signal+(!e.twoWay&&e.signal.includes(";")?";":"")+n]:s=="innerHTML"?[T+"html",(e.twoWay?"=":"")+(e.inverted?"!":"")+e.signal+(!e.twoWay&&e.signal.includes(";")?";":"")+n]:[I+v.camelToDashCase(s),(e.twoWay?"=":"")+(e.inverted?"!":"")+e.signal+(!e.twoWay&&e.signal.includes(";")?";":"")+n]:!r&&e.target==y.property&&e.expression&&!e.expression.includes(`
|
|
1288
|
+
`)&&!e.expression.includes(";")&&!e.expressionTwoWay&&e.converter==null&&!e.historic&&!e.writeBackSignal?s=="textContent"?[T+"text",(e.inverted?"!":"")+e.signal+";"+e.expression+n]:s=="innerHTML"?[T+"html",(e.inverted?"!":"")+e.signal+";"+e.expression+n]:[I+v.camelToDashCase(s),(e.twoWay?"=":"")+(e.inverted?"!":"")+e.signal+";"+e.expression+n]:!r&&e.target==y.attribute&&!e.expression&&!e.expressionTwoWay&&e.converter==null&&!e.historic&&!e.writeBackSignal?[P+v.camelToDashCase(s),(e.twoWay?"=":"")+(e.inverted?"!":"")+e.signal+(!e.twoWay&&e.signal.includes(";")?";":"")+n]:!r&&e.target==y.attribute&&e.expression&&!e.expression.includes(`
|
|
1289
|
+
`)&&!e.expression.includes(";")&&!e.expressionTwoWay&&e.converter==null&&!e.historic&&!e.writeBackSignal?[P+v.camelToDashCase(s),(e.twoWay?"=":"")+(e.inverted?"!":"")+e.signal+";"+e.expression+n]:!r&&e.target==y.class&&!e.expression&&!e.expressionTwoWay&&e.converter==null&&!e.historic&&!e.writeBackSignal?[F+v.camelToDashCase(s),(e.inverted?"!":"")+e.signal+(!e.twoWay&&e.signal.includes(";")?";":"")+n]:!r&&e.target==y.class&&e.expression&&!e.expression.includes(`
|
|
1290
|
+
`)&&!e.expression.includes(";")&&!e.expressionTwoWay&&e.converter==null&&!e.historic&&!e.writeBackSignal?[F+v.camelToDashCase(s),(e.inverted?"!":"")+e.signal+";"+e.expression+n]:!r&&e.target==y.css&&!e.expression&&!e.expressionTwoWay&&e.converter==null&&!e.historic&&!e.writeBackSignal?[H+v.camelToDashCase(s),(e.inverted?"!":"")+e.signal+(!e.twoWay&&e.signal.includes(";")?";":"")+n]:!r&&e.target==y.css&&e.expression&&!e.expression.includes(`
|
|
1291
|
+
`)&&!e.expression.includes(";")&&!e.expressionTwoWay&&e.converter==null&&!e.historic&&!e.writeBackSignal?[H+v.camelToDashCase(s),(e.inverted?"!":"")+e.signal+";"+e.expression+n]:!r&&e.target==y.cssvar&&!e.expression&&!e.expressionTwoWay&&e.converter==null&&!e.historic&&!e.writeBackSignal?[J+l.camelToDotCase(s.substring(2)),(e.inverted?"!":"")+e.signal+(!e.twoWay&&e.signal.includes(";")?";":"")+n]:!r&&e.target==y.cssvar&&e.expression&&!e.expression.includes(`
|
|
1292
|
+
`)&&!e.expression.includes(";")&&!e.expressionTwoWay&&e.converter==null&&!e.historic&&!e.writeBackSignal?[J+v.camelToDashCase(s),(e.inverted?"!":"")+e.signal+";"+e.expression+n]:((e.inverted===null||e.inverted===!1)&&delete i.inverted,(e.expression===null||e.expression==="")&&delete i.expression,(e.expressionTwoWay===null||e.expressionTwoWay==="")&&delete i.expressionTwoWay,(e.twoWay===null||e.twoWay===!1)&&delete i.twoWay,delete i.target,e.historic||delete i.historic,e.target==y.content?[T+"html",JSON.stringify(i)]:e.target==y.attribute?[P+v.camelToDashCase(s),JSON.stringify(i)]:e.target==y.class?[F+l.camelToDotCase(s),JSON.stringify(i)]:e.target==y.css?[H+v.camelToDashCase(s),JSON.stringify(i)]:e.target==y.cssvar?[J+l.camelToDotCase(s.substring(2)),JSON.stringify(i)]:e.target==y.property&&s=="innerHTML"?[T+"html",JSON.stringify(i)]:e.target==y.property&&s=="textContent"?[T+"text",JSON.stringify(i)]:[I+v.camelToDashCase(s),JSON.stringify(i)])}getBindingAttributeName(t,s,e){return e==y.attribute?P+v.camelToDashCase(s):e==y.class?F+l.camelToDotCase(s):e==y.css?H+v.camelToDashCase(s):e==y.visible?he:e==y.cssvar?J+l.camelToDotCase(s):e==y.property&&s=="innerHTML"?T+"html":e==y.property&&s=="textContent"?T+"text":I+v.camelToDashCase(s)}*getBindings(t){if(t.attributes)for(let s of t.attributes)s.name.startsWith(I)?yield this.parseBinding(t,s.name,s.value,y.property,I):s.name.startsWith(T)?yield this.parseBinding(t,s.name==="bind-content:html"?"bind-prop:inner-h-t-m-l":"bind-prop:text-content",s.value,y.property,I):s.name.startsWith(P)?yield this.parseBinding(t,s.name,s.value,y.attribute,P):s.name.startsWith(F)?yield this.parseBinding(t,s.name,s.value,y.class,F):s.name.startsWith(H)?yield this.parseBinding(t,s.name,s.value,y.css,H):s.name.startsWith(J)?yield this.parseBinding(t,s.name,s.value,y.cssvar,J):s.name.startsWith(he)&&(yield this.parseBinding(t,s.name,s.value,y.visible,he))}applyAllBindings(t,s,e,i,n){let r=[],a=document.createTreeWalker(t,NodeFilter.SHOW_ELEMENT),c;for(;c=a.nextNode();){let o=this.getBindings(c);for(let p of o)try{let h=this.applyBinding(c,p,s,e,i);if(r.push(h),p[1].maybeLitElement&&c.localName.includes("-")&&!customElements.get(c.localName)){let m=c,u=p;customElements.whenDefined(c.localName).then(()=>{X(m)&&(h(),u[1].events=u[1].litEventNames,r.push(this.applyBinding(m,u,s,e,i)))})}}catch(h){console.warn("error applying binding",c,p,h)}if(n&&n(c)){c=a.nextSibling();continue}}return r}static#e=0;async parseCssBindings(t,s,e,i){let n=await import("@node-projects/css-parser"),r=n.parse(t),a;for(let o of r.stylesheet.rules)if(o.type===n.CssTypes.rule){for(let p of o.declarations)if(p.type===n.CssTypes.declaration&&p.value.includes(Et)){let h=this.parseCssBinding(p.value,s,e,i);p.value=h[0],a?a.push(...h[1]):a=h[1]}}let c=n.stringify(r,{indent:"",compress:!0});return[Tt(c),a]}parseCssBinding(t,s,e,i,n){t=t.trim();let r="",a="",c=!1,o="",p=!1,h=null,m=[];for(let u=0;u<t.length;u++){let d=t[u];if(c)if(p)o+=d;else if(h&&d==="\\")p=!0;else if(d===h)h=null;else if(h===null&&d===")"){let g=l.#e++,f=Nt+g,b=[f,{signal:o,target:y.cssvar}];o.startsWith("{")&&(b=JSON.parse(o)),m.push(this.applyBinding(s,b,e,i,n)),r+="var("+f+")",c=!1,o=""}else o+=d;else d==="("?(a!=="bind"?(r+=a,r+=d):(c=!0,t[u+1]==="'"||t[u+1]==='"'?(u++,h=t[u]):h=null),a=""):d===" "||d===","||d==="("||d==="+"||d==="-"||d==="*"||d==="/"?(r+=a+d,a=""):a+=d}return[r+a,m]}applyBinding(t,s,e,i,n){let r=[],a,c=()=>{for(let m of r)this._visualizationHandler.unsubscribeState(m[0],m[1],m[2]);if(a)for(let m of a)m()},o=s[1].signal.split(";"),p=new Array(o.length);for(let m=0;m<o.length;m++){let u=o[m];if(p[m]="__"+m,u.includes(":")){let d=u.split(":");p[m]=d[0],u=d[1],o[m]=u}if(u[0]==="?"){if(i){let d=u.substring(1);if(d[0]=="?")o[m]=d;else{o[m]=i[d],d[0]==="$"&&(d=d.substring(1),o[m]="$"+i[d]);let g=()=>{c(),this.applyBinding(t,s,e,i,n)},f=this.getChangedEventName(i,d);i.addEventListener(f,g),a||(a=[]),a.push(()=>i.removeEventListener(f,g))}}}else if(u[0]==="#"){let d=u.substring(1);if(d[0]=="#")o[m]=d;else{o[m]=i[d],d[0]==="$"&&(d=d.substring(1),o[m]="$"+i[d]);let g=()=>{c(),this.applyBinding(t,s,e,i,n)},f=this.getChangedEventName(t,d);i.addEventListener(f,g),a||(a=[]),a.push(()=>i.removeEventListener(f,g))}}u[0]==="."&&(o[m]=this._visualizationHandler.getNormalizedSignalName(u,e,t))}let h=new Array(o.length);for(let m=0;m<o.length;m++){let u=o[m];if(u[0]==="?"){if(i){let d=u.substring(1),g=()=>{let f=!1;f||(f=!0,this.handleValueChanged(t,i,s,i[d],h,m,p,!1,e),f=!1)};i.addEventListener(v.camelToDashCase(d)+"-changed",g),a||(a=[]),a.push(()=>i.removeEventListener(v.camelToDashCase(d)+"-changed",g));try{this.handleValueChanged(t,i,s,i[d],h,m,p,!1,e)}catch(f){console.error(f)}s[1].twoWay&&m==0&&this.addTwoWayBinding(s,t,f=>i[d]=f)}}else if(u[0]==="#"){let d=u.substring(1),g=()=>{let f=!1;f||(f=!0,this.handleValueChanged(t,i,s,t[d],h,m,p,!1,e),f=!1)};t.addEventListener(v.camelToDashCase(d)+"-changed",g),a||(a=[]),a.push(()=>t.removeEventListener(v.camelToDashCase(d)+"-changed",g));try{this.handleValueChanged(t,i,s,t[d],h,m,p,!1,e)}catch(f){console.error(f)}s[1].twoWay&&m==0&&this.addTwoWayBinding(s,t,f=>t[d]=f)}else if(u[0]==="$"){let d=u.substring(1);d[0]==="."&&(d=this._visualizationHandler.getNormalizedSignalName(d,e,t)),this._visualizationHandler.getObject(d).then(g=>{this.handleValueChanged(t,i,s,g,h,m,p,!0,e)})}else if(u[0]==="\xA7"){let d=u.substring(1),g=n.valueProvider(d,{element:t,binding:s,relativeSignalPath:e,root:i});g instanceof Promise?g.then(b=>this.handleValueChanged(t,i,s,b,h,m,p,!0,e)):this.handleValueChanged(t,i,s,g,h,m,p,!0,e),n.valueChangedCallbacks||(n.valueChangedCallbacks=new Map);let f=n.valueChangedCallbacks.get(d);f==null&&(f=[],n.valueChangedCallbacks.set(d,f)),f.push(()=>{let b=n.valueProvider(d,{element:t,binding:s,relativeSignalPath:e,root:i});b instanceof Promise?b.then(_=>this.handleValueChanged(t,i,s,_,h,m,p,!0,e)):this.handleValueChanged(t,i,s,b,h,m,p,!0,e)})}else if(u.includes("{")){let d=new me(this,this._visualizationHandler,u,g=>this.handleValueChanged(t,i,s,g.val,h,m,p,!1,e),t,e,i,n);a||(a=[]),a.push(()=>d.dispose()),s[1].twoWay&&m==0&&this.addTwoWayBinding(s,t,g=>d.setState(g))}else if(s[1].historic)if(s[1].historic.reloadInterval){let d={timerId:-1},g=async()=>{let f=await this._visualizationHandler.getHistoricData(u,s[1].historic);this.handleValueChanged(t,i,s,f?.values,h,m,p,!0,e),d.timerId!==null&&(d.timerId=setTimeout(g,s[1].historic.reloadInterval))};g(),a||(a=[]),a.push(()=>{d.timerId>0&&clearTimeout(d.timerId),d.timerId=null})}else this._visualizationHandler.getHistoricData(u,s[1].historic).then(d=>this.handleValueChanged(t,i,s,d?.values,h,m,p,!0,e));else{let d=(g,f)=>this.handleValueChanged(t,i,s,f.val,h,m,p,!1,e);r.push([u,d,this._visualizationHandler.subscribeState(u,d)]),this._visualizationHandler.getState(u).then(g=>this.handleValueChanged(t,i,s,g?.val,h,m,p,!1,e)),s[1].twoWay&&m==0&&this.addTwoWayBinding(s,t,g=>this._visualizationHandler.setState(u,g))}}return c}addTwoWayBinding(t,s,e){t[1].expressionTwoWay&&(t[1].compiledExpressionTwoWay||(t[1].expressionTwoWay.includes("return ")?t[1].compiledExpressionTwoWay=new Function(["value"],t[1].expressionTwoWay):t[1].compiledExpressionTwoWay=new Function(["value"],"return "+t[1].expressionTwoWay)));for(let i of t[1].events){let n=s[i];n instanceof Ct?n.on(()=>{let r;t[1].target==y.attribute?r=s.getAttribute(t[0]):r=s[t[0]],r=l.parseValueWithType(r,t),t[1].compiledExpressionTwoWay&&(r=t[1].compiledExpressionTwoWay(r)),e(r)}):s.addEventListener(i,r=>{let a;t[1].target==y.attribute?a=s.getAttribute(t[0]):a=s[t[0]],a=l.parseValueWithType(a,t),t[1].compiledExpressionTwoWay&&(a=t[1].compiledExpressionTwoWay(a)),e(a)})}}static parseValueWithType(t,s){if(s[1].type)switch(s[1].type){case"number":return parseFloat(t);case"boolean":return t===!0||t==="true"||!!parseInt(t);case"string":return t?.toString();case"integer":return parseInt(t)}return t}handleValueChanged(t,s,e,i,n,r,a,c,o){let p=i;if(!c&&r==0&&(p=l.parseValueWithType(p,e)),n[r]=p,e[1].expression&&(e[1].compiledExpression||(a.push("__res"),a.push("__ctx"),e[1].expression.includes("return ")?e[1].compiledExpression=new Function(a,e[1].expression):e[1].compiledExpression=new Function(a,"return "+e[1].expression)),n[a.length-1]={element:t,root:s,boundNames:e[1].signal,boundTargetName:e[0],boundTargetType:e[1].target},p=e[1].compiledExpression(...n),n[a.length-1]=p),e[1].converter)if(typeof e[1].converter=="string")p=this.namedConverterCallback(e[1].converter,p,t,e);else{let h=p!=null?p.toString():p;if(h in e[1].converter){let m=e[1].converter[h];typeof m=="string"?p=new Function(a,"return `"+e[1].converter[h]+"`")(...n):p=m}else{let m=!1,u=parseFloat(p);for(let d in e[1].converter)if(d.length>2&&d[0]===">"&&d[1]==="="){let g=parseFloat(d.substring(2));if(u>=g){let f=e[1].converter[d];typeof f=="string"?p=new Function(a,"return `"+e[1].converter[d]+"`")(...n):p=f,m=!0;break}}else if(d.length>2&&d[0]==="<"&&d[1]==="="){let g=parseFloat(d.substring(2));if(u<=g){let f=e[1].converter[d];typeof f=="string"?p=new Function(a,"return `"+e[1].converter[d]+"`")(...n):p=f,m=!0;break}}else if(d.length>1&&d[0]===">"){let g=parseFloat(d.substring(1));if(u>g){let f=e[1].converter[d];typeof f=="string"?p=new Function(a,"return `"+e[1].converter[d]+"`")(...n):p=f,m=!0;break}}else if(d.length>1&&d[0]==="<"){let g=parseFloat(d.substring(1));if(u<g){let f=e[1].converter[d];typeof f=="string"?p=new Function(a,"return `"+e[1].converter[d]+"`")(...n):p=f,m=!0;break}}else{let g=d.split("-");if(g.length>1&&(g[0]===""||u>=parseFloat(g[0]))&&(g[1]===""||parseFloat(g[1])>=u)){let f=e[1].converter[d];typeof f=="string"?p=new Function(a,"return `"+e[1].converter[d]+"`")(...n):p=f,m=!0;break}}!m&&e[1].converterDefault!==void 0&&(p=e[1].converterDefault)}}if(e[1].inverted&&(p=!p),e[1].writeBackSignal){let h=e[1].writeBackSignal;h[0]==="."&&(h=o+h),this._visualizationHandler.setState(h,p,!0)}e[1].target==y.property?t[e[0]]=p:e[1].target==y.attribute?typeof p=="boolean"?p?t.setAttribute(e[0],""):t.removeAttribute(e[0]):t.setAttribute(e[0],p):e[1].target==y.css?t.style[e[0]]=p:e[1].target==y.cssvar?t.style.setProperty(e[0],p):e[1].target==y.class?p?t.classList.add(e[0]):t.classList.remove(e[0]):e[1].target==y.visible&&(t.style.visibility=p?"":"collapse")}static camelToDotCase(t){return t.replace(/([A-Z])/g,s=>`.${s[0].toLowerCase()}`)}static dotToCamelCase(t){return t.replace(/\.([a-z])/g,s=>s[1].toUpperCase())}};var Ve=class{name;relativeSignalsPath;commands;parameters};import{deepValue as O,setDeepValue as Re,sleep as Bt}from"@node-projects/web-component-designer/dist/elements/helper/Helper.js";import U from"long";var se="cyclic",It={pointerdown:"pointerup",pointerenter:"pointerleave",mouseenter:"mouseleave",mouseover:"mouseout",focus:"blur",focusin:"focusout",keydown:"keyup"},Ae=class{_visualizationHandler;_subscriptionCallback=()=>{};constructor(l){this._visualizationHandler=l}async execute(l,t){let s=-1,e=!1,i=!1,n=t.event?.type,r=n?It[n]:null;if(r){let a=t.element;n=="pointerdown"&&(a=window),a.addEventListener(r,()=>{e=!0},{once:!0})}for(let a=0;a<l.length;a++){let c=l[a];if(c.type=="Exit"){i=!0;break}else if(c.type=="If"){let p=(await this.evaluateIfFormula(c,t)?c.trueCommands:c.elseCommands)??[];if(!await this.execute(p,t)){i=!0;break}}else if(c.type=="Goto"){let o=await this.getValue(c.label,t);if(a=l.findIndex(p=>p.type=="Label"&&p.label==o),a<0)break}else if(c.type=="Condition"){let o=await this.getValue(c.value1,t),p=await this.getValue(c.value2,t),h=await this.getValue(c.comparisonType,t),m=!1;switch(h){case"==null":m=o==null;break;case"!=null":m=o!=null;break;case"==true":m=o==!0;break;case"==false":m=o==!1;break;case"==":m=o==p;break;case"!=":m=o!=p;break;case">":m=o>p;break;case"<":m=o<p;break;case">=":m=o>=p;break;case"<=":m=o<=p;break;case"&&":m=o&&p;break;case"||":m=o||p;break}if(m){await this.runExternalScript(await this.getValue(c.trueScriptName,t),await this.getValue(c.trueScriptType,t));let u=await this.getValue(c.trueGotoLabel,t);if(u&&(a=l.findIndex(d=>d.type=="Label"&&d.label==u),a<0))break}else{await this.runExternalScript(await this.getValue(c.falseScriptName,t),await this.getValue(c.falseScriptType,t));let u=await this.getValue(c.falseGotoLabel,t);if(u&&(a=l.findIndex(d=>d.type=="Label"&&d.label==u),a<0))break}}else if(c.type=="Repeat"){let o=await this.getValue(c.label,t),p=await this.getValue(c.count,t);if(await this.getValue(c.mode,t)=="eventValid"&&e){e=!1;continue}if(p!=0&&s==-1&&(s=p-1),s==0||(s>0&&s--,a=-1,o&&(a=l.findIndex(m=>m.type=="Label"&&m.label==o),a<0)))continue}else if(!await this.runScriptCommand(c,t)){i=!0;break}}return!i}async getValueFromTarget(l,t,s){return l==="property"?O(s.root,t):l==="elementProperty"?O(s.element,t):(await this._visualizationHandler.getState(this.getSignalName(t,s)))?.val}async setValueOnTarget(l,t,s,e){l==="property"?Re(s.root,t,e):l==="elementProperty"?Re(s.element,t,e):await this._visualizationHandler.setState(this.getSignalName(t,s),e)}async runExternalScript(l,t){}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 l=await this.getValue(command.value??500,context);await Bt(l);break}case"Console":{let l=await this.getValue(command.target??"log",context),t=await this.getValue(command.message,context);console[l](t);break}case"ToggleSignalValue":{let l=await this.getValue(command.signal,context),t=await this.getValue(command.target,context),s=await this.getValueFromTarget(t,l,context);await this._visualizationHandler.setState(this.getSignalName(l,context),!s);break}case"ToggleSignalValueThroughList":{let l=await this.getValue(command.valueList,context),t=await this.getValue(command.signal,context),s=await this.getValue(command.target,context),e=await this.getValueFromTarget(s,t,context),i=l.indexOf(e)+1;i>=l.length&&(i=0);let n=l[i];await this._visualizationHandler.setState(this.getSignalName(t,context),n);break}case"SetSignalValue":{let l=await this.getValue(command.signal,context),t=await this.getValue(command.target,context);await this.setValueOnTarget(t,l,context,await this.getValue(command.value,context));break}case"IncrementSignalValue":{let l=await this.getValue(command.signal,context),t=await this.getValue(command.target,context),e=await this.getValueFromTarget(t,l,context)+await this.getValue(command.value,context);await this.setValueOnTarget(t,l,context,e);break}case"DecrementSignalValue":{let l=await this.getValue(command.signal,context),t=await this.getValue(command.target,context),e=await this.getValueFromTarget(t,l,context)-await this.getValue(command.value,context);await this.setValueOnTarget(t,l,context,e);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 l=await this.getValue(command.signal,context),t=await this.getValue(command.bitNumber??0,context),s=await this.getValue(command.target,context),e=await this.getValueFromTarget(s,l,context),i=U.fromNumber(1).shiftLeft(t),n=U.fromNumber(e).or(i).toNumber();await this.setValueOnTarget(s,l,context,n);break}case"ClearBitInSignal":{let l=await this.getValue(command.signal,context),t=await this.getValue(command.bitNumber??0,context),s=await this.getValue(command.target,context),e=await this.getValueFromTarget(s,l,context),i=U.fromNumber(1).shiftLeft(t);i.negate();let n=U.fromNumber(e).and(i).toNumber();await this.setValueOnTarget(s,l,context,n);break}case"ToggleBitInSignal":{let l=await this.getValue(command.signal,context),t=await this.getValue(command.bitNumber??0,context),s=await this.getValue(command.target,context),e=await this.getValueFromTarget(s,l,context),i=U.fromNumber(1).shiftLeft(t),n=U.fromNumber(e).xor(i).toNumber();await this.setValueOnTarget(s,l,context,n);break}case"Javascript":{let l=await this.getValue(command.script,context),t=context;t.shadowRoot=context.element.getRootNode(),t.instance=context.shadowRoot.host,command.compiledScript||(command.compiledScript=new Function("context",l)),command.compiledScript(t);break}case"SetElementProperty":{command=D.upgradeSetElementProperty(command);let l=await this.getValue(command.name,context);l===""&&(l=null);let t=await this.getValue(command.value,context),s=await this.getValue(command.parentIndex??0,context),e=await this.getValue(command.target??"property",context),i=await this.getValue(command.targetSelectorTarget??"container",context),n=await this.getValue(command.targetSelector,context),r=await this.getValue(command.mode??"toggle",context),a=this.getTargetFromTargetSelector(context,i,s,n);for(let c of a)e=="attribute"?c.setAttribute(l,t):e=="property"?c[l]=t:e=="css"?c.style[l]=t:e=="class"&&(r==="toggle"?c.classList.toggle(l??t):r==="remove"?c.classList.remove(l??t):c.classList.add(l??t));break}case"SubscribeSignal":{let l=await this.getValue(command.signal,context);if(await this.getValue(command.oneTime,context)){let s=()=>{this._visualizationHandler.unsubscribeState(l,s,null)};this._visualizationHandler.subscribeState(l,s)}else this._visualizationHandler.subscribeState(l,this._subscriptionCallback);break}case"UnsubscribeSignal":{let l=await this.getValue(command.signal,context);this._visualizationHandler.unsubscribeState(l,this._subscriptionCallback,null);break}case"WriteSignalsInGroup":{let l=await this.getValue(command.group,context);this._visualizationHandler.writeSignalsInGroup(l);break}case"ClearSignalsInGroup":{let l=await this.getValue(command.group,context);this._visualizationHandler.clearSignalsInGroup(l);break}case"RunScript":{let l=await this.getValue(command.name,context),t=await this.getValue(command.scriptType,context);this.runExternalScript(l,t);break}case"ShowMessageBox":{let l=null,t=await this.getValue(command.exitScriptOnCancel,context);if(await this.getValue(command.buttons,context)=="yesNo"){let i=await this.getValue(command.message,context);confirm(i)?l=1:l=2}else{let i=await this.getValue(command.message,context);alert(i),l=1}let e=await this.getValue(command.resultSignal,context);if(e&&this._visualizationHandler.setState(e,l),t&&l!=1)return!1;break}case"ShowPrompt":{let l=await this.getValue(command.message,context),t=await this.getValue(command.default,context),s=prompt(l,t),e=await this.getValue(command.resultSignal,context);e&&s&&this._visualizationHandler.setState(e,s);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(l,t,s){if(t==="container"){let e=l.element.getRootNode().host;for(let i=0;i<(s??0);i++)e=e.getRootNode().host;return e}else if(t==="element"){let e=l.element;for(let i=0;i<(s??0);i++)e=e.parentElement;return e}return null}getTargetFromTargetSelector(l,t,s,e){let i=this.getTarget(l,t,s),n=[i];return e&&(t==="container"?n=i.shadowRoot.querySelectorAll(e):n=i.querySelectorAll(e)),n}async getValue(value,outerContext){if(value==null)return null;if(typeof value=="object")switch(value.source){case"property":return O(outerContext.root,value.name);case"elementProperty":return O(outerContext.element,value.name);case"signal":return(await this._visualizationHandler.getState(this.getSignalName(value.name,outerContext)))?.val;case"signalInProperty":{let l=O(outerContext.root,value.name);return(await this._visualizationHandler.getState(this.getSignalName(l,outerContext)))?.val}case"event":{let l=outerContext.event;return value.name&&(l=O(l,value.name)),l}case"parameter":return outerContext.parameters[value.name];case"context":return O(outerContext,value.name);case"complexString":{let l=value.name;return l!=null?await this.parseStringWithValues(l,outerContext):null}case"complexSignal":{let l=value.name;if(l!=null){let t=await this.parseStringWithValues(l,outerContext);return(await this._visualizationHandler.getState(this.getSignalName(t,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(l,t){let s=ge(l),e=await Promise.all(s.signals.map(n=>this.getStateOrFieldOrParameter(this.getSignalName(n,t),t))),i=s.parts[0];for(let n=0;n<s.parts.length-1;n++){let r=e[n];typeof r=="object"&&(r=r.val),r==null&&(r=""),i+=r+s.parts[n+1]}return i}async evaluateIfFormula(l,t){let s=l.signals??[],e=s.map((r,a)=>r.varName?.trim()||"__"+a),i=await Promise.all(s.map(r=>this.getValue(r,t))),n=await this.getValue(l.formula,t);return(!l.compiledFormula||l._compiledFormulaSrc!==n)&&(l.compiledFormula=new Function(...e,"return ("+n+");"),l._compiledFormulaSrc=n),!!l.compiledFormula(...i)}getSignalName(l,t){return l[0]==="."?t.relativeSignalsPath+l:l}createScriptContext(l,t,s,e,i){return{root:l,event:t,element:s,parameters:e,relativeSignalsPath:i}}async assignAllScripts(l,t,s,e,i,n,r,a){n??=this.createScriptContext;let c=await this.loadAndInitJsObject(l,t,s,e,a);for(let o of s.querySelectorAll("*"))for(let p of o.attributes)if(p.name[0]==="@")try{let h=p.name.substring(1),m=p.value.trim(),u=h.startsWith(se),d=u?parseInt(h.substring(h.indexOf(":")+1)):null,g=await this.resolveHandler(m,c,o,s,e,i,n,r,h);g&&this.bindHandler(o,h,u,d,g)}catch{console.warn("error assigning script",o,p)}return c}async loadAndInitJsObject(l,t,s,e,i){if(!t)return null;try{let r=await import(URL.createObjectURL(new Blob([t],{type:"application/javascript"})));return i?i(r):r.init?.(e,s),r}catch(n){return console.error("error parsing javascript - "+l,n),null}}async resolveHandler(l,t,s,e,i,n,r,a,c){if(l[0]!=="{")return p=>{t?.[l]?t[l](p,s,e,i):console.warn(`javascript function named: "${l}" not found, maybe missing a "export" ?`)};let o=JSON.parse(l);if("commands"in o)return p=>this.execute(o.commands,r(i,p,s,o.parameters,o.relativeSignalsPath));if("blocks"in o){let p=null;return async h=>{p??=await ve(o),p(h,e,o.parameters,o.relativeSignalsPath??"",n,r(i,h,s,o.parameters,o.relativeSignalsPath))}}if("name"in o){if(a)return a(s,c,o),null;let p=o.name;return h=>{t?.[p]?t[p](h,s,e,i,o.parameters):console.warn(`javascript function named: "${p}" not found, maybe missing a "export" ?`)}}return null}bindHandler(l,t,s,e,i){if(!s){l.addEventListener(t,i);return}let n=setInterval(()=>{l.isConnected?i(null):clearInterval(n)},e)}};import{OverlayLayer as Ot,DesignItem as V,InsertAction as Vt,BindingTarget as E,PropertyType as ie}from"@node-projects/web-component-designer";var ze=class{constructor(t,s){this._bindingsHelper=t,this._visualizationHandler=s}_bindingsHelper;_visualizationHandler;rectMap=new Map;rect;dragEnter(t,s,e){let i=V.GetDesignItem(e);if(i&&!i.isRootItem){let n=t.getNormalizedElementCoordinates(e);this.rect=t.overlayLayer.drawRect("IobrokerWebuiBindableObjectDragDropService",n.x,n.y,n.width,n.height,"",null,Ot.Background),this.rect.style.fill="#ff0000",this.rect.style.opacity="0.3",this.rectMap.set(e,this.rect)}}dragLeave(t,s,e){let i=V.GetDesignItem(e);if(i&&!i.isRootItem){let n=this.rectMap.get(e);t.overlayLayer.removeOverlay(n),this.rectMap.delete(e)}}dragOver(t,s,e){return"copy"}async drop(t,s,e,i){for(let c of this.rectMap.values())t.overlayLayer.removeOverlay(c);this.rectMap.clear();let n=V.GetDesignItem(i),r=await this._visualizationHandler.getObject(e.fullName),a=this._visualizationHandler.getSignalInformation(r);if(n&&!n.isRootItem)if(i instanceof HTMLInputElement){let c={signal:e.fullName,target:E.property},o=this._bindingsHelper.serializeBinding(i,i.type=="checkbox"?"checked":"value",c);n.setAttribute(o[0],o[1])}else{let c={signal:e.fullName,target:E.content},o=this._bindingsHelper.serializeBinding(i,null,c);n.setAttribute(o[0],o[1])}else{let c=t.getNormalizedEventCoordinates(s),o,p,h=await this._visualizationHandler.getState(e.fullName);if(a.role==="url"&&typeof h?.val=="string")if(h.val.endsWith("jpg")||h.val.endsWith("jpeg")||h.val.endsWith("png")||h.val.endsWith("gif")||h.val.endsWith("svg")){let m=document.createElement("img");o=V.createDesignItemFromInstance(m,t.serviceContainer,t.instanceServiceContainer),p=o.openGroup("Insert");let u={signal:e.fullName,target:E.property},d=this._bindingsHelper.serializeBinding(m,"src",u);o.setAttribute(d[0],d[1]),o.element.src=h.val}else if(h.val.endsWith("mp4")){let m=document.createElement("video");o=V.createDesignItemFromInstance(m,t.serviceContainer,t.instanceServiceContainer),p=o.openGroup("Insert");let u={signal:e.fullName,target:E.property},d=this._bindingsHelper.serializeBinding(m,"src",u);o.setAttribute(d[0],d[1]),o.element.src=h.val}else{let m=document.createElement("iframe");o=V.createDesignItemFromInstance(m,t.serviceContainer,t.instanceServiceContainer),p=o.openGroup("Insert");let u={signal:e.fullName,target:E.property},d=this._bindingsHelper.serializeBinding(m,"src",u);o.setAttribute(d[0],d[1]),o.element.src=h.val}if(!o){let m=document.createElement("input");o=V.createDesignItemFromInstance(m,t.serviceContainer,t.instanceServiceContainer),p=o.openGroup("Insert");let u=a.writeable!==!1,d={signal:e.fullName,target:E.property,twoWay:u},g=this._bindingsHelper.serializeBinding(m,"value",d);a.type==="boolean"?(g=this._bindingsHelper.serializeBinding(m,"checked",d),o.setAttribute("type","checkbox")):a.role=="date"?(d.twoWay=u,g=this._bindingsHelper.serializeBinding(m,"value-as-number",d),o.setAttribute("type","date"),o.setAttribute("readonly","")):a.role=="datetime"&&(d.twoWay=u,g=this._bindingsHelper.serializeBinding(m,"value-as-number",d),o.setAttribute("type","datetime-local"),o.setAttribute("readonly","")),o.setAttribute(g[0],g[1])}o.setStyle("position","absolute"),o.setStyle("left",c.x+"px"),o.setStyle("top",c.y+"px"),t.instanceServiceContainer.undoService.execute(new Vt(t.rootDesignItem,t.rootDesignItem.childCount,o)),p.commit(),requestAnimationFrame(()=>t.instanceServiceContainer.selectionService.setSelectedElements([o]))}}dragOverOnProperty(t,s,e){return"copy"}dropOnProperty(t,s,e,i){if(s.type=="signal"){s.service.setValue(i,s,e.fullName);return}let n={signal:e.fullName,target:E.property};s.propertyType==ie.attribute&&(n.target=E.attribute),s.propertyType==ie.cssValue&&(n.target=E.css),n.signal=e.fullName,n.twoWay=s.propertyType==ie.property||s.propertyType==ie.propertyAndAttribute;let r=i[0].openGroup("drop binding");for(let a of i){let c=this._bindingsHelper.serializeBinding(a.element,s.name,n);a.setAttribute(c[0],c[1])}r.commit()}};import{BindingMode as fe,BindingTarget as Le,PropertiesHelper as Rt}from"@node-projects/web-component-designer";var De=class l{constructor(t){this._bindingsHelper=t}_bindingsHelper;static type="visualization-binding";getBindings(t){return Array.from(this._bindingsHelper.getBindings(t.element)).map(e=>({targetName:e[1].target===Le.css||e[1].target===Le.attribute?Rt.camelToDashCase(e[0]):e[0],target:e[1].target,mode:e[1].twoWay?fe.twoWay:fe.oneWay,invert:e[1].inverted,bindableObjectNames:e[1].signal.split(";"),expression:e[1].expression,expressionTwoWay:e[1].expressionTwoWay,converter:e[1].converter,type:l.type,service:this,changedEvents:e[1].events,historic:e[1].historic,writeBackSignal:e[1].writeBackSignal}))}setBinding(t,s){let e={signal:s.bindableObjectNames.join(";"),target:s.target};e.inverted=s.invert,e.twoWay=s.mode==fe.twoWay,e.expression=s.expression,e.expressionTwoWay=s.expressionTwoWay,e.historic=s.historic,e.type=s.type,typeof s.converters=="string"?e.converter=s.converters:Array.isArray(s.converters)&&s.converters.length>0?e.converter=Object.fromEntries(s.converters.map(r=>[r.key,r.value])):s.converters!=null&&(e.converter=s.converters),e.target=s.target,e.events=s.changedEvents;let i=this._bindingsHelper.serializeBinding(t.element,s.targetName,e),n=t.openGroup("edit_binding");return t.setAttribute(i[0],i[1]),n.commit(),!0}clearBinding(t,s,e){let i=this._bindingsHelper.getBindingAttributeName(t.element,s,e);return t.removeAttribute(i),!0}};var je=class{getRefactorings(t){let s=[];for(let e of t){let i=e.serviceContainer.bindingService.getBindings(e);if(i)for(let n of i)for(let r of n.bindableObjectNames){let a="signal",c="";if(r.includes(":")){let o=r.split(":")[0],p=r.substring(o.length+1);p.startsWith("?")&&(p=p.substring(1),c="?",a="property",p.startsWith("?")&&(p=p.substring(1),c="??")),s.push({service:this,name:p,itemType:a,designItem:e,type:"binding",sourceObject:n,display:n.target+"/"+n.targetName+" - "+o+":",shortName:o,prefix:c})}else r.startsWith("?")&&(r=r.substring(1),c="?",a="property",r.startsWith("?")&&(r=r.substring(1),c="??")),s.push({service:this,name:r,itemType:a,designItem:e,type:"binding",sourceObject:n,display:n.target+"/"+n.targetName,prefix:c})}}return s}refactor(t,s,e){let i=t.sourceObject;t.shortName?i.bindableObjectNames=i.bindableObjectNames.map(n=>n==t.shortName+":"+t.prefix+s?t.shortName+":"+t.prefix+e:n):i.bindableObjectNames=i.bindableObjectNames.map(n=>n==t.prefix+s?t.prefix+e:n),t.designItem.serviceContainer.bindingService.setBinding(t.designItem,i)}};var We=class{dragOverOnProperty(t,s,e){return"copy"}dropOnProperty(t,s,e,i){s.service.setValue(i,s,e.text)}};import{BindingTarget as x}from"@node-projects/web-component-designer";var Me=class{getRefactorings(t){let s=[];for(let e of t)for(let i of e.attributes())if(i[0][0]=="@"){let n=i[1];if(n[0]=="{"){let r=JSON.parse(n);if("commands"in r)for(let a of r.commands){for(let c in a){let o=a[c];if(o!=null&&typeof o=="object"){let p=o;if(p.source==="signal")s.push({name:p.name,itemType:"signal",target:x.event,targetName:i[0],service:this,designItem:e,type:"script",sourceObject:r,display:a.type+"/"+i[0].substring(1)+"/"+c+"[signal]",refactor:h=>p.name=h});else if(p.source==="property")s.push({name:p.name,itemType:"property",target:x.event,targetName:i[0],service:this,designItem:e,type:"script",sourceObject:r,display:a.type+"/"+i[0].substring(1)+"/"+c+"[property]",refactor:h=>p.name=h});else if(p.source==="complexString")for(let h of p.name.matchAll(/\{(.*?)\}/g)){let m=h[0],u=h[1];if(u[0]==="?"){let d="?";u=u.substring(1),u[0]==="?"&&(d="??",u=u.substring(1)),s.push({name:u,itemType:"property",target:x.event,targetName:i[0],service:this,designItem:e,type:"script",sourceObject:r,display:a.type+"/"+i[0].substring(1)+"/"+c+"[complexString]->property",refactor:g=>p.name=p.name.replace(m,"{"+d+g+"}")})}else s.push({name:u,itemType:"signal",target:x.event,targetName:i[0],service:this,designItem:e,type:"script",sourceObject:r,display:a.type+"/"+i[0].substring(1)+"/"+c+"[complexString]->signal",refactor:d=>p.name=p.name.replace(m,"{"+d+"}")})}}}switch(a.type){case"SetSignalValue":a.signal&&typeof a.signal=="string"&&s.push({name:a.signal,itemType:"signal",target:x.event,targetName:i[0],display:a.type+"/"+i[0].substring(1)+"/signal",service:this,designItem:e,type:"script",sourceObject:r,refactor:c=>a.signal=c});break;case"ToggleSignalValue":a.signal&&typeof a.signal=="string"&&s.push({name:a.signal,itemType:"signal",target:x.event,targetName:i[0],display:a.type+"/"+i[0].substring(1)+"/signal",service:this,designItem:e,type:"script",sourceObject:r,refactor:c=>a.signal=c});break;case"IncrementSignalValue":a.signal&&typeof a.signal=="string"&&s.push({name:a.signal,itemType:"signal",target:x.event,targetName:i[0],display:a.type+"/"+i[0].substring(1)+"/signal",service:this,designItem:e,type:"script",sourceObject:r,refactor:c=>a.signal=c});break;case"DecrementSignalValue":a.signal&&typeof a.signal=="string"&&s.push({name:a.signal,itemType:"signal",target:x.event,targetName:i[0],display:a.type+"/"+i[0].substring(1)+"/signal",service:this,designItem:e,type:"script",sourceObject:r,refactor:c=>a.signal=c});break;case"SetBitInSignal":a.signal&&typeof a.signal=="string"&&s.push({name:a.signal,itemType:"signal",target:x.event,targetName:i[0],display:a.type+"/"+i[0].substring(1)+"/signal",service:this,designItem:e,type:"script",sourceObject:r,refactor:c=>a.signal=c});break;case"ClearBitInSignal":a.signal&&typeof a.signal=="string"&&s.push({name:a.signal,itemType:"signal",target:x.event,targetName:i[0],display:a.type+"/"+i[0].substring(1)+"/signal",service:this,designItem:e,type:"script",sourceObject:r,refactor:c=>a.signal=c});break;case"ToggleBitInSignal":a.signal&&typeof a.signal=="string"&&s.push({name:a.signal,itemType:"signal",target:x.event,targetName:i[0],display:a.type+"/"+i[0].substring(1)+"/signal",service:this,designItem:e,type:"script",sourceObject:r,refactor:c=>a.signal=c});break;case"OpenScreen":a.screen&&typeof a.screen=="string"&&s.push({name:a.screen,itemType:"screen",target:x.event,targetName:i[0],display:a.type+"/"+i[0].substring(1)+"/screen",service:this,designItem:e,type:"script",sourceObject:r,refactor:c=>a.screen=c});break;case"OpenDialog":a.screen&&typeof a.screen=="string"&&s.push({name:a.screen,itemType:"screen",target:x.event,targetName:i[0],display:a.type+"/"+i[0].substring(1)+"/screen",service:this,designItem:e,type:"script",sourceObject:r,refactor:c=>a.screen=c});break;case"CalculateSignalValue":a.targetSignal&&typeof a.targetSignal=="string"&&s.push({name:a.targetSignal,itemType:"signal",target:x.event,targetName:i[0],display:a.type+"/"+i[0].substring(1)+"/targetSignal",service:this,designItem:e,type:"script",sourceObject:r,refactor:c=>a.targetSignal=c});break;case"SubscribeSignal":a.signal&&typeof a.signal=="string"&&s.push({name:a.signal,itemType:"signal",target:x.event,targetName:i[0],display:a.type+"/"+i[0].substring(1)+"/signal",service:this,designItem:e,type:"script",sourceObject:r,refactor:c=>a.signal=c});break;case"UnsubscribeSignal":a.signal&&typeof a.signal=="string"&&s.push({name:a.signal,itemType:"signal",target:x.event,targetName:i[0],display:a.type+"/"+i[0].substring(1)+"/signal",service:this,designItem:e,type:"script",sourceObject:r,refactor:c=>a.signal=c});break;case"ShowMessageBox":a.resultSignal&&typeof a.resultSignal=="string"&&s.push({name:a.resultSignal,itemType:"signal",target:x.event,targetName:i[0],display:a.type+"/"+i[0].substring(1)+"/resultSignal",service:this,designItem:e,type:"script",sourceObject:r,refactor:c=>a.resultSignal=c});break}}else"blocks"in r;if("parameters"in r)for(let a in r.parameters)typeof r.parameters[a]=="string"&&s.push({name:r.parameters[a],itemType:"parameter",target:x.event,targetName:i[0],service:this,designItem:e,type:"script",sourceObject:r,display:i[0].substring(1)+"/parameters/"+a,refactor:c=>r.parameters[a]=c})}}return s}refactor(t,s,e){t.refactor(e);let i=JSON.stringify(t.sourceObject);t.designItem.setAttribute(t.targetName,i)}};import{BasePropertyEditor as At}from"@node-projects/web-component-designer";var Pe=class extends At{_ip;_container;constructor(t,s){super(t),this._container=document.createElement("div"),this._container.style.display="flex",this._ip=document.createElement("input"),this._ip.onchange=i=>this._valueChanged(this._ip.value),this._ip.onfocus=i=>{this._ip.selectionStart=0,this._ip.selectionEnd=this._ip.value?.length},this._container.appendChild(this._ip);let e=document.createElement("button");e.textContent="...",e.onclick=async()=>{let i=s.createBindableObjectBrowser();i.initialize(this.designItems[0].serviceContainer,this.designItems[0].instanceServiceContainer,"property"),i.title="select signal...";let n=new AbortController;i.objectDoubleclicked.on(()=>{n.abort(),this._ip.value=i.selectedObject.fullName,this._valueChanged(this._ip.value)}),await s.openConfirmation(i,{x:100,y:100,width:400,height:300,abortSignal:n.signal})&&(this._ip.value=i.selectedObject.fullName,this._valueChanged(this._ip.value))},this._container.appendChild(e),this.element=this._container}refreshValue(t,s){s==null?this._ip.value="":this._ip.value=s}};import{EventsService as zt}from"@node-projects/web-component-designer";var Fe=class l extends zt{static _cyclicEvent=[{name:`${se}:100`,propertyName:void 0,eventObjectName:"Event",description:"this event will retrigger itself every 100 ms"}];getPossibleEvents(t){let s=super.getPossibleEvents(t);return s.push(...l._cyclicEvent),s}getEvent(t,s){return s.includes(se)?l._cyclicEvent.find(i=>i.name==s)??{name:s,propertyName:"on"+s,eventObjectName:"Event"}:super.getEvent(t,s)}};export{ze as BindableObjectDragDropService,Q as BindingsEditor,z as BindingsEditorHistoric,Oe as BindingsHelper,A as BlocklyScriptEditor,ee as EventAssignment,M as ParameterEditor,We as PropertyGridDragDropService,Ve as Script,Me as ScriptRefactorService,Ae as ScriptSystem,Pe as SignalPropertyEditor,L as SimpleScriptCommandPicker,W as SimpleScriptEditor,je as VisualizationBindingsRefactorService,De as VisualizationBindingsService,Fe as VisualizationEventsService,q as VisualizationPropertyGrid,P as bindingPrefixAttribute,F as bindingPrefixClass,T as bindingPrefixContent,H as bindingPrefixCss,J as bindingPrefixCssVar,Et as bindingPrefixInsideCss,Nt as bindingPrefixInsideCssVarName,I as bindingPrefixProperty,he as bindingPrefixVisible,qs as bindingsInCssRegex,se as cyclicAttributeName,ve as generateEventCodeFromBlockly,te as getNestedProperty,X as isLit,ke as nativeScriptCommandDescriptions,ge as parseBindingString,Se as simpleScriptEditorHelpHtml};
|
|
1293
1293
|
//!varname => inverted
|
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": "0.1.
|
|
4
|
+
"version": "0.1.150",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
7
7
|
"author": "jochen.kuehner@gmx.de",
|
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
"bundle": "esbuild ./dist/index.js --format=esm --minify --external:@node-projects/css-parser --external:@blockly/* --external:blockly --external:long --external:wunderbaum --external:@node-projects/* --platform=neutral --bundle --outfile=./dist/index-min.js"
|
|
15
15
|
},
|
|
16
16
|
"dependencies": {
|
|
17
|
-
"@blockly/zoom-to-fit": ">=13.
|
|
17
|
+
"@blockly/zoom-to-fit": ">=13.2.0",
|
|
18
18
|
"@node-projects/base-custom-webcomponent": ">=0.27.8",
|
|
19
19
|
"@node-projects/css-parser": "^5.2.0",
|
|
20
20
|
"@node-projects/propertygrid.webcomponent": ">=1.2.3",
|
|
@@ -22,7 +22,7 @@
|
|
|
22
22
|
"@node-projects/web-component-designer": ">=0.1.224",
|
|
23
23
|
"@node-projects/web-component-designer-codeview-monaco": ">=0.1.32",
|
|
24
24
|
"@node-projects/web-component-designer-widgets-wunderbaum": ">=0.1.29",
|
|
25
|
-
"blockly": ">=13.
|
|
25
|
+
"blockly": ">=13.2.1",
|
|
26
26
|
"long": ">=5.2.3"
|
|
27
27
|
},
|
|
28
28
|
"devDependencies": {
|