Commit 6be61ee9b124ab6f441a7623188c827da3b056a0
1 parent
d100def5
Exists in
master
and in
29 other branches
[shopping-cart] Fixing double colorbox open and improving requests
We improved some extra requests on the shopping cart, like: visibility and list actions. They are now being retrieved on the get action all together. Also forbidding the user to request more the one action on the cart simultaneously because the cart in the cookie doesn't supports it. (We need the session stored in the database!)
Showing
2 changed files
with
85 additions
and
82 deletions
Show diff stats
plugins/shopping_cart/controllers/shopping_cart_plugin_controller.rb
@@ -13,9 +13,15 @@ class ShoppingCartPluginController < PublicController | @@ -13,9 +13,15 @@ class ShoppingCartPluginController < PublicController | ||
13 | def get | 13 | def get |
14 | config = | 14 | config = |
15 | if cart.nil? | 15 | if cart.nil? |
16 | - { 'enterprise_id' => nil, 'hasProducts' => false } | 16 | + { :enterprise_id => nil, |
17 | + :has_products => false, | ||
18 | + :visible => false, | ||
19 | + :products => []} | ||
17 | else | 20 | else |
18 | - { 'enterprise_id' => cart[:enterprise_id], 'hasProducts' => (cart[:items].keys.size > 0) } | 21 | + { :enterprise_id => cart[:enterprise_id], |
22 | + :has_products => (cart[:items].keys.size > 0), | ||
23 | + :visible => visible?, | ||
24 | + :products => products} | ||
19 | end | 25 | end |
20 | render :text => config.to_json | 26 | render :text => config.to_json |
21 | end | 27 | end |
@@ -56,26 +62,6 @@ class ShoppingCartPluginController < PublicController | @@ -56,26 +62,6 @@ class ShoppingCartPluginController < PublicController | ||
56 | 62 | ||
57 | def list | 63 | def list |
58 | if validate_cart_presence | 64 | if validate_cart_presence |
59 | - products = self.cart[:items].collect do |id, quantity| | ||
60 | - product = Product.find_by_id(id) | ||
61 | - if product | ||
62 | - { :id => product.id, | ||
63 | - :name => product.name, | ||
64 | - :price => get_price(product, product.enterprise.environment), | ||
65 | - :description => product.description, | ||
66 | - :picture => product.default_image(:minor), | ||
67 | - :quantity => quantity | ||
68 | - } | ||
69 | - else | ||
70 | - { :id => id, | ||
71 | - :name => _('Undefined product'), | ||
72 | - :price => 0, | ||
73 | - :description => _('Wrong product id'), | ||
74 | - :picture => '', | ||
75 | - :quantity => quantity | ||
76 | - } | ||
77 | - end | ||
78 | - end | ||
79 | render :text => { | 65 | render :text => { |
80 | :ok => true, | 66 | :ok => true, |
81 | :error => {:code => 0}, | 67 | :error => {:code => 0}, |
@@ -138,7 +124,7 @@ class ShoppingCartPluginController < PublicController | @@ -138,7 +124,7 @@ class ShoppingCartPluginController < PublicController | ||
138 | end | 124 | end |
139 | 125 | ||
140 | def visibility | 126 | def visibility |
141 | - render :text => self.cart.has_key?(:visibility) ? self.cart[:visibility].to_json : true.to_json | 127 | + render :text => visible?.to_json |
142 | end | 128 | end |
143 | 129 | ||
144 | def show | 130 | def show |
@@ -327,4 +313,31 @@ class ShoppingCartPluginController < PublicController | @@ -327,4 +313,31 @@ class ShoppingCartPluginController < PublicController | ||
327 | :_noosfero_plugin_shopping_cart | 313 | :_noosfero_plugin_shopping_cart |
328 | end | 314 | end |
329 | 315 | ||
316 | + def visible? | ||
317 | + !self.cart.has_key?(:visibility) || self.cart[:visibility] | ||
318 | + end | ||
319 | + | ||
320 | + def products | ||
321 | + self.cart[:items].collect do |id, quantity| | ||
322 | + product = Product.find_by_id(id) | ||
323 | + if product | ||
324 | + { :id => product.id, | ||
325 | + :name => product.name, | ||
326 | + :price => get_price(product, product.enterprise.environment), | ||
327 | + :description => product.description, | ||
328 | + :picture => product.default_image(:minor), | ||
329 | + :quantity => quantity | ||
330 | + } | ||
331 | + else | ||
332 | + { :id => id, | ||
333 | + :name => _('Undefined product'), | ||
334 | + :price => 0, | ||
335 | + :description => _('Wrong product id'), | ||
336 | + :picture => '', | ||
337 | + :quantity => quantity | ||
338 | + } | ||
339 | + end | ||
340 | + end | ||
341 | + end | ||
342 | + | ||
330 | end | 343 | end |
plugins/shopping_cart/public/cart.js
@@ -6,51 +6,36 @@ function Cart(config) { | @@ -6,51 +6,36 @@ function Cart(config) { | ||
6 | this.contentBox = $("#cart1 .cart-content"); | 6 | this.contentBox = $("#cart1 .cart-content"); |
7 | this.itemsBox = $("#cart1 .cart-items"); | 7 | this.itemsBox = $("#cart1 .cart-items"); |
8 | this.items = {}; | 8 | this.items = {}; |
9 | - this.empty = !config.hasProducts; | 9 | + this.empty = !config.has_products; |
10 | this.visible = false; | 10 | this.visible = false; |
11 | $(".cart-buy", this.cartElem).button({ icons: { primary: 'ui-icon-cart'} }); | 11 | $(".cart-buy", this.cartElem).button({ icons: { primary: 'ui-icon-cart'} }); |
12 | if (!this.empty) { | 12 | if (!this.empty) { |
13 | $(this.cartElem).show(); | 13 | $(this.cartElem).show(); |
14 | - me = this; | ||
15 | - $.ajax({ | ||
16 | - url: '/plugin/shopping_cart/visibility', | ||
17 | - dataType: 'json', | ||
18 | - success: function(data, status, ajax){ | ||
19 | - me.visible = /^true$/i.test(data); | ||
20 | - me.listProducts(); | ||
21 | - }, | ||
22 | - cache: false, | ||
23 | - error: function(ajax, status, errorThrown) { | ||
24 | - log.error('Visibility - HTTP '+status, errorThrown); | ||
25 | - } | ||
26 | - }); | ||
27 | - $(".cart-buy", this.cartElem).colorbox({ href: '/plugin/shopping_cart/buy' }); | 14 | + this.visible = config.visible; |
15 | + this.addToList(config.products, true) | ||
28 | } | 16 | } |
29 | } | 17 | } |
30 | 18 | ||
31 | (function($){ | 19 | (function($){ |
32 | 20 | ||
33 | - Cart.prototype.listProducts = function() { | 21 | + // Forbidding the user to request more the one action on the cart |
22 | + // simultaneously because the cart in the cookie doesn't supports it. | ||
23 | + Cart.prototype.ajax = function(config){ | ||
34 | var me = this; | 24 | var me = this; |
35 | - $.ajax({ | ||
36 | - url: '/plugin/shopping_cart/list', | ||
37 | - dataType: 'json', | ||
38 | - success: function(data, ststus, ajax){ | ||
39 | - if ( !data.ok ) log.error(data.error); | ||
40 | - else me.addToList(data, true); | ||
41 | - }, | ||
42 | - cache: false, | ||
43 | - error: function(ajax, status, errorThrown) { | ||
44 | - log.error('List cart items - HTTP '+status, errorThrown); | ||
45 | - } | ||
46 | - }); | 25 | + this.disabled = true; |
26 | + var completeCallback = config.complete; | ||
27 | + config.complete = function(){ | ||
28 | + me.disabled = false; | ||
29 | + if (completeCallback) completeCallback(); | ||
30 | + }; | ||
31 | + $.ajax(config); | ||
47 | } | 32 | } |
48 | 33 | ||
49 | - Cart.prototype.addToList = function(data, clear) { | 34 | + Cart.prototype.addToList = function(products, clear) { |
50 | if( clear ) this.itemsBox.empty(); | 35 | if( clear ) this.itemsBox.empty(); |
51 | var me = this; | 36 | var me = this; |
52 | - this.productsLength = data.products.length; | ||
53 | - for( var item,i=0; item=data.products[i]; i++ ) { | 37 | + this.productsLength = products.length; |
38 | + for( var item,i=0; item=products[i]; i++ ) { | ||
54 | this.items[item.id] = { price:item.price, quantity:item.quantity }; | 39 | this.items[item.id] = { price:item.price, quantity:item.quantity }; |
55 | this.updateTotal(); | 40 | this.updateTotal(); |
56 | var liId = "cart-item-"+item.id; | 41 | var liId = "cart-item-"+item.id; |
@@ -85,7 +70,7 @@ function Cart(config) { | @@ -85,7 +70,7 @@ function Cart(config) { | ||
85 | if (!clear && this.empty) $(this.cartElem).show(); | 70 | if (!clear && this.empty) $(this.cartElem).show(); |
86 | if((!clear && this.empty) || (this.visible && clear)) { | 71 | if((!clear && this.empty) || (this.visible && clear)) { |
87 | this.contentBox.hide(); | 72 | this.contentBox.hide(); |
88 | - this.show(); | 73 | + this.show(!clear); |
89 | } | 74 | } |
90 | this.empty = false; | 75 | this.empty = false; |
91 | } | 76 | } |
@@ -97,7 +82,7 @@ function Cart(config) { | @@ -97,7 +82,7 @@ function Cart(config) { | ||
97 | input.style.backgroundImage = "url(/images/loading-small.gif)"; | 82 | input.style.backgroundImage = "url(/images/loading-small.gif)"; |
98 | var me = this; | 83 | var me = this; |
99 | if( quantity == NaN ) return input.value = input.lastValue; | 84 | if( quantity == NaN ) return input.value = input.lastValue; |
100 | - $.ajax({ | 85 | + this.ajax({ |
101 | url: '/plugin/shopping_cart/update_quantity/'+ itemId +'?quantity='+ quantity, | 86 | url: '/plugin/shopping_cart/update_quantity/'+ itemId +'?quantity='+ quantity, |
102 | dataType: 'json', | 87 | dataType: 'json', |
103 | success: function(data, status, ajax){ | 88 | success: function(data, status, ajax){ |
@@ -142,24 +127,24 @@ function Cart(config) { | @@ -142,24 +127,24 @@ function Cart(config) { | ||
142 | steps = ['w', 'n', 'e', 's']; | 127 | steps = ['w', 'n', 'e', 's']; |
143 | if( !link.step || link.step==3 ) link.step = 0; | 128 | if( !link.step || link.step==3 ) link.step = 0; |
144 | link.step++; | 129 | link.step++; |
145 | - $(link).button({ icons: { primary: 'ui-icon-arrowrefresh-1-'+steps[link.step]}, disable: true }) | 130 | + $(link).button({ icons: { primary: 'ui-icon-arrowrefresh-1-'+steps[link.step]}}) |
146 | }, 100); | 131 | }, 100); |
147 | var stopBtLoading = function() { | 132 | var stopBtLoading = function() { |
148 | clearInterval(link.intervalId); | 133 | clearInterval(link.intervalId); |
149 | $(link).removeClass('loading'); | 134 | $(link).removeClass('loading'); |
150 | - $(link).button({ icons: { primary: 'ui-icon-cart'}, disable: false }); | 135 | + $(link).button({ icons: { primary: 'ui-icon-cart'}}); |
151 | }; | 136 | }; |
152 | this.instance.addItem(itemId, stopBtLoading); | 137 | this.instance.addItem(itemId, stopBtLoading); |
153 | } | 138 | } |
154 | 139 | ||
155 | Cart.prototype.addItem = function(itemId, callback) { | 140 | Cart.prototype.addItem = function(itemId, callback) { |
156 | var me = this; | 141 | var me = this; |
157 | - $.ajax({ | 142 | + this.ajax({ |
158 | url: '/plugin/shopping_cart/add/'+ itemId, | 143 | url: '/plugin/shopping_cart/add/'+ itemId, |
159 | dataType: 'json', | 144 | dataType: 'json', |
160 | success: function(data, status, ajax){ | 145 | success: function(data, status, ajax){ |
161 | if ( !data.ok ) log.error('Shopping cart data failure', data.error); | 146 | if ( !data.ok ) log.error('Shopping cart data failure', data.error); |
162 | - else me.addToList(data); | 147 | + else me.addToList(data.products); |
163 | }, | 148 | }, |
164 | cache: false, | 149 | cache: false, |
165 | error: function(ajax, status, errorThrown) { | 150 | error: function(ajax, status, errorThrown) { |
@@ -177,7 +162,7 @@ function Cart(config) { | @@ -177,7 +162,7 @@ function Cart(config) { | ||
177 | Cart.prototype.removeItem = function(itemId) { | 162 | Cart.prototype.removeItem = function(itemId) { |
178 | if ($("li", this.itemsBox).size() < 2) return this.clean(); | 163 | if ($("li", this.itemsBox).size() < 2) return this.clean(); |
179 | var me = this; | 164 | var me = this; |
180 | - $.ajax({ | 165 | + this.ajax({ |
181 | url: '/plugin/shopping_cart/remove/'+ itemId, | 166 | url: '/plugin/shopping_cart/remove/'+ itemId, |
182 | dataType: 'json', | 167 | dataType: 'json', |
183 | success: function(data, status, ajax){ | 168 | success: function(data, status, ajax){ |
@@ -192,36 +177,41 @@ function Cart(config) { | @@ -192,36 +177,41 @@ function Cart(config) { | ||
192 | } | 177 | } |
193 | 178 | ||
194 | Cart.toggle = function(link) { | 179 | Cart.toggle = function(link) { |
180 | + if(this.instance.disabled) return alert(shoppingCartPluginL10n.waitLastRequest); | ||
195 | link.parentNode.parentNode.cartObj.toggle(); | 181 | link.parentNode.parentNode.cartObj.toggle(); |
196 | } | 182 | } |
197 | Cart.prototype.toggle = function() { | 183 | Cart.prototype.toggle = function() { |
198 | - this.visible ? this.hide() : this.show(); | 184 | + this.visible ? this.hide(true) : this.show(true); |
199 | } | 185 | } |
200 | 186 | ||
201 | - Cart.prototype.show = function() { | ||
202 | - $.ajax({ | ||
203 | - url: '/plugin/shopping_cart/show', | ||
204 | - dataType: 'json', | ||
205 | - cache: false, | ||
206 | - error: function(ajax, status, errorThrown) { | ||
207 | - log.error('Show - HTTP '+status, errorThrown); | ||
208 | - } | ||
209 | - }); | 187 | + Cart.prototype.show = function(register) { |
188 | + if(register) { | ||
189 | + this.ajax({ | ||
190 | + url: '/plugin/shopping_cart/show', | ||
191 | + dataType: 'json', | ||
192 | + cache: false, | ||
193 | + error: function(ajax, status, errorThrown) { | ||
194 | + log.error('Show - HTTP '+status, errorThrown); | ||
195 | + } | ||
196 | + }); | ||
197 | + } | ||
210 | this.visible = true; | 198 | this.visible = true; |
211 | this.contentBox.slideDown(500); | 199 | this.contentBox.slideDown(500); |
212 | $(".cart-toggle .str-show", this.cartElem).hide(); | 200 | $(".cart-toggle .str-show", this.cartElem).hide(); |
213 | $(".cart-toggle .str-hide", this.cartElem).show(); | 201 | $(".cart-toggle .str-hide", this.cartElem).show(); |
214 | 202 | ||
215 | } | 203 | } |
216 | - Cart.prototype.hide = function() { | ||
217 | - $.ajax({ | ||
218 | - url: '/plugin/shopping_cart/hide', | ||
219 | - dataType: 'json', | ||
220 | - cache: false, | ||
221 | - error: function(ajax, status, errorThrown) { | ||
222 | - log.error('Hide - HTTP '+status, errorThrown); | ||
223 | - } | ||
224 | - }); | 204 | + Cart.prototype.hide = function(register) { |
205 | + if(register) { | ||
206 | + this.ajax({ | ||
207 | + url: '/plugin/shopping_cart/hide', | ||
208 | + dataType: 'json', | ||
209 | + cache: false, | ||
210 | + error: function(ajax, status, errorThrown) { | ||
211 | + log.error('Hide - HTTP '+status, errorThrown); | ||
212 | + } | ||
213 | + }); | ||
214 | + } | ||
225 | this.visible = false; | 215 | this.visible = false; |
226 | this.contentBox.slideUp(500); | 216 | this.contentBox.slideUp(500); |
227 | $(".cart-toggle .str-show", this.cartElem).show(); | 217 | $(".cart-toggle .str-show", this.cartElem).show(); |
@@ -251,7 +241,7 @@ function Cart(config) { | @@ -251,7 +241,7 @@ function Cart(config) { | ||
251 | 241 | ||
252 | Cart.prototype.clean = function() { | 242 | Cart.prototype.clean = function() { |
253 | var me = this; | 243 | var me = this; |
254 | - $.ajax({ | 244 | + this.ajax({ |
255 | url: '/plugin/shopping_cart/clean', | 245 | url: '/plugin/shopping_cart/clean', |
256 | dataType: 'json', | 246 | dataType: 'json', |
257 | success: function(data, status, ajax){ | 247 | success: function(data, status, ajax){ |
@@ -281,7 +271,7 @@ function Cart(config) { | @@ -281,7 +271,7 @@ function Cart(config) { | ||
281 | 271 | ||
282 | Cart.prototype.send_request = function(params) { | 272 | Cart.prototype.send_request = function(params) { |
283 | var me = this; | 273 | var me = this; |
284 | - $.ajax({ | 274 | + this.ajax({ |
285 | type: 'POST', | 275 | type: 'POST', |
286 | url: '/plugin/shopping_cart/send_request', | 276 | url: '/plugin/shopping_cart/send_request', |
287 | data: params, | 277 | data: params, |