natural sorting order for charts, hosts, families; fixes #2263
Costa Tsaousis (ktsaou) committed
Jun 5, 2017 at 03:03 UTC
5baa69590ed5b76ba41a5ee557a61b4586bc82a3
1 file changed
+48
-15
web/index.html
+48
-15
@@ -591,6 +591,43 @@
591
urlOptions.help = loadLocalStorage('options.show_help');
592
}
593
594
+ // --------------------------------------------------------------------
595
+ // natural sorting
596
+ // http://www.davekoelle.com/files/alphanum.js - LGPL
597
+
598
+ function naturalSortChunkify(t) {
599
+ var tz = [];
600
+ var x = 0, y = -1, n = 0, i, j;
601
+
602
+ while (i = (j = t.charAt(x++)).charCodeAt(0)) {
603
+ var m = (i === 46 || (i >= 48 && i <= 57));
604
+ if (m !== n) {
605
+ tz[++y] = "";
606
+ n = m;
607
+ }
608
+ tz[y] += j;
609
+ }
610
+
611
+ return tz;
612
+ }
613
+
614
+ function naturalSortCompare(a, b) {
615
+ var aa = naturalSortChunkify(a.toLowerCase());
616
+ var bb = naturalSortChunkify(b.toLowerCase());
617
+
618
+ for (var x = 0; aa[x] && bb[x]; x++) {
619
+ if (aa[x] !== bb[x]) {
620
+ var c = Number(aa[x]), d = Number(bb[x]);
621
+ if (c.toString() === aa[x] && d.toString() === bb[x])
622
+ return c - d;
623
+ else
624
+ return (aa[x] > bb[x]) ? 1 : -1;
625
+ }
626
+ }
627
+
628
+ return aa.length - bb.length;
629
+ }
630
+
631
// --------------------------------------------------------------------
632
// registry call back to render my-netdata menu
633
@@ -616,9 +653,7 @@
653
var master = options.hosts[0].hostname;
654
var sorted = options.hosts.sort(function(a, b) {
655
if(a.hostname === master) return -1;
619
- if(a.hostname === b.hostname) return 0;
620
- else if(a.hostname > b.hostname) return 1;
621
- return -1;
656
+ return naturalSortCompare(a.hostname, b.hostname);
657
});
658
659
i = 0;
@@ -656,14 +691,13 @@
691
saveLocalStorage("registryCallback", JSON.stringify(machines_array));
692
693
var machines = machines_array.sort(function (a, b) {
659
- if (a.name > b.name) return -1;
660
- if (a.name < b.name) return 1;
661
- return 0;
694
+ return naturalSortCompare(a.name, b.name);
695
});
696
697
+ i = 0;
698
len = machines.length;
699
while(len--) {
666
- var u = machines[len];
700
+ var u = machines[i++];
701
found++;
702
el += '<li id="registry_server_' + u.guid + '"><a class="registry_link" href="' + u.url + '" onClick="return gotoServerModalHandler(\'' + u.guid + '\');">' + u.name + '</a></li>';
703
a1 += '<li id="registry_action_' + u.guid + '"><a href="#" onclick="deleteRegistryModalHandler(\'' + u.guid + '\',\'' + u.name + '\',\'' + u.url + '\'); return false;"><i class="fa fa-trash-o" aria-hidden="true" style="color: #999;"></i></a></li>';
@@ -950,8 +984,7 @@
984
function prioritySort(a, b) {
985
if(a.priority < b.priority) return -1;
986
if(a.priority > b.priority) return 1;
953
- if(a.name < b.name) return -1;
954
- return 1;
987
+ return naturalSortCompare(a.name, b.name);
988
}
989
990
function sortObjectByPriority(object) {
@@ -970,8 +1003,7 @@
1003
sorted.sort(function(a, b) {
1004
if(idx[a].priority < idx[b].priority) return -1;
1005
if(idx[a].priority > idx[b].priority) return 1;
973
- if(a < b) return -1;
974
- return 1;
1006
+ return naturalSortCompare(a, b);
1007
});
1008
1009
return sorted;
@@ -1783,15 +1815,16 @@
1815
1816
// sort the families, like the dashboard menu does
1817
var families_sorted = families_sort.sort(function (a, b) {
1786
- if (a.priority > b.priority) return -1;
1787
- if (a.priority < b.priority) return 1;
1788
- return 0;
1818
+ if (a.priority < b.priority) return -1;
1819
+ if (a.priority > b.priority) return 1;
1820
+ return naturalSortCompare(a.name, b.name);
1821
});
1822
1823
+ var i = 0;
1824
var fc = 0;
1825
var len = families_sorted.length;
1826
while(len--) {
1794
- family = families_sorted[len].name;
1827
+ family = families_sorted[i++].name;
1828
var active_family_added = false;
1829
var expanded = 'true';
1830
var collapsed = '';