spree_shipping_matrix 0.1.0
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/.gitignore +14 -0
- data/.rspec +3 -0
- data/.tailor +29 -0
- data/.travis.yml +20 -0
- data/Gemfile +7 -0
- data/LICENSE +22 -0
- data/README.md +56 -0
- data/Rakefile +28 -0
- data/Versionfile +1 -0
- data/app/assets/javascripts/spree/backend/spree_shipping_matrix.js +42 -0
- data/app/assets/javascripts/spree/frontend/spree_shipping_matrix.js +2 -0
- data/app/assets/stylesheets/spree/backend/spree_shipping_matrix.css +3 -0
- data/app/assets/stylesheets/spree/frontend/spree_shipping_matrix.css +4 -0
- data/app/controllers/spree/admin/shipping_matrices_controller.rb +13 -0
- data/app/helpers/spree/admin/base_helper_decorator.rb +9 -0
- data/app/helpers/spree/admin/form_builder_decorator.rb +9 -0
- data/app/models/spree/shipping_matrix.rb +18 -0
- data/app/models/spree/shipping_matrix_calculator.rb +40 -0
- data/app/models/spree/shipping_matrix_rule.rb +39 -0
- data/app/overrides/spree/admin/shared/_configuration_menu/add_shipping_matrix_link.html.erb.deface +2 -0
- data/app/views/spree/admin/shipping_matrices/_form.html.erb +18 -0
- data/app/views/spree/admin/shipping_matrices/edit.html.erb +25 -0
- data/app/views/spree/admin/shipping_matrices/index.html.erb +63 -0
- data/app/views/spree/admin/shipping_matrices/new.html.erb +11 -0
- data/app/views/spree/admin/shipping_matrices/new.js.erb +6 -0
- data/app/views/spree/admin/shipping_matrix_rules/_form.html.erb +33 -0
- data/bin/rails +7 -0
- data/config/locales/en.yml +13 -0
- data/config/routes.rb +5 -0
- data/db/migrate/20140826110342_create_spree_shipping_matrices.rb +8 -0
- data/db/migrate/20140826112807_create_spree_shipping_matrix_rules.rb +10 -0
- data/lib/generators/spree_shipping_matrix/install/install_generator.rb +27 -0
- data/lib/spree_shipping_matrix/engine.rb +25 -0
- data/lib/spree_shipping_matrix/version.rb +3 -0
- data/lib/spree_shipping_matrix.rb +2 -0
- data/spec/factories/shipping_matrix_factory.rb +17 -0
- data/spec/factories/shipping_matrix_rule_factory.rb +8 -0
- data/spec/features/shipping_matrix_calculator_spec.rb +34 -0
- data/spec/features/shipping_matrix_checkout_spec.rb +92 -0
- data/spec/features/shipping_matrix_spec.rb +86 -0
- data/spec/spec_helper.rb +91 -0
- data/spec/support/user_steps.rb +22 -0
- data/spec/unit/models/shipping_matrix_calculator_spec.rb +81 -0
- data/spec/unit/models/shipping_matrix_rule_spec.rb +35 -0
- data/spec/unit/models/shipping_matrix_spec.rb +39 -0
- data/spree_shipping_matrix.gemspec +42 -0
- metadata +298 -0
data/.gitignore
ADDED
data/.rspec
ADDED
data/.tailor
ADDED
@@ -0,0 +1,29 @@
|
|
1
|
+
Tailor.config do |config|
|
2
|
+
config.formatters "text"
|
3
|
+
config.file_set '{app,spec/{factories,unit}}/**/*.rb' do |style|
|
4
|
+
style.allow_camel_case_methods false, level: :error
|
5
|
+
style.allow_conditional_parentheses false, level: :warn
|
6
|
+
style.allow_hard_tabs false, level: :error
|
7
|
+
style.allow_screaming_snake_case_classes false, level: :error
|
8
|
+
style.allow_trailing_line_spaces false, level: :error
|
9
|
+
style.allow_unnecessary_interpolation false, level: :warn
|
10
|
+
style.allow_unnecessary_double_quotes false, level: :warn
|
11
|
+
style.allow_invalid_ruby false, level: :warn
|
12
|
+
style.indentation_spaces 2, level: :off
|
13
|
+
style.max_code_lines_in_class 300, level: :error
|
14
|
+
style.max_code_lines_in_method 30, level: :error
|
15
|
+
style.max_line_length 130, level: :error
|
16
|
+
style.spaces_after_comma 1, level: :error
|
17
|
+
style.spaces_after_conditional 1, level: :error
|
18
|
+
style.spaces_after_lbrace 1, level: :error
|
19
|
+
style.spaces_after_lbracket 0, level: :error
|
20
|
+
style.spaces_after_lparen 0, level: :error
|
21
|
+
style.spaces_before_comma 0, level: :error
|
22
|
+
style.spaces_before_lbrace 1, level: :error
|
23
|
+
style.spaces_before_rbrace 1, level: :error
|
24
|
+
style.spaces_before_rbracket 0, level: :error
|
25
|
+
style.spaces_before_rparen 0, level: :error
|
26
|
+
style.spaces_in_empty_braces 0, level: :error
|
27
|
+
style.trailing_newlines 1, level: :error
|
28
|
+
end
|
29
|
+
end
|
data/.travis.yml
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
language: ruby
|
2
|
+
rvm:
|
3
|
+
- 1.9.3
|
4
|
+
- 2.0.0
|
5
|
+
- 2.1.0
|
6
|
+
before_install:
|
7
|
+
- "export DISPLAY=:99.0"
|
8
|
+
- "export CODECLIMATE_REPO_TOKEN=f965fda6d493fe7c6d3e3358a9ea39f2b6bad21bf837fc2c2e41a2aaa3bf4cd2 "
|
9
|
+
- "sh -e /etc/init.d/xvfb start"
|
10
|
+
before_script:
|
11
|
+
- "bundle exec rake test_app"
|
12
|
+
script:
|
13
|
+
- "bundle exec rake"
|
14
|
+
notifications:
|
15
|
+
email:
|
16
|
+
- luke@madetech.co.uk
|
17
|
+
- seb@madetech.co.uk
|
18
|
+
branches:
|
19
|
+
only:
|
20
|
+
- master
|
data/Gemfile
ADDED
data/LICENSE
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
Copyright (c) 2014 Made Tech Ltd
|
2
|
+
|
3
|
+
MIT License
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
6
|
+
a copy of this software and associated documentation files (the
|
7
|
+
"Software"), to deal in the Software without restriction, including
|
8
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
9
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
10
|
+
permit persons to whom the Software is furnished to do so, subject to
|
11
|
+
the following conditions:
|
12
|
+
|
13
|
+
The above copyright notice and this permission notice shall be
|
14
|
+
included in all copies or substantial portions of the Software.
|
15
|
+
|
16
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
17
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
18
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
19
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
20
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
21
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
22
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,56 @@
|
|
1
|
+
# SpreeShippingMatrix
|
2
|
+
|
3
|
+
Advanced shipping calculator based on rules matrix for Spree.
|
4
|
+
|
5
|
+
[](https://codeclimate.com/github/madebymade/spree_shipping_matrix)
|
6
|
+
[](https://travis-ci.org/madebymade/spree_shipping_matrix)
|
7
|
+
[](http://rails-brakeman.com/madebymade/spree_shipping_matrix)
|
8
|
+
[](https://codeclimate.com/github/madebymade/spree_shipping_matrix)
|
9
|
+
|
10
|
+
## Installation
|
11
|
+
|
12
|
+
Add spree_shipping_matrix to your Gemfile:
|
13
|
+
|
14
|
+
```ruby
|
15
|
+
gem 'spree_shipping_matrix'
|
16
|
+
```
|
17
|
+
|
18
|
+
Bundle your dependencies and run the installation generator:
|
19
|
+
|
20
|
+
```shell
|
21
|
+
bundle
|
22
|
+
bundle exec rails g spree_shipping_matrix:install
|
23
|
+
```
|
24
|
+
|
25
|
+
## Testing
|
26
|
+
|
27
|
+
First bundle your dependencies, then run `rake`. `rake` will default to building the dummy app if it does not exist, then it will run specs. The dummy app can be regenerated by using `rake test_app`.
|
28
|
+
|
29
|
+
```shell
|
30
|
+
bundle
|
31
|
+
bundle exec rake
|
32
|
+
```
|
33
|
+
|
34
|
+
When testing your applications integration with this extension you may use it's factories.
|
35
|
+
Simply add this require statement to your spec_helper:
|
36
|
+
|
37
|
+
```ruby
|
38
|
+
require 'spree_shipping_matrix/factories'
|
39
|
+
```
|
40
|
+
|
41
|
+
## Credits
|
42
|
+
|
43
|
+
[][made]
|
44
|
+
|
45
|
+
Developed and maintained by [Made Tech][made]. Key contributions:
|
46
|
+
|
47
|
+
* [Seb Ashton](https://github.com/SebAshton)
|
48
|
+
* [Luke Morton](https://github.com/DrPheltRight)
|
49
|
+
|
50
|
+
## License
|
51
|
+
|
52
|
+
Copyright © 2014 Made Tech Ltd. It is free software, and may be
|
53
|
+
redistributed under the terms specified in the [MIT-LICENSE][license] file.
|
54
|
+
|
55
|
+
[made]: http://www.madetech.co.uk?ref=github&repo=spree_shipping_matrix
|
56
|
+
[license]: https://github.com/madebymade/cf-deploy/blob/master/LICENSE
|
data/Rakefile
ADDED
@@ -0,0 +1,28 @@
|
|
1
|
+
require 'bundler'
|
2
|
+
Bundler::GemHelper.install_tasks
|
3
|
+
|
4
|
+
require 'rspec/core/rake_task'
|
5
|
+
require 'spree/testing_support/extension_rake'
|
6
|
+
|
7
|
+
RSpec::Core::RakeTask.new
|
8
|
+
|
9
|
+
task :default do
|
10
|
+
if Dir["spec/dummy"].empty?
|
11
|
+
Rake::Task[:test_app].invoke
|
12
|
+
Dir.chdir("../../")
|
13
|
+
end
|
14
|
+
Rake::Task[:tailor].invoke
|
15
|
+
Rake::Task[:spec].invoke
|
16
|
+
end
|
17
|
+
|
18
|
+
desc 'Generates a dummy app for testing'
|
19
|
+
task :test_app do
|
20
|
+
ENV['LIB_NAME'] = 'spree_shipping_matrix'
|
21
|
+
Rake::Task['extension:test_app'].invoke
|
22
|
+
end
|
23
|
+
|
24
|
+
begin
|
25
|
+
require 'tailor/rake_task'
|
26
|
+
Tailor::RakeTask.new
|
27
|
+
rescue LoadError
|
28
|
+
end
|
data/Versionfile
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
'2.4.x' => { :branch => 'master' }
|
@@ -0,0 +1,42 @@
|
|
1
|
+
//= require spree/backend
|
2
|
+
|
3
|
+
$(document).on('click', '.js-remove-row', function () {
|
4
|
+
var $removeLink = $(this);
|
5
|
+
var $row = $removeLink.closest('.row');
|
6
|
+
var destroyName = $removeLink.data('row-object-name') + '[_destroy]';
|
7
|
+
$row.replaceWith(
|
8
|
+
'<input type="hidden" name="' + destroyName + '" value="1" />');
|
9
|
+
return false;
|
10
|
+
});
|
11
|
+
|
12
|
+
$(document).on('click', '.js-duplicate-last-row', function () {
|
13
|
+
var $duplicateLink = $(this);
|
14
|
+
var $row = $duplicateLink.prev();
|
15
|
+
var reRowId = /\[([0-9]+)\]/;
|
16
|
+
var rowId = parseInt(reRowId.exec($row.find('[name]:first').attr('name'))[1], 10);
|
17
|
+
var newRowId = rowId + 1;
|
18
|
+
var $duplicateRow = $row.clone();
|
19
|
+
|
20
|
+
$duplicateRow.find('[for]').each(function () {
|
21
|
+
var labelFor = $(this).attr('for');
|
22
|
+
$(this).attr('for', labelFor.replace('_' + rowId + '_', '_' + newRowId + '_'));
|
23
|
+
});
|
24
|
+
|
25
|
+
$duplicateRow.find('[name]').each(function () {
|
26
|
+
var name = $(this).attr('name');
|
27
|
+
var id = $(this).attr('id');
|
28
|
+
$(this).attr('id', id.replace('_' + rowId + '_', '_' + newRowId + '_'));
|
29
|
+
$(this).attr('name', name.replace(reRowId, '[' + newRowId + ']'));
|
30
|
+
});
|
31
|
+
|
32
|
+
$duplicateRow.find('.select2-container').remove();
|
33
|
+
|
34
|
+
$duplicateLink.before($duplicateRow);
|
35
|
+
|
36
|
+
$('select.select2').select2({
|
37
|
+
allowClear: true,
|
38
|
+
dropdownAutoWidth: true
|
39
|
+
});
|
40
|
+
|
41
|
+
return false;
|
42
|
+
});
|
@@ -0,0 +1,18 @@
|
|
1
|
+
module Spree
|
2
|
+
class ShippingMatrix < ActiveRecord::Base
|
3
|
+
has_many :rules, ->{ order('min_line_item_total DESC') },
|
4
|
+
class_name: Spree::ShippingMatrixRule,
|
5
|
+
inverse_of: :matrix
|
6
|
+
|
7
|
+
accepts_nested_attributes_for :rules, allow_destroy: true,
|
8
|
+
reject_if: :rule_blank?
|
9
|
+
|
10
|
+
validates :name, presence: true
|
11
|
+
|
12
|
+
private
|
13
|
+
|
14
|
+
def rule_blank?(attributes)
|
15
|
+
attributes['min_line_item_total'].blank? || attributes['amount'].blank?
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
module Spree
|
2
|
+
class ShippingMatrixCalculator < Spree::ShippingCalculator
|
3
|
+
preference :matrix_id, :matrix_id
|
4
|
+
|
5
|
+
def self.description
|
6
|
+
'Shipping Matrix Calculator'
|
7
|
+
end
|
8
|
+
|
9
|
+
def compute_package(package)
|
10
|
+
matched_amount(user: package.contents.first.inventory_unit.order.user,
|
11
|
+
line_item_total: total(package.contents))
|
12
|
+
end
|
13
|
+
|
14
|
+
private
|
15
|
+
|
16
|
+
def matched_amount(info)
|
17
|
+
matched = matched_rule(info)
|
18
|
+
|
19
|
+
if matched.nil?
|
20
|
+
0
|
21
|
+
else
|
22
|
+
matched.amount
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
def matched_rule(info)
|
27
|
+
matched = matrix.rules.find { |rule| rule.matches?(info) }
|
28
|
+
|
29
|
+
if matched.nil?
|
30
|
+
matrix.rules.last
|
31
|
+
else
|
32
|
+
matched
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
def matrix
|
37
|
+
@matrix ||= Spree::ShippingMatrix.find(preferred_matrix_id)
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
module Spree
|
2
|
+
class ShippingMatrixRule < ActiveRecord::Base
|
3
|
+
belongs_to :matrix, class_name: Spree::ShippingMatrix,
|
4
|
+
foreign_key: 'shipping_matrix_id'
|
5
|
+
|
6
|
+
belongs_to :role, class_name: Spree::Role
|
7
|
+
|
8
|
+
validates :matrix, presence: true
|
9
|
+
validates :role, presence: true
|
10
|
+
|
11
|
+
validates :min_line_item_total, presence: true,
|
12
|
+
numericality: true
|
13
|
+
|
14
|
+
validates :amount, presence: true,
|
15
|
+
numericality: true
|
16
|
+
|
17
|
+
def matches?(info)
|
18
|
+
matches_role?(info) && matches_line_item_total?(info)
|
19
|
+
end
|
20
|
+
|
21
|
+
private
|
22
|
+
|
23
|
+
def matches_role?(info)
|
24
|
+
if info[:user].nil?
|
25
|
+
role.name == 'entry'
|
26
|
+
else
|
27
|
+
matches_user_role?(info)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
def matches_user_role?(info)
|
32
|
+
info[:user].spree_roles.include?(role)
|
33
|
+
end
|
34
|
+
|
35
|
+
def matches_line_item_total?(info)
|
36
|
+
info[:line_item_total] > min_line_item_total
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
<%= f.field_container :name, class: ['row'] do %>
|
2
|
+
<%= f.label :name, Spree.t(:name, scope: :shipping_matrix) %>
|
3
|
+
<span class="required">*</span><br />
|
4
|
+
<%= f.text_field :name, class: ['fullwidth'] %>
|
5
|
+
<%= f.error_message_on :name %>
|
6
|
+
<% end %>
|
7
|
+
|
8
|
+
<div class="js-shipping-matrix-rules">
|
9
|
+
<%= f.fields_for :rules do |f| %>
|
10
|
+
<%= render partial: 'spree/admin/shipping_matrix_rules/form',
|
11
|
+
locals: { f: f } %>
|
12
|
+
<% end %>
|
13
|
+
|
14
|
+
<%= link_to Spree.t(:add_rule, scope: :shipping_matrix),
|
15
|
+
'#new-rule',
|
16
|
+
class: 'js-duplicate-last-row' %>
|
17
|
+
</div>
|
18
|
+
|
@@ -0,0 +1,25 @@
|
|
1
|
+
<%= render partial: 'spree/admin/shared/configuration_menu' %>
|
2
|
+
|
3
|
+
<% content_for :page_title do %>
|
4
|
+
<%= Spree.t(:editting, scope: :shipping_matrix) %>
|
5
|
+
<span class="green">"<%= @shipping_matrix.name %>"</span>
|
6
|
+
<% end %>
|
7
|
+
|
8
|
+
<% content_for :page_actions do %>
|
9
|
+
<li>
|
10
|
+
<%= button_link_to Spree.t(:back, scope: :shipping_matrix),
|
11
|
+
spree.admin_shipping_matrices_path,
|
12
|
+
icon: 'arrow-left' %>
|
13
|
+
</li>
|
14
|
+
<% end %>
|
15
|
+
|
16
|
+
<%= render partial: 'spree/shared/error_messages',
|
17
|
+
locals: { target: @shipping_matrix } %>
|
18
|
+
|
19
|
+
<%= form_for [:admin, @shipping_matrix] do |f| %>
|
20
|
+
<fieldset>
|
21
|
+
<legend align="center"><%= Spree.t(:editting, scope: :shipping_matrix) %></legend>
|
22
|
+
<%= render :partial => 'form', :locals => { :f => f } %>
|
23
|
+
<%= render :partial => 'spree/admin/shared/edit_resource_links' %>
|
24
|
+
</fieldset>
|
25
|
+
<% end %>
|
@@ -0,0 +1,63 @@
|
|
1
|
+
<%= render :partial => 'spree/admin/shared/configuration_menu' %>
|
2
|
+
|
3
|
+
<% content_for :page_title do %>
|
4
|
+
<%= Spree.t(:title, scope: :shipping_matrix) %>
|
5
|
+
<% end %>
|
6
|
+
|
7
|
+
<% content_for :page_actions do %>
|
8
|
+
<li id="new_er_link">
|
9
|
+
<%= button_link_to Spree.t(:new, scope: :shipping_matrix),
|
10
|
+
new_admin_shipping_matrix_url,
|
11
|
+
remote: true,
|
12
|
+
icon: 'plus' %>
|
13
|
+
</li>
|
14
|
+
<% end %>
|
15
|
+
|
16
|
+
<div class="js-new-shipping-matrix"></div>
|
17
|
+
|
18
|
+
<% if @shipping_matrices.any? %>
|
19
|
+
<table
|
20
|
+
class="index sortable"
|
21
|
+
id="list_shipping_matrices"
|
22
|
+
data-hook
|
23
|
+
data-sortable-link="<%= update_positions_admin_option_types_url %>"
|
24
|
+
>
|
25
|
+
<colgroup>
|
26
|
+
<col style="width: 35%">
|
27
|
+
<col style="width: 25%">
|
28
|
+
<col style="width: 25%">
|
29
|
+
<col style="width: 15%">
|
30
|
+
</colgroup>
|
31
|
+
<thead>
|
32
|
+
<tr data-hook="option_header">
|
33
|
+
<th><%= Spree.t(:name, scope: :shipping_matrix) %></th>
|
34
|
+
<th class="actions"></th>
|
35
|
+
</tr>
|
36
|
+
</thead>
|
37
|
+
<tbody>
|
38
|
+
<% @shipping_matrices.each do |shipping_matrix| %>
|
39
|
+
<tr
|
40
|
+
class="spree_shipping_matrix <%= cycle('odd', 'even')%>"
|
41
|
+
id="<%= spree_dom_id shipping_matrix %>"
|
42
|
+
data-hook="shipping_matrix_row"
|
43
|
+
>
|
44
|
+
<td class="align-center"><%= shipping_matrix.name %></td>
|
45
|
+
<td class="actions">
|
46
|
+
<%= link_to_edit(shipping_matrix,
|
47
|
+
class: 'admin_edit_shipping_matrix',
|
48
|
+
no_text: true) %>
|
49
|
+
<%= link_to_delete(shipping_matrix, no_text: true) %>
|
50
|
+
</td>
|
51
|
+
</tr>
|
52
|
+
<% end %>
|
53
|
+
</tbody>
|
54
|
+
</table>
|
55
|
+
<% else %>
|
56
|
+
<div class="alpha twelve columns no-objects-found">
|
57
|
+
<%= Spree.t(:no_resource_found, resource: Spree.t(:title, scope: :shipping_matrix)) %>,
|
58
|
+
|
59
|
+
<%= link_to Spree.t(:add_one),
|
60
|
+
spree.new_admin_shipping_matrix_path,
|
61
|
+
remote: true %>!
|
62
|
+
</div>
|
63
|
+
<% end %>
|
@@ -0,0 +1,11 @@
|
|
1
|
+
<%= render partial: 'spree/shared/error_messages',
|
2
|
+
locals: { target: @shipping_matrix } %>
|
3
|
+
|
4
|
+
<%= form_for [:admin, @shipping_matrix] do |f| %>
|
5
|
+
<fieldset>
|
6
|
+
<legend align="center"><%= Spree.t(:new, scope: :shipping_matrix) %></legend>
|
7
|
+
<%= render partial: 'form', locals: { f: f } %>
|
8
|
+
|
9
|
+
<%= render partial: 'spree/admin/shared/new_resource_links' %>
|
10
|
+
</fieldset>
|
11
|
+
<% end %>
|
@@ -0,0 +1,6 @@
|
|
1
|
+
$('.js-new-shipping-matrix').html('<%= escape_javascript(render template: "spree/admin/shipping_matrices/new", formats: [:html], handlers: [:erb]) %>');
|
2
|
+
$('a[href$="<%= spree.new_admin_shipping_matrix_path %>"]').parent().hide();
|
3
|
+
$('select.select2').select2({
|
4
|
+
allowClear: true,
|
5
|
+
dropdownAutoWidth: true
|
6
|
+
});
|
@@ -0,0 +1,33 @@
|
|
1
|
+
<div class="row">
|
2
|
+
<div class="alpha four columns">
|
3
|
+
<%= f.label(:role) %>
|
4
|
+
<%= f.collection_select(:role_id,
|
5
|
+
Spree::Role.all,
|
6
|
+
:id, :name, {},
|
7
|
+
{class: 'select2 fullwidth'}) %>
|
8
|
+
</div>
|
9
|
+
|
10
|
+
<div class="four columns">
|
11
|
+
<%= f.label(:min_line_item_total) %>
|
12
|
+
<%= f.number_field(:min_line_item_total,
|
13
|
+
value: number_with_precision(f.object.min_line_item_total,
|
14
|
+
precision: 2)) %>
|
15
|
+
</div>
|
16
|
+
|
17
|
+
<div class="omega four columns">
|
18
|
+
<%= f.label(:amount) %>
|
19
|
+
<%= f.number_field(:amount,
|
20
|
+
value: number_with_precision(f.object.amount,
|
21
|
+
precision: 2)) %>
|
22
|
+
|
23
|
+
<% if f.object.persisted? %>
|
24
|
+
<a
|
25
|
+
href="#remove-<%= f.object.id %>"
|
26
|
+
class="js-remove-row"
|
27
|
+
data-row-object-name="<%= f.object_name %>"
|
28
|
+
>
|
29
|
+
<%= Spree.t(:remove) %>
|
30
|
+
</a>
|
31
|
+
<% end %>
|
32
|
+
</div>
|
33
|
+
</div>
|
data/bin/rails
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
# This command will automatically be run when you run "rails" with Rails 3 gems installed from the root of your application.
|
2
|
+
|
3
|
+
ENGINE_ROOT = File.expand_path('../..', __FILE__)
|
4
|
+
ENGINE_PATH = File.expand_path('../../lib/spree_shipping_matrix/engine', __FILE__)
|
5
|
+
|
6
|
+
require 'rails/all'
|
7
|
+
require 'rails/engine/commands'
|
@@ -0,0 +1,13 @@
|
|
1
|
+
# Sample localization file for English. Add more files in this directory for other locales.
|
2
|
+
# See https://github.com/svenfuchs/rails-i18n/tree/master/rails%2Flocale for starting points.
|
3
|
+
|
4
|
+
en:
|
5
|
+
spree:
|
6
|
+
shipping_matrix:
|
7
|
+
new: 'New Shipping Matrix'
|
8
|
+
name: 'Name'
|
9
|
+
title: 'Shipping Matrices'
|
10
|
+
editting: 'Edit Shipping Matrix'
|
11
|
+
back: 'Back to Shipping Matrices'
|
12
|
+
add_rule: 'Add rule'
|
13
|
+
matrix_id: 'Shipping Matrix'
|
data/config/routes.rb
ADDED
@@ -0,0 +1,10 @@
|
|
1
|
+
class CreateSpreeShippingMatrixRules < ActiveRecord::Migration
|
2
|
+
def change
|
3
|
+
create_table :spree_shipping_matrix_rules do |t|
|
4
|
+
t.references :shipping_matrix, index: true
|
5
|
+
t.references :role, index: true
|
6
|
+
t.decimal :min_line_item_total, precision: 5, scale: 2, null: false
|
7
|
+
t.decimal :amount, precision: 5, scale: 2, null: false
|
8
|
+
end
|
9
|
+
end
|
10
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
module SpreeShippingMatrix
|
2
|
+
module Generators
|
3
|
+
class InstallGenerator < Rails::Generators::Base
|
4
|
+
class_option :auto_run_migrations, :type => :boolean, :default => false
|
5
|
+
|
6
|
+
def add_javascripts
|
7
|
+
append_file 'vendor/assets/javascripts/spree/backend/all.js', "//= require spree/backend/spree_shipping_matrix\n"
|
8
|
+
end
|
9
|
+
|
10
|
+
def add_stylesheets
|
11
|
+
end
|
12
|
+
|
13
|
+
def add_migrations
|
14
|
+
run 'bundle exec rake railties:install:migrations FROM=spree_shipping_matrix'
|
15
|
+
end
|
16
|
+
|
17
|
+
def run_migrations
|
18
|
+
run_migrations = options[:auto_run_migrations] || ['', 'y', 'Y'].include?(ask 'Would you like to run the migrations now? [Y/n]')
|
19
|
+
if run_migrations
|
20
|
+
run 'bundle exec rake db:migrate'
|
21
|
+
else
|
22
|
+
puts 'Skipping rake db:migrate, don\'t forget to run it!'
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
module SpreeShippingMatrix
|
2
|
+
class Engine < Rails::Engine
|
3
|
+
require 'spree/core'
|
4
|
+
isolate_namespace Spree
|
5
|
+
engine_name 'spree_shipping_matrix'
|
6
|
+
|
7
|
+
# use rspec for tests
|
8
|
+
config.generators do |g|
|
9
|
+
g.test_framework :rspec
|
10
|
+
end
|
11
|
+
|
12
|
+
|
13
|
+
def self.activate
|
14
|
+
Dir.glob(File.join(File.dirname(__FILE__), '../../app/**/*_decorator*.rb')) do |c|
|
15
|
+
Rails.configuration.cache_classes ? require(c) : load(c)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
config.to_prepare &method(:activate).to_proc
|
20
|
+
|
21
|
+
config.after_initialize do
|
22
|
+
config.spree.calculators.shipping_methods << Spree::ShippingMatrixCalculator
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|