/** * _ ___ Another * / |/ (_)______ __ _____ * / / / __(_- { this.graflow.autoPlace('horizontal', null, null, 1000, null) } ) document.querySelector('[data-trigger="onAutoplace1V"]').addEventListener('click', (evt) => { this.graflow.autoPlace('vertical', null, null, 1000, null) } ) document.querySelector('input[name="tension"]').addEventListener('change', (evt) => { this.graflow.setAttribute('tension', evt.target.value); this.graflow.refresh() } ) document.querySelector('input[name="gapx"]').addEventListener('change', (evt) => { this.graflow.setAttribute('gapx', evt.target.value); this.graflow.refresh() } ) document.querySelector('input[name="gapy"]').addEventListener('change', (evt) => { this.graflow.setAttribute('gapy', evt.target.value); this.graflow.refresh() } ) document.querySelector('bz-select[name="wiretype"]').addEventListener('change', (evt) => { this.graflow.setAttribute('wiretype', evt.target.value); this.graflow.refresh() } ) document.querySelector('bz-select[name="align"]').addEventListener('change', (evt) => { this.graflow.setAttribute('align', evt.target.value); this.graflow.refresh() } ) this.graflow.addEventListener('bz:graflow:nodesLoaded', this.refreshNodes.bind(this)) this.graflow.loadNodes(nodesUrl) } fillconsole(){ this.slidePane.innerHTML = `
` this.slidePane.querySelector('button[data-trigger="onExportFlow"]').addEventListener('click', this.onExportFlow.bind(this)) this.slidePane.querySelector('button[data-trigger="onImportFlow"]').addEventListener('click', this.onImportFlow.bind(this)) } refreshNodes(e){ for(const nodeType in this.graflow.nodesRegistry){ const nodeDef = this.graflow.nodesRegistry[nodeType] if(nodeDef.dataset.editor=='exclude') continue const node = nodeDef.cloneNode(true) this.makeNodeDraggable(node) this.nodesContainer.append(node) } } makeNodeDraggable(node){ node.draggable = true node.style.cursor = 'pointer' node.addEventListener('dragstart', (evt) => { evt.dataTransfer.setData('text/plain', node.dataset.nodetype) evt.dataTransfer.effectAllowed = 'copy' evt.dataTransfer.setDragImage(node, evt.offsetX, evt.offsetY) }) } onNodeDragEnd(evt){ console.log('drag end', evt) evt.dataTransfer.clearData() } setupDropZone(){ const dropZone = this.graflow.wiresContainer const nodesContainer = this.graflow.nodesContainer dropZone.addEventListener('dragover', (evt) => { evt.preventDefault() evt.dataTransfer.dropEffect = 'copy' }) dropZone.addEventListener('drop', (evt) => { evt.preventDefault() const nodeType = evt.dataTransfer.getData('text/plain') if(!nodeType || !(nodeType in this.graflow.nodesRegistry)) return const rect = nodesContainer.getBoundingClientRect() const x = evt.clientX - rect.left + nodesContainer.scrollLeft const y = evt.clientY - rect.top + nodesContainer.scrollTop const id = 'n' + crypto.randomUUID().replace(/-/g, '').slice(0, 8) this.graflow.addNode({ id, nodeType, coords: { x, y } }) for(const node of this.graflow.flow.nodes){ if(node.id == id){ node.coords.x = x node.coords.y = y break } } this.graflow.refresh() }) } onImportFlow(e){ const fileInput = this.slidePane.querySelector('input[name="importFlow"]') fileInput.addEventListener('change', (evt) => { const file = evt.target.files[0] if(file) this.graflow.loadFlow(file) fileInput.value = '' }, { once: true }) fileInput.click() } onExportFlow(e){ const flowDeep = JSON.parse(JSON.stringify(this.graflow.flow)) delete flowDeep.longLinks const exportObj = { nodesFile: this.getBZAttribute('nodes'), flow: flowDeep } const flowJson = JSON.stringify(exportObj, null, 2) const flowBlob = new Blob([flowJson], { type: 'application/json' }) const flowUrl = URL.createObjectURL(flowBlob) const flowLink = document.createElement('a') flowLink.href = flowUrl flowLink.download = 'flow.json' flowLink.click() } } Buildoz.define('grafloweditor', BZgrafloweditor)