]> source.dussan.org Git - nextcloud-server.git/commitdiff
User list: Avoid dupes and better sorting. Fix #2420
authorThomas Tanghus <thomas@tanghus.net>
Tue, 19 Mar 2013 01:48:08 +0000 (02:48 +0100)
committerThomas Tanghus <thomas@tanghus.net>
Tue, 19 Mar 2013 11:59:32 +0000 (12:59 +0100)
settings/js/users.js

index 9bc7455285a7d6ca2490465965cb5329d21299f1..632136b7ff7894c4d62a1d40a474e334980c7666 100644 (file)
@@ -114,30 +114,71 @@ var UserList = {
                                quotaSelect.append('<option value="' + escapeHTML(quota) + '" selected="selected">' + escapeHTML(quota) + '</option>');
                        }
                }
-               var added = false;
+               $(tr).appendTo('tbody');
                if (sort) {
-                       displayname = displayname.toLowerCase();
-                       $('tbody tr').each(function () {
-                               if (displayname < $(this).attr('data-uid').toLowerCase()) {
-                                       $(tr).insertBefore($(this));
-                                       added = true;
-                                       return false;
-                               }
-                       });
+                       UserList.doSort();
+               }
+       },
+       // From http://my.opera.com/GreyWyvern/blog/show.dml/1671288
+       alphanum: function(a, b) {
+               function chunkify(t) {
+                       var tz = [], x = 0, y = -1, n = 0, i, j;
+
+                       while (i = (j = t.charAt(x++)).charCodeAt(0)) {
+                       var m = (i == 46 || (i >=48 && i <= 57));
+                       if (m !== n) {
+                               tz[++y] = "";
+                               n = m;
+                       }
+                       tz[y] += j;
+                       }
+                       return tz;
                }
-               if (!added) {
-                       $(tr).appendTo('tbody');
+
+               var aa = chunkify(a.toLowerCase());
+               var bb = chunkify(b.toLowerCase());
+
+               for (x = 0; aa[x] && bb[x]; x++) {
+                       if (aa[x] !== bb[x]) {
+                       var c = Number(aa[x]), d = Number(bb[x]);
+                       if (c == aa[x] && d == bb[x]) {
+                               return c - d;
+                       } else return (aa[x] > bb[x]) ? 1 : -1;
+                       }
                }
-               return tr;
+               return aa.length - bb.length;
        },
+       doSort: function() {
+               var self = this;
+               var rows = $('tbody tr').get();
+
+               rows.sort(function(a, b) {
+                       return UserList.alphanum($(a).find('td.name').text(), $(b).find('td.name').text());
+               });
 
+               var items = [];
+               $.each(rows, function(index, row) {
+                       items.push(row);
+                       if(items.length === 100) {
+                               $('tbody').append(items);
+                               items = [];
+                       }
+               });
+               if(items.length > 0) {
+                       $('tbody').append(items);
+               }
+       },
        update: function () {
-               if (typeof UserList.offset === 'undefined') {
-                       UserList.offset = $('tbody tr').length;
+               if (UserList.updating) {
+                       return;
                }
+               UserList.updating = true;
                $.get(OC.Router.generate('settings_ajax_userlist', { offset: UserList.offset }), function (result) {
                        if (result.status === 'success') {
                                $.each(result.data, function (index, user) {
+                                       if($('tr[data-uid="' + user.name + '"]').length > 0) {
+                                               return true;
+                                       }
                                        var tr = UserList.add(user.name, user.displayname, user.groups, user.subadmin, user.quota, false);
                                        UserList.offset++;
                                        if (index == 9) {
@@ -147,7 +188,12 @@ var UserList = {
                                                });
                                        }
                                });
+                               console.log('length', result.data.length);
+                               if (result.data.length > 0) {
+                                       UserList.doSort();
+                               }
                        }
+                       UserList.updating = false;
                });
        },
 
@@ -242,6 +288,8 @@ var UserList = {
 
 $(document).ready(function () {
 
+       UserList.doSort();
+       UserList.offset = $('tbody tr').length;
        $('tbody tr:last').bind('inview', function (event, isInView, visiblePartX, visiblePartY) {
                OC.Router.registerLoadedCallback(function () {
                        UserList.update();
@@ -373,7 +421,9 @@ $(document).ready(function () {
                                        OC.dialogs.alert(result.data.message,
                                                t('settings', 'Error creating user'));
                                } else {
-                                       UserList.add(username, username, result.data.groups, null, 'default', true);
+                                       if($('tr[data-uid="' + username + '"]').length === 0) {
+                                               UserList.add(username, username, result.data.groups, null, 'default', true);
+                                       }
                                }
                        }
                );