ifthenelse-8.x-1.x-dev-no-core/modules/contrib/if_then_else/js/initialize_retejs.js
modules/contrib/if_then_else/js/initialize_retejs.js
// Defining sockets
let sockets = {}
let inverseSocketsMap = {}
for (let socketName in drupalSettings.if_then_else.sockets) {
sockets[socketName] = new Rete.Socket(drupalSettings.if_then_else.sockets[socketName]);
inverseSocketsMap[drupalSettings.if_then_else.sockets[socketName]] = socketName;
}
// This js handles the front end for if then else ui
var container = document.querySelector('#rete-editor');
var editor = new Rete.NodeEditor('demo@0.1.0', container);
var clickPositionX = 0, clickPositionY = 0;
v = new Vue({
el: '#dock',
data: {
searchKey: '',
items: []
},
computed: {
filtered() {
this.items.sort( function( a, b ){
return ( ( a.type == b.type ) ? 0 : ( ( a.type > b.type ) ? 1 : -1 ) );
});
if (!this.searchKey) return this.items;
return this.items.filter(item => {
return item.title.toLowerCase().includes(this.searchKey.toLowerCase());
});
}
},
methods: {
dragstart: function (item, e) {
if(!e.dataTransfer) return;
e.dataTransfer.setData('componentName', item.name);
},
async drop(item, e) {
const component = editor.components.get(item.title);
if(!component) {
console.err('Component ${item.title} not found');
return;
}
// force update the mouse position
const { screenX, screenY } = e;
const rect = editor.view.area.el.getBoundingClientRect();
const x = screenX - rect.left;
const y = screenY - rect.top - 75;
const k = editor.view.area.transform.k;
editor.view.area.mouse = { x: x / k, y: y / k };
editor.view.area.trigger('mousemove', { ...editor.view.area.mouse }); // TODO rename on `pointermove`
//const node = createNode(component, editor.view.area.mouse);
const node = await component.createNode({});
node.position[0] = editor.view.area.mouse.x;
node.position[1] = editor.view.area.mouse.y;
editor.addNode(node);
},
async click(item, e) {
if (clickPositionX || clickPositionY) {
const component = editor.components.get(item.title);
const node = await component.createNode({});
node.position[0] = clickPositionX;
node.position[1] = clickPositionY;
editor.addNode(node);
}
}
},
template: '<div class="dock"><div id="search-container"><div class="search-wrapper"><input placeholder="Search ..." v-model="searchKey" /></div></div><ul><li v-bind:class="(item.type)" v-for="item in filtered" v-bind:key="item.title" v-bind:title="item.title" draggable="true" v-on:dragstart="dragstart(item, $event)" v-on:dragover="$event.preventDefault()" v-on:dragend="drop(item, $event)" v-on:click="click(item, $event)">{{item.title}}</li></ul></div>'
});
editor.on('componentregister', async c => {
let type = c.name.split(':');
v.$data.items.push({title: c.name, type: type[0]});
});
editor.on('click', () => {
clickPositionX = editor.view.area.mouse.x;
clickPositionY = editor.view.area.mouse.y;
});
editor.on('zoom', ({source}) => {
return source !== 'dblclick';
});
editor.use(ConnectionPlugin.default);
editor.use(VueRenderPlugin.default);
editor.use(NodeContextMenuPlugin.default);
editor.use(AreaPlugin);
editor.use(CommentPlugin.default);
editor.use(HistoryPlugin.default);
var engine = new Rete.Engine('demo@0.1.0');
