summaryrefslogtreecommitdiffstats
path: root/settings/js/users/users.js
diff options
context:
space:
mode:
Diffstat (limited to 'settings/js/users/users.js')
-rw-r--r--settings/js/users/users.js161
1 files changed, 83 insertions, 78 deletions
diff --git a/settings/js/users/users.js b/settings/js/users/users.js
index 4ce77648826..7922cd9c656 100644
--- a/settings/js/users/users.js
+++ b/settings/js/users/users.js
@@ -59,9 +59,6 @@ var UserList = {
var $tr = $userListBody.find('tr:first-child').clone();
// this removes just the `display:none` of the template row
$tr.removeAttr('style');
- var subAdminsEl;
- var subAdminSelect;
- var groupsSelect;
/**
* Avatar or placeholder
@@ -88,32 +85,17 @@ var UserList = {
$tr.find('td.mailAddress > .action').tooltip({placement: 'top'});
$tr.find('td.password > .action').tooltip({placement: 'top'});
+
/**
* groups and subadmins
*/
- // make them look like the multiselect buttons
- // until they get time to really get initialized
- groupsSelect = $('<select multiple="multiple" class="groupsselect multiselect button" data-placehoder="Groups" title="' + t('settings', 'No group') + '"></select>')
- .data('username', user.name)
- .data('user-groups', user.groups);
- if ($tr.find('td.subadmins').length > 0) {
- subAdminSelect = $('<select multiple="multiple" class="subadminsselect multiselect button" data-placehoder="subadmins" title="' + t('settings', 'No group') + '">')
- .data('username', user.name)
- .data('user-groups', user.groups)
- .data('subadmin', user.subadmin);
- $tr.find('td.subadmins').empty();
- }
- $.each(this.availableGroups, function (i, group) {
- groupsSelect.append($('<option value="' + escapeHTML(group) + '">' + escapeHTML(group) + '</option>'));
- if (typeof subAdminSelect !== 'undefined' && group !== 'admin') {
- subAdminSelect.append($('<option value="' + escapeHTML(group) + '">' + escapeHTML(group) + '</option>'));
- }
- });
- $tr.find('td.groups').empty().append(groupsSelect);
- subAdminsEl = $tr.find('td.subadmins');
- if (subAdminsEl.length > 0) {
- subAdminsEl.append(subAdminSelect);
- }
+ var $tdGroups = $tr.find('td.groups');
+ this._updateGroupListLabel($tdGroups, user.groups);
+ $tdGroups.find('.action').tooltip({placement: 'top'});
+
+ var $tdSubadmins = $tr.find('td.subadmins');
+ this._updateGroupListLabel($tdSubadmins, user.subadmin);
+ $tdSubadmins.find('.action').tooltip({placement: 'top'});
/**
* remove action
@@ -200,10 +182,6 @@ var UserList = {
// defer init so the user first sees the list appear more quickly
window.setTimeout(function(){
$quotaSelect.singleSelect();
- UserList.applyGroupSelect(groupsSelect);
- if (subAdminSelect) {
- UserList.applySubadminSelect(subAdminSelect);
- }
}, 0);
return $tr;
},
@@ -324,7 +302,7 @@ var UserList = {
},
markRemove: function(uid) {
var $tr = UserList.getRow(uid);
- var groups = $tr.find('.groups .groupsselect').val();
+ var groups = $tr.find('.groups').data('groups');
for(var i in groups) {
var gid = groups[i];
var $li = GroupList.getGroupLI(gid);
@@ -339,7 +317,7 @@ var UserList = {
},
undoRemove: function(uid) {
var $tr = UserList.getRow(uid);
- var groups = $tr.find('.groups .groupsselect').val();
+ var groups = $tr.find('.groups').data('groups');
for(var i in groups) {
var gid = groups[i];
var $li = GroupList.getGroupLI(gid);
@@ -440,19 +418,9 @@ var UserList = {
});
},
- applyGroupSelect: function (element) {
- var checked = [];
+ applyGroupSelect: function (element, user, checked) {
var $element = $(element);
- var user = UserList.getUID($element);
- if ($element.data('user-groups')) {
- if (typeof $element.data('user-groups') === 'string') {
- checked = $element.data('user-groups').split(", ");
- }
- else {
- checked = $element.data('user-groups');
- }
- }
var checkHandler = null;
if(user) { // Only if in a user row, and not the #newusergroups select
checkHandler = function (group) {
@@ -492,13 +460,6 @@ var UserList = {
};
}
var addGroup = function (select, group) {
- $('select[multiple]').each(function (index, element) {
- $element = $(element);
- if ($element.find('option').filterAttr('value', group).length === 0 &&
- select.data('msid') !== $element.data('msid')) {
- $element.append('<option value="' + escapeHTML(group) + '">' + escapeHTML(group) + '</option>');
- }
- });
GroupList.addGroup(escapeHTML(group));
};
var label;
@@ -519,19 +480,8 @@ var UserList = {
});
},
- applySubadminSelect: function (element) {
- var checked = [];
+ applySubadminSelect: function (element, user, checked) {
var $element = $(element);
- var user = UserList.getUID($element);
-
- if ($element.data('subadmin')) {
- if (typeof $element.data('subadmin') === 'string') {
- checked = $element.data('subadmin').split(", ");
- }
- else {
- checked = $element.data('subadmin');
- }
- }
var checkHandler = function (group) {
if (group === 'admin') {
return false;
@@ -547,15 +497,7 @@ var UserList = {
);
};
- var addSubAdmin = function (group) {
- $('select[multiple]').each(function (index, element) {
- if ($(element).find('option').filterAttr('value', group).length === 0) {
- $(element).append('<option value="' + escapeHTML(group) + '">' + escapeHTML(group) + '</option>');
- }
- });
- };
$element.multiSelect({
- createCallback: addSubAdmin,
createText: null,
checked: checked,
oncheck: checkHandler,
@@ -613,6 +555,62 @@ var UserList = {
}
}
);
+ },
+
+ /**
+ * Creates a temporary jquery.multiselect selector on the given group field
+ */
+ _triggerGroupEdit: function($td, isSubadminSelect) {
+ var $groupsListContainer = $td.find('.groupsListContainer');
+ var placeholder = $groupsListContainer.attr('data-placeholder') || t('settings', 'no group');
+ var user = UserList.getUID($td);
+ var checked = $td.data('groups') || [];
+
+ $td.find('.multiselectoptions').remove();
+
+ // jquery.multiselect can only work with select+options in DOM ? We'll give jquery.multiselect what it wants...
+ var $groupsSelect;
+ if (isSubadminSelect) {
+ $groupsSelect = $('<select multiple="multiple" class="groupsselect multiselect button" title="' + placeholder + '"></select>');
+ } else {
+ $groupsSelect = $('<select multiple="multiple" class="subadminsselect multiselect button" title="' + placeholder + '"></select>')
+ }
+
+ $.each(this.availableGroups, function (i, group) {
+ if (isSubadminSelect && group === 'admin') {
+ // can't become subadmin of "admin" group
+ return;
+ }
+ $groupsSelect.append($('<option value="' + escapeHTML(group) + '">' + escapeHTML(group) + '</option>'));
+ });
+
+ $td.append($groupsSelect);
+
+ if (isSubadminSelect) {
+ UserList.applySubadminSelect($groupsSelect, user, checked);
+ } else {
+ UserList.applyGroupSelect($groupsSelect, user, checked);
+ }
+
+ $groupsListContainer.addClass('hidden');
+ $td.find('.multiselect:not(.groupsListContainer):first').click();
+ $groupsSelect.on('dropdownclosed', function(e) {
+ $groupsSelect.remove();
+ $td.find('.multiselect:not(.groupsListContainer)').parent().remove();
+ $td.find('.multiselectoptions').remove();
+ $groupsListContainer.removeClass('hidden');
+ UserList._updateGroupListLabel($td, e.checked);
+ });
+ },
+
+ /**
+ * Updates the groups list td with the given groups selection
+ */
+ _updateGroupListLabel: function($td, groups) {
+ var placeholder = $td.find('.groupsListContainer').attr('data-placeholder');
+ var $groupsEl = $td.find('.groupsList');
+ $groupsEl.text(groups.join(', ') || placeholder || t('settings', 'no group'));
+ $td.data('groups', groups);
}
};
@@ -637,13 +635,6 @@ $(document).ready(function () {
// TODO: move other init calls inside of initialize
UserList.initialize($('#userlist'));
- $('.groupsselect').each(function (index, element) {
- UserList.applyGroupSelect(element);
- });
- $('.subadminsselect').each(function (index, element) {
- UserList.applySubadminSelect(element);
- });
-
$userListBody.on('click', '.password', function (event) {
event.stopPropagation();
@@ -787,11 +778,25 @@ $(document).ready(function () {
});
});
+ $('#newuser .groupsListContainer').on('click', function (event) {
+ var $target = $(event.target);
+ event.stopPropagation();
+ var $div = $(this).closest('.groups');
+ UserList._triggerGroupEdit($div);
+ });
+ $userListBody.on('click', '.groups .groupsListContainer, .subadmins .groupsListContainer', function (event) {
+ event.stopPropagation();
+ var $td = $(this).closest('td');
+ var isSubadminSelect = $td.hasClass('subadmins');
+ UserList._triggerGroupEdit($td, isSubadminSelect);
+ });
+
// init the quota field select box after it is shown the first time
$('#app-settings').one('show', function() {
$(this).find('#default_quota').singleSelect().on('change', UserList.onQuotaSelect);
});
+ UserList._updateGroupListLabel($('#newuser .groups'), []);
$('#newuser').submit(function (event) {
event.preventDefault();
var username = $('#newusername').val();
@@ -827,7 +832,7 @@ $(document).ready(function () {
}
promise.then(function() {
- var groups = $('#newusergroups').val() || [];
+ var groups = $('#newuser .groups').data('groups') || [];
$.post(
OC.generateUrl('/settings/users/users'),
{