├── .browserslistrc ├── .gitignore ├── LICENSE ├── README.md ├── babel.config.js ├── docs ├── css │ └── app.77376fe9.css ├── favicon.ico ├── index.html └── js │ ├── app.76c2ed65.js │ ├── app.76c2ed65.js.map │ ├── chunk-vendors.a25a9b30.js │ └── chunk-vendors.a25a9b30.js.map ├── package-lock.json ├── package.json ├── public ├── favicon.ico └── index.html ├── src ├── App.vue ├── components │ ├── VueBlock.vue │ ├── VueBlockProperty.vue │ ├── VueBlocksContainer.vue │ └── VueLink.vue ├── helpers │ ├── dom.js │ └── mouse.js ├── index.js └── main.js └── vue.config.js /.browserslistrc: -------------------------------------------------------------------------------- 1 | > 1% 2 | last 2 versions 3 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | node_modules 3 | /dist 4 | 5 | # local env files 6 | .env.local 7 | .env.*.local 8 | 9 | # Log files 10 | npm-debug.log* 11 | yarn-debug.log* 12 | yarn-error.log* 13 | 14 | # Editor directories and files 15 | .idea 16 | .vscode 17 | *.suo 18 | *.ntvs* 19 | *.njsproj 20 | *.sln 21 | *.sw? 22 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2017 Maurizio Bonani 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ## Vue-Blocks 2 | 3 | ### Demo 4 | 5 | [Demo](https://ghostiam.github.io/vue-blocks/index.html) 6 | 7 | ### Basic usage 8 | 9 | ``` html 10 | 19 | 20 | 104 | 105 | 106 | 124 | ``` 125 | 126 | ### Props 127 | 128 | #### blocksContent 129 | 130 | Type: `Array.`
131 | Required: `true`
132 | Default: `[]` 133 | 134 | Object `Node`: 135 | ``` 136 | { 137 | name: 'name-node', 138 | title: 'Title node', 139 | family: 'family - just for grouping', 140 | description: 'Description text', 141 | fields: Array. 142 | } 143 | ``` 144 | 145 | Object `NodeField`: 146 | ``` 147 | { 148 | name: 'name', 149 | type: 'type-name', // not used 150 | attr: 'attribute' // input/output or custom 151 | 'other': - for custom 152 | } 153 | ``` 154 | 155 | Custom attributes are available in `scene.blocks[index].values.YourAttrName` 156 | 157 | #### scene 158 | 159 | Type: `Object`
160 | Required: `false`
161 | Default: 162 | ``` 163 | { 164 | blocks: [], 165 | links: [], 166 | container: {} 167 | } 168 | ``` 169 | 170 | Object `Scene`: 171 | ``` 172 | { 173 | blocks: Array., 174 | links: Array., 175 | container: { 176 | centerX: number 177 | centerY: number 178 | scale: number 179 | } 180 | } 181 | ``` 182 | 183 | Object `Block`: 184 | ``` 185 | { 186 | id: number, 187 | x: number, 188 | y: number, 189 | name: string, 190 | title: string, 191 | values: { 192 | customAttribute: [ // show "NodeField" 193 | name: NodeField (without name and attr fields) 194 | ] 195 | } 196 | } 197 | ``` 198 | 199 | Object `BlockLinks`: 200 | ``` 201 | { 202 | id: number, // ID 203 | originID: number, // Origin block ID 204 | originSlot: number, // Origin block slot number 205 | targetID: number, // Target block ID 206 | targetSlot: number // Target block slot number 207 | } 208 | ``` 209 | 210 | ## Build Setup 211 | 212 | ``` bash 213 | # install dependencies 214 | npm install 215 | 216 | # serve with hot reload at localhost:8080 217 | npm run serve 218 | 219 | # build for production with minification 220 | npm run build 221 | 222 | # build for github pages 223 | npm run build:docs 224 | 225 | ``` 226 | 227 | ## License 228 | 229 | [MIT license](LICENSE) 230 | -------------------------------------------------------------------------------- /babel.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | presets: [ 3 | '@vue/cli-plugin-babel/preset' 4 | ] 5 | } 6 | -------------------------------------------------------------------------------- /docs/css/app.77376fe9.css: -------------------------------------------------------------------------------- 1 | .vue-block[data-v-9a4bcc94]{position:absolute;-webkit-box-sizing:border-box;box-sizing:border-box;border:1px solid #000;background:#fff;z-index:1;opacity:.9;cursor:move}.vue-block.selected[data-v-9a4bcc94]{border:1px solid red;z-index:2}.vue-block>header[data-v-9a4bcc94]{background:#bfbfbf;text-align:center}.vue-block>header>.delete[data-v-9a4bcc94]{color:red;cursor:pointer;float:right;position:absolute;right:5px}.vue-block .inputs[data-v-9a4bcc94],.vue-block .outputs[data-v-9a4bcc94]{padding:2px 0;display:block;width:50%}.vue-block .inputs>[data-v-9a4bcc94],.vue-block .outputs>[data-v-9a4bcc94]{width:100%}.vue-block .circle[data-v-9a4bcc94]{-webkit-box-sizing:border-box;box-sizing:border-box;margin-top:3px;width:10px;height:10px;border:1px solid rgba(0,0,0,.5);border-radius:100%;cursor:crosshair}.vue-block .circle.active[data-v-9a4bcc94]{background:#ff0}.vue-block .inputs[data-v-9a4bcc94]{float:left;text-align:left;margin-left:-6px}.vue-block .input[data-v-9a4bcc94],.vue-block .output[data-v-9a4bcc94]{height:16px;overflow:hidden;font-size:14px}.vue-block .input[data-v-9a4bcc94]{float:left}.vue-block .input .circle[data-v-9a4bcc94]{float:left;margin-right:2px}.vue-block .input .circle[data-v-9a4bcc94]:hover{background:#0f0}.vue-block .input .circle:hover.active[data-v-9a4bcc94]{background:red}.vue-block .outputs[data-v-9a4bcc94]{float:right;text-align:right;margin-right:-6px}.vue-block .output[data-v-9a4bcc94]{float:right}.vue-block .output .circle[data-v-9a4bcc94]{float:right;margin-left:2px}.vue-block .output .circle[data-v-9a4bcc94]:hover{background:#0f0}.vue-container[data-v-cd11bc44]{position:relative;overflow:hidden;-webkit-box-sizing:border-box;box-sizing:border-box}.blocks-properties[data-v-d11cfc5a]{position:absolute;right:0;top:0;width:300px;min-height:200px;-webkit-box-sizing:border-box;box-sizing:border-box;padding:10px;background:#fff;border:1px solid red}body,html{margin:0;padding:0}html{width:100vw;height:100vh}body{width:100%;height:100%}#app{width:calc(100% - 40px);height:calc(100% - 40px);padding:20px 0 0 20px}.container{width:100%;height:calc(100% - 50px);border:1px solid #000}#contextMenu{position:absolute;z-index:1000;background:#fff;border:1px solid #000;padding:5px;margin:0}#contextMenu li{list-style:none}#contextMenu li.label{color:grey;font-size:90%}#contextMenu:focus{outline:none} -------------------------------------------------------------------------------- /docs/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ghostiam/vue-blocks/87b89587c9d27a0a0ba8c3fb1dfe2c27eb15e748/docs/favicon.ico -------------------------------------------------------------------------------- /docs/index.html: -------------------------------------------------------------------------------- 1 | vue-blocks
-------------------------------------------------------------------------------- /docs/js/app.76c2ed65.js: -------------------------------------------------------------------------------- 1 | (function(t){function e(e){for(var i,r,l=e[0],a=e[1],c=e[2],h=0,d=[];h-1:t.useContextMenu},on:{change:function(e){var n=t.useContextMenu,i=e.target,o=!!i.checked;if(Array.isArray(n)){var s=null,r=t._i(n,s);i.checked?r<0&&(t.useContextMenu=n.concat([s])):r>-1&&(t.useContextMenu=n.slice(0,r).concat(n.slice(r+1)))}else t.useContextMenu=o}}}),t._v("Use right click for Add blocks ")]),n("ul",{directives:[{name:"show",rawName:"v-show",value:t.contextMenu.isShow,expression:"contextMenu.isShow"}],ref:"contextMenu",style:{top:t.contextMenu.top+"px",left:t.contextMenu.left+"px"},attrs:{id:"contextMenu",tabindex:"-1"},on:{blur:t.closeContextMenu}},[t._l(t.selectBlocksType,(function(e){return[n("li",{staticClass:"label"},[t._v(t._s(e))]),t._l(t.filteredBlocks(e),(function(e){return n("li",{on:{click:function(n){return t.addBlockContextMenu(e.name)}}},[t._v(t._s(e.title||e.name)+" ")])}))]}))],2)],1)},s=[],r=(n("4de4"),n("7db0"),n("c975"),n("d81d"),n("d3b7"),n("ddb0"),n("3c4e")),l=n.n(r),a=function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("div",{staticClass:"vue-container"},[n("VueLink",{attrs:{lines:t.lines}}),t._l(t.blocks,(function(e){return n("VueBlock",t._b({key:e.id,attrs:{options:t.optionsForChild},on:{update:t.updateScene,linkingStart:function(n){return t.linkingStart(e,n)},linkingStop:function(n){return t.linkingStop(e,n)},linkingBreak:function(n){return t.linkingBreak(e,n)},select:function(n){return t.blockSelect(e)},delete:function(n){return t.blockDelete(e)}}},"VueBlock",e,!1,!0))}))],2)},c=[],u=(n("a4d3"),n("e01a"),n("d28b"),n("99af"),n("4160"),n("45fc"),n("b0c0"),n("3ca3"),n("159b"),n("2909"));function h(t){var e=t.getBoundingClientRect(),n=window.pageYOffset,i=window.pageXOffset,o=e.top+n,s=e.left+i;return{top:Math.round(o),left:Math.round(s)}}var d={getOffsetRect:h};function p(t,e){var n=e.pageX||e.clientX+document.documentElement.scrollLeft,i=e.pageY||e.clientY+document.documentElement.scrollTop,o=h(t),s=n-o.left,r=i-o.top;return{x:s,y:r}}var f={getMousePosition:p},m=function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("div",{staticClass:"vue-block",class:{selected:t.selected},style:t.style},[n("header",{style:t.headerStyle},[t._v(" "+t._s(t.title)+" "),n("a",{staticClass:"delete",on:{click:t.deleteBlock}},[t._v("x")])]),n("div",{staticClass:"inputs"},t._l(t.inputs,(function(e,i){return n("div",{staticClass:"input"},[n("div",{staticClass:"circle inputSlot",class:{active:e.active},on:{mouseup:function(e){return t.slotMouseUp(e,i)},mousedown:function(e){return t.slotBreak(e,i)}}}),t._v(" "+t._s(e.label)+" ")])})),0),n("div",{staticClass:"outputs"},t._l(t.outputs,(function(e,i){return n("div",{staticClass:"output"},[n("div",{staticClass:"circle",class:{active:e.active},on:{mousedown:function(e){return t.slotMouseDown(e,i)}}}),t._v(" "+t._s(e.label)+" ")])})),0)])},y=[],v=(n("a9e3"),{name:"VueBlock",props:{x:{type:Number,default:0,validator:function(t){return"number"===typeof t}},y:{type:Number,default:0,validator:function(t){return"number"===typeof t}},selected:Boolean,title:{type:String,default:"Title"},inputs:Array,outputs:Array,options:{type:Object}},created:function(){this.mouseX=0,this.mouseY=0,this.lastMouseX=0,this.lastMouseY=0,this.linking=!1,this.dragging=!1},mounted:function(){document.documentElement.addEventListener("mousemove",this.handleMove,!0),document.documentElement.addEventListener("mousedown",this.handleDown,!0),document.documentElement.addEventListener("mouseup",this.handleUp,!0)},beforeDestroy:function(){document.documentElement.removeEventListener("mousemove",this.handleMove,!0),document.documentElement.removeEventListener("mousedown",this.handleDown,!0),document.documentElement.removeEventListener("mouseup",this.handleUp,!0)},data:function(){return{width:this.options.width,hasDragged:!1}},methods:{handleMove:function(t){if(this.mouseX=t.pageX||t.clientX+document.documentElement.scrollLeft,this.mouseY=t.pageY||t.clientY+document.documentElement.scrollTop,this.dragging&&!this.linking){var e=this.mouseX-this.lastMouseX,n=this.mouseY-this.lastMouseY;this.lastMouseX=this.mouseX,this.lastMouseY=this.mouseY,this.moveWithDiff(e,n),this.hasDragged=!0}},handleDown:function(t){this.mouseX=t.pageX||t.clientX+document.documentElement.scrollLeft,this.mouseY=t.pageY||t.clientY+document.documentElement.scrollTop,this.lastMouseX=this.mouseX,this.lastMouseY=this.mouseY;var e=t.target||t.srcElement;this.$el.contains(e)&&1===t.which&&(this.dragging=!0,this.$emit("select"),t.preventDefault&&t.preventDefault())},handleUp:function(){this.dragging&&(this.dragging=!1,this.hasDragged&&(this.save(),this.hasDragged=!1)),this.linking&&(this.linking=!1)},slotMouseDown:function(t,e){this.linking=!0,this.$emit("linkingStart",e),t.preventDefault&&t.preventDefault()},slotMouseUp:function(t,e){this.$emit("linkingStop",e),t.preventDefault&&t.preventDefault()},slotBreak:function(t,e){this.linking=!0,this.$emit("linkingBreak",e),t.preventDefault&&t.preventDefault()},save:function(){this.$emit("update")},deleteBlock:function(){this.$emit("delete")},moveWithDiff:function(t,e){var n=this.x+t/this.options.scale,i=this.y+e/this.options.scale;this.$emit("update:x",n),this.$emit("update:y",i)}},computed:{style:function(){return{top:this.options.center.y+this.y*this.options.scale+"px",left:this.options.center.x+this.x*this.options.scale+"px",width:this.width+"px",transform:"scale("+this.options.scale+")",transformOrigin:"top left"}},headerStyle:function(){return{height:this.options.titleHeight+"px"}}}}),g=v,k=(n("3230"),n("2877")),x=Object(k["a"])(g,m,y,!1,null,"9a4bcc94",null),b=x.exports,S=function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("svg",{attrs:{width:"100%",height:"100%"}},[t._l(t.renderedPathes,(function(e){return n("g",[t.outline?n("path",{style:e.outlineStyle,attrs:{d:e.data}}):t._e(),n("path",{style:e.style,attrs:{d:e.data}})])})),n("g",t._l(t.renderedArrows,(function(t){return n("path",{style:t.style,attrs:{d:"M -1 -1 L 0 1 L 1 -1 z",transform:t.transform}})})),0)],2)},D=[],M={props:{lines:{type:Array,default:function(){return[]}},outline:{type:Boolean,default:!1}},methods:{distance:function(t,e,n,i){return Math.sqrt((n-t)*(n-t)+(i-e)*(i-e))},computeConnectionPoint:function(t,e,n,i,o){var s=this.distance(t,e,n,i),r={x:t,y:e},l={x:t+.25*s,y:e},a={x:n-.25*s,y:i},c={x:n,y:i},u=(1-o)*(1-o)*(1-o),h=(1-o)*(1-o)*3*o,d=3*(1-o)*(o*o),p=o*o*o,f=u*r.x+h*l.x+d*a.x+p*c.x,m=u*r.y+h*l.y+d*a.y+p*c.y;return{x:f,y:m}}},computed:{renderedPathes:function(){var t=this;if(!this.lines)return[];var e=[];return this.lines.forEach((function(n){var i=.25*t.distance(n.x1,n.y1,n.x2,n.y2);e.push({data:"M ".concat(n.x1,", ").concat(n.y1," C ").concat(n.x1+i,", ").concat(n.y1,", ").concat(n.x2-i,", ").concat(n.y2,", ").concat(n.x2,", ").concat(n.y2),style:n.style,outlineStyle:n.outlineStyle})})),e},renderedArrows:function(){var t=this;if(!this.lines)return[];var e=[];return this.lines.forEach((function(n){var i=t.computeConnectionPoint(n.x1,n.y1,n.x2,n.y2,.5),o=t.computeConnectionPoint(n.x1,n.y1,n.x2,n.y2,.51),s=-Math.atan2(o.x-i.x,o.y-i.y),r=180*(s>=0?s:2*Math.PI+s)/Math.PI;e.push({transform:"translate(".concat(i.x,", ").concat(i.y,") rotate(").concat(r,")"),style:{stroke:n.style.stroke,strokeWidth:2*n.style.strokeWidth,fill:n.style.stroke}})})),e}}},w=M,C=Object(k["a"])(w,S,D,!1,null,"56aa24a8",null),B=C.exports,E={name:"VueBlockContainer",components:{VueBlock:b,VueLink:B},props:{blocksContent:{type:Array,default:function(){return[]}},scene:{type:Object,default:{blocks:[],links:[],container:{}}},options:{type:Object}},mounted:function(){document.documentElement.addEventListener("mousemove",this.handleMove,!0),document.documentElement.addEventListener("mousedown",this.handleDown,!0),document.documentElement.addEventListener("mouseup",this.handleUp,!0),document.documentElement.addEventListener("wheel",this.handleWheel,!0),this.centerX=this.$el.clientWidth/2,this.centerY=this.$el.clientHeight/2,this.importBlocksContent(),this.importScene()},beforeDestroy:function(){document.documentElement.removeEventListener("mousemove",this.handleMove,!0),document.documentElement.removeEventListener("mousedown",this.handleDown,!0),document.documentElement.removeEventListener("mouseup",this.handleUp,!0),document.documentElement.removeEventListener("wheel",this.handleWheel,!0)},created:function(){this.mouseX=0,this.mouseY=0,this.lastMouseX=0,this.lastMouseY=0,this.minScale=.2,this.maxScale=5,this.linking=!1,this.linkStartData=null,this.inputSlotClassName="inputSlot",this.defaultScene={blocks:[],links:[],container:{}}},data:function(){return{dragging:!1,centerX:0,centerY:0,scale:1,nodes:[],blocks:[],links:[],tempLink:null,selectedBlock:null,hasDragged:!1}},computed:{optionsForChild:function(){return{width:200,titleHeight:20,scale:this.scale,inputSlotClassName:this.inputSlotClassName,center:{x:this.centerX,y:this.centerY}}},container:function(){return{centerX:this.centerX,centerY:this.centerY,scale:this.scale}},lines:function(){var t=this,e=[],n=!0,i=!1,o=void 0;try{for(var s,r=function(){var n=s.value,i=t.blocks.find((function(t){return t.id===n.originID})),o=t.blocks.find((function(t){return t.id===n.targetID}));if(!i||!o)return console.log("Remove invalid link",n),t.removeLink(n.id),"continue";if(i.id===o.id)return console.log("Loop detected, remove link",n),t.removeLink(n.id),"continue";var r=t.getConnectionPos(i,n.originSlot,!1),l=t.getConnectionPos(o,n.targetSlot,!0);if(!r||!l)return console.log("Remove invalid link (slot not exist)",n),t.removeLink(n.id),"continue";var a=r.x,c=r.y,u=l.x,h=l.y;e.push({x1:a,y1:c,x2:u,y2:h,style:{stroke:"#F85",strokeWidth:4*t.scale,fill:"none"},outlineStyle:{stroke:"#666",strokeWidth:6*t.scale,strokeOpacity:.6,fill:"none"}})},l=this.links[Symbol.iterator]();!(n=(s=l.next()).done);n=!0)r()}catch(a){i=!0,o=a}finally{try{n||null==l.return||l.return()}finally{if(i)throw o}}return this.tempLink&&(this.tempLink.style={stroke:"#8f8f8f",strokeWidth:4*this.scale,fill:"none"},e.push(this.tempLink)),e}},methods:{handleMove:function(t){var e=f.getMousePosition(this.$el,t);if(this.mouseX=e.x,this.mouseY=e.y,this.dragging){var n=this.mouseX-this.lastMouseX,i=this.mouseY-this.lastMouseY;this.lastMouseX=this.mouseX,this.lastMouseY=this.mouseY,this.centerX+=n,this.centerY+=i,this.hasDragged=!0}if(this.linking&&this.linkStartData){var o=this.getConnectionPos(this.linkStartData.block,this.linkStartData.slotNumber,!1);this.tempLink={x1:o.x,y1:o.y,x2:this.mouseX,y2:this.mouseY}}},handleDown:function(t){var e=t.target||t.srcElement;if((e===this.$el||e.matches("svg, svg *"))&&1===t.which){this.dragging=!0;var n=f.getMousePosition(this.$el,t);this.mouseX=n.x,this.mouseY=n.y,this.lastMouseX=this.mouseX,this.lastMouseY=this.mouseY,this.deselectAll(),t.preventDefault&&t.preventDefault()}},handleUp:function(t){var e=t.target||t.srcElement;this.dragging&&(this.dragging=!1,this.hasDragged&&(this.updateScene(),this.hasDragged=!1)),!this.$el.contains(e)||"string"===typeof e.className&&-1!==e.className.indexOf(this.inputSlotClassName)||(this.linking=!1,this.tempLink=null,this.linkStartData=null)},handleWheel:function(t){var e=t.target||t.srcElement;if(this.$el.contains(e)){t.preventDefault&&t.preventDefault();var n=Math.pow(1.1,-.01*t.deltaY);if(this.scale*=n,this.scalethis.maxScale)return void(this.scale=this.maxScale);var i={x:this.mouseX,y:this.mouseY},o=(i.x-this.centerX)*(n-1),s=(i.y-this.centerY)*(n-1);this.centerX-=o,this.centerY-=s,this.updateScene()}},getConnectionPos:function(t,e,n){if(t&&-1!==e){var i=0,o=0;if(i+=t.x,o+=t.y,o+=this.optionsForChild.titleHeight,n&&t.inputs.length>e);else{if(n||!(t.outputs.length>e))return void console.error("slot "+e+" not found, is input: "+n,t);i+=this.optionsForChild.width}return o+=11,o+=16*e,i*=this.scale,o*=this.scale,i+=this.centerX,o+=this.centerY,{x:i,y:o}}},linkingStart:function(t,e){this.linkStartData={block:t,slotNumber:e};var n=this.getConnectionPos(this.linkStartData.block,this.linkStartData.slotNumber,!1);this.tempLink={x1:n.x,y1:n.y,x2:this.mouseX,y2:this.mouseY},this.linking=!0},linkingStop:function(t,e){if(this.linkStartData&&t&&e>-1){this.links=this.links.filter((function(n){return!(n.targetID===t.id&&n.targetSlot===e)}));var n=Math.max.apply(Math,[0].concat(Object(u["a"])(this.links.map((function(t){return t.id})))));this.linkStartData.block.id!==t.id&&(this.links.push({id:n+1,originID:this.linkStartData.block.id,originSlot:this.linkStartData.slotNumber,targetID:t.id,targetSlot:e}),this.updateScene())}this.linking=!1,this.tempLink=null,this.linkStartData=null},linkingBreak:function(t,e){if(t&&e>-1){var n=this.links.find((function(n){return n.targetID===t.id&&n.targetSlot===e}));if(n){var i=this.blocks.find((function(t){return t.id===n.originID}));this.links=this.links.filter((function(n){return!(n.targetID===t.id&&n.targetSlot===e)})),this.linkingStart(i,n.originSlot),this.updateScene()}}},removeLink:function(t){this.links=this.links.filter((function(e){return!(e.id===t)}))},addNewBlock:function(t,e,n){var i=Math.max.apply(Math,[0].concat(Object(u["a"])(this.blocks.map((function(t){return t.id}))))),o=this.nodes.find((function(e){return e.name===t}));if(o){var s=this.createBlock(o,i+1);void 0===e||void 0===n?(e=(this.$el.clientWidth/2-this.centerX)/this.scale,n=(this.$el.clientHeight/2-this.centerY)/this.scale):(e=(e-this.centerX)/this.scale,n=(n-this.centerY)/this.scale),s.x=e,s.y=n,this.blocks.push(s),this.updateScene()}},createBlock:function(t,e){var n=[],i=[],o={};return t.fields.forEach((function(t){if("input"===t.attr)n.push({name:t.name,label:t.label||t.name});else if("output"===t.attr)i.push({name:t.name,label:t.label||t.name});else{o[t.attr]||(o[t.attr]={});var e=l()({},t);delete e["name"],delete e["attr"],o[t.attr][t.name]||(o[t.attr][t.name]={}),o[t.attr][t.name]=e}})),{id:e,x:0,y:0,selected:!1,name:t.name,title:t.title||t.name,inputs:n,outputs:i,values:o}},deselectAll:function(){var t=this,e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:null;this.blocks.forEach((function(n){n.id!==e&&n.selected&&t.blockDeselect(n)}))},blockSelect:function(t){t.selected=!0,this.selectedBlock=t,this.deselectAll(t.id),this.$emit("blockSelect",t)},blockDeselect:function(t){t.selected=!1,t&&this.selectedBlock&&this.selectedBlock.id===t.id&&(this.selectedBlock=null),this.$emit("blockDeselect",t)},blockDelete:function(t){var e=this;t.selected&&this.blockDeselect(t),this.links.forEach((function(n){n.originID!==t.id&&n.targetID!==t.id||e.removeLink(n.id)})),this.blocks=this.blocks.filter((function(e){return e.id!==t.id})),this.updateScene()},prepareBlocks:function(t){var e=this;return t.map((function(t){var n=e.nodes.find((function(e){return e.name===t.name}));if(!n)return null;var i=e.createBlock(n,t.id);return i=l()(i,t,{arrayMerge:function(t,e){return 0===e.length?t:e}}),i})).filter((function(t){return!!t}))},prepareBlocksLinking:function(t,e){if(!t)return[];var n=[];return t.forEach((function(t){var i=e.filter((function(e){return e.targetID===t.id})),o=e.filter((function(e){return e.originID===t.id}));t.inputs.forEach((function(e,n){t.inputs[n].active=i.some((function(t){return t.targetSlot===n}))})),t.outputs.forEach((function(e,n){t.outputs[n].active=o.some((function(t){return t.originSlot===n}))})),n.push(t)})),n},importBlocksContent:function(){this.blocksContent&&(this.nodes=l()([],this.blocksContent))},importScene:function(){var t=this,e=l()(this.defaultScene,this.scene),n=this.prepareBlocks(e.blocks);if(n=this.prepareBlocksLinking(n,e.links),this.selectedBlock){var i=n.find((function(e){return t.selectedBlock.id===e.id}));i&&(i.selected=!0)}this.blocks=n,this.links=l()([],e.links);var o=e.container;o.centerX&&(this.centerX=o.centerX),o.centerY&&(this.centerY=o.centerY),o.scale&&(this.scale=o.scale)},exportScene:function(){var t=l()([],this.blocks),e=t.map((function(t){return delete t["inputs"],delete t["outputs"],delete t["selected"],t}));return{blocks:e,links:this.links,container:this.container}},updateScene:function(){this.$emit("update:scene",this.exportScene())}},watch:{blocksContent:function(){this.importBlocksContent()},scene:function(){this.importScene()}}},_=E,Y=(n("477d"),Object(k["a"])(_,a,c,!1,null,"cd11bc44",null)),I=Y.exports,X=function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("div",{staticClass:"blocks-properties"},[t._l(t.properties,(function(e){return n("div",{staticClass:"property"},[n("label",{attrs:{for:e.name}},[t._v(t._s(e.label||e.name)+":")]),n("br"),n("input",{directives:[{name:"model",rawName:"v-model",value:e.value,expression:"p.value"}],attrs:{type:"text"},domProps:{value:e.value},on:{input:function(n){n.target.composing||t.$set(e,"value",n.target.value)}}})])})),n("button",{on:{click:function(e){return e.preventDefault(),t.save(e)}}},[t._v("Save")])],2)},P=[],$={name:"VueBlockProperty",props:["property"],data:function(){return{properties:[]}},methods:{loadProperties:function(){this.properties=this.property},save:function(){this.$emit("save",this.properties)}},watch:{property:function(){this.loadProperties()}}},L=$,O=(n("0361"),Object(k["a"])(L,X,P,!1,null,"d11cfc5a",null)),T=O.exports,A={name:"App",components:{VueBlocksContainer:I,VueBlockProperty:T},data:function(){return{blocks:[{name:"text",title:"Text",family:"Animations",description:"Show text",fields:[{name:"text",label:"Text",type:"string",attr:"property"},{name:"delay",label:"Delay (s)",type:"number",attr:"property"},{name:"Show",type:"event",attr:"input"},{name:"Hide",type:"event",attr:"input"},{name:"onShow",type:"event",attr:"output"},{name:"onHide",type:"event",attr:"output"}]},{name:"animation",title:"Animation",family:"Animations",description:"Show animation",fields:[{name:"animation",label:"Animation",type:"animation",attr:"property"},{name:"Play",type:"event",attr:"input"},{name:"Stop",type:"event",attr:"input"},{name:"onEnd",type:"event",attr:"output"}]},{name:"Chat message",family:"Events",description:"",fields:[{name:"message",label:"Activation message",type:"string",attr:"property"},{name:"onMessage",type:"event",attr:"output"}]},{name:"delay",title:"Delay",family:"Time",description:"",fields:[{name:"delay",label:"Delay (s)",type:"number",attr:"property",value:1},{name:"input",type:"event",attr:"input"},{name:"output",type:"event",attr:"output"}]},{name:"shortcuts",title:"Shortcuts",family:"Events",description:"Press shortcut for call event",fields:[{name:"keys",label:"Activation keys",type:"keys",attr:"property"},{name:"onPress",type:"event",attr:"output"}]},{name:"splitter",title:"Splitter",family:"Helpers",description:"Press shortcut for call event",fields:[{name:"input",type:"event",attr:"input"},{name:"output",type:"event",attr:"output"},{name:"output",type:"event",attr:"output"},{name:"output",type:"event",attr:"output"},{name:"output",type:"event",attr:"output"}]}],scene:{blocks:[{id:2,x:-700,y:-69,name:"Chat message",title:"Chat message",values:{property:[{name:"message",type:"string"}]}},{id:4,x:-157,y:-68.5,name:"text",title:"Text",values:{property:{text:{label:"Text",type:"string"}}}},{id:5,x:136,y:-48.5,name:"text",title:"Text",values:{property:{text:{label:"Text",type:"string"}}}},{id:6,x:-440,y:-15.5,name:"delay",title:"Delay",values:{property:{delay:{label:"Delay (s)",type:"number",value:1}}}},{id:7,x:-694,y:60.5,name:"shortcuts",title:"Shortcuts",values:{property:{keys:{label:"Activation keys",type:"keys"}}}},{id:8,x:-163,y:59.5,name:"text",title:"Text",values:{property:{text:{label:"Text",type:"string"}}}},{id:9,x:-429,y:125.5,name:"delay",title:"Delay",values:{property:{delay:{label:"Delay (s)",type:"number",value:1}}}},{id:10,x:126,y:127.5,name:"text",title:"Text",values:{property:{text:{label:"Text",type:"string"}}}},{id:11,x:-856,y:252.5,name:"shortcuts",title:"Shortcuts",values:{property:{keys:{label:"Activation keys",type:"keys"}}}},{id:12,x:-616,y:319.5,name:"delay",title:"Delay",values:{property:{delay:{label:"Delay (s)",type:"number",value:1}}}},{id:13,x:-381,y:252.5,name:"text",title:"Text",values:{property:{text:{label:"Text",type:"string"}}}},{id:14,x:166,y:266.5,name:"text",title:"Text",values:{property:{text:{label:"Text",type:"string"}}}},{id:15,x:-149,y:269.5,name:"delay",title:"Delay",values:{property:{delay:{label:"Delay (s)",type:"number",value:1}}}},{id:16,x:413,y:267.5,name:"animation",title:"Animation",values:{property:{animation:{label:"Animation",type:"animation"}}}},{id:17,x:13,y:380.5,name:"delay",title:"Delay",values:{property:{delay:{label:"Delay (s)",type:"number",value:1}}}}],links:[{id:3,originID:2,originSlot:0,targetID:4,targetSlot:0},{id:6,originID:7,originSlot:0,targetID:8,targetSlot:0},{id:7,originID:7,originSlot:0,targetID:9,targetSlot:0},{id:8,originID:9,originSlot:0,targetID:10,targetSlot:0},{id:9,originID:9,originSlot:0,targetID:8,targetSlot:1},{id:10,originID:2,originSlot:0,targetID:6,targetSlot:0},{id:11,originID:6,originSlot:0,targetID:4,targetSlot:1},{id:12,originID:4,originSlot:1,targetID:5,targetSlot:0},{id:13,originID:11,originSlot:0,targetID:13,targetSlot:0},{id:14,originID:11,originSlot:0,targetID:12,targetSlot:0},{id:15,originID:12,originSlot:0,targetID:13,targetSlot:1},{id:16,originID:13,originSlot:1,targetID:15,targetSlot:0},{id:17,originID:15,originSlot:0,targetID:14,targetSlot:0},{id:18,originID:14,originSlot:0,targetID:16,targetSlot:0},{id:19,originID:14,originSlot:1,targetID:16,targetSlot:1},{id:20,originID:15,originSlot:0,targetID:17,targetSlot:0},{id:21,originID:17,originSlot:0,targetID:14,targetSlot:1}],container:{centerX:1042,centerY:140,scale:1}},selectedBlock:null,selectedType:"delay",useContextMenu:!0,contextMenu:{isShow:!1,mouseX:0,mouseY:0,top:0,left:0}}},computed:{selectedBlockProperty:function(){return this.selectedBlock&&this.selectedBlock.values&&this.selectedBlock.values.property?this.selectedBlock.values.property:null},selectBlocksType:function(){return this.blocks.map((function(t){return t.family})).filter((function(t,e,n){return n.indexOf(t)===e}))}},methods:{selectBlock:function(t){console.log("select",t),this.selectedBlock=t},deselectBlock:function(t){console.log("deselect",t),this.selectedBlock=null},filteredBlocks:function(t){return this.blocks.filter((function(e){return e.family===t}))},addBlock:function(){console.log(this.selectedType),this.$refs.container.addNewBlock(this.selectedType)},saveProperty:function(t){var e=this;console.log(t);var n=this.scene,i=n.blocks.find((function(t){return t.id===e.selectedBlock.id}));i.values.property=t,this.scene=l()({},n)},showContextMenu:function(t){this.useContextMenu&&(t.preventDefault&&t.preventDefault(),this.contextMenu.isShow=!0,this.contextMenu.mouseX=t.x,this.contextMenu.mouseY=t.y,this.$nextTick((function(){this.setMenu(t.y,t.x),this.$refs.contextMenu.focus()})))},setMenu:function(t,e){var n=5,i=this.$refs.contextMenu,o=this.$refs.container.$el.getBoundingClientRect(),s=o.right-i.offsetWidth-n,r=o.bottom-i.offsetHeight-n;console.log(this.$refs.container),console.log(o),e>s&&(e=s),t>r&&(t=r),this.contextMenu.top=t,this.contextMenu.left=e},addBlockContextMenu:function(t){var e=d.getOffsetRect(this.$refs.container.$el),n=this.contextMenu.mouseX-e.left,i=this.contextMenu.mouseY-e.top;this.$refs.container.addNewBlock(t,n,i),this.closeContextMenu()},closeContextMenu:function(){this.contextMenu.isShow=!1}},watch:{blocks:function(t){console.log("blocks",JSON.stringify(t))},scene:function(t){console.log("scene",JSON.stringify(t))}}},N=A,j=(n("7c55"),Object(k["a"])(N,o,s,!1,null,null,null)),W=j.exports;i["a"].config.productionTip=!1,new i["a"]({render:function(t){return t(W)}}).$mount("#app")},"6bcd":function(t,e,n){},"7c55":function(t,e,n){"use strict";var i=n("2395"),o=n.n(i);o.a},d8da:function(t,e,n){}}); 2 | //# sourceMappingURL=app.76c2ed65.js.map -------------------------------------------------------------------------------- /docs/js/app.76c2ed65.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///./src/components/VueBlockProperty.vue?7bdc","webpack:///./src/components/VueBlock.vue?ff9a","webpack:///./src/components/VueBlocksContainer.vue?866e","webpack:///./src/App.vue?9633","webpack:///./src/components/VueBlocksContainer.vue?5564","webpack:///./src/helpers/dom.js","webpack:///./src/helpers/mouse.js","webpack:///./src/components/VueBlock.vue?ced8","webpack:///src/components/VueBlock.vue","webpack:///./src/components/VueBlock.vue?572f","webpack:///./src/components/VueBlock.vue","webpack:///./src/components/VueLink.vue?6d54","webpack:///src/components/VueLink.vue","webpack:///./src/components/VueLink.vue?f029","webpack:///./src/components/VueLink.vue","webpack:///src/components/VueBlocksContainer.vue","webpack:///./src/components/VueBlocksContainer.vue?ac94","webpack:///./src/components/VueBlocksContainer.vue","webpack:///./src/components/VueBlockProperty.vue?ee17","webpack:///src/components/VueBlockProperty.vue","webpack:///./src/components/VueBlockProperty.vue?c570","webpack:///./src/components/VueBlockProperty.vue","webpack:///src/App.vue","webpack:///./src/App.vue?a7d1","webpack:///./src/App.vue","webpack:///./src/main.js","webpack:///./src/App.vue?74c1"],"names":["webpackJsonpCallback","data","moduleId","chunkId","chunkIds","moreModules","executeModules","i","resolves","length","Object","prototype","hasOwnProperty","call","installedChunks","push","modules","parentJsonpFunction","shift","deferredModules","apply","checkDeferredModules","result","deferredModule","fulfilled","j","depId","splice","__webpack_require__","s","installedModules","exports","module","l","m","c","d","name","getter","o","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","p","jsonpArray","window","oldJsonpFunction","slice","_vm","this","_h","$createElement","_c","_self","attrs","ref","staticClass","blocks","scene","on","$event","selectBlock","deselectBlock","nativeOn","showContextMenu","closeContextMenu","selectedBlockProperty","saveProperty","directives","rawName","expression","$$selectedVal","Array","filter","target","options","selected","map","val","_value","selectedType","multiple","_l","type","filteredBlocks","block","domProps","_v","_s","title","stopPropagation","addBlock","isArray","useContextMenu","_i","$$a","$$el","$$c","checked","$$v","$$i","concat","contextMenu","style","top","left","addBlockContextMenu","staticRenderFns","lines","_b","id","optionsForChild","updateScene","linkingStart","linkingStop","linkingBreak","blockSelect","blockDelete","getOffsetRect","element","box","getBoundingClientRect","scrollTop","pageYOffset","scrollLeft","pageXOffset","Math","round","getMousePosition","event","mouseX","pageX","clientX","document","documentElement","mouseY","pageY","clientY","offset","x","y","class","deleteBlock","slot","index","active","slotMouseUp","slotBreak","label","slotMouseDown","component","_e","a","transform","link","originID","targetID","originBlock","targetBlock","console","log","originLinkPos","targetLinkPos","x1","y1","x2","y2","stroke","strokeWidth","fill","outlineStyle","strokeOpacity","composing","$set","preventDefault","save","Vue","config","productionTip","render","h","App","$mount"],"mappings":"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","file":"js/app.76c2ed65.js","sourcesContent":[" \t// install a JSONP callback for chunk loading\n \tfunction webpackJsonpCallback(data) {\n \t\tvar chunkIds = data[0];\n \t\tvar moreModules = data[1];\n \t\tvar executeModules = data[2];\n\n \t\t// add \"moreModules\" to the modules object,\n \t\t// then flag all \"chunkIds\" as loaded and fire callback\n \t\tvar moduleId, chunkId, i = 0, resolves = [];\n \t\tfor(;i < chunkIds.length; i++) {\n \t\t\tchunkId = chunkIds[i];\n \t\t\tif(Object.prototype.hasOwnProperty.call(installedChunks, chunkId) && installedChunks[chunkId]) {\n \t\t\t\tresolves.push(installedChunks[chunkId][0]);\n \t\t\t}\n \t\t\tinstalledChunks[chunkId] = 0;\n \t\t}\n \t\tfor(moduleId in moreModules) {\n \t\t\tif(Object.prototype.hasOwnProperty.call(moreModules, moduleId)) {\n \t\t\t\tmodules[moduleId] = moreModules[moduleId];\n \t\t\t}\n \t\t}\n \t\tif(parentJsonpFunction) parentJsonpFunction(data);\n\n \t\twhile(resolves.length) {\n \t\t\tresolves.shift()();\n \t\t}\n\n \t\t// add entry modules from loaded chunk to deferred list\n \t\tdeferredModules.push.apply(deferredModules, executeModules || []);\n\n \t\t// run deferred modules when all chunks ready\n \t\treturn checkDeferredModules();\n \t};\n \tfunction checkDeferredModules() {\n \t\tvar result;\n \t\tfor(var i = 0; i < deferredModules.length; i++) {\n \t\t\tvar deferredModule = deferredModules[i];\n \t\t\tvar fulfilled = true;\n \t\t\tfor(var j = 1; j < deferredModule.length; j++) {\n \t\t\t\tvar depId = deferredModule[j];\n \t\t\t\tif(installedChunks[depId] !== 0) fulfilled = false;\n \t\t\t}\n \t\t\tif(fulfilled) {\n \t\t\t\tdeferredModules.splice(i--, 1);\n \t\t\t\tresult = __webpack_require__(__webpack_require__.s = deferredModule[0]);\n \t\t\t}\n \t\t}\n\n \t\treturn result;\n \t}\n\n \t// The module cache\n \tvar installedModules = {};\n\n \t// object to store loaded and loading chunks\n \t// undefined = chunk not loaded, null = chunk preloaded/prefetched\n \t// Promise = chunk loading, 0 = chunk loaded\n \tvar installedChunks = {\n \t\t\"app\": 0\n \t};\n\n \tvar deferredModules = [];\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \tvar jsonpArray = window[\"webpackJsonp\"] = window[\"webpackJsonp\"] || [];\n \tvar oldJsonpFunction = jsonpArray.push.bind(jsonpArray);\n \tjsonpArray.push = webpackJsonpCallback;\n \tjsonpArray = jsonpArray.slice();\n \tfor(var i = 0; i < jsonpArray.length; i++) webpackJsonpCallback(jsonpArray[i]);\n \tvar parentJsonpFunction = oldJsonpFunction;\n\n\n \t// add entry module to deferred list\n \tdeferredModules.push([0,\"chunk-vendors\"]);\n \t// run deferred modules when ready\n \treturn checkDeferredModules();\n","import mod from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--10-oneOf-1-0!../../node_modules/css-loader/dist/cjs.js??ref--10-oneOf-1-1!../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../node_modules/postcss-loader/src/index.js??ref--10-oneOf-1-2!../../node_modules/less-loader/dist/cjs.js??ref--10-oneOf-1-3!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./VueBlockProperty.vue?vue&type=style&index=0&id=d11cfc5a&lang=less&scoped=true&\"; export default mod; export * from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--10-oneOf-1-0!../../node_modules/css-loader/dist/cjs.js??ref--10-oneOf-1-1!../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../node_modules/postcss-loader/src/index.js??ref--10-oneOf-1-2!../../node_modules/less-loader/dist/cjs.js??ref--10-oneOf-1-3!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./VueBlockProperty.vue?vue&type=style&index=0&id=d11cfc5a&lang=less&scoped=true&\"","import mod from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--10-oneOf-1-0!../../node_modules/css-loader/dist/cjs.js??ref--10-oneOf-1-1!../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../node_modules/postcss-loader/src/index.js??ref--10-oneOf-1-2!../../node_modules/less-loader/dist/cjs.js??ref--10-oneOf-1-3!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./VueBlock.vue?vue&type=style&index=0&id=9a4bcc94&lang=less&scoped=true&\"; export default mod; export * from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--10-oneOf-1-0!../../node_modules/css-loader/dist/cjs.js??ref--10-oneOf-1-1!../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../node_modules/postcss-loader/src/index.js??ref--10-oneOf-1-2!../../node_modules/less-loader/dist/cjs.js??ref--10-oneOf-1-3!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./VueBlock.vue?vue&type=style&index=0&id=9a4bcc94&lang=less&scoped=true&\"","import mod from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--10-oneOf-1-0!../../node_modules/css-loader/dist/cjs.js??ref--10-oneOf-1-1!../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../node_modules/postcss-loader/src/index.js??ref--10-oneOf-1-2!../../node_modules/less-loader/dist/cjs.js??ref--10-oneOf-1-3!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./VueBlocksContainer.vue?vue&type=style&index=0&id=cd11bc44&lang=less&scoped=true&\"; export default mod; export * from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--10-oneOf-1-0!../../node_modules/css-loader/dist/cjs.js??ref--10-oneOf-1-1!../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../node_modules/postcss-loader/src/index.js??ref--10-oneOf-1-2!../../node_modules/less-loader/dist/cjs.js??ref--10-oneOf-1-3!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./VueBlocksContainer.vue?vue&type=style&index=0&id=cd11bc44&lang=less&scoped=true&\"","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{attrs:{\"id\":\"app\"}},[_c('VueBlocksContainer',{ref:\"container\",staticClass:\"container\",attrs:{\"blocksContent\":_vm.blocks,\"scene\":_vm.scene},on:{\"update:scene\":function($event){_vm.scene=$event},\"blockSelect\":_vm.selectBlock,\"blockDeselect\":_vm.deselectBlock},nativeOn:{\"contextmenu\":function($event){return _vm.showContextMenu($event)},\"click\":function($event){return _vm.closeContextMenu($event)}}}),_c('VueBlockProperty',{attrs:{\"property\":_vm.selectedBlockProperty},on:{\"save\":_vm.saveProperty}}),_c('label',[_c('select',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.selectedType),expression:\"selectedType\"}],attrs:{\"name\":\"type\"},on:{\"change\":function($event){var $$selectedVal = Array.prototype.filter.call($event.target.options,function(o){return o.selected}).map(function(o){var val = \"_value\" in o ? o._value : o.value;return val}); _vm.selectedType=$event.target.multiple ? $$selectedVal : $$selectedVal[0]}}},[_vm._l((_vm.selectBlocksType),function(type){return [_c('optgroup',{attrs:{\"label\":type}},_vm._l((_vm.filteredBlocks(type)),function(block){return _c('option',{domProps:{\"value\":block.name}},[_vm._v(_vm._s(block.title || block.name))])}),0)]})],2)]),_c('button',{on:{\"click\":function($event){$event.stopPropagation();return _vm.addBlock($event)}}},[_vm._v(\"Add\")]),_vm._v(\" | \"),_c('label',{attrs:{\"for\":\"useContextMenu\"}},[_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.useContextMenu),expression:\"useContextMenu\"}],attrs:{\"type\":\"checkbox\",\"id\":\"useContextMenu\"},domProps:{\"checked\":Array.isArray(_vm.useContextMenu)?_vm._i(_vm.useContextMenu,null)>-1:(_vm.useContextMenu)},on:{\"change\":function($event){var $$a=_vm.useContextMenu,$$el=$event.target,$$c=$$el.checked?(true):(false);if(Array.isArray($$a)){var $$v=null,$$i=_vm._i($$a,$$v);if($$el.checked){$$i<0&&(_vm.useContextMenu=$$a.concat([$$v]))}else{$$i>-1&&(_vm.useContextMenu=$$a.slice(0,$$i).concat($$a.slice($$i+1)))}}else{_vm.useContextMenu=$$c}}}}),_vm._v(\"Use right click for Add blocks \")]),_c('ul',{directives:[{name:\"show\",rawName:\"v-show\",value:(_vm.contextMenu.isShow),expression:\"contextMenu.isShow\"}],ref:\"contextMenu\",style:({top: _vm.contextMenu.top + 'px', left: _vm.contextMenu.left + 'px'}),attrs:{\"id\":\"contextMenu\",\"tabindex\":\"-1\"},on:{\"blur\":_vm.closeContextMenu}},[_vm._l((_vm.selectBlocksType),function(type){return [_c('li',{staticClass:\"label\"},[_vm._v(_vm._s(type))]),_vm._l((_vm.filteredBlocks(type)),function(block){return _c('li',{on:{\"click\":function($event){return _vm.addBlockContextMenu(block.name)}}},[_vm._v(_vm._s(block.title || block.name)+\" \")])})]})],2)],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"vue-container\"},[_c('VueLink',{attrs:{\"lines\":_vm.lines}}),_vm._l((_vm.blocks),function(block){return _c('VueBlock',_vm._b({key:block.id,attrs:{\"options\":_vm.optionsForChild},on:{\"update\":_vm.updateScene,\"linkingStart\":function($event){return _vm.linkingStart(block, $event)},\"linkingStop\":function($event){return _vm.linkingStop(block, $event)},\"linkingBreak\":function($event){return _vm.linkingBreak(block, $event)},\"select\":function($event){return _vm.blockSelect(block)},\"delete\":function($event){return _vm.blockDelete(block)}}},'VueBlock',block,false,true))})],2)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","/**\n * @param element {HTMLElement}\n * @return {{top: number, left: number}}\n */\nexport function getOffsetRect (element) {\n let box = element.getBoundingClientRect()\n\n let scrollTop = window.pageYOffset\n let scrollLeft = window.pageXOffset\n\n let top = box.top + scrollTop\n let left = box.left + scrollLeft\n\n return {top: Math.round(top), left: Math.round(left)}\n}\n\nexport default {\n getOffsetRect\n}\n","import {getOffsetRect} from './dom'\n\n/**\n * @param event {MouseEvent}\n * @param element {HTMLElement}\n * @return {{x: number, y: number}}\n */\nexport function getMousePosition (element, event) {\n let mouseX = event.pageX || event.clientX + document.documentElement.scrollLeft\n let mouseY = event.pageY || event.clientY + document.documentElement.scrollTop\n\n let offset = getOffsetRect(element)\n let x = mouseX - offset.left\n let y = mouseY - offset.top\n\n return {\n x: x,\n y: y\n }\n}\n\nexport default {\n getMousePosition\n}\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"vue-block\",class:{selected: _vm.selected},style:(_vm.style)},[_c('header',{style:(_vm.headerStyle)},[_vm._v(\" \"+_vm._s(_vm.title)+\" \"),_c('a',{staticClass:\"delete\",on:{\"click\":_vm.deleteBlock}},[_vm._v(\"x\")])]),_c('div',{staticClass:\"inputs\"},_vm._l((_vm.inputs),function(slot,index){return _c('div',{staticClass:\"input\"},[_c('div',{staticClass:\"circle inputSlot\",class:{active: slot.active},on:{\"mouseup\":function($event){return _vm.slotMouseUp($event, index)},\"mousedown\":function($event){return _vm.slotBreak($event, index)}}}),_vm._v(\" \"+_vm._s(slot.label)+\" \")])}),0),_c('div',{staticClass:\"outputs\"},_vm._l((_vm.outputs),function(slot,index){return _c('div',{staticClass:\"output\"},[_c('div',{staticClass:\"circle\",class:{active: slot.active},on:{\"mousedown\":function($event){return _vm.slotMouseDown($event, index)}}}),_vm._v(\" \"+_vm._s(slot.label)+\" \")])}),0)])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\n\n\n\n\n","import mod from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./VueBlock.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./VueBlock.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./VueBlock.vue?vue&type=template&id=9a4bcc94&scoped=true&\"\nimport script from \"./VueBlock.vue?vue&type=script&lang=js&\"\nexport * from \"./VueBlock.vue?vue&type=script&lang=js&\"\nimport style0 from \"./VueBlock.vue?vue&type=style&index=0&id=9a4bcc94&lang=less&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"9a4bcc94\",\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('svg',{attrs:{\"width\":\"100%\",\"height\":\"100%\"}},[_vm._l((_vm.renderedPathes),function(p){return _c('g',[(_vm.outline)?_c('path',{style:(p.outlineStyle),attrs:{\"d\":p.data}}):_vm._e(),_c('path',{style:(p.style),attrs:{\"d\":p.data}})])}),_c('g',_vm._l((_vm.renderedArrows),function(a){return _c('path',{style:(a.style),attrs:{\"d\":\"M -1 -1 L 0 1 L 1 -1 z\",\"transform\":a.transform}})}),0)],2)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\n\n\n\n\n","import mod from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./VueLink.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./VueLink.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./VueLink.vue?vue&type=template&id=56aa24a8&scoped=true&\"\nimport script from \"./VueLink.vue?vue&type=script&lang=js&\"\nexport * from \"./VueLink.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"56aa24a8\",\n null\n \n)\n\nexport default component.exports","\n\n\n\n\n","import mod from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./VueBlocksContainer.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./VueBlocksContainer.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./VueBlocksContainer.vue?vue&type=template&id=cd11bc44&scoped=true&\"\nimport script from \"./VueBlocksContainer.vue?vue&type=script&lang=js&\"\nexport * from \"./VueBlocksContainer.vue?vue&type=script&lang=js&\"\nimport style0 from \"./VueBlocksContainer.vue?vue&type=style&index=0&id=cd11bc44&lang=less&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"cd11bc44\",\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"blocks-properties\"},[_vm._l((_vm.properties),function(p){return _c('div',{staticClass:\"property\"},[_c('label',{attrs:{\"for\":p.name}},[_vm._v(_vm._s(p.label||p.name)+\":\")]),_c('br'),_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(p.value),expression:\"p.value\"}],attrs:{\"type\":\"text\"},domProps:{\"value\":(p.value)},on:{\"input\":function($event){if($event.target.composing){ return; }_vm.$set(p, \"value\", $event.target.value)}}})])}),_c('button',{on:{\"click\":function($event){$event.preventDefault();return _vm.save($event)}}},[_vm._v(\"Save\")])],2)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\n\n\n\n\n","import mod from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./VueBlockProperty.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./VueBlockProperty.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./VueBlockProperty.vue?vue&type=template&id=d11cfc5a&scoped=true&\"\nimport script from \"./VueBlockProperty.vue?vue&type=script&lang=js&\"\nexport * from \"./VueBlockProperty.vue?vue&type=script&lang=js&\"\nimport style0 from \"./VueBlockProperty.vue?vue&type=style&index=0&id=d11cfc5a&lang=less&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"d11cfc5a\",\n null\n \n)\n\nexport default component.exports","\n\n\n\n\n","import mod from \"-!../node_modules/cache-loader/dist/cjs.js??ref--12-0!../node_modules/thread-loader/dist/cjs.js!../node_modules/babel-loader/lib/index.js!../node_modules/cache-loader/dist/cjs.js??ref--0-0!../node_modules/vue-loader/lib/index.js??vue-loader-options!./App.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../node_modules/cache-loader/dist/cjs.js??ref--12-0!../node_modules/thread-loader/dist/cjs.js!../node_modules/babel-loader/lib/index.js!../node_modules/cache-loader/dist/cjs.js??ref--0-0!../node_modules/vue-loader/lib/index.js??vue-loader-options!./App.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./App.vue?vue&type=template&id=97ed66de&\"\nimport script from \"./App.vue?vue&type=script&lang=js&\"\nexport * from \"./App.vue?vue&type=script&lang=js&\"\nimport style0 from \"./App.vue?vue&type=style&index=0&lang=less&\"\n\n\n/* normalize component */\nimport normalizer from \"!../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","import Vue from 'vue'\nimport App from './App.vue'\n\nVue.config.productionTip = false\n\nnew Vue({\n render: h => h(App),\n}).$mount('#app')\n","import mod from \"-!../node_modules/mini-css-extract-plugin/dist/loader.js??ref--10-oneOf-1-0!../node_modules/css-loader/dist/cjs.js??ref--10-oneOf-1-1!../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../node_modules/postcss-loader/src/index.js??ref--10-oneOf-1-2!../node_modules/less-loader/dist/cjs.js??ref--10-oneOf-1-3!../node_modules/cache-loader/dist/cjs.js??ref--0-0!../node_modules/vue-loader/lib/index.js??vue-loader-options!./App.vue?vue&type=style&index=0&lang=less&\"; export default mod; export * from \"-!../node_modules/mini-css-extract-plugin/dist/loader.js??ref--10-oneOf-1-0!../node_modules/css-loader/dist/cjs.js??ref--10-oneOf-1-1!../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../node_modules/postcss-loader/src/index.js??ref--10-oneOf-1-2!../node_modules/less-loader/dist/cjs.js??ref--10-oneOf-1-3!../node_modules/cache-loader/dist/cjs.js??ref--0-0!../node_modules/vue-loader/lib/index.js??vue-loader-options!./App.vue?vue&type=style&index=0&lang=less&\""],"sourceRoot":""} -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "vue-blocks", 3 | "version": "1.0.0", 4 | "description": "Vue2 dataflow graph editor", 5 | "author": "Vladislav Fursov ", 6 | "private": false, 7 | "scripts": { 8 | "serve": "vue-cli-service serve", 9 | "build": "vue-cli-service build", 10 | "build:docs": "rimraf ./docs/* && vue-cli-service build && mv ./dist/* ./docs/" 11 | }, 12 | "dependencies": { 13 | "core-js": "^3.6.4", 14 | "deepmerge": "^4.2.2", 15 | "vue": "^2.6.11" 16 | }, 17 | "devDependencies": { 18 | "@vue/cli-plugin-babel": "~4.2.0", 19 | "@vue/cli-service": "~4.2.0", 20 | "less": "^3.0.4", 21 | "less-loader": "^5.0.0", 22 | "rimraf": "^3.0.2", 23 | "vue-template-compiler": "^2.6.11" 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ghostiam/vue-blocks/87b89587c9d27a0a0ba8c3fb1dfe2c27eb15e748/public/favicon.ico -------------------------------------------------------------------------------- /public/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | <%= htmlWebpackPlugin.options.title %> 9 | 10 | 11 | 14 |
15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /src/App.vue: -------------------------------------------------------------------------------- 1 | 40 | 41 | 690 | 691 | 740 | -------------------------------------------------------------------------------- /src/components/VueBlock.vue: -------------------------------------------------------------------------------- 1 | 24 | 25 | 177 | 178 | 301 | -------------------------------------------------------------------------------- /src/components/VueBlockProperty.vue: -------------------------------------------------------------------------------- 1 | 11 | 12 | 36 | 37 | 55 | -------------------------------------------------------------------------------- /src/components/VueBlocksContainer.vue: -------------------------------------------------------------------------------- 1 | 17 | 18 | 623 | 624 | 631 | -------------------------------------------------------------------------------- /src/components/VueLink.vue: -------------------------------------------------------------------------------- 1 | 15 | 16 | 98 | 99 | 102 | -------------------------------------------------------------------------------- /src/helpers/dom.js: -------------------------------------------------------------------------------- 1 | /** 2 | * @param element {HTMLElement} 3 | * @return {{top: number, left: number}} 4 | */ 5 | export function getOffsetRect (element) { 6 | let box = element.getBoundingClientRect() 7 | 8 | let scrollTop = window.pageYOffset 9 | let scrollLeft = window.pageXOffset 10 | 11 | let top = box.top + scrollTop 12 | let left = box.left + scrollLeft 13 | 14 | return {top: Math.round(top), left: Math.round(left)} 15 | } 16 | 17 | export default { 18 | getOffsetRect 19 | } 20 | -------------------------------------------------------------------------------- /src/helpers/mouse.js: -------------------------------------------------------------------------------- 1 | import {getOffsetRect} from './dom' 2 | 3 | /** 4 | * @param event {MouseEvent} 5 | * @param element {HTMLElement} 6 | * @return {{x: number, y: number}} 7 | */ 8 | export function getMousePosition (element, event) { 9 | let mouseX = event.pageX || event.clientX + document.documentElement.scrollLeft 10 | let mouseY = event.pageY || event.clientY + document.documentElement.scrollTop 11 | 12 | let offset = getOffsetRect(element) 13 | let x = mouseX - offset.left 14 | let y = mouseY - offset.top 15 | 16 | return { 17 | x: x, 18 | y: y 19 | } 20 | } 21 | 22 | export default { 23 | getMousePosition 24 | } 25 | -------------------------------------------------------------------------------- /src/index.js: -------------------------------------------------------------------------------- 1 | export {default} from './components/VueBlocksContainer' 2 | -------------------------------------------------------------------------------- /src/main.js: -------------------------------------------------------------------------------- 1 | import Vue from 'vue' 2 | import App from './App.vue' 3 | 4 | Vue.config.productionTip = false 5 | 6 | new Vue({ 7 | render: h => h(App), 8 | }).$mount('#app') 9 | -------------------------------------------------------------------------------- /vue.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | publicPath: "", 3 | } 4 | --------------------------------------------------------------------------------