Skip to content

Commit 6eec251

Browse files
committed
feat: handle multiple root / orphan nodes
1 parent 6d5ee25 commit 6eec251

4 files changed

Lines changed: 51 additions & 43 deletions

File tree

erpnext/hr/page/organizational_chart/organizational_chart.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ def get_children(parent=None, company=None, exclude_node=None, is_root=False, is
1717
if exclude_node:
1818
filters.append(['name', '!=', exclude_node])
1919

20-
if parent and company and parent!=company:
20+
if parent and company and parent != company:
2121
filters.append(['reports_to', '=', parent])
2222
else:
2323
filters.append(['reports_to', '=', ''])
@@ -32,6 +32,7 @@ def get_children(parent=None, company=None, exclude_node=None, is_root=False, is
3232
employee.connections = get_connections(employee.id)
3333
employee.expandable = 1 if is_expandable else 0
3434

35+
employees.sort(key=lambda x: x['connections'], reverse=True)
3536
return employees
3637

3738

erpnext/public/js/hierarchy_chart/hierarchy_chart_desktop.js

Lines changed: 25 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -84,11 +84,13 @@ erpnext.HierarchyChart = class {
8484
// setup hierarchy
8585
me.$hierarchy = $(
8686
`<ul class="hierarchy">
87-
<li class="root-level level"></li>
87+
<li class="root-level level">
88+
<ul class="node-children"></ul>
89+
</li>
8890
</ul>`);
8991

9092
me.page.main.append(me.$hierarchy);
91-
me.render_root_node();
93+
me.render_root_nodes();
9294
}
9395
}
9496
});
@@ -122,7 +124,7 @@ erpnext.HierarchyChart = class {
122124
</svg>`);
123125
}
124126

125-
render_root_node() {
127+
render_root_nodes() {
126128
let me = this;
127129

128130
frappe.call({
@@ -132,21 +134,28 @@ erpnext.HierarchyChart = class {
132134
},
133135
callback: function(r) {
134136
if (r.message.length) {
135-
let data = r.message[0];
136-
137-
let root_node = new me.Node({
138-
id: data.id,
139-
parent: me.$hierarchy.find('.root-level'),
140-
parent_id: undefined,
141-
image: data.image,
142-
name: data.name,
143-
title: data.title,
144-
expandable: true,
145-
connections: data.connections,
146-
is_root: true,
137+
let nodes = r.message;
138+
let node = undefined;
139+
let first_root = undefined;
140+
141+
$.each(nodes, (i, data) => {
142+
node = new me.Node({
143+
id: data.id,
144+
parent: $('<li class="child-node"></li>').appendTo(me.$hierarchy.find('.node-children')),
145+
parent_id: undefined,
146+
image: data.image,
147+
name: data.name,
148+
title: data.title,
149+
expandable: true,
150+
connections: data.connections,
151+
is_root: true
152+
});
153+
154+
if (i == 0)
155+
first_root = node;
147156
});
148157

149-
me.expand_node(root_node);
158+
me.expand_node(first_root);
150159
}
151160
}
152161
});
@@ -344,12 +353,7 @@ erpnext.HierarchyChart = class {
344353

345354
collapse_previous_level_nodes(node) {
346355
let node_parent = $(`#${node.parent_id}`);
347-
348356
let previous_level_nodes = node_parent.parent().parent().children('li');
349-
if (node_parent.parent().hasClass('root-level')) {
350-
previous_level_nodes = node_parent.parent().children('li');
351-
}
352-
353357
let node_card = undefined;
354358

355359
previous_level_nodes.each(function() {
@@ -409,10 +413,6 @@ erpnext.HierarchyChart = class {
409413
remove_levels_after_node(node) {
410414
let level = $(`#${node.id}`).parent().parent().parent();
411415

412-
if ($(`#${node.id}`).parent().hasClass('root-level')) {
413-
level = $(`#${node.id}`).parent();
414-
}
415-
416416
level = $('.hierarchy > li:eq('+ level.index() + ')');
417417
level.nextAll('li').remove();
418418

erpnext/public/js/hierarchy_chart/hierarchy_chart_mobile.js

Lines changed: 20 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,7 @@ erpnext.HierarchyChartMobile = class {
9797
</ul>`);
9898

9999
me.page.main.append(me.$hierarchy);
100-
me.render_root_node();
100+
me.render_root_nodes();
101101
}
102102
}
103103
});
@@ -131,7 +131,7 @@ erpnext.HierarchyChartMobile = class {
131131
</svg>`);
132132
}
133133

134-
render_root_node() {
134+
render_root_nodes() {
135135
let me = this;
136136

137137
frappe.call({
@@ -141,21 +141,21 @@ erpnext.HierarchyChartMobile = class {
141141
},
142142
callback: function(r) {
143143
if (r.message.length) {
144-
let data = r.message[0];
145-
146-
let root_node = new me.Node({
147-
id: data.id,
148-
parent: me.$hierarchy.find('.root-level'),
149-
parent_id: undefined,
150-
image: data.image,
151-
name: data.name,
152-
title: data.title,
153-
expandable: true,
154-
connections: data.connections,
155-
is_root: true,
144+
let nodes = r.message;
145+
146+
$.each(nodes, (_i, data) => {
147+
return new me.Node({
148+
id: data.id,
149+
parent: me.$hierarchy.find('.root-level'),
150+
parent_id: undefined,
151+
image: data.image,
152+
name: data.name,
153+
title: data.title,
154+
expandable: true,
155+
connections: data.connections,
156+
is_root: true
157+
});
156158
});
157-
158-
me.expand_node(root_node);
159159
}
160160
}
161161
});
@@ -375,7 +375,10 @@ erpnext.HierarchyChartMobile = class {
375375
let node_element = $(`#${node.id}`);
376376

377377
node_element.click(function() {
378-
if (node_element.is(':visible') && node_element.hasClass('active-path')) {
378+
if (node.is_root) {
379+
me.$hierarchy.empty();
380+
me.add_node_to_hierarchy(node, true);
381+
} else if (node_element.is(':visible') && node_element.hasClass('active-path')) {
379382
me.remove_levels_after_node(node);
380383
me.remove_orphaned_connectors();
381384
} else {

erpnext/public/scss/hierarchy_chart.scss

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -246,6 +246,10 @@
246246
margin-top: 16px;
247247
}
248248

249+
.root-level .node-card {
250+
margin: 0 0 16px;
251+
}
252+
249253
// node group
250254

251255
.collapsed-level {

0 commit comments

Comments
 (0)