orgchart 5.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.
- package/.github/workflows/publish.yml +35 -0
- package/README.md +214 -123
- package/README.zh-cn.md +232 -100
- package/README.zh-tw.md +232 -100
- package/bower.json +6 -9
- package/demo/10000-nodes.html +139 -0
- package/demo/ajax-datasource.html +46 -45
- package/demo/bottom2top.html +12 -9
- package/demo/center-on-selected-node.html +21 -17
- package/demo/color-coded.html +12 -9
- package/demo/css/style.css +28 -0
- package/demo/custom-icons.html +12 -9
- package/demo/custom-template.html +12 -9
- package/demo/data-prop-compact.html +11 -8
- package/demo/data-prop-hybrid.html +79 -50
- package/demo/default-collapsed.html +12 -9
- package/demo/drag-drop-hybrid-chart.html +17 -14
- package/demo/drag-drop.html +21 -16
- package/demo/edit-chart.html +144 -94
- package/demo/edit-hybrid-chart.html +177 -135
- package/demo/expand-to-given-depth.html +30 -22
- package/demo/export-chart-pdf.html +12 -9
- package/demo/export-chart-with-pictures.html +19 -12
- package/demo/export-chart.html +12 -9
- package/demo/family-tree.html +14 -11
- package/demo/familytree-custom-properties.html +108 -0
- package/demo/filter-node.html +104 -57
- package/demo/get-hierarchy.html +17 -12
- package/demo/get-related-nodes.html +27 -17
- package/demo/index.html +10 -3
- package/demo/integrate-map.html +32 -27
- package/demo/left2right.html +12 -9
- package/demo/level-offset.html +16 -15
- package/demo/link-node.html +12 -9
- package/demo/local-datasource.html +11 -8
- package/demo/minimap.html +224 -0
- package/demo/nodes-of-different-widths.html +11 -8
- package/demo/ondemand-loading-data.html +166 -112
- package/demo/option-createNode.html +28 -17
- package/demo/options-compact-drag.html +82 -0
- package/demo/options-export-navigation.html +76 -0
- package/demo/options-horizontal-template.html +80 -0
- package/demo/options-hybrid-navigation.html +71 -0
- package/demo/pan-zoom.html +20 -11
- package/demo/reload-data.html +17 -14
- package/demo/report-path.html +59 -29
- package/demo/responsive-design.html +14 -11
- package/demo/right2left.html +12 -9
- package/demo/toggle-sibs-resp.html +12 -9
- package/demo/ul-datasource.html +11 -8
- package/demo/vertical-level.html +12 -9
- package/dist/css/{jquery.orgchart.css → orgchart.css} +154 -80
- package/dist/css/orgchart.min.css +1 -0
- package/dist/js/orgchart.js +4474 -0
- package/dist/js/orgchart.min.js +2 -0
- package/dist/js/orgchart.min.js.map +1 -0
- package/gulpfile.js +42 -27
- package/package.json +33 -32
- package/src/css/{jquery.orgchart.css → orgchart.css} +154 -80
- package/src/js/orgchart.js +4474 -0
- package/test/compatibility/README.md +123 -0
- package/test/compatibility/browser.tests.js +1279 -0
- package/test/compatibility/options.tests.js +628 -0
- package/test/cypress/e2e/demo-interactions.cy.js +91 -0
- package/test/cypress/e2e/demo-rendering.cy.js +161 -0
- package/test/cypress/e2e/drag-drop-hybrid-chart.cy.js +23 -0
- package/test/cypress/e2e/edit-chart.cy.js +20 -0
- package/test/cypress/e2e/level-offset.cy.js +21 -0
- package/test/cypress/e2e/local-datasource.cy.js +16 -16
- package/test/cypress/e2e/minimap.cy.js +66 -0
- package/test/cypress/e2e/ondemand-loading-data.cy.js +34 -10
- package/test/cypress/e2e/pan-zoom.cy.js +165 -0
- package/test/cypress/e2e/report-path.cy.js +20 -0
- package/test/cypress/e2e/toggle-sibs-resp.cy.js +4 -4
- package/test/cypress/e2e/vertical-vevel.cy.js +7 -5
- package/test/e2e/local-datasource/test.js +1 -1
- package/test/integration/init-tests.js +192 -99
- package/test/integration/tests.js +1043 -57
- package/test/unit/lifecycle-builders-export.tests.js +1487 -0
- package/test/unit/minimap.tests.js +210 -0
- package/test/unit/tests.js +2372 -253
- package/dist/css/jquery.orgchart.min.css +0 -1
- package/dist/js/jquery.orgchart.js +0 -1741
- package/dist/js/jquery.orgchart.min.js +0 -5
- package/dist/js/jquery.orgchart.min.js.map +0 -1
- package/src/js/jquery.orgchart.js +0 -1741
|
@@ -0,0 +1 @@
|
|
|
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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"}
|