orgchart 4.0.1 → 6.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.github/workflows/publish.yml +32 -0
- package/README.md +205 -89
- package/README.zh-cn.md +221 -68
- package/README.zh-tw.md +221 -68
- package/bower.json +6 -9
- package/demo/10000-nodes.html +139 -0
- package/demo/ajax-datasource.html +46 -45
- package/demo/bottom2top.html +12 -9
- package/demo/center-on-selected-node.html +21 -17
- package/demo/color-coded.html +12 -9
- package/demo/css/style.css +28 -0
- package/demo/custom-icons.html +12 -9
- package/demo/custom-template.html +12 -9
- package/demo/data-prop-compact.html +11 -8
- package/demo/data-prop-hybrid.html +79 -50
- package/demo/default-collapsed.html +12 -9
- package/demo/drag-drop-hybrid-chart.html +17 -14
- package/demo/drag-drop.html +21 -16
- package/demo/edit-chart.html +148 -94
- package/demo/edit-hybrid-chart.html +178 -135
- package/demo/expand-to-given-depth.html +30 -22
- package/demo/export-chart-pdf.html +12 -9
- package/demo/export-chart-with-pictures.html +19 -12
- package/demo/export-chart.html +12 -9
- package/demo/family-tree.html +100 -0
- package/demo/familytree-custom-properties.html +108 -0
- package/demo/filter-node.html +104 -57
- package/demo/get-hierarchy.html +17 -12
- package/demo/get-related-nodes.html +27 -17
- package/demo/index.html +7 -4
- package/demo/integrate-map.html +32 -27
- package/demo/left2right.html +12 -9
- package/demo/level-offset.html +16 -15
- package/demo/link-node.html +12 -9
- package/demo/local-datasource.html +11 -8
- package/demo/minimap.html +224 -0
- package/demo/nodes-of-different-widths.html +11 -8
- package/demo/ondemand-loading-data.html +88 -91
- package/demo/option-createNode.html +31 -20
- package/demo/pan-zoom.html +20 -11
- package/demo/reload-data.html +17 -14
- package/demo/report-path.html +59 -29
- package/demo/responsive-design.html +14 -11
- package/demo/right2left.html +12 -9
- package/demo/toggle-sibs-resp.html +12 -9
- package/demo/ul-datasource.html +11 -8
- package/demo/vertical-level.html +12 -9
- package/dist/css/{jquery.orgchart.css → orgchart.css} +210 -78
- package/dist/css/orgchart.min.css +1 -0
- package/dist/js/orgchart.js +4101 -0
- package/dist/js/orgchart.min.js +2 -0
- package/dist/js/orgchart.min.js.map +1 -0
- package/gulpfile.js +37 -26
- package/package.json +32 -32
- package/src/css/{jquery.orgchart.css → orgchart.css} +210 -78
- package/src/js/orgchart.js +4101 -0
- package/test/cypress/e2e/demo-interactions.cy.js +91 -0
- package/test/cypress/e2e/demo-rendering.cy.js +100 -0
- package/test/cypress/e2e/drag-drop-hybrid-chart.cy.js +22 -0
- package/test/cypress/e2e/edit-chart.cy.js +20 -0
- package/test/cypress/e2e/level-offset.cy.js +21 -0
- package/test/cypress/e2e/minimap.cy.js +66 -0
- package/test/cypress/e2e/pan-zoom.cy.js +165 -0
- package/test/cypress/e2e/report-path.cy.js +20 -0
- package/test/cypress/e2e/vertical-vevel.cy.js +5 -3
- package/test/e2e/local-datasource/test.js +1 -1
- package/test/integration/init-tests.js +168 -62
- package/test/integration/tests.js +1034 -56
- package/test/unit/lifecycle-builders-export.tests.js +1426 -0
- package/test/unit/minimap.tests.js +210 -0
- package/test/unit/tests.js +2372 -252
- package/demo/multiple-layers.html +0 -128
- package/dist/css/jquery.orgchart.min.css +0 -1
- package/dist/js/jquery.orgchart.js +0 -1686
- package/dist/js/jquery.orgchart.min.js +0 -5
- package/dist/js/jquery.orgchart.min.js.map +0 -1
- package/src/js/jquery.orgchart.js +0 -1686
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"orgchart.min.js","sources":["orgchart.js"],"sourcesContent":["/*\r\n * JavaScript OrgChart Component\r\n * https://github.com/dabeng/OrgChart\r\n *\r\n * Copyright 2016, dabeng\r\n * https://github.com/dabeng\r\n *\r\n * Licensed under the MIT license:\r\n * http://www.opensource.org/licenses/MIT\r\n */\r\n'use strict';\r\n\r\n(function (factory) {\r\n if (typeof module === 'object' && typeof module.exports === 'object') {\r\n module.exports = factory(window, document);\r\n } else {\r\n window.OrgChart = factory(window, document);\r\n }\r\n}(function (window, document, undefined) {\r\n const elementDataStore = new WeakMap();\r\n const getWindow = () => (typeof globalThis !== 'undefined' && globalThis.window ? globalThis.window : window);\r\n const getDocument = () => {\r\n const currentWindow = getWindow();\r\n return currentWindow && currentWindow.document\r\n ? currentWindow.document\r\n : (typeof globalThis !== 'undefined' && globalThis.document ? globalThis.document : document);\r\n };\r\n\r\n const isElement = (value) => value && (value.nodeType === 1 || value.nodeType === 9 || value === getWindow());\r\n const isNode = (value) => value && typeof value.nodeType === 'number';\r\n const isNodeList = (value) => value && typeof value.length === 'number' && typeof value !== 'string' && !isNode(value);\r\n const isHtmlString = (value) => typeof value === 'string' && value.trim().startsWith('<') && value.trim().endsWith('>');\r\n const isPlainObject = (value) => Object.prototype.toString.call(value) === '[object Object]';\r\n const unique = (elements) => Array.from(new Set(elements.filter(Boolean)));\r\n\r\n function getElement(input, context) {\r\n return normalizeInput(input, context || getDocument())[0] || null;\r\n }\r\n\r\n function getElements(input, context) {\r\n return normalizeInput(input, context || getDocument());\r\n }\r\n\r\n function mergeObjects() {\r\n return Object.assign.apply(Object, [{}].concat(Array.from(arguments)));\r\n }\r\n\r\n function forEachValue(collection, callback) {\r\n if (Array.isArray(collection) || isNodeList(collection)) {\r\n for (let index = 0; index < collection.length; index += 1) {\r\n if (callback.call(collection[index], index, collection[index]) === false) {\r\n break;\r\n }\r\n }\r\n return collection;\r\n }\r\n Object.keys(collection || {}).some((key) => callback.call(collection[key], key, collection[key]) === false);\r\n return collection;\r\n }\r\n\r\n function createEventLike(type) {\r\n return {\r\n type,\r\n defaultPrevented: false,\r\n preventDefault: function () {\r\n this.defaultPrevented = true;\r\n },\r\n isDefaultPrevented: function () {\r\n return this.defaultPrevented;\r\n }\r\n };\r\n }\r\n\r\n function normalizeSelector(selector) {\r\n if (!selector) {\r\n return selector;\r\n }\r\n return selector.replace(/:not\\(\"([^\"]+)\"\\)/g, ':not($1)');\r\n }\r\n\r\n function parseSelector(selector) {\r\n const normalizedSelector = normalizeSelector(selector || '*');\r\n const meta = {\r\n selector: normalizedSelector,\r\n first: false,\r\n last: false,\r\n gt: null,\r\n hidden: false,\r\n visible: false\r\n };\r\n meta.selector = meta.selector.replace(/:first\\b/g, function () {\r\n meta.first = true;\r\n return '';\r\n });\r\n meta.selector = meta.selector.replace(/:last\\b/g, function () {\r\n meta.last = true;\r\n return '';\r\n });\r\n meta.selector = meta.selector.replace(/:gt\\((\\d+)\\)/g, function (_, index) {\r\n meta.gt = Number(index);\r\n return '';\r\n });\r\n meta.selector = meta.selector.replace(/:hidden\\b/g, function () {\r\n meta.hidden = true;\r\n return '';\r\n });\r\n meta.selector = meta.selector.replace(/:visible\\b/g, function () {\r\n meta.visible = true;\r\n return '';\r\n });\r\n meta.selector = meta.selector.trim() || '*';\r\n return meta;\r\n }\r\n\r\n function isVisibleElement(element) {\r\n if (!element || element.nodeType !== 1) {\r\n return false;\r\n }\r\n const style = getWindow().getComputedStyle(element);\r\n return style.display !== 'none' && style.visibility !== 'hidden';\r\n }\r\n\r\n function matchesSelector(element, selector) {\r\n if (!selector || selector === '*') {\r\n return true;\r\n }\r\n if (!element || element.nodeType !== 1) {\r\n return false;\r\n }\r\n try {\r\n return element.matches(selector);\r\n } catch (error) {\r\n return false;\r\n }\r\n }\r\n\r\n function filterBySelector(elements, selector) {\r\n const meta = parseSelector(selector);\r\n let filtered = elements.filter((element) => matchesSelector(element, meta.selector));\r\n if (meta.hidden) {\r\n filtered = filtered.filter((element) => !isVisibleElement(element));\r\n }\r\n if (meta.visible) {\r\n filtered = filtered.filter((element) => isVisibleElement(element));\r\n }\r\n if (meta.gt !== null) {\r\n filtered = filtered.filter((_, index) => index > meta.gt);\r\n }\r\n if (meta.first) {\r\n filtered = filtered.slice(0, 1);\r\n }\r\n if (meta.last) {\r\n filtered = filtered.slice(-1);\r\n }\r\n return filtered;\r\n }\r\n\r\n function createNodesFromHtml(html) {\r\n const template = getDocument().createElement('template');\r\n template.innerHTML = html.trim();\r\n return Array.from(template.content.childNodes);\r\n }\r\n\r\n function toDataKey(key) {\r\n return String(key).replace(/-([a-z])/g, (_, letter) => letter.toUpperCase());\r\n }\r\n\r\n function getStoredState(element) {\r\n if (!elementDataStore.has(element)) {\r\n elementDataStore.set(element, {});\r\n }\r\n return elementDataStore.get(element);\r\n }\r\n\r\n function setState(element, key, value) {\r\n const store = getStoredState(element);\r\n store[toDataKey(key)] = value;\r\n }\r\n\r\n function getState(element, key) {\r\n const store = getStoredState(element);\r\n const normalizedKey = toDataKey(key);\r\n if (Object.prototype.hasOwnProperty.call(store, normalizedKey)) {\r\n return store[normalizedKey];\r\n }\r\n return undefined;\r\n }\r\n\r\n function getDatasetSnapshot(element) {\r\n return element.dataset ? Object.assign({}, element.dataset) : {};\r\n }\r\n\r\n function normalizeInput(input, context) {\r\n if (input === null || input === undefined) {\r\n return [];\r\n }\r\n if (Array.isArray(input)) {\r\n return unique(input.flatMap((item) => normalizeInput(item, context)));\r\n }\r\n if (isNode(input)) {\r\n return [input];\r\n }\r\n if (isNodeList(input)) {\r\n return Array.from(input).flatMap((item) => normalizeInput(item, context));\r\n }\r\n if (typeof input === 'string') {\r\n if (isHtmlString(input)) {\r\n return createNodesFromHtml(input);\r\n }\r\n const currentDocument = getDocument();\r\n const parents = normalizeInput(context || currentDocument, currentDocument);\r\n const selected = parents.length\r\n ? parents.flatMap((parent) => {\r\n if (parent.nodeType !== 1 && parent.nodeType !== 9) {\r\n return [];\r\n }\r\n return filterBySelector(Array.from(parent.querySelectorAll(parseSelector(input).selector)), input);\r\n })\r\n : filterBySelector(Array.from(currentDocument.querySelectorAll(parseSelector(input).selector)), input);\r\n return unique(selected);\r\n }\r\n return [];\r\n }\r\n\r\n function toNodeArray(content) {\r\n if (content instanceof DocumentFragment) {\r\n return Array.from(content.childNodes);\r\n }\r\n if (Array.isArray(content)) {\r\n return content.flatMap((item) => toNodeArray(item));\r\n }\r\n if (isNode(content)) {\r\n return [content];\r\n }\r\n if (typeof content === 'string') {\r\n return isHtmlString(content) ? createNodesFromHtml(content) : [getDocument().createTextNode(content)];\r\n }\r\n return [];\r\n }\r\n\r\n function cloneNodesForTarget(nodes, needsClone) {\r\n return nodes.map((node) => (needsClone ? node.cloneNode(true) : node));\r\n }\r\n\r\n function createTriggeredEvent(eventLike, extraData) {\r\n const type = typeof eventLike === 'string' ? eventLike : eventLike.type;\r\n const event = new (getWindow().CustomEvent)(type, {\r\n bubbles: true,\r\n cancelable: true,\r\n detail: extraData\r\n });\r\n event.originalEvent = event;\r\n event.data = extraData;\r\n event.delegateTarget = null;\r\n return event;\r\n }\r\n\r\n function clampValue(value, min, max) {\r\n return Math.min(Math.max(value, min), max);\r\n }\r\n\r\n function isTransparentColor(colorValue) {\r\n const normalizedColor = (colorValue || '').replace(/\\s+/g, '').toLowerCase();\r\n\r\n return !normalizedColor\r\n || normalizedColor === 'transparent'\r\n || normalizedColor === 'rgba(0,0,0,0)'\r\n || normalizedColor === 'hsla(0,0%,0%,0)';\r\n }\r\n\r\n function toReadableMinimapColor(colorValue) {\r\n const rgbaMatch = /^rgba?\\(([^)]+)\\)$/i.exec((colorValue || '').trim());\r\n const darkenFactor = 0.68;\r\n let channelValues;\r\n\r\n if (!rgbaMatch) {\r\n return colorValue;\r\n }\r\n\r\n channelValues = rgbaMatch[1].split(',').slice(0, 3).map(function (value) {\r\n return clampValue(Math.round(parseFloat(value.trim()) * darkenFactor), 0, 255);\r\n });\r\n\r\n if (channelValues.some(function (value) { return Number.isNaN(value); })) {\r\n return colorValue;\r\n }\r\n\r\n return 'rgb(' + channelValues.join(', ') + ')';\r\n }\r\n\r\n function getMinimapNodeColor(nodeElement) {\r\n const fallbackColor = 'rgba(217, 83, 79, 0.8)';\r\n const titleElement = nodeElement ? nodeElement.querySelector('.title') : null;\r\n const primaryColor = titleElement ? getWindow().getComputedStyle(titleElement).backgroundColor : '';\r\n const secondaryColorCandidates = [\r\n nodeElement,\r\n titleElement,\r\n nodeElement ? nodeElement.querySelector('.content') : null\r\n ].flatMap(function (element) {\r\n const style = element ? getWindow().getComputedStyle(element) : null;\r\n\r\n if (!style) {\r\n return [];\r\n }\r\n\r\n return [\r\n style.backgroundColor,\r\n style.borderTopColor,\r\n style.borderRightColor,\r\n style.borderBottomColor,\r\n style.borderLeftColor\r\n ];\r\n });\r\n\r\n return toReadableMinimapColor((!isTransparentColor(primaryColor) && primaryColor) || secondaryColorCandidates.find(function (color) {\r\n return !isTransparentColor(color);\r\n }) || fallbackColor);\r\n }\r\n\r\n const MINIMAP_NODE_HEIGHT = 18;\r\n\r\n function renderMinimapNodes(chartElement, minimapContentElement, chartRect, chartScale) {\r\n const fragment = getDocument().createDocumentFragment();\r\n\r\n Array.from(chartElement.querySelectorAll('.node')).filter(function (nodeElement) {\r\n return isVisibleElement(nodeElement);\r\n }).forEach(function (nodeElement) {\r\n const nodeRect = nodeElement.getBoundingClientRect();\r\n const minimapNodeElement = getDocument().createElement('div');\r\n const nodeTop = (nodeRect.top - chartRect.top) / chartScale;\r\n\r\n minimapNodeElement.className = 'orgchart-minimap-node';\r\n minimapNodeElement.style.left = Math.max((nodeRect.left - chartRect.left) / chartScale, 0) + 'px';\r\n minimapNodeElement.style.top = Math.max(nodeTop + ((nodeRect.height / chartScale - MINIMAP_NODE_HEIGHT) / 2), 0) + 'px';\r\n minimapNodeElement.style.width = Math.max(nodeRect.width / chartScale, 6) + 'px';\r\n minimapNodeElement.style.height = MINIMAP_NODE_HEIGHT + 'px';\r\n minimapNodeElement.style.backgroundColor = getMinimapNodeColor(nodeElement);\r\n fragment.appendChild(minimapNodeElement);\r\n });\r\n\r\n minimapContentElement.innerHTML = '';\r\n minimapContentElement.appendChild(fragment);\r\n }\r\n\r\n function getChartTransform(chartElement) {\r\n let currentTransform;\r\n let matrixValues;\r\n let currentScale = 1;\r\n let currentTranslateX = 0;\r\n let currentTranslateY = 0;\r\n\r\n if (!chartElement) {\r\n return {\r\n scale: currentScale,\r\n translateX: currentTranslateX,\r\n translateY: currentTranslateY\r\n };\r\n }\r\n\r\n currentTransform = getWindow().getComputedStyle(chartElement).transform || chartElement.style.transform || 'none';\r\n if (currentTransform && currentTransform !== 'none') {\r\n if (currentTransform.indexOf('matrix3d(') === 0) {\r\n matrixValues = currentTransform.slice(9, -1).split(',').map(function (value) {\r\n return getWindow().parseFloat(value.trim());\r\n });\r\n currentScale = Math.abs(matrixValues[0]) || 1;\r\n currentTranslateX = matrixValues[12] || 0;\r\n currentTranslateY = matrixValues[13] || 0;\r\n } else if (currentTransform.indexOf('matrix(') === 0) {\r\n matrixValues = currentTransform.slice(7, -1).split(',').map(function (value) {\r\n return getWindow().parseFloat(value.trim());\r\n });\r\n currentScale = Math.abs(matrixValues[0]) || 1;\r\n currentTranslateX = matrixValues[4] || 0;\r\n currentTranslateY = matrixValues[5] || 0;\r\n } else if (currentTransform.indexOf('scale3d(') === 0) {\r\n matrixValues = currentTransform.slice(8, -1).split(',').map(function (value) {\r\n return getWindow().parseFloat(value.trim());\r\n });\r\n currentScale = Math.abs(matrixValues[0]) || 1;\r\n } else if (currentTransform.indexOf('scale(') === 0) {\r\n matrixValues = currentTransform.slice(6, -1).split(',').map(function (value) {\r\n return getWindow().parseFloat(value.trim());\r\n });\r\n currentScale = Math.abs(matrixValues[0]) || 1;\r\n }\r\n }\r\n\r\n return {\r\n scale: currentScale,\r\n translateX: currentTranslateX,\r\n translateY: currentTranslateY\r\n };\r\n }\r\n\r\n const OrgChart = function (elem, opts) {\r\n if (!(this instanceof OrgChart)) {\r\n return new OrgChart(elem, opts);\r\n }\r\n if (isPlainObject(elem) && !opts) {\r\n this.opts = elem;\r\n this.chartContainer = getElement(elem.chartContainer || elem.container);\r\n } else {\r\n this.chartContainer = getElement(elem);\r\n this.opts = opts || {};\r\n }\r\n this.chart = null;\r\n this.defaultOptions = {\r\n 'icons': {\r\n 'theme': 'oci',\r\n 'parentNode': 'oci-menu',\r\n 'expandToUp': 'oci-chevron-up',\r\n 'collapseToDown': 'oci-chevron-down',\r\n 'collapseToLeft': 'oci-chevron-left',\r\n 'expandToRight': 'oci-chevron-right',\r\n 'backToCompact': 'oci-corner-top-left',\r\n 'backToLoose': 'oci-corner-bottom-right',\r\n 'collapsed': 'oci-plus-square',\r\n 'expanded': 'oci-minus-square',\r\n 'spinner': 'oci-spinner'\r\n },\r\n 'nodeTitle': 'name',\r\n 'nodeId': 'id',\r\n 'toggleSiblingsResp': false,\r\n 'visibleLevel': 999,\r\n 'chartClass': '',\r\n 'exportButton': false,\r\n 'exportButtonName': 'Export',\r\n 'exportFilename': 'OrgChart',\r\n 'exportFileextension': 'png',\r\n 'exportScale': 2,\r\n 'draggable': false,\r\n 'direction': 't2b',\r\n 'pan': false,\r\n 'minimap': false,\r\n 'zoom': false,\r\n 'zoominLimit': 7,\r\n 'zoomoutLimit': 0.5\r\n };\r\n if (this.chartContainer) {\r\n this.init();\r\n }\r\n };\r\n\r\n if (typeof module === 'object' && typeof module.exports === 'object') {\r\n Object.defineProperty(OrgChart, '__testing__', {\r\n value: {\r\n getState: getState,\r\n setState: setState\r\n }\r\n });\r\n }\r\n //\r\n OrgChart.prototype = {\r\n //\r\n init: function (opts) {\r\n this.options = mergeObjects({}, this.defaultOptions, this.opts, opts);\r\n // build the org-chart\r\n const chartContainerElement = this.chartContainer;\r\n let chartElement;\r\n let rootElement;\r\n let rootNodesContainerElement;\r\n let rootHierarchyElement;\r\n\r\n this.detachMinimap();\r\n if (this.chart) {\r\n this.chart.remove();\r\n }\r\n const data = this.options.data;\r\n chartElement = getDocument().createElement('div');\r\n chartElement.className = 'orgchart' + (this.options.chartClass !== '' ? ' ' + this.options.chartClass : '') + (this.options.direction !== 't2b' ? ' ' + this.options.direction : '');\r\n setState(chartElement, 'options', this.options);\r\n this.chart = chartElement;\r\n chartElement.addEventListener('click', function (event) {\r\n const nativeEvent = event.originalEvent || event;\r\n const clickTargetElement = getElement(nativeEvent.target);\r\n\r\n if (!clickTargetElement || !(typeof clickTargetElement.closest === 'function' && clickTargetElement.closest('.node'))) {\r\n Array.from(chartElement.querySelectorAll('.node.focused')).forEach(function (focusedNodeEl) {\r\n focusedNodeEl.classList.remove('focused');\r\n });\r\n }\r\n });\r\n if (typeof getWindow().MutationObserver !== 'undefined') {\r\n this.triggerInitEvent();\r\n }\r\n const isListElementData = isElement(data) && data.tagName === 'UL';\r\n rootNodesContainerElement = getDocument().createElement('ul');\r\n rootNodesContainerElement.className = 'nodes';\r\n chartElement.appendChild(rootNodesContainerElement);\r\n\r\n if (!isListElementData && Array.isArray(data)) {\r\n rootElement = rootNodesContainerElement;\r\n } else {\r\n rootHierarchyElement = getDocument().createElement('li');\r\n rootHierarchyElement.className = 'hierarchy';\r\n rootNodesContainerElement.appendChild(rootHierarchyElement);\r\n rootElement = rootHierarchyElement;\r\n }\r\n\r\n if (isListElementData) { // ul datasource\r\n this.buildHierarchy(rootElement, this.buildJsonDS(data.firstElementChild));\r\n } else { // local json datasource\r\n if (data.relationship) {\r\n this.buildHierarchy(rootElement, data);\r\n } else {\r\n this.buildHierarchy(rootElement, Array.isArray(data) ? data : this.attachRel(data, '00'));\r\n }\r\n }\r\n\r\n if (chartContainerElement) {\r\n chartContainerElement.appendChild(chartElement);\r\n }\r\n\r\n // append the export button\r\n if (this.options.exportButton && !getDocument().querySelector('.oc-export-btn')) {\r\n this.attachExportButton();\r\n }\r\n\r\n if (this.options.pan) {\r\n this.bindPan();\r\n }\r\n\r\n if (this.options.zoom) {\r\n this.bindZoom();\r\n }\r\n\r\n if (this.options.minimap) {\r\n this.attachMinimap();\r\n }\r\n\r\n return this;\r\n },\r\n handleCompactNodes: function () {\r\n const chartElement = this.chart;\r\n\r\n if (!chartElement) {\r\n return;\r\n }\r\n // caculate the compact nodes' level which is used to add different styles\r\n Array.from(chartElement.querySelectorAll('.node.compact')).forEach(function (compactNodeEl) {\r\n let compactAncestorCount = 0;\r\n let currentAncestorElement = compactNodeEl.parentElement;\r\n\r\n while (currentAncestorElement) {\r\n if (currentAncestorElement.classList && currentAncestorElement.classList.contains('compact')) {\r\n compactAncestorCount += 1;\r\n }\r\n currentAncestorElement = currentAncestorElement.parentElement;\r\n }\r\n\r\n compactNodeEl.classList.add(compactAncestorCount % 2 === 0 ? 'even' : 'odd');\r\n }); // the following code snippets are kept only as a reminder for a future native-DOM approach\r\n // that would add direction arrows for the top compact node once the styles are corrected.\r\n },\r\n //\r\n triggerInitEvent: function () {\r\n const orgChart = this;\r\n const MutationObserverCtor = getWindow().MutationObserver;\r\n const mo = new MutationObserverCtor(function (mutations) {\r\n mo.disconnect();\r\n initTime:\r\n for (let i = 0; i < mutations.length; i++) {\r\n for (let j = 0; j < mutations[i].addedNodes.length; j++) {\r\n if (mutations[i].addedNodes[j].classList && mutations[i].addedNodes[j].classList.contains('orgchart')) {\r\n orgChart.handleCompactNodes();\r\n if (!orgChart.chart) {\r\n break initTime;\r\n }\r\n if (orgChart.options.initCompleted && typeof orgChart.options.initCompleted === 'function') {\r\n orgChart.options.initCompleted(orgChart.chart);\r\n }\r\n mutations[i].addedNodes[j].dispatchEvent(createTriggeredEvent('init.orgchart'));\r\n break initTime;\r\n }\r\n }\r\n }\r\n });\r\n mo.observe(this.chartContainer, { childList: true });\r\n },\r\n triggerShowEvent: function (targetEl, rel) {\r\n if (targetEl && typeof targetEl.dispatchEvent === 'function') {\r\n targetEl.dispatchEvent(createTriggeredEvent('show-' + rel + '.orgchart'));\r\n }\r\n },\r\n triggerHideEvent: function (targetEl, rel) {\r\n if (targetEl && typeof targetEl.dispatchEvent === 'function') {\r\n targetEl.dispatchEvent(createTriggeredEvent('hide-' + rel + '.orgchart'));\r\n }\r\n },\r\n // add export button for orgchart\r\n attachExportButton: function () {\r\n const orgChart = this;\r\n const chartContainerElement = this.chartContainer;\r\n let exportButtonElement;\r\n\r\n if (!chartContainerElement || !chartContainerElement.parentElement) {\r\n return;\r\n }\r\n\r\n exportButtonElement = getDocument().createElement('button');\r\n exportButtonElement.className = 'oc-export-btn';\r\n exportButtonElement.textContent = this.options.exportButtonName;\r\n exportButtonElement.addEventListener('click', function (event) {\r\n event.preventDefault();\r\n orgChart.export();\r\n });\r\n chartContainerElement.insertAdjacentElement('afterend', exportButtonElement);\r\n },\r\n setOptions: function (opts, val) {\r\n if (typeof opts === 'string') {\r\n if (opts === 'pan') {\r\n if (val) {\r\n this.bindPan();\r\n } else {\r\n this.unbindPan();\r\n }\r\n }\r\n if (opts === 'zoom') {\r\n if (val) {\r\n this.bindZoom();\r\n } else {\r\n this.unbindZoom();\r\n }\r\n }\r\n if (opts === 'minimap') {\r\n this.options = mergeObjects({}, this.options || {}, { minimap: val });\r\n if (this.chart) {\r\n setState(this.chart, 'options', this.options);\r\n }\r\n if (val) {\r\n this.attachMinimap();\r\n } else {\r\n this.detachMinimap();\r\n }\r\n }\r\n }\r\n if (typeof opts === 'object') {\r\n if (opts.data) {\r\n this.init(opts);\r\n } else {\r\n if (typeof opts.pan !== 'undefined') {\r\n if (opts.pan) {\r\n this.bindPan();\r\n } else {\r\n this.unbindPan();\r\n }\r\n }\r\n if (typeof opts.zoom !== 'undefined') {\r\n if (opts.zoom) {\r\n this.bindZoom();\r\n } else {\r\n this.unbindZoom();\r\n }\r\n }\r\n if (typeof opts.minimap !== 'undefined') {\r\n this.options = mergeObjects({}, this.options || {}, { minimap: opts.minimap });\r\n if (this.chart) {\r\n setState(this.chart, 'options', this.options);\r\n }\r\n if (opts.minimap) {\r\n this.attachMinimap();\r\n } else {\r\n this.detachMinimap();\r\n }\r\n }\r\n }\r\n }\r\n\r\n return this;\r\n },\r\n attachMinimap: function () {\r\n const orgChart = this;\r\n const chartContainerElement = this.chartContainer;\r\n const chartElement = this.chart;\r\n let minimapElement;\r\n let minimapStageElement;\r\n let minimapContentElement;\r\n let minimapViewportElement;\r\n let minimapWheelBoundHandler;\r\n let minimapPointerDownBoundHandler;\r\n let minimapMutationObserver;\r\n\r\n if (!chartContainerElement || !chartElement) {\r\n return;\r\n }\r\n\r\n this.detachMinimap();\r\n if (!getWindow().getComputedStyle(chartContainerElement).position || getWindow().getComputedStyle(chartContainerElement).position === 'static') {\r\n setState(chartContainerElement, 'minimapOriginalPosition', chartContainerElement.style.position || '');\r\n setState(chartContainerElement, 'minimapManagedPosition', true);\r\n chartContainerElement.style.position = 'relative';\r\n }\r\n\r\n minimapElement = getDocument().createElement('div');\r\n minimapElement.className = 'orgchart-minimap';\r\n minimapStageElement = getDocument().createElement('div');\r\n minimapStageElement.className = 'orgchart-minimap-stage';\r\n minimapContentElement = getDocument().createElement('div');\r\n minimapContentElement.className = 'orgchart-minimap-content';\r\n minimapViewportElement = getDocument().createElement('div');\r\n minimapViewportElement.className = 'orgchart-minimap-viewport';\r\n\r\n minimapStageElement.appendChild(minimapContentElement);\r\n minimapStageElement.appendChild(minimapViewportElement);\r\n minimapElement.appendChild(minimapStageElement);\r\n chartContainerElement.appendChild(minimapElement);\r\n\r\n minimapWheelBoundHandler = function (event) {\r\n orgChart.minimapWheelHandler(event);\r\n };\r\n minimapPointerDownBoundHandler = function (event) {\r\n orgChart.minimapStartHandler(event);\r\n };\r\n\r\n minimapElement.addEventListener('wheel', minimapWheelBoundHandler);\r\n minimapViewportElement.addEventListener('mousedown', minimapPointerDownBoundHandler);\r\n\r\n if (typeof getWindow().MutationObserver !== 'undefined') {\r\n minimapMutationObserver = new (getWindow().MutationObserver)(function () {\r\n orgChart.updateMinimap(true);\r\n });\r\n minimapMutationObserver.observe(chartElement, {\r\n childList: true,\r\n subtree: true,\r\n attributes: true,\r\n attributeFilter: ['class']\r\n });\r\n }\r\n\r\n setState(chartElement, 'minimapElement', minimapElement);\r\n setState(chartElement, 'minimapStageElement', minimapStageElement);\r\n setState(chartElement, 'minimapContentElement', minimapContentElement);\r\n setState(chartElement, 'minimapViewportElement', minimapViewportElement);\r\n setState(chartElement, 'minimapWheelBoundHandler', minimapWheelBoundHandler);\r\n setState(chartElement, 'minimapPointerDownBoundHandler', minimapPointerDownBoundHandler);\r\n setState(chartElement, 'minimapMutationObserver', minimapMutationObserver || null);\r\n\r\n this.updateMinimap(true);\r\n },\r\n detachMinimap: function () {\r\n const chartContainerElement = this.chartContainer;\r\n const chartElement = this.chart;\r\n let minimapElement;\r\n let minimapViewportElement;\r\n let minimapWheelBoundHandler;\r\n let minimapPointerDownBoundHandler;\r\n let minimapMoveBoundHandler;\r\n let minimapEndBoundHandler;\r\n let minimapMutationObserver;\r\n\r\n if (chartElement) {\r\n minimapElement = getState(chartElement, 'minimapElement');\r\n minimapViewportElement = getState(chartElement, 'minimapViewportElement');\r\n minimapWheelBoundHandler = getState(chartElement, 'minimapWheelBoundHandler');\r\n minimapPointerDownBoundHandler = getState(chartElement, 'minimapPointerDownBoundHandler');\r\n minimapMoveBoundHandler = getState(chartElement, 'minimapMoveBoundHandler');\r\n minimapEndBoundHandler = getState(chartElement, 'minimapEndBoundHandler');\r\n minimapMutationObserver = getState(chartElement, 'minimapMutationObserver');\r\n\r\n if (minimapElement && minimapWheelBoundHandler) {\r\n minimapElement.removeEventListener('wheel', minimapWheelBoundHandler);\r\n }\r\n if (minimapViewportElement && minimapPointerDownBoundHandler) {\r\n minimapViewportElement.removeEventListener('mousedown', minimapPointerDownBoundHandler);\r\n }\r\n if (minimapMoveBoundHandler) {\r\n getDocument().removeEventListener('mousemove', minimapMoveBoundHandler);\r\n }\r\n if (minimapEndBoundHandler) {\r\n getDocument().removeEventListener('mouseup', minimapEndBoundHandler);\r\n }\r\n if (minimapMutationObserver) {\r\n minimapMutationObserver.disconnect();\r\n }\r\n if (minimapElement && minimapElement.parentElement) {\r\n minimapElement.remove();\r\n }\r\n\r\n [\r\n 'minimapElement',\r\n 'minimapStageElement',\r\n 'minimapContentElement',\r\n 'minimapViewportElement',\r\n 'minimapWheelBoundHandler',\r\n 'minimapPointerDownBoundHandler',\r\n 'minimapMoveBoundHandler',\r\n 'minimapEndBoundHandler',\r\n 'minimapMutationObserver',\r\n 'minimapDragState',\r\n 'minimapScale',\r\n 'minimapOffsetX',\r\n 'minimapOffsetY',\r\n 'minimapContentWidth',\r\n 'minimapContentHeight'\r\n ].forEach(function (key) {\r\n setState(chartElement, key, null);\r\n });\r\n }\r\n\r\n if (chartContainerElement && getState(chartContainerElement, 'minimapManagedPosition')) {\r\n chartContainerElement.style.position = getState(chartContainerElement, 'minimapOriginalPosition') || '';\r\n setState(chartContainerElement, 'minimapManagedPosition', null);\r\n setState(chartContainerElement, 'minimapOriginalPosition', null);\r\n }\r\n },\r\n minimapWheelHandler: function (event) {\r\n const chartContainerElement = this.chartContainer;\r\n\r\n if (!this.chart || !chartContainerElement) {\r\n return;\r\n }\r\n if (typeof event.preventDefault === 'function') {\r\n event.preventDefault();\r\n }\r\n\r\n this.setChartScale(this.chart, 1 + (event.deltaY > 0 ? -0.2 : 0.2), {\r\n x: chartContainerElement.getBoundingClientRect().left + (chartContainerElement.clientWidth / 2),\r\n y: chartContainerElement.getBoundingClientRect().top + (chartContainerElement.clientHeight / 2)\r\n });\r\n },\r\n minimapStartHandler: function (event) {\r\n const chartElement = this.chart;\r\n const minimapViewportElement = chartElement ? getState(chartElement, 'minimapViewportElement') : null;\r\n const minimapMoveBoundHandler = this.minimapMoveHandler.bind(this);\r\n const minimapEndBoundHandler = this.minimapEndHandler.bind(this);\r\n const viewportRect = minimapViewportElement ? minimapViewportElement.getBoundingClientRect() : null;\r\n\r\n if (!chartElement || !minimapViewportElement || !viewportRect) {\r\n return;\r\n }\r\n if (typeof event.preventDefault === 'function') {\r\n event.preventDefault();\r\n }\r\n\r\n setState(chartElement, 'minimapDragState', {\r\n startClientX: event.clientX,\r\n startClientY: event.clientY,\r\n startLeft: viewportRect.left,\r\n startTop: viewportRect.top,\r\n viewportWidth: viewportRect.width,\r\n viewportHeight: viewportRect.height\r\n });\r\n setState(chartElement, 'minimapMoveBoundHandler', minimapMoveBoundHandler);\r\n setState(chartElement, 'minimapEndBoundHandler', minimapEndBoundHandler);\r\n getDocument().addEventListener('mousemove', minimapMoveBoundHandler);\r\n getDocument().addEventListener('mouseup', minimapEndBoundHandler);\r\n },\r\n minimapMoveHandler: function (event) {\r\n const chartElement = this.chart;\r\n const dragState = chartElement ? getState(chartElement, 'minimapDragState') : null;\r\n const minimapStageElement = chartElement ? getState(chartElement, 'minimapStageElement') : null;\r\n let stageRect;\r\n\r\n if (!chartElement || !dragState || !minimapStageElement) {\r\n return;\r\n }\r\n\r\n stageRect = minimapStageElement.getBoundingClientRect();\r\n this.moveChartFromMinimap(\r\n dragState.startLeft + (event.clientX - dragState.startClientX) - stageRect.left,\r\n dragState.startTop + (event.clientY - dragState.startClientY) - stageRect.top,\r\n dragState.viewportWidth,\r\n dragState.viewportHeight\r\n );\r\n },\r\n minimapEndHandler: function () {\r\n const chartElement = this.chart;\r\n const minimapMoveBoundHandler = chartElement ? getState(chartElement, 'minimapMoveBoundHandler') : null;\r\n const minimapEndBoundHandler = chartElement ? getState(chartElement, 'minimapEndBoundHandler') : null;\r\n\r\n if (minimapMoveBoundHandler) {\r\n getDocument().removeEventListener('mousemove', minimapMoveBoundHandler);\r\n setState(chartElement, 'minimapMoveBoundHandler', null);\r\n }\r\n if (minimapEndBoundHandler) {\r\n getDocument().removeEventListener('mouseup', minimapEndBoundHandler);\r\n setState(chartElement, 'minimapEndBoundHandler', null);\r\n }\r\n if (chartElement) {\r\n setState(chartElement, 'minimapDragState', null);\r\n }\r\n },\r\n moveChartFromMinimap: function (stageLeft, stageTop, viewportWidth, viewportHeight) {\r\n const chartElement = this.chart;\r\n const chartContainerElement = this.chartContainer;\r\n const minimapStageElement = chartElement ? getState(chartElement, 'minimapStageElement') : null;\r\n const minimapScale = chartElement ? getState(chartElement, 'minimapScale') : null;\r\n const minimapOffsetX = chartElement ? getState(chartElement, 'minimapOffsetX') : 0;\r\n const minimapOffsetY = chartElement ? getState(chartElement, 'minimapOffsetY') : 0;\r\n const minimapContentWidth = chartElement ? getState(chartElement, 'minimapContentWidth') : 0;\r\n const minimapContentHeight = chartElement ? getState(chartElement, 'minimapContentHeight') : 0;\r\n const chartTransform = getChartTransform(chartElement);\r\n const chartRect = chartElement ? chartElement.getBoundingClientRect() : null;\r\n const containerRect = chartContainerElement ? chartContainerElement.getBoundingClientRect() : null;\r\n let localViewportWidth;\r\n let localViewportHeight;\r\n let localLeft;\r\n let localTop;\r\n let baseLeft;\r\n let baseTop;\r\n\r\n if (!chartElement || !chartContainerElement || !minimapStageElement || !minimapScale || !chartRect || !containerRect) {\r\n return;\r\n }\r\n\r\n localViewportWidth = viewportWidth / minimapScale;\r\n localViewportHeight = viewportHeight / minimapScale;\r\n localLeft = clampValue((stageLeft - minimapOffsetX) / minimapScale, 0, Math.max(minimapContentWidth - localViewportWidth, 0));\r\n localTop = clampValue((stageTop - minimapOffsetY) / minimapScale, 0, Math.max(minimapContentHeight - localViewportHeight, 0));\r\n baseLeft = chartRect.left - chartTransform.translateX;\r\n baseTop = chartRect.top - chartTransform.translateY;\r\n\r\n chartElement.style.transformOrigin = '0 0';\r\n chartElement.style.transform = 'matrix(' + chartTransform.scale + ', 0, 0, ' + chartTransform.scale + ', '\r\n + (containerRect.left - baseLeft - (localLeft * chartTransform.scale)) + ', '\r\n + (containerRect.top - baseTop - (localTop * chartTransform.scale)) + ')';\r\n this.updateMinimap();\r\n },\r\n updateMinimap: function (forceRefresh) {\r\n const chartElement = this.chart;\r\n const chartContainerElement = this.chartContainer;\r\n const minimapStageElement = chartElement ? getState(chartElement, 'minimapStageElement') : null;\r\n const minimapContentElement = chartElement ? getState(chartElement, 'minimapContentElement') : null;\r\n const minimapViewportElement = chartElement ? getState(chartElement, 'minimapViewportElement') : null;\r\n const chartTransform = getChartTransform(chartElement);\r\n const chartRect = chartElement ? chartElement.getBoundingClientRect() : null;\r\n const containerRect = chartContainerElement ? chartContainerElement.getBoundingClientRect() : null;\r\n let contentWidth;\r\n let contentHeight;\r\n let stageWidth;\r\n let stageHeight;\r\n let minimapScale;\r\n let minimapOffsetX;\r\n let minimapOffsetY;\r\n let viewportLeft;\r\n let viewportTop;\r\n let viewportWidth;\r\n let viewportHeight;\r\n\r\n if (!this.options || !this.options.minimap || !chartElement || !chartContainerElement || !minimapStageElement || !minimapContentElement || !minimapViewportElement || !chartRect || !containerRect) {\r\n return;\r\n }\r\n\r\n contentWidth = chartTransform.scale !== 0 && chartRect.width\r\n ? chartRect.width / chartTransform.scale\r\n : (chartElement.scrollWidth || chartElement.offsetWidth || 1);\r\n contentHeight = chartTransform.scale !== 0 && chartRect.height\r\n ? chartRect.height / chartTransform.scale\r\n : (chartElement.scrollHeight || chartElement.offsetHeight || 1);\r\n stageWidth = minimapStageElement.clientWidth || 180;\r\n stageHeight = minimapStageElement.clientHeight || 120;\r\n minimapScale = Math.min(stageWidth / Math.max(contentWidth, 1), stageHeight / Math.max(contentHeight, 1));\r\n minimapOffsetX = (stageWidth - (contentWidth * minimapScale)) / 2;\r\n minimapOffsetY = (stageHeight - (contentHeight * minimapScale)) / 2;\r\n\r\n minimapContentElement.style.width = contentWidth + 'px';\r\n minimapContentElement.style.height = contentHeight + 'px';\r\n minimapContentElement.style.transformOrigin = '0 0';\r\n minimapContentElement.style.transform = 'translate(' + minimapOffsetX + 'px, ' + minimapOffsetY + 'px) scale(' + minimapScale + ')';\r\n\r\n if (forceRefresh || !minimapContentElement.firstElementChild) {\r\n renderMinimapNodes(chartElement, minimapContentElement, chartRect, chartTransform.scale || 1);\r\n }\r\n\r\n viewportLeft = clampValue((containerRect.left - chartRect.left) / chartTransform.scale, 0, Math.max(contentWidth, 0));\r\n viewportTop = clampValue((containerRect.top - chartRect.top) / chartTransform.scale, 0, Math.max(contentHeight, 0));\r\n viewportWidth = Math.min(contentWidth, containerRect.width / chartTransform.scale);\r\n viewportHeight = Math.min(contentHeight, containerRect.height / chartTransform.scale);\r\n\r\n minimapViewportElement.style.width = Math.max(viewportWidth * minimapScale, 12) + 'px';\r\n minimapViewportElement.style.height = Math.max(viewportHeight * minimapScale, 12) + 'px';\r\n minimapViewportElement.style.transform = 'translate(' + (minimapOffsetX + (viewportLeft * minimapScale)) + 'px, ' + (minimapOffsetY + (viewportTop * minimapScale)) + 'px)';\r\n\r\n setState(chartElement, 'minimapScale', minimapScale);\r\n setState(chartElement, 'minimapOffsetX', minimapOffsetX);\r\n setState(chartElement, 'minimapOffsetY', minimapOffsetY);\r\n setState(chartElement, 'minimapContentWidth', contentWidth);\r\n setState(chartElement, 'minimapContentHeight', contentHeight);\r\n },\r\n //\r\n panStartHandler: function (e) {\r\n const orgChart = this;\r\n const nativeEvent = e.originalEvent || e;\r\n const chartElement = getElement(e.chart || nativeEvent.currentTarget);\r\n const targetElement = getElement(nativeEvent.target);\r\n let lastTf;\r\n let existingPanMoveHandler;\r\n let panMoveHandler;\r\n\r\n if (!chartElement) {\r\n return;\r\n }\r\n\r\n if ((targetElement && typeof targetElement.closest === 'function' && targetElement.closest('.node')) || (nativeEvent.touches && nativeEvent.touches.length > 1)) {\r\n setState(chartElement, 'panning', false);\r\n return;\r\n } else {\r\n chartElement.style.cursor = 'move';\r\n setState(chartElement, 'panning', true);\r\n }\r\n let lastX = 0;\r\n let lastY = 0;\r\n lastTf = chartElement.style.transform || getWindow().getComputedStyle(chartElement).transform || 'none';\r\n if (lastTf !== 'none') {\r\n const temp = lastTf.split(',');\r\n if (lastTf.indexOf('3d') === -1) {\r\n lastX = parseInt(temp[4]);\r\n lastY = parseInt(temp[5]);\r\n } else {\r\n lastX = parseInt(temp[12]);\r\n lastY = parseInt(temp[13]);\r\n }\r\n }\r\n let startX = 0;\r\n let startY = 0;\r\n if (!nativeEvent.targetTouches) { // pand on desktop\r\n startX = (typeof nativeEvent.pageX === 'number' ? nativeEvent.pageX : nativeEvent.clientX) - lastX;\r\n startY = (typeof nativeEvent.pageY === 'number' ? nativeEvent.pageY : nativeEvent.clientY) - lastY;\r\n } else if (nativeEvent.targetTouches.length === 1) { // pan on mobile device\r\n startX = nativeEvent.targetTouches[0].pageX - lastX;\r\n startY = nativeEvent.targetTouches[0].pageY - lastY;\r\n } else if (nativeEvent.targetTouches.length > 1) {\r\n return;\r\n }\r\n\r\n existingPanMoveHandler = getState(chartElement, 'panMoveHandler');\r\n if (existingPanMoveHandler) {\r\n chartElement.removeEventListener('mousemove', existingPanMoveHandler);\r\n chartElement.removeEventListener('touchmove', existingPanMoveHandler);\r\n }\r\n\r\n panMoveHandler = function (e) {\r\n let currentTransform;\r\n let matrix;\r\n\r\n if (!getState(chartElement, 'panning')) {\r\n return;\r\n }\r\n let newX = 0;\r\n let newY = 0;\r\n if (!e.targetTouches) { // pand on desktop\r\n newX = (typeof e.pageX === 'number' ? e.pageX : e.clientX) - startX;\r\n newY = (typeof e.pageY === 'number' ? e.pageY : e.clientY) - startY;\r\n } else if (e.targetTouches.length === 1) { // pan on mobile device\r\n newX = e.targetTouches[0].pageX - startX;\r\n newY = e.targetTouches[0].pageY - startY;\r\n } else if (e.targetTouches.length > 1) {\r\n return;\r\n }\r\n currentTransform = chartElement.style.transform || getWindow().getComputedStyle(chartElement).transform || 'none';\r\n if (currentTransform === 'none') {\r\n if (currentTransform.indexOf('3d') === -1) {\r\n chartElement.style.transform = 'matrix(1, 0, 0, 1, ' + newX + ', ' + newY + ')';\r\n } else {\r\n chartElement.style.transform = 'matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, ' + newX + ', ' + newY + ', 0, 1)';\r\n }\r\n } else {\r\n matrix = currentTransform.split(',');\r\n if (currentTransform.indexOf('3d') === -1) {\r\n matrix[4] = ' ' + newX;\r\n matrix[5] = ' ' + newY + ')';\r\n } else {\r\n matrix[12] = ' ' + newX;\r\n matrix[13] = ' ' + newY;\r\n }\r\n chartElement.style.transform = matrix.join(',');\r\n orgChart.updateMinimap();\r\n }\r\n };\r\n\r\n setState(chartElement, 'panMoveHandler', panMoveHandler);\r\n chartElement.addEventListener('mousemove', panMoveHandler);\r\n chartElement.addEventListener('touchmove', panMoveHandler);\r\n },\r\n //\r\n panEndHandler: function (e) {\r\n const nativeEvent = e.originalEvent || e;\r\n const chartElement = getElement(e.chart || nativeEvent.chart || nativeEvent.currentTarget);\r\n let panMoveHandler;\r\n\r\n if (!chartElement) {\r\n return;\r\n }\r\n\r\n if (getState(chartElement, 'panning')) {\r\n panMoveHandler = getState(chartElement, 'panMoveHandler');\r\n setState(chartElement, 'panning', false);\r\n chartElement.style.cursor = 'default';\r\n if (panMoveHandler) {\r\n chartElement.removeEventListener('mousemove', panMoveHandler);\r\n chartElement.removeEventListener('touchmove', panMoveHandler);\r\n setState(chartElement, 'panMoveHandler', null);\r\n }\r\n }\r\n },\r\n //\r\n bindPan: function () {\r\n const orgChart = this;\r\n const chartContainerElement = this.chartContainer;\r\n const chartElement = this.chart;\r\n let panStartBoundHandler;\r\n let panEndBoundHandler;\r\n\r\n if (!chartContainerElement || !chartElement) {\r\n return;\r\n }\r\n\r\n this.unbindPan();\r\n chartContainerElement.style.overflow = 'hidden';\r\n panStartBoundHandler = function (event) {\r\n orgChart.panStartHandler({\r\n chart: chartElement,\r\n originalEvent: event\r\n });\r\n };\r\n panEndBoundHandler = function () {\r\n orgChart.panEndHandler({\r\n chart: chartElement\r\n });\r\n };\r\n\r\n setState(chartElement, 'panStartBoundHandler', panStartBoundHandler);\r\n setState(chartElement, 'panEndBoundHandler', panEndBoundHandler);\r\n chartElement.addEventListener('mousedown', panStartBoundHandler);\r\n chartElement.addEventListener('touchstart', panStartBoundHandler);\r\n getDocument().addEventListener('mouseup', panEndBoundHandler);\r\n getDocument().addEventListener('touchend', panEndBoundHandler);\r\n },\r\n //\r\n unbindPan: function () {\r\n const chartContainerElement = this.chartContainer;\r\n const chartElement = this.chart;\r\n let panStartBoundHandler;\r\n let panEndBoundHandler;\r\n\r\n if (!chartContainerElement || !chartElement) {\r\n return;\r\n }\r\n\r\n chartContainerElement.style.overflow = 'auto';\r\n panStartBoundHandler = getState(chartElement, 'panStartBoundHandler');\r\n panEndBoundHandler = getState(chartElement, 'panEndBoundHandler');\r\n if (panStartBoundHandler) {\r\n chartElement.removeEventListener('mousedown', panStartBoundHandler);\r\n chartElement.removeEventListener('touchstart', panStartBoundHandler);\r\n setState(chartElement, 'panStartBoundHandler', null);\r\n }\r\n if (panEndBoundHandler) {\r\n getDocument().removeEventListener('mouseup', panEndBoundHandler);\r\n getDocument().removeEventListener('touchend', panEndBoundHandler);\r\n setState(chartElement, 'panEndBoundHandler', null);\r\n }\r\n },\r\n //\r\n zoomWheelHandler: function (e) {\r\n const nativeEvent = e.originalEvent || e;\r\n const orgChart = e.orgChart;\r\n const chartContainerElement = orgChart ? orgChart.chartContainer : null;\r\n const chartContainerRect = chartContainerElement && typeof chartContainerElement.getBoundingClientRect === 'function'\r\n ? chartContainerElement.getBoundingClientRect()\r\n : null;\r\n const hasPointerPosition = nativeEvent && typeof nativeEvent.clientX === 'number' && typeof nativeEvent.clientY === 'number';\r\n let zoomAnchor = null;\r\n\r\n if (!orgChart || !orgChart.chart || !chartContainerElement) {\r\n return;\r\n }\r\n\r\n if (chartContainerRect && hasPointerPosition) {\r\n if (nativeEvent.clientX < chartContainerRect.left || nativeEvent.clientX > chartContainerRect.right\r\n || nativeEvent.clientY < chartContainerRect.top || nativeEvent.clientY > chartContainerRect.bottom) {\r\n return;\r\n }\r\n\r\n zoomAnchor = {\r\n x: nativeEvent.clientX,\r\n y: nativeEvent.clientY\r\n };\r\n }\r\n\r\n if (nativeEvent && typeof nativeEvent.preventDefault === 'function') {\r\n nativeEvent.preventDefault();\r\n }\r\n const newScale = 1 + (nativeEvent.deltaY > 0 ? -0.2 : 0.2);\r\n orgChart.setChartScale(orgChart.chart, newScale, zoomAnchor);\r\n },\r\n //\r\n zoomStartHandler: function (e) {\r\n let orgChart;\r\n let chartElement;\r\n let dist;\r\n let pinchCenter;\r\n const nativeEvent = e.originalEvent || e;\r\n\r\n if(nativeEvent.touches && nativeEvent.touches.length === 2) {\r\n orgChart = e.orgChart;\r\n chartElement = orgChart.chart;\r\n if (!chartElement) {\r\n return;\r\n }\r\n setState(chartElement, 'pinching', true);\r\n dist = orgChart.getPinchDist(nativeEvent);\r\n pinchCenter = orgChart.getPinchCenter(nativeEvent);\r\n setState(chartElement, 'pinchDistStart', dist);\r\n setState(chartElement, 'pinchCenterStart', pinchCenter);\r\n setState(chartElement, 'pinchCenterEnd', pinchCenter);\r\n }\r\n },\r\n zoomingHandler: function (e) {\r\n const nativeEvent = e.originalEvent || e;\r\n const orgChart = e.orgChart;\r\n const chartElement = orgChart.chart;\r\n let dist;\r\n let pinchCenter;\r\n\r\n if(chartElement && getState(chartElement, 'pinching')) {\r\n dist = orgChart.getPinchDist(nativeEvent);\r\n pinchCenter = orgChart.getPinchCenter(nativeEvent);\r\n setState(chartElement, 'pinchDistEnd', dist);\r\n setState(chartElement, 'pinchCenterEnd', pinchCenter);\r\n }\r\n },\r\n zoomEndHandler: function (e) {\r\n const orgChart = e.orgChart;\r\n const chartElement = orgChart.chart;\r\n let diff;\r\n let pinchCenter;\r\n\r\n if(chartElement && getState(chartElement, 'pinching')) {\r\n setState(chartElement, 'pinching', false);\r\n diff = getState(chartElement, 'pinchDistEnd') - getState(chartElement, 'pinchDistStart');\r\n pinchCenter = getState(chartElement, 'pinchCenterEnd') || getState(chartElement, 'pinchCenterStart') || null;\r\n if (diff > 0) {\r\n orgChart.setChartScale(orgChart.chart, 1.2, pinchCenter);\r\n } else if (diff < 0) {\r\n orgChart.setChartScale(orgChart.chart, 0.8, pinchCenter);\r\n }\r\n }\r\n },\r\n //\r\n bindZoom: function () {\r\n const orgChart = this;\r\n const chartContainerElement = this.chartContainer;\r\n const chartElement = this.chart;\r\n let zoomWheelBoundHandler;\r\n let zoomStartBoundHandler;\r\n let zoomingBoundHandler;\r\n let zoomEndBoundHandler;\r\n\r\n if (!chartContainerElement || !chartElement) {\r\n return;\r\n }\r\n\r\n this.unbindZoom();\r\n zoomWheelBoundHandler = function (event) {\r\n orgChart.zoomWheelHandler({\r\n orgChart: orgChart,\r\n originalEvent: event\r\n });\r\n };\r\n zoomStartBoundHandler = function (event) {\r\n orgChart.zoomStartHandler({\r\n orgChart: orgChart,\r\n originalEvent: event\r\n });\r\n };\r\n zoomingBoundHandler = function (event) {\r\n orgChart.zoomingHandler({\r\n orgChart: orgChart,\r\n originalEvent: event\r\n });\r\n };\r\n zoomEndBoundHandler = function () {\r\n orgChart.zoomEndHandler({\r\n orgChart: orgChart\r\n });\r\n };\r\n\r\n setState(chartElement, 'zoomWheelBoundHandler', zoomWheelBoundHandler);\r\n setState(chartElement, 'zoomStartBoundHandler', zoomStartBoundHandler);\r\n setState(chartElement, 'zoomingBoundHandler', zoomingBoundHandler);\r\n setState(chartElement, 'zoomEndBoundHandler', zoomEndBoundHandler);\r\n chartContainerElement.addEventListener('wheel', zoomWheelBoundHandler);\r\n chartContainerElement.addEventListener('touchstart', zoomStartBoundHandler);\r\n getDocument().addEventListener('touchmove', zoomingBoundHandler);\r\n getDocument().addEventListener('touchend', zoomEndBoundHandler);\r\n },\r\n unbindZoom: function () {\r\n const chartContainerElement = this.chartContainer;\r\n const chartElement = this.chart;\r\n let zoomWheelBoundHandler;\r\n let zoomStartBoundHandler;\r\n let zoomingBoundHandler;\r\n let zoomEndBoundHandler;\r\n\r\n if (!chartContainerElement || !chartElement) {\r\n return;\r\n }\r\n\r\n zoomWheelBoundHandler = getState(chartElement, 'zoomWheelBoundHandler');\r\n zoomStartBoundHandler = getState(chartElement, 'zoomStartBoundHandler');\r\n zoomingBoundHandler = getState(chartElement, 'zoomingBoundHandler');\r\n zoomEndBoundHandler = getState(chartElement, 'zoomEndBoundHandler');\r\n if (zoomWheelBoundHandler) {\r\n chartContainerElement.removeEventListener('wheel', zoomWheelBoundHandler);\r\n setState(chartElement, 'zoomWheelBoundHandler', null);\r\n }\r\n if (zoomStartBoundHandler) {\r\n chartContainerElement.removeEventListener('touchstart', zoomStartBoundHandler);\r\n setState(chartElement, 'zoomStartBoundHandler', null);\r\n }\r\n if (zoomingBoundHandler) {\r\n getDocument().removeEventListener('touchmove', zoomingBoundHandler);\r\n setState(chartElement, 'zoomingBoundHandler', null);\r\n }\r\n if (zoomEndBoundHandler) {\r\n getDocument().removeEventListener('touchend', zoomEndBoundHandler);\r\n setState(chartElement, 'zoomEndBoundHandler', null);\r\n }\r\n },\r\n //\r\n getPinchDist: function (e) {\r\n const nativeEvent = e.originalEvent || e;\r\n\r\n return Math.sqrt((nativeEvent.touches[0].clientX - nativeEvent.touches[1].clientX) * (nativeEvent.touches[0].clientX - nativeEvent.touches[1].clientX) +\r\n (nativeEvent.touches[0].clientY - nativeEvent.touches[1].clientY) * (nativeEvent.touches[0].clientY - nativeEvent.touches[1].clientY));\r\n },\r\n getPinchCenter: function (e) {\r\n const nativeEvent = e.originalEvent || e;\r\n\r\n return {\r\n x: (nativeEvent.touches[0].clientX + nativeEvent.touches[1].clientX) / 2,\r\n y: (nativeEvent.touches[0].clientY + nativeEvent.touches[1].clientY) / 2\r\n };\r\n },\r\n //\r\n setChartScale: function (chartEl, newScale, zoomAnchor) {\r\n const chartElement = getElement(chartEl);\r\n const chartContainerElement = this.chartContainer;\r\n let opts;\r\n let chartRect;\r\n let currentScale = 1;\r\n let currentTranslateX = 0;\r\n let currentTranslateY = 0;\r\n let targetScale = 1;\r\n let anchorX;\r\n let anchorY;\r\n let localAnchorX;\r\n let localAnchorY;\r\n let baseLeft;\r\n let baseTop;\r\n let containerRect;\r\n let targetTranslateX;\r\n let targetTranslateY;\r\n\r\n if (!chartElement) {\r\n return;\r\n }\r\n\r\n opts = getState(chartElement, 'options');\r\n currentScale = getChartTransform(chartElement).scale;\r\n currentTranslateX = getChartTransform(chartElement).translateX;\r\n currentTranslateY = getChartTransform(chartElement).translateY;\r\n\r\n targetScale = currentScale * newScale;\r\n if (!(targetScale > opts.zoomoutLimit && targetScale < opts.zoominLimit)) {\r\n return;\r\n }\r\n\r\n targetTranslateX = currentTranslateX;\r\n targetTranslateY = currentTranslateY;\r\n chartRect = typeof chartElement.getBoundingClientRect === 'function'\r\n ? chartElement.getBoundingClientRect()\r\n : null;\r\n if (!zoomAnchor && chartContainerElement && typeof chartContainerElement.getBoundingClientRect === 'function') {\r\n containerRect = chartContainerElement.getBoundingClientRect();\r\n zoomAnchor = {\r\n x: containerRect.left + (containerRect.width / 2),\r\n y: containerRect.top + (containerRect.height / 2)\r\n };\r\n }\r\n if (zoomAnchor && chartRect && typeof zoomAnchor.x === 'number' && typeof zoomAnchor.y === 'number' && currentScale !== 0) {\r\n anchorX = zoomAnchor.x;\r\n anchorY = zoomAnchor.y;\r\n localAnchorX = (anchorX - chartRect.left) / currentScale;\r\n localAnchorY = (anchorY - chartRect.top) / currentScale;\r\n baseLeft = chartRect.left - currentTranslateX;\r\n baseTop = chartRect.top - currentTranslateY;\r\n targetTranslateX = anchorX - baseLeft - (localAnchorX * targetScale);\r\n targetTranslateY = anchorY - baseTop - (localAnchorY * targetScale);\r\n }\r\n\r\n chartElement.style.transformOrigin = '0 0';\r\n chartElement.style.transform = 'matrix(' + targetScale + ', 0, 0, ' + targetScale + ', ' + targetTranslateX + ', ' + targetTranslateY + ')';\r\n this.updateMinimap();\r\n },\r\n //\r\n buildJsonDS: function (liEl) {\r\n const orgChart = this;\r\n const liElement = getElement(liEl);\r\n let childListElement;\r\n let jsonNodeData;\r\n\r\n if (!liElement) {\r\n return {};\r\n }\r\n\r\n childListElement = Array.from(liElement.children || []).find(function (childEl) {\r\n return childEl.tagName === 'UL';\r\n }) || null;\r\n\r\n jsonNodeData = {\r\n 'name': ((liElement.childNodes && liElement.childNodes[0]) ? liElement.childNodes[0].textContent : '').trim(),\r\n 'relationship': (liElement.parentElement && liElement.parentElement.parentElement && liElement.parentElement.parentElement.tagName === 'LI' ? '1' : '0')\r\n + (liElement.parentElement ? Array.from(liElement.parentElement.children).filter(function (siblingEl) {\r\n return siblingEl !== liElement && siblingEl.tagName === 'LI';\r\n }).length ? 1 : 0 : 0)\r\n + (childListElement ? 1 : 0)\r\n };\r\n forEachValue(getDatasetSnapshot(liElement), function(key, value) {\r\n jsonNodeData[key] = value;\r\n });\r\n if (childListElement) {\r\n Array.from(childListElement.children).forEach(function (childEl) {\r\n if (childEl.tagName !== 'LI') {\r\n return;\r\n }\r\n if (!jsonNodeData.children) {\r\n jsonNodeData.children = [];\r\n }\r\n jsonNodeData.children.push(orgChart.buildJsonDS(childEl));\r\n });\r\n }\r\n\r\n return jsonNodeData;\r\n },\r\n // process datasource and add necessary information\r\n attachRel: function (data, flags) {\r\n const orgChart = this;\r\n data.relationship = flags + (data.children && data.children.length > 0 ? 1 : 0);\r\n if (this.options?.compact?.constructor === Function && this.options.compact(data)) {\r\n data.compact = true;\r\n }\r\n if (data.children) {\r\n data.children.forEach(function(item) {\r\n if (data.hybrid || data.vertical) { // identify all the descendant nodes except the root node of hybrid structure\r\n item.vertical = true;\r\n } else if (data.compact && item.children) { // identify all the compact ancestor nodes\r\n item.compact = true;\r\n } else if (data.compact && !item.children) { // identify all the compact descendant nodes\r\n item.associatedCompact = true;\r\n }\r\n orgChart.attachRel(item, '1' + (data.children.length > 1 ? 1 : 0));\r\n });\r\n }\r\n return data;\r\n },\r\n //\r\n loopChart: function (chartEl, includeNodeData) {\r\n const orgChart = this;\r\n const chartElement = getElement(chartEl);\r\n let nodeElement;\r\n let childNodesContainerElement;\r\n let hierarchyNodeData;\r\n\r\n includeNodeData = (includeNodeData !== null && includeNodeData !== undefined) ? includeNodeData : false;\r\n\r\n if (!chartElement) {\r\n return {};\r\n }\r\n\r\n nodeElement = chartElement.classList && chartElement.classList.contains('hierarchy')\r\n ? Array.from(chartElement.children || []).find(function (childEl) {\r\n return childEl.classList && childEl.classList.contains('node');\r\n })\r\n : chartElement.querySelector('.node');\r\n if (!nodeElement) {\r\n return {};\r\n }\r\n\r\n hierarchyNodeData = { 'id': nodeElement.id };\r\n if (includeNodeData) {\r\n forEachValue(getState(nodeElement, 'nodeData'), function (key, value) {\r\n hierarchyNodeData[key] = value;\r\n });\r\n }\r\n childNodesContainerElement = Array.from(nodeElement.parentElement ? nodeElement.parentElement.children : []).find(function (childEl) {\r\n return childEl !== nodeElement && childEl.classList && childEl.classList.contains('nodes');\r\n }) || null;\r\n if (childNodesContainerElement) {\r\n Array.from(childNodesContainerElement.children).forEach(function (childEl) {\r\n if (!childEl.classList || !childEl.classList.contains('hierarchy')) {\r\n return;\r\n }\r\n if (!hierarchyNodeData.children) {\r\n hierarchyNodeData.children = [];\r\n }\r\n hierarchyNodeData.children.push(orgChart.loopChart(childEl, includeNodeData));\r\n });\r\n }\r\n\r\n return hierarchyNodeData;\r\n },\r\n //\r\n getHierarchy: function (includeNodeData) {\r\n const chartElement = this.chart;\r\n let nodeElements;\r\n\r\n includeNodeData = (includeNodeData !== null && includeNodeData !== undefined) ? includeNodeData : false;\r\n if (!chartElement) {\r\n return 'Error: orgchart does not exist'\r\n } else {\r\n nodeElements = chartElement ? Array.from(chartElement.querySelectorAll('.node')) : [];\r\n if (!nodeElements.length) {\r\n return 'Error: nodes do not exist'\r\n } else {\r\n if (nodeElements.some(function (nodeEl) { return !nodeEl.id; })) {\r\n return 'Error: All nodes of orghcart to be exported must have data-id attribute!';\r\n }\r\n }\r\n }\r\n return this.loopChart(chartElement, includeNodeData);\r\n },\r\n // detect the exist/display state of related node\r\n getNodeState: function (nodeEl, relation) {\r\n const nodeElement = getElement(nodeEl);\r\n let relatedElement;\r\n let isVerticalNode;\r\n let siblingElements;\r\n\r\n if (!nodeElement || !nodeElement.classList || !nodeElement.classList.contains('node')) {\r\n return { 'exist': false, 'visible': false };\r\n }\r\n\r\n relation = relation || 'self';\r\n isVerticalNode = !!nodeElement.closest('vertical');\r\n\r\n if (relation === 'parent') {\r\n if (isVerticalNode) {\r\n relatedElement = nodeElement.closest('ul');\r\n relatedElement = relatedElement ? relatedElement.parentElement && relatedElement.parentElement.closest('ul') : null;\r\n if (!relatedElement) {\r\n relatedElement = nodeElement.closest('.nodes');\r\n if (!relatedElement) {\r\n relatedElement = nodeElement.closest('.vertical');\r\n relatedElement = relatedElement && relatedElement.parentElement ? relatedElement.parentElement.firstElementChild : null;\r\n }\r\n }\r\n } else {\r\n relatedElement = nodeElement.closest('.nodes');\r\n relatedElement = relatedElement ? relatedElement.previousElementSibling : null;\r\n }\r\n\r\n if (relatedElement) {\r\n if (relatedElement.classList.contains('hidden')\r\n || (relatedElement.closest('.nodes') && relatedElement.closest('.nodes').classList.contains('hidden'))\r\n || (relatedElement.closest('.vertical') && relatedElement.closest('.vertical').classList.contains('hidden'))) {\r\n return { 'exist': true, 'visible': false };\r\n }\r\n return { 'exist': true, 'visible': true };\r\n }\r\n } else if (relation === 'children') {\r\n relatedElement = isVerticalNode\r\n ? Array.from(nodeElement.parentElement ? nodeElement.parentElement.children : []).find(function (childEl) {\r\n return childEl.tagName === 'UL';\r\n }) || null\r\n : Array.from(nodeElement.parentElement ? nodeElement.parentElement.children : []).find(function (childEl) {\r\n return childEl !== nodeElement && childEl.classList && childEl.classList.contains('nodes');\r\n }) || null;\r\n\r\n if (relatedElement) {\r\n if (!relatedElement.classList.contains('hidden')) {\r\n return { 'exist': true, 'visible': true };\r\n }\r\n return { 'exist': true, 'visible': false };\r\n }\r\n } else if (relation === 'siblings') {\r\n if (isVerticalNode) {\r\n relatedElement = nodeElement.closest('ul');\r\n siblingElements = relatedElement ? Array.from(relatedElement.children || []).filter(function (childEl) {\r\n return childEl.tagName === 'LI';\r\n }) : [];\r\n } else {\r\n siblingElements = nodeElement.parentElement && nodeElement.parentElement.parentElement\r\n ? Array.from(nodeElement.parentElement.parentElement.children).filter(function (childEl) {\r\n return childEl !== nodeElement.parentElement;\r\n })\r\n : [];\r\n relatedElement = siblingElements[0] || null;\r\n }\r\n\r\n if (relatedElement && (!isVerticalNode || siblingElements.length > 1)) {\r\n if (!siblingElements.some(function (siblingEl) { return siblingEl.classList.contains('hidden'); })\r\n && !siblingElements.some(function (siblingEl) { return siblingEl.parentElement && siblingEl.parentElement.classList.contains('hidden'); })\r\n && (!isVerticalNode || !relatedElement.closest('.vertical') || !relatedElement.closest('.vertical').classList.contains('hidden'))) {\r\n return { 'exist': true, 'visible': true };\r\n }\r\n return { 'exist': true, 'visible': false };\r\n }\r\n } else {\r\n if (!((nodeElement.closest('.nodes') && nodeElement.closest('.nodes').classList.contains('hidden')) ||\r\n (nodeElement.closest('.hierarchy') && nodeElement.closest('.hierarchy').classList.contains('hidden')) ||\r\n (nodeElement.closest('.vertical') && ((nodeElement.closest('.nodes') && nodeElement.closest('.nodes').classList.contains('hidden')) || nodeElement.closest('.vertical').classList.contains('hidden')))\r\n )) {\r\n return { 'exist': true, 'visible': true };\r\n }\r\n return { 'exist': true, 'visible': false };\r\n }\r\n\r\n return { 'exist': false, 'visible': false };\r\n },\r\n getParent: function (nodeEl) {\r\n return this.getRelatedNodes(nodeEl, 'parent');\r\n },\r\n getChildren: function (nodeEl) {\r\n return this.getRelatedNodes(nodeEl, 'children');\r\n },\r\n getSiblings: function (nodeEl) {\r\n return this.getRelatedNodes(nodeEl, 'siblings');\r\n },\r\n // find the related nodes\r\n getRelatedNodes: function (nodeEl, relation) {\r\n const nodeElement = getElement(nodeEl);\r\n let nodesContainerEl;\r\n let childNodesContainerElement;\r\n let hierarchyEl;\r\n\r\n if (!nodeElement || !nodeElement.classList || !nodeElement.classList.contains('node')) {\r\n return relation === 'parent' ? null : [];\r\n }\r\n\r\n if (relation === 'parent') {\r\n nodesContainerEl = nodeElement.closest('.nodes');\r\n return nodesContainerEl ? nodesContainerEl.previousElementSibling : null;\r\n } else if (relation === 'children') {\r\n childNodesContainerElement = Array.from(nodeElement.parentElement ? nodeElement.parentElement.children : []).find(function (childEl) {\r\n return childEl !== nodeElement && childEl.classList && childEl.classList.contains('nodes');\r\n });\r\n\r\n if (!childNodesContainerElement) {\r\n return [];\r\n }\r\n\r\n return Array.from(childNodesContainerElement.children).filter(function (childEl) {\r\n return childEl.classList && childEl.classList.contains('hierarchy');\r\n }).map(function (childHierarchyEl) {\r\n return childHierarchyEl.querySelector('.node');\r\n }).filter(Boolean);\r\n } else if (relation === 'siblings') {\r\n hierarchyEl = nodeElement.closest('.hierarchy');\r\n if (!hierarchyEl || !hierarchyEl.parentElement) {\r\n return [];\r\n }\r\n\r\n return Array.from(hierarchyEl.parentElement.children).filter(function (siblingEl) {\r\n return siblingEl !== hierarchyEl;\r\n }).map(function (siblingHierarchyEl) {\r\n return siblingHierarchyEl.querySelector('.node');\r\n }).filter(Boolean);\r\n }\r\n\r\n return [];\r\n },\r\n hideParentEnd: function (event) {\r\n const nativeEvent = event.originalEvent || event;\r\n const animatedNodeElement = getElement(event.animatedNode || nativeEvent.animatedNode || nativeEvent.target);\r\n const parentElement = getElement(event.parent || nativeEvent.parent);\r\n\r\n if (animatedNodeElement && animatedNodeElement.classList) {\r\n animatedNodeElement.classList.remove('sliding');\r\n }\r\n if (parentElement && parentElement.classList) {\r\n parentElement.classList.add('hidden');\r\n }\r\n },\r\n // recursively hide the ancestor node and sibling nodes of the specified node\r\n hideParent: function (nodeEl) {\r\n const nodeElement = getElement(nodeEl);\r\n let parentEl;\r\n let chartElement;\r\n let hierarchyElement;\r\n\r\n if (!nodeElement) {\r\n return;\r\n }\r\n\r\n parentEl = this.getParent(nodeElement);\r\n chartElement = nodeElement.closest('.orgchart');\r\n hierarchyElement = nodeElement.closest('.hierarchy');\r\n if (parentEl && parentEl.querySelector && parentEl.querySelector('.spinner')) {\r\n if (chartElement) {\r\n setState(chartElement, 'inAjax', false);\r\n }\r\n }\r\n\r\n if (this.getNodeState(nodeElement, 'siblings').visible) {\r\n this.hideSiblings(nodeElement);\r\n }\r\n\r\n if (hierarchyElement) {\r\n hierarchyElement.classList.add('isAncestorsCollapsed');\r\n }\r\n if (this.getNodeState(parentEl).visible) {\r\n parentEl.classList.add('sliding', 'slide-down');\r\n parentEl.addEventListener('transitionend', function (event) {\r\n event.animatedNode = parentEl;\r\n event.parent = parentEl;\r\n OrgChart.prototype.hideParentEnd(event);\r\n }, { once: true });\r\n }\r\n\r\n if (this.getNodeState(parentEl, 'parent').visible) {\r\n this.hideParent(parentEl);\r\n }\r\n },\r\n showParentEnd: function (event) {\r\n const nativeEvent = event.originalEvent || event;\r\n const animatedNodeElement = getElement(event.animatedNode || nativeEvent.animatedNode || nativeEvent.target);\r\n const nodeElement = getElement(event.node || nativeEvent.node);\r\n let topEdgeElement;\r\n\r\n if (animatedNodeElement && animatedNodeElement.classList) {\r\n animatedNodeElement.classList.remove('sliding');\r\n }\r\n if (this.isInAction(nodeElement)) {\r\n topEdgeElement = nodeElement ? Array.from(nodeElement.children || []).find(function (childEl) {\r\n return childEl.classList && childEl.classList.contains('topEdge');\r\n }) || null : null;\r\n this.switchVerticalArrow(topEdgeElement);\r\n }\r\n },\r\n // show the parent node of the specified node\r\n showParent: function (nodeEl) {\r\n const orgChart = this;\r\n const nodeElement = getElement(nodeEl);\r\n let parentEl;\r\n let hierarchyElement;\r\n\r\n if (!nodeElement) {\r\n return;\r\n }\r\n\r\n parentEl = this.getParent(nodeElement);\r\n hierarchyElement = nodeElement.closest('.hierarchy');\r\n if (parentEl && parentEl.classList) {\r\n parentEl.classList.remove('hidden');\r\n }\r\n if (hierarchyElement) {\r\n hierarchyElement.classList.remove('isAncestorsCollapsed');\r\n }\r\n this.repaint(parentEl);\r\n if (parentEl && parentEl.classList) {\r\n parentEl.classList.add('sliding');\r\n parentEl.classList.remove('slide-down');\r\n parentEl.addEventListener('transitionend', function (event) {\r\n event.animatedNode = parentEl;\r\n event.node = nodeElement;\r\n orgChart.showParentEnd(event);\r\n }, { once: true });\r\n }\r\n },\r\n stopAjax: function (nodeLevelEl) {\r\n const nodeLevelElement = getElement(nodeLevelEl);\r\n let chartElement;\r\n\r\n if (!nodeLevelElement || !nodeLevelElement.querySelector('.spinner')) {\r\n return;\r\n }\r\n\r\n chartElement = nodeLevelElement.closest('.orgchart');\r\n if (chartElement) {\r\n setState(chartElement, 'inAjax', false);\r\n }\r\n },\r\n isVisibleNode: function (index, elem) {\r\n return this.getNodeState(elem).visible;\r\n },\r\n isCompactDescendant: function (index, elem) {\r\n return !!(elem && elem.parentElement && elem.parentElement.matches('.node.compact'));\r\n },\r\n // do some necessary cleanup tasks when hide animation is finished\r\n hideChildrenEnd: function (event) {\r\n const nativeEvent = event.originalEvent || event;\r\n const nodeElement = getElement(event.node || nativeEvent.node);\r\n const animatedNodeElements = event.animatedNodes || nativeEvent.animatedNodes;\r\n let bottomEdgeElement;\r\n\r\n getElements(animatedNodeElements).forEach(function (animatedNodeEl) {\r\n let lowerNodesElement;\r\n\r\n if (animatedNodeEl.classList) {\r\n animatedNodeEl.classList.remove('sliding');\r\n }\r\n lowerNodesElement = animatedNodeEl && typeof animatedNodeEl.closest === 'function'\r\n ? animatedNodeEl.closest('.nodes')\r\n : null;\r\n if (lowerNodesElement && lowerNodesElement.classList) {\r\n lowerNodesElement.classList.add('hidden');\r\n }\r\n });\r\n if (this.isInAction(nodeElement)) {\r\n bottomEdgeElement = nodeElement ? Array.from(nodeElement.children || []).find(function (childEl) {\r\n return childEl.classList && childEl.classList.contains('bottomEdge');\r\n }) || null : null;\r\n this.switchVerticalArrow(bottomEdgeElement);\r\n }\r\n },\r\n // recursively hide the descendant nodes of the specified node\r\n hideChildren: function (nodeEl) {\r\n const orgChart = this;\r\n const nodeElement = getElement(nodeEl);\r\n let hierarchyElement;\r\n let lowerLevelElement;\r\n let animatedNodeElements;\r\n let isVerticalDesc;\r\n\r\n if (!nodeElement) {\r\n return;\r\n }\r\n\r\n hierarchyElement = nodeElement.closest('.hierarchy');\r\n lowerLevelElement = Array.from(nodeElement.parentElement ? nodeElement.parentElement.children : []).find(function (childEl) {\r\n return childEl !== nodeElement && childEl.classList && childEl.classList.contains('nodes');\r\n }) || null;\r\n\r\n if (!lowerLevelElement) {\r\n return;\r\n }\r\n\r\n if (hierarchyElement) {\r\n hierarchyElement.classList.add('isChildrenCollapsed');\r\n }\r\n this.stopAjax(lowerLevelElement);\r\n animatedNodeElements = Array.from(lowerLevelElement.querySelectorAll('.node')).filter(function (visibleNodeEl, index) {\r\n return this.isVisibleNode(index, visibleNodeEl) && !this.isCompactDescendant(index, visibleNodeEl);\r\n }, this);\r\n isVerticalDesc = lowerLevelElement.classList.contains('vertical');\r\n if (!isVerticalDesc) {\r\n animatedNodeElements.forEach(function (animatedNodeEl) {\r\n const animatedHierarchyElement = animatedNodeEl.closest('.hierarchy');\r\n\r\n if (animatedHierarchyElement) {\r\n animatedHierarchyElement.classList.add('isCollapsedDescendant');\r\n }\r\n });\r\n }\r\n if (lowerLevelElement.classList.contains('vertical') || lowerLevelElement.querySelector('.vertical')) {\r\n animatedNodeElements.forEach(function (animatedNodeEl) {\r\n Array.from(animatedNodeEl.querySelectorAll('.' + this.options.icons.expanded)).forEach(function (expandedIconEl) {\r\n expandedIconEl.classList.remove(this.options.icons.expanded);\r\n expandedIconEl.classList.add(this.options.icons.collapsed);\r\n }, this);\r\n }, this);\r\n }\r\n this.repaint(animatedNodeElements[0]);\r\n animatedNodeElements.forEach(function (animatedNodeEl) {\r\n animatedNodeEl.classList.add('sliding', 'slide-up');\r\n });\r\n if (animatedNodeElements[0]) {\r\n animatedNodeElements[0].addEventListener('transitionend', function (event) {\r\n event.node = nodeElement;\r\n event.animatedNodes = animatedNodeElements;\r\n orgChart.hideChildrenEnd(event);\r\n }, { once: true });\r\n }\r\n },\r\n //\r\n showChildrenEnd: function (event) {\r\n const nativeEvent = event.originalEvent || event;\r\n const nodeElement = getElement(event.node || nativeEvent.node);\r\n const animatedNodeElements = event.animatedNodes || nativeEvent.animatedNodes;\r\n let bottomEdgeElement;\r\n\r\n getElements(animatedNodeElements).forEach(function (animatedNodeEl) {\r\n if (animatedNodeEl.classList) {\r\n animatedNodeEl.classList.remove('sliding');\r\n }\r\n });\r\n if (this.isInAction(nodeElement)) {\r\n bottomEdgeElement = nodeElement ? Array.from(nodeElement.children || []).find(function (childEl) {\r\n return childEl.classList && childEl.classList.contains('bottomEdge');\r\n }) || null : null;\r\n this.switchVerticalArrow(bottomEdgeElement);\r\n }\r\n },\r\n // show the children nodes of the specified node\r\n showChildren: function (nodeEl) {\r\n const orgChart = this;\r\n const nodeElement = getElement(nodeEl);\r\n let hierarchyElement;\r\n let levelsElement;\r\n let isVerticalDesc;\r\n let animatedNodeElements;\r\n\r\n if (!nodeElement) {\r\n return;\r\n }\r\n\r\n hierarchyElement = nodeElement.closest('.hierarchy');\r\n levelsElement = Array.from(nodeElement.parentElement ? nodeElement.parentElement.children : []).find(function (childEl) {\r\n return childEl !== nodeElement && childEl.classList && childEl.classList.contains('nodes');\r\n }) || null;\r\n\r\n if (!levelsElement) {\r\n return;\r\n }\r\n\r\n if (hierarchyElement) {\r\n hierarchyElement.classList.remove('isChildrenCollapsed');\r\n }\r\n levelsElement.classList.remove('hidden');\r\n isVerticalDesc = levelsElement.classList.contains('vertical');\r\n animatedNodeElements = isVerticalDesc\r\n ? Array.from(levelsElement.querySelectorAll('.node')).filter(function (visibleNodeEl, index) {\r\n return this.isVisibleNode(index, visibleNodeEl);\r\n }, this)\r\n : Array.from(levelsElement.children).filter(function (childEl) {\r\n return childEl.classList && childEl.classList.contains('hierarchy');\r\n }).map(function (childHierarchyEl) {\r\n return childHierarchyEl.querySelector('.node');\r\n }).filter(function (visibleNodeEl, index) {\r\n return this.isVisibleNode(index, visibleNodeEl);\r\n }, this);\r\n if (!isVerticalDesc) {\r\n animatedNodeElements.forEach(function (animatedNodeEl) {\r\n const animatedHierarchyElement = animatedNodeEl.closest('.hierarchy');\r\n\r\n if (animatedHierarchyElement && !animatedNodeEl.matches(':only-child')) {\r\n animatedHierarchyElement.classList.add('isChildrenCollapsed');\r\n }\r\n if (animatedHierarchyElement) {\r\n animatedHierarchyElement.classList.remove('isCollapsedDescendant');\r\n }\r\n });\r\n }\r\n this.repaint(animatedNodeElements[0]);\r\n animatedNodeElements.forEach(function (animatedNodeEl) {\r\n animatedNodeEl.classList.add('sliding');\r\n animatedNodeEl.classList.remove('slide-up');\r\n });\r\n if (animatedNodeElements[0]) {\r\n animatedNodeElements[0].addEventListener('transitionend', function (event) {\r\n event.node = nodeElement;\r\n event.animatedNodes = animatedNodeElements;\r\n orgChart.showChildrenEnd(event);\r\n }, { once: true });\r\n }\r\n },\r\n //\r\n hideSiblingsEnd: function (event) {\r\n const orgChart = this;\r\n const nativeEvent = event.originalEvent || event;\r\n const nodeElement = getElement(event.node || nativeEvent.node);\r\n const nodeContainerElement = getElement(event.nodeContainer || nativeEvent.nodeContainer);\r\n let direction = typeof event.direction !== 'undefined' ? event.direction : nativeEvent.direction;\r\n const animatedNodeElements = event.animatedNodes || nativeEvent.animatedNodes;\r\n\r\n if (typeof direction === 'undefined') {\r\n direction = nativeEvent.direction;\r\n }\r\n let siblingElements = [];\r\n let currentSiblingElement;\r\n\r\n if (nodeContainerElement) {\r\n if (direction === 'left') {\r\n currentSiblingElement = nodeContainerElement.previousElementSibling;\r\n while (currentSiblingElement) {\r\n if (!currentSiblingElement.classList.contains('hidden')) {\r\n siblingElements.push(currentSiblingElement);\r\n }\r\n currentSiblingElement = currentSiblingElement.previousElementSibling;\r\n }\r\n } else if (direction === 'right') {\r\n currentSiblingElement = nodeContainerElement.nextElementSibling;\r\n while (currentSiblingElement) {\r\n if (!currentSiblingElement.classList.contains('hidden')) {\r\n siblingElements.push(currentSiblingElement);\r\n }\r\n currentSiblingElement = currentSiblingElement.nextElementSibling;\r\n }\r\n } else if (nodeContainerElement.parentElement) {\r\n siblingElements = Array.from(nodeContainerElement.parentElement.children).filter(function (childEl) {\r\n return childEl !== nodeContainerElement;\r\n });\r\n }\r\n }\r\n\r\n getElements(animatedNodeElements).forEach(function (animatedNodeEl) {\r\n if (animatedNodeEl.classList) {\r\n animatedNodeEl.classList.remove('sliding');\r\n }\r\n });\r\n siblingElements.forEach(function (siblingElement) {\r\n Array.from(siblingElement.querySelectorAll('.node')).filter(function (siblingNodeEl) {\r\n return orgChart.isVisibleNode(null, siblingNodeEl);\r\n }).slice(1)\r\n .forEach(function (siblingNodeEl) {\r\n siblingNodeEl.classList.remove('slide-left', 'slide-right');\r\n if (!orgChart.options.compact) {\r\n siblingNodeEl.classList.add('slide-up');\r\n }\r\n });\r\n Array.from(siblingElement.querySelectorAll('.nodes, .vertical')).forEach(function (descendantEl) {\r\n descendantEl.classList.add('hidden');\r\n });\r\n siblingElement.classList.add('hidden');\r\n });\r\n\r\n if (this.isInAction(nodeElement)) {\r\n this.switchHorizontalArrow(nodeElement);\r\n }\r\n },\r\n // hide the sibling nodes of the specified node\r\n hideSiblings: function (nodeEl, direction) {\r\n const orgChart = this;\r\n const nodeElement = getElement(nodeEl);\r\n let chartElement;\r\n let nodeContainerElement;\r\n let siblingContainerElements = [];\r\n let animatedNodeElements = [];\r\n\r\n if (!nodeElement) {\r\n return;\r\n }\r\n\r\n chartElement = nodeElement.closest('.orgchart');\r\n nodeContainerElement = nodeElement.closest('.hierarchy');\r\n if (!nodeContainerElement) {\r\n return;\r\n }\r\n\r\n nodeContainerElement.classList.add('isSiblingsCollapsed');\r\n siblingContainerElements = nodeContainerElement.parentElement\r\n ? Array.from(nodeContainerElement.parentElement.children).filter(function (childEl) {\r\n return childEl !== nodeContainerElement;\r\n })\r\n : [];\r\n\r\n if (siblingContainerElements.some(function (siblingContainerEl) {\r\n return siblingContainerEl.querySelector('.spinner');\r\n })) {\r\n if (chartElement) {\r\n setState(chartElement, 'inAjax', false);\r\n }\r\n }\r\n\r\n if (direction) {\r\n if (direction === 'left') {\r\n let currentPreviousSiblingElement = nodeContainerElement.previousElementSibling;\r\n\r\n nodeContainerElement.classList.add('left-sibs');\r\n siblingContainerElements.forEach(function (siblingContainerEl) {\r\n if (siblingContainerEl.classList.contains('isSiblingsCollapsed')) {\r\n siblingContainerEl.classList.remove('isSiblingsCollapsed', 'left-sibs');\r\n }\r\n });\r\n\r\n while (currentPreviousSiblingElement) {\r\n currentPreviousSiblingElement.classList.add('isCollapsedSibling', 'isChildrenCollapsed');\r\n animatedNodeElements = animatedNodeElements.concat(\r\n Array.from(currentPreviousSiblingElement.querySelectorAll('.node')).filter(function (visibleNodeEl, index) {\r\n return this.isVisibleNode(index, visibleNodeEl);\r\n }, this)\r\n );\r\n currentPreviousSiblingElement = currentPreviousSiblingElement.previousElementSibling;\r\n }\r\n animatedNodeElements.forEach(function (animatedNodeEl) {\r\n animatedNodeEl.classList.add('sliding', 'slide-right');\r\n });\r\n } else {\r\n let currentNextSiblingElement = nodeContainerElement.nextElementSibling;\r\n\r\n nodeContainerElement.classList.add('right-sibs');\r\n siblingContainerElements.forEach(function (siblingContainerEl) {\r\n if (siblingContainerEl.classList.contains('isSiblingsCollapsed')) {\r\n siblingContainerEl.classList.remove('isSiblingsCollapsed', 'right-sibs');\r\n }\r\n });\r\n\r\n while (currentNextSiblingElement) {\r\n currentNextSiblingElement.classList.add('isCollapsedSibling', 'isChildrenCollapsed');\r\n animatedNodeElements = animatedNodeElements.concat(\r\n Array.from(currentNextSiblingElement.querySelectorAll('.node')).filter(function (visibleNodeEl, index) {\r\n return this.isVisibleNode(index, visibleNodeEl);\r\n }, this)\r\n );\r\n currentNextSiblingElement = currentNextSiblingElement.nextElementSibling;\r\n }\r\n animatedNodeElements.forEach(function (animatedNodeEl) {\r\n animatedNodeEl.classList.add('sliding', 'slide-left');\r\n });\r\n }\r\n } else {\r\n siblingContainerElements.forEach(function (siblingContainerEl) {\r\n const siblingAnimatedNodeElements = Array.from(siblingContainerEl.querySelectorAll('.node')).filter(function (visibleNodeEl, index) {\r\n return this.isVisibleNode(index, visibleNodeEl);\r\n }, this);\r\n\r\n siblingContainerEl.classList.add('isCollapsedSibling', 'isChildrenCollapsed');\r\n animatedNodeElements = animatedNodeElements.concat(siblingAnimatedNodeElements);\r\n siblingAnimatedNodeElements.forEach(function (animatedNodeEl) {\r\n animatedNodeEl.classList.add('sliding');\r\n if (siblingContainerEl.compareDocumentPosition(nodeContainerElement) & Node.DOCUMENT_POSITION_FOLLOWING) {\r\n animatedNodeEl.classList.add('slide-right');\r\n } else {\r\n animatedNodeEl.classList.add('slide-left');\r\n }\r\n });\r\n }, this);\r\n }\r\n\r\n if (animatedNodeElements[0]) {\r\n animatedNodeElements[0].addEventListener('transitionend', function (event) {\r\n event.node = nodeElement;\r\n event.nodeContainer = nodeContainerElement;\r\n event.direction = direction;\r\n event.animatedNodes = animatedNodeElements;\r\n orgChart.hideSiblingsEnd(event);\r\n }, { once: true });\r\n }\r\n },\r\n //\r\n showSiblingsEnd: function (event) {\r\n const nativeEvent = event.originalEvent || event;\r\n const nodeElement = getElement(event.node || nativeEvent.node);\r\n const visibleNodeElements = event.visibleNodes || nativeEvent.visibleNodes;\r\n let topEdgeElement;\r\n\r\n getElements(visibleNodeElements).forEach(function (visibleNodeEl) {\r\n if (visibleNodeEl.classList) {\r\n visibleNodeEl.classList.remove('sliding');\r\n }\r\n });\r\n if (this.isInAction(nodeElement)) {\r\n this.switchHorizontalArrow(nodeElement);\r\n topEdgeElement = nodeElement ? Array.from(nodeElement.children || []).find(function (childEl) {\r\n return childEl.classList && childEl.classList.contains('topEdge');\r\n }) || null : null;\r\n if (topEdgeElement && topEdgeElement.classList) {\r\n topEdgeElement.classList.remove(this.options.icons.expandToUp);\r\n topEdgeElement.classList.add(this.options.icons.collapseToDown);\r\n }\r\n }\r\n },\r\n //\r\n showRelatedParentEnd: function(event) {\r\n const nativeEvent = event.originalEvent || event;\r\n const animatedNodeElement = getElement(event.animatedNode || nativeEvent.animatedNode || nativeEvent.target);\r\n\r\n if (animatedNodeElement && animatedNodeElement.classList) {\r\n animatedNodeElement.classList.remove('sliding');\r\n }\r\n },\r\n // show the sibling nodes of the specified node\r\n showSiblings: function (nodeEl, direction) {\r\n const orgChart = this;\r\n const nodeElement = getElement(nodeEl);\r\n let nodeContainerElement;\r\n let siblingElements = [];\r\n let parentNodesContainerElement;\r\n let upperLevelElement;\r\n let visibleNodeElements;\r\n\r\n if (!nodeElement) {\r\n return;\r\n }\r\n\r\n // firstly, show the sibling nodes\r\n nodeContainerElement = nodeElement.closest('.hierarchy');\r\n if (!nodeContainerElement) {\r\n return;\r\n }\r\n\r\n if (direction) {\r\n if (direction === 'left') {\r\n let currentPreviousSiblingElement = nodeContainerElement.previousElementSibling;\r\n while (currentPreviousSiblingElement) {\r\n currentPreviousSiblingElement.classList.remove('hidden');\r\n siblingElements.push(currentPreviousSiblingElement);\r\n currentPreviousSiblingElement = currentPreviousSiblingElement.previousElementSibling;\r\n }\r\n } else {\r\n let currentNextSiblingElement = nodeContainerElement.nextElementSibling;\r\n while (currentNextSiblingElement) {\r\n currentNextSiblingElement.classList.remove('hidden');\r\n siblingElements.push(currentNextSiblingElement);\r\n currentNextSiblingElement = currentNextSiblingElement.nextElementSibling;\r\n }\r\n }\r\n } else {\r\n siblingElements = nodeContainerElement.parentElement\r\n ? Array.from(nodeContainerElement.parentElement.children).filter(function (childEl) {\r\n return childEl !== nodeContainerElement;\r\n })\r\n : [];\r\n siblingElements.forEach(function (siblingEl) {\r\n siblingEl.classList.remove('hidden');\r\n });\r\n }\r\n // secondly, show the lines\r\n parentNodesContainerElement = nodeElement.closest('.nodes');\r\n upperLevelElement = parentNodesContainerElement ? parentNodesContainerElement.previousElementSibling : null;\r\n if (direction) {\r\n nodeContainerElement.classList.remove(direction + '-sibs');\r\n if (!Array.from(nodeContainerElement.classList).some(function (className) { return className.indexOf('-sibs') > -1; })) {\r\n nodeContainerElement.classList.remove('isSiblingsCollapsed');\r\n }\r\n siblingElements.forEach(function (siblingEl) {\r\n siblingEl.classList.remove('isCollapsedSibling', direction + '-sibs');\r\n });\r\n } else {\r\n nodeContainerElement.classList.remove('isSiblingsCollapsed');\r\n siblingElements.forEach(function (siblingEl) {\r\n siblingEl.classList.remove('isCollapsedSibling');\r\n });\r\n }\r\n // thirdly, show parent node if it is collapsed\r\n if (!this.getNodeState(nodeElement, 'parent').visible) {\r\n nodeContainerElement.classList.remove('isAncestorsCollapsed');\r\n if (upperLevelElement) {\r\n upperLevelElement.classList.remove('hidden');\r\n this.repaint(upperLevelElement);\r\n upperLevelElement.classList.add('sliding');\r\n upperLevelElement.classList.remove('slide-down');\r\n upperLevelElement.addEventListener('transitionend', function (event) {\r\n event.animatedNode = upperLevelElement;\r\n orgChart.showRelatedParentEnd(event);\r\n }, { once: true });\r\n }\r\n }\r\n // lastly, show the sibling nodes with animation\r\n visibleNodeElements = siblingElements.flatMap(function (siblingEl) {\r\n return Array.from(siblingEl.querySelectorAll('.node'));\r\n }, this).filter(function (visibleNodeEl, index) {\r\n return this.isVisibleNode(index, visibleNodeEl);\r\n }, this);\r\n this.repaint(visibleNodeElements[0]);\r\n visibleNodeElements.forEach(function (visibleNodeEl) {\r\n visibleNodeEl.classList.add('sliding');\r\n visibleNodeEl.classList.remove('slide-left', 'slide-right');\r\n });\r\n if (visibleNodeElements[0]) {\r\n visibleNodeElements[0].addEventListener('transitionend', function (event) {\r\n event.node = nodeElement;\r\n event.visibleNodes = visibleNodeElements;\r\n orgChart.showSiblingsEnd(event);\r\n }, { once: true });\r\n }\r\n },\r\n // start up loading status for requesting new nodes\r\n startLoading: function (edgeEl) {\r\n const edgeElement = getElement(edgeEl);\r\n const chartElement = this.chart;\r\n let nodeElement;\r\n let spinnerElement;\r\n\r\n if (!edgeElement || !chartElement) {\r\n return false;\r\n }\r\n\r\n if (typeof getState(chartElement, 'inAjax') !== 'undefined' && getState(chartElement, 'inAjax') === true) {\r\n return false;\r\n }\r\n\r\n edgeElement.classList.add('hidden');\r\n nodeElement = edgeElement.parentElement;\r\n if (nodeElement) {\r\n nodeElement.insertAdjacentHTML('beforeend', `<i class=\"${this.options.icons.theme} ${this.options.icons.spinner} spinner\"></i>`);\r\n spinnerElement = Array.from(nodeElement.children || []).find(function (childEl) {\r\n return childEl.classList && childEl.classList.contains('spinner');\r\n }) || null;\r\n Array.from(nodeElement.children || []).forEach(function (childEl) {\r\n if (childEl !== spinnerElement) {\r\n childEl.style.opacity = 0.2;\r\n }\r\n });\r\n }\r\n setState(chartElement, 'inAjax', true);\r\n Array.from(getDocument().querySelectorAll('.oc-export-btn')).forEach(function (exportButtonEl) {\r\n exportButtonEl.disabled = true;\r\n });\r\n return true;\r\n },\r\n // terminate loading status for requesting new nodes\r\n endLoading: function (edgeEl) {\r\n const edgeElement = getElement(edgeEl);\r\n let nodeElement;\r\n const chartElement = this.chart;\r\n\r\n if (!edgeElement || !chartElement) {\r\n return;\r\n }\r\n\r\n nodeElement = edgeElement.parentElement;\r\n edgeElement.classList.remove('hidden');\r\n if (nodeElement) {\r\n Array.from(nodeElement.querySelectorAll('.spinner')).forEach(function (spinnerEl) {\r\n spinnerEl.remove();\r\n });\r\n Array.from(nodeElement.children || []).forEach(function (childEl) {\r\n childEl.removeAttribute('style');\r\n });\r\n }\r\n setState(chartElement, 'inAjax', false);\r\n Array.from(getDocument().querySelectorAll('.oc-export-btn')).forEach(function (exportButtonEl) {\r\n exportButtonEl.disabled = false;\r\n });\r\n },\r\n // whether the cursor is hovering over the node\r\n isInAction: function (nodeEl) {\r\n const nodeElement = getElement(nodeEl);\r\n const edgeClassName = Array.from(nodeElement ? nodeElement.children : []).filter(function (childEl) {\r\n return childEl.classList && childEl.classList.contains('edge');\r\n }).map(function (edgeEl) {\r\n return edgeEl.className;\r\n }).join(' ');\r\n\r\n // TODO: 展开/折叠的按钮不止4个箭头,还有toggleBtn\r\n return [\r\n this.options.icons.expandToUp,\r\n this.options.icons.collapseToDown,\r\n this.options.icons.collapseToLeft,\r\n this.options.icons.expandToRight\r\n ].some(function (icon) {\r\n return edgeClassName.indexOf(icon) > -1;\r\n });\r\n },\r\n //\r\n switchVerticalArrow: function (arrowEl) {\r\n const arrowElement = getElement(arrowEl);\r\n\r\n if (!arrowElement || !arrowElement.classList) {\r\n return;\r\n }\r\n\r\n arrowElement.classList.toggle(this.options.icons.expandToUp);\r\n arrowElement.classList.toggle(this.options.icons.collapseToDown);\r\n },\r\n //\r\n switchHorizontalArrow: function (nodeEl) {\r\n const nodeElement = getElement(nodeEl);\r\n const opts = this.options;\r\n let hierarchyElement;\r\n let siblingsContainerElement;\r\n let leftEdgeElement;\r\n let rightEdgeElement;\r\n let previousSiblingElement;\r\n let nextSiblingElement;\r\n let siblingElements;\r\n let sibsVisible;\r\n\r\n if (!nodeElement) {\r\n return;\r\n }\r\n\r\n hierarchyElement = nodeElement.closest('.hierarchy');\r\n siblingsContainerElement = nodeElement.closest('.nodes');\r\n leftEdgeElement = Array.from(nodeElement.children || []).find(function (childEl) {\r\n return childEl.classList && childEl.classList.contains('leftEdge');\r\n }) || null;\r\n rightEdgeElement = Array.from(nodeElement.children || []).find(function (childEl) {\r\n return childEl.classList && childEl.classList.contains('rightEdge');\r\n }) || null;\r\n\r\n if (opts.toggleSiblingsResp && (typeof opts.ajaxURL === 'undefined' || getState(siblingsContainerElement, 'siblingsLoaded'))) {\r\n previousSiblingElement = hierarchyElement ? hierarchyElement.previousElementSibling : null;\r\n if (previousSiblingElement && leftEdgeElement) {\r\n leftEdgeElement.classList.toggle(opts.icons.collapseToLeft, previousSiblingElement.classList.contains('hidden'));\r\n leftEdgeElement.classList.toggle(opts.icons.expandToRight, !previousSiblingElement.classList.contains('hidden'));\r\n }\r\n nextSiblingElement = hierarchyElement ? hierarchyElement.nextElementSibling : null;\r\n if (nextSiblingElement && rightEdgeElement) {\r\n rightEdgeElement.classList.toggle(opts.icons.expandToRight, nextSiblingElement.classList.contains('hidden'));\r\n rightEdgeElement.classList.toggle(opts.icons.collapseToLeft, !nextSiblingElement.classList.contains('hidden'));\r\n }\r\n } else {\r\n siblingElements = hierarchyElement && hierarchyElement.parentElement\r\n ? Array.from(hierarchyElement.parentElement.children).filter(function (childEl) {\r\n return childEl !== hierarchyElement;\r\n })\r\n : [];\r\n sibsVisible = siblingElements.length ? !siblingElements[0].classList.contains('hidden') : false;\r\n if (leftEdgeElement) {\r\n leftEdgeElement.classList.toggle(opts.icons.expandToRight, sibsVisible);\r\n leftEdgeElement.classList.toggle(opts.icons.collapseToLeft, !sibsVisible);\r\n }\r\n if (rightEdgeElement) {\r\n rightEdgeElement.classList.toggle(opts.icons.collapseToLeft, sibsVisible);\r\n rightEdgeElement.classList.toggle(opts.icons.expandToRight, !sibsVisible);\r\n }\r\n }\r\n },\r\n //\r\n repaint: function (node) {\r\n if (node) {\r\n node.style.offsetWidth = node.offsetWidth;\r\n }\r\n },\r\n // determines how to show arrow buttons \r\n nodeEnterLeaveHandler: function (event) {\r\n const nativeEvent = event.originalEvent || event;\r\n const eventType = nativeEvent.type;\r\n const nodeElement = event.node || nativeEvent.currentTarget;\r\n const childElements = Array.from(nodeElement ? nodeElement.children : []);\r\n const isVerticalNode = !!(nodeElement && nodeElement.closest('.nodes.vertical'));\r\n const toggleBtnElement = childElements.find(function (childEl) {\r\n return childEl.classList && childEl.classList.contains('toggleBtn');\r\n }) || null;\r\n const topEdgeElement = childElements.find(function (childEl) {\r\n return childEl.classList && childEl.classList.contains('topEdge');\r\n }) || null;\r\n const rightEdgeElement = childElements.find(function (childEl) {\r\n return childEl.classList && childEl.classList.contains('rightEdge');\r\n }) || null;\r\n const bottomEdgeElement = childElements.find(function (childEl) {\r\n return childEl.classList && childEl.classList.contains('bottomEdge');\r\n }) || null;\r\n const leftEdgeElement = childElements.find(function (childEl) {\r\n return childEl.classList && childEl.classList.contains('leftEdge');\r\n }) || null;\r\n let isExpanded = false;\r\n if (isVerticalNode) {\r\n if (eventType === 'mouseenter') {\r\n if (toggleBtnElement) {\r\n isExpanded = this.getNodeState(nodeElement, 'children').visible;\r\n toggleBtnElement.classList.toggle(this.options.icons.collapsed, !isExpanded);\r\n toggleBtnElement.classList.toggle(this.options.icons.expanded, isExpanded);\r\n }\r\n } else if (toggleBtnElement) {\r\n toggleBtnElement.classList.remove(this.options.icons.collapsed, this.options.icons.expanded);\r\n }\r\n } else {\r\n if (eventType === 'mouseenter') {\r\n if (topEdgeElement) {\r\n isExpanded = this.getNodeState(nodeElement, 'parent').visible;\r\n topEdgeElement.classList.toggle(this.options.icons.expandToUp, !isExpanded);\r\n topEdgeElement.classList.toggle(this.options.icons.collapseToDown, isExpanded);\r\n }\r\n if (bottomEdgeElement) {\r\n isExpanded = this.getNodeState(nodeElement, 'children').visible;\r\n bottomEdgeElement.classList.toggle(this.options.icons.collapseToDown, !isExpanded);\r\n bottomEdgeElement.classList.toggle(this.options.icons.expandToUp, isExpanded);\r\n }\r\n if (leftEdgeElement || rightEdgeElement) {\r\n this.switchHorizontalArrow(nodeElement);\r\n }\r\n } else {\r\n childElements.forEach(function (childEl) {\r\n if (childEl.classList && childEl.classList.contains('edge')) {\r\n childEl.classList.remove(\r\n this.options.icons.expandToUp,\r\n this.options.icons.collapseToDown,\r\n this.options.icons.collapseToLeft,\r\n this.options.icons.expandToRight\r\n );\r\n }\r\n }, this);\r\n }\r\n }\r\n },\r\n //\r\n nodeClickHandler: function (event) {\r\n const chartElement = this.chart;\r\n const nativeEvent = event.originalEvent || event;\r\n const nodeElement = event.node || nativeEvent.currentTarget;\r\n\r\n if (!chartElement || !nodeElement || !nodeElement.classList) {\r\n return;\r\n }\r\n\r\n Array.from(chartElement.querySelectorAll('.focused')).forEach(function (focusedEl) {\r\n focusedEl.classList.remove('focused');\r\n });\r\n nodeElement.classList.add('focused');\r\n },\r\n addAncestors: function (data, parentId) {\r\n const rootHierarchyElement = this.chart ? this.chart.querySelector(':scope > .nodes > .hierarchy') : null;\r\n let originalRootChildren;\r\n let ancestorWrapperElement;\r\n let targetParentNodeElement;\r\n let targetSiblingsContainerElement;\r\n\r\n if (!rootHierarchyElement) {\r\n return;\r\n }\r\n\r\n this.buildHierarchy(rootHierarchyElement, data);\r\n originalRootChildren = Array.from(rootHierarchyElement.children).slice(0, 2);\r\n ancestorWrapperElement = getDocument().createElement('li');\r\n ancestorWrapperElement.className = 'hierarchy';\r\n rootHierarchyElement.insertBefore(ancestorWrapperElement, originalRootChildren[0] || null);\r\n originalRootChildren.forEach(function (childEl) {\r\n ancestorWrapperElement.appendChild(childEl);\r\n });\r\n targetParentNodeElement = getDocument().getElementById(parentId);\r\n targetSiblingsContainerElement = targetParentNodeElement\r\n ? Array.from(targetParentNodeElement.parentElement ? targetParentNodeElement.parentElement.children : []).find(function (childEl) {\r\n return childEl !== targetParentNodeElement && childEl.classList && childEl.classList.contains('nodes');\r\n }) || null\r\n : null;\r\n if (targetSiblingsContainerElement && targetSiblingsContainerElement !== ancestorWrapperElement.parentElement) {\r\n targetSiblingsContainerElement.appendChild(ancestorWrapperElement);\r\n }\r\n },\r\n addDescendants:function (data, parentEl) {\r\n const orgChart = this;\r\n const parentElement = getElement(parentEl);\r\n let descendantsElement;\r\n\r\n if (!parentElement || !parentElement.parentElement) {\r\n return;\r\n }\r\n\r\n descendantsElement = getDocument().createElement('ul');\r\n descendantsElement.className = 'nodes';\r\n parentElement.after(descendantsElement);\r\n forEachValue(data, function () {\r\n const descendantHierarchyElement = getDocument().createElement('li');\r\n\r\n descendantHierarchyElement.className = 'hierarchy';\r\n descendantsElement.appendChild(descendantHierarchyElement);\r\n orgChart.buildHierarchy(descendantHierarchyElement, this);\r\n });\r\n },\r\n //\r\n HideFirstParentEnd: function (event) {\r\n const nativeEvent = event.originalEvent || event;\r\n const topEdgeElement = getElement(event.topEdge || nativeEvent.topEdge);\r\n const nodeElement = topEdgeElement ? topEdgeElement.parentElement : null;\r\n\r\n if (this.isInAction(nodeElement)) {\r\n this.switchVerticalArrow(topEdgeElement);\r\n this.switchHorizontalArrow(nodeElement);\r\n }\r\n },\r\n // actions on clinking top edge of a node\r\n topEdgeClickHandler: function (event) {\r\n const orgChart = this;\r\n const nativeEvent = event.originalEvent || event;\r\n const nodeElement = event.node || nativeEvent.currentTarget;\r\n const topEdgeElement = getElement(event.edge || nativeEvent.target);\r\n const parentEl = this.getParent(nodeElement);\r\n const parentState = this.getNodeState(nodeElement, 'parent');\r\n let parentSliding;\r\n let parentHiding;\r\n if (parentState.exist) {\r\n parentSliding = !!(parentEl && parentEl.classList && parentEl.classList.contains('sliding'));\r\n parentHiding = !!(parentEl && parentEl.classList && parentEl.classList.contains('slide-down'));\r\n if (parentSliding && !parentHiding) { return; }\r\n // hide the ancestor nodes and sibling nodes of the specified node\r\n if (parentState.visible && !parentHiding) {\r\n this.hideParent(nodeElement);\r\n if (parentEl) {\r\n parentEl.addEventListener('transitionend', function (transitionEvent) {\r\n transitionEvent.topEdge = topEdgeElement;\r\n orgChart.HideFirstParentEnd(transitionEvent);\r\n }, { once: true });\r\n }\r\n this.triggerHideEvent(nodeElement, 'parent');\r\n } else { // show the ancestors and siblings\r\n this.showParent(nodeElement);\r\n this.triggerShowEvent(nodeElement, 'parent');\r\n }\r\n }\r\n },\r\n // actions on clinking bottom edge of a node\r\n bottomEdgeClickHandler: function (event) {\r\n const nativeEvent = event.originalEvent || event;\r\n const nodeElement = event.node || nativeEvent.currentTarget;\r\n const childrenState = this.getNodeState(nodeElement, 'children');\r\n let childNodesContainerElement;\r\n let childNodeElements;\r\n if (childrenState.exist) {\r\n childNodesContainerElement = Array.from(nodeElement.parentElement ? nodeElement.parentElement.children : []).find(function (childEl) {\r\n return childEl !== nodeElement && childEl.classList && childEl.classList.contains('nodes');\r\n }) || null;\r\n childNodeElements = childNodesContainerElement\r\n ? Array.from(childNodesContainerElement.children).filter(function (childEl) {\r\n return childEl.classList && childEl.classList.contains('hierarchy');\r\n }).map(function (childHierarchyEl) {\r\n return childHierarchyEl.querySelector('.node');\r\n }).filter(Boolean)\r\n : [];\r\n if (childNodeElements.some(function (childNodeEl) { return childNodeEl.classList.contains('sliding'); })) { return; }\r\n // hide the descendant nodes of the specified node\r\n if (childrenState.visible) {\r\n this.hideChildren(nodeElement);\r\n this.triggerHideEvent(nodeElement, 'children');\r\n } else { // show the descendants\r\n this.showChildren(nodeElement);\r\n this.triggerShowEvent(nodeElement, 'children');\r\n }\r\n }\r\n },\r\n // actions on clicking horizontal edges\r\n hEdgeClickHandler: function (event) {\r\n const nativeEvent = event.originalEvent || event;\r\n const nodeElement = event.node || nativeEvent.currentTarget;\r\n const edgeElement = getElement(event.edge || nativeEvent.target);\r\n const opts = this.options;\r\n const siblingsState = this.getNodeState(nodeElement, 'siblings');\r\n let hierarchyElement;\r\n let siblingElements;\r\n let previousSiblingElement;\r\n let nextSiblingElement;\r\n if (siblingsState.exist) {\r\n hierarchyElement = nodeElement.closest('.hierarchy');\r\n siblingElements = hierarchyElement && hierarchyElement.parentElement\r\n ? Array.from(hierarchyElement.parentElement.children).filter(function (childEl) {\r\n return childEl !== hierarchyElement;\r\n })\r\n : [];\r\n if (siblingElements.some(function (siblingEl) {\r\n return siblingEl.querySelector('.sliding');\r\n })) { return; }\r\n if (opts.toggleSiblingsResp) {\r\n previousSiblingElement = hierarchyElement ? hierarchyElement.previousElementSibling : null;\r\n nextSiblingElement = hierarchyElement ? hierarchyElement.nextElementSibling : null;\r\n if (edgeElement && edgeElement.classList && edgeElement.classList.contains('leftEdge')) {\r\n if (previousSiblingElement && previousSiblingElement.classList.contains('hidden')) {\r\n this.showSiblings(nodeElement, 'left');\r\n this.triggerShowEvent(nodeElement,'siblings');\r\n } else {\r\n this.hideSiblings(nodeElement, 'left');\r\n this.triggerHideEvent(nodeElement, 'siblings');\r\n }\r\n } else {\r\n if (nextSiblingElement && nextSiblingElement.classList.contains('hidden')) {\r\n this.showSiblings(nodeElement, 'right');\r\n this.triggerShowEvent(nodeElement,'siblings');\r\n } else {\r\n this.hideSiblings(nodeElement, 'right');\r\n this.triggerHideEvent(nodeElement, 'siblings');\r\n }\r\n }\r\n } else {\r\n if (siblingsState.visible) {\r\n this.hideSiblings(nodeElement);\r\n this.triggerHideEvent(nodeElement, 'siblings');\r\n } else {\r\n this.showSiblings(nodeElement);\r\n this.triggerShowEvent(nodeElement, 'siblings');\r\n }\r\n }\r\n }\r\n },\r\n // show the compact node's children in the compact mode\r\n backToCompactHandler: function (event) {\r\n const nativeEvent = event.originalEvent || event;\r\n const compactNodeEl = event.compactNode || nativeEvent.currentTarget;\r\n let nestedLooseModeElements;\r\n let backToCompactSymbolElement;\r\n let backToLooseSymbolElement;\r\n\r\n if (!compactNodeEl) {\r\n return;\r\n }\r\n\r\n compactNodeEl.classList.remove('looseMode');\r\n nestedLooseModeElements = Array.from(compactNodeEl.querySelectorAll('.looseMode'));\r\n nestedLooseModeElements.forEach(function (nestedLooseModeEl) {\r\n const nestedBackToCompactSymbolElement = Array.from(nestedLooseModeEl.children || []).find(function (childEl) {\r\n return childEl.classList && childEl.classList.contains('backToCompactSymbol');\r\n }) || null;\r\n const nestedBackToLooseSymbolElement = Array.from(nestedLooseModeEl.children || []).find(function (childEl) {\r\n return childEl.classList && childEl.classList.contains('backToLooseSymbol');\r\n }) || null;\r\n\r\n nestedLooseModeEl.classList.remove('looseMode');\r\n if (nestedBackToCompactSymbolElement) {\r\n nestedBackToCompactSymbolElement.classList.add('hidden');\r\n }\r\n if (nestedBackToLooseSymbolElement) {\r\n nestedBackToLooseSymbolElement.classList.remove('hidden');\r\n }\r\n });\r\n\r\n backToCompactSymbolElement = Array.from(compactNodeEl.children || []).find(function (childEl) {\r\n return childEl.classList && childEl.classList.contains('backToCompactSymbol');\r\n }) || null;\r\n backToLooseSymbolElement = Array.from(compactNodeEl.children || []).find(function (childEl) {\r\n return childEl.classList && childEl.classList.contains('backToLooseSymbol');\r\n }) || null;\r\n if (backToCompactSymbolElement) {\r\n backToCompactSymbolElement.classList.add('hidden');\r\n }\r\n if (backToLooseSymbolElement) {\r\n backToLooseSymbolElement.classList.remove('hidden');\r\n }\r\n },\r\n // show the compact node's children in the loose mode \r\n backToLooseHandler: function (event) {\r\n const nativeEvent = event.originalEvent || event;\r\n const compactNodeEl = event.compactNode || nativeEvent.currentTarget;\r\n let backToLooseSymbolElement;\r\n let backToCompactSymbolElement;\r\n\r\n if (!compactNodeEl) {\r\n return;\r\n }\r\n\r\n compactNodeEl.classList.add('looseMode');\r\n backToLooseSymbolElement = Array.from(compactNodeEl.children || []).find(function (childEl) {\r\n return childEl.classList && childEl.classList.contains('backToLooseSymbol');\r\n }) || null;\r\n backToCompactSymbolElement = Array.from(compactNodeEl.children || []).find(function (childEl) {\r\n return childEl.classList && childEl.classList.contains('backToCompactSymbol');\r\n }) || null;\r\n if (backToLooseSymbolElement) {\r\n backToLooseSymbolElement.classList.add('hidden');\r\n }\r\n if (backToCompactSymbolElement) {\r\n backToCompactSymbolElement.classList.remove('hidden');\r\n }\r\n },\r\n //\r\n expandVNodesEnd: function (event) {\r\n const nativeEvent = event.originalEvent || event;\r\n const verticalNodeElements = event.vNodes || nativeEvent.vNodes;\r\n\r\n getElements(verticalNodeElements).forEach(function (verticalNodeEl) {\r\n if (verticalNodeEl.classList) {\r\n verticalNodeEl.classList.remove('sliding');\r\n }\r\n });\r\n },\r\n //\r\n collapseVNodesEnd: function (event) {\r\n const nativeEvent = event.originalEvent || event;\r\n const verticalNodeElements = event.vNodes || nativeEvent.vNodes;\r\n\r\n getElements(verticalNodeElements).forEach(function (verticalNodeEl) {\r\n const verticalNodesWrapperElement = verticalNodeEl && typeof verticalNodeEl.closest === 'function'\r\n ? verticalNodeEl.closest('ul')\r\n : null;\r\n\r\n if (verticalNodeEl.classList) {\r\n verticalNodeEl.classList.remove('sliding');\r\n }\r\n if (verticalNodesWrapperElement && verticalNodesWrapperElement.classList) {\r\n verticalNodesWrapperElement.classList.add('hidden');\r\n }\r\n });\r\n },\r\n // event handler for toggle buttons in Hybrid(horizontal + vertical) OrgChart\r\n toggleVNodes: function (event) {\r\n const orgChart = this;\r\n const nativeEvent = event.originalEvent || event;\r\n const toggleBtnEl = event.toggleButton || nativeEvent.target;\r\n const descendantWrapperElement = toggleBtnEl && toggleBtnEl.parentElement ? toggleBtnEl.parentElement.nextElementSibling : null;\r\n let descendantNodeElements;\r\n let childNodeElements;\r\n\r\n if (!toggleBtnEl || !descendantWrapperElement) {\r\n return;\r\n }\r\n\r\n descendantNodeElements = Array.from(descendantWrapperElement.querySelectorAll('.node'));\r\n childNodeElements = Array.from(descendantWrapperElement.children || []).map(function (childEl) {\r\n return childEl.querySelector('.node');\r\n }).filter(Boolean);\r\n if (childNodeElements.some(function (childNodeEl) { return childNodeEl.classList.contains('sliding'); })) { return; }\r\n toggleBtnEl.classList.toggle(this.options.icons.collapsed);\r\n toggleBtnEl.classList.toggle(this.options.icons.expanded);\r\n if (descendantNodeElements[0] && descendantNodeElements[0].classList.contains('slide-up')) {\r\n descendantWrapperElement.classList.remove('hidden');\r\n this.repaint(childNodeElements[0]);\r\n childNodeElements.forEach(function (childNodeEl) {\r\n childNodeEl.classList.add('sliding');\r\n childNodeEl.classList.remove('slide-up');\r\n });\r\n if (childNodeElements[0]) {\r\n childNodeElements[0].addEventListener('transitionend', function (transitionEvent) {\r\n transitionEvent.vNodes = childNodeElements;\r\n orgChart.expandVNodesEnd(transitionEvent);\r\n }, { once: true });\r\n }\r\n } else {\r\n descendantNodeElements.forEach(function (descendantNodeEl) {\r\n descendantNodeEl.classList.add('sliding', 'slide-up');\r\n });\r\n if (descendantNodeElements[0]) {\r\n descendantNodeElements[0].addEventListener('transitionend', function (transitionEvent) {\r\n transitionEvent.vNodes = descendantNodeElements;\r\n orgChart.collapseVNodesEnd(transitionEvent);\r\n }, { once: true });\r\n }\r\n descendantNodeElements.forEach(function (descendantNodeEl) {\r\n Array.from(descendantNodeEl.querySelectorAll('.toggleBtn')).forEach(function (nestedToggleBtnEl) {\r\n nestedToggleBtnEl.classList.remove(this.options.icons.collapsed, this.options.icons.expanded);\r\n }, this);\r\n }, this);\r\n }\r\n },\r\n //\r\n createGhostNode: function (event) {\r\n const nativeEvent = event.originalEvent || event;\r\n const sourceNodeEl = event.sourceNode || nativeEvent.target;\r\n const chartElement = sourceNodeEl && typeof sourceNodeEl.closest === 'function'\r\n ? sourceNodeEl.closest('.orgchart')\r\n : null;\r\n const opts = this.options;\r\n const origEvent = nativeEvent;\r\n const isFirefox = /firefox/.test(getWindow().navigator.userAgent.toLowerCase());\r\n let sourceRect;\r\n let transformValue;\r\n let transformValues;\r\n let isVerticalChartDirection;\r\n let scaleFactor;\r\n let ghostNodeEl, nodeCoverEl;\r\n\r\n if (!sourceNodeEl || !chartElement) {\r\n return;\r\n }\r\n\r\n if (!getDocument().querySelector('.ghost-node')) {\r\n ghostNodeEl = getDocument().createElementNS(\"http://www.w3.org/2000/svg\", \"svg\");\r\n if (!ghostNodeEl.classList) return;\r\n ghostNodeEl.classList.add('ghost-node');\r\n nodeCoverEl = getDocument().createElementNS('http://www.w3.org/2000/svg','rect');\r\n ghostNodeEl.appendChild(nodeCoverEl);\r\n chartElement.appendChild(ghostNodeEl);\r\n } else {\r\n ghostNodeEl = chartElement.querySelector('.ghost-node');\r\n nodeCoverEl = ghostNodeEl ? ghostNodeEl.firstElementChild : null;\r\n }\r\n\r\n if (!ghostNodeEl || !nodeCoverEl) {\r\n return;\r\n }\r\n\r\n sourceRect = sourceNodeEl.getBoundingClientRect();\r\n transformValue = chartElement.style.transform || getWindow().getComputedStyle(chartElement).transform || 'none';\r\n transformValues = transformValue.split(',');\r\n isVerticalChartDirection = opts.direction === 't2b' || opts.direction === 'b2t';\r\n scaleFactor = Math.abs(getWindow().parseFloat(isVerticalChartDirection ? transformValues[0].slice(transformValues[0].indexOf('(') + 1) : transformValues[1]));\r\n ghostNodeEl.setAttribute('width', isVerticalChartDirection ? sourceRect.width : sourceRect.height);\r\n ghostNodeEl.setAttribute('height', isVerticalChartDirection ? sourceRect.height : sourceRect.width);\r\n nodeCoverEl.setAttribute('x',5 * scaleFactor);\r\n nodeCoverEl.setAttribute('y',5 * scaleFactor);\r\n nodeCoverEl.setAttribute('width', 120 * scaleFactor);\r\n nodeCoverEl.setAttribute('height', 40 * scaleFactor);\r\n nodeCoverEl.setAttribute('rx', 4 * scaleFactor);\r\n nodeCoverEl.setAttribute('ry', 4 * scaleFactor);\r\n nodeCoverEl.setAttribute('stroke-width', 1 * scaleFactor);\r\n let xOffset = origEvent.offsetX * scaleFactor;\r\n let yOffset = origEvent.offsetY * scaleFactor;\r\n if (opts.direction === 'l2r') {\r\n xOffset = origEvent.offsetY * scaleFactor;\r\n yOffset = origEvent.offsetX * scaleFactor;\r\n } else if (opts.direction === 'r2l') {\r\n xOffset = sourceRect.width - origEvent.offsetY * scaleFactor;\r\n yOffset = origEvent.offsetX * scaleFactor;\r\n } else if (opts.direction === 'b2t') {\r\n xOffset = sourceRect.width - origEvent.offsetX * scaleFactor;\r\n yOffset = sourceRect.height - origEvent.offsetY * scaleFactor;\r\n }\r\n if (isFirefox) { // hack for old version of Firefox(< 48.0)\r\n nodeCoverEl.setAttribute('fill', 'rgb(255, 255, 255)');\r\n nodeCoverEl.setAttribute('stroke', 'rgb(191, 0, 0)');\r\n const ghostNodeImageEl = getDocument().createElement('img');\r\n ghostNodeImageEl.src = 'data:image/svg+xml;utf8,' + (new XMLSerializer()).serializeToString(ghostNodeEl);\r\n origEvent.dataTransfer.setDragImage(ghostNodeImageEl, xOffset, yOffset);\r\n } else {\r\n // IE/Edge do not support this, so only use it if we can\r\n if (origEvent.dataTransfer.setDragImage)\r\n origEvent.dataTransfer.setDragImage(ghostNodeEl, xOffset, yOffset);\r\n }\r\n },\r\n // get the level amount of a hierachy\r\n getUpperLevel: function (nodeEl) {\r\n const nodeElement = getElement(nodeEl);\r\n let currentElement;\r\n let levelCount = 0;\r\n\r\n if (!nodeElement || !nodeElement.matches('.node')) {\r\n return 0;\r\n }\r\n\r\n currentElement = nodeElement.parentElement;\r\n while (currentElement) {\r\n if (currentElement.classList && currentElement.classList.contains('hierarchy')) {\r\n levelCount += 1;\r\n }\r\n currentElement = currentElement.parentElement;\r\n }\r\n\r\n return levelCount;\r\n },\r\n // get the level amount of a hierachy\r\n getLowerLevel: function (nodeEl) {\r\n const nodeElement = getElement(nodeEl);\r\n let levelCount = 1;\r\n let currentLevelNodes;\r\n\r\n if (!nodeElement || !nodeElement.matches('.node')) {\r\n return 0;\r\n }\r\n\r\n currentLevelNodes = this.getChildren(nodeElement);\r\n while (currentLevelNodes.length) {\r\n const nextLevelNodes = [];\r\n levelCount += 1;\r\n currentLevelNodes.forEach(function (childNodeEl) {\r\n Array.prototype.push.apply(nextLevelNodes, this.getChildren(childNodeEl));\r\n }, this);\r\n currentLevelNodes = nextLevelNodes;\r\n }\r\n\r\n return levelCount;\r\n },\r\n // get nodes in level order traversal\r\n getLevelOrderNodes: function (rootEl) {\r\n const rootElement = getElement(rootEl);\r\n const pendingNodeElements = [];\r\n const nodesByLevel = [];\r\n if (!rootElement) {\r\n return [];\r\n }\r\n\r\n pendingNodeElements.push(rootElement);\r\n while(pendingNodeElements.length) {\r\n const levelNodeElements = [];\r\n const levelNodeCount = pendingNodeElements.length;\r\n for(let i = 0; i < levelNodeCount; i++) {\r\n const currentNodeElement = pendingNodeElements.shift();\r\n const childNodeElements = this.getChildren(currentNodeElement);\r\n if(childNodeElements.length) {\r\n Array.prototype.push.apply(pendingNodeElements, childNodeElements);\r\n }\r\n levelNodeElements.push(currentNodeElement);\r\n }\r\n nodesByLevel.push(levelNodeElements);\r\n }\r\n return nodesByLevel;\r\n },\r\n //\r\n filterAllowedDropNodes: function (draggedEl) {\r\n const draggedNodeEl = getElement(draggedEl);\r\n const opts = this.options;\r\n const chartElement = this.chart;\r\n let draggableHostEl;\r\n let draggedParentNodeEl;\r\n let draggedSubtreeNodeEls;\r\n let excludedNodeEls;\r\n let draggingNode;\r\n\r\n if (!chartElement) {\r\n return;\r\n }\r\n\r\n // what is being dragged? a node, or something within a node?\r\n draggableHostEl = draggedNodeEl && typeof draggedNodeEl.closest === 'function'\r\n ? draggedNodeEl.closest('[draggable]')\r\n : null;\r\n draggingNode = !!(draggableHostEl && draggableHostEl.classList && draggableHostEl.classList.contains('node'));\r\n draggedParentNodeEl = draggedNodeEl && draggedNodeEl.closest('.nodes')\r\n ? draggedNodeEl.closest('.nodes').previousElementSibling\r\n : null;\r\n draggedSubtreeNodeEls = draggedNodeEl && draggedNodeEl.closest('.hierarchy')\r\n ? Array.from(draggedNodeEl.closest('.hierarchy').querySelectorAll('.node'))\r\n : [];\r\n excludedNodeEls = new Set(draggedSubtreeNodeEls);\r\n setState(chartElement, 'dragged', draggedNodeEl);\r\n Array.from(chartElement.querySelectorAll('.node')).forEach(function (node) {\r\n if (!draggingNode || !excludedNodeEls.has(node)) {\r\n if (opts.dropCriteria) {\r\n if (opts.dropCriteria(draggedNodeEl, draggedParentNodeEl, node)) {\r\n node.classList.add('allowedDrop');\r\n }\r\n } else {\r\n node.classList.add('allowedDrop');\r\n }\r\n }\r\n });\r\n },\r\n //\r\n dragstartHandler: function (event) {\r\n const nativeEvent = event.originalEvent || event;\r\n const draggedNodeEl = event.draggedNode || nativeEvent.target;\r\n const chartElement = this.chart;\r\n const transformValue = chartElement\r\n ? (chartElement.style.transform || getWindow().getComputedStyle(chartElement).transform || 'none')\r\n : 'none';\r\n\r\n nativeEvent.dataTransfer.setData('text/html', 'hack for firefox');\r\n // if users enable zoom or direction options\r\n if (transformValue !== 'none') {\r\n this.createGhostNode({\r\n sourceNode: draggedNodeEl,\r\n originalEvent: nativeEvent\r\n });\r\n }\r\n this.filterAllowedDropNodes(draggedNodeEl);\r\n },\r\n //\r\n dragoverHandler: function (event) {\r\n const nativeEvent = event.originalEvent || event;\r\n const dropZoneEl = event.dropZone || nativeEvent.currentTarget;\r\n\r\n if (!dropZoneEl || !dropZoneEl.classList || !dropZoneEl.classList.contains('allowedDrop')) {\r\n nativeEvent.dataTransfer.dropEffect = 'none';\r\n } else {\r\n // default action for drag-and-drop of div is not to drop, so preventing default action for nodes which have allowedDrop class\r\n //to fix drag and drop on IE and Edge\r\n if (typeof nativeEvent.preventDefault === 'function') {\r\n nativeEvent.preventDefault();\r\n }\r\n }\r\n },\r\n //\r\n dragendHandler: function (event) {\r\n const chartElement = this.chart;\r\n\r\n if (!chartElement) {\r\n return;\r\n }\r\n\r\n Array.from(chartElement.querySelectorAll('.allowedDrop')).forEach(function (node) {\r\n node.classList.remove('allowedDrop');\r\n });\r\n },\r\n // when user drops the node, it will be removed from original parent node and be added to new parent node\r\n dropHandler: async function (event) {\r\n const nativeEvent = event.originalEvent || event;\r\n const orgChart = this;\r\n const chartElement = this.chart;\r\n const dropZoneEl = event.dropZone || nativeEvent.currentTarget;\r\n const draggedEl = chartElement ? getElement(getState(chartElement, 'dragged')) : null;\r\n const chartOptions = chartElement ? getState(chartElement, 'options') : null;\r\n let draggedParentNodeEl;\r\n let dropChildrenContainerEl;\r\n let draggedHierarchyEl;\r\n let draggedParentChildrenContainerEl;\r\n let remainingHierarchyEls;\r\n\r\n // Pass on drops which are not nodes (since they are not our doing)\r\n if (!draggedEl || !draggedEl.classList || !draggedEl.classList.contains('node')) {\r\n if (chartElement) {\r\n chartElement.dispatchEvent(createTriggeredEvent('otherdropped.orgchart', {\r\n 'draggedItem': draggedEl,\r\n 'dropZone': dropZoneEl\r\n }));\r\n }\r\n return;\r\n }\r\n\r\n if (!dropZoneEl || !dropZoneEl.classList || !dropZoneEl.classList.contains('allowedDrop')) {\r\n // We are trying to drop a node into a node which isn't allowed\r\n // IE/Edge have a habit of allowing this, so we need our own double-check\r\n return;\r\n }\r\n\r\n draggedParentNodeEl = draggedEl.closest('.nodes') ? draggedEl.closest('.nodes').previousElementSibling : null;\r\n const dropEvent = createEventLike('nodedrop.orgchart');\r\n if (chartElement) {\r\n const triggeredDropEvent = createTriggeredEvent(dropEvent, {\r\n 'draggedNode': draggedEl,\r\n 'dragZone': draggedParentNodeEl,\r\n 'dropZone': dropZoneEl\r\n });\r\n\r\n triggeredDropEvent.delegateTarget = chartElement;\r\n chartElement.dispatchEvent(triggeredDropEvent);\r\n dropEvent.defaultPrevented = triggeredDropEvent.defaultPrevented;\r\n }\r\n if (dropEvent.isDefaultPrevented()) {\r\n return;\r\n }\r\n // special process for hybrid chart\r\n const datasource = chartOptions.data;\r\n const dataDigger = new JSONDigger(datasource, chartOptions.nodeId, 'children');\r\n const hybridNodeData = dataDigger.findOneNode({ 'hybrid': true });\r\n if (chartOptions.verticalLevel > 1 || hybridNodeData) {\r\n const draggedNodeData = dataDigger.findNodeById(getState(draggedEl, 'nodeData').id);\r\n const draggedNodeCopy = Object.assign({}, draggedNodeData);\r\n dataDigger.removeNode(draggedNodeData.id);\r\n const dropNodeData = dataDigger.findNodeById(getState(dropZoneEl, 'nodeData').id);\r\n if (dropNodeData.children) {\r\n dropNodeData.children.push(draggedNodeCopy);\r\n } else {\r\n dropNodeData.children = [draggedNodeCopy];\r\n }\r\n\t\torgChart.attachRel(datasource, '00');\r\n orgChart.init({ 'data': datasource });\r\n } else {\r\n // The folowing code snippets are used to process horizontal chart\r\n draggedHierarchyEl = draggedEl.closest('.hierarchy');\r\n dropChildrenContainerEl = Array.from(dropZoneEl.parentElement ? dropZoneEl.parentElement.children : []).find(function (childEl) {\r\n return childEl !== dropZoneEl && childEl.classList && childEl.classList.contains('nodes');\r\n }) || null;\r\n // firstly, deal with the hierarchy of drop zone\r\n if (!dropChildrenContainerEl) { // if the drop zone is a leaf node\r\n dropZoneEl.insertAdjacentHTML('beforeend', `<i class=\"edge verticalEdge bottomEdge ${this.options.icons.theme}\"></i>`);\r\n dropZoneEl.insertAdjacentHTML('afterend', '<ul class=\"nodes\"></ul>');\r\n dropChildrenContainerEl = dropZoneEl.nextElementSibling;\r\n Array.from(draggedEl.querySelectorAll('.horizontalEdge')).forEach(function (edgeEl) {\r\n edgeEl.remove();\r\n });\r\n dropChildrenContainerEl.appendChild(draggedHierarchyEl);\r\n const titleEl = Array.from(dropZoneEl.children || []).find(function (childEl) {\r\n return childEl.classList && childEl.classList.contains('title');\r\n }) || null;\r\n if (titleEl) {\r\n titleEl.insertAdjacentHTML('afterbegin', `<i class=\"${this.options.icons.theme} ${chartOptions.icons.parentNode} parentNodeSymbol\"></i>`);\r\n }\r\n } else {\r\n const horizontalEdges = `<i class=\"edge horizontalEdge rightEdge ${this.options.icons.theme}\"></i><i class=\"edge horizontalEdge leftEdge ${this.options.icons.theme}\"></i>`;\r\n if (!draggedEl.querySelector('.horizontalEdge')) {\r\n draggedEl.insertAdjacentHTML('beforeend', horizontalEdges);\r\n }\r\n dropChildrenContainerEl.appendChild(draggedHierarchyEl);\r\n const dropSiblingNodeEls = Array.from(dropChildrenContainerEl.children || []).filter(function (childEl) {\r\n return childEl !== draggedHierarchyEl && childEl.classList && childEl.classList.contains('hierarchy');\r\n }).map(function (siblingHierarchyEl) {\r\n return siblingHierarchyEl.querySelector('.node');\r\n }).filter(Boolean);\r\n if (dropSiblingNodeEls.length === 1) {\r\n dropSiblingNodeEls[0].insertAdjacentHTML('beforeend', horizontalEdges);\r\n }\r\n }\r\n // secondly, deal with the hierarchy of dragged node\r\n draggedParentChildrenContainerEl = Array.from(draggedParentNodeEl && draggedParentNodeEl.parentElement ? draggedParentNodeEl.parentElement.children : []).find(function (childEl) {\r\n return childEl !== draggedParentNodeEl && childEl.classList && childEl.classList.contains('nodes');\r\n }) || null;\r\n remainingHierarchyEls = draggedParentChildrenContainerEl\r\n ? Array.from(draggedParentChildrenContainerEl.children || []).filter(function (childEl) {\r\n return childEl.classList && childEl.classList.contains('hierarchy');\r\n })\r\n : [];\r\n if (remainingHierarchyEls.length === 1) { // if there is only one sibling node left\r\n const remainingNodeEl = remainingHierarchyEls[0].querySelector('.node');\r\n if (remainingNodeEl) {\r\n Array.from(remainingNodeEl.querySelectorAll('.horizontalEdge')).forEach(function (edgeEl) {\r\n edgeEl.remove();\r\n });\r\n }\r\n } else if (remainingHierarchyEls.length === 0) {\r\n Array.from(draggedParentNodeEl.querySelectorAll('.bottomEdge, .parentNodeSymbol')).forEach(function (edgeEl) {\r\n edgeEl.remove();\r\n });\r\n if (draggedParentChildrenContainerEl) {\r\n draggedParentChildrenContainerEl.remove();\r\n }\r\n }\r\n }\r\n },\r\n //\r\n touchstartHandler: function (event) {\r\n const nativeEvent = event.originalEvent || event;\r\n\r\n if (this.touchHandled)\r\n return;\r\n\r\n if (nativeEvent.touches && nativeEvent.touches.length > 1)\r\n return;\r\n\r\n this.touchHandled = true;\r\n this.touchMoved = false; // this is so we can work out later if this was a 'press' or a 'drag' touch\r\n if (typeof nativeEvent.preventDefault === 'function') {\r\n nativeEvent.preventDefault();\r\n }\r\n },\r\n //\r\n touchmoveHandler: function (event) {\r\n const nativeEvent = event.originalEvent || event;\r\n const draggedNodeEl = event.draggedNode || nativeEvent.currentTarget || nativeEvent.target;\r\n const chartElement = this.chart;\r\n let cachedDraggedNodeEl;\r\n let touchedElement;\r\n let candidateDropNodeEl;\r\n\r\n if (!this.touchHandled)\r\n return;\r\n\r\n if (nativeEvent.touches && nativeEvent.touches.length > 1)\r\n return;\r\n\r\n if (typeof nativeEvent.preventDefault === 'function') {\r\n nativeEvent.preventDefault();\r\n }\r\n\r\n if (!this.touchMoved) {\r\n // we do not bother with createGhostNode (dragstart does) since the touch event does not have a dataTransfer property\r\n this.filterAllowedDropNodes(draggedNodeEl); // will also cache the dragged node on the chart element for us\r\n // create an image which can be used to illustrate the drag (our own createGhostNode)\r\n cachedDraggedNodeEl = chartElement ? getElement(getState(chartElement, 'dragged')) : null;\r\n if (!cachedDraggedNodeEl) {\r\n return;\r\n }\r\n this.touchDragImage = this.createDragImage(nativeEvent, cachedDraggedNodeEl);\r\n }\r\n this.touchMoved = true;\r\n\r\n // move our dragimage so it follows our finger\r\n this.moveDragImage(nativeEvent, this.touchDragImage);\r\n\r\n touchedElement = getDocument().elementFromPoint(nativeEvent.touches[0].clientX, nativeEvent.touches[0].clientY);\r\n candidateDropNodeEl = touchedElement && typeof touchedElement.closest === 'function'\r\n ? touchedElement.closest('div.node')\r\n : null;\r\n if (candidateDropNodeEl && candidateDropNodeEl.classList && candidateDropNodeEl.classList.contains('allowedDrop')) {\r\n this.touchTargetNode = candidateDropNodeEl;\r\n } else {\r\n this.touchTargetNode = null;\r\n }\r\n },\r\n //\r\n touchendHandler: function (event) {\r\n const nativeEvent = event.originalEvent || event;\r\n let firstTouch;\r\n let targetEl;\r\n let fakeMouseClickEvent;\r\n\r\n if (!this.touchHandled) {\r\n return;\r\n }\r\n\r\n this.destroyDragImage();\r\n if (this.touchMoved) {\r\n // we've had movement, so this was a 'drag' touch\r\n if (this.touchTargetNode) {\r\n const syntheticDropEvent = { dropZone: this.touchTargetNode };\r\n this.dropHandler(syntheticDropEvent);\r\n this.touchTargetNode = null;\r\n }\r\n this.dragendHandler(event);\r\n } else {\r\n // we did not move, so this was a 'press' touch (fake a click)\r\n firstTouch = nativeEvent.changedTouches[0];\r\n targetEl = nativeEvent.target;\r\n fakeMouseClickEvent = new (getWindow().MouseEvent)('click', {\r\n bubbles: true,\r\n cancelable: true,\r\n view: getWindow(),\r\n screenX: firstTouch.screenX,\r\n screenY: firstTouch.screenY,\r\n clientX: firstTouch.clientX,\r\n clientY: firstTouch.clientY,\r\n ctrlKey: nativeEvent.ctrlKey,\r\n altKey: nativeEvent.altKey,\r\n shiftKey: nativeEvent.shiftKey,\r\n metaKey: nativeEvent.metaKey,\r\n button: 0\r\n });\r\n targetEl.dispatchEvent(fakeMouseClickEvent);\r\n }\r\n\r\n this.touchHandled = false;\r\n },\r\n //\r\n createDragImage: function (event, sourceEl) {\r\n const dragImageEl = sourceEl.cloneNode(true);\r\n this.copyStyle(sourceEl, dragImageEl);\r\n dragImageEl.style.top = dragImageEl.style.left = '-9999px';\r\n const sourceRect = sourceEl.getBoundingClientRect();\r\n const sourcePoint = this.getTouchPoint(event);\r\n this.touchDragImageOffset = { x: sourcePoint.x - sourceRect.left, y: sourcePoint.y - sourceRect.top };\r\n dragImageEl.style.opacity = '0.5';\r\n getDocument().body.appendChild(dragImageEl);\r\n return dragImageEl;\r\n },\r\n //\r\n destroyDragImage: function () {\r\n if (this.touchDragImage && this.touchDragImage.parentElement)\r\n this.touchDragImage.parentElement.removeChild(this.touchDragImage);\r\n this.touchDragImageOffset = null;\r\n this.touchDragImage = null;\r\n },\r\n //\r\n copyStyle: function (sourceEl, targetEl) {\r\n // remove potentially troublesome attributes\r\n const badAttributes = ['id', 'class', 'style', 'draggable'];\r\n badAttributes.forEach(function (attributeName) {\r\n targetEl.removeAttribute(attributeName);\r\n });\r\n // copy canvas content\r\n if (sourceEl instanceof HTMLCanvasElement) {\r\n const sourceCanvas = sourceEl;\r\n const targetCanvas = targetEl;\r\n targetCanvas.width = sourceCanvas.width;\r\n targetCanvas.height = sourceCanvas.height;\r\n targetCanvas.getContext('2d').drawImage(sourceCanvas, 0, 0);\r\n }\r\n // copy style (without transitions)\r\n const computedStyle = getComputedStyle(sourceEl);\r\n for (let i = 0; i < computedStyle.length; i++) {\r\n const key = computedStyle[i];\r\n if (key.indexOf('transition') < 0) {\r\n targetEl.style[key] = computedStyle[key];\r\n }\r\n }\r\n targetEl.style.pointerEvents = 'none';\r\n // and repeat for all children\r\n for (let i = 0; i < sourceEl.children.length; i++) {\r\n this.copyStyle(sourceEl.children[i], targetEl.children[i]);\r\n }\r\n },\r\n //\r\n getTouchPoint: function (event) {\r\n let nativeEvent = event ? (event.originalEvent || event) : null;\r\n\r\n if (nativeEvent && nativeEvent.touches) {\r\n nativeEvent = nativeEvent.touches[0];\r\n }\r\n return {\r\n x: nativeEvent.clientX,\r\n y: nativeEvent.clientY\r\n };\r\n },\r\n //\r\n moveDragImage: function (event, dragImageEl) {\r\n if (!event || !dragImageEl)\r\n return;\r\n const orgChartMaster = this;\r\n requestAnimationFrame(function () {\r\n const touchPoint = orgChartMaster.getTouchPoint(event);\r\n const dragImageStyle = dragImageEl.style;\r\n dragImageStyle.position = 'absolute';\r\n dragImageStyle.pointerEvents = 'none';\r\n dragImageStyle.zIndex = '999999';\r\n if (orgChartMaster.touchDragImageOffset) {\r\n dragImageStyle.left = Math.round(touchPoint.x - orgChartMaster.touchDragImageOffset.x) + 'px';\r\n dragImageStyle.top = Math.round(touchPoint.y - orgChartMaster.touchDragImageOffset.y) + 'px';\r\n }\r\n });\r\n },\r\n //\r\n bindDragDrop: function (nodeEl) {\r\n const nodeElement = getElement(nodeEl);\r\n\r\n if (!nodeElement) {\r\n return;\r\n }\r\n\r\n nodeElement.addEventListener('dragstart', this.dragstartHandler.bind(this));\r\n nodeElement.addEventListener('dragover', this.dragoverHandler.bind(this));\r\n nodeElement.addEventListener('dragend', this.dragendHandler.bind(this));\r\n nodeElement.addEventListener('drop', this.dropHandler.bind(this));\r\n nodeElement.addEventListener('touchstart', this.touchstartHandler.bind(this));\r\n nodeElement.addEventListener('touchmove', this.touchmoveHandler.bind(this));\r\n nodeElement.addEventListener('touchend', this.touchendHandler.bind(this));\r\n },\r\n // create node\r\n createNode: function (data) {\r\n const opts = this.options;\r\n const level = data.level;\r\n const flags = data.relationship || '';\r\n const nodeClassName = [\r\n 'node',\r\n data.className || '',\r\n data?.outsider ? 'outsider' : '',\r\n level > opts.visibleLevel ? 'slide-up' : ''\r\n ].filter(Boolean).join(' ');\r\n const titleMarkupParts = [];\r\n const contentMarkupParts = [];\r\n const nodeMarkupParts = [];\r\n const shouldAddParentSymbol = Number(flags.substr(2, 1));\r\n\r\n if (data.children && data[opts.nodeId]) {\r\n forEachValue(data.children, function (index, child) {\r\n child.parentId = data[opts.nodeId]\r\n });\r\n }\r\n\r\n if (shouldAddParentSymbol) {\r\n titleMarkupParts.push(`<i class=\"${opts.icons.theme} ${opts.icons.parentNode} parentNodeSymbol\"></i>`);\r\n }\r\n titleMarkupParts.push(data[opts.nodeTitle]);\r\n\r\n if (opts.nodeTemplate) {\r\n nodeMarkupParts.push(opts.nodeTemplate(data));\r\n } else {\r\n nodeMarkupParts.push(`<div class=\"title\">${titleMarkupParts.join('')}</div>`);\r\n if (typeof opts.nodeContent !== 'undefined') {\r\n contentMarkupParts.push(`<div class=\"content\">${data[opts.nodeContent] || ''}</div>`);\r\n }\r\n nodeMarkupParts.push(contentMarkupParts.join(''));\r\n }\r\n\r\n if ((opts.verticalLevel && level >= opts.verticalLevel) || data.vertical) {\r\n if (shouldAddParentSymbol) {\r\n nodeMarkupParts.push(`<i class=\"toggleBtn ${opts.icons.theme}\"></i>`);\r\n }\r\n } else if (data.hybrid) {\r\n if (shouldAddParentSymbol) {\r\n nodeMarkupParts.push(`<i class=\"edge verticalEdge bottomEdge ${opts.icons.theme}\"></i>`);\r\n }\r\n } else if (data.compact) {\r\n if (shouldAddParentSymbol) {\r\n nodeMarkupParts.push(`<i class=\"${opts.icons.theme} ${opts.icons.backToCompact} backToCompactSymbol hidden\"></i>`);\r\n nodeMarkupParts.push(`<i class=\"${opts.icons.theme} ${opts.icons.backToLoose} backToLooseSymbol\"></i>`);\r\n }\r\n } else if (!data.associatedCompact) {\r\n if (Number(flags.substr(0, 1))) {\r\n nodeMarkupParts.push(`<i class=\"edge verticalEdge topEdge ${opts.icons.theme}\"></i>`);\r\n }\r\n if (Number(flags.substr(1, 1))) {\r\n nodeMarkupParts.push(`<i class=\"edge horizontalEdge rightEdge ${opts.icons.theme}\"></i>`);\r\n nodeMarkupParts.push(`<i class=\"edge horizontalEdge leftEdge ${opts.icons.theme}\"></i>`);\r\n }\r\n if (shouldAddParentSymbol) {\r\n nodeMarkupParts.push(`<i class=\"edge verticalEdge bottomEdge ${opts.icons.theme}\"></i>`);\r\n }\r\n }\r\n\r\n // construct the content of node\r\n const nodeElement = getDocument().createElement('div');\r\n const routeNodeClick = function (selector, handler) {\r\n nodeElement.addEventListener('click', function (event) {\r\n const matchedElement = event.target && typeof event.target.closest === 'function'\r\n ? event.target.closest(selector)\r\n : null;\r\n\r\n if (!matchedElement || matchedElement.parentElement !== nodeElement) {\r\n return;\r\n }\r\n\r\n handler.call(this, event);\r\n }.bind(this));\r\n }.bind(this);\r\n\r\n if (opts.draggable) {\r\n nodeElement.setAttribute('draggable', 'true');\r\n }\r\n if (data[opts.nodeId]) {\r\n nodeElement.id = data[opts.nodeId];\r\n }\r\n if (data.parentId) {\r\n nodeElement.setAttribute('data-parent', data.parentId);\r\n }\r\n nodeElement.className = nodeClassName;\r\n nodeElement.insertAdjacentHTML('beforeend', nodeMarkupParts.join(''));\r\n //\r\n const storedNodeData = mergeObjects({}, data);\r\n delete storedNodeData.children;\r\n setState(nodeElement, 'nodeData', storedNodeData);\r\n nodeElement.__ocNodeData = storedNodeData;\r\n if (data.compact && nodeElement && nodeElement.style) {\r\n nodeElement.style.gridTemplateColumns = `repeat(${Math.floor(Math.sqrt(data.children.length + 1))}, auto)`;\r\n }\r\n\r\n nodeElement.addEventListener('mouseenter', this.nodeEnterLeaveHandler.bind(this));\r\n nodeElement.addEventListener('mouseleave', this.nodeEnterLeaveHandler.bind(this));\r\n nodeElement.addEventListener('click', this.nodeClickHandler.bind(this));\r\n routeNodeClick('.topEdge', this.topEdgeClickHandler);\r\n routeNodeClick('.bottomEdge', this.bottomEdgeClickHandler);\r\n routeNodeClick('.leftEdge, .rightEdge', this.hEdgeClickHandler);\r\n routeNodeClick('.toggleBtn', this.toggleVNodes);\r\n routeNodeClick('.backToCompactSymbol', this.backToCompactHandler);\r\n routeNodeClick('.backToLooseSymbol', this.backToLooseHandler);\r\n\r\n if (opts.draggable) {\r\n this.bindDragDrop(nodeElement);\r\n this.touchHandled = false;\r\n this.touchMoved = false;\r\n this.touchTargetNode = null;\r\n }\r\n // allow user to append dom modification after finishing node create of orgchart\r\n if (opts.createNode) {\r\n opts.createNode(nodeElement, data);\r\n }\r\n\r\n return nodeElement;\r\n },\r\n // Construct the inferior nodes within a hierarchy\r\n buildInferiorNodes: function (hierarchyEl, nodeEl, data, level) {\r\n const orgChart = this;\r\n const opts = this.options;\r\n const hierarchyElement = getElement(hierarchyEl);\r\n const nodeElement = getElement(nodeEl);\r\n const isHidden = level + 1 > opts.visibleLevel || (data.collapsed !== undefined && data.collapsed);\r\n let nodesLayerElement;\r\n\r\n if (!hierarchyElement) {\r\n return;\r\n }\r\n\r\n if ((opts.verticalLevel && (level + 1) >= opts.verticalLevel) || data.hybrid) {\r\n nodesLayerElement = getDocument().createElement('ul');\r\n nodesLayerElement.className = 'nodes';\r\n if (isHidden && (opts.verticalLevel && (level + 1) >= opts.verticalLevel)) {\r\n nodesLayerElement.classList.add('hidden');\r\n }\r\n if (((opts.verticalLevel && level + 1 === opts.verticalLevel) || data.hybrid)\r\n && !hierarchyElement.closest('.vertical')) {\r\n nodesLayerElement.classList.add('vertical');\r\n }\r\n hierarchyElement.appendChild(nodesLayerElement);\r\n } else if (data.compact) {\r\n if (nodeElement && nodeElement.classList) {\r\n nodeElement.classList.add('compact');\r\n }\r\n } else {\r\n nodesLayerElement = getDocument().createElement('ul');\r\n nodesLayerElement.className = isHidden ? 'nodes hidden' : 'nodes';\r\n if (isHidden) {\r\n hierarchyElement.classList.add('isChildrenCollapsed');\r\n }\r\n hierarchyElement.appendChild(nodesLayerElement);\r\n }\r\n // recurse through children nodes\r\n if (Array.isArray(data.children[0])) {\r\n forEachValue(data.children, function() {\r\n this.level = level + 1;\r\n });\r\n this.buildHierarchy(nodesLayerElement, data.children); // 构造子一层的夫妻组合(每个组合可能有多妻多夫情况)\r\n } else {\r\n forEachValue(data.children, function () {\r\n this.level = level + 1;\r\n if (data.compact) {\r\n orgChart.buildHierarchy(nodeElement, this);\r\n } else {\r\n const nodeCellElement = getDocument().createElement('li');\r\n\r\n nodeCellElement.className = 'hierarchy';\r\n nodesLayerElement.appendChild(nodeCellElement);\r\n orgChart.buildHierarchy(nodeCellElement, this);\r\n }\r\n });\r\n }\r\n },\r\n // recursively build the tree\r\n buildHierarchy: function (hierarchyEl, data) {\r\n const orgChart = this;\r\n const hierarchyElement = getElement(hierarchyEl);\r\n let level = 0;\r\n let nodeCollection;\r\n let nodeElement;\r\n\r\n if (!hierarchyElement) {\r\n return;\r\n }\r\n\r\n if (data.level || data[0]?.level) {\r\n level = data.level;\r\n } else {\r\n let currentAncestorElement = hierarchyElement.parentElement;\r\n\r\n while (currentAncestorElement && !currentAncestorElement.matches('.orgchart')) {\r\n if (currentAncestorElement.classList && currentAncestorElement.classList.contains('nodes')) {\r\n level += 1;\r\n }\r\n currentAncestorElement = currentAncestorElement.parentElement;\r\n }\r\n if (Array.isArray(data) && Array.isArray(data[0])) {\r\n forEachValue(data, function () {\r\n forEachValue(this, function () {\r\n this.level = level;\r\n });\r\n });\r\n } else {\r\n data.level = level;\r\n }\r\n }\r\n // Construct the single node in OrgChart or the multiple nodes in family tree\r\n if (Array.isArray(data) && Array.isArray(data[0])) { // 处理family tree的情况\r\n forEachValue(data, function () { // 构造一个家庭的hierarchy\r\n const familyNodes = this;\r\n forEachValue(this, function (i) { // 构造一个夫/妻节点\r\n let spouseNodeElement;\r\n let wrapperElement;\r\n\r\n nodeElement = orgChart.createNode(this);\r\n // if there are only two persons in a marriage, two single nodes will appear in a hierarchy\r\n if (familyNodes.length === 2 && i === 1) {\r\n spouseNodeElement = Array.from(hierarchyElement.querySelectorAll('.node')).find(function (candidateNodeEl) {\r\n return candidateNodeEl.id === familyNodes[0].id;\r\n }) || null;\r\n if (spouseNodeElement && spouseNodeElement.parentElement) {\r\n spouseNodeElement.after(nodeElement);\r\n }\r\n if (this.children && this.children.length && this.children[0].length) {\r\n orgChart.buildInferiorNodes(spouseNodeElement ? spouseNodeElement.parentElement : null, nodeElement, this, level);\r\n }\r\n } else {\r\n // if there are more than two persons in a marriage, every node will be included in a single hierarchy\r\n wrapperElement = getDocument().createElement('li');\r\n wrapperElement.className = `hierarchy${familyNodes.length > 1 ? ' spouse' : ''}${familyNodes.length === 2 ? ' couple' : ''}${!!this.outsider === false && familyNodes.length > 2 ? ' insider' : ''}`;\r\n\r\n //在family tree中,一个多妻/多夫组合里,本姓人只有一个,外姓人可能有多个,我们通过水平的连线来表示他们是一家子\r\n if (i === 0) {\r\n wrapperElement.style.setProperty('--ft-width', '50%');\r\n wrapperElement.style.setProperty('--ft-left-offset', '50%');\r\n } else if (i > 0 && i < familyNodes.length - 1) {\r\n wrapperElement.style.setProperty('--ft-width', '100%');\r\n wrapperElement.style.setProperty('--ft-left-offset', '0px');\r\n } else {\r\n wrapperElement.style.setProperty('--ft-width', '50%');\r\n wrapperElement.style.setProperty('--ft-left-offset', '0px');\r\n }\r\n\r\n wrapperElement.appendChild(nodeElement);\r\n hierarchyElement.appendChild(wrapperElement);\r\n if (this.children && this.children.length && this.children[0].length) {\r\n orgChart.buildInferiorNodes(wrapperElement, nodeElement, this, level);\r\n }\r\n }\r\n });\r\n });\r\n } else {\r\n if (Object.keys(data).length > 2) { // TODO: 应该用更好的方式来判断是否是供父一级节点创建的信息\r\n nodeElement = this.createNode(data);\r\n hierarchyElement.appendChild(nodeElement);\r\n }\r\n if (data.children && data.children.length) {\r\n this.buildInferiorNodes(hierarchyElement, nodeElement || null, data, level);\r\n }\r\n }\r\n },\r\n // build the child nodes of specific node\r\n buildChildNode: function (appendToEl, data) {\r\n const parentHierarchyEl = appendToEl;\r\n const existingChildNodesElement = parentHierarchyEl\r\n ? Array.from(parentHierarchyEl.children || []).find(function (childEl) {\r\n return childEl.classList && childEl.classList.contains('nodes');\r\n }) || null\r\n : null;\r\n const orgChart = this;\r\n\r\n if (!parentHierarchyEl) {\r\n return;\r\n }\r\n\r\n if (!existingChildNodesElement) {\r\n this.buildHierarchy(parentHierarchyEl, { 'children': data });\r\n return;\r\n }\r\n\r\n forEachValue(data, function () {\r\n const childHierarchyElement = getDocument().createElement('li');\r\n\r\n childHierarchyElement.className = 'hierarchy';\r\n existingChildNodesElement.appendChild(childHierarchyElement);\r\n orgChart.buildHierarchy(childHierarchyElement, this);\r\n });\r\n },\r\n // exposed method\r\n addChildren: function (nodeEl, data) {\r\n const nodeElement = getElement(nodeEl);\r\n let titleElement;\r\n let bottomEdgeElement;\r\n\r\n if (!nodeElement) {\r\n return;\r\n }\r\n\r\n this.buildChildNode(nodeElement.closest('.hierarchy'), data);\r\n if (!nodeElement.querySelector('.parentNodeSymbol')) {\r\n titleElement = Array.from(nodeElement.children || []).find(function (childEl) {\r\n return childEl.classList && childEl.classList.contains('title');\r\n }) || null;\r\n if (titleElement) {\r\n titleElement.insertAdjacentHTML('afterbegin', `<i class=\"${this.options.icons.theme} ${this.options.icons.parentNode} parentNodeSymbol\"></i>`);\r\n }\r\n }\r\n if (nodeElement.closest('.nodes.vertical')) {\r\n if (!nodeElement.querySelector(':scope > .toggleBtn')) {\r\n nodeElement.insertAdjacentHTML('beforeend', `<i class=\"toggleBtn ${this.options.icons.theme}\"></i>`);\r\n }\r\n } else if (!nodeElement.querySelector(':scope > .bottomEdge')) {\r\n nodeElement.insertAdjacentHTML('beforeend', `<i class=\"edge verticalEdge bottomEdge ${this.options.icons.theme}\"></i>`);\r\n }\r\n if (this.isInAction(nodeElement)) {\r\n bottomEdgeElement = Array.from(nodeElement.children || []).find(function (childEl) {\r\n return childEl.classList && childEl.classList.contains('bottomEdge');\r\n }) || null;\r\n this.switchVerticalArrow(bottomEdgeElement);\r\n }\r\n },\r\n // build the parent node of specific node\r\n buildParentNode: function (currentRootEl, data) {\r\n const currentRootElement = getElement(currentRootEl);\r\n let currentRootListElement;\r\n let currentRootHierarchyElement;\r\n let parentHierarchyElement;\r\n let newRootWrapperElement;\r\n let newRootHierarchyElement;\r\n let newChildNodesElement;\r\n\r\n if (!currentRootElement) {\r\n return;\r\n }\r\n\r\n data.relationship = data.relationship || '001';\r\n currentRootListElement = currentRootElement.closest('ul');\r\n currentRootHierarchyElement = currentRootElement.closest('.hierarchy');\r\n parentHierarchyElement = currentRootListElement ? currentRootListElement.closest('.hierarchy') : null;\r\n newRootWrapperElement = getDocument().createElement('ul');\r\n newRootWrapperElement.className = 'nodes';\r\n newRootHierarchyElement = getDocument().createElement('li');\r\n newRootHierarchyElement.className = 'hierarchy';\r\n newRootHierarchyElement.appendChild(this.createNode(data));\r\n\r\n if (parentHierarchyElement && currentRootHierarchyElement) {\r\n newChildNodesElement = getDocument().createElement('ul');\r\n newChildNodesElement.className = 'nodes';\r\n newRootHierarchyElement.appendChild(newChildNodesElement);\r\n currentRootListElement.replaceChild(newRootHierarchyElement, currentRootHierarchyElement);\r\n newChildNodesElement.appendChild(currentRootHierarchyElement);\r\n return;\r\n }\r\n\r\n newRootWrapperElement.appendChild(newRootHierarchyElement);\r\n if (this.chart) {\r\n this.chart.prepend(newRootWrapperElement);\r\n }\r\n if (currentRootListElement) {\r\n currentRootListElement.classList.add('nodes');\r\n newRootHierarchyElement.appendChild(currentRootListElement);\r\n }\r\n },\r\n // exposed method\r\n addParent: function (currentRootEl, data) {\r\n const currentRootElement = getElement(currentRootEl);\r\n let titleElement;\r\n let topEdgeElement;\r\n\r\n if (!currentRootElement) {\r\n return;\r\n }\r\n\r\n this.buildParentNode(currentRootElement, data);\r\n if (!currentRootElement.querySelector(':scope > .topEdge')) {\r\n titleElement = Array.from(currentRootElement.children || []).find(function (childEl) {\r\n return childEl.classList && childEl.classList.contains('title');\r\n }) || null;\r\n if (titleElement) {\r\n titleElement.insertAdjacentHTML('afterend', `<i class=\"edge verticalEdge topEdge ${this.options.icons.theme}\"></i>`);\r\n }\r\n }\r\n if (this.isInAction(currentRootElement)) {\r\n topEdgeElement = Array.from(currentRootElement.children || []).find(function (childEl) {\r\n return childEl.classList && childEl.classList.contains('topEdge');\r\n }) || null;\r\n this.switchVerticalArrow(topEdgeElement);\r\n }\r\n },\r\n // build the sibling nodes of specific node\r\n buildSiblingNode: function (nodeChartEl, data) {\r\n const nodeChartElement = getElement(nodeChartEl);\r\n let nodeChartParentElement;\r\n let newSiblingCount;\r\n let existingSiblingCount;\r\n let siblingCount;\r\n let insertPosition;\r\n let ancestorNodesElement;\r\n let parentHierarchyElement;\r\n let newSiblingContainerElement;\r\n let newSiblingHierarchyElements;\r\n let existingHierarchyElements;\r\n let newParentHierarchyElement;\r\n let newParentChildrenContainerElement;\r\n let insertAnchorElement;\r\n const removeIfEmpty = function (containerElement) {\r\n if (containerElement && !containerElement.children.length) {\r\n containerElement.remove();\r\n }\r\n };\r\n const getHierarchyChildren = function (containerElement) {\r\n return containerElement\r\n ? Array.from(containerElement.children).filter(function (childEl) {\r\n return childEl.classList && childEl.classList.contains('hierarchy');\r\n })\r\n : [];\r\n };\r\n const getLastNodesChild = function (containerElement) {\r\n let childElement;\r\n\r\n if (!containerElement) {\r\n return null;\r\n }\r\n\r\n childElement = containerElement.lastElementChild;\r\n while (childElement) {\r\n if (childElement.classList && childElement.classList.contains('nodes')) {\r\n return childElement;\r\n }\r\n childElement = childElement.previousElementSibling;\r\n }\r\n\r\n return null;\r\n };\r\n\r\n if (!nodeChartElement) {\r\n return;\r\n }\r\n\r\n nodeChartParentElement = nodeChartElement.parentElement;\r\n newSiblingCount = Array.isArray(data) ? data.length : data.children.length;\r\n existingSiblingCount = nodeChartParentElement && nodeChartParentElement.classList && nodeChartParentElement.classList.contains('nodes')\r\n ? getHierarchyChildren(nodeChartParentElement).length\r\n : 1;\r\n siblingCount = existingSiblingCount + newSiblingCount;\r\n insertPosition = (siblingCount > 1) ? Math.floor(siblingCount / 2 - 1) : 0;\r\n // just build the sibling nodes for the specific node\r\n ancestorNodesElement = nodeChartElement.closest('.nodes');\r\n if (ancestorNodesElement && ancestorNodesElement.parentElement && ancestorNodesElement.parentElement.classList && ancestorNodesElement.parentElement.classList.contains('hierarchy')) {\r\n parentHierarchyElement = nodeChartParentElement ? nodeChartParentElement.closest('.hierarchy') : null;\r\n this.buildChildNode(parentHierarchyElement, data);\r\n newSiblingContainerElement = getLastNodesChild(parentHierarchyElement);\r\n newSiblingHierarchyElements = getHierarchyChildren(newSiblingContainerElement);\r\n if (existingSiblingCount > 1 && newSiblingContainerElement !== nodeChartParentElement) {\r\n existingHierarchyElements = getHierarchyChildren(nodeChartParentElement);\r\n existingHierarchyElements.forEach(function (existingSiblingEl) {\r\n if (newSiblingHierarchyElements[0] && newSiblingHierarchyElements[0].parentElement) {\r\n newSiblingHierarchyElements[0].parentElement.insertBefore(existingSiblingEl, newSiblingHierarchyElements[0]);\r\n }\r\n });\r\n removeIfEmpty(nodeChartParentElement);\r\n } else if (newSiblingContainerElement !== nodeChartParentElement) {\r\n insertAnchorElement = newSiblingHierarchyElements[insertPosition] || null;\r\n if (insertAnchorElement && insertAnchorElement.parentElement) {\r\n insertAnchorElement.parentElement.insertBefore(nodeChartElement, insertAnchorElement.nextSibling);\r\n }\r\n removeIfEmpty(nodeChartParentElement);\r\n }\r\n } else { // build the sibling nodes and parent node for the specific ndoe\r\n newParentHierarchyElement = getDocument().createElement('li');\r\n newParentHierarchyElement.className = 'hierarchy';\r\n if (nodeChartParentElement) {\r\n nodeChartParentElement.insertBefore(newParentHierarchyElement, nodeChartParentElement.firstChild);\r\n }\r\n this.buildHierarchy(newParentHierarchyElement, data);\r\n newParentChildrenContainerElement = getLastNodesChild(newParentHierarchyElement);\r\n insertAnchorElement = newParentChildrenContainerElement\r\n ? getHierarchyChildren(newParentChildrenContainerElement)[insertPosition] || null\r\n : null;\r\n if (insertAnchorElement && insertAnchorElement.parentElement) {\r\n insertAnchorElement.parentElement.insertBefore(nodeChartElement, insertAnchorElement.nextSibling);\r\n }\r\n }\r\n },\r\n //\r\n addSiblings: function (nodeEl, data) {\r\n const nodeElement = getElement(nodeEl);\r\n let nodesContainerElement;\r\n let topEdgeElement;\r\n\r\n if (!nodeElement) {\r\n return;\r\n }\r\n\r\n this.buildSiblingNode(nodeElement.closest('.hierarchy'), data);\r\n nodesContainerElement = nodeElement.closest('.nodes');\r\n if (nodesContainerElement) {\r\n setState(nodesContainerElement, 'siblingsLoaded', true);\r\n }\r\n if (!Array.from(nodeElement.children || []).some(function (childEl) {\r\n return childEl.classList && childEl.classList.contains('leftEdge');\r\n })) {\r\n topEdgeElement = Array.from(nodeElement.children || []).find(function (childEl) {\r\n return childEl.classList && childEl.classList.contains('topEdge');\r\n }) || null;\r\n if (topEdgeElement) {\r\n topEdgeElement.insertAdjacentHTML('afterend', `<i class=\"edge horizontalEdge rightEdge ${this.options.icons.theme}\"></i><i class=\"edge horizontalEdge leftEdge ${this.options.icons.theme}\"></i>`);\r\n }\r\n }\r\n if (this.isInAction(nodeElement)) {\r\n this.switchHorizontalArrow(nodeElement);\r\n topEdgeElement = Array.from(nodeElement.children || []).find(function (childEl) {\r\n return childEl.classList && childEl.classList.contains('topEdge');\r\n }) || null;\r\n if (topEdgeElement && topEdgeElement.classList) {\r\n topEdgeElement.classList.remove(this.options.icons.expandToUp);\r\n topEdgeElement.classList.add(this.options.icons.collapseToDown);\r\n }\r\n }\r\n },\r\n // remove node and its descendent nodes\r\n removeNodes: function (nodeEl) {\r\n const nodeElement = getElement(nodeEl);\r\n let hierarchyElement;\r\n let wrapperElement;\r\n let remainingNodeElement;\r\n let parentNodeElement;\r\n\r\n if (!nodeElement) {\r\n return;\r\n }\r\n\r\n hierarchyElement = nodeElement.closest('.hierarchy');\r\n wrapperElement = hierarchyElement ? hierarchyElement.parentElement : null;\r\n\r\n if (!wrapperElement) {\r\n return;\r\n }\r\n\r\n if (wrapperElement.parentElement && wrapperElement.parentElement.classList && wrapperElement.parentElement.classList.contains('hierarchy')) {\r\n if (this.getNodeState(nodeElement, 'siblings').exist) {\r\n hierarchyElement.remove();\r\n if (wrapperElement.children.length === 1) {\r\n remainingNodeElement = wrapperElement.querySelector('.node');\r\n if (remainingNodeElement) {\r\n Array.from(remainingNodeElement.querySelectorAll('.horizontalEdge')).forEach(function (edgeEl) {\r\n edgeEl.remove();\r\n });\r\n }\r\n }\r\n } else {\r\n parentNodeElement = wrapperElement.parentElement.querySelector(':scope > .node');\r\n if (parentNodeElement) {\r\n Array.from(parentNodeElement.querySelectorAll('.bottomEdge, .parentNodeSymbol')).forEach(function (edgeEl) {\r\n edgeEl.remove();\r\n });\r\n }\r\n wrapperElement.remove();\r\n }\r\n } else { // if $node is root node\r\n const chartElement = wrapperElement.closest('.orgchart');\r\n if (chartElement) {\r\n chartElement.remove();\r\n }\r\n }\r\n },\r\n //\r\n hideDropZones: function () {\r\n const chartElement = this.chart;\r\n\r\n if (!chartElement) {\r\n return;\r\n }\r\n\r\n // Remove all the 'this is a drop zone' indicators\r\n Array.from(chartElement.querySelectorAll('.allowedDrop')).forEach(function (node) {\r\n node.classList.remove('allowedDrop');\r\n });\r\n },\r\n //\r\n showDropZones: function (draggedEl) {\r\n // Highlight all the 'drop zones', and set dragged, so that the drop/enter can work out what happens later\r\n // TODO: This assumes all nodes are droppable: it doesn't run the custom isDroppable function - it should!\r\n const draggedNodeEl = getElement(draggedEl);\r\n const chartElement = this.chart;\r\n\r\n if (!chartElement) {\r\n return;\r\n }\r\n\r\n Array.from(chartElement.querySelectorAll('.node')).forEach(function (node) {\r\n node.classList.add('allowedDrop');\r\n });\r\n setState(chartElement, 'dragged', draggedNodeEl);\r\n },\r\n //\r\n processExternalDrop: function (dropTargetEl, draggedEl) {\r\n const dropZoneEl = getElement(dropTargetEl);\r\n const droppedOnNodeEl = dropZoneEl && typeof dropZoneEl.closest === 'function'\r\n ? dropZoneEl.closest('.node')\r\n : null;\r\n let draggedNodeEl;\r\n const chartElement = this.chart;\r\n\r\n // Allow an external drop event to be handled by one of our nodes\r\n if (draggedEl && chartElement) {\r\n draggedNodeEl = getElement(draggedEl);\r\n setState(chartElement, 'dragged', draggedNodeEl);\r\n }\r\n if (!droppedOnNodeEl) {\r\n return;\r\n }\r\n // would like to just call 'dropZoneHandler', but I can't reach it from here\r\n // instead raise a drop event on the node element\r\n droppedOnNodeEl.dispatchEvent(createTriggeredEvent('drop'));\r\n },\r\n //\r\n exportPDF: function(canvas, exportFilename, exportScale){\r\n let doc = {};\r\n const scale = exportScale > 0 ? exportScale : 1;\r\n const docWidth = Math.floor(canvas.width / scale);\r\n const docHeight = Math.floor(canvas.height / scale);\r\n if (!getWindow().jsPDF) {\r\n getWindow().jsPDF = getWindow().jspdf.jsPDF;\r\n }\r\n\r\n if (docWidth > docHeight) {\r\n doc = new jsPDF({\r\n orientation: 'landscape',\r\n unit: 'px',\r\n format: [docWidth, docHeight]\r\n });\r\n } else {\r\n doc = new jsPDF({\r\n orientation: 'portrait',\r\n unit: 'px',\r\n format: [docHeight, docWidth]\r\n });\r\n }\r\n doc.addImage(canvas.toDataURL(), 'png', 0, 0, docWidth, docHeight);\r\n doc.save(exportFilename + '.pdf');\r\n },\r\n //\r\n exportPNG: function(canvas, exportFilename){\r\n const isWebkit = 'WebkitAppearance' in getDocument().documentElement.style;\r\n const isFf = !!getWindow().sidebar;\r\n const navigatorObject = getWindow().navigator;\r\n const isEdge = navigatorObject.appName === 'Microsoft Internet Explorer' || (navigatorObject.appName === 'Netscape' && navigatorObject.appVersion.indexOf('Edge') > -1);\r\n const chartContainerElement = this.chartContainer;\r\n let downloadButtonClassName;\r\n let downloadSelector;\r\n let downloadAnchorElement;\r\n\r\n if (!chartContainerElement) {\r\n return;\r\n }\r\n\r\n if ((!isWebkit && !isFf) || isEdge) {\r\n getWindow().navigator.msSaveBlob(canvas.msToBlob(), exportFilename + '.png');\r\n } else {\r\n downloadButtonClassName = 'download-btn' + (this.options.chartClass !== '' ? ' ' + this.options.chartClass : '');\r\n downloadSelector = '.download-btn' + (this.options.chartClass !== '' ? '.' + this.options.chartClass : '');\r\n downloadAnchorElement = chartContainerElement.querySelector(downloadSelector);\r\n\r\n if (!downloadAnchorElement) {\r\n downloadAnchorElement = getDocument().createElement('a');\r\n downloadAnchorElement.className = downloadButtonClassName;\r\n chartContainerElement.appendChild(downloadAnchorElement);\r\n }\r\n\r\n downloadAnchorElement.setAttribute('download', exportFilename + '.png');\r\n downloadAnchorElement.setAttribute('href', canvas.toDataURL());\r\n downloadAnchorElement.click();\r\n }\r\n },\r\n //\r\n export: function (exportFilename, exportFileextension) {\r\n const orgChart = this;\r\n const chartContainerElement = this.chartContainer;\r\n let maskElement;\r\n let sourceChartElement;\r\n let isHorizontalDirection;\r\n let exportScale;\r\n\r\n exportFilename = (typeof exportFilename !== 'undefined') ? exportFilename : this.options.exportFilename;\r\n exportFileextension = (typeof exportFileextension !== 'undefined') ? exportFileextension : this.options.exportFileextension;\r\n if (chartContainerElement && chartContainerElement.querySelector('.spinner')) {\r\n return false;\r\n }\r\n\r\n if (!chartContainerElement) {\r\n return false;\r\n }\r\n\r\n maskElement = chartContainerElement.querySelector('.mask');\r\n if (!maskElement) {\r\n maskElement = getDocument().createElement('div');\r\n maskElement.className = 'mask';\r\n maskElement.insertAdjacentHTML('beforeend', `<i class=\"${this.options.icons.theme} ${this.options.icons.spinner} spinner\"></i>`);\r\n chartContainerElement.appendChild(maskElement);\r\n } else {\r\n maskElement.classList.remove('hidden');\r\n }\r\n chartContainerElement.classList.add('canvasContainer');\r\n sourceChartElement = Array.from(chartContainerElement.querySelectorAll('.orgchart')).find(function (chartEl) {\r\n return !chartEl.classList.contains('hidden');\r\n }) || null;\r\n isHorizontalDirection = orgChart.options.direction === 'l2r' || orgChart.options.direction === 'r2l';\r\n exportScale = orgChart.options.exportScale > 0 ? orgChart.options.exportScale : 1;\r\n html2canvas(sourceChartElement, {\r\n 'width': isHorizontalDirection ? sourceChartElement.clientHeight : sourceChartElement.clientWidth,\r\n 'height': isHorizontalDirection ? sourceChartElement.clientWidth : sourceChartElement.clientHeight,\r\n 'scale': exportScale,\r\n 'useCORS': true,\r\n 'onclone': function (cloneDoc) {\r\n const clonedContainerElement = cloneDoc.querySelector('.canvasContainer');\r\n let clonedChartElement;\r\n\r\n if (!clonedContainerElement) {\r\n return;\r\n }\r\n\r\n clonedContainerElement.style.overflow = 'visible';\r\n clonedChartElement = Array.from(clonedContainerElement.querySelectorAll('.orgchart')).find(function (chartEl) {\r\n return !chartEl.classList.contains('hidden');\r\n }) || null;\r\n if (clonedChartElement) {\r\n clonedChartElement.style.transform = '';\r\n }\r\n }\r\n })\r\n .then(function (canvas) {\r\n if (maskElement) {\r\n maskElement.classList.add('hidden');\r\n }\r\n\r\n if (exportFileextension.toLowerCase() === 'pdf') {\r\n orgChart.exportPDF(canvas, exportFilename, exportScale);\r\n } else {\r\n orgChart.exportPNG(canvas, exportFilename);\r\n }\r\n\r\n chartContainerElement.classList.remove('canvasContainer');\r\n }, function () {\r\n chartContainerElement.classList.remove('canvasContainer');\r\n });\r\n }\r\n };\r\n\r\n return OrgChart;\r\n}));\r\n"],"names":["factory","module","exports","window","document","OrgChart","undefined","elementDataStore","WeakMap","getWindow","globalThis","getDocument","currentWindow","isNode","value","nodeType","isNodeList","length","isHtmlString","trim","startsWith","endsWith","unique","Array","from","Set","elements","filter","Boolean","getElement","input","context","normalizeInput","getElements","mergeObjects","Object","assign","apply","concat","arguments","forEachValue","collection","callback","isArray","let","index","call","keys","some","key","parseSelector","selector","normalizedSelector","replace","meta","first","last","gt","hidden","visible","_","Number","isVisibleElement","element","style","getComputedStyle","display","visibility","filterBySelector","filtered","matchesSelector","matches","error","slice","createNodesFromHtml","html","template","createElement","innerHTML","content","childNodes","toDataKey","String","letter","toUpperCase","getStoredState","has","set","get","setState","getState","store","normalizedKey","prototype","hasOwnProperty","currentDocument","selected","flatMap","item","parents","parent","querySelectorAll","createTriggeredEvent","eventLike","extraData","type","event","bubbles","cancelable","detail","originalEvent","data","delegateTarget","clampValue","min","max","Math","isTransparentColor","colorValue","normalizedColor","toLowerCase","getMinimapNodeColor","nodeElement","titleElement","querySelector","primaryColor","backgroundColor","secondaryColorCandidates","borderTopColor","borderRightColor","borderBottomColor","borderLeftColor","find","color","rgbaMatch","exec","channelValues","split","map","round","parseFloat","isNaN","join","getChartTransform","chartElement","matrixValues","currentScale","currentTranslateX","currentTranslateY","currentTransform","transform","indexOf","abs","scale","translateX","translateY","elem","opts","this","toString","chartContainer","container","chart","defaultOptions","icons","theme","parentNode","expandToUp","collapseToDown","collapseToLeft","expandToRight","backToCompact","backToLoose","collapsed","expanded","spinner","nodeTitle","nodeId","toggleSiblingsResp","visibleLevel","chartClass","exportButton","exportButtonName","exportFilename","exportFileextension","exportScale","draggable","direction","pan","minimap","zoom","zoominLimit","zoomoutLimit","init","defineProperty","options","rootHierarchyElement","chartContainerElement","rootElement","detachMinimap","remove","rootNodesContainerElement","isListElementData","className","addEventListener","clickTargetElement","target","closest","forEach","focusedNodeEl","classList","MutationObserver","triggerInitEvent","tagName","appendChild","buildHierarchy","buildJsonDS","firstElementChild","relationship","attachRel","attachExportButton","bindPan","bindZoom","attachMinimap","handleCompactNodes","compactNodeEl","compactAncestorCount","currentAncestorElement","parentElement","contains","add","orgChart","mo","mutations","disconnect","initTime","i","j","addedNodes","initCompleted","dispatchEvent","observe","childList","triggerShowEvent","targetEl","rel","triggerHideEvent","exportButtonElement","textContent","preventDefault","export","insertAdjacentElement","setOptions","val","unbindPan","unbindZoom","minimapElement","minimapStageElement","minimapContentElement","minimapViewportElement","minimapWheelBoundHandler","minimapMutationObserver","position","minimapPointerDownBoundHandler","minimapStartHandler","minimapWheelHandler","updateMinimap","subtree","attributes","attributeFilter","minimapMoveBoundHandler","minimapEndBoundHandler","removeEventListener","setChartScale","deltaY","x","getBoundingClientRect","left","clientWidth","y","top","clientHeight","minimapMoveHandler","bind","minimapEndHandler","viewportRect","startClientX","clientX","startClientY","clientY","startLeft","startTop","viewportWidth","width","viewportHeight","height","dragState","stageRect","moveChartFromMinimap","stageLeft","stageTop","minimapScale","minimapOffsetX","minimapOffsetY","minimapContentWidth","minimapContentHeight","chartTransform","chartRect","containerRect","localViewportHeight","localLeft","localTop","baseLeft","baseTop","transformOrigin","forceRefresh","contentHeight","contentWidth","scrollWidth","offsetWidth","scrollHeight","offsetHeight","stageWidth","stageHeight","renderMinimapNodes","chartScale","fragment","createDocumentFragment","nodeRect","minimapNodeElement","nodeTop","MINIMAP_NODE_HEIGHT","viewportLeft","viewportTop","panStartHandler","e","nativeEvent","currentTarget","temp","targetElement","touches","cursor","lastX","lastY","lastTf","parseInt","startX","startY","targetTouches","pageX","pageY","existingPanMoveHandler","panMoveHandler","matrix","newX","newY","panEndHandler","panEndBoundHandler","overflow","panStartBoundHandler","zoomWheelHandler","chartContainerRect","hasPointerPosition","zoomAnchor","right","bottom","newScale","zoomStartHandler","dist","getPinchDist","pinchCenter","getPinchCenter","zoomingHandler","zoomEndHandler","diff","zoomWheelBoundHandler","zoomStartBoundHandler","zoomingBoundHandler","zoomEndBoundHandler","sqrt","chartEl","localAnchorX","localAnchorY","targetTranslateX","targetTranslateY","targetScale","anchorX","anchorY","liEl","liElement","jsonNodeData","childListElement","children","childEl","name","siblingEl","dataset","push","flags","compact","constructor","Function","hybrid","vertical","associatedCompact","loopChart","includeNodeData","hierarchyNodeData","id","childNodesContainerElement","getHierarchy","nodeElements","nodeEl","getNodeState","relation","relatedElement","siblingElements","isVerticalNode","previousElementSibling","exist","getParent","getRelatedNodes","getChildren","getSiblings","hierarchyEl","nodesContainerEl","childHierarchyEl","siblingHierarchyEl","hideParentEnd","animatedNodeElement","animatedNode","hideParent","hierarchyElement","parentEl","hideSiblings","once","showParentEnd","node","isInAction","topEdgeElement","switchVerticalArrow","showParent","repaint","stopAjax","nodeLevelEl","nodeLevelElement","isVisibleNode","isCompactDescendant","hideChildrenEnd","animatedNodes","animatedNodeEl","lowerNodesElement","bottomEdgeElement","hideChildren","lowerLevelElement","animatedNodeElements","visibleNodeEl","animatedHierarchyElement","expandedIconEl","showChildrenEnd","showChildren","levelsElement","isVerticalDesc","hideSiblingsEnd","nodeContainerElement","nodeContainer","currentSiblingElement","nextElementSibling","siblingElement","siblingNodeEl","descendantEl","switchHorizontalArrow","siblingContainerElements","siblingContainerEl","currentPreviousSiblingElement","currentNextSiblingElement","siblingAnimatedNodeElements","compareDocumentPosition","Node","DOCUMENT_POSITION_FOLLOWING","showSiblingsEnd","visibleNodes","showRelatedParentEnd","showSiblings","upperLevelElement","visibleNodeElements","parentNodesContainerElement","startLoading","edgeEl","edgeElement","spinnerElement","insertAdjacentHTML","opacity","exportButtonEl","disabled","endLoading","spinnerEl","removeAttribute","edgeClassName","icon","arrowEl","arrowElement","toggle","leftEdgeElement","sibsVisible","siblingsContainerElement","rightEdgeElement","ajaxURL","previousSiblingElement","nextSiblingElement","nodeEnterLeaveHandler","eventType","childElements","toggleBtnElement","isExpanded","nodeClickHandler","focusedEl","addAncestors","parentId","ancestorWrapperElement","targetParentNodeElement","originalRootChildren","insertBefore","targetSiblingsContainerElement","getElementById","addDescendants","descendantsElement","after","descendantHierarchyElement","HideFirstParentEnd","topEdge","topEdgeClickHandler","edge","parentSliding","parentHiding","parentState","transitionEvent","bottomEdgeClickHandler","childrenState","childNodeElements","childNodeEl","hEdgeClickHandler","siblingsState","backToCompactHandler","compactNode","nestedLooseModeEl","nestedBackToCompactSymbolElement","nestedBackToLooseSymbolElement","backToCompactSymbolElement","backToLooseSymbolElement","backToLooseHandler","expandVNodesEnd","vNodes","verticalNodeEl","collapseVNodesEnd","verticalNodesWrapperElement","toggleVNodes","toggleBtnEl","toggleButton","descendantWrapperElement","descendantNodeElements","descendantNodeEl","nestedToggleBtnEl","createGhostNode","ghostNodeImageEl","sourceNodeEl","sourceNode","isFirefox","test","navigator","userAgent","ghostNodeEl","nodeCoverEl","createElementNS","sourceRect","transformValues","isVerticalChartDirection","scaleFactor","setAttribute","xOffset","origEvent","offsetX","yOffset","offsetY","src","XMLSerializer","serializeToString","dataTransfer","setDragImage","getUpperLevel","currentElement","levelCount","getLowerLevel","currentLevelNodes","nextLevelNodes","getLevelOrderNodes","rootEl","pendingNodeElements","nodesByLevel","levelNodeElements","levelNodeCount","currentNodeElement","shift","filterAllowedDropNodes","draggedEl","draggedNodeEl","draggedSubtreeNodeEls","draggedParentNodeEl","excludedNodeEls","draggingNode","draggableHostEl","dropCriteria","dragstartHandler","draggedNode","transformValue","setData","dragoverHandler","dropZoneEl","dropZone","dropEffect","dragendHandler","dropHandler","async","datasource","dropSiblingNodeEls","titleEl","remainingNodeEl","chartOptions","dropChildrenContainerEl","draggedHierarchyEl","dropEvent","defaultPrevented","isDefaultPrevented","triggeredDropEvent","dragZone","hybridNodeData","dataDigger","JSONDigger","findOneNode","verticalLevel","draggedNodeData","findNodeById","draggedNodeCopy","removeNode","dropNodeData","horizontalEdges","remainingHierarchyEls","draggedParentChildrenContainerEl","draggedItem","touchstartHandler","touchHandled","touchMoved","touchmoveHandler","cachedDraggedNodeEl","touchDragImage","createDragImage","moveDragImage","candidateDropNodeEl","touchedElement","elementFromPoint","touchTargetNode","touchendHandler","syntheticDropEvent","destroyDragImage","firstTouch","changedTouches","fakeMouseClickEvent","view","screenX","screenY","ctrlKey","altKey","shiftKey","metaKey","button","sourceEl","dragImageEl","cloneNode","copyStyle","sourcePoint","getTouchPoint","touchDragImageOffset","body","removeChild","attributeName","HTMLCanvasElement","targetCanvas","sourceCanvas","getContext","drawImage","computedStyle","pointerEvents","orgChartMaster","requestAnimationFrame","touchPoint","dragImageStyle","zIndex","bindDragDrop","createNode","level","nodeClassName","outsider","titleMarkupParts","contentMarkupParts","nodeMarkupParts","shouldAddParentSymbol","substr","child","nodeTemplate","nodeContent","routeNodeClick","handler","matchedElement","storedNodeData","__ocNodeData","gridTemplateColumns","floor","buildInferiorNodes","isHidden","nodesLayerElement","nodeCellElement","familyNodes","wrapperElement","spouseNodeElement","candidateNodeEl","setProperty","buildChildNode","appendToEl","existingChildNodesElement","parentHierarchyEl","childHierarchyElement","addChildren","buildParentNode","currentRootEl","currentRootListElement","parentHierarchyElement","newRootWrapperElement","newRootHierarchyElement","currentRootElement","currentRootHierarchyElement","newChildNodesElement","replaceChild","prepend","addParent","buildSiblingNode","nodeChartEl","nodeChartParentElement","insertPosition","newParentHierarchyElement","newParentChildrenContainerElement","nodeChartElement","newSiblingHierarchyElements","insertAnchorElement","removeIfEmpty","containerElement","getHierarchyChildren","getLastNodesChild","childElement","lastElementChild","newSiblingCount","siblingCount","existingSiblingCount","ancestorNodesElement","newSiblingContainerElement","existingSiblingEl","nextSibling","firstChild","addSiblings","nodesContainerElement","removeNodes","remainingNodeElement","parentNodeElement","hideDropZones","showDropZones","processExternalDrop","dropTargetEl","droppedOnNodeEl","exportPDF","canvas","doc","docWidth","docHeight","jsPDF","jspdf","orientation","unit","format","addImage","toDataURL","save","exportPNG","isWebkit","documentElement","isFf","sidebar","navigatorObject","isEdge","appName","appVersion","downloadAnchorElement","msSaveBlob","msToBlob","downloadButtonClassName","downloadSelector","click","maskElement","sourceChartElement","isHorizontalDirection","html2canvas","useCORS","onclone","cloneDoc","clonedContainerElement","clonedChartElement","then"],"mappings":"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"}
|