'use strict'; pandora.ui.groupsDialog = function(options) { var that = Ox.Dialog({ buttons: [ Ox.Button({ title: Ox._('Done') }) .bindEvent({ click: function() { that.close(); } }) ], closeButton: true, content: Ox.LoadingScreen().start(), height: 256, removeOnClose: true, title: Ox._('Manage Groups'), width: 584 + Ox.UI.SCROLLBAR_SIZE }), canManageGroups = pandora.hasCapability('canManageUsers'), isItem = options.type == 'item', isDocument = options.type == 'document', $content, $label, $groups = [], $checkboxes = [], $inputs = [], $labels = [], $removeButtons = [], $addButton, groups, selectedGroups; if (options.groups) { selectedGroups = options.groups; renderGroups(); } else { pandora.api[ isItem ? 'get' : isDocument ? 'getDocument' : 'getUser' ]({ id: options.id, keys: ['groups'] }, function(result) { selectedGroups = result.data.groups; renderGroups(); }); } function addGroup() { // disableElements(); pandora.api.addGroup({name: Ox._('Untitled')}, function(result) { renderGroups(result.data.id); }); } function disableElements() { $checkboxes.concat($inputs).concat($removeButtons).concat($addButton) .forEach(function($element) { $element.options({disabled: true}); }); } function edit(id) { selectedGroups = groups.filter(function(group, index) { return $checkboxes[index].value(); }).map(function(group) { return group.name; }); // disableElements(); Ox.Request.clearCache( isItem ? 'get' : isDocument ? 'getDocument' : 'getUser' ); pandora.api[ isItem ? 'edit' : isDocument ? 'editDocument' : 'editUser' ]({ id: options.id, groups: selectedGroups }, function(result) { // enableElements(); updateLabel(id); that.triggerEvent('groups', {groups: selectedGroups}); }); } function editGroup(id, name) { var index = Ox.getIndexById(groups, id), previousName = groups[index].name; // disableElements(); pandora.api.editGroup({id: id, name: name}, function(result) { name = result.data.name; if (Ox.contains(selectedGroups, previousName)) { selectedGroups.splice( selectedGroups.indexOf(previousName), 1, name ); that.triggerEvent('groups', {groups: selectedGroups}); } renderGroups(); }); } function enableElements() { $checkboxes.concat($inputs).concat($removeButtons).concat($addButton) .forEach(function($element) { $element.options({disabled: false}); }); } function getLabelTitle(group) { return (group.items ? Ox.formatNumber(group.items) : Ox._('No')) + ' ' + Ox._(group.items == 1 ? 'item' : 'items') + ', ' + (group.users ? Ox.formatNumber(group.users) : Ox._('no')) + ' ' + Ox._(group.users == 1 ? 'user' : 'users'); } function removeGroup(id) { // disableElements(); pandora.api.removeGroup({id: id}, function(result) { var index = Ox.getIndexById(groups, id), name = groups[index].name; groups.splice(index, 1); index = selectedGroups.indexOf(name); if (index > -1) { selectedGroups.splice(index, 1); that.triggerEvent('groups', {groups: selectedGroups}); } renderGroups(); }); } function renderGroup(group, index) { var $group = $groups[index] = Ox.$('
') .appendTo($content); $checkboxes[index] = Ox.Checkbox({ disabled: !canManageGroups && !Ox.contains(pandora.user.groups, group.name), value: Ox.contains(selectedGroups, group.name) }) .css({ float: 'left', margin: '4px' }) .bindEvent({ change: function() { edit(group.id); } }) .appendTo($group); $inputs[index] = Ox.Input({ disabled: !canManageGroups, value: group.name, width: 192 }) .css({ float: 'left', margin: '4px' }) .bindEvent({ change: function(data) { editGroup(group.id, data.value); } }) .appendTo($group); $labels[index] = Ox.Label({ title: getLabelTitle(group), width: 192 }) .css({ float: 'left', margin: '4px' }) .appendTo($group); $removeButtons[index] = Ox.Button({ disabled: !canManageGroups, title: Ox._('Remove Group'), width: 128 }) .css({ float: 'left', margin: '4px' }) .bindEvent({ click: function() { removeGroup(group.id); } }) .appendTo($group); } function renderGroups(focusInput) { Ox.Request.clearCache('getGroups'); pandora.api.getGroups(function(result) { if (!canManageGroups) { result.data.groups = result.data.groups.filter(function(group) { return Ox.contains(pandora.user.groups, group.name) || Ox.contains(selectedGroups, group.name); }); } groups = Ox.sortBy(result.data.groups, 'name'); $content = Ox.Element().css({margin: '12px'}); $label = Ox.Label({ textAlign: 'center', title: Ox._( isItem ? pandora.site.itemName.singular : isDocument ? 'Document' : 'User' ) + ': ' + options.name, width: 552 }) .css({ margin: '16px 4px 4px 4px' }) .appendTo($content); groups.forEach(renderGroup); $addButton = Ox.Button({ disabled: !canManageGroups, title: Ox._('Add Group'), width: 128 }) .css({ float: 'left', margin: '4px 4px 16px 428px' }) .bindEvent({ click: addGroup }) .appendTo($content); that.options({content: $content}); if (focusInput) { $inputs[Ox.getIndexById(groups, focusInput)].focusInput(true); } }); } function updateLabel(id) { Ox.Request.clearCache('getGroup'); pandora.api.getGroup({id: id}, function(result) { $labels[Ox.getIndexById(groups, id)].options({ title: getLabelTitle(result.data) }); }); } return that; };