From 1ae7199b46eb30e77f184d7f5160d0a2b37c66ca Mon Sep 17 00:00:00 2001 From: Evgeny Fadeev Date: Tue, 24 Jul 2012 04:06:41 -0400 Subject: somewhat improved post moderation UI --- askbot/skins/common/media/js/user.js | 156 ++++++++++++++++++++- askbot/skins/default/media/style/style.less | 29 +++- .../default/templates/meta/bottom_scripts.html | 3 + .../default/templates/user_profile/user_inbox.html | 10 +- 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($('' + gettext('Reject') + '')); + toggle.append($('')); + 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" %}
{% for response in responses %} -
+

"{{ response.response_title.strip()|escape}}"

@@ -79,6 +79,7 @@ inbox_section - forum|flags {{ macros.inbox_post_snippet(nested_response, inbox_section) }} {%endfor%}
+
{% endfor %}
@@ -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(); }); -- cgit v1.2.3-1-g7c22