mirror of
https://github.com/openfoodfoundation/openfoodnetwork
synced 2026-01-12 18:36:49 +00:00
Compare commits
385 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
b17d3e447c | ||
|
|
2ae4234015 | ||
|
|
20874dec98 | ||
|
|
288cd367bc | ||
|
|
68902021ab | ||
|
|
7f9c578fca | ||
|
|
782c9150a2 | ||
|
|
447b040020 | ||
|
|
6bdb89d090 | ||
|
|
a63531c8c2 | ||
|
|
de2a15e3e1 | ||
|
|
e5f5d42d59 | ||
|
|
f23de206d9 | ||
|
|
729bcdf291 | ||
|
|
62d0ce290a | ||
|
|
96ead52fcc | ||
|
|
ff708952ab | ||
|
|
2daa49406a | ||
|
|
125bc3d14b | ||
|
|
02300d6bb6 | ||
|
|
aba3968bca | ||
|
|
23c4298519 | ||
|
|
d7047bb4cc | ||
|
|
1ce029d8e4 | ||
|
|
eb7d20d74d | ||
|
|
c4ba1e6616 | ||
|
|
f97ccb4203 | ||
|
|
df8283661d | ||
|
|
d9ee56b4a5 | ||
|
|
2230a1f179 | ||
|
|
a9c8d9f304 | ||
|
|
a7644f8e8b | ||
|
|
5dd2737811 | ||
|
|
d9b534b829 | ||
|
|
a78768c291 | ||
|
|
b9a7ff903f | ||
|
|
fc6b61fc87 | ||
|
|
131772f7b2 | ||
|
|
440e776e3a | ||
|
|
56b9c28955 | ||
|
|
c34942dbf0 | ||
|
|
2814b1f399 | ||
|
|
0e13e5408f | ||
|
|
12906d1e13 | ||
|
|
103bc50bdc | ||
|
|
b6cccc2e1d | ||
|
|
918e583d01 | ||
|
|
6371f7eff6 | ||
|
|
60bea89f5c | ||
|
|
7b8ccccdc3 | ||
|
|
f88689e45f | ||
|
|
1c1a7ffe9b | ||
|
|
0cae069769 | ||
|
|
0aa11581af | ||
|
|
4d72c807ea | ||
|
|
f182712188 | ||
|
|
1171577d5d | ||
|
|
d05522c21c | ||
|
|
cbdb3c2834 | ||
|
|
87c3165a24 | ||
|
|
81e96298b5 | ||
|
|
b99383185b | ||
|
|
66485e2e16 | ||
|
|
c1b60d88d6 | ||
|
|
b734067785 | ||
|
|
e7bf912a23 | ||
|
|
b07a0fca50 | ||
|
|
348f806bbe | ||
|
|
89037e160c | ||
|
|
eab8e2be6c | ||
|
|
d146684acb | ||
|
|
08e23023b3 | ||
|
|
c3fe399f0c | ||
|
|
182e5bd0ee | ||
|
|
bccee0698f | ||
|
|
11928859bc | ||
|
|
6a0b9cbb76 | ||
|
|
075e295fc2 | ||
|
|
151f96f673 | ||
|
|
2d7c593fe6 | ||
|
|
5cded5ba8d | ||
|
|
4f15b5a65b | ||
|
|
bf1cbe615f | ||
|
|
890ab6796e | ||
|
|
10aa7730e5 | ||
|
|
116e844004 | ||
|
|
16289a62f1 | ||
|
|
e9fa360d61 | ||
|
|
e6eb9412d9 | ||
|
|
401210ef44 | ||
|
|
f484518ee5 | ||
|
|
066c7bb449 | ||
|
|
165fb59f64 | ||
|
|
42bc9d7f82 | ||
|
|
25d8ce1737 | ||
|
|
f8dce4053a | ||
|
|
c93945a111 | ||
|
|
30b2f9164e | ||
|
|
c83dac58a3 | ||
|
|
f355f1ccfb | ||
|
|
166e2f525e | ||
|
|
d70c34fbd0 | ||
|
|
27630a4304 | ||
|
|
953ff2bd08 | ||
|
|
d7fa508b60 | ||
|
|
815cef16cc | ||
|
|
3d5584e47c | ||
|
|
cb64361096 | ||
|
|
bba41177b4 | ||
|
|
800ccf5037 | ||
|
|
8c7b4f73f7 | ||
|
|
8b0c4ee0ac | ||
|
|
3ffe39d467 | ||
|
|
956ed826a1 | ||
|
|
13383316af | ||
|
|
28f0d69540 | ||
|
|
e705aa51bd | ||
|
|
a7e6760028 | ||
|
|
06d370a8ac | ||
|
|
013533f7de | ||
|
|
d199dea5eb | ||
|
|
084211f52a | ||
|
|
604fd75cff | ||
|
|
8b89c8d7e0 | ||
|
|
e4845f4165 | ||
|
|
c015b2066f | ||
|
|
f7f49377b4 | ||
|
|
960dd81b76 | ||
|
|
dda61d17ee | ||
|
|
8ff197457e | ||
|
|
c43834915d | ||
|
|
10d8e80c45 | ||
|
|
0738133e99 | ||
|
|
15c241295e | ||
|
|
4e2430ea58 | ||
|
|
4661b47ede | ||
|
|
e2ea4d21f4 | ||
|
|
2f0e00370b | ||
|
|
45da8fddf1 | ||
|
|
b91bb8961f | ||
|
|
5e3b0cf47c | ||
|
|
ba46756cba | ||
|
|
f6c9246e20 | ||
|
|
11e9329b97 | ||
|
|
1a7598d96d | ||
|
|
2eec3d625a | ||
|
|
ba30606052 | ||
|
|
f6f62515b5 | ||
|
|
a75892ccc1 | ||
|
|
0082653170 | ||
|
|
cc0b23c0bd | ||
|
|
b3ad5aeaca | ||
|
|
ffe9756f50 | ||
|
|
40eb5e320b | ||
|
|
4e4a392a8c | ||
|
|
e3fa933699 | ||
|
|
e5ca8b0ee1 | ||
|
|
cf8d9c6d07 | ||
|
|
78a6317c84 | ||
|
|
fa57e37467 | ||
|
|
7c24f6b26f | ||
|
|
f9f6abf740 | ||
|
|
e6c0dd95c4 | ||
|
|
ade2eda638 | ||
|
|
0a3d362282 | ||
|
|
08fb496f55 | ||
|
|
4cea7b1957 | ||
|
|
88607a3dce | ||
|
|
a39598d049 | ||
|
|
9a03023b6b | ||
|
|
2091eff671 | ||
|
|
d3e0ff269f | ||
|
|
eb67340c52 | ||
|
|
75ed68c9cb | ||
|
|
255fc64fdb | ||
|
|
40bc53c16b | ||
|
|
6de1fdc4ff | ||
|
|
d9eb97bd05 | ||
|
|
28286a4c3e | ||
|
|
6ec219031d | ||
|
|
c84ec148db | ||
|
|
eeb059ae17 | ||
|
|
7a5b7c4f64 | ||
|
|
613c693774 | ||
|
|
696edac813 | ||
|
|
f9817925aa | ||
|
|
3e03988d93 | ||
|
|
bb71b281d6 | ||
|
|
cf519116ee | ||
|
|
8dc50caaa8 | ||
|
|
f8c802ace4 | ||
|
|
9ea9ac99f9 | ||
|
|
1cf55cde4d | ||
|
|
503e0ecba1 | ||
|
|
4aa6898ecb | ||
|
|
180434c5bd | ||
|
|
7fe913713a | ||
|
|
ecc2c7ba43 | ||
|
|
32fc1eae61 | ||
|
|
822f640997 | ||
|
|
2d0e64a7d3 | ||
|
|
f5e1cbca08 | ||
|
|
51272eef00 | ||
|
|
2f6a910a1c | ||
|
|
9ca25df934 | ||
|
|
a3e1193f28 | ||
|
|
889b132069 | ||
|
|
3e18445c36 | ||
|
|
3c158cd061 | ||
|
|
c464f3a43d | ||
|
|
84be4aec7b | ||
|
|
d9d18b086c | ||
|
|
80f015912a | ||
|
|
3b6202313a | ||
|
|
d05bb508de | ||
|
|
02ba8c1bf5 | ||
|
|
3c83b053ce | ||
|
|
64032c9207 | ||
|
|
dee797c427 | ||
|
|
68b60a11b0 | ||
|
|
3b8f2ee4b3 | ||
|
|
8c91e3d8fd | ||
|
|
045db5dd49 | ||
|
|
24e8c0f973 | ||
|
|
761a6731db | ||
|
|
b1ca2c90ce | ||
|
|
cd3897db30 | ||
|
|
f3ffeaf3b4 | ||
|
|
76c6b438b5 | ||
|
|
a08c7f7823 | ||
|
|
c9da3200eb | ||
|
|
b1d22f7982 | ||
|
|
d65b1bb386 | ||
|
|
2633ee3606 | ||
|
|
4027eacc06 | ||
|
|
236e77efd4 | ||
|
|
a486a08bfc | ||
|
|
292338d467 | ||
|
|
a3278ab6d3 | ||
|
|
416a2efea9 | ||
|
|
4cf45dcfe1 | ||
|
|
0f06c86008 | ||
|
|
f8cceef932 | ||
|
|
d5b0891a74 | ||
|
|
81b4433b02 | ||
|
|
b73d78c785 | ||
|
|
b7b80509dc | ||
|
|
57d36d2ff1 | ||
|
|
c38f1b88d3 | ||
|
|
8c6a32100d | ||
|
|
559b953e16 | ||
|
|
73d98bd1b4 | ||
|
|
fd278e0086 | ||
|
|
66a29e58d2 | ||
|
|
313fdab346 | ||
|
|
722b04a211 | ||
|
|
97b5a7f99c | ||
|
|
0ca7319e32 | ||
|
|
80ba228910 | ||
|
|
0f203a474c | ||
|
|
c37564eea7 | ||
|
|
abf90b8437 | ||
|
|
1682f6788d | ||
|
|
10bacea861 | ||
|
|
237b0f03b5 | ||
|
|
f4980fa84d | ||
|
|
c9e6d24eb0 | ||
|
|
f2b407c194 | ||
|
|
b48b3ad42b | ||
|
|
af5e44e3f3 | ||
|
|
68acca2530 | ||
|
|
180aabdb90 | ||
|
|
c82af88c48 | ||
|
|
40eae3f84d | ||
|
|
597e9eae2b | ||
|
|
332c95dec5 | ||
|
|
7a967715aa | ||
|
|
c302640644 | ||
|
|
ad0ffd2a64 | ||
|
|
8bd890f311 | ||
|
|
64e6bd8248 | ||
|
|
e066e5ca74 | ||
|
|
9317cc41b9 | ||
|
|
1a35882fb6 | ||
|
|
ec3d7174de | ||
|
|
207a3c9ea7 | ||
|
|
9ff8433a8d | ||
|
|
6549ad7d2a | ||
|
|
7d1b71e640 | ||
|
|
bddd887dcd | ||
|
|
d00e75de70 | ||
|
|
06cbc120f5 | ||
|
|
e91c4f1318 | ||
|
|
428b8b0314 | ||
|
|
7d5ddb9cf6 | ||
|
|
cc5632fd14 | ||
|
|
9b2ed8846c | ||
|
|
e18454c55a | ||
|
|
785350a089 | ||
|
|
ef4731022e | ||
|
|
8adb8a5eaf | ||
|
|
a0d1183fc0 | ||
|
|
3b49ba4de1 | ||
|
|
ef4c99bf49 | ||
|
|
40d767928e | ||
|
|
5e689b12fe | ||
|
|
518a029b59 | ||
|
|
2b14269dae | ||
|
|
a463a39abc | ||
|
|
99a0056d7f | ||
|
|
0973e79a91 | ||
|
|
d0897ec677 | ||
|
|
915174b513 | ||
|
|
f5aae5f8b9 | ||
|
|
e94fff0d69 | ||
|
|
14189aef5c | ||
|
|
6dc54fbd22 | ||
|
|
1e3f754f96 | ||
|
|
095e520777 | ||
|
|
452b38fa36 | ||
|
|
496bc9120a | ||
|
|
a386d33197 | ||
|
|
762e27b015 | ||
|
|
29915cdbbd | ||
|
|
5cfedddba4 | ||
|
|
d5ae5c9af4 | ||
|
|
01c6a8b9ec | ||
|
|
44677fac87 | ||
|
|
dda85666e6 | ||
|
|
dd876dfd8d | ||
|
|
ef309c0fd0 | ||
|
|
de97c59632 | ||
|
|
5d4ab5c1f8 | ||
|
|
bf9cfd4990 | ||
|
|
d3251dc03f | ||
|
|
d3b80b7fc9 | ||
|
|
d9aa125903 | ||
|
|
444d689f14 | ||
|
|
801ebe5819 | ||
|
|
7f4e5d3f2e | ||
|
|
107bb3df66 | ||
|
|
dcbf2ae96b | ||
|
|
f2c0a77641 | ||
|
|
958a1bde9f | ||
|
|
cff06011f1 | ||
|
|
0e878d8ce1 | ||
|
|
678c60c9b6 | ||
|
|
83335cfab4 | ||
|
|
a762aa6ff9 | ||
|
|
6b1d6e33c0 | ||
|
|
24d29c6949 | ||
|
|
1609cc49e3 | ||
|
|
8c458c2d48 | ||
|
|
0fc108a8e6 | ||
|
|
f888a0eb21 | ||
|
|
994232f6d1 | ||
|
|
a97fb0f46b | ||
|
|
73c81e626c | ||
|
|
634a54e3f1 | ||
|
|
8f519eaf21 | ||
|
|
dd0957fa72 | ||
|
|
6d68460950 | ||
|
|
79320331c0 | ||
|
|
85d9650903 | ||
|
|
970b7b6738 | ||
|
|
428b589357 | ||
|
|
118d3a9d8e | ||
|
|
54acfbf7f2 | ||
|
|
5708fb04a5 | ||
|
|
fa4ff7534b | ||
|
|
4bae28bbad | ||
|
|
e1b79db65e | ||
|
|
d413a39c3c | ||
|
|
d153adca9b | ||
|
|
38fe572943 | ||
|
|
ee1ad57c7f | ||
|
|
19df15d75b | ||
|
|
92c4bd9eb7 | ||
|
|
4822be532b | ||
|
|
c87c8ed0df | ||
|
|
1313b55531 | ||
|
|
61037aa5ad | ||
|
|
6e76bcac4a | ||
|
|
91af282ccc | ||
|
|
8958fe4199 |
@@ -2,3 +2,4 @@
|
||||
.gitignore
|
||||
log/*
|
||||
tmp/*
|
||||
node_modules/
|
||||
|
||||
11
.gitattributes
vendored
Normal file
11
.gitattributes
vendored
Normal file
@@ -0,0 +1,11 @@
|
||||
# Set default behavior to automatically normalize line endings.
|
||||
* text=auto
|
||||
|
||||
# Set line endings to LF, even on Windows. Otherwise, execution within Docker fails.
|
||||
# See https://docs.github.com/en/get-started/getting-started-with-git/configuring-git-to-handle-line-endings#per-repository-settings
|
||||
*.sh text eol=lf
|
||||
|
||||
# Same thing for following files, but they don't have an sh extension
|
||||
pre-commit eol=lf
|
||||
webpack-dev-server eol=lf
|
||||
install-bundler eol=lf
|
||||
4
.github/dependabot.yml
vendored
4
.github/dependabot.yml
vendored
@@ -6,10 +6,12 @@ updates:
|
||||
schedule:
|
||||
interval: "daily"
|
||||
open-pull-requests-limit: 10
|
||||
# Only specific requirements are specified in Gemfile, so don't touch it.
|
||||
versioning-strategy: lockfile-only
|
||||
|
||||
- package-ecosystem: "npm"
|
||||
directory: "/"
|
||||
schedule:
|
||||
interval: "daily"
|
||||
versioning-strategy: lockfile-only
|
||||
# All versions are specified in package.json, so please update them.
|
||||
versioning-strategy: increase
|
||||
|
||||
14
.github/workflows/build.yml
vendored
14
.github/workflows/build.yml
vendored
@@ -57,7 +57,7 @@ jobs:
|
||||
|
||||
- uses: actions/setup-node@v3
|
||||
with:
|
||||
node-version: 16
|
||||
node-version-file: .node-version
|
||||
|
||||
- name: Install JS dependencies
|
||||
run: yarn install --frozen-lockfile
|
||||
@@ -126,7 +126,7 @@ jobs:
|
||||
|
||||
- uses: actions/setup-node@v3
|
||||
with:
|
||||
node-version: 16
|
||||
node-version-file: .node-version
|
||||
|
||||
- name: Install JS dependencies
|
||||
run: yarn install --frozen-lockfile
|
||||
@@ -195,7 +195,7 @@ jobs:
|
||||
|
||||
- uses: actions/setup-node@v3
|
||||
with:
|
||||
node-version: 16
|
||||
node-version-file: .node-version
|
||||
|
||||
- name: Install JS dependencies
|
||||
run: yarn install --frozen-lockfile
|
||||
@@ -273,7 +273,7 @@ jobs:
|
||||
|
||||
- uses: actions/setup-node@v3
|
||||
with:
|
||||
node-version: 16
|
||||
node-version-file: .node-version
|
||||
|
||||
- name: Install JS dependencies
|
||||
run: yarn install --frozen-lockfile
|
||||
@@ -351,7 +351,7 @@ jobs:
|
||||
|
||||
- uses: actions/setup-node@v3
|
||||
with:
|
||||
node-version: 16
|
||||
node-version-file: .node-version
|
||||
|
||||
- name: Install JS dependencies
|
||||
run: yarn install --frozen-lockfile
|
||||
@@ -429,7 +429,7 @@ jobs:
|
||||
|
||||
- uses: actions/setup-node@v3
|
||||
with:
|
||||
node-version: 16
|
||||
node-version-file: .node-version
|
||||
|
||||
- name: Install JS dependencies
|
||||
run: yarn install --frozen-lockfile
|
||||
@@ -489,7 +489,7 @@ jobs:
|
||||
|
||||
- uses: actions/setup-node@v3
|
||||
with:
|
||||
node-version: 16
|
||||
node-version-file: .node-version
|
||||
|
||||
- name: Install JS dependencies
|
||||
run: yarn install --frozen-lockfile
|
||||
|
||||
8
.github/workflows/linters.yml
vendored
8
.github/workflows/linters.yml
vendored
@@ -24,6 +24,14 @@ jobs:
|
||||
steps:
|
||||
- name: Check out code
|
||||
uses: actions/checkout@v3
|
||||
|
||||
- uses: actions/setup-node@v3
|
||||
with:
|
||||
node-version-file: .node-version
|
||||
|
||||
- name: Install JS dependencies
|
||||
run: yarn install --frozen-lockfile
|
||||
|
||||
- name: prettier
|
||||
uses: EPMatt/reviewdog-action-prettier@v1
|
||||
with:
|
||||
|
||||
@@ -1 +1 @@
|
||||
14.16.1
|
||||
14.21.2
|
||||
|
||||
@@ -119,7 +119,6 @@ Layout/LineLength:
|
||||
- 'spec/controllers/admin/bulk_line_items_controller_spec.rb'
|
||||
- 'spec/controllers/admin/column_preferences_controller_spec.rb'
|
||||
- 'spec/controllers/admin/enterprises_controller_spec.rb'
|
||||
- 'spec/controllers/admin/manager_invitations_controller_spec.rb'
|
||||
- 'spec/controllers/admin/order_cycles_controller_spec.rb'
|
||||
- 'spec/controllers/admin/schedules_controller_spec.rb'
|
||||
- 'spec/controllers/admin/stripe_accounts_controller_spec.rb'
|
||||
@@ -839,7 +838,6 @@ Rails/OutputSafety:
|
||||
- 'lib/reporting/queries/query_builder.rb'
|
||||
- 'lib/reporting/queries/query_interface.rb'
|
||||
- 'lib/spree/money.rb'
|
||||
- 'spec/system/admin/order_print_ticket_spec.rb'
|
||||
|
||||
# Offense count: 1
|
||||
# This cop supports unsafe autocorrection (--autocorrect-all).
|
||||
|
||||
@@ -35,7 +35,10 @@ ENV BUNDLE_PATH /bundles
|
||||
ENV LD_PRELOAD=/usr/lib/x86_64-linux-gnu/libjemalloc.so
|
||||
|
||||
WORKDIR /usr/src/app
|
||||
COPY .ruby-version .
|
||||
|
||||
# trim spaces and line return from .ruby-version file
|
||||
COPY .ruby-version .ruby-version.raw
|
||||
RUN cat .ruby-version.raw | tr -d '\r\t ' > .ruby-version
|
||||
|
||||
# Install Rbenv & Ruby
|
||||
RUN git clone --depth 1 https://github.com/rbenv/rbenv.git ${RBENV_ROOT} && \
|
||||
|
||||
@@ -11,6 +11,9 @@ Head to our wiki on [Learning Rails](https://github.com/openfoodfoundation/openf
|
||||
The fastest way to make it work locally is to use Docker, you only need to setup git, see the [Docker setup guide](docker/README.md).
|
||||
Otherwise, for a local setup you will need:
|
||||
* Ruby and bundler (check current Ruby version in [.ruby-version](https://github.com/openfoodfoundation/openfoodnetwork/blob/master/.ruby-version) file)
|
||||
- To manage versions, it's recommended to use [rbenv](https://github.com/rbenv/rbenv) or [RVM](https://rvm.io/)
|
||||
* Node and yarn (check current Node version in [.node-version](https://github.com/openfoodfoundation/openfoodnetwork/blob/master/.node-version) file)
|
||||
- [nodevn](https://github.com/nodenv/nodenv) is recommended.
|
||||
* PostgreSQL database
|
||||
* Redis (for background jobs)
|
||||
* Chrome (for testing)
|
||||
@@ -20,8 +23,6 @@ The following guides will provide OS-specific step-by-step instructions to get t
|
||||
- [Debian Setup Guide][debian]
|
||||
- [OSX Setup Guide][osx]
|
||||
|
||||
If you are likely to need to manage multiple version of ruby on your local machine, we recommend version managers such as [rbenv](https://github.com/rbenv/rbenv) or [RVM](https://rvm.io/).
|
||||
|
||||
For those new to Rails, the following tutorial will help get you up to speed with configuring a [Rails environment](http://guides.rubyonrails.org/getting_started.html).
|
||||
|
||||
### Get it
|
||||
|
||||
16
Gemfile
16
Gemfile
@@ -17,7 +17,7 @@ gem 'activemerchant', '>= 1.78.0'
|
||||
gem 'rexml'
|
||||
gem 'angular-rails-templates', '>= 0.3.0'
|
||||
gem 'awesome_nested_set'
|
||||
gem 'ransack', '2.4.2'
|
||||
gem 'ransack', '~> 2.6.0'
|
||||
gem 'responders'
|
||||
gem 'webpacker', '~> 5'
|
||||
|
||||
@@ -69,7 +69,7 @@ gem 'pagy', '~> 5.1'
|
||||
gem 'rswag-api'
|
||||
gem 'rswag-ui'
|
||||
|
||||
gem 'gitlab-omniauth-openid-connect', require: 'omniauth_openid_connect'
|
||||
gem 'omniauth_openid_connect'
|
||||
gem 'openid_connect', '~> 1.3'
|
||||
gem 'omniauth-rails_csrf_protection'
|
||||
|
||||
@@ -83,16 +83,15 @@ gem 'actionpack-action_caching'
|
||||
# AMS is deprecated, we will introduce an alternative at some point
|
||||
gem "active_model_serializers", "0.8.4"
|
||||
gem 'activerecord-session_store'
|
||||
gem 'acts-as-taggable-on', '~> 8.1'
|
||||
gem 'acts-as-taggable-on'
|
||||
gem 'angularjs-file-upload-rails', '~> 2.4.1'
|
||||
gem 'bigdecimal', '3.0.2'
|
||||
gem 'bootsnap', require: false
|
||||
gem 'geocoder'
|
||||
gem 'gmaps4rails'
|
||||
gem 'mimemagic', '> 0.3.5'
|
||||
gem 'paper_trail', '~> 12.1.0'
|
||||
gem 'paper_trail', '~> 12.1'
|
||||
gem 'rack-rewrite'
|
||||
gem 'rack-ssl', require: 'rack/ssl'
|
||||
gem 'roadie-rails'
|
||||
|
||||
gem 'hiredis'
|
||||
@@ -109,8 +108,8 @@ gem 'wicked_pdf'
|
||||
gem 'wkhtmltopdf-binary'
|
||||
|
||||
gem 'immigrant'
|
||||
gem 'roo'
|
||||
gem 'spreadsheet_architect'
|
||||
gem 'roo' # read spreadsheets
|
||||
gem 'spreadsheet_architect' # write spreadsheets
|
||||
|
||||
gem 'whenever', require: false
|
||||
|
||||
@@ -126,8 +125,6 @@ gem 'jquery-rails', '4.4.0'
|
||||
gem 'jquery-ui-rails', '~> 4.2'
|
||||
gem "select2-rails", github: "openfoodfoundation/select2-rails", branch: "v349_with_thor_v1"
|
||||
|
||||
gem 'ofn-qz', github: 'openfoodfoundation/ofn-qz', branch: 'ofn-rails-4'
|
||||
|
||||
gem 'good_migrations'
|
||||
|
||||
gem 'flipper'
|
||||
@@ -185,6 +182,5 @@ group :development do
|
||||
gem 'spring-commands-rspec'
|
||||
gem 'web-console'
|
||||
|
||||
|
||||
gem 'rack-mini-profiler', '< 3.0.0'
|
||||
end
|
||||
|
||||
316
Gemfile.lock
316
Gemfile.lock
@@ -8,13 +8,6 @@ GIT
|
||||
fog-core (~> 1.0)
|
||||
rails (>= 3.2.0, < 7.0)
|
||||
|
||||
GIT
|
||||
remote: https://github.com/openfoodfoundation/ofn-qz.git
|
||||
revision: 467f6ea1c44529c7c91cac4c8211bbd863588c0b
|
||||
branch: ofn-rails-4
|
||||
specs:
|
||||
ofn-qz (0.1.0)
|
||||
|
||||
GIT
|
||||
remote: https://github.com/openfoodfoundation/select2-rails.git
|
||||
revision: fc240e85fbdf1878ff3c39d972c0cd9a312f5ed4
|
||||
@@ -51,42 +44,42 @@ GEM
|
||||
remote: https://rubygems.org/
|
||||
specs:
|
||||
Ascii85 (1.1.0)
|
||||
actioncable (6.1.7)
|
||||
actionpack (= 6.1.7)
|
||||
activesupport (= 6.1.7)
|
||||
actioncable (6.1.7.2)
|
||||
actionpack (= 6.1.7.2)
|
||||
activesupport (= 6.1.7.2)
|
||||
nio4r (~> 2.0)
|
||||
websocket-driver (>= 0.6.1)
|
||||
actionmailbox (6.1.7)
|
||||
actionpack (= 6.1.7)
|
||||
activejob (= 6.1.7)
|
||||
activerecord (= 6.1.7)
|
||||
activestorage (= 6.1.7)
|
||||
activesupport (= 6.1.7)
|
||||
actionmailbox (6.1.7.2)
|
||||
actionpack (= 6.1.7.2)
|
||||
activejob (= 6.1.7.2)
|
||||
activerecord (= 6.1.7.2)
|
||||
activestorage (= 6.1.7.2)
|
||||
activesupport (= 6.1.7.2)
|
||||
mail (>= 2.7.1)
|
||||
actionmailer (6.1.7)
|
||||
actionpack (= 6.1.7)
|
||||
actionview (= 6.1.7)
|
||||
activejob (= 6.1.7)
|
||||
activesupport (= 6.1.7)
|
||||
actionmailer (6.1.7.2)
|
||||
actionpack (= 6.1.7.2)
|
||||
actionview (= 6.1.7.2)
|
||||
activejob (= 6.1.7.2)
|
||||
activesupport (= 6.1.7.2)
|
||||
mail (~> 2.5, >= 2.5.4)
|
||||
rails-dom-testing (~> 2.0)
|
||||
actionpack (6.1.7)
|
||||
actionview (= 6.1.7)
|
||||
activesupport (= 6.1.7)
|
||||
actionpack (6.1.7.2)
|
||||
actionview (= 6.1.7.2)
|
||||
activesupport (= 6.1.7.2)
|
||||
rack (~> 2.0, >= 2.0.9)
|
||||
rack-test (>= 0.6.3)
|
||||
rails-dom-testing (~> 2.0)
|
||||
rails-html-sanitizer (~> 1.0, >= 1.2.0)
|
||||
actionpack-action_caching (1.2.2)
|
||||
actionpack (>= 4.0.0)
|
||||
actiontext (6.1.7)
|
||||
actionpack (= 6.1.7)
|
||||
activerecord (= 6.1.7)
|
||||
activestorage (= 6.1.7)
|
||||
activesupport (= 6.1.7)
|
||||
actiontext (6.1.7.2)
|
||||
actionpack (= 6.1.7.2)
|
||||
activerecord (= 6.1.7.2)
|
||||
activestorage (= 6.1.7.2)
|
||||
activesupport (= 6.1.7.2)
|
||||
nokogiri (>= 1.8.5)
|
||||
actionview (6.1.7)
|
||||
activesupport (= 6.1.7)
|
||||
actionview (6.1.7.2)
|
||||
activesupport (= 6.1.7.2)
|
||||
builder (~> 3.1)
|
||||
erubi (~> 1.4)
|
||||
rails-dom-testing (~> 2.0)
|
||||
@@ -98,19 +91,19 @@ GEM
|
||||
activemodel (>= 5.2.0)
|
||||
activestorage (>= 5.2.0)
|
||||
activesupport (>= 5.2.0)
|
||||
activejob (6.1.7)
|
||||
activesupport (= 6.1.7)
|
||||
activejob (6.1.7.2)
|
||||
activesupport (= 6.1.7.2)
|
||||
globalid (>= 0.3.6)
|
||||
activemerchant (1.123.0)
|
||||
activesupport (>= 4.2)
|
||||
builder (>= 2.1.2, < 4.0.0)
|
||||
i18n (>= 0.6.9)
|
||||
nokogiri (~> 1.4)
|
||||
activemodel (6.1.7)
|
||||
activesupport (= 6.1.7)
|
||||
activerecord (6.1.7)
|
||||
activemodel (= 6.1.7)
|
||||
activesupport (= 6.1.7)
|
||||
activemodel (6.1.7.2)
|
||||
activesupport (= 6.1.7.2)
|
||||
activerecord (6.1.7.2)
|
||||
activemodel (= 6.1.7.2)
|
||||
activesupport (= 6.1.7.2)
|
||||
activerecord-import (1.4.1)
|
||||
activerecord (>= 4.2)
|
||||
activerecord-postgresql-adapter (0.0.1)
|
||||
@@ -121,21 +114,21 @@ GEM
|
||||
multi_json (~> 1.11, >= 1.11.2)
|
||||
rack (>= 2.0.8, < 3)
|
||||
railties (>= 5.2.4.1)
|
||||
activestorage (6.1.7)
|
||||
actionpack (= 6.1.7)
|
||||
activejob (= 6.1.7)
|
||||
activerecord (= 6.1.7)
|
||||
activesupport (= 6.1.7)
|
||||
activestorage (6.1.7.2)
|
||||
actionpack (= 6.1.7.2)
|
||||
activejob (= 6.1.7.2)
|
||||
activerecord (= 6.1.7.2)
|
||||
activesupport (= 6.1.7.2)
|
||||
marcel (~> 1.0)
|
||||
mini_mime (>= 1.1.0)
|
||||
activesupport (6.1.7)
|
||||
activesupport (6.1.7.2)
|
||||
concurrent-ruby (~> 1.0, >= 1.0.2)
|
||||
i18n (>= 1.6, < 2)
|
||||
minitest (>= 5.1)
|
||||
tzinfo (~> 2.0)
|
||||
zeitwerk (~> 2.3)
|
||||
acts-as-taggable-on (8.1.0)
|
||||
activerecord (>= 5.0, < 6.2)
|
||||
acts-as-taggable-on (9.0.1)
|
||||
activerecord (>= 6.0, < 7.1)
|
||||
acts_as_list (1.0.4)
|
||||
activerecord (>= 4.2)
|
||||
addressable (2.8.1)
|
||||
@@ -158,8 +151,8 @@ GEM
|
||||
awesome_nested_set (3.5.0)
|
||||
activerecord (>= 4.0.0, < 7.1)
|
||||
aws-eventstream (1.2.0)
|
||||
aws-partitions (1.695.0)
|
||||
aws-sdk-core (3.169.0)
|
||||
aws-partitions (1.711.0)
|
||||
aws-sdk-core (3.170.0)
|
||||
aws-eventstream (~> 1, >= 1.0.2)
|
||||
aws-partitions (~> 1, >= 1.651.0)
|
||||
aws-sigv4 (~> 1.5)
|
||||
@@ -167,7 +160,7 @@ GEM
|
||||
aws-sdk-kms (1.62.0)
|
||||
aws-sdk-core (~> 3, >= 3.165.0)
|
||||
aws-sigv4 (~> 1.1)
|
||||
aws-sdk-s3 (1.118.0)
|
||||
aws-sdk-s3 (1.119.1)
|
||||
aws-sdk-core (~> 3, >= 3.165.0)
|
||||
aws-sdk-kms (~> 1)
|
||||
aws-sigv4 (~> 1.4)
|
||||
@@ -175,11 +168,11 @@ GEM
|
||||
aws-eventstream (~> 1, >= 1.0.2)
|
||||
bcrypt (3.1.18)
|
||||
bigdecimal (3.0.2)
|
||||
bindata (2.4.12)
|
||||
bindata (2.4.15)
|
||||
bindex (0.8.1)
|
||||
bootsnap (1.16.0)
|
||||
msgpack (~> 1.2)
|
||||
bugsnag (6.25.1)
|
||||
bugsnag (6.25.2)
|
||||
concurrent-ruby (~> 1.0)
|
||||
builder (3.2.4)
|
||||
bullet (7.0.7)
|
||||
@@ -221,7 +214,7 @@ GEM
|
||||
combine_pdf (1.0.22)
|
||||
matrix
|
||||
ruby-rc4 (>= 0.1.5)
|
||||
concurrent-ruby (1.2.0)
|
||||
concurrent-ruby (1.2.2)
|
||||
connection_pool (2.3.0)
|
||||
crack (0.4.5)
|
||||
rexml
|
||||
@@ -237,12 +230,13 @@ GEM
|
||||
activerecord (>= 5.a)
|
||||
database_cleaner-core (~> 2.0.0)
|
||||
database_cleaner-core (2.0.1)
|
||||
ddtrace (1.8.0)
|
||||
debase-ruby_core_source (>= 0.10.16, <= 0.10.18)
|
||||
libdatadog (~> 0.9.0.1.0)
|
||||
libddwaf (~> 1.5.1.0.0)
|
||||
date (3.3.3)
|
||||
ddtrace (1.10.1)
|
||||
debase-ruby_core_source (>= 0.10.16, <= 3.2.0)
|
||||
libdatadog (~> 2.0.0.1.0)
|
||||
libddwaf (~> 1.6.2.0.0)
|
||||
msgpack
|
||||
debase-ruby_core_source (0.10.18)
|
||||
debase-ruby_core_source (3.2.0)
|
||||
debug (1.7.1)
|
||||
irb (>= 1.5.0)
|
||||
reline (>= 0.3.1)
|
||||
@@ -255,7 +249,7 @@ GEM
|
||||
warden (~> 1.2.3)
|
||||
devise-encryptable (0.2.0)
|
||||
devise (>= 2.1.0)
|
||||
devise-i18n (1.10.2)
|
||||
devise-i18n (1.10.3)
|
||||
devise (>= 4.8.0)
|
||||
devise-token_authenticatable (1.1.0)
|
||||
devise (>= 4.0.0, < 5.0.0)
|
||||
@@ -266,7 +260,7 @@ GEM
|
||||
dotenv-rails (2.8.1)
|
||||
dotenv (= 2.8.1)
|
||||
railties (>= 3.2)
|
||||
erubi (1.11.0)
|
||||
erubi (1.12.0)
|
||||
et-orbi (1.2.7)
|
||||
tzinfo
|
||||
excon (0.81.0)
|
||||
@@ -276,12 +270,12 @@ GEM
|
||||
factory_bot_rails (6.2.0)
|
||||
factory_bot (~> 6.2.0)
|
||||
railties (>= 5.0.0)
|
||||
faraday (2.6.0)
|
||||
faraday (2.7.4)
|
||||
faraday-net_http (>= 2.0, < 3.1)
|
||||
ruby2_keywords (>= 0.0.4)
|
||||
faraday-follow_redirects (0.3.0)
|
||||
faraday (>= 1, < 3)
|
||||
faraday-net_http (3.0.1)
|
||||
faraday-net_http (3.0.2)
|
||||
ferrum (0.13)
|
||||
addressable (~> 2.5)
|
||||
concurrent-ruby (~> 1.1)
|
||||
@@ -322,11 +316,7 @@ GEM
|
||||
rspec-core (~> 3.0)
|
||||
ruby-progressbar (~> 1.4)
|
||||
geocoder (1.8.1)
|
||||
gitlab-omniauth-openid-connect (0.10.0)
|
||||
addressable (~> 2.7)
|
||||
omniauth (>= 1.9, < 3)
|
||||
openid_connect (~> 1.2)
|
||||
globalid (1.0.1)
|
||||
globalid (1.1.0)
|
||||
activesupport (>= 5.0)
|
||||
gmaps4rails (2.1.2)
|
||||
good_migrations (0.2.1)
|
||||
@@ -363,7 +353,7 @@ GEM
|
||||
jquery-ui-rails (4.2.1)
|
||||
railties (>= 3.2.16)
|
||||
json (2.6.3)
|
||||
json-jwt (1.16.0)
|
||||
json-jwt (1.16.3)
|
||||
activesupport (>= 4.2)
|
||||
aes_key_wrap
|
||||
bindata
|
||||
@@ -376,15 +366,15 @@ GEM
|
||||
rspec (>= 2.0, < 4.0)
|
||||
jsonapi-serializer (2.2.0)
|
||||
activesupport (>= 4.2)
|
||||
jwt (2.6.0)
|
||||
knapsack_pro (3.7.0)
|
||||
jwt (2.7.0)
|
||||
knapsack_pro (3.8.0)
|
||||
rake
|
||||
launchy (2.5.0)
|
||||
addressable (~> 2.7)
|
||||
letter_opener (1.8.1)
|
||||
launchy (>= 2.2, < 3)
|
||||
libdatadog (0.9.0.1.0)
|
||||
libddwaf (1.5.1.0.0)
|
||||
libdatadog (2.0.0.1.0)
|
||||
libddwaf (1.6.2.0.0)
|
||||
ffi (~> 1.0)
|
||||
libv8-node (16.10.0.0)
|
||||
listen (3.8.0)
|
||||
@@ -393,8 +383,11 @@ GEM
|
||||
loofah (2.19.1)
|
||||
crass (~> 1.0.2)
|
||||
nokogiri (>= 1.5.9)
|
||||
mail (2.7.1)
|
||||
mail (2.8.1)
|
||||
mini_mime (>= 0.1.1)
|
||||
net-imap
|
||||
net-pop
|
||||
net-smtp
|
||||
marcel (1.0.2)
|
||||
matrix (0.4.2)
|
||||
method_source (1.0.0)
|
||||
@@ -414,15 +407,20 @@ GEM
|
||||
money (~> 6.12)
|
||||
money (6.16.0)
|
||||
i18n (>= 0.6.4, <= 2)
|
||||
msgpack (1.6.0)
|
||||
msgpack (1.6.1)
|
||||
multi_json (1.15.0)
|
||||
multi_xml (0.6.0)
|
||||
net-protocol (0.1.3)
|
||||
net-imap (0.3.4)
|
||||
date
|
||||
net-protocol
|
||||
net-pop (0.1.2)
|
||||
net-protocol
|
||||
net-protocol (0.2.1)
|
||||
timeout
|
||||
net-smtp (0.3.2)
|
||||
net-smtp (0.3.3)
|
||||
net-protocol
|
||||
nio4r (2.5.8)
|
||||
nokogiri (1.13.10)
|
||||
nokogiri (1.14.2)
|
||||
mini_portile2 (~> 2.8.0)
|
||||
racc (~> 1.4)
|
||||
oauth2 (1.4.11)
|
||||
@@ -431,13 +429,16 @@ GEM
|
||||
multi_json (~> 1.3)
|
||||
multi_xml (~> 0.5)
|
||||
rack (>= 1.2, < 4)
|
||||
omniauth (2.1.0)
|
||||
omniauth (2.1.1)
|
||||
hashie (>= 3.4.6)
|
||||
rack (>= 2.2.3)
|
||||
rack-protection
|
||||
omniauth-rails_csrf_protection (1.0.1)
|
||||
actionpack (>= 4.2)
|
||||
omniauth (~> 2.0)
|
||||
omniauth_openid_connect (0.6.1)
|
||||
omniauth (>= 1.9, < 3)
|
||||
openid_connect (~> 1.1)
|
||||
openid_connect (1.4.2)
|
||||
activemodel
|
||||
attr_required (>= 1.0.0)
|
||||
@@ -452,13 +453,13 @@ GEM
|
||||
orm_adapter (0.5.0)
|
||||
pagy (5.10.1)
|
||||
activesupport
|
||||
paper_trail (12.1.0)
|
||||
paper_trail (12.3.0)
|
||||
activerecord (>= 5.2)
|
||||
request_store (~> 1.1)
|
||||
parallel (1.22.1)
|
||||
paranoia (2.6.1)
|
||||
activerecord (>= 5.1, < 7.1)
|
||||
parser (3.2.0.0)
|
||||
parser (3.2.1.1)
|
||||
ast (~> 2.4.1)
|
||||
paypal-sdk-core (0.3.4)
|
||||
multi_json (~> 1.0)
|
||||
@@ -476,12 +477,12 @@ GEM
|
||||
pry (0.13.1)
|
||||
coderay (~> 1.1)
|
||||
method_source (~> 1.0)
|
||||
public_suffix (5.0.0)
|
||||
puma (6.0.2)
|
||||
public_suffix (5.0.1)
|
||||
puma (6.1.1)
|
||||
nio4r (~> 2.0)
|
||||
raabro (1.4.0)
|
||||
racc (1.6.1)
|
||||
rack (2.2.6.2)
|
||||
racc (1.6.2)
|
||||
rack (2.2.6.3)
|
||||
rack-mini-profiler (2.3.4)
|
||||
rack (>= 1.2.0)
|
||||
rack-oauth2 (1.21.3)
|
||||
@@ -492,28 +493,26 @@ GEM
|
||||
rack (>= 2.1.0)
|
||||
rack-protection (2.1.0)
|
||||
rack
|
||||
rack-proxy (0.7.0)
|
||||
rack-proxy (0.7.6)
|
||||
rack
|
||||
rack-rewrite (1.5.1)
|
||||
rack-ssl (1.4.1)
|
||||
rack
|
||||
rack-test (2.0.2)
|
||||
rack (>= 1.3)
|
||||
rack-timeout (0.6.3)
|
||||
rails (6.1.7)
|
||||
actioncable (= 6.1.7)
|
||||
actionmailbox (= 6.1.7)
|
||||
actionmailer (= 6.1.7)
|
||||
actionpack (= 6.1.7)
|
||||
actiontext (= 6.1.7)
|
||||
actionview (= 6.1.7)
|
||||
activejob (= 6.1.7)
|
||||
activemodel (= 6.1.7)
|
||||
activerecord (= 6.1.7)
|
||||
activestorage (= 6.1.7)
|
||||
activesupport (= 6.1.7)
|
||||
rails (6.1.7.2)
|
||||
actioncable (= 6.1.7.2)
|
||||
actionmailbox (= 6.1.7.2)
|
||||
actionmailer (= 6.1.7.2)
|
||||
actionpack (= 6.1.7.2)
|
||||
actiontext (= 6.1.7.2)
|
||||
actionview (= 6.1.7.2)
|
||||
activejob (= 6.1.7.2)
|
||||
activemodel (= 6.1.7.2)
|
||||
activerecord (= 6.1.7.2)
|
||||
activestorage (= 6.1.7.2)
|
||||
activesupport (= 6.1.7.2)
|
||||
bundler (>= 1.15.0)
|
||||
railties (= 6.1.7)
|
||||
railties (= 6.1.7.2)
|
||||
sprockets-rails (>= 2.0.0)
|
||||
rails-controller-testing (1.0.5)
|
||||
actionpack (>= 5.0.1.rc1)
|
||||
@@ -527,37 +526,39 @@ GEM
|
||||
activesupport (>= 4.2)
|
||||
choice (~> 0.2.0)
|
||||
ruby-graphviz (~> 1.2)
|
||||
rails-html-sanitizer (1.4.4)
|
||||
rails-html-sanitizer (1.5.0)
|
||||
loofah (~> 2.19, >= 2.19.1)
|
||||
rails-i18n (7.0.6)
|
||||
i18n (>= 0.7, < 2)
|
||||
railties (>= 6.0.0, < 8)
|
||||
rails_safe_tasks (1.0.0)
|
||||
railties (6.1.7)
|
||||
actionpack (= 6.1.7)
|
||||
activesupport (= 6.1.7)
|
||||
railties (6.1.7.2)
|
||||
actionpack (= 6.1.7.2)
|
||||
activesupport (= 6.1.7.2)
|
||||
method_source
|
||||
rake (>= 12.2)
|
||||
thor (~> 1.0)
|
||||
rainbow (3.1.1)
|
||||
rake (13.0.6)
|
||||
ransack (2.4.2)
|
||||
activerecord (>= 5.2.4)
|
||||
activesupport (>= 5.2.4)
|
||||
ransack (2.6.0)
|
||||
activerecord (>= 6.0.4)
|
||||
activesupport (>= 6.0.4)
|
||||
i18n
|
||||
rb-fsevent (0.11.2)
|
||||
rb-inotify (0.10.1)
|
||||
ffi (~> 1.0)
|
||||
redcarpet (3.5.1)
|
||||
redis (4.8.0)
|
||||
regexp_parser (2.6.2)
|
||||
redcarpet (3.6.0)
|
||||
redis (4.8.1)
|
||||
redis-client (0.13.0)
|
||||
connection_pool
|
||||
regexp_parser (2.7.0)
|
||||
reline (0.3.2)
|
||||
io-console (~> 0.5)
|
||||
request_store (1.5.0)
|
||||
request_store (1.5.1)
|
||||
rack (>= 1.4)
|
||||
responders (3.0.1)
|
||||
actionpack (>= 5.0)
|
||||
railties (>= 5.0)
|
||||
responders (3.1.0)
|
||||
actionpack (>= 5.2)
|
||||
railties (>= 5.2)
|
||||
rexml (3.2.5)
|
||||
roadie (5.0.1)
|
||||
css_parser (~> 1.4)
|
||||
@@ -568,32 +569,32 @@ GEM
|
||||
rodf (1.2.0)
|
||||
builder (>= 3.0)
|
||||
rubyzip (>= 1.0)
|
||||
roo (2.9.0)
|
||||
roo (2.10.0)
|
||||
nokogiri (~> 1)
|
||||
rubyzip (>= 1.3.0, < 3.0.0)
|
||||
rspec (3.10.0)
|
||||
rspec-core (~> 3.10.0)
|
||||
rspec-expectations (~> 3.10.0)
|
||||
rspec-mocks (~> 3.10.0)
|
||||
rspec-core (3.10.2)
|
||||
rspec-support (~> 3.10.0)
|
||||
rspec-expectations (3.10.2)
|
||||
rspec (3.12.0)
|
||||
rspec-core (~> 3.12.0)
|
||||
rspec-expectations (~> 3.12.0)
|
||||
rspec-mocks (~> 3.12.0)
|
||||
rspec-core (3.12.1)
|
||||
rspec-support (~> 3.12.0)
|
||||
rspec-expectations (3.12.2)
|
||||
diff-lcs (>= 1.2.0, < 2.0)
|
||||
rspec-support (~> 3.10.0)
|
||||
rspec-mocks (3.10.2)
|
||||
rspec-support (~> 3.12.0)
|
||||
rspec-mocks (3.12.3)
|
||||
diff-lcs (>= 1.2.0, < 2.0)
|
||||
rspec-support (~> 3.10.0)
|
||||
rspec-rails (5.1.2)
|
||||
actionpack (>= 5.2)
|
||||
activesupport (>= 5.2)
|
||||
railties (>= 5.2)
|
||||
rspec-core (~> 3.10)
|
||||
rspec-expectations (~> 3.10)
|
||||
rspec-mocks (~> 3.10)
|
||||
rspec-support (~> 3.10)
|
||||
rspec-support (~> 3.12.0)
|
||||
rspec-rails (6.0.1)
|
||||
actionpack (>= 6.1)
|
||||
activesupport (>= 6.1)
|
||||
railties (>= 6.1)
|
||||
rspec-core (~> 3.11)
|
||||
rspec-expectations (~> 3.11)
|
||||
rspec-mocks (~> 3.11)
|
||||
rspec-support (~> 3.11)
|
||||
rspec-retry (0.6.2)
|
||||
rspec-core (> 3.3)
|
||||
rspec-support (3.10.3)
|
||||
rspec-support (3.12.0)
|
||||
rswag-api (2.8.0)
|
||||
railties (>= 3.1, < 7.1)
|
||||
rswag-specs (2.8.0)
|
||||
@@ -604,25 +605,25 @@ GEM
|
||||
rswag-ui (2.8.0)
|
||||
actionpack (>= 3.1, < 7.1)
|
||||
railties (>= 3.1, < 7.1)
|
||||
rubocop (1.44.1)
|
||||
rubocop (1.48.1)
|
||||
json (~> 2.3)
|
||||
parallel (~> 1.10)
|
||||
parser (>= 3.2.0.0)
|
||||
rainbow (>= 2.2.2, < 4.0)
|
||||
regexp_parser (>= 1.8, < 3.0)
|
||||
rexml (>= 3.2.5, < 4.0)
|
||||
rubocop-ast (>= 1.24.1, < 2.0)
|
||||
rubocop-ast (>= 1.26.0, < 2.0)
|
||||
ruby-progressbar (~> 1.7)
|
||||
unicode-display_width (>= 2.4.0, < 3.0)
|
||||
rubocop-ast (1.24.1)
|
||||
parser (>= 3.1.1.0)
|
||||
rubocop-rails (2.17.4)
|
||||
rubocop-ast (1.27.0)
|
||||
parser (>= 3.2.1.0)
|
||||
rubocop-rails (2.18.0)
|
||||
activesupport (>= 4.2.0)
|
||||
rack (>= 1.1)
|
||||
rubocop (>= 1.33.0, < 2.0)
|
||||
ruby-graphviz (1.2.5)
|
||||
rexml
|
||||
ruby-progressbar (1.11.0)
|
||||
ruby-progressbar (1.13.0)
|
||||
ruby-rc4 (0.1.5)
|
||||
ruby-vips (2.1.4)
|
||||
ffi (~> 1.12)
|
||||
@@ -641,13 +642,14 @@ GEM
|
||||
semantic_range (3.0.0)
|
||||
shoulda-matchers (5.3.0)
|
||||
activesupport (>= 5.2.0)
|
||||
sidekiq (6.5.8)
|
||||
connection_pool (>= 2.2.5, < 3)
|
||||
rack (~> 2.0)
|
||||
redis (>= 4.5.0, < 5)
|
||||
sidekiq-scheduler (5.0.0)
|
||||
sidekiq (7.0.6)
|
||||
concurrent-ruby (< 2)
|
||||
connection_pool (>= 2.3.0)
|
||||
rack (>= 2.2.4)
|
||||
redis-client (>= 0.11.0)
|
||||
sidekiq-scheduler (5.0.2)
|
||||
rufus-scheduler (~> 3.2)
|
||||
sidekiq (>= 4, < 8)
|
||||
sidekiq (>= 6, < 8)
|
||||
tilt (>= 1.4.0)
|
||||
simplecov (0.22.0)
|
||||
docile (~> 1.1)
|
||||
@@ -686,7 +688,7 @@ GEM
|
||||
railties (>= 5.2)
|
||||
redis
|
||||
stringex (2.8.5)
|
||||
stripe (8.0.0)
|
||||
stripe (8.3.0)
|
||||
swd (1.3.0)
|
||||
activesupport (>= 3)
|
||||
attr_required (>= 0.0.5)
|
||||
@@ -696,15 +698,15 @@ GEM
|
||||
power_assert
|
||||
thor (1.2.1)
|
||||
thread-local (1.1.0)
|
||||
tilt (2.0.11)
|
||||
tilt (2.1.0)
|
||||
timecop (0.9.6)
|
||||
timeout (0.3.0)
|
||||
timeout (0.3.2)
|
||||
ttfunk (1.7.0)
|
||||
tzinfo (2.0.5)
|
||||
tzinfo (2.0.6)
|
||||
concurrent-ruby (~> 1.0)
|
||||
unicode-display_width (2.4.2)
|
||||
uniform_notifier (1.16.0)
|
||||
valid_email2 (4.0.4)
|
||||
valid_email2 (4.0.5)
|
||||
activemodel (>= 3.2)
|
||||
mail (~> 2.5)
|
||||
validate_email (0.1.6)
|
||||
@@ -736,7 +738,7 @@ GEM
|
||||
addressable (>= 2.8.0)
|
||||
crack (>= 0.3.2)
|
||||
hashdiff (>= 0.4.0, < 2.0.0)
|
||||
webpacker (5.4.3)
|
||||
webpacker (5.4.4)
|
||||
activesupport (>= 5.2)
|
||||
rack-proxy (>= 0.6.1)
|
||||
railties (>= 5.2)
|
||||
@@ -753,7 +755,7 @@ GEM
|
||||
xml-simple (1.1.8)
|
||||
xpath (3.2.0)
|
||||
nokogiri (~> 1.8)
|
||||
zeitwerk (2.6.6)
|
||||
zeitwerk (2.6.7)
|
||||
|
||||
PLATFORMS
|
||||
ruby
|
||||
@@ -766,7 +768,7 @@ DEPENDENCIES
|
||||
activerecord-import
|
||||
activerecord-postgresql-adapter
|
||||
activerecord-session_store
|
||||
acts-as-taggable-on (~> 8.1)
|
||||
acts-as-taggable-on
|
||||
acts_as_list (= 1.0.4)
|
||||
angular-rails-templates (>= 0.3.0)
|
||||
angular_rails_csrf
|
||||
@@ -807,7 +809,6 @@ DEPENDENCIES
|
||||
foreman
|
||||
fuubar (~> 2.5.1)
|
||||
geocoder
|
||||
gitlab-omniauth-openid-connect
|
||||
gmaps4rails
|
||||
good_migrations
|
||||
haml
|
||||
@@ -832,12 +833,12 @@ DEPENDENCIES
|
||||
mini_racer
|
||||
monetize (~> 1.11)
|
||||
oauth2 (~> 1.4.7)
|
||||
ofn-qz!
|
||||
omniauth-rails_csrf_protection
|
||||
omniauth_openid_connect
|
||||
openid_connect (~> 1.3)
|
||||
order_management!
|
||||
pagy (~> 5.1)
|
||||
paper_trail (~> 12.1.0)
|
||||
paper_trail (~> 12.1)
|
||||
paranoia (~> 2.4)
|
||||
paypal-sdk-merchant (= 1.117.2)
|
||||
pdf-reader
|
||||
@@ -846,14 +847,13 @@ DEPENDENCIES
|
||||
puma
|
||||
rack-mini-profiler (< 3.0.0)
|
||||
rack-rewrite
|
||||
rack-ssl
|
||||
rack-timeout
|
||||
rails (>= 6.1.4)
|
||||
rails-controller-testing
|
||||
rails-erd
|
||||
rails-i18n
|
||||
rails_safe_tasks (~> 1.0)
|
||||
ransack (= 2.4.2)
|
||||
ransack (~> 2.6.0)
|
||||
redcarpet
|
||||
redis (>= 4.0)
|
||||
responders
|
||||
|
||||
@@ -33,7 +33,7 @@ We also have a [Super Admin Guide][super-admin-guide] to help with configuration
|
||||
|
||||
## Testing
|
||||
|
||||
If you'd like to help out with testing, please introduce yourself on the #testing channel on [Slack][slack-invite] and download the [ZenHub browser extension][zenhub] to view the development pipeline. Also, do have a look in our [Welcome New QAs board](https://github.com/orgs/openfoodfoundation/projects/1) for some good first issues, both on manual and automated testing (RSpec/Capybara).
|
||||
If you'd like to help out with testing, please introduce yourself on the #testing channel on [Slack][slack-invite] and download the [ZenHub browser extension][zenhub] to view the development pipeline. Also, do have a look in our [Welcome New QAs board][welcome-qa] for some good first issues, both on manual and automated testing (RSpec/Capybara).
|
||||
|
||||
We use [BrowserStack](https://www.browserstack.com/) as a manual testing tool. BrowserStack provides open source projects with unlimited and free of charge accounts. A big thanks to them!
|
||||
|
||||
@@ -52,5 +52,6 @@ Copyright (c) 2012 - 2022 Open Food Foundation, released under the AGPL licence.
|
||||
[ofn-handbook]: https://ofn-user-guide.gitbook.io/ofn-handbook/
|
||||
[ofn-install]: https://github.com/openfoodfoundation/ofn-install
|
||||
[super-admin-guide]: https://ofn-user-guide.gitbook.io/ofn-super-admin-guide
|
||||
[welcome-dev]: https://github.com/orgs/openfoodfoundation/projects/2
|
||||
[welcome-dev]: https://github.com/orgs/openfoodfoundation/projects/5
|
||||
[welcome-qa]: https://github.com/orgs/openfoodfoundation/projects/6
|
||||
[zenhub]: https://www.zenhub.com/extension
|
||||
|
||||
@@ -55,19 +55,6 @@ angular.module("admin.enterprises")
|
||||
else
|
||||
alert ("#{manager.email}" + " " + t("is_already_manager"))
|
||||
|
||||
$scope.inviteManager = ->
|
||||
$scope.invite_errors = $scope.invite_success = null
|
||||
email = $scope.newUser
|
||||
|
||||
$http.post("/admin/manager_invitations", {email: email, enterprise_id: $scope.Enterprise.id}).then (response)->
|
||||
$scope.addManager({id: response.data.user, email: email})
|
||||
$scope.invite_success = t('user_invited', email: email)
|
||||
.catch (response) ->
|
||||
$scope.invite_errors = response.data.errors
|
||||
|
||||
$scope.resetModal = ->
|
||||
$scope.newUser = $scope.invite_errors = $scope.invite_success = null
|
||||
|
||||
$scope.removeLogo = ->
|
||||
$scope.performEnterpriseAction("removeLogo", "immediate_logo_removal_warning", "removed_logo_successfully")
|
||||
|
||||
|
||||
@@ -9,7 +9,7 @@ angular.module("admin.lineItems").controller 'LineItemsCtrl', ($scope, $timeout,
|
||||
$scope.sharedResource = false
|
||||
$scope.columns = Columns.columns
|
||||
$scope.sorting = SortOptions
|
||||
$scope.pagination = Orders.pagination
|
||||
$scope.pagination = LineItems.pagination
|
||||
$scope.per_page_options = [
|
||||
{id: 15, name: t('js.admin.orders.index.per_page', results: 15)},
|
||||
{id: 50, name: t('js.admin.orders.index.per_page', results: 50)},
|
||||
@@ -44,7 +44,6 @@ angular.module("admin.lineItems").controller 'LineItemsCtrl', ($scope, $timeout,
|
||||
$scope.refreshData = ->
|
||||
return "cancel" unless $scope.confirmRefresh()
|
||||
|
||||
$scope.loadOrders()
|
||||
$scope.loadLineItems()
|
||||
|
||||
unless $scope.initialized
|
||||
@@ -53,18 +52,8 @@ angular.module("admin.lineItems").controller 'LineItemsCtrl', ($scope, $timeout,
|
||||
$scope.dereferenceLoadedData()
|
||||
|
||||
$scope.loadOrders = ->
|
||||
[formattedStartDate, formattedEndDate] = $scope.formatDates($scope.startDate, $scope.endDate)
|
||||
|
||||
RequestMonitor.load $scope.orders = Orders.index(
|
||||
"q[state_not_eq]": "canceled",
|
||||
"q[shipment_state_not_eq]": "shipped",
|
||||
"q[completed_at_not_null]": "true",
|
||||
"q[distributor_id_eq]": $scope.distributorFilter,
|
||||
"q[order_cycle_id_eq]": $scope.orderCycleFilter,
|
||||
"q[completed_at_gteq]": if formattedStartDate then formattedStartDate else undefined,
|
||||
"q[completed_at_lt]": if formattedEndDate then formattedEndDate else undefined,
|
||||
"page": $scope.page,
|
||||
"per_page": $scope.per_page
|
||||
"q[id_in][]": $scope.line_items.map((line_item) -> line_item.order.id)
|
||||
)
|
||||
|
||||
$scope.loadLineItems = ->
|
||||
@@ -94,13 +83,15 @@ angular.module("admin.lineItems").controller 'LineItemsCtrl', ($scope, $timeout,
|
||||
RequestMonitor.load $scope.suppliers = Enterprises.index(action: "visible", ams_prefix: "basic", "q[is_primary_producer_eq]": "true")
|
||||
|
||||
$scope.dereferenceLoadedData = ->
|
||||
RequestMonitor.load $q.all([$scope.orders.$promise, $scope.distributors.$promise, $scope.orderCycles.$promise, $scope.suppliers.$promise, $scope.line_items.$promise]).then ->
|
||||
Dereferencer.dereferenceAttr $scope.orders, "distributor", Enterprises.byID
|
||||
Dereferencer.dereferenceAttr $scope.orders, "order_cycle", OrderCycles.byID
|
||||
RequestMonitor.load $q.all([$scope.distributors.$promise, $scope.orderCycles.$promise, $scope.suppliers.$promise, $scope.line_items.$promise]).then ->
|
||||
Dereferencer.dereferenceAttr $scope.line_items, "supplier", Enterprises.byID
|
||||
Dereferencer.dereferenceAttr $scope.line_items, "order", Orders.byID
|
||||
$scope.bulk_order_form.$setPristine()
|
||||
StatusMessage.clear()
|
||||
$scope.loadOrders()
|
||||
RequestMonitor.load $q.all([$scope.orders.$promise]).then ->
|
||||
Dereferencer.dereferenceAttr $scope.line_items, "order", Orders.byID
|
||||
Dereferencer.dereferenceAttr $scope.orders, "distributor", Enterprises.byID
|
||||
Dereferencer.dereferenceAttr $scope.orders, "order_cycle", OrderCycles.byID
|
||||
$scope.bulk_order_form.$setPristine()
|
||||
StatusMessage.clear()
|
||||
|
||||
unless $scope.initialized
|
||||
$scope.initialized = true
|
||||
@@ -159,6 +150,10 @@ angular.module("admin.lineItems").controller 'LineItemsCtrl', ($scope, $timeout,
|
||||
else
|
||||
Promise.all(LineItems.delete(item) for item in items).then(-> $scope.refreshData())
|
||||
, "js.admin.deleting_item_will_cancel_order")
|
||||
else
|
||||
ofnDeleteLineItemsAlert(() ->
|
||||
Promise.all(LineItems.delete(item) for item in lineItemsToDelete).then(-> $scope.refreshData())
|
||||
, lineItemsToDelete.length)
|
||||
|
||||
$scope.allBoxesChecked = ->
|
||||
checkedCount = $scope.filteredLineItems.reduce (count,lineItem) ->
|
||||
|
||||
@@ -35,7 +35,11 @@ angular.module('admin.orderCycles')
|
||||
OrderCycle.removeExchangeFee(exchange, index)
|
||||
$scope.order_cycle_form.$dirty = true
|
||||
|
||||
$scope.setPickupTimeFieldDirty = (index) ->
|
||||
$scope.setPickupTimeFieldDirty = (index, pickup_time) ->
|
||||
# if the pickup_time is already set we are in edit mode, so no need to set pickup_time field as dirty
|
||||
# to show it is required (it has a red border when set to dirty)
|
||||
return if pickup_time
|
||||
|
||||
$timeout ->
|
||||
pickup_time_field_name = "order_cycle_outgoing_exchange_" + index + "_pickup_time"
|
||||
$scope.order_cycle_form[pickup_time_field_name].$setDirty()
|
||||
|
||||
@@ -1,14 +0,0 @@
|
||||
angular.module("admin.orders").controller "bulkCancelCtrl", ($scope, $http, $timeout) ->
|
||||
|
||||
$scope.cancelOrder = (orderIds, sendEmailCancellation, restock_items) ->
|
||||
$http(
|
||||
method: 'post'
|
||||
url: "/admin/orders/bulk_cancel?order_ids=#{orderIds}&send_cancellation_email=#{sendEmailCancellation}&restock_items=#{restock_items}" ).then(->
|
||||
window.location.reload()
|
||||
)
|
||||
|
||||
$scope.cancelSelectedOrders = ->
|
||||
ofnCancelOrderAlert((confirm, sendEmailCancellation, restock_items) ->
|
||||
if confirm
|
||||
$scope.cancelOrder $scope.selected_orders, sendEmailCancellation, restock_items
|
||||
)
|
||||
@@ -250,6 +250,18 @@ ofnCancelOrderAlert = function(callback, i18nKey) {
|
||||
$('#custom-confirm').show();
|
||||
}
|
||||
|
||||
ofnDeleteLineItemsAlert = function(callback, count) {
|
||||
$('#custom-confirm .message').html(`${t("js.admin.orders.delete_line_items_html", {count: count})}`);
|
||||
$('#custom-confirm button.confirm').click(() => {
|
||||
$('#custom-confirm').hide();
|
||||
callback();
|
||||
});
|
||||
$('#custom-confirm button.cancel').click(() => {
|
||||
$('#custom-confirm').hide();
|
||||
});
|
||||
$('#custom-confirm').show();
|
||||
}
|
||||
|
||||
ofnConfirm = function(callback) {
|
||||
$('#custom-confirm .message').html(
|
||||
` ${t("are_you_sure")}
|
||||
|
||||
@@ -1,2 +1,3 @@
|
||||
angular.module("admin.utils", ["templates", "ngSanitize"]).config ($httpProvider) ->
|
||||
angular.module("admin.utils", ["templates", "ngSanitize"]).config ($httpProvider, $locationProvider) ->
|
||||
$locationProvider.hashPrefix('')
|
||||
$httpProvider.defaults.headers.common["Accept"] = "application/json, text/javascript, */*"
|
||||
|
||||
@@ -7,8 +7,12 @@ angular.module('Darkswarm').controller "RegistrationFormCtrl", ($scope, Registra
|
||||
form.$valid
|
||||
|
||||
$scope.create = (form) ->
|
||||
$scope.disableButton()
|
||||
EnterpriseRegistrationService.create($scope.enableButton) if $scope.valid(form)
|
||||
if ($scope.valid(form))
|
||||
$scope.disableButton()
|
||||
EnterpriseRegistrationService.create().then(() ->
|
||||
$scope.enableButton()
|
||||
)
|
||||
end
|
||||
|
||||
$scope.update = (nextStep, form) ->
|
||||
EnterpriseRegistrationService.update(nextStep) if $scope.valid(form)
|
||||
|
||||
@@ -17,9 +17,12 @@ angular.module('Darkswarm').directive "ofnFlash", (flash, $timeout, RailsFlashLo
|
||||
|
||||
# Callback when a new flash message is pushed to flash service
|
||||
show = (message, type)=>
|
||||
if message
|
||||
$scope.flashes.push({message: message, type: typePairings[type]})
|
||||
$timeout($scope.delete, 10000)
|
||||
return unless message
|
||||
# if same message already exists, don't add it again
|
||||
return if $scope.flashes.some((flash) -> flash.message == message)
|
||||
|
||||
$scope.flashes.push({message: message, type: typePairings[type]})
|
||||
$timeout($scope.delete, 10000)
|
||||
|
||||
$scope.delete = ->
|
||||
$scope.flashes.shift()
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
angular.module('Darkswarm').directive "ofnOnHand", (StockQuantity) ->
|
||||
angular.module('Darkswarm').directive "ofnOnHand", (StockQuantity, Messages) ->
|
||||
restrict: 'A'
|
||||
require: "ngModel"
|
||||
scope: true
|
||||
@@ -16,7 +16,7 @@ angular.module('Darkswarm').directive "ofnOnHand", (StockQuantity) ->
|
||||
ngModel.$parsers.push (viewValue) ->
|
||||
available_quantity = scope.available_quantity()
|
||||
if parseInt(viewValue) > available_quantity
|
||||
alert t("js.insufficient_stock", {on_hand: available_quantity})
|
||||
Messages.flash({error: t("js.insufficient_stock", {on_hand: available_quantity})})
|
||||
viewValue = available_quantity
|
||||
ngModel.$setViewValue viewValue
|
||||
ngModel.$render()
|
||||
|
||||
9227
app/assets/javascripts/shared/jquery-1.8.0.js
vendored
9227
app/assets/javascripts/shared/jquery-1.8.0.js
vendored
File diff suppressed because it is too large
Load Diff
@@ -1,11 +1,13 @@
|
||||
.ofn-drop-down.right#columns-dropdown{ ng: { controller: 'ColumnsDropdownCtrl' } }
|
||||
%span{ :class => 'icon-reorder' }= " #{t('admin.columns')}".html_safe
|
||||
%span{ 'ng-class' => "expanded && 'icon-caret-up' || !expanded && 'icon-caret-down'" }
|
||||
.ofn-drop-down.ofn-drop-down-v2.right#columns-dropdown{ ng: { controller: 'ColumnsDropdownCtrl' } }
|
||||
.ofn-drop-down-label
|
||||
= " #{t('admin.columns')}".html_safe
|
||||
%span{ 'ng-class' => "expanded && 'icon-caret-up' || !expanded && 'icon-caret-down'" }
|
||||
%div.menu{ 'ng-show' => "expanded" }
|
||||
%div.menu_item{ ng: { repeat: "column in columns", click: "toggle(column)", class: "{selected: column.visible}" } }
|
||||
%span.check
|
||||
%span.name {{ column.name }}
|
||||
%hr
|
||||
%div.menu_item.text-center
|
||||
%input.fullwidth.orange{ type: "button", ng: { value: "saved() ? 'Saved': 'Saving'", show: "saved() || saving", disabled: "saved()" } }
|
||||
%input.fullwidth.red{ type: "button", :value => t('admin.column_save_as_default').html_safe, ng: { show: "!saved() && !saving", click: "saveColumnPreferences(action)"} }
|
||||
.menu_items
|
||||
.menu_item{ ng: { repeat: "column in columns", click: "toggle(column);" } }
|
||||
%input.redesigned-input{ type: "checkbox", ng: { checked: "column.visible" } }
|
||||
{{ column.name }}
|
||||
%hr
|
||||
%div.menu_item.text-center
|
||||
%input.fullwidth.orange{ type: "button", ng: { value: "saved() ? 'Saved': 'Saving'", show: "saved() || saving", disabled: "saved()" } }
|
||||
%input.fullwidth.red{ type: "button", :value => t('admin.column_save_as_default').html_safe, ng: { show: "!saved() && !saving", click: "saveColumnPreferences(action)"} }
|
||||
|
||||
@@ -1,10 +1,11 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
class ConfirmModalComponent < ModalComponent
|
||||
def initialize(id:, confirm_actions: nil, controllers: nil)
|
||||
def initialize(id:, confirm_actions: nil, controllers: nil, message: nil)
|
||||
super(id: id, close_button: true)
|
||||
@confirm_actions = confirm_actions
|
||||
@controllers = controllers
|
||||
@message = message
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
@@ -3,6 +3,8 @@
|
||||
.reveal-modal.fade.tiny.help-modal{ "data-modal-target": "modal" }
|
||||
= content
|
||||
|
||||
= render @message if @message
|
||||
|
||||
.modal-actions
|
||||
%input{ class: "button icon-plus #{close_button_class}", type: 'button', value: t('js.admin.modals.cancel'), "data-action": "click->modal#close" }
|
||||
%input{ class: "button icon-plus primary", type: 'button', value: t('js.admin.modals.confirm'), "data-action": @confirm_actions }
|
||||
|
||||
@@ -1,18 +1,26 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
class ProductComponent < ViewComponentReflex::Component
|
||||
DATETIME_FORMAT = '%F %T'
|
||||
|
||||
def initialize(product:, columns:)
|
||||
super
|
||||
@product = product
|
||||
@image = @product.images[0] if product.images.any?
|
||||
@columns = columns.map { |c|
|
||||
@columns = columns.map do |c|
|
||||
{
|
||||
id: c[:value],
|
||||
value: column_value(c[:value])
|
||||
}
|
||||
}
|
||||
end
|
||||
end
|
||||
|
||||
# This must be define when using ProductComponent.with_collection()
|
||||
def collection_key
|
||||
@product.id
|
||||
end
|
||||
|
||||
# rubocop:disable Metrics/CyclomaticComplexity, Metrics/MethodLength
|
||||
def column_value(column)
|
||||
case column
|
||||
when 'name'
|
||||
@@ -25,6 +33,27 @@ class ProductComponent < ViewComponentReflex::Component
|
||||
@product.supplier.name
|
||||
when 'category'
|
||||
@product.taxons.map(&:name).join(', ')
|
||||
when 'sku'
|
||||
@product.sku
|
||||
when 'on_hand'
|
||||
@product.on_hand || 0
|
||||
when 'on_demand'
|
||||
@product.on_demand
|
||||
when 'tax_category'
|
||||
@product.tax_category.name
|
||||
when 'inherits_properties'
|
||||
@product.inherits_properties
|
||||
when 'available_on'
|
||||
format_date(@product.available_on)
|
||||
when 'import_date'
|
||||
format_date(@product.import_date)
|
||||
end
|
||||
end
|
||||
# rubocop:enable Metrics/CyclomaticComplexity, Metrics/MethodLength
|
||||
|
||||
private
|
||||
|
||||
def format_date(date)
|
||||
date&.strftime(DATETIME_FORMAT) || ''
|
||||
end
|
||||
end
|
||||
|
||||
@@ -3,27 +3,37 @@
|
||||
class ProductsTableComponent < ViewComponentReflex::Component
|
||||
include Pagy::Backend
|
||||
|
||||
SORTABLE_COLUMNS = ["name"].freeze
|
||||
SELECTABLE_COMUMNS = [{ label: I18n.t("admin.products_page.columns_selector.price"),
|
||||
value: "price" },
|
||||
{ label: I18n.t("admin.products_page.columns_selector.unit"),
|
||||
value: "unit" },
|
||||
{ label: I18n.t("admin.products_page.columns_selector.producer"),
|
||||
value: "producer" },
|
||||
{ label: I18n.t("admin.products_page.columns_selector.category"),
|
||||
value: "category" }].sort { |a, b|
|
||||
SORTABLE_COLUMNS = ['name', 'import_date'].freeze
|
||||
SELECTABLE_COLUMNS = [
|
||||
{ label: I18n.t("admin.products_page.columns_selector.price"), value: "price" },
|
||||
{ label: I18n.t("admin.products_page.columns_selector.unit"), value: "unit" },
|
||||
{ label: I18n.t("admin.products_page.columns_selector.producer"), value: "producer" },
|
||||
{ label: I18n.t("admin.products_page.columns_selector.category"), value: "category" },
|
||||
{ label: I18n.t("admin.products_page.columns_selector.sku"), value: "sku" },
|
||||
{ label: I18n.t("admin.products_page.columns_selector.on_hand"), value: "on_hand" },
|
||||
{ label: I18n.t("admin.products_page.columns_selector.on_demand"), value: "on_demand" },
|
||||
{ label: I18n.t("admin.products_page.columns_selector.tax_category"), value: "tax_category" },
|
||||
{
|
||||
label: I18n.t("admin.products_page.columns_selector.inherits_properties"),
|
||||
value: "inherits_properties"
|
||||
},
|
||||
{ label: I18n.t("admin.products_page.columns_selector.available_on"), value: "available_on" },
|
||||
{ label: I18n.t("admin.products_page.columns_selector.import_date"), value: "import_date" }
|
||||
].sort do |a, b|
|
||||
a[:label] <=> b[:label]
|
||||
}.freeze
|
||||
end.freeze
|
||||
|
||||
PER_PAGE_VALUE = [10, 25, 50, 100].freeze
|
||||
PER_PAGE = PER_PAGE_VALUE.map { |value| { label: value, value: value } }
|
||||
NAME_COLUMN = { label: I18n.t("admin.products_page.columns.name"), value: "name",
|
||||
sortable: true }.freeze
|
||||
NAME_COLUMN = {
|
||||
label: I18n.t("admin.products_page.columns.name"), value: "name", sortable: true
|
||||
}.freeze
|
||||
|
||||
def initialize(user:)
|
||||
super
|
||||
@user = user
|
||||
@selectable_columns = SELECTABLE_COMUMNS
|
||||
@columns_selected = ["price", "unit"]
|
||||
@selectable_columns = SELECTABLE_COLUMNS
|
||||
@columns_selected = ['unit', 'price', 'on_hand', 'category', 'import_date']
|
||||
@per_page = PER_PAGE
|
||||
@per_page_selected = [10]
|
||||
@categories = [{ label: "All", value: "all" }] +
|
||||
@@ -40,16 +50,20 @@ class ProductsTableComponent < ViewComponentReflex::Component
|
||||
@search_term = ""
|
||||
end
|
||||
|
||||
# any change on a "reflex_data_attributes" (defined in the template) will trigger a re render
|
||||
def before_render
|
||||
fetch_products
|
||||
refresh_columns
|
||||
end
|
||||
|
||||
# Element refers to the component the data is set on
|
||||
def search_term
|
||||
# Element is SearchInputComponent
|
||||
@search_term = element.dataset['value']
|
||||
end
|
||||
|
||||
def toggle_column
|
||||
# Element is SelectorComponent
|
||||
column = element.dataset['value']
|
||||
@columns_selected = if @columns_selected.include?(column)
|
||||
@columns_selected - [column]
|
||||
@@ -59,26 +73,33 @@ class ProductsTableComponent < ViewComponentReflex::Component
|
||||
end
|
||||
|
||||
def click_sort
|
||||
@sort = { column: element.dataset['sort-value'],
|
||||
direction: element.dataset['sort-direction'] == "asc" ? "desc" : "asc" }
|
||||
# Element is TableHeaderComponent
|
||||
@sort = {
|
||||
column: element.dataset['sort-value'],
|
||||
direction: element.dataset['sort-direction'] == "asc" ? "desc" : "asc"
|
||||
}
|
||||
end
|
||||
|
||||
def toggle_per_page
|
||||
# Element is SelectorComponent
|
||||
selected = element.dataset['value'].to_i
|
||||
@per_page_selected = [selected] if PER_PAGE_VALUE.include?(selected)
|
||||
end
|
||||
|
||||
def toggle_category
|
||||
# Element is SelectorWithFilterComponent
|
||||
category_clicked = element.dataset['value']
|
||||
@categories_selected = toggle_selector_with_filter(category_clicked, @categories_selected)
|
||||
end
|
||||
|
||||
def toggle_producer
|
||||
# Element is SelectorWithFilterComponent
|
||||
producer_clicked = element.dataset['value']
|
||||
@producers_selected = toggle_selector_with_filter(producer_clicked, @producers_selected)
|
||||
end
|
||||
|
||||
def change_page
|
||||
# Element is PaginationComponent
|
||||
page = element.dataset['page'].to_i
|
||||
@page = page if page > 0
|
||||
end
|
||||
@@ -86,10 +107,13 @@ class ProductsTableComponent < ViewComponentReflex::Component
|
||||
private
|
||||
|
||||
def refresh_columns
|
||||
@columns = @columns_selected.map { |column|
|
||||
{ label: I18n.t("admin.products_page.columns.#{column}"), value: column,
|
||||
sortable: SORTABLE_COLUMNS.include?(column) }
|
||||
}.sort! { |a, b| a[:label] <=> b[:label] }
|
||||
@columns = @columns_selected.map do |column|
|
||||
{
|
||||
label: I18n.t("admin.products_page.columns.#{column}"),
|
||||
value: column,
|
||||
sortable: SORTABLE_COLUMNS.include?(column)
|
||||
}
|
||||
end.sort! { |a, b| a[:label] <=> b[:label] }
|
||||
@columns.unshift(NAME_COLUMN)
|
||||
end
|
||||
|
||||
@@ -145,8 +169,13 @@ class ProductsTableComponent < ViewComponentReflex::Component
|
||||
def product_query_includes
|
||||
[
|
||||
master: [:images],
|
||||
variants: [:default_price, :stock_locations, :stock_items, :variant_overrides,
|
||||
{ option_values: :option_type }]
|
||||
variants: [
|
||||
:default_price,
|
||||
:stock_locations,
|
||||
:stock_items,
|
||||
:variant_overrides,
|
||||
{ option_values: :option_type }
|
||||
]
|
||||
]
|
||||
end
|
||||
end
|
||||
|
||||
@@ -8,12 +8,12 @@ module Admin
|
||||
class EnterprisesController < Admin::ResourceController
|
||||
include GeocodeEnterpriseAddress
|
||||
include CablecarResponses
|
||||
include Pagy::Backend
|
||||
|
||||
# These need to run before #load_resource so that @object is initialised with sanitised values
|
||||
prepend_before_action :override_owner, only: :create
|
||||
prepend_before_action :override_sells, only: :create
|
||||
|
||||
before_action :load_enterprise_set, only: :index
|
||||
before_action :load_countries, except: [:index, :register, :check_permalink]
|
||||
before_action :load_methods_and_fees, only: [:edit, :update]
|
||||
before_action :load_groups, only: [:new, :edit, :update, :create]
|
||||
@@ -33,6 +33,8 @@ module Admin
|
||||
include OrderCyclesHelper
|
||||
|
||||
def index
|
||||
load_enterprise_set_on_index
|
||||
|
||||
respond_to do |format|
|
||||
format.html
|
||||
format.json {
|
||||
@@ -100,7 +102,8 @@ module Admin
|
||||
end
|
||||
|
||||
def bulk_update
|
||||
@enterprise_set = Sets::EnterpriseSet.new(collection, bulk_params)
|
||||
load_enterprise_set_with_params(bulk_params)
|
||||
|
||||
if @enterprise_set.save
|
||||
flash[:success] = I18n.t(:enterprise_bulk_update_success_notice)
|
||||
|
||||
@@ -148,8 +151,15 @@ module Admin
|
||||
|
||||
private
|
||||
|
||||
def load_enterprise_set
|
||||
@enterprise_set = Sets::EnterpriseSet.new(collection) if spree_current_user.admin?
|
||||
def load_enterprise_set_on_index
|
||||
return unless spree_current_user.admin?
|
||||
|
||||
load_enterprise_set_with_params
|
||||
end
|
||||
|
||||
def load_enterprise_set_with_params(params = {})
|
||||
@pagy, @paginated_collection = pagy(@collection)
|
||||
@enterprise_set = Sets::EnterpriseSet.new(@paginated_collection, params)
|
||||
end
|
||||
|
||||
def load_countries
|
||||
|
||||
@@ -18,7 +18,6 @@ module Admin
|
||||
params.require(:preferences).permit(
|
||||
:enable_invoices?,
|
||||
:invoice_style2?,
|
||||
:enable_receipt_printing?,
|
||||
:enterprise_number_required_on_invoices?,
|
||||
)
|
||||
end
|
||||
|
||||
@@ -1,47 +0,0 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
module Admin
|
||||
class ManagerInvitationsController < Spree::Admin::BaseController
|
||||
authorize_resource class: false
|
||||
|
||||
def create
|
||||
@email = params[:email]
|
||||
@enterprise = Enterprise.find(params[:enterprise_id])
|
||||
|
||||
authorize! :edit, @enterprise
|
||||
|
||||
existing_user = Spree::User.find_by(email: @email)
|
||||
|
||||
if existing_user
|
||||
render json: { errors: t('admin.enterprises.invite_manager.user_already_exists') },
|
||||
status: :unprocessable_entity
|
||||
return
|
||||
end
|
||||
|
||||
new_user = create_new_manager
|
||||
|
||||
if new_user
|
||||
render json: { user: new_user.id }, status: :ok
|
||||
else
|
||||
render json: { errors: t('admin.enterprises.invite_manager.error') },
|
||||
status: :internal_server_error
|
||||
end
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def create_new_manager
|
||||
password = Devise.friendly_token
|
||||
new_user = Spree::User.create(email: @email, unconfirmed_email: @email, password: password)
|
||||
new_user.reset_password_token = Devise.friendly_token
|
||||
# Same time as used in Devise's lib/devise/models/recoverable.rb.
|
||||
new_user.reset_password_sent_at = Time.now.utc
|
||||
new_user.save!
|
||||
|
||||
@enterprise.users << new_user
|
||||
EnterpriseMailer.manager_invitation(@enterprise, new_user).deliver_later
|
||||
|
||||
new_user
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -100,10 +100,13 @@ module Admin
|
||||
order_cycle.schedules.each do |schedule|
|
||||
Subscription.where(schedule_id: schedule.id).each do |subscription|
|
||||
shop = Enterprise.managed_by(spree_current_user).find_by(id: subscription.shop_id)
|
||||
fee_calculator = OpenFoodNetwork::EnterpriseFeeCalculator.new(shop, order_cycle)
|
||||
subscription.subscription_line_items.nil_price_estimate.each do |line_item|
|
||||
variant = OrderManagement::Subscriptions::
|
||||
VariantsList.eligible_variants(shop).find_by(id: line_item.variant_id)
|
||||
fee_calculator = OpenFoodNetwork::EnterpriseFeeCalculator.new(shop, order_cycle)
|
||||
# If the variant is not available in the shop, the price estimate will be nil
|
||||
next if variant.nil?
|
||||
|
||||
price = variant.price + fee_calculator.indexed_fees_for(variant)
|
||||
line_item.update_column(:price_estimate, price)
|
||||
end
|
||||
|
||||
@@ -61,7 +61,7 @@ module Api
|
||||
def search_customers
|
||||
customers = visible_customers.includes(:bill_address, :ship_address)
|
||||
customers = customers.where(enterprise_id: params[:enterprise_id]) if params[:enterprise_id]
|
||||
customers.ransack(params[:q]).result
|
||||
customers.ransack(params[:q]).result.order(:id)
|
||||
end
|
||||
|
||||
def visible_customers
|
||||
|
||||
@@ -15,7 +15,9 @@ module CheckoutCallbacks
|
||||
prepend_before_action :require_distributor_chosen
|
||||
|
||||
before_action :load_order, :associate_user, :load_saved_addresses, :load_saved_credit_cards
|
||||
before_action :load_shipping_methods, if: -> { params[:step] == "details" }
|
||||
before_action :allowed_shipping_methods, if: -> {
|
||||
params[:step] == "details"
|
||||
}
|
||||
|
||||
before_action :ensure_order_not_completed
|
||||
before_action :ensure_checkout_allowed
|
||||
@@ -46,8 +48,22 @@ module CheckoutCallbacks
|
||||
@selected_card = nil
|
||||
end
|
||||
|
||||
def load_shipping_methods
|
||||
@shipping_methods = available_shipping_methods.sort { |a, b| a.name.casecmp(b.name) }
|
||||
def allowed_shipping_methods
|
||||
@allowed_shipping_methods ||= sorted_available_shipping_methods.filter(
|
||||
&method(:supports_all_products_shipping_categories?)
|
||||
)
|
||||
end
|
||||
|
||||
def sorted_available_shipping_methods
|
||||
available_shipping_methods.sort { |a, b| a.name.casecmp(b.name) }
|
||||
end
|
||||
|
||||
def supports_all_products_shipping_categories?(shipping_method)
|
||||
(products_shipping_categories - shipping_method.shipping_categories.pluck(:id)).empty?
|
||||
end
|
||||
|
||||
def products_shipping_categories
|
||||
@products_shipping_categories ||= @order.products.pluck(:shipping_category_id).uniq
|
||||
end
|
||||
|
||||
def redirect_to_shop?
|
||||
|
||||
21
app/controllers/concerns/manager_invitations.rb
Normal file
21
app/controllers/concerns/manager_invitations.rb
Normal file
@@ -0,0 +1,21 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
module ManagerInvitations
|
||||
extend ActiveSupport::Concern
|
||||
|
||||
def create_new_manager(email, enterprise)
|
||||
password = Devise.friendly_token
|
||||
new_user = Spree::User.create(email: email, unconfirmed_email: email, password: password)
|
||||
new_user.reset_password_token = Devise.friendly_token
|
||||
# Same time as used in Devise's lib/devise/models/recoverable.rb.
|
||||
new_user.reset_password_sent_at = Time.now.utc
|
||||
new_user.save
|
||||
|
||||
return new_user unless new_user.valid? # Return early if user is invalid.
|
||||
|
||||
enterprise.users << new_user
|
||||
EnterpriseMailer.manager_invitation(@enterprise, new_user).deliver_later
|
||||
|
||||
new_user
|
||||
end
|
||||
end
|
||||
@@ -4,6 +4,11 @@ class ErrorsController < ApplicationController
|
||||
layout "errors"
|
||||
|
||||
def not_found
|
||||
Bugsnag.notify("404") do |event|
|
||||
event.severity = "info"
|
||||
|
||||
event.add_metadata(:request, request.env)
|
||||
end
|
||||
render status: :not_found
|
||||
end
|
||||
|
||||
|
||||
@@ -24,7 +24,7 @@ class SplitCheckoutController < ::BaseController
|
||||
check_step if params[:step]
|
||||
recalculate_tax if params[:step] == "summary"
|
||||
|
||||
flash_error_when_no_shipping_method_available if available_shipping_methods.none?
|
||||
flash_error_when_no_shipping_method_available if allowed_shipping_methods.none?
|
||||
end
|
||||
|
||||
def update
|
||||
@@ -49,7 +49,7 @@ class SplitCheckoutController < ::BaseController
|
||||
def render_error
|
||||
flash.now[:error] ||= I18n.t(
|
||||
'split_checkout.errors.saving_failed',
|
||||
messages: @order.errors.full_messages.to_sentence
|
||||
messages: order_error_messages
|
||||
)
|
||||
|
||||
render status: :unprocessable_entity, operations: cable_car.
|
||||
@@ -57,6 +57,50 @@ class SplitCheckoutController < ::BaseController
|
||||
replace("#flashes", partial("shared/flashes", locals: { flashes: flash }))
|
||||
end
|
||||
|
||||
def order_error_messages
|
||||
# Remove ship_address.* errors if no shipping method is not selected
|
||||
remove_ship_address_errors if no_ship_address_needed?
|
||||
|
||||
# Reorder errors to make sure the most important ones are shown first
|
||||
# and finally, return the error messages to sentence
|
||||
reorder_errors.map(&:full_message).to_sentence
|
||||
end
|
||||
|
||||
def no_ship_address_needed?
|
||||
@order.errors[:shipping_method].present? || params[:ship_address_same_as_billing] == "1"
|
||||
end
|
||||
|
||||
def remove_ship_address_errors
|
||||
@order.errors.delete("ship_address.firstname")
|
||||
@order.errors.delete("ship_address.address1")
|
||||
@order.errors.delete("ship_address.city")
|
||||
@order.errors.delete("ship_address.phone")
|
||||
@order.errors.delete("ship_address.lastname")
|
||||
@order.errors.delete("ship_address.zipcode")
|
||||
end
|
||||
|
||||
def reorder_errors
|
||||
@order.errors.sort_by do |e|
|
||||
case e.attribute
|
||||
when /email/i then 0
|
||||
when /phone/i then 1
|
||||
when /bill_address/i then 2 + bill_address_error_order(e)
|
||||
else 20
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
def bill_address_error_order(error)
|
||||
case error.attribute
|
||||
when /firstname/i then 0
|
||||
when /lastname/i then 1
|
||||
when /address1/i then 2
|
||||
when /city/i then 3
|
||||
when /zipcode/i then 4
|
||||
else 5
|
||||
end
|
||||
end
|
||||
|
||||
def flash_error_when_no_shipping_method_available
|
||||
flash[:error] = I18n.t('split_checkout.errors.no_shipping_methods_available')
|
||||
end
|
||||
@@ -97,6 +141,10 @@ class SplitCheckoutController < ::BaseController
|
||||
def update_order
|
||||
return if params[:confirm_order] || @order.errors.any?
|
||||
|
||||
# If we have "pick up" shipping method (require_ship_address is set to false), use the
|
||||
# distributor address as shipping address
|
||||
use_shipping_address_from_distributor if shipping_method_ship_address_not_required?
|
||||
|
||||
@order.select_shipping_method(params[:shipping_method_id])
|
||||
@order.update(order_params)
|
||||
@order.updater.update_totals_and_states
|
||||
@@ -106,6 +154,29 @@ class SplitCheckoutController < ::BaseController
|
||||
@order.errors.empty?
|
||||
end
|
||||
|
||||
def use_shipping_address_from_distributor
|
||||
@order.ship_address = @order.address_from_distributor
|
||||
|
||||
# Add the missing data
|
||||
bill_address = params[:order][:bill_address_attributes]
|
||||
@order.ship_address.firstname = bill_address[:firstname]
|
||||
@order.ship_address.lastname = bill_address[:lastname]
|
||||
@order.ship_address.phone = bill_address[:phone]
|
||||
|
||||
# Remove shipping address from parameter so we don't override the address we just set
|
||||
params[:order].delete(:ship_address_attributes)
|
||||
end
|
||||
|
||||
def shipping_method_ship_address_not_required?
|
||||
selected_shipping_method = allowed_shipping_methods&.select do |sm|
|
||||
sm.id.to_s == params[:shipping_method_id]
|
||||
end
|
||||
|
||||
return false if selected_shipping_method.empty?
|
||||
|
||||
selected_shipping_method.first.require_ship_address == false
|
||||
end
|
||||
|
||||
def summary_step?
|
||||
params[:step] == "summary"
|
||||
end
|
||||
|
||||
@@ -6,7 +6,6 @@ module Spree
|
||||
def edit
|
||||
@preferences_general = [:site_name, :default_seo_title, :default_meta_keywords,
|
||||
:default_meta_description, :site_url]
|
||||
@preferences_security = [:allow_ssl_in_production, :allow_ssl_in_staging]
|
||||
@preferences_currency = [:display_currency, :hide_cents]
|
||||
end
|
||||
|
||||
|
||||
@@ -9,15 +9,13 @@ module Spree
|
||||
helper CheckoutHelper
|
||||
|
||||
before_action :load_order, only: [:edit, :update, :fire, :resend,
|
||||
:invoice, :print, :print_ticket]
|
||||
:invoice, :print]
|
||||
before_action :load_distribution_choices, only: [:new, :edit, :update]
|
||||
|
||||
# Ensure that the distributor is set for an order when
|
||||
before_action :ensure_distribution, only: :new
|
||||
before_action :require_distributor_abn, only: :invoice
|
||||
|
||||
content_security_policy false, only: :print_ticket
|
||||
|
||||
respond_to :html, :json
|
||||
|
||||
def new
|
||||
@@ -67,18 +65,6 @@ module Spree
|
||||
load_spree_api_key
|
||||
end
|
||||
|
||||
def bulk_cancel
|
||||
order_ids = params[:order_ids].split(',')
|
||||
|
||||
Spree::Order.where(id: order_ids).find_each do |order|
|
||||
order.send_cancellation_email = params[:send_cancellation_email] != "false"
|
||||
order.restock_items = params.fetch(:restock_items, "true") == "true"
|
||||
order.cancel
|
||||
end
|
||||
|
||||
flash[:success] = Spree.t(:order_updated)
|
||||
end
|
||||
|
||||
def fire
|
||||
event = params[:e]
|
||||
@order.send_cancellation_email = params[:send_cancellation_email] != "false"
|
||||
@@ -117,10 +103,6 @@ module Spree
|
||||
render_with_wicked_pdf InvoiceRenderer.new.args(@order)
|
||||
end
|
||||
|
||||
def print_ticket
|
||||
render template: "spree/admin/orders/ticket", layout: false
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def order_params
|
||||
|
||||
@@ -26,6 +26,12 @@ module ReportsHelper
|
||||
end.uniq
|
||||
end
|
||||
|
||||
def customer_email_options(order_customers)
|
||||
order_customers.map do |customer|
|
||||
[customer&.email, customer&.id]
|
||||
end
|
||||
end
|
||||
|
||||
def currency_symbol
|
||||
Spree::Money.currency_symbol
|
||||
end
|
||||
|
||||
@@ -27,7 +27,7 @@ module Spree
|
||||
private
|
||||
|
||||
def complete_order_links
|
||||
[resend_confirmation_link] + invoice_links + ticket_links
|
||||
[resend_confirmation_link] + invoice_links
|
||||
end
|
||||
|
||||
def invoice_links
|
||||
@@ -52,12 +52,6 @@ module Spree
|
||||
end
|
||||
end
|
||||
|
||||
def ticket_links
|
||||
return [] unless Spree::Config[:enable_receipt_printing?]
|
||||
|
||||
[print_ticket_link, select_ticket_printer_link]
|
||||
end
|
||||
|
||||
def edit_order_link
|
||||
{ name: t(:edit_order),
|
||||
url: spree.edit_admin_order_path(@order),
|
||||
@@ -100,20 +94,6 @@ module Spree
|
||||
confirm: t(:must_have_valid_business_number, enterprise_name: @order.distributor.name) }
|
||||
end
|
||||
|
||||
def print_ticket_link
|
||||
{ name: t(:print_ticket),
|
||||
url: print_ticket_admin_order_path(@order),
|
||||
icon: 'icon-print',
|
||||
target: "_blank" }
|
||||
end
|
||||
|
||||
def select_ticket_printer_link
|
||||
{ name: t(:select_ticket_printer),
|
||||
url: "#{print_ticket_admin_order_path(@order)}#select-printer",
|
||||
icon: 'icon-print',
|
||||
target: "_blank" }
|
||||
end
|
||||
|
||||
def ship_order_link
|
||||
{ name: t(:ship_order),
|
||||
url: spree.fire_admin_order_path(@order, e: 'ship'),
|
||||
|
||||
@@ -19,7 +19,7 @@ class ReportJob < ActiveJob::Base
|
||||
private
|
||||
|
||||
def write(result)
|
||||
File.write(filename, result)
|
||||
File.write(filename, result, mode: "wb")
|
||||
end
|
||||
|
||||
def read_result
|
||||
|
||||
@@ -7,7 +7,6 @@ module Calculator
|
||||
extend Spree::LocalizedNumber
|
||||
|
||||
preference :amount, :decimal, default: 0
|
||||
preference :currency, :string, default: Spree::Config[:currency]
|
||||
|
||||
localize_number :preferred_amount
|
||||
|
||||
|
||||
@@ -9,7 +9,6 @@ module Calculator
|
||||
preference :first_item, :decimal, default: 0.0
|
||||
preference :additional_item, :decimal, default: 0.0
|
||||
preference :max_items, :integer, default: 0
|
||||
preference :currency, :string, default: Spree::Config[:currency]
|
||||
|
||||
localize_number :preferred_first_item,
|
||||
:preferred_additional_item
|
||||
|
||||
@@ -7,7 +7,6 @@ module Calculator
|
||||
extend Spree::LocalizedNumber
|
||||
|
||||
preference :amount, :decimal, default: 0
|
||||
preference :currency, :string, default: Spree::Config[:currency]
|
||||
|
||||
localize_number :preferred_amount
|
||||
|
||||
|
||||
@@ -9,7 +9,6 @@ module Calculator
|
||||
preference :minimal_amount, :decimal, default: 0
|
||||
preference :normal_amount, :decimal, default: 0
|
||||
preference :discount_amount, :decimal, default: 0
|
||||
preference :currency, :string, default: Spree::Config[:currency]
|
||||
|
||||
localize_number :preferred_minimal_amount,
|
||||
:preferred_normal_amount,
|
||||
|
||||
@@ -271,10 +271,16 @@ module ProductImport
|
||||
end
|
||||
|
||||
def entry_matches_existing_variant?(entry, existing_variant)
|
||||
existing_variant.display_name == entry.display_name &&
|
||||
display_name_are_the_same?(entry, existing_variant) &&
|
||||
existing_variant.unit_value == entry.unit_value.to_f
|
||||
end
|
||||
|
||||
def display_name_are_the_same?(entry, existing_variant)
|
||||
return true if entry.display_name.blank? && existing_variant.display_name.blank?
|
||||
|
||||
existing_variant.display_name == entry.display_name
|
||||
end
|
||||
|
||||
def category_validation(entry)
|
||||
category_name = entry.category
|
||||
|
||||
|
||||
@@ -263,7 +263,7 @@ module Spree
|
||||
|
||||
def add_order_management_abilities(user)
|
||||
can [:index, :create], Spree::Order
|
||||
can [:read, :update, :fire, :resend, :invoice, :print, :print_ticket], Spree::Order do |order|
|
||||
can [:read, :update, :fire, :resend, :invoice, :print], Spree::Order do |order|
|
||||
# We allow editing orders with a nil distributor as this state occurs
|
||||
# during the order creation process from the admin backend
|
||||
order.distributor.nil? ||
|
||||
|
||||
@@ -33,8 +33,6 @@ module Spree
|
||||
preference :allow_backorder_shipping, :boolean, default: false
|
||||
preference :allow_checkout_on_gateway_error, :boolean, default: false
|
||||
preference :allow_guest_checkout, :boolean, default: true
|
||||
preference :allow_ssl_in_production, :boolean, default: true
|
||||
preference :allow_ssl_in_staging, :boolean, default: true
|
||||
# Replace with the name of a zone if you would like to limit the countries
|
||||
preference :checkout_zone, :string, default: nil
|
||||
preference :currency, :string, default: "USD"
|
||||
@@ -125,10 +123,9 @@ module Spree
|
||||
preference :matomo_site_id, :string, default: nil
|
||||
preference :matomo_tag_manager_url, :string, default: nil
|
||||
|
||||
# Invoices & Receipts
|
||||
# Invoices
|
||||
preference :enable_invoices?, :boolean, default: true
|
||||
preference :invoice_style2?, :boolean, default: false
|
||||
preference :enable_receipt_printing?, :boolean, default: false
|
||||
preference :enterprise_number_required_on_invoices?, :boolean, default: true
|
||||
|
||||
# Stripe payments
|
||||
|
||||
@@ -13,7 +13,7 @@ module Spree
|
||||
include SetUnusedAddressFields
|
||||
|
||||
searchable_attributes :number, :state, :shipment_state, :payment_state, :distributor_id,
|
||||
:order_cycle_id, :email, :total
|
||||
:order_cycle_id, :email, :total, :customer_id
|
||||
searchable_associations :shipping_method, :bill_address
|
||||
searchable_scopes :complete, :incomplete
|
||||
|
||||
@@ -665,6 +665,7 @@ module Spree
|
||||
|
||||
def after_cancel
|
||||
shipments.each(&:cancel!)
|
||||
payments.checkout.each(&:void!)
|
||||
|
||||
OrderMailer.cancel_email(id).deliver_later if send_cancellation_email
|
||||
update(payment_state: updater.update_payment_state)
|
||||
@@ -672,6 +673,8 @@ module Spree
|
||||
|
||||
def after_resume
|
||||
shipments.each(&:resume!)
|
||||
payments.void.each(&:resume!)
|
||||
|
||||
update(payment_state: updater.update_payment_state)
|
||||
end
|
||||
|
||||
|
||||
@@ -47,9 +47,11 @@ module Spree
|
||||
scope :with_state, ->(s) { where(state: s.to_s) }
|
||||
scope :completed, -> { with_state('completed') }
|
||||
scope :incomplete, -> { where(state: %w(checkout pending requires_authorization)) }
|
||||
scope :checkout, -> { with_state('checkout') }
|
||||
scope :pending, -> { with_state('pending') }
|
||||
scope :failed, -> { with_state('failed') }
|
||||
scope :valid, -> { where.not(state: %w(failed invalid)) }
|
||||
scope :void, -> { with_state('void') }
|
||||
scope :authorization_action_required, -> { where.not(cvv_response_message: nil) }
|
||||
scope :requires_authorization, -> { with_state("requires_authorization") }
|
||||
scope :with_payment_intent, ->(code) { where(response_code: code) }
|
||||
@@ -89,6 +91,10 @@ module Spree
|
||||
event :complete_authorization do
|
||||
transition from: [:requires_authorization], to: :completed
|
||||
end
|
||||
event :resume do
|
||||
transition from: [:void], to: :checkout
|
||||
end
|
||||
|
||||
|
||||
after_transition to: :completed, do: :set_captured_at
|
||||
end
|
||||
|
||||
@@ -415,8 +415,8 @@ module Spree
|
||||
# If the master cannot be saved, the Product object will get its errors
|
||||
# and will be destroyed
|
||||
rescue ActiveRecord::RecordInvalid
|
||||
master.errors.each do |att, error|
|
||||
errors.add(att, error)
|
||||
master.errors.each do |error|
|
||||
errors.add error.attribute, error.message
|
||||
end
|
||||
raise
|
||||
end
|
||||
|
||||
@@ -116,7 +116,22 @@ module Spree
|
||||
|
||||
# The call to Stock::Estimator below will replace the current shipping_method
|
||||
original_shipping_method_id = shipping_method.try(:id)
|
||||
self.shipping_rates = OrderManagement::Stock::Estimator.new(order).shipping_rates(to_package)
|
||||
|
||||
estimator = OrderManagement::Stock::Estimator.new(order)
|
||||
distributor_shipping_rates = estimator.shipping_rates(to_package)
|
||||
|
||||
if original_shipping_method_id.present? &&
|
||||
distributor_shipping_rates.map(&:shipping_method_id)
|
||||
.exclude?(original_shipping_method_id)
|
||||
cost = estimator.calculate_cost(shipping_method, to_package)
|
||||
unless cost.nil?
|
||||
original_shipping_rate = shipping_method.shipping_rates.new(cost: cost)
|
||||
self.shipping_rates = distributor_shipping_rates + [original_shipping_rate]
|
||||
self.selected_shipping_rate_id = original_shipping_rate.id
|
||||
end
|
||||
else
|
||||
self.shipping_rates = distributor_shipping_rates
|
||||
end
|
||||
|
||||
keep_original_shipping_method_selection(original_shipping_method_id)
|
||||
|
||||
|
||||
@@ -23,4 +23,8 @@ class ApplicationReflex < StimulusReflex::Reflex
|
||||
def current_ability
|
||||
Spree::Ability.new(current_user)
|
||||
end
|
||||
|
||||
def with_locale(&block)
|
||||
I18n.with_locale(current_user.locale, &block)
|
||||
end
|
||||
end
|
||||
|
||||
9
app/reflexes/cancel_orders_reflex.rb
Normal file
9
app/reflexes/cancel_orders_reflex.rb
Normal file
@@ -0,0 +1,9 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
class CancelOrdersReflex < ApplicationReflex
|
||||
def confirm(params)
|
||||
OrdersBulkCancelService.new(params).call
|
||||
cable_ready.dispatch_event(name: "modal:close")
|
||||
# flash[:success] = Spree.t(:order_updated)
|
||||
end
|
||||
end
|
||||
43
app/reflexes/invite_manager_reflex.rb
Normal file
43
app/reflexes/invite_manager_reflex.rb
Normal file
@@ -0,0 +1,43 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
class InviteManagerReflex < ApplicationReflex
|
||||
include ManagerInvitations
|
||||
|
||||
def invite
|
||||
email = params[:email]
|
||||
enterprise = Enterprise.find(params[:enterprise_id])
|
||||
|
||||
authorize! :edit, enterprise
|
||||
|
||||
existing_user = Spree::User.find_by(email: email)
|
||||
|
||||
locals = { error: nil, success: nil, email: email, enterprise: enterprise }
|
||||
|
||||
if existing_user
|
||||
locals[:error] = I18n.t('admin.enterprises.invite_manager.user_already_exists')
|
||||
|
||||
return_morph(locals)
|
||||
return
|
||||
end
|
||||
|
||||
new_user = create_new_manager(email, enterprise)
|
||||
|
||||
if new_user.valid?
|
||||
locals[:success] = true
|
||||
else
|
||||
locals[:error] = new_user.errors.full_messages.to_sentence ||
|
||||
I18n.t('admin.enterprises.invite_manager.error')
|
||||
end
|
||||
|
||||
return_morph(locals)
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def return_morph(locals)
|
||||
morph "#add_manager_modal",
|
||||
with_locale {
|
||||
render(partial: "admin/enterprises/form/add_new_unregistered_manager", locals: locals)
|
||||
}
|
||||
end
|
||||
end
|
||||
@@ -3,7 +3,8 @@
|
||||
module Api
|
||||
module Admin
|
||||
class OrderSerializer < ActiveModel::Serializer
|
||||
attributes :id, :number, :user_id, :full_name, :email, :phone, :completed_at, :display_total,
|
||||
attributes :id, :number, :user_id, :full_name, :email, :phone, :completed_at,
|
||||
:completed_at_utc_iso8601, :display_total,
|
||||
:edit_path, :state, :payment_state, :shipment_state,
|
||||
:payments_path, :ready_to_ship, :ready_to_capture, :created_at,
|
||||
:distributor_name, :special_instructions, :display_outstanding_balance,
|
||||
@@ -73,6 +74,10 @@ module Api
|
||||
object.line_items.count
|
||||
end
|
||||
|
||||
def completed_at_utc_iso8601
|
||||
object.completed_at.blank? ? "" : object.completed_at.utc.iso8601
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def spree_routes_helper
|
||||
|
||||
@@ -5,8 +5,6 @@
|
||||
class ContentSanitizer
|
||||
include ActionView::Helpers::SanitizeHelper
|
||||
|
||||
ALLOWED_TAGS = ["p", "b", "strong", "em", "i", "a", "u"].freeze
|
||||
ALLOWED_ATTRIBUTES = ["href", "target"].freeze
|
||||
FILTERED_CHARACTERS = {
|
||||
"&amp;" => "&",
|
||||
"&" => "&",
|
||||
@@ -24,7 +22,7 @@ class ContentSanitizer
|
||||
def sanitize_content(content)
|
||||
return unless content.present?
|
||||
|
||||
content = sanitize(content.to_s, tags: ALLOWED_TAGS, attributes: ALLOWED_ATTRIBUTES)
|
||||
content = sanitize(content.to_s, scrubber: ContentScrubber.new)
|
||||
|
||||
filter_characters(content)
|
||||
end
|
||||
|
||||
16
app/services/content_scrubber.rb
Normal file
16
app/services/content_scrubber.rb
Normal file
@@ -0,0 +1,16 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
class ContentScrubber < Rails::Html::PermitScrubber
|
||||
ALLOWED_TAGS = ["p", "b", "strong", "em", "i", "a", "u", "img"].freeze
|
||||
ALLOWED_ATTRIBUTES = ["href", "target", "src", "alt"].freeze
|
||||
|
||||
def initialize
|
||||
super
|
||||
self.tags = ALLOWED_TAGS
|
||||
self.attributes = ALLOWED_ATTRIBUTES
|
||||
end
|
||||
|
||||
def skip_node?(node)
|
||||
node.text?
|
||||
end
|
||||
end
|
||||
@@ -15,7 +15,7 @@ class DefaultAddressUpdater
|
||||
assign_bill_addresses
|
||||
assign_ship_addresses
|
||||
|
||||
customer.save
|
||||
customer&.save
|
||||
user&.save
|
||||
end
|
||||
|
||||
|
||||
@@ -19,8 +19,8 @@ class JobProcessor
|
||||
exit # rubocop:disable Rails/Exit
|
||||
end
|
||||
|
||||
# Wait for all forked child processes to exit
|
||||
Process.waitall
|
||||
# Wait for the forked child process to exit.
|
||||
Process.waitpid(child)
|
||||
ensure
|
||||
# If this Puma thread is interrupted then we need to detach the child
|
||||
# process to avoid it becoming a zombie.
|
||||
|
||||
@@ -30,8 +30,10 @@ class OrderCycleForm
|
||||
order_cycle.schedule_ids = schedule_ids if parameter_specified?(:schedule_ids)
|
||||
order_cycle.save!
|
||||
apply_exchange_changes
|
||||
attach_selected_distributor_payment_methods
|
||||
attach_selected_distributor_shipping_methods
|
||||
if can_update_selected_payment_or_shipping_methods?
|
||||
attach_selected_distributor_payment_methods
|
||||
attach_selected_distributor_shipping_methods
|
||||
end
|
||||
sync_subscriptions
|
||||
true
|
||||
end
|
||||
@@ -61,14 +63,33 @@ class OrderCycleForm
|
||||
def attach_selected_distributor_payment_methods
|
||||
return if @selected_distributor_payment_method_ids.nil?
|
||||
|
||||
order_cycle.selected_distributor_payment_method_ids = selected_distributor_payment_method_ids
|
||||
if distributor_only?
|
||||
payment_method_ids = order_cycle.selected_distributor_payment_method_ids
|
||||
payment_method_ids -= user_distributor_payment_method_ids
|
||||
payment_method_ids += user_only_selected_distributor_payment_method_ids
|
||||
order_cycle.selected_distributor_payment_method_ids = payment_method_ids
|
||||
else
|
||||
order_cycle.selected_distributor_payment_method_ids = selected_distributor_payment_method_ids
|
||||
end
|
||||
order_cycle.save!
|
||||
end
|
||||
|
||||
def attach_selected_distributor_shipping_methods
|
||||
return if @selected_distributor_shipping_method_ids.nil?
|
||||
|
||||
order_cycle.selected_distributor_shipping_method_ids = selected_distributor_shipping_method_ids
|
||||
if distributor_only?
|
||||
# A distributor can only update methods associated with their own
|
||||
# enterprise, so we load all previously selected methods, and replace
|
||||
# only the distributor's methods with their selection (not touching other
|
||||
# distributor's methods).
|
||||
shipping_method_ids = order_cycle.selected_distributor_shipping_method_ids
|
||||
shipping_method_ids -= user_distributor_shipping_method_ids
|
||||
shipping_method_ids += user_only_selected_distributor_shipping_method_ids
|
||||
order_cycle.selected_distributor_shipping_method_ids = shipping_method_ids
|
||||
else
|
||||
order_cycle.selected_distributor_shipping_method_ids = selected_distributor_shipping_method_ids
|
||||
end
|
||||
|
||||
order_cycle.save!
|
||||
end
|
||||
|
||||
@@ -99,6 +120,10 @@ class OrderCycleForm
|
||||
@selected_distributor_payment_method_ids
|
||||
end
|
||||
|
||||
def user_only_selected_distributor_payment_method_ids
|
||||
user_distributor_payment_method_ids.intersection(selected_distributor_payment_method_ids)
|
||||
end
|
||||
|
||||
def selected_distributor_shipping_method_ids
|
||||
@selected_distributor_shipping_method_ids = (
|
||||
attachable_distributor_shipping_method_ids &
|
||||
@@ -112,6 +137,10 @@ class OrderCycleForm
|
||||
@selected_distributor_shipping_method_ids
|
||||
end
|
||||
|
||||
def user_only_selected_distributor_shipping_method_ids
|
||||
user_distributor_shipping_method_ids.intersection(selected_distributor_shipping_method_ids)
|
||||
end
|
||||
|
||||
def build_schedule_ids
|
||||
return unless parameter_specified?(:schedule_ids)
|
||||
|
||||
@@ -160,4 +189,37 @@ class OrderCycleForm
|
||||
def new_schedule_ids
|
||||
@order_cycle.schedule_ids - existing_schedule_ids
|
||||
end
|
||||
|
||||
def can_update_selected_payment_or_shipping_methods?
|
||||
@user.admin? || coordinator? || distributor?
|
||||
end
|
||||
|
||||
def coordinator?
|
||||
@user.enterprises.include?(@order_cycle.coordinator)
|
||||
end
|
||||
|
||||
def distributor?
|
||||
!user_distributors_ids.empty?
|
||||
end
|
||||
|
||||
def distributor_only?
|
||||
distributor? && !@user.admin? && !coordinator?
|
||||
end
|
||||
|
||||
def user_distributors_ids
|
||||
@user_distributors_ids ||= @user.enterprises.pluck(:id)
|
||||
.intersection(@order_cycle.distributors.pluck(:id))
|
||||
end
|
||||
|
||||
def user_distributor_payment_method_ids
|
||||
@user_distributor_payment_method_ids ||=
|
||||
DistributorPaymentMethod.where(distributor_id: user_distributors_ids)
|
||||
.pluck(:id)
|
||||
end
|
||||
|
||||
def user_distributor_shipping_method_ids
|
||||
@user_distributor_shipping_method_ids ||=
|
||||
DistributorShippingMethod.where(distributor_id: user_distributors_ids)
|
||||
.pluck(:id)
|
||||
end
|
||||
end
|
||||
|
||||
@@ -1,12 +1,12 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
class OrderFeesHandler
|
||||
attr_reader :order, :distributor, :order_cycle
|
||||
attr_reader :order
|
||||
|
||||
delegate :distributor, :order_cycle, to: :order
|
||||
|
||||
def initialize(order)
|
||||
@order = order
|
||||
@distributor = order.distributor
|
||||
@order_cycle = order.order_cycle
|
||||
end
|
||||
|
||||
def recreate_all_fees!
|
||||
|
||||
17
app/services/orders_bulk_cancel_service.rb
Normal file
17
app/services/orders_bulk_cancel_service.rb
Normal file
@@ -0,0 +1,17 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
class OrdersBulkCancelService
|
||||
def initialize(params)
|
||||
@order_ids = params[:order_ids]
|
||||
@send_cancellation_email = params[:send_cancellation_email]
|
||||
@restock_items = params[:restock_items]
|
||||
end
|
||||
|
||||
def call
|
||||
Spree::Order.where(id: @order_ids).find_each do |order|
|
||||
order.send_cancellation_email = @send_cancellation_email
|
||||
order.restock_items = @restock_items
|
||||
order.cancel
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -4,7 +4,7 @@ module PermittedAttributes
|
||||
class Calculator
|
||||
def self.attributes
|
||||
[
|
||||
:id, :preferred_currency, :preferred_amount, :preferred_flat_percent,
|
||||
:id, :preferred_amount, :preferred_flat_percent,
|
||||
:preferred_minimal_amount, :preferred_normal_amount, :preferred_discount_amount,
|
||||
:preferred_unit_from_list, :preferred_per_unit, :preferred_first_item,
|
||||
:preferred_additional_item, :preferred_max_items
|
||||
|
||||
@@ -56,7 +56,7 @@ module VariantUnits
|
||||
def option_value_value_unit_scaled
|
||||
unit_scale, unit_name = scale_for_unit_value
|
||||
|
||||
value = BigDecimal(@variant.unit_value / unit_scale, 6)
|
||||
value = (@variant.unit_value / unit_scale).to_d.truncate(2)
|
||||
|
||||
[value, unit_name]
|
||||
end
|
||||
|
||||
@@ -38,3 +38,5 @@
|
||||
%tr
|
||||
%td{colspan: "4"}= t(:none)
|
||||
= f.submit t(:update)
|
||||
|
||||
= render partial: 'admin/shared/pagy_links', locals: { pagy: @pagy }
|
||||
|
||||
@@ -0,0 +1,22 @@
|
||||
%div#add_manager_modal
|
||||
%form{ "data-reflex": "submit->InviteManager#invite", "data-reflex-serialize-form": true }
|
||||
.margin-bottom-30.text-center
|
||||
.text-big
|
||||
= t('js.admin.modals.invite_title')
|
||||
|
||||
- if success
|
||||
%p.alert-box.ok= t('user_invited', email: email)
|
||||
|
||||
- if error
|
||||
%p.alert-box.error= error
|
||||
|
||||
= text_field_tag :email, nil, class: 'fullwidth margin-bottom-20'
|
||||
= hidden_field_tag :enterprise_id, @enterprise&.id || enterprise.id
|
||||
|
||||
.modal-actions
|
||||
- if success
|
||||
%input{ class: "button icon-plus secondary", type: 'button', value: t('js.admin.modals.close'), "data-action": "click->help-modal#close" }
|
||||
- else
|
||||
%input{ class: "button icon-plus secondary", type: 'button', value: t('js.admin.modals.cancel'), "data-action": "click->help-modal#close" }
|
||||
= submit_tag "#{t('js.admin.modals.invite')}"
|
||||
|
||||
@@ -6,8 +6,7 @@
|
||||
=f.label :owner_id, t('.owner')
|
||||
- if full_permissions
|
||||
%span.required *
|
||||
%div{'ofn-with-tip' => t('.owner_tip')}
|
||||
%a= t('admin.whats_this')
|
||||
= render partial: 'admin/shared/tooltip', locals: {tooltip_text: t('.owner_tip')}
|
||||
.eight.columns.omega
|
||||
- if full_permissions
|
||||
= f.hidden_field :owner_id, class: "select2 fullwidth", 'user-select' => 'Enterprise.owner', 'ng-model' => 'Enterprise.owner'
|
||||
@@ -19,8 +18,7 @@
|
||||
=f.label :user_ids, t('.notifications')
|
||||
- if full_permissions
|
||||
%span.required *
|
||||
%div{'ofn-with-tip' => t('.contact_tip')}
|
||||
%a= t('admin.whats_this')
|
||||
= render partial: 'admin/shared/tooltip', locals: {tooltip_text: t('.contact_tip')}
|
||||
.eight.columns.omega
|
||||
- if full_permissions
|
||||
%select.select2.fullwidth{id: 'receives_notifications_dropdown', name: 'receives_notifications', ng: {model: 'receivesNotifications', init: "receivesNotifications = '#{@enterprise.contact.id}'"}}
|
||||
@@ -34,8 +32,7 @@
|
||||
=f.label :user_ids, t('.managers')
|
||||
- if full_permissions
|
||||
%span.required *
|
||||
%div{'ofn-with-tip' => t('.managers_tip')}
|
||||
%a= t('admin.whats_this')
|
||||
= render partial: 'admin/shared/tooltip', locals: {tooltip_text: t('.managers_tip')}
|
||||
.eight.columns.omega
|
||||
- if full_permissions
|
||||
%table.managers
|
||||
@@ -66,8 +63,7 @@
|
||||
.three.columns.alpha
|
||||
%label
|
||||
= t('.invite_manager')
|
||||
%div{'ofn-with-tip' => t('.invite_manager_tip')}
|
||||
%a= t('admin.whats_this')
|
||||
= render partial: 'admin/shared/tooltip', locals: {tooltip_text: t('.invite_manager_tip')}
|
||||
.eight.columns.omega
|
||||
.row
|
||||
%a.button{ "data-controller": "help-modal-link", "data-action": "click->help-modal-link#open", "data-help-modal-link-target-value": "invite-manager-modal" }
|
||||
@@ -76,22 +72,4 @@
|
||||
-# add to admin footer to avoid nesting invitation form inside enterprise form
|
||||
- content_for :admin_footer do
|
||||
= render HelpModalComponent.new(id: "invite-manager-modal", close_button: false) do
|
||||
%div{ng: {app: 'admin.enterprises', controller: 'enterpriseCtrl'}}
|
||||
|
||||
.margin-bottom-30.text-center
|
||||
.text-big
|
||||
= t('js.admin.modals.invite_title')
|
||||
|
||||
%p.alert-box.ok{ng: {show: 'invite_success'}}
|
||||
{{invite_success}}
|
||||
|
||||
%p.alert-box.error{ng: {show: 'invite_errors'}}
|
||||
{{invite_errors}}
|
||||
|
||||
%input#invite_email.fullwidth.margin-bottom-20{ng: {model: 'newUser'}}
|
||||
|
||||
.margin-bottom-20.text-center
|
||||
%button.text-center.margin-top-10{ng: {show: '!invite_success', click: 'inviteManager()'}}
|
||||
= t('js.admin.modals.invite')
|
||||
%button.text-center.margin-top-10{"data-action": "click->help-modal#close", ng: {show: 'invite_success', click: 'resetModal();'}}
|
||||
= t('js.admin.modals.close')
|
||||
= render partial: 'admin/enterprises/form/add_new_unregistered_manager', locals: { error: nil, success: nil }
|
||||
|
||||
@@ -15,11 +15,6 @@
|
||||
= check_box_tag 'preferences[invoice_style2?]', '1', Spree::Config[:invoice_style2?]
|
||||
= label_tag nil, t('.invoice_style2?')
|
||||
|
||||
.field.align-center
|
||||
= hidden_field_tag 'preferences[enable_receipt_printing?]', '0'
|
||||
= check_box_tag 'preferences[enable_receipt_printing?]', '1', Spree::Config[:enable_receipt_printing?]
|
||||
= label_tag nil, t('.enable_receipt_printing?')
|
||||
|
||||
.field.align-center
|
||||
= hidden_field_tag 'preferences[enterprise_number_required_on_invoices?]', '0'
|
||||
= check_box_tag 'preferences[enterprise_number_required_on_invoices?]', '1', Spree::Config[:enterprise_number_required_on_invoices?]
|
||||
|
||||
@@ -10,7 +10,7 @@
|
||||
%td.tags.panel-toggle.text-center{ name: "tags", ng: { if: 'enterprises[exchange.enterprise_id].managed || order_cycle.viewing_as_coordinator' } }
|
||||
{{ exchange.tags.length }}
|
||||
%td.collection-details
|
||||
= text_field_tag 'order_cycle_outgoing_exchange_{{ $index }}_pickup_time', '', 'ng-init' => 'setPickupTimeFieldDirty($index)', 'id' => 'order_cycle_outgoing_exchange_{{ $index }}_pickup_time', 'required' => 'required', 'placeholder' => t('.pickup_time_placeholder'), 'ng-model' => 'exchange.pickup_time', 'ng-disabled' => '!enterprises[exchange.enterprise_id].managed && !order_cycle.viewing_as_coordinator', 'maxlength' => 35
|
||||
= text_field_tag 'order_cycle_outgoing_exchange_{{ $index }}_pickup_time', '', 'ng-init' => 'setPickupTimeFieldDirty($index, exchange.pickup_time)', 'id' => 'order_cycle_outgoing_exchange_{{ $index }}_pickup_time', 'required' => 'required', 'placeholder' => t('.pickup_time_placeholder'), 'ng-model' => 'exchange.pickup_time', 'ng-disabled' => '!enterprises[exchange.enterprise_id].managed && !order_cycle.viewing_as_coordinator', 'maxlength' => 35
|
||||
%span.icon-question-sign{'ofn-with-tip' => t('.pickup_time_tip')}
|
||||
%br/
|
||||
= text_field_tag 'order_cycle_outgoing_exchange_{{ $index }}_pickup_instructions', '', 'id' => 'order_cycle_outgoing_exchange_{{ $index }}_pickup_instructions', 'placeholder' => t('.pickup_instructions_placeholder'), 'ng-model' => 'exchange.pickup_instructions', 'ng-disabled' => '!enterprises[exchange.enterprise_id].managed && !order_cycle.viewing_as_coordinator'
|
||||
|
||||
@@ -3,8 +3,7 @@
|
||||
- content_for :page_title do
|
||||
= t :edit_order_cycle
|
||||
|
||||
= form_for [main_app, :admin, @order_cycle], html: { class: "order_cycle" } do |f|
|
||||
|
||||
= form_for [main_app, :admin, @order_cycle], html: { class: "order_cycle" , data: { controller: 'unsaved-changes', action: 'beforeunload@window->unsaved-changes#leavingPage', 'unsaved-changes-changed': "false" } } do |f|
|
||||
= render 'wizard_progress'
|
||||
|
||||
%fieldset.no-border-bottom
|
||||
|
||||
@@ -0,0 +1,8 @@
|
||||
.row
|
||||
.alpha.two.columns= label_tag nil, t(:report_producers)
|
||||
.omega.fourteen.columns= select_tag(:supplier_id_in, options_from_collection_for_select(@data.orders_suppliers, :id, :name, params[:supplier_id_in]), {class: "select2 fullwidth", multiple: true})
|
||||
|
||||
.row
|
||||
.alpha.two.columns= label_tag nil, t(:report_customers_cycle)
|
||||
.omega.fourteen.columns
|
||||
= f.select(:order_cycle_id_in, report_order_cycle_options(@data.order_cycles), {selected: params.dig(:q, :order_cycle_id_in)}, {class: "select2 fullwidth", multiple: true})
|
||||
@@ -0,0 +1,13 @@
|
||||
.row
|
||||
.alpha.two.columns= label_tag nil, t(:report_producers)
|
||||
.omega.fourteen.columns= select_tag(:supplier_id_in, options_from_collection_for_select(@data.orders_suppliers, :id, :name, params[:supplier_id_in]), {class: "select2 fullwidth", multiple: true})
|
||||
|
||||
.row
|
||||
.alpha.two.columns= label_tag nil, t(:report_customers_cycle)
|
||||
.omega.fourteen.columns
|
||||
= f.select(:order_cycle_id_in, report_order_cycle_options(@data.order_cycles), {selected: params.dig(:q, :order_cycle_id_in)}, {class: "select2 fullwidth", multiple: true})
|
||||
|
||||
.row
|
||||
.alpha.two.columns= label_tag nil, t(:report_customers)
|
||||
.omega.fourteen.columns
|
||||
= f.select(:customer_id_in, customer_email_options(@data.order_customers), {selected: params.dig(:q, :customer_id_in)}, {class: "select2 fullwidth", multiple: true})
|
||||
@@ -5,6 +5,8 @@
|
||||
%fieldset.no-border-bottom.print-hidden
|
||||
%legend{ align: 'center'}= t(:report_filters)
|
||||
= render partial: "admin/reports/filters/#{@report_type}", locals: { f: f }
|
||||
- if @report_subtype && lookup_context.exists?(@report_subtype, "admin/reports/filters/", true)
|
||||
= render partial: "admin/reports/filters/#{@report_subtype}", locals: { f: f }
|
||||
|
||||
%fieldset.print-hidden
|
||||
%legend{ align: 'center'}= t(:report_render_options)
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
- position ||= ""
|
||||
.per-page{'ng-show' => '!RequestMonitor.loading && orders.length > 0', class: ("right" if position == "right") }
|
||||
.per-page{'ng-show' => "!RequestMonitor.loading && #{model}.length > 0", class: ("right" if position == "right") }
|
||||
%input.per-page-select.ofn-select2{type: 'number', data: 'per_page_options', 'min-search' => 999, 'ng-model' => 'per_page', 'ng-change' => 'fetchResults()'}
|
||||
|
||||
%span.per-page-feedback
|
||||
{{ 'spree.admin.orders.index.results_found' | t:{number: pagination.results} }}
|
||||
{{ 'spree.admin.orders.index.viewing' | t:{start: ((pagination.page -1) * pagination.per_page) +1, end: ((pagination.page -1) * pagination.per_page) + orders.length} }}
|
||||
{{ "spree.admin.#{model}.index.results_found" | t:{number: pagination.results} }}
|
||||
{{ 'spree.admin.#{model}.index.viewing' | t:{start: ((pagination.page -1) * pagination.per_page) +1, end: ((pagination.page -1) * pagination.per_page) + #{model}.length} }}
|
||||
|
||||
@@ -9,7 +9,7 @@
|
||||
%h3
|
||||
%a{"ng-click" => "triggerProductModal()", href: 'javascript:void(0)'}
|
||||
%span{"ng-bind" => "::product.name"}
|
||||
%p.product-description{ng: {bind: "::product.description", click: "triggerProductModal()", show: "product.description.length"}}
|
||||
%p.product-description{ng: {"bind-html": "::product.description_html", click: "triggerProductModal()", show: "product.description_html.length"}}
|
||||
.product-producer
|
||||
= t :products_from
|
||||
%span
|
||||
|
||||
@@ -76,8 +76,8 @@
|
||||
- display_ship_address = false
|
||||
- ship_method_description = nil
|
||||
|
||||
- selected_shipping_method ||= @shipping_methods[0].id if @shipping_methods.length == 1
|
||||
- @shipping_methods.each do |shipping_method|
|
||||
- selected_shipping_method ||= @allowed_shipping_methods[0].id if @allowed_shipping_methods.length == 1
|
||||
- @allowed_shipping_methods.each do |shipping_method|
|
||||
- ship_method_is_selected = shipping_method.id == selected_shipping_method.to_i
|
||||
%div.checkout-input.checkout-input-radio
|
||||
= fields_for shipping_method do |shipping_method_form|
|
||||
|
||||
@@ -34,6 +34,10 @@
|
||||
= @order.bill_address.zipcode
|
||||
%div
|
||||
= @order.bill_address.country
|
||||
- if @order.special_instructions.present?
|
||||
%br
|
||||
%em
|
||||
= @order.special_instructions
|
||||
- if @order.shipping_method.description.present?
|
||||
%div
|
||||
.summary-subtitle
|
||||
|
||||
@@ -29,5 +29,5 @@
|
||||
- if spree_current_user
|
||||
.checkout-input
|
||||
= check_box_tag "order[payments_attributes][][source_attributes][save_requested_by_customer]", 1, false
|
||||
= label :save_requested_by_customer, t('split_checkout.step2.form.stripe.save_card'), { for: "save_requested_by_customer" }
|
||||
= label_tag :order_payments_attributes__source_attributes_save_requested_by_customer, t('split_checkout.step2.form.stripe.save_card')
|
||||
|
||||
@@ -17,14 +17,6 @@
|
||||
|
||||
.row
|
||||
.alpha.six.columns
|
||||
%fieldset.security.no-border-bottom
|
||||
%legend{:align => "center"}= Spree.t(:security_settings)
|
||||
- @preferences_security.each do |key|
|
||||
- type = Spree::Config.preference_type(key)
|
||||
.field
|
||||
= label_tag(key, Spree.t(key) + ': ') + tag(:br) if type != :boolean
|
||||
= preference_field_tag(key, Spree::Config[key], :type => type)
|
||||
= label_tag(key, Spree.t(key)) + tag(:br) if type == :boolean
|
||||
%fieldset.legal.no-border-bottom
|
||||
%legend{:align => "center"}= t('.legal_settings')
|
||||
.field
|
||||
|
||||
@@ -106,7 +106,7 @@
|
||||
%columns-dropdown{ action: "#{controller_name}_#{action_name}" }
|
||||
%div{ style: "flex-grow: 1"}
|
||||
%div{ style: "float: right;"}
|
||||
= render partial: 'admin/shared/angular_per_page_controls', locals: { position: "right" }
|
||||
= render partial: 'admin/shared/angular_per_page_controls', locals: { position: "right", model: "line_items" }
|
||||
|
||||
|
||||
%div.sixteen.columns.alpha#loading{ 'ng-if' => 'RequestMonitor.loading' }
|
||||
@@ -138,7 +138,7 @@
|
||||
%a{ :href => '', 'ng-click' => "sorting.toggle('order.phone')" }
|
||||
= t("admin.phone")
|
||||
%th.date{ 'ng-show' => 'columns.order_date.visible' }
|
||||
%a{ :href => '', 'ng-click' => "sorting.toggle('order.completed_at')" }
|
||||
%a{ :href => '', 'ng-click' => "sorting.toggle('order.completed_at_utc_iso8601')" }
|
||||
= t("admin.orders.bulk_management.order_date")
|
||||
%th.producer{ 'ng-show' => 'columns.producer.visible' }
|
||||
%a{ :href => '', 'ng-click' => "sorting.toggle('supplier.name')" }
|
||||
@@ -190,7 +190,7 @@
|
||||
%td.actions
|
||||
%a{ 'ng-click' => "deleteLineItem(line_item)", :class => "delete-line-item icon-trash no-text" }
|
||||
|
||||
%div{'ng-show' => "!RequestMonitor.loading && orders.length > 0" }
|
||||
%div{'ng-show' => "!RequestMonitor.loading && line_items.length > 0" }
|
||||
= render partial: 'admin/shared/angular_pagination'
|
||||
|
||||
= render 'spree/admin/shared/custom-confirm'
|
||||
|
||||
@@ -37,10 +37,10 @@
|
||||
%span.name.invoices-modal{'ng-controller' => 'bulkInvoiceCtrl', 'ng-click' => 'createBulkInvoice()' }
|
||||
= t('.print_invoices')
|
||||
%div.menu_item
|
||||
%span.name{'ng-controller' => 'bulkCancelCtrl', 'ng-click' => 'cancelSelectedOrders()' }
|
||||
%span.name{ "data-controller": "modal-link", "data-action": "click->modal-link#open", "data-modal-link-target-value": "cancel_orders" }
|
||||
= t('.cancel_orders')
|
||||
|
||||
= render partial: 'admin/shared/angular_per_page_controls', locals: { position: "right" }
|
||||
= render partial: 'admin/shared/angular_per_page_controls', locals: { position: "right", model: "orders" }
|
||||
|
||||
%table#listing_orders.index.responsive{width: "100%", 'ng-init' => 'initialise()', 'ng-show' => "!RequestMonitor.loading && orders.length > 0" }
|
||||
%colgroup
|
||||
@@ -124,3 +124,6 @@
|
||||
= render ConfirmModalComponent.new(id: "resend_confirmation", confirm_actions: "click->resend-confirmation-email#confirm", controllers: "resend-confirmation-email") do
|
||||
.margin-bottom-30
|
||||
= t('.resend_confirmation_confirm_html')
|
||||
= render ConfirmModalComponent.new(id: "cancel_orders", confirm_actions: "click->cancel-orders#confirm", controllers: "cancel-orders", message: "spree/admin/orders/messages/cancel_orders") do
|
||||
.margin-bottom-30
|
||||
= t("js.admin.orders.cancel_the_order_html")
|
||||
|
||||
@@ -0,0 +1,11 @@
|
||||
.modal-message
|
||||
.form
|
||||
%input{ type: "checkbox", name: "send_cancellation_email", value: "1", id: "send_cancellation_email", checked: "true" }
|
||||
%label{ for: "send_cancellation_email" }
|
||||
= t("js.admin.orders.cancel_the_order_send_cancelation_email")
|
||||
%br
|
||||
%input{ type: "checkbox", name: "restock_items", id: "restock_items", checked: "true" }
|
||||
%label{ for: "restock_items" }
|
||||
= t("js.admin.orders.restock_items")
|
||||
.margin-bottom-30
|
||||
|
||||
@@ -1,75 +0,0 @@
|
||||
!!! Basic
|
||||
%html
|
||||
%head
|
||||
<meta content="text/html;charset=ansi" http-equiv="Content-Type">
|
||||
= javascript_include_tag "shared/jquery-1.8.0.js"
|
||||
= javascript_include_tag "qz/qz-tray.js"
|
||||
= javascript_include_tag "qz/sha-256.min.js"
|
||||
= javascript_include_tag "qz/rsvp-3.1.0.min.js"
|
||||
= javascript_include_tag "qz/jsrsasign-latest-all-min.js"
|
||||
:javascript
|
||||
var printData = [
|
||||
'\x1B' + '\x40', // init
|
||||
'\x1B' + '\x74' + '\x10',
|
||||
'\x1B' + '\x61' + '\x31', // center align
|
||||
'\x1B' + '\x21' + '\x30', // em mode on
|
||||
'#{j(@order.distributor.name)}' + '\x0A',
|
||||
'\x1B' + '\x21' + '\x0A' + '\x1B' + '\x45' + '\x0A', // em mode off
|
||||
'\x0A',
|
||||
'#{j(@order.distributor.address.address_part1)}' + '\x0A', // text and line break
|
||||
'#{j(@order.distributor.address.address_part2)}' + '\x0A',
|
||||
'#{j(@order.distributor.contact.email)}' + '\x0A',
|
||||
'\x0A', // line break
|
||||
'\x1B' + '\x61' + '\x32', // right align
|
||||
'#{j(l(Time.zone.now.to_date))}' + '\x0A',
|
||||
'#{j(@order.number)}' + '\x0A',
|
||||
'\x1B' + '\x61' + '\x30', // left align
|
||||
'\x0A',
|
||||
'\x1B' + '\x4D' + '\x31', // small text
|
||||
"#{'%6s %-26s%10s%10s' %
|
||||
[j(t(:ticket_column_qty)),
|
||||
j(t(:ticket_column_item)),
|
||||
j(t(:ticket_column_unit_price)),
|
||||
j(t(:ticket_column_total_price))]}",
|
||||
'\x0A',
|
||||
'\x1B' + '\x4D' + '\x30', // normal text
|
||||
'__________________________________________' + '\x0A',
|
||||
"#{@order.line_items
|
||||
.sort_by{ |line_item| line_item.product.name }
|
||||
.map { |line_item| '%5d %-19.19s%8.8s%8.8s' %
|
||||
[line_item.quantity,
|
||||
j(line_item.product.name),
|
||||
j(line_item.single_display_amount_with_adjustments.format(symbol: false, with_currency: false)),
|
||||
j(line_item.display_amount_with_adjustments.format(symbol: false, with_currency: false))] }
|
||||
.join('" + \'\x0A\' + "')}",
|
||||
'\x0A',
|
||||
"#{checkout_adjustments_for(@order, exclude: [:line_item], reject_zero_amount: false)
|
||||
.reject{ |a| a.amount == 0 }
|
||||
.reverse.map { |adjustment| '%5s %-27.27s%8.8s' %
|
||||
["",
|
||||
j(raw(adjustment.label)),
|
||||
j(display_adjustment_amount(adjustment).format(symbol: false, with_currency: false))] +
|
||||
'" + \'\x0A\' + "'}.join }",
|
||||
'__________________________________________' + '\x0A',
|
||||
'\x0A',
|
||||
'\x1B' + '\x45' + '\x0D', // bold on
|
||||
"#{'%31s%10s' %
|
||||
[j(t(:total_incl_tax)),
|
||||
j(@order.display_total.format(with_currency: false))]}",
|
||||
'\x1B' + '\x45' + '\x0A', // bold off
|
||||
'\x0A',
|
||||
"#{display_checkout_taxes_hash(@order).map { |tax|
|
||||
'%31s%10s' %
|
||||
[j(t(:tax_total, rate: tax[:percentage])),
|
||||
j(tax[:amount].format(with_currency: false))] +
|
||||
'" + \'\x0A\' + "'}.join }",
|
||||
"#{'%31s%10s' %
|
||||
[j(t(:total_excl_tax)),
|
||||
j(display_checkout_total_less_tax(@order).format(with_currency: false))]}",
|
||||
'\x0A',
|
||||
'\x0A' + '\x0A' + '\x0A' + '\x0A' + '\x0A' + '\x0A' + '\x0A',
|
||||
'\x1B' + '\x69', // cut paper
|
||||
];
|
||||
= javascript_include_tag "qz/ticket-popup.js"
|
||||
%body
|
||||
%div#printer-list
|
||||
@@ -13,7 +13,7 @@
|
||||
= f.field_container :description do
|
||||
= f.label :description, t(:description)
|
||||
%text-angular{'id' => 'product_description', 'name' => 'product[description]', 'class' => 'text-angular', 'textangular-unsafe-sanitizer' => true, "textangular-links-target-blank" => true, 'ta-toolbar' => "[['bold','italics','underline','clear'],['insertLink']]"}
|
||||
= sanitize(@product.description, attributes: ["href", "target"])
|
||||
= sanitize(@product.description, scrubber: ContentScrubber.new)
|
||||
= f.error_message_on :description
|
||||
|
||||
.right.four.columns.omega
|
||||
|
||||
30
app/webpacker/controllers/cancel_orders_controller.js
Normal file
30
app/webpacker/controllers/cancel_orders_controller.js
Normal file
@@ -0,0 +1,30 @@
|
||||
import ApplicationController from "./application_controller";
|
||||
|
||||
export default class extends ApplicationController {
|
||||
connect() {
|
||||
super.connect();
|
||||
}
|
||||
|
||||
confirm() {
|
||||
const send_cancellation_email = document.querySelector(
|
||||
"#send_cancellation_email"
|
||||
).checked;
|
||||
const restock_items = document.querySelector("#restock_items").checked;
|
||||
const order_ids = [];
|
||||
|
||||
document
|
||||
.querySelectorAll("#listing_orders input[name='order_ids[]']:checked")
|
||||
.forEach((checkbox) => {
|
||||
order_ids.push(checkbox.value);
|
||||
});
|
||||
|
||||
const params = {
|
||||
order_ids: order_ids,
|
||||
send_cancellation_email: send_cancellation_email,
|
||||
restock_items: restock_items,
|
||||
};
|
||||
this.stimulate("CancelOrdersReflex#confirm", params).then(() =>
|
||||
window.location.reload()
|
||||
);
|
||||
}
|
||||
}
|
||||
122
app/webpacker/controllers/unsaved_changes_controller.js
Normal file
122
app/webpacker/controllers/unsaved_changes_controller.js
Normal file
@@ -0,0 +1,122 @@
|
||||
import { Controller } from "stimulus";
|
||||
|
||||
// UnsavedChanges allows you to promp the user about unsaved changes when trying to leave the page
|
||||
//
|
||||
// Usage :
|
||||
// - with beforeunload event :
|
||||
// <form
|
||||
// data-controller="unsaved-changes"
|
||||
// data-action="beforeunload@window->unsaved-changes#leavingPage"
|
||||
// data-unsaved-changes-changed="true"
|
||||
// >
|
||||
// <input data-action="change->unsaved-changes#formIsChanged" />
|
||||
// </form>
|
||||
//
|
||||
// - with turbolinks :
|
||||
// <form
|
||||
// data-controller="unsaved-changes"
|
||||
// data-action="turbolinks:before-visit@window->unsaved-changes#leavingPage"
|
||||
// data-unsaved-changes-changed="true"
|
||||
// >
|
||||
// <input data-action="change->unsaved-changes#formIsChanged" />
|
||||
// </form>
|
||||
//
|
||||
// You can also combine the two event trigger ie :
|
||||
// <form
|
||||
// data-controller="unsaved-changes"
|
||||
// data-action="beforeunload@window->unsaved-changes#leavingPage turbolinks:before-visit@window->unsaved-changes#leavingPage"
|
||||
// data-unsaved-changes-changed="true"
|
||||
// >
|
||||
//
|
||||
// Optional, you can add 'data-unsaved-changes-disable-submit-button="true"' if you want to disable all
|
||||
// submit buttons when the form hasn't been interacted with
|
||||
//
|
||||
export default class extends Controller {
|
||||
connect() {
|
||||
// add onChange event to all form element
|
||||
this.element
|
||||
.querySelectorAll("input, select, textarea")
|
||||
.forEach((input) => {
|
||||
input.addEventListener("change", this.formIsChanged.bind(this));
|
||||
});
|
||||
|
||||
this.element.addEventListener("submit", this.handleSubmit.bind(this));
|
||||
|
||||
// disable submit button when first loading the page
|
||||
if (!this.isFormChanged() && this.isSubmitButtonDisabled()) {
|
||||
this.disableButtons();
|
||||
}
|
||||
}
|
||||
|
||||
formIsChanged(event) {
|
||||
// We only do something if the form hasn't already been changed
|
||||
if (!this.isFormChanged()) {
|
||||
this.setChanged("true");
|
||||
|
||||
if (this.isSubmitButtonDisabled()) {
|
||||
this.enableButtons();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
leavingPage(event) {
|
||||
const LEAVING_PAGE_MESSAGE = I18n.t("admin.unsaved_confirm_leave");
|
||||
|
||||
if (this.isFormChanged()) {
|
||||
if (event.type == "turbolinks:before-visit") {
|
||||
if (!window.confirm(LEAVING_PAGE_MESSAGE)) {
|
||||
event.preventDefault();
|
||||
}
|
||||
} else {
|
||||
// We cover our bases, according to the documentation we should be able to prompt the user
|
||||
// by calling event.preventDefault(), but it's not really supported yet.
|
||||
// Instead we set the value of event.returnValue, and return a string, both of them
|
||||
// should prompt the user.
|
||||
// Note, in most modern browser a generic string not under the control of the webpage is shown
|
||||
// instead of the returned string.
|
||||
//
|
||||
// More info : https://developer.mozilla.org/en-US/docs/Web/API/Window/beforeunload_event
|
||||
//
|
||||
event.returnValue = LEAVING_PAGE_MESSAGE;
|
||||
return event.returnValue;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
handleSubmit(event) {
|
||||
// if we are submitting the form, we don't want to trigger a warning so set changed to false
|
||||
this.setChanged("false");
|
||||
}
|
||||
|
||||
setChanged(changed) {
|
||||
this.data.set("changed", changed);
|
||||
}
|
||||
|
||||
isFormChanged() {
|
||||
return this.data.get("changed") == "true";
|
||||
}
|
||||
|
||||
isSubmitButtonDisabled() {
|
||||
if (this.data.has("disable-submit-button")) {
|
||||
return this.data.get("disable-submit-button") == "true";
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
enableButtons() {
|
||||
this.submitButtons().forEach((button) => {
|
||||
button.disabled = false;
|
||||
});
|
||||
}
|
||||
|
||||
disableButtons() {
|
||||
this.submitButtons().forEach((button) => {
|
||||
button.disabled = true;
|
||||
});
|
||||
}
|
||||
|
||||
submitButtons() {
|
||||
return this.element.querySelectorAll("input[type='submit']");
|
||||
}
|
||||
}
|
||||
@@ -200,13 +200,24 @@
|
||||
max-height: 200px;
|
||||
overflow-y: scroll;
|
||||
|
||||
label.menu_item {
|
||||
.menu_item {
|
||||
margin-bottom: 5px;
|
||||
color: #454545;
|
||||
font-weight: 400;
|
||||
cursor: pointer;
|
||||
padding-top: 4px;
|
||||
padding-bottom: 5px;
|
||||
text-transform: uppercase;
|
||||
font-size: 85%;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.ofn-drop-down.ofn-drop-down-v2 {
|
||||
// Add very specific styling here for components that are in transition:
|
||||
// ie. the ones using the two classes above
|
||||
.ofn-drop-down-label {
|
||||
padding-top: 7px;
|
||||
padding-bottom: 7px;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -219,7 +219,6 @@ module Openfoodnetwork
|
||||
config.assets.precompile += ['web/all.js']
|
||||
config.assets.precompile += ['darkswarm/all.js']
|
||||
config.assets.precompile += ['shared/*']
|
||||
config.assets.precompile += ['qz/*']
|
||||
config.assets.precompile += ['*.jpg', '*.jpeg', '*.png', '*.gif' '*.svg']
|
||||
|
||||
# Apply framework defaults. New recommended defaults are successively added with each Rails version and
|
||||
@@ -241,6 +240,7 @@ module Openfoodnetwork
|
||||
config.generators.template_engine = :haml
|
||||
|
||||
Rails.application.routes.default_url_options[:host] = ENV["SITE_URL"]
|
||||
DfcProvider::Engine.routes.default_url_options[:host] = ENV["SITE_URL"]
|
||||
|
||||
Rails.autoloaders.main.ignore(Rails.root.join('app/webpacker'))
|
||||
|
||||
|
||||
@@ -3,7 +3,6 @@
|
||||
redis_connection_settings = {
|
||||
url: ENV.fetch("OFN_REDIS_JOBS_URL", "redis://localhost:6381/0"),
|
||||
network_timeout: 5,
|
||||
expires_in: Rails.env.development? ? 90.minutes : nil
|
||||
}
|
||||
|
||||
Sidekiq.configure_server do |config|
|
||||
|
||||
@@ -6,9 +6,22 @@ ar:
|
||||
spree/shipping_method: طريقة الشحن
|
||||
attributes:
|
||||
spree/order/ship_address:
|
||||
address1: "عنوان الشحن (الشارع + رقم المنزل)"
|
||||
address2: "عنوان الشحن 2"
|
||||
city: "عنوان الشحن المدينة"
|
||||
country: "عنوان الشحن الدولة"
|
||||
phone: "رقم الهاتف"
|
||||
firstname: "الاسم الاول"
|
||||
lastname: "الكنية"
|
||||
zipcode: "الرمز البريدي لعنوان الشحن"
|
||||
spree/order/bill_address:
|
||||
address1: "عنوان الفاتورة (الشارع + رقم المنزل)"
|
||||
zipcode: "الرمز البريدي لعنوان الفاتورة"
|
||||
city: "عنوان إرسال الفواتير المدينة "
|
||||
country: "عنوان إرسال الفواتير البلد "
|
||||
firstname: "عنوان إرسال الفواتير - الاسم الأول "
|
||||
lastname: "عنوان إرسال الفواتير - الاسم الأخير"
|
||||
phone: هاتف العميل
|
||||
spree/user:
|
||||
password: "كلمه السر"
|
||||
password_confirmation: "تأكيد كلمة المرور"
|
||||
@@ -420,11 +433,25 @@ ar:
|
||||
price: السعر
|
||||
producer: المنتج
|
||||
category: الفئة
|
||||
sku: SKU
|
||||
on_hand: "متوفر"
|
||||
on_demand: "على الطلب"
|
||||
tax_category: "الفئة الضريبية"
|
||||
inherits_properties: "الخصائص الموروثة؟"
|
||||
available_on: "متاح على"
|
||||
import_date: "تاريخ الاستيراد"
|
||||
columns_selector:
|
||||
unit: وحدة
|
||||
price: السعر
|
||||
producer: المنتج
|
||||
category: الفئة
|
||||
sku: SKU
|
||||
on_hand: "متوفر"
|
||||
on_demand: "على الطلب"
|
||||
tax_category: "الفئة الضريبية"
|
||||
inherits_properties: "الخصائص الموروثة؟"
|
||||
available_on: "متاح على"
|
||||
import_date: "تاريخ الاستيراد"
|
||||
adjustments:
|
||||
skipped_changing_canceled_order: "لا يمكنك تغيير الطلب الذي تم إلغاؤه."
|
||||
begins_at: يبدأ عند
|
||||
@@ -514,7 +541,6 @@ ar:
|
||||
title: "إعدادات الفاتورة"
|
||||
enable_invoices?: "تمكين الفواتير؟"
|
||||
invoice_style2?: "استخدم نموذج الفاتورة البديل الذي يتضمن إجمالي تفاصيل الضرائب لكل سعر ومعلومات معدل الضريبة لكل عنصر (غير مناسب حتى الآن للدول التي تعرض الأسعار باستثناء الضريبة)"
|
||||
enable_receipt_printing?: "إظهار خيارات لإيصالات الطباعة باستخدام الطابعات الحرارية من أجل ترتيب القائمة المنسدلة؟"
|
||||
enterprise_number_required_on_invoices?: "هل تتطلب ABN لإنشاء فاتورة؟"
|
||||
stripe_connect_settings:
|
||||
edit:
|
||||
@@ -1296,6 +1322,7 @@ ar:
|
||||
total_by_customer: الإجمالي حسب العميل
|
||||
total_by_supplier: الإجمالي حسب المورد
|
||||
supplier_totals: اجمالي دورة الطلب الموردين
|
||||
percentage: "%{value}٪"
|
||||
supplier_totals_by_distributor: اجمالي دورة الطلب الموردين حسب الموزع
|
||||
totals_by_supplier: اجمالي دورة الطلب الموزعين من قبل المورد
|
||||
customer_totals: اجمالي دورة الطلب للعملاء
|
||||
@@ -1306,6 +1333,7 @@ ar:
|
||||
addresses: عناوين
|
||||
payment_methods: تقرير طرق الدفع
|
||||
delivery: إشعار بالإستلام
|
||||
sales_tax_totals_by_producer: إجمالي ضريبة المبيعات حسب المنتج
|
||||
tax_types: أنواع الضرائب
|
||||
tax_rates: معدلات الضريبة
|
||||
pack_by_customer: تم التعبئة من العملاء
|
||||
@@ -1485,6 +1513,13 @@ ar:
|
||||
stripe_connect_fail: عذرًا ، فشل اتصال حساب Stripe الخاص بك
|
||||
stripe_connect_settings:
|
||||
resource: تهيئة ربط Strip
|
||||
resend_confirmation_emails_feedback:
|
||||
zero: "تم إرسال رسائل التأكيد عبر البريد الإلكتروني لطلبات %{count}."
|
||||
one: "تم إرسال بريد إلكتروني للتأكيد لطلب واحد."
|
||||
two: "تم إرسال رسائل التأكيد عبر البريد الإلكتروني لطلبات %{count}."
|
||||
few: "تم إرسال رسائل التأكيد عبر البريد الإلكتروني لطلبات %{count}."
|
||||
many: "تم إرسال رسائل التأكيد عبر البريد الإلكتروني لطلبات %{count}."
|
||||
other: "تم إرسال رسائل التأكيد عبر البريد الإلكتروني لطلبات %{count}."
|
||||
api:
|
||||
unknown_error: "هناك خطأ ما. تم إخطار فريقنا."
|
||||
invalid_api_key: "مفتاح API المحدد غير صالح (%{key})."
|
||||
@@ -1597,10 +1632,6 @@ ar:
|
||||
invoice_issued_on: "الفاتورة الصادرة في:"
|
||||
order_number: "رقم الفاتورة:"
|
||||
date_of_transaction: "تاريخ المعاملة:"
|
||||
ticket_column_qty: "الكمية"
|
||||
ticket_column_item: "بند"
|
||||
ticket_column_unit_price: "سعر الوحدة"
|
||||
ticket_column_total_price: "السعر الكلي"
|
||||
menu_1_title: "متاجر"
|
||||
menu_1_url: "/shops"
|
||||
menu_2_title: "خريطة"
|
||||
@@ -1610,11 +1641,11 @@ ar:
|
||||
menu_4_title: "مجموعات"
|
||||
menu_4_url: "/groups"
|
||||
menu_5_title: "حول"
|
||||
menu_5_url: "https://about.flaha.org/"
|
||||
menu_5_url: "https://about.flaha.org"
|
||||
menu_6_title: "الاتصال"
|
||||
menu_6_url: "https://openfoodnetwork.org/au/connect/"
|
||||
menu_6_url: "https://join.slack.com/t/flahaqaopenfo-2gd5913/shared_invite/zt-1pg0uzd4j-tFxELTtA9iA78ipnO3NZ5w"
|
||||
menu_7_title: "تعلم"
|
||||
menu_7_url: "https://openfoodnetwork.org/au/learn/"
|
||||
menu_7_url: "https://kh.flaha.org"
|
||||
logo: "الشعار (640 × 130)"
|
||||
logo_mobile: "شعار الجوال (75 × 26)"
|
||||
logo_mobile_svg: "شعار الجوال (SVG)"
|
||||
@@ -1707,12 +1738,6 @@ ar:
|
||||
card_has_been_removed: "تمت إزالة بطاقتك (الرقم: %{number})"
|
||||
card_could_not_be_removed: عذرًا ، تعذرت إزالة البطاقة
|
||||
invalid_credit_card: "بطاقة الائتمان غير صالحة"
|
||||
ie_warning_headline: "متصفحك غير محدث :-("
|
||||
ie_warning_text: "للحصول على أفضل تجربة لشبكة الغذاء المفتوح ، نوصي بشدة بترقية متصفحك:"
|
||||
ie_warning_chrome: تحميل متصفح كروم
|
||||
ie_warning_firefox: تحميل متصفح فايرفوكس
|
||||
ie_warning_ie: ترقية Internet Explorer
|
||||
ie_warning_other: "لا يمكنك ترقية متصفحك؟ جرب شبكة الغذاء المفتوح على هاتفك الذكي :-)"
|
||||
legal:
|
||||
cookies_policy:
|
||||
header: "كيف نستخدم ملفات تعريف الارتباط"
|
||||
@@ -1859,10 +1884,13 @@ ar:
|
||||
title: تفاصيل التسليم
|
||||
edit: تعديل
|
||||
address: عنوان التسليم
|
||||
instructions: التعليمات
|
||||
payment_method:
|
||||
title: 'طريقة الدفع '
|
||||
edit: تعديل
|
||||
instructions: التعليمات
|
||||
order:
|
||||
title: تفاصيل الطلب
|
||||
edit: تعديل
|
||||
terms_and_conditions:
|
||||
message_html: "أوافق على %{terms_and_conditions_link} للبائع."
|
||||
@@ -1875,6 +1903,7 @@ ar:
|
||||
submit: اكمل الطلب
|
||||
cancel: العودة إلى طريقة الدفع
|
||||
errors:
|
||||
saving_failed: "فشل الحفظ ، يرجى تحديث الحقول المميزة. %{messages}"
|
||||
terms_not_accepted: الرجاء قبول الشروط والأحكام
|
||||
required: لا يمكن أن يكون الحقل فارغًا
|
||||
invalid_number: "يرجى إدخال رقم هاتف صالح"
|
||||
@@ -2575,6 +2604,7 @@ ar:
|
||||
report_customers_cycle: "ترتيب الدورة"
|
||||
report_customers_type: "نوع التقرير"
|
||||
report_customers_csv: "تنزيل بتنسيق CSV"
|
||||
report_customers: عميل
|
||||
report_producers: "المنتجين"
|
||||
report_type: "نوع التقرير"
|
||||
report_hubs: "مراكز بيع"
|
||||
@@ -2652,8 +2682,12 @@ ar:
|
||||
report_header_taxable_items_total: "إجمالي العناصر الخاضعة للضريبة (%{currency_symbol})"
|
||||
report_header_sales_tax: "ضريبة المبيعات (%{currency_symbol})"
|
||||
report_header_delivery_charge: "رسوم التوصيل (%{currency_symbol})"
|
||||
report_header_tax: "ضريبة"
|
||||
report_header_tax_on_delivery: "الضريبة على التسليم (%{currency_symbol})"
|
||||
report_header_tax_on_fees: "الضريبة على الرسوم (%{currency_symbol})"
|
||||
report_header_tax_category: "الفئة الضريبية"
|
||||
report_header_tax_rate_name: "اسم معدل الضريبة"
|
||||
report_header_tax_rate: "معدل الضريبة"
|
||||
report_header_total_tax: "إجمالي الضريبة (%{currency_symbol})"
|
||||
report_header_total_excl_tax: "المجموع باستثناء الضريبة (%{currency_symbol})"
|
||||
report_header_total_incl_tax: "إجمالي مدفوع الضريبة (%{currency_symbol})"
|
||||
@@ -2676,6 +2710,7 @@ ar:
|
||||
report_header_supplier: المورد
|
||||
report_header_producer: المنتج
|
||||
report_header_producer_suburb: منتج الضاحية
|
||||
report_header_producer_tax_status: الوضع الضريبي للمنتج
|
||||
report_header_producer_charges_sales_tax?: مسجل في ضريبة السلع والخدمات / ضريبة القيمة المضافة
|
||||
report_header_unit: وحدة
|
||||
report_header_group_buy_unit_quantity: مجموعة شراء وحدة الكمية
|
||||
@@ -2692,6 +2727,7 @@ ar:
|
||||
report_header_distributor_address: عنوان الموزع
|
||||
report_header_distributor_city: مدينة الموزع
|
||||
report_header_distributor_postcode: الرمز البريدي للموزع
|
||||
report_header_distributor_tax_status: الوضع الضريبي للموزع
|
||||
report_header_delivery_address: عنوان التسليم
|
||||
report_header_delivery_postcode: تسليم الرمز البريدي
|
||||
report_header_bulk_unit_size: حجم الوحدة بالجملة
|
||||
@@ -2871,6 +2907,7 @@ ar:
|
||||
deleting_item_will_cancel_order: "ستؤدي هذه العملية إلى أمر واحد أو أكثر من الطلبات الفارغة ، والتي سيتم إلغاؤها. هل ترغب في المتابعة؟"
|
||||
modals:
|
||||
got_it: "فهمتك"
|
||||
confirm: "التأكيد"
|
||||
close: "إغلاق"
|
||||
continue: "تابع"
|
||||
cancel: "إلغاء"
|
||||
@@ -3485,6 +3522,8 @@ ar:
|
||||
server_error: "خطأ في الخادم"
|
||||
shipping_method_names:
|
||||
UPS Ground: "UPS الأرضي"
|
||||
pick_up: "التسليم من المزرعة مباشرة"
|
||||
delivery: "موقعة ومختومة وتم التسليم"
|
||||
start_date: "تاريخ البدء"
|
||||
successfully_removed: "تمت الإزالة بنجاح"
|
||||
taxonomy_edit: "التصنيف"
|
||||
@@ -3561,9 +3600,6 @@ ar:
|
||||
default_seo_title: "العنوان الافتراضي ل SEO"
|
||||
default_meta_description: "وصف التعريف الافتراضي"
|
||||
default_meta_keywords: "الكلمات الرئيسية الوصفية الافتراضية"
|
||||
security_settings: "اعدادات الامان"
|
||||
allow_ssl_in_production: "السماح باستخدام طبقة المقابس الآمنة في وضع الإنتاج"
|
||||
allow_ssl_in_staging: "اسمح باستخدام طبقة المقابس الآمنة في وضع التدريج"
|
||||
currency_decimal_mark: "العملة العشرية"
|
||||
currency_settings: "إعدادات العملة"
|
||||
currency_symbol_position: ضع "رمز العملة قبل أو بعد مبلغ الدولار؟"
|
||||
@@ -3572,6 +3608,7 @@ ar:
|
||||
display_currency: "عرض العملة"
|
||||
choose_currency: "اختر العملة"
|
||||
mail_method_settings: "إعدادات طريقة البريد"
|
||||
mail_settings_notice_html: "<b>التغييرات التي يتم إجراؤها هنا ستكون مؤقتة</b> للتصحيح فقط ، وقد يتم التراجع عنها في المستقبل.<br> يمكن إجراء تغييرات دائمة عن طريق تحديث أسرار المثيل وتوفيرها باستخدام <a href='https://github.com/openfoodfoundation/ofn-install'>ofn-install</a> . تواصل مع فريق OFN العالمي لمزيد من التفاصيل."
|
||||
general: "عام"
|
||||
enable_mail_delivery: "تمكين تسليم البريد"
|
||||
send_mails_as: "إرسال رسائل ب"
|
||||
@@ -3778,6 +3815,10 @@ ar:
|
||||
authorized: "مخول"
|
||||
received: "تم الاستلام"
|
||||
canceled: "ألغيت"
|
||||
line_items:
|
||||
index:
|
||||
results_found: "تم العثور على النتائج %{number}."
|
||||
viewing: "عرض %{start} إلى %{end}."
|
||||
orders:
|
||||
add_product:
|
||||
cannot_add_item_to_canceled_order: "لا يمكن إضافة عنصر إلى الطلب الملغى"
|
||||
@@ -3801,6 +3842,7 @@ ar:
|
||||
print_invoices: "طباعة الفواتير"
|
||||
cancel_orders: "إلغاء الطلبات"
|
||||
resend_confirmation: "أعد إرسال التأكيد"
|
||||
resend_confirmation_confirm_html: "سيؤدي هذا إلى إعادة إرسال البريد الإلكتروني للتأكيد إلى العميل.<br /> هل انت متأكد انك تريد المتابعة؟"
|
||||
selected:
|
||||
zero: "لم يتم اختيار أي طلب"
|
||||
one: "طلب واحد تم اختياره"
|
||||
|
||||
@@ -417,11 +417,25 @@ ca:
|
||||
price: Preu
|
||||
producer: Productora
|
||||
category: Categoria
|
||||
sku: Número de referència (SKU)
|
||||
on_hand: "Disponibles"
|
||||
on_demand: "Sota demanda"
|
||||
tax_category: "Categoria d'impostos"
|
||||
inherits_properties: "Hereda propietats?"
|
||||
available_on: "Disponible el"
|
||||
import_date: "Data d'importació"
|
||||
columns_selector:
|
||||
unit: Unitat
|
||||
price: Preu
|
||||
producer: Productora
|
||||
category: Categoria
|
||||
sku: Número de referència (SKU)
|
||||
on_hand: "Disponibles"
|
||||
on_demand: "Sota demanda"
|
||||
tax_category: "Categoria d'impostos"
|
||||
inherits_properties: "Hereda propietats?"
|
||||
available_on: "Disponible el"
|
||||
import_date: "Data d'importació"
|
||||
adjustments:
|
||||
skipped_changing_canceled_order: "No podeu canviar una comanda cancel·lada."
|
||||
begins_at: Comença a
|
||||
@@ -511,7 +525,6 @@ ca:
|
||||
title: "Configuració de la factura"
|
||||
enable_invoices?: "Activar factures?"
|
||||
invoice_style2?: "Utilitzeu el model de factura alternatiu que inclou el desglossament dels càrregs totals per tarifa i la informació sobre la taxa impositiva per article (encara no està disponible per als països sense recàrregs en concpte d'impostos)"
|
||||
enable_receipt_printing?: "Mostra les opcions per imprimir rebuts amb impressores tèrmiques en el menú desplegable de la comanda?"
|
||||
enterprise_number_required_on_invoices?: "Vols fer el NIF obligatori per generar una factura?"
|
||||
stripe_connect_settings:
|
||||
edit:
|
||||
@@ -1565,10 +1578,6 @@ ca:
|
||||
invoice_issued_on: "Factura emesa el:"
|
||||
order_number: "Nombre de factura:"
|
||||
date_of_transaction: "Data de la transacció:"
|
||||
ticket_column_qty: "Quantitat"
|
||||
ticket_column_item: "Article"
|
||||
ticket_column_unit_price: "Preu unitari"
|
||||
ticket_column_total_price: "Preu total"
|
||||
menu_1_title: "Botigues"
|
||||
menu_1_url: "/shops"
|
||||
menu_2_title: "Mapa"
|
||||
@@ -1675,12 +1684,6 @@ ca:
|
||||
card_has_been_removed: "S'ha eliminat la teva targeta (número: %{number})"
|
||||
card_could_not_be_removed: Ho sentim, no s'ha pogut eliminar la targeta
|
||||
invalid_credit_card: "Targeta de crèdit no vàlida"
|
||||
ie_warning_headline: "El vostre navegador no està actualitzat :-("
|
||||
ie_warning_text: "Per obtenir la millor experiència a Open Food Network et recomanem que actualitzis el teu navegador:"
|
||||
ie_warning_chrome: Descarrega Chrome
|
||||
ie_warning_firefox: Descarrega Firefox
|
||||
ie_warning_ie: Actualitza Internet Explorer
|
||||
ie_warning_other: "No pots actualitzar el navegador? Prova Open Food Network al telèfon mòbil :-)"
|
||||
legal:
|
||||
cookies_policy:
|
||||
header: "Com utilitzem les cookies"
|
||||
@@ -2506,6 +2509,7 @@ ca:
|
||||
report_customers_cycle: "Cicle de Comanda"
|
||||
report_customers_type: "Tipus d'informe"
|
||||
report_customers_csv: "Descarrega com a csv"
|
||||
report_customers: Consumidora
|
||||
report_producers: "Productors"
|
||||
report_type: "Tipus d'informe"
|
||||
report_hubs: "Grups"
|
||||
@@ -2570,6 +2574,8 @@ ca:
|
||||
report_header_delivery_charge: "Càrrec de lliurament (%{currency_symbol})"
|
||||
report_header_tax_on_delivery: "Impost sobre el lliurament (%{currency_symbol})"
|
||||
report_header_tax_on_fees: "Impost sobre les comissions (%{currency_symbol})"
|
||||
report_header_tax_category: "Categoria d'impostos"
|
||||
report_header_tax_rate: "Impost"
|
||||
report_header_total_tax: "Impost total (%{currency_symbol})"
|
||||
report_header_total_excl_tax: "Total excl. impostos (%{currency_symbol})"
|
||||
report_header_total_incl_tax: "Total incl. impostos (%{currency_symbol})"
|
||||
@@ -3373,9 +3379,6 @@ ca:
|
||||
default_seo_title: "Títol Seo predeterminat "
|
||||
default_meta_description: "Descripció Meta predeterminada"
|
||||
default_meta_keywords: "Paraules clau meta predeterminades"
|
||||
security_settings: "Configuració de seguretat"
|
||||
allow_ssl_in_production: "Permet que SSL s'utilitzi en mode de producció"
|
||||
allow_ssl_in_staging: "Permet que SSL s'utilitzi en mode de staging"
|
||||
currency_decimal_mark: "Separador decimal de moneda"
|
||||
currency_settings: "Configuració de moneda"
|
||||
currency_symbol_position: Posa "símbol de moneda abans o després d'una quantitat"?
|
||||
@@ -3588,6 +3591,10 @@ ca:
|
||||
authorized: "Autoritzat"
|
||||
received: "Rebut"
|
||||
canceled: "Cancel·lat"
|
||||
line_items:
|
||||
index:
|
||||
results_found: "%{number} Resultats trobats."
|
||||
viewing: "Veient %{start} a %{end}."
|
||||
orders:
|
||||
add_product:
|
||||
cannot_add_item_to_canceled_order: "No es pot afegir l'article a la comanda cancel·lada"
|
||||
|
||||
@@ -420,11 +420,25 @@ cy:
|
||||
price: Pris
|
||||
producer: Cynhyrchydd
|
||||
category: Categori
|
||||
sku: Cod y Cynnyrch
|
||||
on_hand: "Ar gael"
|
||||
on_demand: "Ar alw"
|
||||
tax_category: "Categori Treth"
|
||||
inherits_properties: "Yn etifeddu manylion cynnyrch?"
|
||||
available_on: "Ar gael ar"
|
||||
import_date: "Dyddiad Mewnforio"
|
||||
columns_selector:
|
||||
unit: Uned
|
||||
price: Pris
|
||||
producer: Cynhyrchydd
|
||||
category: Categori
|
||||
sku: Cod y Cynnyrch
|
||||
on_hand: "Ar gael"
|
||||
on_demand: "Ar alw"
|
||||
tax_category: "Categori Treth"
|
||||
inherits_properties: "Yn etifeddu manylion cynnyrch?"
|
||||
available_on: "Ar gael ar"
|
||||
import_date: "Dyddiad Mewnforio"
|
||||
adjustments:
|
||||
skipped_changing_canceled_order: "Nid yw'n bosib newid archeb a ganslwyd"
|
||||
begins_at: Yn dechrau am
|
||||
@@ -514,7 +528,6 @@ cy:
|
||||
title: "Gosodiadau Anfoneb"
|
||||
enable_invoices?: "Galluogi Anfonebau?"
|
||||
invoice_style2?: "Defnyddiwch y model anfoneb amgen sy'n cynnwys dadansoddiad treth cyfan fesul cyfradd a gwybodaeth cyfradd dreth fesul eitem (ddim yn addas eto ar gyfer gwledydd sy'n arddangos prisiau ac eithrio treth)"
|
||||
enable_receipt_printing?: "Dangos opsiynau ar gyfer argraffu derbynebau gan ddefnyddio argraffwyr thermol yn nhrefn y cwymplen?"
|
||||
enterprise_number_required_on_invoices?: "Angen rhif y cwmni i greu anfoneb?"
|
||||
stripe_connect_settings:
|
||||
edit:
|
||||
@@ -1297,6 +1310,7 @@ cy:
|
||||
total_by_customer: Cyfanswm fesul Cwsmer
|
||||
total_by_supplier: Cyfanswm fesul Cyflenwr
|
||||
supplier_totals: Cyfanswm Cylch Archebu Cyflenwyr
|
||||
percentage: "%{value} %"
|
||||
supplier_totals_by_distributor: Cyfanswm Cylch Archebu Cyflenwyr fesul Dosbarthwr
|
||||
totals_by_supplier: Cyfanswm Cylch Dosbarthu Archebion fesul Cyflenwr
|
||||
customer_totals: Archebu Cyfansymiau Cwsmer Beicio
|
||||
@@ -1598,10 +1612,6 @@ cy:
|
||||
invoice_issued_on: "Cyhoeddwyd yr anfoneb ar:"
|
||||
order_number: "Rhif yr anfoneb:"
|
||||
date_of_transaction: "Dyddiad y trafodiad:"
|
||||
ticket_column_qty: "Nifer"
|
||||
ticket_column_item: "Eitem"
|
||||
ticket_column_unit_price: "Pris yr Uned"
|
||||
ticket_column_total_price: "Cyfanswm Pris"
|
||||
menu_1_title: "Hafan"
|
||||
menu_1_url: "/"
|
||||
menu_2_title: "Amdanom"
|
||||
@@ -1708,12 +1718,6 @@ cy:
|
||||
card_has_been_removed: "Dilëwyd eich cerdyn (rhif: %{number})"
|
||||
card_could_not_be_removed: Mae'n ddrwg gennym, nid oedd yn bosib dileu'r cerdyn
|
||||
invalid_credit_card: "Cerdyn credyd annilys"
|
||||
ie_warning_headline: "Mae eich porwr yn hen :-("
|
||||
ie_warning_text: "I gael y profiad gorau gyda'r Open Food Network rydym yn argymell yn gryf uwchraddio'ch porwr:"
|
||||
ie_warning_chrome: Dadlwytho Chrome
|
||||
ie_warning_firefox: Dadlwytho Firefox
|
||||
ie_warning_ie: Uwchraddio Internet Explorer
|
||||
ie_warning_other: "Methu uwchraddio'ch porwr? Rhowch gynnig ar y Open Food Network ar eich ffôn clyfar :-)"
|
||||
legal:
|
||||
cookies_policy:
|
||||
header: "Sut Rydym yn Defnyddio Cwcis"
|
||||
@@ -2575,6 +2579,7 @@ cy:
|
||||
report_customers_cycle: "Cylch archebu "
|
||||
report_customers_type: "Math o Adroddiad"
|
||||
report_customers_csv: "Lawrlwytho fel csv"
|
||||
report_customers: Cwsmer
|
||||
report_producers: "Prynu bwyd"
|
||||
report_type: "Math o Adroddiad"
|
||||
report_hubs: "Hybiau"
|
||||
@@ -2652,8 +2657,10 @@ cy:
|
||||
report_header_taxable_items_total: "Cyfanswm Eitemau Trethadwy (%{currency_symbol})"
|
||||
report_header_sales_tax: "Treth Gwerthu (%{currency_symbol})"
|
||||
report_header_delivery_charge: "Tâl Dosbarthu (%{currency_symbol})"
|
||||
report_header_tax: "Treth"
|
||||
report_header_tax_on_delivery: "Treth ar Gyflenwi (%{currency_symbol})"
|
||||
report_header_tax_on_fees: "Treth ar Ffioedd (%{currency_symbol})"
|
||||
report_header_tax_category: "Categori Treth"
|
||||
report_header_total_tax: "Cyfanswm Treth (%{currency_symbol})"
|
||||
report_header_total_excl_tax: "Cyfanswm heb dreth (%{currency_symbol})"
|
||||
report_header_total_incl_tax: "Cyfanswm gan gynnwys treth (%{currency_symbol})"
|
||||
@@ -3521,9 +3528,6 @@ cy:
|
||||
default_seo_title: "Teitl SEO diofyn"
|
||||
default_meta_description: "Disgrifiad Meta diofyn"
|
||||
default_meta_keywords: "Allweddeiriau Meta diofyn"
|
||||
security_settings: "Gosodiadau Diogelwch"
|
||||
allow_ssl_in_production: "Caniatáu defnyddio SSL yn y modd cynhyrchu"
|
||||
allow_ssl_in_staging: "Caniatáu defnyddio SSL yn y modd llwyfannu"
|
||||
currency_decimal_mark: "Marc degol arian cyfred"
|
||||
currency_settings: "Gosodiadau Arian Parod"
|
||||
currency_symbol_position: Noder "symbol arian cyfred cyn neu ar ôl swm doler?"
|
||||
@@ -3738,6 +3742,10 @@ cy:
|
||||
authorized: "Awdurdodwyd"
|
||||
received: "Derbyniwyd"
|
||||
canceled: "Canslwyd"
|
||||
line_items:
|
||||
index:
|
||||
results_found: "Cafwyd hyd i%{number} canlyniad."
|
||||
viewing: "Yn edrych ar %{start} i %{end}."
|
||||
orders:
|
||||
add_product:
|
||||
cannot_add_item_to_canceled_order: "Nid yw'n bosib ychwanegu'r eitem i archeb a ganslwyd."
|
||||
@@ -3954,6 +3962,9 @@ cy:
|
||||
select_and_search: "Dewis hidlwyr a chlicio ar %{option} i gael mynediad i'ch data."
|
||||
customer_names_message:
|
||||
customer_names_tip: "Os cuddiwyd enwau cwsmeriaid ar gyfer archebion a gyflenwyd gennych, gallwch gysylltu â'r dosbarthwr a gofyn a yw'n bosib iddyn nhw ddiweddaru eu dewisiadau siop i ganiatáu i'w cyflenwyr weld enwau cwsmeriaid."
|
||||
products_and_inventory:
|
||||
all_products:
|
||||
message: "Noder y caiff lefelau stoc eu hadrodd o restrau cynnyrch cyflenwyr yn unig. Os ydych yn defnyddio’r rhestr stoc i reoli maint eich stoc, caiff y gwerthoedd hyn eu hanwybyddu yn yr adroddiad hwn."
|
||||
users:
|
||||
index:
|
||||
listing_users: "Yn rhestru Defnyddwyr"
|
||||
@@ -4122,6 +4133,8 @@ cy:
|
||||
thanks: "Diolch am archebu gyda ni."
|
||||
track_information: "Gwybodaeth Tracio: %{tracking}"
|
||||
track_link: "Dolen Tracio: %{url}"
|
||||
picked_up_instructions: "Casglwyd eich archeb gan %{distributor}"
|
||||
picked_up_subject: "Hysbysiad Casglu"
|
||||
test_mailer:
|
||||
test_email:
|
||||
greeting: "Llongyfarchiadau!"
|
||||
@@ -4314,11 +4327,16 @@ cy:
|
||||
errors:
|
||||
not_found:
|
||||
title: "Nid yw'r dudalen rydych yn chwilio amdani'n bodoli (404)"
|
||||
message_html: "<b>Rhowch gynnig arall</b> <p>. Hwyrach taw problem dros dro yw hon. Cliciwch y botwm ‘yn ôl’ i ddychwelyd at y sgrin flaenorol, neu ewch yn ôl i’r <a href='/'> Hafan </a>, a rhowch gynnig arall </p>. <b> Cysylltwch â’r ddesg</b> <p>Gymorth os bydd y broblem yn parhau neu os bydd yn fater brys, cofiwch ddweud wrthym amdano. Mae ein manylion cyswllt ar gael ar dudalen ‘Lleol’ <a href='https://openfoodnetwork.org/ofn-local/' target='blank'> y Rhwydwaith Bwyd Agored byd-eang </a>. </p> <p> Bydd o gymorth mawr inni os gallwch roi cymaint o fanylion â phosibl am y dudalen sydd ar goll.</p>"
|
||||
internal_server_error:
|
||||
title: "Mae'n ddrwg gennym, aeth rhywbeth o'i le (500)"
|
||||
message_html: "<b>Rhowch gynnig arall</b> <p>. Hwyrach taw problem dros dro yw hon. Cliciwch y botwm ‘yn ôl’ i ddychwelyd at y sgrin flaenorol, neu ewch yn ôl i’r <a href='/''> Hafan </a>, a rhowch gynnig arall </p>. <b>Rydym yn gwybod am hyn</b><p>. Os ydych chi wedi gweld y broblem hon o’r blaen, mae’n debyg ein bod yn gwybod amdano, ac yn gweithio i’w drwsio. Byddwn yn cofnodi pob nam sy'n digwydd.</p><b>Cysylltwch â’r ddesg Gymorth</b><p>os bydd y broblem yn parhau neu os bydd yn fater brys, cofiwch ddweud wrthym amdano. Mae ein manylion cyswllt ar gael ar dudalen ‘Lleol’<a href='https://openfoodnetwork.org/ofn-local/' target='blank'>y Rhwydwaith Bwyd Agored byd-eang</a>. </p><p> Bydd o gymorth mawr inni os gallwch roi cymaint o fanylion â phosibl inni am yr hyn roeddech yn ei wneud pan ddigwyddodd y nam hwn.</p>"
|
||||
unprocessable_entity:
|
||||
title: "Gwrthodwyd y newid roeddech chi am ei wneud (422)"
|
||||
message_html: "<p>Gwrthodwyd y newid roeddech chi am ei wneud. Hwyrach ichi geisio newid rhywbeth nad oes gennych fynediad ato.<br><h3><a href='/' >Ewch yn ôl i’r Hafan.</a></h3></p>"
|
||||
components:
|
||||
multiple_checked_select:
|
||||
filter_placeholder: "Opsiynau hidlo"
|
||||
search_input:
|
||||
placeholder: Chwilio
|
||||
selector_with_filter:
|
||||
|
||||
@@ -412,11 +412,25 @@ de_CH:
|
||||
price: Preis
|
||||
producer: Produzent
|
||||
category: Kategorie
|
||||
sku: Artikelnummer
|
||||
on_hand: "Verfügbar"
|
||||
on_demand: "Unbegrenzt/auf Bestellung"
|
||||
tax_category: "Steuerkategorie"
|
||||
inherits_properties: "Übernimmt Eigenschaften des Ladens?"
|
||||
available_on: "Verfügbar am"
|
||||
import_date: "Importdatum"
|
||||
columns_selector:
|
||||
unit: Einheit
|
||||
price: Preis
|
||||
producer: Produzent
|
||||
category: Kategorie
|
||||
sku: Artikelnummer
|
||||
on_hand: "Verfügbar"
|
||||
on_demand: "Unbegrenzt/auf Bestellung"
|
||||
tax_category: "Steuerkategorie"
|
||||
inherits_properties: "Übernimmt Eigenschaften des Ladens?"
|
||||
available_on: "Verfügbar am"
|
||||
import_date: "Importdatum"
|
||||
adjustments:
|
||||
skipped_changing_canceled_order: "Eine stornierte Bestellung kann nicht geändert werden."
|
||||
begins_at: Beginnt
|
||||
@@ -504,7 +518,6 @@ de_CH:
|
||||
title: "Rechnungseinstellungen"
|
||||
enable_invoices?: "Rechnungen aktivieren?"
|
||||
invoice_style2?: "Verwenden Sie die Rechnungsvorlage mit Aufschlüsselung verschiedener Steuersätze pro Artikel (empfohlen in der EU, noch nicht für Länder mit Preisen ohne Steuern geeignet)."
|
||||
enable_receipt_printing?: "Optionen zum Drucken von Belegen mit Thermodruckern in der Dropdown-Liste anzeigen?"
|
||||
stripe_connect_settings:
|
||||
edit:
|
||||
title: "Stripe Connect"
|
||||
@@ -1560,10 +1573,6 @@ de_CH:
|
||||
invoice_issued_on: "Rechnungsdatum:"
|
||||
order_number: "Rechnungsnummer:"
|
||||
date_of_transaction: "Bestelldatum:"
|
||||
ticket_column_qty: "Menge"
|
||||
ticket_column_item: "Artikel"
|
||||
ticket_column_unit_price: "Stückpreis"
|
||||
ticket_column_total_price: "Gesamtpreis"
|
||||
menu_1_title: "Einkaufen"
|
||||
menu_1_url: "/shops"
|
||||
menu_2_title: "Karte"
|
||||
@@ -1670,12 +1679,6 @@ de_CH:
|
||||
card_has_been_removed: "Ihre Kreditkarte wurde entfernt (Nummer: %{number})."
|
||||
card_could_not_be_removed: Die Kreditkarte konnte nicht entfernt werden.
|
||||
invalid_credit_card: "Ungültige Kreditkarte"
|
||||
ie_warning_headline: "Ihr Browser ist veraltet. :-("
|
||||
ie_warning_text: "Für das beste Open-Food-Schweiz-Erlebnis empfehlen wir dringend, Ihren Browser zu aktualisieren:"
|
||||
ie_warning_chrome: Chrome herunterladen
|
||||
ie_warning_firefox: Firefox herunterladen
|
||||
ie_warning_ie: Internet Explorer aktualisieren
|
||||
ie_warning_other: "Können Sie Ihren Browser nicht aktualisieren? Versuchen Sie Open Food Schweiz auf Ihrem Smartphone! :-)"
|
||||
legal:
|
||||
cookies_policy:
|
||||
header: "Wie wir Cookies verwenden"
|
||||
@@ -2533,6 +2536,7 @@ de_CH:
|
||||
report_customers_cycle: "Bestellzyklus"
|
||||
report_customers_type: "Berichtsart"
|
||||
report_customers_csv: "Als csv-Datei herunterladen"
|
||||
report_customers: Kunde
|
||||
report_producers: "Unsere Produzenten"
|
||||
report_type: "Berichtsart"
|
||||
report_hubs: "Hubs"
|
||||
@@ -2598,8 +2602,10 @@ de_CH:
|
||||
report_header_taxable_items_total: "Steuerpflichtige Posten insgesamt (%{currency_symbol})"
|
||||
report_header_sales_tax: "Umsatzsteuer (%{currency_symbol})"
|
||||
report_header_delivery_charge: "Liefergebühr (%{currency_symbol})"
|
||||
report_header_tax: "Steuern"
|
||||
report_header_tax_on_delivery: "Steuer auf Lieferkosten (%{currency_symbol})"
|
||||
report_header_tax_on_fees: "Steuer auf Gebühren (%{currency_symbol})"
|
||||
report_header_tax_category: "Steuerkategorie"
|
||||
report_header_total_tax: "Summe Steuern (%{currency_symbol})"
|
||||
report_header_total_excl_tax: "Summe exkl. Steuern (%{currency_symbol})"
|
||||
report_header_total_incl_tax: "Summe inkl. Steuern (%{currency_symbol})"
|
||||
@@ -3420,9 +3426,6 @@ de_CH:
|
||||
default_seo_title: "Standard SEO-Titel"
|
||||
default_meta_description: "Standard Meta-Beschreibung"
|
||||
default_meta_keywords: "Standard Meta-Schlüsselwörter"
|
||||
security_settings: "Sicherheitseinstellungen"
|
||||
allow_ssl_in_production: "Zulassen, dass SSL im Produktionsmodus verwendet wird"
|
||||
allow_ssl_in_staging: "Zulassen, dass SSL im Staging-Modus verwendet wird"
|
||||
currency_decimal_mark: "Dezimalzeichen der Währung"
|
||||
currency_settings: "Währungseinstellungen"
|
||||
currency_symbol_position: Währungssymbol (CHF) vor oder nach dem Betrag?
|
||||
@@ -3635,6 +3638,10 @@ de_CH:
|
||||
authorized: "Autorisiert"
|
||||
received: "Empfangen"
|
||||
canceled: "abgebrochen"
|
||||
line_items:
|
||||
index:
|
||||
results_found: "%{number} Ergebnisse gefunden."
|
||||
viewing: "Angezeigt wird %{start} bis %{end}."
|
||||
orders:
|
||||
add_product:
|
||||
cannot_add_item_to_canceled_order: "Artikel kann nicht zu stornierter Bestellung hinzugefügt werden"
|
||||
|
||||
@@ -6,9 +6,12 @@ de_DE:
|
||||
spree/shipping_method: Lieferoption
|
||||
attributes:
|
||||
spree/order/ship_address:
|
||||
address2: "Lieferadresse Adresszusatz"
|
||||
country: "Lieferadresse Land"
|
||||
phone: "Telefonnummer"
|
||||
firstname: "Vorname"
|
||||
lastname: "Nachname"
|
||||
zipcode: "Lieferadresse Postleitzahl"
|
||||
spree/user:
|
||||
password: "Passwort"
|
||||
password_confirmation: "Passwort erneut eingeben"
|
||||
@@ -408,8 +411,11 @@ de_DE:
|
||||
filters:
|
||||
categories:
|
||||
title: Lieferkategorien
|
||||
selected_categories: "%{count} Kategorien ausgewählt"
|
||||
producers:
|
||||
title: Unsere Produzenten
|
||||
selected_producers: "%{count} Produzenten ausgewählt"
|
||||
per_page: "%{count} Produkte pro Seite"
|
||||
colums: Spalten
|
||||
columns:
|
||||
name: Name
|
||||
@@ -417,11 +423,25 @@ de_DE:
|
||||
price: Preis
|
||||
producer: Produzent
|
||||
category: Kategorie
|
||||
sku: Artikelnummer
|
||||
on_hand: "Verfügbar"
|
||||
on_demand: "Unbegrenzt/auf Bestellung"
|
||||
tax_category: "Steuerkategorie"
|
||||
inherits_properties: "Übernimmt Eigenschaften des Ladens?"
|
||||
available_on: "Verfügbar am"
|
||||
import_date: "Importdatum"
|
||||
columns_selector:
|
||||
unit: Einheit
|
||||
price: Preis
|
||||
producer: Produzent
|
||||
category: Kategorie
|
||||
sku: Artikelnummer
|
||||
on_hand: "Verfügbar"
|
||||
on_demand: "Unbegrenzt/auf Bestellung"
|
||||
tax_category: "Steuerkategorie"
|
||||
inherits_properties: "Übernimmt Eigenschaften des Ladens?"
|
||||
available_on: "Verfügbar am"
|
||||
import_date: "Importdatum"
|
||||
adjustments:
|
||||
skipped_changing_canceled_order: "Eine stornierte Bestellung kann nicht geändert werden."
|
||||
begins_at: Beginnt
|
||||
@@ -511,7 +531,6 @@ de_DE:
|
||||
title: "Rechnungseinstellungen"
|
||||
enable_invoices?: "Rechnungen aktivieren?"
|
||||
invoice_style2?: "Verwenden Sie die Rechnungsvorlage mit Aufschlüsselung verschiedener Steuersätze pro Artikel (empfohlen in der EU, noch nicht für Länder mit Preisen ohne Steuern geeignet)."
|
||||
enable_receipt_printing?: "Optionen zum Drucken von Belegen mit Thermodruckern in der Dropdown-Liste anzeigen?"
|
||||
enterprise_number_required_on_invoices?: "Umsatzsteueridentifikationsnummer (USt-IdNr.) erforderlich um Rechnungen zu erstellen?"
|
||||
stripe_connect_settings:
|
||||
edit:
|
||||
@@ -594,7 +613,7 @@ de_DE:
|
||||
form_users:
|
||||
users: "Benutzer"
|
||||
form_about:
|
||||
about: "Verkaufen"
|
||||
about: "Über uns"
|
||||
form_images:
|
||||
images: "Bilder"
|
||||
form_address:
|
||||
@@ -646,13 +665,14 @@ de_DE:
|
||||
model:
|
||||
no_file: "Fehler: Es wurde keine Datei hochgeladen."
|
||||
could_not_process: "Die Datei konnte nicht verarbeitet werden: Ungültiges Datenformat."
|
||||
incorrect_value: Der eingetragene Wert ist fehlerhaft.
|
||||
conditional_blank: Darf nicht leer sein, wenn das Feld 'unit_type' leer ist.
|
||||
no_product: Es konnten keine passenden Produkte in der Datenbank gefunden werden.
|
||||
not_found: Konnte nicht in der Datenbank gefunden werden.
|
||||
incorrect_value: enthält einen fehlerhaften Wert.
|
||||
conditional_blank: darf nicht leer sein, wenn das Feld 'unit_type' leer ist.
|
||||
no_product: entspricht keinem passenden Produkt in der Datenbank.
|
||||
not_found: konnte nicht in der Datenbank gefunden werden.
|
||||
category_not_found: stimmt nicht mit den verfügbaren Kategorien überein. Diese finden Sie auf der Seite zum Produktimport. Überprüfen Sie zusätzlich Ihre Angaben auf Tippfehler.
|
||||
not_updatable: Kann über den Produktimport nicht auf bestehende Produkte aktualisiert werden.
|
||||
blank: darf nicht leer sein
|
||||
not_updatable: kann über den Produktimport nicht für bestehende Produkte aktualisiert werden.
|
||||
values_must_be_same: muss für gleichnamige Produkte gleich sein.
|
||||
blank: darf nicht leer sein.
|
||||
products_no_permission: Sie sind nicht berechtigt, Produkte dieses Unternehmens zu verwalten.
|
||||
inventory_no_permission: Sie sind nicht berechtigt, für diesen Produzenten Produkte in den Katalog aufzunehmen.
|
||||
none_saved: Es konnten keine Produkte erfolgreich gespeichert werden.
|
||||
@@ -694,8 +714,8 @@ de_DE:
|
||||
options_and_defaults: Importoptionen und Voreinstellungen
|
||||
no_permission: Sie sind nicht berechtigt, dieses Unternehmen zu verwalten.
|
||||
not_found: Das Unternehmen konnte nicht in der Datenbank gefunden werden.
|
||||
no_name: Für einige Produkte ist kein Name definiert.
|
||||
blank_enterprise: Für einige Produkte ist kein Unternehmen definiert.
|
||||
no_name: Für einige Produkte ist kein Name angegeben.
|
||||
blank_enterprise: Für einige Produkte ist kein Unternehmen angegeben.
|
||||
reset_absent?: Fehlende Produkte zurücksetzen?
|
||||
reset_absent_tip: Den Lagerbestand für alle nicht in der Datei vorhandenen Produkte auf Null setzen.
|
||||
overwrite_all: Alle überschreiben
|
||||
@@ -817,7 +837,7 @@ de_DE:
|
||||
manage: Verwalten
|
||||
form:
|
||||
about_us:
|
||||
legend: "Verkaufen"
|
||||
legend: "Über uns"
|
||||
desc_short: Kurzbeschreibung
|
||||
desc_short_placeholder: Schreiben Sie etwas in ein oder zwei Sätzen über Ihr Unternehmen.
|
||||
desc_long: Über uns
|
||||
@@ -1261,7 +1281,7 @@ de_DE:
|
||||
address: "Adresse"
|
||||
contact: "Kontaktdaten"
|
||||
social: "Soziale Medien"
|
||||
about: "Verkaufen"
|
||||
about: "Über uns"
|
||||
business_details: "Geschäftsdetails"
|
||||
images: "Bilder"
|
||||
properties: "Eigenschaften"
|
||||
@@ -1276,7 +1296,7 @@ de_DE:
|
||||
enterprise_group:
|
||||
primary_details: "Unternehmen"
|
||||
users: "Benutzer"
|
||||
about: "Verkaufen"
|
||||
about: "Über uns"
|
||||
images: "Bilder"
|
||||
contact: "Kontaktdaten"
|
||||
web: "Homepage"
|
||||
@@ -1295,6 +1315,7 @@ de_DE:
|
||||
total_by_customer: Gesamtsummen nach Kunden
|
||||
total_by_supplier: Gesamtsummen nach Lieferanten
|
||||
supplier_totals: Lieferantengesamtsummen
|
||||
percentage: "%{value} %"
|
||||
supplier_totals_by_distributor: Lieferantengesamtsummen nach Verteilstelle
|
||||
totals_by_supplier: Verteilstellengesamtsummen nach Lieferanten
|
||||
customer_totals: Kundengesamtsummen
|
||||
@@ -1305,6 +1326,7 @@ de_DE:
|
||||
addresses: Adressen
|
||||
payment_methods: Zahlungsarten
|
||||
delivery: Lieferungen
|
||||
sales_tax_totals_by_producer: Umsatzsteuer nach Produzenten
|
||||
tax_types: Steuerarten
|
||||
tax_rates: Steuersätze
|
||||
pack_by_customer: Packliste nach Kunden
|
||||
@@ -1484,6 +1506,9 @@ de_DE:
|
||||
stripe_connect_fail: Die Verbindung Ihres Stripe-Kontos ist fehlgeschlagen.
|
||||
stripe_connect_settings:
|
||||
resource: Konfiguration für Stripe Connect
|
||||
resend_confirmation_emails_feedback:
|
||||
one: "Bestätigungs-E-Mail für 1 Bestellung gesendet."
|
||||
other: "E-Mail-Bestätigung wurde für %{count} Bestellungen gesendet."
|
||||
api:
|
||||
unknown_error: "Etwas ist schief gelaufen. Unser Team wurde benachrichtigt."
|
||||
invalid_api_key: "Ungültiger API-Schlüssel (%{key}) angegeben."
|
||||
@@ -1596,10 +1621,6 @@ de_DE:
|
||||
invoice_issued_on: "Rechnungsdatum:"
|
||||
order_number: "Rechnungsnummer:"
|
||||
date_of_transaction: "Bestelldatum:"
|
||||
ticket_column_qty: "Menge"
|
||||
ticket_column_item: "Artikel"
|
||||
ticket_column_unit_price: "Stückpreis"
|
||||
ticket_column_total_price: "Gesamtpreis"
|
||||
menu_1_title: "Einkaufen"
|
||||
menu_1_url: "/shops"
|
||||
menu_2_title: "Karte"
|
||||
@@ -1649,7 +1670,7 @@ de_DE:
|
||||
use_geocoder: Breiten- und Längengrad automatisch aus der Adresse bestimmen
|
||||
postcode: Postleitzahl
|
||||
postcode_placeholder: z. B. 30701
|
||||
suburb: Vorort
|
||||
suburb: Ort
|
||||
state: Bundesland
|
||||
country: Land
|
||||
unauthorized: Nicht autorisiert
|
||||
@@ -1706,12 +1727,6 @@ de_DE:
|
||||
card_has_been_removed: "Ihre Kreditkarte wurde entfernt (Nummer: %{number})."
|
||||
card_could_not_be_removed: Die Kreditkarte konnte nicht entfernt werden.
|
||||
invalid_credit_card: "Ungültige Kreditkarte"
|
||||
ie_warning_headline: "Ihr Browser ist veraltet. :-("
|
||||
ie_warning_text: "Für das beste Open-Food-Network-Erlebnis empfehlen wir dringend, Ihren Browser zu aktualisieren:"
|
||||
ie_warning_chrome: Chrome herunterladen
|
||||
ie_warning_firefox: Firefox herunterladen
|
||||
ie_warning_ie: Internet Explorer aktualisieren
|
||||
ie_warning_other: "Können Sie Ihren Browser nicht aktualisieren? Versuchen Sie Open Food Network auf Ihrem Smartphone! :-)"
|
||||
legal:
|
||||
cookies_policy:
|
||||
header: "Wie wir Cookies verwenden"
|
||||
@@ -1798,12 +1813,13 @@ de_DE:
|
||||
split_checkout:
|
||||
your_details_without_number: Ihre Daten
|
||||
payment_method_without_number: Zahlungsart
|
||||
order_summary_without_number: Bestellübersicht
|
||||
order_summary_without_number: Bestellabschluss
|
||||
already_ordered:
|
||||
cart: "im Warenkorb"
|
||||
message_html: "Sie haben bereits eine Bestellung für diesen Bestellzyklus. Überprüfen Sie den %{cart}, um die Artikel zu sehen, die Sie zuvor bestellt haben. Sie können Artikel auch stornieren, solange der Bestellzyklus geöffnet ist."
|
||||
step1:
|
||||
contact_information:
|
||||
title: Kontaktdaten
|
||||
email:
|
||||
label: E-Mail-Adresse
|
||||
phone:
|
||||
@@ -1850,17 +1866,20 @@ de_DE:
|
||||
save_card: Kreditkarte für zukünftige Verwendung speichern
|
||||
create_new_card: oder geben Sie unten neue Kreditkartendetails ein
|
||||
explaination: Sie können Ihre Bestellung im nächsten Schritt überprüfen und die endgültigen Kosten bestätigen.
|
||||
submit: Weiter - Bestellübersicht
|
||||
submit: Weiter - Bestellabschluss
|
||||
cancel: Zurück - Ihre Daten
|
||||
step3:
|
||||
delivery_details:
|
||||
title: Lieferdetails
|
||||
edit: Bearbeiten
|
||||
address: Liefer-/Abholinformationen
|
||||
instructions: Informationen
|
||||
payment_method:
|
||||
title: Zahlungsart
|
||||
edit: Bearbeiten
|
||||
instructions: Informationen
|
||||
order:
|
||||
title: Bestellübersicht
|
||||
edit: Bearbeiten
|
||||
terms_and_conditions:
|
||||
message_html: "Ich stimme den %{terms_and_conditions_link} des Verkäufers zu."
|
||||
@@ -1873,6 +1892,7 @@ de_DE:
|
||||
submit: Zahlungspflichtig bestellen
|
||||
cancel: Zurück - Zahlungsart
|
||||
errors:
|
||||
saving_failed: "Speichern fehlgeschlagen. Bitte prüfen Sie die markierten Felder. %{messages}"
|
||||
terms_not_accepted: Bitte akzeptieren Sie die Allgemeinen Geschäftsbedingungen.
|
||||
required: Feld darf nicht leer sein.
|
||||
invalid_number: "Bitte geben Sie eine gültige Telefonnummer ein."
|
||||
@@ -2573,6 +2593,7 @@ de_DE:
|
||||
report_customers_cycle: "Bestellzyklus"
|
||||
report_customers_type: "Berichtsart"
|
||||
report_customers_csv: "Als csv-Datei herunterladen"
|
||||
report_customers: Kunde
|
||||
report_producers: "Unsere Produzenten"
|
||||
report_type: "Berichtsart"
|
||||
report_hubs: "Hubs"
|
||||
@@ -2650,8 +2671,12 @@ de_DE:
|
||||
report_header_taxable_items_total: "Steuerpflichtige Posten insgesamt (%{currency_symbol})"
|
||||
report_header_sales_tax: "Umsatzsteuer (%{currency_symbol})"
|
||||
report_header_delivery_charge: "Liefergebühr (%{currency_symbol})"
|
||||
report_header_tax: "Steuern"
|
||||
report_header_tax_on_delivery: "Steuer auf Lieferkosten (%{currency_symbol})"
|
||||
report_header_tax_on_fees: "Steuer auf Gebühren (%{currency_symbol})"
|
||||
report_header_tax_category: "Steuerkategorie"
|
||||
report_header_tax_rate_name: "Steuersatzname"
|
||||
report_header_tax_rate: "Steuersatz"
|
||||
report_header_total_tax: "Summe Steuern (%{currency_symbol})"
|
||||
report_header_total_excl_tax: "Summe exkl. Steuern (%{currency_symbol})"
|
||||
report_header_total_incl_tax: "Summe inkl. Steuern (%{currency_symbol})"
|
||||
@@ -2661,6 +2686,7 @@ de_DE:
|
||||
report_header_customer_code: Kundennummer
|
||||
report_header_product: Produkt
|
||||
report_header_product_properties: Produkteigenschaften
|
||||
report_header_product_tax_category: Steuerkategorie
|
||||
report_header_quantity: Menge
|
||||
report_header_max_quantity: Max Menge
|
||||
report_header_variant: Produktvariante
|
||||
@@ -2673,6 +2699,8 @@ de_DE:
|
||||
report_header_supplier: Lieferant
|
||||
report_header_producer: Produzent
|
||||
report_header_producer_suburb: Produzentenort
|
||||
report_header_producer_tax_status: Produzent berechnet Steuern
|
||||
report_header_producer_charges_sales_tax?: Berechnet Steuern
|
||||
report_header_unit: Einheit
|
||||
report_header_group_buy_unit_quantity: Gruppenkauf Einheitsmenge
|
||||
report_header_cost: Summe
|
||||
@@ -2688,10 +2716,12 @@ de_DE:
|
||||
report_header_distributor_address: Verteilstellenadresse
|
||||
report_header_distributor_city: Verteilstellen-Stadt
|
||||
report_header_distributor_postcode: Verteilstellen-Postleitzahl
|
||||
report_header_distributor_tax_status: Verteilstelle berechnet Steuern
|
||||
report_header_delivery_address: Lieferadresse
|
||||
report_header_delivery_postcode: Lieferpostleitzahl
|
||||
report_header_bulk_unit_size: Gruppenkauf-Einheit
|
||||
report_header_weight: Gewicht
|
||||
report_header_final_weight_volume: Tatsächliche Menge
|
||||
report_header_height: Höhe
|
||||
report_header_width: Breite
|
||||
report_header_depth: Tiefe
|
||||
@@ -2868,6 +2898,7 @@ de_DE:
|
||||
deleting_item_will_cancel_order: "Das Löschen dieses Produkts führt zu einer oder mehreren leeren Bestellungen, die daher automatisch storniert werden. Möchten Sie fortfahren?"
|
||||
modals:
|
||||
got_it: "Verstanden"
|
||||
confirm: "Bestätigen"
|
||||
close: "Schließen"
|
||||
continue: "Weiter"
|
||||
cancel: "Stornieren"
|
||||
@@ -3398,6 +3429,8 @@ de_DE:
|
||||
server_error: "Serverfehler"
|
||||
shipping_method_names:
|
||||
UPS Ground: "UPS Ground"
|
||||
pick_up: "Abholung"
|
||||
delivery: "Lieferung"
|
||||
start_date: "Anfangsdatum"
|
||||
successfully_removed: "Erfolgreich gelöscht"
|
||||
taxonomy_edit: "Kategorien bearbeiten"
|
||||
@@ -3474,9 +3507,6 @@ de_DE:
|
||||
default_seo_title: "Standard SEO-Titel"
|
||||
default_meta_description: "Standard Meta-Beschreibung"
|
||||
default_meta_keywords: "Standard Meta-Schlüsselwörter"
|
||||
security_settings: "Sicherheitseinstellungen"
|
||||
allow_ssl_in_production: "Zulassen, dass SSL im Produktionsmodus verwendet wird"
|
||||
allow_ssl_in_staging: "Zulassen, dass SSL im Staging-Modus verwendet wird"
|
||||
currency_decimal_mark: "Dezimalzeichen der Währung"
|
||||
currency_settings: "Währungseinstellungen"
|
||||
currency_symbol_position: Währungssymbol (€) vor oder nach dem Betrag?
|
||||
@@ -3485,6 +3515,7 @@ de_DE:
|
||||
display_currency: "Währung anzeigen"
|
||||
choose_currency: "Währung auswählen"
|
||||
mail_method_settings: "E-Mail-Methodeneinstellungen"
|
||||
mail_settings_notice_html: "<b>Hier vorgenommene Änderungen sind nur vorübergehend</b> zum Debuggen und können in Zukunft rückgängig gemacht werden.<br> Dauerhafte Änderungen können vorgenommen werden, indem die Daten der Instanz aktualisiert und mithilfe von <a href='https://github.com/openfoodfoundation/ofn-install'>ofn-install bereitgestellt</a> werden. Wenden Sie sich für weitere Einzelheiten an das globale OFN-Team."
|
||||
general: "Allgemeines"
|
||||
enable_mail_delivery: "E-Mail-Versand aktivieren"
|
||||
send_mails_as: "E-Mails senden als"
|
||||
@@ -3574,7 +3605,7 @@ de_DE:
|
||||
zipcode: Postleitzahl
|
||||
weight: Gewicht (pro kg oder lb)
|
||||
error_user_destroy_with_orders: "Benutzer mit abgeschlossenen Bestellungen dürfen nicht gelöscht werden."
|
||||
cannot_create_payment_without_payment_methods: "Sie können keine Zahlung für eine Bestellung erstellen, ohne dass Zahlungsarten definiert sind."
|
||||
cannot_create_payment_without_payment_methods: "Sie können keine Zahlung für eine Bestellung erstellen, wenn keine Zahlungsarten angelegt sind."
|
||||
please_define_payment_methods: "Bitte definieren Sie zunächst die Zahlungsarten."
|
||||
options: "Optionen"
|
||||
has_no_shipped_units: "hat keine gelieferten Einheiten"
|
||||
@@ -3607,6 +3638,7 @@ de_DE:
|
||||
messages:
|
||||
included_price_validation: "kann nur ausgewählt werden, wenn Sie eine Standardsteuerzone festgelegt haben"
|
||||
blank: "darf nicht leer sein"
|
||||
invalid_instagram_url: "darf nur den Benutzernamen enthalten, z. B. the_prof"
|
||||
layouts:
|
||||
admin:
|
||||
login_nav:
|
||||
@@ -3690,6 +3722,10 @@ de_DE:
|
||||
authorized: "autorisiert"
|
||||
received: "empfangen"
|
||||
canceled: "storniert"
|
||||
line_items:
|
||||
index:
|
||||
results_found: "%{number} Ergebnisse gefunden."
|
||||
viewing: "Angezeigt wird %{start} bis %{end}."
|
||||
orders:
|
||||
add_product:
|
||||
cannot_add_item_to_canceled_order: "Einer stornierten Bestellung können keine Produkte hinzugefügt werden. "
|
||||
@@ -3713,6 +3749,7 @@ de_DE:
|
||||
print_invoices: "Rechnungen drucken"
|
||||
cancel_orders: "Bestellungen stornieren"
|
||||
resend_confirmation: "Bestätigung erneut senden"
|
||||
resend_confirmation_confirm_html: "Sind Sie sicher, dass Sie die E-Mail-Bestätigungen erneut senden wollen?"
|
||||
selected:
|
||||
zero: "Keine Bestellung ausgewählt"
|
||||
one: "1 Bestellung ausgewählt"
|
||||
@@ -3861,6 +3898,7 @@ de_DE:
|
||||
title: "Neues Produkt"
|
||||
new_product: "Neues Produkt"
|
||||
supplier: "Lieferant"
|
||||
supplier_select_placeholder: "Lieferant wählen"
|
||||
product_name: "Produktname"
|
||||
units: "Einheit"
|
||||
value: "Menge"
|
||||
@@ -3906,6 +3944,9 @@ de_DE:
|
||||
select_and_search: "Treffen Sie Ihre Auswahl und klicken Sie auf %{option}, um den Bericht zu erstellen."
|
||||
customer_names_message:
|
||||
customer_names_tip: "Wenn Kundennamen für von Ihnen gelieferte Bestellungen ausgeblendet sind, können Sie sich an den Händler wenden und ihn bitten, seine Ladeneinstellungen anzupassen, damit seine Lieferanten Kundennamen anzeigen können."
|
||||
products_and_inventory:
|
||||
all_products:
|
||||
message: "Beachten Sie, dass die gemeldeten Lagerbestände nur aus den Produktlisten der Lieferanten stammen. Wenn Sie den Katalog verwenden, um Ihre Lagerbestand zu verwalten, werden diese Werte in diesem Bericht ignoriert."
|
||||
users:
|
||||
index:
|
||||
listing_users: "Benutzer verwalten"
|
||||
@@ -4254,6 +4295,7 @@ de_DE:
|
||||
search_input:
|
||||
placeholder: Suche
|
||||
selector_with_filter:
|
||||
selected_items: "%{count} ausgewählt"
|
||||
search_placeholder: Suche
|
||||
pagination:
|
||||
next: Nächste
|
||||
|
||||
@@ -27,14 +27,22 @@ en:
|
||||
spree/shipping_method: Shipping Method
|
||||
attributes:
|
||||
spree/order/ship_address:
|
||||
address1: "Shipping address line 1"
|
||||
address1: "Shipping address (Street + House number)"
|
||||
address2: "Shipping address line 2"
|
||||
city: "Shipping address suburb 1"
|
||||
city: "Shipping address city"
|
||||
country: "Shipping address country"
|
||||
phone: "Phone number"
|
||||
firstname: "First name"
|
||||
lastname: "Last name"
|
||||
zipcode: "Shipping address postcode"
|
||||
spree/order/bill_address:
|
||||
address1: "Billing address (Street + House number)"
|
||||
zipcode: "Billing address postcode"
|
||||
city: "Billing address city"
|
||||
country: "Billing address country"
|
||||
firstname: "Billing address first name"
|
||||
lastname: "Billing address last name"
|
||||
phone: Customer phone
|
||||
spree/user:
|
||||
password: "Password"
|
||||
password_confirmation: "Password confirmation"
|
||||
@@ -484,11 +492,25 @@ en:
|
||||
price: Price
|
||||
producer: Producer
|
||||
category: Category
|
||||
sku: SKU
|
||||
on_hand: "On Hand"
|
||||
on_demand: "On Demand"
|
||||
tax_category: "Tax Category"
|
||||
inherits_properties: "Inherits Properties?"
|
||||
available_on: "Available On"
|
||||
import_date: "Import Date"
|
||||
columns_selector:
|
||||
unit: Unit
|
||||
price: Price
|
||||
producer: Producer
|
||||
category: Category
|
||||
sku: SKU
|
||||
on_hand: "On Hand"
|
||||
on_demand: "On Demand"
|
||||
tax_category: "Tax Category"
|
||||
inherits_properties: "Inherits Properties?"
|
||||
available_on: "Available On"
|
||||
import_date: "Import Date"
|
||||
adjustments:
|
||||
skipped_changing_canceled_order: "You can't change a cancelled order."
|
||||
# Common properties / models
|
||||
@@ -590,7 +612,6 @@ en:
|
||||
title: "Invoice Settings"
|
||||
enable_invoices?: "Enable Invoices?"
|
||||
invoice_style2?: "Use the alternative invoice model that includes total tax breakdown per rate and tax rate info per item (not yet suitable for countries displaying prices excluding tax)"
|
||||
enable_receipt_printing?: "Show options for printing receipts using thermal printers in order dropdown?"
|
||||
enterprise_number_required_on_invoices?: "Require an ABN to generate an invoice?"
|
||||
|
||||
stripe_connect_settings:
|
||||
@@ -1382,6 +1403,7 @@ en:
|
||||
total_by_customer: Total By Customer
|
||||
total_by_supplier: Total By Supplier
|
||||
supplier_totals: Order Cycle Supplier Totals
|
||||
percentage: "%{value} %"
|
||||
supplier_totals_by_distributor: Order Cycle Supplier Totals by Distributor
|
||||
totals_by_supplier: Order Cycle Distributor Totals by Supplier
|
||||
customer_totals: Order Cycle Customer Totals
|
||||
@@ -1392,6 +1414,8 @@ en:
|
||||
addresses: Addresses
|
||||
payment_methods: Payment Methods Report
|
||||
delivery: Delivery Report
|
||||
sales_tax_totals_by_producer: Sales Tax Totals By Producer
|
||||
sales_tax_totals_by_order: Sales Tax Totals By Order
|
||||
tax_types: Tax Types
|
||||
tax_rates: Tax Rates
|
||||
pack_by_customer: Pack By Customer
|
||||
@@ -1704,11 +1728,6 @@ en:
|
||||
order_number: "Invoice number:"
|
||||
date_of_transaction: "Date of transaction:"
|
||||
|
||||
ticket_column_qty: "Qty"
|
||||
ticket_column_item: "Item"
|
||||
ticket_column_unit_price: "Unit Price"
|
||||
ticket_column_total_price: "Total Price"
|
||||
|
||||
menu_1_title: "Shops"
|
||||
menu_1_url: "/shops"
|
||||
menu_2_title: "Map"
|
||||
@@ -2740,6 +2759,7 @@ See the %{link} to find out more about %{sitename}'s features and to start using
|
||||
report_customers_cycle: "Order Cycle"
|
||||
report_customers_type: "Report Type"
|
||||
report_customers_csv: "Download as csv"
|
||||
report_customers: Customer
|
||||
report_producers: "Producers"
|
||||
report_type: "Report Type"
|
||||
report_hubs: "Hubs"
|
||||
@@ -2818,8 +2838,12 @@ See the %{link} to find out more about %{sitename}'s features and to start using
|
||||
report_header_taxable_items_total: "Taxable Items Total (%{currency_symbol})"
|
||||
report_header_sales_tax: "Sales Tax (%{currency_symbol})"
|
||||
report_header_delivery_charge: "Delivery Charge (%{currency_symbol})"
|
||||
report_header_tax: "Tax"
|
||||
report_header_tax_on_delivery: "Tax on Delivery (%{currency_symbol})"
|
||||
report_header_tax_on_fees: "Tax on Fees (%{currency_symbol})"
|
||||
report_header_tax_category: "Tax Category"
|
||||
report_header_tax_rate_name: "Tax Rate Name"
|
||||
report_header_tax_rate: "Tax Rate"
|
||||
report_header_total_tax: "Total Tax (%{currency_symbol})"
|
||||
report_header_total_excl_tax: "Total excl. tax (%{currency_symbol})"
|
||||
report_header_total_incl_tax: "Total incl. tax (%{currency_symbol})"
|
||||
@@ -2842,6 +2866,7 @@ See the %{link} to find out more about %{sitename}'s features and to start using
|
||||
report_header_supplier: Supplier
|
||||
report_header_producer: Producer
|
||||
report_header_producer_suburb: Producer Suburb
|
||||
report_header_producer_tax_status: Producer Tax Status
|
||||
report_header_producer_charges_sales_tax?: GST/VAT Registered
|
||||
report_header_unit: Unit
|
||||
report_header_group_buy_unit_quantity: Group Buy Unit Quantity
|
||||
@@ -2858,6 +2883,7 @@ See the %{link} to find out more about %{sitename}'s features and to start using
|
||||
report_header_distributor_address: Distributor address
|
||||
report_header_distributor_city: Distributor city
|
||||
report_header_distributor_postcode: Distributor postcode
|
||||
report_header_distributor_tax_status: Distributor Tax Status
|
||||
report_header_delivery_address: Delivery Address
|
||||
report_header_delivery_postcode: Delivery Postcode
|
||||
report_header_bulk_unit_size: Bulk Unit Size
|
||||
@@ -3227,6 +3253,9 @@ See the %{link} to find out more about %{sitename}'s features and to start using
|
||||
cancel_the_order_send_cancelation_email: "Send a cancellation email to the customer"
|
||||
restock_item: "Restock Items: return this item to stock"
|
||||
restock_items: "Restock Items: return all items to stock"
|
||||
delete_line_items_html:
|
||||
one: "This will delete one line item from the order.<br />Are you sure you want to proceed?"
|
||||
other: "This will delete %{count} line items from the order.<br />Are you sure you want to proceed?"
|
||||
resend_user_email_confirmation:
|
||||
resend: "Resend"
|
||||
sending: "Resend..."
|
||||
@@ -3656,9 +3685,6 @@ See the %{link} to find out more about %{sitename}'s features and to start using
|
||||
default_seo_title: "Default Seo Title"
|
||||
default_meta_description: "Default Meta Description"
|
||||
default_meta_keywords: "Default Meta Keywords"
|
||||
security_settings: "Security Settings"
|
||||
allow_ssl_in_production: "Allow SSL to be used in production mode"
|
||||
allow_ssl_in_staging: "Allow SSL to be used in staging mode"
|
||||
currency_decimal_mark: "Currency decimal mark"
|
||||
currency_settings: "Currency Settings"
|
||||
currency_symbol_position: Put "currency symbol before or after dollar amount?"
|
||||
@@ -3891,6 +3917,10 @@ See the %{link} to find out more about %{sitename}'s features and to start using
|
||||
authorized: "Authorized"
|
||||
received: "Received"
|
||||
canceled: "Canceled"
|
||||
line_items:
|
||||
index:
|
||||
results_found: "%{number} Results found."
|
||||
viewing: "Viewing %{start} to %{end}."
|
||||
orders:
|
||||
add_product:
|
||||
cannot_add_item_to_canceled_order: "Cannot add item to canceled order"
|
||||
|
||||
@@ -313,11 +313,25 @@ en_AU:
|
||||
price: Price
|
||||
producer: Producer
|
||||
category: Category
|
||||
sku: SKU
|
||||
on_hand: "On Hand"
|
||||
on_demand: "On Demand"
|
||||
tax_category: "Tax Category"
|
||||
inherits_properties: "Inherits Properties?"
|
||||
available_on: "Available On"
|
||||
import_date: "Import Date"
|
||||
columns_selector:
|
||||
unit: Unit
|
||||
price: Price
|
||||
producer: Producer
|
||||
category: Category
|
||||
sku: SKU
|
||||
on_hand: "On Hand"
|
||||
on_demand: "On Demand"
|
||||
tax_category: "Tax Category"
|
||||
inherits_properties: "Inherits Properties?"
|
||||
available_on: "Available On"
|
||||
import_date: "Import Date"
|
||||
begins_at: Begins At
|
||||
begins_on: Begins On
|
||||
customer: Customer
|
||||
@@ -390,7 +404,6 @@ en_AU:
|
||||
title: "Invoice Settings"
|
||||
enable_invoices?: "Enable Invoices?"
|
||||
invoice_style2?: "Use the alternative invoice model that includes total tax breakdown per rate and tax rate info per item (not yet suitable for countries displaying prices excluding tax)"
|
||||
enable_receipt_printing?: "Show options for printing receipts using thermal printers in order dropdown?"
|
||||
stripe_connect_settings:
|
||||
edit:
|
||||
title: "Stripe Connect"
|
||||
@@ -1399,10 +1412,6 @@ en_AU:
|
||||
invoice_issued_on: "Invoice issued on:"
|
||||
order_number: "Invoice number:"
|
||||
date_of_transaction: "Date of transaction:"
|
||||
ticket_column_qty: "Qty"
|
||||
ticket_column_item: "Item"
|
||||
ticket_column_unit_price: "Unit Price"
|
||||
ticket_column_total_price: "Total Price"
|
||||
menu_1_title: "Shops"
|
||||
menu_1_url: "/shops"
|
||||
menu_2_title: "Map"
|
||||
@@ -1503,12 +1512,6 @@ en_AU:
|
||||
card_has_been_removed: "Your card has been removed (number: %{number})"
|
||||
card_could_not_be_removed: Sorry, the card could not be removed
|
||||
invalid_credit_card: "Invalid credit card"
|
||||
ie_warning_headline: "Your browser is out of date :-("
|
||||
ie_warning_text: "For the best Open Food Network experience, we strongly recommend upgrading your browser:"
|
||||
ie_warning_chrome: Download Chrome
|
||||
ie_warning_firefox: Download Firefox
|
||||
ie_warning_ie: Upgrade Internet Explorer
|
||||
ie_warning_other: "Can't upgrade your browser? Try Open Food Network on your smartphone :-)"
|
||||
legal:
|
||||
cookies_policy:
|
||||
header: "How We Use Cookies"
|
||||
@@ -2316,6 +2319,7 @@ en_AU:
|
||||
report_customers_cycle: "Order Cycle"
|
||||
report_customers_type: "Report Type"
|
||||
report_customers_csv: "Download as csv"
|
||||
report_customers: Customer
|
||||
report_producers: "Producers"
|
||||
report_type: "Report Type"
|
||||
report_hubs: "Hubs"
|
||||
@@ -2379,6 +2383,7 @@ en_AU:
|
||||
report_header_delivery_charge: "Delivery Charge (%{currency_symbol})"
|
||||
report_header_tax_on_delivery: "Tax on Delivery (%{currency_symbol})"
|
||||
report_header_tax_on_fees: "Tax on Fees (%{currency_symbol})"
|
||||
report_header_tax_category: "Tax Category"
|
||||
report_header_total_tax: "Total Tax (%{currency_symbol})"
|
||||
report_header_total_excl_tax: "Total excl. tax (%{currency_symbol})"
|
||||
report_header_total_incl_tax: "Total incl. tax (%{currency_symbol})"
|
||||
@@ -3122,9 +3127,6 @@ en_AU:
|
||||
default_seo_title: "Default Seo Title"
|
||||
default_meta_description: "Default Meta Description"
|
||||
default_meta_keywords: "Default Meta Keywords"
|
||||
security_settings: "Security Settings"
|
||||
allow_ssl_in_production: "Allow SSL to be used in production mode"
|
||||
allow_ssl_in_staging: "Allow SSL to be used in staging mode"
|
||||
currency_decimal_mark: "Currency decimal mark"
|
||||
currency_settings: "Currency Settings"
|
||||
currency_symbol_position: Put "currency symbol before or after dollar amount?"
|
||||
@@ -3327,6 +3329,10 @@ en_AU:
|
||||
authorized: "Authorized"
|
||||
received: "Received"
|
||||
canceled: "Canceled"
|
||||
line_items:
|
||||
index:
|
||||
results_found: "%{number} Results found."
|
||||
viewing: "Viewing %{start} to %{end}."
|
||||
orders:
|
||||
index:
|
||||
listing_orders: "Listing Orders"
|
||||
|
||||
@@ -287,11 +287,25 @@ en_BE:
|
||||
price: Price
|
||||
producer: Producer
|
||||
category: Category
|
||||
sku: SKU
|
||||
on_hand: "On Hand"
|
||||
on_demand: "On Demand"
|
||||
tax_category: "Tax Category"
|
||||
inherits_properties: "Inherits Properties?"
|
||||
available_on: "Available On"
|
||||
import_date: "Import Date"
|
||||
columns_selector:
|
||||
unit: Unit
|
||||
price: Price
|
||||
producer: Producer
|
||||
category: Category
|
||||
sku: SKU
|
||||
on_hand: "On Hand"
|
||||
on_demand: "On Demand"
|
||||
tax_category: "Tax Category"
|
||||
inherits_properties: "Inherits Properties?"
|
||||
available_on: "Available On"
|
||||
import_date: "Import Date"
|
||||
begins_at: Begins At
|
||||
begins_on: Begins On
|
||||
customer: Customer
|
||||
@@ -362,7 +376,6 @@ en_BE:
|
||||
title: "Invoice Settings"
|
||||
enable_invoices?: "Enable Invoices?"
|
||||
invoice_style2?: "Use the alternative invoice model that includes total tax breakdown per rate and tax rate info per item (not yet suitable for countries displaying prices excluding tax)"
|
||||
enable_receipt_printing?: "Show options for printing receipts using thermal printers in order dropdown?"
|
||||
stripe_connect_settings:
|
||||
edit:
|
||||
title: "Stripe Connect"
|
||||
@@ -1294,10 +1307,6 @@ en_BE:
|
||||
invoice_issued_on: "Invoice issued on:"
|
||||
order_number: "Invoice number:"
|
||||
date_of_transaction: "Date of transaction:"
|
||||
ticket_column_qty: "Qty"
|
||||
ticket_column_item: "Item"
|
||||
ticket_column_unit_price: "Unit Price"
|
||||
ticket_column_total_price: "Total Price"
|
||||
menu_1_title: "Shops"
|
||||
menu_1_url: "/shops"
|
||||
menu_2_title: "Map"
|
||||
@@ -1397,12 +1406,6 @@ en_BE:
|
||||
saving_credit_card: Saving credit card...
|
||||
card_has_been_removed: "Your card has been removed (number: %{number})"
|
||||
card_could_not_be_removed: Sorry, the card could not be removed
|
||||
ie_warning_headline: "Your browser is out of date :-("
|
||||
ie_warning_text: "For the best Open Food Network experience, we strongly recommend upgrading your browser:"
|
||||
ie_warning_chrome: Download Chrome
|
||||
ie_warning_firefox: Download Firefox
|
||||
ie_warning_ie: Upgrade Internet Explorer
|
||||
ie_warning_other: "Can't upgrade your browser? Try Open Food Network on your smartphone :-)"
|
||||
legal:
|
||||
cookies_policy:
|
||||
header: "How We Use Cookies"
|
||||
@@ -2181,6 +2184,7 @@ en_BE:
|
||||
report_customers_cycle: "Order Cycle"
|
||||
report_customers_type: "Report Type"
|
||||
report_customers_csv: "Download as csv"
|
||||
report_customers: Customer
|
||||
report_producers: "Producers"
|
||||
report_type: "Report Type"
|
||||
report_hubs: "Hubs"
|
||||
@@ -2244,6 +2248,8 @@ en_BE:
|
||||
report_header_delivery_charge: "Delivery Charge (%{currency_symbol})"
|
||||
report_header_tax_on_delivery: "Tax on Delivery (%{currency_symbol})"
|
||||
report_header_tax_on_fees: "Tax on Fees (%{currency_symbol})"
|
||||
report_header_tax_category: "Tax Category"
|
||||
report_header_tax_rate: "Tax Rate"
|
||||
report_header_total_tax: "Total Tax (%{currency_symbol})"
|
||||
report_header_total_excl_tax: "Total excl. tax (%{currency_symbol})"
|
||||
report_header_total_incl_tax: "Total incl. tax (%{currency_symbol})"
|
||||
@@ -2862,9 +2868,6 @@ en_BE:
|
||||
default_seo_title: "Default Seo Title"
|
||||
default_meta_description: "Default Meta Description"
|
||||
default_meta_keywords: "Default Meta Keywords"
|
||||
security_settings: "Security Settings"
|
||||
allow_ssl_in_production: "Allow SSL to be used in production mode"
|
||||
allow_ssl_in_staging: "Allow SSL to be used in staging mode"
|
||||
currency_decimal_mark: "Currency decimal mark"
|
||||
currency_settings: "Currency Settings"
|
||||
currency_symbol_position: Put "currency symbol before or after euros amount?"
|
||||
@@ -3016,6 +3019,10 @@ en_BE:
|
||||
form:
|
||||
product: "Product"
|
||||
amount: "Amount"
|
||||
line_items:
|
||||
index:
|
||||
results_found: "%{number} Results found."
|
||||
viewing: "Viewing %{start} to %{end}."
|
||||
orders:
|
||||
index:
|
||||
listing_orders: "Listing Orders"
|
||||
|
||||
@@ -6,9 +6,7 @@ en_CA:
|
||||
spree/shipping_method: Shipping/Pick-up Method
|
||||
attributes:
|
||||
spree/order/ship_address:
|
||||
address1: "Shipping address line 1"
|
||||
address2: "Shipping address line 2"
|
||||
city: "Shipping address line 3"
|
||||
country: "Shipping address country"
|
||||
phone: "Phone number"
|
||||
firstname: "First name"
|
||||
@@ -425,11 +423,25 @@ en_CA:
|
||||
price: Price
|
||||
producer: Producer
|
||||
category: Category
|
||||
sku: SKU
|
||||
on_hand: "On Hand"
|
||||
on_demand: "On Demand"
|
||||
tax_category: "Tax Category"
|
||||
inherits_properties: "Inherits Properties?"
|
||||
available_on: "Available"
|
||||
import_date: "Import Date"
|
||||
columns_selector:
|
||||
unit: Unit
|
||||
price: Price
|
||||
producer: Producer
|
||||
category: Category
|
||||
sku: SKU
|
||||
on_hand: "On Hand"
|
||||
on_demand: "On Demand"
|
||||
tax_category: "Tax Category"
|
||||
inherits_properties: "Inherits Properties?"
|
||||
available_on: "Available"
|
||||
import_date: "Import Date"
|
||||
adjustments:
|
||||
skipped_changing_canceled_order: "You can't change a cancelled order."
|
||||
begins_at: Begins At
|
||||
@@ -519,7 +531,6 @@ en_CA:
|
||||
title: "Invoice Settings"
|
||||
enable_invoices?: "Enable Invoices?"
|
||||
invoice_style2?: "Use the alternative invoice model that includes total tax breakdown per rate and tax rate info per item (not yet suitable for countries displaying prices excluding tax)"
|
||||
enable_receipt_printing?: "Show options for printing receipts using thermal printers in order dropdown?"
|
||||
enterprise_number_required_on_invoices?: "Require a business number to generate an invoice?"
|
||||
stripe_connect_settings:
|
||||
edit:
|
||||
@@ -1606,10 +1617,6 @@ en_CA:
|
||||
invoice_issued_on: "Invoice issued on:"
|
||||
order_number: "Invoice number:"
|
||||
date_of_transaction: "Date of transaction:"
|
||||
ticket_column_qty: "Qty"
|
||||
ticket_column_item: "Item"
|
||||
ticket_column_unit_price: "Unit Price"
|
||||
ticket_column_total_price: "Total Price"
|
||||
menu_1_title: "Shops"
|
||||
menu_1_url: "/shops"
|
||||
menu_2_title: "Map"
|
||||
@@ -1716,12 +1723,6 @@ en_CA:
|
||||
card_has_been_removed: "Your card has been removed (number: %{number})"
|
||||
card_could_not_be_removed: Sorry, the card could not be removed
|
||||
invalid_credit_card: "Invalid credit card"
|
||||
ie_warning_headline: "Your browser is out of date :-("
|
||||
ie_warning_text: "For the best Open Food Network experience, we strongly recommend upgrading your browser:"
|
||||
ie_warning_chrome: Download Chrome
|
||||
ie_warning_firefox: Download Firefox
|
||||
ie_warning_ie: Upgrade Internet Explorer
|
||||
ie_warning_other: "Can't upgrade your browser? Try Open Food Network on your smartphone :-)"
|
||||
legal:
|
||||
cookies_policy:
|
||||
header: "How We Use Cookies"
|
||||
@@ -2588,6 +2589,7 @@ en_CA:
|
||||
report_customers_cycle: "Order Cycle"
|
||||
report_customers_type: "Report Type"
|
||||
report_customers_csv: "Download as csv"
|
||||
report_customers: Customer
|
||||
report_producers: "Producers"
|
||||
report_type: "Report Type"
|
||||
report_hubs: "Hubs"
|
||||
@@ -2665,8 +2667,11 @@ en_CA:
|
||||
report_header_taxable_items_total: "Taxable Items Total (%{currency_symbol})"
|
||||
report_header_sales_tax: "Sales Tax (%{currency_symbol})"
|
||||
report_header_delivery_charge: "Delivery Charge (%{currency_symbol})"
|
||||
report_header_tax: "Tax"
|
||||
report_header_tax_on_delivery: "Tax on Delivery (%{currency_symbol})"
|
||||
report_header_tax_on_fees: "Tax on Fees (%{currency_symbol})"
|
||||
report_header_tax_category: "Tax Category"
|
||||
report_header_tax_rate: "Tax Rate"
|
||||
report_header_total_tax: "Total Tax (%{currency_symbol})"
|
||||
report_header_total_excl_tax: "Total excl. tax (%{currency_symbol})"
|
||||
report_header_total_incl_tax: "Total incl. tax (%{currency_symbol})"
|
||||
@@ -3487,9 +3492,6 @@ en_CA:
|
||||
default_seo_title: "Default Seo Title"
|
||||
default_meta_description: "Default Meta Description"
|
||||
default_meta_keywords: "Default Meta Keywords"
|
||||
security_settings: "Security Settings"
|
||||
allow_ssl_in_production: "Allow SSL to be used in production mode"
|
||||
allow_ssl_in_staging: "Allow SSL to be used in staging mode"
|
||||
currency_decimal_mark: "Currency decimal mark"
|
||||
currency_settings: "Currency Settings"
|
||||
currency_symbol_position: Put "currency symbol before or after dollar amount?"
|
||||
@@ -3705,6 +3707,10 @@ en_CA:
|
||||
authorized: "Authorized"
|
||||
received: "Received"
|
||||
canceled: "Canceled"
|
||||
line_items:
|
||||
index:
|
||||
results_found: " %{number} Results found."
|
||||
viewing: "Viewing %{start} to %{end}."
|
||||
orders:
|
||||
add_product:
|
||||
cannot_add_item_to_canceled_order: "You cannot add an item to a cancelled order."
|
||||
|
||||
@@ -35,8 +35,6 @@ en_CH:
|
||||
menu_5_url: "https://www.openfoodswitzerland.ch/"
|
||||
menu_6_url: "https://www.openfoodswitzerland.ch"
|
||||
menu_7_url: "https://www.openfoodswitzerland.ch/"
|
||||
ie_warning_text: "For the best Open Food Switzerland experience, we strongly recommend upgrading your browser:"
|
||||
ie_warning_other: "Can't upgrade your browser? Try Open Food Switzerland on your smartphone :-)"
|
||||
legal:
|
||||
cookies_policy:
|
||||
disabling_cookies_desc: "As a user you can always allow, block or delete Open Food Switzerland’s or any other website cookies whenever you want to through your browser’s setting control. Each browser has a different operative. Here are the links:"
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user