mirror of
https://github.com/openfoodfoundation/openfoodnetwork
synced 2026-02-28 01:53:25 +00:00
Compare commits
271 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
6ad49cc080 | ||
|
|
2a7e8816c0 | ||
|
|
601c921b4b | ||
|
|
39fbf01e98 | ||
|
|
69586ae5ae | ||
|
|
c87eb05c0e | ||
|
|
a1f363c53b | ||
|
|
76c6362db0 | ||
|
|
5c3308de36 | ||
|
|
a82b2c2799 | ||
|
|
4895010fe0 | ||
|
|
962097f237 | ||
|
|
941707a0df | ||
|
|
f7e119d06f | ||
|
|
52ee5929cf | ||
|
|
1e58882217 | ||
|
|
ca23f12451 | ||
|
|
cce37aa915 | ||
|
|
f808fe9685 | ||
|
|
dd5db396b4 | ||
|
|
e121a799ed | ||
|
|
5dfef4a3ae | ||
|
|
8236603f76 | ||
|
|
315d52961a | ||
|
|
dcb6f4676d | ||
|
|
3455ceb722 | ||
|
|
7361b2da0b | ||
|
|
3ebacbc31a | ||
|
|
c0bcf177e7 | ||
|
|
8dfede11c6 | ||
|
|
bac123f223 | ||
|
|
fdc775ae6d | ||
|
|
26b39d6626 | ||
|
|
8953e8481d | ||
|
|
1ce76a3166 | ||
|
|
1c703905fe | ||
|
|
feed223ab4 | ||
|
|
90f962a886 | ||
|
|
82f6484031 | ||
|
|
282fb44da4 | ||
|
|
82f40d2e93 | ||
|
|
cae1655ec3 | ||
|
|
26702e6f0d | ||
|
|
8cd9e94148 | ||
|
|
a934b60f67 | ||
|
|
7fc9a6bf93 | ||
|
|
781bf940f6 | ||
|
|
92382ca473 | ||
|
|
76a3e913df | ||
|
|
23ab6bb489 | ||
|
|
368da19993 | ||
|
|
419f4490d6 | ||
|
|
39245d55e2 | ||
|
|
fe8200b7e8 | ||
|
|
c799f15067 | ||
|
|
54f1047dcb | ||
|
|
c1e599deef | ||
|
|
f3c60148c1 | ||
|
|
2e08c9c44e | ||
|
|
93f2af7e7d | ||
|
|
cb7a4b67ce | ||
|
|
41a8d06326 | ||
|
|
a957df1205 | ||
|
|
a1bdfa0a20 | ||
|
|
1adf94093e | ||
|
|
476daf0d30 | ||
|
|
18ef5cc69a | ||
|
|
a69528c432 | ||
|
|
9dfecde6a7 | ||
|
|
c73f28b434 | ||
|
|
0cd9fa91a8 | ||
|
|
252943e9de | ||
|
|
cab4b2fb28 | ||
|
|
80bd6defcb | ||
|
|
bd367cb154 | ||
|
|
d0f48687e2 | ||
|
|
25063d2c4d | ||
|
|
bad04b70a9 | ||
|
|
5479572a08 | ||
|
|
79a9dbcf68 | ||
|
|
61c7c26822 | ||
|
|
969dcae8d0 | ||
|
|
ce5a95ff4f | ||
|
|
0d5330d388 | ||
|
|
3676acf244 | ||
|
|
caf6b087c1 | ||
|
|
24d6c1e386 | ||
|
|
a120e390d0 | ||
|
|
98a2bf5d47 | ||
|
|
bb0c1e7a0f | ||
|
|
55a15b914c | ||
|
|
8ce14a55c8 | ||
|
|
d1f47f6956 | ||
|
|
2d50dace20 | ||
|
|
bbbbe71bc4 | ||
|
|
b3dc76b8cf | ||
|
|
ad4b26e86d | ||
|
|
c2a7a89381 | ||
|
|
68e3623861 | ||
|
|
577aa55f98 | ||
|
|
b8e62b3d84 | ||
|
|
dbb8e07b9a | ||
|
|
19550ed4fe | ||
|
|
4d0c710e3b | ||
|
|
fccde70690 | ||
|
|
06bfd07fec | ||
|
|
e98cf78b4c | ||
|
|
13229cc0c1 | ||
|
|
0f59333cd9 | ||
|
|
ad4ce14486 | ||
|
|
3173c79e8f | ||
|
|
ca14d557c1 | ||
|
|
59a3a5bd92 | ||
|
|
a226088f5c | ||
|
|
e91fab5702 | ||
|
|
e09853af0c | ||
|
|
c65fcc1072 | ||
|
|
3bb68ec07e | ||
|
|
2c97638aa1 | ||
|
|
ceee9671d9 | ||
|
|
6b494be7ff | ||
|
|
a6855e6bc1 | ||
|
|
7ca43eb4a1 | ||
|
|
74b5ac559f | ||
|
|
07c236497c | ||
|
|
caf2ff9bb4 | ||
|
|
1b2a17d7e4 | ||
|
|
ce46115139 | ||
|
|
9fd2ff7620 | ||
|
|
98a25c1c7f | ||
|
|
6b78f8b855 | ||
|
|
1e2b28c559 | ||
|
|
12b86a35af | ||
|
|
4577bde692 | ||
|
|
af6be02ba4 | ||
|
|
0dabca583f | ||
|
|
d7603755bf | ||
|
|
f9d255a266 | ||
|
|
bcf4507795 | ||
|
|
9967ba2d06 | ||
|
|
f90f71cf68 | ||
|
|
fe8a0a908e | ||
|
|
bf6176c883 | ||
|
|
ffdfb7d450 | ||
|
|
3aa4c2a25f | ||
|
|
3331aaa382 | ||
|
|
b302dcfbec | ||
|
|
7dfc4d21ca | ||
|
|
f332a6934b | ||
|
|
baad0135f9 | ||
|
|
1973e36634 | ||
|
|
2e62531232 | ||
|
|
d811103a71 | ||
|
|
e1f4210aa8 | ||
|
|
f3efed7aeb | ||
|
|
584b976dff | ||
|
|
4073238654 | ||
|
|
d7505bcef4 | ||
|
|
f6a7225c47 | ||
|
|
377f33b64f | ||
|
|
73b27f14ab | ||
|
|
0b497fbb77 | ||
|
|
5e4df41ec8 | ||
|
|
72085be896 | ||
|
|
e0bc8f9cdc | ||
|
|
efcb442a80 | ||
|
|
a38023475c | ||
|
|
4a6ba29b99 | ||
|
|
7f961d90c2 | ||
|
|
0ac4021729 | ||
|
|
ac662de789 | ||
|
|
23c57cb354 | ||
|
|
d6ef56af6e | ||
|
|
059e36318e | ||
|
|
7a72121b1b | ||
|
|
01278c3ee6 | ||
|
|
c01cca33c7 | ||
|
|
631306cfb3 | ||
|
|
da7f46de1f | ||
|
|
20107986a6 | ||
|
|
f4d59305d7 | ||
|
|
dbd0100044 | ||
|
|
7f108353e3 | ||
|
|
e1775eaad8 | ||
|
|
ad9ebc2f92 | ||
|
|
fa4351599f | ||
|
|
e5ba0843d8 | ||
|
|
71fe5bc107 | ||
|
|
3c3b591655 | ||
|
|
39c7fbef46 | ||
|
|
cff52beb06 | ||
|
|
c4fec2ee76 | ||
|
|
952fc15a64 | ||
|
|
2cbd5b5255 | ||
|
|
9f77c5912f | ||
|
|
1e4c0cb2cc | ||
|
|
ded139458d | ||
|
|
e5f9c39352 | ||
|
|
f0554d8ae2 | ||
|
|
e37caf7a96 | ||
|
|
03653bee60 | ||
|
|
43cf6e4147 | ||
|
|
7f01658f47 | ||
|
|
7701561755 | ||
|
|
0bdee785bb | ||
|
|
1029b61bb0 | ||
|
|
065e7a420b | ||
|
|
fe4b6accb0 | ||
|
|
1049ec277c | ||
|
|
b3314d7441 | ||
|
|
c526e72539 | ||
|
|
e217a6fca8 | ||
|
|
6aa7ef3c21 | ||
|
|
77121dfacf | ||
|
|
04323388ad | ||
|
|
bf0e5c0d44 | ||
|
|
6bd2f5af8d | ||
|
|
7bf54088a6 | ||
|
|
4792040240 | ||
|
|
700be792e5 | ||
|
|
9f2ece379a | ||
|
|
2662371507 | ||
|
|
172647f1cd | ||
|
|
24fc3e9e86 | ||
|
|
b064173b7a | ||
|
|
f95581cd1f | ||
|
|
b113fe08e1 | ||
|
|
93d73f4763 | ||
|
|
154d17969c | ||
|
|
e32dcd53b5 | ||
|
|
dc631026d4 | ||
|
|
44c4a66970 | ||
|
|
d05834b896 | ||
|
|
854e136d09 | ||
|
|
7f3fc4ff91 | ||
|
|
c05532c166 | ||
|
|
62ae62db5a | ||
|
|
a6fc49abce | ||
|
|
528c5a3593 | ||
|
|
81165cd82b | ||
|
|
faf50a1922 | ||
|
|
5f237adda2 | ||
|
|
2e09a96c4b | ||
|
|
6ae47c208a | ||
|
|
82139a9ac0 | ||
|
|
6d9946c3c6 | ||
|
|
f58b6bcada | ||
|
|
dc13ef4162 | ||
|
|
dcb48272f5 | ||
|
|
08bc374576 | ||
|
|
afbf0a5d0e | ||
|
|
7e034a3037 | ||
|
|
74d2a94181 | ||
|
|
7a5b273e71 | ||
|
|
0b6e7593db | ||
|
|
6d0d91c56a | ||
|
|
a509d49ec6 | ||
|
|
bb0903cd4a | ||
|
|
e93cb485a1 | ||
|
|
fbce264dd7 | ||
|
|
3c1313bfa0 | ||
|
|
4ca420bd84 | ||
|
|
134ea28249 | ||
|
|
78cfc0db65 | ||
|
|
816e06d37c | ||
|
|
2e80b7d92f | ||
|
|
753173e2be | ||
|
|
c9954f0823 | ||
|
|
28af42371b | ||
|
|
acfe180e1d | ||
|
|
7d20eb4fea |
@@ -1,2 +0,0 @@
|
||||
defaults
|
||||
IE 11
|
||||
1
.gitattributes
vendored
1
.gitattributes
vendored
@@ -8,4 +8,3 @@
|
||||
# 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
|
||||
10
.github/PULL_REQUEST_TEMPLATE.md
vendored
10
.github/PULL_REQUEST_TEMPLATE.md
vendored
@@ -1,4 +1,4 @@
|
||||
#### What? Why?
|
||||
## What? Why?
|
||||
|
||||
- Closes # <!-- Insert issue number here. -->
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
|
||||
|
||||
|
||||
#### What should we test?
|
||||
## What should we test?
|
||||
<!-- List which features should be tested and how.
|
||||
This can be similar to the Steps to Reproduce in the issue.
|
||||
Also think of other parts of the app which could be affected
|
||||
@@ -16,7 +16,7 @@
|
||||
- Visit ... page.
|
||||
-
|
||||
|
||||
#### Release notes
|
||||
## Release notes
|
||||
|
||||
<!-- Please select one for your PR and delete the other. -->
|
||||
|
||||
@@ -33,12 +33,12 @@ Changelog Category (reviewers may add a label for the release notes):
|
||||
The title of the pull request will be included in the release notes.
|
||||
|
||||
|
||||
#### Dependencies
|
||||
## Dependencies
|
||||
<!-- Does this PR depend on another one?
|
||||
Add the link or remove this section. -->
|
||||
|
||||
|
||||
|
||||
#### Documentation updates
|
||||
## Documentation updates
|
||||
<!-- Are there any wiki pages that need updating after merging this PR?
|
||||
List them here or remove this section. -->
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
# This configuration was generated by
|
||||
# `rubocop --auto-gen-config --auto-gen-only-exclude --exclude-limit 1400 --no-auto-gen-timestamp`
|
||||
# using RuboCop version 1.81.6.
|
||||
# using RuboCop version 1.81.7.
|
||||
# The point is for the user to remove these configuration records
|
||||
# one by one as the offenses are removed from the code base.
|
||||
# Note that changes in the inspected code, or installation of new
|
||||
@@ -80,7 +80,7 @@ Metrics/BlockNesting:
|
||||
Exclude:
|
||||
- 'app/models/spree/payment/processing.rb'
|
||||
|
||||
# Offense count: 48
|
||||
# Offense count: 49
|
||||
# Configuration parameters: CountComments, Max, CountAsOne.
|
||||
Metrics/ClassLength:
|
||||
Exclude:
|
||||
@@ -122,6 +122,7 @@ Metrics/ClassLength:
|
||||
- 'app/services/order_cycles/form_service.rb'
|
||||
- 'app/services/orders/sync_service.rb'
|
||||
- 'app/services/permissions/order.rb'
|
||||
- 'app/services/products_renderer.rb'
|
||||
- 'app/services/sets/product_set.rb'
|
||||
- 'engines/order_management/app/services/order_management/order/updater.rb'
|
||||
- 'lib/open_food_network/enterprise_fee_calculator.rb'
|
||||
@@ -133,7 +134,7 @@ Metrics/ClassLength:
|
||||
- 'lib/reporting/reports/enterprise_fee_summary/scope.rb'
|
||||
- 'lib/reporting/reports/xero_invoices/base.rb'
|
||||
|
||||
# Offense count: 35
|
||||
# Offense count: 37
|
||||
# Configuration parameters: AllowedMethods, AllowedPatterns, Max.
|
||||
Metrics/CyclomaticComplexity:
|
||||
Exclude:
|
||||
@@ -234,7 +235,7 @@ Naming/MethodParameterName:
|
||||
Exclude:
|
||||
- 'engines/dfc_provider/lib/dfc_provider/catalog_item.rb'
|
||||
|
||||
# Offense count: 59
|
||||
# Offense count: 60
|
||||
# Configuration parameters: Mode, AllowedMethods, AllowedPatterns, AllowBangMethods, WaywardPredicates.
|
||||
# AllowedMethods: call
|
||||
# WaywardPredicates: nonzero?
|
||||
@@ -335,6 +336,24 @@ Rails/OrderArguments:
|
||||
- 'spec/services/orders/generate_invoice_service_spec.rb'
|
||||
- 'spec/system/admin/order_cycles/simple_spec.rb'
|
||||
|
||||
# Offense count: 3
|
||||
# This cop supports safe autocorrection (--autocorrect).
|
||||
Rails/Presence:
|
||||
Exclude:
|
||||
- 'app/controllers/admin/enterprises_controller.rb'
|
||||
- 'app/models/spree/product.rb'
|
||||
|
||||
# Offense count: 6
|
||||
# This cop supports safe autocorrection (--autocorrect).
|
||||
# Configuration parameters: Severity.
|
||||
Rails/RedirectBackOrTo:
|
||||
Exclude:
|
||||
- 'app/controllers/admin/order_cycles_controller.rb'
|
||||
- 'app/controllers/locales_controller.rb'
|
||||
- 'app/controllers/spree/admin/invoices_controller.rb'
|
||||
- 'app/controllers/spree/admin/orders_controller.rb'
|
||||
- 'app/controllers/spree/admin/return_authorizations_controller.rb'
|
||||
|
||||
# Offense count: 1
|
||||
# Configuration parameters: TransactionMethods.
|
||||
Rails/TransactionExitStatement:
|
||||
|
||||
@@ -1 +1 @@
|
||||
3.2.9
|
||||
3.4.8
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
FROM ruby:3.2.9-alpine3.19 AS base
|
||||
FROM ruby:3.4.8-alpine3.19 AS base
|
||||
ENV LANG=C.UTF-8 \
|
||||
LC_ALL=C.UTF-8 \
|
||||
TZ=Europe/London \
|
||||
@@ -31,4 +31,4 @@ FROM development-base
|
||||
COPY . $RAILS_ROOT
|
||||
COPY Gemfile Gemfile.lock ./
|
||||
RUN bundle install --jobs "$(nproc)"
|
||||
COPY --from=yarn-dependencies $RAILS_ROOT/node_modules ./node_modules
|
||||
COPY --from=yarn-dependencies $RAILS_ROOT/node_modules ./node_modules
|
||||
|
||||
@@ -83,11 +83,8 @@ RUN wget https://chromedriver.storage.googleapis.com/2.41/chromedriver_linux64.z
|
||||
# Copy code and install app dependencies
|
||||
COPY . /usr/src/app/
|
||||
|
||||
# Install Bundler
|
||||
RUN ./script/install-bundler
|
||||
|
||||
# Install front-end dependencies
|
||||
RUN yarn install
|
||||
|
||||
# Run bundler install in parallel with the amount of available CPUs
|
||||
RUN bundle install --jobs="$(nproc)"
|
||||
RUN bundle install --jobs="$(nproc)"
|
||||
|
||||
10
Gemfile
10
Gemfile
@@ -1,6 +1,6 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
source 'https://rubygems.org'
|
||||
source 'https://gem.coop'
|
||||
git_source(:github) { |repo_name| "https://github.com/#{repo_name}.git" }
|
||||
|
||||
ruby File.read('.ruby-version').chomp
|
||||
@@ -18,7 +18,7 @@ gem 'activemerchant'
|
||||
gem 'angular-rails-templates'
|
||||
gem 'ransack', '~> 4.1.0'
|
||||
gem 'responders'
|
||||
gem 'webpacker', '~> 5'
|
||||
gem 'shakapacker', '6.6.0'
|
||||
|
||||
# Indirect dependency but we access it directly in JS specs.
|
||||
# It turns out to be hard to upgrade but please do if you can.
|
||||
@@ -49,7 +49,7 @@ gem 'acts_as_list', '1.0.4'
|
||||
gem 'cancancan', '~> 1.15.0'
|
||||
gem 'digest'
|
||||
gem 'ffaker'
|
||||
gem 'highline', '2.0.3' # Necessary for the install generator
|
||||
gem 'highline'
|
||||
gem 'json'
|
||||
gem 'monetize', '~> 1.11'
|
||||
gem 'paranoia', '~> 2.4'
|
||||
@@ -57,7 +57,7 @@ gem 'state_machines-activerecord'
|
||||
gem 'stringex', '~> 2.8.5', require: false
|
||||
|
||||
gem 'paypal-sdk-merchant', '1.117.2'
|
||||
gem 'stripe', '~> 13'
|
||||
gem 'stripe', '~> 15'
|
||||
|
||||
gem 'devise'
|
||||
gem 'devise-encryptable'
|
||||
@@ -126,6 +126,8 @@ gem 'angular_rails_csrf'
|
||||
|
||||
gem 'jquery-rails', '4.4.0'
|
||||
gem 'jquery-ui-rails', '~> 4.2'
|
||||
# TODO move away from sass-rails, master branch will get rid of dependency, so we can move to
|
||||
# https://github.com/sass/embedded-host-node
|
||||
gem "select2-rails", github: "openfoodfoundation/select2-rails", branch: "v349_with_thor_v1"
|
||||
|
||||
gem 'good_migrations'
|
||||
|
||||
198
Gemfile.lock
198
Gemfile.lock
@@ -46,7 +46,7 @@ PATH
|
||||
web (0.0.1)
|
||||
|
||||
GEM
|
||||
remote: https://rubygems.org/
|
||||
remote: https://gem.coop/
|
||||
specs:
|
||||
Ascii85 (2.0.1)
|
||||
actioncable (7.1.6)
|
||||
@@ -104,11 +104,12 @@ GEM
|
||||
rails-html-sanitizer (~> 1.6)
|
||||
active_model_serializers (0.8.4)
|
||||
activemodel (>= 3.0)
|
||||
active_storage_validations (1.1.4)
|
||||
activejob (>= 5.2.0)
|
||||
activemodel (>= 5.2.0)
|
||||
activestorage (>= 5.2.0)
|
||||
activesupport (>= 5.2.0)
|
||||
active_storage_validations (3.0.2)
|
||||
activejob (>= 6.1.4)
|
||||
activemodel (>= 6.1.4)
|
||||
activestorage (>= 6.1.4)
|
||||
activesupport (>= 6.1.4)
|
||||
marcel (>= 1.0.3)
|
||||
activejob (7.1.6)
|
||||
activesupport (= 7.1.6)
|
||||
globalid (>= 0.3.6)
|
||||
@@ -158,12 +159,12 @@ GEM
|
||||
zeitwerk (>= 2.4, < 3.0)
|
||||
acts_as_list (1.0.4)
|
||||
activerecord (>= 4.2)
|
||||
addressable (2.8.7)
|
||||
public_suffix (>= 2.0.2, < 7.0)
|
||||
addressable (2.8.8)
|
||||
public_suffix (>= 2.0.2, < 8.0)
|
||||
aes_key_wrap (1.1.0)
|
||||
afm (0.2.2)
|
||||
angular-rails-templates (1.3.1)
|
||||
railties (>= 5.0, < 8.1)
|
||||
angular-rails-templates (1.4.0)
|
||||
railties (>= 5.0, < 8.2)
|
||||
sprockets (>= 3.0, < 5)
|
||||
sprockets-rails
|
||||
tilt
|
||||
@@ -175,21 +176,24 @@ GEM
|
||||
activerecord (>= 3.1.0)
|
||||
ast (2.4.3)
|
||||
attr_required (1.0.2)
|
||||
aws-eventstream (1.3.0)
|
||||
aws-partitions (1.929.0)
|
||||
aws-sdk-core (3.196.1)
|
||||
aws-eventstream (1.4.0)
|
||||
aws-partitions (1.1196.0)
|
||||
aws-sdk-core (3.240.0)
|
||||
aws-eventstream (~> 1, >= 1.3.0)
|
||||
aws-partitions (~> 1, >= 1.651.0)
|
||||
aws-sigv4 (~> 1.8)
|
||||
aws-partitions (~> 1, >= 1.992.0)
|
||||
aws-sigv4 (~> 1.9)
|
||||
base64
|
||||
bigdecimal
|
||||
jmespath (~> 1, >= 1.6.1)
|
||||
aws-sdk-kms (1.81.0)
|
||||
aws-sdk-core (~> 3, >= 3.193.0)
|
||||
aws-sigv4 (~> 1.1)
|
||||
aws-sdk-s3 (1.151.0)
|
||||
aws-sdk-core (~> 3, >= 3.194.0)
|
||||
logger
|
||||
aws-sdk-kms (1.118.0)
|
||||
aws-sdk-core (~> 3, >= 3.239.1)
|
||||
aws-sigv4 (~> 1.5)
|
||||
aws-sdk-s3 (1.208.0)
|
||||
aws-sdk-core (~> 3, >= 3.234.0)
|
||||
aws-sdk-kms (~> 1)
|
||||
aws-sigv4 (~> 1.8)
|
||||
aws-sigv4 (1.8.0)
|
||||
aws-sigv4 (~> 1.5)
|
||||
aws-sigv4 (1.12.1)
|
||||
aws-eventstream (~> 1, >= 1.0.2)
|
||||
base64 (0.3.0)
|
||||
bcp47_spec (0.2.1)
|
||||
@@ -198,7 +202,7 @@ GEM
|
||||
bigdecimal (3.3.1)
|
||||
bindata (2.5.1)
|
||||
bindex (0.8.1)
|
||||
bootsnap (1.18.3)
|
||||
bootsnap (1.19.0)
|
||||
msgpack (~> 1.2)
|
||||
bugsnag (6.28.0)
|
||||
concurrent-ruby (~> 1.0)
|
||||
@@ -225,7 +229,7 @@ GEM
|
||||
xpath (~> 3.2)
|
||||
capybara-shadowdom (0.3.0)
|
||||
capybara
|
||||
caxlsx (3.3.0)
|
||||
caxlsx (4.0.0)
|
||||
htmlentities (~> 4.3, >= 4.3.4)
|
||||
marcel (~> 1.0)
|
||||
nokogiri (~> 1.10, >= 1.10.4)
|
||||
@@ -242,13 +246,13 @@ GEM
|
||||
coffee-script-source
|
||||
execjs
|
||||
coffee-script-source (1.12.2)
|
||||
combine_pdf (1.0.26)
|
||||
combine_pdf (1.0.31)
|
||||
matrix
|
||||
ruby-rc4 (>= 0.1.5)
|
||||
concurrent-ruby (1.3.5)
|
||||
connection_pool (2.5.4)
|
||||
connection_pool (2.5.5)
|
||||
cookiejar (0.3.4)
|
||||
crack (1.0.0)
|
||||
crack (1.0.1)
|
||||
bigdecimal
|
||||
rexml
|
||||
crass (1.0.6)
|
||||
@@ -258,16 +262,16 @@ GEM
|
||||
cuprite (0.15)
|
||||
capybara (~> 3.0)
|
||||
ferrum (~> 0.14.0)
|
||||
database_cleaner (2.0.2)
|
||||
database_cleaner (2.1.0)
|
||||
database_cleaner-active_record (>= 2, < 3)
|
||||
database_cleaner-active_record (2.1.0)
|
||||
database_cleaner-active_record (2.2.2)
|
||||
activerecord (>= 5.a)
|
||||
database_cleaner-core (~> 2.0.0)
|
||||
database_cleaner-core (~> 2.0)
|
||||
database_cleaner-core (2.0.1)
|
||||
datafoodconsortium-connector (1.1.0)
|
||||
datafoodconsortium-connector (1.2.0)
|
||||
virtual_assembly-semantizer (~> 1.0, >= 1.0.5)
|
||||
date (3.5.0)
|
||||
debug (1.9.2)
|
||||
debug (1.11.0)
|
||||
irb (~> 1.10)
|
||||
reline (>= 0.3.8)
|
||||
devise (4.9.4)
|
||||
@@ -286,7 +290,7 @@ GEM
|
||||
diff-lcs (1.6.2)
|
||||
digest (3.2.1)
|
||||
docile (1.4.1)
|
||||
dotenv (3.1.2)
|
||||
dotenv (3.2.0)
|
||||
drb (2.2.3)
|
||||
em-http-request (1.1.7)
|
||||
addressable (>= 2.3.4)
|
||||
@@ -325,13 +329,13 @@ GEM
|
||||
concurrent-ruby (~> 1.1)
|
||||
webrick (~> 1.7)
|
||||
websocket-driver (>= 0.6, < 0.8)
|
||||
ffaker (2.23.0)
|
||||
ffi (1.16.3)
|
||||
ffaker (2.25.0)
|
||||
ffi (1.17.2)
|
||||
flipper (1.3.6)
|
||||
concurrent-ruby (< 2)
|
||||
flipper-active_record (1.3.0)
|
||||
activerecord (>= 4.2, < 8)
|
||||
flipper (~> 1.3.0)
|
||||
flipper-active_record (1.3.6)
|
||||
activerecord (>= 4.2, < 9)
|
||||
flipper (~> 1.3.6)
|
||||
flipper-ui (1.3.6)
|
||||
erubi (>= 1.0.0, < 2.0.0)
|
||||
flipper (~> 1.3.6)
|
||||
@@ -354,7 +358,8 @@ GEM
|
||||
fog-xml (0.1.3)
|
||||
fog-core
|
||||
nokogiri (>= 1.5.11, < 2.0.0)
|
||||
foreman (0.88.1)
|
||||
foreman (0.90.0)
|
||||
thor (~> 1.4)
|
||||
formatador (0.2.5)
|
||||
fugit (1.11.1)
|
||||
et-orbi (~> 1, >= 1.2.11)
|
||||
@@ -375,7 +380,7 @@ GEM
|
||||
temple (>= 0.8.2)
|
||||
thor
|
||||
tilt
|
||||
haml_lint (0.67.0)
|
||||
haml_lint (0.68.0)
|
||||
haml (>= 5.0)
|
||||
parallel (~> 1.10)
|
||||
rainbow
|
||||
@@ -384,8 +389,9 @@ GEM
|
||||
hashdiff (1.2.1)
|
||||
hashery (2.1.2)
|
||||
hashie (5.0.0)
|
||||
highline (2.0.3)
|
||||
htmlentities (4.3.4)
|
||||
highline (3.1.2)
|
||||
reline
|
||||
htmlentities (4.4.2)
|
||||
http_parser.rb (0.8.0)
|
||||
i18n (1.14.7)
|
||||
concurrent-ruby (~> 1.0)
|
||||
@@ -402,8 +408,8 @@ GEM
|
||||
rainbow (>= 2.2.2, < 4.0)
|
||||
ruby-progressbar (~> 1.8, >= 1.8.1)
|
||||
terminal-table (>= 1.5.1)
|
||||
image_processing (1.12.2)
|
||||
mini_magick (>= 4.9.5, < 5)
|
||||
image_processing (1.14.0)
|
||||
mini_magick (>= 4.9.5, < 6)
|
||||
ruby-vips (>= 2.0.17, < 3)
|
||||
imagen (0.2.0)
|
||||
parser (>= 2.5, != 2.5.1.1)
|
||||
@@ -448,7 +454,7 @@ GEM
|
||||
rspec (>= 2.0, < 4.0)
|
||||
jsonapi-serializer (2.2.0)
|
||||
activesupport (>= 4.2)
|
||||
jwt (2.8.1)
|
||||
jwt (2.10.2)
|
||||
base64
|
||||
knapsack_pro (8.4.0)
|
||||
rake
|
||||
@@ -474,7 +480,7 @@ GEM
|
||||
net-pop
|
||||
net-smtp
|
||||
marcel (1.1.0)
|
||||
matrix (0.4.2)
|
||||
matrix (0.4.3)
|
||||
method_source (1.1.0)
|
||||
mime-types (3.7.0)
|
||||
logger
|
||||
@@ -483,7 +489,8 @@ GEM
|
||||
mimemagic (0.4.3)
|
||||
nokogiri (~> 1)
|
||||
rake
|
||||
mini_magick (4.13.2)
|
||||
mini_magick (5.3.1)
|
||||
logger
|
||||
mini_mime (1.1.5)
|
||||
mini_portile2 (2.8.6)
|
||||
minitest (5.26.2)
|
||||
@@ -491,7 +498,7 @@ GEM
|
||||
money (~> 6.12)
|
||||
money (6.16.0)
|
||||
i18n (>= 0.6.4, <= 2)
|
||||
msgpack (1.7.2)
|
||||
msgpack (1.8.0)
|
||||
multi_json (1.17.0)
|
||||
multi_xml (0.6.0)
|
||||
mutex_m (0.3.0)
|
||||
@@ -506,7 +513,7 @@ GEM
|
||||
timeout
|
||||
net-smtp (0.5.1)
|
||||
net-protocol
|
||||
newrelic_rpm (9.23.0)
|
||||
newrelic_rpm (9.24.0)
|
||||
nio4r (2.7.5)
|
||||
nokogiri (1.18.10)
|
||||
mini_portile2 (~> 2.8.2)
|
||||
@@ -546,7 +553,7 @@ GEM
|
||||
webfinger (~> 2.0)
|
||||
orm_adapter (0.5.0)
|
||||
ostruct (0.6.1)
|
||||
pagy (9.3.4)
|
||||
pagy (9.4.0)
|
||||
paper_trail (17.0.0)
|
||||
activerecord (>= 7.1)
|
||||
request_store (~> 1.4)
|
||||
@@ -571,7 +578,7 @@ GEM
|
||||
pp (0.6.3)
|
||||
prettyprint
|
||||
prettyprint (0.2.0)
|
||||
prism (1.6.0)
|
||||
prism (1.7.0)
|
||||
private_address_check (0.5.0)
|
||||
pry (0.15.2)
|
||||
coderay (~> 1.1)
|
||||
@@ -579,7 +586,7 @@ GEM
|
||||
psych (5.2.6)
|
||||
date
|
||||
stringio
|
||||
public_suffix (6.0.2)
|
||||
public_suffix (7.0.0)
|
||||
puffing-billy (4.0.2)
|
||||
addressable (~> 2.5)
|
||||
em-http-request (~> 1.1, >= 1.1.0)
|
||||
@@ -608,7 +615,7 @@ GEM
|
||||
rack-protection (3.2.0)
|
||||
base64 (>= 0.1.0)
|
||||
rack (~> 2.2, >= 2.2.4)
|
||||
rack-proxy (0.7.6)
|
||||
rack-proxy (0.7.7)
|
||||
rack
|
||||
rack-rewrite (1.5.1)
|
||||
rack-session (1.0.2)
|
||||
@@ -671,14 +678,19 @@ GEM
|
||||
rb-fsevent (0.11.2)
|
||||
rb-inotify (0.10.1)
|
||||
ffi (~> 1.0)
|
||||
rdf (3.3.2)
|
||||
rdf (3.3.4)
|
||||
bcp47_spec (~> 0.2)
|
||||
bigdecimal (~> 3.1, >= 3.1.5)
|
||||
link_header (~> 0.0, >= 0.0.8)
|
||||
rdoc (6.15.1)
|
||||
logger (~> 1.5)
|
||||
ostruct (~> 0.6)
|
||||
readline (~> 0.0)
|
||||
rdoc (6.16.0)
|
||||
erb
|
||||
psych (>= 4.0.0)
|
||||
tsort
|
||||
readline (0.0.4)
|
||||
reline
|
||||
redcarpet (3.6.1)
|
||||
redis (5.4.1)
|
||||
redis-client (>= 0.22.0)
|
||||
@@ -692,7 +704,7 @@ GEM
|
||||
responders (3.1.1)
|
||||
actionpack (>= 5.2)
|
||||
railties (>= 5.2)
|
||||
rexml (3.4.2)
|
||||
rexml (3.4.4)
|
||||
roadie (5.2.1)
|
||||
css_parser (~> 1.4)
|
||||
nokogiri (~> 1.15)
|
||||
@@ -766,16 +778,16 @@ GEM
|
||||
rubocop-factory_bot (2.28.0)
|
||||
lint_roller (~> 1.1)
|
||||
rubocop (~> 1.72, >= 1.72.1)
|
||||
rubocop-rails (2.33.4)
|
||||
rubocop-rails (2.34.2)
|
||||
activesupport (>= 4.2.0)
|
||||
lint_roller (~> 1.1)
|
||||
rack (>= 1.1)
|
||||
rubocop (>= 1.75.0, < 2.0)
|
||||
rubocop-ast (>= 1.44.0, < 2.0)
|
||||
rubocop-rspec (3.7.0)
|
||||
rubocop-rspec (3.8.0)
|
||||
lint_roller (~> 1.1)
|
||||
rubocop (~> 1.72, >= 1.72.1)
|
||||
rubocop-rspec_rails (2.31.0)
|
||||
rubocop (~> 1.81)
|
||||
rubocop-rspec_rails (2.32.0)
|
||||
lint_roller (~> 1.1)
|
||||
rubocop (~> 1.72, >= 1.72.1)
|
||||
rubocop-rspec (~> 3.5)
|
||||
@@ -783,9 +795,10 @@ GEM
|
||||
rexml
|
||||
ruby-progressbar (1.13.0)
|
||||
ruby-rc4 (0.1.5)
|
||||
ruby-vips (2.1.4)
|
||||
ruby-vips (2.2.5)
|
||||
ffi (~> 1.12)
|
||||
rubyzip (2.3.2)
|
||||
logger
|
||||
rubyzip (2.4.1)
|
||||
rufus-scheduler (3.8.2)
|
||||
fugit (~> 1.1, >= 1.1.6)
|
||||
rugged (1.9.0)
|
||||
@@ -801,7 +814,12 @@ GEM
|
||||
tilt (>= 1.1, < 3)
|
||||
sd_notify (0.1.1)
|
||||
securerandom (0.4.1)
|
||||
semantic_range (3.0.0)
|
||||
semantic_range (3.1.0)
|
||||
shakapacker (6.6.0)
|
||||
activesupport (>= 5.2)
|
||||
rack-proxy (>= 0.6.1)
|
||||
railties (>= 5.2)
|
||||
semantic_range (>= 2.3.0)
|
||||
shoulda-matchers (7.0.1)
|
||||
activesupport (>= 7.1)
|
||||
sidekiq (7.2.4)
|
||||
@@ -819,9 +837,10 @@ GEM
|
||||
simplecov_json_formatter (~> 0.1)
|
||||
simplecov-html (0.13.2)
|
||||
simplecov_json_formatter (0.1.4)
|
||||
spreadsheet_architect (5.0.0)
|
||||
caxlsx (>= 3.3.0, < 4)
|
||||
rodf (>= 1.0.0, < 2)
|
||||
spreadsheet_architect (5.1.0)
|
||||
caxlsx (<= 4.0)
|
||||
csv
|
||||
rodf
|
||||
spring (4.4.0)
|
||||
spring-commands-rspec (1.0.4)
|
||||
spring (>= 0.9.1)
|
||||
@@ -856,14 +875,14 @@ GEM
|
||||
redis (>= 4.0, < 6.0)
|
||||
stringex (2.8.6)
|
||||
stringio (3.1.8)
|
||||
stripe (13.5.1)
|
||||
stripe (15.5.0)
|
||||
swd (2.0.3)
|
||||
activesupport (>= 3)
|
||||
attr_required (>= 0.0.5)
|
||||
faraday (~> 2.0)
|
||||
faraday-follow_redirects
|
||||
sysexits (1.2.0)
|
||||
temple (0.8.2)
|
||||
temple (0.10.4)
|
||||
terminal-table (4.0.0)
|
||||
unicode-display_width (>= 1.1.1, < 4)
|
||||
thor (1.4.0)
|
||||
@@ -873,15 +892,14 @@ GEM
|
||||
tsort (0.2.0)
|
||||
ttfunk (1.8.0)
|
||||
bigdecimal (~> 3.1)
|
||||
turbo-rails (2.0.5)
|
||||
actionpack (>= 6.0.0)
|
||||
activejob (>= 6.0.0)
|
||||
railties (>= 6.0.0)
|
||||
turbo-rails (2.0.20)
|
||||
actionpack (>= 7.1.0)
|
||||
railties (>= 7.1.0)
|
||||
turbo_power (0.7.0)
|
||||
turbo-rails (>= 1.3.0)
|
||||
tzinfo (2.0.6)
|
||||
concurrent-ruby (~> 1.0)
|
||||
undercover (0.8.2)
|
||||
undercover (0.8.3)
|
||||
base64
|
||||
bigdecimal
|
||||
imagen (>= 0.2.0)
|
||||
@@ -891,7 +909,7 @@ GEM
|
||||
simplecov_json_formatter
|
||||
unicode-display_width (3.2.0)
|
||||
unicode-emoji (~> 4.1)
|
||||
unicode-emoji (4.1.0)
|
||||
unicode-emoji (4.2.0)
|
||||
uniform_notifier (1.17.0)
|
||||
uri (1.1.1)
|
||||
valid_email2 (5.2.3)
|
||||
@@ -902,11 +920,12 @@ GEM
|
||||
public_suffix
|
||||
validates_lengths_from_database (0.8.0)
|
||||
activerecord (>= 4)
|
||||
vcr (6.2.0)
|
||||
view_component (3.12.1)
|
||||
activesupport (>= 5.2.0, < 8.0)
|
||||
concurrent-ruby (~> 1.0)
|
||||
method_source (~> 1.0)
|
||||
vcr (6.3.1)
|
||||
base64
|
||||
view_component (4.1.1)
|
||||
actionview (>= 7.1.0, < 8.2)
|
||||
activesupport (>= 7.1.0, < 8.2)
|
||||
concurrent-ruby (~> 1)
|
||||
view_component_reflex (3.1.14.pre9)
|
||||
rails (>= 5.2, < 8.0)
|
||||
stimulus_reflex (>= 3.5.0.pre2)
|
||||
@@ -924,21 +943,16 @@ GEM
|
||||
activesupport
|
||||
faraday (~> 2.0)
|
||||
faraday-follow_redirects
|
||||
webmock (3.25.1)
|
||||
webmock (3.26.1)
|
||||
addressable (>= 2.8.0)
|
||||
crack (>= 0.3.2)
|
||||
hashdiff (>= 0.4.0, < 2.0.0)
|
||||
webpacker (5.4.4)
|
||||
activesupport (>= 5.2)
|
||||
rack-proxy (>= 0.6.1)
|
||||
railties (>= 5.2)
|
||||
semantic_range (>= 2.3.0)
|
||||
webrick (1.9.1)
|
||||
webrick (1.9.2)
|
||||
websocket-driver (0.7.7)
|
||||
base64
|
||||
websocket-extensions (>= 0.1.0)
|
||||
websocket-extensions (0.1.5)
|
||||
whenever (1.0.0)
|
||||
whenever (1.1.0)
|
||||
chronic (>= 0.6.3)
|
||||
wicked_pdf (2.8.2)
|
||||
activesupport
|
||||
@@ -1005,7 +1019,7 @@ DEPENDENCIES
|
||||
good_migrations
|
||||
haml
|
||||
haml_lint
|
||||
highline (= 2.0.3)
|
||||
highline
|
||||
i18n
|
||||
i18n-js (~> 3.9.0)
|
||||
i18n-tasks
|
||||
@@ -1069,6 +1083,7 @@ DEPENDENCIES
|
||||
rubocop-rspec_rails
|
||||
sd_notify
|
||||
select2-rails!
|
||||
shakapacker (= 6.6.0)
|
||||
shoulda-matchers
|
||||
sidekiq
|
||||
sidekiq-scheduler
|
||||
@@ -1082,7 +1097,7 @@ DEPENDENCIES
|
||||
stimulus_reflex
|
||||
stimulus_reflex_testing!
|
||||
stringex (~> 2.8.5)
|
||||
stripe (~> 13)
|
||||
stripe (~> 15)
|
||||
turbo-rails
|
||||
turbo_power
|
||||
undercover
|
||||
@@ -1094,13 +1109,12 @@ DEPENDENCIES
|
||||
web!
|
||||
web-console
|
||||
webmock
|
||||
webpacker (~> 5)
|
||||
whenever
|
||||
wicked_pdf
|
||||
wkhtmltopdf-binary
|
||||
|
||||
RUBY VERSION
|
||||
ruby 3.2.9p265
|
||||
ruby 3.4.8p72
|
||||
|
||||
BUNDLED WITH
|
||||
2.4.19
|
||||
4.0.3
|
||||
|
||||
2
Procfile
2
Procfile
@@ -1,5 +1,5 @@
|
||||
# Foreman Procfile. Start all dev server processes with: `foreman start`
|
||||
|
||||
rails: DEV_CACHING=true bundle exec rails s -p 3000
|
||||
webpack: ./bin/webpack-dev-server
|
||||
webpack: ./bin/webpacker-dev-server
|
||||
sidekiq: DEV_CACHING=true bundle exec sidekiq -q mailers -q default
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
# Foreman Procfile for Docker env. Start all dev server processes with: `bundle exec foreman start -f Procfile.docker`
|
||||
|
||||
webpack: WEBPACKER_DEV_SERVER_HOST=0.0.0.0 ./bin/webpack-dev-server
|
||||
webpack: WEBPACKER_DEV_SERVER_HOST=0.0.0.0 ./bin/webpacker-dev-server
|
||||
sidekiq: DEV_CACHING=true bundle exec sidekiq -q mailers -q default
|
||||
rails: WEBPACKER_DEV_SERVER_HOST=0.0.0.0 DEV_CACHING=true bundle exec rails s -p 3000 -b 0.0.0.0
|
||||
|
||||
@@ -38,16 +38,13 @@ angular.module("admin.indexUtils").directive "objForUpdate", (switchClass, pendi
|
||||
# To ensure the customer is still updated, we check on the $destroy event to see if
|
||||
# the attribute has changed, if so we queue up the change.
|
||||
scope.$on '$destroy', (value) ->
|
||||
# No update
|
||||
return if scope.object()[scope.attr] is scope.savedValue
|
||||
currentValue = scope.object()[scope.attr] || ""
|
||||
|
||||
# For some reason the code attribute is removed from the object when cleared, so we add
|
||||
# an emptyvalue so it gets updated properly
|
||||
if scope.attr is "code" and scope.object()[scope.attr] is undefined
|
||||
scope.object()["code"] = ""
|
||||
# No update
|
||||
return if currentValue is scope.savedValue
|
||||
|
||||
# Queuing up change
|
||||
addPendingChange(scope.attr, scope.object()[scope.attr])
|
||||
addPendingChange(scope.attr, currentValue)
|
||||
|
||||
# private
|
||||
|
||||
|
||||
@@ -1,2 +0,0 @@
|
||||
angular.module('Darkswarm').controller "TmpCtrl", ($scope)->
|
||||
$scope.test = {foo: "bar"}
|
||||
@@ -1,4 +1,4 @@
|
||||
= render ConfirmModalComponent.new(id: dom_id(@order, :ship), confirm_reflexes: "click->Admin::OrdersReflex#ship", controller: "orders", reflex: "Admin::Orders#ship") do
|
||||
= render ConfirmModalComponent.new(id: dom_id(@order, :ship), confirm_actions: "click->modal#close", confirm_reflexes: "click->Admin::OrdersReflex#ship", controller: "orders", reflex: "Admin::Orders#ship") do
|
||||
%div{class: "margin-bottom-30"}
|
||||
%p= t('spree.admin.orders.shipment.mark_as_shipped_message_html')
|
||||
%div{class: "margin-bottom-30"}
|
||||
|
||||
16
app/components/webhook_endpoint_form_component.rb
Normal file
16
app/components/webhook_endpoint_form_component.rb
Normal file
@@ -0,0 +1,16 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
class WebhookEndpointFormComponent < ViewComponent::Base
|
||||
def initialize(webhooks:, webhook_type:)
|
||||
@webhooks = webhooks
|
||||
@webhook_type = webhook_type
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
attr_reader :webhooks, :webhook_type
|
||||
|
||||
def is_webhook_payment_status?
|
||||
webhook_type == "payment_status_changed"
|
||||
end
|
||||
end
|
||||
@@ -0,0 +1,27 @@
|
||||
-# Create new endpoints
|
||||
- if webhooks.empty? # Only one allowed for now.
|
||||
%tr
|
||||
%td= t("components.webhook_endpoint_form.event_types.#{webhook_type}")
|
||||
%td
|
||||
= form_with(url: helpers.account_webhook_endpoints_path, id: "#{webhook_type}_webhook_endpoint") do |f|
|
||||
= f.url_field :'webhook_endpoint[url]', id: "#{webhook_type}_webhook_endpoint_url", placeholder: t('components.webhook_endpoint_form.url.create_placeholder'), required: true, size: 64
|
||||
= f.hidden_field :'webhook_endpoint[webhook_type]', id: "#{webhook_type}_webhook_endpoint_webhook_type", value: webhook_type
|
||||
%td.actions
|
||||
= button_tag t(:create), class: 'button primary tiny no-margin', form: "#{webhook_type}_webhook_endpoint"
|
||||
|
||||
-# Existing endpoints
|
||||
- webhooks.each do |webhook_endpoint|
|
||||
%tr
|
||||
%td= t("components.webhook_endpoint_form.event_types.#{webhook_type}")
|
||||
%td= webhook_endpoint.url
|
||||
%td.actions.endpoints-actions
|
||||
- if webhook_endpoint.persisted?
|
||||
= button_to helpers.account_webhook_endpoint_path(webhook_endpoint), method: :delete,
|
||||
class: "tiny alert no-margin",
|
||||
data: { confirm: I18n.t(:are_you_sure) } do
|
||||
= I18n.t(:delete)
|
||||
|
||||
- if is_webhook_payment_status?
|
||||
= form_tag helpers.webhook_endpoint_test_account_path(webhook_endpoint), class: "button_to", 'data-turbo': true do
|
||||
= button_tag type: "submit", class: "tiny alert no-margin", data: { confirm: I18n.t(:are_you_sure) } do
|
||||
= I18n.t("components.webhook_endpoint_form.test_endpoint")
|
||||
@@ -15,8 +15,8 @@ module Admin
|
||||
def index
|
||||
# Fetch DFC catalog JSON for preview
|
||||
@catalog_url = params.require(:catalog_url).strip
|
||||
@catalog_json = api.call(@catalog_url)
|
||||
catalog = DfcCatalog.from_json(@catalog_json)
|
||||
@catalog_data = api.call(@catalog_url)
|
||||
catalog = DfcCatalog.from_json(@catalog_data)
|
||||
|
||||
# Render table and let user decide which ones to import.
|
||||
@items = list_products(catalog)
|
||||
|
||||
@@ -162,6 +162,18 @@ module Admin
|
||||
end
|
||||
end
|
||||
|
||||
def destroy
|
||||
if @object.destroy
|
||||
flash.now[:success] = flash_message_for(@object, :successfully_removed)
|
||||
else
|
||||
flash.now[:error] = @object.errors.full_messages.to_sentence
|
||||
end
|
||||
|
||||
respond_to do |format|
|
||||
format.turbo_stream { render :destroy, status: :ok }
|
||||
end
|
||||
end
|
||||
|
||||
protected
|
||||
|
||||
def delete_custom_tab
|
||||
|
||||
@@ -49,7 +49,7 @@ module Admin
|
||||
errors: @importer.errors.full_messages
|
||||
}
|
||||
|
||||
if helpers.feature?(:inventory, *spree_current_user.enterprises)
|
||||
if helpers.inventory_enabled?(spree_current_user.enterprises)
|
||||
json[:results][:inventory_created] = @importer.inventory_created_count
|
||||
json[:results][:inventory_updated] = @importer.inventory_updated_count
|
||||
end
|
||||
@@ -175,7 +175,7 @@ module Admin
|
||||
|
||||
# Return an error if trying to import into inventories when inventory is disable
|
||||
def can_import_into_inventories?
|
||||
return true if helpers.feature?(:inventory, *spree_current_user.enterprises) ||
|
||||
return true if helpers.inventory_enabled?(spree_current_user.enterprises) ||
|
||||
params.dig(:settings, "import_into") != 'inventories'
|
||||
|
||||
redirect_to admin_product_import_url, notice: I18n.t(:product_import_inventory_disable)
|
||||
|
||||
@@ -61,7 +61,7 @@ module Admin
|
||||
|
||||
def destroy
|
||||
if @object.destroy
|
||||
flash[:success] = flash_message_for(@object, :successfully_removed)
|
||||
flash[:success] = Spree.t(:successfully_removed)
|
||||
respond_with(@object) do |format|
|
||||
format.html { redirect_to collection_url }
|
||||
format.js { render partial: "spree/admin/shared/destroy" }
|
||||
@@ -76,7 +76,7 @@ module Admin
|
||||
protected
|
||||
|
||||
def resource_not_found
|
||||
flash[:error] = flash_message_for(model_class.new, :not_found)
|
||||
flash[:error] = Spree.t(:not_found)
|
||||
redirect_to collection_url
|
||||
end
|
||||
|
||||
|
||||
@@ -6,7 +6,7 @@ module Admin
|
||||
class StripeAccountsController < Spree::Admin::BaseController
|
||||
def connect
|
||||
payload = params.permit(:enterprise_id).to_h
|
||||
key = Openfoodnetwork::Application.config.secret_token
|
||||
key = Rails.application.secret_key_base
|
||||
url_params = { state: JWT.encode(payload, key, 'HS256'), scope: "read_write" }
|
||||
redirect_to Stripe::OAuth.authorize_url(url_params)
|
||||
end
|
||||
|
||||
@@ -30,7 +30,7 @@ module Admin
|
||||
|
||||
status = :ok
|
||||
if @rule.destroy
|
||||
flash[:success] = Spree.t(:successfully_removed, resource: "Tag Rule")
|
||||
flash[:success] = Spree.t(:successfully_removed, resource: Spree.t(:tag_rule))
|
||||
else
|
||||
flash.now[:error] = t(".destroy_error")
|
||||
status = :internal_server_error
|
||||
|
||||
@@ -44,6 +44,8 @@ module Admin
|
||||
def load_data
|
||||
@hubs = OpenFoodNetwork::Permissions.new(spree_current_user).
|
||||
variant_override_hubs.by_name
|
||||
# Only display the ones with inventory enabled
|
||||
@hubs = @hubs.select { |p| helpers.feature?(:inventory, p) }
|
||||
|
||||
# Used in JS to look up the name of the producer of each product
|
||||
@producers = OpenFoodNetwork::Permissions.new(spree_current_user).
|
||||
|
||||
@@ -14,7 +14,7 @@ module Admin
|
||||
)
|
||||
|
||||
if @voucher.save
|
||||
flash[:success] = I18n.t(:successfully_created, resource: "Voucher")
|
||||
flash[:success] = I18n.t(:successfully_created, resource: Spree.t(:voucher))
|
||||
redirect_to edit_admin_enterprise_path(@enterprise, anchor: :vouchers_panel)
|
||||
else
|
||||
render_error
|
||||
|
||||
@@ -4,7 +4,7 @@ module ManagerInvitations
|
||||
extend ActiveSupport::Concern
|
||||
|
||||
def create_new_manager(email, enterprise)
|
||||
password = Devise.friendly_token
|
||||
password = SecureRandom.base58(64)
|
||||
new_user = Spree::User.create(email:, unconfirmed_email: email, password:)
|
||||
new_user.reset_password_token = Devise.friendly_token
|
||||
# Same time as used in Devise's lib/devise/models/recoverable.rb.
|
||||
|
||||
@@ -68,7 +68,7 @@ module Spree
|
||||
destroy_before
|
||||
|
||||
if @object.destroy
|
||||
flash[:success] = flash_message_for(@object, :successfully_removed)
|
||||
flash[:success] = Spree.t(:successfully_removed)
|
||||
end
|
||||
|
||||
redirect_to location_after_save
|
||||
|
||||
@@ -11,10 +11,10 @@ module Spree
|
||||
respond_to :html
|
||||
|
||||
PAYMENT_METHODS = %w{
|
||||
Spree::PaymentMethod::Check
|
||||
Spree::Gateway::PayPalExpress
|
||||
Spree::Gateway::StripeSCA
|
||||
}.index_with(&:constantize).freeze
|
||||
Spree::PaymentMethod::Check
|
||||
}.freeze
|
||||
|
||||
def create
|
||||
force_environment
|
||||
@@ -95,7 +95,7 @@ module Spree
|
||||
@payment_method = PaymentMethod.find(params[:pm_id])
|
||||
end
|
||||
else
|
||||
@payment_method = PAYMENT_METHODS.fetch(params[:provider_type], PaymentMethod).new
|
||||
@payment_method = PaymentMethod.new(type: params[:provider_type])
|
||||
end
|
||||
|
||||
render partial: 'provider_settings'
|
||||
@@ -117,7 +117,7 @@ module Spree
|
||||
end
|
||||
|
||||
def validate_payment_method_provider
|
||||
valid_payment_methods = Rails.application.config.spree.payment_methods.map(&:to_s)
|
||||
valid_payment_methods = PAYMENT_METHODS
|
||||
return if valid_payment_methods.include?(params[:payment_method][:type])
|
||||
|
||||
flash[:error] = Spree.t(:invalid_payment_provider)
|
||||
@@ -133,13 +133,11 @@ module Spree
|
||||
end
|
||||
|
||||
def load_providers
|
||||
providers = Gateway.providers.sort_by(&:name)
|
||||
providers = PAYMENT_METHODS.dup
|
||||
|
||||
unless show_stripe?
|
||||
providers.reject! { |provider| stripe_provider?(provider) }
|
||||
end
|
||||
providers.delete("Spree::Gateway::StripeSCA") unless show_stripe?
|
||||
|
||||
providers
|
||||
providers.map(&:constantize)
|
||||
end
|
||||
|
||||
# Show Stripe as an option if enabled, or if the
|
||||
@@ -164,10 +162,6 @@ module Spree
|
||||
@payment_method.try(:type) == "Spree::Gateway::StripeSCA"
|
||||
end
|
||||
|
||||
def stripe_provider?(provider)
|
||||
provider.name.ends_with?("StripeSCA")
|
||||
end
|
||||
|
||||
def base_params
|
||||
@base_params ||= PermittedAttributes::PaymentMethod.new(params[:payment_method]).
|
||||
call.to_h.with_indifferent_access
|
||||
|
||||
@@ -16,7 +16,7 @@ module Spree
|
||||
@url_filters = ::ProductFilters.new.extract(request.query_parameters)
|
||||
|
||||
if @object.destroy
|
||||
flash[:success] = flash_message_for(@object, :successfully_removed)
|
||||
flash[:success] = Spree.t(:successfully_removed)
|
||||
end
|
||||
# if destroy fails it won't show any errors to the user
|
||||
redirect_to spree.admin_product_product_properties_url(params[:product_id], @url_filters)
|
||||
|
||||
@@ -36,7 +36,7 @@ module Spree
|
||||
end
|
||||
|
||||
@object.touch :deleted_at
|
||||
flash[:success] = flash_message_for(@object, :successfully_removed)
|
||||
flash[:success] = Spree.t(:successfully_removed)
|
||||
|
||||
respond_with(@object) do |format|
|
||||
format.html { redirect_to collection_url }
|
||||
|
||||
@@ -5,7 +5,7 @@ module Spree
|
||||
class TaxCategoriesController < ::Admin::ResourceController
|
||||
def destroy
|
||||
if @object.destroy
|
||||
flash[:success] = flash_message_for(@object, :successfully_removed)
|
||||
flash[:success] = Spree.t(:successfully_removed)
|
||||
respond_with(@object) do |format|
|
||||
format.html { redirect_to collection_url }
|
||||
format.js { render partial: "spree/admin/shared/destroy" }
|
||||
|
||||
@@ -90,11 +90,13 @@ class VoucherAdjustmentsController < BaseController
|
||||
voucher_code: voucher_params[:voucher_code], enterprise: @order.distributor
|
||||
)
|
||||
voucher = vine_voucher_validator.validate
|
||||
errors = vine_voucher_validator.errors
|
||||
|
||||
return nil if vine_voucher_validator.errors[:not_found_voucher].present?
|
||||
return nil if errors[:not_found_voucher].present?
|
||||
|
||||
if vine_voucher_validator.errors.present?
|
||||
@order.errors.add(:voucher_code, I18n.t('checkout.errors.add_voucher_error'))
|
||||
if errors.present?
|
||||
message = errors[:invalid_voucher] || I18n.t('checkout.errors.add_voucher_error')
|
||||
@order.errors.add(:voucher_code, message)
|
||||
return nil
|
||||
end
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
class WebhookEndpointsController < BaseController
|
||||
before_action :load_resource, only: :destroy
|
||||
before_action :load_resource, only: [:destroy, :test]
|
||||
|
||||
def create
|
||||
webhook_endpoint = spree_current_user.webhook_endpoints.new(webhook_endpoint_params)
|
||||
@@ -25,12 +25,30 @@ class WebhookEndpointsController < BaseController
|
||||
redirect_to redirect_path
|
||||
end
|
||||
|
||||
def test
|
||||
at = Time.zone.now
|
||||
test_payload = Payments::WebhookPayload.test_data.to_hash
|
||||
|
||||
WebhookDeliveryJob.perform_later(@webhook_endpoint.url, "payment.completed", test_payload, at:)
|
||||
|
||||
flash[:success] = t(".success")
|
||||
respond_with do |format|
|
||||
format.turbo_stream do
|
||||
render turbo_stream: turbo_stream.update(
|
||||
:flashes, partial: "shared/flashes", locals: { flashes: flash }
|
||||
)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def load_resource
|
||||
@webhook_endpoint = spree_current_user.webhook_endpoints.find(params[:id])
|
||||
end
|
||||
|
||||
def webhook_endpoint_params
|
||||
params.require(:webhook_endpoint).permit(:url)
|
||||
params.require(:webhook_endpoint).permit(:url, :webhook_type)
|
||||
end
|
||||
|
||||
def redirect_path
|
||||
|
||||
@@ -72,7 +72,8 @@ module ApplicationHelper
|
||||
end
|
||||
end
|
||||
|
||||
# Update "v1" to invalidate existing cache key
|
||||
def cache_key_with_locale(key, locale)
|
||||
Array.wrap(key) + [locale.to_s, I18nDigests.for_locale(locale)]
|
||||
Array.wrap(key) + ["v1", locale.to_s, I18nDigests.for_locale(locale)]
|
||||
end
|
||||
end
|
||||
|
||||
@@ -63,8 +63,11 @@ module EnterprisesHelper
|
||||
url = object_url(enterprise)
|
||||
name = t(:delete)
|
||||
options = {}
|
||||
options[:class] = "delete-resource"
|
||||
options[:data] = { action: 'remove', confirm: enterprise_confirm_delete_message(enterprise) }
|
||||
options[:data] = {
|
||||
turbo: true,
|
||||
'turbo-method': 'delete',
|
||||
'turbo-confirm': enterprise_confirm_delete_message(enterprise)
|
||||
}
|
||||
link_to_with_icon 'icon-trash', name, url, options
|
||||
end
|
||||
|
||||
|
||||
@@ -147,6 +147,10 @@ module Spree
|
||||
dom_id(record, 'spree')
|
||||
end
|
||||
|
||||
def inventory_enabled?(enterprises)
|
||||
!feature?(:variant_tag, *enterprises) && feature?(:inventory, *enterprises)
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def attribute_name_for(field_name)
|
||||
|
||||
@@ -120,7 +120,7 @@ module Spree
|
||||
end
|
||||
|
||||
def cancel_event_link(order)
|
||||
event_label = I18n.t("cancel", scope: "actions")
|
||||
event_label = I18n.t("cancel_order", scope: "actions")
|
||||
button_link_to(event_label,
|
||||
fire_admin_order_url(order, e: "cancel"),
|
||||
method: :put, icon: "icon-cancel", form_id: "cancel_order_form")
|
||||
|
||||
@@ -12,7 +12,10 @@ class ApplicationRecord < ActiveRecord::Base
|
||||
self.include_root_in_json = true
|
||||
|
||||
def self.image_service
|
||||
ENV["S3_BUCKET"].present? ? :amazon_public : :local
|
||||
return :local if ENV["S3_BUCKET"].blank?
|
||||
return :amazon_public if ENV["S3_ENDPOINT"].blank?
|
||||
|
||||
:s3_compatible_storage_public
|
||||
end
|
||||
|
||||
# We might have a development environment without S3 but with a database
|
||||
|
||||
@@ -5,6 +5,18 @@ require "active_support/concern"
|
||||
module CalculatedAdjustments
|
||||
extend ActiveSupport::Concern
|
||||
|
||||
CALCULATORS = %w{
|
||||
Calculator::DefaultTax
|
||||
Calculator::FlatPercentItemTotal
|
||||
Calculator::FlatPercentPerItem
|
||||
Calculator::FlatRate
|
||||
Calculator::FlexiRate
|
||||
Calculator::None
|
||||
Calculator::PerItem
|
||||
Calculator::PriceSack
|
||||
Calculator::Weight
|
||||
}.freeze
|
||||
|
||||
included do
|
||||
has_one :calculator, as: :calculable, class_name: "Spree::Calculator", dependent: :destroy
|
||||
accepts_nested_attributes_for :calculator
|
||||
@@ -32,7 +44,11 @@ module CalculatedAdjustments
|
||||
end
|
||||
|
||||
def calculator_type=(calculator_type)
|
||||
klass = calculator_type.constantize if calculator_type
|
||||
return unless calculator_type
|
||||
|
||||
return unless CALCULATORS.include?(calculator_type)
|
||||
|
||||
klass = calculator_type.constantize
|
||||
self.calculator = klass.new if klass && !calculator.is_a?(klass)
|
||||
end
|
||||
|
||||
|
||||
@@ -50,11 +50,11 @@ class Enterprise < ApplicationRecord
|
||||
has_many :distributed_orders, class_name: 'Spree::Order',
|
||||
foreign_key: 'distributor_id',
|
||||
inverse_of: :distributor,
|
||||
dependent: :restrict_with_exception
|
||||
dependent: :restrict_with_error
|
||||
|
||||
belongs_to :address, class_name: 'Spree::Address'
|
||||
belongs_to :business_address, optional: true, class_name: 'Spree::Address', dependent: :destroy
|
||||
has_many :enterprise_fees, dependent: :restrict_with_exception
|
||||
has_many :enterprise_fees, dependent: :restrict_with_error
|
||||
has_many :enterprise_roles, dependent: :destroy
|
||||
has_many :users, through: :enterprise_roles
|
||||
belongs_to :owner, class_name: 'Spree::User',
|
||||
@@ -62,21 +62,22 @@ class Enterprise < ApplicationRecord
|
||||
has_many :distributor_payment_methods,
|
||||
inverse_of: :distributor,
|
||||
foreign_key: :distributor_id,
|
||||
dependent: :restrict_with_exception
|
||||
dependent: :restrict_with_error
|
||||
has_many :distributor_shipping_methods,
|
||||
inverse_of: :distributor,
|
||||
foreign_key: :distributor_id,
|
||||
dependent: :restrict_with_exception
|
||||
dependent: :restrict_with_error
|
||||
has_many :payment_methods, through: :distributor_payment_methods
|
||||
has_many :shipping_methods, through: :distributor_shipping_methods
|
||||
has_many :customers, dependent: :destroy
|
||||
has_many :inventory_items, dependent: :destroy
|
||||
has_many :tag_rules, dependent: :destroy
|
||||
has_one :stripe_account, dependent: :destroy
|
||||
has_many :vouchers, dependent: :restrict_with_exception
|
||||
has_many :vouchers, dependent: :restrict_with_error
|
||||
has_many :connected_apps, dependent: :destroy
|
||||
has_many :dfc_permissions, dependent: :destroy
|
||||
has_one :custom_tab, dependent: :destroy
|
||||
has_one :semantic_link, as: :subject, dependent: :delete
|
||||
|
||||
delegate :latitude, :longitude, :city, :state_name, to: :address
|
||||
|
||||
@@ -110,14 +111,14 @@ class Enterprise < ApplicationRecord
|
||||
end
|
||||
|
||||
validates :logo,
|
||||
processable_image: true,
|
||||
content_type: %r{\Aimage/(png|jpeg|gif|jpg|svg\+xml|webp)\Z}
|
||||
processable_file: true,
|
||||
content_type: ::Spree::Image::ACCEPTED_CONTENT_TYPES
|
||||
validates :promo_image,
|
||||
processable_image: true,
|
||||
content_type: %r{\Aimage/(png|jpeg|gif|jpg|svg\+xml|webp)\Z}
|
||||
processable_file: true,
|
||||
content_type: ::Spree::Image::ACCEPTED_CONTENT_TYPES
|
||||
validates :white_label_logo,
|
||||
processable_image: true,
|
||||
content_type: %r{\Aimage/(png|jpeg|gif|jpg|svg\+xml|webp)\Z}
|
||||
processable_file: true,
|
||||
content_type: ::Spree::Image::ACCEPTED_CONTENT_TYPES
|
||||
validates :terms_and_conditions, content_type: {
|
||||
in: "application/pdf",
|
||||
message: I18n.t(:enterprise_terms_and_conditions_type_error),
|
||||
|
||||
@@ -29,11 +29,11 @@ class EnterpriseGroup < ApplicationRecord
|
||||
has_one_attached :promo_image, service: image_service
|
||||
|
||||
validates :logo,
|
||||
processable_image: true,
|
||||
content_type: %r{\Aimage/(png|jpeg|gif|jpg|svg\+xml|webp)\Z}
|
||||
processable_file: true,
|
||||
content_type: ::Spree::Image::ACCEPTED_CONTENT_TYPES
|
||||
validates :promo_image,
|
||||
processable_image: true,
|
||||
content_type: %r{\Aimage/(png|jpeg|gif|jpg|svg\+xml|webp)\Z}
|
||||
processable_file: true,
|
||||
content_type: ::Spree::Image::ACCEPTED_CONTENT_TYPES
|
||||
|
||||
scope :by_position, -> { order('position ASC') }
|
||||
scope :on_front_page, -> { where(on_front_page: true) }
|
||||
|
||||
@@ -31,7 +31,6 @@ module Spree
|
||||
preference :admin_products_per_page, :integer, default: 10
|
||||
# Should only be true if you don't need to track inventory
|
||||
preference :allow_backorder_shipping, :boolean, default: false
|
||||
preference :allow_checkout_on_gateway_error, :boolean, default: false
|
||||
preference :allow_guest_checkout, :boolean, default: true
|
||||
preference :currency_decimal_mark, :string, default: "."
|
||||
preference :currency_symbol_position, :string, default: "before"
|
||||
|
||||
@@ -2,6 +2,8 @@
|
||||
|
||||
module Spree
|
||||
class Image < Asset
|
||||
ACCEPTED_CONTENT_TYPES = %r{\Aimage/(png|jpeg|gif|jpg|svg\+xml|webp)\Z}
|
||||
|
||||
has_one_attached :attachment, service: image_service do |attachment|
|
||||
attachment.variant :mini, resize_to_fill: [48, 48]
|
||||
attachment.variant :small, resize_to_fill: [227, 227]
|
||||
@@ -11,8 +13,8 @@ module Spree
|
||||
|
||||
validates :attachment,
|
||||
attached: true,
|
||||
processable_image: true,
|
||||
content_type: %r{\Aimage/(png|jpeg|gif|jpg|svg\+xml|webp)\Z}
|
||||
processable_file: true,
|
||||
content_type: ACCEPTED_CONTENT_TYPES
|
||||
validate :no_attachment_errors
|
||||
|
||||
def self.default_image_url(size)
|
||||
|
||||
@@ -437,18 +437,13 @@ module Spree
|
||||
#
|
||||
# Returns:
|
||||
# - true if all pending_payments processed successfully
|
||||
# - true if a payment failed, ie. raised a GatewayError
|
||||
# which gets rescued and converted to TRUE when
|
||||
# :allow_checkout_gateway_error is set to true
|
||||
# - false if a payment failed, ie. raised a GatewayError
|
||||
# which gets rescued and converted to FALSE when
|
||||
# :allow_checkout_on_gateway_error is set to false
|
||||
# which gets rescued and converted to FALSE
|
||||
#
|
||||
def process_payments!
|
||||
process_each_payment(&:process!)
|
||||
rescue Core::GatewayError => e
|
||||
result = !!Spree::Config[:allow_checkout_on_gateway_error]
|
||||
errors.add(:base, e.message) && (return result)
|
||||
errors.add(:base, e.message) && (return false)
|
||||
end
|
||||
|
||||
def process_payments_offline!
|
||||
|
||||
@@ -101,6 +101,24 @@ module Spree
|
||||
end
|
||||
|
||||
after_transition to: :completed, do: :set_captured_at
|
||||
after_transition do |payment, transition|
|
||||
# Catch any exceptions to prevent any rollback potentially
|
||||
# preventing payment from going through
|
||||
ActiveSupport::Notifications.instrument(
|
||||
"ofn.payment_transition", payment: payment, event: transition.to
|
||||
)
|
||||
rescue StandardError => e
|
||||
Rails.logger.fatal "ActiveSupport::Notification.instrument failed params: " \
|
||||
"<event_type:ofn.payment_transition> " \
|
||||
"<payment_id:#{payment.id}> " \
|
||||
"<event:#{transition.to}>"
|
||||
Alert.raise(
|
||||
e,
|
||||
metadata: {
|
||||
event_tye: "ofn.payment_transition", payment_id: payment.id, event: transition.to
|
||||
}
|
||||
)
|
||||
end
|
||||
end
|
||||
|
||||
def money
|
||||
|
||||
@@ -52,10 +52,6 @@ module Spree
|
||||
.where(environment: [Rails.env, "", nil])
|
||||
}
|
||||
|
||||
def self.providers
|
||||
Rails.application.config.spree.payment_methods
|
||||
end
|
||||
|
||||
def configured?
|
||||
!stripe? || stripe_configured?
|
||||
end
|
||||
@@ -93,8 +89,8 @@ module Spree
|
||||
type.demodulize.downcase
|
||||
end
|
||||
|
||||
def self.find_with_destroyed(*args)
|
||||
unscoped { find(*args) }
|
||||
def self.find_with_destroyed(*)
|
||||
unscoped { find(*) }
|
||||
end
|
||||
|
||||
def payment_profiles_supported?
|
||||
@@ -118,8 +114,8 @@ module Spree
|
||||
end
|
||||
|
||||
def self.clean_name
|
||||
i18n_key = "spree.admin.payment_methods.providers.#{name.demodulize.downcase}"
|
||||
I18n.t(i18n_key)
|
||||
scope = "spree.admin.payment_methods.providers"
|
||||
I18n.t(name.demodulize.downcase, scope:)
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
@@ -2,5 +2,11 @@
|
||||
|
||||
# Records a webhook url to send notifications to
|
||||
class WebhookEndpoint < ApplicationRecord
|
||||
WEBHOOK_TYPES = %w(order_cycle_opened payment_status_changed).freeze
|
||||
|
||||
validates :url, presence: true
|
||||
validates :webhook_type, presence: true, inclusion: { in: WEBHOOK_TYPES }
|
||||
|
||||
scope :order_cycle_opened, -> { where(webhook_type: "order_cycle_opened") }
|
||||
scope :payment_status, -> { where(webhook_type: "payment_status_changed") }
|
||||
end
|
||||
|
||||
@@ -11,7 +11,9 @@ class ImageImporter
|
||||
|
||||
image = Spree::Image.create do |img|
|
||||
PrivateAddressCheck.only_public_connections do
|
||||
img.attachment.attach(io: valid_url.open, filename:, metadata:)
|
||||
io = valid_url.open
|
||||
content_type = Marcel::MimeType.for(io)
|
||||
img.attachment.attach(io:, filename:, metadata:, content_type:)
|
||||
end
|
||||
end
|
||||
product.image = image if image
|
||||
|
||||
@@ -9,7 +9,7 @@ module OrderCycles
|
||||
def create
|
||||
oc = @original_order_cycle.dup
|
||||
oc.name = I18n.t("models.order_cycle.cloned_order_cycle_name", order_cycle: oc.name)
|
||||
oc.orders_open_at = oc.orders_close_at = oc.mails_sent = oc.processed_at = nil
|
||||
oc.orders_open_at = oc.orders_close_at = oc.mails_sent = oc.processed_at = oc.opened_at = nil
|
||||
oc.coordinator_fee_ids = @original_order_cycle.coordinator_fee_ids
|
||||
oc.preferred_product_selection_from_coordinator_inventory_only =
|
||||
@original_order_cycle.preferred_product_selection_from_coordinator_inventory_only
|
||||
|
||||
@@ -11,10 +11,12 @@ module OrderCycles
|
||||
.merge(coordinator_name: order_cycle.coordinator.name)
|
||||
|
||||
# Endpoints for coordinator owner
|
||||
webhook_endpoints = order_cycle.coordinator.owner.webhook_endpoints
|
||||
webhook_endpoints = order_cycle.coordinator.owner.webhook_endpoints.order_cycle_opened
|
||||
|
||||
# Plus unique endpoints for distributor owners (ignore duplicates)
|
||||
webhook_endpoints |= order_cycle.distributors.map(&:owner).flat_map(&:webhook_endpoints)
|
||||
webhook_endpoints |= order_cycle.distributors.map(&:owner).flat_map { |owner|
|
||||
owner.webhook_endpoints.order_cycle_opened
|
||||
}
|
||||
|
||||
webhook_endpoints.each do |endpoint|
|
||||
WebhookDeliveryJob.perform_later(endpoint.url, event, webhook_payload, at:)
|
||||
|
||||
13
app/services/payments/status_changed_listener_service.rb
Normal file
13
app/services/payments/status_changed_listener_service.rb
Normal file
@@ -0,0 +1,13 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
# Called by "ActiveSupport::Notifications" when an "ofn.payment_transition" occurs
|
||||
# Event originate from Spree::Payment event machine
|
||||
#
|
||||
module Payments
|
||||
class StatusChangedListenerService
|
||||
def call(_name, started, _finished, _unique_id, payload)
|
||||
event = "payment.#{payload[:event]}"
|
||||
Payments::WebhookService.create_webhook_job(payment: payload[:payment], event:, at: started)
|
||||
end
|
||||
end
|
||||
end
|
||||
84
app/services/payments/webhook_payload.rb
Normal file
84
app/services/payments/webhook_payload.rb
Normal file
@@ -0,0 +1,84 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
module Payments
|
||||
class WebhookPayload
|
||||
def initialize(payment:, order:, enterprise:)
|
||||
@payment = payment
|
||||
@order = order
|
||||
@enterprise = enterprise
|
||||
end
|
||||
|
||||
def to_hash
|
||||
{
|
||||
payment: @payment.slice(:updated_at, :amount, :state),
|
||||
enterprise: @enterprise.slice(:abn, :acn, :name)
|
||||
.merge(address: @enterprise.address.slice(:address1, :address2, :city, :zipcode)),
|
||||
order: @order.slice(:total, :currency).merge(line_items: line_items)
|
||||
}.with_indifferent_access
|
||||
end
|
||||
|
||||
def self.test_data
|
||||
new(payment: test_payment, order: test_order, enterprise: test_enterprise)
|
||||
end
|
||||
|
||||
def self.test_payment
|
||||
{
|
||||
updated_at: Time.zone.now,
|
||||
amount: 0.00,
|
||||
state: "completed"
|
||||
}
|
||||
end
|
||||
|
||||
def self.test_order
|
||||
order = Spree::Order.new(
|
||||
total: 0.00,
|
||||
currency: "AUD",
|
||||
)
|
||||
|
||||
tax_category = Spree::TaxCategory.new(name: "VAT")
|
||||
product = Spree::Product.new(name: "Test product")
|
||||
Spree::Variant.new(product:, display_name: "")
|
||||
order.line_items << Spree::LineItem.new(
|
||||
quantity: 1,
|
||||
price: 20.00,
|
||||
tax_category:,
|
||||
product:,
|
||||
unit_presentation: "1kg"
|
||||
)
|
||||
|
||||
order
|
||||
end
|
||||
|
||||
def self.test_enterprise
|
||||
enterprise = Enterprise.new(
|
||||
abn: "65797115831",
|
||||
acn: "",
|
||||
name: "TEST Enterprise",
|
||||
)
|
||||
enterprise.address = Spree::Address.new(
|
||||
address1: "1 testing street",
|
||||
address2: "",
|
||||
city: "TestCity",
|
||||
zipcode: "1234"
|
||||
)
|
||||
|
||||
enterprise
|
||||
end
|
||||
|
||||
private_class_method :test_payment, :test_order, :test_enterprise
|
||||
|
||||
private
|
||||
|
||||
def line_items
|
||||
@order.line_items.map do |li|
|
||||
li.slice(:quantity, :price)
|
||||
.merge(
|
||||
tax_category_name: li.tax_category&.name,
|
||||
product_name: li.product.name,
|
||||
name_to_display: li.display_name,
|
||||
unit_to_display: li.unit_presentation
|
||||
)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
30
app/services/payments/webhook_service.rb
Normal file
30
app/services/payments/webhook_service.rb
Normal file
@@ -0,0 +1,30 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
# Create a webhook payload for a payment status event.
|
||||
# The payload will be delivered asynchronously.
|
||||
|
||||
module Payments
|
||||
class WebhookService
|
||||
def self.create_webhook_job(payment:, event:, at:)
|
||||
order = payment.order
|
||||
payload = WebhookPayload.new(payment:, order:, enterprise: order.distributor).to_hash
|
||||
|
||||
coordinator = payment.order.order_cycle.coordinator
|
||||
webhook_urls(coordinator).each do |url|
|
||||
WebhookDeliveryJob.perform_later(url, event, payload, at:)
|
||||
end
|
||||
end
|
||||
|
||||
def self.webhook_urls(coordinator)
|
||||
# url for coordinator owner
|
||||
webhook_urls = coordinator.owner.webhook_endpoints.payment_status.pluck(:url)
|
||||
|
||||
# plus url for coordinator manager (ignore duplicate)
|
||||
users_webhook_urls = coordinator.users.flat_map do |user|
|
||||
user.webhook_endpoints.payment_status.pluck(:url)
|
||||
end
|
||||
|
||||
webhook_urls | users_webhook_urls
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -44,7 +44,7 @@ class ProductsRenderer
|
||||
|
||||
paginated_products = paginate(results)
|
||||
|
||||
if options[:inventory_enabled]
|
||||
if inventory_enabled?
|
||||
# Scope results with variant_overrides
|
||||
paginated_products.each { |product| product_scoper.scope(product) }
|
||||
end
|
||||
@@ -123,7 +123,7 @@ class ProductsRenderer
|
||||
includes(:default_price, :product).
|
||||
where(product_id: products)
|
||||
|
||||
if options[:inventory_enabled]
|
||||
if inventory_enabled?
|
||||
# Scope results with variant_overrides
|
||||
scoper = OpenFoodNetwork::ScopeVariantToHub.new(distributor)
|
||||
variants = variants.each { |v| scoper.scope(v) }
|
||||
@@ -143,4 +143,8 @@ class ProductsRenderer
|
||||
vs[v.product_id] << v
|
||||
end
|
||||
end
|
||||
|
||||
def inventory_enabled?
|
||||
options[:inventory_enabled] && !options[:variant_tag_enabled]
|
||||
end
|
||||
end
|
||||
|
||||
@@ -2,6 +2,11 @@
|
||||
|
||||
module Vine
|
||||
class VoucherValidatorService
|
||||
VINE_ERRORS = {
|
||||
# https://github.com/openfoodfoundation/vine/blob/main/app/Enums/ApiResponse.php
|
||||
"This voucher has expired." => :expired,
|
||||
}.freeze
|
||||
|
||||
attr_reader :voucher_code, :errors
|
||||
|
||||
def initialize(voucher_code:, enterprise:)
|
||||
@@ -42,8 +47,10 @@ module Vine
|
||||
end
|
||||
|
||||
def handle_errors(response)
|
||||
if response[:status] == 400
|
||||
errors[:invalid_voucher] = I18n.t("vine_voucher_validator_service.errors.invalid_voucher")
|
||||
if [400, 409].include?(response[:status])
|
||||
message = response[:body] && JSON.parse(response[:body]).dig("meta", "message")
|
||||
key = VINE_ERRORS.fetch(message, :invalid_voucher)
|
||||
errors[:invalid_voucher] = I18n.t("vine_voucher_validator_service.errors.#{key}")
|
||||
elsif response[:status] == 404
|
||||
errors[:not_found_voucher] =
|
||||
I18n.t("vine_voucher_validator_service.errors.not_found_voucher")
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
= form_with url: main_app.import_admin_dfc_product_imports_path, html: { "data-controller": "checked" } do |form|
|
||||
-# This is a very inefficient way of holding a json blob. Maybe base64 encode or store as a temporary file
|
||||
= form.hidden_field :enterprise_id, value: @enterprise.id
|
||||
= form.hidden_field :catalog_json, value: @catalog_json
|
||||
= form.hidden_field :catalog_json, value: @catalog_data.to_json
|
||||
|
||||
%table
|
||||
%thead
|
||||
|
||||
@@ -22,7 +22,7 @@
|
||||
%tbody
|
||||
= f.fields_for :collection do |enterprise_form|
|
||||
- enterprise = enterprise_form.object
|
||||
%tr{class: "enterprise-#{enterprise.id}"}
|
||||
%tr{class: "enterprise-#{enterprise.id}", id: "resource-#{enterprise.id}"}
|
||||
%td= link_to enterprise.name, main_app.edit_admin_enterprise_path(enterprise)
|
||||
%td
|
||||
= enterprise_form.check_box :is_primary_producer
|
||||
|
||||
4
app/views/admin/enterprises/destroy.turbo_stream.haml
Normal file
4
app/views/admin/enterprises/destroy.turbo_stream.haml
Normal file
@@ -0,0 +1,4 @@
|
||||
- unless flash[:error]
|
||||
= turbo_stream.remove "resource-#{@object.id}"
|
||||
= turbo_stream.append "flashes" do
|
||||
= render(partial: 'admin/shared/flashes', locals: { flashes: flash })
|
||||
@@ -20,7 +20,6 @@
|
||||
:plain
|
||||
<solid-permissioning
|
||||
data-src="#{DfcProvider::Engine.routes.url_helpers.enterprise_platforms_url(@enterprise.id)}"
|
||||
scopes-uri="https://cdn.startinblox.com/owl/dfc/taxonomies/scopes.jsonld"
|
||||
noRouter
|
||||
auto-lang
|
||||
lang="en"
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
%h3= t('.title')
|
||||
|
||||
= form_for [main_app, :admin, @order_cycle] do |f|
|
||||
- if feature?(:inventory, @order_cycle.coordinator)
|
||||
- if inventory_enabled?(@order_cycle.coordinator)
|
||||
.row
|
||||
.three.columns.alpha
|
||||
= f.label "enterprise_preferred_product_selection_from_coordinator_inventory_only", t('admin.order_cycles.edit.choose_products_from')
|
||||
|
||||
@@ -18,7 +18,7 @@
|
||||
%span{ "ofn-with-tip": '{{ orderCycle.producerNames }}', "ng-show": 'orderCycle.producers.length > 3' }
|
||||
{{ orderCycle.producers.length }}
|
||||
= t('.suppliers')
|
||||
%span{ "ng-hide": 'orderCycle.producers.length > 3', "ng-bind": 'orderCycle.producerNames' }
|
||||
%span{ "ng-hide": 'orderCycle.producers.length > 3', "ng-bind-html": 'orderCycle.producerNames' }
|
||||
%td.coordinator{ "ng-show": 'columns.coordinator.visible', "ng-bind-html": 'orderCycle.coordinator.name' }
|
||||
%td.shops{ "ng-show": 'columns.shops.visible' }
|
||||
%span{ "ofn-with-tip": '{{ orderCycle.shopNames }}', "ng-show": 'orderCycle.shops.length > 3' }
|
||||
|
||||
@@ -7,5 +7,6 @@
|
||||
#no-products-actions
|
||||
%a{ href: "/admin/products/new", class: "button icon-plus", icon: "icon-plus" }
|
||||
= t(:new_product)
|
||||
%a{ href: "/admin/products/import", class: "button icon-upload secondary", icon: "icon-upload" }
|
||||
%a{ href: admin_product_import_path, class: "button icon-upload secondary", icon: "icon-upload" }
|
||||
= t(".import_products")
|
||||
|
||||
|
||||
@@ -81,7 +81,7 @@
|
||||
= error_message_on variant, :tax_category
|
||||
- if variant_tag_enabled?(spree_current_user)
|
||||
%td.col-tags.field.naked_inputs
|
||||
= render TagListInputComponent.new(name: f.field_name(:tag_list), tags: variant.tag_list, autocomplete_url: variant_tag_rules_admin_tag_rules_path(enterprise_id: variant.supplier_id), placeholder: t('.add_a_tag'), aria_label: t('admin.products_page.columns.tags'))
|
||||
= render TagListInputComponent.new(name: f.field_name(:tag_list), tags: variant.tag_list, autocomplete_url: variant_tag_rules_admin_tag_rules_path(enterprise_id: variant.supplier_id), placeholder: t('.add_a_tag'), aria_label: t('admin.products_page.columns.tags')) if feature?(:variant_tag, variant.supplier)
|
||||
%td.col-inherits_properties.align-left
|
||||
-# empty
|
||||
%td.align-right
|
||||
|
||||
@@ -13,12 +13,12 @@
|
||||
- else
|
||||
= favicon_link_tag "/favicon-staging.ico"
|
||||
%link{href: "https://fonts.googleapis.com/css?family=Roboto:400,300italic,400italic,300,700,700italic|Oswald:300,400,700", rel: "stylesheet", type: "text/css"}
|
||||
%link{href: asset_pack_path("media/fonts/OFN-v2.woff"), rel: "preload", as: "font", crossorigin: "anonymous"}
|
||||
%link{href: asset_pack_path("static/OFN-v2.woff"), rel: "preload", as: "font", crossorigin: "anonymous"}
|
||||
= render "layouts/matomo_tag"
|
||||
= language_meta_tags
|
||||
|
||||
= stylesheet_pack_tag "darkswarm", "data-turbo-track": "reload"
|
||||
= javascript_pack_tag "application", "data-turbo-track": "reload"
|
||||
= stylesheet_pack_tag "darkswarm", "data-turbo-track": "reload", media: "screen"
|
||||
= javascript_pack_tag "application", "data-turbo-track": "reload", defer: false # do not use defer because our javascript currently depend on order of execution of loaded script.
|
||||
|
||||
= render "layouts/shopfront_script" if @shopfront_layout
|
||||
= render "layouts/bugsnag_js"
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
%meta{:content => "text/html; charset=UTF-8", "http-equiv" => "Content-Type"}/
|
||||
%title
|
||||
= Spree::Config[:site_name]
|
||||
= stylesheet_link_tag 'mail'
|
||||
= stylesheet_link_tag 'mail', media: "screen"
|
||||
%body{:bgcolor => "#FFFFFF" }
|
||||
- unless @hide_ofn_navigation
|
||||
%table.head-wrap
|
||||
|
||||
@@ -14,9 +14,9 @@
|
||||
= render "layouts/matomo_tag"
|
||||
= language_meta_tags
|
||||
|
||||
= stylesheet_pack_tag "darkswarm"
|
||||
= stylesheet_pack_tag "darkswarm", media: "screen"
|
||||
= javascript_include_tag "darkswarm/all"
|
||||
= javascript_pack_tag "application"
|
||||
= javascript_pack_tag "application", defer: false # do not use defer because our javascript currently depend on order of execution of loaded script.
|
||||
|
||||
= csrf_meta_tags
|
||||
|
||||
|
||||
@@ -25,7 +25,7 @@
|
||||
= render "spree/admin/shared/translations"
|
||||
= render "spree/admin/shared/routes"
|
||||
|
||||
= javascript_pack_tag "admin", "data-turbo-track": "reload"
|
||||
= javascript_pack_tag "admin", "data-turbo-track": "reload", defer: false # do not use defer because our javascript currently depend on order of execution of loaded script.
|
||||
|
||||
%script
|
||||
= raw "var AUTH_TOKEN = \"#{form_authenticity_token}\";"
|
||||
|
||||
@@ -10,24 +10,5 @@
|
||||
%th= t('.url.header')
|
||||
%th.actions
|
||||
%tbody
|
||||
-# Existing endpoints
|
||||
- @user.webhook_endpoints.each do |webhook_endpoint|
|
||||
%tr
|
||||
%td= t('.event_types.order_cycle_opened') # For now, we only support one type.
|
||||
%td= webhook_endpoint.url
|
||||
%td.actions
|
||||
- if webhook_endpoint.persisted?
|
||||
= button_to account_webhook_endpoint_path(webhook_endpoint), method: :delete,
|
||||
class: "tiny alert no-margin",
|
||||
data: { confirm: I18n.t(:are_you_sure)} do
|
||||
= I18n.t(:delete)
|
||||
|
||||
-# Create new
|
||||
- if @user.webhook_endpoints.empty? # Only one allowed for now.
|
||||
%tr
|
||||
%td= t('.event_types.order_cycle_opened') # For now, we only support one type.
|
||||
%td
|
||||
= form_for(@user.webhook_endpoints.build, url: account_webhook_endpoints_path, id: 'new_webhook_endpoint') do |f|
|
||||
= f.url_field :url, placeholder: t('.url.create_placeholder'), required: true, size: 64
|
||||
%td.actions
|
||||
= button_tag t(:create), class: 'button primary tiny no-margin', form: 'new_webhook_endpoint'
|
||||
= render WebhookEndpointFormComponent.new(webhooks: @user.webhook_endpoints.order_cycle_opened, webhook_type: "order_cycle_opened")
|
||||
= render WebhookEndpointFormComponent.new(webhooks: @user.webhook_endpoints.payment_status, webhook_type: "payment_status_changed")
|
||||
|
||||
@@ -184,8 +184,9 @@
|
||||
}
|
||||
|
||||
// Hide columns
|
||||
$columns: "image", "name", "sku", "unit_scale", "unit", "price", "on_hand", "producer",
|
||||
"category", "tax_category", "tags", "inherits_properties";
|
||||
$columns:
|
||||
"image", "name", "sku", "unit_scale", "unit", "price", "on_hand", "producer", "category",
|
||||
"tax_category", "tags", "inherits_properties";
|
||||
@each $col in $columns {
|
||||
&.hide-#{$col} {
|
||||
.col-#{$col} {
|
||||
|
||||
@@ -2,19 +2,19 @@
|
||||
// While in feature-toggle, we inherit all files from old admin design.
|
||||
// Individual files may be copied in order to replace the old files.
|
||||
|
||||
@import "vendor/assets/stylesheets/normalize";
|
||||
@import "vendor/assets/stylesheets/responsive-tables";
|
||||
@import "vendor/assets/stylesheets/jquery.powertip";
|
||||
@import "~jquery-ui/themes/base/core";
|
||||
@import "~jquery-ui/themes/base/button";
|
||||
@import "~jquery-ui/themes/base/resizable";
|
||||
@import "vendor/assets/stylesheets/jquery-ui-theme";
|
||||
@import "~jquery-ui/themes/base/dialog";
|
||||
@import "assets/stylesheets/normalize";
|
||||
@import "assets/stylesheets/responsive-tables";
|
||||
@import "assets/stylesheets/jquery.powertip";
|
||||
@import "jquery-ui/themes/base/core";
|
||||
@import "jquery-ui/themes/base/button";
|
||||
@import "jquery-ui/themes/base/resizable";
|
||||
@import "assets/stylesheets/jquery-ui-theme";
|
||||
@import "jquery-ui/themes/base/dialog";
|
||||
@import "../shared/ng-tags-input.min";
|
||||
@import "vendor/assets/stylesheets/select2.css.scss";
|
||||
@import "~flatpickr/dist/flatpickr";
|
||||
@import "~flatpickr/dist/themes/material_blue";
|
||||
@import "~shortcut-buttons-flatpickr/dist/themes/light";
|
||||
@import "assets/stylesheets/select2";
|
||||
@import "flatpickr/dist/flatpickr";
|
||||
@import "flatpickr/dist/themes/material_blue";
|
||||
@import "shortcut-buttons-flatpickr/dist/themes/light";
|
||||
|
||||
@import "../admin/globals/functions";
|
||||
@import "globals/palette"; // admin_v3
|
||||
@@ -123,13 +123,13 @@
|
||||
@import "shared/question-mark-icon";
|
||||
@import "../admin/question-mark-tooltip";
|
||||
|
||||
@import "~tom-select/src/scss/tom-select.default";
|
||||
@import "tom-select/src/scss/tom-select.default";
|
||||
@import "components/tom_select"; // admin_v3
|
||||
|
||||
@import "app/components/modal_component/modal_component";
|
||||
@import "app/components/vertical_ellipsis_menu_component/vertical_ellipsis_menu_component"; // admin_v3 and only V3
|
||||
@import "app/components/tag_list_input_component/tag_list_input_component";
|
||||
@import "app/webpacker/css/admin/trix.scss";
|
||||
@import "modal_component/modal_component";
|
||||
@import "vertical_ellipsis_menu_component/vertical_ellipsis_menu_component"; // admin_v3 and only V3
|
||||
@import "tag_list_input_component/tag_list_input_component";
|
||||
@import "admin/trix";
|
||||
|
||||
@import "terms_of_service_banner"; // admin_v3
|
||||
|
||||
|
||||
@@ -9,7 +9,8 @@
|
||||
}
|
||||
}
|
||||
|
||||
.saved_cards, .no_cards {
|
||||
.saved_cards,
|
||||
.no_cards {
|
||||
margin-bottom: 1em;
|
||||
}
|
||||
|
||||
@@ -26,7 +27,7 @@
|
||||
}
|
||||
}
|
||||
|
||||
.authorised_shops{
|
||||
.authorised_shops {
|
||||
table {
|
||||
width: 100%;
|
||||
}
|
||||
@@ -39,7 +40,9 @@
|
||||
a {
|
||||
color: $clr-brick;
|
||||
|
||||
&:hover, &:active, &:focus {
|
||||
&:hover,
|
||||
&:active,
|
||||
&:focus {
|
||||
color: $clr-brick-med-bright;
|
||||
}
|
||||
}
|
||||
@@ -60,7 +63,8 @@
|
||||
}
|
||||
}
|
||||
|
||||
i.ofn-i_059-producer, i.ofn-i_060-producer-reversed {
|
||||
i.ofn-i_059-producer,
|
||||
i.ofn-i_060-producer-reversed {
|
||||
font-size: 3rem;
|
||||
display: inline-block;
|
||||
margin-right: 0.25rem;
|
||||
@@ -92,7 +96,8 @@
|
||||
visibility: hidden;
|
||||
}
|
||||
|
||||
.transaction-group {}
|
||||
.transaction-group {
|
||||
}
|
||||
|
||||
table {
|
||||
border-radius: $radius-medium $radius-medium 0 0;
|
||||
@@ -161,6 +166,15 @@ table {
|
||||
//
|
||||
// Unfortunately we can't use Scss's interpolation
|
||||
// https://sass-lang.com/documentation/interpolation. We're using a too old version perhaps?
|
||||
right: calc(12px + 2*2px + 2*1px);
|
||||
right: calc(12px + 2 * 2px + 2 * 1px);
|
||||
}
|
||||
}
|
||||
|
||||
// Webhook Endpoints
|
||||
td.endpoints-actions {
|
||||
display: flex;
|
||||
|
||||
form {
|
||||
padding-right: $padding-small;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
|
||||
@import 'vendor/assets/stylesheets/autocomplete';
|
||||
@import 'vendor/assets/stylesheets/leaflet';
|
||||
@import 'assets/stylesheets/autocomplete';
|
||||
@import 'assets/stylesheets/leaflet';
|
||||
@import 'variables';
|
||||
@import '../shared/variables/layout';
|
||||
@import '../shared/utilities';
|
||||
@import '~foundation-sites/scss/foundation';
|
||||
@import 'foundation-sites/scss/foundation';
|
||||
|
||||
@import 'big-input';
|
||||
@import 'branding';
|
||||
@@ -77,4 +77,4 @@ ofn-modal {
|
||||
@import "../shared/question-mark-icon";
|
||||
@import '../admin/shared/scroll_bar';
|
||||
|
||||
@import 'app/components/modal_component/modal_component';
|
||||
@import 'modal_component/modal_component';
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
@import "~foundation-sites/scss/foundation/components/global";
|
||||
@import "foundation-sites/scss/foundation/components/global";
|
||||
|
||||
// Brand guide colours:
|
||||
// International: #81c26e
|
||||
|
||||
@@ -1,72 +1,6 @@
|
||||
module.exports = function(api) {
|
||||
var validEnv = ['development', 'test', 'production']
|
||||
var currentEnv = api.env()
|
||||
var isDevelopmentEnv = api.env('development')
|
||||
var isProductionEnv = api.env('production')
|
||||
var isTestEnv = api.env('test')
|
||||
module.exports = function (api) {
|
||||
const defaultConfigFunc = require("shakapacker/package/babel/preset.js");
|
||||
const resultConfig = defaultConfigFunc(api);
|
||||
|
||||
if (!validEnv.includes(currentEnv)) {
|
||||
throw new Error(
|
||||
'Please specify a valid `NODE_ENV` or ' +
|
||||
'`BABEL_ENV` environment variables. Valid values are "development", ' +
|
||||
'"test", and "production". Instead, received: ' +
|
||||
JSON.stringify(currentEnv) +
|
||||
'.'
|
||||
)
|
||||
}
|
||||
|
||||
return {
|
||||
presets: [
|
||||
isTestEnv && [
|
||||
'@babel/preset-env',
|
||||
{
|
||||
targets: {
|
||||
node: 'current'
|
||||
}
|
||||
}
|
||||
],
|
||||
(isProductionEnv || isDevelopmentEnv) && [
|
||||
'@babel/preset-env',
|
||||
{
|
||||
forceAllTransforms: true,
|
||||
useBuiltIns: 'entry',
|
||||
corejs: 3,
|
||||
modules: false,
|
||||
exclude: ['transform-typeof-symbol']
|
||||
}
|
||||
]
|
||||
].filter(Boolean),
|
||||
plugins: [
|
||||
'babel-plugin-macros',
|
||||
'@babel/plugin-syntax-dynamic-import',
|
||||
isTestEnv && 'babel-plugin-dynamic-import-node',
|
||||
'@babel/plugin-transform-destructuring',
|
||||
[
|
||||
'@babel/plugin-proposal-class-properties',
|
||||
{
|
||||
loose: true
|
||||
}
|
||||
],
|
||||
[
|
||||
'@babel/plugin-proposal-object-rest-spread',
|
||||
{
|
||||
useBuiltIns: true
|
||||
}
|
||||
],
|
||||
[
|
||||
'@babel/plugin-transform-runtime',
|
||||
{
|
||||
helpers: false
|
||||
}
|
||||
],
|
||||
[
|
||||
'@babel/plugin-transform-regenerator',
|
||||
{
|
||||
async: false
|
||||
}
|
||||
],
|
||||
["@babel/plugin-proposal-private-property-in-object", { "loose": true }],
|
||||
["@babel/plugin-proposal-private-methods", { "loose": true }]
|
||||
].filter(Boolean)
|
||||
}
|
||||
}
|
||||
return resultConfig;
|
||||
};
|
||||
|
||||
@@ -16,7 +16,7 @@ FileUtils.chdir APP_ROOT do
|
||||
# Add necessary setup steps to this file.
|
||||
|
||||
puts "== Installing dependencies =="
|
||||
system! "script/install-bundler"
|
||||
|
||||
# Check first (it's quicker), then install new gems if necessary
|
||||
system("bundle check 2> /dev/null") || system!(BUNDLE_ENV, "bundle install")
|
||||
|
||||
|
||||
@@ -1,18 +1,13 @@
|
||||
#!/usr/bin/env ruby
|
||||
|
||||
ENV["RAILS_ENV"] ||= ENV["RACK_ENV"] || "development"
|
||||
ENV["NODE_ENV"] ||= "development"
|
||||
ENV["NODE_OPTIONS"] ||= "--openssl-legacy-provider"
|
||||
|
||||
require "pathname"
|
||||
ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../../Gemfile",
|
||||
Pathname.new(__FILE__).realpath)
|
||||
|
||||
require "bundler/setup"
|
||||
|
||||
require "webpacker"
|
||||
require "webpacker/webpack_runner"
|
||||
|
||||
ENV["RAILS_ENV"] ||= ENV["RACK_ENV"] || "development"
|
||||
ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../../Gemfile", Pathname.new(__FILE__).realpath)
|
||||
|
||||
APP_ROOT = File.expand_path("..", __dir__)
|
||||
Dir.chdir(APP_ROOT) do
|
||||
Webpacker::WebpackRunner.run(ARGV)
|
||||
@@ -1,8 +1,6 @@
|
||||
#!/usr/bin/env ruby
|
||||
|
||||
ENV["RAILS_ENV"] ||= ENV["RACK_ENV"] || "development"
|
||||
ENV["NODE_ENV"] ||= "development"
|
||||
ENV["NODE_OPTIONS"] ||= "--openssl-legacy-provider"
|
||||
|
||||
require "pathname"
|
||||
ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../../Gemfile",
|
||||
15
bin/yarn
15
bin/yarn
@@ -1,9 +1,16 @@
|
||||
#!/usr/bin/env ruby
|
||||
APP_ROOT = File.expand_path('..', __dir__)
|
||||
|
||||
APP_ROOT = File.expand_path("..", __dir__)
|
||||
Dir.chdir(APP_ROOT) do
|
||||
begin
|
||||
exec "yarnpkg", *ARGV
|
||||
rescue Errno::ENOENT
|
||||
yarn = ENV["PATH"].split(File::PATH_SEPARATOR).
|
||||
select { |dir| File.expand_path(dir) != __dir__ }.
|
||||
product(["yarn", "yarnpkg", "yarn.cmd", "yarn.ps1"]).
|
||||
map { |dir, file| File.expand_path(file, dir) }.
|
||||
find { |file| File.executable?(file) }
|
||||
|
||||
if yarn
|
||||
exec yarn, *ARGV
|
||||
else
|
||||
$stderr.puts "Yarn executable was not detected in the system."
|
||||
$stderr.puts "Download Yarn at https://yarnpkg.com/en/docs/install"
|
||||
exit 1
|
||||
|
||||
@@ -89,7 +89,7 @@ services:
|
||||
build: .
|
||||
command: >
|
||||
sh -lc 'until [ -f /bundles/.Gemfile.lock.sha ] && sha256sum -c /bundles/.Gemfile.lock.sha >/dev/null 2>&1; do sleep 0.5; done;
|
||||
exec ./bin/webpack-dev-server'
|
||||
exec ./bin/webpacker-dev-server'
|
||||
ports:
|
||||
- "3035:3035"
|
||||
volumes:
|
||||
|
||||
@@ -58,10 +58,15 @@ module Openfoodnetwork
|
||||
Spree::Core::Engine.routes.default_url_options[:host] = ENV["SITE_URL"] if Rails.env == 'test'
|
||||
end
|
||||
|
||||
# We reload the routes here
|
||||
# so that the appended/prepended routes are available to the application.
|
||||
config.after_initialize do
|
||||
# We reload the routes here
|
||||
# so that the appended/prepended routes are available to the application.
|
||||
Rails.application.routes_reloader.reload!
|
||||
|
||||
# Subscribe to payment transition events
|
||||
ActiveSupport::Notifications.subscribe(
|
||||
"ofn.payment_transition", Payments::StatusChangedListenerService.new
|
||||
)
|
||||
end
|
||||
|
||||
initializer "spree.environment", before: :load_config_initializers do |app|
|
||||
@@ -71,14 +76,6 @@ module Openfoodnetwork
|
||||
end
|
||||
end
|
||||
|
||||
initializer "spree.register.payment_methods" do |app|
|
||||
Rails.application.reloader.to_prepare do
|
||||
app.config.spree.payment_methods = [
|
||||
Spree::PaymentMethod::Check
|
||||
]
|
||||
end
|
||||
end
|
||||
|
||||
initializer "spree.mail.settings" do |_app|
|
||||
Rails.application.reloader.to_prepare do
|
||||
Spree::Core::MailSettings.init
|
||||
@@ -126,14 +123,6 @@ module Openfoodnetwork
|
||||
end
|
||||
end
|
||||
|
||||
# Register Spree payment methods
|
||||
initializer "spree.gateway.payment_methods", :after => "spree.register.payment_methods" do |app|
|
||||
Rails.application.reloader.to_prepare do
|
||||
app.config.spree.payment_methods << Spree::Gateway::StripeSCA
|
||||
app.config.spree.payment_methods << Spree::Gateway::PayPalExpress
|
||||
end
|
||||
end
|
||||
|
||||
initializer "ofn.reports" do |app|
|
||||
module ::Reporting; end
|
||||
Rails.application.reloader.to_prepare do
|
||||
@@ -206,7 +195,16 @@ module Openfoodnetwork
|
||||
|
||||
Rails.autoloaders.main.ignore(Rails.root.join('app/webpacker'))
|
||||
|
||||
config.active_storage.service = ENV["S3_BUCKET"].present? ? :amazon : :local
|
||||
config.active_storage.service =
|
||||
if ENV["S3_BUCKET"].present?
|
||||
if ENV["S3_ENDPOINT"].present?
|
||||
:s3_compatible_storage
|
||||
else
|
||||
:amazon
|
||||
end
|
||||
else
|
||||
:local
|
||||
end
|
||||
config.active_storage.content_types_to_serve_as_binary -= ["image/svg+xml"]
|
||||
config.active_storage.variable_content_types += ["image/svg+xml"]
|
||||
config.active_storage.url_options = config.action_controller.default_url_options
|
||||
|
||||
@@ -74,9 +74,6 @@ Rails.application.configure do
|
||||
allowed_warnings = [
|
||||
# List strings here to allow matching deprecations.
|
||||
#
|
||||
# `Rails.application.secrets` is deprecated in favor of `Rails.application.credentials` and will be removed in Rails 7.2
|
||||
"Rails.application.secrets",
|
||||
|
||||
"Passing the class as positional argument",
|
||||
|
||||
# Spree::CreditCard model aliases `cc_type` and has a method called `cc_type=` defined. Starting in Rails 7.2 `brand=` will not be calling `cc_type=` anymore. You may want to additionally define `brand=` to preserve the current behavior.
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
Rails.application.config.content_security_policy do |policy|
|
||||
policy.default_src :self, :https
|
||||
policy.font_src :self, :https, :data, "fonts.gstatic.com"
|
||||
policy.img_src :self, :https, :data, "*.s3.amazonaws.com"
|
||||
policy.img_src :self, :https, :data, ENV.fetch("S3_CORS_POLICY_DOMAIN", "*.s3.amazonaws.com")
|
||||
policy.img_src :self, :http, :data, ENV["SITE_URL"] if Rails.env.development?
|
||||
policy.object_src :none
|
||||
policy.frame_ancestors :none
|
||||
|
||||
@@ -1,3 +1,5 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
require "flipper"
|
||||
require "flipper/adapters/active_record"
|
||||
require "open_food_network/feature_toggle"
|
||||
@@ -23,19 +25,38 @@ Flipper.register(:admins) do |actor|
|
||||
actor.respond_to?(:admin?) && actor.admin?
|
||||
end
|
||||
Flipper.register(:new_2024_07_03) do |actor|
|
||||
actor.respond_to?(:created_at?) && actor.created_at >= "2024-07-03".to_time
|
||||
actor.respond_to?(:created_at?) && actor.created_at >= Time.zone.parse("2024-07-03")
|
||||
end
|
||||
Flipper.register(:enterprise_created_before_2025_08_11) do |actor|
|
||||
|
||||
Flipper.register(:enterprise_with_no_inventory) do |actor|
|
||||
# This group applies to enterprises only, so we return false if the actor is not an Enterprise
|
||||
next false unless actor.actor.instance_of? Enterprise
|
||||
|
||||
actor.respond_to?(:created_at?) && actor.created_at < "2025-08-11".to_time
|
||||
# Uses 2025-08-11 as filter because variant tag did not exist before that, enterprise created
|
||||
# after never had access to the inventory
|
||||
enterprise_with_variant_override = Enterprise
|
||||
.where(id: VariantOverride.joins(:hub).select(:hub_id))
|
||||
.where(created_at: ..."2025-08-11")
|
||||
.distinct
|
||||
enterprise_with_no_variant_override = Enterprise
|
||||
.where.not(id: enterprise_with_variant_override)
|
||||
|
||||
enterprise_with_no_variant_override.exists?(actor.id)
|
||||
end
|
||||
Flipper.register(:enterprise_created_after_2025_08_11) do |actor|
|
||||
|
||||
Flipper.register(:enterprise_with_inventory) do |actor|
|
||||
# This group applies to enterprises only, so we return false if the actor is not an Enterprise
|
||||
next false unless actor.actor.instance_of? Enterprise
|
||||
|
||||
actor.respond_to?(:created_at?) && actor.created_at >= "2025-08-11".to_time
|
||||
# Uses 2025-08-11 as filter because variant tag did not exist before that, enterprise created
|
||||
# after never had access to the inventory
|
||||
enterprise_with_variant_override = Enterprise
|
||||
.where(id: VariantOverride.joins(:hub).select(:hub_id))
|
||||
.where(created_at: ..."2025-08-11")
|
||||
.distinct
|
||||
|
||||
# Entperprise with inventory and with variant tag not manually enabled.
|
||||
enterprise_with_variant_override.exists?(actor.id) && !Flipper.enabled?(:variant_tag, actor)
|
||||
end
|
||||
|
||||
Flipper::UI.configure do |config|
|
||||
@@ -59,4 +80,8 @@ Flipper::UI.configure do |config|
|
||||
end
|
||||
|
||||
# Add known feature toggles. This may fail if the database isn't setup yet.
|
||||
OpenFoodNetwork::FeatureToggle.setup! rescue ActiveRecord::StatementInvalid
|
||||
begin
|
||||
OpenFoodNetwork::FeatureToggle.setup!
|
||||
rescue ActiveRecord::StatementInvalid
|
||||
nil
|
||||
end
|
||||
|
||||
@@ -11,10 +11,10 @@
|
||||
|
||||
# `button_to` view helper will render `<button>` element, regardless of whether
|
||||
# or not the content is passed as the first argument or as a block.
|
||||
# Rails.application.config.action_view.button_to_generates_button_tag = true
|
||||
Rails.application.config.action_view.button_to_generates_button_tag = true
|
||||
|
||||
# `stylesheet_link_tag` view helper will not render the media attribute by default.
|
||||
# Rails.application.config.action_view.apply_stylesheet_media_default = false
|
||||
Rails.application.config.action_view.apply_stylesheet_media_default = false
|
||||
|
||||
# Change the digest class for the key generators to `OpenSSL::Digest::SHA256`.
|
||||
# Changing this default means invalidate all encrypted messages generated by
|
||||
|
||||
@@ -93,7 +93,7 @@
|
||||
# serializer. Therefore, this setting should only be enabled after all replicas
|
||||
# have been successfully upgraded to Rails 7.1.
|
||||
#++
|
||||
# Rails.application.config.active_job.use_big_decimal_serializer = true
|
||||
Rails.application.config.active_job.use_big_decimal_serializer = true
|
||||
|
||||
###
|
||||
# Specify if an `ArgumentError` should be raised if `Rails.cache` `fetch` or
|
||||
|
||||
@@ -6,7 +6,4 @@
|
||||
# no regular words or you'll be exposed to dictionary attacks.
|
||||
|
||||
# Rails 4+ key for signing and encrypting cookies.
|
||||
Openfoodnetwork::Application.config.secret_key_base = ENV["SECRET_TOKEN"]
|
||||
|
||||
# Legacy secret_token variable. This is still used directly for encryption.
|
||||
Openfoodnetwork::Application.config.secret_token = ENV["SECRET_TOKEN"]
|
||||
Openfoodnetwork::Application.credentials.secret_key_base = ENV["SECRET_TOKEN"]
|
||||
|
||||
@@ -1,10 +0,0 @@
|
||||
|
||||
module WebpackImageExtension
|
||||
def image_pack_path(image)
|
||||
# The Webpacker::Helper#resolve_path_to_image method is incredibly useful
|
||||
# for nicely fetching Webpacker image paths, but it's private.
|
||||
resolve_path_to_image(image)
|
||||
end
|
||||
end
|
||||
|
||||
Webpacker::Helper.include WebpackImageExtension
|
||||
@@ -429,6 +429,7 @@ ar:
|
||||
create_and_add_another: "إنشاء وإضافة آخر"
|
||||
create: "انشاء"
|
||||
cancel: "إلغاء"
|
||||
cancel_order: "إلغاء"
|
||||
resume: "اكمل"
|
||||
save: "حفظ"
|
||||
edit: "تعديل"
|
||||
@@ -4357,13 +4358,10 @@ ar:
|
||||
webhook_endpoints:
|
||||
title: نقاط نهاية Webhook
|
||||
description: قد تؤدي الأحداث في النظام إلى تشغيل webhooks للأنظمة الخارجية.
|
||||
event_types:
|
||||
order_cycle_opened: تم فتح دورة الطلب
|
||||
event_type:
|
||||
header: نوع الحدث
|
||||
url:
|
||||
header: عنوان URL لنقطة النهاية
|
||||
create_placeholder: 'أدخل عنوان URL لنقطة نهاية webhook '
|
||||
developer_settings:
|
||||
title: إعدادات المطور
|
||||
form:
|
||||
@@ -4563,3 +4561,8 @@ ar:
|
||||
add_tag_rule_modal:
|
||||
select_rule_type: "اختر نوع القاعدة:"
|
||||
add_rule: "أضف قاعدة "
|
||||
webhook_endpoint_form:
|
||||
url:
|
||||
create_placeholder: 'أدخل عنوان URL لنقطة نهاية webhook '
|
||||
event_types:
|
||||
order_cycle_opened: تم فتح دورة الطلب
|
||||
|
||||
@@ -89,17 +89,6 @@ ca:
|
||||
messages:
|
||||
blank: "no es pot deixar en blanc"
|
||||
errors:
|
||||
messages:
|
||||
content_type_invalid: "té un tipus de contingut no vàlid"
|
||||
file_size_out_of_range: "la mida %{file_size} no és entre el rang necessari"
|
||||
limit_out_of_range: "el total està fora del marge"
|
||||
image_metadata_missing: "no és una imatge vàlida"
|
||||
aspect_ratio_not_square: "ha de ser una imatge quadrada"
|
||||
aspect_ratio_not_portrait: "ha de ser una imatge vertical"
|
||||
aspect_ratio_not_landscape: "ha de ser una imatge horitzontal"
|
||||
aspect_ratio_is_not: "ha de tenir una relació d'aspecte de %{aspect_ratio} "
|
||||
aspect_ratio_unknown: "té una relació d'aspecte desconeguda"
|
||||
image_not_processable: "no és una imatge vàlida"
|
||||
not_found:
|
||||
title: "La pàgina que esteu cridant no existeix (404)"
|
||||
message_html: "<b>Si us plau torna-ho a provar</b> Això podria ser un problema temporal. Feu clic al botó Enrere per tornar a la pantalla anterior o torneu a <a href='/'>Inici</a> i torneu-ho a provar. <b>Contacteu amb suport</b><p> Si el problema persisteix o és urgent, si us plau, digueu-nos-ho. Esn pots enviar un correua a <a href='https://openfoodnetwork.org/ofn-local/' target='blank'>suport<p>katuma.org </a>.</p><p> Ens ajuda molt si pots donar tants detalls com sigui possible sobre de què estaves fent quan va aparèixer l'error.</p>"
|
||||
@@ -462,6 +451,7 @@ ca:
|
||||
create_and_add_another: "Crea i afegeix-ne una altra"
|
||||
create: "Crear"
|
||||
cancel: "Cancel·lar"
|
||||
cancel_order: "Cancel·lar"
|
||||
resume: "Continuar"
|
||||
save: "Desa"
|
||||
edit: "Editar"
|
||||
@@ -4248,8 +4238,6 @@ ca:
|
||||
title: Clau API
|
||||
webhook_endpoints:
|
||||
title: Webhook Endpoints
|
||||
event_types:
|
||||
order_cycle_opened: Cicle de comanda obert
|
||||
form:
|
||||
account_settings: Configuració del compte
|
||||
show:
|
||||
@@ -4392,3 +4380,6 @@ ca:
|
||||
add_tag_rule_modal:
|
||||
select_rule_type: "Selecciona un tipus de regla:"
|
||||
add_rule: "Afegeix una regla"
|
||||
webhook_endpoint_form:
|
||||
event_types:
|
||||
order_cycle_opened: Cicle de comanda obert
|
||||
|
||||
@@ -115,27 +115,6 @@ cy:
|
||||
blank: "ni chaniateir ei adael yn wag"
|
||||
too_short: "rhy fyr (o leiaf %{count} cymeriad)"
|
||||
errors:
|
||||
messages:
|
||||
content_type_invalid: "math o gynnwys annilys"
|
||||
file_size_out_of_range: "nid yw'r maint %{file_size} rhwng yr ystod ofynnol"
|
||||
limit_out_of_range: "mae'r cyfanswm rhif tu hwnt i'r ystod"
|
||||
image_metadata_missing: "nid yw'n llun dilys"
|
||||
dimension_min_inclusion: "mae'n gorfod bod yn fwy neu'r un faint â %{width} x %{height} picsel."
|
||||
dimension_max_inclusion: "mae'n gorfod bod yn llai neu'r un faint â %{width} x %{height} picsel."
|
||||
dimension_width_inclusion: "nid yw lled yn cael ei gynnwys rhwng %{min} ac %{max} picsel."
|
||||
dimension_height_inclusion: "nid yw uchder yn cael ei gynnwys rhwng %{min} acd %{max} picsel."
|
||||
dimension_width_greater_than_or_equal_to: "mae'r lled yn gorfod bod yn fwy neu'r un faint â %{length} picsel."
|
||||
dimension_height_greater_than_or_equal_to: "mae'r uchder yn gorfod bod yn fwy neu'r un faint â %{length} picsel."
|
||||
dimension_width_less_than_or_equal_to: "mae'r lled yn gorfod bod yn llai neu'r un faint â %{length} picsel."
|
||||
dimension_height_less_than_or_equal_to: "mae'r uchder yn gorfod bod yn llai neu'r un faint â %{length} picsel."
|
||||
dimension_width_equal_to: "mae'r lled yn gorfod bod yr un faint â %{length} picsel."
|
||||
dimension_height_equal_to: "mae'r uchder yn gorfod bod yr un faint â %{length} picsel."
|
||||
aspect_ratio_not_square: "mae'n gorfod bod yn llun sgwâr"
|
||||
aspect_ratio_not_portrait: "mae'n gorfod bod yn llun siâp portread"
|
||||
aspect_ratio_not_landscape: "mae'n gorfod bod yn llun siâp tirlun"
|
||||
aspect_ratio_is_not: "mae'n rhaid cael cymhareb agwedd o %{aspect_ratio}"
|
||||
aspect_ratio_unknown: "yn meddu ar gymhareb agwedd anhysbys"
|
||||
image_not_processable: "nid yw'n llun dilys"
|
||||
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>"
|
||||
@@ -548,6 +527,7 @@ cy:
|
||||
create_and_add_another: "Creu ac Ychwanegu Un arall"
|
||||
create: "Creu"
|
||||
cancel: "Canslo"
|
||||
cancel_order: "Canslo"
|
||||
resume: "Ail-ddechrau"
|
||||
save: "Cadw"
|
||||
edit: "Golygu"
|
||||
@@ -4033,6 +4013,7 @@ cy:
|
||||
logourl: "url Logo"
|
||||
are_you_sure_delete: "Ydych chi'n siŵr eich bod chi am ddileu'r cofnod hwn?"
|
||||
confirm_delete: "Cadarnhau Dileu"
|
||||
voucher: "Taleb"
|
||||
configurations: "Cyfluniadau"
|
||||
general_settings: "Gosodiadau Cyffredinol"
|
||||
site_name: "Enw'r Safle"
|
||||
@@ -4757,13 +4738,10 @@ cy:
|
||||
webhook_endpoints:
|
||||
title: Webhook Endpoints
|
||||
description: Events in the system may trigger webhooks to external systems.
|
||||
event_types:
|
||||
order_cycle_opened: Order Cycle Opened
|
||||
event_type:
|
||||
header: Event type
|
||||
url:
|
||||
header: Endpoint URL
|
||||
create_placeholder: Enter the URL of the remote webhook endpoint
|
||||
developer_settings:
|
||||
title: Gosodiadau'r Datblygwr
|
||||
form:
|
||||
@@ -4937,6 +4915,11 @@ cy:
|
||||
add_tag_rule_modal:
|
||||
select_rule_type: "Dewis math o reol:"
|
||||
add_rule: "Ychwanegu Rheol"
|
||||
webhook_endpoint_form:
|
||||
url:
|
||||
create_placeholder: Enter the URL of the remote webhook endpoint
|
||||
event_types:
|
||||
order_cycle_opened: Order Cycle Opened
|
||||
invisible_captcha:
|
||||
sentence_for_humans: "Gadewch yn wag os gwelwch yn dda."
|
||||
timestamp_error_message: "Rhowch gynnig arall ar ôl 5 eiliad."
|
||||
|
||||
@@ -89,27 +89,6 @@ de_CH:
|
||||
messages:
|
||||
blank: "darf nicht leer sein"
|
||||
errors:
|
||||
messages:
|
||||
content_type_invalid: "hat ein ungültiges Datenformat"
|
||||
file_size_out_of_range: "Dateigrösse %{file_size} liegt ausserhalb des zulässigen Bereichs"
|
||||
limit_out_of_range: "Gesamtzahl liegt ausserhalb des zulässigen Bereichs"
|
||||
image_metadata_missing: "ist kein gültiges Bild"
|
||||
dimension_min_inclusion: "muss grösser oder gleich %{width} x %{height} Pixel sein"
|
||||
dimension_max_inclusion: "muss kleiner oder gleich %{width} x %{height} Pixel sein"
|
||||
dimension_width_inclusion: "Breite liegt nicht zwischen %{min} und %{max} Pixel"
|
||||
dimension_height_inclusion: "Höhe liegt nicht zwischen %{min} und %{max} Pixel"
|
||||
dimension_width_greater_than_or_equal_to: "Breite muss grösser oder gleich %{length} Pixel sein"
|
||||
dimension_height_greater_than_or_equal_to: "Höhe muss grösser oder gleich %{length} Pixel sein"
|
||||
dimension_width_less_than_or_equal_to: "Breite muss kleiner oder gleich %{length} Pixel sein"
|
||||
dimension_height_less_than_or_equal_to: "Höhe muss kleiner oder gleich %{length} Pixel sein"
|
||||
dimension_width_equal_to: "Breite muss %{length} Pixel sein"
|
||||
dimension_height_equal_to: "Höhe muss %{length} Pixel sein"
|
||||
aspect_ratio_not_square: "muss ein quadratisches Bild sein"
|
||||
aspect_ratio_not_portrait: "muss ein Bild im Hochformat sein"
|
||||
aspect_ratio_not_landscape: "muss ein Bild im Querformat sein"
|
||||
aspect_ratio_is_not: "muss ein Seitenverhältnis von %{aspect_ratio} haben"
|
||||
aspect_ratio_unknown: "hat ein unbekanntes Seitenverhältnis"
|
||||
image_not_processable: "ist kein gültiges Bild"
|
||||
not_found:
|
||||
title: "Die gesuchte Seite existiert nicht (404)"
|
||||
stripe:
|
||||
@@ -460,6 +439,7 @@ de_CH:
|
||||
create_and_add_another: "Erstellen und weitere hinzufügen"
|
||||
create: "Neu"
|
||||
cancel: "Abbrechen"
|
||||
cancel_order: "Abbrechen"
|
||||
resume: "Fortsetzen"
|
||||
save: "Speichern"
|
||||
edit: "Bearbeiten"
|
||||
@@ -3614,6 +3594,7 @@ de_CH:
|
||||
logourl: "URL des Logos"
|
||||
are_you_sure_delete: "Möchten Sie diesen Datensatz wirklich löschen?"
|
||||
confirm_delete: "Löschen bestätigen"
|
||||
voucher: "Gutschein"
|
||||
configurations: "Konfiguration"
|
||||
general_settings: "Allgemeine Einstellungen"
|
||||
site_name: "Name der Website"
|
||||
|
||||
@@ -105,27 +105,6 @@ de_DE:
|
||||
blank: "darf nicht leer sein."
|
||||
too_short: "ist zu kurz (mindestens %{count} Zeichen)"
|
||||
errors:
|
||||
messages:
|
||||
content_type_invalid: "hat ein ungültiges Datenformat"
|
||||
file_size_out_of_range: "Dateigröße %{file_size} liegt außerhalb des zulässigen Bereichs"
|
||||
limit_out_of_range: "Gesamtzahl liegt außerhalb des zulässigen Bereichs"
|
||||
image_metadata_missing: "ist kein gültiges Bild"
|
||||
dimension_min_inclusion: "muss größer oder gleich %{width} x %{height} Pixel sein"
|
||||
dimension_max_inclusion: "muss kleiner oder gleich %{width} x %{height} Pixel sein"
|
||||
dimension_width_inclusion: "Breite liegt nicht zwischen %{min} und %{max} Pixel"
|
||||
dimension_height_inclusion: "Höhe liegt nicht zwischen %{min} und %{max} Pixel"
|
||||
dimension_width_greater_than_or_equal_to: "Breite muss größer oder gleich %{length} Pixel sein"
|
||||
dimension_height_greater_than_or_equal_to: "Höhe muss größer oder gleich %{length} Pixel sein"
|
||||
dimension_width_less_than_or_equal_to: "Breite muss kleiner oder gleich %{length} Pixel sein"
|
||||
dimension_height_less_than_or_equal_to: "Höhe muss kleiner oder gleich %{length} Pixel sein"
|
||||
dimension_width_equal_to: "Breite muss %{length} Pixel sein"
|
||||
dimension_height_equal_to: "Höhe muss %{length} Pixel sein"
|
||||
aspect_ratio_not_square: "muss ein quadratisches Bild sein"
|
||||
aspect_ratio_not_portrait: "muss ein Bild im Hochformat sein"
|
||||
aspect_ratio_not_landscape: "muss ein Bild im Querformat sein"
|
||||
aspect_ratio_is_not: "muss ein Seitenverhältnis von %{aspect_ratio} haben"
|
||||
aspect_ratio_unknown: "hat ein unbekanntes Seitenverhältnis"
|
||||
image_not_processable: "ist kein gültiges Bild"
|
||||
not_found:
|
||||
title: "Die gesuchte Seite existiert nicht (404). "
|
||||
message_html: "<b>Bitte versuchen Sie es erneut</b><p> Dies könnte ein vorübergehendes Problem sein. Bitte klicken Sie auf die Zurück-Schaltfläche, um zum vorherigen Bildschirm zurückzukehren, oder gehen Sie zurück zur <a href='/'>Startseite</a> und versuchen Sie es erneut.</p> <b>Kontaktieren Sie den Support</b><p> Wenn das Problem weiterhin besteht oder dringend ist, teilen Sie uns dies bitte mit. Unsere Kontaktdaten finden Sie auf der <a href='https://openfoodnetwork.org/ofn-local/' target='blank'>lokalen Seite des globalen Open Food Network</a> .</p><p> Es hilft uns sehr, wenn Sie so detailliert wie möglich angeben können, worum es auf der fehlenden Seite geht.</p>"
|
||||
@@ -487,6 +466,7 @@ de_DE:
|
||||
create_and_add_another: "Erstellen und weitere hinzufügen"
|
||||
create: "Neu"
|
||||
cancel: "Abbrechen"
|
||||
cancel_order: "Stornieren"
|
||||
resume: "Fortsetzen"
|
||||
save: "Speichern"
|
||||
edit: "Bearbeiten"
|
||||
@@ -541,9 +521,11 @@ de_DE:
|
||||
clone: Duplizieren
|
||||
delete: Löschen
|
||||
remove: Löschen
|
||||
preview: Vorschau
|
||||
image:
|
||||
edit: Bearbeiten
|
||||
product_preview:
|
||||
product_preview: Produktvorschau
|
||||
shop_tab: Produkte
|
||||
adjustments:
|
||||
skipped_changing_canceled_order: "Eine stornierte Bestellung kann nicht geändert werden."
|
||||
@@ -661,6 +643,13 @@ de_DE:
|
||||
info_html: "Matomo ist eine Web- und Mobile Analytics-Anwendung. Sie können Matomo entweder lokal hosten oder einen in der Cloud gehosteten Dienst verwenden. Weitere Informationen finden Sie unter <a href='http://matomo.org' target='_blank'>matomo.org</a>."
|
||||
config_instructions_html: "Hier können Sie die OFN Matomo Integration konfigurieren. Die unten angegebene Matomo-URL sollte auf die Matomo-Instanz verweisen, an die die Benutzerverfolgungsinformationen gesendet werden. Wenn es leer bleibt, wird das Matomo-Benutzer-Tracking deaktiviert. Das Feld Site-ID ist nicht obligatorisch, aber nützlich, wenn Sie mehr als eine Website in einer einzelnen Matomo-Instanz verfolgen. Es kann auf der Matomo-Instanzkonsole gefunden werden."
|
||||
config_instructions_tag_manager_html: "Durch Festlegen der Matomo Tag Manager URL wird Matomo Tag Manager aktiviert. Mit diesem Tool können Sie Analyseereignisse einrichten. Die Matomo Tag Manager URL wird aus dem Abschnitt Installationscode von Matomo Tag Manager kopiert. Stellen Sie sicher, dass Sie den richtigen Container und die richtige Umgebung auswählen, da diese Optionen die URL ändern."
|
||||
connected_app_settings:
|
||||
edit:
|
||||
title: "Verknüpfte Apps"
|
||||
info_html: "Aktivierte Apps werden in den Unternehmenseinstellungen unter Verknüpfte Apps angezeigt."
|
||||
enabled_legend: "Aktivierte verknüpfte Apps"
|
||||
update:
|
||||
resource: Verknüpfte Apps
|
||||
customers:
|
||||
index:
|
||||
new_customer: "Neuer Kunde"
|
||||
@@ -758,6 +747,7 @@ de_DE:
|
||||
variants:
|
||||
infinity: "Unbegrenzt"
|
||||
to_order_tip: "Artikel, die auf Anfrage hergestellt werden, haben keinen festgelegten Lagerbestand."
|
||||
back_to_products_list: "Zurück zur Produktliste"
|
||||
editing_product: "Produkt bearbeiten"
|
||||
tabs:
|
||||
product_details: "Produktdetails"
|
||||
@@ -771,19 +761,35 @@ de_DE:
|
||||
title: Produkte verwalten
|
||||
content:
|
||||
loading: Produkte werden geladen...
|
||||
delete_modal:
|
||||
delete_product_modal:
|
||||
heading: "Produkt löschen"
|
||||
prompt: "Das Produkt wird dauerhaft aus Ihrer Liste entfernt."
|
||||
confirmation_text: "Produkt löschen"
|
||||
cancellation_text: "Produkt beibehalten"
|
||||
delete_variant_modal:
|
||||
heading: "Produktvariante löschen"
|
||||
prompt: "Die Produktvariante wird dauerhaft aus Ihrer Liste entfernt."
|
||||
confirmation_text: "Produktvariante löschen"
|
||||
cancellation_text: "Produktvariante beibehalten"
|
||||
filters:
|
||||
search_products: Nach Produkten suchen
|
||||
search_for_producers: Produzenten suchen
|
||||
all_producers: Alle Produzenten
|
||||
search_for_categories: Kategorie suchen
|
||||
all_categories: Alle Kategorien
|
||||
producers:
|
||||
label: Unsere Produzenten
|
||||
categories:
|
||||
label: Lieferkategorien
|
||||
label: Produktkategorie
|
||||
tags:
|
||||
label: Stichwörter
|
||||
search: Suche
|
||||
sort:
|
||||
pagination:
|
||||
products_total_html:
|
||||
one: "<strong>%{total} Produkt</strong> für Ihre Suchkriterien gefunden."
|
||||
other: "<strong>%{count} Produkte</strong> für Ihre Suchkriterien gefunden. Zeige %{from} bis %{to}."
|
||||
per_page:
|
||||
show: Zeige
|
||||
per_page: "%{num} pro Seite"
|
||||
@@ -811,16 +817,23 @@ de_DE:
|
||||
success: Die Änderungen wurden gespeichert.
|
||||
delete_product:
|
||||
success: Das Produkt wurde gelöscht.
|
||||
error: Das Produkt konnte nicht gelöscht werden.
|
||||
delete_variant:
|
||||
success: Die Produktvariante wurde gelöscht.
|
||||
error: Die Produktvariante konnte nicht gelöscht werden.
|
||||
variant_row:
|
||||
none_tax_category: Nichts
|
||||
category_field_name: "Kategorie"
|
||||
tax_category_field_name: "Steuerkategorie"
|
||||
producer_field_name: "Produzent"
|
||||
select_unit_scale: Einheit auswählen
|
||||
add_a_tag: Stichwort hinzufügen
|
||||
clone:
|
||||
success: Das Produkt wurde dupliziert.
|
||||
tag_rules:
|
||||
rules_per_tag:
|
||||
one: "%{tag} hat 1 Regel"
|
||||
other: "%{tag} hat %{count} Regeln"
|
||||
product_import:
|
||||
title: Produkte importieren
|
||||
file_not_found: Die Datei konnte nicht gefunden oder nicht geöffnet werden.
|
||||
@@ -862,6 +875,8 @@ de_DE:
|
||||
product_categories: Produktkategorien
|
||||
tax_categories: Steuerkategorien
|
||||
shipping_categories: Lieferkategorien
|
||||
dfc_import_form:
|
||||
preview: Vorschau
|
||||
import:
|
||||
review: Überprüfung
|
||||
import: Importieren
|
||||
@@ -1065,6 +1080,7 @@ de_DE:
|
||||
images:
|
||||
legend: "Bilder"
|
||||
logo: Logo
|
||||
logo_size: "300 x 300 Pixel"
|
||||
inventory_settings:
|
||||
legend: "Katalog"
|
||||
text1: Sie verwalten optional Ihre Lagerbestände und Preise auch in Ihrem
|
||||
@@ -1197,7 +1213,7 @@ de_DE:
|
||||
default_rules:
|
||||
by_default: Standardregeln
|
||||
no_rules_yet: Es gelten noch keine Standardregeln.
|
||||
add_new_button: 'neue Standardregel +'
|
||||
add_new_button: '+ Neue Standardregel'
|
||||
no_tags_yet: Für dieses Unternehmen sind noch keine Stichwörter vorhanden.
|
||||
add_new_tag: '+ Neues Stichwort hinzufügen'
|
||||
show_hide_variants: 'Produktvarianten im Laden anzeigen?'
|
||||
@@ -1226,7 +1242,7 @@ de_DE:
|
||||
vouchers:
|
||||
legend: Gutscheine
|
||||
voucher_code: Gutschein-Code
|
||||
rate: Steuersatz
|
||||
rate: Gutscheinwert
|
||||
label: Bezeichnung
|
||||
purpose: Zweck
|
||||
expiry: Gültigkeit
|
||||
@@ -1234,7 +1250,7 @@ de_DE:
|
||||
customers: Kunde
|
||||
net_value: Nettowert
|
||||
active: Aktiv?
|
||||
add_new: Neuer Gutschein
|
||||
add_new: + Neuer Gutschein
|
||||
no_voucher_yet: Noch keine Gutscheine vorhanden.
|
||||
white_label:
|
||||
legend: "OFN verbergen"
|
||||
@@ -1268,6 +1284,8 @@ de_DE:
|
||||
visible: Sichtbar?
|
||||
owner: Inhaber
|
||||
producer: Produzent
|
||||
sells_options:
|
||||
unspecified: nicht spezifiziert
|
||||
change_type_form:
|
||||
producer_profile: Profil
|
||||
connect_ofn: Stellen Sie sich und Ihre Produkte vor
|
||||
@@ -1304,8 +1322,10 @@ de_DE:
|
||||
contact_name: Kontaktname
|
||||
edit:
|
||||
editing: 'Einstellungen:'
|
||||
back_link: Zurück zur Unternehmensliste
|
||||
new:
|
||||
title: Neues Unternehmen
|
||||
back_link: Zurück zur Unternehmensliste
|
||||
welcome:
|
||||
welcome_title: Willkommen im Open Food Network!
|
||||
welcome_text: 'Erfolgreich erstellt:'
|
||||
@@ -1316,6 +1336,8 @@ de_DE:
|
||||
invite_manager:
|
||||
user_already_exists: "Der Benutzer existiert bereits. Bitte verwenden Sie die Funktion \"vorhandenen Benutzer hinzufügen\"."
|
||||
error: "Etwas ist schief gelaufen."
|
||||
tag_rules:
|
||||
confirm_delete: Möchten Sie diese Regel wirklich löschen?
|
||||
order_cycles:
|
||||
loading_flash:
|
||||
loading_order_cycles: BESTELLZYKLEN WERDEN GELADEN ...
|
||||
@@ -1477,6 +1499,7 @@ de_DE:
|
||||
shared:
|
||||
attachment_field:
|
||||
logo_label: "Logo"
|
||||
logo_hint: 300 x 300 Pixel
|
||||
logo_remove: "Bild löschen"
|
||||
logo_remove_confirm: "Das Logo wird sofort nach Ihrer Bestätigung gelöscht."
|
||||
promo_image_note1: 'BITTE BEACHTEN SIE:'
|
||||
@@ -1494,6 +1517,8 @@ de_DE:
|
||||
has_no_payment_methods: "%{enterprise} hat keine Zahlungsarten."
|
||||
has_no_shipping_methods: "%{enterprise} hat keine Lieferoptionen."
|
||||
has_no_enterprise_fees: "%{enterprise} erhebt keine Gebühren."
|
||||
flashes:
|
||||
dismiss: Schließen
|
||||
side_menu:
|
||||
enterprise:
|
||||
primary_details: "Unternehmen"
|
||||
@@ -1530,6 +1555,8 @@ de_DE:
|
||||
email_confirmation: "E-Mail-Bestätigung steht aus. Wir haben eine E-Mail an %{email} gesendet."
|
||||
not_visible: "%{enterprise} ist nicht sichtbar und kann daher nicht auf der Karte oder in Suchen gefunden werden."
|
||||
reports:
|
||||
metadata:
|
||||
report_title: Bericht
|
||||
deprecated: "Dieser Bericht ist veraltet und wird in einer zukünftigen Version entfernt."
|
||||
hidden_field: "< verborgen >"
|
||||
unitsize: EINHEIT
|
||||
@@ -1581,7 +1608,7 @@ de_DE:
|
||||
orders_and_fulfillment:
|
||||
name: Bestellungs- & Erfüllungsberichte
|
||||
customers:
|
||||
name: Kundenberichte
|
||||
name: Kundenbericht
|
||||
products_and_inventory:
|
||||
name: Produkte und Katalog
|
||||
users_and_enterprises:
|
||||
@@ -1623,9 +1650,10 @@ de_DE:
|
||||
generate_report: "Bericht erstellen"
|
||||
on_screen: "Auf dem Bildschirm"
|
||||
spreadsheet: "Tabellenkalkulation (Excel, OpenOffice, ..)"
|
||||
display: Anzeige
|
||||
display: Darstellung
|
||||
summary_row: Zeilen mit Zwischensummen
|
||||
header_row: Kopfzeile
|
||||
metadata_rows: Kopfzeile mit Berichtdetails
|
||||
raw_data: Rohdaten
|
||||
formatted_data: Formatierte Daten
|
||||
packing:
|
||||
@@ -1637,6 +1665,9 @@ de_DE:
|
||||
les_communs_link: "Les Communs Open ID-Server"
|
||||
link_your_account: "Sie müssen Ihr Benutzerkonto zunächst mit dem von DFC (Les Communs Open ID Connect) verwendeten Autorisierungsanbieter verbinden."
|
||||
link_account_button: "Verbinden Sie Ihr Les Communs OIDC-Konto"
|
||||
note_expiry: |
|
||||
Die Tokens für den Zugriff auf verknüpfte Apps sind abgelaufen. Bitte aktualisieren Sie Ihre
|
||||
Kontoverknüpfung, damit alle Integrationen weiterhin funktionieren.
|
||||
view_account: "Ihr Benutzerkonto anzeigen:"
|
||||
subscriptions:
|
||||
index:
|
||||
@@ -1955,6 +1986,7 @@ de_DE:
|
||||
invoice_column_price_per_unit_without_taxes: "Einzelpreis (zzgl. Steuern)"
|
||||
invoice_column_tax_rate: "Steuersatz"
|
||||
invoice_tax_total: "Umsatzsteuersumme:"
|
||||
invoice_cancel_and_replace_invoice: "ersetzt Rechnung"
|
||||
tax_invoice: "RECHNUNG"
|
||||
tax_total: "davon Steuern (%{rate}):"
|
||||
invoice_shipping_category_delivery: "Lieferoptionen"
|
||||
@@ -2177,6 +2209,9 @@ de_DE:
|
||||
order_back_to_store: Zurück zum Laden
|
||||
order_back_to_cart: Zurück zum Warenkorb
|
||||
order_back_to_website: 'zur Website '
|
||||
checkout_details_title: Ihre Daten
|
||||
checkout_payment_title: Zahlungsart
|
||||
checkout_summary_title: Bestellabschluss
|
||||
bom_tip: "Verwenden Sie diese Seite, um Produktmengen über mehrere Bestellungen hinweg zu ändern. Produkte können bei Bedarf auch komplett aus Bestellungen entfernt werden."
|
||||
unsaved_changes_warning: "Sie haben nicht gespeicherte Änderungen, die beim Fortfahren verloren gehen."
|
||||
unsaved_changes_error: "Felder mit roten Rahmen enthalten Fehler."
|
||||
@@ -3027,6 +3062,8 @@ de_DE:
|
||||
report_header_transaction_fee: Transaktionsgebühr (keine Steuern)
|
||||
report_header_total_untaxable_admin: Summe nicht steuerpflichtiger Admin-Anpassungen (keine Steuern)
|
||||
report_header_total_taxable_admin: Summe steuerpflichtiger Admin-Anpassungen (inkl. Steuern)
|
||||
report_header_voucher_label: Gutschein-Code
|
||||
report_header_voucher_amount: "Gutscheinwert"
|
||||
report_line_cost_of_produce: Produktkosten
|
||||
report_line_line_items: Einzelposten
|
||||
report_header_last_completed_order_date: Letzte Bestellung
|
||||
@@ -3108,6 +3145,7 @@ de_DE:
|
||||
order_cycles_no_permission_to_coordinate_error: "Keines Ihrer Unternehmen ist berechtigt, einen Bestellzyklus zu koordinieren."
|
||||
order_cycles_no_permission_to_create_error: "Sie sind nicht berechtigt, einen von diesem Unternehmen koordinierten Bestellzyklus zu erstellen."
|
||||
order_cycle_closed: "Der von Ihnen ausgewählte Bestellzyklus wurde gerade geschlossen. Bitte versuchen Sie es später noch einmal!"
|
||||
order_cycle_closed_next_steps: "Der von Ihnen gewählte Bestellzyklus wurde gerade geschlossen. Bitte kontaktieren Sie uns, um Ihre Bestellung mit der Bestellnummer %{order_number} abzuschließen!"
|
||||
back_to_orders_list: "Zurück zur Bestellübersicht"
|
||||
no_orders_found: "Keine Bestellungen gefunden."
|
||||
order_information: "Bestellinformationen"
|
||||
@@ -3642,7 +3680,7 @@ de_DE:
|
||||
spree:
|
||||
order_updated: "Bestellung aktualisiert"
|
||||
add_country: "Neues Land"
|
||||
add_state: "Neues Bundesland"
|
||||
add_state: "Bundesland hinzufügen"
|
||||
adjustment: "Anpassung"
|
||||
all: "Alle"
|
||||
associated_adjustment_closed: "Zugehörige Anpassung geschlossen"
|
||||
@@ -3686,6 +3724,7 @@ de_DE:
|
||||
resend: "Erneut senden"
|
||||
back_to_orders_list: "Zurück zur Bestellübersicht"
|
||||
back_to_payments_list: "Zurück zur Zahlungsliste"
|
||||
back_to_states_list: "Zurück zur Bundesländerliste"
|
||||
return_authorizations: "Retouren"
|
||||
cannot_create_returns: "Retouren können nicht erstellt werden, da für diese Bestellung keine Lieferung bestätigt wurde."
|
||||
select_stock: "Bestand auswählen"
|
||||
@@ -3742,6 +3781,7 @@ de_DE:
|
||||
logourl: "URL des Logos"
|
||||
are_you_sure_delete: "Möchten Sie diesen Datensatz wirklich löschen?"
|
||||
confirm_delete: "Löschen bestätigen"
|
||||
voucher: "Gutschein"
|
||||
configurations: "Konfiguration"
|
||||
general_settings: "Allgemeine Einstellungen"
|
||||
site_name: "Name der Website"
|
||||
@@ -3775,6 +3815,7 @@ de_DE:
|
||||
tax_rate_amount_explanation: "Eingabe als Dezimalbetrag (d. h. bei Steuersatz 5 %, geben Sie 0.05 ein)."
|
||||
included_in_price: "Im Preis enthalten"
|
||||
show_rate_in_label: "Steuersatz im Namen anzeigen"
|
||||
back_to_tax_rates_list: "Zurück zur Liste der Steuersätze"
|
||||
tax_settings: "Steuereinstellungen"
|
||||
zones: "Zonen"
|
||||
new_zone: "Neue Zone"
|
||||
@@ -3787,6 +3828,7 @@ de_DE:
|
||||
iso_name: "ISO-Name"
|
||||
states_required: "Staaten/Bundesländer/Regionen erforderlich"
|
||||
editing_country: "Land bearbeiten"
|
||||
back_to_countries_list: "Zurück zur Länderliste"
|
||||
states: "Bundesländer"
|
||||
abbreviation: "Abkürzung"
|
||||
new_state: "Neues Bundesland"
|
||||
@@ -3949,6 +3991,7 @@ de_DE:
|
||||
continue: "Weiter"
|
||||
new:
|
||||
new_return_authorization: "Neue Retour"
|
||||
back_to_return_authorizations_list: "Zurück zur Retourenliste"
|
||||
continue: "Weiter"
|
||||
edit:
|
||||
receive: "erhalten"
|
||||
@@ -4033,6 +4076,9 @@ de_DE:
|
||||
line_item_adjustments: "Anpassungen der Einzelposten"
|
||||
order_adjustments: "Bestellanpassungen"
|
||||
order_total: "Bestellung insgesamt"
|
||||
invoices:
|
||||
index:
|
||||
order_has_changed: "Die Bestellung hat sich seit Erstellung der letzten Rechnung geändert. Die hier angezeigte Rechnung ist möglicherweise nicht mehr aktuell."
|
||||
overview:
|
||||
enterprises_header:
|
||||
ofn_with_tip: Unternehmen sind Produzenten und/oder Läden und sind die grundlegende Organisationseinheit innerhalb des Open Food Network.
|
||||
@@ -4041,6 +4087,7 @@ de_DE:
|
||||
has_no_payment_methods: "hat keine Zahlungsarten"
|
||||
has_no_shipping_methods: "hat keine Lieferoptionen"
|
||||
products:
|
||||
products_tip: "Die Produkte, die Sie über das Open Food Network verkaufen."
|
||||
active_products:
|
||||
zero: "Sie haben keine aktiven Produkte."
|
||||
one: "Sie haben ein aktives Produkt"
|
||||
@@ -4188,11 +4235,14 @@ de_DE:
|
||||
product_name: Produktname
|
||||
primary_taxon_form:
|
||||
product_category: Produktkategorie
|
||||
search_for_categories: "Lieferkategorie suchen"
|
||||
group_buy_form:
|
||||
group_buy: "Gruppenkauf aktivieren?"
|
||||
bulk_unit_size: Erforderliche Gesamtbestellmenge (in Gramm, Liter oder Stück)
|
||||
display_as:
|
||||
display_as: Anzeigen als
|
||||
clone:
|
||||
success: Produkt wurde dupliziert.
|
||||
reports:
|
||||
table:
|
||||
select_and_search: "Treffen Sie Ihre Auswahl und klicken Sie auf %{option}, um den Bericht zu erstellen."
|
||||
@@ -4264,11 +4314,16 @@ de_DE:
|
||||
total: "Gesamt"
|
||||
billing_address_name: "Name"
|
||||
taxons:
|
||||
back_to_list: "Zurück zur Produktkategorienliste"
|
||||
index:
|
||||
title: "Produktkategorien"
|
||||
new_taxon: 'Neue Produktkategorie'
|
||||
new:
|
||||
title: "Neue Produktkategorie"
|
||||
destroy:
|
||||
delete_taxon:
|
||||
success: "Die Produktkategorie wurde gelöscht."
|
||||
error: "Die Produktkategorie kann aufgrund zugewiesener Produkte nicht gelöscht werden."
|
||||
form:
|
||||
name: Name
|
||||
description: Beschreibung
|
||||
@@ -4433,13 +4488,10 @@ de_DE:
|
||||
webhook_endpoints:
|
||||
title: Webhook-Endpunkte
|
||||
description: Ereignisse im System können Webhooks zu externen Systemen auslösen.
|
||||
event_types:
|
||||
order_cycle_opened: Bestellzyklus eröffnet
|
||||
event_type:
|
||||
header: Ereignistyp
|
||||
url:
|
||||
header: Endpunkt-URL
|
||||
create_placeholder: Geben Sie die URL des Remote-Webhook-Endpunkts ein
|
||||
developer_settings:
|
||||
title: Entwicklereinstellungen
|
||||
form:
|
||||
@@ -4587,3 +4639,8 @@ de_DE:
|
||||
add_tag_rule_modal:
|
||||
select_rule_type: "Wählen Sie einen Regelart aus:"
|
||||
add_rule: "Regel hinzufügen"
|
||||
webhook_endpoint_form:
|
||||
url:
|
||||
create_placeholder: Geben Sie die URL des Remote-Webhook-Endpunkts ein
|
||||
event_types:
|
||||
order_cycle_opened: Bestellzyklus eröffnet
|
||||
|
||||
@@ -106,27 +106,6 @@ el:
|
||||
blank: "δεν μπορεί να είναι κενό"
|
||||
too_short: "είναι πολύ σύντομο (το ελάχιστο είναι %{count} χαρακτήρες)"
|
||||
errors:
|
||||
messages:
|
||||
content_type_invalid: "περιέχει λανθασμένο τύπο περιεχομένου"
|
||||
file_size_out_of_range: "μέγεθος %{file_size} δεν είναι εντός της απαιτούμενης εμβέλειας"
|
||||
limit_out_of_range: "Ο συνολικός αριθμός βρίσκεται εκτός εύρους"
|
||||
image_metadata_missing: "δεν είναι έγκυρη εικόνα"
|
||||
dimension_min_inclusion: "πρέπει να είναι μεγαλύτερο η ίσο με %{width} x %{height} pixels."
|
||||
dimension_max_inclusion: "πρέπει να είναι μικρότερο από ή ίσο με %{width} x %{height} pixels."
|
||||
dimension_width_inclusion: "Το πλάτος δεν είναι μεταξύ %{min} και %{max} pixels."
|
||||
dimension_height_inclusion: "Το ύψος δεν είναι μεταξύ %{min} και %{max} pixels. "
|
||||
dimension_width_greater_than_or_equal_to: "Το πλάτος πρέπει να είναι μεγαλύτερο από η ίσο με %{length} pixels."
|
||||
dimension_height_greater_than_or_equal_to: "Το ύψος πρέπει να είναι μεγαλύτερο από η ίσο με %{length} pixels."
|
||||
dimension_width_less_than_or_equal_to: "Το πλάτος πρέπει να είναι μικρότερο από ή ίσο με %{length} pixels."
|
||||
dimension_height_less_than_or_equal_to: "Το ύψος πρέπει να είναι μικρότερο από η ίσο με %{length} pixels."
|
||||
dimension_width_equal_to: "Το πλάτος πρέπει να είναι ίσο με %{length} pixels."
|
||||
dimension_height_equal_to: "Το ύψος πρέπει να είναι ίσο με %{length} pixels."
|
||||
aspect_ratio_not_square: "πρέπει να είναι τετράγωνη εικόνα. "
|
||||
aspect_ratio_not_portrait: "πρέπει να είναι εικόνα πορτρέτο. "
|
||||
aspect_ratio_not_landscape: "πρέπει να είναι εικόνα τοπίου."
|
||||
aspect_ratio_is_not: "πρέπει να έχει λόγο διαστάσεων %{aspect_ratio}"
|
||||
aspect_ratio_unknown: "έχει άγνωστη αναλογία εμφάνισης (aspect ratio)."
|
||||
image_not_processable: "δεν είναι έγκυρη εικόνα"
|
||||
not_found:
|
||||
title: "Η συγκεκριμένη σελίδα δεν υπάρχει (404) "
|
||||
message_html: "<b>Παρακαλούμε προσπαθήστε ξανά</b> <p>Πιθανόν να πρόκειται για προσωρινό σφάλμα. Παρακαλούμε επιστρέψτε στην προηγούμενη σελίδα ή πηγαίνετε πίσω στην <a href='/'>Αρχική σελίδα</a> και προσπαθήστε ξανά.</p> <b>Επικοινωνήστε με την εξυπηρέτηση πελατών</b> <p>Εάν το πρόβλημα παραμένει η επείγει, παρακαλούμε να μας ενημερώσετε. Βρείτε τα στοιχεία επικοινωνίας μας στο <a href='https://openfoodnetwork.org/ofn-local/' target='blank'>Open Food Network Local page</a>. </p><p>Θα μας είναι απόλυτα χρήσιμο το να μας δώσετε όσες περισσότερες πληροφορίες γίνεται αναφορικά με τα στοιχεία της σελίδας που λείπουν.</p>"
|
||||
@@ -503,6 +482,7 @@ el:
|
||||
create_and_add_another: "Δημιουργία και Προσθήκη Νέου"
|
||||
create: "Δημιουργία"
|
||||
cancel: "Ακύρωση"
|
||||
cancel_order: "Ακύρωση"
|
||||
resume: "Συνέχεια"
|
||||
save: "Αποθήκευση"
|
||||
edit: "Επεξεργασία"
|
||||
@@ -3797,6 +3777,7 @@ el:
|
||||
logourl: "Logourl"
|
||||
are_you_sure_delete: "Είστε βέβαιοι ότι θέλετε να διαγράψετε αυτήν την εγγραφή;"
|
||||
confirm_delete: "Επιβεβαίωση διαγραφής"
|
||||
voucher: "Κουπόνι"
|
||||
configurations: "Διαμορφώσεις"
|
||||
general_settings: "Γενικές Ρυθμίσεις"
|
||||
site_name: "Ονομα ιστοσελίδας"
|
||||
@@ -4512,11 +4493,8 @@ el:
|
||||
webhook_endpoints:
|
||||
title: Webhook Endpoints
|
||||
description: Συμβάντα στο σύστημα μπορεί να πυροδοτήσουν webhooks σε εξωτερικά συστήματα.
|
||||
event_types:
|
||||
order_cycle_opened: Ο Κύκλος παραγγελίας άνοιξε
|
||||
url:
|
||||
header: Endpoint URL
|
||||
create_placeholder: Εισάγετε το URL απο το απομακρυσμένο webhook endpoint.
|
||||
developer_settings:
|
||||
title: Ρυθμίσεις Developer
|
||||
form:
|
||||
@@ -4664,6 +4642,11 @@ el:
|
||||
add_tag_rule_modal:
|
||||
select_rule_type: "Επιλέξτε έναν τύπο κανόνα:"
|
||||
add_rule: "Προσθήκη κανόνα"
|
||||
webhook_endpoint_form:
|
||||
url:
|
||||
create_placeholder: Εισάγετε το URL απο το απομακρυσμένο webhook endpoint.
|
||||
event_types:
|
||||
order_cycle_opened: Ο Κύκλος παραγγελίας άνοιξε
|
||||
invisible_captcha:
|
||||
sentence_for_humans: "Παρακαλώ αφήστε κενό"
|
||||
timestamp_error_message: "Παρακαλώ δοκιμάστε ξανά σε 5 δευτερόλεπτα."
|
||||
|
||||
@@ -138,26 +138,66 @@ en:
|
||||
# Used by active_storage_validations
|
||||
errors:
|
||||
messages:
|
||||
content_type_invalid: "has an invalid content type"
|
||||
file_size_out_of_range: "size %{file_size} is not between required range"
|
||||
limit_out_of_range: "total number is out of range"
|
||||
image_metadata_missing: "is not a valid image"
|
||||
dimension_min_inclusion: "must be greater than or equal to %{width} x %{height} pixel."
|
||||
dimension_max_inclusion: "must be less than or equal to %{width} x %{height} pixel."
|
||||
dimension_width_inclusion: "width is not included between %{min} and %{max} pixel."
|
||||
dimension_height_inclusion: "height is not included between %{min} and %{max} pixel."
|
||||
dimension_width_greater_than_or_equal_to: "width must be greater than or equal to %{length} pixel."
|
||||
dimension_height_greater_than_or_equal_to: "height must be greater than or equal to %{length} pixel."
|
||||
dimension_width_less_than_or_equal_to: "width must be less than or equal to %{length} pixel."
|
||||
dimension_height_less_than_or_equal_to: "height must be less than or equal to %{length} pixel."
|
||||
dimension_width_equal_to: "width must be equal to %{length} pixel."
|
||||
dimension_height_equal_to: "height must be equal to %{length} pixel."
|
||||
aspect_ratio_not_square: "must be a square image"
|
||||
aspect_ratio_not_portrait: "must be a portrait image"
|
||||
aspect_ratio_not_landscape: "must be a landscape image"
|
||||
aspect_ratio_is_not: "must have an aspect ratio of %{aspect_ratio}"
|
||||
aspect_ratio_unknown: "has an unknown aspect ratio"
|
||||
image_not_processable: "is not a valid image"
|
||||
content_type_invalid:
|
||||
one: "has an invalid content type (authorized content type is %{authorized_human_content_types})"
|
||||
other: "has an invalid content type (authorized content types are %{authorized_human_content_types})"
|
||||
content_type_spoofed:
|
||||
one: "has a content type that is not equivalent to the one that is detected through its content (authorized content type is %{authorized_human_content_types})"
|
||||
other: "has a content type that is not equivalent to the one that is detected through its content (authorized content types are %{authorized_human_content_types})"
|
||||
file_size_not_less_than: "file size must be less than %{max} (current size is %{file_size})"
|
||||
file_size_not_less_than_or_equal_to: "file size must be less than or equal to %{max} (current size is %{file_size})"
|
||||
file_size_not_greater_than: "file size must be greater than %{min} (current size is %{file_size})"
|
||||
file_size_not_greater_than_or_equal_to: "file size must be greater than or equal to %{min} (current size is %{file_size})"
|
||||
file_size_not_between: "file size must be between %{min} and %{max} (current size is %{file_size})"
|
||||
file_size_not_equal_to: "file size must be equal to %{exact} (current size is %{file_size})"
|
||||
total_file_size_not_less_than: "total file size must be less than %{max} (current size is %{total_file_size})"
|
||||
total_file_size_not_less_than_or_equal_to: "total file size must be less than or equal to %{max} (current size is %{total_file_size})"
|
||||
total_file_size_not_greater_than: "total file size must be greater than %{min} (current size is %{total_file_size})"
|
||||
total_file_size_not_greater_than_or_equal_to: "total file size must be greater than or equal to %{min} (current size is %{total_file_size})"
|
||||
total_file_size_not_between: "total file size must be between %{min} and %{max} (current size is %{total_file_size})"
|
||||
total_file_size_not_equal_to: "total file size must be equal to %{exact} (current size is %{total_file_size})"
|
||||
duration_not_less_than: "duration must be less than %{max} (current duration is %{duration})"
|
||||
duration_not_less_than_or_equal_to: "duration must be less than or equal to %{max} (current duration is %{duration})"
|
||||
duration_not_greater_than: "duration must be greater than %{min} (current duration is %{duration})"
|
||||
duration_not_greater_than_or_equal_to: "duration must be greater than or equal to %{min} (current duration is %{duration})"
|
||||
duration_not_between: "duration must be between %{min} and %{max} (current duration is %{duration})"
|
||||
duration_not_equal_to: "duration must be equal to %{exact} (current duration is %{duration})"
|
||||
limit_out_of_range:
|
||||
zero: "no files attached (must have between %{min} and %{max} files)"
|
||||
one: "only 1 file attached (must have between %{min} and %{max} files)"
|
||||
other: "total number of files must be between %{min} and %{max} files (there are %{count} files attached)"
|
||||
limit_min_not_reached:
|
||||
zero: "no files attached (must have at least %{min} files)"
|
||||
one: "only 1 file attached (must have at least %{min} files)"
|
||||
other: "%{count} files attached (must have at least %{min} files)"
|
||||
limit_max_exceeded:
|
||||
zero: "no files attached (maximum is %{max} files)"
|
||||
one: "too many files attached (maximum is %{max} files, got %{count})"
|
||||
other: "too many files attached (maximum is %{max} files, got %{count})"
|
||||
attachment_missing: "is missing its attachment"
|
||||
media_metadata_missing: "is not a valid media file"
|
||||
dimension_min_not_included_in: "must be greater than or equal to %{width} x %{height} pixels"
|
||||
dimension_max_not_included_in: "must be less than or equal to %{width} x %{height} pixels"
|
||||
dimension_width_not_included_in: "width is not included between %{min} and %{max} pixels"
|
||||
dimension_height_not_included_in: "height is not included between %{min} and %{max} pixels"
|
||||
dimension_width_not_greater_than_or_equal_to: "width must be greater than or equal to %{length} pixels"
|
||||
dimension_height_not_greater_than_or_equal_to: "height must be greater than or equal to %{length} pixels"
|
||||
dimension_width_not_less_than_or_equal_to: "width must be less than or equal to %{length} pixels"
|
||||
dimension_height_not_less_than_or_equal_to: "height must be less than or equal to %{length} pixels"
|
||||
dimension_width_not_equal_to: "width must be equal to %{length} pixels"
|
||||
dimension_height_not_equal_to: "height must be equal to %{length} pixels"
|
||||
aspect_ratio_not_square: "must be square (current file is %{width}x%{height}px)"
|
||||
aspect_ratio_not_portrait: "must be portrait (current file is %{width}x%{height}px)"
|
||||
aspect_ratio_not_landscape: "must be landscape (current file is %{width}x%{height}px)"
|
||||
aspect_ratio_not_x_y: "must be %{authorized_aspect_ratios} (current file is %{width}x%{height}px)"
|
||||
aspect_ratio_invalid: "has an invalid aspect ratio (valid aspect ratios are %{authorized_aspect_ratios})"
|
||||
file_not_processable: "is not identified as a valid media file"
|
||||
pages_not_less_than: "page count must be less than %{max} (current page count is %{pages})"
|
||||
pages_not_less_than_or_equal_to: "page count must be less than or equal to %{max} (current page count is %{pages})"
|
||||
pages_not_greater_than: "page count must be greater than %{min} (current page count is %{pages})"
|
||||
pages_not_greater_than_or_equal_to: "page count must be greater than or equal to %{min} (current page count is %{pages})"
|
||||
pages_not_between: "page count must be between %{min} and %{max} (current page count is %{pages})"
|
||||
pages_not_equal_to: "page count must be equal to %{exact} (current page count is %{pages})"
|
||||
not_found:
|
||||
title: "The page you were looking for doesn't exist (404)"
|
||||
message_html: "<b>Please try again</b>
|
||||
@@ -587,6 +627,7 @@ en:
|
||||
errors:
|
||||
vine_api: "There was an error communicating with the API, please try again later."
|
||||
invalid_voucher: "The voucher is not valid"
|
||||
expired: "The voucher has expired"
|
||||
not_found_voucher: "Sorry, we couldn't find that voucher, please check the code."
|
||||
vine_voucher_redeemer_service:
|
||||
errors:
|
||||
@@ -596,6 +637,7 @@ en:
|
||||
create_and_add_another: "Create and Add Another"
|
||||
create: "Create"
|
||||
cancel: "Cancel"
|
||||
cancel_order: "Cancel"
|
||||
resume: "Resume"
|
||||
save: "Save"
|
||||
edit: "Edit"
|
||||
@@ -4087,6 +4129,8 @@ en:
|
||||
destroy:
|
||||
success: Webhook endpoint successfully deleted
|
||||
error: Webhook endpoint failed to delete
|
||||
test:
|
||||
success: Some test data will be sent to the webhook url
|
||||
|
||||
spree:
|
||||
order_updated: "Order Updated"
|
||||
@@ -4194,6 +4238,8 @@ en:
|
||||
logourl: "Logourl"
|
||||
are_you_sure_delete: "Are you sure you want to delete this record?"
|
||||
confirm_delete: "Confirm Deletion"
|
||||
tag_rule: "Tag Rule"
|
||||
voucher: "Voucher"
|
||||
|
||||
configurations: "Configurations"
|
||||
general_settings: "General Settings"
|
||||
@@ -4937,13 +4983,10 @@ en:
|
||||
webhook_endpoints:
|
||||
title: Webhook Endpoints
|
||||
description: Events in the system may trigger webhooks to external systems.
|
||||
event_types:
|
||||
order_cycle_opened: Order Cycle Opened
|
||||
event_type:
|
||||
header: Event type
|
||||
url:
|
||||
header: Endpoint URL
|
||||
create_placeholder: Enter the URL of the remote webhook endpoint
|
||||
developer_settings:
|
||||
title: Developer Settings
|
||||
form:
|
||||
@@ -5092,7 +5135,13 @@ en:
|
||||
add_tag_rule_modal:
|
||||
select_rule_type: "Select a rule type:"
|
||||
add_rule: "Add Rule"
|
||||
|
||||
webhook_endpoint_form:
|
||||
url:
|
||||
create_placeholder: Enter the URL of the remote webhook endpoint
|
||||
event_types:
|
||||
order_cycle_opened: Order Cycle Opened
|
||||
payment_status_changed: Post webhook on Payment status change
|
||||
test_endpoint: Test webhook endpoint
|
||||
|
||||
# Gem to prevent bot form submissions
|
||||
invisible_captcha:
|
||||
|
||||
@@ -299,6 +299,7 @@ en_AU:
|
||||
create_and_add_another: "Create and Add Another"
|
||||
create: "Create"
|
||||
cancel: "Cancel"
|
||||
cancel_order: "Cancel"
|
||||
resume: "Resume"
|
||||
save: "Save"
|
||||
edit: "Edit"
|
||||
|
||||
@@ -278,6 +278,7 @@ en_BE:
|
||||
create_and_add_another: "Create and Add Another"
|
||||
create: "Create"
|
||||
cancel: "Cancel"
|
||||
cancel_order: "Cancel"
|
||||
save: "Save"
|
||||
edit: "Edit"
|
||||
update: "Update"
|
||||
|
||||
@@ -116,26 +116,66 @@ en_CA:
|
||||
too_short: "is too short (minimum is %{count} characters)"
|
||||
errors:
|
||||
messages:
|
||||
content_type_invalid: "has an invalid content type"
|
||||
file_size_out_of_range: "size %{file_size} is not within required range"
|
||||
limit_out_of_range: "total number is out of range"
|
||||
image_metadata_missing: "is not a valid image"
|
||||
dimension_min_inclusion: "must be greater than or equal to %{width} x %{height} pixels."
|
||||
dimension_max_inclusion: "must be less than or equal to %{width} x %{height} pixels."
|
||||
dimension_width_inclusion: "width is not between %{min} and %{max} pixels."
|
||||
dimension_height_inclusion: "height is not between %{min} and %{max} pixels."
|
||||
dimension_width_greater_than_or_equal_to: "width must be greater than or equal to %{length} pixels."
|
||||
dimension_height_greater_than_or_equal_to: "height must be greater than or equal to %{length} pixels."
|
||||
dimension_width_less_than_or_equal_to: "width must be less than or equal to %{length} pixels."
|
||||
dimension_height_less_than_or_equal_to: "height must be less than or equal to %{length} pixels."
|
||||
dimension_width_equal_to: "width must be equal to %{length} pixels."
|
||||
dimension_height_equal_to: "height must be equal to %{length} pixels."
|
||||
aspect_ratio_not_square: "must be a square image"
|
||||
aspect_ratio_not_portrait: "must be a portrait image"
|
||||
aspect_ratio_not_landscape: "must be a landscape image"
|
||||
aspect_ratio_is_not: "must have an aspect ration of %{aspect_ratio}"
|
||||
aspect_ratio_unknown: "has an unknown aspect ration"
|
||||
image_not_processable: "is not a valid image"
|
||||
content_type_invalid:
|
||||
one: "has an invalid content type (authorized content type is %{authorized_human_content_types})"
|
||||
other: "has an invalid content type (authorized content types are %{authorized_human_content_types})"
|
||||
content_type_spoofed:
|
||||
one: "has a content type that is not equivalent to the one that is detected through its content (authorized content type is %{authorized_human_content_types})"
|
||||
other: "has a content type that is not equivalent to the one that is detected through its content (authorized content types are %{authorized_human_content_types})"
|
||||
file_size_not_less_than: "file size must be less than %{max} (current size is %{file_size})"
|
||||
file_size_not_less_than_or_equal_to: "file size must be less than or equal to %{max} (current size is %{file_size})"
|
||||
file_size_not_greater_than: "file size must be greater than %{min} (current size is %{file_size})"
|
||||
file_size_not_greater_than_or_equal_to: "file size must be greater than or equal to %{min} (current size is %{file_size})"
|
||||
file_size_not_between: "file size must be between %{min} and %{max} (current size is %{file_size})"
|
||||
file_size_not_equal_to: "file size must be equal to %{exact} (current size is %{file_size})"
|
||||
total_file_size_not_less_than: "total file size must be less than %{max} (current size is %{total_file_size})"
|
||||
total_file_size_not_less_than_or_equal_to: "total file size must be less than or equal to %{max} (current size is %{total_file_size})"
|
||||
total_file_size_not_greater_than: "total file size must be greater than %{min} (current size is %{total_file_size})"
|
||||
total_file_size_not_greater_than_or_equal_to: "total file size must be greater than or equal to %{min} (current size is %{total_file_size})"
|
||||
total_file_size_not_between: "total file size must be between %{min} and %{max} (current size is %{total_file_size})"
|
||||
total_file_size_not_equal_to: "total file size must be equal to %{exact} (current size is %{total_file_size})"
|
||||
duration_not_less_than: "duration must be less than %{max} (current duration is %{duration})"
|
||||
duration_not_less_than_or_equal_to: "duration must be less than or equal to %{max} (current duration is %{duration})"
|
||||
duration_not_greater_than: "duration must be greater than %{min} (current duration is %{duration})"
|
||||
duration_not_greater_than_or_equal_to: "duration must be greater than or equal to %{min} (current duration is %{duration})"
|
||||
duration_not_between: "duration must be between %{min} and %{max} (current duration is %{duration})"
|
||||
duration_not_equal_to: "duration must be equal to %{exact} (current duration is %{duration})"
|
||||
limit_out_of_range:
|
||||
zero: "no files attached (must have between %{min} and %{max} files)"
|
||||
one: "only 1 file attached (must have between %{min} and %{max} files)"
|
||||
other: "total number of files must be between %{min} and %{max} files (there are %{count} files attached)"
|
||||
limit_min_not_reached:
|
||||
zero: "no files attached (must have at least %{min} files)"
|
||||
one: "only 1 file attached (must have at least %{min} files)"
|
||||
other: "%{count} files attached (must have at least %{min} files)"
|
||||
limit_max_exceeded:
|
||||
zero: "no files attached (maximum is %{max} files)"
|
||||
one: "too many files attached (maximum is %{max} files, got %{count})"
|
||||
other: "too many files attached (maximum is %{max} files, got %{count})"
|
||||
attachment_missing: "is missing its attachment"
|
||||
media_metadata_missing: "is not a valid media file"
|
||||
dimension_min_not_included_in: "must be greater than or equal to %{width} x %{height} pixels"
|
||||
dimension_max_not_included_in: "must be less than or equal to %{width} x %{height} pixels"
|
||||
dimension_width_not_included_in: "width is not included between %{min} and %{max} pixels"
|
||||
dimension_height_not_included_in: "height is not included between %{min} and %{max} pixels"
|
||||
dimension_width_not_greater_than_or_equal_to: "width must be greater than or equal to %{length} pixels"
|
||||
dimension_height_not_greater_than_or_equal_to: "height must be greater than or equal to %{length} pixels"
|
||||
dimension_width_not_less_than_or_equal_to: "width must be less than or equal to %{length} pixels"
|
||||
dimension_height_not_less_than_or_equal_to: "height must be less than or equal to %{length} pixels"
|
||||
dimension_width_not_equal_to: "width must be equal to %{length} pixels"
|
||||
dimension_height_not_equal_to: "height must be equal to %{length} pixels"
|
||||
aspect_ratio_not_square: "must be square (current file is %{width}x%{height}px)"
|
||||
aspect_ratio_not_portrait: "must be portrait (current file is %{width}x%{height}px)"
|
||||
aspect_ratio_not_landscape: "must be landscape (current file is %{width}x%{height}px)"
|
||||
aspect_ratio_not_x_y: "must be %{authorized_aspect_ratios} (current file is %{width}x%{height}px)"
|
||||
aspect_ratio_invalid: "has an invalid aspect ratio (valid aspect ratios are %{authorized_aspect_ratios})"
|
||||
file_not_processable: "is not identified as a valid media file"
|
||||
pages_not_less_than: "page count must be less than %{max} (current page count is %{pages})"
|
||||
pages_not_less_than_or_equal_to: "page count must be less than or equal to %{max} (current page count is %{pages})"
|
||||
pages_not_greater_than: "page count must be greater than %{min} (current page count is %{pages})"
|
||||
pages_not_greater_than_or_equal_to: "page count must be greater than or equal to %{min} (current page count is %{pages})"
|
||||
pages_not_between: "page count must be between %{min} and %{max} (current page count is %{pages})"
|
||||
pages_not_equal_to: "page count must be equal to %{exact} (current page count is %{pages})"
|
||||
not_found:
|
||||
title: "The page you were looking for doesn't exist (404)"
|
||||
message_html: "<b>Please try again</b> <p>This might be a temporary problem. Please click the back button to return to the previous screen or go back to <a href='/'>Home</a>and try again.</p> <b>Contact support <p>If the problem persists or is urgent, please tell us about it. Find our contact details from the global <a href='https://openfoodnetwork.org/ofn-local/' target='blank'>Open Food Network Local page</a>.</p> <p>It really helps us if you can give as much detail as possible about what the missing page is about.</p>"
|
||||
@@ -541,6 +581,7 @@ en_CA:
|
||||
errors:
|
||||
vine_api: "There was an error communicating with the API, please try again later."
|
||||
invalid_voucher: "The voucher is not valid"
|
||||
expired: "The voucher has expired"
|
||||
not_found_voucher: "Sorry, we couldn't find that voucher, please check the code."
|
||||
vine_voucher_redeemer_service:
|
||||
errors:
|
||||
@@ -550,6 +591,7 @@ en_CA:
|
||||
create_and_add_another: "Create and Add Another"
|
||||
create: "Create"
|
||||
cancel: "Cancel"
|
||||
cancel_order: "Cancel"
|
||||
resume: "Resume"
|
||||
save: "Save"
|
||||
edit: "Edit"
|
||||
@@ -3928,6 +3970,8 @@ en_CA:
|
||||
destroy:
|
||||
success: Webhook endpoint successfully deleted
|
||||
error: Webhood endpoint failed to delete
|
||||
test:
|
||||
success: Some test data will be sent to the webhook url
|
||||
spree:
|
||||
order_updated: "Order Updated"
|
||||
cannot_perform_operation: "Can not perform this operation"
|
||||
@@ -4034,6 +4078,8 @@ en_CA:
|
||||
logourl: "Logourl"
|
||||
are_you_sure_delete: "Are you sure you want to delete this record?"
|
||||
confirm_delete: "Confirm Deletion"
|
||||
tag_rule: "Tag Rule"
|
||||
voucher: "Voucher"
|
||||
configurations: "Configurations"
|
||||
general_settings: "General Settings"
|
||||
site_name: "Site Name"
|
||||
@@ -4759,13 +4805,10 @@ en_CA:
|
||||
webhook_endpoints:
|
||||
title: Webhook Endpoints
|
||||
description: Events in the system may trigger webhooks to external systems.
|
||||
event_types:
|
||||
order_cycle_opened: Order Cycle Opened
|
||||
event_type:
|
||||
header: Event type
|
||||
url:
|
||||
header: Endpoint URL
|
||||
create_placeholder: Enter the URL of the remove webhook endpoint
|
||||
developer_settings:
|
||||
title: Developer Settings
|
||||
form:
|
||||
@@ -4914,6 +4957,13 @@ en_CA:
|
||||
add_tag_rule_modal:
|
||||
select_rule_type: "Select a rule type:"
|
||||
add_rule: "Add Rule"
|
||||
webhook_endpoint_form:
|
||||
url:
|
||||
create_placeholder: Enter the URL of the remove webhook endpoint
|
||||
event_types:
|
||||
order_cycle_opened: Order Cycle Opened
|
||||
payment_status_changed: Post webhook on Payment status change
|
||||
test_endpoint: Test webhook endpoint
|
||||
invisible_captcha:
|
||||
sentence_for_humans: "Please leave empty"
|
||||
timestamp_error_message: "Please try again after 5 seconds."
|
||||
|
||||
@@ -283,6 +283,7 @@ en_DE:
|
||||
create_and_add_another: "Create and Add Another"
|
||||
create: "Create"
|
||||
cancel: "Cancel"
|
||||
cancel_order: "Cancel"
|
||||
save: "Save"
|
||||
edit: "Edit"
|
||||
update: "Update"
|
||||
|
||||
@@ -115,27 +115,6 @@ en_FR:
|
||||
blank: "can't be blank"
|
||||
too_short: "is too short (minimum is %{count} characters)"
|
||||
errors:
|
||||
messages:
|
||||
content_type_invalid: "has an invalid content type"
|
||||
file_size_out_of_range: "size %{file_size} is not between required range"
|
||||
limit_out_of_range: "total number is out of range"
|
||||
image_metadata_missing: "is not a valid image"
|
||||
dimension_min_inclusion: "must be greater than or equal to %{width} x %{height} pixel."
|
||||
dimension_max_inclusion: "must be less than or equal to %{width} x %{height} pixel."
|
||||
dimension_width_inclusion: "width is not included between %{min} and %{max} pixel."
|
||||
dimension_height_inclusion: "height is not included between %{min} and %{max} pixel."
|
||||
dimension_width_greater_than_or_equal_to: "width must be greater than or equal to %{length} pixel."
|
||||
dimension_height_greater_than_or_equal_to: "height must be greater than or equal to %{length} pixel."
|
||||
dimension_width_less_than_or_equal_to: "width must be less than or equal to %{length} pixel."
|
||||
dimension_height_less_than_or_equal_to: "height must be less than or equal to %{length} pixel."
|
||||
dimension_width_equal_to: "width must be equal to %{length} pixel."
|
||||
dimension_height_equal_to: "height must be equal to %{length} pixel."
|
||||
aspect_ratio_not_square: "must be a square image"
|
||||
aspect_ratio_not_portrait: "must be a portrait image"
|
||||
aspect_ratio_not_landscape: "must be a landscape image"
|
||||
aspect_ratio_is_not: "must have an aspect ratio of %{aspect_ratio}"
|
||||
aspect_ratio_unknown: "has an unknown aspect ratio"
|
||||
image_not_processable: "is not a valid image"
|
||||
not_found:
|
||||
title: "The page you were looking for doesn't exist (404)"
|
||||
message_html: "<b> Please try again </b> <p> This might be a temporary problem. Please click the back button to return to the previous screen or go back to <a href='/'> Home </a> and try again. </p> <b> Contact support </b> <p> f the problem persists or is urgent, please tell us about it. </p>"
|
||||
@@ -550,6 +529,7 @@ en_FR:
|
||||
create_and_add_another: "Create and Add Another"
|
||||
create: "Create"
|
||||
cancel: "Cancel"
|
||||
cancel_order: "Cancel"
|
||||
resume: "Resume"
|
||||
save: "Save"
|
||||
edit: "Edit"
|
||||
@@ -4035,6 +4015,7 @@ en_FR:
|
||||
logourl: "Logourl"
|
||||
are_you_sure_delete: "Are you sure you want to delete this record?"
|
||||
confirm_delete: "Confirm Deletion"
|
||||
voucher: "Voucher"
|
||||
configurations: "Configurations"
|
||||
general_settings: "General Settings"
|
||||
site_name: "Site Name"
|
||||
@@ -4760,13 +4741,10 @@ en_FR:
|
||||
webhook_endpoints:
|
||||
title: Webhook Endpoints
|
||||
description: Events in the system may trigger webhooks to external systems.
|
||||
event_types:
|
||||
order_cycle_opened: Order Cycle Opened
|
||||
event_type:
|
||||
header: Event type
|
||||
url:
|
||||
header: Endpoint URL
|
||||
create_placeholder: Enter the URL of the remote webhook endpoint
|
||||
developer_settings:
|
||||
title: Developer Settings
|
||||
form:
|
||||
@@ -4915,6 +4893,11 @@ en_FR:
|
||||
add_tag_rule_modal:
|
||||
select_rule_type: "Select a rule type:"
|
||||
add_rule: "Add Rule"
|
||||
webhook_endpoint_form:
|
||||
url:
|
||||
create_placeholder: Enter the URL of the remote webhook endpoint
|
||||
event_types:
|
||||
order_cycle_opened: Order Cycle Opened
|
||||
invisible_captcha:
|
||||
sentence_for_humans: "Please leave empty"
|
||||
timestamp_error_message: "Please try again after 5 seconds."
|
||||
|
||||
@@ -115,27 +115,6 @@ en_GB:
|
||||
blank: "can't be blank"
|
||||
too_short: "is too short (minimum is %{count} characters)"
|
||||
errors:
|
||||
messages:
|
||||
content_type_invalid: "has an invalid content type"
|
||||
file_size_out_of_range: "size %{file_size} is not between required range"
|
||||
limit_out_of_range: "total number is out of range"
|
||||
image_metadata_missing: "is not a valid image"
|
||||
dimension_min_inclusion: "must be greater than or equal to %{width} x %{height} pixel."
|
||||
dimension_max_inclusion: "must be less than or equal to %{width} x %{height} pixel."
|
||||
dimension_width_inclusion: "width is not included between %{min} and %{max} pixel."
|
||||
dimension_height_inclusion: "height is not included between %{min} and %{max} pixel."
|
||||
dimension_width_greater_than_or_equal_to: "width must be greater than or equal to %{length} pixel."
|
||||
dimension_height_greater_than_or_equal_to: "height must be greater than or equal to %{length} pixel."
|
||||
dimension_width_less_than_or_equal_to: "width must be less than or equal to %{length} pixel."
|
||||
dimension_height_less_than_or_equal_to: "height must be less than or equal to %{length} pixel."
|
||||
dimension_width_equal_to: "width must be equal to %{length} pixel."
|
||||
dimension_height_equal_to: "height must be equal to %{length} pixel."
|
||||
aspect_ratio_not_square: "must be a square image"
|
||||
aspect_ratio_not_portrait: "must be a portrait image"
|
||||
aspect_ratio_not_landscape: "must be a landscape image"
|
||||
aspect_ratio_is_not: "must have an aspect ratio of %{aspect_ratio}"
|
||||
aspect_ratio_unknown: "has an unknown aspect ratio"
|
||||
image_not_processable: "is not a valid image"
|
||||
not_found:
|
||||
title: "The page you were looking for doesn't exist (404)"
|
||||
message_html: "<b>Please try again</b> <p>This might be a temporary problem. Please click the back button to return to the previous screen or go back to <a href='/'>Home</a> and try again.</p> <b>Contact support</b> <p>If the problem persists or is urgent, please tell us about it. Find our contact details from the global <a href='https://openfoodnetwork.org/ofn-local/' target='blank'>Open Food Network Local page</a>.</p> <p>It really helps us if you can give as much detail as possible about what the missing page is about.</p>"
|
||||
@@ -550,6 +529,7 @@ en_GB:
|
||||
create_and_add_another: "Create and Add Another"
|
||||
create: "Create"
|
||||
cancel: "Cancel"
|
||||
cancel_order: "Cancel"
|
||||
resume: "Resume"
|
||||
save: "Save"
|
||||
edit: "Edit"
|
||||
@@ -4036,6 +4016,7 @@ en_GB:
|
||||
logourl: "Logo url"
|
||||
are_you_sure_delete: "Are you sure you want to delete this record?"
|
||||
confirm_delete: "Confirm Deletion"
|
||||
voucher: "Voucher"
|
||||
configurations: "Configurations"
|
||||
general_settings: "General Settings"
|
||||
site_name: "Site Name"
|
||||
@@ -4761,13 +4742,10 @@ en_GB:
|
||||
webhook_endpoints:
|
||||
title: Webhook Endpoints
|
||||
description: Events in the system may trigger webhooks to external systems.
|
||||
event_types:
|
||||
order_cycle_opened: Order Cycle Opened
|
||||
event_type:
|
||||
header: Event type
|
||||
url:
|
||||
header: Endpoint URL
|
||||
create_placeholder: Enter the URL of the remote webhook endpoint
|
||||
developer_settings:
|
||||
title: Developer Settings
|
||||
form:
|
||||
@@ -4915,6 +4893,11 @@ en_GB:
|
||||
add_tag_rule_modal:
|
||||
select_rule_type: "Select a rule type:"
|
||||
add_rule: "Add Rule"
|
||||
webhook_endpoint_form:
|
||||
url:
|
||||
create_placeholder: Enter the URL of the remote webhook endpoint
|
||||
event_types:
|
||||
order_cycle_opened: Order Cycle Opened
|
||||
invisible_captcha:
|
||||
sentence_for_humans: "Please leave empty"
|
||||
timestamp_error_message: "Please try again after 5 seconds."
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user