@cryptotaxi247 / netdata-1 / commits / 5baa69590

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 = '';