spree_mobility 1.0.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.
- checksums.yaml +7 -0
- data/.gitignore +22 -0
- data/.hound.yml +21 -0
- data/.rspec +3 -0
- data/.rubocop.yml +7 -0
- data/.travis.yml +45 -0
- data/Appraisals +8 -0
- data/CONTRIBUTING.md +81 -0
- data/Gemfile +8 -0
- data/Guardfile +12 -0
- data/LICENSE.md +26 -0
- data/README.md +92 -0
- data/Rakefile +24 -0
- data/app/assets/javascripts/spree/backend/spree_mobility.js +2 -0
- data/app/assets/javascripts/spree/backend/taxon_tree_menu.js +49 -0
- data/app/assets/javascripts/spree/backend/translations.js +50 -0
- data/app/controllers/concerns/spree_mobility/controller_mobility_helper.rb +18 -0
- data/app/controllers/spree/admin/option_values_controller_decorator.rb +23 -0
- data/app/controllers/spree/admin/product_properties_controller_decorator.rb +22 -0
- data/app/controllers/spree/admin/shipping_methods_controller_decorator.rb +18 -0
- data/app/controllers/spree/admin/translations_controller.rb +53 -0
- data/app/controllers/spree/api/base_controller_decorator.rb +5 -0
- data/app/controllers/spree/base_controller_decorator.rb +5 -0
- data/app/helpers/spree_mobility/locale_helper.rb +11 -0
- data/app/models/concerns/spree_mobility/translatable.rb +63 -0
- data/app/overrides/spree/admin/option_types/_option_value_fields/add_translation.rb +10 -0
- data/app/overrides/spree/admin/option_types/index/add_translation.rb +8 -0
- data/app/overrides/spree/admin/product_properties/_product_property_fields/add_translation.rb +10 -0
- data/app/overrides/spree/admin/products/index/search_by_name_or_sku.rb +21 -0
- data/app/overrides/spree/admin/promotions/index/add_translation_link.rb +8 -0
- data/app/overrides/spree/admin/properties/index/add_translation.rb +8 -0
- data/app/overrides/spree/admin/shared/_product_tabs/add_translations.rb +10 -0
- data/app/overrides/spree/admin/shared/_translations/translation.rb +8 -0
- data/app/overrides/spree/admin/shared/sub_menu/_configuration/store_translations.rb +8 -0
- data/app/overrides/spree/admin/shipping_methods/index/add_translation.rb +8 -0
- data/app/overrides/spree/admin/taxonomies/_list/add_translations.rb +8 -0
- data/app/views/spree/admin/translations/_fields.html.erb +12 -0
- data/app/views/spree/admin/translations/_form.html.erb +13 -0
- data/app/views/spree/admin/translations/_form_fields.html.erb +38 -0
- data/app/views/spree/admin/translations/_settings.html.erb +22 -0
- data/app/views/spree/admin/translations/option_type.html.erb +9 -0
- data/app/views/spree/admin/translations/option_value.html.erb +25 -0
- data/app/views/spree/admin/translations/product.html.erb +7 -0
- data/app/views/spree/admin/translations/product_property.html.erb +23 -0
- data/app/views/spree/admin/translations/promotion.html.erb +9 -0
- data/app/views/spree/admin/translations/property.html.erb +9 -0
- data/app/views/spree/admin/translations/shipping_method.html.erb +9 -0
- data/app/views/spree/admin/translations/store.html.erb +25 -0
- data/app/views/spree/admin/translations/taxon.html.erb +25 -0
- data/app/views/spree/admin/translations/taxonomy.html.erb +9 -0
- data/bin/rails +7 -0
- data/config/initializers/enable_extensions.rb +27 -0
- data/config/initializers/form_builder_mobility_patch.rb +53 -0
- data/config/initializers/mobility.rb +118 -0
- data/config/initializers/spree_ransack.rb +31 -0
- data/config/locales/be.yml +6 -0
- data/config/locales/bg.yml +6 -0
- data/config/locales/en.yml +6 -0
- data/config/locales/it.yml +6 -0
- data/config/locales/ru.yml +6 -0
- data/config/locales/zh-TW.yml +6 -0
- data/config/routes.rb +7 -0
- data/db/migrate/20220411041407_add_translations_to_main_models.rb +83 -0
- data/db/migrate/20220412095648_remove_null_constraints_from_spree_tables.rb +13 -0
- data/db/migrate/20220413095648_migrate_translation_data.rb +53 -0
- data/gemfiles/spree_4_2.gemfile +8 -0
- data/gemfiles/spree_master.gemfile +10 -0
- data/lib/generators/spree_mobility/install/install_generator.rb +23 -0
- data/lib/spree_mobility/configuration.rb +12 -0
- data/lib/spree_mobility/core_ext/mobility/backends/active_record/table/mobility_acts_as_paranoid_decorator.rb +31 -0
- data/lib/spree_mobility/core_ext/spree/option_type_decorator.rb +11 -0
- data/lib/spree_mobility/core_ext/spree/option_value_decorator.rb +30 -0
- data/lib/spree_mobility/core_ext/spree/product_decorator.rb +87 -0
- data/lib/spree_mobility/core_ext/spree/product_property_decorator.rb +6 -0
- data/lib/spree_mobility/core_ext/spree/product_scopes_with_mobility_decorator.rb +16 -0
- data/lib/spree_mobility/core_ext/spree/products/find_with_mobility_decorator.rb +12 -0
- data/lib/spree_mobility/core_ext/spree/promotion_decorator.rb +11 -0
- data/lib/spree_mobility/core_ext/spree/property_decorator.rb +26 -0
- data/lib/spree_mobility/core_ext/spree/shipping_method_decorator.rb +10 -0
- data/lib/spree_mobility/core_ext/spree/store_decorator.rb +12 -0
- data/lib/spree_mobility/core_ext/spree/taxon_decorator.rb +54 -0
- data/lib/spree_mobility/core_ext/spree/taxonomy_decorator.rb +29 -0
- data/lib/spree_mobility/core_ext/spree/variant_decorator.rb +19 -0
- data/lib/spree_mobility/engine.rb +33 -0
- data/lib/spree_mobility/fallbacks.rb +45 -0
- data/lib/spree_mobility/translation_query.rb +36 -0
- data/lib/spree_mobility/version.rb +18 -0
- data/lib/spree_mobility.rb +47 -0
- data/spec/features/admin/products_spec.rb +15 -0
- data/spec/features/admin/translations_spec.rb +259 -0
- data/spec/features/translations_spec.rb +35 -0
- data/spec/models/product_spec.rb +77 -0
- data/spec/models/taxon_spec.rb +16 -0
- data/spec/models/translated_models_spec.rb +33 -0
- data/spec/models/variant_spec.rb +33 -0
- data/spec/spec_helper.rb +10 -0
- data/spec/support/i18n.rb +5 -0
- data/spec/support/matchers/be_a_thorough_translation_of_matcher.rb +21 -0
- data/spec/support/matchers/have_text_like.rb +3 -0
- data/spec/support/shared_contexts/translatable_context.rb +63 -0
- data/spree_mobility.gemspec +37 -0
- metadata +316 -0
checksums.yaml
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
---
|
|
2
|
+
SHA256:
|
|
3
|
+
metadata.gz: 022505f406f3f9336ed07f01f2e991a46d04d21fb8c6a8320dc4b3c79093b227
|
|
4
|
+
data.tar.gz: 4bd438df89aad4b7be914cf0e8e40b128b67ac70409d99bc5a775d0841d95a0a
|
|
5
|
+
SHA512:
|
|
6
|
+
metadata.gz: db5144c00d20a57c15a5ce19de8b507d8cf56195ca5c1de4dcb554fb21f4127713fefbb4ed3e2817aa3be5b2335916c7b544e7d363929d5042e9c37622bf2313
|
|
7
|
+
data.tar.gz: 0cd224a84e281656efd79977715d2c688fa068ff846cea76b84f9a9506e77fb6adc1b09bc6ecf86d6e0ca51e92bbb5ce466a4c0e162745de2816e355b67dc9b2
|
data/.gitignore
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
\#*
|
|
2
|
+
*~
|
|
3
|
+
.#*
|
|
4
|
+
.DS_Store
|
|
5
|
+
.idea
|
|
6
|
+
.localeapp/locales
|
|
7
|
+
.project
|
|
8
|
+
coverage
|
|
9
|
+
default
|
|
10
|
+
Gemfile.lock
|
|
11
|
+
tmp
|
|
12
|
+
nbproject
|
|
13
|
+
pkg
|
|
14
|
+
*.sw?
|
|
15
|
+
spec/dummy
|
|
16
|
+
.rvmrc
|
|
17
|
+
.sass-cache
|
|
18
|
+
public/spree
|
|
19
|
+
.ruby-version
|
|
20
|
+
.ruby-gemset
|
|
21
|
+
.bundle
|
|
22
|
+
gemfiles/*.gemfile.lock
|
data/.hound.yml
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
---
|
|
2
|
+
# Too picky.
|
|
3
|
+
LineLength:
|
|
4
|
+
Enabled: false
|
|
5
|
+
|
|
6
|
+
# This should truly be on for well documented gems.
|
|
7
|
+
Documentation:
|
|
8
|
+
Enabled: false
|
|
9
|
+
|
|
10
|
+
# Neatly aligned code is too swell.
|
|
11
|
+
SingleSpaceBeforeFirstArg:
|
|
12
|
+
Enabled: false
|
|
13
|
+
|
|
14
|
+
# Don't mess with RSpec DSL.
|
|
15
|
+
Blocks:
|
|
16
|
+
Exclude:
|
|
17
|
+
- 'spec/**/*'
|
|
18
|
+
|
|
19
|
+
# Avoid contradictory style rules by enforce single quotes.
|
|
20
|
+
StringLiterals:
|
|
21
|
+
EnforcedStyle: single_quotes
|
data/.rspec
ADDED
data/.rubocop.yml
ADDED
data/.travis.yml
ADDED
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
os: linux
|
|
2
|
+
dist: bionic
|
|
3
|
+
|
|
4
|
+
addons:
|
|
5
|
+
apt:
|
|
6
|
+
sources:
|
|
7
|
+
- google-chrome
|
|
8
|
+
packages:
|
|
9
|
+
- google-chrome-stable
|
|
10
|
+
|
|
11
|
+
services:
|
|
12
|
+
- mysql
|
|
13
|
+
- postgresql
|
|
14
|
+
|
|
15
|
+
language: ruby
|
|
16
|
+
|
|
17
|
+
rvm:
|
|
18
|
+
- 2.7
|
|
19
|
+
|
|
20
|
+
env:
|
|
21
|
+
- DB=mysql
|
|
22
|
+
- DB=postgres
|
|
23
|
+
|
|
24
|
+
gemfile:
|
|
25
|
+
- gemfiles/spree_4_2.gemfile
|
|
26
|
+
- gemfiles/spree_master.gemfile
|
|
27
|
+
|
|
28
|
+
jobs:
|
|
29
|
+
allow_failures:
|
|
30
|
+
- gemfile: gemfiles/spree_master.gemfile
|
|
31
|
+
|
|
32
|
+
before_script:
|
|
33
|
+
- CHROME_MAIN_VERSION=`google-chrome-stable --version | sed -E 's/(^Google Chrome |\.[0-9]+ )//g'`
|
|
34
|
+
- CHROMEDRIVER_VERSION=`curl -s "https://chromedriver.storage.googleapis.com/LATEST_RELEASE_$CHROME_MAIN_VERSION"`
|
|
35
|
+
- curl "https://chromedriver.storage.googleapis.com/${CHROMEDRIVER_VERSION}/chromedriver_linux64.zip" -O
|
|
36
|
+
- unzip chromedriver_linux64.zip -d ~/bin
|
|
37
|
+
- nvm install 14
|
|
38
|
+
|
|
39
|
+
script:
|
|
40
|
+
- bundle exec rake test_app
|
|
41
|
+
- bundle exec rake spec
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
before_install:
|
|
45
|
+
- mysql -u root -e "GRANT ALL ON *.* TO 'travis'@'%';"
|
data/Appraisals
ADDED
data/CONTRIBUTING.md
ADDED
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
# Contributing
|
|
2
|
+
|
|
3
|
+
Spree mobility is an open source project and we encourage contributions. Please see the [contributors guidelines](http://spreecommerce.com/documentation/contributing_to_spree.html) for more information before contributing.
|
|
4
|
+
|
|
5
|
+
In the spirit of [free software][1], **everyone** is encouraged to help improve this project.
|
|
6
|
+
|
|
7
|
+
Here are some ways *you* can contribute:
|
|
8
|
+
|
|
9
|
+
* by using prerelease versions
|
|
10
|
+
* by reporting [bugs][2]
|
|
11
|
+
* by suggesting new features
|
|
12
|
+
* by writing [translations][3] (e.g. use branch 2-4-stable for Spree v2.4.x)
|
|
13
|
+
* by writing or editing documentation
|
|
14
|
+
* by writing specifications
|
|
15
|
+
* by writing code (*no patch is too small*: fix typos, add comments, clean up inconsistent whitespace)
|
|
16
|
+
* by refactoring code
|
|
17
|
+
* by resolving [issues][2]
|
|
18
|
+
* by reviewing patches
|
|
19
|
+
|
|
20
|
+
---
|
|
21
|
+
|
|
22
|
+
## Filing an issue
|
|
23
|
+
|
|
24
|
+
When filing an issue on this extension, please first do these things:
|
|
25
|
+
|
|
26
|
+
* Verify you can reproduce this issue in a brand new application.
|
|
27
|
+
* Run through the steps to reproduce the issue again.
|
|
28
|
+
|
|
29
|
+
In the issue itself please provide:
|
|
30
|
+
|
|
31
|
+
* A comprehensive list of steps to reproduce the issue.
|
|
32
|
+
* What you're *expecting* to happen compared with what's *actually* happening.
|
|
33
|
+
* The version of Spree *and* the version of Rails.
|
|
34
|
+
* A list of all extensions.
|
|
35
|
+
* Any relevant stack traces ("Full trace" preferred)
|
|
36
|
+
* Your `Gemfile`
|
|
37
|
+
|
|
38
|
+
In 99% of cases, this information is enough to determine the cause and solution to the problem that is being described.
|
|
39
|
+
|
|
40
|
+
---
|
|
41
|
+
|
|
42
|
+
## Pull requests
|
|
43
|
+
|
|
44
|
+
We gladly accept pull requests to fix bugs and, in some circumstances, add new features to this extension.
|
|
45
|
+
|
|
46
|
+
Here's a quick guide:
|
|
47
|
+
|
|
48
|
+
1. Fork the repo.
|
|
49
|
+
|
|
50
|
+
2. Run the tests. We only take pull requests with passing tests, and it's great to know that you have a clean slate.
|
|
51
|
+
|
|
52
|
+
3. Create new branch then make changes and add tests for your changes. Only refactoring and documentation changes require no new tests. If you are adding functionality or fixing a bug, we need tests!
|
|
53
|
+
|
|
54
|
+
4. Push to your fork and submit a pull request. If the changes will apply cleanly to the latest stable branches and master branch, you will only need to submit one pull request.
|
|
55
|
+
|
|
56
|
+
At this point you're waiting on us. We may suggest some changes or improvements or alternatives.
|
|
57
|
+
|
|
58
|
+
Some things that will increase the chance that your pull request is accepted, taken straight from the Ruby on Rails guide:
|
|
59
|
+
|
|
60
|
+
* Use Rails idioms and helpers.
|
|
61
|
+
* Include tests that fail without your code, and pass with it.
|
|
62
|
+
* Update the documentation, the surrounding one, examples elsewhere, guides, whatever is affected by your contribution.
|
|
63
|
+
|
|
64
|
+
---
|
|
65
|
+
|
|
66
|
+
## TL;DR
|
|
67
|
+
|
|
68
|
+
* Fork the repo
|
|
69
|
+
* Clone your repo
|
|
70
|
+
* Run `bundle install`
|
|
71
|
+
* Run `bundle exec rake test_app` to create the test application in `spec/dummy`
|
|
72
|
+
* Make your changes
|
|
73
|
+
* Ensure specs pass by running `bundle exec rspec spec`
|
|
74
|
+
* Ensure all syntax ok by running `rubocop .`
|
|
75
|
+
* Submit your pull request
|
|
76
|
+
|
|
77
|
+
And in case we didn't emphasize it enough: **we love tests!**
|
|
78
|
+
|
|
79
|
+
[1]: http://www.fsf.org/licensing/essays/free-sw.html
|
|
80
|
+
[2]: https://github.com/spree-contrib/spree_mobility/issues
|
|
81
|
+
[3]: https://github.com/spree-contrib/spree_mobility/tree/master/config/locales
|
data/Gemfile
ADDED
data/Guardfile
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
group :red_green_refactor, halt_on_fail: true do
|
|
2
|
+
|
|
3
|
+
guard 'rspec', cmd: 'bundle exec rspec' do
|
|
4
|
+
watch('spec/spec_helper.rb') { 'spec' }
|
|
5
|
+
watch('config/routes.rb') { 'spec/controllers' }
|
|
6
|
+
watch(%r{^spec/(.+)_spec\.rb$}) { |m| "spec/#{m[1]}_spec.rb"}
|
|
7
|
+
watch(%r{^app/(.+)\.rb$}) { |m| "spec/#{m[1]}_spec.rb" }
|
|
8
|
+
watch(%r{^app/(.*)(\.erb)$}) { |m| "spec/#{m[1]}#{m[2]}_spec.rb" }
|
|
9
|
+
watch(%r{^lib/(.+)\.rb$}) { |m| "spec/#{m[1]}_spec.rb" }
|
|
10
|
+
watch(%r{^app/controllers/(.+)_(controller)\.rb$}) { |m| "spec/#{m[2]}s/#{m[1]}_#{m[2]}_spec.rb" }
|
|
11
|
+
end
|
|
12
|
+
end
|
data/LICENSE.md
ADDED
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
Copyright (c) 2011-2015 Spree Commerce Inc., and other contributors.
|
|
2
|
+
All rights reserved.
|
|
3
|
+
|
|
4
|
+
Redistribution and use in source and binary forms, with or without modification,
|
|
5
|
+
are permitted provided that the following conditions are met:
|
|
6
|
+
|
|
7
|
+
* Redistributions of source code must retain the above copyright notice,
|
|
8
|
+
this list of conditions and the following disclaimer.
|
|
9
|
+
* Redistributions in binary form must reproduce the above copyright notice,
|
|
10
|
+
this list of conditions and the following disclaimer in the documentation
|
|
11
|
+
and/or other materials provided with the distribution.
|
|
12
|
+
* Neither the name Spree nor the names of its contributors may be used to
|
|
13
|
+
endorse or promote products derived from this software without specific
|
|
14
|
+
prior written permission.
|
|
15
|
+
|
|
16
|
+
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
17
|
+
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
18
|
+
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
19
|
+
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
|
|
20
|
+
CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
|
21
|
+
EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
|
22
|
+
PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
|
23
|
+
PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
|
24
|
+
LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
|
25
|
+
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
|
26
|
+
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
data/README.md
ADDED
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
# Spree Mobility
|
|
2
|
+
|
|
3
|
+
This is a Spree model translation gem based on `spree_globalize` for [Spree Commerce][1] version 4.3+.
|
|
4
|
+
It uses `mobility` instead of `globalize`, since `globalize` is not actively developed anymore.
|
|
5
|
+
It is a drop-in replacement for `spree_globalize` and will use your existing translations.
|
|
6
|
+
|
|
7
|
+
## Improvements
|
|
8
|
+
|
|
9
|
+
This gem offers several improvements over `spree_globalize`:
|
|
10
|
+
|
|
11
|
+
* Proper translation fallbacks support (if a translation for the current locale is missing, it will fallback to other locales, strictly based on configured fallbacks):
|
|
12
|
+
* for finders (slug/permalink)
|
|
13
|
+
* when searching by product name (frontend & admin search)
|
|
14
|
+
* Proper validations on translation models (e.g. slug presence validation), also meaning uniqueness validations will now work correctly per-locale
|
|
15
|
+
* Better support for future versions of Rails as `mobility` is more actively maintained
|
|
16
|
+
|
|
17
|
+
Admin:
|
|
18
|
+
|
|
19
|
+
* Rich-text editor for product description translations in admin (if enabled)
|
|
20
|
+
* Searching by product SKU in admin
|
|
21
|
+
* Admin product search will no longer return duplicate results
|
|
22
|
+
* Works correctly if using custom Spree.admin_path config
|
|
23
|
+
|
|
24
|
+
## Installation
|
|
25
|
+
|
|
26
|
+
Add the following to your `Gemfile`:
|
|
27
|
+
|
|
28
|
+
```ruby
|
|
29
|
+
gem 'spree_i18n', '~> 5.0'
|
|
30
|
+
gem 'friendly_id-mobility', github: 'mrbrdo/friendly_id-mobility', branch: 'master'
|
|
31
|
+
gem 'spree_mobility'
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
Run `bundle install`
|
|
35
|
+
|
|
36
|
+
You can use the generator to install migrations and append spree_mobility assets to
|
|
37
|
+
your app spree manifest file.
|
|
38
|
+
|
|
39
|
+
rails g spree_mobility:install
|
|
40
|
+
|
|
41
|
+
This will insert these lines into your spree manifest files:
|
|
42
|
+
|
|
43
|
+
```
|
|
44
|
+
vendor/assets/javascripts/spree/backend/all.js
|
|
45
|
+
//= require spree/backend/spree_mobility
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
It is also recommended to configure Mobility fallback locales, especially if your admin locale is not the same as your Store's default_locale. For example if you have en and de locale:
|
|
49
|
+
|
|
50
|
+
```
|
|
51
|
+
# config/initializers/mobility.rb
|
|
52
|
+
Mobility.configure do
|
|
53
|
+
plugins do
|
|
54
|
+
fallbacks({ :en => [:de], :de => [:en] })
|
|
55
|
+
end
|
|
56
|
+
end
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
---
|
|
60
|
+
|
|
61
|
+
## Model Translations
|
|
62
|
+
|
|
63
|
+
This feature uses the [Mobility][3] gem to localize model data.
|
|
64
|
+
So far the following models are translatable:
|
|
65
|
+
|
|
66
|
+
Product, Promotion, OptionType, Taxonomy, Taxon, Property, Store and ShippingMethod.
|
|
67
|
+
|
|
68
|
+
Start your server and you should see a TRANSLATIONS link or a flag icon on each
|
|
69
|
+
admin section that supports this feature.
|
|
70
|
+
|
|
71
|
+
*Every record needs to have a translation. If by any chance you remove `spree_mobility`
|
|
72
|
+
from your Gemfile, add some records and then add `spree_mobility` gem back you might get
|
|
73
|
+
errors like ``undefined method for nilClass`` because Mobility will try fetch
|
|
74
|
+
translations that do not exist.*
|
|
75
|
+
|
|
76
|
+
---
|
|
77
|
+
|
|
78
|
+
## Contributing
|
|
79
|
+
|
|
80
|
+
[See corresponding guidelines][7]
|
|
81
|
+
|
|
82
|
+
---
|
|
83
|
+
|
|
84
|
+
Copyright (c) 2010-2022 MrBrdo. released under the [New BSD License][6]
|
|
85
|
+
|
|
86
|
+
[1]: http://spreecommerce.org
|
|
87
|
+
[2]: http://guides.spreecommerce.org/developer/i18n.html
|
|
88
|
+
[3]: https://github.com/shioyama/mobility
|
|
89
|
+
[5]: https://github.com/spree-contrib/spree_globalize/graphs/contributors
|
|
90
|
+
[6]: https://github.com/mrbrdo/spree_mobility/blob/master/LICENSE.md
|
|
91
|
+
[7]: https://github.com/mrbrdo/spree_mobility/blob/master/CONTRIBUTING.md
|
|
92
|
+
[8]: https://github.com/spree-contrib/spree_i18n
|
data/Rakefile
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
require 'rubygems'
|
|
2
|
+
require 'rake'
|
|
3
|
+
require 'rake/testtask'
|
|
4
|
+
require 'rake/packagetask'
|
|
5
|
+
require 'rubygems/package_task'
|
|
6
|
+
require 'rspec/core/rake_task'
|
|
7
|
+
require 'spree/testing_support/extension_rake'
|
|
8
|
+
|
|
9
|
+
Bundler::GemHelper.install_tasks
|
|
10
|
+
RSpec::Core::RakeTask.new
|
|
11
|
+
|
|
12
|
+
task default: :spec
|
|
13
|
+
|
|
14
|
+
spec = eval(File.read('spree_mobility.gemspec'))
|
|
15
|
+
|
|
16
|
+
Gem::PackageTask.new(spec) do |p|
|
|
17
|
+
p.gem_spec = spec
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
desc 'Generates a dummy app for testing'
|
|
21
|
+
task :test_app do
|
|
22
|
+
ENV['LIB_NAME'] = 'spree_mobility'
|
|
23
|
+
Rake::Task['extension:test_app'].invoke
|
|
24
|
+
end
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
(function() {
|
|
2
|
+
var root;
|
|
3
|
+
|
|
4
|
+
root = typeof exports !== "undefined" && exports !== null ? exports : this;
|
|
5
|
+
|
|
6
|
+
root.taxon_tree_menu = function(obj, context) {
|
|
7
|
+
var admin_base_url, edit_url, id, translation_base_path, translation_url;
|
|
8
|
+
id = obj.attr("id");
|
|
9
|
+
admin_base_url = Spree.url(Spree.routes.admin_taxonomy_taxons_path);
|
|
10
|
+
edit_url = admin_base_url.clone();
|
|
11
|
+
edit_url.setPath(edit_url.path() + '/' + id + "/edit");
|
|
12
|
+
translation_url = Spree.url(admin_base_url.path().replace(/\/taxonomies\/\d.+$/, '') + '/taxons/' + id + '/translations');
|
|
13
|
+
return {
|
|
14
|
+
create: {
|
|
15
|
+
label: "<span class='icon icon-plus'></span> " + Spree.translations.add,
|
|
16
|
+
action: function(obj) {
|
|
17
|
+
return context.create(obj);
|
|
18
|
+
}
|
|
19
|
+
},
|
|
20
|
+
rename: {
|
|
21
|
+
label: "<span class='icon icon-pencil'></span> " + Spree.translations.rename,
|
|
22
|
+
action: function(obj) {
|
|
23
|
+
return context.rename(obj);
|
|
24
|
+
}
|
|
25
|
+
},
|
|
26
|
+
remove: {
|
|
27
|
+
label: "<span class='icon icon-trash'></span> " + Spree.translations.remove,
|
|
28
|
+
action: function(obj) {
|
|
29
|
+
return context.remove(obj);
|
|
30
|
+
}
|
|
31
|
+
},
|
|
32
|
+
edit: {
|
|
33
|
+
separator_before: true,
|
|
34
|
+
label: "<span class='icon icon-cog'></span> " + Spree.translations.edit,
|
|
35
|
+
action: function(obj) {
|
|
36
|
+
return window.location = edit_url.toString();
|
|
37
|
+
}
|
|
38
|
+
},
|
|
39
|
+
translate: {
|
|
40
|
+
separator_before: true,
|
|
41
|
+
label: "<span class='icon icon-flag'></span> " + Spree.translations.translations,
|
|
42
|
+
action: function(obj) {
|
|
43
|
+
return window.location = translation_url.toString();
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
};
|
|
47
|
+
};
|
|
48
|
+
|
|
49
|
+
}).call(this);
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
(function() {
|
|
2
|
+
var display_locale_fields;
|
|
3
|
+
|
|
4
|
+
display_locale_fields = function() {
|
|
5
|
+
var attr, locale, locales, show, _fn, _i, _len;
|
|
6
|
+
attr = $('#attr_list a.active').data('attr');
|
|
7
|
+
locale = $('#locale').val();
|
|
8
|
+
available_locales = $('#available_locales').val().split(',');
|
|
9
|
+
show = $("select[name='show-only']").val();
|
|
10
|
+
$('#attr_fields .panel').hide();
|
|
11
|
+
_fn = function(locale) {
|
|
12
|
+
var display, value;
|
|
13
|
+
value = $('#attr_fields .panel.' + attr + '.' + locale + ' :input').val().replace(/^\s+|\s+$/g, "");
|
|
14
|
+
if (show === 'incomplete') {
|
|
15
|
+
display = value === '';
|
|
16
|
+
} else if (show === 'complete') {
|
|
17
|
+
display = value !== '';
|
|
18
|
+
} else {
|
|
19
|
+
display = true;
|
|
20
|
+
}
|
|
21
|
+
if (display) {
|
|
22
|
+
return $('#attr_fields .panel.' + attr + '.' + locale).show();
|
|
23
|
+
}
|
|
24
|
+
};
|
|
25
|
+
if (locale === '') {
|
|
26
|
+
available_locales.forEach(function(locale) { _fn(locale) });
|
|
27
|
+
} else {
|
|
28
|
+
_fn(locale);
|
|
29
|
+
}
|
|
30
|
+
if ($('#attr_fields .panel:visible').length === 0 && show !== 'all') {
|
|
31
|
+
return $('#attr_fields .no-translations').show();
|
|
32
|
+
}
|
|
33
|
+
};
|
|
34
|
+
|
|
35
|
+
$(function() {
|
|
36
|
+
$('#attr_list a').click(function() {
|
|
37
|
+
$('#attr_list a').removeClass('active');
|
|
38
|
+
$(this).addClass('active');
|
|
39
|
+
display_locale_fields();
|
|
40
|
+
return false;
|
|
41
|
+
});
|
|
42
|
+
$('#locale').change(function() {
|
|
43
|
+
return display_locale_fields();
|
|
44
|
+
});
|
|
45
|
+
return $("select[name='show-only']").change(function() {
|
|
46
|
+
return display_locale_fields();
|
|
47
|
+
});
|
|
48
|
+
});
|
|
49
|
+
|
|
50
|
+
}).call(this);
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
module SpreeMobility
|
|
2
|
+
# The fact this logic is in a single module also helps to apply a custom
|
|
3
|
+
# locale on the spree/api context since api base controller inherits from
|
|
4
|
+
# MetalController instead of Spree::BaseController
|
|
5
|
+
module ControllerMobilityHelper
|
|
6
|
+
extend ActiveSupport::Concern
|
|
7
|
+
|
|
8
|
+
included do
|
|
9
|
+
prepend_before_action :mobility_fallbacks
|
|
10
|
+
|
|
11
|
+
private
|
|
12
|
+
|
|
13
|
+
def mobility_fallbacks
|
|
14
|
+
SpreeMobility::Fallbacks.config!
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
end
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
module Spree
|
|
2
|
+
module Admin
|
|
3
|
+
module OptionValuesControllerDecorator
|
|
4
|
+
def update
|
|
5
|
+
option_value = Spree::OptionValue.find(params[:id])
|
|
6
|
+
option_value.update update_option_value_attribute
|
|
7
|
+
redirect_to spree.edit_admin_option_type_path(option_value.option_type)
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
private
|
|
11
|
+
|
|
12
|
+
def update_option_value_attribute
|
|
13
|
+
params.require(:option_value).permit(permitted_params)
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def permitted_params
|
|
17
|
+
Spree::PermittedAttributes.option_value_attributes
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
SpreeMobility.prepend_once(::Spree::Admin::OptionValuesController, Spree::Admin::OptionValuesControllerDecorator)
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
module Spree
|
|
2
|
+
module Admin
|
|
3
|
+
module ProductPropertiesControllerDecorator
|
|
4
|
+
def translate
|
|
5
|
+
product_property = Spree::ProductProperty.find(params[:id])
|
|
6
|
+
product_property.update update_product_property_attribute
|
|
7
|
+
redirect_to spree.admin_product_product_properties_path(product_property.product)
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
private
|
|
11
|
+
def update_product_property_attribute
|
|
12
|
+
params.require(:product_property).permit(permitted_params)
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def permitted_params
|
|
16
|
+
[translations_attributes: [:id, :locale, :value]]
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
SpreeMobility.prepend_once(::Spree::Admin::ProductPropertiesController, Spree::Admin::ProductPropertiesControllerDecorator)
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
module Spree
|
|
2
|
+
module Admin
|
|
3
|
+
module ShippingMethodsControllerDecorator
|
|
4
|
+
private
|
|
5
|
+
# We have to override those filters since they break proper PATCH behaviour.
|
|
6
|
+
|
|
7
|
+
def set_shipping_category
|
|
8
|
+
super unless params['shipping_method'][:translations_attributes]
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
def set_zones
|
|
12
|
+
super unless params['shipping_method'][:translations_attributes]
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
SpreeMobility.prepend_once(::Spree::Admin::ShippingMethodsController, Spree::Admin::ShippingMethodsControllerDecorator)
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
module Spree
|
|
2
|
+
class Admin::TranslationsController < Admin::BaseController
|
|
3
|
+
before_action :load_parent
|
|
4
|
+
|
|
5
|
+
if defined?(SpreeI18n::ControllerLocaleHelper)
|
|
6
|
+
helper 'spree_i18n/locale'
|
|
7
|
+
end
|
|
8
|
+
helper 'spree_mobility/locale'
|
|
9
|
+
|
|
10
|
+
helper_method :collection_url
|
|
11
|
+
|
|
12
|
+
def index
|
|
13
|
+
render resource_name
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
private
|
|
17
|
+
|
|
18
|
+
def load_parent
|
|
19
|
+
set_resource_ivar(resource)
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def resource_name
|
|
23
|
+
params[:resource].singularize
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def set_resource_ivar(resource)
|
|
27
|
+
instance_variable_set("@#{resource_name}", resource)
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def klass
|
|
31
|
+
@klass ||= "Spree::#{params[:resource].classify}".constantize
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
def resource
|
|
35
|
+
@resource ||= if slugged_models.include? klass.name
|
|
36
|
+
klass.friendly.find(params[:resource_id])
|
|
37
|
+
else
|
|
38
|
+
klass.find(params[:resource_id])
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
def collection_url
|
|
43
|
+
ActionController::Routing::Routes.recognize_path("admin_#{resource_name}_url", @resource)
|
|
44
|
+
send "admin_#{resource_name}_url", @resource
|
|
45
|
+
rescue
|
|
46
|
+
send "edit_admin_#{resource_name}_url", @resource
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
def slugged_models
|
|
50
|
+
["Spree::Product"]
|
|
51
|
+
end
|
|
52
|
+
end
|
|
53
|
+
end
|