save current outfit, save copy
This commit is contained in:
parent
e3ca78203b
commit
51f3650ce2
6 changed files with 127 additions and 59 deletions
|
@ -6,7 +6,7 @@ class Outfit < ActiveRecord::Base
|
||||||
validates :name, :presence => true, :uniqueness => {:scope => :user_id}
|
validates :name, :presence => true, :uniqueness => {:scope => :user_id}
|
||||||
validates :pet_state, :presence => true
|
validates :pet_state, :presence => true
|
||||||
|
|
||||||
attr_accessible :name, :pet_state_id, :starred, :unworn_item_ids, :worn_item_ids
|
attr_accessible :name, :pet_state_id, :starred, :worn_and_unworn_item_ids
|
||||||
|
|
||||||
def as_json(more_options={})
|
def as_json(more_options={})
|
||||||
serializable_hash :only => [:id, :name, :pet_state_id, :starred],
|
serializable_hash :only => [:id, :name, :pet_state_id, :starred],
|
||||||
|
@ -30,20 +30,17 @@ class Outfit < ActiveRecord::Base
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def worn_item_ids=(item_ids)
|
def worn_and_unworn_item_ids=(all_item_ids)
|
||||||
add_relationships(item_ids, true)
|
new_rels = []
|
||||||
end
|
all_item_ids.each do |key, item_ids|
|
||||||
|
worn = key == 'worn'
|
||||||
def unworn_item_ids=(item_ids)
|
item_ids.each do |item_id|
|
||||||
add_relationships(item_ids, false)
|
rel = ItemOutfitRelationship.new
|
||||||
end
|
rel.item_id = item_id
|
||||||
|
rel.is_worn = worn
|
||||||
def add_relationships(item_ids, worn)
|
new_rels << rel
|
||||||
item_ids.each do |item_id|
|
end
|
||||||
rel = ItemOutfitRelationship.new
|
|
||||||
rel.item_id = item_id
|
|
||||||
rel.is_worn = worn
|
|
||||||
item_outfit_relationships << rel
|
|
||||||
end
|
end
|
||||||
|
self.item_outfit_relationships = new_rels
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -422,6 +422,11 @@ body.outfits-edit
|
||||||
display: block
|
display: block
|
||||||
#save-outfit
|
#save-outfit
|
||||||
display: inline-block
|
display: inline-block
|
||||||
|
#save-outfit-wrapper.active-outfit
|
||||||
|
#save-outfit
|
||||||
|
display: none
|
||||||
|
#save-current-outfit, #save-outfit-copy
|
||||||
|
display: inline-block
|
||||||
|
|
||||||
&.user-not-signed-in
|
&.user-not-signed-in
|
||||||
#save-outfit-not-signed-in
|
#save-outfit-not-signed-in
|
||||||
|
|
|
@ -16,6 +16,8 @@
|
||||||
#save-outfit-wrapper
|
#save-outfit-wrapper
|
||||||
%button#save-outfit Save outfit
|
%button#save-outfit Save outfit
|
||||||
%button#save-outfit-not-signed-in Log in to save outfit
|
%button#save-outfit-not-signed-in Log in to save outfit
|
||||||
|
%button#save-current-outfit Save "<span>current outfit</span>"
|
||||||
|
%button#save-outfit-copy Save a copy
|
||||||
#preview
|
#preview
|
||||||
#preview-swf
|
#preview-swf
|
||||||
#preview-swf-container
|
#preview-swf-container
|
||||||
|
|
|
@ -428,14 +428,20 @@ View.Hash = function (wardrobe) {
|
||||||
}
|
}
|
||||||
|
|
||||||
View.Outfits = function (wardrobe) {
|
View.Outfits = function (wardrobe) {
|
||||||
var outfits_el = $('#preview-outfits'), sidebar_el = $('#preview-sidebar'),
|
var controls = $('#pet-type-form, #pet-state-form, #preview-swf, #preview-search-form'),
|
||||||
controls = $('#pet-type-form, #pet-state-form, #preview-swf, #preview-search-form'),
|
new_outfit_el = $('#new-outfit'),
|
||||||
save_success_el = $('#save-success'), save_error_el = $('#save-error'),
|
new_outfit_form_el = $('#new-outfit-form'),
|
||||||
new_outfit_el = $('#new-outfit'), new_outfit_form_el = $('#new-outfit-form'),
|
|
||||||
new_outfit_name_el = $('#new-outfit-name'),
|
new_outfit_name_el = $('#new-outfit-name'),
|
||||||
|
outfits_el = $('#preview-outfits'),
|
||||||
outfits_list_el = outfits_el.children('ul'),
|
outfits_list_el = outfits_el.children('ul'),
|
||||||
outfit_not_found_el = $('#outfit-not-found'),
|
outfit_not_found_el = $('#outfit-not-found'),
|
||||||
|
save_current_outfit_el = $('#save-current-outfit'),
|
||||||
|
save_current_outfit_name_el = save_current_outfit_el.children('span'),
|
||||||
|
save_outfit_wrapper_el = $('#save-outfit-wrapper'),
|
||||||
|
save_success_el = $('#save-success'),
|
||||||
|
save_error_el = $('#save-error'),
|
||||||
stars = $('#preview-outfits div.outfit-star'),
|
stars = $('#preview-outfits div.outfit-star'),
|
||||||
|
sidebar_el = $('#preview-sidebar'),
|
||||||
signed_in,
|
signed_in,
|
||||||
previously_viewing = '';
|
previously_viewing = '';
|
||||||
|
|
||||||
|
@ -490,7 +496,7 @@ View.Outfits = function (wardrobe) {
|
||||||
sidebar_el.attr('class', previously_viewing);
|
sidebar_el.attr('class', previously_viewing);
|
||||||
});
|
});
|
||||||
|
|
||||||
$('#save-outfit').click(function () {
|
$('#save-outfit, #save-outfit-copy').click(function () {
|
||||||
new_outfit_name_el.val('');
|
new_outfit_name_el.val('');
|
||||||
new_outfit_el.removeClass('starred').show();
|
new_outfit_el.removeClass('starred').show();
|
||||||
showSavingOutfit();
|
showSavingOutfit();
|
||||||
|
@ -528,7 +534,7 @@ View.Outfits = function (wardrobe) {
|
||||||
});
|
});
|
||||||
|
|
||||||
$('#preview-outfits h4').live('click', function () {
|
$('#preview-outfits h4').live('click', function () {
|
||||||
wardrobe.outfit.load($(this).tmplItem().data.clone());
|
wardrobe.outfit.load($(this).tmplItem().data.id);
|
||||||
});
|
});
|
||||||
|
|
||||||
$('input.outfit-url').live('mouseover', function () {
|
$('input.outfit-url').live('mouseover', function () {
|
||||||
|
@ -566,7 +572,9 @@ View.Outfits = function (wardrobe) {
|
||||||
outfits_list_el.find('li.active').removeClass('active');
|
outfits_list_el.find('li.active').removeClass('active');
|
||||||
if(outfit.id) {
|
if(outfit.id) {
|
||||||
$('li.outfit-' + outfit.id).addClass('active');
|
$('li.outfit-' + outfit.id).addClass('active');
|
||||||
|
save_current_outfit_name_el.text(outfit.name);
|
||||||
}
|
}
|
||||||
|
save_outfit_wrapper_el.toggleClass('active-outfit', outfit.id ? true : false);
|
||||||
}
|
}
|
||||||
|
|
||||||
function updateActiveOutfit() {
|
function updateActiveOutfit() {
|
||||||
|
@ -578,9 +586,13 @@ View.Outfits = function (wardrobe) {
|
||||||
|
|
||||||
/* Saving */
|
/* Saving */
|
||||||
|
|
||||||
|
save_current_outfit_el.click(function () {
|
||||||
|
wardrobe.outfit.update();
|
||||||
|
});
|
||||||
|
|
||||||
new_outfit_form_el.submit(function (e) {
|
new_outfit_form_el.submit(function (e) {
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
wardrobe.outfit.save(new_outfit_el.hasClass('starred'), new_outfit_name_el.val());
|
wardrobe.outfit.create({starred: new_outfit_el.hasClass('starred'), name: new_outfit_name_el.val()});
|
||||||
});
|
});
|
||||||
|
|
||||||
new_outfit_el.find('div.outfit-star').click(function () {
|
new_outfit_el.find('div.outfit-star').click(function () {
|
||||||
|
@ -599,11 +611,18 @@ View.Outfits = function (wardrobe) {
|
||||||
}
|
}
|
||||||
|
|
||||||
wardrobe.outfit.bind('saveSuccess', function (outfit) {
|
wardrobe.outfit.bind('saveSuccess', function (outfit) {
|
||||||
wardrobe.user.addOutfit(outfit);
|
|
||||||
save_success_el.notify();
|
save_success_el.notify();
|
||||||
|
});
|
||||||
|
|
||||||
|
wardrobe.outfit.bind('createSuccess', function (outfit) {
|
||||||
|
wardrobe.user.addOutfit(outfit);
|
||||||
showOutfits();
|
showOutfits();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
wardrobe.outfit.bind('updateSuccess', function (outfit) {
|
||||||
|
wardrobe.user.updateOutfit(outfit);
|
||||||
|
});
|
||||||
|
|
||||||
wardrobe.outfit.bind('saveFailure', function (response) {
|
wardrobe.outfit.bind('saveFailure', function (response) {
|
||||||
var errors = response.errors;
|
var errors = response.errors;
|
||||||
if(typeof errors == 'undefined') {
|
if(typeof errors == 'undefined') {
|
||||||
|
|
|
@ -220,7 +220,7 @@ function Wardrobe() {
|
||||||
|
|
||||||
function Outfit(data) {
|
function Outfit(data) {
|
||||||
var outfit = this, previous_pet_type, worn_item_ids = [],
|
var outfit = this, previous_pet_type, worn_item_ids = [],
|
||||||
new_record = true;
|
closet_item_ids = [], new_record = true;
|
||||||
|
|
||||||
this.setWornAndUnwornItemIds = function (new_ids) {
|
this.setWornAndUnwornItemIds = function (new_ids) {
|
||||||
this.worn_and_unworn_item_ids = new_ids;
|
this.worn_and_unworn_item_ids = new_ids;
|
||||||
|
@ -250,6 +250,15 @@ function Wardrobe() {
|
||||||
return closet_item_ids;
|
return closet_item_ids;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function getAttributes() {
|
||||||
|
var outfit_data = {};
|
||||||
|
outfit_data.name = outfit.name;
|
||||||
|
outfit_data.starred = outfit.starred;
|
||||||
|
outfit_data.worn_and_unworn_item_ids = outfit.getWornAndUnwornItemIds();
|
||||||
|
if(outfit.pet_state) outfit_data.pet_state_id = outfit.pet_state.id;
|
||||||
|
return outfit_data;
|
||||||
|
}
|
||||||
|
|
||||||
function getRestrictedZones() {
|
function getRestrictedZones() {
|
||||||
// note: may contain duplicates - loop through assets, not these, for
|
// note: may contain duplicates - loop through assets, not these, for
|
||||||
// best performance
|
// best performance
|
||||||
|
@ -316,6 +325,19 @@ function Wardrobe() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function sendUpdate(outfit_data, success, failure) {
|
||||||
|
$.ajax({
|
||||||
|
url: '/outfits/' + outfit.id,
|
||||||
|
type: 'post',
|
||||||
|
data: {'_method': 'put', outfit: outfit_data},
|
||||||
|
success: function () {
|
||||||
|
Outfit.cache[outfit.id] = outfit;
|
||||||
|
success(outfit);
|
||||||
|
},
|
||||||
|
error: function () { if(typeof failure !== 'undefined') failure(outfit) }
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
this.closetItem = function (item, updateClosetItemsCallback) {
|
this.closetItem = function (item, updateClosetItemsCallback) {
|
||||||
if(!hasItemInCloset(item)) {
|
if(!hasItemInCloset(item)) {
|
||||||
this.closet_items.push(item);
|
this.closet_items.push(item);
|
||||||
|
@ -413,6 +435,10 @@ function Wardrobe() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
this.update = function (success, failure) {
|
||||||
|
sendUpdate(getAttributes(), success, failure);
|
||||||
|
}
|
||||||
|
|
||||||
this.wearItem = function (item, updateWornItemsCallback, updateClosetItemsCallback, updateItemAssetsCallback) {
|
this.wearItem = function (item, updateWornItemsCallback, updateClosetItemsCallback, updateItemAssetsCallback) {
|
||||||
if(!isWearingItem(item)) {
|
if(!isWearingItem(item)) {
|
||||||
this.worn_items.push(item);
|
this.worn_items.push(item);
|
||||||
|
@ -426,16 +452,14 @@ function Wardrobe() {
|
||||||
}
|
}
|
||||||
|
|
||||||
this.getWornAndUnwornItemIds = function () {
|
this.getWornAndUnwornItemIds = function () {
|
||||||
if(typeof outfit.worn_and_unworn_item_ids === 'undefined') {
|
var unworn_item_ids = [], id;
|
||||||
var unworn_item_ids = [], id;
|
for(var i = 0; i < closet_item_ids.length; i++) {
|
||||||
for(var i = 0; i < closet_item_ids.length; i++) {
|
id = closet_item_ids[i];
|
||||||
id = closet_item_ids[i];
|
if($.inArray(id, worn_item_ids) === -1) {
|
||||||
if($.inArray(id, worn_item_ids) === -1) {
|
unworn_item_ids.push(id);
|
||||||
unworn_item_ids.push(id);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
outfit.worn_and_unworn_item_ids = {worn: worn_item_ids, unworn: unworn_item_ids};
|
|
||||||
}
|
}
|
||||||
|
outfit.worn_and_unworn_item_ids = {worn: worn_item_ids, unworn: unworn_item_ids};
|
||||||
return outfit.worn_and_unworn_item_ids;
|
return outfit.worn_and_unworn_item_ids;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -473,16 +497,10 @@ function Wardrobe() {
|
||||||
}
|
}
|
||||||
|
|
||||||
this.create = function (success, error) {
|
this.create = function (success, error) {
|
||||||
var outfit_data = {}, sorted = outfit.getWornAndUnwornItemIds();
|
|
||||||
outfit_data.name = outfit.name;
|
|
||||||
outfit_data.starred = outfit.starred;
|
|
||||||
outfit_data.worn_item_ids = sorted.worn;
|
|
||||||
outfit_data.unworn_item_ids = sorted.unworn;
|
|
||||||
if(outfit.pet_state) outfit_data.pet_state_id = outfit.pet_state.id;
|
|
||||||
$.ajax({
|
$.ajax({
|
||||||
url: '/outfits',
|
url: '/outfits',
|
||||||
type: 'post',
|
type: 'post',
|
||||||
data: {outfit: outfit_data},
|
data: {outfit: getAttributes()},
|
||||||
success: function (data) {
|
success: function (data) {
|
||||||
new_record = false;
|
new_record = false;
|
||||||
outfit.id = data;
|
outfit.id = data;
|
||||||
|
@ -502,12 +520,7 @@ function Wardrobe() {
|
||||||
outfit_data[key] = outfit[key] = attributes[key];
|
outfit_data[key] = outfit[key] = attributes[key];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
$.ajax({
|
sendUpdate(outfit_data, success);
|
||||||
url: '/outfits/' + outfit.id,
|
|
||||||
type: 'post',
|
|
||||||
data: {'_method': 'put', outfit: outfit_data},
|
|
||||||
success: function () { success(outfit) }
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -758,24 +771,29 @@ function Wardrobe() {
|
||||||
return outfit.worn_items;
|
return outfit.worn_items;
|
||||||
}
|
}
|
||||||
|
|
||||||
this.load = function (new_outfit) {
|
this.load = function (new_outfit_id) {
|
||||||
outfit = new_outfit;
|
Outfit.find(new_outfit_id, function (new_outfit) {
|
||||||
this.in_transaction = true;
|
outfit = new_outfit.clone();
|
||||||
controller.setPetTypeByColorAndSpecies(outfit.color_id, outfit.species_id);
|
controller.in_transaction = true;
|
||||||
controller.setPetStateById(outfit.pet_state_id);
|
controller.setPetTypeByColorAndSpecies(outfit.color_id, outfit.species_id);
|
||||||
controller.setClosetItemsByIds(outfit.getClosetItemIds());
|
controller.setPetStateById(outfit.pet_state_id);
|
||||||
controller.setWornItemsByIds(outfit.getWornItemIds());
|
controller.setClosetItemsByIds(outfit.getClosetItemIds());
|
||||||
controller.events.trigger('setOutfit', outfit);
|
controller.setWornItemsByIds(outfit.getWornItemIds());
|
||||||
this.in_transaction = false;
|
controller.events.trigger('setOutfit', outfit);
|
||||||
controller.events.trigger('loadOutfit', outfit);
|
controller.in_transaction = false;
|
||||||
|
controller.events.trigger('loadOutfit', outfit);
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
this.save = function (starred, name) {
|
this.create = function (attributes) {
|
||||||
outfit.starred = starred;
|
if(attributes) {
|
||||||
outfit.name = name;
|
outfit.starred = attributes.starred;
|
||||||
|
outfit.name = attributes.name;
|
||||||
|
}
|
||||||
outfit.create(
|
outfit.create(
|
||||||
function (outfit) {
|
function (outfit) {
|
||||||
controller.events.trigger('saveSuccess', outfit);
|
controller.events.trigger('saveSuccess', outfit);
|
||||||
|
controller.events.trigger('createSuccess', outfit);
|
||||||
controller.events.trigger('setOutfit', outfit);
|
controller.events.trigger('setOutfit', outfit);
|
||||||
},
|
},
|
||||||
controller.event('saveFailure')
|
controller.event('saveFailure')
|
||||||
|
@ -843,6 +861,16 @@ function Wardrobe() {
|
||||||
outfit.unwearItem(item, controller.event('updateWornItems'));
|
outfit.unwearItem(item, controller.event('updateWornItems'));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
this.update = function () {
|
||||||
|
outfit.update(
|
||||||
|
function (outfit) {
|
||||||
|
controller.events.trigger('saveSuccess', outfit),
|
||||||
|
controller.events.trigger('updateSuccess', outfit)
|
||||||
|
},
|
||||||
|
controller.event('saveFailure')
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
this.wearItem = function (item) {
|
this.wearItem = function (item) {
|
||||||
outfit.wearItem(
|
outfit.wearItem(
|
||||||
item,
|
item,
|
||||||
|
@ -988,6 +1016,15 @@ function Wardrobe() {
|
||||||
controller.events.trigger('outfitStarToggled', outfit);
|
controller.events.trigger('outfitStarToggled', outfit);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
this.updateOutfit = function (outfit) {
|
||||||
|
for(var i = 0; i < outfits.length; i++) {
|
||||||
|
if(outfits[i].id == outfit.id) {
|
||||||
|
outfits[i] = outfit.clone();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
var underscored_name;
|
var underscored_name;
|
||||||
|
|
|
@ -1621,7 +1621,15 @@ body.outfits-edit.user-signed-in #preview-sidebar-nav-outfits {
|
||||||
body.outfits-edit.user-signed-in #save-outfit {
|
body.outfits-edit.user-signed-in #save-outfit {
|
||||||
display: inline-block;
|
display: inline-block;
|
||||||
}
|
}
|
||||||
/* line 427, ../../../app/stylesheets/outfits/_edit.sass */
|
/* line 426, ../../../app/stylesheets/outfits/_edit.sass */
|
||||||
|
body.outfits-edit.user-signed-in #save-outfit-wrapper.active-outfit #save-outfit {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
/* line 428, ../../../app/stylesheets/outfits/_edit.sass */
|
||||||
|
body.outfits-edit.user-signed-in #save-outfit-wrapper.active-outfit #save-current-outfit, body.outfits-edit.user-signed-in #save-outfit-wrapper.active-outfit #save-outfit-copy {
|
||||||
|
display: inline-block;
|
||||||
|
}
|
||||||
|
/* line 432, ../../../app/stylesheets/outfits/_edit.sass */
|
||||||
body.outfits-edit.user-not-signed-in #save-outfit-not-signed-in {
|
body.outfits-edit.user-not-signed-in #save-outfit-not-signed-in {
|
||||||
display: inline-block;
|
display: inline-block;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue