implemented javascripts for approval/disapproval/unapproval from post/show page

This commit is contained in:
albert
2011-02-10 19:08:23 -05:00
parent 00ea319743
commit 33f5350677
19 changed files with 234 additions and 17 deletions

View File

@@ -1,22 +1,50 @@
class PostModerationController < ApplicationController class PostModerationController < ApplicationController
respond_to :html, :xml, :json
before_filter :janitor_only before_filter :janitor_only
rescue_from Post::ApprovalError, :with => :approval_error
rescue_from Post::DisapprovalError, :with => :disapproval_error
def moderate def moderate
@search = Post.pending.available_for_moderation.search(params[:search]).order("id asc") @search = Post.pending.available_for_moderation.search(params[:search]).order("id asc")
@posts = @search.paginate(:page => params[:page]) @posts = @search.paginate(:page => params[:page])
respond_with(@posts) respond_to do |format|
format.html
format.json {render :json => @posts.to_json}
end
end end
def approve def approve
@post = Post.find(params[:post_id]) @post = Post.find(params[:post_id])
@post.approve! @post.approve!
respond_with(@post, :location => post_moderation_moderate_path) respond_to do |format|
format.html {redirect_to(post_moderation_moderate_path, :notice => "Post approved")}
format.js
end
end end
def disapprove def disapprove
@post = Post.find(params[:post_id]) @post = Post.find(params[:post_id])
@post_disapproval = PostDisapproval.create(:post => @post, :user => CurrentUser.user) @post_disapproval = PostDisapproval.create(:post => @post, :user => CurrentUser.user)
respond_with(@post_disapproval, :location => post_moderation_moderate_path) if @post_disapproval.errors.any?
raise Post::DisapprovalError.new(@post_disapproval.errors.full_messages)
end
respond_to do |format|
format.html {redirect_to(post_moderation_moderate_path, :notice => "Post disapproved")}
format.js
end
end
private
def disapproval_error(e)
respond_to do |format|
format.html {redirect_to(post_moderation_moderate_path, :notice => "You have already disapproved this post")}
format.js {render :action => "disapproval_error"}
end
end
def approval_error(e)
respond_to do |format|
format.html {redirect_to(post_moderation_moderate_path, :notice => e.message)}
format.js {@exception = e; render :action => "approval_error"}
end
end end
end end

View File

@@ -1,6 +1,6 @@
class UnapprovalsController < ApplicationController class UnapprovalsController < ApplicationController
before_filter :member_only before_filter :member_only
respond_to :html, :xml, :json respond_to :html, :xml, :json, :js
rescue_from User::PrivilegeError, :with => "static/access_denied" rescue_from User::PrivilegeError, :with => "static/access_denied"
def new def new
@@ -15,7 +15,7 @@ class UnapprovalsController < ApplicationController
def create def create
@unapproval = Unapproval.create(params[:unapproval]) @unapproval = Unapproval.create(params[:unapproval])
respond_with(@unapproval, :location => post_path(@unapproval.post_id)) respond_with(@unapproval)
end end
def destroy def destroy

View File

@@ -33,6 +33,10 @@ module ApplicationHelper
end end
end end
def wait_image(html_id)
('<img src="/images/wait.gif" style="display: none;" id="' + html_id + '">').html_safe
end
protected protected
def nav_link_match(controller, url) def nav_link_match(controller, url)
url =~ case controller url =~ case controller

View File

@@ -1,5 +1,6 @@
class Post < ActiveRecord::Base class Post < ActiveRecord::Base
class ApprovalError < Exception ; end class ApprovalError < Exception ; end
class DisapprovalError < Exception ; end
attr_accessor :old_tag_string, :old_parent_id attr_accessor :old_tag_string, :old_parent_id
after_destroy :delete_files after_destroy :delete_files
@@ -203,6 +204,10 @@ class Post < ActiveRecord::Base
is_pending == false && is_flagged == false && unapproval.nil? is_pending == false && is_flagged == false && unapproval.nil?
end end
def is_approvable?
(is_pending? || is_flagged?) && approver_string != "approver:#{CurrentUser.name}"
end
def unapprove!(reason) def unapprove!(reason)
raise Unapproval::Error.new("This post is still pending approval") if is_pending? raise Unapproval::Error.new("This post is still pending approval") if is_pending?
raise Unapproval::Error.new("This post has already been flagged") if is_flagged? raise Unapproval::Error.new("This post has already been flagged") if is_flagged?
@@ -222,7 +227,7 @@ class Post < ActiveRecord::Base
end end
def approve! def approve!
raise ApprovalError.new("You have already approved this post previously") if approver_string == "approver:#{CurrentUser.name}" raise ApprovalError.new("You have previously approved this post and cannot approve it again") if approver_string == "approver:#{CurrentUser.name}"
self.is_flagged = false self.is_flagged = false
self.is_pending = false self.is_pending = false

View File

@@ -4,7 +4,22 @@ class Unapproval < ActiveRecord::Base
belongs_to :unapprover, :class_name => "User" belongs_to :unapprover, :class_name => "User"
belongs_to :post belongs_to :post
validates_presence_of :reason, :unapprover_id, :unapprover_ip_addr validates_presence_of :reason, :unapprover_id, :unapprover_ip_addr
validate :validate_post_is_active
before_validation :initialize_unapprover, :on => :create before_validation :initialize_unapprover, :on => :create
before_save :flag_post
def validate_post_is_active
if post.is_pending? || post.is_flagged? || post.is_removed?
errors[:post] << "is inactive"
false
else
true
end
end
def flag_post
post.update_attribute(:is_flagged, true)
end
def initialize_unapprover def initialize_unapprover
self.unapprover_id = CurrentUser.id self.unapprover_id = CurrentUser.id

View File

@@ -0,0 +1,2 @@
Danbooru.Utility.j_error(<%= @exception.message.to_json.html_safe %>);
$("img#approve-wait").hide();

View File

@@ -0,0 +1,4 @@
$("a#approve").hide();
$("a#disapprove").hide();
$("a#unapprove").show();
$("img#approve-wait").hide();

View File

@@ -0,0 +1,2 @@
Danbooru.Utility.j_error("You have already disapproved this post");
$("img#disapprove-wait").hide();

View File

@@ -0,0 +1,4 @@
$("a#approve").hide();
$("a#disapprove").hide();
$("a#unapprove").hide();
$("img#disapprove-wait").hide();

View File

@@ -1,16 +1,12 @@
<ul> <ul>
<%= resize_image_links(post, CurrentUser.user) %> <%= resize_image_links(post, CurrentUser.user) %>
<li><%= link_to "Favorite", "#", :id => "add-to-favorites" %> <img src="/images/wait.gif" style="display: none;" id="add-to-favorites-wait"></li> <li><%= link_to "Favorite", "#", :id => "add-to-favorites" %> <%= wait_image("add-to-favorites-wait") %></li>
<li><%= link_to "Unfavorite", "#", :id => "remove-from-favorites" %> <img src="/images/wait.gif" style="display: none;" id="remove-from-favorites-wait"></li> <li><%= link_to "Unfavorite", "#", :id => "remove-from-favorites" %> <%= wait_image("remove-from-favorites-wait") %></li>
<li><%= link_to "Translate", "#" %></li> <li><%= link_to "Translate", "#" %></li>
<% if !post.is_flagged? %> <li><%= link_to "Unapprove", new_unapproval_path(:post_id => post.id), :id => "unapprove" %></li>
<li><%= link_to "Unapprove", new_unapproval_path(:post_id => post.id), :id => "unapprove" %></li>
<% end %>
<% if CurrentUser.is_janitor? %> <% if CurrentUser.is_janitor? %>
<% if post.is_pending? || post.is_flagged? %> <li><%= link_to "Approve", "#", :id => "approve" %> <%= wait_image("approve-wait") %></li>
<li><%= link_to "Approve", "#", :id => "approve" %> <img src="/images/wait.gif" style="display: none;" id="approve-wait"></li> <li><%= link_to "Disapprove", "#", :id => "disapprove" %> <%= wait_image("disapprove-wait") %></li>
<li><%= link_to "Disapprove", "#", :id => "disapprove" %> <img src="/images/wait.gif" style="display: none;" id="disapprove-wait"></li>
<% end %>
<% end %> <% end %>
<% if CurrentUser.is_moderator? %> <% if CurrentUser.is_moderator? %>
<% if post.is_removed? %> <% if post.is_removed? %>

View File

@@ -68,6 +68,7 @@
<meta name="pools" content="<%= @post.pool_string %>"> <meta name="pools" content="<%= @post.pool_string %>">
<meta name="post-id" content="<%= @post.id %>"> <meta name="post-id" content="<%= @post.id %>">
<meta name="post-is-unapprovable" content="<%= @post.is_unapprovable? %>"> <meta name="post-is-unapprovable" content="<%= @post.is_unapprovable? %>">
<meta name="post-is-approvable" content="<%= @post.is_approvable? %>">
<% end %> <% end %>
<%= render :partial => "posts/partials/common/secondary_links" %> <%= render :partial => "posts/partials/common/secondary_links" %>

View File

@@ -0,0 +1,9 @@
var errors = <%= @unapproval.errors.full_messages.to_json.html_safe %>;
if (errors.length > 0) {
Danbooru.Utility.j_error(errors.join("; "));
} else {
Danbooru.Utility.j_alert("Unapproval", "Unapproval successful");
$("a#approve").show();
$("a#disapprove").show();
$("a#unapprove").hide();
}

View File

@@ -1,4 +1,5 @@
<p>You can unapprove a post if you believe it breaks the rules or doesn't belong on this site. You must provide a reason.</p> <p>You can unapprove a post if you believe it breaks the rules or doesn't belong on this site. You must provide a reason.</p>
<%= form_for(@unapproval) do |f| %> <%= form_for(@unapproval, :remote => true, :format => :js) do |f| %>
<%= hidden_field_tag "unapproval[post_id]", @unapproval.post_id %>
<%= f.text_area :reason, :size => "40x5" %> <%= f.text_area :reason, :size => "40x5" %>
<% end %> <% end %>

View File

@@ -817,6 +817,18 @@ $(document).ready(function() {
var Danbooru = {}; var Danbooru = {};
(function() {
Danbooru.Utility = {};
Danbooru.Utility.j_alert = function(title, msg) {
$('<div title="' + title + '"></div>').html(msg).dialog();
}
Danbooru.Utility.j_error = function(msg) {
this.j_alert("Error", msg);
}
})();
// PostModeMenu = { // PostModeMenu = {
// init: function() { // init: function() {
// this.original_background_color = $(document.body).css("background-color") // this.original_background_color = $(document.body).css("background-color")
@@ -1190,6 +1202,13 @@ $(document).ready(function() {
Danbooru.Unapproval.initialize_all = function() { Danbooru.Unapproval.initialize_all = function() {
this.initialize_unapprove(); this.initialize_unapprove();
this.hide_or_show_unapprove_link();
}
Danbooru.Unapproval.hide_or_show_unapprove_link = function() {
if ($("meta[name=post-is-unapprovable]").attr("content") != "true") {
$("a#unapprove").hide();
}
} }
Danbooru.Unapproval.initialize_unapprove = function() { Danbooru.Unapproval.initialize_unapprove = function() {
@@ -1200,6 +1219,7 @@ $(document).ready(function() {
buttons: { buttons: {
"Submit": function() { "Submit": function() {
$("#unapprove-dialog form").submit(); $("#unapprove-dialog form").submit();
$(this).dialog("close");
}, },
"Cancel": function() { "Cancel": function() {
$(this).dialog("close"); $(this).dialog("close");
@@ -1217,3 +1237,53 @@ $(document).ready(function() {
$(document).ready(function() { $(document).ready(function() {
Danbooru.Unapproval.initialize_all(); Danbooru.Unapproval.initialize_all();
}); });
(function() {
Danbooru.PostModeration = {};
Danbooru.PostModeration.initialize_all = function() {
this.initialize_approve_link();
this.initialize_disapprove_link();
this.hide_or_show_approve_and_disapprove_links();
}
Danbooru.PostModeration.hide_or_show_approve_and_disapprove_links = function() {
if ($("meta[name=post-is-approvable]").attr("content") != "true") {
$("a#approve").hide();
$("a#disapprove").hide();
}
}
Danbooru.PostModeration.initialize_disapprove_link = function() {
$("a#disapprove").click(function() {
$.ajax({
url: "/post_moderation/disapprove.js",
type: "put",
data: {
post_id: $("meta[name=post-id]").attr("content")
},
beforeSend: function() {
$("img#disapprove-wait").show();
}
});
});
}
Danbooru.PostModeration.initialize_approve_link = function() {
$("a#approve").click(function() {
$.ajax({
url: "/post_moderation/approve.js",
type: "put",
data: {
post_id: $("meta[name=post-id]").attr("content")
},
beforeSend: function() {
$("img#approve-wait").show();
}
});
});
}
})();
$(document).ready(function() {
Danbooru.PostModeration.initialize_all();
});

View File

@@ -0,0 +1,50 @@
(function() {
Danbooru.PostModeration = {};
Danbooru.PostModeration.initialize_all = function() {
this.initialize_approve_link();
this.initialize_disapprove_link();
this.hide_or_show_approve_and_disapprove_links();
}
Danbooru.PostModeration.hide_or_show_approve_and_disapprove_links = function() {
if ($("meta[name=post-is-approvable]").attr("content") != "true") {
$("a#approve").hide();
$("a#disapprove").hide();
}
}
Danbooru.PostModeration.initialize_disapprove_link = function() {
$("a#disapprove").click(function() {
$.ajax({
url: "/post_moderation/disapprove.js",
type: "put",
data: {
post_id: $("meta[name=post-id]").attr("content")
},
beforeSend: function() {
$("img#disapprove-wait").show();
}
});
});
}
Danbooru.PostModeration.initialize_approve_link = function() {
$("a#approve").click(function() {
$.ajax({
url: "/post_moderation/approve.js",
type: "put",
data: {
post_id: $("meta[name=post-id]").attr("content")
},
beforeSend: function() {
$("img#approve-wait").show();
}
});
});
}
})();
$(document).ready(function() {
Danbooru.PostModeration.initialize_all();
});

View File

@@ -3,6 +3,13 @@
Danbooru.Unapproval.initialize_all = function() { Danbooru.Unapproval.initialize_all = function() {
this.initialize_unapprove(); this.initialize_unapprove();
this.hide_or_show_unapprove_link();
}
Danbooru.Unapproval.hide_or_show_unapprove_link = function() {
if ($("meta[name=post-is-unapprovable]").attr("content") != "true") {
$("a#unapprove").hide();
}
} }
Danbooru.Unapproval.initialize_unapprove = function() { Danbooru.Unapproval.initialize_unapprove = function() {
@@ -13,6 +20,7 @@
buttons: { buttons: {
"Submit": function() { "Submit": function() {
$("#unapprove-dialog form").submit(); $("#unapprove-dialog form").submit();
$(this).dialog("close");
}, },
"Cancel": function() { "Cancel": function() {
$(this).dialog("close"); $(this).dialog("close");

View File

@@ -0,0 +1,12 @@
(function() {
Danbooru.Utility = {};
Danbooru.Utility.j_alert = function(title, msg) {
$('<div title="' + title + '"></div>').html(msg).dialog();
}
Danbooru.Utility.j_error = function(msg) {
this.j_alert("Error", msg);
}
})();

View File

@@ -8,9 +8,11 @@ cat public/javascripts/src/lib/jrails.min.js >> public/javascripts/compiled/defa
cat public/javascripts/src/lib/rails.js >> public/javascripts/compiled/default.js cat public/javascripts/src/lib/rails.js >> public/javascripts/compiled/default.js
cat public/javascripts/src/app/cookie.js >> public/javascripts/compiled/default.js cat public/javascripts/src/app/cookie.js >> public/javascripts/compiled/default.js
cat public/javascripts/src/app/application.js >> public/javascripts/compiled/default.js cat public/javascripts/src/app/application.js >> public/javascripts/compiled/default.js
cat public/javascripts/src/app/utility.js >> public/javascripts/compiled/default.js
cat public/javascripts/src/app/posts.js >> public/javascripts/compiled/default.js cat public/javascripts/src/app/posts.js >> public/javascripts/compiled/default.js
cat public/javascripts/src/app/comments.js >> public/javascripts/compiled/default.js cat public/javascripts/src/app/comments.js >> public/javascripts/compiled/default.js
cat public/javascripts/src/app/uploads.js >> public/javascripts/compiled/default.js cat public/javascripts/src/app/uploads.js >> public/javascripts/compiled/default.js
cat public/javascripts/src/app/users.js >> public/javascripts/compiled/default.js cat public/javascripts/src/app/users.js >> public/javascripts/compiled/default.js
cat public/javascripts/src/app/favorites.js >> public/javascripts/compiled/default.js cat public/javascripts/src/app/favorites.js >> public/javascripts/compiled/default.js
cat public/javascripts/src/app/unapprovals.js >> public/javascripts/compiled/default.js cat public/javascripts/src/app/unapprovals.js >> public/javascripts/compiled/default.js
cat public/javascripts/src/app/post_moderation.js >> public/javascripts/compiled/default.js

4
script/testing/reset_post_1.sh Executable file
View File

@@ -0,0 +1,4 @@
#!/usr/bin/env bash
psql -c "UPDATE posts SET is_flagged = false, is_pending = true, approver_string = '' WHERE id = 1" danbooru2
psql -c "DELETE FROM unapprovals" danbooru2