forked from 0x2620/pandora
add groups dialog
This commit is contained in:
parent
bb8bef991f
commit
01c398d7cb
1 changed files with 217 additions and 0 deletions
217
static/js/groupsDialog.js
Normal file
217
static/js/groupsDialog.js
Normal file
|
@ -0,0 +1,217 @@
|
||||||
|
'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
|
||||||
|
}),
|
||||||
|
|
||||||
|
isItem = options.type == 'item',
|
||||||
|
|
||||||
|
$content,
|
||||||
|
$label,
|
||||||
|
$groups = [],
|
||||||
|
$checkboxes = [],
|
||||||
|
$inputs = [],
|
||||||
|
$labels = [],
|
||||||
|
$removeButtons = [],
|
||||||
|
$addButton,
|
||||||
|
|
||||||
|
groups,
|
||||||
|
selectedGroups;
|
||||||
|
|
||||||
|
pandora.api[isItem ? 'get' : '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' : 'getUser');
|
||||||
|
pandora.api[isItem ? 'edit' : 'editUser']({
|
||||||
|
id: options.id,
|
||||||
|
groups: selectedGroups
|
||||||
|
}, function(result) {
|
||||||
|
// enableElements();
|
||||||
|
updateLabel(id);
|
||||||
|
that.triggerEvent('groups', {groups: selectedGroups});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function editGroup(id, name) {
|
||||||
|
// disableElements();
|
||||||
|
pandora.api.editGroup({id: id, name: name}, function(result) {
|
||||||
|
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({
|
||||||
|
value: Ox.contains(selectedGroups, group.name)
|
||||||
|
})
|
||||||
|
.css({
|
||||||
|
float: 'left',
|
||||||
|
margin: '4px'
|
||||||
|
})
|
||||||
|
.bindEvent({
|
||||||
|
change: function() {
|
||||||
|
edit(group.id);
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.appendTo($group);
|
||||||
|
$inputs[index] = Ox.Input({
|
||||||
|
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({
|
||||||
|
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) {
|
||||||
|
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 : 'User'
|
||||||
|
) + ': ' + options.name,
|
||||||
|
width: 552
|
||||||
|
})
|
||||||
|
.css({
|
||||||
|
margin: '4px'
|
||||||
|
})
|
||||||
|
.appendTo($content);
|
||||||
|
groups.forEach(renderGroup);
|
||||||
|
$addButton = Ox.Button({
|
||||||
|
title: Ox._('Add Group'),
|
||||||
|
width: 128
|
||||||
|
})
|
||||||
|
.css({
|
||||||
|
float: 'left',
|
||||||
|
margin: '4px 4px 4px 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) {
|
||||||
|
Ox.print('GROUP', result.data, Ox.getIndexById(groups, id));
|
||||||
|
$labels[Ox.getIndexById(groups, id)].options({
|
||||||
|
title: getLabelTitle(result.data)
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
return that;
|
||||||
|
|
||||||
|
};
|
Loading…
Reference in a new issue