shoppe 0.0.14 → 0.0.15
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/javascripts/shoppe/application.coffee +57 -1
- data/app/assets/javascripts/shoppe/mousetrap.js +9 -0
- data/app/assets/stylesheets/shoppe/application.scss +70 -59
- data/app/assets/stylesheets/shoppe/dialog.scss +10 -0
- data/app/assets/stylesheets/shoppe/sub.scss +15 -0
- data/app/controllers/shoppe/application_controller.rb +13 -1
- data/app/controllers/shoppe/attachments_controller.rb +10 -8
- data/app/controllers/shoppe/dashboard_controller.rb +6 -4
- data/app/controllers/shoppe/delivery_service_prices_controller.rb +33 -31
- data/app/controllers/shoppe/delivery_services_controller.rb +34 -32
- data/app/controllers/shoppe/orders_controller.rb +40 -38
- data/app/controllers/shoppe/product_categories_controller.rb +34 -32
- data/app/controllers/shoppe/products_controller.rb +32 -44
- data/app/controllers/shoppe/sessions_controller.rb +24 -22
- data/app/controllers/shoppe/stock_level_adjustments_controller.rb +40 -0
- data/app/controllers/shoppe/tax_rates_controller.rb +35 -33
- data/app/controllers/shoppe/users_controller.rb +40 -33
- data/app/controllers/shoppe/variants_controller.rb +50 -0
- data/app/helpers/shoppe/shoppe_helper.rb +2 -2
- data/app/mailers/shoppe/order_mailer.rb +20 -18
- data/app/models/shoppe/country.rb +1 -1
- data/app/models/shoppe/delivery_service.rb +17 -15
- data/app/models/shoppe/delivery_service_price.rb +18 -16
- data/app/models/shoppe/order.rb +293 -290
- data/app/models/shoppe/order_item.rb +115 -113
- data/app/models/shoppe/product.rb +76 -54
- data/app/models/shoppe/product/product_attributes.rb +12 -10
- data/app/models/shoppe/product/variants.rb +26 -0
- data/app/models/shoppe/product_attribute.rb +40 -38
- data/app/models/shoppe/product_category.rb +16 -14
- data/app/models/shoppe/stock_level_adjustment.rb +1 -2
- data/app/models/shoppe/tax_rate.rb +2 -2
- data/app/models/shoppe/user.rb +34 -32
- data/app/views/shoppe/orders/index.html.haml +3 -4
- data/app/views/shoppe/orders/show.html.haml +5 -5
- data/app/views/shoppe/products/_form.html.haml +28 -27
- data/app/views/shoppe/products/_table.html.haml +42 -0
- data/app/views/shoppe/products/edit.html.haml +2 -1
- data/app/views/shoppe/products/index.html.haml +1 -24
- data/app/views/shoppe/shared/error.html.haml +4 -0
- data/app/views/shoppe/{products/stock_levels.html.haml → stock_level_adjustments/index.html.haml} +12 -6
- data/app/views/shoppe/variants/form.html.haml +64 -0
- data/app/views/shoppe/variants/index.html.haml +33 -0
- data/config/routes.rb +2 -1
- data/config/shoppe.example.yml +16 -2
- data/db/migrate/20131022090919_refactor_order_items_to_allow_any_product.rb +6 -0
- data/db/migrate/20131022092904_rename_product_title_to_name.rb +5 -0
- data/db/migrate/20131022093538_stock_level_adjustments_should_be_polymorphic.rb +6 -0
- data/db/migrate/20131022135331_add_parent_id_to_products.rb +5 -0
- data/db/migrate/20131022145653_cost_price_should_be_default_to_zero.rb +9 -0
- data/db/seeds.rb +20 -20
- data/lib/shoppe.rb +2 -0
- data/lib/shoppe/errors/not_enough_stock.rb +1 -1
- data/lib/shoppe/errors/unorderable_item.rb +11 -0
- data/lib/shoppe/orderable_item.rb +39 -0
- data/lib/shoppe/version.rb +1 -1
- data/test/dummy/db/schema.rb +14 -11
- data/test/dummy/log/development.log +75 -0
- metadata +37 -5
@@ -1,7 +1,9 @@
|
|
1
1
|
#= require jquery
|
2
2
|
#= require jquery_ujs
|
3
|
+
#= require shoppe/mousetrap
|
3
4
|
#= require shoppe/jquery_ui
|
4
5
|
#= require shoppe/chosen.jquery
|
6
|
+
#= require nifty/dialog
|
5
7
|
#= require_tree .
|
6
8
|
|
7
9
|
$ ->
|
@@ -39,4 +41,58 @@ $ ->
|
|
39
41
|
|
40
42
|
# Chosen
|
41
43
|
$('select.chosen').chosen()
|
42
|
-
$('select.chosen-with-deselect').chosen({allow_single_deselect: true})
|
44
|
+
$('select.chosen-with-deselect').chosen({allow_single_deselect: true})
|
45
|
+
|
46
|
+
# Open AJAX dialogs
|
47
|
+
$('a[rel=dialog]').on 'click', ->
|
48
|
+
element = $(this)
|
49
|
+
options = {}
|
50
|
+
options.width = element.data('dialog-width') if element.data('dialog-width')
|
51
|
+
options.offset = element.data('dialog-offset') if element.data('dialog-offset')
|
52
|
+
options.behavior = element.data('dialog-behavior') if element.data('dialog-behavior')
|
53
|
+
options.id = 'ajax'
|
54
|
+
options.url = element.attr('href')
|
55
|
+
Nifty.Dialog.open(options)
|
56
|
+
false
|
57
|
+
|
58
|
+
#
|
59
|
+
# Stock Level Adjustment dialog beavior
|
60
|
+
#
|
61
|
+
Nifty.Dialog.addBehavior
|
62
|
+
name: 'stockLevelAdjustments'
|
63
|
+
onLoad: (dialog,options)->
|
64
|
+
$('input[type=text]:first', dialog).focus()
|
65
|
+
$(dialog).on 'submit', 'form', ->
|
66
|
+
form = $(this)
|
67
|
+
$.ajax
|
68
|
+
url: form.attr('action')
|
69
|
+
method: 'POST'
|
70
|
+
data: form.serialize()
|
71
|
+
dataType: 'text'
|
72
|
+
success: (data)->
|
73
|
+
$('div.table', dialog).replaceWith(data)
|
74
|
+
$('input[type=text]:first', dialog).focus()
|
75
|
+
error: (xhr)->
|
76
|
+
if xhr.status == 422
|
77
|
+
alert xhr.responseText
|
78
|
+
else
|
79
|
+
alert 'An error occurred while saving the stock level.'
|
80
|
+
false
|
81
|
+
$(dialog).on 'click', 'nav.pagination a', ->
|
82
|
+
$.ajax
|
83
|
+
url: $(this).attr('href')
|
84
|
+
success: (data)->
|
85
|
+
$('div.table', dialog).replaceWith(data)
|
86
|
+
false
|
87
|
+
|
88
|
+
#
|
89
|
+
# Always fire keyboard shortcuts when focused on fields
|
90
|
+
#
|
91
|
+
Mousetrap.stopCallback = -> false
|
92
|
+
|
93
|
+
#
|
94
|
+
# Close dialogs on escape
|
95
|
+
#
|
96
|
+
Mousetrap.bind 'escape', ->
|
97
|
+
Nifty.Dialog.closeTopDialog()
|
98
|
+
false
|
@@ -0,0 +1,9 @@
|
|
1
|
+
/* mousetrap v1.4.5 craig.is/killing/mice */
|
2
|
+
(function(J,r,f){function s(a,b,c){a.addEventListener?a.addEventListener(b,c,!1):a.attachEvent("on"+b,c)}function A(a){if("keypress"==a.type){var b=String.fromCharCode(a.which);a.shiftKey||(b=b.toLowerCase());return b}return h[a.which]?h[a.which]:B[a.which]?B[a.which]:String.fromCharCode(a.which).toLowerCase()}function t(a){a=a||{};var b=!1,c;for(c in n)a[c]?b=!0:n[c]=0;b||(u=!1)}function C(a,b,c,d,e,v){var g,k,f=[],h=c.type;if(!l[a])return[];"keyup"==h&&w(a)&&(b=[a]);for(g=0;g<l[a].length;++g)if(k=
|
3
|
+
l[a][g],!(!d&&k.seq&&n[k.seq]!=k.level||h!=k.action||("keypress"!=h||c.metaKey||c.ctrlKey)&&b.sort().join(",")!==k.modifiers.sort().join(","))){var m=d&&k.seq==d&&k.level==v;(!d&&k.combo==e||m)&&l[a].splice(g,1);f.push(k)}return f}function K(a){var b=[];a.shiftKey&&b.push("shift");a.altKey&&b.push("alt");a.ctrlKey&&b.push("ctrl");a.metaKey&&b.push("meta");return b}function x(a,b,c){m.stopCallback(b,b.target||b.srcElement,c)||!1!==a(b,c)||(b.preventDefault&&b.preventDefault(),b.stopPropagation&&b.stopPropagation(),
|
4
|
+
b.returnValue=!1,b.cancelBubble=!0)}function y(a){"number"!==typeof a.which&&(a.which=a.keyCode);var b=A(a);b&&("keyup"==a.type&&z===b?z=!1:m.handleKey(b,K(a),a))}function w(a){return"shift"==a||"ctrl"==a||"alt"==a||"meta"==a}function L(a,b,c,d){function e(b){return function(){u=b;++n[a];clearTimeout(D);D=setTimeout(t,1E3)}}function v(b){x(c,b,a);"keyup"!==d&&(z=A(b));setTimeout(t,10)}for(var g=n[a]=0;g<b.length;++g){var f=g+1===b.length?v:e(d||E(b[g+1]).action);F(b[g],f,d,a,g)}}function E(a,b){var c,
|
5
|
+
d,e,f=[];c="+"===a?["+"]:a.split("+");for(e=0;e<c.length;++e)d=c[e],G[d]&&(d=G[d]),b&&"keypress"!=b&&H[d]&&(d=H[d],f.push("shift")),w(d)&&f.push(d);c=d;e=b;if(!e){if(!p){p={};for(var g in h)95<g&&112>g||h.hasOwnProperty(g)&&(p[h[g]]=g)}e=p[c]?"keydown":"keypress"}"keypress"==e&&f.length&&(e="keydown");return{key:d,modifiers:f,action:e}}function F(a,b,c,d,e){q[a+":"+c]=b;a=a.replace(/\s+/g," ");var f=a.split(" ");1<f.length?L(a,f,b,c):(c=E(a,c),l[c.key]=l[c.key]||[],C(c.key,c.modifiers,{type:c.action},
|
6
|
+
d,a,e),l[c.key][d?"unshift":"push"]({callback:b,modifiers:c.modifiers,action:c.action,seq:d,level:e,combo:a}))}var h={8:"backspace",9:"tab",13:"enter",16:"shift",17:"ctrl",18:"alt",20:"capslock",27:"esc",32:"space",33:"pageup",34:"pagedown",35:"end",36:"home",37:"left",38:"up",39:"right",40:"down",45:"ins",46:"del",91:"meta",93:"meta",224:"meta"},B={106:"*",107:"+",109:"-",110:".",111:"/",186:";",187:"=",188:",",189:"-",190:".",191:"/",192:"`",219:"[",220:"\\",221:"]",222:"'"},H={"~":"`","!":"1",
|
7
|
+
"@":"2","#":"3",$:"4","%":"5","^":"6","&":"7","*":"8","(":"9",")":"0",_:"-","+":"=",":":";",'"':"'","<":",",">":".","?":"/","|":"\\"},G={option:"alt",command:"meta","return":"enter",escape:"esc",mod:/Mac|iPod|iPhone|iPad/.test(navigator.platform)?"meta":"ctrl"},p,l={},q={},n={},D,z=!1,I=!1,u=!1;for(f=1;20>f;++f)h[111+f]="f"+f;for(f=0;9>=f;++f)h[f+96]=f;s(r,"keypress",y);s(r,"keydown",y);s(r,"keyup",y);var m={bind:function(a,b,c){a=a instanceof Array?a:[a];for(var d=0;d<a.length;++d)F(a[d],b,c);return this},
|
8
|
+
unbind:function(a,b){return m.bind(a,function(){},b)},trigger:function(a,b){if(q[a+":"+b])q[a+":"+b]({},a);return this},reset:function(){l={};q={};return this},stopCallback:function(a,b){return-1<(" "+b.className+" ").indexOf(" mousetrap ")?!1:"INPUT"==b.tagName||"SELECT"==b.tagName||"TEXTAREA"==b.tagName||b.isContentEditable},handleKey:function(a,b,c){var d=C(a,b,c),e;b={};var f=0,g=!1;for(e=0;e<d.length;++e)d[e].seq&&(f=Math.max(f,d[e].level));for(e=0;e<d.length;++e)d[e].seq?d[e].level==f&&(g=!0,
|
9
|
+
b[d[e].seq]=1,x(d[e].callback,c,d[e].combo)):g||x(d[e].callback,c,d[e].combo);d="keypress"==c.type&&I;c.type!=u||w(a)||d||t(b);I=g&&"keydown"==c.type}};J.Mousetrap=m;"function"===typeof define&&define.amd&&define(m)})(window,document);
|
@@ -2,6 +2,8 @@
|
|
2
2
|
*= require shoppe/reset
|
3
3
|
*= require shoppe/elements
|
4
4
|
*= require shoppe/chosen
|
5
|
+
*= require nifty/dialog
|
6
|
+
*= require shoppe/dialog
|
5
7
|
*= require_self
|
6
8
|
*/
|
7
9
|
|
@@ -106,40 +108,7 @@ header.main {
|
|
106
108
|
padding:15px;
|
107
109
|
h3 { font-size:2.0em; font-weight:500;}
|
108
110
|
}
|
109
|
-
|
110
|
-
//
|
111
|
-
// data table
|
112
|
-
//
|
113
|
-
div.table {
|
114
|
-
p.info {
|
115
|
-
overflow:hidden;
|
116
|
-
margin-bottom:10px;
|
117
|
-
color:#40454D;
|
118
|
-
}
|
119
|
-
table.data {
|
120
|
-
width:100%;
|
121
|
-
th, td { padding:10px;}
|
122
|
-
thead th { border:1px solid #40454D; background:#40454D; text-align:left; font-weight:normal; font-size:0.9em; color:#fff; }
|
123
|
-
tbody td { border:1px solid #cfd4dd; background:#fff;}
|
124
|
-
a { color:inherit;}
|
125
|
-
tbody th { text-align:left; background:#5B6270; border:1px solid #5B6270;font-size:1.2em; color:#fff;}
|
126
|
-
tbody tr.empty td { padding:50px 0; text-align:center; color:#999; font-style:italic;}
|
127
|
-
tfoot td.right { text-align:right; }
|
128
|
-
tfoot td.bold { font-weight:bold;}
|
129
|
-
tfoot td { border-top:0 solid #ccc; background:#fafafa;}
|
130
|
-
tfoot tr:first-child td { border-top-width:3px;}
|
131
|
-
tbody td a.edit { background:image-url('shoppe/icons/edit.svg') no-repeat; margin-top:3px;width:16px; width:16px; background-size:13px; display:inline-block; text-indent:-40000px; opacity:0.3}
|
132
|
-
tbody td a.edit:hover { opacity:0.5}
|
133
|
-
tbody tr.form {
|
134
|
-
td { background:#f2f6fb;}
|
135
|
-
input[type=text] { border:1px solid #CFD4DD; padding:5px;}
|
136
|
-
input[type=text]:focus { border-color:#9AC835;}
|
137
|
-
td.desc input[type=text] { width:95%;}
|
138
|
-
td.adjustment input[type=text] { width:50px; margin-right:5px;}
|
139
|
-
}
|
140
|
-
}
|
141
|
-
}
|
142
|
-
|
111
|
+
|
143
112
|
|
144
113
|
//
|
145
114
|
// Status tags
|
@@ -295,7 +264,7 @@ header.main {
|
|
295
264
|
|
296
265
|
dl.form {
|
297
266
|
margin-top:15px;
|
298
|
-
input.text { width:70
|
267
|
+
input.text { width:70%;}
|
299
268
|
a.button { margin-right:5px;}
|
300
269
|
}
|
301
270
|
|
@@ -360,30 +329,7 @@ header.main {
|
|
360
329
|
float:right;
|
361
330
|
}
|
362
331
|
}
|
363
|
-
|
364
|
-
//
|
365
|
-
// pagination
|
366
|
-
//
|
367
|
-
nav.pagination {
|
368
|
-
display:block;
|
369
|
-
margin:25px 0;
|
370
|
-
overflow:hidden;
|
371
|
-
text-align:center;
|
372
|
-
span {
|
373
|
-
display:inline-block;
|
374
|
-
border:1px solid #ccc;
|
375
|
-
margin-right:3px;
|
376
|
-
color:#333;
|
377
|
-
background:#fff;
|
378
|
-
&.current { background:#9AC835; border-color:#7B9F26; color:#fff; font-weight:600; padding:5px 10px;}
|
379
|
-
a {
|
380
|
-
padding:5px 10px;
|
381
|
-
display:inline-block;
|
382
|
-
color:inherit;
|
383
|
-
text-decoration:none;
|
384
|
-
}
|
385
|
-
}
|
386
|
-
}
|
332
|
+
|
387
333
|
|
388
334
|
|
389
335
|
|
@@ -426,4 +372,69 @@ input.text, textarea.text {
|
|
426
372
|
font-family:$font;
|
427
373
|
&:focus { border-color:#9AC835; }
|
428
374
|
&.short { width:100px;}
|
375
|
+
}
|
376
|
+
|
377
|
+
//
|
378
|
+
// data table
|
379
|
+
//
|
380
|
+
div.table {
|
381
|
+
p.info {
|
382
|
+
overflow:hidden;
|
383
|
+
margin-bottom:10px;
|
384
|
+
color:#40454D;
|
385
|
+
}
|
386
|
+
table.data {
|
387
|
+
width:100%;
|
388
|
+
th, td { padding:10px; vertical-align:middle;}
|
389
|
+
thead th { border:1px solid #40454D; background:#40454D; text-align:left; font-weight:normal; font-size:0.9em; color:#fff; }
|
390
|
+
tbody td { border:1px solid #cfd4dd; background:#fff;}
|
391
|
+
a { color:inherit;}
|
392
|
+
tbody th { text-align:left; background:#5B6270; border:1px solid #5B6270;font-size:1.2em; color:#fff;}
|
393
|
+
tbody tr.empty td { padding:50px 0; text-align:center; color:#999; font-style:italic;}
|
394
|
+
tfoot td.right { text-align:right; }
|
395
|
+
tfoot td.bold { font-weight:bold;}
|
396
|
+
tfoot td { border-top:0 solid #ccc; background:#fafafa;}
|
397
|
+
tfoot tr:first-child td { border-top-width:3px;}
|
398
|
+
tbody td a.edit { background:image-url('shoppe/icons/edit.svg') no-repeat; margin-top:3px;width:16px; width:16px; background-size:13px; display:inline-block; text-indent:-40000px; opacity:0.3}
|
399
|
+
tbody td a.edit:hover { opacity:0.5}
|
400
|
+
tbody td.table {
|
401
|
+
padding:0;
|
402
|
+
table.data {
|
403
|
+
td { padding:10px; border-width:0; border-right-width:1px; border-bottom-width:1px;}
|
404
|
+
td:last-child { border-right-width:0;}
|
405
|
+
tr:last-child td { border-bottom-width:0;}
|
406
|
+
}
|
407
|
+
}
|
408
|
+
tbody tr.form {
|
409
|
+
td { background:#f2f6fb;}
|
410
|
+
input[type=text] { border:1px solid #CFD4DD; padding:5px;}
|
411
|
+
input[type=text]:focus { border-color:#9AC835;}
|
412
|
+
td.desc input[type=text] { width:95%;}
|
413
|
+
td.adjustment input[type=text] { width:50px; margin-right:5px;}
|
414
|
+
}
|
415
|
+
}
|
416
|
+
}
|
417
|
+
|
418
|
+
//
|
419
|
+
// pagination
|
420
|
+
//
|
421
|
+
nav.pagination {
|
422
|
+
display:block;
|
423
|
+
margin:25px 0;
|
424
|
+
overflow:hidden;
|
425
|
+
text-align:center;
|
426
|
+
span {
|
427
|
+
display:inline-block;
|
428
|
+
border:1px solid #ccc;
|
429
|
+
margin-right:3px;
|
430
|
+
color:#333;
|
431
|
+
background:#fff;
|
432
|
+
&.current { background:#9AC835; border-color:#7B9F26; color:#fff; font-weight:600; padding:5px 10px;}
|
433
|
+
a {
|
434
|
+
padding:5px 10px;
|
435
|
+
display:inline-block;
|
436
|
+
color:inherit;
|
437
|
+
text-decoration:none;
|
438
|
+
}
|
439
|
+
}
|
429
440
|
}
|
@@ -35,6 +35,21 @@ html.login {
|
|
35
35
|
padding:15px 0;
|
36
36
|
}
|
37
37
|
|
38
|
+
//
|
39
|
+
// Error
|
40
|
+
//
|
41
|
+
div.error {
|
42
|
+
background:#fff;
|
43
|
+
width:400px;
|
44
|
+
margin:auto;
|
45
|
+
margin-top:200px;
|
46
|
+
padding:25px;
|
47
|
+
line-height:1.5;
|
48
|
+
font-size:0.9em;
|
49
|
+
font-weight:500;
|
50
|
+
text-align:center;
|
51
|
+
p.back { margin-top:25px;}
|
52
|
+
}
|
38
53
|
|
39
54
|
//
|
40
55
|
// Primary login area
|
@@ -8,6 +8,11 @@ module Shoppe
|
|
8
8
|
rescue_from ActiveRecord::DeleteRestrictionError do |e|
|
9
9
|
redirect_to request.referer || root_path, :alert => e.message
|
10
10
|
end
|
11
|
+
|
12
|
+
rescue_from Shoppe::Error do |e|
|
13
|
+
@exception = e
|
14
|
+
render :layout => 'shoppe/sub', :template => 'shoppe/shared/error'
|
15
|
+
end
|
11
16
|
|
12
17
|
private
|
13
18
|
|
@@ -26,7 +31,7 @@ module Shoppe
|
|
26
31
|
|
27
32
|
# Returns the currently logged in user
|
28
33
|
def current_user
|
29
|
-
@current_user ||= login_from_session || :false
|
34
|
+
@current_user ||= login_from_session || login_with_demo_mdoe || :false
|
30
35
|
end
|
31
36
|
|
32
37
|
# Attempt to find a user based on the value stored in the local session
|
@@ -36,6 +41,13 @@ module Shoppe
|
|
36
41
|
end
|
37
42
|
end
|
38
43
|
|
44
|
+
# Attempt to login using the demo mode
|
45
|
+
def login_with_demo_mdoe
|
46
|
+
if Shoppe.config[:demo_mode]
|
47
|
+
@user = User.first
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
39
51
|
# Expose a current_user and logged_in? as helpers to views
|
40
52
|
helper_method :current_user, :logged_in?
|
41
53
|
|
@@ -1,12 +1,14 @@
|
|
1
|
-
|
1
|
+
module Shoppe
|
2
|
+
class AttachmentsController < Shoppe::ApplicationController
|
2
3
|
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
4
|
+
def destroy
|
5
|
+
@attachment = Nifty::Attachments::Attachment.find(params[:id])
|
6
|
+
@attachment.destroy
|
7
|
+
respond_to do |wants|
|
8
|
+
wants.html { redirect_to request.referer, :notice => "Attachment removed successfully" }
|
9
|
+
wants.json { render :status => 'complete' }
|
10
|
+
end
|
9
11
|
end
|
10
|
-
end
|
11
12
|
|
13
|
+
end
|
12
14
|
end
|
@@ -1,43 +1,45 @@
|
|
1
|
-
|
1
|
+
module Shoppe
|
2
|
+
class DeliveryServicePricesController < Shoppe::ApplicationController
|
2
3
|
|
3
|
-
|
4
|
-
|
5
|
-
|
4
|
+
before_filter { @active_nav = :delivery_services }
|
5
|
+
before_filter { @delivery_service = Shoppe::DeliveryService.find(params[:delivery_service_id])}
|
6
|
+
before_filter { params[:id] && @delivery_service_price = @delivery_service.delivery_service_prices.find(params[:id])}
|
6
7
|
|
7
|
-
|
8
|
-
|
9
|
-
|
8
|
+
def index
|
9
|
+
@delivery_service_prices = @delivery_service.delivery_service_prices.ordered
|
10
|
+
end
|
10
11
|
|
11
|
-
|
12
|
-
|
13
|
-
|
12
|
+
def new
|
13
|
+
@delivery_service_price = @delivery_service.delivery_service_prices.build
|
14
|
+
end
|
14
15
|
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
16
|
+
def create
|
17
|
+
@delivery_service_price = @delivery_service.delivery_service_prices.build(safe_params)
|
18
|
+
if @delivery_service_price.save
|
19
|
+
redirect_to [@delivery_service, :delivery_service_prices], :notice => "Price has been created successfully"
|
20
|
+
else
|
21
|
+
render :action => "new"
|
22
|
+
end
|
21
23
|
end
|
22
|
-
end
|
23
24
|
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
25
|
+
def update
|
26
|
+
if @delivery_service_price.update(safe_params)
|
27
|
+
redirect_to [@delivery_service, :delivery_service_prices], :notice => "Price has been updated successfully"
|
28
|
+
else
|
29
|
+
render :action => "edit"
|
30
|
+
end
|
29
31
|
end
|
30
|
-
end
|
31
32
|
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
33
|
+
def destroy
|
34
|
+
@delivery_service_price.destroy
|
35
|
+
redirect_to [@delivery_service, :delivery_service_prices], :notice => "Price has been removed successfully"
|
36
|
+
end
|
36
37
|
|
37
|
-
|
38
|
+
private
|
38
39
|
|
39
|
-
|
40
|
-
|
41
|
-
|
40
|
+
def safe_params
|
41
|
+
params[:delivery_service_price].permit(:price, :cost_price, :tax_rate_id, :min_weight, :max_weight, :code, :country_ids => [])
|
42
|
+
end
|
42
43
|
|
44
|
+
end
|
43
45
|
end
|
@@ -1,45 +1,47 @@
|
|
1
|
-
|
1
|
+
module Shoppe
|
2
|
+
class DeliveryServicesController < Shoppe::ApplicationController
|
2
3
|
|
3
|
-
|
4
|
-
|
4
|
+
before_filter { @active_nav = :delivery_services }
|
5
|
+
before_filter { params[:id] && @delivery_service = Shoppe::DeliveryService.find(params[:id]) }
|
5
6
|
|
6
|
-
|
7
|
-
|
8
|
-
|
7
|
+
def index
|
8
|
+
@delivery_services = Shoppe::DeliveryService.all
|
9
|
+
end
|
9
10
|
|
10
|
-
|
11
|
-
|
12
|
-
|
11
|
+
def new
|
12
|
+
@delivery_service = Shoppe::DeliveryService.new
|
13
|
+
end
|
13
14
|
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
15
|
+
def create
|
16
|
+
@delivery_service = Shoppe::DeliveryService.new(safe_params)
|
17
|
+
if @delivery_service.save
|
18
|
+
redirect_to :delivery_services, :flash => {:notice => "Delivery Service has been created successfully"}
|
19
|
+
else
|
20
|
+
render :action => "new"
|
21
|
+
end
|
20
22
|
end
|
21
|
-
end
|
22
23
|
|
23
|
-
|
24
|
-
|
24
|
+
def edit
|
25
|
+
end
|
25
26
|
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
27
|
+
def update
|
28
|
+
if @delivery_service.update(safe_params)
|
29
|
+
redirect_to [:edit, @delivery_service], :flash => {:notice => "Delivery Service has been updated successfully"}
|
30
|
+
else
|
31
|
+
render :action => "edit"
|
32
|
+
end
|
31
33
|
end
|
32
|
-
end
|
33
34
|
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
35
|
+
def destroy
|
36
|
+
@delivery_service.destroy
|
37
|
+
redirect_to :delivery_services, :flash => {:notice => "Delivery Service has been removed successfully"}
|
38
|
+
end
|
38
39
|
|
39
|
-
|
40
|
+
private
|
40
41
|
|
41
|
-
|
42
|
-
|
43
|
-
|
42
|
+
def safe_params
|
43
|
+
params[:delivery_service].permit(:name, :code, :active, :default, :courier, :tracking_url)
|
44
|
+
end
|
44
45
|
|
46
|
+
end
|
45
47
|
end
|