From 747c01161530edf47c4e727250f592652e66ba31 Mon Sep 17 00:00:00 2001 From: ringmaster Date: Mon, 5 May 2014 22:41:54 -0400 Subject: [PATCH] More specific selectors, javascript cleanup. * Assigned jQuery selector results to variables for speed. * Moved all .attr('data') calls to .data() calls. * Added :data(uid) selector. * Split the multiselect checkhandlers into separate functions. * De-duped click event on password change/img. * Used fluent interface on jQuery object for event binding. * Removed redundant tag names in class selectors. * Fixed incorrect date display for last login. * Added Userlist.has() to search for uid. * General code convention compliance fixes. to-do: Group dropdowns currently don't add the admin group after the search result, not sure why yet. --- settings/js/users/users.js | 536 +++++++++++---------- settings/templates/users/part.setquota.php | 2 +- settings/templates/users/part.userlist.php | 4 +- 3 files changed, 283 insertions(+), 259 deletions(-) diff --git a/settings/js/users/users.js b/settings/js/users/users.js index b9654e774b..f40854cf63 100644 --- a/settings/js/users/users.js +++ b/settings/js/users/users.js @@ -6,6 +6,10 @@ * See the COPYING-README file. */ +var $userList; +var $userListBody; +var filter; + var UserList = { availableGroups: [], offset: 30, //The first 30 users are there. No prob, if less in total. @@ -15,29 +19,30 @@ var UserList = { currentGid: '', add: function (username, displayname, groups, subadmin, quota, storageLocation, lastLogin, sort) { - var tr = $('tbody tr').first().clone(); + var $tr = $userListBody.find('tr:first-child').clone(); var subadminsEl; var subadminSelect; var groupsSelect; - if (tr.find('div.avatardiv').length){ - $('div.avatardiv', tr).avatar(username, 32); + if ($tr.find('div.avatardiv').length){ + $tr.find('.avatardiv').imageplaceholder(username, displayname); + $('div.avatardiv', $tr).avatar(username, 32); } - tr.attr('data-uid', username); - tr.attr('data-displayName', displayname); - tr.find('td.name').text(username); - tr.find('td.displayName > span').text(displayname); + $tr.data('uid', username); + $tr.data('displayname', displayname); + $tr.find('td.name').text(username); + $tr.find('td.displayName > span').text(displayname); // make them look like the multiselect buttons // until they get time to really get initialized groupsSelect = $('') - .attr('data-username', username) + .data('username', username) .data('user-groups', groups); - if (tr.find('td.subadmins').length > 0) { + if ($tr.find('td.subadmins').length > 0) { subadminSelect = $(''); - img.css('display', 'none'); - img.parent().children('span').replaceWith(input); - input.focus(); - input.keypress(function (event) { - if (event.keyCode === 13) { - if ($(this).val().length > 0) { - var recoveryPasswordVal = $('input:password[id="recoveryPassword"]').val(); - $.post( - OC.generateUrl('/settings/users/changepassword'), - {username: uid, password: $(this).val(), recoveryPassword: recoveryPasswordVal}, - function (result) { - if (result.status != 'success') { - OC.Notification.show(t('admin', result.data.message)); + + var $td = $(this).closest('td'); + var $tr = $td.closest('tr'); + var uid = $tr.data('uid'); + var $input = $(''); + $td.find('img').hide(); + $td.children('span').replaceWith($input); + $input + .focus() + .keypress(function (event) { + if (event.keyCode === 13) { + if ($(this).val().length > 0) { + var recoveryPasswordVal = $('input:password[id="recoveryPassword"]').val(); + $.post( + OC.generateUrl('/settings/users/changepassword'), + {username: uid, password: $(this).val(), recoveryPassword: recoveryPasswordVal}, + function (result) { + if (result.status != 'success') { + OC.Notification.show(t('admin', result.data.message)); + } } - } - ); - input.blur(); - } else { - input.blur(); + ); + $input.blur(); + } else { + $input.blur(); + } } - } - }); - input.blur(function () { - $(this).replaceWith($('●●●●●●●')); - img.css('display', ''); - }); + }) + .blur(function () { + $(this).replaceWith($('●●●●●●●')); + $td.find('img').show(); + }); }); - $('input:password[id="recoveryPassword"]').keyup(function(event) { + $('input:password[id="recoveryPassword"]').keyup(function() { OC.Notification.hide(); }); - $('table').on('click', 'td.password', function (event) { - $(this).children('img').click(); - }); - - $('table').on('click', 'td.displayName>img', function (event) { + $userListBody.on('click', '.displayName', function (event) { event.stopPropagation(); - var img = $(this); - var uid = img.parent().parent().attr('data-uid'); - var displayName = escapeHTML(img.parent().parent().attr('data-displayName')); - var input = $(''); - img.css('display', 'none'); - img.parent().children('span').replaceWith(input); - input.focus(); - input.keypress(function (event) { - if (event.keyCode === 13) { - if ($(this).val().length > 0) { - $.post( - OC.filePath('settings', 'ajax', 'changedisplayname.php'), - {username: uid, displayName: $(this).val()}, - function (result) { - if (result && result.status==='success'){ - img.parent().parent().find('div.avatardiv').avatar(result.data.username, 32); + var $td = $(this).closest('td'); + var $tr = $td.closest('tr'); + var uid = $tr.data('uid'); + var displayName = escapeHTML($tr.data('displayname')); + var $input = $(''); + $td.find('img').hide(); + $td.children('span').replaceWith($input); + $input + .focus() + .keypress(function (event) { + if (event.keyCode === 13) { + if ($(this).val().length > 0) { + $tr.find('.avatardiv').imageplaceholder(uid, displayName); + $.post( + OC.filePath('settings', 'ajax', 'changedisplayname.php'), + {username: uid, displayName: $(this).val()}, + function (result) { + if (result && result.status==='success'){ + $tr.find('.avatardiv').avatar(result.data.username, 32); + } } - } - ); - input.blur(); - } else { - input.blur(); + ); + $input.blur(); + } else { + $input.blur(); + } } - } - }); - input.blur(function () { - var input = $(this), - displayName = input.val(); - input.closest('tr').attr('data-displayName', displayName); - input.replaceWith('' + escapeHTML(displayName) + ''); - img.css('display', ''); - }); - }); - $('table').on('click', 'td.displayName', function (event) { - $(this).children('img').click(); + }) + .blur(function () { + var displayName = $input.val(); + $tr.data('displayname', displayName); + $input.replaceWith('' + escapeHTML(displayName) + ''); + $td.find('img').show(); + }); }); - $('select.quota, select.quota-user').singleSelect().on('change', function () { - var select = $(this); - var uid = $(this).parent().parent().attr('data-uid'); + $('#default_quota, .quota-user').singleSelect().on('change', function () { + var $select = $(this); + var uid = $select.closest('tr').data('uid'); var quota = $(this).val(); setQuota(uid, quota, function(returnedQuota){ if (quota !== returnedQuota) { - select.find(':selected').text(returnedQuota); + $select.find(':selected').text(returnedQuota); } }); }); @@ -546,7 +570,7 @@ $(document).ready(function () { t('settings', 'Error creating user')); return false; } - var groups = $('#newusergroups').prev().children('div').data('settings').checked; + var groups = $('#newusergroups').val(); $('#newuser').get(0).reset(); $.post( OC.filePath('settings', 'ajax', 'createuser.php'), @@ -576,7 +600,7 @@ $(document).ready(function () { UserList.notificationTimeout = null; }, 10000); } - if($('tr[data-uid="' + username + '"]').length === 0) { + if(!UserList.has(username)) { UserList.add(username, username, result.data.groups, null, 'default', result.data.storageLocation, 0, true); } } diff --git a/settings/templates/users/part.setquota.php b/settings/templates/users/part.setquota.php index e246a94ad2..fc5624d069 100644 --- a/settings/templates/users/part.setquota.php +++ b/settings/templates/users/part.setquota.php @@ -6,7 +6,7 @@ t('Default Quota'));?> - "> diff --git a/settings/templates/users/part.userlist.php b/settings/templates/users/part.userlist.php index 047ebb4667..c74fdcc9ef 100644 --- a/settings/templates/users/part.userlist.php +++ b/settings/templates/users/part.userlist.php @@ -1,4 +1,4 @@ - +
@@ -20,7 +20,7 @@ " - data-displayName=""> + data-displayname="">