summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEvgeny Fadeev <evgeny.fadeev@gmail.com>2012-07-24 04:06:41 -0400
committerEvgeny Fadeev <evgeny.fadeev@gmail.com>2012-07-24 04:06:41 -0400
commit1ae7199b46eb30e77f184d7f5160d0a2b37c66ca (patch)
tree7ff3a4645f870543dc3ca2d3425b84ab9bc62b64
parent347a178cd35781b9b4110558184f2f30e792a7e6 (diff)
downloadaskbot-1ae7199b46eb30e77f184d7f5160d0a2b37c66ca.tar.gz
askbot-1ae7199b46eb30e77f184d7f5160d0a2b37c66ca.tar.bz2
askbot-1ae7199b46eb30e77f184d7f5160d0a2b37c66ca.zip
somewhat improved post moderation UI
-rw-r--r--askbot/skins/common/media/js/user.js156
-rw-r--r--askbot/skins/default/media/style/style.less29
-rw-r--r--askbot/skins/default/templates/meta/bottom_scripts.html3
-rw-r--r--askbot/skins/default/templates/user_profile/user_inbox.html10
4 files changed, 186 insertions, 12 deletions
diff --git a/askbot/skins/common/media/js/user.js b/askbot/skins/common/media/js/user.js
index ad0b8365..19000e6f 100644
--- a/askbot/skins/common/media/js/user.js
+++ b/askbot/skins/common/media/js/user.js
@@ -112,8 +112,8 @@ var setup_inbox = function(){
}
);
- var reject_post_dialog = new RejectPostDialog();
- reject_post_dialog.decorate($('#reject-edit-modal'));
+ var rejectPostDialog = new RejectPostDialog();
+ rejectPostDialog.decorate($('#reject-edit-modal'));
setupButtonEventHandlers(
$('#re_delete_post'),
function(){
@@ -121,10 +121,21 @@ var setup_inbox = function(){
if (data['id_list'].length === 0){
return;
}
- reject_post_dialog.setSelectedEditData(data);
- reject_post_dialog.show();
+ rejectPostDialog.setSelectedEditData(data);
+ rejectPostDialog.show();
}
);
+
+ if (askbot['data']['userIsAdminOrMod']) {
+ var responses = $('.response-parent');
+ responses.each(function(idx, response) {
+ var control = new PostModerationControls();
+ control.setParent($(response));
+ control.setReasonsDialog(rejectPostDialog);
+ rejectPostDialog.addPostModerationControl(control);
+ $(response).append(control.getElement());
+ });
+ }
//setupButtonEventHandlers($('.re_expand'),
// function(e){
// e.preventDefault();
@@ -154,6 +165,125 @@ var setup_badge_details_toggle = function(){
});
};
+var PostModerationControls = function() {
+ WrappedElement.call(this);
+};
+inherits(PostModerationControls, WrappedElement);
+
+PostModerationControls.prototype.setParent = function(parent_element) {
+ this._parent_element = parent_element;
+};
+
+PostModerationControls.prototype.setReasonsDialog = function(dialog) {
+ this._reasonsDialog = dialog;
+};
+
+PostModerationControls.prototype.getMemoId = function() {
+ return this._parent_element.data('responseId');
+};
+
+PostModerationControls.prototype.removeMemo = function() {
+ var reId = this.getMemoId();
+ $('#re_' + reId).remove();
+};
+
+PostModerationControls.prototype.addReason = function(id, title) {
+ var li = this.makeElement('li');
+ var anchor = this.makeElement('a');
+ anchor.html(title);
+ anchor.data('postId', id);
+ li.append(anchor);
+ var adderLink = this._reasonList.children().last();
+ adderLink.before(li);
+ //attach event handler
+ var me = this;
+ setupButtonEventHandlers(anchor, function() { me.moderatePost(id, 'delete_post') });
+};
+
+PostModerationControls.prototype.moderatePost = function(reasonId, actionType){
+ var me = this;
+ var data = {
+ reject_reason_id: reasonId,
+ memo_list: [me.getMemoId()],
+ action_type: actionType
+ };
+ $.ajax({
+ type: 'POST',
+ dataType: 'json',
+ cache: false,
+ data: JSON.stringify(data),
+ url: askbot['urls']['manageInbox'],
+ success: function(data){
+ if (data['success']){
+ me.removeMemo();
+ me.dispose();
+ if (actionType === 'delete') {
+ notify.show(gettext('Post deleted'));
+ } else if (actionType === 'remove_flag') {
+ notify.show(gettext('Post approved'));
+ }
+ } else {
+ notify.show(data['message']);
+ }
+ }
+ });
+};
+
+
+PostModerationControls.prototype.createDom = function() {
+ var toolbar = this.makeElement('div');
+ toolbar.addClass('btn-toolbar post-moderation-controls');
+ this._element = toolbar;
+
+ var div = this.makeElement('div');
+ div.addClass('btn-group');
+ toolbar.append(div);
+
+ var acceptBtn = this.makeElement('a');
+ acceptBtn.addClass('btn save-reason');
+ acceptBtn.html(gettext('Accept'));
+ div.append(acceptBtn);
+
+ div = this.makeElement('div');
+ div.addClass('btn-group dropdown');
+ toolbar.append(div);
+
+ var toggle = this.makeElement('button');
+ toggle.addClass('btn btn-danger dropdown-toggle');
+ toggle.append($('<span>' + gettext('Reject') + '</span>'));
+ toggle.append($('<span class="caret"></span>'));
+ div.append(toggle);
+
+ toggle.dropdown();
+
+ var ul = this.makeElement('ul');
+ ul.addClass('dropdown-menu');
+ div.append(ul);
+
+ this._reasonList = ul;
+
+ //reason adder
+ var li = this.makeElement('li');
+ var anchor = this.makeElement('a');
+ anchor.html(gettext('add new reject reason'));
+ li.append(anchor);
+ ul.append(li);
+
+ //append menu items
+ var me = this;
+ $.each(askbot['data']['postRejectReasons'], function(idx, reason) {
+ me.addReason(reason['id'], reason['title']);
+ });
+
+ var reasonsDlg = this._reasonsDialog;
+ setupButtonEventHandlers(anchor, function() {
+ reasonsDlg.show();
+ });
+ setupButtonEventHandlers(acceptBtn, function() {
+ me.moderatePost(null, 'remove_flag');
+ });
+};
+
/**
* @constructor
* manages post/edit reject reasons
@@ -164,6 +294,7 @@ var RejectPostDialog = function(){
this._selected_edit_ids = null;
this._selected_reason_id = null;
this._state = null;//'select', 'preview', 'add-new'
+ this._postModerationControls = [];
};
inherits(RejectPostDialog, WrappedElement);
@@ -171,6 +302,10 @@ RejectPostDialog.prototype.setSelectedEditData = function(data){
this._selected_edit_data = data;
};
+RejectPostDialog.prototype.addPostModerationControl = function(control) {
+ this._postModerationControls.push(control);
+};
+
RejectPostDialog.prototype.setState = function(state){
this._state = state;
this.clearErrors();
@@ -274,6 +409,13 @@ RejectPostDialog.prototype.addSelectableReason = function(data){
var title = data['title'];
var details = data['details'];
this._select_box.addItem(id, title, details);
+
+ askbot['data']['postRejectReasons'].push(
+ {id: data['reason_id'], title: data['title']}
+ );
+ $.each(this._postModerationControls, function(idx, control) {
+ control.addReason(data['reason_id'], data['title']);
+ });
};
RejectPostDialog.prototype.startSavingReason = function(callback){
@@ -313,10 +455,10 @@ RejectPostDialog.prototype.startSavingReason = function(callback){
success: function(data){
if (data['success']){
//show current reason data and focus on it
+ me.addSelectableReason(data);
if (callback){
callback(data);
} else {
- me.addSelectableReason(data);
me.setState('select');
}
} else {
@@ -334,7 +476,7 @@ RejectPostDialog.prototype.rejectPost = function(reason_id){
reject_reason_id: reason_id,
memo_list: memo_ids,
action_type: 'delete_post'
- }
+ };
$.ajax({
type: 'POST',
dataType: 'json',
@@ -427,7 +569,7 @@ RejectPostDialog.prototype.decorate = function(element){
var title_input = new TippedInput();
title_input.decorate($(reject_title_input));
this._title_input = title_input;
-
+
var reject_details_input = $(this._element)
.find('textarea.reject-reason-details');
diff --git a/askbot/skins/default/media/style/style.less b/askbot/skins/default/media/style/style.less
index 916312d8..8325e084 100644
--- a/askbot/skins/default/media/style/style.less
+++ b/askbot/skins/default/media/style/style.less
@@ -2269,6 +2269,27 @@ ul#related-tags li {
.cancel:hover{
background:url(../images/small-button-cancel.png) repeat-x bottom !important;
}
+ .re {
+ float: left;
+ width: 960px;
+ }
+}
+
+.admin.user-profile-page {
+ .re {
+ width: 810px;
+ }
+ .post-moderation-controls {
+ float: left;
+ width: 150px;
+ margin-top: 23px;
+ text-align: right;
+ }
+ .dropdown:hover {
+ ul.dropdown-menu {
+ display: block;
+ }
+ }
}
.openid-signin form {
@@ -2691,7 +2712,7 @@ ins .post-tag, ins p, ins {
width: 100%;
clear: both;
border-top: 1px solid #000;
- padding: 6px 0 0 0;
+ padding: 16px 0 0 0;
background: @header-color;
font-size:16px;
font-family:@main-font;
@@ -2704,7 +2725,7 @@ ins .post-tag, ins p, ins {
.footer-links {
color: #EEE;
text-align:left;
- width:500px;
+ width:450px;
float:left;
a {
color: #e7e8a8;
@@ -2712,7 +2733,7 @@ ins .post-tag, ins p, ins {
}
.powered-link{
- width:500px;
+ width:450px;
float:left;
text-align:left;
a{
@@ -2722,7 +2743,7 @@ ins .post-tag, ins p, ins {
.copyright{
color:#616161;
- width:450px;
+ width:500px;
float:right;
text-align:right;
diff --git a/askbot/skins/default/templates/meta/bottom_scripts.html b/askbot/skins/default/templates/meta/bottom_scripts.html
index 6c132203..2a7c85a5 100644
--- a/askbot/skins/default/templates/meta/bottom_scripts.html
+++ b/askbot/skins/default/templates/meta/bottom_scripts.html
@@ -71,6 +71,9 @@
{% else %}
animateHashes();
{% endif %}
+ if (askbot['data']['userIsAdminOrMod']) {
+ $('body').addClass('admin');
+ }
});
{% if user_messages %}
$('#validate_email_alert').click(function(){notify.close(true)})
diff --git a/askbot/skins/default/templates/user_profile/user_inbox.html b/askbot/skins/default/templates/user_profile/user_inbox.html
index cda45027..f90d794c 100644
--- a/askbot/skins/default/templates/user_profile/user_inbox.html
+++ b/askbot/skins/default/templates/user_profile/user_inbox.html
@@ -70,7 +70,7 @@ inbox_section - forum|flags
{% include "user_profile/reject_post_dialog.html" %}
<div id="responses">
{% for response in responses %}
- <div class="response-parent">
+ <div class="response-parent" data-response-id="{{response.id}}">
<p class="headline">
<strong>"{{ response.response_title.strip()|escape}}"</strong>
</p>
@@ -79,6 +79,7 @@ inbox_section - forum|flags
{{ macros.inbox_post_snippet(nested_response, inbox_section) }}
{%endfor%}
</div>
+ <div class="clearfix"></div>
{% endfor %}
</div>
</div>
@@ -90,6 +91,13 @@ inbox_section - forum|flags
askbot['urls']['manageInbox'] = '{% url manage_inbox %}';
askbot['urls']['save_post_reject_reason'] = '{% url save_post_reject_reason %}';
askbot['urls']['delete_post_reject_reason'] = '{% url delete_post_reject_reason %}';
+ {% if request.user.is_administrator_or_moderator() %}
+ askbot['data']['postRejectReasons'] = [
+ {% for reason in post_reject_reasons %}
+ {'id': {{reason.id}}, 'title': '{{reason.title|escapejs}}'},
+ {% endfor %}
+ ];
+ {% endif %}
$(document).ready(function(){
setup_inbox();
});