oh huh. looks like remove/move are ready.
This commit is contained in:
parent
6bba2ae288
commit
e6a2b978f1
6 changed files with 167 additions and 73 deletions
|
@ -364,6 +364,14 @@
|
||||||
return $(hangersElQuery + " input[type=checkbox]");
|
return $(hangersElQuery + " input[type=checkbox]");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function getCheckedIds() {
|
||||||
|
var checkedIds = [];
|
||||||
|
getCheckboxes().filter(':checked').each(function() {
|
||||||
|
if (this.checked) checkedIds.push(this.id);
|
||||||
|
});
|
||||||
|
return checkedIds;
|
||||||
|
}
|
||||||
|
|
||||||
getCheckboxes().live("change", updateBulkActions);
|
getCheckboxes().live("change", updateBulkActions);
|
||||||
|
|
||||||
function updateBulkActions() {
|
function updateBulkActions() {
|
||||||
|
@ -372,12 +380,65 @@
|
||||||
$('.bulk-actions-target-count').text(checkedCount);
|
$('.bulk-actions-target-count').text(checkedCount);
|
||||||
}
|
}
|
||||||
|
|
||||||
function maintainCheckboxes(fn) {
|
$(".bulk-actions-move-all").bind("submit", function(e) {
|
||||||
var checkedIds = [];
|
// TODO: DRY
|
||||||
getCheckboxes().filter(':checked').each(function() {
|
e.preventDefault();
|
||||||
if (this.checked) checkedIds.push(this.id);
|
var form = $(this);
|
||||||
|
var data = form.serializeArray();
|
||||||
|
data.push({name: "return_to", value: window.location.pathname + window.location.search});
|
||||||
|
|
||||||
|
var checkedBoxes = getCheckboxes().filter(':checked');
|
||||||
|
checkedBoxes.each(function() {
|
||||||
|
data.push({name: "ids[]", value: $(this).closest('.object').attr('data-id')});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
$.ajax({
|
||||||
|
url: form.attr("action"),
|
||||||
|
type: form.attr("method"),
|
||||||
|
data: data,
|
||||||
|
success: function (html) {
|
||||||
|
var doc = $(html);
|
||||||
|
maintainCheckboxes(function() {
|
||||||
|
hangersEl.html( doc.find('#closet-hangers').html() );
|
||||||
|
hangersInit();
|
||||||
|
});
|
||||||
|
doc.find('.flash').hide().insertBefore(hangersEl).show(500).delay(5000).hide(250);
|
||||||
|
itemsSearchField.val("");
|
||||||
|
},
|
||||||
|
error: function (xhr) {
|
||||||
|
handleSaveError(xhr, "moving these items");
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
$(".bulk-actions-remove-all").bind("submit", function(e) {
|
||||||
|
e.preventDefault();
|
||||||
|
var form = $(this);
|
||||||
|
var hangerIds = [];
|
||||||
|
var checkedBoxes = getCheckboxes().filter(':checked');
|
||||||
|
var hangerEls = $();
|
||||||
|
checkedBoxes.each(function() {
|
||||||
|
hangerEls = hangerEls.add($(this).closest('.object'));
|
||||||
|
});
|
||||||
|
hangerEls.each(function() {
|
||||||
|
hangerIds.push($(this).attr('data-id'));
|
||||||
|
});
|
||||||
|
$.ajax({
|
||||||
|
url: form.attr("action") + ".json?" + $.param({ids: hangerIds}),
|
||||||
|
type: "delete",
|
||||||
|
dataType: "json",
|
||||||
|
success: function () {
|
||||||
|
objectRemoved(hangerEls);
|
||||||
|
},
|
||||||
|
error: function () {
|
||||||
|
$.jGrowl("Error removing items. Try again?");
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
function maintainCheckboxes(fn) {
|
||||||
|
var checkedIds = getCheckedIds();
|
||||||
|
|
||||||
fn();
|
fn();
|
||||||
|
|
||||||
checkedIds.forEach(function(id) {
|
checkedIds.forEach(function(id) {
|
||||||
|
|
|
@ -86,13 +86,14 @@ body.closet_hangers-index
|
||||||
input
|
input
|
||||||
width: 30em
|
width: 30em
|
||||||
|
|
||||||
|
.bulk-actions
|
||||||
|
display: none
|
||||||
|
text-align: center
|
||||||
|
|
||||||
#closet-hangers
|
#closet-hangers
|
||||||
clear: both
|
clear: both
|
||||||
text-align: center
|
text-align: center
|
||||||
|
|
||||||
.bulk-actions
|
|
||||||
display: none
|
|
||||||
|
|
||||||
.object
|
.object
|
||||||
.quantity
|
.quantity
|
||||||
+opacity(.75)
|
+opacity(.75)
|
||||||
|
@ -370,44 +371,47 @@ body.closet_hangers-index
|
||||||
span:after
|
span:after
|
||||||
content: "…"
|
content: "…"
|
||||||
|
|
||||||
.bulk-actions
|
.bulk-actions
|
||||||
border-top: 1px solid $module-border-color
|
border-top: 1px solid $module-border-color
|
||||||
display: block
|
display: block
|
||||||
font-size: 85%
|
font-size: 85%
|
||||||
padding: .5em 1em
|
padding: .5em 1em
|
||||||
|
|
||||||
.bulk-actions-intro, .bulk-actions-target-desc-singular
|
.bulk-actions-intro, .bulk-actions-target-desc-singular
|
||||||
|
display: none
|
||||||
|
|
||||||
|
.bulk-actions-target-desc
|
||||||
|
display: inline-block
|
||||||
|
|
||||||
|
.bulk-actions-options
|
||||||
|
display: inline-block
|
||||||
|
list-style: none
|
||||||
|
|
||||||
|
> li
|
||||||
|
display: inline-block
|
||||||
|
margin-left: .75em
|
||||||
|
|
||||||
|
form
|
||||||
|
display: inline-block
|
||||||
|
|
||||||
|
&:not(:first-child)::before
|
||||||
|
content: " or "
|
||||||
|
display: inline-block
|
||||||
|
margin-right: .75em
|
||||||
|
|
||||||
|
&[data-target-count="0"]
|
||||||
|
.bulk-actions-intro
|
||||||
|
display: block
|
||||||
|
|
||||||
|
.bulk-actions-form
|
||||||
display: none
|
display: none
|
||||||
|
|
||||||
.bulk-actions-target-desc
|
&[data-target-count="1"]
|
||||||
display: inline-block
|
.bulk-actions-target-desc-singular
|
||||||
|
display: inline
|
||||||
|
|
||||||
.bulk-actions-options
|
.bulk-actions-target-desc-plural
|
||||||
display: inline-block
|
display: none
|
||||||
list-style: none
|
|
||||||
|
|
||||||
> li
|
|
||||||
display: inline-block
|
|
||||||
margin-left: .75em
|
|
||||||
|
|
||||||
&:not(:first-child)::before
|
|
||||||
content: " or "
|
|
||||||
display: inline-block
|
|
||||||
margin-right: .75em
|
|
||||||
|
|
||||||
&[data-target-count="0"]
|
|
||||||
.bulk-actions-intro
|
|
||||||
display: block
|
|
||||||
|
|
||||||
.bulk-actions-form
|
|
||||||
display: none
|
|
||||||
|
|
||||||
&[data-target-count="1"]
|
|
||||||
.bulk-actions-target-desc-singular
|
|
||||||
display: inline
|
|
||||||
|
|
||||||
.bulk-actions-target-desc-plural
|
|
||||||
display: none
|
|
||||||
|
|
||||||
#closet-hangers-contact
|
#closet-hangers-contact
|
||||||
input[type=submit]
|
input[type=submit]
|
||||||
|
|
|
@ -15,6 +15,11 @@ class ClosetHangersController < ApplicationController
|
||||||
|
|
||||||
format.json { render :json => true }
|
format.json { render :json => true }
|
||||||
end
|
end
|
||||||
|
elsif params[:ids]
|
||||||
|
ClosetHanger.transaction do
|
||||||
|
current_user.closet_hangers.where(id: params[:ids]).destroy_all
|
||||||
|
end
|
||||||
|
render json: true
|
||||||
else
|
else
|
||||||
@closet_hanger = current_user.closet_hangers.find params[:id]
|
@closet_hanger = current_user.closet_hangers.find params[:id]
|
||||||
@closet_hanger.destroy
|
@closet_hanger.destroy
|
||||||
|
@ -116,19 +121,30 @@ class ClosetHangersController < ApplicationController
|
||||||
end
|
end
|
||||||
|
|
||||||
def update
|
def update
|
||||||
@closet_hanger = current_user.closet_hangers.find(params[:id])
|
if params[:ids]
|
||||||
@closet_hanger.attributes = params[:closet_hanger]
|
ClosetHanger.transaction do
|
||||||
@item = @closet_hanger.item
|
@closet_hangers = current_user.closet_hangers.includes(:list).find params[:ids]
|
||||||
|
@closet_hangers.each do |h|
|
||||||
unless @closet_hanger.quantity == 0 # save the hanger, new record or not
|
h.possibly_null_list_id = params[:list_id]
|
||||||
if @closet_hanger.save
|
h.save!
|
||||||
closet_hanger_saved
|
end
|
||||||
else
|
end
|
||||||
closet_hanger_invalid
|
redirect_back!(user_closet_hangers_path(current_user))
|
||||||
|
else
|
||||||
|
@closet_hanger = current_user.closet_hangers.find(params[:id])
|
||||||
|
@closet_hanger.attributes = params[:closet_hanger]
|
||||||
|
@item = @closet_hanger.item
|
||||||
|
|
||||||
|
unless @closet_hanger.quantity == 0 # save the hanger, new record or not
|
||||||
|
if @closet_hanger.save
|
||||||
|
closet_hanger_saved
|
||||||
|
else
|
||||||
|
closet_hanger_invalid
|
||||||
|
end
|
||||||
|
else # delete the hanger since the user doesn't want it
|
||||||
|
@closet_hanger.destroy
|
||||||
|
closet_hanger_destroyed
|
||||||
end
|
end
|
||||||
else # delete the hanger since the user doesn't want it
|
|
||||||
@closet_hanger.destroy
|
|
||||||
closet_hanger_destroyed
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
@ -71,6 +71,16 @@ class ClosetHanger < ActiveRecord::Base
|
||||||
possibly_null_closet_list.trading?
|
possibly_null_closet_list.trading?
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def possibly_null_list_id=(list_id_or_owned)
|
||||||
|
if list_id_or_owned.to_s == 'true' || list_id_or_owned.to_s == 'false'
|
||||||
|
self.list_id = nil
|
||||||
|
self.owned = list_id_or_owned
|
||||||
|
else
|
||||||
|
self.list_id = list_id_or_owned
|
||||||
|
# owned is set in the set_owned_by_list hook
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
def verb(subject=:someone)
|
def verb(subject=:someone)
|
||||||
self.class.verb(subject, owned?)
|
self.class.verb(subject, owned?)
|
||||||
end
|
end
|
||||||
|
|
|
@ -56,27 +56,29 @@
|
||||||
= link_to t('.import_from.neopets_user'), new_neopets_user_path
|
= link_to t('.import_from.neopets_user'), new_neopets_user_path
|
||||||
= link_to t('.export_to.petpage'), petpage_user_closet_hangers_path(@user)
|
= link_to t('.export_to.petpage'), petpage_user_closet_hangers_path(@user)
|
||||||
|
|
||||||
#closet-hangers{:class => public_perspective? ? nil : 'current-user'}
|
- unless public_perspective?
|
||||||
- unless public_perspective?
|
-# TODO: i18n
|
||||||
-# TODO: i18n
|
.bulk-actions{'data-target-count' => 0}
|
||||||
.bulk-actions{'data-target-count' => 0}
|
.bulk-actions-intro
|
||||||
.bulk-actions-intro
|
Manage items in bulk! Select an item by clicking its thumbnail.
|
||||||
Manage items in bulk! Select an item by clicking its thumbnail.
|
.bulk-actions-form
|
||||||
.bulk-actions-form
|
.bulk-actions-target-desc
|
||||||
.bulk-actions-target-desc
|
%span.bulk-actions-target-desc-singular
|
||||||
%span.bulk-actions-target-desc-singular
|
With the 1 selected item:
|
||||||
With the 1 selected item:
|
%span.bulk-actions-target-desc-plural
|
||||||
%span.bulk-actions-target-desc-plural
|
With the
|
||||||
With the
|
%span.bulk-actions-target-count 0
|
||||||
%span.bulk-actions-target-count 0
|
selected items:
|
||||||
selected items:
|
%ul.bulk-actions-options
|
||||||
%ul.bulk-actions-options
|
%li
|
||||||
%li
|
= form_tag user_closet_hangers_path(@user), method: :put, class: 'bulk-actions-move-all' do
|
||||||
%form
|
= select_tag 'list_id', options_for_select(destination_options)
|
||||||
= select_tag 'destination', options_for_select(destination_options)
|
%button Move
|
||||||
%button Move
|
%li
|
||||||
%li
|
= form_tag user_closet_hangers_path(@user), method: :delete, class: 'bulk-actions-remove-all' do
|
||||||
%button Remove all
|
%button Remove all
|
||||||
|
|
||||||
|
#closet-hangers{:class => public_perspective? ? nil : 'current-user'}
|
||||||
- [true, false].each do |owned|
|
- [true, false].each do |owned|
|
||||||
.closet-hangers-group{'data-owned' => owned.to_s, :id => "closet-hangers-group-#{owned}"}
|
.closet-hangers-group{'data-owned' => owned.to_s, :id => "closet-hangers-group-#{owned}"}
|
||||||
%header
|
%header
|
||||||
|
|
|
@ -63,6 +63,7 @@ OpenneoImpressItems::Application.routes.draw do
|
||||||
resources :closet_hangers, :only => [:index, :update, :destroy], :path => 'closet' do
|
resources :closet_hangers, :only => [:index, :update, :destroy], :path => 'closet' do
|
||||||
collection do
|
collection do
|
||||||
get :petpage
|
get :petpage
|
||||||
|
put :update
|
||||||
delete :destroy
|
delete :destroy
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
Loading…
Reference in a new issue