From 358840076cc2317e99d7b5f09dcc5de36ef4d110 Mon Sep 17 00:00:00 2001 From: Matchu Date: Fri, 29 Jul 2011 10:52:04 -0400 Subject: [PATCH] closet lists, round one --- Gemfile | 2 + Gemfile.lock | 5 +- app/controllers/closet_hangers_controller.rb | 11 +- app/controllers/closet_lists_controller.rb | 44 +- app/helpers/application_helper.rb | 5 + app/helpers/closet_hangers_helper.rb | 51 ++- app/helpers/closet_lists_helper.rb | 21 + app/models/closet_hanger.rb | 6 +- app/models/closet_list.rb | 5 +- app/stylesheets/_layout.sass | 3 - app/stylesheets/closet_hangers/_index.sass | 121 ++++-- app/stylesheets/closet_lists/_form.sass | 3 +- app/stylesheets/items/_show.sass | 5 +- app/stylesheets/partials/_secondary_nav.sass | 12 + .../closet_hangers/_closet_hanger.html.haml | 2 +- app/views/closet_hangers/index.html.haml | 37 +- app/views/closet_lists/_closet_list.html.haml | 16 + app/views/closet_lists/_form.html.haml | 11 + app/views/closet_lists/edit.html.haml | 3 + app/views/items/show.html.haml | 3 + config/routes.rb | 2 +- .../20110726231143_create_closet_lists.rb | 4 +- db/schema.rb | 4 +- public/javascripts/closet_hangers/index.js | 20 +- public/stylesheets/compiled/screen.css | 385 ++++++++++++------ vendor/cache/sanitize-2.0.3.gem | Bin 0 -> 14336 bytes 26 files changed, 581 insertions(+), 200 deletions(-) create mode 100644 app/stylesheets/partials/_secondary_nav.sass create mode 100644 app/views/closet_lists/_closet_list.html.haml create mode 100644 app/views/closet_lists/edit.html.haml create mode 100644 vendor/cache/sanitize-2.0.3.gem diff --git a/Gemfile b/Gemfile index ab837d3b..9c29670d 100644 --- a/Gemfile +++ b/Gemfile @@ -35,6 +35,8 @@ gem "character-encodings", "~> 0.4.1", :platforms => :ruby_18 gem "nokogiri", "~> 1.5.0" +gem 'sanitize', '~> 2.0.3' + group :development_async do # async wrappers gem 'eventmachine', :git => 'git://github.com/eventmachine/eventmachine.git' diff --git a/Gemfile.lock b/Gemfile.lock index 1554d6b9..487b8a40 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -165,9 +165,11 @@ GEM ruby-hmac (0.4.0) rufus-scheduler (2.0.9) tzinfo (>= 0.3.23) + sanitize (2.0.3) + nokogiri (< 1.6, >= 1.4.4) sinatra (1.2.6) rack (~> 1.1) - tilt (>= 1.2.2, < 2.0) + tilt (< 2.0, >= 1.2.2) swf_converter (0.0.3) thor (0.14.6) tilt (1.3.2) @@ -215,6 +217,7 @@ DEPENDENCIES resque-scheduler (~> 2.0.0.d) right_aws (~> 2.1.0) rspec-rails (~> 2.0.0.beta.22) + sanitize (~> 2.0.3) swf_converter (~> 0.0.3) whenever (~> 0.6.2) will_paginate (~> 3.0.pre2) diff --git a/app/controllers/closet_hangers_controller.rb b/app/controllers/closet_hangers_controller.rb index 2c3b079f..3598d232 100644 --- a/app/controllers/closet_hangers_controller.rb +++ b/app/controllers/closet_hangers_controller.rb @@ -14,8 +14,11 @@ class ClosetHangersController < ApplicationController def index @user = User.find params[:user_id] - @closet_hangers_by_owned = @user.closet_hangers.owned_before_wanted. - alphabetical_by_item_name.includes(:item).group_by(&:owned) + @closet_lists_by_owned = @user.closet_lists.alphabetical. + includes(:hangers => :item).group_by(&:hangers_owned) + @unlisted_closet_hangers_by_owned = @user.closet_hangers.unlisted. + owned_before_wanted.alphabetical_by_item_name.includes(:item). + group_by(&:owned) @public_perspective = params.has_key?(:public) || !user_is?(@user) end @@ -37,7 +40,9 @@ class ClosetHangersController < ApplicationController if @closet_hanger.save respond_to do |format| format.html { - flash[:success] = "Success! You #{@closet_hanger.verb(:you)} #{@closet_hanger.quantity} #{@item.name.pluralize}." + message = "Success! You #{@closet_hanger.verb(:you)} #{@closet_hanger.quantity} #{@item.name.pluralize}" + message << " in the \"#{@closet_hanger.list.name}\" list" if @closet_hanger.list + flash[:success] = "#{message}." redirect_back!(@item) } diff --git a/app/controllers/closet_lists_controller.rb b/app/controllers/closet_lists_controller.rb index 7409d05d..55bb75ce 100644 --- a/app/controllers/closet_lists_controller.rb +++ b/app/controllers/closet_lists_controller.rb @@ -1,19 +1,49 @@ class ClosetListsController < ApplicationController before_filter :authorize_user! - - def new - @closet_list = current_user.closet_lists.build - end + before_filter :find_closet_list, :only => [:edit, :update, :destroy] def create @closet_list = current_user.closet_lists.build params[:closet_list] if @closet_list.save - flash[:success] = "Successfully saved \"#{@closet_list.name}\"" - redirect_to user_closet_hangers_path(current_user) + save_successful! else - flash.now[:alert] = "We can't save this list because: #{@closet_list.errors.full_messages.to_sentence}" + save_failed! render :action => :new end end + + def destroy + @closet_list.destroy + flash[:success] = "Successfully deleted \"#{@closet_list.name}\"" + redirect_to user_closet_hangers_path(current_user) + end + + def new + @closet_list = current_user.closet_lists.build params[:closet_list] + end + + def update + if @closet_list.update_attributes(params[:closet_list]) + save_successful! + else + save_failed! + render :action => :edit + end + end + + protected + + def find_closet_list + @closet_list = current_user.closet_lists.find params[:id] + end + + def save_failed! + flash.now[:alert] = "We can't save this list because: #{@closet_list.errors.full_messages.to_sentence}" + end + + def save_successful! + flash[:success] = "Successfully saved \"#{@closet_list.name}\"" + redirect_to user_closet_hangers_path(current_user) + end end diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb index b253f37f..516dab4a 100644 --- a/app/helpers/application_helper.rb +++ b/app/helpers/application_helper.rb @@ -94,6 +94,11 @@ module ApplicationHelper hidden_field_tag :return_to, request.fullpath end + def secondary_nav(&block) + content_for :before_flashes, + content_tag(:nav, :id => 'secondary-nav', &block) + end + def show_title_header? params[:controller] != 'items' end diff --git a/app/helpers/closet_hangers_helper.rb b/app/helpers/closet_hangers_helper.rb index 3691ddf4..2e6a5296 100644 --- a/app/helpers/closet_hangers_helper.rb +++ b/app/helpers/closet_hangers_helper.rb @@ -13,14 +13,57 @@ module ClosetHangersHelper public_perspective? ? @user.name : :you end + # Do we have either unlisted hangers that are owned/wanted, or non-empty + # owned/wanted lists? + def has_hangers?(owned) + # If we have unlisted hangers of this type, pass. + return true if @unlisted_closet_hangers_by_owned.has_key?(owned) + + # Additionally, if we have no lists of this type, fail. + lists = @closet_lists_by_owned[owned] + return false unless lists + + # If any of those lists are non-empty, pass. + lists.each do |list| + return true unless list.hangers.empty? + end + + # Otherwise, all of the lists are empty. Fail. + return false + end + + def has_lists?(owned) + @closet_lists_by_owned.has_key?(owned) + end + + def link_to_add_closet_list(content, options) + owned = options.delete(:owned) + path = new_user_closet_list_path current_user, + :closet_list => {:hangers_owned => owned} + link_to(content, path, options) + end + def public_perspective? @public_perspective end - def render_closet_hangers(owned) - render :partial => 'closet_hanger', - :collection => @closet_hangers_by_owned[owned], - :locals => {:show_controls => !public_perspective?} + def render_closet_lists(lists) + if lists + render :partial => 'closet_lists/closet_list', :collection => lists, + :locals => {:show_controls => !public_perspective?} + end + end + + def render_unlisted_closet_hangers(owned) + if @unlisted_closet_hangers_by_owned[owned] + content = render :partial => 'closet_hanger', + :collection => @unlisted_closet_hangers_by_owned[owned], + :locals => {:show_controls => !public_perspective?} + if has_lists?(owned) + content = content_tag(:header, content_tag(:h4, '(Not in a list)')) + content + end + content_tag(:div, content, :class => 'closet-list unlisted') + end end end diff --git a/app/helpers/closet_lists_helper.rb b/app/helpers/closet_lists_helper.rb index fbcfd38b..fff481e3 100644 --- a/app/helpers/closet_lists_helper.rb +++ b/app/helpers/closet_lists_helper.rb @@ -1,9 +1,30 @@ module ClosetListsHelper + def closet_list_delete_confirmation(closet_list) + "Are you sure you want to delete \"#{closet_list.name}\"?".tap do |msg| + unless closet_list.hangers.empty? + msg << " Even if you do, we'll remember that you " + + ClosetHanger.verb(closet_list.hangers_owned, :you) + + " these items." + end + end + end + + def closet_list_description_format(list) + md = RDiscount.new(list.description) + Sanitize.clean(md.to_html, Sanitize::Config::BASIC).html_safe + end + def hangers_owned_options @hangers_owned_options ||= [true, false].map do |owned| verb = ClosetHanger.verb(:i, owned) ["items I #{verb}", owned] end end + + def render_sorted_hangers(list, show_controls) + render :partial => 'closet_hanger', + :collection => list.hangers.sort { |x,y| x.item.name <=> y.item.name }, + :locals => {:show_controls => show_controls} + end end diff --git a/app/models/closet_hanger.rb b/app/models/closet_hanger.rb index c70ec426..dfef7c7f 100644 --- a/app/models/closet_hanger.rb +++ b/app/models/closet_hanger.rb @@ -3,7 +3,7 @@ class ClosetHanger < ActiveRecord::Base belongs_to :list, :class_name => 'ClosetList' belongs_to :user - attr_accessible :owned, :quantity + attr_accessible :list_id, :owned, :quantity validates :item_id, :uniqueness => {:scope => [:user_id, :owned]} validates :quantity, :numericality => {:greater_than => 0} @@ -11,11 +11,13 @@ class ClosetHanger < ActiveRecord::Base scope :alphabetical_by_item_name, joins(:item).order(Item.arel_table[:name]) scope :owned_before_wanted, order(arel_table[:owned].desc) + scope :unlisted, where(:list_id => nil) before_validation :set_owned_by_list def set_owned_by_list - self.owned = list.hangers_owned if list? + self.owned = list.hangers_owned if list_id? + true end def verb(subject=:someone) diff --git a/app/models/closet_list.rb b/app/models/closet_list.rb index d0c14151..d74fd956 100644 --- a/app/models/closet_list.rb +++ b/app/models/closet_list.rb @@ -1,6 +1,7 @@ class ClosetList < ActiveRecord::Base belongs_to :user - has_many :hangers, :class_name => 'ClosetHanger' + has_many :hangers, :class_name => 'ClosetHanger', :foreign_key => 'list_id', + :dependent => :nullify attr_accessible :description, :hangers_owned, :name @@ -8,6 +9,8 @@ class ClosetList < ActiveRecord::Base validates :user, :presence => true validates :hangers_owned, :inclusion => {:in => [true, false], :message => "can't be blank"} + scope :alphabetical, order(:name) + after_save :sync_hangers_owned! def sync_hangers_owned! diff --git a/app/stylesheets/_layout.sass b/app/stylesheets/_layout.sass index c4477add..bed2cd43 100644 --- a/app/stylesheets/_layout.sass +++ b/app/stylesheets/_layout.sass @@ -93,9 +93,6 @@ a.button, input[type=submit], button &.loud +loud-awesome-button -a.button - +arrowed-awesome-button - ul.buttons margin-bottom: 1em li diff --git a/app/stylesheets/closet_hangers/_index.sass b/app/stylesheets/closet_hangers/_index.sass index 37a3eb09..57b3c14e 100644 --- a/app/stylesheets/closet_hangers/_index.sass +++ b/app/stylesheets/closet_hangers/_index.sass @@ -1,21 +1,16 @@ @import "partials/context_button" @import "partials/icon" +@import "partials/secondary_nav" body.closet_hangers-index + +secondary-nav + #title - float: left margin-bottom: 0 - .flash - clear: both - - #import-link, #closet-hangers-items-search - margin-top: .75em - #import-link +awesome-button +loud-awesome-button-color - margin-left: 2em #closet-hangers-items-search float: right @@ -101,35 +96,87 @@ body.closet_hangers-index form display: none - header - border-bottom: 1px solid $soft-border-color - display: block - margin-bottom: .25em - padding: .25em 0 - position: relative - - h3 - font-size: 250% - margin: 0 - - span.show, span.hide - color: $soft-text-color - display: none - font-size: 85% - position: absolute - right: 1em - bottom: 0 - - &:hover - span.show, span.hide - color: inherit - text-decoration: underline + .quantity-1 + display: none .closet-hangers-group border-top: 1px solid $module-border-color margin-bottom: 2em padding-bottom: 1em + > header + border-bottom: 1px solid $soft-border-color + display: block + margin-bottom: .25em + padding: .25em 0 + position: relative + + h3 + font-size: 250% + margin: 0 + + .add-closet-list + +awesome-button + bottom: 50% + margin-bottom: -1em + position: absolute + right: 1em + + &:active + margin-bottom: -1.1em + top: auto + + span.show, span.hide + color: $soft-text-color + display: none + font-size: 85% + left: 1em + position: absolute + top: 1em + + &:hover + color: inherit + text-decoration: underline + + .closet-list + border-bottom: 1px solid $soft-border-color + padding: .5em 0 + + header + display: block + position: relative + + h4 + +header-text + font-size: 150% + margin: 0 auto + + .empty-list + font-style: italic + + .closet-list-controls + display: none + position: absolute + right: 1em + top: 0 + + a, input[type=submit] + +context-button + + form + display: inline + + &.unlisted + h4 + font-style: italic + + &:hover + .closet-list-controls + display: block + + &:last-child + border-bottom: 0 + &.current-user #closet-hangers .object:hover @@ -163,6 +210,8 @@ body.closet_hangers-index &.js #closet-hangers .object:hover .quantity + display: block + input[type=number] width: 2.5em @@ -173,8 +222,11 @@ body.closet_hangers-index background: $module-bg-color outline: 1px solid $module-border-color - .quantity span:after - content: "…" + .quantity + display: block + + span:after + content: "…" #closet-hangers-contact form @@ -192,7 +244,8 @@ body.closet_hangers-index .closet-hangers-group header - cursor: pointer + .show, .hide + cursor: pointer .hide display: block diff --git a/app/stylesheets/closet_lists/_form.sass b/app/stylesheets/closet_lists/_form.sass index 1c1295bb..4d85c2ec 100644 --- a/app/stylesheets/closet_lists/_form.sass +++ b/app/stylesheets/closet_lists/_form.sass @@ -1,4 +1,5 @@ -body.closet_lists-new, body.closet_lists-create +body.closet_lists-new, body.closet_lists-create, body.closet_lists-edit, body.closet_lists-update + +secondary-nav form ul.fields list-style: none diff --git a/app/stylesheets/items/_show.sass b/app/stylesheets/items/_show.sass index 9f98674a..98df4601 100644 --- a/app/stylesheets/items/_show.sass +++ b/app/stylesheets/items/_show.sass @@ -68,7 +68,7 @@ body.items-show float: right font-size: 85% padding: 1em - width: 18em + width: 21em label, header display: block @@ -80,6 +80,9 @@ body.items-show form padding: .5em 0 + select + width: 9em + input[type=number] width: 4em diff --git a/app/stylesheets/partials/_secondary_nav.sass b/app/stylesheets/partials/_secondary_nav.sass new file mode 100644 index 00000000..f4f501e1 --- /dev/null +++ b/app/stylesheets/partials/_secondary_nav.sass @@ -0,0 +1,12 @@ +=secondary-nav + #title + float: left + margin-right: .5em + + .flash + clear: both + + #secondary-nav + display: block + margin-top: .75em + diff --git a/app/views/closet_hangers/_closet_hanger.html.haml b/app/views/closet_hangers/_closet_hanger.html.haml index ad7dd007..44a20148 100644 --- a/app/views/closet_hangers/_closet_hanger.html.haml +++ b/app/views/closet_hangers/_closet_hanger.html.haml @@ -1,7 +1,7 @@ - show_controls ||= false # we could do user check here, but may as well do it once .object = render :partial => 'items/item_link', :locals => {:item => closet_hanger.item} - .quantity + .quantity{:class => "quantity-#{closet_hanger.quantity}"} %span= closet_hanger.quantity - if show_controls = form_for closet_hanger, :url => user_item_closet_hanger_path(current_user, closet_hanger.item), :html => {:class => 'closet-hanger-update'} do |f| diff --git a/app/views/closet_hangers/index.html.haml b/app/views/closet_hangers/index.html.haml index 92c26f57..6e921a1d 100644 --- a/app/views/closet_hangers/index.html.haml +++ b/app/views/closet_hangers/index.html.haml @@ -1,7 +1,7 @@ - unless public_perspective? - title 'Your Items' - add_body_class 'current-user' - - content_for :before_flashes do + - secondary_nav do = link_to "Import closet from Neopets", new_closet_page_path, :id => 'import-link' = form_tag items_path, :method => :get, :id => 'closet-hangers-items-search', 'data-current-user-id' => current_user.id do = text_field_tag :q, nil, :placeholder => "Find items to add" @@ -31,19 +31,18 @@ = f.submit "Save" %span#cancel-contact-link cancel -- unless @closet_hangers_by_owned.empty? - %p - These are the items you are tracking on Dress to Impress. Hover over an - item to remove it from the list or to change the quantity. +%p + These are the items you are tracking on Dress to Impress. Hover over an + item to remove it from the list or to change the quantity. - %p - You can share - = link_to "this page", request.fullpath - with the world, and they'll be able to see what items you own and want. - It's also a good idea to - %span.edit-contact-link add your Neopets username - so that when other users see your items they will know how to contact you for - trades. +%p + You can share + = link_to "this page", request.fullpath + with the world, and they'll be able to see what items you own and want. + It's also a good idea to + %span.edit-contact-link add your Neopets username + so that when other users see your items they will know how to contact you for + trades. #closet-hangers{:class => public_perspective? ? nil : 'current-user'} - [true, false].each do |owned| @@ -53,14 +52,17 @@ Items = closet_hanger_subject %span.verb= closet_hanger_verb(owned) - %span.show click to show - %span.hide click to hide + %span.toggle.show show + %span.toggle.hide hide + = link_to_add_closet_list 'Add new list', :owned => owned, :class => 'add-closet-list' .closet-hangers-group-content + = render_closet_lists(@closet_lists_by_owned[owned]) + = render_unlisted_closet_hangers(owned) - if public_perspective? - - unless @closet_hangers_by_owned[owned] + - unless has_hangers?(owned) %p #{@user.name} doesn't seem to #{closet_hanger_verb(owned, false)} anything. - else - - unless @closet_hangers_by_owned[owned] + - unless has_hangers?(owned) %p You haven't tracked any items you #{closet_hanger_verb(owned)} on Dress to Impress. As you browse the site and create outfits, we'll @@ -78,7 +80,6 @@ = link_to "import your Neopets closet in a few quick steps", new_closet_page_path so why not? %p Have fun! - = render_closet_hangers(owned) - content_for :stylesheets do = stylesheet_link_tag 'south-street/jquery-ui' diff --git a/app/views/closet_lists/_closet_list.html.haml b/app/views/closet_lists/_closet_list.html.haml new file mode 100644 index 00000000..56a6cc19 --- /dev/null +++ b/app/views/closet_lists/_closet_list.html.haml @@ -0,0 +1,16 @@ +.closet-list + %header + - if show_controls + .closet-list-controls + = link_to 'Edit', edit_user_closet_list_path(closet_list.user, closet_list) + = form_tag user_closet_list_path(closet_list.user, closet_list), :method => 'delete' do + = submit_tag 'Delete', :confirm => closet_list_delete_confirmation(closet_list) + %h4= closet_list.name + + - if closet_list.description? + = closet_list_description_format closet_list + - unless closet_list.hangers.empty? + = render_sorted_hangers(closet_list, show_controls) + - else + %span.empty-list This list is empty. + diff --git a/app/views/closet_lists/_form.html.haml b/app/views/closet_lists/_form.html.haml index 8c5e229f..d4d43c03 100644 --- a/app/views/closet_lists/_form.html.haml +++ b/app/views/closet_lists/_form.html.haml @@ -1,3 +1,6 @@ +- secondary_nav do + = link_to 'Back to Your Items', user_closet_hangers_path(current_user), :class => 'button' + = form_for [@closet_list.user, @closet_list] do |f| %ul.fields %li @@ -13,5 +16,13 @@ Why are these items in a list? What are your terms for trading? Or you can leave this blank. = f.text_area :description + %span.hint + We + = surround '_' do + %em support + = surround '**' do + %strong Markdown + and + some HTML. = f.submit 'Save list' diff --git a/app/views/closet_lists/edit.html.haml b/app/views/closet_lists/edit.html.haml new file mode 100644 index 00000000..d5ed6893 --- /dev/null +++ b/app/views/closet_lists/edit.html.haml @@ -0,0 +1,3 @@ +- title "Editing list \"#{@closet_list.name}\"" += render 'form' + diff --git a/app/views/items/show.html.haml b/app/views/items/show.html.haml index 28845458..15219b1a 100644 --- a/app/views/items/show.html.haml +++ b/app/views/items/show.html.haml @@ -26,6 +26,9 @@ = f.hidden_field :owned = f.label :quantity, "How many of these do you #{hanger.verb(:you)}?" = f.number_field :quantity, :min => 0, :required => true + - lists = current_user.closet_lists.where(:hangers_owned => hanger.owned).all + - unless lists.empty? + = f.collection_select :list_id, lists, :id, :name, :include_blank => 'Not in a list' = f.submit "Save" %p= @item.description diff --git a/config/routes.rb b/config/routes.rb index d5f9f611..49cf66c8 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -42,7 +42,7 @@ OpenneoImpressItems::Application.routes.draw do |map| resources :users, :path => 'user', :only => [:update] do resources :contributions, :only => [:index] resources :closet_hangers, :only => [:index], :path => 'closet' - resources :closet_lists, :only => [:new, :create], :path => 'closet/lists' + resources :closet_lists, :only => [:new, :create, :edit, :update, :destroy], :path => 'closet/lists' resources :items, :only => [] do resource :closet_hanger, :only => [:create, :update, :destroy] diff --git a/db/migrate/20110726231143_create_closet_lists.rb b/db/migrate/20110726231143_create_closet_lists.rb index 272cbb71..85ec7f33 100644 --- a/db/migrate/20110726231143_create_closet_lists.rb +++ b/db/migrate/20110726231143_create_closet_lists.rb @@ -9,13 +9,13 @@ class CreateClosetLists < ActiveRecord::Migration t.timestamps end - add_column :closet_hangers, :closet_list_id, :integer + add_column :closet_hangers, :list_id, :integer end def self.down drop_table :closet_lists - remove_column :closet_hangers, :closet_list_id + remove_column :closet_hangers, :list_id end end diff --git a/db/schema.rb b/db/schema.rb index 2b6d18c2..c8547726 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -26,8 +26,8 @@ ActiveRecord::Schema.define(:version => 20110726231143) do t.integer "quantity" t.datetime "created_at" t.datetime "updated_at" - t.boolean "owned", :default => true, :null => false - t.integer "closet_list_id" + t.boolean "owned", :default => true, :null => false + t.integer "list_id" end create_table "closet_lists", :force => true do |t| diff --git a/public/javascripts/closet_hangers/index.js b/public/javascripts/closet_hangers/index.js index 9ce9a744..f2636a2c 100644 --- a/public/javascripts/closet_hangers/index.js +++ b/public/javascripts/closet_hangers/index.js @@ -13,8 +13,10 @@ label: el.find('span.verb').text(), owned: (el.attr('data-owned') == 'true') }; - }).find('header').click(function () { - $(this).parent().toggleClass('hidden'); + }); + + $('div.closet-hangers-group span.toggle').live('click', function () { + $(this).closest('.closet-hangers-group').toggleClass('hidden'); }); /* @@ -78,7 +80,9 @@ var input = form.children("input[type=number]"); if(input.hasChanged()) { var objectWrapper = form.closest(".object").addClass("loading"); - var span = objectWrapper.find("span").text(input.val()); + var newQuantity = input.val(); + var span = objectWrapper.find("span").text(newQuantity); + span.parent().attr('class', 'quantity quantity-' + newQuantity); var data = form.serialize(); // get data before disabling inputs objectWrapper.disableForms(); form.data('loading', true); @@ -284,5 +288,15 @@ }); e.preventDefault(); }); + + /* + + Hanger list controls + + */ + + $('input[type=submit][data-confirm]').live('click', function (e) { + if(!confirm(this.getAttribute('data-confirm'))) e.preventDefault(); + }); })(); diff --git a/public/stylesheets/compiled/screen.css b/public/stylesheets/compiled/screen.css index 43e89f3d..6929cf3a 100644 --- a/public/stylesheets/compiled/screen.css +++ b/public/stylesheets/compiled/screen.css @@ -157,26 +157,21 @@ a.button.loud:hover, input[type=submit].loud:hover, button.loud:hover { background-color: #ee4b00; } -/* line 87, ../../../app/stylesheets/partials/clean/_mixins.sass */ -a.button:after { - content: " >>"; -} - -/* line 99, ../../../app/stylesheets/_layout.sass */ +/* line 96, ../../../app/stylesheets/_layout.sass */ ul.buttons { margin-bottom: 1em; } -/* line 101, ../../../app/stylesheets/_layout.sass */ +/* line 98, ../../../app/stylesheets/_layout.sass */ ul.buttons li { list-style: none; margin: 0 0.5em; } -/* line 104, ../../../app/stylesheets/_layout.sass */ +/* line 101, ../../../app/stylesheets/_layout.sass */ ul.buttons li, ul.buttons li form { display: inline; } -/* line 107, ../../../app/stylesheets/_layout.sass */ +/* line 104, ../../../app/stylesheets/_layout.sass */ #footer { clear: both; font-size: 75%; @@ -184,65 +179,65 @@ ul.buttons li, ul.buttons li form { padding-top: 2em; text-align: center; } -/* line 113, ../../../app/stylesheets/_layout.sass */ +/* line 110, ../../../app/stylesheets/_layout.sass */ #footer ul, #footer div { display: inline; margin: 0 1em; } -/* line 116, ../../../app/stylesheets/_layout.sass */ +/* line 113, ../../../app/stylesheets/_layout.sass */ #footer li, #footer div ul { display: inline; margin: 0 0.5em; } -/* line 120, ../../../app/stylesheets/_layout.sass */ +/* line 117, ../../../app/stylesheets/_layout.sass */ .success, .alert, .warning { margin-bottom: 1em; padding: 0.25em 0.5em; text-align: center; } -/* line 125, ../../../app/stylesheets/_layout.sass */ +/* line 122, ../../../app/stylesheets/_layout.sass */ .success { background: #e6efc2; border: 1px solid #c6d880; color: #264409; } -/* line 128, ../../../app/stylesheets/_layout.sass */ +/* line 125, ../../../app/stylesheets/_layout.sass */ .alert { background: #fbe3e4; border: 1px solid #fbc2c4; color: #8a1f11; } -/* line 131, ../../../app/stylesheets/_layout.sass */ +/* line 128, ../../../app/stylesheets/_layout.sass */ .warning { background: #fff6bf; border: 1px solid #ffd324; color: #514721; } -/* line 134, ../../../app/stylesheets/_layout.sass */ +/* line 131, ../../../app/stylesheets/_layout.sass */ #userbar { font-family: Delicious, Helvetica, Arial, Verdana, sans-serif; position: absolute; right: 0; top: 0; } -/* line 139, ../../../app/stylesheets/_layout.sass */ +/* line 136, ../../../app/stylesheets/_layout.sass */ #userbar > * { display: inline; margin: 0 0.25em; } -/* line 143, ../../../app/stylesheets/_layout.sass */ +/* line 140, ../../../app/stylesheets/_layout.sass */ #userbar-image-mode { font-weight: bold; margin-right: 1em; text-decoration: none; } -/* line 147, ../../../app/stylesheets/_layout.sass */ +/* line 144, ../../../app/stylesheets/_layout.sass */ #userbar-image-mode img { bottom: -2px; height: 16px; @@ -250,25 +245,25 @@ ul.buttons li, ul.buttons li form { width: 16px; } -/* line 150, ../../../app/stylesheets/_layout.sass */ +/* line 147, ../../../app/stylesheets/_layout.sass */ #userbar-log-in { text-decoration: none; } -/* line 152, ../../../app/stylesheets/_layout.sass */ +/* line 149, ../../../app/stylesheets/_layout.sass */ #userbar-log-in img { margin-bottom: -4px; margin-right: 0.25em; } -/* line 156, ../../../app/stylesheets/_layout.sass */ +/* line 153, ../../../app/stylesheets/_layout.sass */ #userbar-log-in span { text-decoration: underline; } -/* line 158, ../../../app/stylesheets/_layout.sass */ +/* line 155, ../../../app/stylesheets/_layout.sass */ #userbar-log-in:hover span { text-decoration: none; } -/* line 161, ../../../app/stylesheets/_layout.sass */ +/* line 158, ../../../app/stylesheets/_layout.sass */ .object { display: -moz-inline-box; -moz-box-orient: vertical; @@ -283,32 +278,32 @@ ul.buttons li, ul.buttons li form { vertical-align: top; width: 100px; } -/* line 169, ../../../app/stylesheets/_layout.sass */ +/* line 166, ../../../app/stylesheets/_layout.sass */ .object a { text-decoration: none; } -/* line 171, ../../../app/stylesheets/_layout.sass */ +/* line 168, ../../../app/stylesheets/_layout.sass */ .object a img { -moz-opacity: 0.75; -webkit-opacity: 0.75; -o-opacity: 0.75; -khtml-opacity: 0.75; } -/* line 173, ../../../app/stylesheets/_layout.sass */ +/* line 170, ../../../app/stylesheets/_layout.sass */ .object img { display: block; height: 80px; margin: 0 auto; width: 80px; } -/* line 178, ../../../app/stylesheets/_layout.sass */ +/* line 175, ../../../app/stylesheets/_layout.sass */ .object:hover img, .object a:hover img { -moz-opacity: 1; -webkit-opacity: 1; -o-opacity: 1; -khtml-opacity: 1; } -/* line 184, ../../../app/stylesheets/_layout.sass */ +/* line 181, ../../../app/stylesheets/_layout.sass */ .object .nc-icon, .object .closeted-icons { -moz-opacity: 1; -webkit-opacity: 1; @@ -319,7 +314,7 @@ ul.buttons li, ul.buttons li form { position: absolute; top: 64px; } -/* line 190, ../../../app/stylesheets/_layout.sass */ +/* line 187, ../../../app/stylesheets/_layout.sass */ .object .nc-icon:hover, .object .closeted-icons:hover { -moz-opacity: 0.5; -webkit-opacity: 0.5; @@ -327,32 +322,32 @@ ul.buttons li, ul.buttons li form { -khtml-opacity: 0.5; background: transparent; } -/* line 194, ../../../app/stylesheets/_layout.sass */ +/* line 191, ../../../app/stylesheets/_layout.sass */ .object .nc-icon, .object .closeted-icons img { display: inline; height: 16px; width: 16px; } -/* line 199, ../../../app/stylesheets/_layout.sass */ +/* line 196, ../../../app/stylesheets/_layout.sass */ .object .nc-icon { right: 18px; } -/* line 202, ../../../app/stylesheets/_layout.sass */ +/* line 199, ../../../app/stylesheets/_layout.sass */ .object .closeted-icons { left: 18px; } -/* line 205, ../../../app/stylesheets/_layout.sass */ +/* line 202, ../../../app/stylesheets/_layout.sass */ dt { font-weight: bold; } -/* line 208, ../../../app/stylesheets/_layout.sass */ +/* line 205, ../../../app/stylesheets/_layout.sass */ dd { margin: 0 0 1.5em 1em; } -/* line 211, ../../../app/stylesheets/_layout.sass */ +/* line 208, ../../../app/stylesheets/_layout.sass */ #home-link { font-family: Delicious, Helvetica, Arial, Verdana, sans-serif; font-size: 175%; @@ -363,21 +358,21 @@ dd { position: absolute; top: 0; } -/* line 221, ../../../app/stylesheets/_layout.sass */ +/* line 218, ../../../app/stylesheets/_layout.sass */ #home-link:hover { background: #eeffee; text-decoration: none; } -/* line 224, ../../../app/stylesheets/_layout.sass */ +/* line 221, ../../../app/stylesheets/_layout.sass */ #home-link span:before { content: "<< "; } -/* line 228, ../../../app/stylesheets/_layout.sass */ +/* line 225, ../../../app/stylesheets/_layout.sass */ .pagination a, .pagination span { margin: 0 0.5em; } -/* line 230, ../../../app/stylesheets/_layout.sass */ +/* line 227, ../../../app/stylesheets/_layout.sass */ .pagination .current { font-weight: bold; } @@ -561,20 +556,25 @@ div.jGrowl div.jGrowl-closer { } } -/* line 5, ../../../app/stylesheets/closet_hangers/_index.sass */ +/* line 2, ../../../app/stylesheets/partials/_secondary_nav.sass */ body.closet_hangers-index #title { float: left; - margin-bottom: 0; + margin-right: 0.5em; } -/* line 9, ../../../app/stylesheets/closet_hangers/_index.sass */ +/* line 6, ../../../app/stylesheets/partials/_secondary_nav.sass */ body.closet_hangers-index .flash { clear: both; } -/* line 12, ../../../app/stylesheets/closet_hangers/_index.sass */ -body.closet_hangers-index #import-link, body.closet_hangers-index #closet-hangers-items-search { +/* line 9, ../../../app/stylesheets/partials/_secondary_nav.sass */ +body.closet_hangers-index #secondary-nav { + display: block; margin-top: 0.75em; } -/* line 15, ../../../app/stylesheets/closet_hangers/_index.sass */ +/* line 8, ../../../app/stylesheets/closet_hangers/_index.sass */ +body.closet_hangers-index #title { + margin-bottom: 0; +} +/* line 11, ../../../app/stylesheets/closet_hangers/_index.sass */ body.closet_hangers-index #import-link { /* http://www.zurb.com/blog_uploads/0000/0617/buttons-03.html */ -moz-border-radius: 5px; @@ -593,7 +593,6 @@ body.closet_hangers-index #import-link { font-weight: bold; line-height: 1; background: #ff5c00 url('/images/alert-overlay.png?1296599919') repeat-x; - margin-left: 2em; } /* line 34, ../../../app/stylesheets/partials/clean/_mixins.sass */ body.closet_hangers-index #import-link:hover { @@ -611,18 +610,18 @@ body.closet_hangers-index #import-link:active { body.closet_hangers-index #import-link:hover { background-color: #ee4b00; } -/* line 20, ../../../app/stylesheets/closet_hangers/_index.sass */ +/* line 15, ../../../app/stylesheets/closet_hangers/_index.sass */ body.closet_hangers-index #closet-hangers-items-search { float: right; } -/* line 24, ../../../app/stylesheets/closet_hangers/_index.sass */ +/* line 19, ../../../app/stylesheets/closet_hangers/_index.sass */ body.closet_hangers-index #closet-hangers-items-search input[name=q].loading { background-image: url(/images/loading.gif); background-position: 2px center; background-repeat: no-repeat; padding-left: 20px; } -/* line 31, ../../../app/stylesheets/closet_hangers/_index.sass */ +/* line 26, ../../../app/stylesheets/closet_hangers/_index.sass */ body.closet_hangers-index #closet-hangers-contact { clear: both; font-size: 85%; @@ -630,65 +629,65 @@ body.closet_hangers-index #closet-hangers-contact { margin-left: 2em; min-height: 16px; } -/* line 38, ../../../app/stylesheets/closet_hangers/_index.sass */ +/* line 33, ../../../app/stylesheets/closet_hangers/_index.sass */ body.closet_hangers-index #closet-hangers-contact a { - background-image: url('/images/neomail.png?1311369565'); + background-image: url('/images/neomail.png?1311877030'); background-position: left center; background-repeat: no-repeat; padding-left: 18px; } -/* line 45, ../../../app/stylesheets/closet_hangers/_index.sass */ +/* line 40, ../../../app/stylesheets/closet_hangers/_index.sass */ body.closet_hangers-index #closet-hangers-contact input[type=text], body.closet_hangers-index #closet-hangers-contact body.pets-bulk #bulk-pets-form textarea, body.pets-bulk #bulk-pets-form body.closet_hangers-index #closet-hangers-contact textarea { width: 10em; } -/* line 48, ../../../app/stylesheets/closet_hangers/_index.sass */ +/* line 43, ../../../app/stylesheets/closet_hangers/_index.sass */ body.closet_hangers-index #closet-hangers-contact label { font-weight: bold; margin-right: 0.5em; } -/* line 52, ../../../app/stylesheets/closet_hangers/_index.sass */ +/* line 47, ../../../app/stylesheets/closet_hangers/_index.sass */ body.closet_hangers-index #closet-hangers-contact label:after { content: ":"; } -/* line 55, ../../../app/stylesheets/closet_hangers/_index.sass */ +/* line 50, ../../../app/stylesheets/closet_hangers/_index.sass */ body.closet_hangers-index #edit-contact-link-to-replace-form, body.closet_hangers-index #cancel-contact-link { display: none; } -/* line 58, ../../../app/stylesheets/closet_hangers/_index.sass */ +/* line 53, ../../../app/stylesheets/closet_hangers/_index.sass */ body.closet_hangers-index .edit-contact-link, body.closet_hangers-index #cancel-contact-link { cursor: pointer; text-decoration: underline; } -/* line 62, ../../../app/stylesheets/closet_hangers/_index.sass */ +/* line 57, ../../../app/stylesheets/closet_hangers/_index.sass */ body.closet_hangers-index .edit-contact-link:hover, body.closet_hangers-index #cancel-contact-link:hover { text-decoration: none; } -/* line 66, ../../../app/stylesheets/closet_hangers/_index.sass */ +/* line 61, ../../../app/stylesheets/closet_hangers/_index.sass */ body.closet_hangers-index #edit-contact-link-to-replace-form #contact-link-has-value { display: none; } -/* line 69, ../../../app/stylesheets/closet_hangers/_index.sass */ +/* line 64, ../../../app/stylesheets/closet_hangers/_index.sass */ body.closet_hangers-index #edit-contact-link-to-replace-form #contact-link-no-value { display: inline; } -/* line 73, ../../../app/stylesheets/closet_hangers/_index.sass */ +/* line 68, ../../../app/stylesheets/closet_hangers/_index.sass */ body.closet_hangers-index #edit-contact-link-to-replace-form.has-value #contact-link-has-value { display: inline; } -/* line 76, ../../../app/stylesheets/closet_hangers/_index.sass */ +/* line 71, ../../../app/stylesheets/closet_hangers/_index.sass */ body.closet_hangers-index #edit-contact-link-to-replace-form.has-value #contact-link-no-value { display: none; } -/* line 79, ../../../app/stylesheets/closet_hangers/_index.sass */ +/* line 74, ../../../app/stylesheets/closet_hangers/_index.sass */ body.closet_hangers-index #cancel-contact-link { margin-left: 1em; } -/* line 82, ../../../app/stylesheets/closet_hangers/_index.sass */ +/* line 77, ../../../app/stylesheets/closet_hangers/_index.sass */ body.closet_hangers-index #closet-hangers { clear: both; text-align: center; } -/* line 87, ../../../app/stylesheets/closet_hangers/_index.sass */ +/* line 82, ../../../app/stylesheets/closet_hangers/_index.sass */ body.closet_hangers-index #closet-hangers .object .quantity { -moz-opacity: 0.75; -webkit-opacity: 0.75; @@ -702,59 +701,187 @@ body.closet_hangers-index #closet-hangers .object .quantity { text-align: left; top: 60px; } -/* line 97, ../../../app/stylesheets/closet_hangers/_index.sass */ +/* line 92, ../../../app/stylesheets/closet_hangers/_index.sass */ body.closet_hangers-index #closet-hangers .object .quantity span, body.closet_hangers-index #closet-hangers .object .quantity input[type=number] { font-size: 16px; font-weight: bold; } -/* line 101, ../../../app/stylesheets/closet_hangers/_index.sass */ +/* line 96, ../../../app/stylesheets/closet_hangers/_index.sass */ body.closet_hangers-index #closet-hangers .object form { display: none; } -/* line 104, ../../../app/stylesheets/closet_hangers/_index.sass */ -body.closet_hangers-index header { +/* line 99, ../../../app/stylesheets/closet_hangers/_index.sass */ +body.closet_hangers-index #closet-hangers .object .quantity-1 { + display: none; +} +/* line 102, ../../../app/stylesheets/closet_hangers/_index.sass */ +body.closet_hangers-index .closet-hangers-group { + border-top: 1px solid #006600; + margin-bottom: 2em; + padding-bottom: 1em; +} +/* line 107, ../../../app/stylesheets/closet_hangers/_index.sass */ +body.closet_hangers-index .closet-hangers-group > header { border-bottom: 1px solid #aaddaa; display: block; margin-bottom: 0.25em; padding: 0.25em 0; position: relative; } -/* line 111, ../../../app/stylesheets/closet_hangers/_index.sass */ -body.closet_hangers-index header h3 { +/* line 114, ../../../app/stylesheets/closet_hangers/_index.sass */ +body.closet_hangers-index .closet-hangers-group > header h3 { font-size: 250%; margin: 0; } -/* line 115, ../../../app/stylesheets/closet_hangers/_index.sass */ -body.closet_hangers-index header span.show, body.closet_hangers-index header span.hide { +/* line 118, ../../../app/stylesheets/closet_hangers/_index.sass */ +body.closet_hangers-index .closet-hangers-group > header .add-closet-list { + /* http://www.zurb.com/blog_uploads/0000/0617/buttons-03.html */ + -moz-border-radius: 5px; + -webkit-border-radius: 5px; + background: #006400 url('/images/alert-overlay.png?1296599919') repeat-x; + border: 0; + display: inline-block; + padding: 0.5em 0.75em 0.45em; + color: white; + text-decoration: none; + -moz-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.5); + -webkit-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.5); + text-shadow: 0 -1px 1px rgba(0, 0, 0, 0.25); + border-bottom: 1px solid rgba(0, 0, 0, 0.25); + position: relative; + font-weight: bold; + line-height: 1; + bottom: 50%; + margin-bottom: -1em; + position: absolute; + right: 1em; +} +/* line 34, ../../../app/stylesheets/partials/clean/_mixins.sass */ +body.closet_hangers-index .closet-hangers-group > header .add-closet-list:hover { + background-color: #005300; +} +/* line 53, ../../../app/stylesheets/partials/clean/_mixins.sass */ +body.closet_hangers-index .closet-hangers-group > header .add-closet-list:hover { + color: white; +} +/* line 55, ../../../app/stylesheets/partials/clean/_mixins.sass */ +body.closet_hangers-index .closet-hangers-group > header .add-closet-list:active { + top: 1px; +} +/* line 125, ../../../app/stylesheets/closet_hangers/_index.sass */ +body.closet_hangers-index .closet-hangers-group > header .add-closet-list:active { + margin-bottom: -1.1em; + top: auto; +} +/* line 129, ../../../app/stylesheets/closet_hangers/_index.sass */ +body.closet_hangers-index .closet-hangers-group > header span.show, body.closet_hangers-index .closet-hangers-group > header span.hide { color: #448844; display: none; font-size: 85%; + left: 1em; position: absolute; - right: 1em; - bottom: 0; + top: 1em; } -/* line 124, ../../../app/stylesheets/closet_hangers/_index.sass */ -body.closet_hangers-index header:hover span.show, body.closet_hangers-index header:hover span.hide { +/* line 137, ../../../app/stylesheets/closet_hangers/_index.sass */ +body.closet_hangers-index .closet-hangers-group > header span.show:hover, body.closet_hangers-index .closet-hangers-group > header span.hide:hover { color: inherit; text-decoration: underline; } -/* line 128, ../../../app/stylesheets/closet_hangers/_index.sass */ -body.closet_hangers-index .closet-hangers-group { - border-top: 1px solid #006600; - margin-bottom: 2em; - padding-bottom: 1em; +/* line 141, ../../../app/stylesheets/closet_hangers/_index.sass */ +body.closet_hangers-index .closet-list { + border-bottom: 1px solid #aaddaa; + padding: 0.5em 0; } -/* line 136, ../../../app/stylesheets/closet_hangers/_index.sass */ +/* line 145, ../../../app/stylesheets/closet_hangers/_index.sass */ +body.closet_hangers-index .closet-list header { + display: block; + position: relative; +} +/* line 149, ../../../app/stylesheets/closet_hangers/_index.sass */ +body.closet_hangers-index .closet-list h4 { + font-family: Delicious, Helvetica, Arial, Verdana, sans-serif; + font-size: 150%; + margin: 0 auto; +} +/* line 154, ../../../app/stylesheets/closet_hangers/_index.sass */ +body.closet_hangers-index .closet-list .empty-list { + font-style: italic; +} +/* line 157, ../../../app/stylesheets/closet_hangers/_index.sass */ +body.closet_hangers-index .closet-list .closet-list-controls { + display: none; + position: absolute; + right: 1em; + top: 0; +} +/* line 163, ../../../app/stylesheets/closet_hangers/_index.sass */ +body.closet_hangers-index .closet-list .closet-list-controls a, body.closet_hangers-index .closet-list .closet-list-controls input[type=submit] { + /* http://www.zurb.com/blog_uploads/0000/0617/buttons-03.html */ + -moz-border-radius: 5px; + -webkit-border-radius: 5px; + background: #006400 url('/images/alert-overlay.png?1296599919') repeat-x; + border: 0; + display: inline-block; + padding: 0.5em 0.75em 0.45em; + color: white; + text-decoration: none; + -moz-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.5); + -webkit-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.5); + text-shadow: 0 -1px 1px rgba(0, 0, 0, 0.25); + border-bottom: 1px solid rgba(0, 0, 0, 0.25); + position: relative; + font-weight: bold; + line-height: 1; + background: #aaaaaa url('/images/alert-overlay.png?1296599919') repeat-x; + -moz-opacity: 0.9; + -webkit-opacity: 0.9; + -o-opacity: 0.9; + -khtml-opacity: 0.9; + font-size: 80%; +} +/* line 34, ../../../app/stylesheets/partials/clean/_mixins.sass */ +body.closet_hangers-index .closet-list .closet-list-controls a:hover, body.closet_hangers-index .closet-list .closet-list-controls input[type=submit]:hover { + background-color: #005300; +} +/* line 53, ../../../app/stylesheets/partials/clean/_mixins.sass */ +body.closet_hangers-index .closet-list .closet-list-controls a:hover, body.closet_hangers-index .closet-list .closet-list-controls input[type=submit]:hover { + color: white; +} +/* line 55, ../../../app/stylesheets/partials/clean/_mixins.sass */ +body.closet_hangers-index .closet-list .closet-list-controls a:active, body.closet_hangers-index .closet-list .closet-list-controls input[type=submit]:active { + top: 1px; +} +/* line 34, ../../../app/stylesheets/partials/clean/_mixins.sass */ +body.closet_hangers-index .closet-list .closet-list-controls a:hover, body.closet_hangers-index .closet-list .closet-list-controls input[type=submit]:hover { + background-color: #999999; +} +/* line 166, ../../../app/stylesheets/closet_hangers/_index.sass */ +body.closet_hangers-index .closet-list .closet-list-controls form { + display: inline; +} +/* line 170, ../../../app/stylesheets/closet_hangers/_index.sass */ +body.closet_hangers-index .closet-list.unlisted h4 { + font-style: italic; +} +/* line 174, ../../../app/stylesheets/closet_hangers/_index.sass */ +body.closet_hangers-index .closet-list:hover .closet-list-controls { + display: block; +} +/* line 177, ../../../app/stylesheets/closet_hangers/_index.sass */ +body.closet_hangers-index .closet-list:last-child { + border-bottom: 0; +} +/* line 183, ../../../app/stylesheets/closet_hangers/_index.sass */ body.closet_hangers-index.current-user #closet-hangers .object:hover form { display: inline; } -/* line 139, ../../../app/stylesheets/closet_hangers/_index.sass */ +/* line 186, ../../../app/stylesheets/closet_hangers/_index.sass */ body.closet_hangers-index.current-user #closet-hangers .object:hover .closet-hanger-destroy { position: absolute; right: 18px; top: 0; } -/* line 144, ../../../app/stylesheets/closet_hangers/_index.sass */ +/* line 191, ../../../app/stylesheets/closet_hangers/_index.sass */ body.closet_hangers-index.current-user #closet-hangers .object:hover .closet-hanger-destroy input { /* http://www.zurb.com/blog_uploads/0000/0617/buttons-03.html */ -moz-border-radius: 5px; @@ -795,7 +922,7 @@ body.closet_hangers-index.current-user #closet-hangers .object:hover .closet-han body.closet_hangers-index.current-user #closet-hangers .object:hover .closet-hanger-destroy input:hover { background-color: #999999; } -/* line 147, ../../../app/stylesheets/closet_hangers/_index.sass */ +/* line 194, ../../../app/stylesheets/closet_hangers/_index.sass */ body.closet_hangers-index.current-user #closet-hangers .object:hover .quantity { -moz-opacity: 1; -webkit-opacity: 1; @@ -805,97 +932,119 @@ body.closet_hangers-index.current-user #closet-hangers .object:hover .quantity { top: 56px; padding: 0; } -/* line 153, ../../../app/stylesheets/closet_hangers/_index.sass */ +/* line 200, ../../../app/stylesheets/closet_hangers/_index.sass */ body.closet_hangers-index.current-user #closet-hangers .object:hover .quantity span { display: none; } -/* line 156, ../../../app/stylesheets/closet_hangers/_index.sass */ +/* line 203, ../../../app/stylesheets/closet_hangers/_index.sass */ body.closet_hangers-index.current-user #closet-hangers .object:hover .quantity input[type=number] { padding: 2px; width: 2em; } -/* line 160, ../../../app/stylesheets/closet_hangers/_index.sass */ +/* line 207, ../../../app/stylesheets/closet_hangers/_index.sass */ body.closet_hangers-index.current-user #closet-hangers .object:hover .quantity input[type=submit] { font-size: 85%; } -/* line 166, ../../../app/stylesheets/closet_hangers/_index.sass */ +/* line 212, ../../../app/stylesheets/closet_hangers/_index.sass */ +body.closet_hangers-index.current-user.js #closet-hangers .object:hover .quantity { + display: block; +} +/* line 215, ../../../app/stylesheets/closet_hangers/_index.sass */ body.closet_hangers-index.current-user.js #closet-hangers .object:hover .quantity input[type=number] { width: 2.5em; } -/* line 169, ../../../app/stylesheets/closet_hangers/_index.sass */ +/* line 218, ../../../app/stylesheets/closet_hangers/_index.sass */ body.closet_hangers-index.current-user.js #closet-hangers .object:hover .quantity input[type=submit] { display: none; } -/* line 172, ../../../app/stylesheets/closet_hangers/_index.sass */ +/* line 221, ../../../app/stylesheets/closet_hangers/_index.sass */ body.closet_hangers-index.current-user.js #closet-hangers .object.loading { background: #eeffee; outline: 1px solid #006600; } -/* line 176, ../../../app/stylesheets/closet_hangers/_index.sass */ +/* line 225, ../../../app/stylesheets/closet_hangers/_index.sass */ +body.closet_hangers-index.current-user.js #closet-hangers .object.loading .quantity { + display: block; +} +/* line 228, ../../../app/stylesheets/closet_hangers/_index.sass */ body.closet_hangers-index.current-user.js #closet-hangers .object.loading .quantity span:after { content: "…"; } -/* line 180, ../../../app/stylesheets/closet_hangers/_index.sass */ +/* line 232, ../../../app/stylesheets/closet_hangers/_index.sass */ body.closet_hangers-index.current-user.js #closet-hangers-contact form { display: none; } -/* line 183, ../../../app/stylesheets/closet_hangers/_index.sass */ +/* line 235, ../../../app/stylesheets/closet_hangers/_index.sass */ body.closet_hangers-index.current-user.js #closet-hangers-contact .edit-contact-link, body.closet_hangers-index.current-user.js #closet-hangers-contact #cancel-contact-link { display: inline; } -/* line 187, ../../../app/stylesheets/closet_hangers/_index.sass */ +/* line 239, ../../../app/stylesheets/closet_hangers/_index.sass */ body.closet_hangers-index.current-user.js #closet-hangers-contact.editing form { display: block; } -/* line 190, ../../../app/stylesheets/closet_hangers/_index.sass */ +/* line 242, ../../../app/stylesheets/closet_hangers/_index.sass */ body.closet_hangers-index.current-user.js #closet-hangers-contact.editing .edit-contact-link { display: none; } -/* line 194, ../../../app/stylesheets/closet_hangers/_index.sass */ -body.closet_hangers-index.current-user.js .closet-hangers-group header { +/* line 247, ../../../app/stylesheets/closet_hangers/_index.sass */ +body.closet_hangers-index.current-user.js .closet-hangers-group header .show, body.closet_hangers-index.current-user.js .closet-hangers-group header .hide { cursor: pointer; } -/* line 197, ../../../app/stylesheets/closet_hangers/_index.sass */ +/* line 250, ../../../app/stylesheets/closet_hangers/_index.sass */ body.closet_hangers-index.current-user.js .closet-hangers-group header .hide { display: block; } -/* line 201, ../../../app/stylesheets/closet_hangers/_index.sass */ +/* line 254, ../../../app/stylesheets/closet_hangers/_index.sass */ body.closet_hangers-index.current-user.js .closet-hangers-group.hidden header .hide, body.closet_hangers-index.current-user.js .closet-hangers-group.hidden .closet-hangers-group-content { display: none; } -/* line 204, ../../../app/stylesheets/closet_hangers/_index.sass */ +/* line 257, ../../../app/stylesheets/closet_hangers/_index.sass */ body.closet_hangers-index.current-user.js .closet-hangers-group.hidden header .show { display: block; } -/* line 3, ../../../app/stylesheets/closet_lists/_form.sass */ -body.closet_lists-new form ul.fields, body.closet_lists-create form ul.fields { +/* line 2, ../../../app/stylesheets/partials/_secondary_nav.sass */ +body.closet_lists-new #title, body.closet_lists-create #title, body.closet_lists-edit #title, body.closet_lists-update #title { + float: left; + margin-right: 0.5em; +} +/* line 6, ../../../app/stylesheets/partials/_secondary_nav.sass */ +body.closet_lists-new .flash, body.closet_lists-create .flash, body.closet_lists-edit .flash, body.closet_lists-update .flash { + clear: both; +} +/* line 9, ../../../app/stylesheets/partials/_secondary_nav.sass */ +body.closet_lists-new #secondary-nav, body.closet_lists-create #secondary-nav, body.closet_lists-edit #secondary-nav, body.closet_lists-update #secondary-nav { + display: block; + margin-top: 0.75em; +} +/* line 4, ../../../app/stylesheets/closet_lists/_form.sass */ +body.closet_lists-new form ul.fields, body.closet_lists-create form ul.fields, body.closet_lists-edit form ul.fields, body.closet_lists-update form ul.fields { list-style: none; } -/* line 6, ../../../app/stylesheets/closet_lists/_form.sass */ -body.closet_lists-new form ul.fields label, body.closet_lists-create form ul.fields label { +/* line 7, ../../../app/stylesheets/closet_lists/_form.sass */ +body.closet_lists-new form ul.fields label, body.closet_lists-create form ul.fields label, body.closet_lists-edit form ul.fields label, body.closet_lists-update form ul.fields label { float: left; font-weight: bold; margin-right: 1em; } -/* line 11, ../../../app/stylesheets/closet_lists/_form.sass */ -body.closet_lists-new form ul.fields li, body.closet_lists-create form ul.fields li { +/* line 12, ../../../app/stylesheets/closet_lists/_form.sass */ +body.closet_lists-new form ul.fields li, body.closet_lists-create form ul.fields li, body.closet_lists-edit form ul.fields li, body.closet_lists-update form ul.fields li { padding: 0.75em 0; width: 25em; } -/* line 15, ../../../app/stylesheets/closet_lists/_form.sass */ -body.closet_lists-new form ul.fields input, body.closet_lists-new form ul.fields textarea, body.closet_lists-new form ul.fields select, body.closet_lists-create form ul.fields input, body.closet_lists-create form ul.fields textarea, body.closet_lists-create form ul.fields select { +/* line 16, ../../../app/stylesheets/closet_lists/_form.sass */ +body.closet_lists-new form ul.fields input, body.closet_lists-new form ul.fields textarea, body.closet_lists-new form ul.fields select, body.closet_lists-create form ul.fields input, body.closet_lists-create form ul.fields textarea, body.closet_lists-create form ul.fields select, body.closet_lists-edit form ul.fields input, body.closet_lists-edit form ul.fields textarea, body.closet_lists-edit form ul.fields select, body.closet_lists-update form ul.fields input, body.closet_lists-update form ul.fields textarea, body.closet_lists-update form ul.fields select { clear: both; display: block; margin-top: 0.25em; width: 80%; } -/* line 21, ../../../app/stylesheets/closet_lists/_form.sass */ -body.closet_lists-new form ul.fields textarea, body.closet_lists-create form ul.fields textarea { +/* line 22, ../../../app/stylesheets/closet_lists/_form.sass */ +body.closet_lists-new form ul.fields textarea, body.closet_lists-create form ul.fields textarea, body.closet_lists-edit form ul.fields textarea, body.closet_lists-update form ul.fields textarea { height: 12em; } -/* line 24, ../../../app/stylesheets/closet_lists/_form.sass */ -body.closet_lists-new form ul.fields .hint, body.closet_lists-create form ul.fields .hint { +/* line 25, ../../../app/stylesheets/closet_lists/_form.sass */ +body.closet_lists-new form ul.fields .hint, body.closet_lists-create form ul.fields .hint, body.closet_lists-edit form ul.fields .hint, body.closet_lists-update form ul.fields .hint { display: block; font-size: 85%; } @@ -1303,7 +1452,7 @@ body.items-show #closet-hangers { float: right; font-size: 85%; padding: 1em; - width: 18em; + width: 21em; } /* line 73, ../../../app/stylesheets/items/_show.sass */ body.items-show #closet-hangers label, body.items-show #closet-hangers header { @@ -1319,6 +1468,10 @@ body.items-show #closet-hangers form { padding: 0.5em 0; } /* line 83, ../../../app/stylesheets/items/_show.sass */ +body.items-show #closet-hangers select { + width: 9em; +} +/* line 86, ../../../app/stylesheets/items/_show.sass */ body.items-show #closet-hangers input[type=number] { width: 4em; } @@ -1901,7 +2054,7 @@ body.outfits-edit .object:hover ul, body.outfits-edit .object:hover .object-info } /* line 418, ../../../app/stylesheets/outfits/_edit.sass */ body.outfits-edit .nc-icon { - background: url('/images/nc.png?1311369565') no-repeat; + background: url('/images/nc.png?1311877029') no-repeat; height: 16px; position: absolute; right: 16px; diff --git a/vendor/cache/sanitize-2.0.3.gem b/vendor/cache/sanitize-2.0.3.gem new file mode 100644 index 0000000000000000000000000000000000000000..8d81d81e0e5b80e7383837f3e704a1f9e07d90a2 GIT binary patch literal 14336 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 literal 0 HcmV?d00001