Compare commits

...

69 Commits

Author SHA1 Message Date
Jean-Baptiste Bellet
36aabbb5b6 Update all locales with the latest Transifex translations 2022-08-11 18:14:48 +02:00
Filipe
82f38c9aea Merge pull request #9456 from openfoodfoundation/dependabot/bundler/activemerchant-1.126.0
Bump activemerchant from 1.123.0 to 1.126.0
2022-08-11 17:10:31 +01:00
Filipe
689720b749 Merge pull request #9437 from jibees/8897-preselect-default-card-and-do-not-allow-to-charge-if-no-card-is-marked-as-default
User account, Credit cards: Do not allow to check "Allow charges" if no credit cards marked as default
2022-08-11 16:34:42 +01:00
Filipe
50600b9d00 Merge pull request #9462 from openfoodfoundation/dependabot/bundler/pagy-5.10.1
Bump pagy from 5.1.2 to 5.10.1
2022-08-11 16:20:03 +01:00
Rachel Arnould
abdef21381 Update FUNDING.yml 2022-08-11 14:45:42 +02:00
jibees
4a3bd510a7 Merge pull request #9544 from jibees/upgrade-yarn-
Upgrade `yarn.lock` since it seemed to be derived
2022-08-10 09:06:16 +02:00
jibees
bb85473eba Merge pull request #9550 from openfoodfoundation/dependabot/bundler/webmock-3.17.1
Bump webmock from 3.17.0 to 3.17.1
2022-08-10 08:57:39 +02:00
jibees
d5fa5e298e Merge pull request #9551 from openfoodfoundation/dependabot/bundler/debug-1.6.2
Bump debug from 1.6.1 to 1.6.2
2022-08-10 08:57:08 +02:00
Jean-Baptiste Bellet
dab4939819 Upgrade yarn.lock since it seemed to be derived 2022-08-10 08:45:24 +02:00
jibees
43b29af922 Merge pull request #9545 from Philwi/control-capybara-headless-mode-via-environment-variable
Control capybara headless mode for testing via environment variable
2022-08-10 08:05:26 +02:00
dependabot[bot]
2c1acc14e6 Bump debug from 1.6.1 to 1.6.2
Bumps [debug](https://github.com/ruby/debug) from 1.6.1 to 1.6.2.
- [Release notes](https://github.com/ruby/debug/releases)
- [Commits](https://github.com/ruby/debug/compare/v1.6.1...v1.6.2)

---
updated-dependencies:
- dependency-name: debug
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-08-10 06:02:35 +00:00
dependabot[bot]
84f9da4a23 Bump webmock from 3.17.0 to 3.17.1
Bumps [webmock](https://github.com/bblimke/webmock) from 3.17.0 to 3.17.1.
- [Release notes](https://github.com/bblimke/webmock/releases)
- [Changelog](https://github.com/bblimke/webmock/blob/master/CHANGELOG.md)
- [Commits](https://github.com/bblimke/webmock/compare/v3.17.0...v3.17.1)

---
updated-dependencies:
- dependency-name: webmock
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-08-10 06:00:05 +00:00
jibees
d817319aa4 Merge pull request #9539 from openfoodfoundation/dependabot/bundler/sidekiq-6.5.4
Bump sidekiq from 6.5.3 to 6.5.4
2022-08-10 07:58:25 +02:00
Philipp Winkler
093b851395 Control headless mode for testing via environment variable 2022-08-09 20:57:52 +02:00
Filipe
e3a150226e Merge pull request #9507 from openfoodfoundation/dependabot/bundler/stripe-7.0.0
Bump stripe from 5.42.0 to 7.0.0
2022-08-09 12:33:36 +01:00
Rachel Arnould
5122ed9af4 Update FUNDING.yml 2022-08-09 10:11:17 +02:00
Rachel Arnould
ac5a3beb15 Update FUNDING.yml 2022-08-09 10:10:44 +02:00
dependabot[bot]
19481fc55e Bump sidekiq from 6.5.3 to 6.5.4
Bumps [sidekiq](https://github.com/mperham/sidekiq) from 6.5.3 to 6.5.4.
- [Release notes](https://github.com/mperham/sidekiq/releases)
- [Changelog](https://github.com/mperham/sidekiq/blob/main/Changes.md)
- [Commits](https://github.com/mperham/sidekiq/compare/v6.5.3...v6.5.4)

---
updated-dependencies:
- dependency-name: sidekiq
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-08-09 06:48:01 +00:00
Maikel Linke
c8cab8aae5 Update mocked responses to get a ListObject 2022-08-09 15:13:16 +10:00
dependabot[bot]
d7428015ac Bump stripe from 5.42.0 to 7.0.0
Bumps [stripe](https://github.com/stripe/stripe-ruby) from 5.42.0 to 7.0.0.
- [Release notes](https://github.com/stripe/stripe-ruby/releases)
- [Changelog](https://github.com/stripe/stripe-ruby/blob/master/CHANGELOG.md)
- [Commits](https://github.com/stripe/stripe-ruby/compare/v5.42.0...v7.0.0)

---
updated-dependencies:
- dependency-name: stripe
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-08-09 15:13:16 +10:00
Maikel
700f91efb5 Merge pull request #9449 from filipefurtad0/packing_report
Updates specs on Packing and Payment Reports
2022-08-09 14:56:22 +10:00
Maikel
43e4047447 Merge pull request #9495 from filipefurtad0/invoice_print_spec
Invoice print spec: added tax
2022-08-09 14:54:23 +10:00
Maikel
892e843e9e Merge pull request #9533 from filipefurtad0/remove_bye_bug
Removes byebug and pry-byebug; keeps pry 🧹
2022-08-09 10:39:21 +10:00
filipefurtad0
85904f57b8 Removes byebug and pry-byebug; keeps pry 2022-08-08 15:22:45 +01:00
jibees
b5e23717f2 Merge pull request #9531 from mkllnk/awesome-print
Remove unnecessary awesome_print gem
2022-08-08 14:21:11 +02:00
jibees
d8d99c930e Merge pull request #9530 from openfoodfoundation/dependabot/bundler/webmock-3.17.0
Bump webmock from 3.15.0 to 3.17.0
2022-08-08 14:09:48 +02:00
filipefurtad0
ce96094f49 Adds around block with time.freeze 2022-08-08 12:23:11 +01:00
Maikel Linke
6c655e6fbc Remove unnecessary awesome_print gem
Most people don't know it and it has now been superseeded by new
versions of irb and debug.
2022-08-08 15:39:59 +10:00
Maikel Linke
2d1483febb Remove misleading comment
That comment was in the original commit of this source code and was
related to another gem which has long been removed.
2022-08-08 15:38:30 +10:00
Maikel
42d7383ff0 Merge pull request #9446 from jibees/add-prettier
Add prettier linter for stimulusjs files
2022-08-08 14:41:47 +10:00
Maikel Linke
df4ddf45c4 Only check, not fix in pre-commit hook 2022-08-08 14:40:58 +10:00
Jean-Baptiste Bellet
e0b40222dd add pre-commit hook
with husky and pretty-quick
2022-08-08 14:40:58 +10:00
Jean-Baptiste Bellet
61928cbc05 Run prettier formatter 2022-08-08 14:40:58 +10:00
Jean-Baptiste Bellet
c6884f96e1 Add prettier as a GH action 2022-08-08 14:40:58 +10:00
Jean-Baptiste Bellet
f0b5a04f6b Ignore everything but js files related to stimulusjs 2022-08-08 14:40:58 +10:00
Jean-Baptiste Bellet
b8ffddb533 Add prettier to our stack 2022-08-08 14:40:58 +10:00
dependabot[bot]
71536767b5 Bump webmock from 3.15.0 to 3.17.0
Bumps [webmock](https://github.com/bblimke/webmock) from 3.15.0 to 3.17.0.
- [Release notes](https://github.com/bblimke/webmock/releases)
- [Changelog](https://github.com/bblimke/webmock/blob/master/CHANGELOG.md)
- [Commits](https://github.com/bblimke/webmock/compare/v3.15.0...v3.17.0)

---
updated-dependencies:
- dependency-name: webmock
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-08-08 04:18:03 +00:00
Maikel
938056d1d8 Merge pull request #9453 from openfoodfoundation/dependabot/bundler/angular_rails_csrf-5.0.0
Bump angular_rails_csrf from 4.5.0 to 5.0.0
2022-08-08 14:16:56 +10:00
Maikel
63d2d69d08 Clarify copying of test build URL
And removing an unused translation step
2022-08-08 12:47:28 +10:00
Maikel
78ec086111 Merge pull request #9501 from Michaelcode2/master
Added file "uk.yml" to directory openfoodnetwork/config/locales/
2022-08-08 12:34:01 +10:00
filipefurtad0
2aded5b459 Clarifies pending examples 2022-08-05 17:43:02 +01:00
filipefurtad0
5aa6b14756 Fixes tax values 2022-08-05 16:41:35 +01:00
filipefurtad0
07bd84ffbb Tests added tax - legacy and alternative invoices 2022-08-05 16:41:35 +01:00
filipefurtad0
d2794f328f Tests included tax - legacy and alternative invoices 2022-08-05 16:41:35 +01:00
filipefurtad0
8b146fc72a Adds included_in_price trait on broken specs 2022-08-05 16:41:35 +01:00
filipefurtad0
0c491a6651 Adds test case for added tax 2022-08-05 16:41:35 +01:00
filipefurtad0
e8529754f1 Updates order and product factory to consider added tax 2022-08-05 16:41:35 +01:00
dependabot[bot]
d95dc84c34 Bump pagy from 5.1.2 to 5.10.1
Bumps [pagy](https://github.com/ddnexus/pagy) from 5.1.2 to 5.10.1.
- [Release notes](https://github.com/ddnexus/pagy/releases)
- [Changelog](https://github.com/ddnexus/pagy/blob/master/CHANGELOG.md)
- [Commits](https://github.com/ddnexus/pagy/compare/5.1.2...5.10.1)

---
updated-dependencies:
- dependency-name: pagy
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-08-05 14:59:59 +00:00
Filipe
b61ee0211f Merge pull request #9525 from filipefurtad0/adds_debug_gem
Adds debug gem to the stack
2022-08-05 15:58:45 +01:00
filipefurtad0
c777a00874 Adds debug gem to the stack, bundled with 2.1.4 2022-08-05 14:01:47 +01:00
jibees
a0a2dab44f Merge pull request #9523 from openfoodfoundation/dependabot/bundler/sidekiq-6.5.3
Bump sidekiq from 6.5.1 to 6.5.3
2022-08-05 11:31:58 +02:00
jibees
f0aa7f44a5 Merge pull request #9524 from openfoodfoundation/dependabot/bundler/rubocop-1.33.0
Bump rubocop from 1.32.0 to 1.33.0
2022-08-05 11:31:18 +02:00
dependabot[bot]
a51940937a Bump rubocop from 1.32.0 to 1.33.0
Bumps [rubocop](https://github.com/rubocop/rubocop) from 1.32.0 to 1.33.0.
- [Release notes](https://github.com/rubocop/rubocop/releases)
- [Changelog](https://github.com/rubocop/rubocop/blob/master/CHANGELOG.md)
- [Commits](https://github.com/rubocop/rubocop/compare/v1.32.0...v1.33.0)

---
updated-dependencies:
- dependency-name: rubocop
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-08-05 09:06:01 +00:00
dependabot[bot]
f1e401070a Bump sidekiq from 6.5.1 to 6.5.3
Bumps [sidekiq](https://github.com/mperham/sidekiq) from 6.5.1 to 6.5.3.
- [Release notes](https://github.com/mperham/sidekiq/releases)
- [Changelog](https://github.com/mperham/sidekiq/blob/main/Changes.md)
- [Commits](https://github.com/mperham/sidekiq/compare/v6.5.1...v6.5.3)

---
updated-dependencies:
- dependency-name: sidekiq
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-08-05 09:05:41 +00:00
dependabot[bot]
609cbe2893 Bump angular_rails_csrf from 4.5.0 to 5.0.0
Bumps [angular_rails_csrf](https://github.com/jsanders/angular_rails_csrf) from 4.5.0 to 5.0.0.
- [Release notes](https://github.com/jsanders/angular_rails_csrf/releases)
- [Changelog](https://github.com/jsanders/angular_rails_csrf/blob/master/CHANGELOG.md)
- [Commits](https://github.com/jsanders/angular_rails_csrf/compare/v4.5.0...v5.0.0)

---
updated-dependencies:
- dependency-name: angular_rails_csrf
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-08-04 12:15:53 +00:00
Michael
912713a0c9 added Ukrainian lang. file uk.yml, corrected uk:Ukrainian 2022-08-02 13:22:17 +03:00
Michael
3621616f7c Delete en_UA.yml 2022-08-02 11:53:17 +03:00
Michael
41ddd653a0 Added file "uk.yml" to openfoodnetwork/config/locales/
Added file "uk.yml" to directory openfoodnetwork/config/locales/
Ukrainian language translation (UA)
2022-08-02 11:52:36 +03:00
Michael
d8c7c0141a added Ukrainian translation file en_UA.yml 2022-08-02 11:34:12 +03:00
dependabot[bot]
21c0baa965 Bump activemerchant from 1.123.0 to 1.126.0
Bumps [activemerchant](https://github.com/activemerchant/active_merchant) from 1.123.0 to 1.126.0.
- [Release notes](https://github.com/activemerchant/active_merchant/releases)
- [Changelog](https://github.com/activemerchant/active_merchant/blob/master/CHANGELOG)
- [Commits](https://github.com/activemerchant/active_merchant/compare/v1.123.0...v1.126.0)

---
updated-dependencies:
- dependency-name: activemerchant
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-07-28 01:10:42 +00:00
Maikel Linke
59c9f0957b Simplify default card logic 2022-07-27 11:14:18 +10:00
filipefurtad0
116f503cf6 Updates Payments reports spec 2022-07-26 16:07:29 +01:00
filipefurtad0
023ebe1909 Asserts on pre-filling of dates; removes manual date selection 2022-07-26 16:07:29 +01:00
jibees
be568cdfa6 Update config/locales/en.yml
Co-authored-by: Maikel <maikel@email.org.au>
2022-07-26 14:42:55 +02:00
Jean-Baptiste Bellet
0bb90d764c Allow charges is disabled if no saved cards marked as default 2022-07-26 14:42:55 +02:00
Jean-Baptiste Bellet
34c8748b9c Mark the next credit cards with payment profile as default 2022-07-26 14:42:55 +02:00
Jean-Baptiste Bellet
875c22346e Add a tooltip on <td /> when input is disabled, ie no default saved cards
Co-Authored-By: Maikel <maikel@email.org.au>
2022-07-26 14:42:54 +02:00
filipefurtad0
c57d5a2408 Updates spec to smoke-test Pack by Product 2022-07-26 12:49:08 +01:00
Jean-Baptiste Bellet
a3cb1e6ecc Can Allow charges only if one card is marked as default 2022-07-21 14:42:36 +02:00
47 changed files with 5068 additions and 578 deletions

4
.github/FUNDING.yml vendored
View File

@@ -1,8 +1,8 @@
# These are supported funding model platforms
github: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2]
github: openfoodfoundation
patreon: # Replace with a single Patreon username
open_collective: ofnusa
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

View File

@@ -17,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.

View File

@@ -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

4
.husky/pre-commit Executable file
View File

@@ -0,0 +1,4 @@
#!/usr/bin/env sh
. "$(dirname -- "$0")/_/husky.sh"
yarn pretty-quick --check --staged

21
.prettierignore Normal file
View 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
View File

@@ -0,0 +1 @@
{}

View File

@@ -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'

View File

@@ -101,7 +101,7 @@ GEM
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)
@@ -146,8 +146,8 @@ GEM
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.14.0)
@@ -155,7 +155,6 @@ GEM
ast (2.4.2)
awesome_nested_set (3.5.0)
activerecord (>= 4.0.0, < 7.1)
awesome_print (1.9.2)
aws-eventstream (1.2.0)
aws-partitions (1.601.0)
aws-sdk-core (3.131.2)
@@ -186,7 +185,6 @@ GEM
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)
@@ -239,6 +237,9 @@ 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.1)
bcrypt (~> 3.0)
@@ -337,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)
@@ -402,7 +406,8 @@ GEM
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)
@@ -427,9 +432,6 @@ 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.7)
puma (5.6.4)
nio4r (~> 2.0)
@@ -494,6 +496,8 @@ GEM
redcarpet (3.5.1)
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)
@@ -545,7 +549,7 @@ GEM
rswag-ui (2.5.1)
actionpack (>= 3.1, < 7.1)
railties (>= 3.1, < 7.1)
rubocop (1.32.0)
rubocop (1.33.0)
json (~> 2.3)
parallel (~> 1.10)
parser (>= 3.1.0.0)
@@ -585,10 +589,10 @@ GEM
semantic_range (3.0.0)
shoulda-matchers (5.1.0)
activesupport (>= 5.2.0)
sidekiq (6.5.1)
sidekiq (6.5.4)
connection_pool (>= 2.2.2)
rack (~> 2.0)
redis (>= 4.2.0)
redis (>= 4.5.0)
sidekiq-scheduler (4.0.2)
redis (>= 4.2.0)
rufus-scheduler (~> 3.2)
@@ -622,7 +626,7 @@ 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.9)
test-unit (3.5.3)
@@ -658,7 +662,7 @@ GEM
nokogiri (~> 1.6)
rubyzip (>= 1.3.0)
selenium-webdriver (~> 4.0)
webmock (3.15.0)
webmock (3.17.1)
addressable (>= 2.8.0)
crack (>= 0.3.2)
hashdiff (>= 0.4.0, < 2.0.0)
@@ -700,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
@@ -717,6 +719,7 @@ DEPENDENCIES
database_cleaner
db2fog!
ddtrace
debug (>= 1.0.0)
debugger-linecache
devise
devise-encryptable
@@ -766,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

View File

@@ -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)

View File

@@ -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

View File

@@ -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" } }

View File

@@ -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];
}
}

View File

@@ -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!");
}
}

View File

@@ -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();
}
}

View File

@@ -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;
}
}

View File

@@ -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();
}
}
}

View File

@@ -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();
}
}

View File

@@ -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);
}
}
}

View File

@@ -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";

View File

@@ -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";
}
}

View File

@@ -6,7 +6,7 @@ export default class extends Controller {
static targets = ["stripeelements", "select"];
connect() {
this.initSelectedCard()
this.initSelectedCard();
}
initSelectedCard() {

View File

@@ -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;
}
}

View File

@@ -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");
}
})
});
}
}

View File

@@ -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));

View File

@@ -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);

View File

@@ -553,6 +553,8 @@ de_DE:
guest_label: "Gasteinkauf"
credit_owed: "Geschuldetes Guthaben"
balance_due: "Offener Betrag"
destroy:
has_associated_subscriptions: "Löschen fehlgeschlagen: Dieser Kunde hat aktive Abonnements. Bitte kündigen Sie diese zuerst."
contents:
edit:
title: Inhalt

View File

@@ -4238,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:

View File

@@ -1873,7 +1873,7 @@ en_CA:
email_signup_welcome: "Welcome to %{sitename}!"
email_signup_confirmed_email: "Thanks for confirming your email."
email_signup_shop_html: "You can now log in at %{link}."
email_signup_text: "Thanks for joining the network. If you are a customer, we look forward to introducing you to many fantastic growers, artisans and makers, and wonderful hubs and marketplaces. If you are a grower, artisan or maker we are excited to have you as a part of the network."
email_signup_text: "Thanks for joining the network. If you are a customer, we look forward to introducing you to many fantastic growers, artisans and makers, and wonderful hubs and marketplaces. If you are a grower, artisan or maker please be sure to follow this link (https://openfoodnetwork.ca/register) to set up your online store - we are excited to have you as a part of the network!"
email_signup_help_html: "We welcome all your questions and feedback; you can use the <em>Send Feedback</em> button on the site or email us at %{email}"
invite_email:
greeting: "Hello!"

View File

@@ -553,6 +553,8 @@ en_FR:
guest_label: "Guest checkout"
credit_owed: "Credit Owed"
balance_due: "Balance Due"
destroy:
has_associated_subscriptions: "Delete failed: This customer has active subscriptions. Cancel them first."
contents:
edit:
title: Content

View File

@@ -553,6 +553,8 @@ es_CR:
guest_label: "Retirar como invitado"
credit_owed: "Crédito adeudado"
balance_due: "Saldo adeudado"
destroy:
has_associated_subscriptions: "Error al eliminar: este cliente tiene suscripciones activas. Cancelarlos primero."
contents:
edit:
title: Contenido
@@ -1953,10 +1955,14 @@ es_CR:
products_results_for: "Resultados para"
products_or: "o"
products_and: "y"
products_filters_in: "en"
products_with: con
products_search: "Buscar..."
products_filter_by: "Fitrar por"
products_filter_selected: "seleccionado"
products_filter_heading: "Filtros"
products_filter_clear: "Limpiar"
products_filter_done: "Terminado"
products_loading: "Cargando productos..."
products_updating_cart: "Actualizando su carrito..."
products_cart_empty: "Carrito vacío"
@@ -1967,6 +1973,8 @@ es_CR:
products_update_error_msg: "No se ha podido guardar."
products_update_error_data: "Error al guardar datos no válidos:"
products_changes_saved: "Cambios guardados."
products_no_results_html: "Lo sentimos, no se han encontrado resultados para %{query}"
products_clear_search: "Borrar búsqueda"
search_no_results_html: "Lo sentimos, no hay resultados para %{query}. ¿Por qué no intenta otra búsqueda?"
components_profiles_popover: "Los perfiles no tienen una tienda en Open Food Network (LaFeriaCR), pero pueden tener su propia tienda física o en línea en otro lugar"
components_profiles_show: "Mostrar perfiles"
@@ -2086,6 +2094,7 @@ es_CR:
orders_could_not_cancel: "Lo sentimos, no se pudo cancelar el pedido"
orders_cannot_remove_the_final_item: "No se puede quitar el último artículo de un pedido, en su lugar, por favor cancele el pedido."
orders_bought_items_notice:
one: "Ya se ha confirmado un artículo adicional para este ciclo de pedido"
few: "%{count} artículos adicionales ya confirmados para este ciclo de pedido"
many: "%{count} artículos adicionales ya confirmados para este ciclo de pedido"
other: "%{count} artículos adicionales ya confirmados para este ciclo de pedido"
@@ -2109,6 +2118,7 @@ es_CR:
remember_me: Recordarme
are_you_sure: "¿Está seguro?"
orders_open: "Pedidos abiertos"
closing: "Cerrando"
going_back_to_home_page: "Le estamos llevando de vuelta a la página de inicio"
creating: Creando
updating: Actualizando
@@ -2176,6 +2186,7 @@ es_CR:
details:
title: "Detalles"
headline: "Empecemos"
enterprise: "¡Guau! Primero necesitamos saber un poco sobre su empresa:"
producer: "Primero necesitamos saber un poco sobre tu productora:"
enterprise_name_field: "Nombre de la organización:"
producer_name_field: "Nombre de la productora:"
@@ -2195,6 +2206,11 @@ es_CR:
state_field_error: "Región requerida"
country_field: "País:"
country_field_error: "Por favor selecciona un país"
map_location: "Ubicación del mapa"
locate_address: "Ubicar la dirección en el mapa"
drag_pin: "Arrastre y suelte el pin en la ubicación correcta si no es preciso."
confirm_address: "Confirmo que la posición indicada de la empresa en el mapa es correcta."
drag_map_marker: "Debido a que muchos productores operan en áreas rurales, la precisión de los mapas siempre se mejora. Ayúdanos a comprender mejor dónde te encuentras interactuando con el mapa de arriba para mover el pin haciendo clic o tocando para sostener el pin y luego arrastrándolo a la ubicación que sea más precisa según tu conocimiento."
contact:
title: "Contacto"
who_is_managing_enterprise: "¿Quién es responsable de administrar %{enterprise}?"
@@ -2205,6 +2221,7 @@ es_CR:
whatsapp_phone_field: "Número de teléfono de WhatsApp"
whatsapp_phone_tooltip: "Este número se mostrará en su perfil público para abrirlo como un enlace de WhatsApp."
phone_field_placeholder: "p.ej. 93 250 16 45"
whatsapp_phone_field_placeholder: "ej. +61 4 1234 5678"
type:
title: "Tipo"
headline: "Último paso para añadir %{enterprise}!"
@@ -2299,6 +2316,8 @@ es_CR:
fundraising_fee: "Cuota para recaudación de fondos"
price_graph: "Gráfico de precios"
included_tax: "Impuesto incluido"
tax: "Impuesto"
tax_amount_included: "%{amount}(incluído)"
balance: "Saldo"
transaction: "Transacción"
transaction_date: "Fecha"
@@ -2352,6 +2371,7 @@ es_CR:
supplier: "Proveedora"
product_name: "nombre del producto"
product_description: "Descripción del producto"
permalink: "Enlace permanente"
shipping_categories: "Categorías de envío"
units: "Unidad de medida"
coordinator: "Coordinadora"
@@ -2368,6 +2388,8 @@ es_CR:
calculator: "Calculadora"
calculator_values: "Calculadora de valores"
calculator_settings_warning: "Si está cambiando el tipo de calculadora, debe de salvar primero antes de editar las configuraciones de la calculadora"
calculator_preferred_unit_error: "debe ser kg o lb"
calculator_preferred_value_error: "Entrada inválida. Utilice solo números. Por ejemplo: 10, 5.5, -20"
flat_percent_per_item: "Porcentaje fijo (por artículo)"
flat_rate_per_item: "Tarifa plana (por artículo)"
flat_rate_per_order: "Tarifa plana (por pedido)"
@@ -2375,6 +2397,7 @@ es_CR:
price_sack: "Precio saco"
new_order_cycles: "Nuevos Ciclos de Pedidos"
new_order_cycle: "Nuevo Ciclo de Pedido"
new_order_cycle_tooltip: "Tienda abierta por un período de tiempo determinado"
select_a_coordinator_for_your_order_cycle: "Selecciona un coordinador para vuestro ciclo de pedido"
notify_producers: 'Notificar a las productoras'
edit_order_cycle: "Editar Ciclo de Pedido"
@@ -2430,6 +2453,7 @@ es_CR:
spree_classification_primary_taxon_error: "La clasificación %{taxon} es la clasificación primaria de %{product} y no puede ser eliminada"
spree_order_availability_error: "El Distribuidor o el Ciclo de Pedido no pueden suministrar los productos en su carrito"
spree_order_populator_error: "Este Distribuidor o Ciclo de Pedido no puede suministrar todos los productos en tu carrito. Por favor, elige otro."
spree_order_cycle_error: "Elija un ciclo de pedido para este pedido."
spree_order_populator_availability_error: "Este producto no está disponible por el distribuidor o Ciclo de Pedido elegido."
spree_distributors_error: "Se debe seleccionar al menos un Grupo"
spree_user_enterprise_limit_error: "^ %{email} no está autorizado a tener más organizaciones (el límite es %{enterprise_limit})."
@@ -2451,6 +2475,7 @@ es_CR:
remove_tax: "Eliminar impuesto"
first_name_begins_with: "El nombre comienza con"
last_name_begins_with: "El apellido comienza con"
shipping_method: "Método de envío"
new_order: "Nuevo pedido"
enterprise_tos_link: "Enlace a los Términos del Servicio de la Organización"
enterprise_tos_message: "Queremos trabajar con personas que compartan nuestros objetivos y valores. Por ello, pedimos a las nuevas organizaciones que acepten"
@@ -2469,6 +2494,7 @@ es_CR:
hub_sidebar_at_least: "Al menos un grupo debe ser seleccionado"
hub_sidebar_blue: "azul"
hub_sidebar_red: "rojo"
order_cycles_closed_for_hub: "El centro que ha seleccionado está temporalmente cerrado para pedidos. Por favor, inténtelo de nuevo más tarde."
report_customers_distributor: "Distribuidor"
report_customers_supplier: "Proveedora"
report_customers_cycle: "Ciclo de Pedido"
@@ -2484,12 +2510,16 @@ es_CR:
report_payment_totals: 'Pagos Totales'
report_all: 'Todo'
report_order_cycle: "Ciclo de Pedido"
report_hide_columns: Columnas para ocultar
report_columns: Columnas
report_enterprises: "Organizaciones"
report_enterprise_fee: "Nombres de las comisiones"
report_users: "Usuarios"
report_tax_rates: Porcentajes de los Impuestos
report_tax_types: Tipos de Impuestos
report_filters: Filtros de informe
report_print: Informe de impresión
report_render_options: Opciones de renderizado 
report_header_order_cycle: Ciclo de Pedido
report_header_user: Usuario
report_header_email: Correo electrónico
@@ -2624,6 +2654,11 @@ es_CR:
report_header_transaction_fee: Comisión por transacción (sin impuestos)
report_header_total_untaxable_admin: Total de ajustes administrativos no tributables (sin impuestos)
report_header_total_taxable_admin: Total de ajustes tributarios de administración (impuestos incluidos)
report_xero_configuration: Configuración Xero
initial_invoice_number: "Número de factura inicial"
invoice_date: "Fecha de la factura"
due_date: "Fecha de vencimiento"
account_code: "Código de cuenta"
equals: "Iguales"
contains: "Contiene"
discount: "Descuento"
@@ -2657,6 +2692,8 @@ es_CR:
payment_processing_failed: "No se pudo procesar el pago, por favor verifique los detalles que introdujo"
payment_method_not_supported: "Ese método de pago no está soportado. Por favor elije otro."
payment_updated: "Pago actualizado"
cannot_perform_operation: "No se pudo actualizar el pago"
action_required: "Acción requerida"
inventory_settings: "Configuración del Inventario"
tag_rules: "Reglas de las Etiquetas"
shop_preferences: "Configuración de la tienda"
@@ -2672,6 +2709,7 @@ es_CR:
enterprise_name_error: "ya está en uso. Si esta es su organización y le gustaría reclamar la propiedad, o si desea negociar con esta organización, comuníquese con el gestor actual de este perfil al %{email}."
enterprise_owner_error: "^ %{email} no está autorizado a tener más organizaciones (el límite es %{enterprise_limit})."
enterprise_role_uniqueness_error: "^Este rol ya está presente."
enterprise_terms_and_conditions_type_error: "Solo se permiten archivos PDF"
inventory_item_visibility_error: Debe ser verdadero o falso
product_importer_file_error: "error: no se ha subido ningún archivo"
product_importer_spreadsheet_error: "No se pudo procesar el archivo: tipo de archivo inválido"
@@ -2703,6 +2741,7 @@ es_CR:
order_cycles_email_to_producers_notice: 'Los correos electrónicos que se enviarán a las productoras se han puesto en cola para enviarlos.'
order_cycles_no_permission_to_coordinate_error: "Ninguna de tus organizaciones tiene permiso para coordinar un ciclo de pedido"
order_cycles_no_permission_to_create_error: "No tienes permiso para crear un ciclo de pedido coordinado por esta empresa."
order_cycle_closed: "El ciclo de pedido que ha seleccionado acaba de cerrarse. ¡Inténtalo de nuevo!"
back_to_orders_list: "Volver a la lista de pedidos"
no_orders_found: "No se encontraron pedidos"
order_information: "información del pedido"
@@ -2716,6 +2755,7 @@ es_CR:
js:
saving: 'Guardando...'
changes_saved: 'Cambios guardados.'
authorising: "Autorizando..."
save_changes_first: Guarda los cambios primero.
all_changes_saved: Todos los cambios guardados
unsaved_changes: Tiene cambios sin guardar
@@ -2731,8 +2771,15 @@ es_CR:
resolve_errors: Resuelve los siguientes errores
more_items: "+ %{count} Más"
default_card_updated: Tarjeta predeterminada actualizada
default_card_voids_auth: Cambiar su tarjeta predeterminada eliminará las autorizaciones existentes de las tiendas para cargarla. Puede volver a autorizar tiendas después de actualizar la tarjeta predeterminada. ¿Desea cambiar la tarjeta predeterminada?
cart:
add_to_cart_failed: >
Hubo un problema al agregar este producto al carrito. Tal vez ya no esté
disponible o la tienda esté cerrando.
admin:
unit_price_tooltip: "El precio unitario aumenta la transparencia al permitir que sus clientes comparen fácilmente los precios entre diferentes productos y tamaños de empaque. Tenga en cuenta que el precio unitario final que se muestra en la tienda puede diferir, ya que incluye impuestos y tarifas."
enterprise_limit_reached: "Has alcanzado el límite estándar de organizaciones por cuenta. Escriba a %{contact_email} si necesita aumentarlo."
deleting_item_will_cancel_order: "Esta operación dará como resultado uno o más pedidos vacíos, que serán cancelados. ¿Desea continuar?"
modals:
got_it: "Lo entiendo"
close: "Cerrar"
@@ -2757,6 +2804,16 @@ es_CR:
Al crear reglas relacionadas con una etiqueta de cliente específica,
puede anular el comportamiento predeterminado (ya sea para mostrar u
ocultar elementos) a cliente con dicha etiqueta.
terms_and_conditions_info:
title: "Términos y condiciones de carga"
message_1: "Los términos y condiciones son el contrato entre usted, el vendedor y el comprador. Si carga un archivo aquí, los compradores deben aceptar sus Términos y condiciones para completar el pago. Para el comprador, esto aparecerá como una casilla de verificación al finalizar la compra que debe marcarse para continuar con la compra. Le recomendamos encarecidamente que cargue los Términos y condiciones de acuerdo con la legislación nacional."
message_2: "Los compradores solo deberán aceptar los Términos y condiciones una vez. Sin embargo, si cambia sus Términos y condiciones, los compradores deberán aceptarlos nuevamente antes de poder pagar."
terms_and_conditions_warning:
title: "Términos y condiciones de carga"
message_1: "Todos sus compradores tendrán que aceptarlos una vez al finalizar la compra. Si actualiza el archivo, todos sus compradores deberán volver a aceptarlos al finalizar la compra."
message_2: "Para los compradores con suscripciones, debe enviarles por correo electrónico los Términos y condiciones (o los cambios en ellos) por ahora, nada les notificará sobre estos nuevos Términos y condiciones."
business_address_info:
message: "El nombre legal de la empresa, la dirección legal y el número de teléfono legal se utilizan para las empresas que facturan a una entidad legal registrada con detalles diferentes a su información comercial pública. Estos datos SÓLO se utilizarán en las facturas. Si estos detalles están en blanco, su nombre público, dirección y número de teléfono se utilizarán en las facturas."
panels:
save: GUARDAR
saved: GUARDADO
@@ -2911,9 +2968,16 @@ es_CR:
failed: "fallido"
paid: "pagado"
pending: "pendiente"
requires_authorization: "Autorización requerida"
processing: "procesando"
void: "vacío"
invalid: "inválido"
quantity_adjusted: "Stock insuficiente disponible. Elemento de línea actualizado a la cantidad máxima disponible."
quantity_unchanged: "Cantidad sin cambios desde la cantidad anterior."
cancel_the_order_html: "Esto cancelará el pedido actual. <br />¿Está seguro de que desea continuar?"
cancel_the_order_send_cancelation_email: "Enviar un correo electrónico de cancelación al cliente"
restock_item: "Reabastecer artículos: devolver este artículo al stock"
restock_items: "Reabastecer artículos: devolver todos los artículos al inventario"
resend_user_email_confirmation:
resend: "Reenviar"
sending: "Reenviar..."
@@ -2951,6 +3015,8 @@ es_CR:
immediate_logo_removal_warning: "El logotipo se eliminará inmediatamente después de confirmar."
removed_promo_image_successfully: "Imágen promocional eliminada con éxito"
immediate_promo_image_removal_warning: "La imágen promocional se eliminará inmediatamente después de confirmar."
immediate_terms_and_conditions_removal_warning: "El archivo de Términos y condiciones se eliminará inmediatamente después de su confirmación."
removed_terms_and_conditions_successfully: "El archivo de términos y condiciones se eliminó con éxito"
insufficient_stock: "Inventario insuficiente disponible, solo quedan %{on_hand}"
out_of_stock:
reduced_stock_available: Inventario reducido disponible
@@ -2962,8 +3028,14 @@ es_CR:
shopfront:
variant:
add_to_cart: "Añadir"
in_cart: "en el carrito"
quantity_in_cart: "%{quantity} en el carrito"
remaining_in_stock: "Solo queda %{quantity}"
bulk_buy_modal:
min_quantity: "Cantidad min"
max_quantity: "Cantidad máxima"
price_breakdown: "Caída de precios"
unit_price_tooltip: "Este es el precio unitario de este producto. Le permite comparar el precio de los productos independientemente de los tamaños y pesos de los envases."
variants:
on_demand:
'yes': "Bajo demanda"
@@ -3029,6 +3101,11 @@ es_CR:
signup_or_login: "Empieza registrándose (o iniciando sesión)"
have_an_account: "¿Ya tiene una cuenta?"
action_login: "Inicie sesión ahora."
stripe_elements:
unknown_error_from_stripe: |
Hubo un problema al configurar su tarjeta en nuestra pasarela de pagos.
Actualice la página y vuelva a intentarlo, si falla por segunda vez,
por favor contáctenos para soporte.
inflections:
each:
one: "each"
@@ -3131,6 +3208,12 @@ es_CR:
start_free_profile: "¡Empieze con un perfil gratuito, y amplíelo cuando esté preparado!"
order_management:
reports:
bulk_coop:
filters:
bulk_coop_allocation: "Asignación cooperativa masiva"
bulk_coop_customer_payments: "Pagos masivos de clientes cooperativos"
bulk_coop_packing_sheets: "Hojas de embalaje cooperativas a granel"
bulk_coop_supplier_report: "Informe de proveedores cooperativos a granel"
enterprise_fee_summaries:
filters:
date_range: "Rango de fechas"
@@ -3186,6 +3269,7 @@ es_CR:
payments: "Pagos"
return_authorizations: "Autorizaciones de devolución"
credit_owed: "Crédito adeudado"
new_adjustment: "Nuevo ajuste"
payment: "Pago"
payment_method: "Método de pago"
shipment: "Envío"
@@ -3210,13 +3294,40 @@ es_CR:
previous: "Anterior"
last: "Último"
spree:
add_country: "Agregar país"
add_state: "Agregar estado"
adjustment: "Ajuste"
all: "Todos"
associated_adjustment_closed: "Ajuste asociado cerrado"
back_to_adjustments_list: "volver a los ajustes"
back_to_users_list: "Volver a usuarios"
back_to_zones_list: "Volver a zonas"
card_code: "Código de tarjeta"
card_number: "Número de tarjeta"
category: "Categoría"
created_successfully: "Creado exitosamente"
credit: "Crédito"
editing_tax_category: "Edición de categoría de impuestos"
editing_tax_rate: "Edición de la tasa de impuestos"
editing_zone: "Zona de edición"
expiration: "Expiración"
invalid_payment_provider: "Proveedor de pago no válido"
items_cannot_be_shipped: "Los artículos no se pueden enviar"
gateway_config_unavailable: "Configuración de puerta de enlace no disponible"
gateway_error: "Pago fallido"
more: "Más"
new_adjustment: "Nuevo ajuste"
new_order_completed: "Nuevo pedido completado"
new_tax_category: "Nueva categoría de impuestos"
new_taxon: "Nuevo taxon"
new_user: "Nuevo usuari"
no_pending_payments: "No tiene pagos pendientes"
none: "Ninguno"
not_found: "No encontrado"
notice_messages:
variant_deleted: "Variante eliminada"
payment_method_not_supported: "Método de pago no admitido"
resend_authorization_email: "Reenviar correo electrónico de autorización"
updating: "Actualizando"
your_order_is_empty_add_product: "Su pedido está vacío, busque y añada un producto arriba"
add_product: "Añadir Producto"
@@ -3397,6 +3508,7 @@ es_CR:
header:
store: Tienda
admin:
unit_price_tooltip: "El precio unitario aumenta la transparencia al permitir que sus clientes comparen fácilmente los precios entre diferentes productos y tamaños de empaque. Tenga en cuenta que el precio unitario final que se muestra en la tienda puede diferir, ya que incluye impuestos y tarifas."
subscriptions:
number: "Número"
tab:
@@ -3750,6 +3862,7 @@ es_CR:
paid: pagado
pending: pendiente
processing: procesando
requires_authorization: "Autorización requerida"
void: vacío
invalid: inválido
order_mailer:

View File

@@ -553,6 +553,8 @@ fr:
guest_label: "Commande en mode invité"
credit_owed: "Crédit dû"
balance_due: "Solde dû"
destroy:
has_associated_subscriptions: "La suppression a planté : cet acheteur a des abonnements actifs. Veuillez d'abord les annuler."
contents:
edit:
title: Contenu
@@ -885,10 +887,10 @@ fr:
sells: Produits vendus
sells_tip: "Aucun - l'entreprise ne vend pas en direct aux acheteurs.<br />Les miens - l'entreprise vend ses propres produits aux acheteurs.<br />Tous - l'entreprise vend ses propres produits et/ou les produits d'autres entreprises.<br />"
visible_in_search: Apparaît sur la plateforme?
visible_in_search_tip: "Les boutiques peuvent être <br /> 1. Visibles publiquement, sur la carte de CoopCircuits et la liste des boutiques. <br /> 2. Invisibles sur la carte et la liste des boutiques, mais référencées sur les profils des boutiques et producteurs de leur réseau. <br /> 3. Complètement invisible (sauf si on dispose du lien)."
visible_in_search_tip: "Les boutiques peuvent être <br /> 1. Visibles publiquement, sur la carte de CoopCircuits, la liste des boutiques et les profils boutiques et producteurs. <br /> 2. Invisibles sur la carte et la liste des boutiques, mais référencées sur les profils des boutiques et producteurs de leur réseau. <br /> 3. Complètement invisible (sauf si on dispose du lien)."
visible: Visible par tous
not_visible: Invisible
hidden: Masquer toutes les références
not_visible: Cachée
hidden: Invisible
permalink: Nom pour URL (sans espace)
permalink_tip: "Ce nom permanent est utilisé pour créer l'url de votre boutique: %{link}ma-boutique/shop"
link_to_front: Lien URL de la boutique
@@ -1108,9 +1110,9 @@ fr:
incoming: "2. Produits entrants"
outgoing: "3. Produits vendus (sortants)"
exchange_form:
pickup_time_tip: Quand des commandes liées à ce cycle de vente seront prêtes à être soumises à l'acheteur
pickup_time_tip: 'Indiquez quand les commandes seront prêtes. Ce texte sera affiché sur votre boutique dans l''encart bleu "Prêt pour : _______"'
pickup_instructions_placeholder: "Modalités de retrait/livraison"
pickup_instructions_tip: Ces instructions sont affichées aux acheteurs après passage d'une commande
pickup_instructions_tip: Ces instructions sont affichées aux acheteurs sur leur confirmation de commande
pickup_time_placeholder: "Prêt pour (ex : jour + créneau horaire)"
receival_instructions_placeholder: "Modalités de livraison"
add_fee: 'Ajouter une commission'
@@ -1283,8 +1285,8 @@ fr:
on_screen: "A l'écran"
spreadsheet: "Tableur (Excel, LibreOffice,...)"
display: Afficher
summary_row: Ligne TOTAL
header_row: Ligne titre
summary_row: Ligne total produits commandés
header_row: Ligne d'en-tête (nom client·e)
raw_data: Données brutes
formatted_data: Données formatées
packing:
@@ -3056,7 +3058,7 @@ fr:
min_quantity: "Quantité min"
max_quantity: "Quantité max"
price_breakdown: "Détail du prix"
unit_price_tooltip: "Il s'agit du prix unitaire de ce produit. Il permet à l'acheteur de comparer les prix quelque soit le conditionnement final du produit."
unit_price_tooltip: "Il s'agit du prix unitaire de ce produit. Il permet à l'acheteur de comparer les prix quel que soit le conditionnement final du produit."
variants:
on_demand:
'yes': "A volonté"

4205
config/locales/uk.yml Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -6,7 +6,9 @@
"url": "https://github.com/openfoodfoundation/openfoodnetwork"
},
"scripts": {
"storybook": "start-storybook"
"storybook": "start-storybook",
"prepare": "husky install",
"pretty-quick": "pretty-quick"
},
"jest": {
"testRegex": [
@@ -20,12 +22,15 @@
"@storybook/addon-controls": "^6.4.13",
"@storybook/addon-docs": "^6.4.13",
"@storybook/server": "^6.4.13",
"husky": "^8.0.0",
"jasmine-core": "~2.4.1",
"jest": "^27.4.7",
"karma": "~6.3.11",
"karma-chrome-launcher": "~3.1.0",
"karma-coffee-preprocessor": "~1.0.1",
"karma-jasmine": "~0.3.8",
"prettier": "2.7.1",
"pretty-quick": "^3.1.3",
"webpack-dev-server": "~3"
},
"license": "AGPL-3.0",

View File

@@ -213,6 +213,17 @@ describe Spree::CreditCardsController, type: :controller do
expect(customer1.reload.allow_charges).to be false
expect(customer2.reload.allow_charges).to be false
end
context "when has any other saved cards" do
let!(:second_card) {
create(:stored_credit_card, user_id: user.id, gateway_customer_profile_id: 'cus_AZNMJ')
}
it "should assign the second one as the default one" do
spree_delete :destroy, params
expect(Spree::CreditCard.find_by(id: second_card.id).is_default).to eq true
end
end
end
end
end

View File

@@ -182,6 +182,7 @@ FactoryBot.define do
product_price { 0 }
tax_rate_amount { 0 }
tax_rate_name { "" }
included_in_price { "" }
zone { create(:zone_with_member) }
end
@@ -193,7 +194,8 @@ FactoryBot.define do
product = FactoryBot.create(:taxed_product, zone: proxy.zone,
price: proxy.product_price,
tax_rate_amount: proxy.tax_rate_amount,
tax_rate_name: proxy.tax_rate_name)
tax_rate_name: proxy.tax_rate_name,
included_in_price: proxy.included_in_price)
FactoryBot.create(:line_item, order: order, product: product, price: product.price)
order.reload
end

View File

@@ -67,6 +67,7 @@ FactoryBot.define do
transient do
tax_rate_amount { 0 }
tax_rate_name { "" }
included_in_price { "" }
zone { nil }
end
@@ -77,7 +78,7 @@ FactoryBot.define do
create(:tax_rate, amount: proxy.tax_rate_amount,
tax_category: product.tax_category,
included_in_price: true,
included_in_price: proxy.included_in_price,
calculator: Calculator::DefaultTax.new,
zone: proxy.zone,
name: proxy.tax_rate_name)

View File

@@ -11,7 +11,10 @@ describe '
let(:user) { create(:user) }
let(:product) { create(:simple_product) }
let(:distributor) { create(:distributor_enterprise, owner: user, charges_sales_tax: true) }
let(:distributor) {
create(:distributor_enterprise, owner: user, with_payment_and_shipping: true,
charges_sales_tax: true)
}
let(:order_cycle) do
create(:simple_order_cycle, name: 'One', distributors: [distributor],
variants: [product.variants.first])
@@ -120,6 +123,261 @@ describe '
it_behaves_like "Check display on each invoice: legacy and alternative", false
it_behaves_like "Check display on each invoice: legacy and alternative", true
describe "an order with taxes" do
let(:user1) { create(:user, enterprises: [distributor]) }
let!(:zone) { create(:zone_with_member) }
let(:address) { create(:address) }
context "included" do
let(:shipping_tax_rate_included) {
create(:tax_rate, amount: 0.20, included_in_price: true, zone: zone)
}
let(:shipping_tax_category) { create(:tax_category, tax_rates: [shipping_tax_rate_included]) }
let!(:shipping_method) {
create(:shipping_method_with, :expensive_name, distributors: [distributor],
tax_category: shipping_tax_category)
}
let(:enterprise_fee) {
create(:enterprise_fee, enterprise: user1.enterprises.first,
tax_category: product2.tax_category,
calculator: Calculator::FlatRate.new(preferred_amount: 120.0))
}
let(:order_cycle) {
create(:simple_order_cycle, coordinator: distributor,
coordinator_fees: [enterprise_fee], distributors: [distributor],
variants: [product1.variants.first, product2.variants.first])
}
let(:order1) {
create(:order, order_cycle: order_cycle, distributor: user1.enterprises.first,
ship_address: address, bill_address: address)
}
let(:product1) {
create(:taxed_product, zone: zone, price: 12.54, tax_rate_amount: 0,
included_in_price: true)
}
let(:product2) {
create(:taxed_product, zone: zone, price: 500.15, tax_rate_amount: 0.2,
included_in_price: true)
}
let!(:line_item1) {
create(:line_item, variant: product1.variants.first, price: 12.54, quantity: 1,
order: order1)
}
let!(:line_item2) {
create(:line_item, variant: product2.variants.first, price: 500.15, quantity: 3,
order: order1)
}
before do
order1.reload
while !order1.delivery?
break if !order1.next!
end
order1.select_shipping_method(shipping_method.id)
order1.recreate_all_fees!
while !order1.payment?
break if !order1.next!
end
create(:payment, state: "checkout", order: order1, amount: order1.reload.total,
payment_method: create(:payment_method, distributors: [distributor]))
while !order1.complete?
break if !order1.next!
end
end
context "legacy invoice" do
before do
allow(Spree::Config).to receive(:invoice_style2?).and_return(false)
login_as_admin_and_visit spree.print_admin_order_path(order1)
convert_pdf_to_page
end
it "displays $0.0 when a line item has no tax" do
pending "i) for legend see picture on PR #9495"
# first line item, no tax
expect(page).to have_content "#{Spree::Product.first.name} (1g) 1 $0.0 $12.54"
end
it "displays GST for enterprise fees" do
pending "ii) for legend see picture on PR #9495"
# enterprise fee of $20.00
expect(page).to have_content "Admin & Handling 1 $20.00 $120.00"
end
it "displays the taxes correctly" do
# header
expect(page).to have_content "Item Qty GST Price"
# second line item, included tax
expect(page).to have_content "#{Spree::Product.second.name} (1g) 3 $250.08 $1,500.45"
# Enterprise fee
expect(page).to have_content "Admin & Handling 1 $120.00"
# Shipping
expect(page).to have_content "Shipping 1 $16.76 (included) $100.55"
# Order Totals
expect(page).to have_content "GST Total: $286.84"
expect(page).to have_content "Total (Excl. tax): $1,446.70"
expect(page).to have_content "Total (Incl. tax): $1,733.54"
end
end
context "alternative invoice" do
before do
allow(Spree::Config).to receive(:invoice_style2?).and_return(true)
login_as_admin_and_visit spree.print_admin_order_path(order1)
convert_pdf_to_page
end
it "displays the taxes correctly" do
# header
expect(page).to have_content "Item Qty Unit price (Incl. tax)"
expect(page).to have_content "Total price (Incl. taTax rate"
# first line item, no tax
expect(page).to have_content Spree::Product.first.name.to_s
expect(page).to have_content "1 $12.54 $12.54 0.0% (1g)"
# second line item, included tax
expect(page).to have_content Spree::Product.second.name.to_s
expect(page).to have_content "3 $500.15 $1,500.45 20.0% (1g)"
# Enterprise fee
expect(page).to have_content "Admin & Handling $120.00"
# Shipping
expect(page).to have_content "Shipping $100.55 20.0%"
# Order Totals
expect(page).to have_content "Total (Incl. tax): $1,733.54"
expect(page).to have_content "Total tax (20.0%): $270.08"
expect(page).to have_content "Total (Excl. tax): $1,446.70"
end
end
end
context "added" do
let(:shipping_tax_rate_added) {
create(:tax_rate, amount: 0.20, included_in_price: false, zone: zone)
}
let(:shipping_tax_category) { create(:tax_category, tax_rates: [shipping_tax_rate_added]) }
let!(:shipping_method) {
create(:shipping_method_with, :expensive_name, distributors: [distributor],
tax_category: shipping_tax_category)
}
let(:enterprise_fee) {
create(:enterprise_fee, enterprise: user1.enterprises.first,
tax_category: product4.tax_category,
calculator: Calculator::FlatRate.new(preferred_amount: 120.0))
}
let(:order_cycle2) {
create(:simple_order_cycle, coordinator: distributor,
coordinator_fees: [enterprise_fee], distributors: [distributor],
variants: [product3.variants.first, product4.variants.first])
}
let(:order2) {
create(:order, order_cycle: order_cycle2, distributor: user1.enterprises.first,
ship_address: address, bill_address: address)
}
let(:product3) {
create(:taxed_product, zone: zone, price: 12.54, tax_rate_amount: 0,
included_in_price: false)
}
let(:product4) {
create(:taxed_product, zone: zone, price: 500.15, tax_rate_amount: 0.2,
included_in_price: false)
}
let!(:line_item3) {
create(:line_item, variant: product3.variants.first, price: 12.54, quantity: 1,
order: order2)
}
let!(:line_item4) {
create(:line_item, variant: product4.variants.first, price: 500.15, quantity: 3,
order: order2)
}
before do
order2.reload
while !order2.delivery?
break if !order2.next!
end
order2.select_shipping_method(shipping_method.id)
order2.recreate_all_fees!
while !order2.payment?
break if !order2.next!
end
create(:payment, state: "checkout", order: order2, amount: order2.reload.total,
payment_method: create(:payment_method, distributors: [distributor]))
while !order2.complete?
break if !order2.next!
end
end
context "legacy invoice" do
before do
allow(Spree::Config).to receive(:invoice_style2?).and_return(false)
login_as_admin_and_visit spree.print_admin_order_path(order2)
convert_pdf_to_page
end
it "displays $0.0 when a line item has no tax" do
pending "iii) for legend see picture on PR #9495"
# first line item, no tax - display $0.0
expect(page).to have_content "#{Spree::Product.first.name} (1g) 1 $0.0 $12.54"
end
it "displays the added tax on the GST colum" do
pending "closing #7983, iv) for legend see picture on PR #9495"
# second line item, added tax of $300.09
expect(page).to have_content "#{Spree::Product.second.name} (1g) 3 $300.09 $1,500.45"
end
it "displays GST for enterprise fees" do
pending "v) for legend see picture on PR #9495"
# enterprise fee of $24.00
expect(page).to have_content "Admin & Handling 1 $20.00 $120.00"
end
it "displays the taxes correctly" do
# header
expect(page).to have_content "Item Qty GST Price"
# Enterprise fee
expect(page).to have_content "Admin & Handling 1 $120.00"
# Shipping
expect(page).to have_content "Shipping 1 $20.11 $100.55"
# Order Totals
expect(page).to have_content "GST Total: $344.20"
expect(page).to have_content "Total (Excl. tax): $1,733.54"
expect(page).to have_content "Total (Incl. tax): $2,077.74"
end
end
context "alternative invoice" do
before do
allow(Spree::Config).to receive(:invoice_style2?).and_return(true)
login_as_admin_and_visit spree.print_admin_order_path(order2)
convert_pdf_to_page
end
it "displays the taxes correctly" do
# header
expect(page).to have_content "Item Qty Unit price (Incl. tax)"
expect(page).to have_content "Total price (Incl. taTax rate"
# first line item, no tax
expect(page).to have_content "#{Spree::Product.first.name} 1 $12.54 $12.54 0.0% (1g)"
# second line item, included tax
expect(page).to have_content Spree::Product.second.name.to_s
expect(page).to have_content "3 $500.15 $1,500.45 20.0% (1g)"
# Enterprise fee
expect(page).to have_content "Admin & Handling $120.00"
# Shipping
expect(page).to have_content "Shipping $100.55 20.0%"
# Order Totals
expect(page).to have_content "Total (Incl. tax): $2,077.74"
expect(page).to have_content "Total tax (20.0%): $324.09"
expect(page).to have_content "Total (Excl. tax): $1,733.54"
end
end
end
end
end
def convert_pdf_to_page

View File

@@ -162,7 +162,7 @@ module StripeStubs
def list_customers_response_mock(options)
{ status: options[:code] || 200,
body: JSON.generate(has_more: false, data: [{ id: "cus_A456" }]) }
body: JSON.generate(object: "list", has_more: false, data: [{ id: "cus_A456" }]) }
end
def get_customer_payment_methods_response_mock(options)
@@ -170,7 +170,7 @@ module StripeStubs
fingerprint = options[:fingerprint] || "7890"
{ status: options[:code] || 200,
body: JSON.generate(
has_more: false, data: [{ id: payment_method, card: { fingerprint: fingerprint } }]
object: "list", has_more: false, data: [{ id: payment_method, card: { fingerprint: fingerprint } }]
) }
end

View File

@@ -424,7 +424,7 @@ describe '
end
let!(:order) do
create(:order_with_taxes, distributor: distributor1, ship_address: create(:address),
product_price: 110, tax_rate_amount: 0.1,
product_price: 110, tax_rate_amount: 0.1, included_in_price: true,
tax_rate_name: "Tax 1").tap do |order|
order.create_tax_charge!
order.update_shipping_fees!

View File

@@ -6,6 +6,13 @@ describe "Packing Reports" do
include AuthenticationHelper
include WebHelper
around do |example|
Timecop.freeze(Time.zone.now.strftime("%Y-%m-%d 00:00")) { example.run }
end
let!(:open_datetime) { (Time.zone.now - 1.month).strftime("%Y-%m-%d 00:00") }
let!(:close_datetime) { Time.zone.now.strftime("%Y-%m-%d 00:00") }
describe "Packing reports" do
before do
login_as_admin
@@ -33,8 +40,8 @@ describe "Packing Reports" do
let(:product2) { create(:simple_product, name: "Product 2", supplier: supplier) }
before do
Timecop.travel(Time.zone.local(2022, 4, 25, 14, 0, 0)) { order1.finalize! }
Timecop.travel(Time.zone.local(2022, 4, 25, 15, 0, 0)) { order2.finalize! }
order1.finalize!
order2.finalize!
create(:line_item_with_shipment, variant: variant1, quantity: 1, order: order1)
create(:line_item_with_shipment, variant: variant2, quantity: 3, order: order1)
@@ -45,11 +52,8 @@ describe "Packing Reports" do
it "displays the report" do
click_link "Pack By Customer"
find('#q_order_completed_at_gt').click
select_date_from_datepicker Time.zone.at(order1.completed_at - 1.day)
find('#q_order_completed_at_lt').click
select_date_from_datepicker Time.zone.at(order1.completed_at + 1.day)
# pre-fills with dates
check_prefilled_dates
click_button 'Go'
@@ -65,11 +69,9 @@ describe "Packing Reports" do
it "sorts alphabetically" do
click_link "Pack By Customer"
find('#q_order_completed_at_gt').click
select_date_from_datepicker Time.zone.at(order1.completed_at - 1.day)
# pre-fills with dates
check_prefilled_dates
find('#q_order_completed_at_lt').click
select_date_from_datepicker Time.zone.at(order1.completed_at + 1.day)
click_button 'Go'
rows = find("table.report__table").all("tr")
table = rows.map { |r| r.all("th,td").map { |c| c.text.strip }[3] }
@@ -87,11 +89,9 @@ describe "Packing Reports" do
describe "Pack By Supplier" do
it "displays the report" do
click_link "Pack By Supplier"
find('#q_order_completed_at_gt').click
select_date_from_datepicker Time.zone.at(order1.completed_at - 1.day)
find('#q_order_completed_at_lt').click
select_date_from_datepicker Time.zone.at(order1.completed_at + 1.day)
# pre-fills with dates
check_prefilled_dates
find(:css, "#display_summary_row").set(false) # does not include summary rows
@@ -122,28 +122,25 @@ describe "Packing Reports" do
before do
order.line_items << li1
order.line_items << li2
Timecop.travel(Time.zone.local(2022, 4, 25, 14, 0, 0)) { order.finalize! }
order.finalize!
login_as_admin
end
describe "viewing a report" do
describe "viewing the Pack by Product report" do
context "when an associated variant has been soft-deleted" do
it "shows line items" do
before do
li1.variant.delete
visit admin_reports_path
click_link "Pack By Product"
end
click_on I18n.t("admin.reports.packing.name")
it "shows line items" do
select oc.name, from: "q_order_cycle_id_in"
find('#q_order_completed_at_gt').click
select_date_from_datepicker Time.zone.at(order.completed_at - 1.day)
find('#q_order_completed_at_lt').click
select_date_from_datepicker Time.zone.at(order.completed_at + 1.day)
# pre-fills with dates
check_prefilled_dates
find("button[type='submit']").click
expect(page).to have_content li1.product.name
expect(page).to have_content li2.product.name
end
@@ -151,3 +148,10 @@ describe "Packing Reports" do
end
end
end
private
def check_prefilled_dates
expect(page).to have_input "q[order_completed_at_gt]", value: open_datetime, visible: false
expect(page).to have_input "q[order_completed_at_lt]", value: close_datetime, visible: false
end

View File

@@ -40,21 +40,21 @@ describe "Payments Reports" do
find("[type='submit']").click
expect(page.find("table.report__table thead tr").text).to have_content([
I18n.t(:report_header_payment_state),
I18n.t(:report_header_distributor),
I18n.t(:report_header_product_total_price, currency: currency_symbol),
I18n.t(:report_header_shipping_total_price, currency: currency_symbol),
I18n.t(:report_header_outstanding_balance_price, currency: currency_symbol),
I18n.t(:report_header_total_price, currency: currency_symbol)
"Payment State",
"Distributor",
"Product Total ($)",
"Shipping Total ($)",
"Outstanding Balance ($)",
"Total ($)"
].join(" ").upcase)
expect(page.find("table.report__table tbody tr").text).to have_content([
order.payment_state,
order.distributor.name,
with_currency(order.item_total.to_f + other_order.item_total.to_f),
with_currency(order.ship_total.to_f + other_order.ship_total.to_f),
with_currency(order.outstanding_balance.to_f + other_order.outstanding_balance.to_f),
with_currency(order.total.to_f + other_order.total.to_f)
order.item_total.to_f + other_order.item_total.to_f,
order.ship_total.to_f + other_order.ship_total.to_f,
order.outstanding_balance.to_f + other_order.outstanding_balance.to_f,
order.total.to_f + other_order.total.to_f
].compact.join(" "))
end
end
@@ -75,14 +75,14 @@ describe "Payments Reports" do
find("[type='submit']").click
expect(page.find("table.report__table thead tr").text).to have_content([
I18n.t(:report_header_payment_state),
I18n.t(:report_header_distributor),
I18n.t(:report_header_product_total_price, currency: currency_symbol),
I18n.t(:report_header_shipping_total_price, currency: currency_symbol),
I18n.t(:report_header_total_price, currency: currency_symbol),
I18n.t(:report_header_eft_price, currency: currency_symbol),
I18n.t(:report_header_paypal_price, currency: currency_symbol),
I18n.t(:report_header_outstanding_balance_price, currency: currency_symbol),
"Payment State",
"Distributor",
"Product Total ($)",
"Shipping Total ($)",
"Total ($)",
"EFT ($)",
"PayPal ($)",
"Outstanding Balance ($)"
].join(" ").upcase)
expect(page.find("table.report__table tbody tr").text).to have_content([

View File

@@ -208,8 +208,13 @@ describe '
create(:order, order_cycle: order_cycle, distributor: user1.enterprises.first,
ship_address: address, bill_address: address)
}
let(:product1) { create(:taxed_product, zone: zone, price: 12.54, tax_rate_amount: 0) }
let(:product2) { create(:taxed_product, zone: zone, price: 500.15, tax_rate_amount: 0.2) }
let(:product1) {
create(:taxed_product, zone: zone, price: 12.54, tax_rate_amount: 0, included_in_price: true)
}
let(:product2) {
create(:taxed_product, zone: zone, price: 500.15, tax_rate_amount: 0.2,
included_in_price: true)
}
let!(:line_item1) {
create(:line_item, variant: product1.variants.first, price: 12.54, quantity: 1, order: order1)

View File

@@ -105,5 +105,34 @@ describe "Credit Cards", js: true do
expect(page).to have_content I18n.t('js.changes_saved')
expect(customer.reload.allow_charges).to be true
end
it "assign the default card to the next one when the default is deleted" do
visit "/account"
find("a", text: /Credit Cards/i).click
within(".card#card#{default_card.id}") do
click_button "Delete"
end
expect(page).to have_content "Your card has been removed"
within ".card#card#{non_default_card.id}" do
expect(find_field('default_card')).to be_checked
end
expect(non_default_card.reload.is_default).to be true
end
context "when no default card" do
before do
default_card.destroy
end
it "then all 'allow_charges' inputs are disabled" do
visit "/account"
find("a", text: /Credit Cards/i).click
expect(find_field('allow_charges', disabled: true)).to be_truthy
end
end
end
end

View File

@@ -22,7 +22,7 @@ describe "full-page cart", js: true do
create(:enterprise_fee, amount: 11.00, tax_category: product_with_tax.tax_category)
}
let(:product_with_tax) {
create(:taxed_product, supplier: supplier, zone: zone, price: 110.00, tax_rate_amount: 0.1)
create(:taxed_product, supplier: supplier, zone: zone, price: 110.00, tax_rate_amount: 0.1, included_in_price: true)
}
let(:product_with_fee) {
create(:simple_product, supplier: supplier, price: 0.86, on_hand: 100)

View File

@@ -21,7 +21,7 @@ describe "As a consumer I want to check out my cart", js: true do
let(:fee_tax_rate) { create(:tax_rate, amount: 0.10, zone: zone, included_in_price: true) }
let(:fee_tax_category) { create(:tax_category, tax_rates: [fee_tax_rate]) }
let(:product) {
create(:taxed_product, supplier: supplier, price: 10, zone: zone, tax_rate_amount: 0.1)
create(:taxed_product, supplier: supplier, price: 10, zone: zone, tax_rate_amount: 0.1, included_in_price: true)
}
let(:variant) { product.variants.first }
let(:order) {

View File

@@ -2,6 +2,8 @@
require "capybara/cuprite"
headless = ActiveModel::Type::Boolean.new.cast(ENV.fetch("HEADLESS", true))
Capybara.register_driver(:cuprite) do |app|
Capybara::Cuprite::Driver.new(
app,
@@ -13,7 +15,7 @@ Capybara.register_driver(:cuprite) do |app|
# Don't load scripts from external sources, like google maps or stripe
url_whitelist: ["http://localhost", "http://0.0.0.0", "http://127.0.0.1"],
inspector: true,
headless: true,
headless: headless,
js_errors: true,
}
)

404
yarn.lock
View File

@@ -1450,7 +1450,7 @@
pirates "^4.0.0"
source-map-support "^0.5.16"
"@babel/runtime@^7.12.5", "@babel/runtime@^7.15.3", "@babel/runtime@^7.3.1", "@babel/runtime@^7.5.0", "@babel/runtime@^7.7.2", "@babel/runtime@^7.8.4":
"@babel/runtime@^7.12.5", "@babel/runtime@^7.15.3", "@babel/runtime@^7.5.0", "@babel/runtime@^7.7.2", "@babel/runtime@^7.8.4":
version "7.15.3"
resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.15.3.tgz#2e1c2880ca118e5b2f9988322bd8a7656a32502b"
integrity sha512-OvwMLqNXkCXSz1kSm58sEsNuhqOx/fKpnUnKnFB5v8uDda5bLNEHNgKPvhDN6IU0LDcnHQ90LlJ0Q6jnyBSIBA==
@@ -2139,23 +2139,6 @@
global "^4.4.0"
regenerator-runtime "^0.13.7"
"@storybook/addons@6.5.9":
version "6.5.9"
resolved "https://registry.yarnpkg.com/@storybook/addons/-/addons-6.5.9.tgz#5a9d7395c579a9cbc44dfc122362fb3c95dfb9d5"
integrity sha512-adwdiXg+mntfPocLc1KXjZXyLgGk7Aac699Fwe+OUYPEC5tW347Rm/kFatcE556d42o5czcRiq3ZSIGWnm9ieQ==
dependencies:
"@storybook/api" "6.5.9"
"@storybook/channels" "6.5.9"
"@storybook/client-logger" "6.5.9"
"@storybook/core-events" "6.5.9"
"@storybook/csf" "0.0.2--canary.4566f4d.1"
"@storybook/router" "6.5.9"
"@storybook/theming" "6.5.9"
"@types/webpack-env" "^1.16.0"
core-js "^3.8.2"
global "^4.4.0"
regenerator-runtime "^0.13.7"
"@storybook/api@6.5.10":
version "6.5.10"
resolved "https://registry.yarnpkg.com/@storybook/api/-/api-6.5.10.tgz#215623844648f0da2ac646fdcdd1345c2e1a8490"
@@ -2179,29 +2162,6 @@
ts-dedent "^2.0.0"
util-deprecate "^1.0.2"
"@storybook/api@6.5.9":
version "6.5.9"
resolved "https://registry.yarnpkg.com/@storybook/api/-/api-6.5.9.tgz#303733214c9de0422d162f7c54ae05d088b89bf9"
integrity sha512-9ylztnty4Y+ALU/ehW3BML9czjCAFsWvrwuCi6UgcwNjswwjSX3VRLhfD1KT3pl16ho//95LgZ0LnSwROCcPOA==
dependencies:
"@storybook/channels" "6.5.9"
"@storybook/client-logger" "6.5.9"
"@storybook/core-events" "6.5.9"
"@storybook/csf" "0.0.2--canary.4566f4d.1"
"@storybook/router" "6.5.9"
"@storybook/semver" "^7.3.2"
"@storybook/theming" "6.5.9"
core-js "^3.8.2"
fast-deep-equal "^3.1.3"
global "^4.4.0"
lodash "^4.17.21"
memoizerific "^1.11.3"
regenerator-runtime "^0.13.7"
store2 "^2.12.0"
telejson "^6.0.8"
ts-dedent "^2.0.0"
util-deprecate "^1.0.2"
"@storybook/builder-webpack4@6.5.10":
version "6.5.10"
resolved "https://registry.yarnpkg.com/@storybook/builder-webpack4/-/builder-webpack4-6.5.10.tgz#79e95323577a37349ab3c81193fa249ac5c50173"
@@ -2268,19 +2228,6 @@
qs "^6.10.0"
telejson "^6.0.8"
"@storybook/channel-postmessage@6.5.9":
version "6.5.9"
resolved "https://registry.yarnpkg.com/@storybook/channel-postmessage/-/channel-postmessage-6.5.9.tgz#9cf4530f0364cee0d5e58f92d6fb5ce98e10257b"
integrity sha512-pX/0R8UW7ezBhCrafRaL20OvMRcmESYvQQCDgjqSzJyHkcG51GOhsd6Ge93eJ6QvRMm9+w0Zs93N2VKjVtz0Qw==
dependencies:
"@storybook/channels" "6.5.9"
"@storybook/client-logger" "6.5.9"
"@storybook/core-events" "6.5.9"
core-js "^3.8.2"
global "^4.4.0"
qs "^6.10.0"
telejson "^6.0.8"
"@storybook/channel-websocket@6.5.10":
version "6.5.10"
resolved "https://registry.yarnpkg.com/@storybook/channel-websocket/-/channel-websocket-6.5.10.tgz#bd1316a9b555229b215e5054a76b57c503dd8adc"
@@ -2301,15 +2248,6 @@
ts-dedent "^2.0.0"
util-deprecate "^1.0.2"
"@storybook/channels@6.5.9":
version "6.5.9"
resolved "https://registry.yarnpkg.com/@storybook/channels/-/channels-6.5.9.tgz#abfab89a6587a2688e9926d4aafeb11c9d8b2e79"
integrity sha512-FvGA35nV38UPXWOl9ERapFTJaxwSTamQ339s2Ev7E9riyRG+GRkgTWzf5kECJgS1PAYKd/7m/RqKJT9BVv6A5g==
dependencies:
core-js "^3.8.2"
ts-dedent "^2.0.0"
util-deprecate "^1.0.2"
"@storybook/client-api@6.5.10":
version "6.5.10"
resolved "https://registry.yarnpkg.com/@storybook/client-api/-/client-api-6.5.10.tgz#0bc3f68ce014ce1ffd560472a893ba04be370f09"
@@ -2344,14 +2282,6 @@
core-js "^3.8.2"
global "^4.4.0"
"@storybook/client-logger@6.5.9":
version "6.5.9"
resolved "https://registry.yarnpkg.com/@storybook/client-logger/-/client-logger-6.5.9.tgz#dc1669abe8c45af1cc38f74c6f4b15ff33e63014"
integrity sha512-DOHL6p0uiDd3gV/Sb2FR+Vh6OiPrrf8BrA06uvXWsMRIIvEEvnparxv9EvPg7FlmUX0T3nq7d3juwjx4F8Wbcg==
dependencies:
core-js "^3.8.2"
global "^4.4.0"
"@storybook/components@6.5.10":
version "6.5.10"
resolved "https://registry.yarnpkg.com/@storybook/components/-/components-6.5.10.tgz#268e1269bc3d262f7dcec13f96c3b844919687b8"
@@ -2366,22 +2296,6 @@
regenerator-runtime "^0.13.7"
util-deprecate "^1.0.2"
"@storybook/components@6.5.9":
version "6.5.9"
resolved "https://registry.yarnpkg.com/@storybook/components/-/components-6.5.9.tgz#97e07ffe11ab76c01ccee380888991bd161f75b2"
integrity sha512-BhfX980O9zn/1J4FNMeDo8ZvL1m5Ml3T4HRpfYmEBnf8oW5b5BeF6S2K2cwFStZRjWqm1feUcwNpZxCBVMkQnQ==
dependencies:
"@storybook/client-logger" "6.5.9"
"@storybook/csf" "0.0.2--canary.4566f4d.1"
"@storybook/theming" "6.5.9"
"@types/react-syntax-highlighter" "11.0.5"
core-js "^3.8.2"
memoizerific "^1.11.3"
qs "^6.10.0"
react-syntax-highlighter "^15.4.5"
regenerator-runtime "^0.13.7"
util-deprecate "^1.0.2"
"@storybook/core-client@6.5.10":
version "6.5.10"
resolved "https://registry.yarnpkg.com/@storybook/core-client/-/core-client-6.5.10.tgz#90c86923236c8efff33d454a0dc552f6df4346b1"
@@ -2464,62 +2378,6 @@
util-deprecate "^1.0.2"
webpack "4"
"@storybook/core-common@6.5.9":
version "6.5.9"
resolved "https://registry.yarnpkg.com/@storybook/core-common/-/core-common-6.5.9.tgz#7ca8258ea2634b1d64695c1e4262f71cc7457989"
integrity sha512-NxOK0mrOCo0TWZ7Npc5HU66EKoRHlrtg18/ZixblLDWQMIqY9XCck8K1kJ8QYpYCHla+aHIsYUArFe2vhlEfZA==
dependencies:
"@babel/core" "^7.12.10"
"@babel/plugin-proposal-class-properties" "^7.12.1"
"@babel/plugin-proposal-decorators" "^7.12.12"
"@babel/plugin-proposal-export-default-from" "^7.12.1"
"@babel/plugin-proposal-nullish-coalescing-operator" "^7.12.1"
"@babel/plugin-proposal-object-rest-spread" "^7.12.1"
"@babel/plugin-proposal-optional-chaining" "^7.12.7"
"@babel/plugin-proposal-private-methods" "^7.12.1"
"@babel/plugin-proposal-private-property-in-object" "^7.12.1"
"@babel/plugin-syntax-dynamic-import" "^7.8.3"
"@babel/plugin-transform-arrow-functions" "^7.12.1"
"@babel/plugin-transform-block-scoping" "^7.12.12"
"@babel/plugin-transform-classes" "^7.12.1"
"@babel/plugin-transform-destructuring" "^7.12.1"
"@babel/plugin-transform-for-of" "^7.12.1"
"@babel/plugin-transform-parameters" "^7.12.1"
"@babel/plugin-transform-shorthand-properties" "^7.12.1"
"@babel/plugin-transform-spread" "^7.12.1"
"@babel/preset-env" "^7.12.11"
"@babel/preset-react" "^7.12.10"
"@babel/preset-typescript" "^7.12.7"
"@babel/register" "^7.12.1"
"@storybook/node-logger" "6.5.9"
"@storybook/semver" "^7.3.2"
"@types/node" "^14.0.10 || ^16.0.0"
"@types/pretty-hrtime" "^1.0.0"
babel-loader "^8.0.0"
babel-plugin-macros "^3.0.1"
babel-plugin-polyfill-corejs3 "^0.1.0"
chalk "^4.1.0"
core-js "^3.8.2"
express "^4.17.1"
file-system-cache "^1.0.5"
find-up "^5.0.0"
fork-ts-checker-webpack-plugin "^6.0.4"
fs-extra "^9.0.1"
glob "^7.1.6"
handlebars "^4.7.7"
interpret "^2.2.0"
json5 "^2.1.3"
lazy-universal-dotenv "^3.0.1"
picomatch "^2.3.0"
pkg-dir "^5.0.0"
pretty-hrtime "^1.0.3"
resolve-from "^5.0.0"
slash "^3.0.0"
telejson "^6.0.8"
ts-dedent "^2.0.0"
util-deprecate "^1.0.2"
webpack "4"
"@storybook/core-events@6.5.10":
version "6.5.10"
resolved "https://registry.yarnpkg.com/@storybook/core-events/-/core-events-6.5.10.tgz#66d87c8ea18db8e448018a16a3d0198ddbcbc683"
@@ -2527,13 +2385,6 @@
dependencies:
core-js "^3.8.2"
"@storybook/core-events@6.5.9":
version "6.5.9"
resolved "https://registry.yarnpkg.com/@storybook/core-events/-/core-events-6.5.9.tgz#5b0783c7d22a586c0f5e927a61fe1b1223e19637"
integrity sha512-tXt7a3ZvJOCeEKpNa/B5rQM5VI7UJLlOh3IHOImWn4HqoBRrZvbourmac+PRZAtXpos0h3c6554Hjapj/Sny5Q==
dependencies:
core-js "^3.8.2"
"@storybook/core-server@6.5.10":
version "6.5.10"
resolved "https://registry.yarnpkg.com/@storybook/core-server/-/core-server-6.5.10.tgz#ada3d647833c02cb8c742281c1f314ff866f96f8"
@@ -2702,17 +2553,6 @@
npmlog "^5.0.1"
pretty-hrtime "^1.0.3"
"@storybook/node-logger@6.5.9":
version "6.5.9"
resolved "https://registry.yarnpkg.com/@storybook/node-logger/-/node-logger-6.5.9.tgz#129cfe0d0f79cab4f6a2ba194d39516680b1626f"
integrity sha512-nZZNZG2Wtwv6Trxi3FrnIqUmB55xO+X/WQGPT5iKlqNjdRIu/T72mE7addcp4rbuWCQfZUhcDDGpBOwKtBxaGg==
dependencies:
"@types/npmlog" "^4.1.2"
chalk "^4.1.0"
core-js "^3.8.2"
npmlog "^5.0.1"
pretty-hrtime "^1.0.3"
"@storybook/postinstall@6.5.10":
version "6.5.10"
resolved "https://registry.yarnpkg.com/@storybook/postinstall/-/postinstall-6.5.10.tgz#b25378da036bce7b318c6732733aa5ad43449f37"
@@ -2742,28 +2582,6 @@
unfetch "^4.2.0"
util-deprecate "^1.0.2"
"@storybook/preview-web@6.5.9":
version "6.5.9"
resolved "https://registry.yarnpkg.com/@storybook/preview-web/-/preview-web-6.5.9.tgz#557d919e6df50d66259521aa36ebf4055bbd236e"
integrity sha512-4eMrO2HJyZUYyL/j+gUaDvry6iGedshwT5MQqe7J9FaA+Q2pNARQRB1X53f410w7S4sObRmYIAIluWPYdWym9w==
dependencies:
"@storybook/addons" "6.5.9"
"@storybook/channel-postmessage" "6.5.9"
"@storybook/client-logger" "6.5.9"
"@storybook/core-events" "6.5.9"
"@storybook/csf" "0.0.2--canary.4566f4d.1"
"@storybook/store" "6.5.9"
ansi-to-html "^0.6.11"
core-js "^3.8.2"
global "^4.4.0"
lodash "^4.17.21"
qs "^6.10.0"
regenerator-runtime "^0.13.7"
synchronous-promise "^2.0.15"
ts-dedent "^2.0.0"
unfetch "^4.2.0"
util-deprecate "^1.0.2"
"@storybook/router@6.5.10":
version "6.5.10"
resolved "https://registry.yarnpkg.com/@storybook/router/-/router-6.5.10.tgz#b0c342e080c1d2b5344603bc43a6c75734a4a879"
@@ -2775,17 +2593,6 @@
qs "^6.10.0"
regenerator-runtime "^0.13.7"
"@storybook/router@6.5.9":
version "6.5.9"
resolved "https://registry.yarnpkg.com/@storybook/router/-/router-6.5.9.tgz#4740248f8517425b2056273fb366ace8a17c65e8"
integrity sha512-G2Xp/2r8vU2O34eelE+G5VbEEVFDeHcCURrVJEROh6dq2asFJAPbzslVXSeCqgOTNLSpRDJ2NcN5BckkNqmqJg==
dependencies:
"@storybook/client-logger" "6.5.9"
core-js "^3.8.2"
memoizerific "^1.11.3"
qs "^6.10.0"
regenerator-runtime "^0.13.7"
"@storybook/semver@^7.3.2":
version "7.3.2"
resolved "https://registry.yarnpkg.com/@storybook/semver/-/semver-7.3.2.tgz#f3b9c44a1c9a0b933c04e66d0048fcf2fa10dac0"
@@ -2857,27 +2664,6 @@
ts-dedent "^2.0.0"
util-deprecate "^1.0.2"
"@storybook/store@6.5.9":
version "6.5.9"
resolved "https://registry.yarnpkg.com/@storybook/store/-/store-6.5.9.tgz#dc9963fc013636569082bd8f7200804866373735"
integrity sha512-80pcDTcCwK6wUA63aWOp13urI77jfipIVee9mpVvbNyfrNN8kGv1BS0z/JHDxuV6rC4g7LG1fb+BurR0yki7BA==
dependencies:
"@storybook/addons" "6.5.9"
"@storybook/client-logger" "6.5.9"
"@storybook/core-events" "6.5.9"
"@storybook/csf" "0.0.2--canary.4566f4d.1"
core-js "^3.8.2"
fast-deep-equal "^3.1.3"
global "^4.4.0"
lodash "^4.17.21"
memoizerific "^1.11.3"
regenerator-runtime "^0.13.7"
slash "^3.0.0"
stable "^0.1.8"
synchronous-promise "^2.0.15"
ts-dedent "^2.0.0"
util-deprecate "^1.0.2"
"@storybook/telemetry@6.5.10":
version "6.5.10"
resolved "https://registry.yarnpkg.com/@storybook/telemetry/-/telemetry-6.5.10.tgz#742b05a55dfe8470ce4cb371f3f3f2c02f96e816"
@@ -2906,16 +2692,6 @@
memoizerific "^1.11.3"
regenerator-runtime "^0.13.7"
"@storybook/theming@6.5.9":
version "6.5.9"
resolved "https://registry.yarnpkg.com/@storybook/theming/-/theming-6.5.9.tgz#13f60a3a3cd73ceb5caf9f188e1627e79f1891aa"
integrity sha512-KM0AMP5jMQPAdaO8tlbFCYqx9uYM/hZXGSVUhznhLYu7bhNAIK7ZVmXxyE/z/khM++8eUHzRoZGiO/cwCkg9Xw==
dependencies:
"@storybook/client-logger" "6.5.9"
core-js "^3.8.2"
memoizerific "^1.11.3"
regenerator-runtime "^0.13.7"
"@storybook/ui@6.5.10":
version "6.5.10"
resolved "https://registry.yarnpkg.com/@storybook/ui/-/ui-6.5.10.tgz#f56095a1a39ae5a203f2ac7f3dba86341a5927d5"
@@ -3067,6 +2843,11 @@
resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.4.tgz#f0ec25dbf2f0e4b18647313ac031134ca5b24b21"
integrity sha512-1z8k4wzFnNjVK/tlxvrWuK5WMt6mydWWP7+zvH5eFep4oj+UkrfiJTRtjCeBXNpwaA/FYqqtb4/QS4ianFpIRA==
"@types/minimatch@^3.0.3":
version "3.0.5"
resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.5.tgz#1001cc5e6a3704b83c236027e77f2f58ea010f40"
integrity sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==
"@types/node-fetch@^2.5.7":
version "2.5.8"
resolved "https://registry.yarnpkg.com/@types/node-fetch/-/node-fetch-2.5.8.tgz#e199c835d234c7eb0846f6618012e558544ee2fb"
@@ -3110,11 +2891,6 @@
resolved "https://registry.yarnpkg.com/@types/pretty-hrtime/-/pretty-hrtime-1.0.0.tgz#c5a2d644a135e988b2932f99737e67b3c62528d0"
integrity sha512-xl+5r2rcrxdLViAYkkiLMYsoUs3qEyrAnHFyEzYysgRxdVp3WbhysxIvJIxZp9FvZ2CYezh0TaHZorivH+voOQ==
"@types/prop-types@*":
version "15.7.3"
resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.3.tgz#2ab0d5da2e5815f94b0b9d4b95d1e5f243ab2ca7"
integrity sha512-KfRL3PuHmqQLOG+2tGpRO26Ctg+Cq1E01D2DMriKEATHgWLfeNDmq9e29Q9WIky0dQ3NPkd1mzYH8Lm936Z9qw==
"@types/q@^1.5.1":
version "1.5.4"
resolved "https://registry.yarnpkg.com/@types/q/-/q-1.5.4.tgz#15925414e0ad2cd765bfef58842f7e26a7accb24"
@@ -3125,27 +2901,6 @@
resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.6.tgz#df9c3c8b31a247ec315e6996566be3171df4b3b1"
integrity sha512-0/HnwIfW4ki2D8L8c9GVcG5I72s9jP5GSLVF0VIXDW00kmIpA6O33G7a8n59Tmh7Nz0WUC3rSb7PTY/sdW2JzA==
"@types/react-syntax-highlighter@11.0.5":
version "11.0.5"
resolved "https://registry.yarnpkg.com/@types/react-syntax-highlighter/-/react-syntax-highlighter-11.0.5.tgz#0d546261b4021e1f9d85b50401c0a42acb106087"
integrity sha512-VIOi9i2Oj5XsmWWoB72p3KlZoEbdRAcechJa8Ztebw7bDl2YmR+odxIqhtJGp1q2EozHs02US+gzxJ9nuf56qg==
dependencies:
"@types/react" "*"
"@types/react@*":
version "17.0.3"
resolved "https://registry.yarnpkg.com/@types/react/-/react-17.0.3.tgz#ba6e215368501ac3826951eef2904574c262cc79"
integrity sha512-wYOUxIgs2HZZ0ACNiIayItyluADNbONl7kt8lkLjVK8IitMH5QMyAh75Fwhmo37r1m7L2JaFj03sIfxBVDvRAg==
dependencies:
"@types/prop-types" "*"
"@types/scheduler" "*"
csstype "^3.0.2"
"@types/scheduler@*":
version "0.16.1"
resolved "https://registry.yarnpkg.com/@types/scheduler/-/scheduler-0.16.1.tgz#18845205e86ff0038517aab7a18a62a6b9f71275"
integrity sha512-EaCxbanVeyxDRTQBkdLb3Bvl/HK7PBK6UJjsSixB0iHKoWxE5uu2Q/DgtpOhPIojN0Zl1whvOd7PoHs2P0s5eA==
"@types/source-list-map@*":
version "0.1.2"
resolved "https://registry.yarnpkg.com/@types/source-list-map/-/source-list-map-0.1.2.tgz#0078836063ffaf17412349bba364087e0ac02ec9"
@@ -3613,6 +3368,11 @@ arr-union@^3.1.0:
resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4"
integrity sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=
array-differ@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/array-differ/-/array-differ-3.0.0.tgz#3cbb3d0f316810eafcc47624734237d6aee4ae6b"
integrity sha512-THtfYS6KtME/yIAhKjZ2ul7XI96lQGHRputJQHO80LAWQnuGP4iCIN8vdMRboGbIEYBwU33q8Tch1os2+X0kMg==
array-find-index@^1.0.1:
version "1.0.2"
resolved "https://registry.yarnpkg.com/array-find-index/-/array-find-index-1.0.2.tgz#df010aa1287e164bbda6f9723b0a96a1ec4187a1"
@@ -4438,6 +4198,14 @@ chalk@^2.0, chalk@^2.0.0, chalk@^2.4.1, chalk@^2.4.2:
escape-string-regexp "^1.0.5"
supports-color "^5.3.0"
chalk@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/chalk/-/chalk-3.0.0.tgz#3f73c2bf526591f574cc492c51e2456349f844e4"
integrity sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==
dependencies:
ansi-styles "^4.1.0"
supports-color "^7.1.0"
chalk@^4.0.0, chalk@^4.1.0:
version "4.1.0"
resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.0.tgz#4e14870a618d9e2edd97dd8345fd9d9dc315646a"
@@ -4982,7 +4750,7 @@ cross-spawn@^6.0.0, cross-spawn@^6.0.5:
shebang-command "^1.2.0"
which "^1.2.9"
cross-spawn@^7.0.3:
cross-spawn@^7.0.0, cross-spawn@^7.0.3:
version "7.0.3"
resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6"
integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==
@@ -5205,11 +4973,6 @@ cssstyle@^2.3.0:
dependencies:
cssom "~0.3.6"
csstype@^3.0.2:
version "3.0.7"
resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.0.7.tgz#2a5fb75e1015e84dd15692f71e89a1450290950b"
integrity sha512-KxnUB0ZMlnUWCsx2Z8MUsr6qV6ja1w9ArPErJaJaF8a5SOWoHLIszeCTKGRGRgtLgYrs1E8CHkNSP1VZTTPc9g==
currently-unhandled@^0.4.1:
version "0.4.1"
resolved "https://registry.yarnpkg.com/currently-unhandled/-/currently-unhandled-0.4.1.tgz#988df33feab191ef799a61369dd76c17adf957ea"
@@ -5896,6 +5659,21 @@ execa@^1.0.0:
signal-exit "^3.0.0"
strip-eof "^1.0.0"
execa@^4.0.0:
version "4.1.0"
resolved "https://registry.yarnpkg.com/execa/-/execa-4.1.0.tgz#4e5491ad1572f2f17a77d388c6c857135b22847a"
integrity sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==
dependencies:
cross-spawn "^7.0.0"
get-stream "^5.0.0"
human-signals "^1.1.1"
is-stream "^2.0.0"
merge-stream "^2.0.0"
npm-run-path "^4.0.0"
onetime "^5.1.0"
signal-exit "^3.0.2"
strip-final-newline "^2.0.0"
execa@^5.0.0, execa@^5.1.1:
version "5.1.1"
resolved "https://registry.yarnpkg.com/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd"
@@ -6062,13 +5840,6 @@ fastq@^1.6.0:
dependencies:
reusify "^1.0.4"
fault@^1.0.0:
version "1.0.4"
resolved "https://registry.yarnpkg.com/fault/-/fault-1.0.4.tgz#eafcfc0a6d214fc94601e170df29954a4f842f13"
integrity sha512-CJ0HCB5tL5fYTEA7ToAq5+kTwd++Borf1/bifxd9iT70QcXr4MRrO3Llf8Ifs70q+SJcGHFtnIE/Nw6giCtECA==
dependencies:
format "^0.2.0"
faye-websocket@^0.11.3:
version "0.11.3"
resolved "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.11.3.tgz#5c0e9a8968e8912c286639fde977a8b209f2508e"
@@ -6277,11 +6048,6 @@ form-data@^3.0.0:
combined-stream "^1.0.8"
mime-types "^2.1.12"
format@^0.2.0:
version "0.2.2"
resolved "https://registry.yarnpkg.com/format/-/format-0.2.2.tgz#d6170107e9efdc4ed30c9dc39016df942b5cb58b"
integrity sha1-1hcBB+nv3E7TDJ3DkBbflCtctYs=
forwarded@~0.1.2:
version "0.1.2"
resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.1.2.tgz#98c23dab1175657b8c0573e8ceccd91b0ff18c84"
@@ -6453,6 +6219,13 @@ get-stream@^4.0.0:
dependencies:
pump "^3.0.0"
get-stream@^5.0.0:
version "5.2.0"
resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.2.0.tgz#4966a1795ee5ace65e706c4b7beb71257d6e22d3"
integrity sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==
dependencies:
pump "^3.0.0"
get-stream@^6.0.0:
version "6.0.1"
resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7"
@@ -6794,16 +6567,6 @@ hex-color-regex@^1.1.0:
resolved "https://registry.yarnpkg.com/hex-color-regex/-/hex-color-regex-1.1.0.tgz#4c06fccb4602fe2602b3c93df82d7e7dbf1a8a8e"
integrity sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ==
highlight.js@^10.4.1:
version "10.7.3"
resolved "https://registry.yarnpkg.com/highlight.js/-/highlight.js-10.7.3.tgz#697272e3991356e40c3cac566a74eef681756531"
integrity sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==
highlight.js@~10.7.0:
version "10.7.1"
resolved "https://registry.yarnpkg.com/highlight.js/-/highlight.js-10.7.1.tgz#a8ec4152db24ea630c90927d6cae2a45f8ecb955"
integrity sha512-S6G97tHGqJ/U8DsXcEdnACbirtbx58Bx9CzIVeYli8OuswCfYI/LsXH2EiGcoGio1KAC3x4mmUwulOllJ2ZyRA==
hmac-drbg@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1"
@@ -6995,11 +6758,21 @@ https-proxy-agent@^5.0.0:
agent-base "6"
debug "4"
human-signals@^1.1.1:
version "1.1.1"
resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-1.1.1.tgz#c5b1cd14f50aeae09ab6c59fe63ba3395fe4dfa3"
integrity sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==
human-signals@^2.1.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0"
integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==
husky@^8.0.0:
version "8.0.1"
resolved "https://registry.yarnpkg.com/husky/-/husky-8.0.1.tgz#511cb3e57de3e3190514ae49ed50f6bc3f50b3e9"
integrity sha512-xs7/chUH/CKdOCs7Zy0Aev9e/dKOMZf3K1Az1nar3tzlv0jfqnYtu235bstsWTmXOR0EfINrPa97yy4Lz6RiKw==
iconv-lite@0.4.24:
version "0.4.24"
resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b"
@@ -8549,14 +8322,6 @@ lower-case@^2.0.2:
dependencies:
tslib "^2.0.3"
lowlight@^1.17.0:
version "1.20.0"
resolved "https://registry.yarnpkg.com/lowlight/-/lowlight-1.20.0.tgz#ddb197d33462ad0d93bf19d17b6c301aa3941888"
integrity sha512-8Ktj+prEb1RoCPkEOrPMYUN/nCggB7qAWe3a7OpMjWQkh3l2RD5wKRQ+o8Q8YuI9RG/xs95waaI/E6ym/7NsTw==
dependencies:
fault "^1.0.0"
highlight.js "~10.7.0"
lru-cache@^5.1.1:
version "5.1.1"
resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920"
@@ -8980,6 +8745,11 @@ move-concurrently@^1.0.1:
rimraf "^2.5.4"
run-queue "^1.0.3"
mri@^1.1.5:
version "1.2.0"
resolved "https://registry.yarnpkg.com/mri/-/mri-1.2.0.tgz#6721480fec2a11a4889861115a48b6cbe7cc8f0b"
integrity sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==
mrujs@^0.7.4:
version "0.7.4"
resolved "https://registry.yarnpkg.com/mrujs/-/mrujs-0.7.4.tgz#7b4778e8845ece7b9136ada9dec843a36d5b55c7"
@@ -9020,6 +8790,17 @@ multicast-dns@^6.0.1:
dns-packet "^1.3.1"
thunky "^1.0.2"
multimatch@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/multimatch/-/multimatch-4.0.0.tgz#8c3c0f6e3e8449ada0af3dd29efb491a375191b3"
integrity sha512-lDmx79y1z6i7RNx0ZGCPq1bzJ6ZoDDKbvh7jxr9SJcWLkShMzXrHbYVpTdnhNM5MXpDUxCQ4DgqVttVXlBgiBQ==
dependencies:
"@types/minimatch" "^3.0.3"
array-differ "^3.0.0"
array-union "^2.1.0"
arrify "^2.0.1"
minimatch "^3.0.4"
nan@^2.12.1:
version "2.14.2"
resolved "https://registry.yarnpkg.com/nan/-/nan-2.14.2.tgz#f5376400695168f4cc694ac9393d0c9585eeea19"
@@ -9190,7 +8971,7 @@ npm-run-path@^2.0.0:
dependencies:
path-key "^2.0.0"
npm-run-path@^4.0.1:
npm-run-path@^4.0.0, npm-run-path@^4.0.1:
version "4.0.1"
resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea"
integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==
@@ -9343,7 +9124,7 @@ once@^1.3.0, once@^1.3.1, once@^1.4.0:
dependencies:
wrappy "1"
onetime@^5.1.2:
onetime@^5.1.0, onetime@^5.1.2:
version "5.1.2"
resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e"
integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==
@@ -10480,6 +10261,11 @@ prepend-http@^1.0.0:
resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-1.0.4.tgz#d4f4562b0ce3696e41ac52d0e002e57a635dc6dc"
integrity sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=
prettier@2.7.1:
version "2.7.1"
resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.7.1.tgz#e235806850d057f97bb08368a4f7d899f7760c64"
integrity sha512-ujppO+MkdPqoVINuDFDRLClm7D78qbDt0/NR+wp5FqEZOoTNAjPHWj17QRhu7geIHJfcNhRk1XVQmF8Bp3ye+g==
"prettier@>=2.2.1 <=2.3.0":
version "2.3.0"
resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.3.0.tgz#b6a5bf1284026ae640f17f7ff5658a7567fc0d18"
@@ -10507,15 +10293,17 @@ pretty-hrtime@^1.0.3:
resolved "https://registry.yarnpkg.com/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz#b7e3ea42435a4c9b2759d99e0f201eb195802ee1"
integrity sha1-t+PqQkNaTJsnWdmeDyAesZWALuE=
prismjs@^1.27.0:
version "1.28.0"
resolved "https://registry.yarnpkg.com/prismjs/-/prismjs-1.28.0.tgz#0d8f561fa0f7cf6ebca901747828b149147044b6"
integrity sha512-8aaXdYvl1F7iC7Xm1spqSaY/OJBpYW3v+KJ+F17iYxvdc8sfjW194COK5wVhMZX45tGteiBQgdvD/nhxcRwylw==
prismjs@~1.27.0:
version "1.27.0"
resolved "https://registry.yarnpkg.com/prismjs/-/prismjs-1.27.0.tgz#bb6ee3138a0b438a3653dd4d6ce0cc6510a45057"
integrity sha512-t13BGPUlFDR7wRB5kQDG4jjl7XeuH6jbJGt11JHPL96qwsEHNX2+68tFXqc1/k+/jALsbSWJKUOT/hcYAZ5LkA==
pretty-quick@^3.1.3:
version "3.1.3"
resolved "https://registry.yarnpkg.com/pretty-quick/-/pretty-quick-3.1.3.tgz#15281108c0ddf446675157ca40240099157b638e"
integrity sha512-kOCi2FJabvuh1as9enxYmrnBC6tVMoVOenMaBqRfsvBHB0cbpYHjdQEpSglpASDFEXVwplpcGR4CLEaisYAFcA==
dependencies:
chalk "^3.0.0"
execa "^4.0.0"
find-up "^4.1.0"
ignore "^5.1.4"
mri "^1.1.5"
multimatch "^4.0.0"
process-nextick-args@~2.0.0:
version "2.0.1"
@@ -10773,17 +10561,6 @@ react-is@^17.0.1:
resolved "https://registry.yarnpkg.com/react-is/-/react-is-17.0.2.tgz#e691d4a8e9c789365655539ab372762b0efb54f0"
integrity sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==
react-syntax-highlighter@^15.4.5:
version "15.5.0"
resolved "https://registry.yarnpkg.com/react-syntax-highlighter/-/react-syntax-highlighter-15.5.0.tgz#4b3eccc2325fa2ec8eff1e2d6c18fa4a9e07ab20"
integrity sha512-+zq2myprEnQmH5yw6Gqc8lD55QHnpKaU8TOcFeC/Lg/MQSs8UknEA0JC4nTZGFAXC2J2Hyj/ijJ7NlabyPi2gg==
dependencies:
"@babel/runtime" "^7.3.1"
highlight.js "^10.4.1"
lowlight "^1.17.0"
prismjs "^1.27.0"
refractor "^3.6.0"
react@16.14.0:
version "16.14.0"
resolved "https://registry.yarnpkg.com/react/-/react-16.14.0.tgz#94d776ddd0aaa37da3eda8fc5b6b18a4c9a3114d"
@@ -10882,15 +10659,6 @@ redent@^1.0.0:
indent-string "^2.1.0"
strip-indent "^1.0.1"
refractor@^3.6.0:
version "3.6.0"
resolved "https://registry.yarnpkg.com/refractor/-/refractor-3.6.0.tgz#ac318f5a0715ead790fcfb0c71f4dd83d977935a"
integrity sha512-MY9W41IOWxxk31o+YvFCNyNzdkc9M20NoZK5vq6jkv4I/uh2zkWcfudj0Q1fovjUQJrNewS9NMzeTtqPf+n5EA==
dependencies:
hastscript "^6.0.0"
parse-entities "^2.0.0"
prismjs "~1.27.0"
regenerate-unicode-properties@^10.0.1:
version "10.0.1"
resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-10.0.1.tgz#7f442732aa7934a3740c779bb9b3340dccc1fb56"