Split discussion controls into three groups:

- user (reply, subscription)
- moderation (rename, sticky, tags)
- destructive (delete)

Will keep extension-added items organised nicely
This commit is contained in:
Toby Zerner 2015-06-25 15:31:15 +09:30
parent dc83415d86
commit be9dea172d
2 changed files with 39 additions and 6 deletions

View File

@ -70,7 +70,7 @@ export default function(app) {
} }
} }
Discussion.prototype.controls = function(context) { Discussion.prototype.userControls = function(context) {
var items = new ItemList(); var items = new ItemList();
if (context instanceof DiscussionPage) { if (context instanceof DiscussionPage) {
@ -78,20 +78,42 @@ export default function(app) {
? ActionButton.component({ icon: 'reply', label: app.session.user() ? 'Reply' : 'Log In to Reply', onclick: this.replyAction.bind(this, true, false) }) ? ActionButton.component({ icon: 'reply', label: app.session.user() ? 'Reply' : 'Log In to Reply', onclick: this.replyAction.bind(this, true, false) })
: ActionButton.component({ icon: 'reply', label: 'Can\'t Reply', className: 'disabled', title: 'You don\'t have permission to reply to this discussion.' }) : ActionButton.component({ icon: 'reply', label: 'Can\'t Reply', className: 'disabled', title: 'You don\'t have permission to reply to this discussion.' })
); );
items.add('separator', Separator.component());
} }
return items;
};
Discussion.prototype.moderationControls = function(context) {
var items = new ItemList();
if (this.canRename()) { if (this.canRename()) {
items.add('rename', ActionButton.component({ icon: 'pencil', label: 'Rename', onclick: this.renameAction.bind(this) })); items.add('rename', ActionButton.component({ icon: 'pencil', label: 'Rename', onclick: this.renameAction.bind(this) }));
} }
if (this.canDelete()) { return items;
items.add('separator2', Separator.component()); };
Discussion.prototype.destructiveControls = function(context) {
var items = new ItemList();
if (this.canDelete()) {
items.add('delete', ActionButton.component({ icon: 'times', label: 'Delete', onclick: this.deleteAction.bind(this) })); items.add('delete', ActionButton.component({ icon: 'times', label: 'Delete', onclick: this.deleteAction.bind(this) }));
} }
return items;
};
Discussion.prototype.controls = function(context) {
var items = new ItemList();
['user', 'moderation', 'destructive'].forEach(section => {
var controls = this[section+'Controls'](context).toArray();
if (controls.length) {
items.add(section, controls);
items.add(section+'Separator', Separator.component());
}
});
return items; return items;
} }
}; };

View File

@ -59,7 +59,18 @@ export default class ItemList {
} }
}); });
return array.map((item) => item.content); array = array.map(item => item.content);
//recursively flatten array
for (var i = 0, len = array.length; i < len; i++) {
if (array[i] instanceof Array) {
array = array.concat.apply([], array);
i-- //check current index again and flatten until there are no more nested arrays at that index
len = array.length;
}
}
return array;
} }
} }