rightnow_oms 0.1.4 → 0.1.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/CHANGELOG +12 -0
- data/README.md +145 -66
- data/app/assets/javascripts/rightnow_oms/app/app.js.coffee +12 -4
- data/app/assets/javascripts/rightnow_oms/app/controllers/cart.js.coffee +17 -32
- data/app/assets/javascripts/rightnow_oms/app/models/cart.js.coffee +50 -28
- data/app/assets/javascripts/rightnow_oms/app/models/cart_item.js.coffee +28 -49
- data/app/assets/javascripts/rightnow_oms/app/templates/cart_items/show.handlebars +30 -0
- data/app/assets/javascripts/rightnow_oms/app/templates/cart_items/{show_in_detail.hjs → show_in_detail.handlebars} +3 -3
- data/app/assets/javascripts/rightnow_oms/app/templates/carts/{show.hjs → show.handlebars} +4 -3
- data/app/assets/javascripts/rightnow_oms/app/templates/carts/show_cartable_count.handlebars +2 -0
- data/app/assets/javascripts/rightnow_oms/app/templates/carts/show_in_detail.handlebars +30 -0
- data/app/assets/javascripts/rightnow_oms/app/views/cart_items/show_in_detail.js.coffee +4 -1
- data/app/assets/javascripts/rightnow_oms/application.js.coffee +10 -0
- data/app/assets/javascripts/rightnow_oms/cart_items.js +10 -0
- data/app/assets/javascripts/rightnow_oms/config/app.js.coffee +5 -0
- data/app/assets/javascripts/rightnow_oms/config/locales/en.js.coffee +24 -0
- data/app/assets/javascripts/rightnow_oms/config/locales/zh_CN.js.coffee +24 -0
- data/app/assets/javascripts/rightnow_oms/lib/ember/data/my_rest_adapter.js.coffee +2 -167
- data/app/assets/javascripts/rightnow_oms/vendor/cldr.js +240 -0
- data/app/assets/javascripts/rightnow_oms/vendor/ember-data.js +1530 -587
- data/app/assets/javascripts/rightnow_oms/vendor/ember-data.min.js +1 -1
- data/app/assets/javascripts/rightnow_oms/vendor/ember-i18n.js +123 -0
- data/app/assets/javascripts/rightnow_oms/vendor/{ember-0.9.5.js → ember.js} +1584 -928
- data/app/assets/javascripts/rightnow_oms/vendor/ember.min.js +5 -5
- data/app/assets/stylesheets/rightnow_oms/carts.css.scss +93 -85
- data/app/controllers/rightnow_oms/cart_items_controller.rb +2 -2
- data/app/controllers/rightnow_oms/orders_controller.rb +27 -5
- data/app/models/rightnow_oms/cart.rb +1 -0
- data/app/models/rightnow_oms/cart_item.rb +1 -0
- data/app/models/rightnow_oms/order.rb +26 -2
- data/app/views/rightnow_oms/cart_items/_list.html.haml +24 -0
- data/app/views/rightnow_oms/orders/show.html.haml +2 -0
- data/config/initializers/rightnow_oms.rb +4 -0
- data/config/initializers/validates_timeliness.rb +40 -0
- data/config/locales/validates_timeliness.en.yml +16 -0
- data/config/locales/validates_timeliness.zh-CN.yml +16 -0
- data/db/migrate/20120224051751_add_required_arrival_time_to_rightnow_oms_orders.rb +6 -0
- data/db/migrate/20120302085200_add_tastes_to_rightnow_oms_order_items.rb +6 -0
- data/lib/rightnow_oms.rb +5 -1
- data/lib/rightnow_oms/controller_extension.rb +33 -0
- data/lib/rightnow_oms/controller_helpers.rb +4 -21
- data/lib/rightnow_oms/version.rb +1 -1
- metadata +71 -35
- data/app/assets/javascripts/rightnow_oms/app/templates/cart_items/show.hjs +0 -23
- data/app/assets/javascripts/rightnow_oms/app/templates/carts/show_cartable_count.hjs +0 -1
- data/app/assets/javascripts/rightnow_oms/app/templates/carts/show_in_detail.hjs +0 -27
- data/app/assets/javascripts/rightnow_oms/application.js +0 -8
data/CHANGELOG
CHANGED
@@ -1,3 +1,15 @@
|
|
1
|
+
*Rightnow OMS 0.1.6 (Mon 01:43, Mar 05, 2012)*
|
2
|
+
|
3
|
+
* Fixed 0.1.5 release error
|
4
|
+
|
5
|
+
*Rightnow OMS 0.1.5 (Mon 01:43, Mar 05, 2012)*
|
6
|
+
|
7
|
+
* Upgraded ember and ember-data
|
8
|
+
* Fixed lots of bugs
|
9
|
+
* Support I18n
|
10
|
+
* Created associations between models
|
11
|
+
* Added a few unit tests for javascript
|
12
|
+
|
1
13
|
*Rightnow OMS 0.1.4 (Wed 11:57, Feb 22, 2012)*
|
2
14
|
|
3
15
|
* Upgraded Ember.JS to 0.9.5
|
data/README.md
CHANGED
@@ -14,6 +14,7 @@ Add the following gems to your Gemfile:
|
|
14
14
|
gem 'acts_as_api'
|
15
15
|
gem 'haml-rails'
|
16
16
|
gem 'confstruct'
|
17
|
+
gem 'ransack'
|
17
18
|
|
18
19
|
group :assets do
|
19
20
|
gem 'uglifier'
|
@@ -32,89 +33,73 @@ Make sure that all requirements are met and add RightnowOms to your Gemfile.
|
|
32
33
|
|
33
34
|
and run `bundle install`
|
34
35
|
|
35
|
-
##
|
36
|
+
## Setup
|
36
37
|
|
37
|
-
Mount
|
38
|
+
Mount `rightnow_oms` to your application.
|
38
39
|
|
39
40
|
```ruby
|
40
41
|
# config/routes.rb
|
41
|
-
mount RightnowOms::Engine => "rightnow_oms"
|
42
|
+
mount RightnowOms::Engine => "rightnow_oms", as: :rightnow_oms
|
42
43
|
```
|
43
44
|
|
44
|
-
|
45
|
+
Install the migrations of `rightnow_oms`:
|
45
46
|
|
46
47
|
```bash
|
47
48
|
rake rightnow_oms:install:migrations
|
48
49
|
rake db:migrate
|
49
50
|
```
|
50
51
|
|
51
|
-
|
52
|
+
`rightnow_oms` is built based on ember, ember-data and ember-i18n, so you need to
|
53
|
+
install these libs first. Or you can use the files in
|
54
|
+
`rightnow_oms`. So you need to add the following lines to your `app/assets/javascripts/application.js`:
|
52
55
|
|
53
56
|
```
|
54
|
-
= require rightnow_oms/vendor/ember
|
57
|
+
= require rightnow_oms/vendor/ember
|
55
58
|
= require rightnow_oms/vendor/ember-data
|
59
|
+
= require rightnow_oms/vendor/ember-i18n
|
56
60
|
```
|
57
61
|
|
58
|
-
|
62
|
+
After ember libs installed, you need to add `rightnow_oms/application`
|
63
|
+
to your `app/assets/javascripts/application.js`:
|
59
64
|
|
60
65
|
```
|
61
66
|
= require rightnow_oms/application
|
62
67
|
```
|
63
68
|
|
64
|
-
|
69
|
+
To enable the default theme of `rightnow_oms`, you need to link the
|
70
|
+
default stylesheet into your `app/assets/stylesheets/application.css`:
|
65
71
|
|
66
72
|
```
|
67
73
|
= require rightnow_oms/application
|
68
74
|
```
|
69
75
|
|
70
|
-
|
76
|
+
The configurations of `rightnow_oms` ember application are saved in key-value
|
77
|
+
pairs. To override the default configurations, you only need to call
|
78
|
+
`RightnowOms.configure` and reset the values of the configurations.
|
71
79
|
|
72
|
-
```
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
%head
|
77
|
-
%title RightnowOms
|
78
|
-
= stylesheet_link_tag "application"
|
79
|
-
= javascript_include_tag "application"
|
80
|
-
= csrf_meta_tags
|
80
|
+
```javascript
|
81
|
+
RightnowOms.configure(function(config) {
|
82
|
+
// Disable autoCommit
|
83
|
+
config.set('autoCommit', false);
|
81
84
|
|
82
|
-
|
83
|
-
|
85
|
+
// Set the default locale to zh_CN
|
86
|
+
config.set('defaultLocale', 'zh_CN');
|
87
|
+
});
|
84
88
|
```
|
85
89
|
|
86
|
-
|
90
|
+
## Usage
|
87
91
|
|
88
|
-
|
89
|
-
# config/initializers/rightnow_oms.rb
|
90
|
-
RightnowOms.configure do
|
91
|
-
new_order_url '/orders/new'
|
92
|
-
end
|
93
|
-
```
|
92
|
+
### Add a Float Cart to Your Pages
|
94
93
|
|
95
|
-
|
94
|
+
First, you need to load/create a cart for your pages. By adding a before
|
95
|
+
filter `load_or_create_cart` to your controllers, you can get the cart.
|
96
96
|
|
97
97
|
```ruby
|
98
98
|
# This before filter will create an instance variable @cart
|
99
99
|
before_filter :load_or_create_cart
|
100
100
|
```
|
101
101
|
|
102
|
-
|
103
|
-
|
104
|
-
```ruby
|
105
|
-
class Product < ActiveRecord::Base
|
106
|
-
acts_as_cartable
|
107
|
-
end
|
108
|
-
```
|
109
|
-
|
110
|
-
By default, Cart loads the name and price of cartable models by
|
111
|
-
attributes named name and price. You can customize these attributes:
|
112
|
-
|
113
|
-
```ruby
|
114
|
-
acts_as_cartable { name: :your_name_attr, price: :your_price_attr }
|
115
|
-
```
|
116
|
-
|
117
|
-
Add a place holder for your cart in your views:
|
102
|
+
Secondly, you need to add a place holder for your cart in your views:
|
118
103
|
|
119
104
|
```html
|
120
105
|
<div id="rightnow-oms">
|
@@ -124,7 +109,7 @@ Add a place holder for your cart in your views:
|
|
124
109
|
</div>
|
125
110
|
```
|
126
111
|
|
127
|
-
|
112
|
+
And then you can load the cart:
|
128
113
|
|
129
114
|
```javascript
|
130
115
|
$(function() {
|
@@ -132,43 +117,133 @@ and load your cart in the view:
|
|
132
117
|
});
|
133
118
|
```
|
134
119
|
|
135
|
-
|
120
|
+
### Add Cartable Things to Your Cart
|
121
|
+
|
122
|
+
`rightnow_oms` can only accept cartable model, so the things you added
|
123
|
+
to the cart must be a cartable model. To define a cartable model, you
|
124
|
+
just need to call the extended method `acts_as_cartable` in the model
|
125
|
+
class.
|
126
|
+
|
127
|
+
``` ruby
|
128
|
+
class Product < ActiveRecord::Base
|
129
|
+
acts_as_cartable
|
130
|
+
end
|
131
|
+
```
|
132
|
+
|
133
|
+
By default, Cart loads the name and price of cartable models by
|
134
|
+
attributes named name and price. But you can define your own name and
|
135
|
+
price attributes as follows:
|
136
|
+
|
137
|
+
```ruby
|
138
|
+
class Product < ActiveRecord::Base
|
139
|
+
acts_as_cartable name: :your_name_attr, price: :your_price_attr
|
140
|
+
end
|
141
|
+
```
|
142
|
+
|
143
|
+
Now you can add cartables to the cart.
|
136
144
|
|
137
145
|
```javascript
|
138
146
|
RightnowOms.cartController.addCartItem({
|
139
147
|
cartable_id: 1, // required
|
140
148
|
cartable_type: 'Product', // required
|
141
149
|
price: '10.00', // required
|
142
|
-
|
143
|
-
// optional
|
144
|
-
parent_id: 2,
|
145
|
-
|
150
|
+
name: 'Parent Product', // optional
|
151
|
+
quantity: 1, // optional
|
146
152
|
// optional, grouping cart items
|
147
|
-
group: 'booking'
|
148
|
-
|
149
|
-
|
153
|
+
group: 'booking',
|
154
|
+
// optional
|
155
|
+
children: [{
|
156
|
+
cartable_id: 2, // required
|
157
|
+
cartable_type: 'Product', // required
|
158
|
+
price: '5.00', // required
|
159
|
+
name: 'Child Product', // optional
|
160
|
+
quantity: 1, // optional
|
161
|
+
// optional, grouping cart items
|
162
|
+
group: 'booking',
|
163
|
+
})
|
150
164
|
})
|
151
165
|
```
|
152
166
|
|
153
|
-
###
|
167
|
+
### Manage Your Cart
|
154
168
|
|
155
|
-
|
156
|
-
|
157
|
-
|
169
|
+
Create a layout for your detailed cart view like:
|
170
|
+
|
171
|
+
```haml
|
172
|
+
# app/views/layouts/rightnow_oms/cart.html.haml
|
173
|
+
!!!
|
174
|
+
%html
|
175
|
+
%head
|
176
|
+
%title RightnowOms
|
177
|
+
= stylesheet_link_tag "application"
|
178
|
+
= javascript_include_tag "application"
|
179
|
+
= csrf_meta_tags
|
180
|
+
|
181
|
+
%body
|
182
|
+
= yield
|
183
|
+
```
|
184
|
+
|
185
|
+
### Create an Order with the Cart
|
186
|
+
|
187
|
+
To create an order, you need to specify the url of the page which the
|
188
|
+
customer will add more detailed information on it. After you click the
|
189
|
+
submit button on the detailed cart page, you will be redirected to the
|
190
|
+
url which you have set.
|
191
|
+
|
192
|
+
```ruby
|
193
|
+
# config/initializers/rightnow_oms.rb
|
194
|
+
RightnowOms.configure do
|
195
|
+
new_order_url '/orders/new'
|
196
|
+
end
|
197
|
+
```
|
198
|
+
|
199
|
+
### Checkout
|
200
|
+
|
201
|
+
WIP
|
202
|
+
|
203
|
+
## I18n
|
204
|
+
|
205
|
+
`rightnow_oms` supports I18n now. By default it only includes two
|
206
|
+
locales: en and zh_CN, but you can create your own locales easily.
|
207
|
+
First, you need to define your translations, for example:
|
158
208
|
|
159
209
|
```javascript
|
160
|
-
|
210
|
+
var zh_CN = {
|
211
|
+
'cart.cartable.counter': '购物车'
|
212
|
+
'cart.total': '总计'
|
213
|
+
|
214
|
+
'cart_item.name': '名称'
|
215
|
+
'cart_item.price': '价格'
|
216
|
+
'cart_item.quantity': '数量'
|
217
|
+
'cart_item.total': '小计'
|
218
|
+
|
219
|
+
'currency.unit': '¥'
|
220
|
+
|
221
|
+
'buttons.check_cart': '查看我的购物车'
|
222
|
+
'buttons.delete': '删除'
|
223
|
+
'buttons.clean_cart': '清空购物车'
|
224
|
+
'buttons.continue_to_shop': '继续购物'
|
225
|
+
'buttons.new_order': '提交订单'
|
226
|
+
|
227
|
+
'titles.cart': '我的购物车'
|
228
|
+
|
229
|
+
'alerts.saving_cart': '正在保存购物车,请稍后。。。'
|
230
|
+
|
231
|
+
'confirmations.delete_cart_item': '您确定要删除该商品吗?'
|
232
|
+
'confirmations.clean_up_cart': '您确定要清空您的购物车吗?'
|
233
|
+
};
|
161
234
|
```
|
162
235
|
|
163
|
-
|
164
|
-
|
165
|
-
side, you ought to commit these changes by yourself.
|
236
|
+
And then add your translations to `rightnow_oms` and set it as the
|
237
|
+
default locale:
|
166
238
|
|
167
239
|
```javascript
|
168
|
-
RightnowOms.
|
240
|
+
RightnowOms.configure(function(config) {
|
241
|
+
config.set('locales.zh_CN', zh_CN);
|
242
|
+
config.set('defaultLocale', 'zh_CN');
|
243
|
+
});
|
169
244
|
```
|
170
245
|
|
171
|
-
|
246
|
+
It's welcome to create a pull request for your locale.
|
172
247
|
|
173
248
|
## Development
|
174
249
|
|
@@ -176,9 +251,9 @@ RightnowOms is developed with Ruby 1.9.3-p0 and Rails 3.1.3
|
|
176
251
|
|
177
252
|
First of all, you need to create a database config for RightnowOms.
|
178
253
|
There are already some useful templates for you under
|
179
|
-
`spec/dummy/config/`. RightnowOms use
|
180
|
-
to setup other databases, for example
|
181
|
-
Gemfile by yourself.
|
254
|
+
`spec/dummy/config/`. RightnowOms use MySQL by default. If you want
|
255
|
+
to setup to use other databases, for example PostgreSQL, you need to modify the
|
256
|
+
Gemfile and add the adapters by yourself.
|
182
257
|
|
183
258
|
```bash
|
184
259
|
bundle install
|
@@ -193,5 +268,9 @@ Gemfile by yourself.
|
|
193
268
|
rails s
|
194
269
|
```
|
195
270
|
|
271
|
+
For the javascript unit tests, you need to start the dummy application
|
272
|
+
first, and then open your browser and visit
|
273
|
+
[http://localhost:3000/test/qunit](http://localhost:3000/test/qunit)
|
274
|
+
|
196
275
|
## Copyright
|
197
276
|
Copyright 2011-2012 Beijing Menglifang Network Technology and Science Co.,Ltd. All rights reserved.
|
@@ -9,11 +9,19 @@ window.RightnowOms = Ember.Application.create
|
|
9
9
|
|
10
10
|
_commitTimer: null
|
11
11
|
|
12
|
-
|
12
|
+
config: Em.Object.create()
|
13
|
+
|
14
|
+
configure: (reconfigure) ->
|
15
|
+
reconfigure(RightnowOms.config) if reconfigure
|
16
|
+
|
17
|
+
defaultLocale = RightnowOms.config.get('defaultLocale') || 'en'
|
18
|
+
locale = 'locales.' + defaultLocale
|
19
|
+
Em.I18n.translations = RightnowOms.config.get(locale)
|
20
|
+
|
21
|
+
|
22
|
+
RightnowOms.store = DS.Store.create
|
23
|
+
revision: 2
|
13
24
|
adapter:
|
14
25
|
DS.MyRESTAdapter.create
|
15
26
|
bulkCommit: false
|
16
27
|
namespace: 'rightnow_oms'
|
17
|
-
|
18
|
-
window.RightnowOms.config = Em.Object.create()
|
19
|
-
window.RightnowOms.config.set('autoCommit', true)
|
@@ -1,6 +1,10 @@
|
|
1
1
|
RightnowOms.cartController = Ember.Object.create
|
2
2
|
store: RightnowOms.store
|
3
3
|
|
4
|
+
#find: (id) ->
|
5
|
+
#cart = @store.find(RightnowOms.Cart, id)
|
6
|
+
#@set('content', cart)
|
7
|
+
|
4
8
|
load: (cart) ->
|
5
9
|
RightnowOms.store.load(RightnowOms.Cart, cart.id, cart)
|
6
10
|
@set('content', RightnowOms.store.find(RightnowOms.Cart, cart.id))
|
@@ -10,29 +14,13 @@ RightnowOms.cartController = Ember.Object.create
|
|
10
14
|
|
11
15
|
# item: a hash
|
12
16
|
addCartItem: (item) ->
|
17
|
+
cartItem = @get('content').findCartItemByCartable(item.cartable_id, item.cartable_type)
|
18
|
+
if cartItem && cartItem.isProcessing()
|
19
|
+
return alert(Em.I18n.t('alerts.saving_cart'))
|
20
|
+
|
13
21
|
cartItem = @get('content').addCartItem(item)
|
14
22
|
RightnowOms.commit()
|
15
|
-
|
16
|
-
return if !(item.children && item.children.length > 0)
|
17
|
-
|
18
|
-
self = @
|
19
|
-
|
20
|
-
addChildren = (parent, children) ->
|
21
|
-
children.forEach((c) ->
|
22
|
-
c.parent_id = parent.get('id')
|
23
|
-
self.addCartItem(c)
|
24
|
-
)
|
25
|
-
|
26
|
-
return addChildren(cartItem, item.children) if cartItem.get('id')?
|
27
|
-
|
28
|
-
afterCartItemCreated = ->
|
29
|
-
if (!cartItem.get('isDirty')) && (!cartItem.get('isDeleted'))
|
30
|
-
addChildren(cartItem, item.children)
|
31
|
-
cartItem.removeObserver('isDirty', afterCartItemCreated)
|
32
|
-
RightnowOms.commit(true) unless RightnowOms.config.get('autoCommit')
|
33
|
-
|
34
|
-
cartItem.addObserver('isDirty', afterCartItemCreated)
|
35
|
-
|
23
|
+
|
36
24
|
# @id: id of the cart item to be updated
|
37
25
|
# @properties: a hash which is the new properties of the cart item.
|
38
26
|
#
|
@@ -43,27 +31,24 @@ RightnowOms.cartController = Ember.Object.create
|
|
43
31
|
# 'quantity': 2
|
44
32
|
# })
|
45
33
|
updateCartItem: (id, properties) ->
|
46
|
-
if
|
47
|
-
alert('
|
48
|
-
return
|
34
|
+
if @get('content').findCartItemById(id).isProcessing()
|
35
|
+
return alert(Em.I18n.t('alerts.saving_cart'))
|
49
36
|
|
50
37
|
@get('content').updateCartItem(id, properties)
|
51
38
|
RightnowOms.commit()
|
52
39
|
|
53
40
|
increaseCartItem: (id) ->
|
54
|
-
if
|
55
|
-
alert('
|
56
|
-
return
|
41
|
+
if @get('content').findCartItemById(id).isProcessing()
|
42
|
+
return alert(Em.I18n.t('alerts.saving_cart'))
|
57
43
|
|
58
44
|
cartItem = @get('content').increaseCartItem(id)
|
59
45
|
RightnowOms.commit(true)
|
60
46
|
|
61
47
|
decreaseCartItem: (id) ->
|
62
|
-
cartItem =
|
48
|
+
cartItem = @get('content').findCartItemById(id)
|
63
49
|
|
64
50
|
if cartItem.isProcessing()
|
65
|
-
alert('
|
66
|
-
return
|
51
|
+
return alert(Em.I18n.t('alerts.saving_cart'))
|
67
52
|
|
68
53
|
if cartItem.get('isDecreasable')
|
69
54
|
@get('content').decreaseCartItem(id)
|
@@ -73,14 +58,14 @@ RightnowOms.cartController = Ember.Object.create
|
|
73
58
|
|
74
59
|
removeCartItem: (id, silent) ->
|
75
60
|
remove = true
|
76
|
-
remove = confirm('
|
61
|
+
remove = confirm(Em.I18n.t('confirmations.delete_cart_item')) unless silent
|
77
62
|
|
78
63
|
if remove
|
79
64
|
@get('content').removeCartItem(id)
|
80
65
|
RightnowOms.commit(true)
|
81
66
|
|
82
67
|
cleanUp: ->
|
83
|
-
if confirm('
|
68
|
+
if confirm(Em.I18n.t('confirmations.clean_up_cart'))
|
84
69
|
@get('content').cleanUp()
|
85
70
|
RightnowOms.commit(true)
|
86
71
|
|
@@ -1,80 +1,102 @@
|
|
1
1
|
RightnowOms.Cart = DS.Model.extend
|
2
|
-
|
3
|
-
RightnowOms.CartItem.all()
|
4
|
-
).property()
|
2
|
+
cart_items: DS.hasMany('RightnowOms.CartItem', { embedded: true })
|
5
3
|
|
6
|
-
|
4
|
+
# TODO Use cart_items instead
|
5
|
+
cartItems: Ember.computed(->
|
6
|
+
@get('cart_items')
|
7
|
+
).property("cart_items")
|
8
|
+
|
9
|
+
cartableCount: Ember.computed(->
|
7
10
|
count = 0
|
8
|
-
@get('
|
11
|
+
@get('cart_items').forEach (item) ->
|
9
12
|
count += item.get('quantity') unless item.get('hasParent')
|
10
13
|
|
11
14
|
count
|
12
|
-
).property("
|
15
|
+
).property("cart_items.@each.quantity")
|
13
16
|
|
14
|
-
total: (->
|
17
|
+
total: Ember.computed(->
|
15
18
|
total = 0
|
16
|
-
@get('
|
19
|
+
@get('cart_items').forEach (item) ->
|
17
20
|
total += item.get('price') * item.get('quantity') unless item.get('hasParent')
|
18
21
|
|
19
22
|
round(total, 2)
|
20
|
-
).property("
|
23
|
+
).property("cart_items.@each.quantity", "cart_items.@each.price")
|
21
24
|
|
22
25
|
addCartItem: (item) ->
|
23
26
|
return @createCartItem(item) if item.mergable == false
|
24
27
|
|
25
|
-
cartItem =
|
28
|
+
cartItem = @findCartItemByCartable(item.cartable_id, item.cartable_type)
|
26
29
|
|
27
|
-
if cartItem?
|
28
|
-
cartItem.increase()
|
30
|
+
if cartItem? && !cartItem.get('hasParent')
|
31
|
+
cartItem.increase()
|
29
32
|
else
|
30
33
|
cartItem = @createCartItem(item)
|
31
34
|
|
32
35
|
cartItem
|
33
36
|
|
34
37
|
createCartItem: (item)->
|
35
|
-
cartItem = RightnowOms.
|
38
|
+
cartItem = RightnowOms.CartItem.createRecord(item)
|
39
|
+
@get('cart_items').pushObject(cartItem)
|
40
|
+
|
41
|
+
return cartItem if !(item.children && item.children.length > 0)
|
42
|
+
|
43
|
+
return cartItem.addChild(c) for c in item.children if cartItem.get('id')?
|
36
44
|
|
37
|
-
|
38
|
-
cartItem.get('
|
45
|
+
afterCartItemCreated = ->
|
46
|
+
if (!cartItem.get('isDirty')) && (!cartItem.get('isDeleted'))
|
47
|
+
cartItem.addChild(c) for c in item.children
|
48
|
+
cartItem.removeObserver('isDirty', afterCartItemCreated)
|
49
|
+
RightnowOms.commit(true) if RightnowOms.config.get('autoCommit')
|
50
|
+
|
51
|
+
cartItem.addObserver('isDirty', afterCartItemCreated)
|
39
52
|
|
40
53
|
cartItem
|
41
54
|
|
42
55
|
updateCartItem: (id, properties) ->
|
43
|
-
cartItem =
|
56
|
+
cartItem = @findCartItemById(id)
|
44
57
|
cartItem.setProperties(properties) if cartItem?
|
45
58
|
|
46
59
|
cleanUp: ->
|
47
|
-
cartItemIds = @get('
|
60
|
+
cartItemIds = @get('cart_items').map (item) ->
|
48
61
|
return item.get('id')
|
49
62
|
|
63
|
+
self = @
|
50
64
|
cartItemIds.forEach (id) ->
|
51
|
-
|
52
|
-
|
53
|
-
# INFO Children will be deleted when the parent is deleted
|
54
|
-
item.deleteRecord() if item && !item.get('hasParent')
|
65
|
+
self.removeCartItem(id)
|
55
66
|
|
56
67
|
removeCartItem: (id) ->
|
57
|
-
cartItem =
|
58
|
-
|
68
|
+
cartItem = @findCartItemById(id)
|
69
|
+
@get('cart_items').removeObject(cartItem)
|
59
70
|
cartItem.deleteRecord() if cartItem?
|
60
71
|
|
61
72
|
cartItem
|
62
73
|
|
63
74
|
increaseCartItem: (id) ->
|
64
|
-
cartItem =
|
65
|
-
|
75
|
+
cartItem = @findCartItemById(id)
|
66
76
|
cartItem.increase()
|
77
|
+
|
67
78
|
cartItem
|
68
79
|
|
69
80
|
decreaseCartItem: (id) ->
|
70
|
-
cartItem =
|
71
|
-
|
81
|
+
cartItem = @findCartItemById(id)
|
72
82
|
cartItem.decrease()
|
83
|
+
|
73
84
|
cartItem
|
74
85
|
|
86
|
+
# TODO Rename to findAllCartItemsInGroup()
|
75
87
|
findCartItemsByGroup: (group) ->
|
76
|
-
@get('
|
88
|
+
@get('cart_items').filter (item) ->
|
77
89
|
return true if item.get('group') == group
|
78
90
|
|
91
|
+
# @private
|
92
|
+
findCartItemById: (id) ->
|
93
|
+
@get('cart_items').filterProperty('id', id)[0]
|
94
|
+
|
95
|
+
# @private
|
96
|
+
findCartItemByCartable: (cartableId, cartableType) ->
|
97
|
+
@get('cart_items').filter((item) ->
|
98
|
+
return true if item.get('cartable_id') == cartableId && item.get('cartable_type') == cartableType
|
99
|
+
).get('firstObject')
|
100
|
+
|
79
101
|
RightnowOms.Cart.reopenClass
|
80
102
|
isSingleton: true
|