Finished chapter 9
authorNeil Smith <neil.git@njae.me.uk>
Mon, 16 Feb 2009 12:40:08 +0000 (12:40 +0000)
committerNeil Smith <neil.git@njae.me.uk>
Mon, 16 Feb 2009 12:40:08 +0000 (12:40 +0000)
app/controllers/store_controller.rb
app/helpers/store_helper.rb
app/models/cart.rb
app/views/layouts/store.html.erb
app/views/store/_cart.html.erb
app/views/store/add_to_cart.js.rjs
app/views/store/empty_cart.js.rjs [new file with mode: 0644]
app/views/store/index.html.erb
public/stylesheets/depot.css

index 8234cdcb244d053025bcc790324fc63b1b74352e..3b2e6b8d2284fb79abea10c62d764d4f9ad573ce 100644 (file)
@@ -9,7 +9,8 @@ class StoreController < ApplicationController
     @cart = find_cart
     @current_item = @cart.add_product(product)
       respond_to do |format|
-        format.js
+        format.js if request.xhr?
+        format.html {redirect_to_index}
       end
   rescue ActiveRecord::RecordNotFound
     logger.error("Attempt to access invalid product #{params[:id]}" )
@@ -18,7 +19,7 @@ class StoreController < ApplicationController
   
   def empty_cart
     session[:cart] = nil
-    redirect_to_index('Your cart has been emptied')
+    redirect_to_index unless request.xhr?
   end
   
  private
index 9263619438e4c7ad14b744c6bbad2000715fe794..4a9c91c0252721aab668a5cc2cef2aa3c87792e5 100644 (file)
@@ -1,2 +1,10 @@
 module StoreHelper
+  def hidden_div_if(condition, attributes = {}, &block)
+    if condition
+      attributes["style"] = "display: none"
+    end
+    content_tag("div", attributes, &block)
+  end
+  
 end
index 88061d380470188dcf6991dcd5e0cdb3f966799d..bd51c383311d6a0a008208a3908955e330be963a 100644 (file)
@@ -20,4 +20,8 @@ class Cart
     @items.sum {|item| item.price}
   end
   
+  def total_items
+    @items.sum {|item| item.quantity}
+  end
+  
 end
index 5f2d4f10bd04a50ff6cedb36881cd420bc9fd805..e55726c75cec4041ac9d9eb0a20a9578cea51abc 100644 (file)
@@ -14,9 +14,9 @@
     </div>
     <div id="columns">
       <div id="side">
-        <div id="cart">
+        <% hidden_div_if(@cart.items.empty?, :id => "cart") do %>
             <%= render(:partial => "cart" , :object => @cart) %>
-        </div>
+        <% end %>
         <a href="http://www....">Home</a><br />
         <a href="http://www..../faq">Questions</a><br />
         <a href="http://www..../news">News</a><br />
index 01fbeb5ed357b0a356582f840c7e5aaae04ff3e0..cc84043d9180968f7431ab16e7be41546fa38ca0 100644 (file)
@@ -1,11 +1,13 @@
 <div class="cart-title">Your Cart</div>
-    <table>
-    <%= render(:partial => 'cart_item', :collection => cart.items) %>
+<table>
+  <%= render(:partial => 'cart_item', :collection => cart.items.sort_by {|item| item.product.title}) %>
 
-        <tr class="total-line">
-            <td colspan="2">Total</td>
-            <td class="total-cell"><%= number_to_currency(cart.total_price, :unit => "£") %></td>
-        </tr>
-    </table>
+  <tr class="total-line">
+    <td colspan="2">Total</td>
+    <td class="total-cell"><%= number_to_currency(cart.total_price, :unit => "£") %></td>
+  </tr>
+</table>
 
-<%= button_to 'Empty cart', :action => :empty_cart %>
+<% form_remote_tag :url => {:action => 'empty_cart'} do %>
+    <%= submit_tag "Empty cart" %>
+<% end %>
index 1b6ec4c1b61799971ebf0c09d4f61ab99862eacc..2ef0a833f279499c3434e98c4a25bcd7d1f45294 100644 (file)
@@ -1,5 +1,7 @@
 page.replace_html("cart", :partial => 'cart', :object => @cart)
 
+page[:cart].visual_effect :blind_down if @cart.total_items == 1
+
 page[:current_item].visual_effect :highlight,
                                   :startcolor => "#88ff88" ,
                                   :endcolor => "#114411"
diff --git a/app/views/store/empty_cart.js.rjs b/app/views/store/empty_cart.js.rjs
new file mode 100644 (file)
index 0000000..5f9616f
--- /dev/null
@@ -0,0 +1,2 @@
+
+page[:cart].visual_effect :blind_up
index fff01dffcb953c92a0c8ebd97a8042ef28c58ebb..f3e7ebedff34db7d48abeaa01929ff076ef094ae 100644 (file)
@@ -2,8 +2,10 @@
 
 <% for product in @products -%>
   <div class="entry">
-    <%= link_to image_tag(product.image_url), {:action => "add_to_cart", :id => product}, :method => "post" %>
-    <h3><%= link_to h(product.title), {:action => "add_to_cart", :id => product}, :method => "post" %></h3>
+    <% form_remote_tag :url => {:action => 'add_to_cart', :id => product} do %>
+      <%= image_submit_tag(product.image_url) %>
+    <% end %>
+    <h3><%= h(product.title) %></h3>
     <%= product.description %>
     <div class="price-line">
       <span class="price"><%= number_to_currency product.price, :unit => "£" %></span>
index a8d7cc65b3e84cbc5a0686337609cb48c6896443..bb4934d31524266461f4d27220b5dd00f21b1a06 100644 (file)
@@ -125,7 +125,7 @@ h1 {
   font-family: sans-serif;
 }
 
-#store .entry img {
+#store .entry img, #store .entry form input[type="image"]  {
   width: 75px;
   float: left;
   border: 0;