caboose-cms 0.7.42 → 0.7.43
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/app/assets/javascripts/caboose/media_browser.js +280 -0
- data/app/assets/javascripts/caboose/model/bound_media_image.js +140 -0
- data/app/controllers/caboose/login_controller.rb +2 -2
- data/app/controllers/caboose/products_controller.rb +3 -0
- data/app/controllers/caboose/variants_controller.rb +29 -0
- data/app/models/caboose/authenticator.rb +2 -2
- data/app/models/caboose/comment_routes.rb +94 -7
- data/app/models/caboose/product.rb +22 -1
- data/app/models/caboose/schema.rb +10 -2
- data/app/models/caboose/variant.rb +12 -1
- data/app/views/caboose/login_mailer/forgot_password_email.html.erb +5 -3
- data/app/views/caboose/products/admin_edit_options.html.erb +15 -9
- data/app/views/caboose/variants/admin_edit.html.erb +8 -4
- data/app/views/caboose/variants/admin_edit_option1_media.html.erb +94 -0
- data/app/views/caboose/variants/admin_edit_option2_media.html.erb +94 -0
- data/app/views/caboose/variants/admin_edit_option3_media.html.erb +94 -0
- data/app/views/caboose/variants/admin_edit_sort_order.html.erb +58 -4
- data/app/views/caboose/variants/admin_index.html.erb +32 -29
- data/app/views/caboose/variants/admin_new.html.erb +4 -2
- data/config/routes.rb +7 -0
- data/lib/caboose.rb +3 -0
- data/lib/caboose/version.rb +1 -1
- data/lib/tasks/caboose.rake +10 -0
- metadata +7 -2
@@ -123,10 +123,12 @@ module Caboose
|
|
123
123
|
when 'alternate_id' then v.alternate_id = value
|
124
124
|
when 'sku' then v.sku = value
|
125
125
|
when 'barcode' then v.barcode = value
|
126
|
+
when 'cost' then v.cost = value
|
126
127
|
when 'price' then v.price = value
|
127
128
|
when 'quantity_in_stock' then v.quantity_in_stock = value
|
128
129
|
when 'ignore_quantity' then v.ignore_quantity = value
|
129
130
|
when 'allow_backorder' then v.allow_backorder = value
|
131
|
+
when 'clearance' then v.clearance = value
|
130
132
|
when 'status' then v.status = value
|
131
133
|
when 'weight' then v.weight = value
|
132
134
|
when 'length' then v.length = value
|
@@ -261,6 +263,30 @@ module Caboose
|
|
261
263
|
render :layout => 'caboose/admin'
|
262
264
|
end
|
263
265
|
|
266
|
+
# GET /admin/products/:product_id/variants/option1-media
|
267
|
+
def admin_edit_option1_media
|
268
|
+
return if !user_is_allowed('products', 'edit')
|
269
|
+
@product = Product.find(params[:product_id])
|
270
|
+
@variants = Variant.where(:product_id => @product.id, :option1 => params[:option_value]).reorder(:option1_sort_order).all
|
271
|
+
render :layout => 'caboose/modal'
|
272
|
+
end
|
273
|
+
|
274
|
+
# GET /admin/products/:product_id/variants/option2-media
|
275
|
+
def admin_edit_option2_media
|
276
|
+
return if !user_is_allowed('products', 'edit')
|
277
|
+
@product = Product.find(params[:product_id])
|
278
|
+
@variants = Variant.where(:product_id => @product.id, :option2 => params[:option_value]).reorder(:option2_sort_order).all
|
279
|
+
render :layout => 'caboose/modal'
|
280
|
+
end
|
281
|
+
|
282
|
+
# GET /admin/products/:product_id/variants/option3-media
|
283
|
+
def admin_edit_option3_media
|
284
|
+
return if !user_is_allowed('products', 'edit')
|
285
|
+
@product = Product.find(params[:product_id])
|
286
|
+
@variants = Variant.where(:product_id => @product.id, :option3 => params[:option_value]).reorder(:option3_sort_order).all
|
287
|
+
render :layout => 'caboose/modal'
|
288
|
+
end
|
289
|
+
|
264
290
|
# PUT /admin/products/:product_id/variants/option1-sort-order
|
265
291
|
def admin_update_option1_sort_order
|
266
292
|
product_id = params[:product_id]
|
@@ -425,6 +451,9 @@ module Caboose
|
|
425
451
|
when 'option1' then variants.each { |v| v.option1 = value }
|
426
452
|
when 'option2' then variants.each { |v| v.option2 = value }
|
427
453
|
when 'option3' then variants.each { |v| v.option3 = value }
|
454
|
+
when 'option1_media_id' then variants.each { |v| v.option1_media_id = value }
|
455
|
+
when 'option2_media_id' then variants.each { |v| v.option2_media_id = value }
|
456
|
+
when 'option3_media_id' then variants.each { |v| v.option3_media_id = value }
|
428
457
|
when 'requires_shipping' then variants.each { |v| v.requires_shipping = value }
|
429
458
|
when 'taxable' then variants.each { |v| v.taxable = value }
|
430
459
|
when 'downloadable' then variants.each { |v| v.downloadable = value }
|
@@ -27,8 +27,8 @@ module Caboose
|
|
27
27
|
fail_count = Caboose::LoginLog.fail_count(user)
|
28
28
|
if (fail_count+1) >= user.site.login_fail_lock_count
|
29
29
|
user.locked = true
|
30
|
-
user.save
|
31
|
-
LoginMailer.locked_account(user).deliver
|
30
|
+
user.save
|
31
|
+
LoginMailer.configure_for_site(user.site.id).locked_account(user).deliver
|
32
32
|
resp.error = "Too many failed login attempts. Your account has been locked and the site administrator has been notified."
|
33
33
|
ll.success = false
|
34
34
|
else
|
@@ -1,11 +1,16 @@
|
|
1
1
|
module Caboose
|
2
2
|
class CommentRoutes
|
3
3
|
|
4
|
-
def CommentRoutes.parse_controllers
|
4
|
+
def CommentRoutes.parse_controllers
|
5
|
+
return CommentRoutes.controller_routes
|
6
|
+
end
|
7
|
+
|
8
|
+
def CommentRoutes.controller_routes(controller = nil)
|
5
9
|
|
6
10
|
classes = {'zzz_all_domains' => []}
|
7
11
|
Rails.application.config.paths['app/controllers'].each do |controller_path|
|
8
|
-
files = Dir.glob(Rails.root.join(controller_path, '*.rb'))
|
12
|
+
#files = Dir.glob(Rails.root.join(controller_path, '*.rb'))
|
13
|
+
files = controller ? Dir.glob(Rails.root.join(controller_path, "#{controller}_controller.rb")) : Dir.glob(Rails.root.join(controller_path, '*.rb'))
|
9
14
|
for file in files
|
10
15
|
f = Rails.root.join('app', 'controllers', file)
|
11
16
|
f2 = File.open(f, "r")
|
@@ -67,18 +72,100 @@ module Caboose
|
|
67
72
|
actions.sort_by{ |arr| arr[2] }.each do |arr|
|
68
73
|
action = arr[0]
|
69
74
|
uris = arr[1]
|
70
|
-
uris.each do |uri|
|
71
|
-
#puts "#{uri.ljust(length, ' ')} => \"#{class_name}\##{action}\""
|
72
|
-
routes << "#{uri.ljust(length, ' ')} => \"#{class_name}\##{action}\""
|
75
|
+
uris.each do |uri|
|
76
|
+
# puts "#{uri.ljust(length, ' ')} => \"#{class_name}\##{action}\""
|
77
|
+
routes << "#{uri.ljust(length, ' ')} => \"#{class_name}\##{action}\""
|
73
78
|
end
|
74
79
|
end
|
75
|
-
puts ""
|
80
|
+
#puts ""
|
81
|
+
routes << ""
|
76
82
|
end
|
77
83
|
routes << "end" if domain != 'zzz_all_domains'
|
78
84
|
end
|
79
|
-
puts routes
|
85
|
+
#puts routes
|
80
86
|
return routes.join("\n")
|
81
87
|
end
|
88
|
+
|
89
|
+
def CommentRoutes.split_route(line)
|
90
|
+
return nil if line.nil?
|
91
|
+
line = line.strip
|
92
|
+
|
93
|
+
#return ['get' , line.gsub(/^get (.*?)=>(.*?)$/ , '\1').strip.gsub('"', '').gsub("'", ''), line.gsub(/^get (.*?)=>(.*?)$/ , '\2').strip.gsub('"', '').gsub("'", '')] if line =~ /^get (.*?)=>(.*?)$/
|
94
|
+
#return ['post' , line.gsub(/^post (.*?)=>(.*?)$/ , '\1').strip.gsub('"', '').gsub("'", ''), line.gsub(/^post (.*?)=>(.*?)$/ , '\2').strip.gsub('"', '').gsub("'", '')] if line =~ /^post (.*?)=>(.*?)$/
|
95
|
+
#return ['put' , line.gsub(/^put (.*?)=>(.*?)$/ , '\1').strip.gsub('"', '').gsub("'", ''), line.gsub(/^put (.*?)=>(.*?)$/ , '\2').strip.gsub('"', '').gsub("'", '')] if line =~ /^put (.*?)=>(.*?)$/
|
96
|
+
#return ['delete' , line.gsub(/^delete (.*?)=>(.*?)$/ , '\1').strip.gsub('"', '').gsub("'", ''), line.gsub(/^delete (.*?)=>(.*?)$/ , '\2').strip.gsub('"', '').gsub("'", '')] if line =~ /^delete (.*?)=>(.*?)$/
|
97
|
+
|
98
|
+
if line =~ /^get (.*?)=>(.*?)$/ || line =~ /^post (.*?)=>(.*?)$/ || line =~ /^put (.*?)=>(.*?)$/ || line =~ /^delete (.*?)=>(.*?)$/
|
99
|
+
arr = [
|
100
|
+
line.gsub(/^(\w*?) (.*?)=>(.*?)$/ , '\1').strip.gsub('"', '').gsub("'", ''),
|
101
|
+
line.gsub(/^(\w*?) (.*?)=>(.*?)$/ , '\2').strip.gsub('"', '').gsub("'", ''),
|
102
|
+
line.gsub(/^(\w*?) (.*?)=>(.*?)$/ , '\3').strip.gsub('"', '').gsub("'", '')
|
103
|
+
]
|
104
|
+
arr[1] = "/#{arr[1]}" if !arr[1].starts_with?('/')
|
105
|
+
return arr
|
106
|
+
end
|
107
|
+
return nil
|
108
|
+
end
|
109
|
+
|
110
|
+
def CommentRoutes.in_routes_array(route, routes_array)
|
111
|
+
return false if route.nil? || route.count < 3
|
112
|
+
routes_array.each do |route2|
|
113
|
+
next if route2.nil? || route2.count < 3
|
114
|
+
return true if route[0] == route2[0] && route[1] == route2[1] && route[2] == route2[2]
|
115
|
+
end
|
116
|
+
return false
|
117
|
+
end
|
118
|
+
|
119
|
+
def CommentRoutes.compare_routes
|
120
|
+
|
121
|
+
routes_in_routes_file = []
|
122
|
+
file = File.open(Rails.root.join('config', 'routes.rb'), "r")
|
123
|
+
file.each_line do |line|
|
124
|
+
line = line.strip
|
125
|
+
routes_in_routes_file << self.split_route(line)
|
126
|
+
end
|
127
|
+
|
128
|
+
routes_in_controllers = []
|
129
|
+
self.controller_routes.split("\n").each do |route|
|
130
|
+
route = route.strip
|
131
|
+
next if route.length == 0
|
132
|
+
routes_in_controllers << self.split_route(route)
|
133
|
+
end
|
134
|
+
|
135
|
+
all_routes = []
|
136
|
+
|
137
|
+
# See what routes are in the controller routes but not in routes file
|
138
|
+
routes_not_in_routes_file = []
|
139
|
+
routes_in_controllers.each do |route|
|
140
|
+
next if route.nil? || route.count != 3
|
141
|
+
all_routes << [route[0], route[1], route[2], 'Y', self.in_routes_array(route, routes_in_routes_file) ? 'Y' : '']
|
142
|
+
end
|
143
|
+
|
144
|
+
# See what routes are in the routes file but not in the controllers
|
145
|
+
routes_not_in_controllers = []
|
146
|
+
routes_in_routes_file.each do |route|
|
147
|
+
next if route.nil? || route.count != 3
|
148
|
+
if !self.in_routes_array(route, all_routes)
|
149
|
+
all_routes << [route[0], route[1], route[2], '', 'Y']
|
150
|
+
end
|
151
|
+
end
|
152
|
+
|
153
|
+
lengths = [0, 0, 0]
|
154
|
+
all_routes.each do |route|
|
155
|
+
lengths[0] = route[0].length if route[0].length > lengths[0]
|
156
|
+
lengths[1] = route[1].length if route[1].length > lengths[1]
|
157
|
+
lengths[2] = route[2].length if route[2].length > lengths[2]
|
158
|
+
end
|
159
|
+
|
160
|
+
puts "#{"Verb".ljust(lengths[0], ' ')} #{"URI".ljust(lengths[1], ' ')} #{"Action".ljust(lengths[2], ' ')} #{"In Controller".ljust(14, ' ')} #{"In Routes File".ljust(14, ' ')}"
|
161
|
+
puts "#{"".ljust(lengths[0], '-')} #{"".ljust(lengths[1], '-')} #{"".ljust(lengths[2], '-')} #{"".ljust(14, '-')} #{"".ljust(14, '-')}"
|
162
|
+
all_routes.each do |route|
|
163
|
+
next if route[3] == 'Y' && route[4] == 'Y'
|
164
|
+
puts "#{route[0].ljust(lengths[0], ' ')} #{route[1].ljust(lengths[1], ' ')} #{route[2].ljust(lengths[2], ' ')} #{route[3].ljust(14, ' ')} #{route[4].ljust(14, ' ')}"
|
165
|
+
end
|
166
|
+
puts "\n"
|
167
|
+
|
168
|
+
end
|
82
169
|
|
83
170
|
end
|
84
171
|
end
|
@@ -32,7 +32,10 @@ module Caboose
|
|
32
32
|
:category_id ,
|
33
33
|
:option1 ,
|
34
34
|
:option2 ,
|
35
|
-
:option3 ,
|
35
|
+
:option3 ,
|
36
|
+
:option1_media ,
|
37
|
+
:option2_media ,
|
38
|
+
:option3_media ,
|
36
39
|
:default1 ,
|
37
40
|
:default2 ,
|
38
41
|
:default3 ,
|
@@ -159,14 +162,32 @@ module Caboose
|
|
159
162
|
self.variants.where(:status => 'Active').reorder(:option1_sort_order).pluck(:option1).uniq.reject { |x| x.nil? || x.empty? }
|
160
163
|
end
|
161
164
|
|
165
|
+
def option1_values_with_media
|
166
|
+
h = {}
|
167
|
+
self.variants.where("status = ? and option1 is not null", 'Active').reorder(:option1_sort_order).each{ |v| h[v.option1] = v.option1_media }
|
168
|
+
return h
|
169
|
+
end
|
170
|
+
|
162
171
|
def option2_values
|
163
172
|
self.variants.where(:status => 'Active').reorder(:option2_sort_order).pluck(:option2).uniq.reject { |x| x.nil? || x.empty? }
|
164
173
|
end
|
165
174
|
|
175
|
+
def option2_values_with_media
|
176
|
+
h = {}
|
177
|
+
self.variants.where("status = ? and option2 is not null", 'Active').reorder(:option2_sort_order).each{ |v| h[v.option2] = v.option2_media }
|
178
|
+
return h
|
179
|
+
end
|
180
|
+
|
166
181
|
def option3_values
|
167
182
|
self.variants.where(:status => 'Active').reorder(:option3_sort_order).pluck(:option3).uniq.reject { |x| x.nil? || x.empty? }
|
168
183
|
end
|
169
184
|
|
185
|
+
def option3_values_with_media
|
186
|
+
h = {}
|
187
|
+
self.variants.where("status = ? and option3 is not null", 'Active').reorder(:option3_sort_order).each{ |v| h[v.option3] = v.option3_media }
|
188
|
+
return h
|
189
|
+
end
|
190
|
+
|
170
191
|
def toggle_category(cat_id, value)
|
171
192
|
if value.to_i > 0 # Add to category
|
172
193
|
if cat_id == 'all'
|
@@ -562,6 +562,9 @@ class Caboose::Schema < Caboose::Utilities::Schema
|
|
562
562
|
[ :option1 , :string ],
|
563
563
|
[ :option2 , :string ],
|
564
564
|
[ :option3 , :string ],
|
565
|
+
[ :option1_media , :boolean , { :default => false }],
|
566
|
+
[ :option2_media , :boolean , { :default => false }],
|
567
|
+
[ :option3_media , :boolean , { :default => false }],
|
565
568
|
[ :category_id , :integer ],
|
566
569
|
[ :status , :string ],
|
567
570
|
[ :default1 , :string ],
|
@@ -799,11 +802,13 @@ class Caboose::Schema < Caboose::Utilities::Schema
|
|
799
802
|
[ :alternate_id , :string ],
|
800
803
|
[ :sku , :string ],
|
801
804
|
[ :barcode , :string ],
|
802
|
-
[ :
|
805
|
+
[ :cost , :decimal , { :precision => 8, :scale => 2, :default => 0.00 }],
|
806
|
+
[ :price , :decimal , { :precision => 8, :scale => 2, :default => 0.00 }],
|
803
807
|
[ :sale_price , :decimal , { :precision => 8, :scale => 2 }],
|
804
808
|
[ :date_sale_starts , :datetime ],
|
805
809
|
[ :date_sale_ends , :datetime ],
|
806
810
|
[ :date_sale_end , :datetime ],
|
811
|
+
[ :clearance , :boolean , { :default => false }],
|
807
812
|
[ :available , :boolean , { :default => true }],
|
808
813
|
[ :quantity_in_stock , :integer , { :default => 0 }],
|
809
814
|
[ :ignore_quantity , :boolean , { :default => false }],
|
@@ -816,7 +821,10 @@ class Caboose::Schema < Caboose::Utilities::Schema
|
|
816
821
|
[ :cylinder , :boolean , { :default => false }],
|
817
822
|
[ :option1 , :string ],
|
818
823
|
[ :option2 , :string ],
|
819
|
-
[ :option3 , :string ],
|
824
|
+
[ :option3 , :string ],
|
825
|
+
[ :option1_media_id , :integer ],
|
826
|
+
[ :option2_media_id , :integer ],
|
827
|
+
[ :option3_media_id , :integer ],
|
820
828
|
[ :requires_shipping , :boolean , { :default => true }],
|
821
829
|
[ :taxable , :boolean , { :default => true }],
|
822
830
|
[ :shipping_unit_value , :numeric ],
|
@@ -13,15 +13,20 @@ module Caboose
|
|
13
13
|
has_many :product_images, :through => :product_image_variants
|
14
14
|
belongs_to :flat_rate_shipping_method, :class_name => 'Caboose::ShippingMethod'
|
15
15
|
belongs_to :flat_rate_shipping_package, :class_name => 'Caboose::ShippingPackage'
|
16
|
+
belongs_to :option1_media, :class_name => 'Caboose::Media'
|
17
|
+
belongs_to :option2_media, :class_name => 'Caboose::Media'
|
18
|
+
belongs_to :option3_media, :class_name => 'Caboose::Media'
|
16
19
|
|
17
20
|
attr_accessible :id,
|
18
21
|
:alternate_id,
|
19
22
|
:product_id,
|
20
23
|
:barcode, # Returns the barcode value of the variant.
|
24
|
+
:cost, # Cost of goods (don't show to customer)
|
21
25
|
:price, # Variant’s price.
|
22
26
|
:sale_price,
|
23
27
|
:date_sale_starts,
|
24
28
|
:date_sale_end,
|
29
|
+
:clearance,
|
25
30
|
:ignore_quantity,
|
26
31
|
:quantity,
|
27
32
|
:quantity_in_stock,
|
@@ -33,7 +38,13 @@ module Caboose
|
|
33
38
|
:height, # Height of variant in inches
|
34
39
|
:option1, # Returns the value of option1 for given variant
|
35
40
|
:option2, # If a product has a second option defined, then returns the value of this variant's option2.
|
36
|
-
:option3, # If a product has a third option defined, then returns the value of this variant's option3.
|
41
|
+
:option3, # If a product has a third option defined, then returns the value of this variant's option3.
|
42
|
+
:option1_color,
|
43
|
+
:option2_color,
|
44
|
+
:option3_color,
|
45
|
+
:option1_media_id,
|
46
|
+
:option2_media_id,
|
47
|
+
:option3_media_id,
|
37
48
|
:requires_shipping, # Returns true if the variant is shippable or false if it is a service or a digital good.
|
38
49
|
:taxable, # Returns true if the variant is taxable or false if it is not.
|
39
50
|
:sku,
|
@@ -1,8 +1,10 @@
|
|
1
|
-
<% if @user %>
|
1
|
+
<% if @user && @user.site %>
|
2
2
|
<%
|
3
|
-
|
3
|
+
site = @user.site
|
4
|
+
pd = site.primary_domain
|
5
|
+
url = "#{pd.domain}/modal/login/reset-password/#{@user.password_reset_id}"
|
4
6
|
%>
|
5
|
-
<p>To reset your <%=
|
7
|
+
<p>To reset your <%= site.name %> website password, click the link below:</p>
|
6
8
|
<p><a href='<%= url %>'><%= url %></p>
|
7
9
|
<% end %>
|
8
10
|
|
@@ -18,9 +18,9 @@ may_delete3 = p.variants.collect{|v| v.option3 }.uniq.count == 1
|
|
18
18
|
</p>
|
19
19
|
|
20
20
|
<table>
|
21
|
-
<tr><td><div id='product_<%= p.id %>_option1'></div></td><td><div id='product_<%= p.id %>_default1'></div></td></tr>
|
22
|
-
<tr><td><div id='product_<%= p.id %>_option2'></div></td><td><div id='product_<%= p.id %>_default2'></div></td></tr>
|
23
|
-
<tr><td><div id='product_<%= p.id %>_option3'></div></td><td><div id='product_<%= p.id %>_default3'></div></td></tr>
|
21
|
+
<tr><td><div id='product_<%= p.id %>_option1'></div></td><td><div id='product_<%= p.id %>_default1'></div></td><td><div id='product_<%= p.id %>_option1_media'></div></td></tr>
|
22
|
+
<tr><td><div id='product_<%= p.id %>_option2'></div></td><td><div id='product_<%= p.id %>_default2'></div></td><td><div id='product_<%= p.id %>_option2_media'></div></td></tr>
|
23
|
+
<tr><td><div id='product_<%= p.id %>_option3'></div></td><td><div id='product_<%= p.id %>_default3'></div></td><td><div id='product_<%= p.id %>_option3_media'></div></td></tr>
|
24
24
|
</table>
|
25
25
|
|
26
26
|
<h2>Modifications</h2>
|
@@ -41,18 +41,24 @@ may_delete3 = p.variants.collect{|v| v.option3 }.uniq.count == 1
|
|
41
41
|
|
42
42
|
var mods_controller = false;
|
43
43
|
$(document).ready(function() {
|
44
|
+
console.log(<%= raw p.option1_media %>);
|
45
|
+
console.log(<%= raw p.option2_media %>);
|
46
|
+
console.log(<%= raw p.option3_media %>);
|
44
47
|
m = new ModelBinder({
|
45
48
|
name: 'Product',
|
46
49
|
id: <%= p.id %>,
|
47
50
|
update_url: '/admin/products/<%= p.id %>',
|
48
51
|
authenticity_token: '<%= form_authenticity_token %>',
|
49
52
|
attributes: [
|
50
|
-
{ name: 'option1'
|
51
|
-
{ name: 'option2'
|
52
|
-
{ name: 'option3'
|
53
|
-
{ name: '
|
54
|
-
{ name: '
|
55
|
-
{ name: '
|
53
|
+
{ name: 'option1' , nice_name: 'Option 1' , type: 'text' , value: <%= raw Caboose.json(p.option1) %>, width: 250, fixed_placeholder: true },
|
54
|
+
{ name: 'option2' , nice_name: 'Option 2' , type: 'text' , value: <%= raw Caboose.json(p.option2) %>, width: 250, fixed_placeholder: true },
|
55
|
+
{ name: 'option3' , nice_name: 'Option 3' , type: 'text' , value: <%= raw Caboose.json(p.option3) %>, width: 250, fixed_placeholder: true },
|
56
|
+
{ name: 'option1_media' , nice_name: 'Uses Image' , type: 'checkbox' , value: <%= raw Caboose.json(p.option1_media) %>, width: 150, fixed_placeholder: true, align: 'right' },
|
57
|
+
{ name: 'option2_media' , nice_name: 'Uses Image' , type: 'checkbox' , value: <%= raw Caboose.json(p.option2_media) %>, width: 150, fixed_placeholder: true, align: 'right' },
|
58
|
+
{ name: 'option3_media' , nice_name: 'Uses Image' , type: 'checkbox' , value: <%= raw Caboose.json(p.option3_media) %>, width: 150, fixed_placeholder: true, align: 'right' },
|
59
|
+
{ name: 'default1' , nice_name: 'Default value' , type: 'text' , value: <%= raw Caboose.json(p.default1) %>, width: 285, fixed_placeholder: true },
|
60
|
+
{ name: 'default2' , nice_name: 'Default value' , type: 'text' , value: <%= raw Caboose.json(p.default2) %>, width: 285, fixed_placeholder: true },
|
61
|
+
{ name: 'default3' , nice_name: 'Default value' , type: 'text' , value: <%= raw Caboose.json(p.default3) %>, width: 285, fixed_placeholder: true }
|
56
62
|
]
|
57
63
|
});
|
58
64
|
|
@@ -20,7 +20,8 @@ v = @variant
|
|
20
20
|
<h2>Inventory</h2>
|
21
21
|
<div id='variant_<%= v.id %>_alternate_id' ></div>
|
22
22
|
<div id='variant_<%= v.id %>_sku' ></div>
|
23
|
-
<div id='variant_<%= v.id %>_barcode' ></div>
|
23
|
+
<div id='variant_<%= v.id %>_barcode' ></div>
|
24
|
+
<div id='variant_<%= v.id %>_cost' ></div>
|
24
25
|
<div id='variant_<%= v.id %>_price' ></div>
|
25
26
|
<div id='variant_<%= v.id %>_quantity_in_stock' ></div>
|
26
27
|
<div id='variant_<%= v.id %>_ignore_quantity' ></div>
|
@@ -37,7 +38,8 @@ v = @variant
|
|
37
38
|
<div id='variant_<%= v.id %>_date_sale_starts' ></div>
|
38
39
|
<div id='variant_<%= v.id %>_time_sale_starts' ></div>
|
39
40
|
<div id='variant_<%= v.id %>_date_sale_ends' ></div>
|
40
|
-
<div id='variant_<%= v.id %>_time_sale_ends' ></div>
|
41
|
+
<div id='variant_<%= v.id %>_time_sale_ends' ></div>
|
42
|
+
<div id='variant_<%= v.id %>_clearance' ></div>
|
41
43
|
</td>
|
42
44
|
<td valign='top' colspan='4'4>
|
43
45
|
<h2>Flat Rate Shipping</h2>
|
@@ -75,11 +77,13 @@ $(document).ready(function() {
|
|
75
77
|
<% if p.option3 %>{ name: 'option3' , nice_name: <%= raw Caboose.json(p.option3) %> , type: 'text' , align: 'right' , width: 250, value: <%= raw Caboose.json(v.option3 ) %> },<% end %>
|
76
78
|
{ name: 'alternate_id' , nice_name: 'Alternate ID' , type: 'text' , align: 'right' , width: 250, value: <%= raw Caboose.json(v.alternate_id ) %> },
|
77
79
|
{ name: 'sku' , nice_name: 'SKU' , type: 'text' , align: 'right' , width: 250, value: <%= raw Caboose.json(v.sku ) %> },
|
78
|
-
{ name: 'barcode' , nice_name: 'Barcode' , type: 'text' , align: 'right' , width: 250, value: <%= raw Caboose.json(v.barcode ) %> },
|
80
|
+
{ name: 'barcode' , nice_name: 'Barcode' , type: 'text' , align: 'right' , width: 250, value: <%= raw Caboose.json(v.barcode ) %> },
|
81
|
+
{ name: 'cost' , nice_name: 'Cost of Goods' , type: 'text' , align: 'right' , width: 250, value: <%= raw Caboose.json(sprintf("%.2f", v.cost) ) %> },
|
79
82
|
{ name: 'price' , nice_name: 'Price' , type: 'text' , align: 'right' , width: 250, value: <%= raw Caboose.json(sprintf("%.2f", v.price) ) %> },
|
80
83
|
{ name: 'sale_price' , nice_name: 'Sale price' , type: 'text' , align: 'right' , width: 175, value: <%= raw Caboose.json(v.sale_price ) %> },
|
81
84
|
{ name: 'date_sale_starts' , nice_name: 'Sale starts' , type: 'datetime' , align: 'right' , width: 175, value: <%= raw Caboose.json(v.date_sale_starts ? v.date_sale_starts.in_time_zone(@logged_in_user.timezone).strftime('%m/%d/%Y %I:%M %P') : '') %> },
|
82
|
-
{ name: 'date_sale_ends' , nice_name: 'Sale ends' , type: 'datetime' , align: 'right' , width: 175, value: <%= raw Caboose.json(v.date_sale_ends ? v.date_sale_ends.in_time_zone(@logged_in_user.timezone).strftime('%m/%d/%Y %I:%M %P') : '') %> },
|
85
|
+
{ name: 'date_sale_ends' , nice_name: 'Sale ends' , type: 'datetime' , align: 'right' , width: 175, value: <%= raw Caboose.json(v.date_sale_ends ? v.date_sale_ends.in_time_zone(@logged_in_user.timezone).strftime('%m/%d/%Y %I:%M %P') : '') %> },
|
86
|
+
{ name: 'clearance' , nice_name: 'On Clearance' , type: 'checkbox' , align: 'right' , width: 175, value: <%= raw Caboose.json(v.clearance ) %> },
|
83
87
|
{ name: 'quantity_in_stock' , nice_name: 'Quantity' , type: 'text' , align: 'right' , width: 250, value: <%= raw Caboose.json(v.quantity_in_stock ) %> },
|
84
88
|
{ name: 'ignore_quantity' , nice_name: 'Ignore Quantity' , type: 'checkbox' , align: 'right' , width: 250, value: <%= raw Caboose.json(v.ignore_quantity ) %> },
|
85
89
|
{ name: 'weight' , nice_name: 'Weight (<%= sc.weight_unit %>)' , type: 'text' , align: 'right' , width: 175, value: <%= raw Caboose.json(v.weight ) %> },
|
@@ -0,0 +1,94 @@
|
|
1
|
+
<%
|
2
|
+
config = YAML.load(File.read(Rails.root.join('config', 'aws.yml')))[Rails.env]
|
3
|
+
access_key = config['access_key_id']
|
4
|
+
secret_key = config['secret_access_key']
|
5
|
+
bucket = config['bucket']
|
6
|
+
policy = {
|
7
|
+
"expiration" => 1.hour.from_now.utc.xmlschema,
|
8
|
+
"conditions" => [
|
9
|
+
{ "bucket" => "#{bucket}-uploads" },
|
10
|
+
{ "acl" => "public-read" },
|
11
|
+
[ "starts-with", "$key", '' ],
|
12
|
+
#[ "starts-with", "$Content-Type", 'image/' ],
|
13
|
+
[ 'starts-with', '$name', '' ],
|
14
|
+
[ 'starts-with', '$Filename', '' ],
|
15
|
+
]
|
16
|
+
}
|
17
|
+
@policy = Base64.encode64(policy.to_json).gsub(/\n/,'')
|
18
|
+
@signature = Base64.encode64(OpenSSL::HMAC.digest(OpenSSL::Digest::Digest.new('sha1'), secret_key, @policy)).gsub("\n","")
|
19
|
+
@s3_upload_url = "https://#{bucket}-uploads.s3.amazonaws.com/"
|
20
|
+
@aws_access_key_id = access_key
|
21
|
+
@top_media_category = Caboose::MediaCategory.top_category(@site.id)
|
22
|
+
|
23
|
+
%>
|
24
|
+
<div id='left_content'>
|
25
|
+
<div id='categories'></div>
|
26
|
+
</div>
|
27
|
+
<div id='right_content'>
|
28
|
+
<div id='controls'></div>
|
29
|
+
<div id='uploader'></div>
|
30
|
+
<div id='media'></div>
|
31
|
+
</div>
|
32
|
+
|
33
|
+
<p style='clear: both;'> </p>
|
34
|
+
<p>
|
35
|
+
<input type='button' value='Close' onclick="parent.location.reload(true); modal.close();" />
|
36
|
+
<input type='button' value='Manage Media' onclick="parent.window.location='/admin/media';" />
|
37
|
+
</p>
|
38
|
+
|
39
|
+
<% content_for :caboose_css do %>
|
40
|
+
<%= stylesheet_link_tag 'caboose/admin_block_edit_image' %>
|
41
|
+
<%= stylesheet_link_tag 'plupload/jquery.ui.plupload/css/jquery.ui.plupload.css' %>
|
42
|
+
<% end %>
|
43
|
+
|
44
|
+
<% content_for :caboose_js do %>
|
45
|
+
<%= javascript_include_tag "caboose/model/all" %>
|
46
|
+
<%= javascript_include_tag "caboose/media_browser" %>
|
47
|
+
<%= javascript_include_tag 'caboose/jquery-ui.drag-multiple.min.js' %>
|
48
|
+
|
49
|
+
<%= javascript_include_tag 'plupload/plupload.full.min.js' %>
|
50
|
+
<%= javascript_include_tag 'plupload/jquery.ui.plupload/jquery.ui.plupload.js' %>
|
51
|
+
<%
|
52
|
+
#javascript_include_tag 'plupload/moxie.js'
|
53
|
+
#javascript_include_tag 'plupload/plupload.dev.js'
|
54
|
+
#javascript_include_tag 'plupload/jquery.ui.plupload/jquery.ui.plupload.js'
|
55
|
+
%>
|
56
|
+
|
57
|
+
<script type='text/javascript'>
|
58
|
+
|
59
|
+
var modal = false;
|
60
|
+
$(window).load(function() {
|
61
|
+
modal = new CabooseModal(900);
|
62
|
+
});
|
63
|
+
|
64
|
+
var controller = false;
|
65
|
+
$(document).ready(function() {
|
66
|
+
b = new MediaBrowser({
|
67
|
+
media_id: <% if @media %><%= @media.id %><% else %>false<% end %>,
|
68
|
+
authenticity_token: '<%= form_authenticity_token %>',
|
69
|
+
top_cat_id: <%= raw Caboose.json(@top_media_category.id) %>,
|
70
|
+
cat_id: <% if @media %><%= @media.media_category_id %><% else %><%= @top_media_category.id %><% end %>,
|
71
|
+
s3_upload_url: '<%= raw @s3_upload_url %>',
|
72
|
+
aws_access_key_id: '<%= raw @aws_access_key_id %>',
|
73
|
+
policy: '<%= raw @policy %>',
|
74
|
+
signature: '<%= raw @signature %>',
|
75
|
+
refresh_unprocessed_images: false,
|
76
|
+
select_media: function(browser, media_id) {
|
77
|
+
$.ajax({
|
78
|
+
url: '/admin/products/<%= @product.id %>/variants/bulk',
|
79
|
+
type: 'put',
|
80
|
+
data: {
|
81
|
+
model_ids: <%= raw Caboose.json(@variants.collect{ |v| v.id }) %>,
|
82
|
+
option1_media_id: media_id
|
83
|
+
},
|
84
|
+
success: function(resp) {
|
85
|
+
parent.location.reload(true);
|
86
|
+
modal.close();
|
87
|
+
}
|
88
|
+
});
|
89
|
+
},
|
90
|
+
});
|
91
|
+
});
|
92
|
+
|
93
|
+
</script>
|
94
|
+
<% end %>
|