pandora/static/js/groupsDialog.js

257 lines
7.7 KiB
JavaScript

'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.$('<div>')
.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;
};