UNPKG

orgchart

Version:

Simple and direct organization chart(tree-like hierarchy) library based on pure DOM.

133 lines (125 loc) 5.11 kB
<!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8"> <title>OrgChart Report Path Demo</title> <link rel="icon" href="img/logo.png"> <link rel="stylesheet" href="css/orgchart.css"> <link rel="stylesheet" href="css/style.css"> <style type="text/css"> #edit-panel { margin: 0.5rem; padding: 0.5rem; text-align: center; border: 1px solid #aaa; } #edit-panel * { font-size: 1rem; } button, input { padding: 0.5rem 1rem; } </style> </head> <body> <section class="demo-notes"> <h1>Report Path Demo</h1> <p>This demo lets you select a node and then draw the reporting path back through its management chain.</p> </section> <div id="chart-container"></div> <div id="edit-panel" class="view-state"> <input type="text" id="selected-node" placeholder="please select node" readonly="true"> <button type="button" id="btn-report-path">draw report path</button> <button type="button" id="btn-reset">reset</button> </div> <script type="text/javascript" src="js/orgchart.js"></script> <script type="text/javascript"> document.addEventListener('DOMContentLoaded', () => { const chartContainer = document.getElementById('chart-container'); const selectedNodeInput = document.getElementById('selected-node'); const reportButton = document.getElementById('btn-report-path'); const resetButton = document.getElementById('btn-reset'); const datasource = { 'name': 'Lao Lao', 'title': 'general manager', 'children': [ { 'name': 'Bo Miao', 'title': 'department manager', 'children': [ { 'name': 'Li Jing', 'title': 'senior engineer' }, { 'name': 'Li Xin', 'title': 'senior engineer', 'children': [ { 'name': 'To To', 'title': 'engineer' }, { 'name': 'Fei Fei', 'title': 'engineer' }, { 'name': 'Xuan Xuan', 'title': 'engineer' } ] } ] }, { 'name': 'Su Miao', 'title': 'department manager', 'children': [ { 'name': 'Pang Pang', 'title': 'senior engineer' }, { 'name': 'Hei Hei', 'title': 'senior engineer', 'children': [ { 'name': 'Xiang Xiang', 'title': 'UE engineer' }, { 'name': 'Dan Dan', 'title': 'engineer' }, { 'name': 'Zai Zai', 'title': 'engineer' } ] } ] } ] }; const oc = new OrgChart({ chartContainer: '#chart-container', 'data' : datasource, 'nodeContent': 'title' }); chartContainer.addEventListener('click', (event) => { const clickedNode = event.target.closest('.node'); if (!clickedNode || !chartContainer.contains(clickedNode)) { return; } const titleElement = clickedNode.querySelector('.title'); selectedNodeInput.value = titleElement ? titleElement.textContent.trim() : ''; }); reportButton.addEventListener('click', () => { const selected = chartContainer.querySelector('.node.focused'); const selectedNodeName = selectedNodeInput.value; if (selected) { let hierarchy = selected.closest('.hierarchy'); while (hierarchy) { const parentNodes = hierarchy.parentElement; const parentHierarchy = parentNodes ? parentNodes.closest('.hierarchy') : null; if (!parentHierarchy) { break; } const superior = parentHierarchy.querySelector(':scope > .node'); const horizontalEdge = superior ? superior.querySelector('.horizontalEdge') : null; const hasHiddenSibling = Array.from(parentHierarchy.parentElement.children) .some((sibling) => sibling !== parentHierarchy && sibling.classList.contains('hidden')); if (horizontalEdge && !hasHiddenSibling) { horizontalEdge.dispatchEvent(new MouseEvent('click', { bubbles: true })); } hierarchy = parentHierarchy; } chartContainer.querySelectorAll('.node.focused').forEach((node) => { node.classList.remove('focused'); }); selected.classList.add('focused'); selectedNodeInput.value = selectedNodeName; reportButton.disabled = true; } else { alert('please select the node firstly'); } }); resetButton.addEventListener('click', () => { chartContainer.querySelectorAll('.hidden').forEach((element) => element.classList.remove('hidden')); chartContainer.querySelectorAll('.slide-up, .slide-right, .slide-left, .focused').forEach((element) => { element.classList.remove('slide-up', 'slide-right', 'slide-left', 'focused'); }); chartContainer.querySelectorAll('.isCollapsedSibling, .isChildrenCollapsed, .isSiblingsCollapsed').forEach((element) => { element.classList.remove('isCollapsedSibling', 'isChildrenCollapsed', 'isSiblingsCollapsed'); }); reportButton.disabled = false; selectedNodeInput.value = ''; }); }); </script> </body> </html>