@gregoriusrippenstein/node-red-contrib-introspection 0.12.9 → 0.15.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +21 -0
- package/nodes/60-client-code.html +1 -1
- package/nodes/60-client-code.js +1 -0
- package/package.json +1 -1
- package/plugins/sidebar.html +397 -18
package/README.md
CHANGED
|
@@ -17,6 +17,17 @@ Sometimes I found myself having extremely complex flows, flows that went over mu
|
|
|
17
17
|
For an introduction to these nodes, check out the [introduction screencasts](https://blog.openmindmap.org/blog/introspection).
|
|
18
18
|
|
|
19
19
|
|
|
20
|
+
## Sidebar Update for Node-RED Version 5
|
|
21
|
+
|
|
22
|
+
As Node-RED v5 introduces better sidebar management, there are now four separate sidebars definded by this package:
|
|
23
|
+
|
|
24
|
+
- **Introspection Capture** for generating SVG images from flows
|
|
25
|
+
- **Introspection MsgTrace** for message tracing
|
|
26
|
+
- **Introspection Obfuscation** for export flows as obfuscated blobs
|
|
27
|
+
- **Introspection Lint** for analysing flows
|
|
28
|
+
|
|
29
|
+
Node-RED version 4 still just as one sidebar with three tabs.
|
|
30
|
+
|
|
20
31
|
## Sidebar Nodes
|
|
21
32
|
|
|
22
33
|
There is no need nor requirement to deploy these nodes. Which implies that they also work in read-only mode of Node-RED. Since these nodes only provide information and make no changes, this should not be an issue.
|
|
@@ -136,6 +147,16 @@ This is something that I can not say strenuously enough!!! It is all too easy, i
|
|
|
136
147
|
|
|
137
148
|
That's also another thing that I've noticed: sometimes I would leavethe message tracing on for too long, and only I realize that once the editor got flooded. That is also simpler in Node-RED 5.x because you can keep that panel open while switching between the debug nodes. This is what always happened to me because I switched between the debug and the message tracer panel and then forgot that I left the tracing on, as I had headed off to the debug panel. So in Node-RED 5, that's a little bit nicer because you can keep that panel with the message tracing open and then switch off tracing as needed.
|
|
138
149
|
|
|
150
|
+
### Message Tracing Fail Safe
|
|
151
|
+
|
|
152
|
+

|
|
153
|
+
|
|
154
|
+
Because of the risk to freezing the editor, a fail safe in message generation has been added.
|
|
155
|
+
|
|
156
|
+
If the message tracing detects more than 100 messages per second, then the message tracing is deactivated automatically. One hundred messages per second is a default value and can be modifed in the browser console using `window.msgTracer_MAX_MSG_PER_SECOND = 100`.
|
|
157
|
+
|
|
158
|
+
Message counts include the debug message generated and the message tracing shown in the sidebar.
|
|
159
|
+
|
|
139
160
|
## Palette Nodes
|
|
140
161
|
|
|
141
162
|
### Sink & Seeker
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
<script type="text/javascript">
|
|
2
2
|
|
|
3
|
-
function handleMsgTracePacket(e,
|
|
3
|
+
function handleMsgTracePacket(e,a){if(a.nodeid){let t=RED.nodes.node(a.nodeid);if(t){var s,a=$("#node-input-msgtracer-trace-treelist").treeList("data");let r=!1;a.forEach(e=>{e.id==t.id&&(r=!0,e.seenCounter+=1,e.sublabel=e.seenCounter+" @ "+e.workspaceLabel)}),r?$("#node-input-msgtracer-trace-treelist").treeList("data",a):(s={id:t.id,label:"",_label:RED.utils.getNodeLabel(t),seenCounter:1,workspaceLabel:(RED.nodes.workspace(t.z)||{label:t.z}).label,sublabel:"1 @ "+(RED.nodes.workspace(t.z)||{label:t.z}).label,selected:!1,checkbox:!1,node:t,icon:RED.utils.createNodeIcon(t,!0)},$("#node-input-msgtracer-trace-treelist").treeList("data",[s,...a]))}}}RED.comms.subscribe("msgtracer:node-received",(e,r)=>{try{handleMsgTracePacket(e,r)}catch(e){console.error(e)}}),RED.comms.subscribe("msgtracer:node-received",(e,r)=>{window.msgTracerCounter||=0,window.msgTracerCounter+=1}),RED.comms.subscribe("msgtracer:debug-sent",(e,r)=>{window.msgTracerCounter||=0,window.msgTracerCounter+=1});
|
|
4
4
|
|
|
5
5
|
function handleClientCodeFrontend(event,data){if("execfunc"==data.msg){let doSend=(e,d,t)=>{"object"==typeof e&&(e={...t,...e}),$.ajax({url:"ClientCode/"+d,type:"POST",contentType:"application/json; charset=utf-8",data:JSON.stringify(e),success:function(e){},error:function(e,t,o){RED.notify("ClientCode Communcation Failure: "+d+": "+t,{type:"error",id:d,timeout:3e3})}})},doStatus=(e,d,t)=>{$.ajax({url:"ClientCode/"+d+"/status",type:"POST",contentType:"application/json; charset=utf-8",data:JSON.stringify(e),success:function(e){},error:function(e,t,o){RED.notify("ClientCode Communcation Failure: "+d+": "+t,{type:"error",id:d,timeout:3e3})}})},doError=(e,t,o)=>{RED.notify("ClientCode Failed: "+t+": "+e,{type:"error",id:t,timeout:3e3}),console.log("ClientCode: Error with node: "+t+": "+e)},nodeid=data.nodeid,_msg=data._msg,msg=data._msg??{},cfg=data._cfg,node={id:data.nodeid,sendMsg:e=>{doSend(e,nodeid,{_msgid:RED.nodes.id()})},send:e=>{doSend(e,nodeid,_msg)},error:e=>{doError(e,nodeid,_msg)},status:e=>{doStatus(e,nodeid,_msg)}},payload=data.payload,topic=data.topic;eval(data.func)}}RED.comms.subscribe("introspect:client-code-perform",(e,t)=>{try{handleClientCodeFrontend(e,t)}catch(e){console.error(e)}});
|
|
6
6
|
|
package/nodes/60-client-code.js
CHANGED
package/package.json
CHANGED
package/plugins/sidebar.html
CHANGED
|
@@ -14,12 +14,49 @@
|
|
|
14
14
|
|
|
15
15
|
function setupTreelistAllLinksForLinkIn(e){e=collectAllLinksNodes(e);if(0==e.length){RED.notify("No links found",{type:"error",timeout:2e3});try{$("#node-input-orphan-target-container-div").treeList("empty")}catch(e){}}else{try{$("#node-input-orphan-target-container-div").treeList("empty")}catch(e){$("#node-input-orphan-target-container-div").css({width:"100%",height:"calc(100%)"}).treeList({multi:!1}).on("treelistitemmouseover",function(e,t){}).on("treelistitemmouseout",function(e,t){}).on("treelistselect",function(e,t){t.node&&(RED.workspaces.show(t.node.z,!1,!1,!0),RED.view.reveal(t.node.id,!0),RED.view.redraw())}).on("treelistconfirm",function(e,t){var n;t.node&&(n=t.node.id,setTimeout(()=>{var e=RED.nodes.node(n);e&&(RED.view.reveal(e.id),RED.view.select(e.id),RED.editor.edit(e,"editor-tab-description")),n==RED.workspaces.active()&&RED.workspaces.edit()},50))}),$("#node-input-orphan-target-filter").show();var n=$("#node-input-orphan-target-filter").searchBox({style:"compact",delay:300,change:function(){var e,t=$(this).val().trim().toLowerCase();""===t?($("#node-input-orphan-target-container-div").treeList("filter",null),n.searchBox("count","")):(e=$("#node-input-orphan-target-container-div").treeList("filter",function(e){return-1<e.label.toLowerCase().indexOf(t)||-1<e.node.type.toLowerCase().indexOf(t)}),n.searchBox("count",e+" / "+$("#node-input-orphan-target-container-div").treeList("data").length))}})}$("#node-input-orphan-target-container-div").treeList("data",e.sort((e,t)=>e.node.z>t.node.z))}}function collectAllLinksNodes(t){let n=[];RED.nodes.eachNode(e=>{"link call"!=e.type&&"link out"!=e.type||-1<e.links.indexOf(t)&&n.push(e)});var i=[],r={};return n.forEach(function(e){var t=RED.nodes.getType(e.type);if(t){var n,o=t.label,o=("function"==typeof o?o.call(e):o)||"";if(0===(n=e.type).indexOf("subflow:"))return}t&&o||(o=e.type),r[e.id]={node:e,label:o,sublabel:n,selected:!1,checkbox:!1},i.push(r[e.id])}),i}function collectNodeStats(){let t={},n=[],o={workspaces:0,junctions:0,subflows:0,configs:0,groups:0,wires:0,nodes:0},i=(RED.nodes.eachConfig(e=>{o.configs+=1}),RED.nodes.eachLink(e=>{o.wires+=1}),RED.nodes.eachJunction(e=>{o.junctions+=1}),RED.nodes.eachGroup(e=>{o.groups+=1}),RED.nodes.eachWorkspace(e=>{o.workspaces+=1}),RED.nodes.eachSubflow(e=>{o.subflows+=1}),RED.nodes.eachNode(e=>{o.nodes+=1,t[e.type]=(t[e.type]||0)+1}),Object.keys(t).forEach(e=>{n.push({label:e,sublabel:t[e],selected:!1,checkbox:!1})}),[]),r=0;return Object.keys(o).forEach(e=>{r+=o[e],i.push({label:e,sublabel:o[e],selected:!1,checkbox:!1})}),[{label:"__ TOTALS",sublabel:r,selected:!1,checkbox:!1,children:i}].concat(n.sort((e,t)=>e.label>t.label))}function setupTreeListForNodeStats(){var e=collectNodeStats();try{$("#node-input-orphan-target-container-div").treeList("empty")}catch(e){$("#node-input-orphan-target-container-div").css({width:"100%",height:"calc(100%)"}).treeList({multi:!1}).on("treelistitemmouseover",function(e,t){}).on("treelistitemmouseout",function(e,t){}).on("treelistselect",function(e,t){}).on("treelistconfirm",function(e,t){}),$("#node-input-orphan-target-filter").show();var n=$("#node-input-orphan-target-filter").searchBox({style:"compact",delay:300,change:function(){var e,t=$(this).val().trim().toLowerCase();""===t?($("#node-input-orphan-target-container-div").treeList("filter",null),n.searchBox("count","")):(e=$("#node-input-orphan-target-container-div").treeList("filter",function(e){return-1<e.label.toLowerCase().indexOf(t)}),n.searchBox("count",e+" / "+$("#node-input-orphan-target-container-div").treeList("data").length))}})}$("#node-input-orphan-target-container-div").treeList("data",e)}
|
|
16
16
|
|
|
17
|
-
function setupTreeMsgTracerlist(){try{$("#node-input-msgtracer-trace-treelist").treeList("empty"),$("#node-input-msgtracer-trace-treelist").treeList("data",[])}catch(e){$("#node-input-msgtracer-trace-treelist").css({width:"100%",height:"calc(100%)"}).treeList({multi:!1}).on("treelistitemmouseover",function(e,t){t.node&&RED.workspaces.active()==t.node.z&&(RED.view.reveal(t.node.id,!0),RED.view.redraw())}).on("treelistitemmouseout",function(e,t){}).on("treelistselect",function(e,t){t.node&&(RED.workspaces.show(t.node.z,!1,!1,!0),RED.view.reveal(t.node.id,!0),RED.view.redraw(),$(".red-ui-debug-msg").css("background-color",""),$(".red-ui-debug-msg-node-"+t.node.id).css("background-color","red"))}).on("treelistconfirm",function(e,t){var
|
|
17
|
+
function setupTreeMsgTracerlist(){try{$("#node-input-msgtracer-trace-treelist").treeList("empty"),$("#node-input-msgtracer-trace-treelist").treeList("data",[])}catch(e){$("#node-input-msgtracer-trace-treelist").css({width:"100%",height:"calc(100%)"}).treeList({multi:!1}).on("treelistitemmouseover",function(e,t){t.node&&RED.workspaces.active()==t.node.z&&(RED.view.reveal(t.node.id,!0),RED.view.redraw())}).on("treelistitemmouseout",function(e,t){}).on("treelistselect",function(e,t){t.node&&(RED.workspaces.show(t.node.z,!1,!1,!0),RED.view.reveal(t.node.id,!0),RED.view.redraw(),$(".red-ui-debug-msg").css("background-color",""),$(".red-ui-debug-msg-node-"+t.node.id).css("background-color","red"))}).on("treelistconfirm",function(e,t){var r;t.node&&(r=t.node.id,setTimeout(()=>{var e=RED.nodes.node(r);e&&(RED.view.reveal(e.id),RED.view.select(e.id),RED.editor.edit(e)),r==RED.workspaces.active()&&RED.workspaces.edit()},50))}),$("#node-input-msgtracer-trace-treelist-filter").show();var r=$("#node-input-msgtracer-trace-treelist-filter").searchBox({style:"compact",delay:300,change:function(){var e,t=$(this).val().trim().toLowerCase();""===t?($("#node-input-msgtracer-trace-treelist").treeList("filter",null),r.searchBox("count","")):(e=$("#node-input-msgtracer-trace-treelist").treeList("filter",function(e){return-1<e._label.toLowerCase().indexOf(t)||-1<e.node.type.toLowerCase().indexOf(t)||-1<e.node.id.toLowerCase().indexOf(t)||-1<e.sublabel.toLowerCase().indexOf(t)}),r.searchBox("count",e+" / "+$("#node-input-msgtracer-trace-treelist").treeList("data").length))}})}}function msgTracerDebugOff(){$.ajax({url:"MsgTracer/debug/off",type:"POST",contentType:"application/json; charset=utf-8",data:JSON.stringify({}),success:function(e){},error:function(e,t,r){}})}function msgTracerTracingOff(){$.ajax({url:"MsgTracer/msgtracing/off",type:"POST",contentType:"application/json; charset=utf-8",data:JSON.stringify({}),success:function(e){},error:function(e,t,r){}})}function uncheckAllTracing(){$("#node-input-msgtracer-toggle-all").prop("checked",!1),$("#node-input-msgtracer-toggle").prop("checked",!1),$("#node-input-msgtracer-msgtodebug").prop("checked",!1),$("#node-input-msgtracer-msgtodebug-all").prop("checked",!1)}function setupFailsafe(){clearInterval(window.msgTracerInterval),window.msgTracerCounter=0,window.msgTracerInterval=setInterval(()=>{window.msgTracerCounter>window.msgTracer_MAX_MSG_PER_SECOND&&(RED.notify("Message tracing flooding detected, deactivating tracing automatically.",{type:"error",timeout:3e3}),uncheckAllTracing(),msgTracerDebugOff(),msgTracerTracingOff(),clearInterval(window.msgTracerInterval)),window.msgTracerCounter=0},1e3)}function setupFailsafeForClampMode(){clearInterval(window.msgTracerInterval),window.msgTracerCounter=0,window.msgTracerInterval=setInterval(()=>{window.msgTracerCounter>window.msgTracer_MAX_MSG_PER_SECOND&&(RED.notify("Message tracing flooding detected, deactivating tracing automatically.",{type:"error",timeout:3e3}),RED.view.select([]),uncheckAllTracing(),$("#node-input-msgtracer-clamp-mode-with-debug").prop("checked",!1),$("#node-input-msgtracer-clamp-mode-with-debug").prop("disabled",!1),$("#node-input-msgtracer-clamp-mode-status").hide(),$("#node-input-msgtracer-clamp-mode").prop("checked",!1),msgTracerDebugOff(),msgTracerTracingOff(),clearInterval(window.msgTracerInterval)),window.msgTracerCounter=0},1e3)}function toggleClampWithDebug(e){$("#node-input-msgtracer-clamp-mode-with-debug").is(":checked")||(msgTracerDebugOff(),$("#node-input-msgtracer-clamp-mode").is(":checked")&&$("#node-input-msgtracer-clamp-mode-with-debug").prop("disabled",!0))}function toggleClampWireTappingInBackend(e){if($("#node-input-msgtracer-clamp-mode").is(":checked")){$("#node-input-msgtracer-clamp-mode-with-debug").is("checked")||$("#node-input-msgtracer-clamp-mode-with-debug").prop("disabled",!0);let o=e=>{var t,r,n=t=>{uncheckAllTracing(),$.ajax({url:"MsgTracer/msgtracing/off",type:"POST",contentType:"application/json; charset=utf-8",data:JSON.stringify({}),error:function(e,t,r){},success:function(e){$.ajax({url:"MsgTracer/msgtracing/on",type:"POST",contentType:"application/json; charset=utf-8",data:JSON.stringify({nodesSelected:t,allIsOn:!1}),error:function(e,t,r){},success:function(e){setupFailsafeForClampMode(),$("#node-input-msgtracer-clamp-mode-with-debug").is(":checked")?$.ajax({url:"MsgTracer/debug/on",type:"POST",contentType:"application/json; charset=utf-8",data:JSON.stringify({nodesSelected:t,allIsOn:!1}),success:function(e){},error:function(e,t,r){}}):($("#node-input-msgtracer-clamp-mode-with-debug").prop("disabled",!0),msgTracerDebugOff())}})}})};$("#node-input-msgtracer-clamp-mode").is(":checked")?(t=RED.view.selection()).links&&1==t.links.length?(r=[(r=RED.view.selection().links[0]).source.id,r.target.id],setupTreeMsgTracerlist(),n(r),$("#node-input-msgtracer-clamp-mode-status").show()):t.nodes&&0<t.nodes.length?(setupTreeMsgTracerlist(),n(t.nodes.map(e=>e.id)),$("#node-input-msgtracer-clamp-mode-status").show()):($("#node-input-msgtracer-clamp-mode-status").hide(),msgTracerTracingOff(),msgTracerDebugOff()):($("#node-input-msgtracer-clamp-mode-with-debug").prop("disabled",!1),clearInterval(window.msgTracerInterval),RED.events.off("view:selection-changed",o),$("#node-input-msgtracer-clamp-mode-status").hide())};RED.events.on("view:selection-changed",o)}else $("#node-input-msgtracer-clamp-mode-status").hide(),$("#node-input-msgtracer-clamp-mode-with-debug").prop("disabled",!1),msgTracerTracingOff(),msgTracerDebugOff()}function toggleDebugTracingInBackend(e){let t=$("#node-input-msgtracer-msgtodebug").is(":checked");var r=$("#node-input-msgtracer-msgtodebug-all").is(":checked"),n=RED.view.selection().nodes;clearInterval(window.msgTracerInterval),n||r||!t?n&&0<n.length&&r&&t?($("#node-input-msgtracer-msgtodebug").prop("checked",!1),$("#node-input-msgtracer-msgtodebug-all").prop("checked",!1),msgTracerDebugOff(),RED.notify("Debug Messages not toggled, both nodes selected and all nodes is on.",{type:"error",timeout:3e3})):(t?($("#node-input-msgtracer-clamp-mode-with-debug").prop("checked",!1),$("#node-input-msgtracer-clamp-mode").prop("checked",!1),toggleClampWireTappingInBackend()):$("#node-input-msgtracer-msgtodebug-all").prop("checked",!1),$.ajax({url:"MsgTracer/debug/"+(t?"on":"off"),type:"POST",contentType:"application/json; charset=utf-8",data:JSON.stringify({nodesSelected:selectionToNodeIdList(RED.view.selection().nodes),allIsOn:r}),success:function(e){RED.notify("Message debugging is <b>"+(t?"on":"off")+"</b>",{type:"success",timeout:3e3}),t&&setupFailsafe()},error:function(e,t,r){RED.notify("Message tracing failed: "+t,{type:"error",timeout:3e3})}})):($("#node-input-msgtracer-msgtodebug").prop("checked",!1),msgTracerDebugOff(),RED.notify("Debug Messages not toggled, first select nodes to be debugged <b>or</b> toggle 'all nodes' to on.",{type:"error",timeout:3e3}))}function toggleMsgTracingInBackend(e){let t=$("#node-input-msgtracer-toggle").is(":checked");var r=$("#node-input-msgtracer-toggle-all").is(":checked"),n=RED.view.selection().nodes;clearInterval(window.msgTracerInterval),n||r||!t?n&&0<n.length&&r&&t?($("#node-input-msgtracer-toggle-all").prop("checked",!1),$("#node-input-msgtracer-toggle").prop("checked",!1),msgTracerTracingOff(),RED.notify("Message tracing not toggled, nodes are selected <b>and</b> all nodes is checked.",{type:"error",timeout:3e3})):(t?($("#node-input-msgtracer-clamp-mode-with-debug").prop("checked",!1),$("#node-input-msgtracer-clamp-mode").prop("checked",!1),toggleClampWireTappingInBackend()):$("#node-input-msgtracer-toggle-all").prop("checked",!1),t&&setupTreeMsgTracerlist(),$.ajax({url:"MsgTracer/msgtracing/"+(t?"on":"off"),type:"POST",contentType:"application/json; charset=utf-8",data:JSON.stringify({nodesSelected:selectionToNodeIdList(RED.view.selection().nodes),allIsOn:r}),success:function(e){RED.notify("Message tracing is <b>"+(t?"on":"off")+"</b>",{type:"success",timeout:3e3}),t&&setupFailsafe()},error:function(e,t,r){RED.notify("Message tracing failed: "+t,{type:"error",timeout:3e3})}})):($("#node-input-msgtracer-toggle").prop("checked",!1),msgTracerTracingOff(),RED.notify("Message tracing not toggled, first select nodes to be traced <b>or</b> toggle 'all nodes' to on.",{type:"error",timeout:3e3}))}function selectionToNodeIdList(e){return!e||Array.isArray(e)&&0==e.length?[]:e.map(e=>"group"==e.type?selectionToNodeIdList(RED.nodes.group(e.id).nodes):e.id).flat(1/0)}window.msgTracer_MAX_MSG_PER_SECOND=100;
|
|
18
18
|
|
|
19
19
|
function transformInjectToChangeNode(t){t&&t.preventDefault();t=[...(RED.view.selection().nodes||[]).filter(e=>"inject"==e.type),...(RED.view.selection().nodes||[]).filter(e=>"group"==e.type).map(e=>e.nodes.filter(e=>"inject"==e.type))].flat();if(0==(t=RED.nodes.createExportableNodeSet(t)).length)RED.notify("No inject nodes found in node selection",{type:"warning"});else{let e=t.map(o=>{var e={id:RED.nodes.id(),type:"change",name:o.name,action:"",property:"",from:"",to:"",reg:!1,x:0,y:0,wires:[[]]};return e.rules=o.props.map(e=>{var t={t:"set",p:e.p,pt:"msg",to:e.v,tot:e.vt};return"payload"==e.p?(t.to=o.payload,t.tot=o.payloadType):"topic"==e.p&&(t.to=o.topic),t}),e});setTimeout(()=>{RED.clipboard.import(),setTimeout(()=>{$("#red-ui-clipboard-dialog-import-text").val(JSON.stringify(e)).trigger("paste")},300)},400)}}
|
|
20
20
|
|
|
21
|
-
//
|
|
22
|
-
|
|
21
|
+
// used to feature deactivate stuff
|
|
22
|
+
let isNodeRedFive = () => {
|
|
23
|
+
return RED.settings.version.split(".")[0] == "5"
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
let sidebarInitNRv5 = () => {
|
|
27
|
+
[
|
|
28
|
+
["MsgTrace", "fa-eyedropper"],
|
|
29
|
+
["Obfuscation", "fa-user-secret"],
|
|
30
|
+
["Lint", "fa-magic"],
|
|
31
|
+
["Capture", "fa-camera"],
|
|
32
|
+
].forEach((d) => {
|
|
33
|
+
RED.sidebar.addTab({
|
|
34
|
+
id: `Introspection${d[0]}`,
|
|
35
|
+
label: `intro-${d[0]}`, // short name for the tab
|
|
36
|
+
name: `Introspection ${d[0]}`, // long name for the menu
|
|
37
|
+
content: $($(`script[type="text/x-red"][data-template-name="ScreenshotSidebar${d[0]}"]`).i18n().html()),
|
|
38
|
+
closeable: true,
|
|
39
|
+
enableOnEdit: true,
|
|
40
|
+
iconClass: `fa ${d[1]}`,
|
|
41
|
+
onchange: () => {
|
|
42
|
+
setTimeout(() => { RED.events.emit(`introspection:onchange-${d[0].toLowerCase() }`) }, 150)
|
|
43
|
+
}
|
|
44
|
+
});
|
|
45
|
+
})
|
|
46
|
+
|
|
47
|
+
RED.events.on("sidebar:resize", (d) => {
|
|
48
|
+
let containerHeight = $('#node-input-msgtracer-trace-treelist').parents('.red-ui-sidebar-content').height()
|
|
49
|
+
$('#node-input-msgtracer-trace-treelist').parent().css("height", `calc(${containerHeight}px - 20vh)`)
|
|
50
|
+
|
|
51
|
+
containerHeight = $('#node-input-orphan-target-container-div').parents('.red-ui-sidebar-content').height()
|
|
52
|
+
$('#node-input-orphan-target-container-div').parent().css('height', `calc(${containerHeight}px - 13vh)`)
|
|
53
|
+
|
|
54
|
+
containerHeight = $('#node-input-screenshot-svgcontainer').parents('.red-ui-sidebar-content').height()
|
|
55
|
+
$('#node-input-screenshot-svgcontainer').parent().css('height', `calc(${containerHeight}px - 20vh)`)
|
|
56
|
+
})
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
let sidebarInitNRv4 = () => {
|
|
23
60
|
// The html content of the sidebar has been specified below as a data-template, from where it can be loaded:
|
|
24
61
|
var content = $($('script[type="text/x-red"][data-template-name="Screenshot"]').i18n().html());
|
|
25
62
|
|
|
@@ -63,9 +100,22 @@
|
|
|
63
100
|
label: 'Obfuscation'
|
|
64
101
|
});
|
|
65
102
|
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
103
|
+
RED.panels.create({
|
|
104
|
+
id: 'func-introspection-tab-lint',
|
|
105
|
+
resize: (topSze,botSze) => {
|
|
106
|
+
$('#node-input-msgtracer-trace-treelist').parent().css("height", `calc(${botSze}px - 13vh)`)
|
|
107
|
+
$('#node-input-orphan-target-container-div').parent().css('height', `calc(${topSze}px - 15vh)`)
|
|
108
|
+
}
|
|
109
|
+
})
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
// Add your plugin as a new tabsheet in the right sidebar AFTER the flow editor is completely started
|
|
113
|
+
var setupSidebarForIntrospection = () => {
|
|
114
|
+
|
|
115
|
+
if (isNodeRedFive()) {
|
|
116
|
+
sidebarInitNRv5()
|
|
117
|
+
} else {
|
|
118
|
+
sidebarInitNRv4()
|
|
69
119
|
}
|
|
70
120
|
|
|
71
121
|
let callObfuscatieCurrentFlow = (copy_or_import) => {
|
|
@@ -204,7 +254,6 @@
|
|
|
204
254
|
};
|
|
205
255
|
},
|
|
206
256
|
});
|
|
207
|
-
|
|
208
257
|
})
|
|
209
258
|
|
|
210
259
|
// handle the download button under the editor window.
|
|
@@ -318,15 +367,7 @@
|
|
|
318
367
|
if ( e ) { e.preventDefault() }
|
|
319
368
|
setupTreeListForNodeStats()
|
|
320
369
|
})
|
|
321
|
-
|
|
322
|
-
RED.panels.create({
|
|
323
|
-
id: 'func-introspection-tab-lint',
|
|
324
|
-
resize: (topSze,botSze) => {
|
|
325
|
-
$('#node-input-msgtracer-trace-treelist').parent().css("height", `calc(${botSze}px - 13vh)`)
|
|
326
|
-
$('#node-input-orphan-target-container-div').parent().css('height', `calc(${topSze}px - 15vh)`)
|
|
327
|
-
}
|
|
328
|
-
})
|
|
329
|
-
|
|
370
|
+
|
|
330
371
|
// RED.debug isn't yet available
|
|
331
372
|
let fillInSiderBarForm = () => {
|
|
332
373
|
RED.events.off('flows:loaded', fillInSiderBarForm);
|
|
@@ -347,12 +388,13 @@
|
|
|
347
388
|
|
|
348
389
|
<style>
|
|
349
390
|
.col-100 .red-ui-typedInput-container {
|
|
350
|
-
|
|
391
|
+
width: 70% !important;
|
|
351
392
|
}
|
|
352
393
|
|
|
353
394
|
.col-100.no-label .red-ui-typedInput-container {
|
|
354
|
-
|
|
395
|
+
width: 100% !important;
|
|
355
396
|
}
|
|
397
|
+
|
|
356
398
|
.w-30 {
|
|
357
399
|
width: 40% !important;
|
|
358
400
|
margin-left: 10px;
|
|
@@ -737,4 +779,341 @@
|
|
|
737
779
|
</div>
|
|
738
780
|
</div>
|
|
739
781
|
</div>
|
|
782
|
+
</script>
|
|
783
|
+
|
|
784
|
+
<script type="text/x-red" data-template-name="ScreenshotSidebarObfuscation">
|
|
785
|
+
<div style="position: relative; height: 100%; overflow-y: auto;">
|
|
786
|
+
<!-- Obfuscation Tab in Sidebar -->
|
|
787
|
+
|
|
788
|
+
<div id="func-introspection-tab-obfuscation">
|
|
789
|
+
|
|
790
|
+
<div class="form-row" style="margin-top: 10px">
|
|
791
|
+
<label for="node-input-obfuscate-name" class="w-30">
|
|
792
|
+
<i class="fa fa-tag"></i>
|
|
793
|
+
<span>Obfuscate Name?</span>
|
|
794
|
+
</label>
|
|
795
|
+
<input type="checkbox" id="node-input-obfuscate-name"
|
|
796
|
+
style="display:inline-block; width:15px; vertical-align:baseline;">
|
|
797
|
+
</div>
|
|
798
|
+
|
|
799
|
+
<div class="form-row">
|
|
800
|
+
<label for="node-input-obfuscate-position" class="w-30">
|
|
801
|
+
<i class="fa fa-map-pin"></i>
|
|
802
|
+
<span>Obfuscate Position?</span>
|
|
803
|
+
</label>
|
|
804
|
+
<input type="checkbox" id="node-input-obfuscate-position"
|
|
805
|
+
style="display:inline-block; width:15px; vertical-align:baseline;">
|
|
806
|
+
</div>
|
|
807
|
+
|
|
808
|
+
<div class="form-row">
|
|
809
|
+
<label for="node-input-obfuscate-shrink-size" class="w-30">
|
|
810
|
+
<i class="fa fa-angle-down"></i>
|
|
811
|
+
<span>Shrink Nodes?</span>
|
|
812
|
+
</label>
|
|
813
|
+
<input type="checkbox" id="node-input-obfuscate-shrink-size"
|
|
814
|
+
style="display:inline-block; width:15px; vertical-align:baseline;">
|
|
815
|
+
</div>
|
|
816
|
+
|
|
817
|
+
<div class="form-row">
|
|
818
|
+
<label for="node-input-obfuscate-javascript" class="w-30">
|
|
819
|
+
<i class="fa fa-code"></i>
|
|
820
|
+
<span>Obfuscate Javascript?</span>
|
|
821
|
+
</label>
|
|
822
|
+
<input type="checkbox" id="node-input-obfuscate-javascript"
|
|
823
|
+
style="display:inline-block; width:15px; vertical-align:baseline;">
|
|
824
|
+
</div>
|
|
825
|
+
|
|
826
|
+
<div class="form-row col-100">
|
|
827
|
+
<label for="node-input-obfuscate-remove-icons" class="w-30">
|
|
828
|
+
<i class="fa fa-adjust"></i>
|
|
829
|
+
<span>Remove Icon?</span>
|
|
830
|
+
</label>
|
|
831
|
+
<input type="checkbox" id="node-input-obfuscate-remove-icons"
|
|
832
|
+
style="display:inline-block; width:15px; vertical-align:baseline;">
|
|
833
|
+
</div>
|
|
834
|
+
|
|
835
|
+
<div class="form-row">
|
|
836
|
+
<label for="node-input-obfuscate-info" class="w-30">
|
|
837
|
+
<i class="fa fa-info"></i>
|
|
838
|
+
<span>Remove Info?</span>
|
|
839
|
+
</label>
|
|
840
|
+
<input type="checkbox" id="node-input-obfuscate-info"
|
|
841
|
+
style="display:inline-block; width:15px; vertical-align:baseline;">
|
|
842
|
+
</div>
|
|
843
|
+
|
|
844
|
+
<div class="form-row">
|
|
845
|
+
<label for="node-input-obfuscate-remove-groups" class="w-30">
|
|
846
|
+
<i class="fa fa-object-group"></i>
|
|
847
|
+
<span>Remove Groups?</span>
|
|
848
|
+
</label>
|
|
849
|
+
<input type="checkbox" id="node-input-obfuscate-remove-groups"
|
|
850
|
+
style="display:inline-block; width:15px; vertical-align:baseline;">
|
|
851
|
+
</div>
|
|
852
|
+
|
|
853
|
+
<div class="form-row">
|
|
854
|
+
<label for="node-input-obfuscate-remove-debugs" class="w-30">
|
|
855
|
+
<i class="fa fa-bug"></i>
|
|
856
|
+
<span>Remove comment & debugs?</span>
|
|
857
|
+
</label>
|
|
858
|
+
<input type="checkbox" id="node-input-obfuscate-remove-debugs"
|
|
859
|
+
style="display:inline-block; width:15px; vertical-align:baseline;">
|
|
860
|
+
</div>
|
|
861
|
+
|
|
862
|
+
<div class="form-row">
|
|
863
|
+
<label for="node-input-obfuscate-remove-junctions" class="w-30">
|
|
864
|
+
<i class="fa fa-sitemap"></i>
|
|
865
|
+
<span>Coalesce Junctions?</span>
|
|
866
|
+
</label>
|
|
867
|
+
<input type="checkbox" id="node-input-obfuscate-remove-junctions"
|
|
868
|
+
style="display:inline-block; width:15px; vertical-align:baseline;">
|
|
869
|
+
</div>
|
|
870
|
+
|
|
871
|
+
<div class="form-row">
|
|
872
|
+
<label for="node-input-obfuscate-remove-linkcall-nodes" class="w-30">
|
|
873
|
+
<i class="fa fa-unlink"></i>
|
|
874
|
+
<span>Coalesce Link Call Nodes?</span>
|
|
875
|
+
</label>
|
|
876
|
+
<input type="checkbox" id="node-input-obfuscate-remove-linkcall-nodes" style="display:inline-block; width:15px; vertical-align:baseline;">
|
|
877
|
+
</div>
|
|
878
|
+
|
|
879
|
+
<div class="form-row">
|
|
880
|
+
<label for="node-input-obfuscate-remove-linknodes" class="w-30">
|
|
881
|
+
<i class="fa fa-unlink"></i>
|
|
882
|
+
<span>Coalesce Link Out Nodes?</span>
|
|
883
|
+
</label>
|
|
884
|
+
<input type="checkbox" id="node-input-obfuscate-remove-linknodes"
|
|
885
|
+
style="display:inline-block; width:15px; vertical-align:baseline;">
|
|
886
|
+
</div>
|
|
887
|
+
|
|
888
|
+
<div id="node-input-obfuscate-coalesce-link-out-options" style="display: none;">
|
|
889
|
+
<div class="form-row">
|
|
890
|
+
<label for="node-input-obfuscate-copy-linkin-nodes" class="ml-30" style="width: 150px;">
|
|
891
|
+
<span>Copy Link-In Nodes?</span>
|
|
892
|
+
</label>
|
|
893
|
+
<input type="checkbox" id="node-input-obfuscate-copy-linkin-nodes" style="display:inline-block; width:15px; vertical-align:baseline;">
|
|
894
|
+
</div>
|
|
895
|
+
<div class="form-row">
|
|
896
|
+
<label for="node-input-obfuscate-ignore-off-flow-links" class="ml-30" style="width: 150px;">
|
|
897
|
+
<span>Ignore off-flow links?</span>
|
|
898
|
+
</label>
|
|
899
|
+
<input type="checkbox" id="node-input-obfuscate-ignore-off-flow-links" style="display:inline-block; width:15px; vertical-align:baseline;">
|
|
900
|
+
</div>
|
|
901
|
+
</div>
|
|
902
|
+
|
|
903
|
+
<div class="form-row">
|
|
904
|
+
<label class='w-30'>
|
|
905
|
+
<i class="fa fa-refresh"></i>
|
|
906
|
+
<span>Replace Nodes:</span>
|
|
907
|
+
</label>
|
|
908
|
+
</div>
|
|
909
|
+
|
|
910
|
+
<div class="form-row">
|
|
911
|
+
<label for="node-input-obfuscate-replace-switch" class="ml-30">
|
|
912
|
+
<span>Switch</span>
|
|
913
|
+
</label>
|
|
914
|
+
<input type="checkbox" id="node-input-obfuscate-replace-switch"
|
|
915
|
+
style="display:inline-block; width:15px; vertical-align:baseline;">
|
|
916
|
+
</div>
|
|
917
|
+
|
|
918
|
+
<div class="form-row">
|
|
919
|
+
<label for="node-input-obfuscate-replace-change" class="ml-30">
|
|
920
|
+
<span>Change</span>
|
|
921
|
+
</label>
|
|
922
|
+
<input type="checkbox" id="node-input-obfuscate-replace-change"
|
|
923
|
+
style="display:inline-block; width:15px; vertical-align:baseline;">
|
|
924
|
+
</div>
|
|
925
|
+
|
|
926
|
+
<div class="form-row">
|
|
927
|
+
<label for="node-input-obfuscate-add-license-text" class="w-30">
|
|
928
|
+
<i class="fa fa-gavel"></i>
|
|
929
|
+
<span>Replace info with license?</span>
|
|
930
|
+
</label>
|
|
931
|
+
<input type="checkbox" id="node-input-obfuscate-add-license-text" style="display:inline-block; width:15px; vertical-align:baseline;">
|
|
932
|
+
</div>
|
|
933
|
+
|
|
934
|
+
<div id="node-input-obfuscate-add-license-text-row" style="display: none;">
|
|
935
|
+
<div class="form-row ml-30">
|
|
936
|
+
<label for="node-input-obfuscate-append-license-text" style="width: 150px">
|
|
937
|
+
<span>Append to info?</span>
|
|
938
|
+
</label>
|
|
939
|
+
<input type="checkbox" id="node-input-obfuscate-append-license-text" style="display:inline-block; width:15px; vertical-align:baseline;">
|
|
940
|
+
</div>
|
|
941
|
+
<div class="form-row ml-30">
|
|
942
|
+
<textarea id="node-input-obfuscate-license-text" placeholder="License Text"></textarea>
|
|
943
|
+
</div>
|
|
944
|
+
</div>
|
|
945
|
+
|
|
946
|
+
<div class="form-row">
|
|
947
|
+
<div class="col-100">
|
|
948
|
+
<div class="form-row node-input-target-row" style="margin-left: 10px; margin-top: 30px">
|
|
949
|
+
<button id="node-input-obfuscation-generate-btn"
|
|
950
|
+
class="red-ui-button"><i class="fa fa-download"></i> Obfuscate and Import</button>
|
|
951
|
+
<button id="node-input-obfuscation-generate-and-copy-btn"
|
|
952
|
+
class="red-ui-button"><i class="fa fa-copy"></i> Obfuscate and Copy</button>
|
|
953
|
+
</div>
|
|
954
|
+
</div>
|
|
955
|
+
</div>
|
|
956
|
+
|
|
957
|
+
<div class="form-row" style="margin-left: 10px">
|
|
958
|
+
<b>Warning</b>: No guarantee is made that the obfuscated flow works as the original. This functionality
|
|
959
|
+
has not been thoroughly tested. Ensure correctness by completely testing the resultant obfuscated flow.
|
|
960
|
+
No warranty of success is neither provided, nor implied nor expressed.
|
|
961
|
+
</div>
|
|
962
|
+
</div>
|
|
963
|
+
</div>
|
|
964
|
+
</script>
|
|
965
|
+
|
|
966
|
+
<script type="text/x-red" data-template-name="ScreenshotSidebarMsgTrace">
|
|
967
|
+
<div style="position: relative; height: 100%; overflow-y: auto;">
|
|
968
|
+
<div id="func-introspection-tab-msgtrace">
|
|
969
|
+
<!-- message tracing stuff -->
|
|
970
|
+
<div class="form-row" style="margin-left: 10px; margin-top: 10px">
|
|
971
|
+
<label for="node-input-msgtracer-clamp-mode" class="w-25">
|
|
972
|
+
<i class="fa fa-bolt"></i>
|
|
973
|
+
<span>Clamp Mode?</span>
|
|
974
|
+
</label>
|
|
975
|
+
<input type="checkbox" id="node-input-msgtracer-clamp-mode"
|
|
976
|
+
style="display:inline-block; width:15px; vertical-align:baseline;">
|
|
977
|
+
|
|
978
|
+
<label for="node-input-msgtracer-clamp-mode-with-debug" class="w-25">
|
|
979
|
+
<i class="fa fa-bug"></i>
|
|
980
|
+
<span>With Debug?</span>
|
|
981
|
+
</label>
|
|
982
|
+
<input type="checkbox" id="node-input-msgtracer-clamp-mode-with-debug"
|
|
983
|
+
style="display:inline-block; width:15px; vertical-align:baseline;">
|
|
984
|
+
|
|
985
|
+
<label id="node-input-msgtracer-clamp-mode-status" style="display: none;" class="w-25">
|
|
986
|
+
<i class="fa fa-check"></i> <span>On</span>
|
|
987
|
+
</label>
|
|
988
|
+
</div>
|
|
989
|
+
|
|
990
|
+
<div class="form-row" style="margin-left: 10px; margin-top: 40px">
|
|
991
|
+
<label for="node-input-msgtracer-toggle" class="w-25">
|
|
992
|
+
<i class="fa fa-stethoscope"></i>
|
|
993
|
+
<span>Trace selected nodes?</span>
|
|
994
|
+
</label>
|
|
995
|
+
<input type="checkbox" id="node-input-msgtracer-toggle"
|
|
996
|
+
style="display:inline-block; width:15px; vertical-align:baseline;">
|
|
997
|
+
|
|
998
|
+
<label for="node-input-msgtracer-toggle-all" class="w-25">
|
|
999
|
+
<i class="fa fa-warning"></i>
|
|
1000
|
+
<span>All nodes?</span>
|
|
1001
|
+
</label>
|
|
1002
|
+
<input type="checkbox" id="node-input-msgtracer-toggle-all"
|
|
1003
|
+
style="display:inline-block; width:15px; vertical-align:baseline;">
|
|
1004
|
+
|
|
1005
|
+
<button id="node-input-msgtrace-clear-trace-btn" style="margin-left: 10px;"
|
|
1006
|
+
class="red-ui-button">Clear Trace</button>
|
|
1007
|
+
</div>
|
|
1008
|
+
|
|
1009
|
+
<div class="form-row"
|
|
1010
|
+
style="margin-left: 10px; position: relative; min-height: 5vh; height: 20vh; margin-right: 15px;">
|
|
1011
|
+
<div style="margin-bottom: 5px; width: 35%; padding-left: 60%;">
|
|
1012
|
+
<input type="text" id="node-input-msgtracer-trace-treelist-filter" style="display: none;">
|
|
1013
|
+
</div>
|
|
1014
|
+
<div id="node-input-msgtracer-trace-treelist"></div>
|
|
1015
|
+
</div>
|
|
1016
|
+
|
|
1017
|
+
<div class="form-row" style="margin-left: 10px; margin-top: 40px;">
|
|
1018
|
+
<label for="node-input-msgtracer-msgtodebug" class="w-25">
|
|
1019
|
+
<i class="fa fa-bug"></i>
|
|
1020
|
+
<span>Msgs from selected nodes to Debug?</span>
|
|
1021
|
+
</label>
|
|
1022
|
+
<input type="checkbox" id="node-input-msgtracer-msgtodebug"
|
|
1023
|
+
style="display:inline-block; width:15px; vertical-align:baseline;">
|
|
1024
|
+
|
|
1025
|
+
<label for="node-input-msgtracer-msgtodebug-all" class="w-25">
|
|
1026
|
+
<i class="fa fa-warning"></i>
|
|
1027
|
+
<span>All nodes?</span>
|
|
1028
|
+
</label>
|
|
1029
|
+
<input type="checkbox" id="node-input-msgtracer-msgtodebug-all"
|
|
1030
|
+
style="display:inline-block; width:15px; vertical-align:baseline;">
|
|
1031
|
+
|
|
1032
|
+
<button id="node-input-msgtrace-clear-debug-btn" style="margin-left: 10px;"
|
|
1033
|
+
class="red-ui-button">Clear Debug</button>
|
|
1034
|
+
<button id="node-input-msgtrace-pause-debug-btn" style="margin-left: 10px;"
|
|
1035
|
+
class="red-ui-button">Pause Debug</button>
|
|
1036
|
+
</div>
|
|
1037
|
+
</div>
|
|
1038
|
+
</div>
|
|
1039
|
+
</script>
|
|
1040
|
+
|
|
1041
|
+
<script type="text/x-red" data-template-name="ScreenshotSidebarLint">
|
|
1042
|
+
<div style="position: relative; height: 100%; overflow-y: auto;">
|
|
1043
|
+
<!-- Lint Tab in Sidebar -->
|
|
1044
|
+
|
|
1045
|
+
<div id="func-introspection-tab-lint">
|
|
1046
|
+
<div class="form-row" style="margin-left: 10px; margin-top: 10px">
|
|
1047
|
+
<button id="node-input-orphan-find-btn"
|
|
1048
|
+
class="red-ui-button"><i class="fa fa-life-ring"></i> Unconnected</button>
|
|
1049
|
+
<button id="node-input-documentation-find-btn"
|
|
1050
|
+
class="red-ui-button"><i class="fa fa-cc"></i> Undocumented</button>
|
|
1051
|
+
<button id="node-input-linkin-nodes-find-btn"
|
|
1052
|
+
class="red-ui-button"><i class="fa fa-link"></i> Link Ins</button>
|
|
1053
|
+
<button id="node-input-linkcalls-find-btn"
|
|
1054
|
+
class="red-ui-button"><i class="fa fa-link"></i> Link Calls</button>
|
|
1055
|
+
<button id="node-input-orphan-clear-workspace-btn"
|
|
1056
|
+
class="red-ui-button">Clear dots</button>
|
|
1057
|
+
<button id="node-input-transform-inject-to-change-btn"
|
|
1058
|
+
class="red-ui-button"><i class='icon-button' style="background-image: url('icons/@gregoriusrippenstein/node-red-contrib-introspection/swap-inject-to-change.svg');"></i><span class='icon-button-text'>Inj->Chg</span></button>
|
|
1059
|
+
<button id="node-input-statistics-btn"
|
|
1060
|
+
class="red-ui-button"><i class="fa fa-pie-chart"></i> Stats</button>
|
|
1061
|
+
<button id="node-input-highlight-debug-nodes-btn"
|
|
1062
|
+
class="red-ui-button"><i class="fa fa-bug"></i> Highlight Debug Msg</button>
|
|
1063
|
+
</div>
|
|
1064
|
+
|
|
1065
|
+
<div class="form-row"
|
|
1066
|
+
style="margin-left: 10px; position: relative; min-height: 5vh; height: 20vh; margin-right: 15px;">
|
|
1067
|
+
<div style="margin-bottom: 5px; width: 35%; padding-left: 60%;">
|
|
1068
|
+
<input type="text" id="node-input-orphan-target-filter" style="display: none;">
|
|
1069
|
+
</div>
|
|
1070
|
+
<div id="node-input-orphan-target-container-div"></div>
|
|
1071
|
+
</div>
|
|
1072
|
+
</div>
|
|
1073
|
+
</div>
|
|
1074
|
+
</script>
|
|
1075
|
+
|
|
1076
|
+
<script type="text/x-red" data-template-name="ScreenshotSidebarCapture">
|
|
1077
|
+
<div style="position: relative; height: 100%; overflow-y: auto;">
|
|
1078
|
+
<!-- Screenshot Tab in Sidebar -->
|
|
1079
|
+
|
|
1080
|
+
<div id="func-introspection-tab-screenshot">
|
|
1081
|
+
<div class="form-row">
|
|
1082
|
+
<div class="col-100">
|
|
1083
|
+
|
|
1084
|
+
<div class="form-row" style="margin-left: 10px; margin-top: 10px;">
|
|
1085
|
+
<button type="button" id="node-screenshot-capture-btn"
|
|
1086
|
+
class="red-ui-button red-ui-button-large"><i class="fa fa-camera"></i> Capture</button>
|
|
1087
|
+
</div>
|
|
1088
|
+
|
|
1089
|
+
<div class="form-row" style="margin-left: 10px;">
|
|
1090
|
+
<label for="node-input-screenshot-remove-classes-and-ids" style="width: 200px">
|
|
1091
|
+
<span>Remove Classes and Ids?</span>
|
|
1092
|
+
</label>
|
|
1093
|
+
<input type="checkbox" checked="checked" id="node-input-screenshot-remove-classes-and-ids"
|
|
1094
|
+
style="display:inline-block; width:15px; vertical-align:baseline;">
|
|
1095
|
+
</div>
|
|
1096
|
+
|
|
1097
|
+
<div class="form-row"
|
|
1098
|
+
style="min-height: 300px; height: 65vh; overflow: hidden; margin-left: 10px; margin-right: 15px; border: 1px rgb(196, 196, 196) solid; border-radius: 5px;">
|
|
1099
|
+
<div id="node-input-screenshot-svgcontainer"></div>
|
|
1100
|
+
</div>
|
|
1101
|
+
|
|
1102
|
+
<div class="form-row" style="margin-left: 10px; margin-top: 30px;">
|
|
1103
|
+
<button type="button" id="node-screenshot-download-svg"
|
|
1104
|
+
class="red-ui-button red-ui-button-large"><i class="fa fa-download"></i> Download</button>
|
|
1105
|
+
<button type="button" id="node-screenshot-copy-to-clipboard-svg"
|
|
1106
|
+
class="red-ui-button red-ui-button-large"><i class="fa fa-clipboard"></i> Copy to Clipboard</button>
|
|
1107
|
+
</div>
|
|
1108
|
+
|
|
1109
|
+
<div class="form-row" style="margin-left: 10px; margin-top: 30px;">
|
|
1110
|
+
<input type="text" id="node-input-svgpost-endpoint" placeholder="/screenshot" style="width: 40% !important;">
|
|
1111
|
+
<button type="button" id="node-screenshot-post-svg-to-endpoint"
|
|
1112
|
+
class="red-ui-button red-ui-button-large"><i class="fa fa-send-o"></i> Post to Endpoint</button>
|
|
1113
|
+
</div>
|
|
1114
|
+
|
|
1115
|
+
</div>
|
|
1116
|
+
</div>
|
|
1117
|
+
</div>
|
|
1118
|
+
</div>
|
|
740
1119
|
</script>
|