UNPKG

flowy-engine

Version:

The minimal javascript library to create flowcharts ✨

1 lines 64.4 kB
{"version":3,"file":"flowy-engine.mjs","sources":["../src/engine/index.js"],"sourcesContent":["var flowy = function (canvas, grab, release, snapping, rearrange, spacing_x, spacing_y) {\n if (!grab) {\n grab = function () {}\n }\n if (!release) {\n release = function () {}\n }\n if (!snapping) {\n snapping = function () {\n return true\n }\n }\n if (!rearrange) {\n rearrange = function () {\n return false\n }\n }\n if (!spacing_x) {\n spacing_x = 20\n }\n if (!spacing_y) {\n spacing_y = 80\n }\n var loaded = false\n flowy.load = function () {\n if (!loaded) loaded = true\n else return\n var blocks = []\n var blockstemp = []\n var canvas_div = canvas\n var active = false\n var paddingx = spacing_x\n var paddingy = spacing_y\n var offsetleft = 0\n var offsetleftold = 0\n var rearrange = false\n var lastevent = false\n var drag, dragx, dragy, original\n var mouse_x, mouse_y\n var dragblock = false\n var prevblock = 0\n var el = document.createElement('DIV')\n el.classList.add('indicator')\n el.classList.add('invisible')\n canvas_div.appendChild(el)\n flowy.import = function (output) {\n canvas_div.innerHTML = output.html\n blocks = output.blockarr\n if (blocks.length > 1) {\n rearrangeMe()\n }\n }\n flowy.output = function () {\n var html_ser = canvas_div.innerHTML\n var json_data = { html: html_ser, blockarr: blocks, blocks: [] }\n if (blocks.length > 0) {\n for (var i = 0; i < blocks.length; i++) {\n json_data.blocks.push({\n id: blocks[i].id,\n parent: blocks[i].parent,\n data: [],\n attr: []\n })\n var blockParent = document.querySelector(\".blockid[value='\" + blocks[i].id + \"']\").parentNode\n blockParent.querySelectorAll('input').forEach(function (block) {\n var json_name = block.getAttribute('name')\n var json_value = block.value\n json_data.blocks[i].data.push({\n name: json_name,\n value: json_value\n })\n })\n Array.prototype.slice.call(blockParent.attributes).forEach(function (attribute) {\n var jsonobj = {}\n jsonobj[attribute.name] = attribute.value\n json_data.blocks[i].attr.push(jsonobj)\n })\n }\n return json_data\n }\n }\n flowy.deleteBlocks = function () {\n blocks = []\n canvas_div.innerHTML = \"<div class='indicator invisible'></div>\"\n }\n\n flowy.beginDrag = function (event) {\n if (event.targetTouches) {\n mouse_x = event.changedTouches[0].clientX\n mouse_y = event.changedTouches[0].clientY\n } else {\n mouse_x = event.clientX\n mouse_y = event.clientY\n }\n if (event.which != 3 && event.target.closest('.create-flowy')) {\n original = event.target.closest('.create-flowy')\n var newNode = event.target.closest('.create-flowy').cloneNode(true)\n event.target.closest('.create-flowy').classList.add('dragnow')\n newNode.classList.add('block')\n newNode.classList.remove('create-flowy')\n if (blocks.length === 0) {\n newNode.innerHTML += \"<input type='hidden' name='blockid' class='blockid' value='\" + blocks.length + \"'>\"\n document.body.appendChild(newNode)\n drag = document.querySelector(\".blockid[value='\" + blocks.length + \"']\").parentNode\n } else {\n newNode.innerHTML +=\n \"<input type='hidden' name='blockid' class='blockid' value='\" +\n (Math.max.apply(\n Math,\n blocks.map(a => a.id)\n ) +\n 1) +\n \"'>\"\n document.body.appendChild(newNode)\n drag = document.querySelector(\n \".blockid[value='\" +\n (parseInt(\n Math.max.apply(\n Math,\n blocks.map(a => a.id)\n )\n ) +\n 1) +\n \"']\"\n ).parentNode\n }\n blockGrabbed(event.target.closest('.create-flowy'))\n drag.classList.add('dragging')\n active = true\n dragx = mouse_x - event.target.closest('.create-flowy').getBoundingClientRect().left\n dragy = mouse_y - event.target.closest('.create-flowy').getBoundingClientRect().top\n drag.style.left = mouse_x - dragx + 'px'\n drag.style.top = mouse_y - dragy + 'px'\n }\n }\n document.addEventListener('mousedown', touchblock, false)\n document.addEventListener('touchstart', touchblock, false)\n document.addEventListener('mouseup', touchblock, false)\n\n flowy.touchDone = function () {\n dragblock = false\n }\n document.addEventListener('mousedown', flowy.beginDrag)\n document.addEventListener('touchstart', flowy.beginDrag)\n\n flowy.endDrag = function (event) {\n if (event.which != 3 && (active || rearrange)) {\n dragblock = false\n blockReleased()\n if (!document.querySelector('.indicator').classList.contains('invisible')) {\n document.querySelector('.indicator').classList.add('invisible')\n }\n if (active) {\n original.classList.remove('dragnow')\n drag.classList.remove('dragging')\n }\n if (parseInt(drag.querySelector('.blockid').value) === 0 && rearrange) {\n drag.classList.remove('dragging')\n rearrange = false\n for (var w = 0; w < blockstemp.length; w++) {\n if (blockstemp[w].id != parseInt(drag.querySelector('.blockid').value)) {\n const blockParent = document.querySelector(\".blockid[value='\" + blockstemp[w].id + \"']\").parentNode\n const arrowParent = document.querySelector(\".arrowid[value='\" + blockstemp[w].id + \"']\").parentNode\n blockParent.style.left =\n blockParent.getBoundingClientRect().left +\n window.scrollX -\n (canvas_div.getBoundingClientRect().left + window.scrollX) +\n canvas_div.scrollLeft -\n 1 +\n 'px'\n blockParent.style.top =\n blockParent.getBoundingClientRect().top +\n window.scrollY -\n (canvas_div.getBoundingClientRect().top + window.scrollY) +\n canvas_div.scrollTop -\n 1 +\n 'px'\n arrowParent.style.left =\n arrowParent.getBoundingClientRect().left +\n window.scrollX -\n (canvas_div.getBoundingClientRect().left + window.scrollX) +\n canvas_div.scrollLeft -\n 1 +\n 'px'\n arrowParent.style.top =\n arrowParent.getBoundingClientRect().top +\n window.scrollY -\n (canvas_div.getBoundingClientRect().top + canvas_div.scrollTop) -\n 1 +\n 'px'\n canvas_div.appendChild(blockParent)\n canvas_div.appendChild(arrowParent)\n blockstemp[w].x =\n blockParent.getBoundingClientRect().left +\n window.scrollX +\n parseInt(blockParent.offsetWidth) / 2 +\n canvas_div.scrollLeft -\n 1\n blockstemp[w].y =\n blockParent.getBoundingClientRect().top + window.scrollY + parseInt(blockParent.offsetHeight) / 2 + canvas_div.scrollTop - 1\n }\n }\n blockstemp.filter(a => a.id == 0)[0].x =\n drag.getBoundingClientRect().left + window.scrollX + parseInt(window.getComputedStyle(drag).width) / 2\n blockstemp.filter(a => a.id == 0)[0].y =\n drag.getBoundingClientRect().top + window.scrollY + parseInt(window.getComputedStyle(drag).height) / 2\n blocks = blocks.concat(blockstemp)\n blockstemp = []\n } else if (\n active &&\n blocks.length == 0 &&\n drag.getBoundingClientRect().top + window.scrollY > canvas_div.getBoundingClientRect().top + window.scrollY &&\n drag.getBoundingClientRect().left + window.scrollX > canvas_div.getBoundingClientRect().left + window.scrollX\n ) {\n blockSnap(drag, true, undefined)\n active = false\n drag.style.top =\n drag.getBoundingClientRect().top +\n window.scrollY -\n (canvas_div.getBoundingClientRect().top + window.scrollY) +\n canvas_div.scrollTop +\n 'px'\n drag.style.left =\n drag.getBoundingClientRect().left +\n window.scrollX -\n (canvas_div.getBoundingClientRect().left + window.scrollX) +\n canvas_div.scrollLeft +\n 'px'\n canvas_div.appendChild(drag)\n blocks.push({\n parent: -1,\n childwidth: 0,\n id: parseInt(drag.querySelector('.blockid').value),\n x:\n drag.getBoundingClientRect().left +\n window.scrollX +\n parseInt(window.getComputedStyle(drag).width) / 2 +\n canvas_div.scrollLeft,\n y:\n drag.getBoundingClientRect().top + window.scrollY + parseInt(window.getComputedStyle(drag).height) / 2 + canvas_div.scrollTop,\n width: parseInt(window.getComputedStyle(drag).width),\n height: parseInt(window.getComputedStyle(drag).height)\n })\n } else if (active && blocks.length == 0) {\n canvas_div.appendChild(document.querySelector('.indicator'))\n drag.parentNode.removeChild(drag)\n } else if (active) {\n var xpos =\n drag.getBoundingClientRect().left + window.scrollX + parseInt(window.getComputedStyle(drag).width) / 2 + canvas_div.scrollLeft\n var ypos = drag.getBoundingClientRect().top + window.scrollY + canvas_div.scrollTop\n var blocko = blocks.map(a => a.id)\n for (var i = 0; i < blocks.length; i++) {\n if (\n xpos >= blocks.filter(a => a.id == blocko[i])[0].x - blocks.filter(a => a.id == blocko[i])[0].width / 2 - paddingx &&\n xpos <= blocks.filter(a => a.id == blocko[i])[0].x + blocks.filter(a => a.id == blocko[i])[0].width / 2 + paddingx &&\n ypos >= blocks.filter(a => a.id == blocko[i])[0].y - blocks.filter(a => a.id == blocko[i])[0].height / 2 &&\n ypos <= blocks.filter(a => a.id == blocko[i])[0].y + blocks.filter(a => a.id == blocko[i])[0].height\n ) {\n active = false\n if (!rearrange && blockSnap(drag, false, blocks.filter(id => id.id == blocko[i])[0])) {\n snap(drag, i, blocko)\n } else if (rearrange) {\n snap(drag, i, blocko)\n }\n break\n } else if (i == blocks.length - 1) {\n active = false\n canvas_div.appendChild(document.querySelector('.indicator'))\n drag.parentNode.removeChild(drag)\n }\n }\n } else if (rearrange) {\n var xpos =\n drag.getBoundingClientRect().left + window.scrollX + parseInt(window.getComputedStyle(drag).width) / 2 + canvas_div.scrollLeft\n var ypos = drag.getBoundingClientRect().top + window.scrollY + canvas_div.scrollTop\n var blocko = blocks.map(a => a.id)\n for (var i = 0; i < blocks.length; i++) {\n if (\n xpos >= blocks.filter(a => a.id == blocko[i])[0].x - blocks.filter(a => a.id == blocko[i])[0].width / 2 - paddingx &&\n xpos <= blocks.filter(a => a.id == blocko[i])[0].x + blocks.filter(a => a.id == blocko[i])[0].width / 2 + paddingx &&\n ypos >= blocks.filter(a => a.id == blocko[i])[0].y - blocks.filter(a => a.id == blocko[i])[0].height / 2 &&\n ypos <= blocks.filter(a => a.id == blocko[i])[0].y + blocks.filter(a => a.id == blocko[i])[0].height\n ) {\n active = false\n drag.classList.remove('dragging')\n snap(drag, i, blocko)\n break\n } else if (i == blocks.length - 1) {\n if (beforeDelete(drag, blocks.filter(id => id.id == blocko[i])[0])) {\n active = false\n drag.classList.remove('dragging')\n snap(drag, blocko.indexOf(prevblock), blocko)\n } else {\n rearrange = false\n blockstemp = []\n active = false\n canvas_div.appendChild(document.querySelector('.indicator'))\n drag.parentNode.removeChild(drag)\n }\n }\n }\n }\n }\n }\n\n document.addEventListener('mouseup', flowy.endDrag, false)\n document.addEventListener('touchend', flowy.endDrag, false)\n\n function snap(drag, i, blocko) {\n if (!rearrange) {\n canvas_div.appendChild(drag)\n }\n var totalwidth = 0\n var totalremove = 0\n var maxheight = 0\n for (var w = 0; w < blocks.filter(id => id.parent == blocko[i]).length; w++) {\n var children = blocks.filter(id => id.parent == blocko[i])[w]\n if (children.childwidth > children.width) {\n totalwidth += children.childwidth + paddingx\n } else {\n totalwidth += children.width + paddingx\n }\n }\n totalwidth += parseInt(window.getComputedStyle(drag).width)\n for (var w = 0; w < blocks.filter(id => id.parent == blocko[i]).length; w++) {\n var children = blocks.filter(id => id.parent == blocko[i])[w]\n if (children.childwidth > children.width) {\n document.querySelector(\".blockid[value='\" + children.id + \"']\").parentNode.style.left =\n blocks.filter(a => a.id == blocko[i])[0].x - totalwidth / 2 + totalremove + children.childwidth / 2 - children.width / 2 + 'px'\n children.x = blocks.filter(id => id.parent == blocko[i])[0].x - totalwidth / 2 + totalremove + children.childwidth / 2\n totalremove += children.childwidth + paddingx\n } else {\n document.querySelector(\".blockid[value='\" + children.id + \"']\").parentNode.style.left =\n blocks.filter(a => a.id == blocko[i])[0].x - totalwidth / 2 + totalremove + 'px'\n children.x = blocks.filter(id => id.parent == blocko[i])[0].x - totalwidth / 2 + totalremove + children.width / 2\n totalremove += children.width + paddingx\n }\n }\n drag.style.left =\n blocks.filter(id => id.id == blocko[i])[0].x -\n totalwidth / 2 +\n totalremove -\n (canvas_div.getBoundingClientRect().left + window.scrollX) +\n canvas_div.scrollLeft +\n 'px'\n drag.style.top =\n blocks.filter(id => id.id == blocko[i])[0].y +\n blocks.filter(id => id.id == blocko[i])[0].height / 2 +\n paddingy -\n (canvas_div.getBoundingClientRect().top + window.scrollY) +\n 'px'\n if (rearrange) {\n blockstemp.filter(a => a.id == parseInt(drag.querySelector('.blockid').value))[0].x =\n drag.getBoundingClientRect().left +\n window.scrollX +\n parseInt(window.getComputedStyle(drag).width) / 2 +\n canvas_div.scrollLeft +\n canvas_div.scrollLeft\n blockstemp.filter(a => a.id == parseInt(drag.querySelector('.blockid').value))[0].y =\n drag.getBoundingClientRect().top + window.scrollY + parseInt(window.getComputedStyle(drag).height) / 2 + canvas_div.scrollTop\n blockstemp.filter(a => a.id == drag.querySelector('.blockid').value)[0].parent = blocko[i]\n for (var w = 0; w < blockstemp.length; w++) {\n if (blockstemp[w].id != parseInt(drag.querySelector('.blockid').value)) {\n const blockParent = document.querySelector(\".blockid[value='\" + blockstemp[w].id + \"']\").parentNode\n const arrowParent = document.querySelector(\".arrowid[value='\" + blockstemp[w].id + \"']\").parentNode\n blockParent.style.left =\n blockParent.getBoundingClientRect().left +\n window.scrollX -\n (canvas_div.getBoundingClientRect().left + window.scrollX) +\n canvas_div.scrollLeft +\n 'px'\n blockParent.style.top =\n blockParent.getBoundingClientRect().top +\n window.scrollY -\n (canvas_div.getBoundingClientRect().top + window.scrollY) +\n canvas_div.scrollTop +\n 'px'\n arrowParent.style.left =\n arrowParent.getBoundingClientRect().left +\n window.scrollX -\n (canvas_div.getBoundingClientRect().left + window.scrollX) +\n canvas_div.scrollLeft +\n 20 +\n 'px'\n arrowParent.style.top =\n arrowParent.getBoundingClientRect().top +\n window.scrollY -\n (canvas_div.getBoundingClientRect().top + window.scrollY) +\n canvas_div.scrollTop +\n 'px'\n canvas_div.appendChild(blockParent)\n canvas_div.appendChild(arrowParent)\n\n blockstemp[w].x =\n blockParent.getBoundingClientRect().left +\n window.scrollX +\n parseInt(window.getComputedStyle(blockParent).width) / 2 +\n canvas_div.scrollLeft\n blockstemp[w].y =\n blockParent.getBoundingClientRect().top +\n window.scrollY +\n parseInt(window.getComputedStyle(blockParent).height) / 2 +\n canvas_div.scrollTop\n }\n }\n blocks = blocks.concat(blockstemp)\n blockstemp = []\n } else {\n blocks.push({\n childwidth: 0,\n parent: blocko[i],\n id: parseInt(drag.querySelector('.blockid').value),\n x: drag.getBoundingClientRect().left + window.scrollX + parseInt(window.getComputedStyle(drag).width) / 2 + canvas_div.scrollLeft,\n y: drag.getBoundingClientRect().top + window.scrollY + parseInt(window.getComputedStyle(drag).height) / 2 + canvas_div.scrollTop,\n width: parseInt(window.getComputedStyle(drag).width),\n height: parseInt(window.getComputedStyle(drag).height)\n })\n }\n var arrowhelp = blocks.filter(a => a.id == parseInt(drag.querySelector('.blockid').value))[0]\n var arrowx = arrowhelp.x - blocks.filter(a => a.id == blocko[i])[0].x + 20\n var arrowy = parseFloat(\n arrowhelp.y -\n arrowhelp.height / 2 -\n (blocks.filter(id => id.parent == blocko[i])[0].y + blocks.filter(id => id.parent == blocko[i])[0].height / 2) +\n canvas_div.scrollTop\n )\n if (arrowx < 0) {\n canvas_div.innerHTML +=\n '<div class=\"arrowblock\"><input type=\"hidden\" class=\"arrowid\" value=\"' +\n drag.querySelector('.blockid').value +\n '\"><svg preserveaspectratio=\"none\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M' +\n (blocks.filter(a => a.id == blocko[i])[0].x - arrowhelp.x + 5) +\n ' 0L' +\n (blocks.filter(a => a.id == blocko[i])[0].x - arrowhelp.x + 5) +\n ' ' +\n paddingy / 2 +\n 'L5 ' +\n paddingy / 2 +\n 'L5 ' +\n arrowy +\n '\" stroke=\"#C5CCD0\" stroke-width=\"2px\"/><path d=\"M0 ' +\n (arrowy - 5) +\n 'H10L5 ' +\n arrowy +\n 'L0 ' +\n (arrowy - 5) +\n 'Z\" fill=\"#C5CCD0\"/></svg></div>'\n document.querySelector('.arrowid[value=\"' + drag.querySelector('.blockid').value + '\"]').parentNode.style.left =\n arrowhelp.x - 5 - (canvas_div.getBoundingClientRect().left + window.scrollX) + canvas_div.scrollLeft + 'px'\n } else {\n canvas_div.innerHTML +=\n '<div class=\"arrowblock\"><input type=\"hidden\" class=\"arrowid\" value=\"' +\n drag.querySelector('.blockid').value +\n '\"><svg preserveaspectratio=\"none\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M20 0L20 ' +\n paddingy / 2 +\n 'L' +\n arrowx +\n ' ' +\n paddingy / 2 +\n 'L' +\n arrowx +\n ' ' +\n arrowy +\n '\" stroke=\"#C5CCD0\" stroke-width=\"2px\"/><path d=\"M' +\n (arrowx - 5) +\n ' ' +\n (arrowy - 5) +\n 'H' +\n (arrowx + 5) +\n 'L' +\n arrowx +\n ' ' +\n arrowy +\n 'L' +\n (arrowx - 5) +\n ' ' +\n (arrowy - 5) +\n 'Z\" fill=\"#C5CCD0\"/></svg></div>'\n document.querySelector('.arrowid[value=\"' + parseInt(drag.querySelector('.blockid').value) + '\"]').parentNode.style.left =\n blocks.filter(a => a.id == blocko[i])[0].x -\n 20 -\n (canvas_div.getBoundingClientRect().left + window.scrollX) +\n canvas_div.scrollLeft +\n 'px'\n }\n document.querySelector('.arrowid[value=\"' + parseInt(drag.querySelector('.blockid').value) + '\"]').parentNode.style.top =\n blocks.filter(a => a.id == blocko[i])[0].y + blocks.filter(a => a.id == blocko[i])[0].height / 2 + 'px'\n if (blocks.filter(a => a.id == blocko[i])[0].parent != -1) {\n var flag = false\n var idval = blocko[i]\n while (!flag) {\n if (blocks.filter(a => a.id == idval)[0].parent == -1) {\n flag = true\n } else {\n var zwidth = 0\n for (var w = 0; w < blocks.filter(id => id.parent == idval).length; w++) {\n var children = blocks.filter(id => id.parent == idval)[w]\n if (children.childwidth > children.width) {\n if (w == blocks.filter(id => id.parent == idval).length - 1) {\n zwidth += children.childwidth\n } else {\n zwidth += children.childwidth + paddingx\n }\n } else {\n if (w == blocks.filter(id => id.parent == idval).length - 1) {\n zwidth += children.width\n } else {\n zwidth += children.width + paddingx\n }\n }\n }\n blocks.filter(a => a.id == idval)[0].childwidth = zwidth\n idval = blocks.filter(a => a.id == idval)[0].parent\n }\n }\n blocks.filter(id => id.id == idval)[0].childwidth = totalwidth\n }\n if (rearrange) {\n rearrange = false\n drag.classList.remove('dragging')\n }\n rearrangeMe()\n checkOffset()\n }\n\n function touchblock(event) {\n dragblock = false\n if (hasParentClass(event.target, 'block')) {\n var theblock = event.target.closest('.block')\n if (event.targetTouches) {\n mouse_x = event.targetTouches[0].clientX\n mouse_y = event.targetTouches[0].clientY\n } else {\n mouse_x = event.clientX\n mouse_y = event.clientY\n }\n if (event.type !== 'mouseup' && hasParentClass(event.target, 'block')) {\n if (event.which != 3) {\n if (!active && !rearrange) {\n dragblock = true\n drag = theblock\n dragx = mouse_x - (drag.getBoundingClientRect().left + window.scrollX)\n dragy = mouse_y - (drag.getBoundingClientRect().top + window.scrollY)\n }\n }\n }\n }\n }\n\n function hasParentClass(element, classname) {\n if (element.className) {\n if (element.className.split(' ').indexOf(classname) >= 0) return true\n }\n return element.parentNode && hasParentClass(element.parentNode, classname)\n }\n\n flowy.moveBlock = function (event) {\n if (event.targetTouches) {\n mouse_x = event.targetTouches[0].clientX\n mouse_y = event.targetTouches[0].clientY\n } else {\n mouse_x = event.clientX\n mouse_y = event.clientY\n }\n if (dragblock) {\n rearrange = true\n drag.classList.add('dragging')\n var blockid = parseInt(drag.querySelector('.blockid').value)\n prevblock = blocks.filter(a => a.id == blockid)[0].parent\n blockstemp.push(blocks.filter(a => a.id == blockid)[0])\n blocks = blocks.filter(function (e) {\n return e.id != blockid\n })\n if (blockid != 0) {\n document.querySelector(\".arrowid[value='\" + blockid + \"']\").parentNode.remove()\n }\n var layer = blocks.filter(a => a.parent == blockid)\n var flag = false\n var foundids = []\n var allids = []\n while (!flag) {\n for (var i = 0; i < layer.length; i++) {\n if (layer[i] != blockid) {\n blockstemp.push(blocks.filter(a => a.id == layer[i].id)[0])\n const blockParent = document.querySelector(\".blockid[value='\" + layer[i].id + \"']\").parentNode\n const arrowParent = document.querySelector(\".arrowid[value='\" + layer[i].id + \"']\").parentNode\n blockParent.style.left =\n blockParent.getBoundingClientRect().left + window.scrollX - (drag.getBoundingClientRect().left + window.scrollX) + 'px'\n blockParent.style.top =\n blockParent.getBoundingClientRect().top + window.scrollY - (drag.getBoundingClientRect().top + window.scrollY) + 'px'\n arrowParent.style.left =\n arrowParent.getBoundingClientRect().left + window.scrollX - (drag.getBoundingClientRect().left + window.scrollX) + 'px'\n arrowParent.style.top =\n arrowParent.getBoundingClientRect().top + window.scrollY - (drag.getBoundingClientRect().top + window.scrollY) + 'px'\n drag.appendChild(blockParent)\n drag.appendChild(arrowParent)\n foundids.push(layer[i].id)\n allids.push(layer[i].id)\n }\n }\n if (foundids.length == 0) {\n flag = true\n } else {\n layer = blocks.filter(a => foundids.includes(a.parent))\n foundids = []\n }\n }\n for (var i = 0; i < blocks.filter(a => a.parent == blockid).length; i++) {\n var blocknumber = blocks.filter(a => a.parent == blockid)[i]\n blocks = blocks.filter(function (e) {\n return e.id != blocknumber\n })\n }\n for (var i = 0; i < allids.length; i++) {\n var blocknumber = allids[i]\n blocks = blocks.filter(function (e) {\n return e.id != blocknumber\n })\n }\n if (blocks.length > 1) {\n rearrangeMe()\n }\n if (lastevent) {\n fixOffset()\n }\n dragblock = false\n }\n if (active) {\n drag.style.left = mouse_x - dragx + 'px'\n drag.style.top = mouse_y - dragy + 'px'\n } else if (rearrange) {\n drag.style.left = mouse_x - dragx - (canvas_div.getBoundingClientRect().left + window.scrollX) + canvas_div.scrollLeft + 'px'\n drag.style.top = mouse_y - dragy - (canvas_div.getBoundingClientRect().top + window.scrollY) + canvas_div.scrollTop + 'px'\n blockstemp.filter(a => a.id == parseInt(drag.querySelector('.blockid').value)).x =\n drag.getBoundingClientRect().left + window.scrollX + parseInt(window.getComputedStyle(drag).width) / 2 + canvas_div.scrollLeft\n blockstemp.filter(a => a.id == parseInt(drag.querySelector('.blockid').value)).y =\n drag.getBoundingClientRect().left + window.scrollX + parseInt(window.getComputedStyle(drag).height) / 2 + canvas_div.scrollTop\n }\n if (active || rearrange) {\n var xpos =\n drag.getBoundingClientRect().left + window.scrollX + parseInt(window.getComputedStyle(drag).width) / 2 + canvas_div.scrollLeft\n var ypos = drag.getBoundingClientRect().top + window.scrollY + canvas_div.scrollTop\n var blocko = blocks.map(a => a.id)\n for (var i = 0; i < blocks.length; i++) {\n if (\n xpos >= blocks.filter(a => a.id == blocko[i])[0].x - blocks.filter(a => a.id == blocko[i])[0].width / 2 - paddingx &&\n xpos <= blocks.filter(a => a.id == blocko[i])[0].x + blocks.filter(a => a.id == blocko[i])[0].width / 2 + paddingx &&\n ypos >= blocks.filter(a => a.id == blocko[i])[0].y - blocks.filter(a => a.id == blocko[i])[0].height / 2 &&\n ypos <= blocks.filter(a => a.id == blocko[i])[0].y + blocks.filter(a => a.id == blocko[i])[0].height\n ) {\n document.querySelector(\".blockid[value='\" + blocko[i] + \"']\").parentNode.appendChild(document.querySelector('.indicator'))\n document.querySelector('.indicator').style.left =\n parseInt(window.getComputedStyle(document.querySelector(\".blockid[value='\" + blocko[i] + \"']\").parentNode).width) / 2 -\n 5 +\n 'px'\n document.querySelector('.indicator').style.top =\n window.getComputedStyle(document.querySelector(\".blockid[value='\" + blocko[i] + \"']\").parentNode).height + 'px'\n document.querySelector('.indicator').classList.remove('invisible')\n break\n } else if (i == blocks.length - 1) {\n if (!document.querySelector('.indicator').classList.contains('invisible')) {\n document.querySelector('.indicator').classList.add('invisible')\n }\n }\n }\n }\n }\n\n document.addEventListener('mousemove', flowy.moveBlock, false)\n document.addEventListener('touchmove', flowy.moveBlock, false)\n\n function checkOffset() {\n offsetleft = blocks.map(a => a.x)\n var widths = blocks.map(a => a.width)\n var mathmin = offsetleft.map(function (item, index) {\n return item - widths[index] / 2\n })\n offsetleft = Math.min.apply(Math, mathmin)\n if (offsetleft < canvas_div.getBoundingClientRect().left + window.scrollX) {\n lastevent = true\n var blocko = blocks.map(a => a.id)\n for (var w = 0; w < blocks.length; w++) {\n document.querySelector(\".blockid[value='\" + blocks.filter(a => a.id == blocko[w])[0].id + \"']\").parentNode.style.left =\n blocks.filter(a => a.id == blocko[w])[0].x - blocks.filter(a => a.id == blocko[w])[0].width / 2 - offsetleft + 20 + 'px'\n if (blocks.filter(a => a.id == blocko[w])[0].parent != -1) {\n var arrowhelp = blocks.filter(a => a.id == blocko[w])[0]\n var arrowx = arrowhelp.x - blocks.filter(a => a.id == blocks.filter(a => a.id == blocko[w])[0].parent)[0].x\n if (arrowx < 0) {\n document.querySelector('.arrowid[value=\"' + blocko[w] + '\"]').parentNode.style.left = arrowhelp.x - offsetleft + 20 - 5 + 'px'\n } else {\n document.querySelector('.arrowid[value=\"' + blocko[w] + '\"]').parentNode.style.left =\n blocks.filter(id => id.id == blocks.filter(a => a.id == blocko[w])[0].parent)[0].x - 20 - offsetleft + 20 + 'px'\n }\n }\n }\n for (var w = 0; w < blocks.length; w++) {\n blocks[w].x =\n document.querySelector(\".blockid[value='\" + blocks[w].id + \"']\").parentNode.getBoundingClientRect().left +\n window.scrollX +\n (canvas_div.getBoundingClientRect().left + canvas_div.scrollLeft) -\n parseInt(window.getComputedStyle(document.querySelector(\".blockid[value='\" + blocks[w].id + \"']\").parentNode).width) / 2 -\n 40\n }\n offsetleftold = offsetleft\n }\n }\n\n function fixOffset() {\n if (offsetleftold < canvas_div.getBoundingClientRect().left + window.scrollX) {\n lastevent = false\n var blocko = blocks.map(a => a.id)\n for (var w = 0; w < blocks.length; w++) {\n document.querySelector(\".blockid[value='\" + blocks.filter(a => a.id == blocko[w])[0].id + \"']\").parentNode.style.left =\n blocks.filter(a => a.id == blocko[w])[0].x - blocks.filter(a => a.id == blocko[w])[0].width / 2 - offsetleftold - 20 + 'px'\n blocks.filter(a => a.id == blocko[w])[0].x =\n document\n .querySelector(\".blockid[value='\" + blocks.filter(a => a.id == blocko[w])[0].id + \"']\")\n .parentNode.getBoundingClientRect().left +\n window.scrollX +\n blocks.filter(a => a.id == blocko[w])[0].width / 2\n\n if (blocks.filter(a => a.id == blocko[w])[0].parent != -1) {\n var arrowhelp = blocks.filter(a => a.id == blocko[w])[0]\n var arrowx = arrowhelp.x - blocks.filter(a => a.id == blocks.filter(a => a.id == blocko[w])[0].parent)[0].x\n if (arrowx < 0) {\n document.querySelector('.arrowid[value=\"' + blocko[w] + '\"]').parentNode.style.left =\n arrowhelp.x - 5 - (canvas_div.getBoundingClientRect().left + window.scrollX) + 'px'\n } else {\n document.querySelector('.arrowid[value=\"' + blocko[w] + '\"]').parentNode.style.left =\n blocks.filter(id => id.id == blocks.filter(a => a.id == blocko[w])[0].parent)[0].x -\n 20 -\n (canvas_div.getBoundingClientRect().left + window.scrollX) +\n 'px'\n }\n }\n }\n offsetleftold = 0\n }\n }\n\n function rearrangeMe() {\n var result = blocks.map(a => a.parent)\n for (var z = 0; z < result.length; z++) {\n if (result[z] == -1) {\n z++\n }\n var totalwidth = 0\n var totalremove = 0\n var maxheight = 0\n for (var w = 0; w < blocks.filter(id => id.parent == result[z]).length; w++) {\n var children = blocks.filter(id => id.parent == result[z])[w]\n if (blocks.filter(id => id.parent == children.id).length == 0) {\n children.childwidth = 0\n }\n if (children.childwidth > children.width) {\n if (w == blocks.filter(id => id.parent == result[z]).length - 1) {\n totalwidth += children.childwidth\n } else {\n totalwidth += children.childwidth + paddingx\n }\n } else {\n if (w == blocks.filter(id => id.parent == result[z]).length - 1) {\n totalwidth += children.width\n } else {\n totalwidth += children.width + paddingx\n }\n }\n }\n if (result[z] != -1) {\n blocks.filter(a => a.id == result[z])[0].childwidth = totalwidth\n }\n for (var w = 0; w < blocks.filter(id => id.parent == result[z]).length; w++) {\n var children = blocks.filter(id => id.parent == result[z])[w]\n const r_block = document.querySelector(\".blockid[value='\" + children.id + \"']\").parentNode\n const r_array = blocks.filter(id => id.id == result[z])\n r_block.style.top = r_array.y + paddingy + 'px'\n r_array.y = r_array.y + paddingy\n if (children.childwidth > children.width) {\n r_block.style.left =\n r_array[0].x -\n totalwidth / 2 +\n totalremove +\n children.childwidth / 2 -\n children.width / 2 -\n (canvas_div.getBoundingClientRect().left + window.scrollX) +\n 'px'\n children.x = r_array[0].x - totalwidth / 2 + totalremove + children.childwidth / 2\n totalremove += children.childwidth + paddingx\n } else {\n r_block.style.left =\n r_array[0].x - totalwidth / 2 + totalremove - (canvas_div.getBoundingClientRect().left + window.scrollX) + 'px'\n children.x = r_array[0].x - totalwidth / 2 + totalremove + children.width / 2\n totalremove += children.width + paddingx\n }\n var arrowhelp = blocks.filter(a => a.id == children.id)[0]\n var arrowx = arrowhelp.x - blocks.filter(a => a.id == children.parent)[0].x + 20\n var arrowy =\n arrowhelp.y -\n arrowhelp.height / 2 -\n (blocks.filter(a => a.id == children.parent)[0].y + blocks.filter(a => a.id == children.parent)[0].height / 2)\n document.querySelector('.arrowid[value=\"' + children.id + '\"]').parentNode.style.top =\n blocks.filter(id => id.id == children.parent)[0].y +\n blocks.filter(id => id.id == children.parent)[0].height / 2 -\n (canvas_div.getBoundingClientRect().top + window.scrollY) +\n 'px'\n if (arrowx < 0) {\n document.querySelector('.arrowid[value=\"' + children.id + '\"]').parentNode.style.left =\n arrowhelp.x - 5 - (canvas_div.getBoundingClientRect().left + window.scrollX) + 'px'\n document.querySelector('.arrowid[value=\"' + children.id + '\"]').parentNode.innerHTML =\n '<input type=\"hidden\" class=\"arrowid\" value=\"' +\n children.id +\n '\"><svg preserveaspectratio=\"none\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M' +\n (blocks.filter(id => id.id == children.parent)[0].x - arrowhelp.x + 5) +\n ' 0L' +\n (blocks.filter(id => id.id == children.parent)[0].x - arrowhelp.x + 5) +\n ' ' +\n paddingy / 2 +\n 'L5 ' +\n paddingy / 2 +\n 'L5 ' +\n arrowy +\n '\" stroke=\"#C5CCD0\" stroke-width=\"2px\"/><path d=\"M0 ' +\n (arrowy - 5) +\n 'H10L5 ' +\n arrowy +\n 'L0 ' +\n (arrowy - 5) +\n 'Z\" fill=\"#C5CCD0\"/></svg>'\n } else {\n document.querySelector('.arrowid[value=\"' + children.id + '\"]').parentNode.style.left =\n blocks.filter(id => id.id == children.parent)[0].x - 20 - (canvas_div.getBoundingClientRect().left + window.scrollX) + 'px'\n document.querySelector('.arrowid[value=\"' + children.id + '\"]').parentNode.innerHTML =\n '<input type=\"hidden\" class=\"arrowid\" value=\"' +\n children.id +\n '\"><svg preserveaspectratio=\"none\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M20 0L20 ' +\n paddingy / 2 +\n 'L' +\n arrowx +\n ' ' +\n paddingy / 2 +\n 'L' +\n arrowx +\n ' ' +\n arrowy +\n '\" stroke=\"#C5CCD0\" stroke-width=\"2px\"/><path d=\"M' +\n (arrowx - 5) +\n ' ' +\n (arrowy - 5) +\n 'H' +\n (arrowx + 5) +\n 'L' +\n arrowx +\n ' ' +\n arrowy +\n 'L' +\n (arrowx - 5) +\n ' ' +\n (arrowy - 5) +\n 'Z\" fill=\"#C5CCD0\"/></svg>'\n }\n }\n }\n }\n }\n flowy.load()\n\n function blockGrabbed(block) {\n grab(block)\n }\n\n function blockReleased() {\n release()\n }\n\n function blockSnap(drag, first, parent) {\n return snapping(drag, first, parent)\n }\n\n function beforeDelete(drag, parent) {\n return rearrange(drag, parent)\n }\n\n function addEventListenerMulti(type, listener, capture, selector) {\n var nodes = document.querySelectorAll(selector)\n for (var i = 0; i < nodes.length; i++) {\n nodes[i].addEventListener(type, listener, capture)\n }\n }\n\n function removeEventListenerMulti(type, listener, capture, selector) {\n var nodes = document.querySelectorAll(selector)\n for (var i = 0; i < nodes.length; i++) {\n nodes[i].removeEventListener(type, listener, capture)\n }\n }\n}\n\nexport default flowy\n"],"names":["flowy","canvas","grab","release","snapping","rearrange","spacing_x","spacing_y","loaded","blockSnap","drag","first","parent","beforeDelete","load","dragx","dragy","original","mouse_x","mouse_y","blocks","blockstemp","canvas_div","active","paddingx","paddingy","offsetleft","offsetleftold","lastevent","dragblock","prevblock","el","document","createElement","classList","add","appendChild","import","output","innerHTML","html","blockarr","length","rearrangeMe","json_data","i","push","id","data","attr","blockParent","querySelector","parentNode","querySelectorAll","forEach","block","json_name","getAttribute","name","value","Array","prototype","slice","call","attributes","attribute","jsonobj","deleteBlocks","beginDrag","event","targetTouches","changedTouches","clientX","clientY","which","target","closest","newNode","cloneNode","remove","body","Math","max","apply","map","a","parseInt","getBoundingClientRect","left","top","style","addEventListener","touchblock","touchDone","endDrag","contains","w","arrowParent","window","scrollX","scrollLeft","scrollY","scrollTop","x","offsetWidth","y","offsetHeight","filter","getComputedStyle","width","height","concat","undefined","childwidth","removeChild","xpos","ypos","blocko","snap","indexOf","moveBlock","blockid","e","layer","flag","foundids","allids","includes","blocknumber","arrowhelp","arrowx","fixOffset","totalwidth","totalremove","children","arrowy","parseFloat","idval","zwidth","widths","mathmin","item","index","min","checkOffset","hasParentClass","theblock","type","element","classname","className","split","result","z","r_block","r_array"],"mappings":"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