mirror of
https://github.com/openfoodfoundation/openfoodnetwork
synced 2026-01-15 19:06:50 +00:00
Compare commits
378 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
36aabbb5b6 | ||
|
|
82f38c9aea | ||
|
|
689720b749 | ||
|
|
50600b9d00 | ||
|
|
abdef21381 | ||
|
|
4a3bd510a7 | ||
|
|
bb85473eba | ||
|
|
d5fa5e298e | ||
|
|
dab4939819 | ||
|
|
43b29af922 | ||
|
|
2c1acc14e6 | ||
|
|
84f9da4a23 | ||
|
|
d817319aa4 | ||
|
|
093b851395 | ||
|
|
e3a150226e | ||
|
|
5122ed9af4 | ||
|
|
ac5a3beb15 | ||
|
|
19481fc55e | ||
|
|
c8cab8aae5 | ||
|
|
d7428015ac | ||
|
|
700f91efb5 | ||
|
|
43e4047447 | ||
|
|
892e843e9e | ||
|
|
85904f57b8 | ||
|
|
b5e23717f2 | ||
|
|
d8d99c930e | ||
|
|
ce96094f49 | ||
|
|
6c655e6fbc | ||
|
|
2d1483febb | ||
|
|
42d7383ff0 | ||
|
|
df4ddf45c4 | ||
|
|
e0b40222dd | ||
|
|
61928cbc05 | ||
|
|
c6884f96e1 | ||
|
|
f0b5a04f6b | ||
|
|
b8ffddb533 | ||
|
|
71536767b5 | ||
|
|
938056d1d8 | ||
|
|
63d2d69d08 | ||
|
|
78ec086111 | ||
|
|
2aded5b459 | ||
|
|
5aa6b14756 | ||
|
|
07bd84ffbb | ||
|
|
d2794f328f | ||
|
|
8b146fc72a | ||
|
|
0c491a6651 | ||
|
|
e8529754f1 | ||
|
|
d95dc84c34 | ||
|
|
b61ee0211f | ||
|
|
c777a00874 | ||
|
|
a0a2dab44f | ||
|
|
f0aa7f44a5 | ||
|
|
a51940937a | ||
|
|
f1e401070a | ||
|
|
999b04ef99 | ||
|
|
da5e8fcb9f | ||
|
|
e22b9997fe | ||
|
|
609cbe2893 | ||
|
|
425970aba2 | ||
|
|
ace5151afa | ||
|
|
3b652581b5 | ||
|
|
17692e722a | ||
|
|
a2826b0fdf | ||
|
|
d766f6c0b2 | ||
|
|
0f715e531c | ||
|
|
fba83f847b | ||
|
|
5603745744 | ||
|
|
2b2f9c205e | ||
|
|
feff2b726b | ||
|
|
8b3d513aa2 | ||
|
|
dd17f98edb | ||
|
|
c9adcd1479 | ||
|
|
29c8b0b1a5 | ||
|
|
6404c7427c | ||
|
|
85eab5b436 | ||
|
|
912713a0c9 | ||
|
|
ca3b9f8085 | ||
|
|
ac00a20639 | ||
|
|
139c994e06 | ||
|
|
3621616f7c | ||
|
|
41ddd653a0 | ||
|
|
d8c7c0141a | ||
|
|
3fa2dd4772 | ||
|
|
cf26c465cc | ||
|
|
1bc50fd7cb | ||
|
|
719724de0b | ||
|
|
804ed81acb | ||
|
|
e980f8882c | ||
|
|
73f910e90c | ||
|
|
5135d32cd8 | ||
|
|
91d87c887b | ||
|
|
786fe55fc8 | ||
|
|
b202678a6b | ||
|
|
0e8d2d307b | ||
|
|
832b8caa8b | ||
|
|
a50b75659f | ||
|
|
df44898557 | ||
|
|
5a70985e0e | ||
|
|
4791b570e4 | ||
|
|
f087b7184c | ||
|
|
fa9c2b24f2 | ||
|
|
e3683d25ca | ||
|
|
21c0baa965 | ||
|
|
75a8d9caf0 | ||
|
|
1089a66fff | ||
|
|
1feb7b4065 | ||
|
|
e7cbcf2b51 | ||
|
|
7b7c6ec7d7 | ||
|
|
db99ecf255 | ||
|
|
87846529a2 | ||
|
|
e50f298a0a | ||
|
|
bbc54d4467 | ||
|
|
006bcd2cf8 | ||
|
|
e56c803610 | ||
|
|
5a9ff58bcf | ||
|
|
7747f2592e | ||
|
|
59504c3d84 | ||
|
|
57535af982 | ||
|
|
66358240dc | ||
|
|
a283a7fe49 | ||
|
|
42cdfe3c1e | ||
|
|
806dd6254b | ||
|
|
40b53442a8 | ||
|
|
7662d3fd6a | ||
|
|
e4ea9d8cd1 | ||
|
|
c6374555b9 | ||
|
|
bda5ca33d9 | ||
|
|
7a10037de8 | ||
|
|
a8d5fede17 | ||
|
|
daa2bd5127 | ||
|
|
506574aefd | ||
|
|
4f099da58f | ||
|
|
59c9f0957b | ||
|
|
6baa36cdaa | ||
|
|
e0a8b320a9 | ||
|
|
116f503cf6 | ||
|
|
023ebe1909 | ||
|
|
d54eb48662 | ||
|
|
542e8e22bf | ||
|
|
e0426d6dc0 | ||
|
|
a09900c98d | ||
|
|
f563fcad7f | ||
|
|
34b76f8683 | ||
|
|
ec82bdda97 | ||
|
|
e4c2df4989 | ||
|
|
a1f577dc01 | ||
|
|
edbf92424d | ||
|
|
35c18664fc | ||
|
|
be568cdfa6 | ||
|
|
0bb90d764c | ||
|
|
34c8748b9c | ||
|
|
875c22346e | ||
|
|
c57d5a2408 | ||
|
|
825058472b | ||
|
|
b419f063dc | ||
|
|
0ebc803e22 | ||
|
|
cd2119707a | ||
|
|
8c27406a7a | ||
|
|
b6defc76a8 | ||
|
|
50529d7ab3 | ||
|
|
b695f3d47f | ||
|
|
90ce61fa47 | ||
|
|
7c2352f2d6 | ||
|
|
ef7194af85 | ||
|
|
09adc8f690 | ||
|
|
86b448445f | ||
|
|
ba9ba7da95 | ||
|
|
f02e1ea04a | ||
|
|
f88b31ec67 | ||
|
|
6906dd47e8 | ||
|
|
2a35c48498 | ||
|
|
ce0031934a | ||
|
|
4766c7a00b | ||
|
|
9d470c7a18 | ||
|
|
9cb0d66f39 | ||
|
|
7ba6f8c04b | ||
|
|
19ff6d011a | ||
|
|
9b1dcdcc78 | ||
|
|
5eb3c486b2 | ||
|
|
20ee0d5009 | ||
|
|
a3cb1e6ecc | ||
|
|
89d68c7708 | ||
|
|
371d517436 | ||
|
|
17a016eca5 | ||
|
|
2b67a0fa80 | ||
|
|
84fcc8f1ac | ||
|
|
baefe37d0b | ||
|
|
1e13d579ba | ||
|
|
becfb09b3c | ||
|
|
4767030035 | ||
|
|
b20385db95 | ||
|
|
019911068a | ||
|
|
da266fed40 | ||
|
|
dd6c066f5a | ||
|
|
9de939c1b1 | ||
|
|
35030bfd02 | ||
|
|
3833fb6e52 | ||
|
|
0a03c0a0fb | ||
|
|
0599acbcb8 | ||
|
|
97dcd44662 | ||
|
|
1165c997bc | ||
|
|
1d54777d72 | ||
|
|
0144e940c4 | ||
|
|
753a643bf1 | ||
|
|
19018c2564 | ||
|
|
c8a65d2fac | ||
|
|
6c0d4cffe5 | ||
|
|
6b042e4a17 | ||
|
|
ae2c56b29d | ||
|
|
55feb7648d | ||
|
|
cc135c8190 | ||
|
|
2f01351ad2 | ||
|
|
3d6842db80 | ||
|
|
e1dd92b406 | ||
|
|
a8160aac8a | ||
|
|
5e7bfc05d2 | ||
|
|
3c741f0686 | ||
|
|
afa40ea82f | ||
|
|
6a9fcd0b30 | ||
|
|
a80cf37fa6 | ||
|
|
073bad2118 | ||
|
|
6ad0749ce8 | ||
|
|
5a40ccb7df | ||
|
|
a56375eaf8 | ||
|
|
5221e776da | ||
|
|
a290779ef7 | ||
|
|
ac2b8e1ebe | ||
|
|
a1adcadd6c | ||
|
|
4a53c818fd | ||
|
|
fa59117fd5 | ||
|
|
3b6b2ea936 | ||
|
|
ef4a71c048 | ||
|
|
bc82401c24 | ||
|
|
849ceeaa96 | ||
|
|
77bac0c24e | ||
|
|
227220e2a6 | ||
|
|
b88c85555e | ||
|
|
b7a49ced39 | ||
|
|
dc31ebebb1 | ||
|
|
2f550725e3 | ||
|
|
3834724d45 | ||
|
|
ce39f3c119 | ||
|
|
7aaa31b137 | ||
|
|
656143db48 | ||
|
|
decfbc9658 | ||
|
|
e91a87d83b | ||
|
|
040422c6c0 | ||
|
|
7535883416 | ||
|
|
f71c84cea5 | ||
|
|
1586320115 | ||
|
|
13f81ca20e | ||
|
|
25b5b66ae1 | ||
|
|
f2b02f6c6b | ||
|
|
3139ba7ad0 | ||
|
|
1ab1e20bb7 | ||
|
|
f3806ea5ea | ||
|
|
182a7f0f93 | ||
|
|
6f228781d4 | ||
|
|
c39b00b6c2 | ||
|
|
06b1c9aa40 | ||
|
|
75b71738df | ||
|
|
8cb07c4a37 | ||
|
|
4cbd520cb9 | ||
|
|
b2a0310e6f | ||
|
|
d71994189c | ||
|
|
89809aed5f | ||
|
|
de8c71d098 | ||
|
|
576faff3d7 | ||
|
|
90af6bd22d | ||
|
|
3f1099d968 | ||
|
|
7fbe893927 | ||
|
|
c6ab9f8a6a | ||
|
|
e4be757d96 | ||
|
|
e44845c327 | ||
|
|
c8cab86b0c | ||
|
|
a3cbe8e878 | ||
|
|
727c74907d | ||
|
|
04c38a3c1d | ||
|
|
9b51f85e9a | ||
|
|
90fe3fc66c | ||
|
|
5a2aee6d79 | ||
|
|
544377a624 | ||
|
|
2a49b91a8b | ||
|
|
8abd636b68 | ||
|
|
244cce7392 | ||
|
|
9d39efdd7b | ||
|
|
a0531ca356 | ||
|
|
8cac98ceb4 | ||
|
|
3d5d9d1191 | ||
|
|
a5f6773a4d | ||
|
|
e563de0248 | ||
|
|
81d2e63d6f | ||
|
|
43b09640a9 | ||
|
|
9b2ae41392 | ||
|
|
066879fe62 | ||
|
|
54ec4e5016 | ||
|
|
e483ef8ccd | ||
|
|
0deb3cd782 | ||
|
|
624485ff25 | ||
|
|
cace62a718 | ||
|
|
77360f41af | ||
|
|
79e762a815 | ||
|
|
62ee3c2de1 | ||
|
|
b565b6ba4d | ||
|
|
a2bc61475b | ||
|
|
8052e8b775 | ||
|
|
e4d290d59c | ||
|
|
96df2cb307 | ||
|
|
1bc13215a2 | ||
|
|
a09b1ce54c | ||
|
|
122421be0f | ||
|
|
899a796896 | ||
|
|
deb22d788f | ||
|
|
77d12a3e54 | ||
|
|
d245609b16 | ||
|
|
b806e08624 | ||
|
|
b902de652a | ||
|
|
0afd0fe2f1 | ||
|
|
8ba59079b3 | ||
|
|
8d66f33230 | ||
|
|
77e384ab71 | ||
|
|
7a1bd660c4 | ||
|
|
0ed56a46af | ||
|
|
fdba33baa3 | ||
|
|
6f303a5244 | ||
|
|
850ad5165c | ||
|
|
85e3111e75 | ||
|
|
5ad09a6fab | ||
|
|
bb6298d06d | ||
|
|
3a1fde40c5 | ||
|
|
43b6ab5dc5 | ||
|
|
ee464ca457 | ||
|
|
c27f35ee6e | ||
|
|
79cc8b6f3e | ||
|
|
1676dba9da | ||
|
|
e26e6bb855 | ||
|
|
c2c8e8dfcd | ||
|
|
61f0b433aa | ||
|
|
e2e455533e | ||
|
|
2ba9d250f2 | ||
|
|
79bf8f0053 | ||
|
|
721fc0fd3f | ||
|
|
6a80cb8bfa | ||
|
|
8d5616b351 | ||
|
|
45214ed923 | ||
|
|
e28905b176 | ||
|
|
d63aca3129 | ||
|
|
be7d44a603 | ||
|
|
98eecb1b3e | ||
|
|
db8eb52359 | ||
|
|
b0d29c6dbc | ||
|
|
54bcd75f3f | ||
|
|
32e247bf75 | ||
|
|
5892eab4e3 | ||
|
|
9da7bcb134 | ||
|
|
0ce5718b2b | ||
|
|
d12754fe83 | ||
|
|
00f3a698f4 | ||
|
|
12eff626f4 | ||
|
|
eee7075d9d | ||
|
|
f12d62604b | ||
|
|
d77c693829 | ||
|
|
5e5ade9681 | ||
|
|
4c0d7c039f | ||
|
|
5da9ec7dc2 | ||
|
|
edf1dd52eb | ||
|
|
400a490ec5 | ||
|
|
3c05fc3c80 | ||
|
|
976e326bbd | ||
|
|
fd4409c24d | ||
|
|
85a1a3627a | ||
|
|
9ab672d0b1 | ||
|
|
f3ff835902 | ||
|
|
004c7eef9e | ||
|
|
f3f0a84915 | ||
|
|
5f11b6a650 | ||
|
|
6b733ad7e2 | ||
|
|
831aa3aae0 |
13
.github/FUNDING.yml
vendored
Normal file
13
.github/FUNDING.yml
vendored
Normal file
@@ -0,0 +1,13 @@
|
||||
# These are supported funding model platforms
|
||||
|
||||
github: openfoodfoundation
|
||||
patreon: # Replace with a single Patreon username
|
||||
open_collective: #
|
||||
ko_fi: # Replace with a single Ko-fi username
|
||||
tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel
|
||||
community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry
|
||||
liberapay: # Replace with a single Liberapay username
|
||||
issuehunt: # Replace with a single IssueHunt username
|
||||
otechie: # Replace with a single Otechie username
|
||||
lfx_crowdfunding: # Replace with a single LFX Crowdfunding project-name e.g., cloud-foundry
|
||||
custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2']
|
||||
19
.github/ISSUE_TEMPLATE/release.md
vendored
19
.github/ISSUE_TEMPLATE/release.md
vendored
@@ -10,7 +10,6 @@ assignees: ''
|
||||
## Preparation on Thursday
|
||||
|
||||
- [ ] Merge pull requests in the [Ready To Go] column
|
||||
- [ ] Merge [Transifex pull request]
|
||||
- [ ] Include translations: `tx pull --force`
|
||||
- [ ] [Draft new release]. Look at previous [releases] for inspiration.
|
||||
- [ ] Notify [#instance-managers] of user-facing changes.
|
||||
@@ -18,24 +17,12 @@ assignees: ''
|
||||
## Testing
|
||||
|
||||
- [ ] [Find build] of the release commit and copy it below.
|
||||
- [ ] Move this issue to Test Ready and notify testers.
|
||||
- [ ] Test: :warning: link to the build of the release commit https://semaphoreci.com/openfoodfoundation/openfoodnetwork-2/branches/master
|
||||
- [ ] Move this issue to Test Ready.
|
||||
- [ ] Notify testers.
|
||||
- [ ] Test build: <!-- paste build link here, e.g. https://semaphore...builds/1234 -->
|
||||
|
||||
## Finish on Tuesday
|
||||
|
||||
- [ ] Update translations unless content has been removed from config/locales/en.yml between this release draft and current master.
|
||||
<details><summary>Command line instructions</summary>
|
||||
<pre>
|
||||
git checkout master # same version as the release draft
|
||||
git fetch upstream
|
||||
git diff upstream/master -- config/locales/en.yml
|
||||
tx pull --force # if no changes or only additions in the locale
|
||||
git checkout --detach # if we need to commit new translations
|
||||
git commit -a -m "Update translations"
|
||||
git tag vx.y.z # put the release number in here
|
||||
git push upstream vx.y.z
|
||||
</pre>
|
||||
</details>
|
||||
- [ ] Publish and notify [#global-community]:
|
||||
> The next release is ready: https://github.com/openfoodfoundation/openfoodnetwork/releases/latest
|
||||
- [ ] Deploy the new release to all managed instances.
|
||||
|
||||
13
.github/workflows/linters.yml
vendored
13
.github/workflows/linters.yml
vendored
@@ -16,3 +16,16 @@ jobs:
|
||||
reporter: github-pr-check
|
||||
level: error
|
||||
fail_on_error: true
|
||||
prettier:
|
||||
name: runner / prettier
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Check out code
|
||||
uses: actions/checkout@v2
|
||||
- name: prettier
|
||||
uses: EPMatt/reviewdog-action-prettier@v1
|
||||
with:
|
||||
github_token: ${{ secrets.github_token }}
|
||||
reporter: github-pr-check
|
||||
level: error
|
||||
fail_on_error: true
|
||||
|
||||
2
.github/workflows/mapi.yml
vendored
2
.github/workflows/mapi.yml
vendored
@@ -1,5 +1,5 @@
|
||||
name: 'Mayhem for API'
|
||||
on: [push]
|
||||
on: workflow_dispatch
|
||||
jobs:
|
||||
test:
|
||||
if: ${{ github.repository_owner == 'openfoodfoundation' }}
|
||||
|
||||
4
.husky/pre-commit
Executable file
4
.husky/pre-commit
Executable file
@@ -0,0 +1,4 @@
|
||||
#!/usr/bin/env sh
|
||||
. "$(dirname -- "$0")/_/husky.sh"
|
||||
|
||||
yarn pretty-quick --check --staged
|
||||
21
.prettierignore
Normal file
21
.prettierignore
Normal file
@@ -0,0 +1,21 @@
|
||||
# Basically, ignore everythings expect app/webpacker/controllers/*.js and app/webpacker/packs/*.js
|
||||
*.css
|
||||
*.scss
|
||||
*.md
|
||||
*.yml
|
||||
*.yaml
|
||||
*.json
|
||||
*.html
|
||||
|
||||
babel.config.js
|
||||
postcss.config.js
|
||||
|
||||
.storybook/
|
||||
/app/assets/
|
||||
/config/
|
||||
/coverage/
|
||||
/engines/
|
||||
/public/
|
||||
/spec/
|
||||
/tmp/
|
||||
/vendor/
|
||||
1
.prettierrc.json
Normal file
1
.prettierrc.json
Normal file
@@ -0,0 +1 @@
|
||||
{}
|
||||
7
Gemfile
7
Gemfile
@@ -104,7 +104,7 @@ gem 'wicked_pdf'
|
||||
gem 'wkhtmltopdf-binary'
|
||||
|
||||
gem 'immigrant'
|
||||
gem 'roo', github: "roo-rb/roo" # master is currently needed for Ruby 3.x (awaiting new release)
|
||||
gem 'roo'
|
||||
gem 'spreadsheet_architect'
|
||||
|
||||
gem 'whenever', require: false
|
||||
@@ -140,8 +140,6 @@ group :production, :staging do
|
||||
end
|
||||
|
||||
group :test, :development do
|
||||
# Pretty printed test output
|
||||
gem 'awesome_print'
|
||||
gem 'bullet'
|
||||
gem 'capybara'
|
||||
gem 'cuprite'
|
||||
@@ -158,10 +156,10 @@ group :test, :development do
|
||||
gem 'shoulda-matchers'
|
||||
gem 'timecop'
|
||||
gem 'webdrivers'
|
||||
gem 'debug', '>= 1.0.0'
|
||||
end
|
||||
|
||||
group :test do
|
||||
gem 'byebug'
|
||||
gem 'pdf-reader'
|
||||
gem 'rails-controller-testing'
|
||||
gem 'simplecov', require: false
|
||||
@@ -176,7 +174,6 @@ group :development do
|
||||
gem 'foreman'
|
||||
gem 'listen'
|
||||
gem 'pry', '~> 0.13.0'
|
||||
gem 'pry-byebug', '~> 3.9.0'
|
||||
gem 'rubocop'
|
||||
gem 'rubocop-rails'
|
||||
gem 'spring'
|
||||
|
||||
376
Gemfile.lock
376
Gemfile.lock
@@ -24,14 +24,6 @@ GIT
|
||||
sass-rails
|
||||
thor (>= 0.14)
|
||||
|
||||
GIT
|
||||
remote: https://github.com/roo-rb/roo.git
|
||||
revision: 709464c77623be2bc09b2103405d90ded7604a75
|
||||
specs:
|
||||
roo (2.8.3)
|
||||
nokogiri (~> 1)
|
||||
rubyzip (>= 1.3.0, < 3.0.0)
|
||||
|
||||
PATH
|
||||
remote: engines/catalog
|
||||
specs:
|
||||
@@ -59,67 +51,67 @@ GEM
|
||||
remote: https://rubygems.org/
|
||||
specs:
|
||||
Ascii85 (1.1.0)
|
||||
actioncable (6.1.4.4)
|
||||
actionpack (= 6.1.4.4)
|
||||
activesupport (= 6.1.4.4)
|
||||
actioncable (6.1.6.1)
|
||||
actionpack (= 6.1.6.1)
|
||||
activesupport (= 6.1.6.1)
|
||||
nio4r (~> 2.0)
|
||||
websocket-driver (>= 0.6.1)
|
||||
actionmailbox (6.1.4.4)
|
||||
actionpack (= 6.1.4.4)
|
||||
activejob (= 6.1.4.4)
|
||||
activerecord (= 6.1.4.4)
|
||||
activestorage (= 6.1.4.4)
|
||||
activesupport (= 6.1.4.4)
|
||||
actionmailbox (6.1.6.1)
|
||||
actionpack (= 6.1.6.1)
|
||||
activejob (= 6.1.6.1)
|
||||
activerecord (= 6.1.6.1)
|
||||
activestorage (= 6.1.6.1)
|
||||
activesupport (= 6.1.6.1)
|
||||
mail (>= 2.7.1)
|
||||
actionmailer (6.1.4.4)
|
||||
actionpack (= 6.1.4.4)
|
||||
actionview (= 6.1.4.4)
|
||||
activejob (= 6.1.4.4)
|
||||
activesupport (= 6.1.4.4)
|
||||
actionmailer (6.1.6.1)
|
||||
actionpack (= 6.1.6.1)
|
||||
actionview (= 6.1.6.1)
|
||||
activejob (= 6.1.6.1)
|
||||
activesupport (= 6.1.6.1)
|
||||
mail (~> 2.5, >= 2.5.4)
|
||||
rails-dom-testing (~> 2.0)
|
||||
actionpack (6.1.4.4)
|
||||
actionview (= 6.1.4.4)
|
||||
activesupport (= 6.1.4.4)
|
||||
actionpack (6.1.6.1)
|
||||
actionview (= 6.1.6.1)
|
||||
activesupport (= 6.1.6.1)
|
||||
rack (~> 2.0, >= 2.0.9)
|
||||
rack-test (>= 0.6.3)
|
||||
rails-dom-testing (~> 2.0)
|
||||
rails-html-sanitizer (~> 1.0, >= 1.2.0)
|
||||
actionpack-action_caching (1.2.2)
|
||||
actionpack (>= 4.0.0)
|
||||
actiontext (6.1.4.4)
|
||||
actionpack (= 6.1.4.4)
|
||||
activerecord (= 6.1.4.4)
|
||||
activestorage (= 6.1.4.4)
|
||||
activesupport (= 6.1.4.4)
|
||||
actiontext (6.1.6.1)
|
||||
actionpack (= 6.1.6.1)
|
||||
activerecord (= 6.1.6.1)
|
||||
activestorage (= 6.1.6.1)
|
||||
activesupport (= 6.1.6.1)
|
||||
nokogiri (>= 1.8.5)
|
||||
actionview (6.1.4.4)
|
||||
activesupport (= 6.1.4.4)
|
||||
actionview (6.1.6.1)
|
||||
activesupport (= 6.1.6.1)
|
||||
builder (~> 3.1)
|
||||
erubi (~> 1.4)
|
||||
rails-dom-testing (~> 2.0)
|
||||
rails-html-sanitizer (~> 1.1, >= 1.2.0)
|
||||
active_model_serializers (0.8.4)
|
||||
activemodel (>= 3.0)
|
||||
active_storage_validations (0.9.7)
|
||||
active_storage_validations (0.9.8)
|
||||
activejob (>= 5.2.0)
|
||||
activemodel (>= 5.2.0)
|
||||
activestorage (>= 5.2.0)
|
||||
activesupport (>= 5.2.0)
|
||||
activejob (6.1.4.4)
|
||||
activesupport (= 6.1.4.4)
|
||||
activejob (6.1.6.1)
|
||||
activesupport (= 6.1.6.1)
|
||||
globalid (>= 0.3.6)
|
||||
activemerchant (1.123.0)
|
||||
activemerchant (1.126.0)
|
||||
activesupport (>= 4.2)
|
||||
builder (>= 2.1.2, < 4.0.0)
|
||||
i18n (>= 0.6.9)
|
||||
nokogiri (~> 1.4)
|
||||
activemodel (6.1.4.4)
|
||||
activesupport (= 6.1.4.4)
|
||||
activerecord (6.1.4.4)
|
||||
activemodel (= 6.1.4.4)
|
||||
activesupport (= 6.1.4.4)
|
||||
activerecord-import (1.3.0)
|
||||
activemodel (6.1.6.1)
|
||||
activesupport (= 6.1.6.1)
|
||||
activerecord (6.1.6.1)
|
||||
activemodel (= 6.1.6.1)
|
||||
activesupport (= 6.1.6.1)
|
||||
activerecord-import (1.4.0)
|
||||
activerecord (>= 4.2)
|
||||
activerecord-postgresql-adapter (0.0.1)
|
||||
pg
|
||||
@@ -129,14 +121,14 @@ GEM
|
||||
multi_json (~> 1.11, >= 1.11.2)
|
||||
rack (>= 2.0.8, < 3)
|
||||
railties (>= 5.2.4.1)
|
||||
activestorage (6.1.4.4)
|
||||
actionpack (= 6.1.4.4)
|
||||
activejob (= 6.1.4.4)
|
||||
activerecord (= 6.1.4.4)
|
||||
activesupport (= 6.1.4.4)
|
||||
marcel (~> 1.0.0)
|
||||
activestorage (6.1.6.1)
|
||||
actionpack (= 6.1.6.1)
|
||||
activejob (= 6.1.6.1)
|
||||
activerecord (= 6.1.6.1)
|
||||
activesupport (= 6.1.6.1)
|
||||
marcel (~> 1.0)
|
||||
mini_mime (>= 1.1.0)
|
||||
activesupport (6.1.4.4)
|
||||
activesupport (6.1.6.1)
|
||||
concurrent-ruby (~> 1.0, >= 1.0.2)
|
||||
i18n (>= 1.6, < 2)
|
||||
minitest (>= 5.1)
|
||||
@@ -149,56 +141,55 @@ GEM
|
||||
addressable (2.8.0)
|
||||
public_suffix (>= 2.0.2, < 5.0)
|
||||
afm (0.2.2)
|
||||
angular-rails-templates (1.1.0)
|
||||
railties (>= 4.2, < 7)
|
||||
angular-rails-templates (1.2.0)
|
||||
railties (>= 5.0, < 7.1)
|
||||
sprockets (>= 3.0, < 5)
|
||||
sprockets-rails
|
||||
tilt
|
||||
angular_rails_csrf (4.5.0)
|
||||
railties (>= 3, < 7)
|
||||
angular_rails_csrf (5.0.0)
|
||||
railties (>= 3, < 8)
|
||||
angularjs-file-upload-rails (2.4.1)
|
||||
angularjs-rails (1.8.0)
|
||||
arel-helpers (2.12.1)
|
||||
activerecord (>= 3.1.0, < 7)
|
||||
arel-helpers (2.14.0)
|
||||
activerecord (>= 3.1.0, < 8)
|
||||
ast (2.4.2)
|
||||
awesome_nested_set (3.4.0)
|
||||
activerecord (>= 4.0.0, < 7.0)
|
||||
awesome_print (1.9.2)
|
||||
awesome_nested_set (3.5.0)
|
||||
activerecord (>= 4.0.0, < 7.1)
|
||||
aws-eventstream (1.2.0)
|
||||
aws-partitions (1.570.0)
|
||||
aws-sdk-core (3.130.0)
|
||||
aws-partitions (1.601.0)
|
||||
aws-sdk-core (3.131.2)
|
||||
aws-eventstream (~> 1, >= 1.0.2)
|
||||
aws-partitions (~> 1, >= 1.525.0)
|
||||
aws-sigv4 (~> 1.1)
|
||||
jmespath (~> 1.0)
|
||||
aws-sdk-kms (1.55.0)
|
||||
jmespath (~> 1, >= 1.6.1)
|
||||
aws-sdk-kms (1.57.0)
|
||||
aws-sdk-core (~> 3, >= 3.127.0)
|
||||
aws-sigv4 (~> 1.1)
|
||||
aws-sdk-s3 (1.113.0)
|
||||
aws-sdk-s3 (1.114.0)
|
||||
aws-sdk-core (~> 3, >= 3.127.0)
|
||||
aws-sdk-kms (~> 1)
|
||||
aws-sigv4 (~> 1.4)
|
||||
aws-sigv4 (1.4.0)
|
||||
aws-sigv4 (1.5.0)
|
||||
aws-eventstream (~> 1, >= 1.0.2)
|
||||
axlsx_styler (1.1.0)
|
||||
activesupport (>= 3.1)
|
||||
caxlsx (>= 2.0.2)
|
||||
bcrypt (3.1.16)
|
||||
bcrypt (3.1.18)
|
||||
bigdecimal (3.0.2)
|
||||
bindex (0.8.1)
|
||||
bootsnap (1.10.1)
|
||||
bootsnap (1.13.0)
|
||||
msgpack (~> 1.2)
|
||||
bugsnag (6.24.2)
|
||||
concurrent-ruby (~> 1.0)
|
||||
builder (3.2.4)
|
||||
bullet (6.1.5)
|
||||
bullet (7.0.2)
|
||||
activesupport (>= 3.0.0)
|
||||
uniform_notifier (~> 1.11)
|
||||
byebug (11.1.3)
|
||||
cable_ready (5.0.0.pre3)
|
||||
rails (>= 5.2)
|
||||
thread-local (>= 1.1.0)
|
||||
cancancan (1.15.0)
|
||||
capybara (3.36.0)
|
||||
capybara (3.37.1)
|
||||
addressable
|
||||
matrix
|
||||
mini_mime (>= 0.1.3)
|
||||
@@ -223,14 +214,15 @@ GEM
|
||||
coffee-script-source
|
||||
execjs
|
||||
coffee-script-source (1.12.2)
|
||||
combine_pdf (1.0.21)
|
||||
combine_pdf (1.0.22)
|
||||
matrix
|
||||
ruby-rc4 (>= 0.1.5)
|
||||
concurrent-ruby (1.1.10)
|
||||
connection_pool (2.2.5)
|
||||
crack (0.4.5)
|
||||
rexml
|
||||
crass (1.0.6)
|
||||
css_parser (1.9.0)
|
||||
css_parser (1.11.0)
|
||||
addressable
|
||||
cuprite (0.13)
|
||||
capybara (>= 2.1, < 4)
|
||||
@@ -245,8 +237,11 @@ GEM
|
||||
debase-ruby_core_source (= 0.10.12)
|
||||
msgpack
|
||||
debase-ruby_core_source (0.10.12)
|
||||
debug (1.6.2)
|
||||
irb (>= 1.3.6)
|
||||
reline (>= 0.3.1)
|
||||
debugger-linecache (1.2.0)
|
||||
devise (4.8.0)
|
||||
devise (4.8.1)
|
||||
bcrypt (~> 3.0)
|
||||
orm_adapter (~> 0.1)
|
||||
railties (>= 4.1.0)
|
||||
@@ -254,21 +249,20 @@ GEM
|
||||
warden (~> 1.2.3)
|
||||
devise-encryptable (0.2.0)
|
||||
devise (>= 2.1.0)
|
||||
devise-i18n (1.10.0)
|
||||
devise-i18n (1.10.2)
|
||||
devise (>= 4.8.0)
|
||||
devise-token_authenticatable (1.1.0)
|
||||
devise (>= 4.0.0, < 5.0.0)
|
||||
diff-lcs (1.4.4)
|
||||
diff-lcs (1.5.0)
|
||||
digest (3.1.0)
|
||||
docile (1.4.0)
|
||||
dotenv (2.7.6)
|
||||
dotenv-rails (2.7.6)
|
||||
dotenv (= 2.7.6)
|
||||
dotenv (2.8.1)
|
||||
dotenv-rails (2.8.1)
|
||||
dotenv (= 2.8.1)
|
||||
railties (>= 3.2)
|
||||
dry-inflector (0.2.1)
|
||||
e2mmap (0.1.0)
|
||||
erubi (1.10.0)
|
||||
et-orbi (1.2.4)
|
||||
erubi (1.11.0)
|
||||
et-orbi (1.2.7)
|
||||
tzinfo
|
||||
excon (0.81.0)
|
||||
execjs (2.7.0)
|
||||
@@ -277,15 +271,10 @@ GEM
|
||||
factory_bot_rails (6.2.0)
|
||||
factory_bot (~> 6.2.0)
|
||||
railties (>= 5.0.0)
|
||||
faraday (1.4.1)
|
||||
faraday-excon (~> 1.1)
|
||||
faraday-net_http (~> 1.0)
|
||||
faraday-net_http_persistent (~> 1.1)
|
||||
multipart-post (>= 1.2, < 3)
|
||||
faraday (2.3.0)
|
||||
faraday-net_http (~> 2.0)
|
||||
ruby2_keywords (>= 0.0.4)
|
||||
faraday-excon (1.1.0)
|
||||
faraday-net_http (1.0.1)
|
||||
faraday-net_http_persistent (1.1.0)
|
||||
faraday-net_http (2.0.3)
|
||||
ferrum (0.11)
|
||||
addressable (~> 2.5)
|
||||
cliver (~> 0.3)
|
||||
@@ -319,13 +308,13 @@ GEM
|
||||
nokogiri (>= 1.5.11, < 2.0.0)
|
||||
foreman (0.87.2)
|
||||
formatador (0.2.5)
|
||||
fugit (1.4.5)
|
||||
et-orbi (~> 1.1, >= 1.1.8)
|
||||
fugit (1.5.3)
|
||||
et-orbi (~> 1, >= 1.2.7)
|
||||
raabro (~> 1.4)
|
||||
fuubar (2.5.1)
|
||||
rspec-core (~> 3.0)
|
||||
ruby-progressbar (~> 1.4)
|
||||
geocoder (1.7.0)
|
||||
geocoder (1.8.0)
|
||||
globalid (1.0.0)
|
||||
activesupport (>= 5.0)
|
||||
gmaps4rails (2.1.2)
|
||||
@@ -340,7 +329,7 @@ GEM
|
||||
highline (2.0.3)
|
||||
hiredis (0.6.3)
|
||||
htmlentities (4.3.4)
|
||||
i18n (1.8.10)
|
||||
i18n (1.12.0)
|
||||
concurrent-ruby (~> 1.0)
|
||||
i18n-js (3.9.2)
|
||||
i18n (>= 0.6.6)
|
||||
@@ -349,7 +338,10 @@ GEM
|
||||
ruby-vips (>= 2.0.17, < 3)
|
||||
immigrant (0.3.6)
|
||||
activerecord (>= 3.0)
|
||||
io-console (0.5.11)
|
||||
ipaddress (0.8.3)
|
||||
irb (1.4.1)
|
||||
reline (>= 0.3.0)
|
||||
jmespath (1.6.1)
|
||||
jquery-rails (4.4.0)
|
||||
rails-dom-testing (>= 1, < 3)
|
||||
@@ -357,7 +349,7 @@ GEM
|
||||
thor (>= 0.14, < 2.0)
|
||||
jquery-ui-rails (4.2.1)
|
||||
railties (>= 3.2.16)
|
||||
json (2.6.1)
|
||||
json (2.6.2)
|
||||
json-schema (2.8.1)
|
||||
addressable (>= 2.4)
|
||||
json_spec (1.1.5)
|
||||
@@ -365,13 +357,13 @@ GEM
|
||||
rspec (>= 2.0, < 4.0)
|
||||
jsonapi-serializer (2.2.0)
|
||||
activesupport (>= 4.2)
|
||||
jwt (2.3.0)
|
||||
jwt (2.4.1)
|
||||
knapsack (4.0.0)
|
||||
rake
|
||||
launchy (2.5.0)
|
||||
addressable (~> 2.7)
|
||||
letter_opener (1.7.0)
|
||||
launchy (~> 2.2)
|
||||
letter_opener (1.8.1)
|
||||
launchy (>= 2.2, < 3)
|
||||
libv8-node (15.14.0.1)
|
||||
listen (3.7.1)
|
||||
rb-fsevent (~> 0.10, >= 0.10.3)
|
||||
@@ -395,41 +387,41 @@ GEM
|
||||
mini_portile2 (2.8.0)
|
||||
mini_racer (0.4.0)
|
||||
libv8-node (~> 15.14.0.0)
|
||||
minitest (5.16.1)
|
||||
minitest (5.16.2)
|
||||
monetize (1.12.0)
|
||||
money (~> 6.12)
|
||||
money (6.16.0)
|
||||
i18n (>= 0.6.4, <= 2)
|
||||
msgpack (1.4.2)
|
||||
msgpack (1.5.4)
|
||||
multi_json (1.15.0)
|
||||
multi_xml (0.6.0)
|
||||
multipart-post (2.1.1)
|
||||
nio4r (2.5.8)
|
||||
nokogiri (1.13.6)
|
||||
nokogiri (1.13.8)
|
||||
mini_portile2 (~> 2.8.0)
|
||||
racc (~> 1.4)
|
||||
oauth2 (1.4.7)
|
||||
faraday (>= 0.8, < 2.0)
|
||||
oauth2 (1.4.10)
|
||||
faraday (>= 0.17.3, < 3.0)
|
||||
jwt (>= 1.0, < 3.0)
|
||||
multi_json (~> 1.3)
|
||||
multi_xml (~> 0.5)
|
||||
rack (>= 1.2, < 3)
|
||||
orm_adapter (0.5.0)
|
||||
pagy (5.1.2)
|
||||
pagy (5.10.1)
|
||||
activesupport
|
||||
paper_trail (12.1.0)
|
||||
activerecord (>= 5.2)
|
||||
request_store (~> 1.1)
|
||||
parallel (1.21.0)
|
||||
paranoia (2.4.3)
|
||||
activerecord (>= 4.0, < 6.2)
|
||||
parser (3.1.0.0)
|
||||
parallel (1.22.1)
|
||||
paranoia (2.6.0)
|
||||
activerecord (>= 5.1, < 7.1)
|
||||
parser (3.1.2.0)
|
||||
ast (~> 2.4.1)
|
||||
paypal-sdk-core (0.3.4)
|
||||
multi_json (~> 1.0)
|
||||
xml-simple
|
||||
paypal-sdk-merchant (1.117.2)
|
||||
paypal-sdk-core (~> 0.3.0)
|
||||
pdf-reader (2.5.0)
|
||||
pdf-reader (2.10.0)
|
||||
Ascii85 (~> 1.0)
|
||||
afm (~> 0.2.1)
|
||||
hashery (~> 2.0)
|
||||
@@ -440,16 +432,13 @@ GEM
|
||||
pry (0.13.1)
|
||||
coderay (~> 1.1)
|
||||
method_source (~> 1.0)
|
||||
pry-byebug (3.9.0)
|
||||
byebug (~> 11.0)
|
||||
pry (~> 0.13.0)
|
||||
public_suffix (4.0.6)
|
||||
public_suffix (4.0.7)
|
||||
puma (5.6.4)
|
||||
nio4r (~> 2.0)
|
||||
raabro (1.4.0)
|
||||
racc (1.6.0)
|
||||
rack (2.2.3.1)
|
||||
rack-mini-profiler (2.3.3)
|
||||
rack (2.2.4)
|
||||
rack-mini-profiler (2.3.4)
|
||||
rack (>= 1.2.0)
|
||||
rack-protection (2.1.0)
|
||||
rack
|
||||
@@ -458,23 +447,23 @@ GEM
|
||||
rack-rewrite (1.5.1)
|
||||
rack-ssl (1.4.1)
|
||||
rack
|
||||
rack-test (1.1.0)
|
||||
rack (>= 1.0, < 3)
|
||||
rack-timeout (0.6.0)
|
||||
rails (6.1.4.4)
|
||||
actioncable (= 6.1.4.4)
|
||||
actionmailbox (= 6.1.4.4)
|
||||
actionmailer (= 6.1.4.4)
|
||||
actionpack (= 6.1.4.4)
|
||||
actiontext (= 6.1.4.4)
|
||||
actionview (= 6.1.4.4)
|
||||
activejob (= 6.1.4.4)
|
||||
activemodel (= 6.1.4.4)
|
||||
activerecord (= 6.1.4.4)
|
||||
activestorage (= 6.1.4.4)
|
||||
activesupport (= 6.1.4.4)
|
||||
rack-test (2.0.2)
|
||||
rack (>= 1.3)
|
||||
rack-timeout (0.6.3)
|
||||
rails (6.1.6.1)
|
||||
actioncable (= 6.1.6.1)
|
||||
actionmailbox (= 6.1.6.1)
|
||||
actionmailer (= 6.1.6.1)
|
||||
actionpack (= 6.1.6.1)
|
||||
actiontext (= 6.1.6.1)
|
||||
actionview (= 6.1.6.1)
|
||||
activejob (= 6.1.6.1)
|
||||
activemodel (= 6.1.6.1)
|
||||
activerecord (= 6.1.6.1)
|
||||
activestorage (= 6.1.6.1)
|
||||
activesupport (= 6.1.6.1)
|
||||
bundler (>= 1.15.0)
|
||||
railties (= 6.1.4.4)
|
||||
railties (= 6.1.6.1)
|
||||
sprockets-rails (>= 2.0.0)
|
||||
rails-controller-testing (1.0.5)
|
||||
actionpack (>= 5.0.1.rc1)
|
||||
@@ -485,15 +474,15 @@ GEM
|
||||
nokogiri (>= 1.6)
|
||||
rails-html-sanitizer (1.4.3)
|
||||
loofah (~> 2.3)
|
||||
rails-i18n (7.0.1)
|
||||
rails-i18n (7.0.5)
|
||||
i18n (>= 0.7, < 2)
|
||||
railties (>= 6.0.0, < 8)
|
||||
rails_safe_tasks (1.0.0)
|
||||
railties (6.1.4.4)
|
||||
actionpack (= 6.1.4.4)
|
||||
activesupport (= 6.1.4.4)
|
||||
railties (6.1.6.1)
|
||||
actionpack (= 6.1.6.1)
|
||||
activesupport (= 6.1.6.1)
|
||||
method_source
|
||||
rake (>= 0.13)
|
||||
rake (>= 12.2)
|
||||
thor (~> 1.0)
|
||||
rainbow (3.1.1)
|
||||
rake (13.0.6)
|
||||
@@ -505,37 +494,42 @@ GEM
|
||||
rb-inotify (0.10.1)
|
||||
ffi (~> 1.0)
|
||||
redcarpet (3.5.1)
|
||||
redis (4.5.1)
|
||||
regexp_parser (2.2.0)
|
||||
redis (4.7.1)
|
||||
regexp_parser (2.5.0)
|
||||
reline (0.3.1)
|
||||
io-console (~> 0.5)
|
||||
request_store (1.5.0)
|
||||
rack (>= 1.4)
|
||||
responders (3.0.1)
|
||||
actionpack (>= 5.0)
|
||||
railties (>= 5.0)
|
||||
rexml (3.2.5)
|
||||
roadie (4.0.0)
|
||||
roadie (5.0.1)
|
||||
css_parser (~> 1.4)
|
||||
nokogiri (~> 1.8)
|
||||
roadie-rails (2.2.0)
|
||||
railties (>= 5.1, < 6.2)
|
||||
roadie (>= 3.1, < 5.0)
|
||||
roadie-rails (3.0.0)
|
||||
railties (>= 5.1, < 7.1)
|
||||
roadie (~> 5.0)
|
||||
rodf (1.1.1)
|
||||
builder (>= 3.0)
|
||||
dry-inflector (~> 0.1)
|
||||
rubyzip (>= 1.0)
|
||||
roo (2.9.0)
|
||||
nokogiri (~> 1)
|
||||
rubyzip (>= 1.3.0, < 3.0.0)
|
||||
rspec (3.10.0)
|
||||
rspec-core (~> 3.10.0)
|
||||
rspec-expectations (~> 3.10.0)
|
||||
rspec-mocks (~> 3.10.0)
|
||||
rspec-core (3.10.1)
|
||||
rspec-core (3.10.2)
|
||||
rspec-support (~> 3.10.0)
|
||||
rspec-expectations (3.10.1)
|
||||
rspec-expectations (3.10.2)
|
||||
diff-lcs (>= 1.2.0, < 2.0)
|
||||
rspec-support (~> 3.10.0)
|
||||
rspec-mocks (3.10.2)
|
||||
diff-lcs (>= 1.2.0, < 2.0)
|
||||
rspec-support (~> 3.10.0)
|
||||
rspec-rails (5.0.2)
|
||||
rspec-rails (5.1.2)
|
||||
actionpack (>= 5.2)
|
||||
activesupport (>= 5.2)
|
||||
railties (>= 5.2)
|
||||
@@ -545,28 +539,29 @@ GEM
|
||||
rspec-support (~> 3.10)
|
||||
rspec-retry (0.6.2)
|
||||
rspec-core (> 3.3)
|
||||
rspec-support (3.10.2)
|
||||
rswag-api (2.4.0)
|
||||
railties (>= 3.1, < 7.0)
|
||||
rswag-specs (2.4.0)
|
||||
activesupport (>= 3.1, < 7.0)
|
||||
rspec-support (3.10.3)
|
||||
rswag-api (2.5.1)
|
||||
railties (>= 3.1, < 7.1)
|
||||
rswag-specs (2.5.1)
|
||||
activesupport (>= 3.1, < 7.1)
|
||||
json-schema (~> 2.2)
|
||||
railties (>= 3.1, < 7.0)
|
||||
rswag-ui (2.4.0)
|
||||
actionpack (>= 3.1, < 7.0)
|
||||
railties (>= 3.1, < 7.0)
|
||||
rubocop (1.22.2)
|
||||
railties (>= 3.1, < 7.1)
|
||||
rswag-ui (2.5.1)
|
||||
actionpack (>= 3.1, < 7.1)
|
||||
railties (>= 3.1, < 7.1)
|
||||
rubocop (1.33.0)
|
||||
json (~> 2.3)
|
||||
parallel (~> 1.10)
|
||||
parser (>= 3.0.0.0)
|
||||
parser (>= 3.1.0.0)
|
||||
rainbow (>= 2.2.2, < 4.0)
|
||||
regexp_parser (>= 1.8, < 3.0)
|
||||
rexml
|
||||
rubocop-ast (>= 1.12.0, < 2.0)
|
||||
rexml (>= 3.2.5, < 4.0)
|
||||
rubocop-ast (>= 1.19.1, < 2.0)
|
||||
ruby-progressbar (~> 1.7)
|
||||
unicode-display_width (>= 1.4.0, < 3.0)
|
||||
rubocop-ast (1.15.1)
|
||||
parser (>= 3.0.1.1)
|
||||
rubocop-rails (2.13.2)
|
||||
rubocop-ast (1.19.1)
|
||||
parser (>= 3.1.1.0)
|
||||
rubocop-rails (2.15.2)
|
||||
activesupport (>= 4.2.0)
|
||||
rack (>= 1.1)
|
||||
rubocop (>= 1.7.0, < 2.0)
|
||||
@@ -574,9 +569,9 @@ GEM
|
||||
ruby-rc4 (0.1.5)
|
||||
ruby-vips (2.1.4)
|
||||
ffi (~> 1.12)
|
||||
ruby2_keywords (0.0.4)
|
||||
ruby2_keywords (0.0.5)
|
||||
rubyzip (2.3.2)
|
||||
rufus-scheduler (3.7.0)
|
||||
rufus-scheduler (3.8.1)
|
||||
fugit (~> 1.1, >= 1.1.6)
|
||||
sass (3.4.25)
|
||||
sass-rails (5.0.8)
|
||||
@@ -586,23 +581,22 @@ GEM
|
||||
sprockets-rails (>= 2.0, < 4.0)
|
||||
tilt (>= 1.1, < 3)
|
||||
sd_notify (0.1.1)
|
||||
selenium-webdriver (4.0.3)
|
||||
selenium-webdriver (4.3.0)
|
||||
childprocess (>= 0.5, < 5.0)
|
||||
rexml (~> 3.2, >= 3.2.5)
|
||||
rubyzip (>= 1.2.2)
|
||||
rubyzip (>= 1.2.2, < 3.0)
|
||||
websocket (~> 1.0)
|
||||
semantic_range (3.0.0)
|
||||
shoulda-matchers (5.0.0)
|
||||
shoulda-matchers (5.1.0)
|
||||
activesupport (>= 5.2.0)
|
||||
sidekiq (6.3.1)
|
||||
sidekiq (6.5.4)
|
||||
connection_pool (>= 2.2.2)
|
||||
rack (~> 2.0)
|
||||
redis (>= 4.5.0)
|
||||
sidekiq-scheduler (4.0.2)
|
||||
redis (>= 4.2.0)
|
||||
sidekiq-scheduler (3.1.0)
|
||||
e2mmap
|
||||
redis (>= 3, < 5)
|
||||
rufus-scheduler (~> 3.2)
|
||||
sidekiq (>= 3)
|
||||
thwait
|
||||
sidekiq (>= 4)
|
||||
tilt (>= 1.4.0)
|
||||
simplecov (0.21.2)
|
||||
docile (~> 1.1)
|
||||
@@ -614,7 +608,7 @@ GEM
|
||||
axlsx_styler (>= 1.0.0, < 2)
|
||||
caxlsx (>= 2.0.2, < 4)
|
||||
rodf (>= 1.0.0, < 2)
|
||||
spring (3.0.0)
|
||||
spring (4.0.0)
|
||||
spring-commands-rspec (1.0.4)
|
||||
spring (>= 0.9.1)
|
||||
sprockets (3.7.2)
|
||||
@@ -632,35 +626,34 @@ GEM
|
||||
activerecord (>= 5.1)
|
||||
state_machines-activemodel (>= 0.8.0)
|
||||
stringex (2.8.5)
|
||||
stripe (5.42.0)
|
||||
stripe (7.0.0)
|
||||
temple (0.8.2)
|
||||
test-prof (1.0.7)
|
||||
test-unit (3.5.0)
|
||||
test-prof (1.0.9)
|
||||
test-unit (3.5.3)
|
||||
power_assert
|
||||
thor (1.2.1)
|
||||
thread-local (1.1.0)
|
||||
thwait (0.2.0)
|
||||
e2mmap
|
||||
tilt (2.0.10)
|
||||
timecop (0.9.4)
|
||||
tilt (2.0.11)
|
||||
timecop (0.9.5)
|
||||
ttfunk (1.7.0)
|
||||
tzinfo (2.0.4)
|
||||
tzinfo (2.0.5)
|
||||
concurrent-ruby (~> 1.0)
|
||||
uglifier (4.2.0)
|
||||
execjs (>= 0.3.0, < 3)
|
||||
unicode-display_width (2.1.0)
|
||||
uniform_notifier (1.14.2)
|
||||
valid_email2 (4.0.0)
|
||||
unicode-display_width (2.2.0)
|
||||
uniform_notifier (1.16.0)
|
||||
valid_email2 (4.0.3)
|
||||
activemodel (>= 3.2)
|
||||
mail (~> 2.5)
|
||||
view_component (2.41.0)
|
||||
view_component (2.64.0)
|
||||
activesupport (>= 5.0.0, < 8.0)
|
||||
concurrent-ruby (~> 1.0)
|
||||
method_source (~> 1.0)
|
||||
view_component_storybook (0.10.1)
|
||||
view_component_storybook (0.11.1)
|
||||
view_component (>= 2.36)
|
||||
warden (1.2.9)
|
||||
rack (>= 2.0.9)
|
||||
web-console (4.1.0)
|
||||
web-console (4.2.0)
|
||||
actionview (>= 6.0.0)
|
||||
activemodel (>= 6.0.0)
|
||||
bindex (>= 0.4.0)
|
||||
@@ -669,7 +662,7 @@ GEM
|
||||
nokogiri (~> 1.6)
|
||||
rubyzip (>= 1.3.0)
|
||||
selenium-webdriver (~> 4.0)
|
||||
webmock (3.14.0)
|
||||
webmock (3.17.1)
|
||||
addressable (>= 2.8.0)
|
||||
crack (>= 0.3.2)
|
||||
hashdiff (>= 0.4.0, < 2.0.0)
|
||||
@@ -678,12 +671,13 @@ GEM
|
||||
rack-proxy (>= 0.6.1)
|
||||
railties (>= 5.2)
|
||||
semantic_range (>= 2.3.0)
|
||||
websocket (1.2.9)
|
||||
websocket-driver (0.7.5)
|
||||
websocket-extensions (>= 0.1.0)
|
||||
websocket-extensions (0.1.5)
|
||||
whenever (1.0.0)
|
||||
chronic (>= 0.6.3)
|
||||
wicked_pdf (2.1.0)
|
||||
wicked_pdf (2.6.3)
|
||||
activesupport
|
||||
wkhtmltopdf-binary (0.12.6.5)
|
||||
xml-simple (1.1.8)
|
||||
@@ -710,13 +704,11 @@ DEPENDENCIES
|
||||
angularjs-rails (= 1.8.0)
|
||||
arel-helpers (~> 2.12)
|
||||
awesome_nested_set
|
||||
awesome_print
|
||||
aws-sdk-s3
|
||||
bigdecimal (= 3.0.2)
|
||||
bootsnap
|
||||
bugsnag
|
||||
bullet
|
||||
byebug
|
||||
cable_ready (= 5.0.0.pre3)
|
||||
cancancan (~> 1.15.0)
|
||||
capybara
|
||||
@@ -727,6 +719,7 @@ DEPENDENCIES
|
||||
database_cleaner
|
||||
db2fog!
|
||||
ddtrace
|
||||
debug (>= 1.0.0)
|
||||
debugger-linecache
|
||||
devise
|
||||
devise-encryptable
|
||||
@@ -776,7 +769,6 @@ DEPENDENCIES
|
||||
pdf-reader
|
||||
pg (~> 1.2.3)
|
||||
pry (~> 0.13.0)
|
||||
pry-byebug (~> 3.9.0)
|
||||
puma
|
||||
rack-mini-profiler (< 3.0.0)
|
||||
rack-rewrite
|
||||
@@ -792,7 +784,7 @@ DEPENDENCIES
|
||||
responders
|
||||
rexml
|
||||
roadie-rails
|
||||
roo!
|
||||
roo
|
||||
rspec-rails (>= 3.5.2)
|
||||
rspec-retry
|
||||
rswag-api
|
||||
|
||||
@@ -39,7 +39,7 @@ We use [BrowserStack](https://www.browserstack.com/) as a manual testing tool. B
|
||||
|
||||
## Licence
|
||||
|
||||
Copyright (c) 2012 - 2021 Open Food Foundation, released under the AGPL licence.
|
||||
Copyright (c) 2012 - 2022 Open Food Foundation, released under the AGPL licence.
|
||||
|
||||
[survey]: https://docs.google.com/a/eaterprises.com.au/forms/d/1zxR5vSiU9CigJ9cEaC8-eJLgYid8CR8er7PPH9Mc-30/edit#
|
||||
[slack-invite]: https://join.slack.com/t/openfoodnetwork/shared_invite/zt-9sjkjdlu-r02kUMP1zbrTgUhZhYPF~A
|
||||
|
||||
@@ -10,6 +10,7 @@
|
||||
scope.$emit "offClick"
|
||||
|
||||
element.click (event) ->
|
||||
return if event.target.closest(".ofn-drop-down").classList.contains "disabled" || event.target.classList.contains "disabled"
|
||||
if !scope.expanded
|
||||
event.stopPropagation()
|
||||
scope.deregistrationCallback = scope.$on "offClick", ->
|
||||
|
||||
@@ -20,7 +20,7 @@ angular.module("admin.orders").controller "orderCtrl", ($scope, shops, orderCycl
|
||||
$scope.distributor_id && $scope.order_cycle_id
|
||||
|
||||
for oc in $scope.orderCycles
|
||||
oc.name_and_status = "#{oc.name} (#{oc.status})"
|
||||
oc.name_and_status = "#{oc.name} (#{t("admin.order_cycles.status.#{oc.status}")})"
|
||||
|
||||
for shop in $scope.shops
|
||||
shop.disabled = !$scope.distributorHasOrderCycles(shop)
|
||||
|
||||
@@ -13,3 +13,9 @@ angular.module("ofn.admin").factory "ProductImageService", (FileUploader, SpreeA
|
||||
@imageUploader.onSuccessItem = (image, response) =>
|
||||
product.thumb_url = response.thumb_url
|
||||
product.image_url = response.image_url
|
||||
@imageUploader.onErrorItem = (image, response) =>
|
||||
if Array.isArray(response.errors)
|
||||
message = response.errors.join("\n")
|
||||
else
|
||||
message = response.error.toString()
|
||||
alert(message)
|
||||
|
||||
@@ -39,25 +39,94 @@ $(document).ready(function() {
|
||||
}
|
||||
$('[data-hook=admin_order_edit_form] a.save-method').click(handle_shipping_method_save);
|
||||
|
||||
//handle tracking edit click
|
||||
//handle tracking info edit/delete
|
||||
|
||||
// Show the input field to edit the tracking info
|
||||
// And hide the input field when cancel is clicked
|
||||
$('a.edit-tracking').click(toggleTrackingEdit);
|
||||
$('a.cancel-tracking').click(toggleTrackingEdit);
|
||||
|
||||
handle_tracking_save = function(){
|
||||
var link = $(this);
|
||||
var shipment_number = link.data('shipment-number');
|
||||
var tracking = link.parents('tbody').find('input#tracking').val();
|
||||
var url = Spree.url( Spree.routes.orders_api + "/" + order_number + "/shipments/" + shipment_number + ".json");
|
||||
saveTrackingInfo = function(){
|
||||
let shipmentNumber = $(this).data('shipment-number');
|
||||
let tracking = document.getElementById('tracking').value
|
||||
|
||||
makeApiCall(trackingUrl(shipmentNumber), { shipment: { tracking: tracking } } )
|
||||
}
|
||||
|
||||
deleteTrackingInfo = function(){
|
||||
let shipmentNumber = $(this).data('shipment-number');
|
||||
let tracking = ''
|
||||
|
||||
confirmDelete(trackingUrl(shipmentNumber), { shipment: { tracking: tracking } })
|
||||
}
|
||||
|
||||
trackingUrl = function(shipmentNumber){
|
||||
return Spree.url( Spree.routes.orders_api + "/" + order_number + "/shipments/" + shipmentNumber + ".json");
|
||||
}
|
||||
|
||||
$('[data-hook=admin_order_edit_form] a.save-tracking').click(saveTrackingInfo);
|
||||
$('[data-hook=admin_order_edit_form] a.delete-tracking').click(deleteTrackingInfo);
|
||||
|
||||
// handle note edit/delete
|
||||
|
||||
// Show the input field to edit the note
|
||||
// And hide the input field when cancel is clicked
|
||||
$('a.edit-note.icon-edit').click(toggleNoteEdit);
|
||||
$('a.cancel-note').click(toggleNoteEdit);
|
||||
|
||||
saveNote = function(){
|
||||
let note = document.getElementById('note').value
|
||||
makeApiCall(getNoteUrl(), { note: note })
|
||||
}
|
||||
|
||||
deleteNote = function(){
|
||||
let note = ''
|
||||
confirmDelete(getNoteUrl(), { note: note })
|
||||
}
|
||||
|
||||
getNoteUrl = function(){
|
||||
return Spree.url( Spree.routes.orders_api + "/" + order_number);
|
||||
}
|
||||
|
||||
confirmDelete = function(url, params){
|
||||
displayDeleteAlert(function(confirmation) {
|
||||
if (confirmation) {
|
||||
makeApiCall(url, params)
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
$('[data-hook=admin_order_edit_form] a.save-note').click(saveNote);
|
||||
$('[data-hook=admin_order_edit_form] a.delete-note').click(deleteNote);
|
||||
|
||||
// Makes API call for notes/tracking info
|
||||
makeApiCall = function(url, params) {
|
||||
$.ajax({
|
||||
type: "PUT",
|
||||
url: url,
|
||||
data: { shipment: { tracking: tracking } }
|
||||
data: params
|
||||
}).done(function( msg ) {
|
||||
window.location.reload();
|
||||
}).error(function( msg ) {
|
||||
console.log(msg);
|
||||
});
|
||||
}
|
||||
$('[data-hook=admin_order_edit_form] a.save-tracking').click(handle_tracking_save);
|
||||
|
||||
displayDeleteAlert = function(callback) {
|
||||
i18nKey = "are_you_sure";
|
||||
$('#custom-confirm .message').html(
|
||||
` ${t(i18nKey)}
|
||||
<div class="form">
|
||||
</div>`);
|
||||
$('#custom-confirm button.confirm').unbind( "click" ).click(() => {
|
||||
$('#custom-confirm').hide();
|
||||
callback(true);
|
||||
});
|
||||
$('#custom-confirm button.cancel').click(() => {
|
||||
$('#custom-confirm').hide();
|
||||
callback(false)
|
||||
});
|
||||
$('#custom-confirm').show();
|
||||
}
|
||||
|
||||
});
|
||||
|
||||
@@ -141,8 +141,26 @@ doAdjustItems = function(shipment_number, variant_id, quantity, inventory_units,
|
||||
|
||||
toggleTrackingEdit = function(){
|
||||
var link = $(this);
|
||||
link.parents('tbody').find('tr.edit-tracking').toggle();
|
||||
link.parents('tbody').find('tr.show-tracking').toggle();
|
||||
var parent_node = link.parents('tbody')
|
||||
let input = parent_node.find('#tracking')[0]
|
||||
parent_node.find('tr.edit-tracking').toggle();
|
||||
// Set focus on input and
|
||||
// put cursor at it's end
|
||||
input.focus()
|
||||
input.setSelectionRange(-1, -1)
|
||||
parent_node.find('tr.show-tracking').toggle();
|
||||
}
|
||||
|
||||
toggleNoteEdit = function(){
|
||||
var link = $(this);
|
||||
var parent_node = link.parents('tbody')
|
||||
let input = parent_node.find('#note')[0]
|
||||
parent_node.find('tr.edit-note').toggle();
|
||||
// Set focus on input and
|
||||
// put cursor at it's end
|
||||
input.focus()
|
||||
input.setSelectionRange(-1, -1)
|
||||
parent_node.find('tr.show-note').toggle();
|
||||
}
|
||||
|
||||
toggleMethodEdit = function(){
|
||||
|
||||
@@ -3,6 +3,7 @@ angular.module("admin.utils").directive "tagsWithTranslation", ($timeout) ->
|
||||
templateUrl: "admin/tags_input.html"
|
||||
scope:
|
||||
object: "="
|
||||
form: "="
|
||||
tagsAttr: "@?"
|
||||
tagListAttr: "@?"
|
||||
findTags: "&"
|
||||
@@ -18,7 +19,15 @@ angular.module("admin.utils").directive "tagsWithTranslation", ($timeout) ->
|
||||
scope.limitReached = scope.object[scope.tagsAttr].length >= scope.max if scope.max != undefined
|
||||
scope.object[scope.tagListAttr] = (tag.text for tag in scope.object[scope.tagsAttr]).join(",")
|
||||
|
||||
scope.$watch "object", (newObject) ->
|
||||
scope.object = newObject
|
||||
init()
|
||||
|
||||
$timeout ->
|
||||
init()
|
||||
|
||||
init = ->
|
||||
return unless scope.object
|
||||
# Initialize properties if necessary
|
||||
scope.tagsAttr ||= "tags"
|
||||
scope.tagListAttr ||= "tag_list"
|
||||
|
||||
@@ -5,15 +5,16 @@ angular.module("admin.utils").factory "ErrorsParser", ->
|
||||
return defaultContent unless errors?
|
||||
|
||||
errorsString = ""
|
||||
if errors.length > 0
|
||||
if Array.isArray(errors)
|
||||
# it is an array of errors
|
||||
errorsString = errors.join("\n") + "\n"
|
||||
else
|
||||
else if typeof errors == "object"
|
||||
# it is a hash of errors
|
||||
keys = Object.keys(errors)
|
||||
for key in keys
|
||||
errorsString += errors[key].join("\n") + "\n"
|
||||
|
||||
else # string
|
||||
errorsString = errors
|
||||
this.defaultIfEmpty(errorsString, defaultContent)
|
||||
|
||||
defaultIfEmpty: (content, defaultContent) =>
|
||||
|
||||
@@ -20,3 +20,6 @@ angular.module('Darkswarm').controller "CreditCardsCtrl", ($scope, $http, Credit
|
||||
).finally ->
|
||||
window.location.reload()
|
||||
|
||||
|
||||
$scope.hasOneDefaultSavedCards = () ->
|
||||
$scope.savedCreditCards.some((card) -> card.is_default)
|
||||
|
||||
@@ -26,4 +26,8 @@ angular.module('mm.foundation.offcanvas').directive 'offCanvasWrap', ($window) -
|
||||
# Bind hiding of the off-canvas that only happens when screen width is over 1024px.
|
||||
win.bind 'resize.body', ->
|
||||
isolatedScope.hide() if $(window).width() > 1024
|
||||
|
||||
win.bind 'click.body', (e) ->
|
||||
if e.target.closest(".left-off-canvas-menu") == null && e.target.closest(".left-off-canvas-toggle") == null
|
||||
isolatedScope.hide()
|
||||
}
|
||||
|
||||
@@ -1,8 +1,12 @@
|
||||
%div.contact-container
|
||||
%div.modal-centered{"ng-if" => "::enterprise.email_address || enterprise.website || enterprise.phone"}
|
||||
%div.modal-centered{"ng-if" => "::enterprise.email_address || enterprise.website || enterprise.phone || enterprise.whatsapp_phone"}
|
||||
%p.modal-header {{'contact' | t}}
|
||||
%p{"ng-if" => "::enterprise.phone", "ng-bind" => "::enterprise.phone"}
|
||||
|
||||
%p{"ng-if" => "::enterprise.whatsapp_phone"}
|
||||
%img{ src: image_path("/map_icons/social-logos/whatsapp.svg") }
|
||||
%a{"ng-href" => "{{::enterprise.whatsapp_url}}", target: "_blank", "ng-bind" => "::enterprise.whatsapp_phone"}
|
||||
|
||||
%p{"ng-if" => "::enterprise.email_address"}
|
||||
%a{"ng-href" => "{{::enterprise.email_address | stripUrl}}", target: "_blank", mailto: true}
|
||||
%span.obfuscatedEmail.email{"ng-bind" => "::enterprise.email_address | stripUrl"}
|
||||
|
||||
@@ -9,19 +9,19 @@
|
||||
%span{"ng-bind" => "::'item_cost' | t"}
|
||||
%li{"ng-if" => "::variant.fees.admin"}
|
||||
.right {{ ::variant.fees.admin | localizeCurrency }}
|
||||
%span{"ng-bind" => "::'admin_fee' | t"}
|
||||
%span{"ng-bind" => "::variant.fees_name.admin"}
|
||||
%li{"ng-if" => "::variant.fees.sales"}
|
||||
.right {{ ::variant.fees.sales | localizeCurrency }}
|
||||
%span{"ng-bind" => "::'sales_fee' | t"}
|
||||
%span{"ng-bind" => "::variant.fees_name.sales"}
|
||||
%li{"ng-if" => "::variant.fees.packing"}
|
||||
.right {{ ::variant.fees.packing | localizeCurrency }}
|
||||
%span{"ng-bind" => "::'packing_fee' | t"}
|
||||
%span{"ng-bind" => "::variant.fees_name.packing"}
|
||||
%li{"ng-if" => "::variant.fees.transport"}
|
||||
.right {{ ::variant.fees.transport | localizeCurrency }}
|
||||
%span{"ng-bind" => "::'transport_fee' | t"}
|
||||
%span{"ng-bind" => "::variant.fees_name.transport"}
|
||||
%li{"ng-if" => "::variant.fees.fundraising"}
|
||||
.right {{ ::variant.fees.fundraising | localizeCurrency }}
|
||||
%span{"ng-bind" => "::'fundraising_fee' | t"}
|
||||
%span{"ng-bind" => "::variant.fees_name.fundraising"}
|
||||
%li
|
||||
%strong
|
||||
.right = {{ ::variant.price_with_fees | localizeCurrency }}
|
||||
|
||||
@@ -19,6 +19,7 @@ module Admin
|
||||
:enable_invoices?,
|
||||
:invoice_style2?,
|
||||
:enable_receipt_printing?,
|
||||
:enterprise_number_required_on_invoices?,
|
||||
)
|
||||
end
|
||||
end
|
||||
|
||||
@@ -26,6 +26,13 @@ module Api
|
||||
}
|
||||
end
|
||||
|
||||
def update
|
||||
authorize! :admin, order
|
||||
|
||||
order.update!(order_params)
|
||||
render json: order, serializer: Api::OrderDetailedSerializer, current_order: order
|
||||
end
|
||||
|
||||
def ship
|
||||
authorize! :admin, order
|
||||
|
||||
@@ -72,6 +79,10 @@ module Api
|
||||
includes(line_items: { variant: [:product, :stock_items, :default_price] }).
|
||||
first!
|
||||
end
|
||||
|
||||
def order_params
|
||||
params.permit(:note)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
@@ -6,20 +6,21 @@ module Api
|
||||
respond_to :json
|
||||
|
||||
def update_product_image
|
||||
@product = Spree::Product.find(params[:product_id])
|
||||
authorize! :update, @product
|
||||
product = Spree::Product.find(params[:product_id])
|
||||
authorize! :update, product
|
||||
|
||||
if @product.images.first.nil?
|
||||
@image = Spree::Image.create(
|
||||
attachment: params[:file],
|
||||
viewable_id: @product.master.id,
|
||||
viewable_type: 'Spree::Variant'
|
||||
)
|
||||
render json: @image, serializer: ImageSerializer, status: :created
|
||||
image = product.images.first || Spree::Image.new(
|
||||
viewable_id: product.master.id,
|
||||
viewable_type: 'Spree::Variant'
|
||||
)
|
||||
|
||||
success_status = image.persisted? ? :ok : :created
|
||||
|
||||
if image.update(attachment: params[:file])
|
||||
render json: image, serializer: ImageSerializer, status: success_status
|
||||
else
|
||||
@image = @product.images.first
|
||||
@image.update(attachment: params[:file])
|
||||
render json: @image, serializer: ImageSerializer, status: :ok
|
||||
error_json = { errors: image.errors.full_messages }
|
||||
render json: error_json, status: :unprocessable_entity
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
@@ -5,9 +5,10 @@ require 'open_food_network/permissions'
|
||||
module Api
|
||||
module V1
|
||||
class CustomersController < Api::V1::BaseController
|
||||
include AddressTransformation
|
||||
|
||||
skip_authorization_check only: :index
|
||||
|
||||
before_action :set_customer, only: [:show, :update, :destroy]
|
||||
before_action :authorize_action, only: [:show, :update, :destroy]
|
||||
|
||||
def index
|
||||
@@ -17,44 +18,44 @@ module Api
|
||||
end
|
||||
|
||||
def show
|
||||
render json: Api::V1::CustomerSerializer.new(@customer, include_options)
|
||||
render json: Api::V1::CustomerSerializer.new(customer, include_options)
|
||||
end
|
||||
|
||||
def create
|
||||
authorize! :update, Enterprise.find(customer_params[:enterprise_id])
|
||||
@customer = Customer.new(customer_params)
|
||||
customer = Customer.new(customer_params)
|
||||
|
||||
if @customer.save
|
||||
render json: Api::V1::CustomerSerializer.new(@customer), status: :created
|
||||
if customer.save
|
||||
render json: Api::V1::CustomerSerializer.new(customer), status: :created
|
||||
else
|
||||
invalid_resource! @customer
|
||||
invalid_resource! customer
|
||||
end
|
||||
end
|
||||
|
||||
def update
|
||||
if @customer.update(customer_params)
|
||||
render json: Api::V1::CustomerSerializer.new(@customer)
|
||||
if customer.update(customer_params)
|
||||
render json: Api::V1::CustomerSerializer.new(customer)
|
||||
else
|
||||
invalid_resource! @customer
|
||||
invalid_resource! customer
|
||||
end
|
||||
end
|
||||
|
||||
def destroy
|
||||
if @customer.destroy
|
||||
render json: Api::V1::CustomerSerializer.new(@customer)
|
||||
if customer.destroy
|
||||
render json: Api::V1::CustomerSerializer.new(customer)
|
||||
else
|
||||
invalid_resource! @customer
|
||||
invalid_resource! customer
|
||||
end
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def set_customer
|
||||
@customer = Customer.find(params[:id])
|
||||
def customer
|
||||
@customer ||= Customer.find(params[:id])
|
||||
end
|
||||
|
||||
def authorize_action
|
||||
authorize! action_name.to_sym, @customer
|
||||
authorize! action_name.to_sym, customer
|
||||
end
|
||||
|
||||
def search_customers
|
||||
@@ -77,7 +78,8 @@ module Api
|
||||
:phone, :latitude, :longitude,
|
||||
:first_name, :last_name,
|
||||
:street_address_1, :street_address_2,
|
||||
:postal_code, :locality, :region, :country,
|
||||
:postal_code, :locality,
|
||||
{ region: [:name, :code], country: [:name, :code] },
|
||||
]
|
||||
).to_h
|
||||
|
||||
@@ -89,39 +91,6 @@ module Api
|
||||
attributes
|
||||
end
|
||||
|
||||
def transform_address!(attributes, from, to)
|
||||
return unless attributes.key?(from)
|
||||
|
||||
address = attributes.delete(from)
|
||||
|
||||
if address.nil?
|
||||
attributes[to] = nil
|
||||
return
|
||||
end
|
||||
|
||||
address.transform_keys! do |key|
|
||||
{
|
||||
phone: :phone, latitude: :latitude, longitude: :longitude,
|
||||
first_name: :firstname, last_name: :lastname,
|
||||
street_address_1: :address1, street_address_2: :address2,
|
||||
postal_code: :zipcode,
|
||||
locality: :city,
|
||||
region: :state_name,
|
||||
country: :country,
|
||||
}.with_indifferent_access[key]
|
||||
end
|
||||
|
||||
if address[:state_name].present?
|
||||
address[:state] = Spree::State.find_by(name: address[:state_name])
|
||||
end
|
||||
|
||||
if address[:country].present?
|
||||
address[:country] = Spree::Country.find_by(name: address[:country])
|
||||
end
|
||||
|
||||
attributes["#{to}_attributes"] = address
|
||||
end
|
||||
|
||||
def editable_enterprises
|
||||
OpenFoodNetwork::Permissions.new(current_api_user).editable_enterprises.select(:id)
|
||||
end
|
||||
|
||||
48
app/controllers/concerns/address_transformation.rb
Normal file
48
app/controllers/concerns/address_transformation.rb
Normal file
@@ -0,0 +1,48 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
# Our internal data structures are different to the API data strurctures.
|
||||
module AddressTransformation
|
||||
extend ActiveSupport::Concern
|
||||
|
||||
def transform_address!(attributes, from, to)
|
||||
return unless attributes.key?(from)
|
||||
|
||||
address = attributes.delete(from)
|
||||
|
||||
if address.nil?
|
||||
attributes[to] = nil
|
||||
return
|
||||
end
|
||||
|
||||
address.transform_keys! do |key|
|
||||
{
|
||||
phone: :phone, latitude: :latitude, longitude: :longitude,
|
||||
first_name: :firstname, last_name: :lastname,
|
||||
street_address_1: :address1, street_address_2: :address2,
|
||||
postal_code: :zipcode,
|
||||
locality: :city,
|
||||
region: :state,
|
||||
country: :country,
|
||||
}.with_indifferent_access[key]
|
||||
end
|
||||
|
||||
address[:state] = find_state(address) if address[:state].present?
|
||||
address[:country] = find_country(address) if address[:country].present?
|
||||
|
||||
attributes["#{to}_attributes"] = address
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def find_state(address)
|
||||
Spree::State.find_by("LOWER(abbr) = ? OR LOWER(name) = ?",
|
||||
address.dig(:state, :code)&.downcase,
|
||||
address.dig(:state, :name)&.downcase)
|
||||
end
|
||||
|
||||
def find_country(address)
|
||||
Spree::Country.find_by("LOWER(iso) = ? OR LOWER(name) = ?",
|
||||
address.dig(:country, :code)&.downcase,
|
||||
address.dig(:country, :name)&.downcase)
|
||||
end
|
||||
end
|
||||
@@ -42,6 +42,10 @@ module Spree
|
||||
@order.update_order!
|
||||
end
|
||||
|
||||
if params[:set_distribution_step] && @order.update(order_params)
|
||||
return redirect_to spree.admin_order_customer_path(@order)
|
||||
end
|
||||
|
||||
unless order_params.present? && @order.update(order_params) && @order.line_items.present?
|
||||
if @order.line_items.empty? && !params[:suppress_error_msg]
|
||||
@order.errors.add(:line_items, Spree.t('errors.messages.blank'))
|
||||
@@ -55,7 +59,7 @@ module Spree
|
||||
redirect_to spree.edit_admin_order_path(@order)
|
||||
else
|
||||
# Jump to next step if order is not complete
|
||||
redirect_to spree.admin_order_customer_path(@order)
|
||||
redirect_to spree.admin_order_payments_path(@order)
|
||||
end
|
||||
end
|
||||
|
||||
@@ -126,7 +130,7 @@ module Spree
|
||||
end
|
||||
|
||||
def require_distributor_abn
|
||||
return if @order.distributor.abn.present?
|
||||
return if @order.distributor.can_invoice?
|
||||
|
||||
flash[:error] = t(:must_have_valid_business_number,
|
||||
enterprise_name: @order.distributor.name)
|
||||
|
||||
@@ -49,7 +49,10 @@ module Spree
|
||||
|
||||
# Using try because we may not have a card here
|
||||
if @credit_card.try(:destroy)
|
||||
remove_shop_authorizations if @credit_card.is_default
|
||||
if @credit_card.is_default
|
||||
remove_shop_authorizations
|
||||
mark_as_default_next_credit_card if credit_cards_with_payment_profile.count > 0
|
||||
end
|
||||
flash[:success] = I18n.t(:card_has_been_removed, number: "x-#{@credit_card.last_digits}")
|
||||
else
|
||||
flash[:error] = I18n.t(:card_could_not_be_removed)
|
||||
@@ -67,6 +70,14 @@ module Spree
|
||||
@credit_card.user.customers.update_all(allow_charges: false)
|
||||
end
|
||||
|
||||
def mark_as_default_next_credit_card
|
||||
credit_cards_with_payment_profile.first.update(is_default: true)
|
||||
end
|
||||
|
||||
def credit_cards_with_payment_profile
|
||||
spree_current_user.credit_cards.with_payment_profile
|
||||
end
|
||||
|
||||
def create_customer(token)
|
||||
Stripe::Customer.create(email: spree_current_user.email, source: token)
|
||||
end
|
||||
|
||||
@@ -4,6 +4,8 @@ module Spree
|
||||
class OrdersController < ::BaseController
|
||||
include OrderCyclesHelper
|
||||
include Rails.application.routes.url_helpers
|
||||
include CablecarResponses
|
||||
|
||||
|
||||
layout 'darkswarm'
|
||||
|
||||
@@ -99,7 +101,8 @@ module Spree
|
||||
else
|
||||
flash[:error] = I18n.t(:orders_could_not_cancel)
|
||||
end
|
||||
redirect_to request.referer || main_app.order_path(@order)
|
||||
render status: :found,
|
||||
operations: cable_car.redirect_to(url: request.referer || main_app.order_path(@order))
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
@@ -44,6 +44,14 @@ module Spree
|
||||
end
|
||||
end
|
||||
|
||||
def print_invoice_link
|
||||
if @order.distributor.can_invoice?
|
||||
print_invoice_link_with_url
|
||||
else
|
||||
notify_about_required_enterprise_number
|
||||
end
|
||||
end
|
||||
|
||||
def ticket_links
|
||||
return [] unless Spree::Config[:enable_receipt_printing?]
|
||||
|
||||
@@ -78,13 +86,20 @@ module Spree
|
||||
confirm: t(:must_have_valid_business_number, enterprise_name: @order.distributor.name) }
|
||||
end
|
||||
|
||||
def print_invoice_link
|
||||
def print_invoice_link_with_url
|
||||
{ name: t(:print_invoice),
|
||||
url: spree.print_admin_order_path(@order),
|
||||
icon: 'icon-print',
|
||||
target: "_blank" }
|
||||
end
|
||||
|
||||
def notify_about_required_enterprise_number
|
||||
{ name: t(:print_invoice),
|
||||
url: "#",
|
||||
icon: 'icon-print',
|
||||
confirm: t(:must_have_valid_business_number, enterprise_name: @order.distributor.name) }
|
||||
end
|
||||
|
||||
def print_ticket_link
|
||||
{ name: t(:print_ticket),
|
||||
url: print_ticket_admin_order_path(@order),
|
||||
|
||||
@@ -41,8 +41,8 @@ class CustomerSchema < JsonApiSchema
|
||||
street_address_2: "",
|
||||
postal_code: "1234",
|
||||
locality: "Melbourne",
|
||||
region: "Victoria",
|
||||
country: "Australia",
|
||||
region: { code: "Vic", name: "Victoria" },
|
||||
country: { code: "AU", name: "Australia" },
|
||||
}
|
||||
end
|
||||
|
||||
|
||||
@@ -10,7 +10,7 @@ class Customer < ApplicationRecord
|
||||
belongs_to :enterprise
|
||||
belongs_to :user, class_name: "Spree::User"
|
||||
has_many :orders, class_name: "Spree::Order"
|
||||
before_destroy :check_for_orders
|
||||
before_destroy :update_orders_and_delete_canceled_subscriptions
|
||||
|
||||
belongs_to :bill_address, class_name: "Spree::Address"
|
||||
alias_attribute :billing_address, :bill_address
|
||||
@@ -52,10 +52,12 @@ class Customer < ApplicationRecord
|
||||
self.user = user || Spree::User.find_by(email: email)
|
||||
end
|
||||
|
||||
def check_for_orders
|
||||
return true unless orders.any?
|
||||
|
||||
errors.add(:base, I18n.t('admin.customers.destroy.has_associated_orders'))
|
||||
throw :abort
|
||||
def update_orders_and_delete_canceled_subscriptions
|
||||
if Subscription.where(customer_id: id).not_canceled.any?
|
||||
errors.add(:base, I18n.t('admin.customers.destroy.has_associated_subscriptions'))
|
||||
throw :abort
|
||||
end
|
||||
Subscription.where(customer_id: id).destroy_all
|
||||
orders.update_all(customer_id: nil)
|
||||
end
|
||||
end
|
||||
|
||||
@@ -84,8 +84,8 @@ class Enterprise < ApplicationRecord
|
||||
has_one_attached :promo_image
|
||||
has_one_attached :terms_and_conditions
|
||||
|
||||
validates :logo, content_type: %r{\Aimage/.*\Z}
|
||||
validates :promo_image, content_type: %r{\Aimage/.*\Z}
|
||||
validates :logo, content_type: %r{\Aimage/(png|jpeg|gif|jpg|svg\+xml|webp)\Z}
|
||||
validates :promo_image, content_type: %r{\Aimage/(png|jpeg|gif|jpg|svg\+xml|webp)\Z}
|
||||
validates :terms_and_conditions, content_type: {
|
||||
in: "application/pdf",
|
||||
message: I18n.t(:enterprise_terms_and_conditions_type_error),
|
||||
@@ -312,6 +312,10 @@ class Enterprise < ApplicationRecord
|
||||
correct_instagram_url self[:instagram]
|
||||
end
|
||||
|
||||
def whatsapp_url
|
||||
correct_whatsapp_url self[:whatsapp_phone]
|
||||
end
|
||||
|
||||
def inventory_variants
|
||||
if prefers_product_selection_from_inventory_only?
|
||||
Spree::Variant.visible_for(self)
|
||||
@@ -408,6 +412,8 @@ class Enterprise < ApplicationRecord
|
||||
end
|
||||
|
||||
def can_invoice?
|
||||
return true unless Spree::Config.enterprise_number_required_on_invoices?
|
||||
|
||||
abn.present?
|
||||
end
|
||||
|
||||
@@ -446,6 +452,10 @@ class Enterprise < ApplicationRecord
|
||||
url&.sub(%r{(https?://)?}, '')
|
||||
end
|
||||
|
||||
def correct_whatsapp_url(phone_number)
|
||||
phone_number && "https://wa.me/" + phone_number.tr('+ ', '')
|
||||
end
|
||||
|
||||
def correct_instagram_url(url)
|
||||
url && strip_url(url).sub(%r{www.instagram.com/}, '').delete("@")
|
||||
end
|
||||
|
||||
@@ -28,8 +28,8 @@ class EnterpriseGroup < ApplicationRecord
|
||||
has_one_attached :logo
|
||||
has_one_attached :promo_image
|
||||
|
||||
validates :logo, content_type: %r{\Aimage/.*\Z}
|
||||
validates :promo_image, content_type: %r{\Aimage/.*\Z}
|
||||
validates :logo, content_type: %r{\Aimage/(png|jpeg|gif|jpg|svg\+xml|webp)\Z}
|
||||
validates :promo_image, content_type: %r{\Aimage/(png|jpeg|gif|jpg|svg\+xml|webp)\Z}
|
||||
|
||||
scope :by_position, -> { order('position ASC') }
|
||||
scope :on_front_page, -> { where(on_front_page: true) }
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
# This reduces the need to keep Orders in sync with their parent Subscriptions
|
||||
|
||||
class ProxyOrder < ApplicationRecord
|
||||
belongs_to :order, class_name: 'Spree::Order', dependent: :destroy
|
||||
belongs_to :order, class_name: 'Spree::Order'
|
||||
belongs_to :subscription
|
||||
belongs_to :order_cycle
|
||||
|
||||
|
||||
@@ -129,6 +129,7 @@ module Spree
|
||||
preference :enable_invoices?, :boolean, default: true
|
||||
preference :invoice_style2?, :boolean, default: false
|
||||
preference :enable_receipt_printing?, :boolean, default: false
|
||||
preference :enterprise_number_required_on_invoices?, :boolean, default: true
|
||||
|
||||
# Stripe payments
|
||||
preference :stripe_connect_enabled, :boolean, default: false
|
||||
|
||||
@@ -11,15 +11,19 @@ module Spree
|
||||
|
||||
has_one_attached :attachment
|
||||
|
||||
validates :attachment, attached: true, content_type: %r{\Aimage/.*\Z}
|
||||
validates :attachment, attached: true, content_type: %r{\Aimage/(png|jpeg|gif|jpg|svg\+xml|webp)\Z}
|
||||
validate :no_attachment_errors
|
||||
|
||||
def variant(name)
|
||||
attachment.variant(SIZES[name])
|
||||
if attachment.variable?
|
||||
attachment.variant(SIZES[name])
|
||||
else
|
||||
attachment
|
||||
end
|
||||
end
|
||||
|
||||
def url(size)
|
||||
return unless attachment.variable?
|
||||
return unless attachment.attached?
|
||||
|
||||
Rails.application.routes.url_helpers.url_for(variant(size))
|
||||
end
|
||||
|
||||
@@ -433,7 +433,7 @@ module Spree
|
||||
all_adjustments.destroy_all
|
||||
payments.clear
|
||||
shipments.destroy_all
|
||||
restart_checkout_flow if state == "payment"
|
||||
restart_checkout_flow if state.in?(["payment", "confirmation"])
|
||||
end
|
||||
|
||||
def state_changed(name)
|
||||
|
||||
@@ -172,6 +172,11 @@ module Spree
|
||||
OpenFoodNetwork::EnterpriseFeeCalculator.new(distributor, order_cycle).fees_by_type_for self
|
||||
end
|
||||
|
||||
def fees_name_by_type_for(distributor, order_cycle)
|
||||
OpenFoodNetwork::EnterpriseFeeCalculator.new(distributor,
|
||||
order_cycle).fees_name_by_type_for self
|
||||
end
|
||||
|
||||
def option_value(opt_name)
|
||||
option_values.detect { |o| o.option_type.name == opt_name }.try(:presentation)
|
||||
end
|
||||
|
||||
@@ -17,9 +17,9 @@ class Subscription < ApplicationRecord
|
||||
belongs_to :payment_method, class_name: 'Spree::PaymentMethod'
|
||||
belongs_to :bill_address, class_name: "Spree::Address"
|
||||
belongs_to :ship_address, class_name: "Spree::Address"
|
||||
has_many :subscription_line_items, inverse_of: :subscription
|
||||
has_many :subscription_line_items, inverse_of: :subscription, dependent: :destroy
|
||||
has_many :order_cycles, through: :schedule
|
||||
has_many :proxy_orders
|
||||
has_many :proxy_orders, dependent: :destroy
|
||||
has_many :orders, through: :proxy_orders
|
||||
|
||||
alias_attribute :billing_address, :bill_address
|
||||
|
||||
@@ -14,9 +14,9 @@ module Api
|
||||
|
||||
attributes :name, :id, :description, :latitude, :longitude,
|
||||
:long_description, :website, :instagram, :linkedin, :twitter,
|
||||
:facebook, :is_primary_producer, :is_distributor, :phone, :visible,
|
||||
:email_address, :hash, :logo, :promo_image, :path, :pickup, :delivery,
|
||||
:icon, :icon_font, :producer_icon_font, :category
|
||||
:facebook, :is_primary_producer, :is_distributor, :phone, :whatsapp_phone,
|
||||
:whatsapp_url, :visible, :email_address, :hash, :logo, :promo_image, :path, :pickup,
|
||||
:delivery, :icon, :icon_font, :producer_icon_font, :category
|
||||
|
||||
attributes :taxons, :supplied_taxons
|
||||
|
||||
|
||||
@@ -7,9 +7,9 @@ module Api
|
||||
|
||||
attributes :name, :id, :description, :latitude, :longitude, :long_description, :website,
|
||||
:instagram, :linkedin, :twitter, :facebook, :is_primary_producer, :is_distributor,
|
||||
:phone, :visible, :email_address, :hash, :logo, :promo_image, :path, :category,
|
||||
:active, :producers, :orders_close_at, :hubs, :taxons, :supplied_taxons, :pickup,
|
||||
:delivery, :preferred_product_low_stock_display
|
||||
:phone, :whatsapp_phone, :whatsapp_url, :visible, :email_address, :hash, :logo,
|
||||
:promo_image, :path, :category, :active, :producers, :orders_close_at, :hubs,
|
||||
:taxons, :supplied_taxons, :pickup, :delivery, :preferred_product_low_stock_display
|
||||
|
||||
has_one :address, serializer: Api::AddressSerializer
|
||||
has_many :supplied_properties, serializer: Api::PropertySerializer
|
||||
|
||||
@@ -11,8 +11,18 @@ module Api
|
||||
attribute :street_address_2, &:address2
|
||||
attribute :postal_code, &:zipcode
|
||||
attribute :locality, &:city
|
||||
attribute :region, &:state_name
|
||||
attribute :country, ->(object, _) { object.country.name }
|
||||
attribute :region do |object|
|
||||
{
|
||||
name: object.state.name,
|
||||
code: object.state.abbr,
|
||||
}
|
||||
end
|
||||
attribute :country do |object|
|
||||
{
|
||||
name: object.country.name,
|
||||
code: object.country.iso,
|
||||
}
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
@@ -4,7 +4,8 @@ class Api::VariantSerializer < ActiveModel::Serializer
|
||||
attributes :id, :is_master, :product_name, :sku,
|
||||
:options_text, :unit_value, :unit_description, :unit_to_display,
|
||||
:display_as, :display_name, :name_to_display,
|
||||
:price, :on_demand, :on_hand, :fees, :price_with_fees,
|
||||
:price, :on_demand, :on_hand,
|
||||
:fees, :fees_name, :price_with_fees,
|
||||
:tag_list, :thumb_url,
|
||||
:unit_price_price, :unit_price_unit
|
||||
|
||||
@@ -15,6 +16,10 @@ class Api::VariantSerializer < ActiveModel::Serializer
|
||||
object.fees_by_type_for(options[:current_distributor], options[:current_order_cycle])
|
||||
end
|
||||
|
||||
def fees_name
|
||||
object.fees_name_by_type_for(options[:current_distributor], options[:current_order_cycle])
|
||||
end
|
||||
|
||||
def price_with_fees
|
||||
if options[:enterprise_fee_calculator]
|
||||
object.price + options[:enterprise_fee_calculator].indexed_fees_for(object)
|
||||
|
||||
@@ -25,10 +25,10 @@ module PermittedAttributes
|
||||
def self.basic_permitted_attributes
|
||||
[
|
||||
:id, :name, :visible, :permalink, :owner_id, :contact_name, :email_address, :phone,
|
||||
:is_primary_producer, :sells, :website, :facebook, :instagram, :linkedin, :twitter,
|
||||
:description, :long_description, :logo, :promo_image, :terms_and_conditions,
|
||||
:allow_guest_orders, :allow_order_changes, :require_login, :enable_subscriptions,
|
||||
:abn, :acn, :charges_sales_tax, :display_invoice_logo, :invoice_text,
|
||||
:whatsapp_phone, :is_primary_producer, :sells, :website, :facebook, :instagram, :linkedin,
|
||||
:twitter, :description, :long_description, :logo, :promo_image, :terms_and_conditions,
|
||||
:allow_guest_orders, :allow_order_changes, :require_login, :enable_subscriptions, :abn,
|
||||
:acn, :charges_sales_tax, :display_invoice_logo, :invoice_text,
|
||||
:preferred_product_selection_from_inventory_only, :preferred_shopfront_message,
|
||||
:preferred_shopfront_closed_message, :preferred_shopfront_taxon_order,
|
||||
:preferred_shopfront_producer_order, :preferred_shopfront_order_cycle_order,
|
||||
|
||||
@@ -97,6 +97,7 @@ module Sets
|
||||
variants_attributes.each do |attributes|
|
||||
create_or_update_variant(product, attributes)
|
||||
end
|
||||
product.errors.empty?
|
||||
end
|
||||
|
||||
def create_or_update_variant(product, variant_attributes)
|
||||
@@ -114,6 +115,11 @@ module Sets
|
||||
|
||||
variant = product.variants.create(variant_attributes)
|
||||
|
||||
if variant.errors.present?
|
||||
product.errors.merge!(variant.errors)
|
||||
return false
|
||||
end
|
||||
|
||||
begin
|
||||
variant.on_demand = on_demand if on_demand.present?
|
||||
variant.on_hand = on_hand.to_i if on_hand.present?
|
||||
|
||||
@@ -15,6 +15,13 @@
|
||||
= f.label :phone, t('.phone')
|
||||
.omega.eight.columns
|
||||
= f.text_field :phone, { placeholder: t('.phone_placeholder') }
|
||||
.row
|
||||
.alpha.three.columns
|
||||
= f.label :whatsapp_phone, t('.whatsapp_phone')
|
||||
%div{'ofn-with-tip' => t('.whatsapp_phone_tip')}
|
||||
%a= t('admin.whats_this')
|
||||
.omega.eight.columns
|
||||
= f.text_field :whatsapp_phone, { placeholder: t('.whatsapp_phone_placeholder') }
|
||||
.row
|
||||
.alpha.three.columns
|
||||
= f.label :website, t('.website')
|
||||
|
||||
@@ -20,5 +20,10 @@
|
||||
= check_box_tag 'preferences[enable_receipt_printing?]', '1', Spree::Config[:enable_receipt_printing?]
|
||||
= label_tag nil, t('.enable_receipt_printing?')
|
||||
|
||||
.field.align-center
|
||||
= hidden_field_tag 'preferences[enterprise_number_required_on_invoices?]', '0'
|
||||
= check_box_tag 'preferences[enterprise_number_required_on_invoices?]', '1', Spree::Config[:enterprise_number_required_on_invoices?]
|
||||
= label_tag nil, t('.enterprise_number_required_on_invoices?')
|
||||
|
||||
.form-buttons{"data-hook" => "buttons"}
|
||||
= button t(:update), 'icon-refresh'
|
||||
|
||||
@@ -19,6 +19,10 @@
|
||||
%tr.products
|
||||
%td{ ng: { include: "'admin/panels/exchange_products_simple.html'" } }
|
||||
|
||||
%br
|
||||
= label_tag t('.tags')
|
||||
%tags-with-translation{ object: 'order_cycle.outgoing_exchanges[0]', form: 'order_cycle_form' }
|
||||
|
||||
%br/
|
||||
= label_tag t('.fees')
|
||||
= render 'coordinator_fees', f: f
|
||||
|
||||
@@ -14,6 +14,6 @@
|
||||
= t(".using_default_terms_html", tos_link: link_to_platform_terms)
|
||||
|
||||
= form_for [main_app, :admin, @new_file] do |f|
|
||||
= f.label :attachment
|
||||
= f.label :attachment, t(".attachment")
|
||||
= f.file_field :attachment
|
||||
= f.submit
|
||||
= f.submit t(".create_terms_of_service")
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
|
||||
- if Spree::Config.matomo_tag_manager_url.present?
|
||||
:javascript
|
||||
var _mtm = _mtm || [];
|
||||
var _mtm = window._mtm = window._mtm || [];
|
||||
_mtm.push({'mtm.startTime': (new Date().getTime()), 'event': 'mtm.Start'});
|
||||
var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0];
|
||||
var u="#{Spree::Config.matomo_tag_manager_url}";
|
||||
|
||||
@@ -14,6 +14,7 @@
|
||||
= 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"}
|
||||
= render "layouts/matomo_tag"
|
||||
= language_meta_tags
|
||||
|
||||
= stylesheet_pack_tag "darkswarm", "data-turbo-track": "reload"
|
||||
@@ -57,6 +58,5 @@
|
||||
= inject_currency_config
|
||||
= yield :injection_data
|
||||
|
||||
= render "layouts/matomo_tag"
|
||||
|
||||
= render "layouts/login_modal"
|
||||
|
||||
@@ -38,6 +38,11 @@
|
||||
= t :producers_contact_phone
|
||||
%span{"ng-bind" => "::producer.phone"}
|
||||
|
||||
%p.word-wrap{"ng-if" => "::producer.whatsapp_phone"}
|
||||
%a{"ng-href" => "{{::producer.whatsapp_url}}", target: "_blank"}
|
||||
%img{ src: image_pack_path("social-logos/whatsapp.svg") }
|
||||
%span{"ng-bind" => "::producer.whatsapp_phone"}
|
||||
|
||||
%p.word-wrap{"ng-if" => "::producer.email_address"}
|
||||
%a{"ng-href" => "{{::producer.email_address | stripUrl}}", target: "_blank", mailto: true}
|
||||
%span.obfuscatedEmail.email{"ng-bind" => "::producer.email_address | stripUrl"}
|
||||
|
||||
@@ -24,6 +24,10 @@
|
||||
.small-12.columns.field
|
||||
%label{ for: 'enterprise_phone' }= t(".phone_field")+":"
|
||||
%input.chunky.small-12.columns{ id: 'enterprise_phone', name: 'phone', placeholder: "{{'registration.steps.contact.phone_field_placeholder' | t}}", ng: { model: 'enterprise.phone' } }
|
||||
.row
|
||||
.small-12.columns.field
|
||||
%label{ "for" => 'enterprise_whatsapp_phone', 'data-toggle' => "tooltip", 'title' => "{{'registration.steps.contact.whatsapp_phone_tooltip' | t}}" }= t(".whatsapp_phone_field")+":"
|
||||
%input.chunky.small-12.columns{ id: 'enterprise_whatsapp_phone', name: 'whatsapp_phone', placeholder: "{{'registration.steps.contact.whatsapp_phone_field_placeholder' | t}}", ng: { model: 'enterprise.whatsapp_phone' } }
|
||||
.small-12.medium-12.large-5.hide-for-small-only
|
||||
|
||||
.row.buttons
|
||||
|
||||
@@ -18,7 +18,7 @@
|
||||
= current_distributor.address.zipcode
|
||||
|
||||
.small-12.large-4.columns
|
||||
- if current_distributor.website || current_distributor.email_address || current_distributor.phone
|
||||
- if current_distributor.website || current_distributor.email_address || current_distributor.phone || current_distributor.whatsapp_phone
|
||||
%div.center
|
||||
.header
|
||||
= t :shopping_contact_web
|
||||
@@ -26,6 +26,11 @@
|
||||
- if current_distributor.phone.present?
|
||||
= current_distributor.phone
|
||||
%br
|
||||
- if current_distributor.whatsapp_phone.present?
|
||||
%a{href: current_distributor.whatsapp_url, target: "_blank" }
|
||||
%img{ src: image_pack_path("social-logos/whatsapp.svg") }
|
||||
= current_distributor.whatsapp_phone
|
||||
%br
|
||||
- if current_distributor.website.present?
|
||||
%a{href: "http://#{current_distributor.website}", target: "_blank" }
|
||||
= current_distributor.website
|
||||
|
||||
@@ -6,6 +6,8 @@
|
||||
= render 'spree/admin/orders/insufficient_stock_lines', insufficient_stock_lines: @order.insufficient_stock_lines
|
||||
|
||||
= render :partial => "spree/admin/orders/shipment", :collection => @order.shipments, :locals => { :order => order }
|
||||
- if order.line_items.exists?
|
||||
= render partial: "spree/admin/orders/note", locals: { order: @order }
|
||||
|
||||
= render :partial => "spree/admin/orders/_form/adjustments", :locals => { :adjustments => @order.line_item_adjustments, :title => t(".line_item_adjustments")}
|
||||
= render :partial => "spree/admin/orders/_form/adjustments", :locals => { :adjustments => order_adjustments_for_display(@order), :title => t(".order_adjustments")}
|
||||
|
||||
26
app/views/spree/admin/orders/_note.html.haml
Normal file
26
app/views/spree/admin/orders/_note.html.haml
Normal file
@@ -0,0 +1,26 @@
|
||||
%table.index.edit-note-table
|
||||
%tr.edit-note.hidden.total
|
||||
%td{ colspan: "5", data: { controller: "input-char-count" }, style: "position: relative;" }
|
||||
%label
|
||||
= t(".note_label")
|
||||
= text_field_tag :note, @order.note, { maxLength: 280, data: { "input-char-count-target": "input" } }
|
||||
%span.edit-note-count{ data: { "input-char-count-target": "count" }, style: "position: absolute; right: 7px; top: 7px; font-size: 11px;" }
|
||||
|
||||
%td.actions
|
||||
= link_to '', '', class: 'save-note icon_link icon-ok no-text with-tip', data: { action: 'save' }, title: I18n.t('actions.save')
|
||||
= link_to '', '', class: 'cancel-note icon_link icon-cancel no-text with-tip', data: { action: 'cancel' }, title: I18n.t('actions.cancel')
|
||||
|
||||
%tr.show-note.total
|
||||
%td{ :colspan => "5" }
|
||||
- if order.note.present?
|
||||
%strong
|
||||
= t(".note_label")
|
||||
= order.note
|
||||
- else
|
||||
= t(".no_note_present")
|
||||
|
||||
%td.actions
|
||||
= link_to '', '', class: 'edit-note icon_link icon-edit no-text with-tip', data: { action: 'edit' }, title: Spree.t('edit')
|
||||
- if @order.note.present?
|
||||
= link_to '', '', class: 'delete-note icon_link icon-trash no-text with-tip', data: { action: 'remove' }, title: Spree.t('delete')
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
.per-page{'ng-show' => '!RequestMonitor.loading && orders.length > 0'}
|
||||
- position ||= ""
|
||||
.per-page{'ng-show' => '!RequestMonitor.loading && orders.length > 0', class: ("right" if position == "right") }
|
||||
%input.per-page-select.ofn-select2{type: 'number', data: 'per_page_options', 'min-search' => 999, 'ng-model' => 'per_page', 'ng-change' => 'fetchResults()'}
|
||||
|
||||
%span.per-page-feedback
|
||||
|
||||
@@ -85,3 +85,5 @@
|
||||
%td.actions
|
||||
- if can?(:update, shipment) && shipment.can_modify?
|
||||
= link_to '', '', :class => 'edit-tracking icon_link icon-edit no-text with-tip', :data => { :action => 'edit' }, :title => Spree.t('edit')
|
||||
- if shipment.tracking.present?
|
||||
= link_to '', '', :class => 'delete-tracking icon_link icon-trash no-text with-tip', :data => { 'shipment-number' => shipment.number, :action => 'remove' }, :title => Spree.t('delete')
|
||||
|
||||
@@ -20,11 +20,22 @@
|
||||
= render partial: 'filters'
|
||||
|
||||
.row.index-controls{'ng-show' => '!RequestMonitor.loading && orders.length > 0'}
|
||||
= render partial: 'per_page_controls'
|
||||
%div{style: "display: flex; justify-content: space-between;"}
|
||||
- if Spree::Config[:enable_invoices?]
|
||||
.ofn-drop-down-with-prepend
|
||||
.ofn-drop-down-prepend{"ng-class": "selected_orders.length == 0 ? 'disabled' : ''"}
|
||||
{{ "spree.admin.orders.index.selected" | t:{count: selected_orders.length} }}
|
||||
.ofn-drop-down{"ng-class": "selected_orders.length == 0 ? 'disabled' : ''"}
|
||||
%span{ :class => 'icon-reorder' }
|
||||
="#{t('admin.actions')}".html_safe
|
||||
%span{ 'ng-class' => "expanded && 'icon-caret-up' || !expanded && 'icon-caret-down'" }
|
||||
%div.menu{ 'ng-show' => "expanded" }
|
||||
%div.menu_item
|
||||
%span.name.invoices-modal{'ng-controller' => 'bulkInvoiceCtrl', 'ng-click' => 'createBulkInvoice()' }
|
||||
= t('.print_invoices')
|
||||
|
||||
- if Spree::Config[:enable_invoices?]
|
||||
%button.invoices-modal{'ng-controller' => 'bulkInvoiceCtrl', 'ng-click' => 'createBulkInvoice()', 'ng-disabled' => 'selected_orders.length == 0'}
|
||||
= t('.print_invoices')
|
||||
|
||||
= render partial: 'per_page_controls', locals: { position: "right" }
|
||||
|
||||
%table#listing_orders.index.responsive{width: "100%", 'ng-init' => 'initialise()', 'ng-show' => "!RequestMonitor.loading && orders.length > 0" }
|
||||
%colgroup
|
||||
|
||||
@@ -9,7 +9,7 @@
|
||||
\#
|
||||
= @order.number
|
||||
|
||||
= render 'spree/admin/shared/order_tabs', :current => 'Order Details'
|
||||
= render 'spree/admin/shared/order_tabs', :current => 'Customer Details'
|
||||
|
||||
= csrf_meta_tags
|
||||
|
||||
@@ -21,6 +21,7 @@
|
||||
= render 'spree/admin/orders/_form/distribution_fields'
|
||||
-# This param passed to stop validation error in next page due to no line items in order yet:
|
||||
= hidden_field_tag 'suppress_error_msg', "true"
|
||||
= hidden_field_tag "set_distribution_step", "true"
|
||||
= button_tag :class => 'secondary radius expand small', :id => 'update-button' do
|
||||
%i.icon-arrow-right
|
||||
= t(:next)
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
%fieldset#calculator_fields.no-border-bottom
|
||||
%legend{align: "center"}= t(:calculator)
|
||||
%legend{align: "center"}= t(:fees)
|
||||
#preference-settings
|
||||
.row
|
||||
.alpha.four.columns
|
||||
|
||||
@@ -44,22 +44,22 @@
|
||||
|
||||
%nav.menu
|
||||
%ul
|
||||
- order_details_classes = "active" if current == "Order Details"
|
||||
%li{ class: order_details_classes }
|
||||
= link_to_with_icon 'icon-edit', t(:order_details), spree.edit_admin_order_url(@order)
|
||||
|
||||
- customer_details_classes = "active" if current == "Customer Details"
|
||||
%li{ class: customer_details_classes }
|
||||
= link_to_with_icon 'icon-user', t(:customer_details), spree.admin_order_customer_url(@order)
|
||||
|
||||
- adjustments_classes = "active" if current == "Adjustments"
|
||||
%li{ class: adjustments_classes }
|
||||
= link_to_with_icon 'icon-cogs', t(:adjustments), spree.admin_order_adjustments_url(@order)
|
||||
- order_details_classes = "active" if current == "Order Details"
|
||||
%li{ class: order_details_classes }
|
||||
= link_to_with_icon 'icon-edit', t(:order_details), spree.edit_admin_order_url(@order)
|
||||
|
||||
- payments_classes = "active" if current == "Payments"
|
||||
%li{ class: payments_classes }
|
||||
= link_to_with_icon 'icon-credit-card', t(:payments), spree.admin_order_payments_url(@order)
|
||||
|
||||
- adjustments_classes = "active" if current == "Adjustments"
|
||||
%li{ class: adjustments_classes }
|
||||
= link_to_with_icon 'icon-cogs', t(:adjustments), spree.admin_order_adjustments_url(@order)
|
||||
|
||||
- if @order.completed?
|
||||
- authorizations_classes = "active" if current == "Return Authorizations"
|
||||
%li{ class: authorizations_classes }
|
||||
|
||||
@@ -27,7 +27,7 @@
|
||||
-# The 'Category' label here is just a logical descriptor for the data we are trying to collect for 'requires_ship_address'
|
||||
-# and does not relate to shipping categories in any way.
|
||||
= f.label :require_ship_address, t(:category)
|
||||
.two.columns
|
||||
.three.columns
|
||||
= f.radio_button :require_ship_address, true
|
||||
|
||||
= f.label :delivery, t(:delivery)
|
||||
|
||||
@@ -18,7 +18,7 @@
|
||||
.omega.five.columns
|
||||
= f.field_container :password do
|
||||
= f.label :password, t(".password")
|
||||
= f.password_field :password, class: "fullwidth"
|
||||
= f.password_field :password, class: "fullwidth", autocomplete: "new-password"
|
||||
= f.error_message_on :password
|
||||
= f.field_container :password do
|
||||
= f.label :password_confirmation, t(".confirm_password")
|
||||
|
||||
@@ -14,7 +14,7 @@
|
||||
= item.variant.options_text
|
||||
%br
|
||||
|
||||
- if @shipment.tracking
|
||||
- if @shipment.tracking.present?
|
||||
%p.lead
|
||||
= t('.track_information', tracking: @shipment.tracking)
|
||||
|
||||
|
||||
@@ -7,10 +7,11 @@
|
||||
%th= t(".allow_charges?")
|
||||
%tr.customer{ id: "customer{{ customer.id }}", ng: { repeat: "customer in customers" } }
|
||||
%td.shop{ ng: { bind: 'shopsByID[customer.enterprise_id].name' } }
|
||||
%td.allow_charges
|
||||
%td.allow_charges{ tooltip: "{{ hasOneDefaultSavedCards() ? null : \'" + t('.no_default_saved_cards_tooltip') + "\' }}" }
|
||||
%input{ type: 'checkbox',
|
||||
name: 'allow_charges',
|
||||
ng: { model: 'customer.allow_charges',
|
||||
change: 'customer.update()',
|
||||
disabled: "!hasOneDefaultSavedCards()",
|
||||
"true-value" => "true",
|
||||
"false-value" => "false" } }
|
||||
|
||||
@@ -11,8 +11,7 @@
|
||||
%th.order7.show-for-large-up.text-right= t('.cancel')
|
||||
%tbody.transaction-group{"ng-repeat" => "order in Orders.changeable", "ng-class-odd"=>"'odd'", "ng-class-even"=>"'even'"}
|
||||
%tr.order-row
|
||||
%td.order1
|
||||
%a{"ng-href" => "{{::order.path}}", "ng-bind" => "::order.number"}
|
||||
%td.order1{"ng-bind" => "::order.number"}
|
||||
%td.order2
|
||||
%a{"ng-href" => "{{::Orders.shopsByID[order.shop_id].hash}}#{main_app.shop_path}", "ng-bind" => "::Orders.shopsByID[order.shop_id].name"}
|
||||
%td.order3.show-for-large-up{"ng-bind" => "::order.changes_allowed_until"}
|
||||
|
||||
@@ -8,16 +8,16 @@
|
||||
%th.order4.show-for-large-up= t('.items')
|
||||
%th.order5.text-right= t('.total')
|
||||
%th.order6.text-right.show-for-large-up= t('.paid?')
|
||||
%th.order7.text-right= t('.view')
|
||||
%th.order7.text-right= t('.status')
|
||||
%tbody.transaction-group{"ng-repeat" => "order in Orders.all | filter:{changes_allowed:false} as pastOrders", "ng-class-odd"=>"'odd'", "ng-class-even"=>"'even'"}
|
||||
%tr.order-row
|
||||
%td.order1
|
||||
%a{"ng-href" => "{{::order.path}}", "ng-bind" => "::order.number"}
|
||||
%td.order1{"ng-bind" => "::order.number"}
|
||||
%td.order2
|
||||
%a{"ng-href" => "{{::Orders.shopsByID[order.shop_id].hash}}#{main_app.shop_path}", "ng-bind" => "::Orders.shopsByID[order.shop_id].name"}
|
||||
%td.order3.show-for-large-up{"ng-bind" => "::order.completed_at"}
|
||||
%td.order4.show-for-large-up{"ng-bind" => "::order.item_count"}
|
||||
%td.order5.text-right{"ng-class" => "{'debit': order.payment_state != 'paid', 'credit': order.payment_state == 'paid'}","ng-bind" => "::order.total | localizeCurrency"}
|
||||
%td.order6.text-right.show-for-large-up{"ng-class" => "{'debit': order.payment_state != 'paid', 'credit': order.payment_state == 'paid'}", "ng-bind" => "::(order.payment_state == 'paid' ? 'say_yes' : 'say_no') | t"}
|
||||
%td.order7.text-right
|
||||
%a{"ng-href" => "{{::order.path}}" }= t('.view')
|
||||
%td.order7.text-right{ "ng-switch" => "::order.state" }
|
||||
%a{ "ng-switch-when" => "complete", "ng-href" => "{{::order.path}}" }= t('.completed')
|
||||
%span{ "ng-switch-when" => "canceled" }= t('.cancelled')
|
||||
|
||||
@@ -11,36 +11,36 @@ export default class extends Controller {
|
||||
// private
|
||||
|
||||
populateSelect(sourceId) {
|
||||
this.removeCurrentOptions()
|
||||
this.populateNewOptions(sourceId)
|
||||
this.removeCurrentOptions();
|
||||
this.populateNewOptions(sourceId);
|
||||
}
|
||||
|
||||
removeCurrentOptions() {
|
||||
this.selectTarget.innerHTML = ""
|
||||
this.selectTarget.innerHTML = "";
|
||||
|
||||
this.selectTarget.tomselect?.clear()
|
||||
this.selectTarget.tomselect?.clearOptions()
|
||||
this.selectTarget.tomselect?.clear();
|
||||
this.selectTarget.tomselect?.clearOptions();
|
||||
}
|
||||
|
||||
populateNewOptions(sourceId) {
|
||||
const options = this.dependantOptionsFor(sourceId)
|
||||
const options = this.dependantOptionsFor(sourceId);
|
||||
|
||||
options.forEach((item) => {
|
||||
this.addOption(item[0], item[1])
|
||||
this.addOption(item[0], item[1]);
|
||||
});
|
||||
|
||||
this.selectTarget.tomselect?.sync()
|
||||
this.selectTarget.tomselect?.addItem(options[0]?.[1])
|
||||
this.selectTarget.tomselect?.sync();
|
||||
this.selectTarget.tomselect?.addItem(options[0]?.[1]);
|
||||
}
|
||||
|
||||
addOption(label, value) {
|
||||
const newOption = document.createElement("option")
|
||||
newOption.innerHTML = label
|
||||
newOption.value = value
|
||||
this.selectTarget.appendChild(newOption)
|
||||
const newOption = document.createElement("option");
|
||||
newOption.innerHTML = label;
|
||||
newOption.value = value;
|
||||
this.selectTarget.appendChild(newOption);
|
||||
}
|
||||
|
||||
dependantOptionsFor(sourceId) {
|
||||
return this.optionsValue.find((option) => option[0] === sourceId)[1]
|
||||
return this.optionsValue.find((option) => option[0] === sourceId)[1];
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
// or:
|
||||
// div{data: {controller: "example"}}
|
||||
|
||||
import { Controller } from "stimulus"
|
||||
import { Controller } from "stimulus";
|
||||
|
||||
export default class extends Controller {
|
||||
// connect() is a built-in lifecycle callback for Stimulus Controllers. It fires when the
|
||||
@@ -11,7 +11,7 @@ export default class extends Controller {
|
||||
// injected into the DOM. This means initialization is not tied to the page load event, but
|
||||
// will also happen dynamically if and when new DOM elements are added or removed.
|
||||
connect() {
|
||||
console.log("We're connected!")
|
||||
console.log("We're connected!");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -1,20 +1,20 @@
|
||||
import { Controller } from "stimulus"
|
||||
import { Controller } from "stimulus";
|
||||
|
||||
document.addEventListener('turbolinks:before-cache', () =>
|
||||
document.getElementById('flash').remove()
|
||||
)
|
||||
document.addEventListener("turbolinks:before-cache", () =>
|
||||
document.getElementById("flash").remove()
|
||||
);
|
||||
|
||||
export default class extends Controller {
|
||||
connect() {
|
||||
setTimeout(this.fadeout.bind(this), 3000)
|
||||
setTimeout(this.fadeout.bind(this), 3000);
|
||||
}
|
||||
|
||||
fadeout() {
|
||||
this.element.classList.add("animate-hide-500")
|
||||
setTimeout(this.close.bind(this), 500)
|
||||
this.element.classList.add("animate-hide-500");
|
||||
setTimeout(this.close.bind(this), 500);
|
||||
}
|
||||
|
||||
close() {
|
||||
this.element.remove()
|
||||
this.element.remove();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,22 +1,24 @@
|
||||
import { Controller } from "stimulus"
|
||||
import { Controller } from "stimulus";
|
||||
|
||||
export default class extends Controller {
|
||||
static targets = ["checkout", "guest"];
|
||||
static values = {
|
||||
distributor: String,
|
||||
session: { type: String, default: "guest-checkout" }
|
||||
session: { type: String, default: "guest-checkout" },
|
||||
};
|
||||
|
||||
connect() {
|
||||
if(!this.hasGuestTarget) { return }
|
||||
if (!this.hasGuestTarget) {
|
||||
return;
|
||||
}
|
||||
|
||||
if(this.usingGuestCheckout()) {
|
||||
if (this.usingGuestCheckout()) {
|
||||
this.showCheckout();
|
||||
}
|
||||
}
|
||||
|
||||
login() {
|
||||
window.dispatchEvent(new Event("login:modal:open"))
|
||||
window.dispatchEvent(new Event("login:modal:open"));
|
||||
}
|
||||
|
||||
showCheckout() {
|
||||
@@ -30,6 +32,6 @@ export default class extends Controller {
|
||||
}
|
||||
|
||||
usingGuestCheckout() {
|
||||
return sessionStorage.getItem(this.sessionValue) === this.distributorValue
|
||||
return sessionStorage.getItem(this.sessionValue) === this.distributorValue;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,33 +1,33 @@
|
||||
import { Controller } from "stimulus"
|
||||
import { Controller } from "stimulus";
|
||||
|
||||
export default class extends Controller {
|
||||
static targets = ["background", "modal"]
|
||||
static targets = ["background", "modal"];
|
||||
|
||||
open() {
|
||||
this.backgroundTarget.style.display = "block"
|
||||
this.modalTarget.style.display = "block"
|
||||
this.backgroundTarget.style.display = "block";
|
||||
this.modalTarget.style.display = "block";
|
||||
|
||||
setTimeout(() => {
|
||||
this.modalTarget.classList.add("in")
|
||||
this.backgroundTarget.classList.add("in")
|
||||
document.querySelector("body").classList.add("modal-open")
|
||||
})
|
||||
this.modalTarget.classList.add("in");
|
||||
this.backgroundTarget.classList.add("in");
|
||||
document.querySelector("body").classList.add("modal-open");
|
||||
});
|
||||
}
|
||||
|
||||
close() {
|
||||
this.modalTarget.classList.remove("in")
|
||||
this.backgroundTarget.classList.remove("in")
|
||||
document.querySelector("body").classList.remove("modal-open")
|
||||
this.modalTarget.classList.remove("in");
|
||||
this.backgroundTarget.classList.remove("in");
|
||||
document.querySelector("body").classList.remove("modal-open");
|
||||
|
||||
setTimeout(() => {
|
||||
this.backgroundTarget.style.display = "none"
|
||||
this.modalTarget.style.display = "none"
|
||||
}, 200)
|
||||
this.backgroundTarget.style.display = "none";
|
||||
this.modalTarget.style.display = "none";
|
||||
}, 200);
|
||||
}
|
||||
|
||||
closeIfEscapeKey(e) {
|
||||
if (e.code == "Escape") {
|
||||
this.close()
|
||||
this.close();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,11 +1,15 @@
|
||||
import { Controller } from "stimulus"
|
||||
import { Controller } from "stimulus";
|
||||
|
||||
export default class extends Controller {
|
||||
static values = { target: String }
|
||||
static values = { target: String };
|
||||
|
||||
open() {
|
||||
let helpModal = document.getElementById(this.targetValue)
|
||||
let helpModalController = this.application.getControllerForElementAndIdentifier(helpModal, "help-modal");
|
||||
let helpModal = document.getElementById(this.targetValue);
|
||||
let helpModalController =
|
||||
this.application.getControllerForElementAndIdentifier(
|
||||
helpModal,
|
||||
"help-modal"
|
||||
);
|
||||
helpModalController.open();
|
||||
}
|
||||
}
|
||||
|
||||
21
app/webpacker/controllers/input_char_count_controller.js
Normal file
21
app/webpacker/controllers/input_char_count_controller.js
Normal file
@@ -0,0 +1,21 @@
|
||||
import { Controller } from "stimulus";
|
||||
|
||||
export default class extends Controller {
|
||||
static targets = ["count", "input"];
|
||||
|
||||
connect() {
|
||||
this.inputTarget.addEventListener("keyup", this.countCharacters.bind(this));
|
||||
this.countCharacters();
|
||||
}
|
||||
|
||||
countCharacters() {
|
||||
this.displayCount(
|
||||
this.inputTarget.value.length,
|
||||
this.inputTarget.maxLength
|
||||
);
|
||||
}
|
||||
|
||||
displayCount(count, max) {
|
||||
this.countTarget.textContent = `${count}/${max}`;
|
||||
}
|
||||
}
|
||||
@@ -1,61 +1,70 @@
|
||||
import { Controller } from "stimulus"
|
||||
import CableReady from "cable_ready"
|
||||
import { Controller } from "stimulus";
|
||||
import CableReady from "cable_ready";
|
||||
|
||||
export default class extends Controller {
|
||||
static targets = ["background", "modal", "email"]
|
||||
static values = { email: String }
|
||||
static targets = ["background", "modal", "email"];
|
||||
static values = { email: String };
|
||||
|
||||
connect() {
|
||||
if(this.hasModalTarget) {
|
||||
window.addEventListener("login:modal:open", this.open)
|
||||
if (this.hasModalTarget) {
|
||||
window.addEventListener("login:modal:open", this.open);
|
||||
|
||||
if(location.hash.substr(1).includes("/login")) {
|
||||
this.open()
|
||||
if (location.hash.substr(1).includes("/login")) {
|
||||
this.open();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
call(event) {
|
||||
event.preventDefault()
|
||||
window.dispatchEvent(new Event("login:modal:open"))
|
||||
event.preventDefault();
|
||||
window.dispatchEvent(new Event("login:modal:open"));
|
||||
}
|
||||
|
||||
emailOnInput(event) {
|
||||
this.emailValue = event.currentTarget.value
|
||||
this.emailValue = event.currentTarget.value;
|
||||
this.emailTargets.forEach((element) => {
|
||||
element.value = this.emailValue
|
||||
})
|
||||
element.value = this.emailValue;
|
||||
});
|
||||
}
|
||||
|
||||
open = () => {
|
||||
if(!location.hash.substr(1).includes("/login")) {
|
||||
history.pushState({}, "", "#/login")
|
||||
if (!location.hash.substr(1).includes("/login")) {
|
||||
history.pushState({}, "", "#/login");
|
||||
}
|
||||
|
||||
this.backgroundTarget.style.display = "block"
|
||||
this.modalTarget.style.display = "block"
|
||||
this.backgroundTarget.style.display = "block";
|
||||
this.modalTarget.style.display = "block";
|
||||
|
||||
setTimeout(() => {
|
||||
this.modalTarget.classList.add("in")
|
||||
this.backgroundTarget.classList.add("in")
|
||||
document.querySelector("body").classList.add("modal-open")
|
||||
})
|
||||
this.modalTarget.classList.add("in");
|
||||
this.backgroundTarget.classList.add("in");
|
||||
document.querySelector("body").classList.add("modal-open");
|
||||
});
|
||||
|
||||
window._paq?.push(['trackEvent', 'Signin/Signup', 'Login Modal View', window.location.href])
|
||||
}
|
||||
window._paq?.push([
|
||||
"trackEvent",
|
||||
"Signin/Signup",
|
||||
"Login Modal View",
|
||||
window.location.href,
|
||||
]);
|
||||
};
|
||||
|
||||
close() {
|
||||
history.pushState({}, "", window.location.pathname + window.location.search)
|
||||
history.pushState(
|
||||
{},
|
||||
"",
|
||||
window.location.pathname + window.location.search
|
||||
);
|
||||
|
||||
this.modalTarget.classList.remove("in")
|
||||
this.backgroundTarget.classList.remove("in")
|
||||
this.modalTarget.classList.remove("in");
|
||||
this.backgroundTarget.classList.remove("in");
|
||||
|
||||
document.querySelector("body").classList.remove("modal-open")
|
||||
document.querySelector("body").classList.remove("modal-open");
|
||||
|
||||
setTimeout(() => {
|
||||
this.backgroundTarget.style.display = "none"
|
||||
this.modalTarget.style.display = "none"
|
||||
}, 200)
|
||||
this.backgroundTarget.style.display = "none";
|
||||
this.modalTarget.style.display = "none";
|
||||
}, 200);
|
||||
}
|
||||
|
||||
resend_confirmation(event) {
|
||||
@@ -63,19 +72,21 @@ export default class extends Controller {
|
||||
method: "POST",
|
||||
body: JSON.stringify({
|
||||
spree_user: { email: this.emailValue },
|
||||
tab: event.currentTarget.dataset.tab
|
||||
tab: event.currentTarget.dataset.tab,
|
||||
}),
|
||||
headers: { "Content-type": "application/json; charset=UTF-8" }
|
||||
}).then(data => data.json()).then(CableReady.perform)
|
||||
headers: { "Content-type": "application/json; charset=UTF-8" },
|
||||
})
|
||||
.then((data) => data.json())
|
||||
.then(CableReady.perform);
|
||||
}
|
||||
|
||||
returnHome() {
|
||||
window.location = "/"
|
||||
window.location = "/";
|
||||
}
|
||||
|
||||
disconnect() {
|
||||
if(this.hasModalTarget) {
|
||||
window.removeEventListener("login:modal:open", this.open)
|
||||
if (this.hasModalTarget) {
|
||||
window.removeEventListener("login:modal:open", this.open);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -27,7 +27,7 @@ export default class extends Controller {
|
||||
Array.from(
|
||||
document.getElementsByClassName("paymentmethod-container")
|
||||
).forEach((container) => {
|
||||
const enabled = container.id === paymentMethodContainerId
|
||||
const enabled = container.id === paymentMethodContainerId;
|
||||
|
||||
if (enabled) {
|
||||
container.style.display = "block";
|
||||
|
||||
@@ -2,16 +2,15 @@ import { Controller } from "stimulus";
|
||||
|
||||
export default class extends Controller {
|
||||
static targets = ["chevron"];
|
||||
static values = { selector: String }
|
||||
static values = { selector: String };
|
||||
|
||||
toggle(event) {
|
||||
if (this.hasChevronTarget) {
|
||||
this.chevronTarget.classList.toggle("icon-chevron-down")
|
||||
this.chevronTarget.classList.toggle("icon-chevron-up")
|
||||
this.chevronTarget.classList.toggle("icon-chevron-down");
|
||||
this.chevronTarget.classList.toggle("icon-chevron-up");
|
||||
}
|
||||
|
||||
const element = document.querySelector(this.selectorValue)
|
||||
element.style.display = element.style.display === "none" ? "block" : "none"
|
||||
const element = document.querySelector(this.selectorValue);
|
||||
element.style.display = element.style.display === "none" ? "block" : "none";
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -6,7 +6,7 @@ export default class extends Controller {
|
||||
static targets = ["stripeelements", "select"];
|
||||
|
||||
connect() {
|
||||
this.initSelectedCard()
|
||||
this.initSelectedCard();
|
||||
}
|
||||
|
||||
initSelectedCard() {
|
||||
|
||||
@@ -1,16 +1,24 @@
|
||||
import { Controller } from "stimulus"
|
||||
import { Controller } from "stimulus";
|
||||
|
||||
export default class extends Controller {
|
||||
static targets = [ "cardElement", "cardErrors", "expMonth", "expYear", "brand", "last4", "pmId" ];
|
||||
static targets = [
|
||||
"cardElement",
|
||||
"cardErrors",
|
||||
"expMonth",
|
||||
"expYear",
|
||||
"brand",
|
||||
"last4",
|
||||
"pmId",
|
||||
];
|
||||
static styles = {
|
||||
base: {
|
||||
fontFamily: "Roboto, Arial, sans-serif",
|
||||
fontSize: "16px",
|
||||
color: "#5c5c5c",
|
||||
"::placeholder": {
|
||||
color: "#6c6c6c"
|
||||
}
|
||||
}
|
||||
color: "#6c6c6c",
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
initialize() {
|
||||
@@ -19,10 +27,12 @@ export default class extends Controller {
|
||||
|
||||
// Initialize Stripe JS
|
||||
this.stripe = Stripe(this.data.get("key"));
|
||||
this.stripeElement = this.stripe.elements({ locale: I18n.base_locale }).create("card", {
|
||||
style: this.constructor.styles,
|
||||
hidePostalCode: true
|
||||
});
|
||||
this.stripeElement = this.stripe
|
||||
.elements({ locale: I18n.base_locale })
|
||||
.create("card", {
|
||||
style: this.constructor.styles,
|
||||
hidePostalCode: true,
|
||||
});
|
||||
|
||||
// Mount Stripe Elements JS to the form field
|
||||
this.stripeElement.mount(this.cardElementTarget);
|
||||
@@ -41,26 +51,42 @@ export default class extends Controller {
|
||||
// Before the form is submitted we send the card details directly to Stripe (via StripeJS),
|
||||
// and receive a token which represents the card object, and add that token into the form.
|
||||
stripeSubmit = (event) => {
|
||||
if(!this.stripeSelected() || !this.catchFormSubmit) { return }
|
||||
if (!this.stripeSelected() || !this.catchFormSubmit) {
|
||||
return;
|
||||
}
|
||||
|
||||
event.preventDefault();
|
||||
event.stopPropagation();
|
||||
|
||||
this.stripe.createPaymentMethod({type: "card", card: this.stripeElement}).then(response => {
|
||||
if (response.error) {
|
||||
this.updateErrors(response);
|
||||
} else {
|
||||
this.pmIdTarget.setAttribute("value", response.paymentMethod.id);
|
||||
this.expMonthTarget.setAttribute("value", response.paymentMethod.card.exp_month);
|
||||
this.expYearTarget.setAttribute("value", response.paymentMethod.card.exp_year);
|
||||
this.brandTarget.setAttribute("value", response.paymentMethod.card.brand);
|
||||
this.last4Target.setAttribute("value", response.paymentMethod.card.last4);
|
||||
this.catchFormSubmit = false;
|
||||
|
||||
event.submitter.click();
|
||||
}
|
||||
});
|
||||
}
|
||||
this.stripe
|
||||
.createPaymentMethod({ type: "card", card: this.stripeElement })
|
||||
.then((response) => {
|
||||
if (response.error) {
|
||||
this.updateErrors(response);
|
||||
} else {
|
||||
this.pmIdTarget.setAttribute("value", response.paymentMethod.id);
|
||||
this.expMonthTarget.setAttribute(
|
||||
"value",
|
||||
response.paymentMethod.card.exp_month
|
||||
);
|
||||
this.expYearTarget.setAttribute(
|
||||
"value",
|
||||
response.paymentMethod.card.exp_year
|
||||
);
|
||||
this.brandTarget.setAttribute(
|
||||
"value",
|
||||
response.paymentMethod.card.brand
|
||||
);
|
||||
this.last4Target.setAttribute(
|
||||
"value",
|
||||
response.paymentMethod.card.last4
|
||||
);
|
||||
this.catchFormSubmit = false;
|
||||
|
||||
event.submitter.click();
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
// Update validation messages from Stripe shown in the form
|
||||
updateErrors = (data) => {
|
||||
@@ -69,10 +95,10 @@ export default class extends Controller {
|
||||
} else {
|
||||
this.cardErrorsTarget.textContent = "";
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
// Boolean; true if Stripe is shown / currently selected
|
||||
stripeSelected() {
|
||||
return !!this.cardElementTarget.offsetParent
|
||||
return !!this.cardElementTarget.offsetParent;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,36 +1,36 @@
|
||||
import { Controller } from "stimulus";
|
||||
|
||||
export default class extends Controller {
|
||||
static targets = ["tab", "content"]
|
||||
static targets = ["tab", "content"];
|
||||
|
||||
select(event) {
|
||||
this.setCurrentTab(this.tabTargets.indexOf(event.currentTarget))
|
||||
this.setCurrentTab(this.tabTargets.indexOf(event.currentTarget));
|
||||
}
|
||||
|
||||
// private
|
||||
|
||||
connect() {
|
||||
this.setCurrentTab()
|
||||
this.setCurrentTab();
|
||||
}
|
||||
|
||||
setCurrentTab(tabIndex = 0) {
|
||||
this.showSelectedContent(tabIndex)
|
||||
this.setButtonActiveClass(tabIndex)
|
||||
this.showSelectedContent(tabIndex);
|
||||
this.setButtonActiveClass(tabIndex);
|
||||
}
|
||||
|
||||
showSelectedContent(tabIndex) {
|
||||
this.contentTargets.forEach((element, index) => {
|
||||
element.hidden = index !== tabIndex
|
||||
})
|
||||
element.hidden = index !== tabIndex;
|
||||
});
|
||||
}
|
||||
|
||||
setButtonActiveClass(tabIndex) {
|
||||
this.tabTargets.forEach((element, index) => {
|
||||
if(index === tabIndex) {
|
||||
element.classList.add("active")
|
||||
if (index === tabIndex) {
|
||||
element.classList.add("active");
|
||||
} else {
|
||||
element.classList.remove("active")
|
||||
element.classList.remove("active");
|
||||
}
|
||||
})
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,6 +1,17 @@
|
||||
.per-page {
|
||||
float: left;
|
||||
|
||||
&.right {
|
||||
display: flex;
|
||||
flex-direction: row-reverse;
|
||||
align-items: center;
|
||||
|
||||
.per-page-feedback {
|
||||
margin-right: 1em;
|
||||
margin-left: 0;
|
||||
}
|
||||
}
|
||||
|
||||
.per-page-feedback {
|
||||
margin-left: 1em;
|
||||
}
|
||||
|
||||
@@ -11,14 +11,12 @@
|
||||
color: #575757;
|
||||
}
|
||||
|
||||
.ofn-drop-down {
|
||||
@mixin ofn-drop-down-style {
|
||||
padding: 7px 15px;
|
||||
border-radius: 3px;
|
||||
border: 1px solid #d4d4d4;
|
||||
background-color: #f5f5f5;
|
||||
position: relative;
|
||||
display: block;
|
||||
float: left;
|
||||
color: #828282;
|
||||
cursor: pointer;
|
||||
-moz-user-select: none;
|
||||
@@ -29,6 +27,47 @@
|
||||
text-align: center;
|
||||
margin-right: 10px;
|
||||
|
||||
&.disabled {
|
||||
opacity: 0.5;
|
||||
|
||||
&:hover {
|
||||
cursor: default;
|
||||
border-color: #d4d4d4;
|
||||
color: #828282;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.ofn-drop-down-with-prepend {
|
||||
display: flex;
|
||||
|
||||
&.right {
|
||||
float: right;
|
||||
|
||||
}
|
||||
|
||||
.ofn-drop-down {
|
||||
border-top-left-radius: 0;
|
||||
border-bottom-left-radius: 0;
|
||||
}
|
||||
|
||||
.ofn-drop-down-prepend {
|
||||
@include ofn-drop-down-style;
|
||||
|
||||
border-right: none;
|
||||
margin-left: 0;
|
||||
margin-right: 0;
|
||||
border-top-right-radius: 0;
|
||||
border-bottom-right-radius: 0;
|
||||
cursor: default;
|
||||
}
|
||||
}
|
||||
|
||||
.ofn-drop-down {
|
||||
@include ofn-drop-down-style;
|
||||
position: relative;
|
||||
float: left;
|
||||
|
||||
&.right {
|
||||
float: right;
|
||||
margin-right: 0px;
|
||||
|
||||
@@ -82,6 +82,12 @@ div#group_buy_calculation {
|
||||
}
|
||||
}
|
||||
|
||||
// Changing placeholder text colour
|
||||
.items-placeholder::placeholder {
|
||||
color: $white;
|
||||
opacity: 1;
|
||||
}
|
||||
|
||||
th.actions {
|
||||
white-space: nowrap;
|
||||
}
|
||||
@@ -90,6 +96,18 @@ table.index td.actions {
|
||||
text-align: left;
|
||||
}
|
||||
|
||||
table.edit-note-table {
|
||||
margin-top: -15px;
|
||||
|
||||
tr:first-child th, tr:first-child td {
|
||||
border-top: none;
|
||||
}
|
||||
|
||||
td.actions {
|
||||
width: 15%;
|
||||
}
|
||||
}
|
||||
|
||||
.index-controls {
|
||||
|
||||
button {
|
||||
|
||||
2
app/webpacker/images/social-logos/whatsapp.svg
Normal file
2
app/webpacker/images/social-logos/whatsapp.svg
Normal file
@@ -0,0 +1,2 @@
|
||||
<!--https://icon-sets.iconify.design/fa/whatsapp/-->
|
||||
<svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" role="img" width="0.96em" height="1em" preserveAspectRatio="xMidYMid meet" viewBox="0 0 1536 1600"><path fill="currentColor" d="M985 878q13 0 97.5 44t89.5 53q2 5 2 15q0 33-17 76q-16 39-71 65.5T984 1158q-57 0-190-62q-98-45-170-118T476 793q-72-107-71-194v-8q3-91 74-158q24-22 52-22q6 0 18 1.5t19 1.5q19 0 26.5 6.5T610 448q8 20 33 88t25 75q0 21-34.5 57.5T599 715q0 7 5 15q34 73 102 137q56 53 151 101q12 7 22 7q15 0 54-48.5t52-48.5zm-203 530q127 0 243.5-50t200.5-134t134-200.5t50-243.5t-50-243.5T1226 336t-200.5-134T782 152t-243.5 50T338 336T204 536.5T154 780q0 203 120 368l-79 233l242-77q158 104 345 104zm0-1382q153 0 292.5 60T1315 247t161 240.5t60 292.5t-60 292.5t-161 240.5t-240.5 161t-292.5 60q-195 0-365-94L0 1574l136-405Q28 991 28 780q0-153 60-292.5T249 247T489.5 86T782 26z"/></svg>
|
||||
|
After Width: | Height: | Size: 897 B |
@@ -1,6 +1,6 @@
|
||||
import { Application } from "stimulus"
|
||||
import { definitionsFromContext } from "stimulus/webpack-helpers"
|
||||
import { Application } from "stimulus";
|
||||
import { definitionsFromContext } from "stimulus/webpack-helpers";
|
||||
|
||||
const application = Application.start()
|
||||
const context = require.context("controllers", true, /.js$/)
|
||||
application.load(definitionsFromContext(context))
|
||||
const application = Application.start();
|
||||
const context = require.context("controllers", true, /.js$/);
|
||||
application.load(definitionsFromContext(context));
|
||||
|
||||
@@ -1,27 +1,24 @@
|
||||
/* eslint no-console:0 */
|
||||
|
||||
// StimulusJS
|
||||
import { Application } from "stimulus"
|
||||
import { definitionsFromContext } from "stimulus/webpack-helpers"
|
||||
import { Application } from "stimulus";
|
||||
import { definitionsFromContext } from "stimulus/webpack-helpers";
|
||||
|
||||
const application = Application.start()
|
||||
const context = require.context("controllers", true, /.js$/)
|
||||
application.load(definitionsFromContext(context))
|
||||
const application = Application.start();
|
||||
const context = require.context("controllers", true, /.js$/);
|
||||
application.load(definitionsFromContext(context));
|
||||
|
||||
import CableReady from "cable_ready"
|
||||
import mrujs from "mrujs"
|
||||
import { CableCar } from "mrujs/plugins"
|
||||
import * as Turbo from "@hotwired/turbo"
|
||||
import CableReady from "cable_ready";
|
||||
import mrujs from "mrujs";
|
||||
import { CableCar } from "mrujs/plugins";
|
||||
import * as Turbo from "@hotwired/turbo";
|
||||
|
||||
window.Turbo = Turbo
|
||||
window.CableReady = CableReady
|
||||
window.Turbo = Turbo;
|
||||
window.CableReady = CableReady;
|
||||
mrujs.start({
|
||||
plugins: [
|
||||
new CableCar(CableReady)
|
||||
]
|
||||
})
|
||||
|
||||
require.context('../fonts', true)
|
||||
const images = require.context('../images', true)
|
||||
const imagePath = (name) => images(name, true)
|
||||
plugins: [new CableCar(CableReady)],
|
||||
});
|
||||
|
||||
require.context("../fonts", true);
|
||||
const images = require.context("../images", true);
|
||||
const imagePath = (name) => images(name, true);
|
||||
|
||||
@@ -1,9 +1,5 @@
|
||||
#!/usr/bin/env ruby
|
||||
begin
|
||||
load File.expand_path('../spring', __FILE__)
|
||||
rescue LoadError => e
|
||||
raise unless e.message.include?('spring')
|
||||
end
|
||||
load File.expand_path("spring", __dir__)
|
||||
APP_PATH = File.expand_path('../config/application', __dir__)
|
||||
require_relative '../config/boot'
|
||||
require 'rails/commands'
|
||||
|
||||
6
bin/rake
6
bin/rake
@@ -1,9 +1,5 @@
|
||||
#!/usr/bin/env ruby
|
||||
begin
|
||||
load File.expand_path('../spring', __FILE__)
|
||||
rescue LoadError => e
|
||||
raise unless e.message.include?('spring')
|
||||
end
|
||||
load File.expand_path("spring", __dir__)
|
||||
require_relative '../config/boot'
|
||||
require 'rake'
|
||||
Rake.application.run
|
||||
|
||||
@@ -1,8 +1,4 @@
|
||||
#!/usr/bin/env ruby
|
||||
begin
|
||||
load File.expand_path('../spring', __FILE__)
|
||||
rescue LoadError => e
|
||||
raise unless e.message.include?('spring')
|
||||
end
|
||||
load File.expand_path("spring", __dir__)
|
||||
require 'bundler/setup'
|
||||
load Gem.bin_path('rspec-core', 'rspec')
|
||||
|
||||
15
bin/spring
15
bin/spring
@@ -1,17 +1,14 @@
|
||||
#!/usr/bin/env ruby
|
||||
|
||||
# This file loads Spring without using Bundler, in order to be fast.
|
||||
# This file loads Spring without using loading other gems in the Gemfile, in order to be fast.
|
||||
# It gets overwritten when you run the `spring binstub` command.
|
||||
|
||||
unless defined?(Spring)
|
||||
require 'rubygems'
|
||||
require 'bundler'
|
||||
if !defined?(Spring) && [nil, "development", "test"].include?(ENV["RAILS_ENV"])
|
||||
require "bundler"
|
||||
|
||||
lockfile = Bundler::LockfileParser.new(Bundler.default_lockfile.read)
|
||||
spring = lockfile.specs.detect { |spec| spec.name == 'spring' }
|
||||
if spring
|
||||
Bundler.locked_gems.specs.find { |spec| spec.name == "spring" }&.tap do |spring|
|
||||
Gem.use_paths Gem.dir, Bundler.bundle_path.to_s, *Gem.path
|
||||
gem 'spring', spring.version
|
||||
require 'spring/binstub'
|
||||
gem "spring", spring.version
|
||||
require "spring/binstub"
|
||||
end
|
||||
end
|
||||
|
||||
@@ -226,6 +226,7 @@ module Openfoodnetwork
|
||||
config.active_record.belongs_to_required_by_default = false
|
||||
config.active_record.cache_versioning = false
|
||||
config.active_record.has_many_inversing = false
|
||||
config.active_record.yaml_column_permitted_classes = [BigDecimal, Symbol]
|
||||
|
||||
config.active_support.escape_html_entities_in_json = true
|
||||
|
||||
@@ -240,5 +241,7 @@ module Openfoodnetwork
|
||||
Rails.autoloaders.main.ignore(Rails.root.join('app/webpacker'))
|
||||
|
||||
config.active_storage.service = ENV["S3_BUCKET"].present? ? :amazon : :local
|
||||
config.active_storage.content_types_to_serve_as_binary -= ["image/svg+xml"]
|
||||
config.active_storage.variable_content_types += ["image/svg+xml"]
|
||||
end
|
||||
end
|
||||
|
||||
@@ -528,8 +528,6 @@ ar:
|
||||
guest_label: "الخروج كضيف"
|
||||
credit_owed: "الائتمان مدين"
|
||||
balance_due: "الرصيد المستحق"
|
||||
destroy:
|
||||
has_associated_orders: "فشل الحذف: قام العميل بربط الطلبات مع متجره"
|
||||
contents:
|
||||
edit:
|
||||
title: المحتوى
|
||||
@@ -1132,6 +1130,7 @@ ar:
|
||||
customer_instructions_placeholder: الاستلام او ملاحظات التسليم
|
||||
products: منتجات
|
||||
fees: رسوم
|
||||
tags: الاوسمة
|
||||
destroy_errors:
|
||||
orders_present: تم تحديد دورة الطلب هذه من قبل العميل ولا يمكن حذفها. لمنع العملاء من الوصول إليه ، يرجى إغلاقه.
|
||||
schedule_present: دورة الطلب هذه مرتبطة بجدول زمني ولا يمكن حذفها. يرجى إلغاء ربط أو حذف الجدول الأول.
|
||||
@@ -1141,6 +1140,8 @@ ar:
|
||||
msg: ترتبط دورة الطلب هذه بأوامر الاشتراك المفتوحة %{n}. لن يؤثر تغيير هذا التاريخ الآن على أي طلبات تم تقديمها بالفعل ، ولكن يجب تجنبها إن أمكن. هل انت متأكد انك تريد المتابعة؟
|
||||
cancel: إلغاء
|
||||
proceed: تقدم
|
||||
status:
|
||||
closed: مغلق
|
||||
producer_properties:
|
||||
index:
|
||||
title: خصائص المنتج
|
||||
@@ -3773,7 +3774,6 @@ ar:
|
||||
paypal:
|
||||
no_payment_via_admin_backend: لا يمكن التقاط مدفوعات Paypal في Backoffice
|
||||
products:
|
||||
image_upload_error: "لم يتم التعرف على صورة المنتج. يرجى تحميل صورة بتنسيق PNG أو JPG."
|
||||
new:
|
||||
title: "منتج جديد"
|
||||
new_product: "منتج جديد"
|
||||
@@ -4069,7 +4069,8 @@ ar:
|
||||
items: المواد
|
||||
total: المجموع
|
||||
paid?: دفع؟
|
||||
view: عرض
|
||||
status: الحالة
|
||||
cancelled: ألغيت
|
||||
saved_cards:
|
||||
default?: الإفتراضي؟
|
||||
delete?: حذف؟
|
||||
|
||||
@@ -508,8 +508,6 @@ ca:
|
||||
guest_label: "Fer comanda com a convidat"
|
||||
credit_owed: "Crèdit a deure"
|
||||
balance_due: "A pagar"
|
||||
destroy:
|
||||
has_associated_orders: "S'ha produït un error en suprimir: la consumidora té comandes associades amb la seva botiga"
|
||||
contents:
|
||||
edit:
|
||||
title: Contingut
|
||||
@@ -1096,6 +1094,7 @@ ca:
|
||||
customer_instructions_placeholder: Notes de recollida o de lliurament
|
||||
products: Productes
|
||||
fees: Comissions
|
||||
tags: Etiquetes
|
||||
destroy_errors:
|
||||
orders_present: Una consumidora ha seleccionat aquest Cicle de Comanda i no es pot esborrar. Per evitar que les consumidores hi accedeixin, tanqueu-lo.
|
||||
schedule_present: Aquest cicle de comanda està vinculat a una programació i no es pot esborrar. Desenllaça o suprimeix primer la programació.
|
||||
@@ -1105,6 +1104,8 @@ ca:
|
||||
msg: Aquest cicle de comanda està enllaçat amb %{n} comandes de subscripció obertes . Si canvieu aquesta data ara això no afectarà comandes que ja s'hagin realitzat però cal evitar-ho si és possible. Esteu segur que voleu continuar?
|
||||
cancel: Cancel·lar
|
||||
proceed: Procedeix
|
||||
status:
|
||||
closed: tancat
|
||||
producer_properties:
|
||||
index:
|
||||
title: Propietats de la productora
|
||||
@@ -3581,7 +3582,6 @@ ca:
|
||||
paypal:
|
||||
no_payment_via_admin_backend: Els pagaments amb Paypal no es poden marcar com pagats des de l'administració
|
||||
products:
|
||||
image_upload_error: "No s'ha reconegut la imatge del producte. Carregueu una imatge en format PNG o JPG."
|
||||
new:
|
||||
title: "Nou producte"
|
||||
new_product: "Nou producte"
|
||||
@@ -3876,7 +3876,8 @@ ca:
|
||||
items: Articles
|
||||
total: Total
|
||||
paid?: Pagat?
|
||||
view: Veure
|
||||
status: Estat
|
||||
cancelled: Cancel·lada
|
||||
saved_cards:
|
||||
default?: Per defecte?
|
||||
delete?: Suprimeix?
|
||||
|
||||
@@ -182,6 +182,7 @@ cy:
|
||||
signed_up_but_unconfirmed: "Anfonwyd neges gyda dolen gadarnhau i'ch cyfeiriad e-bost. Agorwch y ddolen i actifadu eich cyfrif."
|
||||
unknown_error: "Aeth rhywbeth o'i le wrth greu eich cyfrif. Gwiriwch eich cyfeiriad e-bost a rhoi cynnig arall arni."
|
||||
failure:
|
||||
disabled: "Analluogwyd eich cyfrif. Anfonwch ebost at: support@openfoodnetwork.org.uk i ddatrys y broblem hon."
|
||||
invalid: |
|
||||
Ebost neu gyfrinair annilys.
|
||||
Wnaethoch chi archebu fel gwestai'r tro diwethaf? Hwyrach bod angen ichi greu cyfrif, neu ailosod eich cyfrinair.
|
||||
@@ -502,6 +503,7 @@ cy:
|
||||
enable_invoices?: "Galluogi Anfonebau?"
|
||||
invoice_style2?: "Defnyddiwch y model anfoneb amgen sy'n cynnwys dadansoddiad treth cyfan fesul cyfradd a gwybodaeth cyfradd dreth fesul eitem (ddim yn addas eto ar gyfer gwledydd sy'n arddangos prisiau ac eithrio treth)"
|
||||
enable_receipt_printing?: "Dangos opsiynau ar gyfer argraffu derbynebau gan ddefnyddio argraffwyr thermol yn nhrefn y cwymplen?"
|
||||
enterprise_number_required_on_invoices?: "Angen rhif y cwmni i greu anfoneb?"
|
||||
stripe_connect_settings:
|
||||
edit:
|
||||
title: "Cyswllt Stripe"
|
||||
@@ -549,8 +551,6 @@ cy:
|
||||
guest_label: "Talu fel gwestai"
|
||||
credit_owed: "Credyd yn ddyledus"
|
||||
balance_due: "Balans sy'n ddyledus"
|
||||
destroy:
|
||||
has_associated_orders: "Wedi methu ei ddileu: mae gan y cwsmer archebion cysylltiedig gyda'i siop"
|
||||
contents:
|
||||
edit:
|
||||
title: Cynnwys
|
||||
@@ -778,6 +778,9 @@ cy:
|
||||
variants_without_unit_value: "RHYBUDD: Nid oes gwerth uned i rai amrywolion"
|
||||
all: "I gyd"
|
||||
select_variant: "Dewiswch amrywiolyn"
|
||||
note:
|
||||
note_label: "Noder:"
|
||||
no_note_present: "Ni ddarparwyd nodyn."
|
||||
enterprise:
|
||||
select_outgoing_oc_products_from: Dewiswch gynnyrch OC sy'n mynd allan o
|
||||
enterprises:
|
||||
@@ -826,6 +829,9 @@ cy:
|
||||
email_address_tip: "Dangosir y cyfeiriad e-bost hwn yn eich proffil cyhoeddus"
|
||||
phone: Ffôn
|
||||
phone_placeholder: e.e. 98 7654 3210
|
||||
whatsapp_phone: Rhif ffôn WhatsApp
|
||||
whatsapp_phone_placeholder: eg. +44 7545 123123
|
||||
whatsapp_phone_tip: "Caiff y rhif ei arddangos ar eich proffil cyhoeddus i’w agor fel dolen WhatsApp."
|
||||
website: Gwefan
|
||||
website_placeholder: ee. www.truffles.co.uk
|
||||
enterprise_fees:
|
||||
@@ -1159,6 +1165,7 @@ cy:
|
||||
customer_instructions_placeholder: Nodiadau casglu neu ddosbarthu
|
||||
products: Cynnyrch
|
||||
fees: Ffioedd
|
||||
tags: Tagiau
|
||||
destroy_errors:
|
||||
orders_present: Dewiswyd y cylch archebu hwnnw gan gwsmer ac ni ellir ei ddileu. Er mwyn atal cwsmeriaid rhag cael mynediad iddo, dylid ei gau yn lle.
|
||||
schedule_present: Mae'r cylch archebu hwnnw'n gysylltiedig ag amserlen ac ni ellir ei ddileu. Datgysylltwch neu dilëwch yr amserlen yn gyntaf.
|
||||
@@ -1168,6 +1175,11 @@ cy:
|
||||
msg: Mae'r cylch archebu hwn wedi'i gysylltu ag archebion tanysgrifio agored %{n}. Ni fydd newid y dyddiad hwn nawr yn effeithio ar unrhyw archebion a wnaethpwyd eisoes, ond dylid osgoi hyn os yn bosibl. Ydych chi'n siŵr eich bod chi am symud ymlaen?
|
||||
cancel: Canslo
|
||||
proceed: Ewch ymlaen
|
||||
status:
|
||||
undated: dim dyddiad
|
||||
upcoming: i ddod
|
||||
open: agor
|
||||
closed: ar gau
|
||||
producer_properties:
|
||||
index:
|
||||
title: Manylion Cynhyrchwyr
|
||||
@@ -1195,6 +1207,7 @@ cy:
|
||||
unitsize: MAINT UNEDAU
|
||||
total: CYFANSWM
|
||||
total_items: CYFANSWM EITEMAU
|
||||
total_by_customer: Cyfanswm fesul Cwsmer
|
||||
total_by_supplier: Cyfanswm fesul Cyflenwr
|
||||
supplier_totals: Cyfanswm Cylch Archebu Cyflenwyr
|
||||
supplier_totals_by_distributor: Cyfanswm Cylch Archebu Cyflenwyr fesul Dosbarthwr
|
||||
@@ -1803,6 +1816,7 @@ cy:
|
||||
order_hub_info: Gwybodaeth Hwb
|
||||
order_back_to_store: Yn ôl i'r siop
|
||||
order_back_to_cart: Yn ôl i'r basged
|
||||
order_back_to_website: Yn ôl i’r Wefan
|
||||
bom_tip: "Defnyddiwch y dudalen hon i newid nifer cynnyrch ar draws sawl archeb. Gellir hefyd dileu cynnyrch o archebion yn gyfan gwbl, pe dymunir."
|
||||
unsaved_changes_warning: "Mae newidiadau heb eu cadw yn bodoli a byddant yn cael eu colli os byddwch yn parhau."
|
||||
unsaved_changes_error: "Mae'r meysydd â ffiniau coch yn cynnwys gwallau."
|
||||
@@ -2198,7 +2212,10 @@ cy:
|
||||
contact_field_placeholder: "Enw Cyswllt"
|
||||
contact_field_required: "Mae angen i chi nodi prif gyswllt."
|
||||
phone_field: "Rhif ffôn"
|
||||
whatsapp_phone_field: "Rhif ffôn WhatsApp"
|
||||
whatsapp_phone_tooltip: "Caiff y rhif ei arddangos ar eich proffil cyhoeddus i’w agor fel dolen WhatsApp."
|
||||
phone_field_placeholder: "e.e. 07123123123"
|
||||
whatsapp_phone_field_placeholder: "eg. +44 7545 123123"
|
||||
type:
|
||||
title: "Math"
|
||||
headline: "Y cam olaf i ychwanegu %{enterprise}!"
|
||||
@@ -3659,6 +3676,9 @@ cy:
|
||||
from: "O"
|
||||
to: "Bil i"
|
||||
shipping: "Yn anfon"
|
||||
note:
|
||||
note_label: "Noder:"
|
||||
no_note_present: "Ni ddarparwyd nodyn."
|
||||
form:
|
||||
distribution_fields:
|
||||
title: "Dosbarthiad"
|
||||
@@ -3781,7 +3801,6 @@ cy:
|
||||
paypal:
|
||||
no_payment_via_admin_backend: Ni ellir cipio taliadau Paypal yn y Swyddfa Gefn
|
||||
products:
|
||||
image_upload_error: "Nid oedd yn bosib adnabod delwedd y cynnyrch. Lanlwythwch ddelwedd mewn fformat PNG neu JPG."
|
||||
new:
|
||||
title: "Cynnyrch Newydd"
|
||||
new_product: "Cynnyrch Newydd"
|
||||
@@ -3844,6 +3863,7 @@ cy:
|
||||
back_to_users_list: "Yn ôl i'r Rhestr Defnyddwyr"
|
||||
general_settings: "Gosodiadau Cyffredinol"
|
||||
form:
|
||||
disabled: "Analluogwyd?"
|
||||
email: "E-bost"
|
||||
roles: "Rolau"
|
||||
enterprise_limit: "Uchafswm Mentrau"
|
||||
@@ -4077,7 +4097,8 @@ cy:
|
||||
items: Eitemau
|
||||
total: Cyfanswm
|
||||
paid?: Talwyd?
|
||||
view: Gweld
|
||||
status: Statws
|
||||
cancelled: Canslwyd
|
||||
saved_cards:
|
||||
default?: Yn ddiofyn?
|
||||
delete?: Dileu?
|
||||
|
||||
@@ -35,7 +35,7 @@ de_CH:
|
||||
verification_value: "Kartenprüfnummer (3-stellig)"
|
||||
year: "Jahr"
|
||||
order_cycle:
|
||||
orders_close_at: Schließzeitpunkt
|
||||
orders_close_at: Schliesszeitpunkt
|
||||
variant_override:
|
||||
count_on_hand: "Verfügbar"
|
||||
errors:
|
||||
@@ -64,15 +64,15 @@ de_CH:
|
||||
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"
|
||||
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ößer oder gleich %{width} x %{height} Pixel sein"
|
||||
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öß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_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"
|
||||
@@ -108,7 +108,7 @@ de_CH:
|
||||
fraudulent: "Die Zahlung wurde abgelehnt, da Stripe sie als potenziell betrügerisch einstuft."
|
||||
generic_decline: "Die Karte wurde aus unbekanntem Grund abgelehnt."
|
||||
incorrect_pin: "Die eingegebene PIN ist falsch. Dieser Ablehnungscode gilt nur für Zahlungen mit einem Kartenlesegerät."
|
||||
insufficient_funds: "Die Karte ist nicht ausreichend gedeckt, um den Kaufvorgang abzuschließen."
|
||||
insufficient_funds: "Die Karte ist nicht ausreichend gedeckt, um den Kaufvorgang abzuschliessen."
|
||||
invalid_account: "Die Karte oder das dazugehörige Konto sind ungültig."
|
||||
invalid_amount: "Der Zahlungsbetrag ist ungültig oder überschreitet den zulässigen Betrag."
|
||||
invalid_pin: "Die eingegebene PIN ist falsch. Dieser Ablehnungscode gilt nur für Zahlungen mit einem Kartenlesegerät."
|
||||
@@ -245,7 +245,7 @@ de_CH:
|
||||
email_welcome: "Willkommen"
|
||||
email_registered: "ist jetzt Teil des"
|
||||
email_userguide_html: "Das Benutzerhandbuch mit detaillierter Unterstützung für die Einrichtung Ihres Profils, Produzentenladens oder Hubs finden Sie hier: %{link}"
|
||||
userguide: "Open Food Network Benutzerhandbuch"
|
||||
userguide: "Open Food Schweiz Benutzerhandbuch"
|
||||
email_admin_html: "Sie können Ihr Konto verwalten, indem Sie direkt den Link %{link} verwenden oder indem Sie sich auf der Startseite einloggen und im Menü \"Verwaltung\" auswählen."
|
||||
admin_panel: "Verwaltung"
|
||||
email_community_html: "Wir haben auch ein Online-Forum für Diskussionen innerhalb der Community zu den Themen Open Food Network Software, Herausforderungen eines Lebensmittelunternehmens und mehr. Reden Sie doch mit. Wir entwickeln uns ständig weiter und mit Ihrem Beitrag in diesem Forum bestimmen Sie mit, was als nächstes passiert. %{link}"
|
||||
@@ -301,11 +301,11 @@ de_CH:
|
||||
title: Andere Fehler (%{count} Bestellungen)
|
||||
explainer: Die automatische Verarbeitung dieser Bestellungen ist aus einem unbekannten Grund gescheitert. Dies sollte nicht geschehen, Bitte kontaktieren Sie uns, wenn Sie dies sehen.
|
||||
home: "OFN"
|
||||
title: "Open Food Network"
|
||||
title: "Open Food Schweiz"
|
||||
welcome_to: "Regionale Lebensmittel online bestellen im"
|
||||
site_meta_description: "Wir wagen den Neustart. Mit Bauern und Züchtern, die bereit sind, ihre Geschichten stolz und wahrhaftig zu erzählen. Mit Händlern, die bereit sind, Menschen fair und ehrlich mit Produkten zu verbinden. Mit Käufern, die glauben, dass ihr Einkaufsverhalten die Welt wirklich verändern kann."
|
||||
search_by_name: Suche nach Ort oder Name des Ladens/Produzents ...
|
||||
producers_join: 'Wir laden Produzenten ein, jetzt dem Open Food Network beizutreten. '
|
||||
producers_join: 'Wir laden Produzenten ein, jetzt dem Open Food Schweiz beizutreten. '
|
||||
charges_sales_tax: Berechnen Sie Steuern?
|
||||
business_address: "Unternehmensdaten"
|
||||
enterprise_permissions: "Berechtigungen"
|
||||
@@ -549,8 +549,6 @@ de_CH:
|
||||
guest_label: "Gasteinkauf"
|
||||
credit_owed: "Geschuldetes Guthaben"
|
||||
balance_due: "Offener Betrag"
|
||||
destroy:
|
||||
has_associated_orders: "Löschen fehlgeschlagen: Der Kunde hat Bestellungen bei diesem Laden."
|
||||
contents:
|
||||
edit:
|
||||
title: Inhalt
|
||||
@@ -560,7 +558,7 @@ de_CH:
|
||||
hub_signup_page: Registrierung für Läden
|
||||
group_signup_page: Registrierung für Gruppen
|
||||
main_links: Hauptmenü-Links
|
||||
footer_and_external_links: Fußzeile und externe Links
|
||||
footer_and_external_links: Fusszeile und externe Links
|
||||
your_content: Ihr Inhalt
|
||||
user_guide: Benutzerhandbuch
|
||||
map: Karte
|
||||
@@ -812,9 +810,9 @@ de_CH:
|
||||
disabled: Deaktiviert
|
||||
business_address:
|
||||
company_legal_name: Unternehmensname
|
||||
company_placeholder: z. B. Charlies großartige Farm
|
||||
address1: Straße + Hausnummer
|
||||
address1_placeholder: z. B. Gartenstraße 123
|
||||
company_placeholder: z. B. Charlies grossartige Farm
|
||||
address1: Strasse + Hausnummer
|
||||
address1_placeholder: z. B. Gartenstrasse 123
|
||||
address2: Adresszusatz (optional)
|
||||
legal_phone_number: Telefonnummer
|
||||
phone_placeholder: "z. B. +49 40 123 456"
|
||||
@@ -884,9 +882,9 @@ de_CH:
|
||||
permalink: Permalink (keine Leerzeichen)
|
||||
permalink_tip: "Dieser Permalink wird verwendet, um die URL zu Ihrem Laden zu erstellen: %{link}name-ihres-ladens/shop"
|
||||
link_to_front: Link zum Laden
|
||||
link_to_front_tip: Ein direkter Link zu Ihrem Laden im Open Food Network.
|
||||
link_to_front_tip: Ein direkter Link zu Ihrem Laden im Open Food Schweiz.
|
||||
ofn_uid: OFN UID
|
||||
ofn_uid_tip: Die eindeutige ID, mit der das Unternehmen im Open Food Network identifiziert wird.
|
||||
ofn_uid_tip: Die eindeutige ID, mit der das Unternehmen im Open Food Schweiz identifiziert wird.
|
||||
shipping_methods:
|
||||
name: "Name der Lieferoption"
|
||||
applies: "Aktiv?"
|
||||
@@ -909,7 +907,7 @@ de_CH:
|
||||
allow_order_changes_false: "Kunden können Bestellungen nicht ändern oder stornieren "
|
||||
allow_order_changes_true: "Kunden können Bestellungen ändern oder stornieren, solange der Bestellzyklus geöffnet ist"
|
||||
enable_subscriptions: "Abonnements"
|
||||
enable_subscriptions_tip: "Aktivieren Sie Abonnements, um Kunden eine automatische, regelmäßige Bestellung Ihrer Produkte einzurichten. Dies kann z. B. das Abonnement einer wöchentlichen Gemüsekiste sein."
|
||||
enable_subscriptions_tip: "Aktivieren Sie Abonnements, um Kunden eine automatische, regelmässige Bestellung Ihrer Produkte einzurichten. Dies kann z. B. das Abonnement einer wöchentlichen Gemüsekiste sein."
|
||||
enable_subscriptions_false: "deaktiviert"
|
||||
enable_subscriptions_true: "aktiviert"
|
||||
customer_names_in_reports: "Kundennamen in Berichten anzeigen"
|
||||
@@ -918,7 +916,7 @@ de_CH:
|
||||
customer_names_true: "aktiviert"
|
||||
shopfront_message: "'Willkommen'-Nachricht im Laden"
|
||||
shopfront_message_placeholder: >
|
||||
Eine optionale Nachricht, um Kunden willkommen zu heißen und zu erklären,
|
||||
Eine optionale Nachricht, um Kunden willkommen zu heissen und zu erklären,
|
||||
wie sie bei Ihnen einkaufen können. Wenn hier Text eingegeben wird,
|
||||
wird dieser auf einer Startseite in Ihrem Laden angezeigt, wenn Kunden
|
||||
ihn zum ersten Mal besuchen.
|
||||
@@ -933,7 +931,7 @@ de_CH:
|
||||
shopfront_category_ordering: "Sortierung der Produktkategorien im Laden"
|
||||
shopfront_category_ordering_note: "(von oben nach unten)"
|
||||
open_date: "Öffnungszeitpunkt"
|
||||
close_date: "Schließzeitpunkt"
|
||||
close_date: "Schliesszeitpunkt"
|
||||
display_ordering_in_shopfront: "Reihenfolge der Anzeige im Online-Shop:"
|
||||
shopfront_sort_by_category: "Nach Kategorie"
|
||||
shopfront_sort_by_producer: "Nach Produzent"
|
||||
@@ -950,14 +948,14 @@ de_CH:
|
||||
linkedin_placeholder: "z. B. www.linkedin.com/in/IhrName"
|
||||
stripe_connect:
|
||||
connect_with_stripe: "Stripe integrieren"
|
||||
stripe_connect_intro: "Um Zahlungen mit Kreditkarte zu akzeptieren, müssen Sie Ihr Stripe-Konto mit dem Open Food Network verbinden. Verwenden Sie die Schaltfläche rechts, um loszulegen."
|
||||
stripe_connect_intro: "Um Zahlungen mit Kreditkarte zu akzeptieren, müssen Sie Ihr Stripe-Konto mit dem Open Food Schweiz verbinden. Verwenden Sie die Schaltfläche rechts, um loszulegen."
|
||||
stripe_account_connected: "Stripe-Konto verbunden."
|
||||
disconnect: "Stripe-Konto trennen"
|
||||
confirm_modal:
|
||||
title: Stripe integrieren
|
||||
part1: Stripe ist ein Zahlungsdienst, der es Läden im Open Food Network ermöglicht, Kreditkartenzahlungen von Kunden entgegenzunehmen.
|
||||
part2: Um diese Funktion zu verwenden, müssen Sie Ihr Stripe-Konto mit dem Open Food Network verbinden. Klicken Sie "Zustimmen", um auf die Stripe-Website weitergeleitet zu werden, wo Sie ein bestehendes Stripe-Konto verbinden oder ein neues erstellen können.
|
||||
part3: Dadurch kann das Open Food Network Kreditkartenzahlungen von Kunden in Ihrem Namen akzeptieren. Bitte beachten Sie, dass Sie ein eigenes Stripe-Konto benötigen, die entstehenden Stripe-Gebühren bezahlen und etwaige Rückbuchungen und Kundenservices selbst vornehmen müssen.
|
||||
part3: Dadurch kann das Open Food Schweiz Kreditkartenzahlungen von Kunden in Ihrem Namen akzeptieren. Bitte beachten Sie, dass Sie ein eigenes Stripe-Konto benötigen, die entstehenden Stripe-Gebühren bezahlen und etwaige Rückbuchungen und Kundenservices selbst vornehmen müssen.
|
||||
i_agree: Zustimmen
|
||||
cancel: Abbrechen
|
||||
tag_rules:
|
||||
@@ -1008,20 +1006,20 @@ de_CH:
|
||||
producer_profile: Profil
|
||||
connect_ofn: Stellen Sie sich und Ihre Produkte vor
|
||||
always_free: IMMER KOSTENLOS
|
||||
producer_description_text: "Stellen Sie sich und Ihre Produkte im Open Food Network vor und vernetzen Sie sich mit anderen Produzenten und Läden. \nFügen Sie dem Profil Ihre Produkte hinzu, damit andere Läden sie zum Verkauf anbieten können. Wenn Sie Ihre Produkte selbst verkaufen möchten, wählen Sie \"Produzentenladen\"."
|
||||
producer_description_text: "Stellen Sie sich und Ihre Produkte im Open Food Schweiz vor und vernetzen Sie sich mit anderen Produzenten und Läden. \nFügen Sie dem Profil Ihre Produkte hinzu, damit andere Läden sie zum Verkauf anbieten können. Wenn Sie Ihre Produkte selbst verkaufen möchten, wählen Sie \"Produzentenladen\"."
|
||||
producer_shop: Produzentenladen
|
||||
sell_your_produce: Verkaufen Sie Ihre eigenen Produkte
|
||||
producer_shop_description_text: Verkaufen Sie Ihre eigenen Produkte direkt an Ihre Kunden durch Ihren eigenen Produzentenladen im Open Food Network.
|
||||
producer_shop_description_text: Verkaufen Sie Ihre eigenen Produkte direkt an Ihre Kunden durch Ihren eigenen Produzentenladen im Open Food Schweiz.
|
||||
producer_shop_description_text2: Ein Produzentenladen ist nur für Ihre eigenen Produkte bestimmt. Wenn Sie Produkte anderer verkaufen möchten, wählen Sie "Hub".
|
||||
producer_hub: Hub
|
||||
producer_hub_text: Verkaufen Sie eigene Produkte und Produkte anderer
|
||||
producer_hub_description_text: Verkaufen Sie eigene Produkte und Produkte anderer Produzenten oder Läden im Open Food Network. Mit Ihrem Laden sind Sie ein zentraler Bestandteil Ihres lokalen Lebensmittelsystems.
|
||||
producer_hub_description_text: Verkaufen Sie eigene Produkte und Produkte anderer Produzenten oder Läden im Open Food Schweiz. Mit Ihrem Laden sind Sie ein zentraler Bestandteil Ihres lokalen Lebensmittelsystems.
|
||||
profile: Profil
|
||||
get_listing: Erstellen Sie ein Profil
|
||||
profile_description_text: Stellen Sie sich im Open Food Network vor und vernetzen Sie sich mit anderen Produzenten und Läden. Sie können im Open Food Network gefunden und kontaktiert werden. Ihr Unternehmen wird auf der Karte und in Suchergebnissen angezeigt.
|
||||
profile_description_text: Stellen Sie sich im Open Food Schweiz vor und vernetzen Sie sich mit anderen Produzenten und Läden. Sie können im Open Food Schweiz gefunden und kontaktiert werden. Ihr Unternehmen wird auf der Karte und in Suchergebnissen angezeigt.
|
||||
hub_shop: Hub
|
||||
hub_shop_text: Verkaufen Sie Produkte anderer
|
||||
hub_shop_description_text: Verkaufen Sie Produkte anderer Produzenten oder Läden im Open Food Network. Sie führen die Produkte zusammen und sind mit Ihrem Laden ein zentraler Bestandteil Ihres lokalen Lebensmittelsystems.
|
||||
hub_shop_description_text: Verkaufen Sie Produkte anderer Produzenten oder Läden im Open Food Schweiz. Sie führen die Produkte zusammen und sind mit Ihrem Laden ein zentraler Bestandteil Ihres lokalen Lebensmittelsystems.
|
||||
choose_option: Bitte wählen Sie eine der oben aufgeführten Optionen.
|
||||
change_now: Jetzt ändern
|
||||
enterprise_user_index:
|
||||
@@ -1045,7 +1043,7 @@ de_CH:
|
||||
title: Neues Unternehmen
|
||||
back_link: Zurück zur Unternehmensliste
|
||||
welcome:
|
||||
welcome_title: Willkommen im Open Food Network!
|
||||
welcome_title: Willkommen im Open Food Schweiz!
|
||||
welcome_text: 'Erfolgreich erstellt:'
|
||||
next_step: Nächster Schritt
|
||||
choose_starting_point: 'Wählen Sie Ihr Paket:'
|
||||
@@ -1113,7 +1111,7 @@ de_CH:
|
||||
add_distributor: 'Verteilstelle hinzufügen'
|
||||
advanced_settings:
|
||||
automatic_notifications: Automatische Benachrichtigungen
|
||||
automatic_notifications_tip: Benachrichtigen Sie die Produzenten automatisch per E-Mail über in diesem Bestellzyklus erhaltene Bestellungen, wenn der Bestellzyklus schließt.
|
||||
automatic_notifications_tip: Benachrichtigen Sie die Produzenten automatisch per E-Mail über in diesem Bestellzyklus erhaltene Bestellungen, wenn der Bestellzyklus schliesst.
|
||||
title: Erweiterte Einstellungen
|
||||
choose_product_tip: Sie können die eingehenden und ausgehenden Produkte auf den Katalog nur von %{inventory} beschränken.
|
||||
preferred_product_selection_from_coordinator_inventory_only_here: Nur vom Katalog des Koordinators
|
||||
@@ -1144,12 +1142,12 @@ de_CH:
|
||||
schedule: Zeitplan
|
||||
schedules: Zeitpläne
|
||||
new_schedule: Neuer Zeitplan
|
||||
new_schedule_tooltip: Regelmäßigkeit, mit der ein Abonnement ausgeführt wird (z. B. wöchentlich, monatlich).
|
||||
new_schedule_tooltip: Regelmässigkeit, mit der ein Abonnement ausgeführt wird (z. B. wöchentlich, monatlich).
|
||||
name_and_timing_form:
|
||||
name: Name des Bestellzyklus
|
||||
orders_open: Bestellzyklus öffnet
|
||||
coordinator: Koordinator
|
||||
orders_close: Bestellzyklus schließt
|
||||
orders_close: Bestellzyklus schliesst
|
||||
row:
|
||||
suppliers: Lieferanten
|
||||
distributors: Verteilstellen
|
||||
@@ -1161,8 +1159,9 @@ de_CH:
|
||||
customer_instructions_placeholder: Abhol-/Lieferinformationen
|
||||
products: Produkte
|
||||
fees: Gebühren
|
||||
tags: Stichwörter
|
||||
destroy_errors:
|
||||
orders_present: Dieser Bestellzyklus wurde von einem Kunden ausgewählt und kann nicht gelöscht werden. Um weitere Verwendung zu verhindern, können Sie ihn stattdessen schließen.
|
||||
orders_present: Dieser Bestellzyklus wurde von einem Kunden ausgewählt und kann nicht gelöscht werden. Um weitere Verwendung zu verhindern, können Sie ihn stattdessen schliessen.
|
||||
schedule_present: Dieser Bestellzyklus ist mit einem Zeitplan verknüpft und kann nicht gelöscht werden. Bitte heben Sie zuerst die Verknüpfung auf oder löschen Sie den Zeitplan.
|
||||
bulk_update:
|
||||
no_data: Hm, etwas ist schief gelaufen. Keine Bestellzyklusdaten gefunden.
|
||||
@@ -1170,6 +1169,8 @@ de_CH:
|
||||
msg: Dieser Bestellzyklus enthält %{n} offene Abonnementbestellungen. Das Ändern des Datums wird bereits erteilte Bestellungen nicht beeinträchtigen, sollte wenn möglich aber vermieden werden. Sind Sie sicher, dass Sie fortfahren wollen?
|
||||
cancel: Abbrechen
|
||||
proceed: Fortfahren
|
||||
status:
|
||||
closed: geschlossen
|
||||
producer_properties:
|
||||
index:
|
||||
title: Produzenteneigenschaften
|
||||
@@ -1416,7 +1417,7 @@ de_CH:
|
||||
shared:
|
||||
mailers:
|
||||
powered_by:
|
||||
open_food_network: "Open Food Network"
|
||||
open_food_network: "Open Food Schweiz"
|
||||
powered_html: "Ermöglicht durch das %{open_food_network}."
|
||||
menu:
|
||||
cart:
|
||||
@@ -1426,7 +1427,7 @@ de_CH:
|
||||
edit_cart: "Warenkorb bearbeiten"
|
||||
items_in_cart_singular: "%{num} Artikel in Ihrem Warenkorb"
|
||||
items_in_cart_plural: "%{num} Artikel in Ihrem Warenkorb"
|
||||
close: "Schließen"
|
||||
close: "Schliessen"
|
||||
cart_empty: "Ihr Warenkorb ist leer."
|
||||
take_me_shopping: "Jetzt einkaufen!"
|
||||
signed_in:
|
||||
@@ -1434,20 +1435,20 @@ de_CH:
|
||||
mobile_menu:
|
||||
cart: "Warenkorb/Kasse"
|
||||
register_call:
|
||||
selling_on_ofn: "Sie möchten selbst im Open Food Network verkaufen?"
|
||||
selling_on_ofn: "Sie möchten selbst im Open Food Schweiz verkaufen?"
|
||||
register: "Hier registrieren!"
|
||||
footer:
|
||||
footer_secure: "Sicher und vertrauenswürdig."
|
||||
footer_secure_text: "Open Food Network verwendet überall SSL-Verschlüsselung (2048 Bit RSA), um Ihre Einkaufs- und Zahlungsinformationen geheim zu halten. Unsere Server speichern Ihre Kreditkartendetails nicht und Zahlungen werden von PCI-konformen Dienstleistern verarbeitet."
|
||||
footer_secure_text: "Open Food Schweiz verwendet überall SSL-Verschlüsselung (2048 Bit RSA), um Ihre Einkaufs- und Zahlungsinformationen geheim zu halten. Unsere Server speichern Ihre Kreditkartendetails nicht und Zahlungen werden von PCI-konformen Dienstleistern verarbeitet."
|
||||
footer_contact_headline: "Kontakt und mehr ..."
|
||||
footer_contact_email: "Schreiben Sie uns eine E-Mail!"
|
||||
footer_nav_headline: "Regional Einkaufen"
|
||||
footer_join_headline: "Eigene Produkte verkaufen"
|
||||
footer_join_body: "Erstellen Sie ein Profil, einen Online-Shop oder eine Gruppe im Open Food Network."
|
||||
footer_join_body: "Erstellen Sie ein Profil, einen Online-Shop oder eine Gruppe im Open Food Schweiz."
|
||||
footer_join_cta: "Los geht's!"
|
||||
footer_legal_call: "Lesen Sie unsere"
|
||||
footer_legal_visit: "Besuchen Sie uns auf"
|
||||
footer_legal_text_html: "Open Food Network ist eine kostenlose Open-Source Software-Plattform. Unser Inhalt ist mit %{content_license} und unser Code mit %{code_license} lizenziert."
|
||||
footer_legal_text_html: "Open Food Schweiz ist eine kostenlose Open-Source Software-Plattform. Unser Inhalt ist mit %{content_license} und unser Code mit %{code_license} lizenziert."
|
||||
footer_data_text_with_privacy_policy_html: "Wir passen auf Ihre Daten auf. Lesen Sie unsere %{privacy_policy} und %{cookies_policy}."
|
||||
footer_data_text_without_privacy_policy_html: "Wir passen auf Ihre Daten auf. Lesen Sie unsere %{cookies_policy}."
|
||||
footer_data_privacy_policy: "Datenschutz-Bestimmungen"
|
||||
@@ -1502,11 +1503,11 @@ de_CH:
|
||||
menu_4_title: "Gruppen"
|
||||
menu_4_url: "/groups"
|
||||
menu_5_title: "Verkaufen"
|
||||
menu_5_url: "https://openfoodnetwork.de/sell"
|
||||
menu_5_url: "https://openfoodschweiz.ch/"
|
||||
menu_6_title: "Über OFN"
|
||||
menu_6_url: "https://wp.openfoodnetwork.de/"
|
||||
menu_6_url: "https://wp.openfoodschweiz.ch"
|
||||
menu_7_title: "Hilfe"
|
||||
menu_7_url: "https://wp.openfoodnetwork.de/support/"
|
||||
menu_7_url: "https://wp.openfoodschweiz.ch"
|
||||
logo: "Logo (640x130)"
|
||||
logo_mobile: "Mobile Logo (75x26)"
|
||||
logo_mobile_svg: "Mobile Logo (SVG)"
|
||||
@@ -1530,7 +1531,7 @@ de_CH:
|
||||
phone: Telefonnummer
|
||||
next: Weiter
|
||||
address: Adresse
|
||||
address_placeholder: z. B. Gartenstraße 123
|
||||
address_placeholder: z. B. Gartenstrasse 123
|
||||
address2: Adresszusatz (optional)
|
||||
city: Ort
|
||||
city_placeholder: z. B. Nordwestheim
|
||||
@@ -1600,11 +1601,11 @@ de_CH:
|
||||
card_could_not_be_removed: Die Kreditkarte konnte nicht entfernt werden.
|
||||
invalid_credit_card: "Ungültige Kreditkarte"
|
||||
ie_warning_headline: "Ihr Browser ist veraltet. :-("
|
||||
ie_warning_text: "Für das beste Open-Food-Network-Erlebnis empfehlen wir dringend, Ihren Browser zu aktualisieren:"
|
||||
ie_warning_text: "Für das beste Open-Food-Schweiz-Erlebnis empfehlen wir dringend, Ihren Browser zu aktualisieren:"
|
||||
ie_warning_chrome: Chrome herunterladen
|
||||
ie_warning_firefox: Firefox herunterladen
|
||||
ie_warning_ie: Internet Explorer aktualisieren
|
||||
ie_warning_other: "Können Sie Ihren Browser nicht aktualisieren? Versuchen Sie Open Food Network auf Ihrem Smartphone! :-)"
|
||||
ie_warning_other: "Können Sie Ihren Browser nicht aktualisieren? Versuchen Sie Open Food Schweiz auf Ihrem Smartphone! :-)"
|
||||
legal:
|
||||
cookies_policy:
|
||||
header: "Wie wir Cookies verwenden"
|
||||
@@ -1626,14 +1627,14 @@ de_CH:
|
||||
statistics_cookies_matomo_optout: "Möchten Sie Matomo Analytics deaktivieren? Wir sammeln keine persönlichen Daten und Matomo hilft uns, unseren Service zu verbessern, aber wir respektieren Ihre Wahl. :-)"
|
||||
cookie_matomo_basics_desc: "Matomo First Party Cookies zum Sammeln von Statistiken."
|
||||
cookie_matomo_heatmap_desc: "Matomo Heatmap & Session Aufnahme-Cookie."
|
||||
cookie_matomo_ignore_desc: "Cookie, um Benutzer von der Verfolgung im Internet auszuschließen."
|
||||
cookie_matomo_ignore_desc: "Cookie, um Benutzer von der Verfolgung im Internet auszuschliessen."
|
||||
disabling_cookies_header: "Warnung zum Deaktivieren von Cookies"
|
||||
disabling_cookies_desc: "Als Nutzer können Sie Cookies von Open Food Network oder einer anderen Website immer zulassen, blockieren oder löschen, indem Sie die Einstellungen Ihres Browsers nutzen. Dies funktioniert in jedem Browser anders. Schauen Sie unter folgenden Links nach für genauere Beschreibungen:"
|
||||
disabling_cookies_desc: "Als Nutzer können Sie Cookies von Open Food Schweiz oder einer anderen Website immer zulassen, blockieren oder löschen, indem Sie die Einstellungen Ihres Browsers nutzen. Dies funktioniert in jedem Browser anders. Schauen Sie unter folgenden Links nach für genauere Beschreibungen:"
|
||||
disabling_cookies_firefox_link: "https://support.mozilla.org/de/kb/verbesserter-schutz-aktivitatenverfolgung-desktop"
|
||||
disabling_cookies_chrome_link: "https://support.google.com/chrome/answer/95647"
|
||||
disabling_cookies_ie_link: "https://support.microsoft.com/de-de/topic/l%C3%B6schen-und-verwalten-von-cookies-168dab11-0753-043d-7c16-ede5947fc64d"
|
||||
disabling_cookies_safari_link: "https://www.apple.com/de/legal/privacy/de-ww/cookies/"
|
||||
disabling_cookies_note: "Beachten Sie jedoch, dass die Website nicht funktioniert, wenn Sie die essentiellen Cookies, die von Open Food Network verwendet werden, löschen oder ändern. Sie können also nichts zum Warenkorb hinzufügen und auch nicht zur Kasse gehen."
|
||||
disabling_cookies_note: "Beachten Sie jedoch, dass die Website nicht funktioniert, wenn Sie die essentiellen Cookies, die von Open Food Schweiz verwendet werden, löschen oder ändern. Sie können also nichts zum Warenkorb hinzufügen und auch nicht zur Kasse gehen."
|
||||
cookies_banner:
|
||||
cookies_usage: "Diese Website verwendet Cookies, um Ihr Kauferlebnis reibungslos und sicher zu gestalten und um darüber hinaus zu verstehen, wie Sie die Website verwenden, um die von uns angebotenen Funktionen zu verbessern."
|
||||
cookies_definition: "Cookies sind sehr kleine Textdateien, die beim Besuch einiger Websites auf Ihrem Computer gespeichert werden."
|
||||
@@ -1645,16 +1646,16 @@ de_CH:
|
||||
brandstory_headline: "Regionale Lebensmittel direkt online kaufen"
|
||||
brandstory_intro: "Produkte von Produzenten vor Ort finden, online bestellen und abholen oder liefern lassen.\nWerden Sie Teil einer Bewegung, die mit jedem Einkauf ein Zeichen setzt für hochwertige regionale Produkte, faire Preise, Nachhaltigkeit und Transparenz. Helfen Sie uns bei ..."
|
||||
brandstory_part1: "... einem Neuanfang. Nehmen Sie Anonymität und Ausbeutung von Mensch, Tier und Umwelt in der Lebensmittelindustrie nicht länger hin. Lesen Sie die Geschichten stolzer Landwirte, Gemüsegärtner und Züchter hinter den Produkten. Sehen Sie sich an, welche Aufschläge Händler berechnen um faire Preise zu erhalten und zu zahlen. Lernen Sie die Menschen kennen, die mit ihrer täglichen Arbeit Ihre regionalen und saisonalen Lebensmittel herstellen."
|
||||
brandstory_part2: "Kaufen Sie ein in Hofläden, auf Bauernmärkten, in Food-Hubs oder schließen Sie sich zu Einkaufsgemeinschaften, Kooperativen, Genossenschaften oder einer solidarischen Landwirtschaft zusammen."
|
||||
brandstory_part2: "Kaufen Sie ein in Hofläden, auf Bauernmärkten, in Food-Hubs oder schliessen Sie sich zu Einkaufsgemeinschaften, Kooperativen, Genossenschaften oder einer solidarischen Landwirtschaft zusammen."
|
||||
brandstory_part3: "Die Anbieter bilden gemeinsam ein regionales Netzwerk, in dem sich Käufer und Verkäufer wieder kennen und mit Vertrauen wertschätzend umgegangen wird."
|
||||
brandstory_part4: "Der Programmcode dieser Internet-Plattform ist öffentlich frei verfügbar (Open Source), sie gehört also auch Ihnen und ist unverkäuflich. Alle Einnahmen werden wieder in die Weiterentwicklung des Netzwerks investiert!"
|
||||
brandstory_part5_strong: "Das ist das Open Food Network."
|
||||
brandstory_part5_strong: "Das ist das Open Food Schweiz."
|
||||
brandstory_part6: "Sie lieben Ihr Essen! Jetzt können Sie auch Ihr regionales Lebensmittelsystem lieben!"
|
||||
system_headline: "So einfach regional einkaufen:"
|
||||
system_step1: "1. Wo kann ich regionale und saisonale Produkte kaufen?"
|
||||
system_step1_text: "Auf der Seite \"Einkaufen\" finden Sie die Liste der Läden in Ihrer Nähe. Sie können nach einem Ort suchen oder die Liste nach Kategorien, Lieferoptionen oder Produkteigenschaften filtern. Klicken Sie auf den Namen eines Ladens, um dort einzukaufen.\nAlternativ verwenden Sie die Seite \"Karte\" und finden Sie Produzenten und Läden in Ihrer Region."
|
||||
system_step2: "2. Welche regionalen Lebensmittel kann ich online kaufen?"
|
||||
system_step2_text: "Im Online-Shop des Ladens finden Sie ein großes Sortiment regionaler und saisonaler Produkte. Von Obst und Gemüse über Eier, Milch, Käse, Wurst und Fleisch bis hin zu Backwaren, Süßigkeiten und Fertiggerichten werden Sie fündig. Nutzen Sie die Suche oder die Filter nach Kategorien und Eigenschaften, wie bio, unverpackt oder fair gehandelt."
|
||||
system_step2_text: "Im Online-Shop des Ladens finden Sie ein grosses Sortiment regionaler und saisonaler Produkte. Von Obst und Gemüse über Eier, Milch, Käse, Wurst und Fleisch bis hin zu Backwaren, Süssigkeiten und Fertiggerichten werden Sie fündig. Nutzen Sie die Suche oder die Filter nach Kategorien und Eigenschaften, wie bio, unverpackt oder fair gehandelt."
|
||||
system_step3: "3. Wie kommen regionale Lebensmittel zu mir nach Hause?"
|
||||
system_step3_text: "Jeder Laden kann seine Lieferoptionen selbst festlegen. Viele bieten einen Lieferservice an, oft ist auch die Abholung vor Ort oder an einer Abholstation möglich. Wählen Sie die gewünschte Option einfach beim Abschluss der Bestellung aus. Im Open Food Network kennt man sich - auch das Vereinbaren eines Ablageortes lässt sich sicher organisieren. "
|
||||
cta_headline: "Machen Sie die Welt mit Ihrem Einkauf ein kleines bisschen besser."
|
||||
@@ -1714,8 +1715,8 @@ de_CH:
|
||||
title: Rechnungsadresse
|
||||
address:
|
||||
address1:
|
||||
label: Straße + Hausnummer
|
||||
placeholder: z. B. Gartenstraße 123
|
||||
label: Strasse + Hausnummer
|
||||
placeholder: z. B. Gartenstrasse 123
|
||||
address2:
|
||||
label: Adresszusatz (optional)
|
||||
placeholder: z. B. c/o Familie Müller
|
||||
@@ -1824,13 +1825,13 @@ de_CH:
|
||||
email_confirmation_notice_unexpected: "Sie haben diese Nachricht erhalten, weil Sie sich im Open Food Network angemeldet haben oder von einer Person dazu eingeladen wurden. Wenn Sie nicht verstehen, warum Sie diese E-Mail erhalten, schreiben Sie bitte an %{contact}."
|
||||
email_social: "Verbinden Sie sich mit uns:"
|
||||
email_contact: "Schreiben Sie uns eine E-Mail:"
|
||||
email_signoff: "Viele Grüße,"
|
||||
email_signoff: "Viele Grüsse,"
|
||||
email_signature: "das Team des Open Food Network"
|
||||
email_confirm_customer_greeting: "Hallo %{name},"
|
||||
email_confirm_customer_intro_html: "vielen Dank für Ihren Einkauf bei <strong>%{distributor}</strong>!"
|
||||
email_confirm_customer_number_html: "<strong>Bestellbestätigung #%{number}</strong>"
|
||||
email_confirm_customer_details_html: "Nachfolgend finden Sie Ihre <strong>Bestelldaten</strong> bei <strong>%{distributor}</strong>:"
|
||||
email_confirm_customer_signoff: "Viele Grüße,"
|
||||
email_confirm_customer_signoff: "Viele Grüsse,"
|
||||
email_confirm_shop_greeting: "Hallo %{name},"
|
||||
email_confirm_shop_order_html: "gut gemacht! <strong>%{distributor}</strong> hat eine neue Bestellung erhalten!"
|
||||
email_confirm_shop_number_html: "<strong>Bestellbestätigung #%{number}</strong>"
|
||||
@@ -1851,7 +1852,7 @@ de_CH:
|
||||
email_so_placement_changes: "Leider waren nicht alle von Ihnen bestellten Produkte verfügbar. Die von Ihnen gewünschten Originalmengen sind unten durchgestrichen."
|
||||
email_so_payment_success_intro_html: "Es wurde eine automatische Zahlung für Ihre Bestellung bei <strong>%{distributor}</strong> vorgenommen."
|
||||
email_so_placement_explainer_html: "Diese Bestellung wurde automatisch für Sie erstellt."
|
||||
email_so_edit_true_html: "Sie können <a href='%{order_url}'>Änderungen vornehmen</a>, bis Bestellungen am %{orders_close_at} schließen."
|
||||
email_so_edit_true_html: "Sie können <a href='%{order_url}'>Änderungen vornehmen</a>, bis Bestellungen am %{orders_close_at} schliessen."
|
||||
email_so_edit_false_html: "Sie können jederzeit <a href='%{order_url}'>Details zu dieser Bestellung anzeigen</a>."
|
||||
email_so_contact_distributor_html: "Wenn Sie Fragen haben, können Sie sich mit <strong>%{distributor}</strong> über %{email} in Verbindung setzen."
|
||||
email_so_contact_distributor_to_change_order_html: "Diese Bestellung wurde automatisch für Sie erstellt. Sie können Änderungen vornehmen, bis die Bestellungen am %{orders_close_at} geschlossen werden, indem Sie <strong>%{distributor}</strong> über %{email} kontaktieren."
|
||||
@@ -1875,7 +1876,7 @@ de_CH:
|
||||
email_signup_welcome: "Willkommen im Open Food Network!"
|
||||
email_signup_confirmed_email: "Vielen Dank für die Bestätigung Ihrer E-Mail-Adresse."
|
||||
email_signup_shop_html: "Sie können sich jetzt unter %{link} einloggen."
|
||||
email_signup_text: "Danke, dass Sie dem Netzwerk beigetreten sind. Wenn Sie ein Kunde sind, freuen wir uns, Ihnen viele fantastische Landwirte, wunderbare Läden und leckeres Essen vorzustellen! Wenn Sie ein Produzent oder ein Lebensmittelunternehmer sind, freuen wir uns, Sie als Teil des Netzwerks zu begrüßen."
|
||||
email_signup_text: "Danke, dass Sie dem Netzwerk beigetreten sind. Wenn Sie ein Kunde sind, freuen wir uns, Ihnen viele fantastische Landwirte, wunderbare Läden und leckeres Essen vorzustellen! Wenn Sie ein Produzent oder ein Lebensmittelunternehmer sind, freuen wir uns, Sie als Teil des Netzwerks zu begrüssen."
|
||||
email_signup_help_html: "Wir freuen uns über Ihre Fragen und Rückmeldungen. Schreiben Sie uns gerne eine E-Mail an %{email}."
|
||||
invite_email:
|
||||
greeting: "Hallo!"
|
||||
@@ -1887,7 +1888,7 @@ de_CH:
|
||||
producer_mail_text_before: "wir informieren über den Stand des Bestellzyklus, bereit am:"
|
||||
producer_mail_order_text: "Nachfolgend finden Sie eine Zusammenfassung der Bestellungen Ihrer Produkte:"
|
||||
producer_mail_delivery_instructions: "Informationen zur Abholung/Lieferung:"
|
||||
producer_mail_signoff: "Viele Grüße,"
|
||||
producer_mail_signoff: "Viele Grüsse,"
|
||||
producer_mail_order_customer_text: "Nachfolgend finden Sie eine Zusammenfassung der Bestellungen, gruppiert nach Kunden:"
|
||||
shopping_oc_closed: Bestellzyklen sind derzeit geschlossen!
|
||||
shopping_oc_closed_description: "Bitte warten Sie, bis der nächste Bestellzyklus öffnet (oder kontaktieren Sie uns direkt, um zu erfahren, ob wir verspätete Bestellungen annehmen können)."
|
||||
@@ -1960,7 +1961,7 @@ de_CH:
|
||||
products_no_results_html: "Leider wurden keine Ergebnisse gefunden für %{query}"
|
||||
products_clear_search: "Suche zurücksetzen"
|
||||
search_no_results_html: "Es wurden leider keine Ergebnisse für %{query} gefunden."
|
||||
components_profiles_popover: "Profile haben keinen eigenen Laden im Open Food Network, verkaufen ihre Produkte aber möglicherweise online oder offline über andere Läden."
|
||||
components_profiles_popover: "Profile haben keinen eigenen Laden im Open Food Schweiz, verkaufen ihre Produkte aber möglicherweise online oder offline über andere Läden."
|
||||
components_profiles_show: "Profile anzeigen"
|
||||
components_filters_nofilters: "Keine Filter"
|
||||
components_filters_clearfilters: "Filter zurücksetzen"
|
||||
@@ -1978,16 +1979,16 @@ de_CH:
|
||||
groups_contact_email: Schreiben Sie uns eine E-Mail
|
||||
groups_contact_website: Besuchen Sie unsere Homepage
|
||||
groups_contact_facebook: Folgen Sie uns auf Facebook
|
||||
groups_signup_title: Schließen Sie sich mit anderen Produzenten und Läden zu einer Gruppe zusammen
|
||||
groups_signup_title: Schliessen Sie sich mit anderen Produzenten und Läden zu einer Gruppe zusammen
|
||||
groups_signup_headline: Registrierung einer Gruppe
|
||||
groups_signup_intro: "Wir sind eine großartige Plattform für kollaboratives Marketing - der einfachste Weg für die Mitglieder Ihrer Gruppe neue Märkte zu erreichen. Wir sind gemeinnützig, erschwinglich und transparent."
|
||||
groups_signup_intro: "Wir sind eine grossartige Plattform für kollaboratives Marketing - der einfachste Weg für die Mitglieder Ihrer Gruppe neue Märkte zu erreichen. Wir sind gemeinnützig, erschwinglich und transparent."
|
||||
groups_signup_email: Schreiben Sie uns eine E-Mail
|
||||
groups_signup_motivation1: Wir verändern Lebensmittelsysteme fair.
|
||||
groups_signup_motivation2: Deshalb sind wir jeden Tag aufgestanden. Wir sind eine globale Non-Profit-Organisation, die auf Open-Source-Code basiert. Wir spielen fair. Sie können uns immer vertrauen.
|
||||
groups_signup_motivation3: Wir wissen, dass Sie große Ideen haben und wir helfen wollen. Wir teilen unser Wissen, Netzwerke und Ressourcen. Wir wissen, dass Isolation keine Veränderung verursacht, also werden wir mit Ihnen zusammenarbeiten.
|
||||
groups_signup_motivation3: Wir wissen, dass Sie grosse Ideen haben und wir helfen wollen. Wir teilen unser Wissen, Netzwerke und Ressourcen. Wir wissen, dass Isolation keine Veränderung verursacht, also werden wir mit Ihnen zusammenarbeiten.
|
||||
groups_signup_motivation4: Wir treffen Sie, wo Sie sind.
|
||||
groups_signup_motivation5: Sie könnten ein Zusammenschluss von Hubs, Produzenten oder Verteilstellen sein, eine Industrieorganisation oder eine Lokalbehörde.
|
||||
groups_signup_motivation6: Was auch immer Ihre Rolle in Ihrer lokalen Nahrungsmittelbewegung ist, wir sind bereit zu helfen. Wie auch immer Sie sich fragen, wie Open Food Network in Ihrem Teil der Welt aussehen würde oder wird, lassen Sie uns das Gespräch beginnen.
|
||||
groups_signup_motivation6: Was auch immer Ihre Rolle in Ihrer lokalen Nahrungsmittelbewegung ist, wir sind bereit zu helfen. Wie auch immer Sie sich fragen, wie Open Food Schweiz in Ihrem Teil der Welt aussehen würde oder wird, lassen Sie uns das Gespräch beginnen.
|
||||
groups_signup_motivation7: Wir unterstützen Initiative dabei, den Trend zur Regionalität und Nachhaltigkeit zu stärken.
|
||||
groups_signup_motivation8: Sie müssen Ihre Netzwerke aktivieren und aktivieren, wir bieten eine Plattform für Konversation und Aktion. Sie brauchen echtes Engagement. Wir helfen, alle Akteure, alle Beteiligten, alle Sektoren zu erreichen.
|
||||
groups_signup_motivation9: Sie benötigen Ressourcen. Wir bringen all unsere Erfahrung ein. Sie brauchen Kooperation. Wir verbinden Sie besser mit einem globalen Netzwerk von Peers.
|
||||
@@ -2027,7 +2028,7 @@ de_CH:
|
||||
name_or_sku: "NAME ODER ARTIKELNUMMER"
|
||||
register_title: Registrierung
|
||||
sell_title: "Registrieren"
|
||||
sell_headline: "Werden Sie Teil des Open Food Network!"
|
||||
sell_headline: "Werden Sie Teil des Open Food Schweiz!"
|
||||
sell_motivation: "Stellen Sie Ihre tollen Produkte vor."
|
||||
sell_producers: "Produzenten"
|
||||
sell_hubs: "Hubs"
|
||||
@@ -2049,7 +2050,7 @@ de_CH:
|
||||
shops_signup_pricing: Unternehmenskonten
|
||||
shops_signup_stories: Geschichten unserer Hubs
|
||||
shops_signup_help: Wir sind bereit zu helfen.
|
||||
shops_signup_help_text: Du brauchst eine bessere Rendite. Sie brauchen neue Käufer und Logistikpartner. Sie müssen Ihre Geschichte über den Großhandel, den Einzelhandel und den Küchentisch erzählen.
|
||||
shops_signup_help_text: Du brauchst eine bessere Rendite. Sie brauchen neue Käufer und Logistikpartner. Sie müssen Ihre Geschichte über den Grosshandel, den Einzelhandel und den Küchentisch erzählen.
|
||||
shops_signup_detail: Weitere Details folgen.
|
||||
orders: "Bestellungen"
|
||||
orders_fees: "Gebühren ..."
|
||||
@@ -2089,11 +2090,11 @@ de_CH:
|
||||
products_cart_distributor_choice: "Verteilstelle Ihrer Bestellung:"
|
||||
products_cart_distributor_change: "Die Verteilstelle für diese Bestellung wird in %{name} geändert, wenn Sie dieses Produkt zu Ihrem Warenkorb hinzufügen."
|
||||
products_cart_distributor_is: "Die Verteilstelle dieser Bestellung ist %{name}."
|
||||
products_distributor_error: "Bitte schließen Sie Ihre Bestellung bei %{link} ab, bevor Sie bei einem anderen Laden einkaufen."
|
||||
products_distributor_error: "Bitte schliessen Sie Ihre Bestellung bei %{link} ab, bevor Sie bei einem anderen Laden einkaufen."
|
||||
products_oc: "Bestellzyklus Ihrer Bestellung:"
|
||||
products_oc_change: "Der Bestellzyklus für diese Bestellung wird in %{name} geändert, wenn Sie dieses Produkt zu Ihrem Warenkorb hinzufügen."
|
||||
products_oc_is: "Der Bestellzyklus dieser Bestellung lautet %{name}."
|
||||
products_oc_error: "Bitte schließen Sie Ihre Bestellung bei %{link} ab, bevor Sie in einem anderen Bestellzyklus einkaufen."
|
||||
products_oc_error: "Bitte schliessen Sie Ihre Bestellung bei %{link} ab, bevor Sie in einem anderen Bestellzyklus einkaufen."
|
||||
products_oc_current: "Ihr aktueller Bestellzyklus"
|
||||
products_max_quantity: Max Menge
|
||||
products_distributor: Verteilstelle
|
||||
@@ -2102,7 +2103,7 @@ de_CH:
|
||||
remember_me: Eingeloggt bleiben
|
||||
are_you_sure: "Sind Sie sicher?"
|
||||
orders_open: "Geöffnet"
|
||||
closing: "Schließt"
|
||||
closing: "Schliesst"
|
||||
going_back_to_home_page: "Weiterleitung zur Startseite"
|
||||
creating: Erstellung
|
||||
updating: Aktualisierung
|
||||
@@ -2110,7 +2111,7 @@ de_CH:
|
||||
failed_to_create_enterprise_unknown: "Fehler beim Erstellen Ihres Unternehmens.\nBitte vergewissern Sie sich, dass alle Felder vollständig ausgefüllt sind."
|
||||
failed_to_update_enterprise_unknown: "Fehler beim Aktualisieren Ihres Unternehmens.\nBitte vergewissern Sie sich, dass alle Felder vollständig ausgefüllt sind."
|
||||
enterprise_confirm_delete_message: "Dadurch wird auch das von diesem Unternehmen bereitgestellte %{product} gelöscht. Sind Sie sicher, dass Sie das möchten?"
|
||||
order_not_saved_yet: "Ihre Bestellung wurde noch nicht gespeichert. Geben Sie uns ein paar Sekunden, um dies abzuschließen!"
|
||||
order_not_saved_yet: "Ihre Bestellung wurde noch nicht gespeichert. Geben Sie uns ein paar Sekunden, um dies abzuschliessen!"
|
||||
filter_by: "Filtern nach"
|
||||
hide_filters: "Filter ausblenden"
|
||||
one_filter_applied: "1 Filter angewendet"
|
||||
@@ -2163,9 +2164,9 @@ de_CH:
|
||||
registration_promo_image: "Hintergrundbild für Ihr Profil (empfohlen)"
|
||||
registration_about_us: "\"Über uns\" Text (empfohlen)"
|
||||
registration_outcome_headline: "Was bekomme ich?"
|
||||
registration_outcome1_html: "Ihr Profil hilft dabei, Sie im Open Food Network zu <strong>finden</strong> und zu <strong>kontaktieren</strong>."
|
||||
registration_outcome1_html: "Ihr Profil hilft dabei, Sie im Open Food Schweiz zu <strong>finden</strong> und zu <strong>kontaktieren</strong>."
|
||||
registration_outcome2: "Nutzen Sie Ihr Profil, um die Geschichte Ihres Unternehmens zu erzählen und verknüpfen Sie Ihren Social-Media- und Web-Auftritt."
|
||||
registration_outcome3: "Ihr Profil ist auch der erste Schritt, um im Open Food Network Produkte zu handeln oder einen Online-Shop zu eröffnen."
|
||||
registration_outcome3: "Ihr Profil ist auch der erste Schritt, um im Open Food Schweiz Produkte zu handeln oder einen Online-Shop zu eröffnen."
|
||||
registration_action: "Los geht's!"
|
||||
details:
|
||||
title: "Ihr Unternehmen"
|
||||
@@ -2174,11 +2175,11 @@ de_CH:
|
||||
producer: "Nennen Sie uns zunächst bitte den Namen und die Adresse Ihres Betriebs."
|
||||
enterprise_name_field: "Unternehmensname:"
|
||||
producer_name_field: "Name des Betriebs:"
|
||||
producer_name_field_placeholder: "z. B. Charlies großartige Farm"
|
||||
producer_name_field_placeholder: "z. B. Charlies grossartige Farm"
|
||||
producer_name_field_error: "Bitte wählen Sie einen eindeutigen Namen für Ihr Unternehmen."
|
||||
address1_field: "Straße + Hausnummer:"
|
||||
address1_field_placeholder: "z. B. Gartenstraße 123"
|
||||
address1_field_error: "Bitte geben Sie eine Straße und Hausnummer ein."
|
||||
address1_field: "Strasse + Hausnummer:"
|
||||
address1_field_placeholder: "z. B. Gartenstrasse 123"
|
||||
address1_field_error: "Bitte geben Sie eine Strasse und Hausnummer ein."
|
||||
address2_field: "Adresszusatz (optional):"
|
||||
suburb_field: "Ort:"
|
||||
suburb_field_placeholder: "z. B. Nordwestheim"
|
||||
@@ -2192,7 +2193,7 @@ de_CH:
|
||||
country_field_error: "Bitte wählen Sie das Land aus."
|
||||
map_location: "Position auf der Karte"
|
||||
locate_address: "Adresse auf der Karte zeigen"
|
||||
drag_pin: "Falls nötig, korrigieren Sie die Position Ihres Unternehmens, indem Sie die Markierung an den richtigen Ort ziehen. Bestätigen Sie dies anschließend durch das Setzen des Häkchens unter der Karte und klicken Sie dann ganz unten auf \"Weiter\"."
|
||||
drag_pin: "Falls nötig, korrigieren Sie die Position Ihres Unternehmens, indem Sie die Markierung an den richtigen Ort ziehen. Bestätigen Sie dies anschliessend durch das Setzen des Häkchens unter der Karte und klicken Sie dann ganz unten auf \"Weiter\"."
|
||||
confirm_address: "Ich bestätige, dass die auf der Karte angegebene Position des Unternehmens korrekt ist."
|
||||
drag_map_marker: "Die korrekte Position Ihres Unternehmens auf der Karte ist wichtig, damit Ihre Kunden Sie möglichst einfach finden können."
|
||||
contact:
|
||||
@@ -2211,13 +2212,13 @@ de_CH:
|
||||
no_producer: "Nein, es ist kein Produzent."
|
||||
producer_field_error: "Bitte wählen Sie: Ist das Unternehmen ein Produzent?"
|
||||
yes_producer_help: "Produzenten stellen leckere Lebensmittel oder Getränke her. Sie sind ein Produzent, wenn Sie anbauen, brauen, backen, fermentieren, melken oder sonst wie Lebenmittel produzieren."
|
||||
no_producer_help: "Wenn Sie kein Produzent sind, sind Sie wahrscheinlich jemand, der Lebensmittel verkauft und verteilt. Sie könnten ein Food Hub, eine Lebensmittelkooperative, eine Einkaufsgemeinschaft, ein Einzelhändler, Hofladen, Großhändler oder Vergleichbares sein."
|
||||
no_producer_help: "Wenn Sie kein Produzent sind, sind Sie wahrscheinlich jemand, der Lebensmittel verkauft und verteilt. Sie könnten ein Food Hub, eine Lebensmittelkooperative, eine Einkaufsgemeinschaft, ein Einzelhändler, Hofladen, Grosshändler oder Vergleichbares sein."
|
||||
create_profile: "Profil erstellen"
|
||||
about:
|
||||
title: "Über uns"
|
||||
headline: "Über uns"
|
||||
message: "Beschreiben Sie nun "
|
||||
success: "Sehr gut! %{enterprise} wurde dem Open Food Network hinzugefügt."
|
||||
success: "Sehr gut! %{enterprise} wurde dem Open Food Schweiz hinzugefügt."
|
||||
registration_exit_message: "Wenn Sie diesen Assistenten zu einem beliebigen Zeitpunkt beenden, können Sie mit der Erstellung Ihres Profils fortfahren, indem Sie sich einloggen und zum Menü \"Verwaltung\" wechseln."
|
||||
enterprise_description: "Kurzbeschreibung (empfohlen)"
|
||||
enterprise_description_placeholder: "Ein kurzer Satz, der Ihr Unternehmen beschreibt."
|
||||
@@ -2246,7 +2247,7 @@ de_CH:
|
||||
logo_placeholder: "Ihr Logo wird hier zur Überprüfung angezeigt, sobald es hochgeladen wurde."
|
||||
promo:
|
||||
select_promo_image: "Schritt 3: Laden Sie ein Hintergrundbild hoch (empfohlen)"
|
||||
promo_image_tip: "Tipp: Die als Banner dargestellte bevorzugte Größe beträgt 1200 × 260 Pixel."
|
||||
promo_image_tip: "Tipp: Die als Banner dargestellte bevorzugte Grösse beträgt 1200 × 260 Pixel."
|
||||
promo_image_label: "Bilddatei auswählen"
|
||||
promo_image_drag: "Ziehen Sie Ihr Bild hierher."
|
||||
review_promo_image: "Schritt 4: Überprüfen Sie Ihr Hintergrundbild"
|
||||
@@ -2257,7 +2258,7 @@ de_CH:
|
||||
enterprise_final_step: "Letzter Schritt!"
|
||||
enterprise_social_text: "Wie ist %{enterprise} im Internet erreichbar?"
|
||||
website: "Homepage (empfohlen)"
|
||||
website_placeholder: "z. B. openfoodnetwork.de"
|
||||
website_placeholder: "z. B. openfoodschweiz.ch"
|
||||
facebook: "Facebook (optional)"
|
||||
facebook_placeholder: "z. B. www.facebook.com/IhrNameHier"
|
||||
linkedin: "LinkedIn (optional)"
|
||||
@@ -2334,7 +2335,7 @@ de_CH:
|
||||
admin_enterprise_groups_data_powertip_promo_image: "Dieses Bild wird oben im Gruppenprofil angezeigt."
|
||||
admin_enterprise_groups_contact: "Kontakt"
|
||||
admin_enterprise_groups_contact_phone_placeholder: "z. B. +40 40 123456"
|
||||
admin_enterprise_groups_contact_address1_placeholder: "z. B. Gartenstraße 123"
|
||||
admin_enterprise_groups_contact_address1_placeholder: "z. B. Gartenstrasse 123"
|
||||
admin_enterprise_groups_contact_city: "Ort"
|
||||
admin_enterprise_groups_contact_city_placeholder: "z. B. Nordwestheim"
|
||||
admin_enterprise_groups_contact_zipcode: "Postleitzahl"
|
||||
@@ -2346,7 +2347,7 @@ de_CH:
|
||||
admin_enterprise_groups_web_website_placeholder: "z. B. www.truffles.com"
|
||||
admin_order_cycles: "Bestellzyklen verwalten"
|
||||
open: "Öffnet"
|
||||
close: "Schließen"
|
||||
close: "Schliessen"
|
||||
create: "Neu"
|
||||
search: "Suche"
|
||||
supplier: "Lieferant"
|
||||
@@ -2430,7 +2431,7 @@ de_CH:
|
||||
change_package: "Paket ändern"
|
||||
spree_admin_single_enterprise_hint: "Tipp: Damit andere Nutzer Sie finden können, aktivieren Sie Ihre Sichtbarkeit unter:"
|
||||
spree_admin_eg_pickup_from_school: "z. B. \"Abholung von der Grundschule\""
|
||||
spree_admin_eg_collect_your_order: "z. B. 'Bitte holen Sie Ihre Bestellung in der Gartenstraße 123 in 30701 Nordwestheim ab.'"
|
||||
spree_admin_eg_collect_your_order: "z. B. 'Bitte holen Sie Ihre Bestellung in der Gartenstrasse 123 in 30701 Nordwestheim ab.'"
|
||||
spree_classification_primary_taxon_error: "Kategorie %{taxon} ist die primäre Kategorie von %{product} und kann nicht gelöscht werden."
|
||||
spree_order_availability_error: "Verteilstelle oder Bestellzyklus kann die Produkte in Ihrem Warenkorb nicht liefern"
|
||||
spree_order_populator_error: "Diese Verteilstelle oder dieser Bestellzyklus kann nicht alle Produkte aus Ihrem Warenkorb liefern. Bitte ändern Sie Ihre Auswahl."
|
||||
@@ -2523,15 +2524,15 @@ de_CH:
|
||||
report_header_shipping: Lieferung
|
||||
report_header_shipping_method: Lieferoption
|
||||
report_header_shipping_instructions: Informationen zur Lieferung
|
||||
report_header_ship_street: Lieferstraße
|
||||
report_header_ship_street: Lieferstrasse
|
||||
report_header_ship_street_2: Lieferadresszusatz
|
||||
report_header_ship_city: Lieferstadt
|
||||
report_header_ship_postcode: Lieferpostleitzahl
|
||||
report_header_ship_state: Lieferbundesland
|
||||
report_header_billing_street: Rechnungsstraße
|
||||
report_header_billing_street: Rechnungsstrasse
|
||||
report_header_billing_street_2: Rechnungsadresszusatz
|
||||
report_header_billing_street_3: Rechnungsstraße 3
|
||||
report_header_billing_street_4: Rechnungsstraße 4
|
||||
report_header_billing_street_3: Rechnungsstrasse 3
|
||||
report_header_billing_street_4: Rechnungsstrasse 4
|
||||
report_header_billing_city: Rechnungsstadt
|
||||
report_header_billing_postcode: Rechnungspostleitzahl
|
||||
report_header_billing_state: Rechnungsbundesland
|
||||
@@ -2756,14 +2757,14 @@ de_CH:
|
||||
cart:
|
||||
add_to_cart_failed: >
|
||||
Beim Hinzufügen dieses Produkts zum Warenkorb ist ein Fehler aufgetreten.
|
||||
Möglicherweise ist es nicht mehr verfügbar oder der Laden schließt gerade.
|
||||
Möglicherweise ist es nicht mehr verfügbar oder der Laden schliesst gerade.
|
||||
admin:
|
||||
unit_price_tooltip: "Grundpreis: Er ermöglicht einen einfachen Preisvergleich von Produkten, unabhängig von Packungsgröße und -gewicht. Der im Online-Shop angezeigte Grundpreis kann ggf. aufgrund hinzukommender Gebühren abweichen."
|
||||
unit_price_tooltip: "Grundpreis: Er ermöglicht einen einfachen Preisvergleich von Produkten, unabhängig von Packungsgrösse und -gewicht. Der im Online-Shop angezeigte Grundpreis kann ggf. aufgrund hinzukommender Gebühren abweichen."
|
||||
enterprise_limit_reached: "Sie haben die maximale Anzahl der Unternehmen pro Konto erreicht. Schreiben Sie an %{contact_email}, wenn Sie das Limit erhöhen möchten."
|
||||
deleting_item_will_cancel_order: "Das Löschen dieses Produkts führt zu einer oder mehreren leeren Bestellungen, die daher automatisch storniert werden. Möchten Sie fortfahren?"
|
||||
modals:
|
||||
got_it: "Verstanden"
|
||||
close: "Schließen"
|
||||
close: "Schliessen"
|
||||
continue: "Weiter"
|
||||
invite: "Einladen"
|
||||
invite_title: "Geben Sie die E-Mail-Adresse eines nicht registrierten Benutzers ein, um dieses Unternehmen zu verwalten."
|
||||
@@ -2776,7 +2777,7 @@ de_CH:
|
||||
Produkte und Bestellzyklen sein.
|
||||
by_default_rules: "'Standardregeln'"
|
||||
by_default_rules_text: >
|
||||
Mit 'Standardregeln' können Sie Elemente verbergen, so dass sie standardmäßig
|
||||
Mit 'Standardregeln' können Sie Elemente verbergen, so dass sie standardmässig
|
||||
nicht sichtbar sind. Durch die Verwendung von 'Regeln für Kunden mit
|
||||
Stichwort', können diese Elemente für bestimmte Kunden wieder angezeigt
|
||||
werden.
|
||||
@@ -2787,7 +2788,7 @@ de_CH:
|
||||
überschreiben und Elemente für bestimmte Kunden wieder anzeigen.
|
||||
terms_and_conditions_info:
|
||||
title: "Allgemeine Geschäftsbedingungen hochladen"
|
||||
message_1: "Allgemeine Geschäftsbedingungen sind der Vertrag zwischen Ihnen (dem Verkäufer) und dem Käufer. Wenn Sie hier eine Datei hochladen, müssen Käufer Ihren Allgemeinen Geschäftsbedingungen zustimmen, um die Kaufabwicklung abzuschließen. Für den Käufer wird dies als Kontrollkästchen an der Kasse angezeigt, das aktiviert werden muss, um mit der Bezahlung fortzufahren. Wir empfehlen Ihnen dringend, Allgemeine Geschäftsbedingungen in Übereinstimmung mit den nationalen Gesetzen hochzuladen."
|
||||
message_1: "Allgemeine Geschäftsbedingungen sind der Vertrag zwischen Ihnen (dem Verkäufer) und dem Käufer. Wenn Sie hier eine Datei hochladen, müssen Käufer Ihren Allgemeinen Geschäftsbedingungen zustimmen, um die Kaufabwicklung abzuschliessen. Für den Käufer wird dies als Kontrollkästchen an der Kasse angezeigt, das aktiviert werden muss, um mit der Bezahlung fortzufahren. Wir empfehlen Ihnen dringend, Allgemeine Geschäftsbedingungen in Übereinstimmung mit den nationalen Gesetzen hochzuladen."
|
||||
message_2: "Käufer müssen den Allgemeinen Geschäftsbedingungen nur einmal zustimmen. Wenn Sie jedoch Ihre Allgemeinen Geschäftsbedingungen ändern, müssen Käufer diesen erneut zustimmen, bevor sie zur Kasse gehen können."
|
||||
terms_and_conditions_warning:
|
||||
title: "Allgemeine Geschäftsbedingungen hochladen"
|
||||
@@ -2803,16 +2804,16 @@ de_CH:
|
||||
hub_profile: Profil
|
||||
hub_profile_cost: "IMMER KOSTENLOS"
|
||||
hub_profile_text1: >
|
||||
Stellen Sie sich im Open Food Network vor und vernetzen Sie sich mit
|
||||
anderen Produzenten und Läden. Sie können im Open Food Network gefunden
|
||||
Stellen Sie sich im Open Food Schweiz vor und vernetzen Sie sich mit
|
||||
anderen Produzenten und Läden. Sie können im Open Food Schweiz gefunden
|
||||
und kontaktiert werden. Ihr Unternehmen wird auf der Karte und in Suchergebnissen
|
||||
angezeigt.
|
||||
hub_profile_text2: >
|
||||
Ein Profil zu haben und Verbindungen innerhalb Ihres lokalen Lebensmittelsystems
|
||||
über das Open Food Network zu pflegen, wird immer kostenlos sein.
|
||||
über das Open Food Schweiz zu pflegen, wird immer kostenlos sein.
|
||||
hub_shop: Hub
|
||||
hub_shop_text1: >
|
||||
Verkaufen Sie Produkte anderer Produzenten oder Läden im Open Food Network.
|
||||
Verkaufen Sie Produkte anderer Produzenten oder Läden im Open Food Schweiz.
|
||||
Sie führen die Produkte zusammen und sind mit Ihrem Laden ein zentraler
|
||||
Bestandteil Ihres lokalen Lebensmittelsystems.
|
||||
hub_shop_text2: >
|
||||
@@ -2836,30 +2837,30 @@ de_CH:
|
||||
profile_only_text2: >
|
||||
Wenn Sie sich lieber auf die Lebensmittelerzeugung konzentrieren und
|
||||
den Verkauf anderen überlassen möchten, benötigen Sie keinen eigenen
|
||||
Laden im Open Food Network. Fügen Sie Ihre Produkte dem Profil hinzu,
|
||||
Laden im Open Food Schweiz. Fügen Sie Ihre Produkte dem Profil hinzu,
|
||||
damit andere Läden sie zum Verkauf anbieten können.
|
||||
profile_only_text3: >
|
||||
Wenn Sie Ihre Produkte selbst verkaufen möchten, wählen Sie "Produzentenladen".
|
||||
|
||||
Ein Profil zu haben und Verbindungen innerhalb Ihres lokalen Lebensmittelsystems
|
||||
über das Open Food Network zu pflegen, wird immer kostenlos sein.
|
||||
über das Open Food Schweiz zu pflegen, wird immer kostenlos sein.
|
||||
producer_shop: Produzentenladen
|
||||
producer_shop_text1: >
|
||||
Verkaufen Sie Ihre eigenen Produkte direkt an Ihre Kunden durch Ihren
|
||||
eigenen Produzentenladen im Open Food Network.
|
||||
eigenen Produzentenladen im Open Food Schweiz.
|
||||
producer_shop_text2: >
|
||||
Ein Produzentenladen ist nur für Ihre eigenen Produkte bestimmt. Wenn
|
||||
Sie Produkte anderer verkaufen möchten, wählen Sie "Hub".
|
||||
producer_hub: Hub
|
||||
producer_hub_text1: >
|
||||
Verkaufen Sie eigene Produkte und Produkte anderer Produzenten oder
|
||||
Läden im Open Food Network. Mit Ihrem Laden sind Sie ein zentraler Bestandteil
|
||||
Läden im Open Food Schweiz. Mit Ihrem Laden sind Sie ein zentraler Bestandteil
|
||||
Ihres lokalen Lebensmittelsystems.
|
||||
producer_hub_text2: >
|
||||
Hubs können viele Formen annehmen, sei es ein Bauernmarkt, eine Lebensmittelkooperative,
|
||||
eine Einkaufsgemeinschaft, ein Gemüsekistenabo oder ein lokales Lebensmittelgeschäft.
|
||||
producer_hub_text3: >
|
||||
Das Open Food Network möchte mittels Hubs so viele Vertriebswege wie
|
||||
Das Open Food Schweiz möchte mittels Hubs so viele Vertriebswege wie
|
||||
möglich unterstützen. Auch Ihnen versuchen wir, unabhängig von Ihrer
|
||||
individuellen Situation, die Tools zur Verfügung zu stellen, die Sie
|
||||
für Ihre Organisation oder Ihr lokales Lebensmittelgeschäft benötigen.
|
||||
@@ -2877,11 +2878,11 @@ de_CH:
|
||||
producer_text2: >
|
||||
Produzenten können auch weitere Funktionen übernehmen, wie z. B. die
|
||||
Zusammenführung von Lebensmitteln anderer Unternehmen und den Verkauf
|
||||
über einen Laden im Open Food Network.
|
||||
über einen Laden im Open Food Schweiz.
|
||||
non_producer: Händler
|
||||
non_producer_text1: >
|
||||
Händler produzieren selbst keine Lebensmittel, d. h. sie können keine
|
||||
eigenen Produkte über das Open Food Network anbieten.
|
||||
eigenen Produkte über das Open Food Schweiz anbieten.
|
||||
non_producer_text2: >
|
||||
Stattdessen spezialisieren sich Händler darauf, Produzenten mit dem
|
||||
Endverbraucher zu verbinden, sei es durch Zusammenführung, Sortierung,
|
||||
@@ -2922,7 +2923,7 @@ de_CH:
|
||||
compiling_invoices: "Rechnungen werden erstellt ..."
|
||||
bulk_invoice_created: "Rechnungen wurden erstellt."
|
||||
bulk_invoice_failed: "Fehler beim Erstellen der Rechnungen."
|
||||
please_wait: "Bitte warten Sie, bis die pdf-Datei fertig ist, bevor Sie dieses Fenster schließen."
|
||||
please_wait: "Bitte warten Sie, bis die pdf-Datei fertig ist, bevor Sie dieses Fenster schliessen."
|
||||
order_state:
|
||||
address: "Adresse"
|
||||
adjustments: "Anpassungen"
|
||||
@@ -3020,7 +3021,7 @@ de_CH:
|
||||
min_quantity: "Minimale Menge"
|
||||
max_quantity: "Maximale Menge"
|
||||
price_breakdown: "Preisaufschlüsselung"
|
||||
unit_price_tooltip: "Grundpreis: Er ermöglicht einen einfachen Preisvergleich von Produkten, unabhängig von Packungsgröße und -gewicht."
|
||||
unit_price_tooltip: "Grundpreis: Er ermöglicht einen einfachen Preisvergleich von Produkten, unabhängig von Packungsgrösse und -gewicht."
|
||||
variants:
|
||||
on_demand:
|
||||
'yes': "Unbegrenzt/auf Bestellung"
|
||||
@@ -3075,14 +3076,14 @@ de_CH:
|
||||
select_shop: 'Bitte wählen Sie zuerst einen Laden aus.'
|
||||
could_not_create: 'Es tut uns leid! Konnte nicht erstellt werden:'
|
||||
subscriptions:
|
||||
closes: schließt
|
||||
closes: schliesst
|
||||
closed: geschlossen
|
||||
close_date_not_set: Schließzeitpunkt nicht eingestellt
|
||||
close_date_not_set: Schliesszeitpunkt nicht eingestellt
|
||||
spree:
|
||||
users:
|
||||
order: "Bestellung"
|
||||
registration:
|
||||
welcome_to_ofn: "Willkommen im Open Food Network!"
|
||||
welcome_to_ofn: "Willkommen im Open Food Schweiz!"
|
||||
signup_or_login: "Beginnen Sie mit der Registrierung oder loggen Sie sich ein"
|
||||
have_an_account: "Haben Sie bereits ein Konto?"
|
||||
action_login: "Jetzt einloggen."
|
||||
@@ -3096,7 +3097,7 @@ de_CH:
|
||||
other: "pro Stück"
|
||||
bunch:
|
||||
one: "Bündel"
|
||||
other: "Sträuße"
|
||||
other: "Sträusse"
|
||||
pack:
|
||||
one: "Pack"
|
||||
other: "Packungen"
|
||||
@@ -3336,7 +3337,7 @@ de_CH:
|
||||
shipping_address: "Lieferadresse"
|
||||
first_name: "Vorname"
|
||||
last_name: "Nachname"
|
||||
street_address: "Straße + Hausnummer"
|
||||
street_address: "Strasse + Hausnummer"
|
||||
street_address_2: "Adresszusatz (optional)"
|
||||
city: "Ort"
|
||||
zip: "Postleitzahl"
|
||||
@@ -3374,7 +3375,7 @@ de_CH:
|
||||
allow_ssl_in_staging: "Zulassen, dass SSL im Staging-Modus verwendet wird"
|
||||
currency_decimal_mark: "Dezimalzeichen der Währung"
|
||||
currency_settings: "Währungseinstellungen"
|
||||
currency_symbol_position: Währungssymbol (€) vor oder nach dem Betrag?
|
||||
currency_symbol_position: Währungssymbol (CHF) vor oder nach dem Betrag?
|
||||
currency_thousands_separator: "Tausendertrennzeichen der Währung"
|
||||
hide_cents: "Cents ausblenden"
|
||||
display_currency: "Währung anzeigen"
|
||||
@@ -3515,7 +3516,7 @@ de_CH:
|
||||
testmail:
|
||||
delivery_success: "Test-E-Mail wurde gesendet."
|
||||
error: "Beim Senden der Test-E-Mail ist ein Fehler aufgetreten."
|
||||
unit_price_tooltip: "Grundpreis: Er ermöglicht einen einfachen Preisvergleich von Produkten, unabhängig von Packungsgröße und -gewicht. Der im Online-Shop angezeigte Grundpreis kann ggf. aufgrund hinzukommender Gebühren abweichen."
|
||||
unit_price_tooltip: "Grundpreis: Er ermöglicht einen einfachen Preisvergleich von Produkten, unabhängig von Packungsgrösse und -gewicht. Der im Online-Shop angezeigte Grundpreis kann ggf. aufgrund hinzukommender Gebühren abweichen."
|
||||
subscriptions:
|
||||
number: "Bestellnummer"
|
||||
tab:
|
||||
@@ -3538,7 +3539,7 @@ de_CH:
|
||||
groups: "Gruppen"
|
||||
product_properties:
|
||||
index:
|
||||
inherits_properties_checkbox_hint: "Übernahme der Eigenschaften von %{supplier} (außer oben überschrieben)?"
|
||||
inherits_properties_checkbox_hint: "Übernahme der Eigenschaften von %{supplier} (ausser oben überschrieben)?"
|
||||
add_product_properties: "Produkteigenschaften hinzufügen"
|
||||
properties:
|
||||
index:
|
||||
@@ -3588,7 +3589,7 @@ de_CH:
|
||||
orders:
|
||||
add_product:
|
||||
cannot_add_item_to_canceled_order: "Artikel kann nicht zu stornierter Bestellung hinzugefügt werden"
|
||||
include_out_of_stock_variants: "Produktvarianten ohne Lagerbestand mit einschließen"
|
||||
include_out_of_stock_variants: "Produktvarianten ohne Lagerbestand mit einschliessen"
|
||||
index:
|
||||
listing_orders: "Bestellungen verwalten"
|
||||
new_order: "Neue Bestellung"
|
||||
@@ -3630,7 +3631,7 @@ de_CH:
|
||||
order_total: "Bestellung insgesamt"
|
||||
overview:
|
||||
enterprises_header:
|
||||
ofn_with_tip: Unternehmen sind Produzenten und/oder Hubs und sind die grundlegende Organisationseinheit innerhalb des Open Food Network.
|
||||
ofn_with_tip: Unternehmen sind Produzenten und/oder Hubs und sind die grundlegende Organisationseinheit innerhalb des Open Food Schweiz.
|
||||
enterprise_row:
|
||||
has_no_enterprise_fees: "erhebt keine Unternehmensgebühren"
|
||||
has_no_payment_methods: "hat keine Zahlungsarten"
|
||||
@@ -3742,7 +3743,6 @@ de_CH:
|
||||
paypal:
|
||||
no_payment_via_admin_backend: Paypal-Zahlungen können nicht im Backoffice erfasst werden.
|
||||
products:
|
||||
image_upload_error: "Das Produktbild wurde nicht erkannt. Bitte laden Sie ein Bild im PNG- oder JPG-Format hoch."
|
||||
new:
|
||||
title: "Neues Produkt"
|
||||
new_product: "Neues Produkt"
|
||||
@@ -3878,7 +3878,7 @@ de_CH:
|
||||
flatpickr_datetime_format: "d.m.Y H:i"
|
||||
today: "heute"
|
||||
now: "Jetzt"
|
||||
close: "Schließen"
|
||||
close: "Schliessen"
|
||||
orders:
|
||||
error_flash_for_unavailable_items: "Ein Artikel in Ihrem Warenkorb ist nicht mehr verfügbar. Bitte passen Sie die ausgewählten Mengen an."
|
||||
edit:
|
||||
@@ -3986,7 +3986,7 @@ de_CH:
|
||||
paused: pausiert
|
||||
canceled: storniert
|
||||
paypal:
|
||||
already_refunded: "Diese Zahlung wurde zurückerstattet und es können keine weiteren Maßnahmen ergriffen werden."
|
||||
already_refunded: "Diese Zahlung wurde zurückerstattet und es können keine weiteren Massnahmen ergriffen werden."
|
||||
no_payment_via_admin_backend: "Sie können derzeit keine PayPal-Konten über das Administrationsmenü belasten."
|
||||
transaction: "PayPal-Transaktion"
|
||||
payer_id: "Zahler-ID"
|
||||
@@ -4037,14 +4037,15 @@ de_CH:
|
||||
items: Artikel
|
||||
total: Gesamt
|
||||
paid?: Bezahlt?
|
||||
view: Ansehen
|
||||
status: Status
|
||||
cancelled: Storniert
|
||||
saved_cards:
|
||||
default?: Standard?
|
||||
delete?: Löschen?
|
||||
cards:
|
||||
authorised_shops: Autorisierte Läden
|
||||
authorised_shops_agreement: Dies ist die Liste der Läden, in denen Ihre Standardkreditkarte für eventuelle Abonnements (d. h. automatisch wiederholte Bestellungen) belastet werden darf. Ihre Kreditkartendaten werden sicher aufbewahrt und nicht an Ladenbesitzer weitergegeben. Sie werden immer benachrichtigt, wenn Ihre Kreditkarte belastet wird. Wenn Sie das Kontrollkästchen für einen Laden aktivieren, erlauben Sie diesem Laden Anweisungen an das Finanzinstitut, das Ihre Kreditkarte ausgestellt hat, zu senden, um Zahlungen gemäß der Bedingungen eines Abonnements, das Sie mit diesem Laden erstellen, entgegenzunehmen.
|
||||
saved_cards_popover: Dies ist die Liste der Kreditkarten, die Sie für spätere Verwendung gespeichert haben. Ihr "Standard" wird automatisch beim Abschließen einer Bestellung ausgewählt und kann von allen Läden belastet werden, die Sie dazu berechtigt haben (siehe rechts).
|
||||
authorised_shops_agreement: Dies ist die Liste der Läden, in denen Ihre Standardkreditkarte für eventuelle Abonnements (d. h. automatisch wiederholte Bestellungen) belastet werden darf. Ihre Kreditkartendaten werden sicher aufbewahrt und nicht an Ladenbesitzer weitergegeben. Sie werden immer benachrichtigt, wenn Ihre Kreditkarte belastet wird. Wenn Sie das Kontrollkästchen für einen Laden aktivieren, erlauben Sie diesem Laden Anweisungen an das Finanzinstitut, das Ihre Kreditkarte ausgestellt hat, zu senden, um Zahlungen gemäss der Bedingungen eines Abonnements, das Sie mit diesem Laden erstellen, entgegenzunehmen.
|
||||
saved_cards_popover: Dies ist die Liste der Kreditkarten, die Sie für spätere Verwendung gespeichert haben. Ihr "Standard" wird automatisch beim Abschliessen einer Bestellung ausgewählt und kann von allen Läden belastet werden, die Sie dazu berechtigt haben (siehe rechts).
|
||||
authorised_shops:
|
||||
shop_name: "Ladenname"
|
||||
allow_charges?: "Abbuchungen für die Standardkreditkarte zulassen?"
|
||||
|
||||
@@ -321,7 +321,7 @@ de_DE:
|
||||
cancel_order: "Bestellung stornieren"
|
||||
confirm_send_invoice: "Eine Rechnung für diese Bestellung wird an den Kunden geschickt. Sind Sie sicher, dass sie fortfahren möchten?"
|
||||
confirm_resend_order_confirmation: "Sind Sie sicher, dass Sie die E-Mail-Bestätigung erneut senden wollen?"
|
||||
must_have_valid_business_number: "%{enterprise_name} sollte eine gültige Steuer-ID-Nummer haben, bevor die Rechnung gesendet wird."
|
||||
must_have_valid_business_number: "%{enterprise_name} muss eine gültige Umsatzsteueridentifikationsnummer (USt-IdNr.) haben, bevor Rechnungen gesendet werden können."
|
||||
invoice: "Rechnung"
|
||||
more: "Mehr"
|
||||
say_no: "Nein"
|
||||
@@ -494,6 +494,8 @@ de_DE:
|
||||
terms_of_service: "Nutzungsbedingungen"
|
||||
delete: "Löschen"
|
||||
confirm_delete: "Sind Sie sicher, dass Sie die derzeitigen Nutzungsbedingungen löschen möchten?"
|
||||
attachment: "Datei hochladen"
|
||||
create_terms_of_service: "Nutzungsbedingungen hochladen "
|
||||
number_localization:
|
||||
number_localization_settings: "Zahlenformateinstellungen"
|
||||
enable_localized_number: "Verwenden Sie die internationale Tausendertrennungslogik"
|
||||
@@ -503,6 +505,7 @@ de_DE:
|
||||
enable_invoices?: "Rechnungen aktivieren?"
|
||||
invoice_style2?: "Verwenden Sie die Rechnungsvorlage mit Aufschlüsselung verschiedener Steuersätze pro Artikel (empfohlen in der EU, noch nicht für Länder mit Preisen ohne Steuern geeignet)."
|
||||
enable_receipt_printing?: "Optionen zum Drucken von Belegen mit Thermodruckern in der Dropdown-Liste anzeigen?"
|
||||
enterprise_number_required_on_invoices?: "Umsatzsteueridentifikationsnummer (USt-IdNr.) erforderlich um Rechnungen zu erstellen?"
|
||||
stripe_connect_settings:
|
||||
edit:
|
||||
title: "Stripe Connect"
|
||||
@@ -551,7 +554,7 @@ de_DE:
|
||||
credit_owed: "Geschuldetes Guthaben"
|
||||
balance_due: "Offener Betrag"
|
||||
destroy:
|
||||
has_associated_orders: "Löschen fehlgeschlagen: Der Kunde hat Bestellungen bei diesem Laden."
|
||||
has_associated_subscriptions: "Löschen fehlgeschlagen: Dieser Kunde hat aktive Abonnements. Bitte kündigen Sie diese zuerst."
|
||||
contents:
|
||||
edit:
|
||||
title: Inhalt
|
||||
@@ -779,6 +782,9 @@ de_DE:
|
||||
variants_without_unit_value: "WARNUNG: Manche Produktvarianten haben keine Einheit"
|
||||
all: "Alle"
|
||||
select_variant: "Wählen Sie eine Produktvariante"
|
||||
note:
|
||||
note_label: "Anmerkung:"
|
||||
no_note_present: "Keine Anmerkung vorhanden."
|
||||
enterprise:
|
||||
select_outgoing_oc_products_from: Wählen Sie die im Bestellzyklus ausgehenden Produkte von
|
||||
enterprises:
|
||||
@@ -827,6 +833,9 @@ de_DE:
|
||||
email_address_tip: "Diese E-Mail-Adresse wird in Ihrem öffentlichen Profil angezeigt."
|
||||
phone: Telefonnummer
|
||||
phone_placeholder: z. B. +49 40 123 456
|
||||
whatsapp_phone: WhatsApp-Telefonnummer
|
||||
whatsapp_phone_placeholder: z. B. +49 170 1234567
|
||||
whatsapp_phone_tip: "Diese Telefonnummer wird in Ihrem öffentlichen Profil als Link zu WhatsApp angezeigt."
|
||||
website: Homepage
|
||||
website_placeholder: z. B. www.truffles.com
|
||||
enterprise_fees:
|
||||
@@ -1113,7 +1122,7 @@ de_DE:
|
||||
add_supplier: 'Lieferant hinzufügen'
|
||||
add_distributor: 'Verteilstelle hinzufügen'
|
||||
advanced_settings:
|
||||
automatic_notifications: Automatische Benachrichtigungen
|
||||
automatic_notifications: Produzenten automatisch benachrichtigen
|
||||
automatic_notifications_tip: Benachrichtigen Sie die Produzenten automatisch per E-Mail über in diesem Bestellzyklus erhaltene Bestellungen, wenn der Bestellzyklus schließt.
|
||||
title: Erweiterte Einstellungen
|
||||
choose_product_tip: Sie können die eingehenden und ausgehenden Produkte auf den Katalog nur von %{inventory} beschränken.
|
||||
@@ -1162,6 +1171,7 @@ de_DE:
|
||||
customer_instructions_placeholder: Abhol-/Lieferinformationen
|
||||
products: Produkte
|
||||
fees: Gebühren
|
||||
tags: Stichwörter
|
||||
destroy_errors:
|
||||
orders_present: Dieser Bestellzyklus wurde von einem Kunden ausgewählt und kann nicht gelöscht werden. Um weitere Verwendung zu verhindern, können Sie ihn stattdessen schließen.
|
||||
schedule_present: Dieser Bestellzyklus ist mit einem Zeitplan verknüpft und kann nicht gelöscht werden. Bitte heben Sie zuerst die Verknüpfung auf oder löschen Sie den Zeitplan.
|
||||
@@ -1171,6 +1181,11 @@ de_DE:
|
||||
msg: Dieser Bestellzyklus enthält %{n} offene Abonnementbestellungen. Das Ändern des Datums wird bereits erteilte Bestellungen nicht beeinträchtigen, sollte wenn möglich aber vermieden werden. Sind Sie sicher, dass Sie fortfahren wollen?
|
||||
cancel: Abbrechen
|
||||
proceed: Fortfahren
|
||||
status:
|
||||
undated: nicht datiert
|
||||
upcoming: bevorstehend
|
||||
open: geöffnet
|
||||
closed: geschlossen
|
||||
producer_properties:
|
||||
index:
|
||||
title: Produzenteneigenschaften
|
||||
@@ -2203,7 +2218,10 @@ de_DE:
|
||||
contact_field_placeholder: "Vorname Nachname"
|
||||
contact_field_required: "Bitte geben Sie einen Hauptansprechpartner ein."
|
||||
phone_field: "Telefonnummer (optional)"
|
||||
whatsapp_phone_field: "WhatsApp-Telefonnummer"
|
||||
whatsapp_phone_tooltip: "Diese Telefonnummer wird in Ihrem öffentlichen Profil als Link zu WhatsApp angezeigt."
|
||||
phone_field_placeholder: "z. B. +49 40 123 456"
|
||||
whatsapp_phone_field_placeholder: "z. B. +49 170 1234567"
|
||||
type:
|
||||
title: "Art des Profils"
|
||||
headline: "Wählen Sie bitte die Profilart für %{enterprise} aus!"
|
||||
@@ -3323,7 +3341,7 @@ de_DE:
|
||||
split: "Teilen"
|
||||
delete: "Löschen"
|
||||
cannot_set_shipping_method_without_address: "Lieferoption kann nicht festgelegt werden, bis Kundendaten angegeben werden."
|
||||
no_tracking_present: "Keine Details zur Sendungsverfolgung angegeben."
|
||||
no_tracking_present: "Keine Details zur Sendungsverfolgung vorhanden."
|
||||
tracking: "Sendungsverfolgung"
|
||||
tracking_number: "Sendungscode"
|
||||
order_total: "Bestellung insgesamt"
|
||||
@@ -3607,6 +3625,10 @@ de_DE:
|
||||
results_found: "%{number} Ergebnisse gefunden."
|
||||
viewing: "Angezeigt wird %{start} bis %{end}."
|
||||
print_invoices: "Rechnungen drucken"
|
||||
selected:
|
||||
zero: "Keine Bestellung ausgewählt"
|
||||
one: "1 Bestellung ausgewählt"
|
||||
other: "%{count} Bestellungen ausgewählt"
|
||||
sortable_header:
|
||||
payment_state: "Zahlungsstatus"
|
||||
shipment_state: "Lieferstatus"
|
||||
@@ -3621,6 +3643,9 @@ de_DE:
|
||||
from: "Von"
|
||||
to: "Rechnungsempfänger"
|
||||
shipping: "Lieferung"
|
||||
note:
|
||||
note_label: "Anmerkung:"
|
||||
no_note_present: "Keine Anmerkung vorhanden."
|
||||
form:
|
||||
distribution_fields:
|
||||
title: "Verteilung"
|
||||
@@ -3743,7 +3768,7 @@ de_DE:
|
||||
paypal:
|
||||
no_payment_via_admin_backend: Paypal-Zahlungen können nicht im Backoffice erfasst werden.
|
||||
products:
|
||||
image_upload_error: "Das Produktbild wurde nicht erkannt. Bitte laden Sie ein Bild im PNG- oder JPG-Format hoch."
|
||||
image_upload_error: "Bitte laden Sie ein Bild im JPG-, PNG-, GIF-, SVG- oder WEBP-Format hoch."
|
||||
new:
|
||||
title: "Neues Produkt"
|
||||
new_product: "Neues Produkt"
|
||||
@@ -4039,7 +4064,9 @@ de_DE:
|
||||
items: Artikel
|
||||
total: Gesamt
|
||||
paid?: Bezahlt?
|
||||
view: Ansehen
|
||||
status: Status
|
||||
completed: Abgeschlossen
|
||||
cancelled: Storniert
|
||||
saved_cards:
|
||||
default?: Standard?
|
||||
delete?: Löschen?
|
||||
|
||||
@@ -542,6 +542,8 @@ en:
|
||||
terms_of_service: "Terms of Service"
|
||||
delete: "Delete file"
|
||||
confirm_delete: "Are you sure you want to delete the current Terms of Service file?"
|
||||
attachment: "Attachment"
|
||||
create_terms_of_service: "Create Terms of service file"
|
||||
number_localization:
|
||||
number_localization_settings: "Number Localization Settings"
|
||||
enable_localized_number: "Use the international thousand/decimal separator logic"
|
||||
@@ -552,6 +554,7 @@ en:
|
||||
enable_invoices?: "Enable Invoices?"
|
||||
invoice_style2?: "Use the alternative invoice model that includes total tax breakdown per rate and tax rate info per item (not yet suitable for countries displaying prices excluding tax)"
|
||||
enable_receipt_printing?: "Show options for printing receipts using thermal printers in order dropdown?"
|
||||
enterprise_number_required_on_invoices?: "Require an ABN to generate an invoice?"
|
||||
|
||||
stripe_connect_settings:
|
||||
edit:
|
||||
@@ -603,8 +606,7 @@ en:
|
||||
credit_owed: "Credit Owed"
|
||||
balance_due: "Balance Due"
|
||||
destroy:
|
||||
has_associated_orders: "Delete failed: customer has associated orders with his shop"
|
||||
|
||||
has_associated_subscriptions: "Delete failed: This customer has active subscriptions. Cancel them first."
|
||||
contents:
|
||||
edit:
|
||||
title: Content
|
||||
@@ -838,6 +840,9 @@ en:
|
||||
variants_without_unit_value: "WARNING: Some variants do not have a unit value"
|
||||
all: "All"
|
||||
select_variant: "Select a variant"
|
||||
note:
|
||||
note_label: "Note:"
|
||||
no_note_present: "No note provided."
|
||||
enterprise:
|
||||
select_outgoing_oc_products_from: Select outgoing OC products from
|
||||
|
||||
@@ -887,6 +892,9 @@ en:
|
||||
email_address_tip: "This email address will be displayed in your public profile"
|
||||
phone: Phone
|
||||
phone_placeholder: eg. 98 7654 3210
|
||||
whatsapp_phone: WhatsApp phone number
|
||||
whatsapp_phone_placeholder: eg. +61 4 9876 5432
|
||||
whatsapp_phone_tip: "This number will be displayed in your public profile to be opened as a WhatsApp link."
|
||||
website: Website
|
||||
website_placeholder: eg. www.truffles.com
|
||||
enterprise_fees:
|
||||
@@ -1218,6 +1226,7 @@ en:
|
||||
customer_instructions_placeholder: Pick-up or delivery notes
|
||||
products: Products
|
||||
fees: Fees
|
||||
tags: Tags
|
||||
destroy_errors:
|
||||
orders_present: That order cycle has been selected by a customer and cannot be deleted. To prevent customers from accessing it, please close it instead.
|
||||
schedule_present: That order cycle is linked to a schedule and cannot be deleted. Please unlink or delete the schedule first.
|
||||
@@ -1227,6 +1236,11 @@ en:
|
||||
msg: This order cycle is linked to %{n} open subscription orders. Changing this date now will not affect any orders which have already been placed, but should be avoided if possible. Are you sure you want to proceed?
|
||||
cancel: Cancel
|
||||
proceed: Proceed
|
||||
status:
|
||||
undated: undated
|
||||
upcoming: upcoming
|
||||
open: open
|
||||
closed: closed
|
||||
producer_properties:
|
||||
index:
|
||||
title: Producer Properties
|
||||
@@ -2332,7 +2346,10 @@ See the %{link} to find out more about %{sitename}'s features and to start using
|
||||
contact_field_placeholder: "Contact Name"
|
||||
contact_field_required: "You need to enter a primary contact."
|
||||
phone_field: "Phone number"
|
||||
whatsapp_phone_field: "WhatsApp phone number"
|
||||
whatsapp_phone_tooltip: "This number will be displayed in your public profile to be opened as a WhatsApp link."
|
||||
phone_field_placeholder: "eg. (03) 1234 5678"
|
||||
whatsapp_phone_field_placeholder: "eg. +61 4 1234 5678"
|
||||
type:
|
||||
title: "Type"
|
||||
headline: "Last step to add %{enterprise}!"
|
||||
@@ -3768,6 +3785,10 @@ See the %{link} to find out more about %{sitename}'s features and to start using
|
||||
results_found: "%{number} Results found."
|
||||
viewing: "Viewing %{start} to %{end}."
|
||||
print_invoices: "Print Invoices"
|
||||
selected:
|
||||
zero: "No order selected"
|
||||
one: "1 order selected"
|
||||
other: "%{count} orders selected"
|
||||
sortable_header:
|
||||
payment_state: "Payment State"
|
||||
shipment_state: "Shipment State"
|
||||
@@ -3782,6 +3803,9 @@ See the %{link} to find out more about %{sitename}'s features and to start using
|
||||
from: "From"
|
||||
to: "Bill to"
|
||||
shipping: "Shipping"
|
||||
note:
|
||||
note_label: "Note:"
|
||||
no_note_present: "No note provided."
|
||||
form:
|
||||
distribution_fields:
|
||||
title: "Distribution"
|
||||
@@ -3904,7 +3928,7 @@ See the %{link} to find out more about %{sitename}'s features and to start using
|
||||
paypal:
|
||||
no_payment_via_admin_backend: Paypal payments cannot be captured in the Backoffice
|
||||
products:
|
||||
image_upload_error: "The product image was not recognised. Please upload an image in PNG or JPG format."
|
||||
image_upload_error: "Please upload the image in JPG, PNG, GIF, SVG or WEBP format."
|
||||
new:
|
||||
title: "New Product"
|
||||
new_product: "New Product"
|
||||
@@ -4201,7 +4225,9 @@ See the %{link} to find out more about %{sitename}'s features and to start using
|
||||
items: Items
|
||||
total: Total
|
||||
paid?: Paid?
|
||||
view: View
|
||||
status: Status
|
||||
completed: Completed
|
||||
cancelled: Cancelled
|
||||
saved_cards:
|
||||
default?: Default?
|
||||
delete?: Delete?
|
||||
@@ -4212,6 +4238,7 @@ See the %{link} to find out more about %{sitename}'s features and to start using
|
||||
authorised_shops:
|
||||
shop_name: "Shop Name"
|
||||
allow_charges?: "Allow Charges to Default Card?"
|
||||
no_default_saved_cards_tooltip: You need to mark one credit card as default to allow charges.
|
||||
localized_number:
|
||||
invalid_format: has an invalid format. Please enter a number.
|
||||
api:
|
||||
|
||||
@@ -414,8 +414,6 @@ en_AU:
|
||||
guest_label: "Guest checkout"
|
||||
credit_owed: "Credit Owed"
|
||||
balance_due: "Balance Due"
|
||||
destroy:
|
||||
has_associated_orders: "Delete failed: customer has associated orders with his shop"
|
||||
contents:
|
||||
edit:
|
||||
title: Content
|
||||
@@ -1005,6 +1003,7 @@ en_AU:
|
||||
customer_instructions_placeholder: Pick-up or delivery notes
|
||||
products: Products
|
||||
fees: Fees
|
||||
tags: Tags
|
||||
destroy_errors:
|
||||
orders_present: That order cycle has been selected by a customer and cannot be deleted. To prevent customers from accessing it, please close it instead.
|
||||
schedule_present: That order cycle is linked to a schedule and cannot be deleted. Please unlink or delete the schedule first.
|
||||
@@ -1014,6 +1013,8 @@ en_AU:
|
||||
msg: This order cycle is linked to %{n} open subscription orders. Changing this date now will not affect any orders which have already been placed, but should be avoided if possible. Are you sure you want to proceed?
|
||||
cancel: Cancel
|
||||
proceed: Proceed
|
||||
status:
|
||||
closed: closed
|
||||
producer_properties:
|
||||
index:
|
||||
title: Producer Properties
|
||||
@@ -3379,7 +3380,6 @@ en_AU:
|
||||
paypal:
|
||||
no_payment_via_admin_backend: Paypal payments cannot be captured in the Backoffice
|
||||
products:
|
||||
image_upload_error: "The product image was not recognised. Please upload an image in PNG or JPG format."
|
||||
new:
|
||||
title: "New Product"
|
||||
new_product: "New Product"
|
||||
@@ -3636,7 +3636,8 @@ en_AU:
|
||||
items: Items
|
||||
total: Total
|
||||
paid?: Paid?
|
||||
view: View
|
||||
status: Status
|
||||
cancelled: Cancelled
|
||||
saved_cards:
|
||||
default?: Default?
|
||||
delete?: Delete?
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user