shoppe 0.0.7 → 0.0.8
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/app/assets/images/shoppe/chosen-sprite.png +0 -0
- data/app/assets/images/shoppe/chosen-sprite@2x.png +0 -0
- data/app/assets/images/shoppe/icons/bag.svg +1 -0
- data/app/assets/images/shoppe/icons/balance.svg +1 -0
- data/app/assets/images/shoppe/icons/box.svg +1 -0
- data/app/assets/images/shoppe/icons/building.svg +1 -0
- data/app/assets/images/shoppe/icons/chart.svg +1 -0
- data/app/assets/images/shoppe/icons/chat.svg +1 -0
- data/app/assets/images/shoppe/icons/checkbox.svg +1 -0
- data/app/assets/images/shoppe/icons/checkbox2.svg +1 -0
- data/app/assets/images/shoppe/icons/cloud.svg +1 -0
- data/app/assets/images/shoppe/icons/cone.svg +1 -0
- data/app/assets/images/shoppe/icons/credit_card.svg +1 -0
- data/app/assets/images/shoppe/icons/currency.svg +1 -0
- data/app/assets/images/shoppe/icons/flowchart.svg +1 -0
- data/app/assets/images/shoppe/icons/gift.svg +1 -0
- data/app/assets/images/shoppe/icons/globe.svg +1 -0
- data/app/assets/images/shoppe/icons/id.svg +1 -0
- data/app/assets/images/shoppe/icons/id2.svg +1 -0
- data/app/assets/images/shoppe/icons/locked.svg +1 -0
- data/app/assets/images/shoppe/icons/report.svg +1 -0
- data/app/assets/images/shoppe/icons/search.svg +1 -0
- data/app/assets/images/shoppe/icons/support.svg +1 -0
- data/app/assets/images/shoppe/icons/tags.svg +1 -0
- data/app/assets/images/shoppe/icons/toolbox.svg +1 -0
- data/app/assets/images/shoppe/icons/unlocked.svg +1 -0
- data/app/assets/images/shoppe/icons/wallet.svg +1 -0
- data/app/assets/images/shoppe/move.svg +1 -0
- data/app/assets/javascripts/shoppe/application.coffee +32 -1
- data/app/assets/javascripts/shoppe/chosen.jquery.js +1166 -0
- data/app/assets/javascripts/shoppe/jquery_ui.js +6 -0
- data/app/assets/stylesheets/shoppe/application.scss +95 -20
- data/app/assets/stylesheets/shoppe/chosen.css +430 -0
- data/app/assets/stylesheets/shoppe/elements.scss +6 -7
- data/app/controllers/shoppe/delivery_service_prices_controller.rb +1 -1
- data/app/controllers/shoppe/products_controller.rb +1 -1
- data/app/helpers/shoppe/shoppe_helper.rb +2 -0
- data/app/models/shoppe/delivery_service_price.rb +1 -0
- data/app/models/shoppe/order.rb +18 -1
- data/app/models/shoppe/order_item.rb +11 -5
- data/app/models/shoppe/product.rb +19 -4
- data/app/models/shoppe/product/product_attributes.rb +15 -0
- data/app/models/shoppe/product_attribute.rb +51 -0
- data/app/views/shoppe/delivery_service_prices/_form.html.haml +23 -19
- data/app/views/shoppe/delivery_service_prices/edit.html.haml +1 -1
- data/app/views/shoppe/delivery_service_prices/index.html.haml +1 -1
- data/app/views/shoppe/delivery_service_prices/new.html.haml +1 -1
- data/app/views/shoppe/delivery_services/_form.html.haml +27 -25
- data/app/views/shoppe/delivery_services/edit.html.haml +1 -1
- data/app/views/shoppe/delivery_services/index.html.haml +12 -8
- data/app/views/shoppe/delivery_services/new.html.haml +1 -1
- data/app/views/shoppe/orders/index.html.haml +16 -12
- data/app/views/shoppe/orders/show.html.haml +28 -25
- data/app/views/shoppe/product_categories/_form.html.haml +7 -6
- data/app/views/shoppe/product_categories/edit.html.haml +1 -1
- data/app/views/shoppe/product_categories/index.html.haml +8 -4
- data/app/views/shoppe/product_categories/new.html.haml +1 -1
- data/app/views/shoppe/products/_form.html.haml +88 -45
- data/app/views/shoppe/products/edit.html.haml +1 -1
- data/app/views/shoppe/products/index.html.haml +14 -13
- data/app/views/shoppe/products/new.html.haml +1 -1
- data/app/views/shoppe/users/_form.html.haml +17 -15
- data/app/views/shoppe/users/edit.html.haml +1 -1
- data/app/views/shoppe/users/index.html.haml +1 -1
- data/app/views/shoppe/users/new.html.haml +1 -1
- data/db/migrate/20131012123829_create_shoppe_product_attributes.rb +11 -0
- data/db/migrate/20131012163301_add_public_boolean_to_product_attributes.rb +5 -0
- data/db/migrate/20131013123937_add_cost_prices_to_various_objects.rb +8 -0
- data/db/migrate/20131013131658_add_stock_control_boolean_to_products.rb +5 -0
- data/db/seeds.rb +78 -30
- data/lib/shoppe/version.rb +1 -1
- data/test/dummy/db/development.sqlite3 +0 -0
- data/test/dummy/db/schema.rb +22 -6
- data/test/dummy/log/development.log +29 -0
- metadata +42 -5
@@ -9,17 +9,16 @@
|
|
9
9
|
background:none;
|
10
10
|
text-decoration:none;
|
11
11
|
font-size:12px;
|
12
|
-
font-weight:
|
12
|
+
font-weight:500 !important;
|
13
13
|
text-transform:uppercase;
|
14
14
|
font-family:$font;
|
15
15
|
color:#fff !important;
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
background-color:#888;
|
16
|
+
padding:8px 20px;
|
17
|
+
border-radius:30px;
|
18
|
+
background-color:#40454D;
|
20
19
|
display:inline-block;
|
21
20
|
&:active {
|
22
|
-
background:#
|
21
|
+
background:#40454D;
|
23
22
|
}
|
24
23
|
|
25
24
|
&.green {
|
@@ -63,7 +62,7 @@
|
|
63
62
|
|
64
63
|
&.button-mini {
|
65
64
|
font-size:11px;
|
66
|
-
padding:
|
65
|
+
padding:4px 10px;
|
67
66
|
box-shadow:none;
|
68
67
|
font-weight:normal;
|
69
68
|
text-shadow:none;
|
@@ -36,7 +36,7 @@ class Shoppe::DeliveryServicePricesController < Shoppe::ApplicationController
|
|
36
36
|
private
|
37
37
|
|
38
38
|
def safe_params
|
39
|
-
params[:delivery_service_price].permit(:price, :tax_rate, :min_weight, :max_weight, :code)
|
39
|
+
params[:delivery_service_price].permit(:price, :cost_price, :tax_rate, :min_weight, :max_weight, :code)
|
40
40
|
end
|
41
41
|
|
42
42
|
end
|
@@ -39,7 +39,7 @@ class Shoppe::ProductsController < Shoppe::ApplicationController
|
|
39
39
|
private
|
40
40
|
|
41
41
|
def safe_params
|
42
|
-
params[:product].permit(:product_category_id, :title, :sku, :permalink, :description, :short_description, :weight, :price, :tax_rate, :stock, :default_image_file, :data_sheet_file, :active, :featured, :in_the_box)
|
42
|
+
params[:product].permit(:product_category_id, :title, :sku, :permalink, :description, :short_description, :weight, :price, :cost_price, :tax_rate, :stock_control, :stock, :default_image_file, :data_sheet_file, :active, :featured, :in_the_box, :product_attributes_array => [:key, :value, :searchable, :public])
|
43
43
|
end
|
44
44
|
|
45
45
|
end
|
@@ -8,6 +8,7 @@ class Shoppe::DeliveryServicePrice < ActiveRecord::Base
|
|
8
8
|
|
9
9
|
# Validations
|
10
10
|
validates :price, :numericality => true
|
11
|
+
validates :cost_price, :numericality => true, :allow_blank => true
|
11
12
|
validates :tax_rate, :numericality => true
|
12
13
|
validates :min_weight, :numericality => true
|
13
14
|
validates :max_weight, :numericality => true
|
data/app/models/shoppe/order.rb
CHANGED
@@ -109,6 +109,17 @@ class Shoppe::Order < ActiveRecord::Base
|
|
109
109
|
@total_items ||= order_items.inject(0) { |t,i| t + i.quantity }
|
110
110
|
end
|
111
111
|
|
112
|
+
# The total cost of the order
|
113
|
+
def total_cost
|
114
|
+
self.delivery_cost_price +
|
115
|
+
order_items.inject(BigDecimal(0)) { |t, i| t + i.total_cost }
|
116
|
+
end
|
117
|
+
|
118
|
+
# Return the price for the order
|
119
|
+
def profit
|
120
|
+
total_before_tax - total_cost
|
121
|
+
end
|
122
|
+
|
112
123
|
# The total price of the order before tax
|
113
124
|
def total_before_tax
|
114
125
|
self.delivery_price +
|
@@ -163,11 +174,16 @@ class Shoppe::Order < ActiveRecord::Base
|
|
163
174
|
@delivery_service_price ||= self.delivery_service && self.delivery_service.delivery_service_prices.for_weight(self.total_weight).first
|
164
175
|
end
|
165
176
|
|
166
|
-
# The
|
177
|
+
# The price for delivering this order in its current state
|
167
178
|
def delivery_price
|
168
179
|
@delivery_price ||= read_attribute(:delivery_price) || delivery_service_price.try(:price) || 0.0
|
169
180
|
end
|
170
181
|
|
182
|
+
# The cost of delivering this order in its current state
|
183
|
+
def delivery_cost_price
|
184
|
+
@delivery_cost_price ||= read_attribute(:delivery_cost_price) || delivery_service_price.try(:cost_price) || 0.0
|
185
|
+
end
|
186
|
+
|
171
187
|
# The tax amount due for the delivery of this order in its current state
|
172
188
|
def delivery_tax_amount
|
173
189
|
@delivery_tax_amount ||= begin
|
@@ -245,6 +261,7 @@ class Shoppe::Order < ActiveRecord::Base
|
|
245
261
|
if self.delivery_service
|
246
262
|
write_attribute :delivery_service_id, self.delivery_service.id
|
247
263
|
write_attribute :delivery_price, self.delivery_price
|
264
|
+
write_attribute :delivery_cost_price, self.delivery_cost_price
|
248
265
|
write_attribute :delivery_tax_amount, self.delivery_tax_amount
|
249
266
|
write_attribute :delivery_tax_rate, self.delivery_tax_rate
|
250
267
|
end
|
@@ -14,6 +14,7 @@ class Shoppe::OrderItem < ActiveRecord::Base
|
|
14
14
|
before_validation do
|
15
15
|
if self.product
|
16
16
|
self.unit_price = self.product.price if self.unit_price.blank?
|
17
|
+
self.unit_cost_price = self.product.cost_price if self.unit_cost_price.blank?
|
17
18
|
self.tax_rate = self.product.tax_rate if self.tax_rate.blank?
|
18
19
|
if unit_price_changed? || quantity_changed?
|
19
20
|
self.tax_amount = (self.sub_total / BigDecimal(100)) * self.tax_rate
|
@@ -55,7 +56,7 @@ class Shoppe::OrderItem < ActiveRecord::Base
|
|
55
56
|
def increase!(amount = 1)
|
56
57
|
transaction do
|
57
58
|
self.quantity += amount
|
58
|
-
if self.product.stock < self.quantity
|
59
|
+
if self.product.stock_control? && self.product.stock < self.quantity
|
59
60
|
raise Shoppe::Errors::NotEnoughStock, :product => self.product, :requested_stock => self.quantity
|
60
61
|
end
|
61
62
|
self.save!
|
@@ -72,6 +73,11 @@ class Shoppe::OrderItem < ActiveRecord::Base
|
|
72
73
|
end
|
73
74
|
end
|
74
75
|
|
76
|
+
# Return the total cost for the product
|
77
|
+
def total_cost
|
78
|
+
quantity * unit_cost_price
|
79
|
+
end
|
80
|
+
|
75
81
|
# Return the sub total for the product
|
76
82
|
def sub_total
|
77
83
|
quantity * unit_price
|
@@ -90,7 +96,7 @@ class Shoppe::OrderItem < ActiveRecord::Base
|
|
90
96
|
|
91
97
|
# Do we have the stock needed to fulfil this order?
|
92
98
|
def in_stock?
|
93
|
-
if self.product.
|
99
|
+
if self.product.stock_control?
|
94
100
|
self.product.stock >= self.quantity
|
95
101
|
else
|
96
102
|
true
|
@@ -101,12 +107,12 @@ class Shoppe::OrderItem < ActiveRecord::Base
|
|
101
107
|
# before an order is completed. If we have run out of this product, we will update the quantity to an
|
102
108
|
# appropriate level (or remove the order item) and return the object.
|
103
109
|
def validate_stock_levels
|
104
|
-
|
110
|
+
if in_stock?
|
111
|
+
false
|
112
|
+
else
|
105
113
|
self.quantity = self.product.stock
|
106
114
|
self.quantity == 0 ? self.destroy : self.save!
|
107
115
|
self
|
108
|
-
else
|
109
|
-
false
|
110
116
|
end
|
111
117
|
end
|
112
118
|
|
@@ -3,6 +3,9 @@ class Shoppe::Product < ActiveRecord::Base
|
|
3
3
|
# Set the table name
|
4
4
|
self.table_name = 'shoppe_products'
|
5
5
|
|
6
|
+
# Require some concerns
|
7
|
+
require_dependency 'shoppe/product/product_attributes'
|
8
|
+
|
6
9
|
# Attachments
|
7
10
|
attachment :default_image
|
8
11
|
attachment :data_sheet
|
@@ -21,6 +24,7 @@ class Shoppe::Product < ActiveRecord::Base
|
|
21
24
|
validates :short_description, :presence => true
|
22
25
|
validates :weight, :numericality => true
|
23
26
|
validates :price, :numericality => true
|
27
|
+
validates :cost_price, :numericality => true, :allow_blank => true
|
24
28
|
validates :tax_rate, :numericality => true
|
25
29
|
validates :stock, :numericality => {:only_integer => true}
|
26
30
|
|
@@ -30,16 +34,18 @@ class Shoppe::Product < ActiveRecord::Base
|
|
30
34
|
# Scopes
|
31
35
|
scope :active, -> { where(:active => true) }
|
32
36
|
scope :featured, -> {where(:featured => true)}
|
33
|
-
|
37
|
+
|
34
38
|
# Is this product currently in stock?
|
35
39
|
def in_stock?
|
36
|
-
stock > 0
|
40
|
+
!stock_control? || stock > 0
|
37
41
|
end
|
38
42
|
|
39
43
|
# Remove the provided number of units from the current stock level of this product
|
40
44
|
def update_stock_level(purchased = 1)
|
41
|
-
self.
|
42
|
-
|
45
|
+
if self.stock_control?
|
46
|
+
self.stock -= purchased
|
47
|
+
self.save!
|
48
|
+
end
|
43
49
|
end
|
44
50
|
|
45
51
|
# Specify which attributes can be searched
|
@@ -52,5 +58,14 @@ class Shoppe::Product < ActiveRecord::Base
|
|
52
58
|
[]
|
53
59
|
end
|
54
60
|
|
61
|
+
# Search for products which include the guven attributes and return an active record
|
62
|
+
# scope of these products. Chainable with other scopes and with_attributes methods.
|
63
|
+
# For example:
|
64
|
+
#
|
65
|
+
# Shoppe::Product.active.with_attribute('Manufacturer', 'Apple').with_attribute('Model', ['Macbook', 'iPhone'])
|
66
|
+
def self.with_attributes(key, values)
|
67
|
+
product_ids = Shoppe::ProductAttribute.searchable.where(:key => key, :value => values).pluck(:product_id).uniq
|
68
|
+
where(:id => product_ids)
|
69
|
+
end
|
55
70
|
|
56
71
|
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
class Shoppe::Product
|
2
|
+
|
3
|
+
# Relationships
|
4
|
+
has_many :product_attributes, -> { order(:position) }, :class_name => 'Shoppe::ProductAttribute'
|
5
|
+
|
6
|
+
# Attribute for providing the hash
|
7
|
+
attr_accessor :product_attributes_array
|
8
|
+
|
9
|
+
# Save the attributes after saving the record
|
10
|
+
after_save do
|
11
|
+
return unless product_attributes_array.is_a?(Array)
|
12
|
+
self.product_attributes.update_from_array(product_attributes_array)
|
13
|
+
end
|
14
|
+
|
15
|
+
end
|
@@ -0,0 +1,51 @@
|
|
1
|
+
class Shoppe::ProductAttribute < ActiveRecord::Base
|
2
|
+
|
3
|
+
# Set the table name
|
4
|
+
self.table_name = 'shoppe_product_attributes'
|
5
|
+
|
6
|
+
# Validations
|
7
|
+
validates :key, :presence => true
|
8
|
+
|
9
|
+
# Relationships
|
10
|
+
belongs_to :product, :class_name => 'Shoppe::Product'
|
11
|
+
|
12
|
+
# Scopes
|
13
|
+
scope :searchable, -> { where(:searchable => true) }
|
14
|
+
scope :public, -> { where(:public => true) }
|
15
|
+
|
16
|
+
# Return the the available options as a hash
|
17
|
+
def self.grouped_hash
|
18
|
+
all.group_by(&:key).inject(Hash.new) do |h, (key, attributes)|
|
19
|
+
h[key] = attributes.map(&:value).uniq
|
20
|
+
h
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
# Create/update attributes for a product based on the provided hash of
|
25
|
+
# keys & values
|
26
|
+
def self.update_from_array(array)
|
27
|
+
existing_keys = self.pluck(:key)
|
28
|
+
index = 0
|
29
|
+
array.each do |hash|
|
30
|
+
next if hash['key'].blank?
|
31
|
+
index += 1
|
32
|
+
params = hash.merge({
|
33
|
+
:searchable => hash['searchable'].to_s == '1',
|
34
|
+
:public => hash['public'].to_s == '1',
|
35
|
+
:position => index
|
36
|
+
})
|
37
|
+
if existing_attr = self.where(:key => hash['key']).first
|
38
|
+
if hash['value'].blank?
|
39
|
+
existing_attr.destroy
|
40
|
+
index -= 1
|
41
|
+
else
|
42
|
+
existing_attr.update_attributes(params)
|
43
|
+
end
|
44
|
+
else
|
45
|
+
attribute = self.create(params)
|
46
|
+
end
|
47
|
+
end
|
48
|
+
self.where(:key => existing_keys - array.map { |h| h['key']}).delete_all
|
49
|
+
end
|
50
|
+
|
51
|
+
end
|
@@ -1,28 +1,32 @@
|
|
1
1
|
= form_for [@delivery_service, @delivery_service_price] do |f|
|
2
2
|
= f.error_messages
|
3
|
-
= field_set_tag "Weight
|
4
|
-
|
5
|
-
%
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
%
|
3
|
+
= field_set_tag "Identification & Weight" do
|
4
|
+
.splitContainer
|
5
|
+
%dl.third
|
6
|
+
%dt= f.label :code
|
7
|
+
%dd= f.text_field :code
|
8
|
+
|
9
|
+
%dl.third
|
10
|
+
%dt= f.label :min_weight
|
11
|
+
%dd= f.text_field :min_weight
|
12
|
+
%dl.third
|
13
|
+
%dt= f.label :max_weight
|
14
|
+
%dd= f.text_field :max_weight
|
10
15
|
|
11
16
|
= field_set_tag "Pricing" do
|
12
|
-
|
13
|
-
%
|
14
|
-
|
15
|
-
|
16
|
-
%
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
%dd= f.text_field :code
|
17
|
+
.splitContainer
|
18
|
+
%dl.third
|
19
|
+
%dt= f.label :price
|
20
|
+
%dd= f.text_field :price
|
21
|
+
%dl.third
|
22
|
+
%dt= f.label :cost_price
|
23
|
+
%dd= f.text_field :cost_price
|
24
|
+
%dl.third
|
25
|
+
%dt= f.label :tax_rate
|
26
|
+
%dd= f.text_field :tax_rate
|
23
27
|
|
24
28
|
%p.submit
|
25
29
|
- unless @delivery_service_price.new_record?
|
26
30
|
%span.right= link_to "Delete", [@delivery_service, @delivery_service_price], :class => 'button purple', :method => :delete, :data => {:confirm => "Are you sure you wish to remove this price?"}
|
27
31
|
= f.submit :class => 'button green'
|
28
|
-
= link_to "Cancel", :
|
32
|
+
= link_to "Cancel", [@delivery_service, :delivery_service_prices], :class => 'button'
|
@@ -4,7 +4,7 @@
|
|
4
4
|
%p.buttons
|
5
5
|
= link_to "New price", [:new, @delivery_service, :delivery_service_price], :class => 'button green'
|
6
6
|
= link_to "Back to delivery services", :delivery_services, :class => 'button'
|
7
|
-
%h2 Delivery Pricing for #{@delivery_service.name}
|
7
|
+
%h2.delivery_services Delivery Pricing for #{@delivery_service.name}
|
8
8
|
|
9
9
|
.table
|
10
10
|
%table.data
|
@@ -1,33 +1,35 @@
|
|
1
1
|
= form_for @delivery_service do |f|
|
2
2
|
= f.error_messages
|
3
3
|
= field_set_tag "Details" do
|
4
|
-
|
5
|
-
%
|
6
|
-
|
7
|
-
|
8
|
-
%
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
%
|
13
|
-
|
14
|
-
|
15
|
-
|
4
|
+
.splitContainer
|
5
|
+
%dl.half
|
6
|
+
%dt= f.label :name
|
7
|
+
%dd= f.text_field :name
|
8
|
+
%dl.half
|
9
|
+
%dt= f.label :code
|
10
|
+
%dd= f.text_field :code
|
11
|
+
.splitContainer
|
12
|
+
%dl.half
|
13
|
+
%dt= f.label :active
|
14
|
+
%dd.checkbox
|
15
|
+
= f.check_box :active
|
16
|
+
= f.label :active, 'Service will be available for use'
|
17
|
+
%dl.half
|
18
|
+
%dt= f.label :default
|
19
|
+
%dd.checkbox
|
20
|
+
= f.check_box :default
|
21
|
+
= f.label :default, 'Service will be used by default (if possible)'
|
16
22
|
= field_set_tag "Courier" do
|
17
|
-
|
18
|
-
%
|
19
|
-
|
20
|
-
|
21
|
-
%
|
22
|
-
|
23
|
-
|
24
|
-
|
23
|
+
.splitContainer
|
24
|
+
%dl.half
|
25
|
+
%dt= f.label :courier, "Courier Name"
|
26
|
+
%dd= f.text_field :courier
|
27
|
+
%dl.half
|
28
|
+
%dt= f.label :tracking_url, "Tracking URL"
|
29
|
+
%dd
|
30
|
+
= f.text_field :tracking_url
|
31
|
+
%p.help Use <code>{{consignment_number}}</code> to insert the consignment number.
|
25
32
|
|
26
|
-
- unless @delivery_service.new_record?
|
27
|
-
= field_set_tag "Pricing" do
|
28
|
-
%dl
|
29
|
-
%dt Pricing
|
30
|
-
%dd= link_to "Set pricing for delivery service", [@delivery_service, :delivery_service_prices], :class => 'button button-mini'
|
31
33
|
%p.submit
|
32
34
|
- unless @delivery_service.new_record?
|
33
35
|
%span.right= link_to "Delete", [@delivery_service], :class => 'button purple', :method => :delete, :data => {:confirm => "Are you sure you wish to remove this delivery service?"}
|
@@ -2,7 +2,7 @@
|
|
2
2
|
|
3
3
|
= content_for :header do
|
4
4
|
%p.buttons= link_to "New delivery service", :new_delivery_service, :class => 'button green'
|
5
|
-
%h2 Delivery Services
|
5
|
+
%h2.delivery_services Delivery Services
|
6
6
|
|
7
7
|
.table
|
8
8
|
%table.data
|
@@ -14,11 +14,15 @@
|
|
14
14
|
%th Active?
|
15
15
|
%th Default?
|
16
16
|
%tbody
|
17
|
-
-
|
18
|
-
%tr
|
19
|
-
%td
|
20
|
-
|
21
|
-
|
22
|
-
%
|
23
|
-
|
17
|
+
- if @delivery_services.empty?
|
18
|
+
%tr.empty
|
19
|
+
%td{:colspan => 5} No delivery services to display.
|
20
|
+
- else
|
21
|
+
- for delivery_service in @delivery_services
|
22
|
+
%tr
|
23
|
+
%td= link_to delivery_service.name, [:edit, delivery_service]
|
24
|
+
%td= link_to "Set Prices", [delivery_service, :delivery_service_prices]
|
25
|
+
%td= delivery_service.courier
|
26
|
+
%td= boolean_tag :active
|
27
|
+
%td= boolean_tag :default
|
24
28
|
|