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