summaryrefslogtreecommitdiffstats
path: root/askbot/skins/common/media/js/tag_moderation.js
diff options
context:
space:
mode:
Diffstat (limited to 'askbot/skins/common/media/js/tag_moderation.js')
-rw-r--r--askbot/skins/common/media/js/tag_moderation.js217
1 files changed, 217 insertions, 0 deletions
diff --git a/askbot/skins/common/media/js/tag_moderation.js b/askbot/skins/common/media/js/tag_moderation.js
new file mode 100644
index 00000000..31e05e37
--- /dev/null
+++ b/askbot/skins/common/media/js/tag_moderation.js
@@ -0,0 +1,217 @@
+/**
+ * @constructor
+ * base class for two tag moderators - per thread
+ * and per tag
+ */
+var TagModerator = function() {
+ WrappedElement.call(this);
+ this._tagId = undefined;
+ this._threadId = undefined;
+};
+inherits(TagModerator, WrappedElement);
+
+TagModerator.prototype.setTagId = function(id) {
+ this._tagId = id;
+};
+
+TagModerator.prototype.getTagId = function() {
+ return this._tagId;
+};
+
+TagModerator.prototype.setThreadId = function(id) {
+ this._threadId = id;
+};
+
+TagModerator.prototype.getThreadId = function() {
+ return this._threadId;
+};
+
+TagModerator.prototype.afterActionHandler = function() {
+ throw "Implement me";
+};
+
+/**
+ * @return {function}
+ * the returned function makes an ajax post
+ * to the moderate tag url. thread id is added
+ * as parameter to data, if defined.
+ */
+TagModerator.prototype.getHandler = function(action) {
+ var me = this;
+ return function() {
+ var data = {
+ action: action,
+ tag_id: me.getTagId()
+ };
+ if (me.getThreadId() !== undefined) {
+ data['thread_id'] = me.getThreadId();
+ }
+ $.ajax({
+ type: 'POST',
+ dataType: 'json',
+ url: askbot['urls']['moderateSuggestedTag'],
+ cache: false,
+ data: data,
+ success: function(data) {
+ if (data['success']) {
+ $(me.getElement()).fadeOut();
+ me.afterActionHandler();
+ } else {
+ showMessage($(me.getElement()), data['error']);
+ }
+ }
+ });
+ };
+};
+/**
+ * @constructor
+ */
+var PerThreadTagModerator = function() {
+ TagModerator.call(this);
+ this._tagId = undefined;
+ this._threadId = undefined;
+ this._parent = undefined;
+};
+inherits(PerThreadTagModerator, TagModerator);
+
+PerThreadTagModerator.prototype.setParent = function(thing) {
+ this._parent = thing;
+};
+
+PerThreadTagModerator.prototype.afterActionHandler = function() {
+ var ancestor = this._parent;
+ ancestor.removeChild(this);
+ var childCount = ancestor.getChildCount();
+ if (childCount == 1) {
+ ancestor.hideButtons();
+ this.dispose();
+ } else if (childCount == 0) {
+ var table = $('.suggested-tags-table');
+ table.before($('<p>' + gettext('No suggested tags left') + '</p>'));
+ table.remove();
+ ancestor.dispose();
+ } else {
+ this.dispose();
+ }
+};
+
+PerThreadTagModerator.prototype.decorate = function(element) {
+ this._element = element;
+ this._threadId = element.data('threadId');
+
+ var acceptBtn = element.find('button.accept');
+ var rejectBtn = element.find('button.reject');
+
+ var mouseEnterHandler = function() {
+ acceptBtn.fadeIn('fast');
+ rejectBtn.fadeIn('fast');
+ return false;
+ };
+ var mouseLeaveHandler = function() {
+ acceptBtn.stop().hide();
+ rejectBtn.stop().hide();
+ return false;
+ };
+
+ element.mouseenter(mouseEnterHandler);
+ element.mouseleave(mouseLeaveHandler);
+
+ setupButtonEventHandlers(acceptBtn, this.getHandler('accept'));
+ setupButtonEventHandlers(rejectBtn, this.getHandler('reject'));
+ //threadInfo.hover(mouseEnterHandler, mouseLeaveHandler);
+ //element.hover(mouseEnterHandler, mouseLeaveHandler);
+};
+
+/**
+ * @constructor
+ */
+var AllThreadsTagModerator = function() {
+ TagModerator.call(this);
+ this._tag_entry_element = undefined;
+ this._children = [];
+};
+inherits(AllThreadsTagModerator, TagModerator);
+
+AllThreadsTagModerator.prototype.addChild = function(child) {
+ this._children.push(child);
+};
+
+AllThreadsTagModerator.prototype.getChildCount = function() {
+ return this._children.length;
+};
+
+AllThreadsTagModerator.prototype.removeChild = function(child) {
+ var idx = $.inArray(child, this._children);
+ if (idx == -1) {
+ return;
+ }
+ this._children.splice(idx, 1);
+};
+
+AllThreadsTagModerator.prototype.hideButtons = function() {
+ this._acceptBtn.hide();
+ this._rejectBtn.hide();
+};
+
+AllThreadsTagModerator.prototype.setTagEntryElement = function(element) {
+ this._tag_entry_element = element;
+};
+
+AllThreadsTagModerator.prototype.afterActionHandler = function() {
+ var me = this;
+ this._tag_entry_element.fadeOut('fast');
+ this._element.fadeOut('fast', function() { me.dispose() });
+};
+
+AllThreadsTagModerator.prototype.dispose = function() {
+ this._tag_entry_element.fadeOut('fast', function() {
+ $.each(this._children, function(idx, child) {
+ child.dispose();
+ });
+ });
+ AllThreadsTagModerator.superClass_.dispose.call(this);
+};
+
+AllThreadsTagModerator.prototype.decorate = function(element) {
+ this._element = element;
+
+ //var controls = new TagModerationControls();
+ //controls.setParent(this);
+
+ //var tagId = $(element).data('tagId');
+ //controls.setTagId(tagId);
+
+ var threads_data = [];
+ $(element).find('.thread-info').each(function(idx, element) {
+ var id = $(element).data('threadId');
+ var title = $(element).data('threadTitle');
+ threads_data.push([id, title]);
+ });
+ var acceptBtn = element.find('button.accept');
+ var rejectBtn = element.find('button.reject');
+ setupButtonEventHandlers(acceptBtn, this.getHandler('accept'));
+ setupButtonEventHandlers(rejectBtn, this.getHandler('reject'));
+ this._acceptBtn = acceptBtn;
+ this._rejectBtn = rejectBtn;
+};
+
+(function() {
+ $('.suggested-tag-row').each(function(idx, element) {
+ var tagEntry = $(element);
+ var tagId = tagEntry.data('tagId');
+
+ var tagMod = new AllThreadsTagModerator();
+ tagMod.decorate(tagEntry.next());
+ tagMod.setTagId(tagId);
+ tagMod.setTagEntryElement(tagEntry);
+
+ tagEntry.find('.thread-info').each(function(idx, element) {
+ var threadMod = new PerThreadTagModerator();
+ threadMod.setTagId(tagId);
+ threadMod.setParent(tagMod);
+ tagMod.addChild(threadMod);
+ threadMod.decorate($(element));
+ });
+
+ });
+})();