mirror of
https://github.com/openfoodfoundation/openfoodnetwork
synced 2026-01-17 19:26:48 +00:00
Compare commits
69 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
36aabbb5b6 | ||
|
|
82f38c9aea | ||
|
|
689720b749 | ||
|
|
50600b9d00 | ||
|
|
abdef21381 | ||
|
|
4a3bd510a7 | ||
|
|
bb85473eba | ||
|
|
d5fa5e298e | ||
|
|
dab4939819 | ||
|
|
43b29af922 | ||
|
|
2c1acc14e6 | ||
|
|
84f9da4a23 | ||
|
|
d817319aa4 | ||
|
|
093b851395 | ||
|
|
e3a150226e | ||
|
|
5122ed9af4 | ||
|
|
ac5a3beb15 | ||
|
|
19481fc55e | ||
|
|
c8cab8aae5 | ||
|
|
d7428015ac | ||
|
|
700f91efb5 | ||
|
|
43e4047447 | ||
|
|
892e843e9e | ||
|
|
85904f57b8 | ||
|
|
b5e23717f2 | ||
|
|
d8d99c930e | ||
|
|
ce96094f49 | ||
|
|
6c655e6fbc | ||
|
|
2d1483febb | ||
|
|
42d7383ff0 | ||
|
|
df4ddf45c4 | ||
|
|
e0b40222dd | ||
|
|
61928cbc05 | ||
|
|
c6884f96e1 | ||
|
|
f0b5a04f6b | ||
|
|
b8ffddb533 | ||
|
|
71536767b5 | ||
|
|
938056d1d8 | ||
|
|
63d2d69d08 | ||
|
|
78ec086111 | ||
|
|
2aded5b459 | ||
|
|
5aa6b14756 | ||
|
|
07bd84ffbb | ||
|
|
d2794f328f | ||
|
|
8b146fc72a | ||
|
|
0c491a6651 | ||
|
|
e8529754f1 | ||
|
|
d95dc84c34 | ||
|
|
b61ee0211f | ||
|
|
c777a00874 | ||
|
|
a0a2dab44f | ||
|
|
f0aa7f44a5 | ||
|
|
a51940937a | ||
|
|
f1e401070a | ||
|
|
609cbe2893 | ||
|
|
912713a0c9 | ||
|
|
3621616f7c | ||
|
|
41ddd653a0 | ||
|
|
d8c7c0141a | ||
|
|
21c0baa965 | ||
|
|
59c9f0957b | ||
|
|
116f503cf6 | ||
|
|
023ebe1909 | ||
|
|
be568cdfa6 | ||
|
|
0bb90d764c | ||
|
|
34c8748b9c | ||
|
|
875c22346e | ||
|
|
c57d5a2408 | ||
|
|
a3cb1e6ecc |
4
.github/FUNDING.yml
vendored
4
.github/FUNDING.yml
vendored
@@ -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
|
||||
|
||||
18
.github/ISSUE_TEMPLATE/release.md
vendored
18
.github/ISSUE_TEMPLATE/release.md
vendored
@@ -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.
|
||||
|
||||
13
.github/workflows/linters.yml
vendored
13
.github/workflows/linters.yml
vendored
@@ -16,3 +16,16 @@ jobs:
|
||||
reporter: github-pr-check
|
||||
level: error
|
||||
fail_on_error: true
|
||||
prettier:
|
||||
name: runner / prettier
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Check out code
|
||||
uses: actions/checkout@v2
|
||||
- name: prettier
|
||||
uses: EPMatt/reviewdog-action-prettier@v1
|
||||
with:
|
||||
github_token: ${{ secrets.github_token }}
|
||||
reporter: github-pr-check
|
||||
level: error
|
||||
fail_on_error: true
|
||||
|
||||
4
.husky/pre-commit
Executable file
4
.husky/pre-commit
Executable file
@@ -0,0 +1,4 @@
|
||||
#!/usr/bin/env sh
|
||||
. "$(dirname -- "$0")/_/husky.sh"
|
||||
|
||||
yarn pretty-quick --check --staged
|
||||
21
.prettierignore
Normal file
21
.prettierignore
Normal file
@@ -0,0 +1,21 @@
|
||||
# Basically, ignore everythings expect app/webpacker/controllers/*.js and app/webpacker/packs/*.js
|
||||
*.css
|
||||
*.scss
|
||||
*.md
|
||||
*.yml
|
||||
*.yaml
|
||||
*.json
|
||||
*.html
|
||||
|
||||
babel.config.js
|
||||
postcss.config.js
|
||||
|
||||
.storybook/
|
||||
/app/assets/
|
||||
/config/
|
||||
/coverage/
|
||||
/engines/
|
||||
/public/
|
||||
/spec/
|
||||
/tmp/
|
||||
/vendor/
|
||||
1
.prettierrc.json
Normal file
1
.prettierrc.json
Normal file
@@ -0,0 +1 @@
|
||||
{}
|
||||
5
Gemfile
5
Gemfile
@@ -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'
|
||||
|
||||
36
Gemfile.lock
36
Gemfile.lock
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -7,10 +7,11 @@
|
||||
%th= t(".allow_charges?")
|
||||
%tr.customer{ id: "customer{{ customer.id }}", ng: { repeat: "customer in customers" } }
|
||||
%td.shop{ ng: { bind: 'shopsByID[customer.enterprise_id].name' } }
|
||||
%td.allow_charges
|
||||
%td.allow_charges{ tooltip: "{{ hasOneDefaultSavedCards() ? null : \'" + t('.no_default_saved_cards_tooltip') + "\' }}" }
|
||||
%input{ type: 'checkbox',
|
||||
name: 'allow_charges',
|
||||
ng: { model: 'customer.allow_charges',
|
||||
change: 'customer.update()',
|
||||
disabled: "!hasOneDefaultSavedCards()",
|
||||
"true-value" => "true",
|
||||
"false-value" => "false" } }
|
||||
|
||||
@@ -11,36 +11,36 @@ export default class extends Controller {
|
||||
// private
|
||||
|
||||
populateSelect(sourceId) {
|
||||
this.removeCurrentOptions()
|
||||
this.populateNewOptions(sourceId)
|
||||
this.removeCurrentOptions();
|
||||
this.populateNewOptions(sourceId);
|
||||
}
|
||||
|
||||
removeCurrentOptions() {
|
||||
this.selectTarget.innerHTML = ""
|
||||
this.selectTarget.innerHTML = "";
|
||||
|
||||
this.selectTarget.tomselect?.clear()
|
||||
this.selectTarget.tomselect?.clearOptions()
|
||||
this.selectTarget.tomselect?.clear();
|
||||
this.selectTarget.tomselect?.clearOptions();
|
||||
}
|
||||
|
||||
populateNewOptions(sourceId) {
|
||||
const options = this.dependantOptionsFor(sourceId)
|
||||
const options = this.dependantOptionsFor(sourceId);
|
||||
|
||||
options.forEach((item) => {
|
||||
this.addOption(item[0], item[1])
|
||||
this.addOption(item[0], item[1]);
|
||||
});
|
||||
|
||||
this.selectTarget.tomselect?.sync()
|
||||
this.selectTarget.tomselect?.addItem(options[0]?.[1])
|
||||
this.selectTarget.tomselect?.sync();
|
||||
this.selectTarget.tomselect?.addItem(options[0]?.[1]);
|
||||
}
|
||||
|
||||
addOption(label, value) {
|
||||
const newOption = document.createElement("option")
|
||||
newOption.innerHTML = label
|
||||
newOption.value = value
|
||||
this.selectTarget.appendChild(newOption)
|
||||
const newOption = document.createElement("option");
|
||||
newOption.innerHTML = label;
|
||||
newOption.value = value;
|
||||
this.selectTarget.appendChild(newOption);
|
||||
}
|
||||
|
||||
dependantOptionsFor(sourceId) {
|
||||
return this.optionsValue.find((option) => option[0] === sourceId)[1]
|
||||
return this.optionsValue.find((option) => option[0] === sourceId)[1];
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
// or:
|
||||
// div{data: {controller: "example"}}
|
||||
|
||||
import { Controller } from "stimulus"
|
||||
import { Controller } from "stimulus";
|
||||
|
||||
export default class extends Controller {
|
||||
// connect() is a built-in lifecycle callback for Stimulus Controllers. It fires when the
|
||||
@@ -11,7 +11,7 @@ export default class extends Controller {
|
||||
// injected into the DOM. This means initialization is not tied to the page load event, but
|
||||
// will also happen dynamically if and when new DOM elements are added or removed.
|
||||
connect() {
|
||||
console.log("We're connected!")
|
||||
console.log("We're connected!");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -1,20 +1,20 @@
|
||||
import { Controller } from "stimulus"
|
||||
import { Controller } from "stimulus";
|
||||
|
||||
document.addEventListener('turbolinks:before-cache', () =>
|
||||
document.getElementById('flash').remove()
|
||||
)
|
||||
document.addEventListener("turbolinks:before-cache", () =>
|
||||
document.getElementById("flash").remove()
|
||||
);
|
||||
|
||||
export default class extends Controller {
|
||||
connect() {
|
||||
setTimeout(this.fadeout.bind(this), 3000)
|
||||
setTimeout(this.fadeout.bind(this), 3000);
|
||||
}
|
||||
|
||||
fadeout() {
|
||||
this.element.classList.add("animate-hide-500")
|
||||
setTimeout(this.close.bind(this), 500)
|
||||
this.element.classList.add("animate-hide-500");
|
||||
setTimeout(this.close.bind(this), 500);
|
||||
}
|
||||
|
||||
close() {
|
||||
this.element.remove()
|
||||
this.element.remove();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,22 +1,24 @@
|
||||
import { Controller } from "stimulus"
|
||||
import { Controller } from "stimulus";
|
||||
|
||||
export default class extends Controller {
|
||||
static targets = ["checkout", "guest"];
|
||||
static values = {
|
||||
distributor: String,
|
||||
session: { type: String, default: "guest-checkout" }
|
||||
session: { type: String, default: "guest-checkout" },
|
||||
};
|
||||
|
||||
connect() {
|
||||
if(!this.hasGuestTarget) { return }
|
||||
if (!this.hasGuestTarget) {
|
||||
return;
|
||||
}
|
||||
|
||||
if(this.usingGuestCheckout()) {
|
||||
if (this.usingGuestCheckout()) {
|
||||
this.showCheckout();
|
||||
}
|
||||
}
|
||||
|
||||
login() {
|
||||
window.dispatchEvent(new Event("login:modal:open"))
|
||||
window.dispatchEvent(new Event("login:modal:open"));
|
||||
}
|
||||
|
||||
showCheckout() {
|
||||
@@ -30,6 +32,6 @@ export default class extends Controller {
|
||||
}
|
||||
|
||||
usingGuestCheckout() {
|
||||
return sessionStorage.getItem(this.sessionValue) === this.distributorValue
|
||||
return sessionStorage.getItem(this.sessionValue) === this.distributorValue;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,33 +1,33 @@
|
||||
import { Controller } from "stimulus"
|
||||
import { Controller } from "stimulus";
|
||||
|
||||
export default class extends Controller {
|
||||
static targets = ["background", "modal"]
|
||||
static targets = ["background", "modal"];
|
||||
|
||||
open() {
|
||||
this.backgroundTarget.style.display = "block"
|
||||
this.modalTarget.style.display = "block"
|
||||
this.backgroundTarget.style.display = "block";
|
||||
this.modalTarget.style.display = "block";
|
||||
|
||||
setTimeout(() => {
|
||||
this.modalTarget.classList.add("in")
|
||||
this.backgroundTarget.classList.add("in")
|
||||
document.querySelector("body").classList.add("modal-open")
|
||||
})
|
||||
this.modalTarget.classList.add("in");
|
||||
this.backgroundTarget.classList.add("in");
|
||||
document.querySelector("body").classList.add("modal-open");
|
||||
});
|
||||
}
|
||||
|
||||
close() {
|
||||
this.modalTarget.classList.remove("in")
|
||||
this.backgroundTarget.classList.remove("in")
|
||||
document.querySelector("body").classList.remove("modal-open")
|
||||
this.modalTarget.classList.remove("in");
|
||||
this.backgroundTarget.classList.remove("in");
|
||||
document.querySelector("body").classList.remove("modal-open");
|
||||
|
||||
setTimeout(() => {
|
||||
this.backgroundTarget.style.display = "none"
|
||||
this.modalTarget.style.display = "none"
|
||||
}, 200)
|
||||
this.backgroundTarget.style.display = "none";
|
||||
this.modalTarget.style.display = "none";
|
||||
}, 200);
|
||||
}
|
||||
|
||||
closeIfEscapeKey(e) {
|
||||
if (e.code == "Escape") {
|
||||
this.close()
|
||||
this.close();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,11 +1,15 @@
|
||||
import { Controller } from "stimulus"
|
||||
import { Controller } from "stimulus";
|
||||
|
||||
export default class extends Controller {
|
||||
static values = { target: String }
|
||||
static values = { target: String };
|
||||
|
||||
open() {
|
||||
let helpModal = document.getElementById(this.targetValue)
|
||||
let helpModalController = this.application.getControllerForElementAndIdentifier(helpModal, "help-modal");
|
||||
let helpModal = document.getElementById(this.targetValue);
|
||||
let helpModalController =
|
||||
this.application.getControllerForElementAndIdentifier(
|
||||
helpModal,
|
||||
"help-modal"
|
||||
);
|
||||
helpModalController.open();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,61 +1,70 @@
|
||||
import { Controller } from "stimulus"
|
||||
import CableReady from "cable_ready"
|
||||
import { Controller } from "stimulus";
|
||||
import CableReady from "cable_ready";
|
||||
|
||||
export default class extends Controller {
|
||||
static targets = ["background", "modal", "email"]
|
||||
static values = { email: String }
|
||||
static targets = ["background", "modal", "email"];
|
||||
static values = { email: String };
|
||||
|
||||
connect() {
|
||||
if(this.hasModalTarget) {
|
||||
window.addEventListener("login:modal:open", this.open)
|
||||
if (this.hasModalTarget) {
|
||||
window.addEventListener("login:modal:open", this.open);
|
||||
|
||||
if(location.hash.substr(1).includes("/login")) {
|
||||
this.open()
|
||||
if (location.hash.substr(1).includes("/login")) {
|
||||
this.open();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
call(event) {
|
||||
event.preventDefault()
|
||||
window.dispatchEvent(new Event("login:modal:open"))
|
||||
event.preventDefault();
|
||||
window.dispatchEvent(new Event("login:modal:open"));
|
||||
}
|
||||
|
||||
emailOnInput(event) {
|
||||
this.emailValue = event.currentTarget.value
|
||||
this.emailValue = event.currentTarget.value;
|
||||
this.emailTargets.forEach((element) => {
|
||||
element.value = this.emailValue
|
||||
})
|
||||
element.value = this.emailValue;
|
||||
});
|
||||
}
|
||||
|
||||
open = () => {
|
||||
if(!location.hash.substr(1).includes("/login")) {
|
||||
history.pushState({}, "", "#/login")
|
||||
if (!location.hash.substr(1).includes("/login")) {
|
||||
history.pushState({}, "", "#/login");
|
||||
}
|
||||
|
||||
this.backgroundTarget.style.display = "block"
|
||||
this.modalTarget.style.display = "block"
|
||||
this.backgroundTarget.style.display = "block";
|
||||
this.modalTarget.style.display = "block";
|
||||
|
||||
setTimeout(() => {
|
||||
this.modalTarget.classList.add("in")
|
||||
this.backgroundTarget.classList.add("in")
|
||||
document.querySelector("body").classList.add("modal-open")
|
||||
})
|
||||
this.modalTarget.classList.add("in");
|
||||
this.backgroundTarget.classList.add("in");
|
||||
document.querySelector("body").classList.add("modal-open");
|
||||
});
|
||||
|
||||
window._paq?.push(['trackEvent', 'Signin/Signup', 'Login Modal View', window.location.href])
|
||||
}
|
||||
window._paq?.push([
|
||||
"trackEvent",
|
||||
"Signin/Signup",
|
||||
"Login Modal View",
|
||||
window.location.href,
|
||||
]);
|
||||
};
|
||||
|
||||
close() {
|
||||
history.pushState({}, "", window.location.pathname + window.location.search)
|
||||
history.pushState(
|
||||
{},
|
||||
"",
|
||||
window.location.pathname + window.location.search
|
||||
);
|
||||
|
||||
this.modalTarget.classList.remove("in")
|
||||
this.backgroundTarget.classList.remove("in")
|
||||
this.modalTarget.classList.remove("in");
|
||||
this.backgroundTarget.classList.remove("in");
|
||||
|
||||
document.querySelector("body").classList.remove("modal-open")
|
||||
document.querySelector("body").classList.remove("modal-open");
|
||||
|
||||
setTimeout(() => {
|
||||
this.backgroundTarget.style.display = "none"
|
||||
this.modalTarget.style.display = "none"
|
||||
}, 200)
|
||||
this.backgroundTarget.style.display = "none";
|
||||
this.modalTarget.style.display = "none";
|
||||
}, 200);
|
||||
}
|
||||
|
||||
resend_confirmation(event) {
|
||||
@@ -63,19 +72,21 @@ export default class extends Controller {
|
||||
method: "POST",
|
||||
body: JSON.stringify({
|
||||
spree_user: { email: this.emailValue },
|
||||
tab: event.currentTarget.dataset.tab
|
||||
tab: event.currentTarget.dataset.tab,
|
||||
}),
|
||||
headers: { "Content-type": "application/json; charset=UTF-8" }
|
||||
}).then(data => data.json()).then(CableReady.perform)
|
||||
headers: { "Content-type": "application/json; charset=UTF-8" },
|
||||
})
|
||||
.then((data) => data.json())
|
||||
.then(CableReady.perform);
|
||||
}
|
||||
|
||||
returnHome() {
|
||||
window.location = "/"
|
||||
window.location = "/";
|
||||
}
|
||||
|
||||
disconnect() {
|
||||
if(this.hasModalTarget) {
|
||||
window.removeEventListener("login:modal:open", this.open)
|
||||
if (this.hasModalTarget) {
|
||||
window.removeEventListener("login:modal:open", this.open);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -27,7 +27,7 @@ export default class extends Controller {
|
||||
Array.from(
|
||||
document.getElementsByClassName("paymentmethod-container")
|
||||
).forEach((container) => {
|
||||
const enabled = container.id === paymentMethodContainerId
|
||||
const enabled = container.id === paymentMethodContainerId;
|
||||
|
||||
if (enabled) {
|
||||
container.style.display = "block";
|
||||
|
||||
@@ -2,16 +2,15 @@ import { Controller } from "stimulus";
|
||||
|
||||
export default class extends Controller {
|
||||
static targets = ["chevron"];
|
||||
static values = { selector: String }
|
||||
static values = { selector: String };
|
||||
|
||||
toggle(event) {
|
||||
if (this.hasChevronTarget) {
|
||||
this.chevronTarget.classList.toggle("icon-chevron-down")
|
||||
this.chevronTarget.classList.toggle("icon-chevron-up")
|
||||
this.chevronTarget.classList.toggle("icon-chevron-down");
|
||||
this.chevronTarget.classList.toggle("icon-chevron-up");
|
||||
}
|
||||
|
||||
const element = document.querySelector(this.selectorValue)
|
||||
element.style.display = element.style.display === "none" ? "block" : "none"
|
||||
const element = document.querySelector(this.selectorValue);
|
||||
element.style.display = element.style.display === "none" ? "block" : "none";
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -6,7 +6,7 @@ export default class extends Controller {
|
||||
static targets = ["stripeelements", "select"];
|
||||
|
||||
connect() {
|
||||
this.initSelectedCard()
|
||||
this.initSelectedCard();
|
||||
}
|
||||
|
||||
initSelectedCard() {
|
||||
|
||||
@@ -1,16 +1,24 @@
|
||||
import { Controller } from "stimulus"
|
||||
import { Controller } from "stimulus";
|
||||
|
||||
export default class extends Controller {
|
||||
static targets = [ "cardElement", "cardErrors", "expMonth", "expYear", "brand", "last4", "pmId" ];
|
||||
static targets = [
|
||||
"cardElement",
|
||||
"cardErrors",
|
||||
"expMonth",
|
||||
"expYear",
|
||||
"brand",
|
||||
"last4",
|
||||
"pmId",
|
||||
];
|
||||
static styles = {
|
||||
base: {
|
||||
fontFamily: "Roboto, Arial, sans-serif",
|
||||
fontSize: "16px",
|
||||
color: "#5c5c5c",
|
||||
"::placeholder": {
|
||||
color: "#6c6c6c"
|
||||
}
|
||||
}
|
||||
color: "#6c6c6c",
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
initialize() {
|
||||
@@ -19,10 +27,12 @@ export default class extends Controller {
|
||||
|
||||
// Initialize Stripe JS
|
||||
this.stripe = Stripe(this.data.get("key"));
|
||||
this.stripeElement = this.stripe.elements({ locale: I18n.base_locale }).create("card", {
|
||||
style: this.constructor.styles,
|
||||
hidePostalCode: true
|
||||
});
|
||||
this.stripeElement = this.stripe
|
||||
.elements({ locale: I18n.base_locale })
|
||||
.create("card", {
|
||||
style: this.constructor.styles,
|
||||
hidePostalCode: true,
|
||||
});
|
||||
|
||||
// Mount Stripe Elements JS to the form field
|
||||
this.stripeElement.mount(this.cardElementTarget);
|
||||
@@ -41,26 +51,42 @@ export default class extends Controller {
|
||||
// Before the form is submitted we send the card details directly to Stripe (via StripeJS),
|
||||
// and receive a token which represents the card object, and add that token into the form.
|
||||
stripeSubmit = (event) => {
|
||||
if(!this.stripeSelected() || !this.catchFormSubmit) { return }
|
||||
if (!this.stripeSelected() || !this.catchFormSubmit) {
|
||||
return;
|
||||
}
|
||||
|
||||
event.preventDefault();
|
||||
event.stopPropagation();
|
||||
|
||||
this.stripe.createPaymentMethod({type: "card", card: this.stripeElement}).then(response => {
|
||||
if (response.error) {
|
||||
this.updateErrors(response);
|
||||
} else {
|
||||
this.pmIdTarget.setAttribute("value", response.paymentMethod.id);
|
||||
this.expMonthTarget.setAttribute("value", response.paymentMethod.card.exp_month);
|
||||
this.expYearTarget.setAttribute("value", response.paymentMethod.card.exp_year);
|
||||
this.brandTarget.setAttribute("value", response.paymentMethod.card.brand);
|
||||
this.last4Target.setAttribute("value", response.paymentMethod.card.last4);
|
||||
this.catchFormSubmit = false;
|
||||
|
||||
event.submitter.click();
|
||||
}
|
||||
});
|
||||
}
|
||||
this.stripe
|
||||
.createPaymentMethod({ type: "card", card: this.stripeElement })
|
||||
.then((response) => {
|
||||
if (response.error) {
|
||||
this.updateErrors(response);
|
||||
} else {
|
||||
this.pmIdTarget.setAttribute("value", response.paymentMethod.id);
|
||||
this.expMonthTarget.setAttribute(
|
||||
"value",
|
||||
response.paymentMethod.card.exp_month
|
||||
);
|
||||
this.expYearTarget.setAttribute(
|
||||
"value",
|
||||
response.paymentMethod.card.exp_year
|
||||
);
|
||||
this.brandTarget.setAttribute(
|
||||
"value",
|
||||
response.paymentMethod.card.brand
|
||||
);
|
||||
this.last4Target.setAttribute(
|
||||
"value",
|
||||
response.paymentMethod.card.last4
|
||||
);
|
||||
this.catchFormSubmit = false;
|
||||
|
||||
event.submitter.click();
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
// Update validation messages from Stripe shown in the form
|
||||
updateErrors = (data) => {
|
||||
@@ -69,10 +95,10 @@ export default class extends Controller {
|
||||
} else {
|
||||
this.cardErrorsTarget.textContent = "";
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
// Boolean; true if Stripe is shown / currently selected
|
||||
stripeSelected() {
|
||||
return !!this.cardElementTarget.offsetParent
|
||||
return !!this.cardElementTarget.offsetParent;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,36 +1,36 @@
|
||||
import { Controller } from "stimulus";
|
||||
|
||||
export default class extends Controller {
|
||||
static targets = ["tab", "content"]
|
||||
static targets = ["tab", "content"];
|
||||
|
||||
select(event) {
|
||||
this.setCurrentTab(this.tabTargets.indexOf(event.currentTarget))
|
||||
this.setCurrentTab(this.tabTargets.indexOf(event.currentTarget));
|
||||
}
|
||||
|
||||
// private
|
||||
|
||||
connect() {
|
||||
this.setCurrentTab()
|
||||
this.setCurrentTab();
|
||||
}
|
||||
|
||||
setCurrentTab(tabIndex = 0) {
|
||||
this.showSelectedContent(tabIndex)
|
||||
this.setButtonActiveClass(tabIndex)
|
||||
this.showSelectedContent(tabIndex);
|
||||
this.setButtonActiveClass(tabIndex);
|
||||
}
|
||||
|
||||
showSelectedContent(tabIndex) {
|
||||
this.contentTargets.forEach((element, index) => {
|
||||
element.hidden = index !== tabIndex
|
||||
})
|
||||
element.hidden = index !== tabIndex;
|
||||
});
|
||||
}
|
||||
|
||||
setButtonActiveClass(tabIndex) {
|
||||
this.tabTargets.forEach((element, index) => {
|
||||
if(index === tabIndex) {
|
||||
element.classList.add("active")
|
||||
if (index === tabIndex) {
|
||||
element.classList.add("active");
|
||||
} else {
|
||||
element.classList.remove("active")
|
||||
element.classList.remove("active");
|
||||
}
|
||||
})
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
import { Application } from "stimulus"
|
||||
import { definitionsFromContext } from "stimulus/webpack-helpers"
|
||||
import { Application } from "stimulus";
|
||||
import { definitionsFromContext } from "stimulus/webpack-helpers";
|
||||
|
||||
const application = Application.start()
|
||||
const context = require.context("controllers", true, /.js$/)
|
||||
application.load(definitionsFromContext(context))
|
||||
const application = Application.start();
|
||||
const context = require.context("controllers", true, /.js$/);
|
||||
application.load(definitionsFromContext(context));
|
||||
|
||||
@@ -1,27 +1,24 @@
|
||||
/* eslint no-console:0 */
|
||||
|
||||
// StimulusJS
|
||||
import { Application } from "stimulus"
|
||||
import { definitionsFromContext } from "stimulus/webpack-helpers"
|
||||
import { Application } from "stimulus";
|
||||
import { definitionsFromContext } from "stimulus/webpack-helpers";
|
||||
|
||||
const application = Application.start()
|
||||
const context = require.context("controllers", true, /.js$/)
|
||||
application.load(definitionsFromContext(context))
|
||||
const application = Application.start();
|
||||
const context = require.context("controllers", true, /.js$/);
|
||||
application.load(definitionsFromContext(context));
|
||||
|
||||
import CableReady from "cable_ready"
|
||||
import mrujs from "mrujs"
|
||||
import { CableCar } from "mrujs/plugins"
|
||||
import * as Turbo from "@hotwired/turbo"
|
||||
import CableReady from "cable_ready";
|
||||
import mrujs from "mrujs";
|
||||
import { CableCar } from "mrujs/plugins";
|
||||
import * as Turbo from "@hotwired/turbo";
|
||||
|
||||
window.Turbo = Turbo
|
||||
window.CableReady = CableReady
|
||||
window.Turbo = Turbo;
|
||||
window.CableReady = CableReady;
|
||||
mrujs.start({
|
||||
plugins: [
|
||||
new CableCar(CableReady)
|
||||
]
|
||||
})
|
||||
|
||||
require.context('../fonts', true)
|
||||
const images = require.context('../images', true)
|
||||
const imagePath = (name) => images(name, true)
|
||||
plugins: [new CableCar(CableReady)],
|
||||
});
|
||||
|
||||
require.context("../fonts", true);
|
||||
const images = require.context("../images", true);
|
||||
const imagePath = (name) => images(name, true);
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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!"
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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
4205
config/locales/uk.yml
Normal file
File diff suppressed because it is too large
Load Diff
@@ -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",
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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!
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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([
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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
404
yarn.lock
@@ -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"
|
||||
|
||||
Reference in New Issue
Block a user