diff --git a/app/controllers/pools_controller.rb b/app/controllers/pools_controller.rb index 185cb052e..91a760331 100644 --- a/app/controllers/pools_controller.rb +++ b/app/controllers/pools_controller.rb @@ -16,6 +16,7 @@ class PoolsController < ApplicationController def index @search = Pool.search(params[:search]) @pools = @search.paginate(:page => params[:page]) + respond_with(@pools) end def show diff --git a/app/controllers/pools_posts_controller.rb b/app/controllers/pools_posts_controller.rb index b11617bef..d5c894460 100644 --- a/app/controllers/pools_posts_controller.rb +++ b/app/controllers/pools_posts_controller.rb @@ -1,18 +1,27 @@ class PoolsPostsController < ApplicationController - respond_to :html, :xml, :json + respond_to :html, :xml, :json, :js before_filter :member_only def create - @pool = Pool.find(params[:pool_id]) - @post = Post.find(params[:id]) + @pool = Pool.find_by_name(params[:pool_name]) || Pool.find(params[:pool_id]) + @post = Post.find(params[:post_id]) @pool.add_post!(@post) + append_pool_to_session(@pool) respond_with(@pool, :location => pool_path(@pool)) end def destroy @pool = Pool.find(params[:pool_id]) - @post = Post.find(params[:id]) + @post = Post.find(params[:post_id]) @pool.remove_post!(@post) respond_with(@pool, :location => pool_path(@pool)) end + +private + def append_pool_to_session(pool) + recent_pool_ids = session[:recent_pool_ids].to_s.scan(/\d+/) + recent_pool_ids << pool.id.to_s + recent_pool_ids = recent_pool_ids.slice(1, 5) if recent_pool_ids.size > 5 + session[:recent_pool_ids] = recent_pool_ids.uniq.join(",") + end end diff --git a/app/helpers/pools_helper.rb b/app/helpers/pools_helper.rb index 914922f98..2c2e59083 100644 --- a/app/helpers/pools_helper.rb +++ b/app/helpers/pools_helper.rb @@ -1,6 +1,6 @@ module PoolsHelper - def recent_pool_list - pool_ids = session[:recent_pool_ids].to_s.split(/,/) - pool_ids.map {|x| content_tag("option", x, :value => x)}.join("\n").html_safe + def recent_updated_pools(&block) + pool_ids = session[:recent_pool_ids].to_s.scan(/\d+/) + Pool.where(["id IN (?)", pool_ids]).each(&block) if pool_ids.any? end end diff --git a/app/views/pools/_form.html.erb b/app/views/pools/_form.html.erb index 38886cf2c..78a20e8f1 100644 --- a/app/views/pools/_form.html.erb +++ b/app/views/pools/_form.html.erb @@ -1,6 +1,5 @@ <%= simple_form_for(pool) do |f| %> <%= f.input :name %> <%= f.input :description %> - <%= f.input :is_active %> <%= f.button :submit %> <% end %> diff --git a/app/views/pools_posts/new.html.erb b/app/views/pools_posts/new.html.erb index 5b7aec111..7cb6a5bdb 100644 --- a/app/views/pools_posts/new.html.erb +++ b/app/views/pools_posts/new.html.erb @@ -1,4 +1,18 @@ -<%= form_for(post_pools_path(@post)) do %> -

Select a pool:

- <%= recent_pool_list %> -<% end %> +
+
+ <%= form_tag(pool_post_path) do %> + <%= hidden_field_tag "post_id", @post.id %> + <%= text_field_tag "pool_name", "", :size => 20 %> + <%= submit_tag "Select" %> + <% end %> + +
+

Recent Pools

+
    + <% recent_updated_pools.each do |pool| %> +
  • <%= pool.name %>
  • + <% end %> +
+
+
+
diff --git a/config/routes.rb b/config/routes.rb index f98835343..d26d83851 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -35,14 +35,12 @@ Danbooru::Application.routes.draw do end resources :note_versions, :only => [:index] resources :pools do - resources :posts, :controller => "pools_posts", :only => [:create, :destroy, :show] member do put :revert end end resources :pool_versions, :only => [:index] resources :posts do - resources :pools, :controller => "pools_posts", :only => [:create] resources :votes, :controller => "post_votes", :only => [:create, :destroy] member do put :revert @@ -70,6 +68,8 @@ Danbooru::Application.routes.draw do end resources :wiki_page_versions, :only => [:index] + match '/pool_post' => 'pools_posts#create', :via => :post, :as => 'pool_post' + match '/pool_post' => 'pools_posts#destroy', :via => :delete, :as => 'pool_post' match '/post_moderation/moderate' => 'post_moderation#moderate' match '/post_moderation/disapprove' => 'post_moderation#disapprove', :via => :put match '/post_moderation/approve' => 'post_moderation#approve', :via => :put diff --git a/public/javascripts/compiled/default.js b/public/javascripts/compiled/default.js index 9b7f411e3..35babe0d2 100644 --- a/public/javascripts/compiled/default.js +++ b/public/javascripts/compiled/default.js @@ -1423,10 +1423,26 @@ $(document).ready(function() { Danbooru.Pool.initialize_add_to_pool_link = function() { $("#add-to-pool-dialog").dialog({autoOpen: false}); + $("#c-pools-posts #a-new input[type=text]").autocomplete({ + source: function(req, resp) { + $.getJSON( + "/pools.json?search[name_contains]=" + req.term, + function(data) { + resp(data.map(function(x) {return x.pool.name;})); + } + ); + }, + minLength: 4, + }); + $("a#pool").click(function() { $("#add-to-pool-dialog").dialog("open"); return false; }); + + $("ul#recent-pools li").click(function() { + $("#pool_name").val($(this).html()); + }); } Danbooru.Pool.initialize_simple_edit = function() { diff --git a/public/javascripts/src/app/pools.js b/public/javascripts/src/app/pools.js index 35de60019..f7d6e1e97 100644 --- a/public/javascripts/src/app/pools.js +++ b/public/javascripts/src/app/pools.js @@ -9,10 +9,26 @@ Danbooru.Pool.initialize_add_to_pool_link = function() { $("#add-to-pool-dialog").dialog({autoOpen: false}); + $("#c-pools-posts #a-new input[type=text]").autocomplete({ + source: function(req, resp) { + $.getJSON( + "/pools.json?search[name_contains]=" + req.term, + function(data) { + resp(data.map(function(x) {return x.pool.name;})); + } + ); + }, + minLength: 4, + }); + $("a#pool").click(function() { $("#add-to-pool-dialog").dialog("open"); return false; }); + + $("ul#recent-pools li").click(function() { + $("#pool_name").val($(this).html()); + }); } Danbooru.Pool.initialize_simple_edit = function() { diff --git a/public/stylesheets/compiled/default.css b/public/stylesheets/compiled/default.css index 1a9a36d42..a3edc6186 100644 --- a/public/stylesheets/compiled/default.css +++ b/public/stylesheets/compiled/default.css @@ -217,6 +217,16 @@ form.simple_form div.input { div.dtext p { margin-bottom: 1em; } +/*** Pools Posts ***/ +div#c-pools-posts div#a-new form { + margin-bottom: 1em; } +div#c-pools-posts div#a-new h1 { + font-size: 1.2em; + font-weight: bold; } +div#c-pools-posts div#a-new li { + margin-left: 1em; + cursor: pointer; } + /*** Pools ***/ div#c-pools div#a-edit p { margin-bottom: 1em; diff --git a/public/stylesheets/src/default.scss b/public/stylesheets/src/default.scss index 3d239d3db..5b0dbb9e3 100644 --- a/public/stylesheets/src/default.scss +++ b/public/stylesheets/src/default.scss @@ -309,6 +309,28 @@ div.dtext { } +/*** Pools Posts ***/ + +div#c-pools-posts { + div#a-new { + form { + margin-bottom: 1em; + } + + h1 { + font-size: 1.2em; + font-weight: bold; + } + + li { + margin-left: 1em; + cursor: pointer; + } + } +} + + + /*** Pools ***/ div#c-pools { diff --git a/test/functional/pools_posts_controller_test.rb b/test/functional/pools_posts_controller_test.rb index ce3a1c006..cff7a7a0f 100644 --- a/test/functional/pools_posts_controller_test.rb +++ b/test/functional/pools_posts_controller_test.rb @@ -17,14 +17,14 @@ class PoolsPostsControllerTest < ActionController::TestCase context "create action" do should "add a post to a pool" do - post :create, {:pool_id => @pool.id, :id => @post.id, :format => "json"}, {:user_id => @user.id} + post :create, {:pool_id => @pool.id, :post_id => @post.id, :format => "json"}, {:user_id => @user.id} @pool.reload assert_equal([@post.id], @pool.post_id_array) end should "add a post to a pool once and only once" do @pool.add_post!(@post) - post :create, {:pool_id => @pool.id, :id => @post.id, :format => "json"}, {:user_id => @user.id} + post :create, {:pool_id => @pool.id, :post_id => @post.id, :format => "json"}, {:user_id => @user.id} @pool.reload assert_equal([@post.id], @pool.post_id_array) end @@ -36,14 +36,14 @@ class PoolsPostsControllerTest < ActionController::TestCase end should "remove a post from a pool" do - post :destroy, {:pool_id => @pool.id, :id => @post.id, :format => "json"}, {:user_id => @user.id} + post :destroy, {:pool_id => @pool.id, :post_id => @post.id, :format => "json"}, {:user_id => @user.id} @pool.reload assert_equal([], @pool.post_id_array) end should "do nothing if the post is not a member of the pool" do @pool.remove_post!(@post) - post :destroy, {:pool_id => @pool.id, :id => @post.id, :format => "json"}, {:user_id => @user.id} + post :destroy, {:pool_id => @pool.id, :post_id => @post.id, :format => "json"}, {:user_id => @user.id} @pool.reload assert_equal([], @pool.post_id_array) end