diff options
Diffstat (limited to 'settings/js/users.js')
-rw-r--r-- | settings/js/users.js | 796 |
1 files changed, 402 insertions, 394 deletions
diff --git a/settings/js/users.js b/settings/js/users.js index f148a43a480..b0e30feb80c 100644 --- a/settings/js/users.js +++ b/settings/js/users.js @@ -4,405 +4,413 @@ * See the COPYING-README file. */ -var UserList={ - useUndo:true, - - /** - * @brief Initiate user deletion process in UI - * @param string uid the user ID to be deleted - * - * Does not actually delete the user; it sets them for - * deletion when the current page is unloaded, at which point - * finishDelete() completes the process. This allows for 'undo'. - */ - do_delete:function( uid ) { - if (typeof UserList.deleteUid !== 'undefined') { - //Already a user in the undo queue - UserList.finishDelete(null); - } - UserList.deleteUid = uid; - - // Set undo flag - UserList.deleteCanceled = false; - - // Provide user with option to undo - $('#notification').html(t('users', 'deleted')+' '+uid+'<span class="undo">'+t('users', 'undo')+'</span>'); - $('#notification').data('deleteuser',true); - $('#notification').fadeIn(); - }, - - /** - * @brief Delete a user via ajax - * @param bool ready whether to use ready() upon completion - * - * Executes deletion via ajax of user identified by property deleteUid - * if 'undo' has not been used. Completes the user deletion procedure - * and reflects success in UI. - */ - finishDelete:function( ready ){ - - // Check deletion has not been undone - if( !UserList.deleteCanceled && UserList.deleteUid ){ - - // Delete user via ajax - $.ajax({ - type: 'POST', - url: OC.filePath('settings', 'ajax', 'removeuser.php'), - async: false, - data: { username: UserList.deleteUid }, - success: function(result) { - if (result.status == 'success') { - // Remove undo option, & remove user from table - $('#notification').fadeOut(); - $('tr').filterAttr('data-uid', UserList.deleteUid).remove(); - UserList.deleteCanceled = true; - if (ready) { - ready(); - } - } else { - oc.dialogs.alert(result.data.message, t('settings', 'Unable to remove user')); - } - } - }); - } - }, +var UserList = { + useUndo:true, - add:function(username, groups, subadmin, quota, sort) { - var tr = $('tbody tr').first().clone(); - tr.attr('data-uid', username); - tr.find('td.name').text(username); - var groupsSelect = $('<select multiple="multiple" class="groupsselect" data-placehoder="Groups" title="Groups"></select>').attr('data-username', username).attr('data-user-groups', groups); - tr.find('td.groups').empty(); - if (tr.find('td.subadmins').length > 0) { - var subadminSelect = $('<select multiple="multiple" class="subadminsselect" data-placehoder="subadmins" title="' + t('files', 'Group Admin') + '">').attr('data-username', username).attr('data-user-groups', groups).attr('data-subadmin', subadmin); - tr.find('td.subadmins').empty(); - } - var allGroups = String($('#content table').attr('data-groups')).split(', '); - $.each(allGroups, function(i, group) { - groupsSelect.append($('<option value="'+group+'">'+group+'</option>')); - if (typeof subadminSelect !== 'undefined' && group != 'admin') { - subadminSelect.append($('<option value="'+group+'">'+group+'</option>')); - } - }); - tr.find('td.groups').append(groupsSelect); - UserList.applyMultiplySelect(groupsSelect); - if (tr.find('td.subadmins').length > 0) { - tr.find('td.subadmins').append(subadminSelect); - UserList.applyMultiplySelect(subadminSelect); - } - if (tr.find('td.remove img').length == 0 && OC.currentUser != username) { - var rm_img = $('<img>', { - class: 'svg action', - src: OC.imagePath('core','actions/delete'), - alt: t('settings','Delete'), - title: t('settings','Delete') - }); - var rm_link = $('<a>', { class: 'action delete', href: '#'}).append(rm_img); - tr.find('td.remove').append(rm_link); - } else if (OC.currentUser == username) { - tr.find('td.remove a').remove(); - } - var quotaSelect = tr.find('select.quota-user'); - if (quota == 'default') { - quotaSelect.find('option').attr('selected', null); - quotaSelect.find('option').first().attr('selected', 'selected'); - quotaSelect.data('previous', 'default'); - } else { - if (quotaSelect.find('option[value="'+quota+'"]').length > 0) { - quotaSelect.find('option[value="'+quota+'"]').attr('selected', 'selected'); - } else { - quotaSelect.append('<option value="'+quota+'" selected="selected">'+quota+'</option>'); - } - } - var added = false; - if (sort) { - username = username.toLowerCase(); - $('tbody tr').each(function() { - if (username < $(this).attr('data-uid').toLowerCase()) { - $(tr).insertBefore($(this)); - added = true; - return false; - } - }); - } - if (!added) { - $(tr).appendTo('tbody'); - } - return tr; - }, + /** + * @brief Initiate user deletion process in UI + * @param string uid the user ID to be deleted + * + * Does not actually delete the user; it sets them for + * deletion when the current page is unloaded, at which point + * finishDelete() completes the process. This allows for 'undo'. + */ + do_delete:function (uid) { + if (typeof UserList.deleteUid !== 'undefined') { + //Already a user in the undo queue + UserList.finishDelete(null); + } + UserList.deleteUid = uid; - update:function() { - if (typeof UserList.offset === 'undefined') { - UserList.offset = $('tbody tr').length; - } - $.get(OC.Router.generate('settings_ajax_userlist', { offset: UserList.offset }), function(result) { - if (result.status === 'success') { - $.each(result.data, function(index, user) { - var tr = UserList.add(user.name, user.groups, user.subadmin, user.quota, false); - UserList.offset++; - if (index == 9) { - $(tr).bind('inview', function(event, isInView, visiblePartX, visiblePartY) { - $(this).unbind(event); - UserList.update(); - }); - } - }); - } - }); - }, + // Set undo flag + UserList.deleteCanceled = false; - applyMultiplySelect:function(element) { - var checked=[]; - var user=element.attr('data-username'); - if($(element).attr('class') == 'groupsselect'){ - if(element.data('userGroups')){ - checked=String(element.data('userGroups')).split(', '); - } - if(user){ - var checkHandeler=function(group){ - if(user==OC.currentUser && group=='admin'){ - return false; - } - if(!isadmin && checked.length == 1 && checked[0] == group){ - return false; - } - $.post( - OC.filePath('settings','ajax','togglegroups.php'), - { - username:user, - group:group - }, - function(){} - ); - }; - }else{ - checkHandeler=false; - } - var addGroup = function(group) { - $('select[multiple]').each(function(index, element) { - if ($(element).find('option[value="'+group +'"]').length == 0) { - $(element).append('<option value="'+group+'">'+group+'</option>'); - } - }) - }; - var label; - if(isadmin){ - label = t('core', 'add group'); - }else{ - label = null; - } - element.multiSelect({ - createCallback:addGroup, - createText:label, - checked:checked, - oncheck:checkHandeler, - onuncheck:checkHandeler, - minWidth: 100, - }); - } - if($(element).attr('class') == 'subadminsselect'){ - if(element.data('subadmin')){ - checked=String(element.data('subadmin')).split(', '); - } - var checkHandeler=function(group){ - if(group=='admin'){ - return false; - } - $.post( - OC.filePath('settings','ajax','togglesubadmins.php'), - { - username:user, - group:group - }, - function(){} - ); - }; - - var addSubAdmin = function(group) { - $('select[multiple]').each(function(index, element) { - if ($(element).find('option[value="'+group +'"]').length == 0) { - $(element).append('<option value="'+group+'">'+group+'</option>'); - } - }) - }; - element.multiSelect({ - createCallback:addSubAdmin, - createText:null, - checked:checked, - oncheck:checkHandeler, - onuncheck:checkHandeler, - minWidth: 100, - }); - } - } + // Provide user with option to undo + $('#notification').html(t('users', 'deleted') + ' ' + uid + '<span class="undo">' + t('users', 'undo') + '</span>'); + $('#notification').data('deleteuser', true); + $('#notification').fadeIn(); + }, + + /** + * @brief Delete a user via ajax + * @param bool ready whether to use ready() upon completion + * + * Executes deletion via ajax of user identified by property deleteUid + * if 'undo' has not been used. Completes the user deletion procedure + * and reflects success in UI. + */ + finishDelete:function (ready) { + + // Check deletion has not been undone + if (!UserList.deleteCanceled && UserList.deleteUid) { + + // Delete user via ajax + $.ajax({ + type:'POST', + url:OC.filePath('settings', 'ajax', 'removeuser.php'), + async:false, + data:{ username:UserList.deleteUid }, + success:function (result) { + if (result.status == 'success') { + // Remove undo option, & remove user from table + $('#notification').fadeOut(); + $('tr').filterAttr('data-uid', UserList.deleteUid).remove(); + UserList.deleteCanceled = true; + if (ready) { + ready(); + } + } else { + oc.dialogs.alert(result.data.message, t('settings', 'Unable to remove user')); + } + } + }); + } + }, + + add:function (username, groups, subadmin, quota, sort) { + var tr = $('tbody tr').first().clone(); + tr.attr('data-uid', username); + tr.find('td.name').text(username); + var groupsSelect = $('<select multiple="multiple" class="groupsselect" data-placehoder="Groups" title="' + t('settings', 'Groups') + '"></select>').attr('data-username', username).attr('data-user-groups', groups); + tr.find('td.groups').empty(); + if (tr.find('td.subadmins').length > 0) { + var subadminSelect = $('<select multiple="multiple" class="subadminsselect" data-placehoder="subadmins" title="' + t('settings', 'Group Admin') + '">').attr('data-username', username).attr('data-user-groups', groups).attr('data-subadmin', subadmin); + tr.find('td.subadmins').empty(); + } + var allGroups = String($('#content table').attr('data-groups')).split(', '); + $.each(allGroups, function (i, group) { + groupsSelect.append($('<option value="' + group + '">' + group + '</option>')); + if (typeof subadminSelect !== 'undefined' && group != 'admin') { + subadminSelect.append($('<option value="' + group + '">' + group + '</option>')); + } + }); + tr.find('td.groups').append(groupsSelect); + UserList.applyMultiplySelect(groupsSelect); + if (tr.find('td.subadmins').length > 0) { + tr.find('td.subadmins').append(subadminSelect); + UserList.applyMultiplySelect(subadminSelect); + } + if (tr.find('td.remove img').length == 0 && OC.currentUser != username) { + var rm_img = $('<img>', { + class:'svg action', + src:OC.imagePath('core', 'actions/delete') + }); + var rm_link = $('<a>', { class:'action delete', href:'#', 'original-title':t('settings', 'Delete')}).append(rm_img); + tr.find('td.remove').append(rm_link); + } else if (OC.currentUser == username) { + tr.find('td.remove a').remove(); + } + var quotaSelect = tr.find('select.quota-user'); + if (quota == 'default') { + quotaSelect.find('option').attr('selected', null); + quotaSelect.find('option').first().attr('selected', 'selected'); + quotaSelect.data('previous', 'default'); + } else { + if (quotaSelect.find('option[value="' + quota + '"]').length > 0) { + quotaSelect.find('option[value="' + quota + '"]').attr('selected', 'selected'); + } else { + quotaSelect.append('<option value="' + quota + '" selected="selected">' + quota + '</option>'); + } + } + var added = false; + if (sort) { + username = username.toLowerCase(); + $('tbody tr').each(function () { + if (username < $(this).attr('data-uid').toLowerCase()) { + $(tr).insertBefore($(this)); + added = true; + return false; + } + }); + } + if (!added) { + $(tr).appendTo('tbody'); + } + return tr; + }, + + update:function () { + if (typeof UserList.offset === 'undefined') { + UserList.offset = $('tbody tr').length; + } + $.get(OC.Router.generate('settings_ajax_userlist', { offset:UserList.offset }), function (result) { + if (result.status === 'success') { + $.each(result.data, function (index, user) { + var tr = UserList.add(user.name, user.groups, user.subadmin, user.quota, false); + UserList.offset++; + if (index == 9) { + $(tr).bind('inview', function (event, isInView, visiblePartX, visiblePartY) { + $(this).unbind(event); + UserList.update(); + }); + } + }); + } + }); + }, + + applyMultiplySelect:function (element) { + var checked = []; + var user = element.attr('data-username'); + if ($(element).attr('class') == 'groupsselect') { + if (element.data('userGroups')) { + checked = String(element.data('userGroups')).split(', '); + } + if (user) { + var checkHandeler = function (group) { + if (user == OC.currentUser && group == 'admin') { + return false; + } + if (!isadmin && checked.length == 1 && checked[0] == group) { + return false; + } + $.post( + OC.filePath('settings', 'ajax', 'togglegroups.php'), + { + username:user, + group:group + }, + function () { + } + ); + }; + } else { + checkHandeler = false; + } + var addGroup = function (group) { + $('select[multiple]').each(function (index, element) { + if ($(element).find('option[value="' + group + '"]').length == 0) { + $(element).append('<option value="' + group + '">' + group + '</option>'); + } + }) + }; + var label; + if (isadmin) { + label = t('settings', 'add group'); + } else { + label = null; + } + element.multiSelect({ + createCallback:addGroup, + createText:label, + checked:checked, + oncheck:checkHandeler, + onuncheck:checkHandeler, + minWidth:100, + }); + } + if ($(element).attr('class') == 'subadminsselect') { + if (element.data('subadmin')) { + checked = String(element.data('subadmin')).split(', '); + } + var checkHandeler = function (group) { + if (group == 'admin') { + return false; + } + $.post( + OC.filePath('settings', 'ajax', 'togglesubadmins.php'), + { + username:user, + group:group + }, + function () { + } + ); + }; + + var addSubAdmin = function (group) { + $('select[multiple]').each(function (index, element) { + if ($(element).find('option[value="' + group + '"]').length == 0) { + $(element).append('<option value="' + group + '">' + group + '</option>'); + } + }) + }; + element.multiSelect({ + createCallback:addSubAdmin, + createText:null, + checked:checked, + oncheck:checkHandeler, + onuncheck:checkHandeler, + minWidth:100, + }); + } + } } -$(document).ready(function(){ +$(document).ready(function () { + + $('tbody tr:last').bind('inview', function (event, isInView, visiblePartX, visiblePartY) { + UserList.update(); + }); + + function setQuota(uid, quota, ready) { + $.post( + OC.filePath('settings', 'ajax', 'setquota.php'), + {username:uid, quota:quota}, + function (result) { + if (ready) { + ready(result.data.quota); + } + } + ); + } + + + $('select[multiple]').each(function (index, element) { + UserList.applyMultiplySelect($(element)); + }); + + $('td.remove>a').live('click', function (event) { + var row = $(this).parent().parent(); + var uid = $(row).attr('data-uid'); + $(row).hide(); + // Call function for handling delete/undo + UserList.do_delete(uid); + }); + + $('td.password>img').live('click', function (event) { + event.stopPropagation(); + var img = $(this); + var uid = img.parent().parent().attr('data-uid'); + var input = $('<input type="password">'); + 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', 'changepassword.php'), + {username:uid, password:$(this).val()}, + function (result) { + } + ); + input.blur(); + } else { + input.blur(); + } + } + }); + input.blur(function () { + $(this).replaceWith($('<span>●●●●●●●</span>')); + img.css('display', ''); + }); + }); + $('td.password').live('click', function (event) { + $(this).children('img').click(); + }); + + $('select.quota, select.quota-user').live('change', function () { + var select = $(this); + var uid = $(this).parent().parent().parent().attr('data-uid'); + var quota = $(this).val(); + var other = $(this).next(); + if (quota != 'other') { + other.hide(); + select.data('previous', quota); + setQuota(uid, quota); + } else { + other.show(); + select.addClass('active'); + other.focus(); + } + }); + $('select.quota, select.quota-user').each(function (i, select) { + $(select).data('previous', $(select).val()); + }) + + $('input.quota-other').live('change', function () { + var uid = $(this).parent().parent().parent().attr('data-uid'); + var quota = $(this).val(); + var select = $(this).prev(); + var other = $(this); + if (quota) { + setQuota(uid, quota, function (quota) { + select.children().attr('selected', null); + var existingOption = select.children().filter(function (i, option) { + return ($(option).val() == quota); + }); + if (existingOption.length) { + existingOption.attr('selected', 'selected'); + } else { + var option = $('<option/>'); + option.attr('selected', 'selected').attr('value', quota).text(quota); + select.children().last().before(option); + } + select.val(quota); + select.removeClass('active'); + other.val(null); + other.hide(); + }); + } else { + var previous = select.data('previous'); + select.children().attr('selected', null); + select.children().each(function (i, option) { + if ($(option).val() == previous) { + $(option).attr('selected', 'selected'); + } + }); + select.removeClass('active'); + other.hide(); + } + }); - $('tbody tr:last').bind('inview', function(event, isInView, visiblePartX, visiblePartY) { - UserList.update(); - }); + $('input.quota-other').live('blur', function () { + $(this).change(); + }) - function setQuota(uid,quota,ready){ - $.post( - OC.filePath('settings','ajax','setquota.php'), - {username:uid,quota:quota}, - function(result){ - if(ready){ - ready(result.data.quota); - } - } - ); - } - - - $('select[multiple]').each(function(index,element){ - UserList.applyMultiplySelect($(element)); - }); - - $('td.remove>a').live('click',function(event){ - var row = $(this).parent().parent(); - var uid = $(row).attr('data-uid'); - $(row).hide(); - // Call function for handling delete/undo - UserList.do_delete(uid); - }); - - $('td.password>img').live('click',function(event){ - event.stopPropagation(); - var img=$(this); - var uid=img.parent().parent().attr('data-uid'); - var input=$('<input type="password">'); - 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','changepassword.php'), - {username:uid,password:$(this).val()}, - function(result){} - ); - input.blur(); - }else{ - input.blur(); - } - } - }); - input.blur(function(){ - $(this).replaceWith($('<span>●●●●●●●</span>')); - img.css('display',''); - }); - }); - $('td.password').live('click',function(event){ - $(this).children('img').click(); - }); - - $('select.quota, select.quota-user').live('change',function(){ - var select=$(this); - var uid=$(this).parent().parent().parent().attr('data-uid'); - var quota=$(this).val(); - var other=$(this).next(); - if(quota!='other'){ - other.hide(); - select.data('previous',quota); - setQuota(uid,quota); - }else{ - other.show(); - select.addClass('active'); - other.focus(); - } - }); - $('select.quota, select.quota-user').each(function(i,select){ - $(select).data('previous',$(select).val()); - }) - - $('input.quota-other').live('change',function(){ - var uid=$(this).parent().parent().parent().attr('data-uid'); - var quota=$(this).val(); - var select=$(this).prev(); - var other=$(this); - if(quota){ - setQuota(uid,quota,function(quota){ - select.children().attr('selected',null); - var existingOption=select.children().filter(function(i,option){ - return ($(option).val()==quota); - }); - if(existingOption.length){ - existingOption.attr('selected','selected'); - }else{ - var option=$('<option/>'); - option.attr('selected','selected').attr('value',quota).text(quota); - select.children().last().before(option); - } - select.val(quota); - select.removeClass('active'); - other.val(null); - other.hide(); - }); - }else{ - var previous=select.data('previous'); - select.children().attr('selected',null); - select.children().each(function(i,option){ - if($(option).val()==previous){ - $(option).attr('selected','selected'); - } - }); - select.removeClass('active'); - other.hide(); - } - }); - - $('input.quota-other').live('blur',function(){ - $(this).change(); - }) - - $('#newuser').submit(function(event){ - event.preventDefault(); - var username=$('#newusername').val(); - var password=$('#newuserpassword').val(); - if($('#content table tbody tr').filterAttr('data-uid',username).length>0){ - OC.dialogs.alert('The username is already being used', 'Error creating user'); - return; - } - if($.trim(username) == '') { - OC.dialogs.alert('A valid username must be provided', 'Error creating user'); - return false; - } - if($.trim(password) == '') { - OC.dialogs.alert('A valid password must be provided', 'Error creating user'); - return false; - } - var groups=$('#newusergroups').prev().children('div').data('settings').checked; - $('#newuser').get(0).reset(); - $.post( - OC.filePath('settings','ajax','createuser.php'), - { - username:username, - password:password, - groups:groups, - }, - function(result){ - if(result.status!='success'){ - OC.dialogs.alert(result.data.message, 'Error creating user'); - } else { - UserList.add(username, result.data.groups, null, 'default', true); - } - } - ); - }); - // Handle undo notifications - $('#notification').hide(); - $('#notification .undo').live('click', function() { - if($('#notification').data('deleteuser')) { - $('tbody tr').filterAttr('data-uid', UserList.deleteUid).show(); - UserList.deleteCanceled=true; - } - $('#notification').fadeOut(); - }); - UserList.useUndo=('onbeforeunload' in window) - $(window).bind('beforeunload', function (){ - UserList.finishDelete(null); - }); + $('#newuser').submit(function (event) { + event.preventDefault(); + var username = $('#newusername').val(); + var password = $('#newuserpassword').val(); + if ($('#content table tbody tr').filterAttr('data-uid', username).length > 0) { + OC.dialogs.alert( + t('settings', 'The username is already being used'), + t('settings', 'Error creating user')); + return; + } + if ($.trim(username) == '') { + OC.dialogs.alert( + t('settings', 'A valid username must be provided'), + t('settings', 'Error creating user')); + return false; + } + if ($.trim(password) == '') { + OC.dialogs.alert( + t('settings', 'A valid password must be provided'), + t('settings', 'Error creating user')); + return false; + } + var groups = $('#newusergroups').prev().children('div').data('settings').checked; + $('#newuser').get(0).reset(); + $.post( + OC.filePath('settings', 'ajax', 'createuser.php'), + { + username:username, + password:password, + groups:groups, + }, + function (result) { + if (result.status != 'success') { + OC.dialogs.alert(result.data.message, + t('settings', 'Error creating user')); + } else { + UserList.add(username, result.data.groups, null, 'default', true); + } + } + ); + }); + // Handle undo notifications + $('#notification').hide(); + $('#notification .undo').live('click', function () { + if ($('#notification').data('deleteuser')) { + $('tbody tr').filterAttr('data-uid', UserList.deleteUid).show(); + UserList.deleteCanceled = true; + } + $('#notification').fadeOut(); + }); + UserList.useUndo = ('onbeforeunload' in window) + $(window).bind('beforeunload', function () { + UserList.finishDelete(null); + }); }); |