UNPKG

jsmind

Version:

jsMind is a pure javascript library for mindmap, it base on html5 canvas. jsMind was released under BSD license, you can embed it in any project, if only you observe the license.

1 lines 30.2 kB
{"version":3,"file":"jsmind.draggable-node.js","sources":["../src/plugins/jsmind.draggable-node.js"],"sourcesContent":["/**\n * @license BSD\n * @copyright 2014-2025 hizzgdev@163.com\n *\n * Project Home:\n * https://github.com/hizzgdev/jsmind/\n */\n\nimport jsMind from 'jsmind';\n\nif (!jsMind) {\n throw new Error('jsMind is not defined');\n}\n\nconst $ = jsMind.$;\n\nconst clear_selection =\n 'getSelection' in $.w\n ? function () {\n $.w.getSelection().removeAllRanges();\n }\n : function () {\n $.d.selection.empty();\n };\n\nconst DEFAULT_OPTIONS = {\n line_width: 5,\n line_color: 'rgba(0,0,0,0.3)',\n line_color_invalid: 'rgba(255,51,51,0.6)',\n lookup_delay: 200,\n lookup_interval: 100,\n scrolling_trigger_width: 20,\n scrolling_step_length: 10,\n shadow_node_class_name: 'jsmind-draggable-shadow-node',\n};\n\nclass DraggableNode {\n constructor(jm, options) {\n var opts = {};\n jsMind.util.json.merge(opts, DEFAULT_OPTIONS);\n jsMind.util.json.merge(opts, options);\n\n this.version = '0.4.0';\n this.jm = jm;\n this.options = opts;\n this.e_canvas = null;\n this.canvas_ctx = null;\n this.shadow = null;\n this.shadow_p_x = 0;\n this.shadow_p_y = 0;\n this.shadow_w = 0;\n this.shadow_h = 0;\n this.active_node = null;\n this.target_node = null;\n this.target_direct = null;\n this.client_w = 0;\n this.client_h = 0;\n this.offset_x = 0;\n this.offset_y = 0;\n this.hlookup_delay = 0;\n this.hlookup_timer = 0;\n this.capture = false;\n this.moved = false;\n this.canvas_draggable = jm.get_view_draggable();\n this.view_panel = jm.view.e_panel;\n this.view_panel_rect = null;\n }\n init() {\n this.create_canvas();\n this.create_shadow();\n this.event_bind();\n }\n resize() {\n this.jm.view.e_nodes.appendChild(this.shadow);\n this.e_canvas.width = this.jm.view.size.w;\n this.e_canvas.height = this.jm.view.size.h;\n }\n create_canvas() {\n var c = $.c('canvas');\n this.jm.view.e_panel.appendChild(c);\n var ctx = c.getContext('2d');\n this.e_canvas = c;\n this.canvas_ctx = ctx;\n }\n create_shadow() {\n var s = $.c('jmnode');\n s.style.visibility = 'hidden';\n s.style.zIndex = '3';\n s.style.cursor = 'move';\n s.style.opacity = '0.7';\n s.className = this.options.shadow_node_class_name;\n this.shadow = s;\n }\n reset_shadow(el) {\n var s = this.shadow.style;\n this.shadow.innerHTML = el.innerHTML;\n s.left = el.style.left;\n s.top = el.style.top;\n s.width = el.style.width;\n s.height = el.style.height;\n s.backgroundImage = el.style.backgroundImage;\n s.backgroundSize = el.style.backgroundSize;\n s.transform = el.style.transform;\n this.shadow_w = this.shadow.clientWidth;\n this.shadow_h = this.shadow.clientHeight;\n }\n show_shadow() {\n if (!this.moved) {\n this.shadow.style.visibility = 'visible';\n }\n }\n hide_shadow() {\n this.shadow.style.visibility = 'hidden';\n }\n magnet_shadow(shadow_p, node_p, invalid) {\n this.canvas_ctx.lineWidth = this.options.line_width;\n this.canvas_ctx.strokeStyle = invalid\n ? this.options.line_color_invalid\n : this.options.line_color;\n this.canvas_ctx.lineCap = 'round';\n this.clear_lines();\n this.canvas_lineto(shadow_p.x, shadow_p.y, node_p.x, node_p.y);\n }\n clear_lines() {\n this.canvas_ctx.clearRect(0, 0, this.jm.view.size.w, this.jm.view.size.h);\n }\n canvas_lineto(x1, y1, x2, y2) {\n this.canvas_ctx.beginPath();\n this.canvas_ctx.moveTo(x1, y1);\n this.canvas_ctx.lineTo(x2, y2);\n this.canvas_ctx.stroke();\n }\n event_bind() {\n var jd = this;\n var container = this.jm.view.container;\n $.on(container, 'mousedown', function (e) {\n if (e.button === 0) {\n jd.dragstart.call(jd, e);\n }\n });\n $.on(container, 'mousemove', function (e) {\n if (e.movementX !== 0 || e.movementY !== 0) {\n jd.drag.call(jd, e);\n }\n });\n $.on(container, 'mouseup', function (e) {\n jd.dragend.call(jd, e);\n });\n $.on(container, 'touchstart', function (e) {\n jd.dragstart.call(jd, e);\n });\n $.on(container, 'touchmove', function (e) {\n jd.drag.call(jd, e);\n });\n $.on(container, 'touchend', function (e) {\n jd.dragend.call(jd, e);\n });\n }\n dragstart(e) {\n if (!this.jm.get_editable()) {\n return;\n }\n if (this.capture) {\n return;\n }\n var jview = this.jm.view;\n if (jview.is_editing()) {\n return;\n }\n this.active_node = null;\n this.view_draggable = this.jm.get_view_draggable();\n\n var el = this.find_node_element(e.target);\n if (!el) {\n return;\n }\n if (this.view_draggable) {\n this.jm.disable_view_draggable();\n }\n var nodeid = jview.get_binded_nodeid(el);\n if (!!nodeid) {\n var node = this.jm.get_node(nodeid);\n if (!node.isroot) {\n this.reset_shadow(el);\n this.view_panel_rect = this.view_panel.getBoundingClientRect();\n this.active_node = node;\n this.offset_x =\n (e.clientX || e.touches[0].clientX) / jview.zoom_current - el.offsetLeft;\n this.offset_y =\n (e.clientY || e.touches[0].clientY) / jview.zoom_current - el.offsetTop;\n this.client_hw = Math.floor(el.clientWidth / 2);\n this.client_hh = Math.floor(el.clientHeight / 2);\n if (this.hlookup_delay != 0) {\n $.w.clearTimeout(this.hlookup_delay);\n }\n if (this.hlookup_timer != 0) {\n $.w.clearInterval(this.hlookup_timer);\n }\n var jd = this;\n this.hlookup_delay = $.w.setTimeout(function () {\n jd.hlookup_delay = 0;\n jd.hlookup_timer = $.w.setInterval(function () {\n jd.lookup_target_node.call(jd);\n }, jd.options.lookup_interval);\n }, this.options.lookup_delay);\n jd.capture = true;\n }\n }\n }\n drag(e) {\n if (!this.jm.get_editable()) {\n return;\n }\n if (this.capture) {\n e.preventDefault();\n this.show_shadow();\n this.moved = true;\n clear_selection();\n var jview = this.jm.view;\n var px = (e.clientX || e.touches[0].clientX) / jview.zoom_current - this.offset_x;\n var py = (e.clientY || e.touches[0].clientY) / jview.zoom_current - this.offset_y;\n // scrolling container axisY if drag nodes exceeding container\n if (\n e.clientY - this.view_panel_rect.top < this.options.scrolling_trigger_width &&\n this.view_panel.scrollTop > this.options.scrolling_step_length\n ) {\n this.view_panel.scrollBy(0, -this.options.scrolling_step_length);\n this.offset_y += this.options.scrolling_step_length / jview.zoom_current;\n } else if (\n this.view_panel_rect.bottom - e.clientY < this.options.scrolling_trigger_width &&\n this.view_panel.scrollTop <\n this.view_panel.scrollHeight -\n this.view_panel_rect.height -\n this.options.scrolling_step_length\n ) {\n this.view_panel.scrollBy(0, this.options.scrolling_step_length);\n this.offset_y -= this.options.scrolling_step_length / jview.zoom_current;\n }\n // scrolling container axisX if drag nodes exceeding container\n if (\n e.clientX - this.view_panel_rect.left < this.options.scrolling_trigger_width &&\n this.view_panel.scrollLeft > this.options.scrolling_step_length\n ) {\n this.view_panel.scrollBy(-this.options.scrolling_step_length, 0);\n this.offset_x += this.options.scrolling_step_length / jview.zoom_current;\n } else if (\n this.view_panel_rect.right - e.clientX < this.options.scrolling_trigger_width &&\n this.view_panel.scrollLeft <\n this.view_panel.scrollWidth -\n this.view_panel_rect.width -\n this.options.scrolling_step_length\n ) {\n this.view_panel.scrollBy(this.options.scrolling_step_length, 0);\n this.offset_x -= this.options.scrolling_step_length / jview.zoom_current;\n }\n this.shadow.style.left = px + 'px';\n this.shadow.style.top = py + 'px';\n clear_selection();\n }\n }\n dragend(e) {\n if (!this.jm.get_editable()) {\n return;\n }\n if (this.view_draggable) {\n this.jm.enable_view_draggable();\n }\n if (this.capture) {\n if (this.hlookup_delay != 0) {\n $.w.clearTimeout(this.hlookup_delay);\n this.hlookup_delay = 0;\n this.clear_lines();\n }\n if (this.hlookup_timer != 0) {\n $.w.clearInterval(this.hlookup_timer);\n this.hlookup_timer = 0;\n this.clear_lines();\n }\n if (this.moved) {\n var src_node = this.active_node;\n var target_node = this.target_node;\n var target_direct = this.target_direct;\n this.move_node(src_node, target_node, target_direct);\n }\n this.hide_shadow();\n }\n this.view_panel_rect = null;\n this.moved = false;\n this.capture = false;\n }\n find_node_element(el) {\n if (\n el === this.jm.view.e_nodes ||\n el === this.jm.view.e_panel ||\n el === this.jm.view.container\n ) {\n return null;\n }\n if (el.tagName.toLowerCase() === 'jmnode') {\n return el;\n }\n return this.find_node_element(el.parentNode);\n }\n lookup_target_node() {\n let sx = this.shadow.offsetLeft;\n let sy = this.shadow.offsetTop;\n if (sx === this.shadow_p_x && sy === this.shadow_p_y) {\n return;\n }\n this.shadow_p_x = sx;\n this.shadow_p_y = sy;\n\n let target_direction =\n this.shadow_p_x + this.shadow_w / 2 >= this.get_root_x()\n ? jsMind.direction.right\n : jsMind.direction.left;\n let overlapping_node = this.lookup_overlapping_node_parent(target_direction);\n let target_node = overlapping_node || this.lookup_close_node(target_direction);\n if (!!target_node) {\n let points = this.calc_point_of_node(target_node, target_direction);\n let invalid = jsMind.node.inherited(this.active_node, target_node);\n this.magnet_shadow(points.sp, points.np, invalid);\n this.target_node = target_node;\n this.target_direct = target_direction;\n }\n }\n get_root_x() {\n let root = this.jm.get_root();\n let root_location = root.get_location();\n let root_size = root.get_size();\n return root_location.x + root_size.w / 2;\n }\n\n lookup_overlapping_node_parent(direction) {\n let shadowRect = this.shadow.getBoundingClientRect();\n let x = shadowRect.x + (shadowRect.width * (1 - direction)) / 2;\n let deltaX = (this.jm.options.layout.hspace + this.jm.options.layout.pspace) * direction;\n let deltaY = shadowRect.height;\n let points = [\n [x, shadowRect.y],\n [x, shadowRect.y + deltaY / 2],\n [x, shadowRect.y + deltaY],\n [x + deltaX / 2, shadowRect.y],\n [x + deltaX / 2, shadowRect.y + deltaY / 2],\n [x + deltaX / 2, shadowRect.y + deltaY],\n [x + deltaX, shadowRect.y],\n [x + deltaX, shadowRect.y + deltaY / 2],\n [x + deltaX, shadowRect.y + deltaY],\n ];\n for (const p of points) {\n let n = this.lookup_node_parent_by_location(p[0], p[1]);\n if (!!n) {\n return n;\n }\n }\n }\n\n lookup_node_parent_by_location(x, y) {\n return $.d\n .elementsFromPoint(x, y)\n .filter(\n x => x.tagName === 'JMNODE' && x.className !== this.options.shadow_node_class_name\n )\n .map(el => this.jm.view.get_binded_nodeid(el))\n .map(id => id && this.jm.mind.nodes[id])\n .map(n => n && n.parent)\n .find(n => n);\n }\n\n lookup_close_node(direction) {\n return Object.values(this.jm.mind.nodes)\n .filter(n => n.direction == direction || n.isroot)\n .filter(n => this.jm.layout.is_visible(n))\n .filter(n => this.shadow_on_target_side(n, direction))\n .map(n => ({ node: n, distance: this.shadow_to_node(n, direction) }))\n .reduce(\n (prev, curr) => {\n return prev.distance < curr.distance ? prev : curr;\n },\n { node: this.jm.get_root(), distance: Number.MAX_VALUE }\n ).node;\n }\n\n shadow_on_target_side(node, dir) {\n return (\n (dir == jsMind.direction.right && this.shadow_to_right_of_node(node) > 0) ||\n (dir == jsMind.direction.left && this.shadow_to_left_of_node(node) > 0)\n );\n }\n\n shadow_to_right_of_node(node) {\n return this.shadow_p_x - node.get_location().x - node.get_size().w;\n }\n\n shadow_to_left_of_node(node) {\n return node.get_location().x - this.shadow_p_x - this.shadow_w;\n }\n\n shadow_to_base_line_of_node(node) {\n return this.shadow_p_y + this.shadow_h / 2 - node.get_location().y - node.get_size().h / 2;\n }\n\n shadow_to_node(node, dir) {\n let distance_x =\n dir === jsMind.direction.right\n ? Math.abs(this.shadow_to_right_of_node(node))\n : Math.abs(this.shadow_to_left_of_node(node));\n let distance_y = Math.abs(this.shadow_to_base_line_of_node(node));\n return distance_x + distance_y;\n }\n\n calc_point_of_node(node, dir) {\n let ns = node.get_size();\n let nl = node.get_location();\n let node_x = node.isroot\n ? nl.x + ns.w / 2\n : nl.x + (ns.w * (1 + dir)) / 2 + this.options.line_width * dir;\n let node_y = nl.y + ns.h / 2;\n let shadow_x =\n this.shadow_p_x + (this.shadow_w * (1 - dir)) / 2 - this.options.line_width * dir;\n let shadow_y = this.shadow_p_y + this.shadow_h / 2;\n return {\n sp: { x: shadow_x, y: shadow_y },\n np: { x: node_x, y: node_y },\n };\n }\n\n move_node(src_node, target_node, target_direct) {\n var shadow_h = this.shadow.offsetTop;\n if (!!target_node && !!src_node && !jsMind.node.inherited(src_node, target_node)) {\n // lookup before_node\n var sibling_nodes = target_node.children;\n var sc = sibling_nodes.length;\n var node = null;\n var delta_y = Number.MAX_VALUE;\n var node_before = null;\n var beforeid = '_last_';\n while (sc--) {\n node = sibling_nodes[sc];\n if (node.direction == target_direct && node.id != src_node.id) {\n var dy = node.get_location().y - shadow_h;\n if (dy > 0 && dy < delta_y) {\n delta_y = dy;\n node_before = node;\n beforeid = '_first_';\n }\n }\n }\n if (!!node_before) {\n beforeid = node_before.id;\n }\n this.jm.move_node(src_node.id, beforeid, target_node.id, target_direct);\n }\n this.active_node = null;\n this.target_node = null;\n this.target_direct = null;\n }\n jm_event_handle(type, data) {\n if (type === jsMind.event_type.resize) {\n this.resize();\n }\n }\n}\n\nvar draggable_plugin = new jsMind.plugin('draggable_node', function (jm, options) {\n var jd = new DraggableNode(jm, options);\n jd.init();\n jm.add_event_listener(function (type, data) {\n jd.jm_event_handle.call(jd, type, data);\n });\n});\n\njsMind.register_plugin(draggable_plugin);\n"],"names":["jsMind","Error","$","clear_selection","w","getSelection","removeAllRanges","d","selection","empty","DEFAULT_OPTIONS","line_width","line_color","line_color_invalid","lookup_delay","lookup_interval","scrolling_trigger_width","scrolling_step_length","shadow_node_class_name","DraggableNode","constructor","jm","options","opts","util","json","merge","this","version","e_canvas","canvas_ctx","shadow","shadow_p_x","shadow_p_y","shadow_w","shadow_h","active_node","target_node","target_direct","client_w","client_h","offset_x","offset_y","hlookup_delay","hlookup_timer","capture","moved","canvas_draggable","get_view_draggable","view_panel","view","e_panel","view_panel_rect","init","create_canvas","create_shadow","event_bind","resize","e_nodes","appendChild","width","size","height","h","c","ctx","getContext","s","style","visibility","zIndex","cursor","opacity","className","reset_shadow","el","innerHTML","left","top","backgroundImage","backgroundSize","transform","clientWidth","clientHeight","show_shadow","hide_shadow","magnet_shadow","shadow_p","node_p","invalid","lineWidth","strokeStyle","lineCap","clear_lines","canvas_lineto","x","y","clearRect","x1","y1","x2","y2","beginPath","moveTo","lineTo","stroke","jd","container","on","e","button","dragstart","call","movementX","movementY","drag","dragend","get_editable","jview","is_editing","view_draggable","find_node_element","target","disable_view_draggable","nodeid","get_binded_nodeid","node","get_node","isroot","getBoundingClientRect","clientX","touches","zoom_current","offsetLeft","clientY","offsetTop","client_hw","Math","floor","client_hh","clearTimeout","clearInterval","setTimeout","setInterval","lookup_target_node","preventDefault","px","py","scrollTop","scrollBy","bottom","scrollHeight","scrollLeft","right","scrollWidth","enable_view_draggable","src_node","move_node","tagName","toLowerCase","parentNode","sx","sy","target_direction","get_root_x","direction","lookup_overlapping_node_parent","lookup_close_node","points","calc_point_of_node","inherited","sp","np","root","get_root","root_location","get_location","root_size","get_size","shadowRect","deltaX","layout","hspace","pspace","deltaY","p","n","lookup_node_parent_by_location","elementsFromPoint","filter","map","id","mind","nodes","parent","find","Object","values","is_visible","shadow_on_target_side","distance","shadow_to_node","reduce","prev","curr","Number","MAX_VALUE","dir","shadow_to_right_of_node","shadow_to_left_of_node","shadow_to_base_line_of_node","abs","ns","nl","node_x","node_y","sibling_nodes","children","sc","length","delta_y","node_before","beforeid","dy","jm_event_handle","type","data","event_type","draggable_plugin","plugin","add_event_listener","register_plugin"],"mappings":"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"}