ifthenelse-8.x-1.x-dev-no-core/modules/contrib/if_then_else/js/render_retejs_canvas.js
modules/contrib/if_then_else/js/render_retejs_canvas.js
function jsUcfirst(string) { return string.charAt(0).toUpperCase() + string.slice(1); } // Initialize all event nodes. let compatibleSockets = {}; let myComponents = []; for (let nodeName in drupalSettings.if_then_else.nodes) { let node = drupalSettings.if_then_else.nodes[nodeName]; let EventTriggerControl; if (!node.hasOwnProperty('control_class_name')) { EventTriggerControl = class extends Rete.Control { constructor(emitter, key) { super(key); this.component = { props: ['getData', 'putData'], data() { return node; }, template: '', mounted() { // initialize variable for data this.putData('type', node.type); this.putData('class', node.class); this.putData('name', node.name); } }; } }; } else { EventTriggerControl = eval(node.control_class_name); } if (!node.hasOwnProperty('component_class_name')) { class EventComponent extends Rete.Component { constructor(){ super(jsUcfirst(node.type) + ": " + node.label); } //Event node builder builder(eventNode) { eventNode.addControl(new EventTriggerControl(this.editor, nodeName)); for (let name in node.inputs) { let inputLabel = node.inputs[name].label + (node.inputs[name].required ? ' *' : ''); if (node.inputs[name].sockets.length === 1) { eventNode.addInput(new Rete.Input(name, inputLabel, sockets[node.inputs[name].sockets[0]])); } else if (node.inputs[name].sockets.length > 1) { let socketNames = []; let socketLabels = []; for (let idx in node.inputs[name].sockets) { socketNames.push(node.inputs[name].sockets[idx]); socketLabels.push(sockets[node.inputs[name].sockets[idx]].name); } socketNames.sort(); socketLabels.sort(); let socketLabel = socketLabels.join(', '); let socketName = socketNames.join(', '); if (!(socketName in sockets)) { sockets[socketName] = new Rete.Socket(socketLabel); } for (let idx in node.inputs[name].sockets) { if (!sockets[node.inputs[name].sockets[idx]].compatibleWith(sockets[socketName])) { sockets[node.inputs[name].sockets[idx]].combineWith(sockets[socketName]); if (typeof compatibleSockets[node.inputs[name].sockets[idx]] === "undefined") { compatibleSockets[node.inputs[name].sockets[idx]] = []; } compatibleSockets[node.inputs[name].sockets[idx]].push(socketName); } } eventNode.addInput(new Rete.Input(name, inputLabel, sockets[socketName])); } } for (let name in node.outputs) { eventNode.addOutput(new Rete.Output(name, node.outputs[name].label, sockets[node.outputs[name].socket])); } } worker(eventNode, inputs, outputs) { //outputs['form'] = eventNode.data.event; } } myComponents.push(new EventComponent()); }else{ myComponents.push(eval('new ' + node.component_class_name + '()')); } } // Go through all the output nodes, get their sockets, get those sockets' parent sockets and make them compatible. for (let nodeName in drupalSettings.if_then_else.nodes) { let node = drupalSettings.if_then_else.nodes[nodeName]; for (let name in node.outputs) { let socketName = node.outputs[name].socket; let parents = socketName.split('.'); if (parents.length > 1) { let parentSocketName = ''; for (let idx in parents) { if (parseInt(idx) === parents.length - 1) { continue; } if (idx > 0) { parentSocketName += '.'; } parentSocketName += parents[idx]; if (!sockets[socketName].compatibleWith(sockets[parentSocketName])) { sockets[socketName].combineWith(sockets[parentSocketName]); if (typeof compatibleSockets[parentSocketName] !== "undefined") { for (let idx2 in compatibleSockets[parentSocketName]) { if (!sockets[socketName].compatibleWith(sockets[compatibleSockets[parentSocketName][idx2]])) { sockets[socketName].combineWith(sockets[compatibleSockets[parentSocketName][idx2]]); } } } } } } } } editor.on("updateconnection", function(el, connection, points) { let outputSocketName = inverseSocketsMap[el.connection.output.socket.name]; let inputSocketNames = el.connection.input.socket.name.split(", "); let compatible = false; for (let i = 0; i < inputSocketNames.length; i++) { let inputSocketName = inverseSocketsMap[inputSocketNames[i].trim()]; if (inputSocketName === outputSocketName || compatibleSockets[outputSocketName].includes(inputSocketName)) { compatible = true; break; } } if (!compatible) { // Sockets are not compatible. editor.view.removeConnection(el.connection); } }); for (let idx in myComponents) { editor.register(myComponents[idx]); engine.register(myComponents[idx]); } (function ($, Drupal, drupalSettings) { $(document).ready(function() { //If it is a new add rule page than this variable value will be false and it will trigger // a new retejs generation. if (!drupalSettings.if_then_else.data) { (async () => { editor.on('process nodecreated noderemoved connectioncreated connectionremoved', async () => { await engine.abort(); await engine.process(editor.toJSON()); //setting value of rule data from retejs graph jQuery('#ifthenelse-data').val(JSON.stringify(editor.toJSON())); }); setTimeout(function(){ editor.view.resize(); }, 500); editor.view.resize(); AreaPlugin.zoomAt(editor); editor.trigger('process'); })(); } else { //If it is a rule edit form than build the rete graph from saved data editor.fromJSON(JSON.parse(drupalSettings.if_then_else.data)) .then(() => { editor.on("error", err => { alertify.error(err.message); }); editor.on( "process connectioncreated connectionremoved nodecreated noderemoved", async function() { if (engine.silent) return; onMessageTask = []; await engine.abort(); await engine.process(editor.toJSON()); //setting value of rule data from retejs graph jQuery('#ifthenelse-data').val(JSON.stringify(editor.toJSON())); } ); editor.trigger("process"); editor.view.resize(); AreaPlugin.zoomAt(editor); }); } }); })(jQuery, Drupal, drupalSettings);