rightnow_oms 0.1.1 → 0.1.2

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 CHANGED
@@ -1,3 +1,11 @@
1
+ *Rightnow OMS 0.1.2 (wip)*
2
+
3
+ * Clean up the cart
4
+ * Load the cart items in cart by group
5
+ * Update cart items
6
+ * Define a float type for Ember.JS
7
+ * Call a callback when a cart item is added successfully
8
+
1
9
  *Rightnow OMS 0.1.1 (Mon 18:35, Feb 13, 2012)*
2
10
 
3
11
  * Validate that cart items are cartable
data/README.md CHANGED
@@ -126,11 +126,17 @@ You can add cartables to the cart by:
126
126
 
127
127
  ```javascript
128
128
  RightnowOms.cartController.addCartItem({
129
- cartable_id: 1,
130
- cartable_type: 'Product'
129
+ cartable_id: 1, // required
130
+ cartable_type: 'Product', // required
131
+ price: '10.00', // required
131
132
 
132
- // if the item is a child, you need to set the parent id.
133
- // parent_id: 2
133
+ // optional, indicating this is a child node of another one
134
+ parent_id: 2,
135
+
136
+ // optional, grouping cart items
137
+ group: 'booking'
138
+ }, function(cartItem) {
139
+ // Do something after the cart item is created
134
140
  })
135
141
  ```
136
142
 
@@ -9,11 +9,32 @@ RightnowOms.cartController = Ember.Object.create
9
9
  @set('content', RightnowOms.store.find(RightnowOms.Cart, @get('content').get('id')))
10
10
 
11
11
  # item: a hash
12
- addCartItem: (item) ->
12
+ addCartItem: (item, callback) ->
13
13
  cartItem = @get('content').addCartItem(item)
14
14
  @store.commit()
15
15
 
16
- cartItem
16
+ return unless callback
17
+
18
+ return callback.call(@, cartItem) if cartItem.get('id')
19
+
20
+ self = @
21
+ cartItem.addObserver('isDirty', ->
22
+ if (!cartItem.get('isDirty')) && (!cartItem.get('isDeleted'))
23
+ callback.call(self, cartItem)
24
+ )
25
+
26
+ # @id: id of the cart item to be updated
27
+ # @properties: a hash which is the new properties of the cart item.
28
+ #
29
+ # For example:
30
+ #
31
+ # RightnowOms.cartController.updateCartItem(1, {
32
+ # 'price': 10.00,
33
+ # 'quantity': 2
34
+ # })
35
+ updateCartItem: (id, properties) ->
36
+ @get('content').updateCartItem(id, properties)
37
+ @store.commit()
17
38
 
18
39
  increaseCartItem: (id) ->
19
40
  @get('content').increaseCartItem(id)
@@ -35,3 +56,29 @@ RightnowOms.cartController = Ember.Object.create
35
56
  if remove
36
57
  @get('content').removeCartItem(id)
37
58
  @store.commit()
59
+
60
+ cleanUp: ->
61
+ if confirm('您确定要清空您的购物车吗?')
62
+ @get('content').cleanUp()
63
+ @store.commit()
64
+
65
+ # return: an array of cart items.
66
+ #
67
+ # For example:
68
+ #
69
+ # RightnowOms.cartController.findCartItemsByGroup('booking');
70
+ #
71
+ # =>
72
+ # [{
73
+ # 'id': 1, 'cartable_id': 2, 'cartable_type': 'Product', 'name': 'product-1', 'price': 10.0, 'group': 'booking', 'parent_id': null
74
+ # }, {
75
+ # 'id': 2, 'cartable_id': 3, 'cartable_type': 'Product', 'name': 'product-2', 'price': 20.0, 'group': 'booking', 'parent_id': 2
76
+ # }]
77
+ findCartItemsByGroup: (group) ->
78
+ found = []
79
+ cartItems = @get('content').findCartItemsByGroup(group)
80
+
81
+ cartItems.forEach (item) ->
82
+ found.push(item.getProperties('id', 'cartable_id', 'cartable_type', 'name', 'price', 'quantity', 'group', 'parent_id'))
83
+
84
+ found
@@ -29,6 +29,20 @@ RightnowOms.Cart = DS.Model.extend
29
29
 
30
30
  cartItem
31
31
 
32
+ updateCartItem: (id, properties) ->
33
+ cartItem = RightnowOms.CartItem.findById(id)
34
+ cartItem.setProperties(properties) if cartItem?
35
+
36
+ cleanUp: ->
37
+ cartItemIds = @get('cartItems').map (item) ->
38
+ return item.get('id')
39
+
40
+ cartItemIds.forEach (id) ->
41
+ item = RightnowOms.CartItem.findById(id)
42
+
43
+ # INFO Children will be deleted when the parent is deleted
44
+ item.deleteRecord() if item && !item.get('hasParent')
45
+
32
46
  removeCartItem: (id) ->
33
47
  cartItem = RightnowOms.CartItem.findById(id)
34
48
 
@@ -48,5 +62,9 @@ RightnowOms.Cart = DS.Model.extend
48
62
  cartItem.decrease()
49
63
  cartItem
50
64
 
65
+ findCartItemsByGroup: (group) ->
66
+ @get('cartItems').filter (item) ->
67
+ return true if item.get('group') == group
68
+
51
69
  RightnowOms.Cart.reopenClass
52
70
  isSingleton: true
@@ -2,15 +2,23 @@ RightnowOms.CartItem = DS.Model.extend
2
2
  cartable_id: DS.attr('integer')
3
3
  cartable_type: DS.attr('string')
4
4
  name: DS.attr('string')
5
- price: DS.attr('string')
5
+ price: DS.attr('money')
6
6
  quantity: DS.attr('integer')
7
7
  group: DS.attr('string')
8
8
  parent_id: DS.attr('integer')
9
9
 
10
+ priceString: (->
11
+ round(@get('price'), 2)
12
+ ).property('price')
13
+
10
14
  subtotal: (->
11
- round(round(@get('price'), 2) * @get('quantity'), 2)
15
+ @get('price') * @get('quantity')
12
16
  ).property('price', 'quantity')
13
17
 
18
+ subtotalString: (->
19
+ round(@get('subtotal'), 2)
20
+ ).property('subtotal')
21
+
14
22
  children: (->
15
23
  RightnowOms.CartItem.all().filterProperty('parent_id', @get('id'))
16
24
  ).property()
@@ -1,6 +1,6 @@
1
1
  {{#with cartItem }}
2
2
  <td class="name">{{ name }}</td>
3
- <td class="price r-money">¥{{ price }}x{{ quantity }}</td>
3
+ <td class="price r-money">¥{{ priceString }}x{{ quantity }}</td>
4
4
  <td class="delete">
5
5
  {{#unless hasParent }}
6
6
  <a href="#" {{ action "deleteRecord" }}>删除</a>
@@ -1,6 +1,6 @@
1
1
  {{#with cartItem}}
2
2
  <td class="name">{{ name }}</td>
3
- <td class="price">¥{{ price }}</td>
3
+ <td class="price">¥{{ priceString }}</td>
4
4
  <td class="quantity">
5
5
  {{#if hasParent }}
6
6
  <span class="quantity-only">{{ quantity }}</span>
@@ -10,7 +10,7 @@
10
10
  <span class="increase"><a href="#" {{ action "increase" }}>+</a></span>
11
11
  {{/if}}
12
12
  </td>
13
- <td class="subtotal r-money">¥{{ subtotal }}</td>
13
+ <td class="subtotal r-money">¥{{ subtotalString }}</td>
14
14
  <td class="delete">
15
15
  {{#unless hasParent }}
16
16
  <a href="#" {{ action "deleteRecord" }}>删除</a>
@@ -24,7 +24,12 @@
24
24
  </table>
25
25
  </div>
26
26
  <div class="r-bottom-bar">
27
- <span>总价:<span class="r-money">¥{{ cart.total }}</span></span>
28
- <span><a href="/"><< 继续购物</a></span>
29
- <span><a href="#">去结算 >></a></span>
27
+ <div class="left-conner">
28
+ <span class="r-cleanup-cart"><a href="#" {{ action cleanUp }}>清空购物车</a></span>
29
+ </div>
30
+ <div class="right-conner">
31
+ <span>总价:<span class="r-money">¥{{ cart.total }}</span></span>
32
+ <span class="r-continue-to-shop"><a href="/"><< 继续购物</a></span>
33
+ <span class="r-checkout"><a href="#">去结算 >></a></span>
34
+ </div>
30
35
  </div>
@@ -2,3 +2,6 @@ RightnowOms.ShowCartInDetailView = Ember.View.extend
2
2
  templateName: 'rightnow_oms/app/templates/carts/show_in_detail'
3
3
 
4
4
  cartBinding: 'RightnowOms.cartController.content'
5
+
6
+ cleanUp: ->
7
+ RightnowOms.cartController.cleanUp()
@@ -0,0 +1,7 @@
1
+ DS.attr.transforms.money =
2
+ from: (serialized) ->
3
+ parseFloat(serialized) unless Em.none(serialized)
4
+
5
+ to: (deserialized) ->
6
+ (Math.round(deserialized * Math.pow(10, 2)) / Math.pow(10, 2)).toFixed(2) unless Em.none(deserialized)
7
+
@@ -35,11 +35,11 @@
35
35
  display: none;
36
36
  table {
37
37
  td {
38
- padding: 5px;
38
+ padding: 5px 8px;
39
39
  text-align: right;
40
40
  }
41
41
  td.name {
42
- width: 175px;
42
+ width: 150px;
43
43
  text-align: left;
44
44
  overflow: hidden;
45
45
  }
@@ -134,11 +134,11 @@
134
134
  }
135
135
  .r-bottom-bar {
136
136
  position: relative;
137
- float: right;
137
+ width: 100%;
138
138
  font-size: 20px;
139
139
  line-height: 36px;
140
- span {
141
- padding: 8px;
142
- }
140
+ span { padding: 8px; }
141
+ .left-conner { float: left; }
142
+ .right-conner { float: right; }
143
143
  }
144
144
  }
@@ -19,24 +19,20 @@ module RightnowOms
19
19
  end
20
20
 
21
21
  def add_item(cartable, opts = { quantity: 1 })
22
- quantity = opts[:quantity]
23
- group = opts[:group]
24
- parent_id = opts[:parent_id]
25
-
26
22
  cart_item = cart_items.find_by_cartable(cartable)
27
23
 
28
24
  if cart_item
29
25
  cart_item.update_attributes(
30
- quantity: cart_item.quantity + quantity.to_i
26
+ quantity: cart_item.quantity + opts[:quantity].to_i,
31
27
  )
32
28
  else
33
29
  cart_item = cart_items.create(
34
30
  cartable: cartable,
35
31
  name: cartable.cartable_name,
36
- price: cartable.cartable_price,
37
- quantity: quantity,
38
- group: group,
39
- parent_id: parent_id
32
+ price: opts[:price] || cartable.cartable_price,
33
+ quantity: opts[:quantity],
34
+ group: opts[:group],
35
+ parent_id: opts[:parent_id]
40
36
  )
41
37
  end
42
38
 
@@ -1,3 +1,3 @@
1
1
  module RightnowOms
2
- VERSION = "0.1.1"
2
+ VERSION = "0.1.2"
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rightnow_oms
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 0.1.2
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,11 +9,11 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-02-13 00:00:00.000000000 Z
12
+ date: 2012-02-14 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rails
16
- requirement: &10801820 !ruby/object:Gem::Requirement
16
+ requirement: &8877280 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ! '>='
@@ -21,10 +21,10 @@ dependencies:
21
21
  version: '0'
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: *10801820
24
+ version_requirements: *8877280
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: jquery-rails
27
- requirement: &10800840 !ruby/object:Gem::Requirement
27
+ requirement: &8904080 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - ! '>='
@@ -32,10 +32,10 @@ dependencies:
32
32
  version: '0'
33
33
  type: :runtime
34
34
  prerelease: false
35
- version_requirements: *10800840
35
+ version_requirements: *8904080
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: coffee-rails
38
- requirement: &10799660 !ruby/object:Gem::Requirement
38
+ requirement: &8902620 !ruby/object:Gem::Requirement
39
39
  none: false
40
40
  requirements:
41
41
  - - ! '>='
@@ -43,10 +43,10 @@ dependencies:
43
43
  version: '0'
44
44
  type: :runtime
45
45
  prerelease: false
46
- version_requirements: *10799660
46
+ version_requirements: *8902620
47
47
  - !ruby/object:Gem::Dependency
48
48
  name: sass-rails
49
- requirement: &10813400 !ruby/object:Gem::Requirement
49
+ requirement: &8901160 !ruby/object:Gem::Requirement
50
50
  none: false
51
51
  requirements:
52
52
  - - ! '>='
@@ -54,10 +54,10 @@ dependencies:
54
54
  version: '0'
55
55
  type: :runtime
56
56
  prerelease: false
57
- version_requirements: *10813400
57
+ version_requirements: *8901160
58
58
  - !ruby/object:Gem::Dependency
59
59
  name: acts_as_api
60
- requirement: &10811620 !ruby/object:Gem::Requirement
60
+ requirement: &8898360 !ruby/object:Gem::Requirement
61
61
  none: false
62
62
  requirements:
63
63
  - - ! '>='
@@ -65,10 +65,10 @@ dependencies:
65
65
  version: '0'
66
66
  type: :runtime
67
67
  prerelease: false
68
- version_requirements: *10811620
68
+ version_requirements: *8898360
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: ember-rails
71
- requirement: &10810480 !ruby/object:Gem::Requirement
71
+ requirement: &8897240 !ruby/object:Gem::Requirement
72
72
  none: false
73
73
  requirements:
74
74
  - - ! '>='
@@ -76,10 +76,10 @@ dependencies:
76
76
  version: '0'
77
77
  type: :runtime
78
78
  prerelease: false
79
- version_requirements: *10810480
79
+ version_requirements: *8897240
80
80
  - !ruby/object:Gem::Dependency
81
81
  name: haml-rails
82
- requirement: &10809240 !ruby/object:Gem::Requirement
82
+ requirement: &8911980 !ruby/object:Gem::Requirement
83
83
  none: false
84
84
  requirements:
85
85
  - - ! '>='
@@ -87,7 +87,7 @@ dependencies:
87
87
  version: '0'
88
88
  type: :runtime
89
89
  prerelease: false
90
- version_requirements: *10809240
90
+ version_requirements: *8911980
91
91
  description: A common mountable engine can be used to manage the orders.
92
92
  email:
93
93
  - towerhe@gmail.com
@@ -109,8 +109,9 @@ files:
109
109
  - app/assets/javascripts/rightnow_oms/vendor/ember.js
110
110
  - app/assets/javascripts/rightnow_oms/vendor/ember.min.js
111
111
  - app/assets/javascripts/rightnow_oms/lib/utils.js.coffee
112
- - app/assets/javascripts/rightnow_oms/lib/ember/data/adapters/my_rest_adapter.js.coffee
112
+ - app/assets/javascripts/rightnow_oms/lib/ember/data/types.js.coffee
113
113
  - app/assets/javascripts/rightnow_oms/lib/ember/data/extensions.js
114
+ - app/assets/javascripts/rightnow_oms/lib/ember/data/my_rest_adapter.js.coffee
114
115
  - app/assets/javascripts/rightnow_oms/app/templates/cart_items/show.hjs
115
116
  - app/assets/javascripts/rightnow_oms/app/templates/cart_items/show_in_detail.hjs
116
117
  - app/assets/javascripts/rightnow_oms/app/templates/carts/show.hjs
@@ -155,7 +156,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
155
156
  version: '0'
156
157
  segments:
157
158
  - 0
158
- hash: -375847056207753837
159
+ hash: 4137530938571715017
159
160
  required_rubygems_version: !ruby/object:Gem::Requirement
160
161
  none: false
161
162
  requirements:
@@ -164,7 +165,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
164
165
  version: '0'
165
166
  segments:
166
167
  - 0
167
- hash: -375847056207753837
168
+ hash: 4137530938571715017
168
169
  requirements: []
169
170
  rubyforge_project:
170
171
  rubygems_version: 1.8.10