Compare commits

...

559 Commits

Author SHA1 Message Date
Maikel Linke
2453084a6b Update translations 2023-06-16 14:02:47 +10:00
Maikel
39183547aa Merge pull request #11033 from openfoodfoundation/revert-10455-dependabot/bundler/redis-5.0.6
Revert "Fix `redis` and `hiredis-client` version requirements "
2023-06-16 13:42:55 +10:00
Maikel
24000b2ce3 Revert "Fix redis and hiredis-client version requirements " 2023-06-16 13:09:25 +10:00
Maikel
8e86f76278 Merge pull request #11018 from openfoodfoundation/dependabot/bundler/sidekiq-7.1.2
chore(deps): bump sidekiq from 7.1.1 to 7.1.2
2023-06-16 12:08:25 +10:00
Maikel
4a91c180a3 Merge pull request #11017 from openfoodfoundation/dependabot/bundler/ddtrace-1.12.1
chore(deps): bump ddtrace from 1.12.0 to 1.12.1
2023-06-16 11:14:10 +10:00
Maikel
d192024786 Merge pull request #11019 from filipefurtad0/flaky_cache_spec
Clears cache around examples
2023-06-16 11:12:24 +10:00
Maikel
ec7de516aa Merge pull request #11011 from openfoodfoundation/dependabot/bundler/aws-sdk-s3-1.124.0
chore(deps): bump aws-sdk-s3 from 1.123.1 to 1.124.0
2023-06-16 10:59:56 +10:00
David Cook
47745b5e49 Merge pull request #11004 from dacook/show-current-version
Show current version at bottom of admin dashboard
2023-06-16 09:26:00 +10:00
Matt-Yorkley
3301c7cabc Update stage.yml 2023-06-16 00:18:36 +01:00
David Cook
35d9837f24 Show current version at bottom of admin dashboard
With generic link to the releases page. We could provide a link to latest tag with `git describe --tags --abbrev=0`. But I thought it better to keep things simple.
2023-06-16 09:11:59 +10:00
Matt-Yorkley
436deb9797 Update stage.yml 2023-06-16 00:03:16 +01:00
Matt-Yorkley
57451f2639 Update stage.yml 2023-06-15 23:26:27 +01:00
Matt-Yorkley
d56ad66ab8 Update stage.yml 2023-06-15 20:57:40 +01:00
Matt-Yorkley
fc5a53ebd9 Update stage.yml 2023-06-15 20:53:20 +01:00
Matt-Yorkley
f27472106e Update stage.yml 2023-06-15 20:52:07 +01:00
Matt-Yorkley
5729e33f69 Merge pull request #11031 from Matt-Yorkley/deployment-workflow
Add workflow for deploying to staging
2023-06-15 20:40:10 +01:00
Matt-Yorkley
584f6297f5 Allow manual workflow triggers 2023-06-15 20:18:44 +01:00
Matt-Yorkley
12bf17e21e Add workflow for deploying to staging 2023-06-15 19:37:18 +01:00
Matt-Yorkley
7068df5d4b Merge pull request #10804 from Matt-Yorkley/public-images
Update ActiveStorage image processing
2023-06-15 15:49:11 +01:00
Konrad
7a10edff82 Merge pull request #10988 from jibees/10980-white-label-trix-bullets-and-numbers-are-displayed-outside-the-text-field
[White Label] Custom tab content editor: order and unordered list should have a margin-left set
2023-06-15 16:13:19 +02:00
Konrad
5c0db892e5 Merge pull request #10983 from jibees/10982-admin_style_v3-use-oidc-settings-instead-of-oidc-settings-in-navigation
[OIDC] Translate 'Enterprises' > 'OIDC Settings' tab title
2023-06-15 16:07:07 +02:00
filipefurtad0
598f69f42f Clears cache around examples
for specs testing cache
2023-06-15 11:28:01 +01:00
dependabot[bot]
ca5de6b0b2 chore(deps): bump sidekiq from 7.1.1 to 7.1.2
Bumps [sidekiq](https://github.com/sidekiq/sidekiq) from 7.1.1 to 7.1.2.
- [Changelog](https://github.com/sidekiq/sidekiq/blob/main/Changes.md)
- [Commits](https://github.com/sidekiq/sidekiq/compare/v7.1.1...v7.1.2)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-06-15 10:05:58 +00:00
dependabot[bot]
b0c9c6e6e1 chore(deps): bump ddtrace from 1.12.0 to 1.12.1
Bumps [ddtrace](https://github.com/DataDog/dd-trace-rb) from 1.12.0 to 1.12.1.
- [Release notes](https://github.com/DataDog/dd-trace-rb/releases)
- [Changelog](https://github.com/DataDog/dd-trace-rb/blob/master/CHANGELOG.md)
- [Commits](https://github.com/DataDog/dd-trace-rb/compare/v1.12.0...v1.12.1)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-06-15 09:58:24 +00:00
Maikel
701fef84f3 Merge pull request #10850 from mkllnk/require-belongs-to--part1
Require belongs_to associations - part 1
2023-06-15 09:20:42 +10:00
Konrad
cf3692e688 Merge pull request #10992 from openfoodfoundation/dependabot/bundler/active_storage_validations-1.0.4
chore(deps): bump active_storage_validations from 1.0.3 to 1.0.4
2023-06-14 22:25:16 +02:00
Konrad
863fed56ce Merge pull request #10455 from openfoodfoundation/dependabot/bundler/redis-5.0.6
Fix `redis` and `hiredis-client` version requirements
2023-06-14 22:09:13 +02:00
Filipe
e6d42a0c4f Merge pull request #10999 from Matt-Yorkley/bom-issues
Fix BOM order loading issue
2023-06-14 19:01:54 +01:00
Matt-Yorkley
64508d3c3d Add unit test for direct image URLs 2023-06-14 12:53:20 +01:00
Matt-Yorkley
395cf7fb8d Use direct image URLs for enterprise logos 2023-06-14 12:53:20 +01:00
Matt-Yorkley
5ad37ce6a5 Return default image url on ActiveStorage errors in image loading 2023-06-14 12:53:20 +01:00
dependabot[bot]
6e9721b64c chore(deps): bump aws-sdk-s3 from 1.123.1 to 1.124.0
Bumps [aws-sdk-s3](https://github.com/aws/aws-sdk-ruby) from 1.123.1 to 1.124.0.
- [Release notes](https://github.com/aws/aws-sdk-ruby/releases)
- [Changelog](https://github.com/aws/aws-sdk-ruby/blob/version-3/gems/aws-sdk-s3/CHANGELOG.md)
- [Commits](https://github.com/aws/aws-sdk-ruby/commits)

---
updated-dependencies:
- dependency-name: aws-sdk-s3
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-06-14 09:58:54 +00:00
Matt-Yorkley
4c7e947738 Migrate data
So it turns out all images uploaded before the ActiveStorage migration are internally set to "public-read", and all images uploaded after the migration are internally set to "private". This migration switches all images in S3 buckets back to "public-read".
2023-06-14 10:56:10 +01:00
Matt-Yorkley
b510668ecf Render direct URLs for s3 images 2023-06-14 10:56:10 +01:00
Matt-Yorkley
6f12d012ed Use #url helper 2023-06-14 10:56:10 +01:00
Matt-Yorkley
551d0d3a93 Simplify calling #url_for in models 2023-06-14 10:56:10 +01:00
Matt-Yorkley
a898915724 Use named image variants 2023-06-14 10:56:10 +01:00
Matt-Yorkley
e54cff2274 Set images to public-read
Defining an alternate s3 configuration set to `public: true` means we can use it selectively. It sets the objects to `acl: "public-read"` by default (read-only) and means any image tags for those assets can use direct public links in the src attribute (without hitting the ActiveStorage::Representation endpoint). The default non-public service will still be used by default for any other files on instances using s3.
2023-06-14 10:56:10 +01:00
Maikel Linke
91d0dabc1d Require associations on DistributorShippingMethod 2023-06-14 15:09:12 +10:00
Maikel Linke
bd11475fe1 Require associations on DistributorPaymentMethod 2023-06-14 15:08:22 +10:00
Maikel Linke
ed231ec512 Update belongs_to default in Customer model 2023-06-14 15:08:05 +10:00
Maikel Linke
fc00a48d67 Require associations of CoordinatorFee 2023-06-14 15:08:05 +10:00
Maikel Linke
c02c90317f Require user of column preference record
It doesn't make sense to have a preference without a user. And it was
already enforced in the database.
2023-06-14 15:07:43 +10:00
Maikel Linke
2d4cfd7548 Validate and enforce AdjustmentMetadata associations 2023-06-14 15:07:43 +10:00
Maikel Linke
d88781a083 Start to adopt new default to require belongs_to
Newer version of Rails have this option as default. We can slowly
transition to opt in gradually, model by model. Once all models are
covered, we can change the default and remove the setting from the
models again.

The style violation was added to the todo file because it's temporary.

We have 60 models using `belongs_to`. And changing them all at once
breaks some specs. So let's do it gradually.
2023-06-14 15:06:59 +10:00
Maikel
989a88e252 Merge pull request #10848 from mkllnk/totals-report
Fix error on summarising total_units in Order Cycle Supplier Totals report
2023-06-14 13:59:48 +10:00
Filipe
9c42781ff1 Merge pull request #10913 from abdellani/remove-split-checkout-toggle-and-legacy-checkout
Remove split checkout toggle and legacy checkout
2023-06-13 17:00:07 +01:00
Matt-Yorkley
73b2d37224 Don't try to load orders if the number of line_items with the current filters applied is zero
This ends up sending a request to the orders endpoint with no filters and no search params, which then tries to load every order in the entire database if the user is superadmin, which blows up.
2023-06-13 15:47:19 +01:00
Mohamed ABDELLANI
2654d3b866 update the rubocop_todo list 2023-06-13 14:58:16 +01:00
Matt-Yorkley
5fa81d1333 Fix invalid test setup in old tax tests 2023-06-13 14:58:16 +01:00
Matt-Yorkley
4e7fab6914 Delete dead code Checkout#find_transition
This method is only called from tests and nowhere else in the codebase. We may as well remove it.
2023-06-13 14:58:16 +01:00
Matt-Yorkley
8d633234f4 Set voucher specs to pending temporarily 2023-06-13 14:58:16 +01:00
Matt-Yorkley
d5a625bdeb Fix Paypal spec 2023-06-13 14:58:16 +01:00
Matt-Yorkley
0e289a23c1 Set some legacy checkout specs that we might want to rewrite later to pending 2023-06-13 14:58:16 +01:00
Matt-Yorkley
5487aa19fc Fix missing checkout_state_path 2023-06-13 14:58:16 +01:00
Mohamed ABDELLANI
345f540723 fix spec/models/spree/tax_rate_spec.rb 2023-06-13 14:58:16 +01:00
Mohamed ABDELLANI
78617905c6 remove spec/requests/checkout/concurrency_spec.rb 2023-06-13 14:58:16 +01:00
Mohamed ABDELLANI
56204b2315 fix ./spec/routing/stripe_spec.rb 2023-06-13 14:58:16 +01:00
Mohamed ABDELLANI
905187f3ce fix ./spec/services/order_tax_adjustments_fetcher_spec.rb:100 2023-06-13 14:58:16 +01:00
Mohamed ABDELLANI
7e84579aa3 spec/system/consumer/shopping/checkout_stripe_spec
these tests are using the legacy checkout
2023-06-13 14:58:16 +01:00
Mohamed ABDELLANI
bd0e7cdfc8 remove legacy checkout tests 2023-06-13 14:58:16 +01:00
Mohamed ABDELLANI
907c65d98c run create_tax_charge! after transition to payment state 2023-06-13 14:58:16 +01:00
Mohamed ABDELLANI
c2aaf88e98 remove checkout controller 2023-06-13 14:58:16 +01:00
Mohamed ABDELLANI
fc0cca2210 remove legacy checkout view 2023-06-13 14:58:16 +01:00
jibees
c379dcacc5 Merge pull request #10993 from openfoodfoundation/dependabot/bundler/jwt-2.7.1
chore(deps): bump jwt from 2.7.0 to 2.7.1
2023-06-13 15:05:30 +02:00
jibees
64e6d639c1 Merge pull request #10995 from openfoodfoundation/dependabot/bundler/rubocop-1.52.1
chore(deps-dev): bump rubocop from 1.52.0 to 1.52.1
2023-06-13 15:03:45 +02:00
jibees
374904f473 Merge pull request #10996 from openfoodfoundation/dependabot/bundler/test-unit-3.6.0
chore(deps): bump test-unit from 3.5.9 to 3.6.0
2023-06-13 15:03:03 +02:00
jibees
fb7ae9fd58 Merge pull request #10991 from openfoodfoundation/dependabot/bundler/view_component-3.2.0
chore(deps): bump view_component from 3.1.0 to 3.2.0
2023-06-13 15:02:26 +02:00
dependabot[bot]
19bd05ce5a chore(deps): bump test-unit from 3.5.9 to 3.6.0
Bumps [test-unit](https://github.com/test-unit/test-unit) from 3.5.9 to 3.6.0.
- [Release notes](https://github.com/test-unit/test-unit/releases)
- [Commits](https://github.com/test-unit/test-unit/compare/3.5.9...3.6.0)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-06-13 10:11:47 +00:00
dependabot[bot]
f9abec4346 chore(deps-dev): bump rubocop from 1.52.0 to 1.52.1
Bumps [rubocop](https://github.com/rubocop/rubocop) from 1.52.0 to 1.52.1.
- [Release notes](https://github.com/rubocop/rubocop/releases)
- [Changelog](https://github.com/rubocop/rubocop/blob/master/CHANGELOG.md)
- [Commits](https://github.com/rubocop/rubocop/compare/v1.52.0...v1.52.1)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-06-13 10:10:38 +00:00
dependabot[bot]
3e7ad17f69 chore(deps): bump jwt from 2.7.0 to 2.7.1
Bumps [jwt](https://github.com/jwt/ruby-jwt) from 2.7.0 to 2.7.1.
- [Release notes](https://github.com/jwt/ruby-jwt/releases)
- [Changelog](https://github.com/jwt/ruby-jwt/blob/main/CHANGELOG.md)
- [Commits](https://github.com/jwt/ruby-jwt/compare/v2.7.0...v2.7.1)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-06-13 10:08:44 +00:00
dependabot[bot]
b813879330 chore(deps): bump active_storage_validations from 1.0.3 to 1.0.4
Bumps [active_storage_validations](https://github.com/igorkasyanchuk/active_storage_validations) from 1.0.3 to 1.0.4.
- [Release notes](https://github.com/igorkasyanchuk/active_storage_validations/releases)
- [Changelog](https://github.com/igorkasyanchuk/active_storage_validations/blob/master/CHANGES.md)
- [Commits](https://github.com/igorkasyanchuk/active_storage_validations/compare/1.0.3...1.0.4)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-06-13 10:02:26 +00:00
Filipe
12bb8db7b3 Merge pull request #10933 from Matt-Yorkley/fix-payment-intents
Fix ProcessPaymentIntent service
2023-06-13 11:00:27 +01:00
dependabot[bot]
c3846ad269 chore(deps): bump view_component from 3.1.0 to 3.2.0
Bumps [view_component](https://github.com/viewcomponent/view_component) from 3.1.0 to 3.2.0.
- [Release notes](https://github.com/viewcomponent/view_component/releases)
- [Changelog](https://github.com/ViewComponent/view_component/blob/main/docs/CHANGELOG.md)
- [Commits](https://github.com/viewcomponent/view_component/compare/v3.1.0...v3.2.0)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-06-13 09:58:11 +00:00
Matt-Yorkley
93c3241bb5 Add more test coverage in stripe controller spec 2023-06-13 10:14:09 +01:00
Matt-Yorkley
abd55b2104 Move order to completed whether it's current state is payment or confirmation 2023-06-13 10:14:09 +01:00
Matt-Yorkley
47df9493ae Fix ProcessPaymentIntent service 2023-06-13 10:14:09 +01:00
Gaetan Craig-Riou
694e46d1fb Fix Bundler/OrderedGems 2023-06-13 15:35:40 +10:00
Gaetan Craig-Riou
4564021f79 Remove redis version limitation 2023-06-13 15:06:52 +10:00
David Cook
b85cf26907 Add comment 2023-06-13 15:00:09 +10:00
Jean-Baptiste Bellet
02432ee2ec Do not upgrade to redis >= 5
since Redis >= 3, < 5 is actually a requirement of Action Cable Redis subscription adapter until Rails 7.0.4.

https://github.com/rails/rails/blob/v6.1.7/actioncable/lib/action_cable/subscription_adapter/redis.rb
2023-06-13 15:00:09 +10:00
Jean-Baptiste Bellet
520ced350e Do not specify redis version 2023-06-13 14:59:19 +10:00
Jean-Baptiste Bellet
e41d1f2205 Following the doc, remove hiredis and use hiredis-client
Reference:
 - https://github.com/redis/redis-rb/issues/1178
 - https://github.com/redis/redis-rb#hiredis-binding
2023-06-13 14:59:19 +10:00
David Cook
c5ce49e08c Merge pull request #10948 from dacook/buu-table-styles
[admin_v3] Update all table styles
2023-06-13 13:08:55 +10:00
David Cook
e4c65ea87d Prettify palette file 2023-06-13 11:46:28 +10:00
David Cook
f007cf3dad Fix up table borders 2023-06-13 11:45:39 +10:00
David Cook
edcdcd3f74 Use header colour for table headers 2023-06-13 11:45:39 +10:00
David Cook
16534319b6 Replace dark blue with "Sherpa blue"
It looks like it’s used in headers, some buttons and a loading message
2023-06-13 11:45:39 +10:00
David Cook
d85ea628e2 Change default font colour to near-black
It looks like this is the main font colour in the new designs.
2023-06-13 11:45:39 +10:00
David Cook
821446e150 Style pagination links
And provide a basic hover state for most other buttons.
The pagination button hover and active states will need updating.

The darker background colour sometimes wraps a whole table (eg products table).
2023-06-13 11:45:39 +10:00
David Cook
744f95809a Remove uppercase styling of form elements 2023-06-13 11:45:39 +10:00
David Cook
fb17a679c0 First pass at new table colours
There is more to do, for example the dropshadows.

I've continued with the unopinionated colour naming (eg color-7), but would like to consider giving them more meaningfule names..
2023-06-13 11:45:39 +10:00
David Cook
2ae91bdbe2 Use variable for font size reset
The current value is 13px already, but I'd like to experiment changing this.

I'm not sure if we even need the reset, but am not delving into that right now.
2023-06-13 11:44:48 +10:00
David Cook
3967f54533 Use different variables and table styles for admin_v3 2023-06-13 11:44:48 +10:00
Konrad
6bd66585a9 Merge pull request #10935 from openfoodfoundation/dependabot/bundler/i18n-1.14.1
chore(deps): bump i18n from 1.13.0 to 1.14.1
2023-06-12 17:39:42 +02:00
Konrad
11f84b5276 Merge pull request #10934 from openfoodfoundation/dependabot/bundler/aws-sdk-s3-1.123.1
chore(deps): bump aws-sdk-s3 from 1.122.0 to 1.123.1
2023-06-12 17:24:20 +02:00
Filipe
23239bad8b Merge pull request #10970 from openfoodfoundation/dependabot/bundler/knapsack_pro-5.1.0
chore(deps-dev): bump knapsack_pro from 4.1.0 to 5.1.0
2023-06-12 16:19:32 +01:00
Konrad
a207a445b1 Merge pull request #10907 from jibees/3041-missing-translation-in-product-variant-selection-upon-order-creation
Admin, Create an order, Select a product: translate some messages in the product selection search box
2023-06-12 17:08:52 +02:00
Jean-Baptiste Bellet
16256ee114 Order and Unordered list should have a margin-left set
Has been reset to 0 via `typography.scss`
2023-06-12 16:58:00 +02:00
dependabot[bot]
15e9c4eb37 chore(deps): bump i18n from 1.13.0 to 1.14.1
Bumps [i18n](https://github.com/ruby-i18n/i18n) from 1.13.0 to 1.14.1.
- [Release notes](https://github.com/ruby-i18n/i18n/releases)
- [Changelog](https://github.com/ruby-i18n/i18n/blob/master/CHANGELOG.md)
- [Commits](https://github.com/ruby-i18n/i18n/compare/v1.13.0...v1.14.1)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-06-12 14:44:01 +00:00
Konrad
3e3ae5d8ae Merge pull request #10929 from openfoodfoundation/dependabot/bundler/ddtrace-1.12.0
chore(deps): bump ddtrace from 1.11.1 to 1.12.0
2023-06-12 16:43:01 +02:00
Konrad
48c107bde1 Merge pull request #10974 from cillian/ignore-whitespace-in-product-import
Ignore leading and trailing whitespace when importing products via a spreadsheet
2023-06-12 16:32:15 +02:00
Konrad
80dd8755b0 Merge pull request #10915 from mkllnk/mini-racer
Remove unused mini_racer gem
2023-06-12 16:05:52 +02:00
Konrad
791518988d Merge pull request #10918 from openfoodfoundation/dependabot/bundler/view_component-3.1.0
chore(deps): bump view_component from 3.0.0 to 3.1.0
2023-06-12 15:36:21 +02:00
Jean-Baptiste Bellet
149ec5511c Translate select2 messages 2023-06-12 15:11:23 +02:00
dependabot[bot]
351343fb6c chore(deps): bump aws-sdk-s3 from 1.122.0 to 1.123.1
Bumps [aws-sdk-s3](https://github.com/aws/aws-sdk-ruby) from 1.122.0 to 1.123.1.
- [Release notes](https://github.com/aws/aws-sdk-ruby/releases)
- [Changelog](https://github.com/aws/aws-sdk-ruby/blob/version-3/gems/aws-sdk-s3/CHANGELOG.md)
- [Commits](https://github.com/aws/aws-sdk-ruby/commits)

---
updated-dependencies:
- dependency-name: aws-sdk-s3
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-06-12 15:06:04 +02:00
dependabot[bot]
6145413b1a chore(deps): bump ddtrace from 1.11.1 to 1.12.0
Bumps [ddtrace](https://github.com/DataDog/dd-trace-rb) from 1.11.1 to 1.12.0.
- [Release notes](https://github.com/DataDog/dd-trace-rb/releases)
- [Changelog](https://github.com/DataDog/dd-trace-rb/blob/master/CHANGELOG.md)
- [Commits](https://github.com/DataDog/dd-trace-rb/compare/v1.11.1...v1.12.0)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-06-12 15:05:11 +02:00
dependabot[bot]
d87e40bb69 chore(deps): bump view_component from 3.0.0 to 3.1.0
Bumps [view_component](https://github.com/viewcomponent/view_component) from 3.0.0 to 3.1.0.
- [Release notes](https://github.com/viewcomponent/view_component/releases)
- [Changelog](https://github.com/ViewComponent/view_component/blob/main/docs/CHANGELOG.md)
- [Commits](https://github.com/viewcomponent/view_component/compare/v3.0.0...v3.1.0)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-06-12 15:04:17 +02:00
Maikel Linke
d6859e0bf7 Remove unused mini_racer gem
All asset compilation is done with webpacker at the moment.
2023-06-12 15:01:11 +02:00
Konrad
1f2f5e2eec Merge pull request #10892 from openfoodfoundation/dependabot/bundler/rails-7.0.5
chore(deps): bump rails from 7.0.4.3 to 7.0.5
2023-06-12 14:58:07 +02:00
jibees
b53aba3844 Merge pull request #10986 from openfoodfoundation/dependabot/bundler/capybara-3.39.2
chore(deps-dev): bump capybara from 3.39.1 to 3.39.2
2023-06-12 14:42:48 +02:00
jibees
45dcdf1611 Merge pull request #10985 from openfoodfoundation/dependabot/npm_and_yarn/jasmine-core-5.0.1
chore(deps-dev): bump jasmine-core from 5.0.0 to 5.0.1
2023-06-12 14:31:03 +02:00
jibees
8c971f2efa Merge pull request #10984 from openfoodfoundation/dependabot/npm_and_yarn/floating-ui/dom-1.3.0
chore(deps): bump @floating-ui/dom from 1.2.9 to 1.3.0
2023-06-12 14:29:56 +02:00
dependabot[bot]
8a8200a039 chore(deps-dev): bump capybara from 3.39.1 to 3.39.2
Bumps [capybara](https://github.com/teamcapybara/capybara) from 3.39.1 to 3.39.2.
- [Changelog](https://github.com/teamcapybara/capybara/blob/master/History.md)
- [Commits](https://github.com/teamcapybara/capybara/compare/3.39.1...3.39.2)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-06-12 09:58:05 +00:00
dependabot[bot]
8a376e782a chore(deps-dev): bump jasmine-core from 5.0.0 to 5.0.1
Bumps [jasmine-core](https://github.com/jasmine/jasmine) from 5.0.0 to 5.0.1.
- [Release notes](https://github.com/jasmine/jasmine/releases)
- [Changelog](https://github.com/jasmine/jasmine/blob/main/RELEASE.md)
- [Commits](https://github.com/jasmine/jasmine/compare/v5.0.0...v5.0.1)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-06-12 09:57:39 +00:00
dependabot[bot]
6ab1bfb2ab chore(deps): bump @floating-ui/dom from 1.2.9 to 1.3.0
Bumps [@floating-ui/dom](https://github.com/floating-ui/floating-ui/tree/HEAD/packages/dom) from 1.2.9 to 1.3.0.
- [Release notes](https://github.com/floating-ui/floating-ui/releases)
- [Commits](https://github.com/floating-ui/floating-ui/commits/@floating-ui/dom@1.3.0/packages/dom)

---
updated-dependencies:
- dependency-name: "@floating-ui/dom"
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-06-12 09:57:18 +00:00
Sigmund Petersen
c2305615a6 Merge pull request #10971 from filipefurtad0/mouse_hover_spec
Adds spec for tooltips on orders page
2023-06-12 09:53:16 +02:00
Jean-Baptiste Bellet
ff0f81167a Translate 'Enterprises' > 'OIDC Settings' tab title 2023-06-12 09:19:16 +02:00
Gaetan Craig-Riou
41b3ddae08 Merge pull request #10714 from macanudo527/fix_linelength
Fix Style/LineLength
2023-06-12 09:53:23 +10:00
Konrad
fc09f95fa1 Merge pull request #10961 from jibees/10946-white-label-trix-editor-changes-on-the-custom-tab-content-do-not-trigger-the-update-button
[WhiteLabel] Make update button active when changing custom tab content
2023-06-09 21:46:02 +02:00
Konrad
13037d2d9d Merge pull request #10949 from jibees/10630-buu-as-an-enterprise-user-i-can-see-the-back-office-with-new-brand-colours
[`admin_style_v3`] As an enterprise user i can see the back office with new brand colours
2023-06-09 21:24:01 +02:00
Konrad
9125c730ed Merge pull request #10960 from jibees/customize-trix-editor-to-have-the-right-colors
[White Label] Customize colors of custom content editor to have beautiful toolbar
2023-06-09 20:35:36 +02:00
Matt-Yorkley
70170078d1 Merge pull request #10976 from Matt-Yorkley/payment-localized-number
Require localized_number in Payment class
2023-06-09 18:45:13 +01:00
Konrad
bd505bbee7 Merge pull request #10959 from jibees/10945-white-label-narrow-screen-width-no-marging-on-custom-tab-content
[WhiteLabel] Add some margin to custom tab content for a shop
2023-06-09 19:45:04 +02:00
Matt-Yorkley
24200de8dd Require localized_number in Payment class
There seems to be some contexts (jobs for subscriptions) where the Payment class loads but LocalizedNumber is an undefined constant. It lives in the /lib directory so it's not auto-loaded.
2023-06-09 18:16:37 +01:00
Konrad
d0f4c44add Merge pull request #10938 from jibees/10931-white-label-custom-tab-without-a-title-impossible-to-disable-the-custom-tab
[White Label] Validate the presence of a custom tab title before creating it (+ max 20 characters length)
2023-06-09 19:01:13 +02:00
Cillian O'Ruanaidh
5cde4de512 Ignore leading and trailing whitespace in spreadsheet when importing products 2023-06-09 16:23:18 +01:00
Konrad
502b5e8664 Merge pull request #10937 from jibees/10900-white-label-remove-ofn-navigation-for-small-width-screens
[White Label] Remove ofn navigation for small width screens as well when option is activated
2023-06-09 16:28:22 +02:00
Konrad
35fef9e7ac Merge pull request #10876 from dacook/prettier-css-admin
Prettier css admin
2023-06-09 16:02:11 +02:00
filipefurtad0
24913476ac Adds spec for tooltips on orders page 2023-06-09 11:23:42 +01:00
dependabot[bot]
515a9a9b1c chore(deps-dev): bump knapsack_pro from 4.1.0 to 5.1.0
Bumps [knapsack_pro](https://github.com/KnapsackPro/knapsack_pro-ruby) from 4.1.0 to 5.1.0.
- [Changelog](https://github.com/KnapsackPro/knapsack_pro-ruby/blob/master/CHANGELOG.md)
- [Commits](https://github.com/KnapsackPro/knapsack_pro-ruby/compare/v4.1.0...v5.1.0)

---
updated-dependencies:
- dependency-name: knapsack_pro
  dependency-type: direct:development
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-06-09 10:02:21 +00:00
Neal Chambers
a65b43d32f Update .rubocop_todo.yml 2023-06-09 16:39:29 +09:00
Neal Chambers
9a8551e3ea Shorten Where Statement 2023-06-09 16:39:29 +09:00
Neal Chambers
a35a07b441 Rewrite sum to be more Readable 2023-06-09 16:39:29 +09:00
Neal Chambers
449430cabc Indent code to be more Readable 2023-06-09 16:39:29 +09:00
Neal Chambers
252697b782 Rewrite If and Unless Statements to be more Readable 2023-06-09 16:39:26 +09:00
Jean-Baptiste Bellet
74fd1814e4 Create a trixeditor controller and broadcast a change event on form
Therefore, AngularJS can set form as dirty

+ add associated spec
2023-06-09 08:03:17 +02:00
Maikel Linke
6803e0a8f9 Fix error on summarising total_units 2023-06-09 09:55:33 +10:00
Maikel Linke
71e4d2c6ed Spec total_units report column
Current reports don't deal with invalid legacy data.
2023-06-09 09:55:33 +10:00
Maikel Linke
00e171a8f1 Reduce indentation in report spec
Specs should also test from the outside instead of declaring modules and
test from within those modules.
2023-06-09 09:55:33 +10:00
Jean-Baptiste Bellet
5d43285834 Update all locales with the latest Transifex translations 2023-06-08 17:36:04 +02:00
Filipe
ca03e1596b Merge pull request #10952 from Matt-Yorkley/full-name
Improve nil-safety in variant naming methods
2023-06-08 16:26:28 +01:00
Filipe
c12415a340 Merge pull request #10955 from Matt-Yorkley/bulk-invoice-bug
Ensure directory exists before saving invoices pdf
2023-06-08 15:22:27 +01:00
Matt-Yorkley
f4261b85b8 Merge pull request #10940 from Matt-Yorkley/order-tidyup
Order class tidyup
2023-06-08 15:06:59 +01:00
Filipe
7974e1eaa6 Merge pull request #10936 from abdellani/fix-order-progressing-automatically-on-BOO
fix Viewing an order in state "confirmation" changes the state to "complete"
2023-06-08 14:50:04 +01:00
Jean-Baptiste Bellet
457d5a6c83 Override some css classes, to have a beautiful trix editor toolbar buttons
- buttons background are transparent (instead of blue)
 - buttons background on hovering are transparent (instead of green)
 - disabled buttons cursor is default (instead of pointer)
2023-06-08 11:43:59 +02:00
Jean-Baptiste Bellet
05104841cd Add some margin to custom tab content via columns css class 2023-06-08 11:36:06 +02:00
Jean-Baptiste Bellet
d1d050e6a4 Limit size to 20 char for the custom tab title 2023-06-08 11:27:07 +02:00
David Cook
e2ba18f828 Set sentence case tab names in Ruby instead of CSS
I chose .capitalize instead of .humanize, because the latter has extra features which may not be desired.
2023-06-08 11:24:44 +02:00
Jean-Baptiste Bellet
d6cb483f0d Adjust color to the title of the page 2023-06-08 11:24:44 +02:00
Jean-Baptiste Bellet
d7f7ff7436 Remove background, border and adjust margin top 2023-06-08 11:24:44 +02:00
Jean-Baptiste Bellet
905220a055 Add new color: $color-8 #191c1d Near-black 2023-06-08 11:24:44 +02:00
Jean-Baptiste Bellet
b865d8c1c0 Copy/Paste file admin/shared/layout under admin_v3 folder
+ prettier
2023-06-08 11:24:44 +02:00
Jean-Baptiste Bellet
51f47fc351 Add border bottom when hovering or selected
+ add some padding to separate those borders then
2023-06-08 11:24:44 +02:00
Jean-Baptiste Bellet
1b4236640d Add border with box-shadow to menu and sub-menu 2023-06-08 11:24:44 +02:00
Jean-Baptiste Bellet
2057449dac Add new color: $color-7 #EFF1F2 Light grey 2023-06-08 11:24:44 +02:00
Jean-Baptiste Bellet
ba98039e95 Adjust color to orange when selected or hover 2023-06-08 11:24:44 +02:00
Jean-Baptiste Bellet
d51786ac9e Adjust font size for labels in menu 2023-06-08 11:24:44 +02:00
Jean-Baptiste Bellet
ccd7466ede No more white on labels but dark grey 2023-06-08 11:24:44 +02:00
Jean-Baptiste Bellet
b163d4a584 Remove background-color on menu 2023-06-08 11:24:44 +02:00
Jean-Baptiste Bellet
a4d3011e27 Add new color: $color-9 #2E3132 Dark Grey 2023-06-08 11:24:44 +02:00
Jean-Baptiste Bellet
dd48092728 Prettier file 2023-06-08 11:24:44 +02:00
Jean-Baptiste Bellet
5ee3550ebd Change case to Sentence case
CSS property `capitalize` uppercase all first letter of each words.

I need to use a small trick with `::first-letter` selector
2023-06-08 11:24:44 +02:00
Jean-Baptiste Bellet
eab46b67e3 Copy/Paste file admin/components/navigation under admin_v3 folder
+ prettier
2023-06-08 11:24:44 +02:00
Jean-Baptiste Bellet
e34f4a9971 AdminV3: Remove icon from icon from primary navigation menu
Co-Authored-By: Maikel <maikel@email.org.au>
2023-06-08 11:24:43 +02:00
Neal Chambers
dde775d2b7 Remove Old Code and Comments 2023-06-08 15:20:04 +10:00
Neal Chambers
3432e30465 Fix Style/UnlessGuard 2023-06-08 15:20:04 +10:00
Neal Chambers
12aa4f9970 Fix Layout/IndentationStyle 2023-06-08 15:20:04 +10:00
Neal Chambers
b04879604a Rewrite Ternary Expression to Prevent Layout/LineLength 2023-06-08 15:20:04 +10:00
Maikel Linke
4ecbbae55e Adapt large browser window as default
We were really close to that anyway. It simplifies the code a bit.
2023-06-08 13:51:29 +10:00
Maikel Linke
7cf68cd33b Ensure that specs restore default window size 2023-06-08 13:51:25 +10:00
Maikel Linke
241b307762 Fix typos 2023-06-08 11:34:05 +10:00
David Cook
7d26158e06 Code cleanup
Co-authored-by: Maikel <maikel@email.org.au>
2023-06-08 11:31:37 +10:00
Maikel Linke
99fbf80b4c Style Layout/MultilineMethodCallIndentation 2023-06-08 11:15:42 +10:00
Matt-Yorkley
98f78927b7 Update app/jobs/bulk_invoice_job.rb
Co-authored-by: Maikel <maikel@email.org.au>
2023-06-08 00:56:24 +01:00
Matt-Yorkley
bf051fc35b Pull checkout-workflow-related callback methods out into the Checkout module which defines checkout state changes 2023-06-07 18:54:20 +01:00
Matt-Yorkley
760bf269ca Pull validations-related methods out into a separate module 2023-06-07 18:54:20 +01:00
Matt-Yorkley
bed2fe69f6 Update regression tests 2023-06-07 16:39:37 +01:00
jibees
c6b5eda85c Merge pull request #10951 from openfoodfoundation/dependabot/bundler/faraday-2.7.6
chore(deps): bump faraday from 2.7.5 to 2.7.6
2023-06-07 17:34:10 +02:00
Matt-Yorkley
b091a0ed1a Ensure directory exists before saving pdf
These directories can get wiped during deployments
2023-06-07 16:25:53 +01:00
Mohamed ABDELLANI
fbf55cf7bd Merge pull request #2 from Matt-Yorkley/fix-order-progressing-automatically-on-BOO
Fix pre-existing issues with admin order controller
2023-06-07 13:49:06 +01:00
David Cook
3ce48848f0 Prettify the rest 2023-06-07 14:23:57 +02:00
David Cook
548a6f8d2e Prettify app/webpacker/css/admin/plugins/ 2023-06-07 14:23:57 +02:00
David Cook
10c52959ad Prettify app/webpacker/css/admin/hacks/ 2023-06-07 14:23:57 +02:00
David Cook
08dc3e3cbe Prettify more admin css
yarn prettier --write
2023-06-07 14:23:02 +02:00
David Cook
fbf5862c66 Ignore some css subfolders
Prettier changes these files dramatically and they're arguably not easier to read.
2023-06-07 14:21:34 +02:00
dependabot[bot]
01dcf068f9 chore(deps): bump rails from 7.0.4.3 to 7.0.5
Bumps [rails](https://github.com/rails/rails) from 7.0.4.3 to 7.0.5.
- [Release notes](https://github.com/rails/rails/releases)
- [Commits](https://github.com/rails/rails/compare/v7.0.4.3...v7.0.5)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-06-07 14:12:34 +02:00
Matt-Yorkley
b58b555e38 Improve flaky spec 2023-06-07 13:01:37 +01:00
Matt-Yorkley
983353e078 Remove dead code
I'm pretty sure this was here because advancing the order was adding order errors in some cases
2023-06-07 13:01:37 +01:00
Matt-Yorkley
968bf882c4 Fix flaky spec 2023-06-07 13:01:37 +01:00
Matt-Yorkley
daf243996b Improve flaky spec 2023-06-07 13:01:37 +01:00
Matt-Yorkley
7a7ab17db4 Improve customer tests 2023-06-07 13:01:37 +01:00
Matt-Yorkley
6daf29400f Improve distribution and line items tests 2023-06-07 13:01:37 +01:00
Matt-Yorkley
f3ee10dd5a Simplify by moving conditional to guard clause 2023-06-07 13:01:37 +01:00
Matt-Yorkley
cf0f148dba Advance order when creating a shipment
This action gets called from the order edit page when adding line items and it's one of the places that needs to advance the order *before* redirecting back to the order edit action
2023-06-07 13:01:37 +01:00
Matt-Yorkley
bb73d70e57 Improve nil-safety in variant naming methods 2023-06-07 12:17:50 +01:00
dependabot[bot]
24343c769e chore(deps): bump faraday from 2.7.5 to 2.7.6
Bumps [faraday](https://github.com/lostisland/faraday) from 2.7.5 to 2.7.6.
- [Release notes](https://github.com/lostisland/faraday/releases)
- [Changelog](https://github.com/lostisland/faraday/blob/main/CHANGELOG.md)
- [Commits](https://github.com/lostisland/faraday/compare/v2.7.5...v2.7.6)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-06-07 09:57:34 +00:00
Filipe
2d28a57c6f Merge pull request #10922 from jibees/10903-white-label-make-logo-url-link-more-tolerant-in-terms-of-format-and-add-example
[White Label] Make logo url link more tolerant in terms of format
2023-06-07 10:00:31 +01:00
Maikel
1c9a09d88d Merge pull request #10943 from openfoodfoundation/dependabot/bundler/paranoia-2.6.2
chore(deps): bump paranoia from 2.6.1 to 2.6.2
2023-06-07 16:31:01 +10:00
Maikel Linke
1ebacf96ad Ignore accidental spaces around whitelabel URL 2023-06-07 13:12:06 +10:00
Matt-Yorkley
acc34d1deb Update advance to payment logic 2023-06-07 00:58:43 +01:00
Matt-Yorkley
e1b37090be Use _path helper instead of _url 2023-06-07 00:58:43 +01:00
Matt-Yorkley
6e8ed1f612 Hide secondary form until the order has line items 2023-06-07 00:58:43 +01:00
Matt-Yorkley
c7bb24e2a0 Remove dead code and clarify update logic 2023-06-07 00:58:43 +01:00
Matt-Yorkley
e88843c733 Ensure order number is generated nicely on new records 2023-06-07 00:58:43 +01:00
Matt-Yorkley
67c3e09dba Use RESTful routes for orders controller actions 2023-06-07 00:35:47 +01:00
Konrad
1b6147db30 Merge pull request #10896 from jibees/10571-bom-orders-not-sorted-by-most-recent-date
BOM: Sort by order completed at desc for line items by default
2023-06-06 17:37:54 +02:00
Matt-Yorkley
2bfb57a1a1 Clarify shipments partial inclusion 2023-06-06 14:59:53 +01:00
Matt-Yorkley
8813edaed8 Fix variables in form partial 2023-06-06 14:59:03 +01:00
Jean-Baptiste Bellet
7dc8c4b891 Hide OFN navigation also on small width screens 2023-06-06 14:55:41 +02:00
Jean-Baptiste Bellet
a8b85a65e9 Add context for visiting a path 2023-06-06 14:44:05 +02:00
Jean-Baptiste Bellet
5c3e07db52 Test that OFN navigation is on mobile views as well 2023-06-06 14:44:05 +02:00
dependabot[bot]
10ca09eaef chore(deps): bump paranoia from 2.6.1 to 2.6.2
Bumps [paranoia](https://github.com/rubysherpas/paranoia) from 2.6.1 to 2.6.2.
- [Release notes](https://github.com/rubysherpas/paranoia/releases)
- [Changelog](https://github.com/rubysherpas/paranoia/blob/core/CHANGELOG.md)
- [Commits](https://github.com/rubysherpas/paranoia/compare/v2.6.1...v2.6.2)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-06-06 10:00:41 +00:00
Jean-Baptiste Bellet
daaeca88e8 Add some helpers to test mobile views 2023-06-06 12:00:16 +02:00
Mohamed ABDELLANI
77554e21fc move advance_to_payment on order's details page from edit to update 2023-06-06 10:23:01 +01:00
Matt-Yorkley
7c72969792 Move Order #state_changed method out into Checkout concern (alongside order states logic) 2023-06-05 23:54:04 +01:00
Matt-Yorkley
a62e51c0d0 Remove Order #refresh_shipment_rates method 2023-06-05 23:54:04 +01:00
Matt-Yorkley
1a7d70772a Make Order #products_available_from_new_distribution method private 2023-06-05 23:54:04 +01:00
Matt-Yorkley
3dd4e7ef03 Delegate order updater method 2023-06-05 23:54:04 +01:00
Matt-Yorkley
8a27dd84fe Make Order #disallow_guest_order method private 2023-06-05 21:30:49 +01:00
Matt-Yorkley
05a715a43a Remove Order #distribution_set? method 2023-06-05 21:30:46 +01:00
Matt-Yorkley
17b10d10c0 Make Order #deliver_order_confirmation_email method private 2023-06-05 21:30:43 +01:00
Matt-Yorkley
10dbeb32b2 Remove Order #credit_cards method 2023-06-05 21:30:40 +01:00
Matt-Yorkley
b3bd112cdb Remove Order #shipped_shipments method 2023-06-05 21:30:36 +01:00
Jean-Baptiste Bellet
93cf562d59 Update en.yml 2023-06-05 15:48:02 +02:00
Jean-Baptiste Bellet
5938577bd1 Update custom_tab_spec.rb 2023-06-05 15:43:11 +02:00
Jean-Baptiste Bellet
1594d1c718 Validate custom tab title 2023-06-05 15:41:33 +02:00
Jean-Baptiste Bellet
abe63e5b04 Add context for visiting a path 2023-06-05 12:08:43 +02:00
Jean-Baptiste Bellet
40111910b6 Validates white_label_logo_link on enterprise model 2023-06-05 11:24:07 +02:00
Jean-Baptiste Bellet
4edb159ef8 Avoid flaky spec by matching the array
Context: https://github.com/openfoodfoundation/openfoodnetwork/actions/runs/5081492387/jobs/9129944001?pr=10896
2023-06-05 10:05:09 +02:00
Jean-Baptiste Bellet
ccb183d60b Sort by order_date desc for line_items in BOM
+ update spec to have different order time
2023-06-05 10:05:09 +02:00
jibees
a785b4d5e0 Merge pull request #10928 from openfoodfoundation/dependabot/bundler/rubocop-1.52.0
chore(deps-dev): bump rubocop from 1.51.0 to 1.52.0
2023-06-05 09:28:04 +02:00
Maikel Linke
16fba20686 Update rubocop todo file 2023-06-05 12:13:35 +10:00
Maikel Linke
1cbb45a618 Style Lint/RedundantSafeNavigation
The cop suggested to change more but they were false positives:

* https://github.com/rubocop/rubocop/pull/11915
2023-06-05 12:09:32 +10:00
Maikel Linke
38bd31d0e3 Style Layout/TrailingWhitespace 2023-06-05 10:42:21 +10:00
Konrad
750b6b284d Merge pull request #10910 from jibees/10902-white-label-for-uploading-custom-logo-use-same-design-as-for-enterprise-logobanner-and-provide-required-image-dimensions
[White Label] Backoffice: improve design for logo used in shopfront
2023-06-04 14:50:49 +02:00
dependabot[bot]
78338864d8 chore(deps-dev): bump rubocop from 1.51.0 to 1.52.0
Bumps [rubocop](https://github.com/rubocop/rubocop) from 1.51.0 to 1.52.0.
- [Release notes](https://github.com/rubocop/rubocop/releases)
- [Changelog](https://github.com/rubocop/rubocop/blob/master/CHANGELOG.md)
- [Commits](https://github.com/rubocop/rubocop/compare/v1.51.0...v1.52.0)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-06-02 09:57:30 +00:00
filipefurtad0
840da55941 Update all locales with the latest Transifex translations 2023-06-02 09:17:23 +01:00
Jean-Baptiste Bellet
880ba85791 Add http to white label logo link if this do not start with http 2023-06-01 17:37:05 +02:00
Jean-Baptiste Bellet
ced8f8aa58 Use shared_examples as we will test many URLs later on
"It's a Surprise Tool That Will Help Us Later"
2023-06-01 17:37:05 +02:00
jibees
d63c47e0f1 Merge pull request #10920 from openfoodfoundation/dependabot/bundler/sidekiq-scheduler-5.0.3
chore(deps): bump sidekiq-scheduler from 5.0.2 to 5.0.3
2023-06-01 17:26:54 +02:00
jibees
fd7d68d0a8 Merge pull request #10919 from openfoodfoundation/dependabot/bundler/rspec-rails-6.0.3
chore(deps-dev): bump rspec-rails from 6.0.2 to 6.0.3
2023-06-01 17:25:58 +02:00
Jean-Baptiste Bellet
2e0191e603 Improve UX: same as enterprise logo and promo image 2023-06-01 17:16:22 +02:00
Filipe
12159edaca Merge pull request #10833 from Matt-Yorkley/order-angular
Remove Angular from admin orders index page
2023-06-01 13:57:39 +01:00
Filipe
2ba0f635f2 Merge pull request #10860 from Matt-Yorkley/order-cycle-deleting
Delete exchange variants in bulk when deleting an order cycle
2023-06-01 13:49:32 +01:00
Filipe
d67227deb8 Merge pull request #10812 from Matt-Yorkley/options-values
Remove OptionValue and OptionType code
2023-06-01 13:49:16 +01:00
Matt-Yorkley
1128fd9c02 Visual tweak to ship/capture buttons and success feedback 2023-06-01 12:13:12 +01:00
dependabot[bot]
3e46115f79 chore(deps): bump sidekiq-scheduler from 5.0.2 to 5.0.3
Bumps [sidekiq-scheduler](https://github.com/moove-it/sidekiq-scheduler) from 5.0.2 to 5.0.3.
- [Release notes](https://github.com/moove-it/sidekiq-scheduler/releases)
- [Changelog](https://github.com/sidekiq-scheduler/sidekiq-scheduler/blob/master/CHANGELOG.md)
- [Commits](https://github.com/moove-it/sidekiq-scheduler/compare/v5.0.2...v5.0.3)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-06-01 10:00:31 +00:00
dependabot[bot]
e428944849 chore(deps-dev): bump rspec-rails from 6.0.2 to 6.0.3
Bumps [rspec-rails](https://github.com/rspec/rspec-rails) from 6.0.2 to 6.0.3.
- [Release notes](https://github.com/rspec/rspec-rails/releases)
- [Changelog](https://github.com/rspec/rspec-rails/blob/main/Changelog.md)
- [Commits](https://github.com/rspec/rspec-rails/compare/v6.0.2...v6.0.3)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-06-01 09:59:07 +00:00
Matt-Yorkley
e99c328643 Update app/services/variant_units/variant_and_line_item_naming.rb
Co-authored-by: Maikel <maikel@email.org.au>
2023-06-01 10:12:19 +01:00
Matt-Yorkley
0ac10472cf Update app/models/spree/line_item.rb
Co-authored-by: Maikel <maikel@email.org.au>
2023-06-01 10:12:19 +01:00
Matt-Yorkley
7f5d1be792 Guard against unsaved variant's product in OptionValueNamer for product import 2023-06-01 10:12:19 +01:00
Matt-Yorkley
a20277c3a7 Completely remove option_values and option_types from the codebase 2023-06-01 10:12:19 +01:00
Matt-Yorkley
35b41fc7fe Persist unit_value on variant and "option value text" on variant and line_item and improve related AR callbacks 2023-06-01 10:12:19 +01:00
Matt-Yorkley
bfcf1203ac Delete dead code 2023-06-01 10:11:20 +01:00
Matt-Yorkley
896e4c45f2 Clarify confusing class 2023-06-01 10:11:20 +01:00
Matt-Yorkley
3e5ecba738 Remove unhelpful Helper 2023-06-01 10:11:20 +01:00
Matt-Yorkley
e5eb622ac7 Cut dead code 2023-06-01 10:11:20 +01:00
Filipe
6b98e2b3cb Merge pull request #10911 from jibees/10901-white-label-customized-logo-on-small-screens-doesnt-use-the-customized-url
[White Label] Small width screens : use the white label link if exists for logo in nav bar
2023-06-01 08:16:53 +01:00
Filipe
61b70a25d9 Merge pull request #10897 from openfoodfoundation/dependabot/npm_and_yarn/mrujs-1.0.0
chore(deps): bump mrujs from 0.10.1 to 1.0.0
2023-06-01 08:03:32 +01:00
Filipe
e0d24ed5c0 Merge pull request #10912 from openfoodfoundation/dependabot/bundler/puma-6.3.0
chore(deps): bump puma from 6.2.2 to 6.3.0
2023-06-01 07:42:22 +01:00
Filipe
2d4d8e26f5 Merge pull request #10875 from jibees/10561-allow-user-to-create-custom-tab-in-shop-navigation
[White Label] Allow user to create custom tab in shop navigation
2023-06-01 07:21:25 +01:00
Maikel
add725b6c0 Merge pull request #10861 from mkllnk/dfc-import
Update products with DFC Prototype
2023-06-01 08:48:39 +10:00
Filipe
5f429c77f8 Merge pull request #10791 from dacook/10630-new-brand-colours
[admin_v3] New brand colours in admin interface
2023-05-31 16:03:18 +01:00
dependabot[bot]
1b6815515e chore(deps): bump puma from 6.2.2 to 6.3.0
Bumps [puma](https://github.com/puma/puma) from 6.2.2 to 6.3.0.
- [Release notes](https://github.com/puma/puma/releases)
- [Changelog](https://github.com/puma/puma/blob/master/History.md)
- [Commits](https://github.com/puma/puma/compare/v6.2.2...v6.3.0)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-05-31 10:01:43 +00:00
Jean-Baptiste Bellet
ac30e8b9da Use the white label link if exists, otherwise, use the main_app.root_path 2023-05-31 10:46:23 +02:00
Filipe
668a573f12 Merge pull request #10908 from filipefurtad0/flaky_simple_spec
Changes date through keystrokes; removes Retry option
2023-05-30 16:43:36 +01:00
filipefurtad0
c5358b1303 Changes date through keystrokes; removes Retry option 2023-05-30 10:02:44 +01:00
jibees
7b6077d01f Merge pull request #10905 from openfoodfoundation/dependabot/npm_and_yarn/floating-ui/dom-1.2.9
chore(deps): bump @floating-ui/dom from 1.2.8 to 1.2.9
2023-05-29 14:57:34 +02:00
dependabot[bot]
841a021bc4 chore(deps): bump @floating-ui/dom from 1.2.8 to 1.2.9
Bumps [@floating-ui/dom](https://github.com/floating-ui/floating-ui/tree/HEAD/packages/dom) from 1.2.8 to 1.2.9.
- [Release notes](https://github.com/floating-ui/floating-ui/releases)
- [Commits](https://github.com/floating-ui/floating-ui/commits/@floating-ui/dom@1.2.9/packages/dom)

---
updated-dependencies:
- dependency-name: "@floating-ui/dom"
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-05-29 09:59:12 +00:00
jibees
7ea2aa699d Merge pull request #10904 from mkllnk/update-job-spec
Simplify background report spec after rspec fix
2023-05-29 10:19:31 +02:00
Maikel Linke
3fa62ceccf Simplify background report spec after rspec fix
The rspec-rails gem had an issue which was fixed in the last release.
Now we can remove my workaround and simplify the spec.
2023-05-29 13:25:44 +10:00
David Cook
24c407f920 Merge pull request #10898 from openfoodfoundation/dependabot/bundler/sidekiq-7.1.1
chore(deps): bump sidekiq from 7.1.0 to 7.1.1
2023-05-29 13:09:15 +10:00
Maikel Linke
77f716306d Remove redundant test 2023-05-29 10:07:34 +10:00
Konrad
fff02a7ddb Merge pull request #10893 from jibees/10853-white-label-remove-ofn-logo-on-navigation-menu-for-small-width-screens
[White Label] Small width screens: Hide OFN logo and use the customized logo if activated
2023-05-28 12:00:49 +02:00
Maikel Linke
0dcd87dda9 Update stock and SKU from DFC
The input has been observed with the nginx access log including
$request_body when the DFC Protoype pushed an update.
2023-05-28 10:39:08 +02:00
Maikel Linke
375b3a3cb0 Update variant's quantity from DFC 2023-05-28 10:39:08 +02:00
Maikel Linke
48a52582e6 Update variant description with DFC description
We used the name before because the DFC Prototype only displays the
description.
2023-05-28 10:39:08 +02:00
Maikel Linke
63837381e0 Update DFC test data with observation
This request came from the current DFC prototype. The changes are
probably implementing DFC v1.7.

I observed by including `$request_body` in the nginx log on the staging
server.
2023-05-28 10:39:08 +02:00
Maikel Linke
50ef06c973 Name DFC test data to clarify content
The DFC has several products like PhysicalProduct and SuppliedProduct.
Here we have a supplied product.
2023-05-28 10:39:08 +02:00
Maikel Linke
7344eb678b Remove now unused helper
It was only used in controller specs which were all converted to request
specs.
2023-05-28 10:39:08 +02:00
Maikel Linke
dde4ea9334 Convert CatalogItems controller spec to request spec 2023-05-28 10:39:08 +02:00
Maikel Linke
207a15e55c Convert SuppliedProducts controller spec to request spec 2023-05-28 10:39:08 +02:00
Maikel Linke
742468efd2 Convert EnterpriseController spec to request spec
Also testing request of unrelated enterprise instead of non-existing
enterprise because authorisation is important to test.
2023-05-28 10:39:08 +02:00
Maikel Linke
d338c61d2c Convert PersonsController spec request spec
It's much more realistic and also tests the routing and authentication.
Besides using real authentication I also improved the matchers.
2023-05-28 10:39:08 +02:00
Maikel Linke
67c29dd38f Activate DFC provider engine, remove feature toggle 2023-05-28 10:39:08 +02:00
Jean-Baptiste Bellet
01b3b3b5bb Add some specs around tab for a shop 2023-05-26 15:19:27 +02:00
Jean-Baptiste Bellet
6b29f7e3c5 Sanitize content with a new TrixScrubber
specifically made for trix editor with its allowed tags
2023-05-26 15:19:27 +02:00
Jean-Baptiste Bellet
f26ecdf4f9 Don't need to pass the order through the nested view 2023-05-26 15:19:27 +02:00
Jean-Baptiste Bellet
6775e0b8f1 Add custom_ prefix to avoid name collision
One can name the custom tab `shop` which can be confusing.
2023-05-26 15:19:27 +02:00
Jean-Baptiste Bellet
9e67bd5824 Use specified values to be sure they aren't empty 2023-05-26 15:19:27 +02:00
dependabot[bot]
2f1e3a5c96 chore(deps): bump sidekiq from 7.1.0 to 7.1.1
Bumps [sidekiq](https://github.com/sidekiq/sidekiq) from 7.1.0 to 7.1.1.
- [Changelog](https://github.com/sidekiq/sidekiq/blob/main/Changes.md)
- [Commits](https://github.com/sidekiq/sidekiq/compare/v7.1.0...v7.1.1)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-05-26 10:01:59 +00:00
dependabot[bot]
856fcd9e18 chore(deps): bump mrujs from 0.10.1 to 1.0.0
Bumps [mrujs](https://github.com/KonnorRogers/mrujs) from 0.10.1 to 1.0.0.
- [Changelog](https://github.com/KonnorRogers/mrujs/blob/main/CHANGELOG.md)
- [Commits](https://github.com/KonnorRogers/mrujs/compare/v0.10.1...v1.0.0)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-05-26 09:58:38 +00:00
Matt-Yorkley
e34c2acba8 Move CablecarResponses include to ApplicationController 2023-05-26 10:35:41 +01:00
Matt-Yorkley
2373d044f7 Update app/services/orders_bulk_cancel_service.rb
Co-authored-by: Maikel <maikel@email.org.au>
2023-05-26 10:33:23 +01:00
Jean-Baptiste Bellet
a24604f146 Remove unused enterprise declaration 2023-05-26 10:24:11 +02:00
David Cook
14345ef1fa Change warning orange to Mojo
> That way we only have one orangy/red colour and we start simplifying things.
2023-05-26 15:11:23 +10:00
David Cook
0df7c45a61 Change warning red to Mojo
Some templates still had this colour hardcoded. They are using angular so I didn't spend time updating them.
2023-05-26 15:11:23 +10:00
David Cook
dcf857cafb Move warning colour definition to CSS
This also changes the orange to red, but that's part of the plan.
2023-05-26 15:11:23 +10:00
David Cook
e674c53535 Change error red color to Mojo
color-5 is used for error messages.
2023-05-26 15:11:23 +10:00
David Cook
719a704985 Change blue colour as per design
https://github.com/openfoodfoundation/openfoodnetwork/issues/10630#issue-1644928392
2023-05-26 15:11:23 +10:00
David Cook
60ec24b92b Use variables for spree-blue
Aka 'Havelock Blue', which is going to be changing.
2023-05-26 15:11:23 +10:00
David Cook
e928e74ae6 Use different palette for admin styles v3
Note that mail.css is still referring to the old palette.
2023-05-26 15:10:49 +10:00
David Cook
31fa9c2c04 Add admin_style_v3 feature toggle 2023-05-26 15:10:27 +10:00
David Cook
01b3901b08 Add admin_style_v3
Individual files may be copied in order to replace the old files.

NOTE: these may need manually re-syncing. If any of the copied files have changed on master in the meantime, we'll need to manaully review to consider bringing those changes to the new design.
2023-05-26 15:10:27 +10:00
David Cook
9051318147 Move colour palette to new file
This seemed like a good separation which will probably help with the upcoming changes.

Co-authored-by: jibees <jb.bellet@gmail.com>
2023-05-26 15:09:59 +10:00
Maikel
b013d3f2d4 Merge pull request #10895 from jibees/10894-flaky-speccontrollersapiv0order_cycles_controller_specrb89
Fix flaky spec: Prefer using `match_array` over `eq` to compare array
2023-05-26 14:06:14 +10:00
Maikel Linke
2e52a633ae Acknowledge new style violations 2023-05-26 13:34:48 +10:00
Maikel Linke
15ef826ac1 Style Style/ClassAndModuleChildren 2023-05-26 13:27:34 +10:00
Maikel Linke
f674d5cd37 Style Layout/TrailingEmptyLines 2023-05-26 13:26:30 +10:00
David Cook
875f68b0e2 Update one more translation 2023-05-26 11:46:22 +10:00
Jean-Baptiste Bellet
cf9342f2c4 Prefer using match_array over eq to compare array
As we don't need order: https://rubydoc.info/github/rspec/rspec-expectations/RSpec%2FMatchers:match_array
2023-05-25 15:24:25 +02:00
Jean-Baptiste Bellet
eea1db4c4a Hide OFN logo and use the customized logo if activated 2023-05-25 15:17:04 +02:00
jibees
8dde81c498 Merge pull request #10891 from openfoodfoundation/dependabot/bundler/test-unit-3.5.9
chore(deps): bump test-unit from 3.5.8 to 3.5.9
2023-05-25 13:34:38 +02:00
dependabot[bot]
2084d84c7a chore(deps): bump test-unit from 3.5.8 to 3.5.9
Bumps [test-unit](https://github.com/test-unit/test-unit) from 3.5.8 to 3.5.9.
- [Release notes](https://github.com/test-unit/test-unit/releases)
- [Commits](https://github.com/test-unit/test-unit/compare/3.5.8...3.5.9)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-05-25 09:58:28 +00:00
Filipe
8b7ca292af Merge pull request #10884 from openfoodfoundation/10882-cookie-banner-is-displayed-on-every-page-even-after-accepting
Do not show cookies banner once user accept it
2023-05-25 10:36:27 +01:00
Jean-Baptiste Bellet
f961548da2 Deactivate file upload for trix editor
Source: https://benborgers.com/posts/trix-disable-files
2023-05-25 09:19:51 +02:00
Jean-Baptiste Bellet
e434eb17f0 Use full width since we use a WYSIWYG editor with toolbar 2023-05-25 09:19:51 +02:00
Jean-Baptiste Bellet
bb211bfc84 Allow HTML via trix editor for custom tab content
+ update spec as well
2023-05-25 09:19:51 +02:00
Jean-Baptiste Bellet
4dede3b361 Add trix editor 2023-05-25 09:19:51 +02:00
Jean-Baptiste Bellet
6e677f15ec Can delete custom tab if uncheck the checkbox 2023-05-25 09:19:51 +02:00
Jean-Baptiste Bellet
f0665b0862 Add custom tab on shop 2023-05-25 09:19:51 +02:00
Jean-Baptiste Bellet
916b2313ab Some links does not include _panel suffix. Add if needed.
Yep. Sounds like a hack.

+ Use the right URL anchor with `_panel` in href for each tab

+ update specs
2023-05-25 09:19:51 +02:00
Jean-Baptiste Bellet
fc21fdb485 Customize default tab: could be either shop or home 2023-05-25 09:19:51 +02:00
Jean-Baptiste Bellet
6b1d1ddbce On order cycle change, go to shop panel 2023-05-25 09:19:51 +02:00
Jean-Baptiste Bellet
a28a792642 Allow communication between controllers via event 2023-05-25 09:19:51 +02:00
Jean-Baptiste Bellet
bb6b1e59f9 Use tabs_and_panels_controller.js instead of PageSelectionCtrl
Prefer StimulusJS over Angular
2023-05-25 09:19:51 +02:00
Jean-Baptiste Bellet
925b0e0308 Add a form in admin to create/update a custom tab for an enterprise 2023-05-25 09:19:51 +02:00
Jean-Baptiste Bellet
839419791f Create CustomTab model, that belongs to an enterprise 2023-05-25 09:19:51 +02:00
David Cook
f890d9ceb4 Update all locales with the latest Transifex translations 2023-05-25 17:12:10 +10:00
jibees
abc0a29ddb Merge pull request #10889 from mkllnk/dead-code
Remove dead reference to removed model
2023-05-25 09:10:14 +02:00
Maikel Linke
86c35fe2dc Remove dead reference to removed model 2023-05-25 16:13:33 +10:00
Filipe
6d032002f1 Merge pull request #10750 from jibees/10560-allow-hide-of-groups-tab-in-shop-navigation
White Label: allow hide of groups tab in shop navigation
2023-05-24 21:11:04 +01:00
filipefurtad0
ca107c036c Enables caching for cookies_spec.rb 2023-05-24 19:46:28 +02:00
jibees
e60376e6bd Merge pull request #10885 from openfoodfoundation/dependabot/bundler/faraday-2.7.5
chore(deps): bump faraday from 2.7.4 to 2.7.5
2023-05-24 15:18:10 +02:00
jibees
d704157fef Merge pull request #10886 from openfoodfoundation/dependabot/bundler/knapsack_pro-4.1.0
chore(deps-dev): bump knapsack_pro from 4.0.0 to 4.1.0
2023-05-24 15:17:16 +02:00
dependabot[bot]
b985ab8d99 chore(deps-dev): bump knapsack_pro from 4.0.0 to 4.1.0
Bumps [knapsack_pro](https://github.com/KnapsackPro/knapsack_pro-ruby) from 4.0.0 to 4.1.0.
- [Changelog](https://github.com/KnapsackPro/knapsack_pro-ruby/blob/master/CHANGELOG.md)
- [Commits](https://github.com/KnapsackPro/knapsack_pro-ruby/compare/v4.0.0...v4.1.0)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-05-24 10:10:08 +00:00
dependabot[bot]
d60ba96fe9 chore(deps): bump faraday from 2.7.4 to 2.7.5
Bumps [faraday](https://github.com/lostisland/faraday) from 2.7.4 to 2.7.5.
- [Release notes](https://github.com/lostisland/faraday/releases)
- [Changelog](https://github.com/lostisland/faraday/blob/main/CHANGELOG.md)
- [Commits](https://github.com/lostisland/faraday/compare/v2.7.4...v2.7.5)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-05-24 10:08:17 +00:00
Jean-Baptiste Bellet
3cd53cbd41 Adds some keys to this cached element, due to cookie banner
Once the user accept the cookie, we should not show the cookie banner element. This is handled via `app/helpers/footer_links_helper.rb#cookies_policy_link` and boolean:

```
!Web::CookiesConsent.new(cookies, request.host).exists? && Spree::Config.cookies_consent_banner_toggle
```
2023-05-24 10:45:06 +02:00
Maikel
32d425dd58 Merge pull request #10880 from openfoodfoundation/dependabot/bundler/knapsack_pro-4.0.0
Bump knapsack_pro from 3.11.0 to 4.0.0
2023-05-24 14:05:09 +10:00
Maikel
ce1317933b Merge pull request #10815 from Pauloparakleto/issue-7483
refactor(spec/system/admin/subscriptions_spec.rb): issue #7483
2023-05-24 11:57:44 +10:00
Maikel
340f10b323 Merge pull request #10539 from filipefurtad0/spec_for_enterprise_fee_selection_tax_inherit
Adds a spec to check enterprise fees creation
2023-05-24 11:29:27 +10:00
Maikel
8c11bf3033 Merge pull request #10839 from mkllnk/valid-email
Validate user's email address
2023-05-24 10:37:00 +10:00
Konrad
0854287b92 Merge pull request #10744 from jibees/10556-remove-ofn-header-banner-in-order-confirmation-emails
White Label: remove OFN banner from order confirmation emails when `hide_ofn_navigation` is activated for the shop
2023-05-24 01:14:16 +02:00
dependabot[bot]
6dc1cb6baa Bump knapsack_pro from 3.11.0 to 4.0.0
Bumps [knapsack_pro](https://github.com/KnapsackPro/knapsack_pro-ruby) from 3.11.0 to 4.0.0.
- [Changelog](https://github.com/KnapsackPro/knapsack_pro-ruby/blob/master/CHANGELOG.md)
- [Commits](https://github.com/KnapsackPro/knapsack_pro-ruby/compare/v3.11.0...v4.0.0)

---
updated-dependencies:
- dependency-name: knapsack_pro
  dependency-type: direct:development
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-05-23 10:01:38 +00:00
Maikel Linke
ef3422bf58 Update syntax and clarify use of outdated gem 2023-05-23 08:23:58 +02:00
Maikel Linke
90cbac7176 Validate email domains
The gem checks the DNS system for a valid domain entry.
2023-05-23 08:23:58 +02:00
Maikel Linke
ffc45f77cf Validate user email syntax on change
We probably have invalid entries in the database and we don't want these
records to suddenly become invalid. People would not be able to log in.
2023-05-23 08:23:58 +02:00
Maikel Linke
101b9025b4 Spec user email validation
The pending spec addresses:

 * https://github.com/openfoodfoundation/openfoodnetwork/issues/10808
2023-05-23 08:23:58 +02:00
Konrad
b56b36f617 Merge pull request #10859 from filipefurtad0/change_voucher_default_message_en
[Vouchers] Updates warning_forfeit_remaining_amount default message
2023-05-23 08:20:41 +02:00
filipefurtad0
5e248aa715 Improving shared_example naming 2023-05-22 12:27:04 +01:00
filipefurtad0
554d515875 Introduces prefix to simplify assertions 2023-05-22 12:27:04 +01:00
Matt-Yorkley
459ef5f0d1 Only delete related exchange variants if exchange is outgoing 2023-05-22 11:09:29 +01:00
Jean-Baptiste Bellet
0bec7562a0 When hide_groups_tab is set to false, do not display group in shopfront
Co-Authored-By: Maikel <maikel@email.org.au>
2023-05-22 10:29:57 +02:00
Jean-Baptiste Bellet
0d98ec8f4c In admin, add form to set hide_groups_tab attribute
+ add specs
2023-05-22 10:29:56 +02:00
Jean-Baptiste Bellet
38cc8a89d1 Add hide_groups_tab to Enterprise model 2023-05-22 10:29:56 +02:00
Matt-Yorkley
7c5067ff42 Update "special instructions" note tooltip and add missing test coverage 2023-05-21 14:06:14 +01:00
Matt-Yorkley
005d95e882 Fix "Resend Confirmation" link and add missing test coverage 2023-05-21 13:33:29 +01:00
Matt-Yorkley
dcdcdb4fc0 Align filter buttons centrally 2023-05-21 00:15:32 +01:00
Matt-Yorkley
abf00353ea Permit explicit params 2023-05-21 00:15:32 +01:00
Matt-Yorkley
be1ed2bbcf Update tomselect multiselect styling 2023-05-21 00:15:32 +01:00
Matt-Yorkley
52450028a1 Fix checkbox alignment 2023-05-21 00:15:32 +01:00
Matt-Yorkley
d50ac4bf45 Reinstate dropdown-with-prepend 2023-05-21 00:15:32 +01:00
Matt-Yorkley
4ddde65a04 Reimplement saving and restoring submitted search filters between page loads 2023-05-21 00:15:32 +01:00
Matt-Yorkley
7d33e0f74d Allow programmatically refreshing flatpickr element via "flatpickr:change" event after changing the select's value externally 2023-05-21 00:15:32 +01:00
Matt-Yorkley
2ba2a826db Clean up event handlers on disconnect in Flatpickr controller 2023-05-21 00:15:32 +01:00
Matt-Yorkley
d64a9afece Replace angular ofn-with-tip directive on capture/ship buttons 2023-05-21 00:15:32 +01:00
Matt-Yorkley
770880c062 Update specs 2023-05-21 00:15:32 +01:00
Matt-Yorkley
310577c49d Close dropdown after selection with multiselect
This conforms with the previous select2 multiselect behaviour
2023-05-21 00:15:32 +01:00
Matt-Yorkley
c3cf79f5ef Delete angular ordersCtrl 2023-05-21 00:15:32 +01:00
Matt-Yorkley
71c4f2a5be Update styling on multiselect tabs for tom-select 2023-05-21 00:15:32 +01:00
Matt-Yorkley
95f1643cec Combine related reflex actions 2023-05-21 00:15:32 +01:00
Matt-Yorkley
bee46720f4 Combine bulk action controllers and pass reflex as an argument 2023-05-21 00:15:32 +01:00
Matt-Yorkley
5930d0c1f5 Make bulk actions more generic 2023-05-21 00:15:32 +01:00
Matt-Yorkley
55d9deb5bd Update order cancelling bulk action 2023-05-21 00:15:32 +01:00
Matt-Yorkley
134f1ab151 Replace angular bulkInvoiceCtrl 2023-05-21 00:15:32 +01:00
Matt-Yorkley
27290e5b57 Make modal controller creatable and destroyable 2023-05-21 00:15:32 +01:00
Matt-Yorkley
25aecfa5b9 Add reflex for shipping orders 2023-05-21 00:15:32 +01:00
Matt-Yorkley
e58a37f65b Add reflex for capturing orders 2023-05-21 00:15:32 +01:00
Matt-Yorkley
61849d84e7 Extract order capturing to OrderCaptureService 2023-05-21 00:15:32 +01:00
Matt-Yorkley
73b41154cc Update admin flashes 2023-05-21 00:15:32 +01:00
Matt-Yorkley
048df6230b Remove angular from admin orders index page 2023-05-21 00:15:32 +01:00
Matt-Yorkley
5ad68f25e3 Handle old jquery_ujs buttons 2023-05-21 00:15:30 +01:00
Matt-Yorkley
3df166fb2f Drop jquery_ujs 2023-05-20 19:47:41 +01:00
Matt-Yorkley
59fd4ad251 Tidy up JS imports 2023-05-20 19:47:41 +01:00
Matt-Yorkley
48a8f57262 Prep admin JS 2023-05-20 19:47:41 +01:00
Matt-Yorkley
f181b35a90 Add minimal admin js setup 2023-05-20 19:47:41 +01:00
Matt-Yorkley
c4bc0a7bbd Rename select-all-controller 2023-05-20 19:47:41 +01:00
paulo-felipe
3a35f12801 chore(spec/system/admin/subscriptions_spec.rb): issue #7483
Group together sample tests to avoid rebuilding browser state.
2023-05-19 19:55:27 -03:00
paulo-felipe
c9ab092f7c chore(spec/system/admin/subscriptions_spec.rb): issue #7483
Add back comment explaining bill address has been pre-loaded.
2023-05-19 19:55:27 -03:00
paulo-felipe
1e1d4b07d1 refactor(spec/system/admin/subscriptions_spec.rb): issue #7483
Remove the old chained smoke test.
2023-05-19 19:55:27 -03:00
paulo-felipe
bd05f40b17 lint(spec/system/admin/subscriptions_spec.rb): issue #7483
Solve line too long offense and separate variables from expectations.
2023-05-19 19:55:27 -03:00
paulo-felipe
105d695f18 refactor(spec/system/admin/subscriptions_spec.rb): issue #7483
add unit test to check creation of standing line items when click create subscription without changing shipping address.
2023-05-19 19:55:27 -03:00
paulo-felipe
4df550fcf1 refactor(spec/system/admin/subscriptions_spec.rb): issue #7483
add unit test to check basic Subscription properties when click create subscription without changing shipping address.
2023-05-19 19:55:27 -03:00
paulo-felipe
49ceec8b8e refactor(spec/system/admin/subscriptions_spec.rb): issue #7483
share common before action Create subscription between samples.
2023-05-19 19:55:27 -03:00
paulo-felipe
03aade4072 refactor(spec/system/admin/subscriptions_spec.rb): issue #7483
Add context when click Create Subscription button on third page after click next button previously on second page.

It has selector for price, input for quantity and selector for total price.
2023-05-19 19:55:27 -03:00
paulo-felipe
f0da85d723 refactor(spec/system/admin/subscriptions_spec.rb): issue #7483
Add context when click Create Subscription button on third page after click next button previously on second page.
2023-05-19 19:55:27 -03:00
paulo-felipe
8c709e13e0 lint(spec/system/admin/subscriptions_spec.rb): issue #7483
Solve line too lng offense.
2023-05-19 19:55:27 -03:00
paulo-felipe
c63a8d12f7 refactor(spec/system/admin/subscriptions_spec.rb): issue #7483
Add context on third page and adding a product AND deleting the existing product AND adding a new product and click next button.
2023-05-19 19:55:26 -03:00
paulo-felipe
5a5aa4c067 refactor(spec/system/admin/subscriptions_spec.rb): issue #7483
Add context on third page and adding a product AND deleting the existing product AND adding a new product.
2023-05-19 19:55:26 -03:00
paulo-felipe
5776bdb31c refactor(spec/system/admin/subscriptions_spec.rb): issue #7483
Add context on third page and adding a product AND deleting the existing product.
2023-05-19 19:55:26 -03:00
paulo-felipe
b0623ab4de refactor(spec/system/admin/subscriptions_spec.rb): issue #7483
Add context on third page and adding a product.
2023-05-19 19:55:26 -03:00
paulo-felipe
f05e2618be refactor(spec/system/admin/subscriptions_spec.rb): issue #7483
Add context on third page and click next button without adding at least one product.
2023-05-19 19:55:26 -03:00
paulo-felipe
35ce463811 refactor(spec/system/admin/subscriptions_spec.rb): issue #7483
Add context on third page.
2023-05-19 19:55:26 -03:00
paulo-felipe
7efc68281e refactor(spec/system/admin/subscriptions_spec.rb): issue #7483
Add context when using copy button to fill in ship address.
2023-05-19 19:55:26 -03:00
paulo-felipe
aa16110e9a refactor(spec/system/admin/subscriptions_spec.rb): issue #7483
Add context when resetting the billing address after clearing the bill address. MOve scenario to its before do block.
2023-05-19 19:55:26 -03:00
paulo-felipe
39a76861f3 refactor(spec/system/admin/subscriptions_spec.rb): issue #7483
Add context when resetting the billing address after clearing the bill address.
2023-05-19 19:55:26 -03:00
paulo-felipe
79ff13e8ba refactor(spec/system/admin/subscriptions_spec.rb): issue #7483
Move on second page to a before action and clearing some elements of bill address to a before action. Let the unit test with the action isolated.
2023-05-19 19:55:26 -03:00
paulo-felipe
573ab1beb0 refactor(spec/system/admin/subscriptions_spec.rb): issue #7483
Add context on second page when clearing some elements of the bill address.
2023-05-19 19:55:26 -03:00
paulo-felipe
384ad1ba12 refactor(spec/system/admin/subscriptions_spec.rb): issue #7483
Group context for first page scenarios. Extract common customer actions to its before do block.
2023-05-19 19:55:26 -03:00
paulo-felipe
77857a0168 refactor(spec/system/admin/subscriptions_spec.rb): issue #7483
Add context when date field is filled. It goes to the next page with preloaded data.
2023-05-19 19:55:26 -03:00
paulo-felipe
47b0d626e2 refactor(spec/system/admin/subscriptions_spec.rb): issue #7483
Isolate when no field is filled on first screen describe it better as per reviewer suggestion.
2023-05-19 19:55:26 -03:00
paulo-felipe
0bf7e53ce4 refactor(spec/system/admin/subscriptions_spec.rb): issue #7483
Isolate when no field is filled on first screen.
2023-05-19 19:55:26 -03:00
Konrad
fed7c3da51 Merge pull request #10761 from rioug/vouchers-any-amount
[Vouchers] Flat rate of any amount
2023-05-19 17:39:33 +02:00
Matt-Yorkley
a8559e621f Simplify exchange variant callback and prefer delete over destroy
Delete is faster than destroy but should only be used if the object has no callbacks or touches.
2023-05-19 11:26:33 +01:00
Matt-Yorkley
434c9ae110 Delete exchange variants in bulk when deleting an order cycle 2023-05-19 10:46:55 +01:00
David Cook
9d7316c553 Use a fixed value for voucher factory 2023-05-19 17:19:54 +10:00
Maikel Linke
37441be371 Update translations 2023-05-19 14:33:23 +10:00
Maikel
0d403f4087 Merge pull request #10814 from Matt-Yorkley/serializer-eager-loading
Improve eager-loading on admin products page
2023-05-19 14:31:25 +10:00
Maikel
f943b411c5 Merge pull request #10823 from abdellani/fix-file-name-used-as-parameter
[Security] Validate product import file path
2023-05-19 14:28:09 +10:00
Maikel
7af14e37fa Merge pull request #10488 from mkllnk/dfc-connector
Serialize DFC catalog items with DFC Connector
2023-05-19 11:31:23 +10:00
filipefurtad0
8d2885e147 Updates spec after merging #10512 2023-05-18 16:04:30 +01:00
filipefurtad0
51b144f174 Covers editing into invalid combinations 2023-05-18 15:59:48 +01:00
filipefurtad0
4e2095f0fb Tests enterprise fee creation
...when inheriting tax category from product

as shared examples
2023-05-18 15:59:48 +01:00
Filipe
3d1b0816ed Merge pull request #10512 from abdellani/fix-tax-not-charged-when-tax-category-set-to-inherit-from-product
Prevent saving the enterprise fee when a per order calculator is selected along with 'Inherit from product'
2023-05-18 13:43:14 +01:00
Konrad
39bb1f6f41 Merge pull request #10832 from Matt-Yorkley/cloning
Clone all ExchangeVariant objects in bulk
2023-05-18 14:32:30 +02:00
filipefurtad0
c99829e457 Updates spec to reflect change on en.yml 2023-05-18 12:11:37 +01:00
filipefurtad0
7ea3834900 Updates warning_forfeit_remaining_amount default message 2023-05-18 11:57:15 +01:00
David Cook
360a241402 Style fix 2023-05-18 10:07:52 +10:00
Filipe
0d23b63bbd Merge pull request #10779 from dacook/10634-remove-admin_style_v2
10634 Remove admin_style_v2 feature
2023-05-17 15:37:05 +01:00
Konrad
19caadb1a0 Merge pull request #10800 from dacook/remove-localisation
Also remove localized number logic from weight calculator
2023-05-17 14:57:26 +02:00
David Cook
c0c123a92a Remove localized number logic from weight calculator
Follow-on from a46eef291c
2023-05-17 14:10:58 +02:00
Konrad
f26bef5f98 Merge pull request #10813 from saunmanoj888/fix-fullname-search-issue-on-bulk-orders
Fix searching issue with full name on bulk order management
2023-05-17 13:58:04 +02:00
saunmanoj888
aee7645e29 Fix searching issue with full name on bulk order management 2023-05-17 13:14:10 +02:00
Konrad
02873d7596 Merge pull request #10817 from Matt-Yorkley/permissions-scoping
Scope orders before bulk actions
2023-05-17 12:44:07 +02:00
Matt-Yorkley
e1b0a03819 Scope orders before bulk actions 2023-05-17 12:03:40 +02:00
Jean-Baptiste Bellet
2336981ca0 Do not display OFN banner on order confirmation email if white label 2023-05-17 11:35:18 +02:00
Jean-Baptiste Bellet
dfafbfe996 Create an order confirmation email preview of the last completed order
Available on `/rails/mailers/order_mailer/confirm_email_for_customer`
2023-05-17 11:35:06 +02:00
Jean-Baptiste Bellet
f7d06fe0e8 Do not display OFN banner on subscription confirmation email if white label
+ add specs that test for the presence of the footer logo which is in the header (I know it's a bit contradictory)
2023-05-17 11:34:35 +02:00
Jean-Baptiste Bellet
3ed89fc2db Create a subscription confirmation email preview of the last completed order
Available on: `/rails/mailers/subscription_mailer/confirmation_email`
2023-05-17 11:34:16 +02:00
Maikel Linke
eaf3bd0bae Update spec after new import file validation 2023-05-17 15:18:29 +10:00
Mohamed ABDELLANI
fcb8550cb1 extract file path sanitizer to an independent class 2023-05-17 15:09:48 +10:00
Mohamed ABDELLANI
4d5ba6a7e6 add file path validation 2023-05-17 15:09:48 +10:00
Maikel Linke
a0d05b26d1 Spec current product import vulnerabilities
I didn't use pending specs but deliberately passing specs on wrong
behaviour. This is not how it should be but how it is at the moment.
2023-05-17 15:09:01 +10:00
Konrad
4a66b62fa7 Merge pull request #10825 from jibees/10824-remove-feature-toggle-on-white-label-feature
Activate white label feature
2023-05-16 13:50:58 +02:00
Maikel
16329e953f Merge pull request #10844 from openfoodfoundation/dependabot/npm_and_yarn/jasmine-core-5.0.0
Bump jasmine-core from 4.6.0 to 5.0.0
2023-05-16 17:50:39 +10:00
Gaetan Craig-Riou
abf2105df7 Admin::VoucherController check enterprise permission 2023-05-16 16:20:04 +10:00
Gaetan Craig-Riou
355af9e818 Per review comment, build enterprise instead of create
Speed up testing by removing unnecessarily created record
2023-05-16 16:20:04 +10:00
Gaetan Craig-Riou
b585f77be4 Make enterprise mandatory for a voucher
It should have already been the case...
2023-05-16 16:20:04 +10:00
Gaetan Craig-Riou
2d8fa24862 Add a voucher factory
As vouchers are getting more complicated, it makes sense to use a
factory to simplify writing test.
2023-05-16 16:20:04 +10:00
Gaetan Craig-Riou
b427e420ce Update admin pages to allow entering an amount 2023-05-16 16:20:04 +10:00
Gaetan Craig-Riou
15eee8175e Add amount to voucher
Change value to amount to be more consistent
2023-05-16 16:19:59 +10:00
Maikel
10c918be75 Merge pull request #10732 from mkllnk/report-email
[Hidden] Notify about completed report with download link via email
2023-05-16 10:25:23 +10:00
Maikel
a979f7c8df Merge pull request #10587 from rioug/10432-vouchers-bare-minimum-checkout
10432 vouchers bare minimum checkout
2023-05-16 09:19:06 +10:00
Maikel Linke
08aff56e20 Expire report files after 1 week, maximum for S3
We didn't see this in tests which use disk storage. But AWS S3 has a
maximum of one week for URL expiry.
2023-05-15 19:41:45 +02:00
Maikel Linke
5ae04a5a3e Hide report link which only works at unknown time
It was bad UX to show a link that doesn't work straight away. At the
time, it was the only way to download the report but now we send an
email which is a much better way to go.

I leave the rest of the code because we want to implement a reflex which
shows the download link once it's ready.
2023-05-15 19:41:45 +02:00
Maikel Linke
299bc253a4 Expire report download links in a month, not 5mins 2023-05-15 19:41:45 +02:00
Maikel Linke
8a8c53ceee Add ReportMailer preview for devs 2023-05-15 19:41:45 +02:00
Maikel Linke
860fe85af9 Add report download link to email notification
I added a system spec to verify that the download link can be generated
within the mailer in a background job. ActiveStorage is a bit particular
when it comes to genererating URLs and depending on the situation it may
generate a redirect URL, a proxy URL or link directly to the storage.
But we want a redirect URL here.
2023-05-15 19:41:45 +02:00
Maikel Linke
cf5a8a26ce Notify only about slow reports
It would be annoying to get an email for reports which display on the
screen immediately.
2023-05-15 19:41:45 +02:00
Maikel Linke
1f4af7f990 Send (dummy) email when background report is done
I'll fill it out in future commits.
2023-05-15 19:41:45 +02:00
Jean-Baptiste Bellet
aaa9bac4dd Remove white_label feature toggle
White label is now activated for everyone.

+ add mock for `spec/controllers/spree/orders_controller_spec.rb`
2023-05-15 17:10:50 +02:00
jibees
d43678c68b Merge pull request #10827 from filipefurtad0/logging_out_spec
Adds test case for logging out
2023-05-15 15:33:56 +02:00
Jean-Baptiste Bellet
ec0cbc5bf9 Avoid warning by being more precise about *.erb files 2023-05-15 15:29:28 +02:00
jibees
a1e4c45daa Merge pull request #10843 from openfoodfoundation/dependabot/bundler/rubocop-1.51.0
Bump rubocop from 1.50.2 to 1.51.0
2023-05-15 15:03:24 +02:00
jibees
edeedc0704 Merge pull request #10841 from openfoodfoundation/dependabot/npm_and_yarn/floating-ui/dom-1.2.8
Bump @floating-ui/dom from 1.2.7 to 1.2.8
2023-05-15 15:02:22 +02:00
jibees
d2539b34e0 Merge pull request #10840 from openfoodfoundation/dependabot/bundler/rails-i18n-7.0.7
Bump rails-i18n from 7.0.6 to 7.0.7
2023-05-15 15:01:12 +02:00
jibees
fea3957481 Merge pull request #10845 from openfoodfoundation/dependabot/bundler/test-unit-3.5.8
Bump test-unit from 3.5.7 to 3.5.8
2023-05-15 15:00:03 +02:00
jibees
b183832fbb Merge pull request #10842 from openfoodfoundation/dependabot/bundler/capybara-3.39.1
Bump capybara from 3.39.0 to 3.39.1
2023-05-15 12:22:59 +02:00
dependabot[bot]
8a352132a0 Bump test-unit from 3.5.7 to 3.5.8
Bumps [test-unit](https://github.com/test-unit/test-unit) from 3.5.7 to 3.5.8.
- [Release notes](https://github.com/test-unit/test-unit/releases)
- [Commits](https://github.com/test-unit/test-unit/compare/3.5.7...3.5.8)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-05-15 10:00:55 +00:00
dependabot[bot]
0e59a5db91 Bump jasmine-core from 4.6.0 to 5.0.0
Bumps [jasmine-core](https://github.com/jasmine/jasmine) from 4.6.0 to 5.0.0.
- [Release notes](https://github.com/jasmine/jasmine/releases)
- [Changelog](https://github.com/jasmine/jasmine/blob/main/RELEASE.md)
- [Commits](https://github.com/jasmine/jasmine/compare/v4.6.0...v5.0.0)

---
updated-dependencies:
- dependency-name: jasmine-core
  dependency-type: direct:development
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-05-15 10:00:22 +00:00
dependabot[bot]
340fe91e07 Bump rubocop from 1.50.2 to 1.51.0
Bumps [rubocop](https://github.com/rubocop/rubocop) from 1.50.2 to 1.51.0.
- [Release notes](https://github.com/rubocop/rubocop/releases)
- [Changelog](https://github.com/rubocop/rubocop/blob/master/CHANGELOG.md)
- [Commits](https://github.com/rubocop/rubocop/compare/v1.50.2...v1.51.0)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-05-15 10:00:15 +00:00
dependabot[bot]
6c126cfc33 Bump capybara from 3.39.0 to 3.39.1
Bumps [capybara](https://github.com/teamcapybara/capybara) from 3.39.0 to 3.39.1.
- [Changelog](https://github.com/teamcapybara/capybara/blob/master/History.md)
- [Commits](https://github.com/teamcapybara/capybara/compare/3.39.0...3.39.1)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-05-15 09:59:19 +00:00
dependabot[bot]
82c6eaab4e Bump @floating-ui/dom from 1.2.7 to 1.2.8
Bumps [@floating-ui/dom](https://github.com/floating-ui/floating-ui/tree/HEAD/packages/dom) from 1.2.7 to 1.2.8.
- [Release notes](https://github.com/floating-ui/floating-ui/releases)
- [Commits](https://github.com/floating-ui/floating-ui/commits/@floating-ui/dom@1.2.8/packages/dom)

---
updated-dependencies:
- dependency-name: "@floating-ui/dom"
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-05-15 09:57:51 +00:00
dependabot[bot]
d4918893a7 Bump rails-i18n from 7.0.6 to 7.0.7
Bumps [rails-i18n](https://github.com/svenfuchs/rails-i18n) from 7.0.6 to 7.0.7.
- [Changelog](https://github.com/svenfuchs/rails-i18n/blob/master/CHANGELOG.md)
- [Commits](https://github.com/svenfuchs/rails-i18n/compare/v7.0.6...v7.0.7)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-05-15 09:57:24 +00:00
jibees
1e05bc5b5c Merge pull request #10789 from jibees/10770-bom-cancelling-an-order-always-restocks-the-line-item
BOM: when deleting the last item of order that leads to order cancellation, take into account the restock items checkbox
2023-05-15 09:50:13 +02:00
Mohamed ABDELLANI
7f52684488 add check_calculators_compatibility_with_taxes before running enterprise bulk update 2023-05-15 07:35:52 +01:00
Gaetan Craig-Riou
5eb6097101 Fix error handling when creating a voucher adjustment
I wrongly assumed that `voucher.create_adjustment` would return nil
if failing to create an adjustment. I will in fact return an
adjustment object with errors.
2023-05-15 13:42:40 +10:00
David Cook
ccff3379ea Update schema.rb
On a freshly mirrored prod db, I found these changes.

I don't know why.. but hopefully this is correct.
2023-05-15 13:42:40 +10:00
Gaetan Craig-Riou
d29119f5c5 Remove non need belongs_to associations from Adjustments
It turns out the "tax_rate" association isn't used and wasn't working.
Same for the "voucher" one, which I added to be consistent with existing
code.
Both of these weren't caught by the specs because you can't test associations
with a custome relation with 'shouda-matchers' see: https://github.com/thoughtbot/shoulda-matchers/issues/981
2023-05-15 13:42:40 +10:00
Gaetan Craig-Riou
b67f5ae154 Fixing Rubocop issue
My editor automatically remove blank character on empty line, that's
why rubocop got grumpy here.
2023-05-15 13:42:40 +10:00
Matt-Yorkley
9b1725d39f Fix model name in adjustment association 2023-05-15 13:42:40 +10:00
Gaetan Craig-Riou
b80274f49d Per review comment, Use named value on voucher submit button to distinguish between submission types
The voucher apply button is inside form that has another a submit button,
it leads to a weird situation where either one will submit the whole
payments page form. Adding a named parameter on the voucher apply button
means we can distinguish between the two by checking for the presence
of params[:apply_voucher].
2023-05-15 13:42:39 +10:00
Gaetan Craig-Riou
92bcd937dc Per review comment, remove form object from the partial
This partial is rendered inside another <form> element, nested form
don't work.
2023-05-15 13:42:39 +10:00
Gaetan Craig-Riou
0a249d7722 Fix ButtonEnableToggleController to remove hacky button disable
As per review comment, use data-disable-with="false" do prevent Rails
from automatically enabling the "Apply" button. We can then remove
the timeout hack.
2023-05-15 13:42:39 +10:00
Gaetan Craig-Riou
236f6926d9 Cleaning up left over TODOs 2023-05-15 13:42:39 +10:00
Gaetan Craig-Riou
aa526a639c Checkout payment page, enable voucher "apply" button when code entered
The "apply" button is disabled by default. If left enabled, a customer
could try to apply an empty voucher, which results in system trying
to move to the order summary step, an unexpected behaviour!
We only enable the button when something is entered in the input.
2023-05-15 13:42:39 +10:00
Gaetan Craig-Riou
e5f14177d3 Fix rubocop warning
I guess the new cops are effective :)
2023-05-15 13:42:39 +10:00
Gaetan Craig-Riou
815dcbcefe Fix translations 2023-05-15 13:42:39 +10:00
Gaetan Craig-Riou
a2e1e6ca33 Review comment, use dig to access voucher_code param 2023-05-15 13:42:39 +10:00
Gaetan Craig-Riou
2f1fe6d096 Fix rubocop warning 2023-05-15 13:42:39 +10:00
Gaetan Craig-Riou
17e32a89f8 Add VoucherAdjustmentsService to handle calculation
Refactor Voucher to move voucher adjustments calculation
to VoucherAdjustmentsService
2023-05-15 13:42:39 +10:00
Gaetan Craig-Riou
56e981d300 Refactor Voucher to get rid of CalculatedAdjustments
Voucher adjustment have complicated calculation that prevent us from
using Spree::Calculator, and we need to override CalculatedAdjustments
method, so no point using it.
We still keep the same methods to stay as consitent as possible in
regards to adjustments
2023-05-15 13:42:39 +10:00
Gaetan Craig-Riou
3f37554ff9 Add VoucherAdjustmentsController and specs
Refactor split checkout to use the new controller. But unfortunately
we can't have nested form, so adding a voucher is still handled by
SplitCheckoutController.
2023-05-15 13:42:39 +10:00
Gaetan Craig-Riou
43ab881181 Rename order association to voucher_adjustments
The name vouchers is a bit confusing as the order is linked to a
voucher adjutment and not the actual voucher
2023-05-15 13:42:39 +10:00
Gaetan Craig-Riou
fe9b94a80e Fix cart disappearing bug after adding a voucher
The split checkout page uses `mrujs` and `CableCar` to set the form as
a remote one and perform `CableCar` operation if any : https://mrujs.com/how-tos/integrate-cablecar
The previous solution broke the cart handled by angularJS, it looks like
`morpdom` (https://mrujs.com/references/remote-forms-and-links Navigation Adapter section )
was doing something that angularJS didn't like when redirecting to
the current page.
With the power of `CableCar`, we now replace the #voucher-section on the
split checkout page instead of doing a redirect.
2023-05-15 13:42:39 +10:00
Gaetan Craig-Riou
94294fa161 Voucher adjustment, add ordering by created_at
It gives us a consistent result when calling #vouchers
2023-05-15 13:42:38 +10:00
Gaetan Craig-Riou
a1ad25f217 Fix failing specs 2023-05-15 13:42:38 +10:00
Gaetan Craig-Riou
bb9d835bd8 Fix rubocop warning 2023-05-15 13:42:38 +10:00
Gaetan Craig-Riou
87cc525d27 Refactor #vouchers
Use "has_many" instead of a method
2023-05-15 13:42:38 +10:00
Gaetan Craig-Riou
4b5d6d7eac Fix voucher adjustments association
Add missing, "inverse_of" and "dependent" options. Use :nullify as
for "dependent" because we would want to keep the adjustments on order
even if the voucher is deleted.
2023-05-15 13:42:38 +10:00
Gaetan Craig-Riou
58469adfeb Adjustments spec, add association test 2023-05-15 13:42:38 +10:00
Gaetan Craig-Riou
5064bf5383 Allow voucher adjustment to be created with an amount of 0
Although unlikely, we should still be able to create a voucher amount
with. This can happen if the order.total is for instance.
2023-05-15 13:42:38 +10:00
Gaetan Craig-Riou
9789911523 Rework how voucher are applied to an order and handle tax calculation
At the time when we can apply a voucher to an order (payment step) we
don't have any data on possible taxes and payment fees. These are
calculated when we move to the summary step. So voucher are applied in
two step:
- create an "open" voucher adjustment on the order when a customer enters
a voucher code.
- when we move to the summary step, recalulate the amount and
possible tax for the voucher adjustment, once taxes and payment fees
have been included in the order. And then close the original and update
order to reflect the changes
2023-05-15 13:42:38 +10:00
Gaetan Craig-Riou
d157d91054 When voucher cover more than order total, use only amount needed
The checkout payment step will also show a warning.
The amount used is stored in the adjustment created, so we will be able
to track how much has been used down the line.
2023-05-15 13:42:38 +10:00
Gaetan Craig-Riou
3f609d3842 Add error message if adding a voucher fails
It's not really useful to the user but better than failing silently
2023-05-15 13:42:38 +10:00
Gaetan Craig-Riou
596c775af6 Add controller spec to cover voucher in split checkout 2023-05-15 13:42:38 +10:00
Gaetan Craig-Riou
74e0b0f6b5 Add voucher adjustment loading to CheckoutCallbacks
This is needed so the voucher is loaded properly when the "checkout"
partials are render via cable_car.
2023-05-15 13:42:38 +10:00
Gaetan Craig-Riou
74a8730f04 Highlight voucher on order summary step 2023-05-15 13:42:38 +10:00
Gaetan Craig-Riou
856386fcb0 SplitCheckoutController refactor add_voucher
Now all redirection/render_error happen in #update, it makes it
easier to understand.
2023-05-15 13:42:37 +10:00
Gaetan Craig-Riou
e487ed0532 Add link to remove voucher when a voucher has been applied
Improve styling to match the design
2023-05-15 13:42:37 +10:00
Gaetan Craig-Riou
b6213b25e9 add acts_as_paranoid to voucher
This is so the relation
`belongs_to :originator, -> { with_deleted }, polymorphic: true`
setup in Spree::Adjustement works as expected.
2023-05-15 13:42:37 +10:00
Gaetan Craig-Riou
a9d9b33f7d First take at adding a voucher to an order
Use voucher.create_adjustment to add an adjustment to the order
Currently doesn't take into account tax part
2023-05-15 13:42:37 +10:00
Gaetan Craig-Riou
3ec58d8791 Add #vouchers, return an array of voucher adjustments 2023-05-15 13:42:37 +10:00
Gaetan Craig-Riou
9b680e1a92 Add CalculatedAdjustments to Voucher
Vouchers are only flat rate of 10 for now, so we add a FlatRate
calculator in a before_validation callback
2023-05-15 13:42:37 +10:00
Gaetan Craig-Riou
f7ee01b9f8 Add voucher input on checkout payment's step
Voucher input is displayed  only if the distributor has any voucher
2023-05-15 13:42:37 +10:00
Maikel
4f7059d0c7 Merge pull request #10838 from filipefurtad0/fix_negative_adjustment_error
Adds minus sign to validation criteria
2023-05-15 11:07:45 +10:00
Gaetan Craig-Riou
d715b6b3bb Spec fix LocalisedNumber validation to allow negative number
As part of this PR https://github.com/openfoodfoundation/openfoodnetwork/pull/10329
LocalisedNumber validation was tightened, but that means negative number
were not valid anymore.

This commit has been cherry-picked after this fix has already been
applied. Now we just change the order of characters in the regex because
humans are used to reading the minus at the beginning of the number. But
this change doesn't change the logic at all.
2023-05-15 10:55:59 +10:00
Maikel
5045e26792 Merge pull request #10834 from mkllnk/variant-spec
Improve readability and performance of variant spec
2023-05-15 09:48:06 +10:00
filipefurtad0
0442f2da7e Fixes spec warning
An example was being ignored due to legacy syntax - WARNING: ignoring the provided expectation message argument since it is not a string or a proc.
2023-05-14 23:02:44 +01:00
filipefurtad0
e7ab839fb3 Adds minus sign as validation criteria
Removes pending from passing examples
2023-05-14 23:02:44 +01:00
filipefurtad0
596b318778 Adds spec on negative adjustment
with different localization settings

Using shared examples and setting failing

ones as pending
2023-05-14 23:02:00 +01:00
Maikel Linke
6596225a99 Fix typo in VCR cassette name 2023-05-12 14:48:00 +10:00
Maikel Linke
87c4c5373b Spec more variant naming with realistic data 2023-05-12 14:10:54 +10:00
Maikel Linke
f70607259a Spec Variant#product_and_full_name with real data
Mocking skips a lot of code execution which we want to test as well.
2023-05-12 13:34:34 +10:00
Maikel Linke
ce180caad9 Test with in-memory data when possible
This should speed up specs but I observed only one second less run time.
2023-05-12 13:21:58 +10:00
Maikel Linke
01be934caf Reduce spec run time by not creating unused subject
The `variant` instance isn't used in all specs and doesn't need to be
created every time. This reduced run time from 1min5sec to 43sec on my
machine.
2023-05-12 13:21:58 +10:00
Maikel Linke
54c6559b97 Move Spree::Variant spec out of Spree module
I also discovered that some specs were just in the Spee module and not
within the `describe Variant` block. I moved them inside the block.
2023-05-12 13:21:19 +10:00
Maikel Linke
636b365304 Tell Rubocop and devs about bulk insert 2023-05-12 10:30:47 +10:00
Jean-Baptiste Bellet
51d6fb81dd Fwd to request the restock_items input value when adjusting items qty 2023-05-11 22:58:44 +02:00
Jean-Baptiste Bellet
f679d8733e Pass the restock_items params to each methods and request call
+ update spec to test whether the restock item checkbox is checked or not.
2023-05-11 22:58:44 +02:00
Matt-Yorkley
b139087c5f Clone ExchangeVariant objects in bulk
An ExchangeVariant is a simple representation of a join table between Exchange and Variant. Previously this code was triggering an additional INSERT query for every variant added to the newly cloned exchange. Some exchanges have ~3000 variants! The code now creates them in bulk in a single INSERT statement. When cloning large order cycles this can improve performance by ~1000% or so.
2023-05-11 20:51:20 +01:00
Mohamed ABDELLANI
6771d2e7be test enterprise fees creation with tax category inheritance flag 2023-05-11 12:46:17 +01:00
Mohamed ABDELLANI
a22fe9f948 fix existing invalid enterprise fees 2023-05-11 12:46:17 +01:00
Maikel Linke
25b7f1749c Simplify error when tax rate can't be inherited
I changed the text to focus on the resolution: the user needs to choose
a tax category or a different calculator.

I associated the error to the model to prevent the attribute name from
being included in the error message. Alternatively, we could have
changed the name of the attribute to match the UI. But this error
affects the combination of two attributes, none of them is invalid on
its own.

I'm using Rails' default lazy lookup for error messages which results in
shorter code and a standard structure.

I also added a simple spec.
2023-05-11 12:46:17 +01:00
Mohamed ABDELLANI
89eb3a1967 fix existing tests 2023-05-11 12:46:17 +01:00
Mohamed ABDELLANI
7eca32e84f prevent saving the enterprise fee when a per order calculator is selected along with 'Inherit from product' 2023-05-11 12:46:17 +01:00
filipefurtad0
82f307ae61 Adds test case for logging out 2023-05-10 10:41:43 +01:00
David Cook
04a5c7452e Remove admin_style_v2 description
Partially reverts 9a1b1498bf
2023-05-09 21:26:47 +10:00
David Cook
e29df5ea8f Remove unused secondary class
This partially reverts 97c3aaebb2 because it referred to the new feature toggle which has been removed.
2023-05-09 21:26:47 +10:00
David Cook
3ec659d82b Revert pull #10025
[WIP 🚧 ] Admin, behind feature toggle admin_style_v2: adjust some colors

This reverts commits 60f0a58508ce77666fa96c73d76dc0620f23daaf~1..09bcc772ff089f911a56bb
2023-05-09 21:26:47 +10:00
David Cook
be70cd7893 Revert pull #10054
[WIP 🚧 ] Admin/Orders, behind feature toggle admin_style_v2: adjust colors

This reverts commits 5cab0f7f3d495daaeb97fd786208a24355b630fe..4ef5609b0eb08fe7e48803de166ae3e979103c1b
2023-05-09 21:26:47 +10:00
David Cook
0ff540e1e3 Revert pull #10080
[WIP 🚧 ] Admin - Order edition, behind feature toggle admin_style_v2: adjust colors

This reverts commits faf106b2824f248812f523c10b688bd9b254dc14..74b618230ff736ac7929246e2c83ed95067a4dd0
2023-05-09 21:25:29 +10:00
David Cook
c21ff075de Revert pull #10131
[WIP 🚧 ] /admin/order_cycles behind feature toggle admin_style_v2

This reverts commits ccfc632149f062fca546784c7c2f14708d91a08e~1..e403a2c174def34cfa115eab038c86923482bfbf
2023-05-09 21:24:25 +10:00
Maikel Linke
3c6f55732d Add dummy product type to DFC export 2023-05-09 17:01:00 +10:00
Maikel Linke
b2e8af0cd1 Add stock to DFC Offer as well 2023-05-09 16:51:26 +10:00
Maikel Linke
c81230d334 Add old DFC API name for prototype compatibility 2023-05-09 16:51:26 +10:00
Maikel Linke
54137067dd Export variant's display_name if present
The `#name` method is simply delegated to a variant's product.
2023-05-09 16:51:26 +10:00
Maikel Linke
0c5ab783ca Update DFC API route to reflect Connector version 2023-05-09 16:51:26 +10:00
Maikel Linke
80edc44ef5 Replace SuppliedProductSerializer with DFC Connector
And remove the BaseSerializer because this was the last serializer.
2023-05-09 16:51:26 +10:00
Maikel Linke
0b808a4b1e Add product quantity to DFC export 2023-05-09 16:51:26 +10:00
Maikel Linke
1e23cf1c92 Replace EnterpriseSerializer with DFC Connector
And move same test coverage to a new builder spec.
2023-05-09 16:51:26 +10:00
Maikel Linke
683ad0f5b9 Replace PersonSerializer with DFC Connector
And the address serializer was just an empty placeholder.
2023-05-09 16:51:26 +10:00
Maikel Linke
c60d622818 List catalog items with DFC Connector 2023-05-09 16:51:25 +10:00
Maikel Linke
7f8ce08d4e Include DFC Offer in the export with valid id 2023-05-09 16:51:25 +10:00
Maikel Linke
78cf3b5a1d Serialize DFC catalog item with DFC Connector
This is work in progress. The DFC Connector uses a more recent DFC
version and other endpoints still use the old serializers. We need to
update those endpoints as well and update the version number in the API
URL.
2023-05-09 16:51:25 +10:00
Maikel Linke
5187201796 Add DFC vocabularies
- Add a script for downloading updated files.
- Add a service for easier loading of vocab files.
2023-05-09 16:51:25 +10:00
Maikel Linke
352c350840 Add gem datafoodconsortium-connector
We hope that replacing our own JSON generation with this gem will reduce
maintenance. Same for parsing DFC input.
2023-05-09 16:51:25 +10:00
Matt-Yorkley
1995a44848 Improve eager-loading on admin products page adn resolve issue with serializer
For some reason eager-loaded data isn't passed to nested serializers when using associations. Defining the association as a method and passing in some optional paramaters resolves the issue.

This reduces queries run by the controller action by around 75%, as well as the response times.
2023-05-06 17:15:27 +01:00
580 changed files with 20420 additions and 7694 deletions

49
.github/workflows/stage.yml vendored Normal file
View File

@@ -0,0 +1,49 @@
name: "Deploy to Staging"
on:
pull_request:
types: [labeled]
workflow_dispatch:
inputs:
server:
description: "Staging Server"
type: choice
required: true
options:
- staging.openfoodnetwork.org.uk
- staging.openfoodnetwork.org.au
- staging.coopcircuits.fr
permissions:
contents: read
jobs:
deploy_pr:
if: contains(fromJSON('["pr-staged-uk", "pr-staged-au", "pr-staged-fr"]'), github.event.label.name)
runs-on: ubuntu-latest
steps:
- name: Configure deployment key
run: |
install -m 600 -D /dev/null ~/.ssh/id_rsa
echo "${{ secrets.DEPLOYMENT_KEY }}" > ~/.ssh/id_rsa
echo "${{ secrets.DEPLOYMENT_HOSTS }}" > ~/.ssh/known_hosts
- name: Deploy to Staging
env:
LABEL: ${{ github.event.label.name }}
run: |
ssh ofn-deploy@${{ github.event.label.description }} -o LogLevel=ERROR "pull-request-${{ github.event.pull_request.number }} ."
deploy_branch:
if: ${{ inputs.server }}
runs-on: ubuntu-latest
steps:
- name: Configure deployment key
run: |
install -m 600 -D /dev/null ~/.ssh/id_rsa
echo "${{ secrets.DEPLOYMENT_KEY }}" > ~/.ssh/id_rsa
echo "${{ secrets.DEPLOYMENT_HOSTS }}" > ~/.ssh/known_hosts
- name: Deploy to Staging
run: |
ssh ofn-deploy@${{ inputs.server }} -o LogLevel=ERROR "$GITHUB_REF_NAME $GITHUB_SHA"

View File

@@ -1,4 +1,4 @@
# Basically, ignore everythings expect app/webpacker/controllers/*.js and app/webpacker/packs/*.js
# Ignore a lot of things, but we should enable where it can be helpful.
*.md
*.yml
@@ -6,13 +6,21 @@
*.json
*.html
# JS
# Enabled: app/webpacker/controllers/*.js and app/webpacker/packs/*.js
babel.config.js
postcss.config.js
# SCSS
# Enabled: most of admin
/app/webpacker/css/admin/globals/
/app/webpacker/css/admin/shared/
/app/webpacker/css/admin_v3/globals/variables.scss
/app/webpacker/css/darkswarm/
/app/webpacker/css/mail/
/app/webpacker/css/shared/
# More
/app/assets/
/config/
/coverage/

View File

@@ -1,6 +1,6 @@
# This configuration was generated by
# `rubocop --auto-gen-config --auto-gen-only-exclude --exclude-limit 1400 --no-auto-gen-timestamp`
# using RuboCop version 1.50.2.
# using RuboCop version 1.52.0.
# The point is for the user to remove these configuration records
# one by one as the offenses are removed from the code base.
# Note that changes in the inspected code, or installation of new
@@ -16,7 +16,7 @@ Gemspec/RequiredRubyVersion:
- 'engines/order_management/order_management.gemspec'
- 'engines/web/web.gemspec'
# Offense count: 28
# Offense count: 31
# This cop supports safe autocorrection (--autocorrect).
# Configuration parameters: EnforcedStyle, IndentationWidth.
# SupportedStyles: with_first_argument, with_fixed_indentation
@@ -62,11 +62,10 @@ Layout/BlockEndNewline:
- 'spec/lib/open_food_network/enterprise_fee_calculator_spec.rb'
- 'spec/system/admin/orders_spec.rb'
# Offense count: 3
# Offense count: 2
# This cop supports safe autocorrection (--autocorrect).
Layout/ClosingParenthesisIndentation:
Exclude:
- 'lib/reporting/queries/joins.rb'
- 'spec/system/admin/orders_spec.rb'
# Offense count: 1
@@ -100,7 +99,7 @@ Layout/FirstHashElementIndentation:
Exclude:
- 'spec/services/products_renderer_spec.rb'
# Offense count: 11
# Offense count: 10
# This cop supports safe autocorrection (--autocorrect).
# Configuration parameters: AllowMultipleStyles, EnforcedHashRocketStyle, EnforcedColonStyle, EnforcedLastArgumentHashStyle.
# SupportedHashRocketStyles: key, separator, table
@@ -109,7 +108,6 @@ Layout/FirstHashElementIndentation:
Layout/HashAlignment:
Exclude:
- 'app/controllers/spree/users_controller.rb'
- 'app/models/spree/image.rb'
- 'spec/migrations/migrate_customer_names_spec.rb'
- 'spec/models/enterprise_spec.rb'
- 'spec/system/admin/customers_spec.rb'
@@ -199,35 +197,28 @@ Layout/LineEndStringConcatenationIndentation:
- 'spec/system/consumer/cookies_spec.rb'
- 'spec/system/consumer/shopping/cart_spec.rb'
# Offense count: 615
# Offense count: 606
# This cop supports safe autocorrection (--autocorrect).
# Configuration parameters: Max, AllowHeredoc, AllowURI, URISchemes, IgnoreCopDirectives, AllowedPatterns.
# URISchemes: http, https
Layout/LineLength:
Exclude:
- 'app/components/confirm_modal_component.rb'
- 'app/controllers/admin/bulk_line_items_controller.rb'
- 'app/controllers/admin/enterprise_fees_controller.rb'
- 'app/controllers/admin/enterprise_relationships_controller.rb'
- 'app/controllers/admin/enterprises_controller.rb'
- 'app/controllers/admin/product_import_controller.rb'
- 'app/controllers/admin/schedules_controller.rb'
- 'app/controllers/admin/subscriptions_controller.rb'
- 'app/controllers/api/v0/order_cycles_controller.rb'
- 'app/controllers/payment_gateways/paypal_controller.rb'
- 'app/helpers/angular_form_builder.rb'
- 'app/helpers/angular_form_helper.rb'
- 'app/helpers/enterprises_helper.rb'
- 'app/helpers/order_cycles_helper.rb'
- 'app/helpers/spree/orders_helper.rb'
- 'app/jobs/subscription_confirm_job.rb'
- 'app/mailers/subscription_mailer.rb'
- 'app/models/column_preference.rb'
- 'app/models/concerns/order_shipment.rb'
- 'app/models/concerns/product_stock.rb'
- 'app/models/concerns/variant_stock.rb'
- 'app/models/customer.rb'
- 'app/models/enterprise.rb'
- 'app/models/product_import/entry_processor.rb'
- 'app/models/product_import/spreadsheet_entry.rb'
- 'app/models/product_import/unit_converter.rb'
- 'app/models/proxy_order.rb'
@@ -236,17 +227,13 @@ Layout/LineLength:
- 'app/models/spree/gateway/stripe_sca.rb'
- 'app/models/spree/line_item.rb'
- 'app/models/spree/order.rb'
- 'app/models/spree/payment_method.rb'
- 'app/models/spree/preferences/store.rb'
- 'app/models/subscription.rb'
- 'app/models/variant_override.rb'
- 'app/serializers/api/admin/subscription_line_item_serializer.rb'
- 'app/services/cart_service.rb'
- 'app/services/checkout/post_checkout_actions.rb'
- 'app/services/embedded_page_service.rb'
- 'app/services/order_cycle_form.rb'
- 'app/services/order_syncer.rb'
- 'app/services/products_renderer.rb'
- 'app/services/variant_units/variant_and_line_item_naming.rb'
- 'engines/order_management/app/services/order_management/subscriptions/validator.rb'
- 'engines/order_management/spec/services/order_management/order/updater_spec.rb'
@@ -260,7 +247,6 @@ Layout/LineLength:
- 'lib/open_food_network/scope_variants_for_search.rb'
- 'lib/reporting/line_items.rb'
- 'lib/reporting/reports/enterprise_fee_summary/report_data/enterprise_fee_type_total.rb'
- 'lib/reporting/reports/xero_invoices/base.rb'
- 'lib/spree/localized_number.rb'
- 'lib/tasks/data.rake'
- 'lib/tasks/enterprises.rake'
@@ -362,11 +348,12 @@ Layout/LineLength:
- 'spec/support/cancan_helper.rb'
- 'spec/support/features/datepicker_helper.rb'
- 'spec/support/matchers/select2_matchers.rb'
- 'spec/support/matchers/table_matchers.rb'
- 'spec/support/request/web_helper.rb'
- 'spec/system/admin/adjustments_spec.rb'
- 'spec/system/admin/bulk_order_management_spec.rb'
- 'spec/system/admin/bulk_product_update_spec.rb'
- 'spec/system/admin/order_spec.rb'
- 'spec/system/admin/product_import_spec.rb'
# Offense count: 1
# This cop supports safe autocorrection (--autocorrect).
@@ -374,13 +361,12 @@ Layout/MultilineBlockLayout:
Exclude:
- 'engines/order_management/app/services/order_management/subscriptions/validator.rb'
# Offense count: 7
# Offense count: 6
# This cop supports safe autocorrection (--autocorrect).
# Configuration parameters: EnforcedStyle.
# SupportedStyles: symmetrical, new_line, same_line
Layout/MultilineMethodCallBraceLayout:
Exclude:
- 'lib/reporting/queries/joins.rb'
- 'spec/system/admin/orders_spec.rb'
- 'spec/system/admin/products_spec.rb'
@@ -412,7 +398,7 @@ Layout/TrailingEmptyLines:
Exclude:
- 'Rakefile'
# Offense count: 70
# Offense count: 76
# This cop supports safe autocorrection (--autocorrect).
# Configuration parameters: AllowInHeredoc.
Layout/TrailingWhitespace:
@@ -420,7 +406,6 @@ Layout/TrailingWhitespace:
- 'app/controllers/spree/users_controller.rb'
- 'app/controllers/user_confirmations_controller.rb'
- 'app/models/enterprise.rb'
- 'app/models/spree/image.rb'
- 'spec/controllers/spree/credit_cards_controller_spec.rb'
- 'spec/controllers/user_confirmations_controller_spec.rb'
- 'spec/factories/order_factory.rb'
@@ -438,7 +423,6 @@ Layout/TrailingWhitespace:
- 'spec/system/admin/order_spec.rb'
- 'spec/system/admin/product_import_spec.rb'
- 'spec/system/admin/shipping_methods_spec.rb'
- 'spec/system/consumer/split_checkout_spec.rb'
# Offense count: 7
# This cop supports safe autocorrection (--autocorrect).
@@ -468,7 +452,7 @@ Lint/ConstantDefinitionInBlock:
- 'spec/validators/date_time_string_validator_spec.rb'
- 'spec/validators/integer_array_validator_spec.rb'
# Offense count: 8
# Offense count: 6
# Configuration parameters: IgnoreLiteralBranches, IgnoreConstantBranches.
Lint/DuplicateBranch:
Exclude:
@@ -550,13 +534,17 @@ Lint/RedundantDirGlobSort:
- 'spec/base_spec_helper.rb'
- 'spec/system_helper.rb'
# Offense count: 1
# Offense count: 6
# This cop supports unsafe autocorrection (--autocorrect-all).
# Configuration parameters: AllowedMethods.
# AllowedMethods: instance_of?, kind_of?, is_a?, eql?, respond_to?, equal?
Lint/RedundantSafeNavigation:
Exclude:
- 'app/models/report_blob.rb'
- 'app/models/spree/payment.rb'
- 'app/serializers/api/admin/subscription_line_item_serializer.rb'
- 'lib/open_food_network/address_finder.rb'
- 'lib/tasks/missing_payments.rake'
# Offense count: 2
# This cop supports safe autocorrection (--autocorrect).
@@ -581,6 +569,7 @@ Lint/UselessMethodDefinition:
- 'app/models/spree/gateway.rb'
# Offense count: 3
# This cop supports safe autocorrection (--autocorrect).
# Configuration parameters: CheckForMethodsWithNoSideEffects.
Lint/Void:
Exclude:
@@ -639,11 +628,16 @@ Metrics/BlockLength:
- 'spec/factories/user_factory.rb'
- 'spec/factories/variant_factory.rb'
- 'spec/requests/api/orders_spec.rb'
- 'spec/requests/checkout/failed_checkout_spec.rb'
- 'spec/requests/checkout/stripe_sca_spec.rb'
- 'spec/support/cancan_helper.rb'
- 'spec/support/matchers/select2_matchers.rb'
- 'spec/support/matchers/table_matchers.rb'
- 'spec/swagger_helper.rb'
- 'spec/system/consumer/shopping/checkout_spec.rb'
- 'spec/system/consumer/shopping/checkout_stripe_spec.rb'
- 'spec/system/consumer/shopping/variant_overrides_spec.rb'
- 'spec/system/consumer/split_checkout_tax_not_incl_spec.rb'
# Offense count: 1
# Configuration parameters: CountBlocks, Max.
@@ -651,11 +645,12 @@ Metrics/BlockNesting:
Exclude:
- 'app/models/spree/payment/processing.rb'
# Offense count: 46
# Offense count: 47
# Configuration parameters: CountComments, Max, CountAsOne.
Metrics/ClassLength:
Exclude:
- 'app/components/products_table_component.rb'
- 'app/controllers/admin/enterprise_fees_controller.rb'
- 'app/controllers/admin/enterprises_controller.rb'
- 'app/controllers/admin/order_cycles_controller.rb'
- 'app/controllers/admin/resource_controller.rb'
@@ -686,6 +681,7 @@ Metrics/ClassLength:
- 'app/models/spree/payment.rb'
- 'app/models/spree/product.rb'
- 'app/models/spree/shipment.rb'
- 'app/models/spree/shipping_method.rb'
- 'app/models/spree/user.rb'
- 'app/models/spree/variant.rb'
- 'app/models/spree/zone.rb'
@@ -702,7 +698,7 @@ Metrics/ClassLength:
- 'lib/reporting/reports/enterprise_fee_summary/scope.rb'
- 'lib/reporting/reports/xero_invoices/base.rb'
# Offense count: 35
# Offense count: 36
# Configuration parameters: AllowedMethods, AllowedPatterns, Max.
Metrics/CyclomaticComplexity:
Exclude:
@@ -757,7 +753,7 @@ Metrics/MethodLength:
- 'lib/reporting/reports/xero_invoices/base.rb'
- 'lib/tasks/sample_data/product_factory.rb'
# Offense count: 50
# Offense count: 49
# Configuration parameters: CountComments, Max, CountAsOne.
Metrics/ModuleLength:
Exclude:
@@ -806,16 +802,16 @@ Metrics/ModuleLength:
- 'spec/models/spree/product_spec.rb'
- 'spec/models/spree/shipping_method_spec.rb'
- 'spec/models/spree/tax_rate_spec.rb'
- 'spec/models/spree/variant_spec.rb'
- 'spec/services/permissions/order_spec.rb'
- 'spec/services/variant_units/option_value_namer_spec.rb'
- 'spec/support/request/shop_workflow.rb'
- 'spec/support/request/stripe_stubs.rb'
# Offense count: 7
# Offense count: 8
# Configuration parameters: Max, CountKeywordArgs, MaxOptionalParameters.
Metrics/ParameterLists:
Exclude:
- 'app/components/confirm_modal_component.rb'
- 'app/helpers/angular_form_builder.rb'
- 'app/models/product_import/entry_processor.rb'
- 'lib/reporting/reports/xero_invoices/base.rb'
@@ -850,6 +846,7 @@ Naming/HeredocDelimiterNaming:
- 'app/models/content_configuration.rb'
# Offense count: 5
# This cop supports unsafe autocorrection (--autocorrect-all).
# Configuration parameters: EnforcedStyleForLeadingUnderscores.
# SupportedStylesForLeadingUnderscores: disallowed, required, optional
Naming/MemoizedInstanceVariableName:
@@ -897,7 +894,7 @@ Rails/ActionOrder:
- 'app/controllers/spree/admin/variants_controller.rb'
- 'app/controllers/user_confirmations_controller.rb'
# Offense count: 15
# Offense count: 13
# This cop supports safe autocorrection (--autocorrect).
# Configuration parameters: Include.
# Include: app/models/**/*.rb
@@ -907,7 +904,6 @@ Rails/ActiveRecordCallbacksOrder:
- 'app/models/enterprise.rb'
- 'app/models/enterprise_group.rb'
- 'app/models/enterprise_relationship.rb'
- 'app/models/spree/line_item.rb'
- 'app/models/spree/order.rb'
- 'app/models/spree/payment.rb'
- 'app/models/spree/product.rb'
@@ -928,12 +924,6 @@ Rails/ApplicationController:
Exclude:
- 'engines/dfc_provider/app/controllers/dfc_provider/base_controller.rb'
# Offense count: 1
# This cop supports unsafe autocorrection (--autocorrect-all).
Rails/ApplicationJob:
Exclude:
- 'app/jobs/report_job.rb'
# Offense count: 5
# This cop supports unsafe autocorrection (--autocorrect-all).
# Configuration parameters: NilOrEmpty, NotPresent, UnlessPresent.
@@ -994,7 +984,7 @@ Rails/FilePath:
- 'spec/models/content_configuration_spec.rb'
- 'spec/support/downloads_helper.rb'
# Offense count: 11
# Offense count: 8
# Configuration parameters: Include.
# Include: app/models/**/*.rb
Rails/HasAndBelongsToMany:
@@ -1002,12 +992,9 @@ Rails/HasAndBelongsToMany:
- 'app/models/enterprise.rb'
- 'app/models/enterprise_group.rb'
- 'app/models/order_cycle.rb'
- 'app/models/spree/line_item.rb'
- 'app/models/spree/option_value.rb'
- 'app/models/spree/role.rb'
- 'app/models/spree/shipping_method.rb'
- 'app/models/spree/user.rb'
- 'app/models/spree/variant.rb'
- 'app/models/spree/zone.rb'
# Offense count: 47
@@ -1074,18 +1061,16 @@ Rails/I18nLocaleTexts:
Exclude:
- 'app/controllers/admin/stripe_accounts_controller.rb'
# Offense count: 27
# Offense count: 26
# Configuration parameters: IgnoreScopes, Include.
# Include: app/models/**/*.rb
Rails/InverseOf:
Exclude:
- 'app/models/enterprise.rb'
- 'app/models/order_cycle.rb'
- 'app/models/spree/adjustment.rb'
- 'app/models/spree/country.rb'
- 'app/models/spree/inventory_unit.rb'
- 'app/models/spree/line_item.rb'
- 'app/models/spree/option_type.rb'
- 'app/models/spree/order.rb'
- 'app/models/spree/payment.rb'
- 'app/models/spree/price.rb'
@@ -1120,7 +1105,7 @@ Rails/LexicallyScopedActionFilter:
- 'app/controllers/spree/admin/zones_controller.rb'
- 'app/controllers/spree/users_controller.rb'
# Offense count: 9
# Offense count: 8
# This cop supports unsafe autocorrection (--autocorrect-all).
Rails/NegateInclude:
Exclude:
@@ -1129,11 +1114,10 @@ Rails/NegateInclude:
- 'app/models/product_import/spreadsheet_entry.rb'
- 'app/models/spree/order/checkout.rb'
- 'app/services/order_cart_reset.rb'
- 'engines/order_management/app/services/order_management/stock/estimator.rb'
- 'lib/spree/localized_number.rb'
- 'spec/support/matchers/table_matchers.rb'
# Offense count: 18
# Offense count: 17
Rails/OutputSafety:
Exclude:
- 'app/helpers/angular_form_helper.rb'
@@ -1178,7 +1162,7 @@ Rails/PluckInWhere:
Exclude:
- 'app/models/spree/variant.rb'
# Offense count: 28
# Offense count: 30
# This cop supports unsafe autocorrection (--autocorrect-all).
Rails/RedundantPresenceValidationOnBelongsTo:
Exclude:
@@ -1485,7 +1469,7 @@ Style/GlobalStdStream:
- 'lib/tasks/subscriptions/debug.rake'
- 'lib/tasks/subscriptions/test.rake'
# Offense count: 39
# Offense count: 38
# This cop supports safe autocorrection (--autocorrect).
# Configuration parameters: MinBodyLength, AllowConsecutiveConditionals.
Style/GuardClause:
@@ -1504,7 +1488,6 @@ Style/GuardClause:
- 'app/models/spree/order.rb'
- 'app/models/spree/preferences/preferable_class_methods.rb'
- 'app/services/order_syncer.rb'
- 'app/services/variant_units/variant_and_line_item_naming.rb'
- 'engines/order_management/app/services/order_management/order/updater.rb'
- 'lib/discourse/single_sign_on.rb'
- 'lib/open_food_network/order_cycle_form_applicator.rb'
@@ -1688,7 +1671,7 @@ Style/RedundantStringEscape:
- 'spec/controllers/spree/admin/shipping_methods_controller_spec.rb'
- 'spec/system/admin/enterprise_fees_spec.rb'
# Offense count: 206
# Offense count: 208
Style/Send:
Exclude:
- 'app/controllers/split_checkout_controller.rb'
@@ -1738,7 +1721,7 @@ Style/SlicingWithRange:
- 'engines/order_management/app/services/order_management/subscriptions/validator.rb'
- 'lib/discourse/single_sign_on.rb'
# Offense count: 29
# Offense count: 28
# This cop supports unsafe autocorrection (--autocorrect-all).
# Configuration parameters: Mode.
Style/StringConcatenation:
@@ -1759,7 +1742,6 @@ Style/StringConcatenation:
- 'lib/spree/core/environment_extension.rb'
- 'spec/models/spree/line_item_spec.rb'
- 'spec/models/spree/product_spec.rb'
- 'spec/models/spree/variant_spec.rb'
- 'spec/services/embedded_page_service_spec.rb'
- 'spec/support/api_helper.rb'
- 'spec/support/features/datepicker_helper.rb'

View File

@@ -63,6 +63,7 @@ gem 'devise-token_authenticatable'
gem 'jwt', '~> 2.3'
gem 'oauth2', '~> 1.4.7' # Used for Stripe Connect
gem 'datafoodconsortium-connector'
gem 'jsonapi-serializer'
gem 'pagy', '~> 5.1'
@@ -118,8 +119,6 @@ gem 'test-unit', '~> 3.5'
gem 'coffee-rails', '~> 5.0.0'
gem 'mini_racer'
gem 'angular_rails_csrf'
gem 'jquery-rails', '4.4.0'

View File

@@ -44,73 +44,73 @@ GEM
remote: https://rubygems.org/
specs:
Ascii85 (1.1.0)
actioncable (7.0.4.3)
actionpack (= 7.0.4.3)
activesupport (= 7.0.4.3)
actioncable (7.0.5)
actionpack (= 7.0.5)
activesupport (= 7.0.5)
nio4r (~> 2.0)
websocket-driver (>= 0.6.1)
actionmailbox (7.0.4.3)
actionpack (= 7.0.4.3)
activejob (= 7.0.4.3)
activerecord (= 7.0.4.3)
activestorage (= 7.0.4.3)
activesupport (= 7.0.4.3)
actionmailbox (7.0.5)
actionpack (= 7.0.5)
activejob (= 7.0.5)
activerecord (= 7.0.5)
activestorage (= 7.0.5)
activesupport (= 7.0.5)
mail (>= 2.7.1)
net-imap
net-pop
net-smtp
actionmailer (7.0.4.3)
actionpack (= 7.0.4.3)
actionview (= 7.0.4.3)
activejob (= 7.0.4.3)
activesupport (= 7.0.4.3)
actionmailer (7.0.5)
actionpack (= 7.0.5)
actionview (= 7.0.5)
activejob (= 7.0.5)
activesupport (= 7.0.5)
mail (~> 2.5, >= 2.5.4)
net-imap
net-pop
net-smtp
rails-dom-testing (~> 2.0)
actionpack (7.0.4.3)
actionview (= 7.0.4.3)
activesupport (= 7.0.4.3)
rack (~> 2.0, >= 2.2.0)
actionpack (7.0.5)
actionview (= 7.0.5)
activesupport (= 7.0.5)
rack (~> 2.0, >= 2.2.4)
rack-test (>= 0.6.3)
rails-dom-testing (~> 2.0)
rails-html-sanitizer (~> 1.0, >= 1.2.0)
actionpack-action_caching (1.2.2)
actionpack (>= 4.0.0)
actiontext (7.0.4.3)
actionpack (= 7.0.4.3)
activerecord (= 7.0.4.3)
activestorage (= 7.0.4.3)
activesupport (= 7.0.4.3)
actiontext (7.0.5)
actionpack (= 7.0.5)
activerecord (= 7.0.5)
activestorage (= 7.0.5)
activesupport (= 7.0.5)
globalid (>= 0.6.0)
nokogiri (>= 1.8.5)
actionview (7.0.4.3)
activesupport (= 7.0.4.3)
actionview (7.0.5)
activesupport (= 7.0.5)
builder (~> 3.1)
erubi (~> 1.4)
rails-dom-testing (~> 2.0)
rails-html-sanitizer (~> 1.1, >= 1.2.0)
active_model_serializers (0.8.4)
activemodel (>= 3.0)
active_storage_validations (1.0.3)
active_storage_validations (1.0.4)
activejob (>= 5.2.0)
activemodel (>= 5.2.0)
activestorage (>= 5.2.0)
activesupport (>= 5.2.0)
activejob (7.0.4.3)
activesupport (= 7.0.4.3)
activejob (7.0.5)
activesupport (= 7.0.5)
globalid (>= 0.3.6)
activemerchant (1.123.0)
activesupport (>= 4.2)
builder (>= 2.1.2, < 4.0.0)
i18n (>= 0.6.9)
nokogiri (~> 1.4)
activemodel (7.0.4.3)
activesupport (= 7.0.4.3)
activerecord (7.0.4.3)
activemodel (= 7.0.4.3)
activesupport (= 7.0.4.3)
activemodel (7.0.5)
activesupport (= 7.0.5)
activerecord (7.0.5)
activemodel (= 7.0.5)
activesupport (= 7.0.5)
activerecord-import (1.4.1)
activerecord (>= 4.2)
activerecord-postgresql-adapter (0.0.1)
@@ -121,14 +121,14 @@ GEM
multi_json (~> 1.11, >= 1.11.2)
rack (>= 2.0.8, < 3)
railties (>= 5.2.4.1)
activestorage (7.0.4.3)
actionpack (= 7.0.4.3)
activejob (= 7.0.4.3)
activerecord (= 7.0.4.3)
activesupport (= 7.0.4.3)
activestorage (7.0.5)
actionpack (= 7.0.5)
activejob (= 7.0.5)
activerecord (= 7.0.5)
activesupport (= 7.0.5)
marcel (~> 1.0)
mini_mime (>= 1.1.0)
activesupport (7.0.4.3)
activesupport (7.0.5)
concurrent-ruby (~> 1.0, >= 1.0.2)
i18n (>= 1.6, < 2)
minitest (>= 5.1)
@@ -157,17 +157,17 @@ GEM
awesome_nested_set (3.5.0)
activerecord (>= 4.0.0, < 7.1)
aws-eventstream (1.2.0)
aws-partitions (1.760.0)
aws-sdk-core (3.171.1)
aws-partitions (1.779.0)
aws-sdk-core (3.174.0)
aws-eventstream (~> 1, >= 1.0.2)
aws-partitions (~> 1, >= 1.651.0)
aws-sigv4 (~> 1.5)
jmespath (~> 1, >= 1.6.1)
aws-sdk-kms (1.64.0)
aws-sdk-core (~> 3, >= 3.165.0)
aws-sdk-kms (1.66.0)
aws-sdk-core (~> 3, >= 3.174.0)
aws-sigv4 (~> 1.1)
aws-sdk-s3 (1.122.0)
aws-sdk-core (~> 3, >= 3.165.0)
aws-sdk-s3 (1.124.0)
aws-sdk-core (~> 3, >= 3.174.0)
aws-sdk-kms (~> 1)
aws-sigv4 (~> 1.4)
aws-sigv4 (1.5.2)
@@ -191,7 +191,7 @@ GEM
railties (>= 5.2)
thread-local (>= 1.1.0)
cancancan (1.15.0)
capybara (3.39.0)
capybara (3.39.2)
addressable
matrix
mini_mime (>= 0.1.3)
@@ -219,7 +219,7 @@ GEM
matrix
ruby-rc4 (>= 0.1.5)
concurrent-ruby (1.2.2)
connection_pool (2.4.0)
connection_pool (2.4.1)
crack (0.4.5)
rexml
crass (1.0.6)
@@ -234,13 +234,15 @@ GEM
activerecord (>= 5.a)
database_cleaner-core (~> 2.0.0)
database_cleaner-core (2.0.1)
datafoodconsortium-connector (1.0.0.pre.alpha.6)
virtual_assembly-semantizer (~> 1.0, >= 1.0.4)
date (3.3.3)
ddtrace (1.11.1)
debase-ruby_core_source (>= 0.10.16, <= 3.2.0)
ddtrace (1.12.1)
debase-ruby_core_source (= 3.2.1)
libdatadog (~> 2.0.0.1.0)
libddwaf (~> 1.8.2.0.0)
libddwaf (~> 1.9.0.0.0)
msgpack
debase-ruby_core_source (3.2.0)
debase-ruby_core_source (3.2.1)
debug (1.8.0)
irb (>= 1.5.0)
reline (>= 0.3.1)
@@ -274,7 +276,7 @@ GEM
factory_bot_rails (6.2.0)
factory_bot (~> 6.2.0)
railties (>= 5.0.0)
faraday (2.7.4)
faraday (2.7.6)
faraday-net_http (>= 2.0, < 3.1)
ruby2_keywords (>= 0.0.4)
faraday-follow_redirects (0.3.0)
@@ -338,7 +340,7 @@ GEM
hiredis (0.6.3)
htmlentities (4.3.4)
httpclient (2.8.3)
i18n (1.13.0)
i18n (1.14.1)
concurrent-ruby (~> 1.0)
i18n-js (3.9.2)
i18n (>= 0.6.6)
@@ -359,12 +361,20 @@ GEM
jquery-ui-rails (4.2.1)
railties (>= 3.2.16)
json (2.6.3)
json-canonicalization (0.3.1)
json-jwt (1.16.3)
activesupport (>= 4.2)
aes_key_wrap
bindata
faraday (~> 2.0)
faraday-follow_redirects
json-ld (3.2.3)
htmlentities (~> 4.3)
json-canonicalization (~> 0.3)
link_header (~> 0.0, >= 0.0.8)
multi_json (~> 1.15)
rack (~> 2.2)
rdf (~> 3.2, >= 3.2.9)
json-schema (3.0.0)
addressable (>= 2.8)
json_spec (1.1.5)
@@ -372,23 +382,23 @@ GEM
rspec (>= 2.0, < 4.0)
jsonapi-serializer (2.2.0)
activesupport (>= 4.2)
jwt (2.7.0)
knapsack_pro (3.11.0)
jwt (2.7.1)
knapsack_pro (5.1.0)
rake
launchy (2.5.0)
addressable (~> 2.7)
letter_opener (1.8.1)
launchy (>= 2.2, < 3)
libdatadog (2.0.0.1.0)
libddwaf (1.8.2.0.0)
libddwaf (1.9.0.0.1)
ffi (~> 1.0)
libv8-node (16.10.0.0)
link_header (0.0.8)
listen (3.8.0)
rb-fsevent (~> 0.10, >= 0.10.3)
rb-inotify (~> 0.9, >= 0.9.10)
loofah (2.20.0)
loofah (2.21.3)
crass (~> 1.0.2)
nokogiri (>= 1.5.9)
nokogiri (>= 1.12.0)
mail (2.8.1)
mini_mime (>= 0.1.1)
net-imap
@@ -406,14 +416,12 @@ GEM
mini_magick (4.11.0)
mini_mime (1.1.2)
mini_portile2 (2.8.2)
mini_racer (0.6.3)
libv8-node (~> 16.10.0.0)
minitest (5.18.0)
monetize (1.12.0)
money (~> 6.12)
money (6.16.0)
i18n (>= 0.6.4, <= 2)
msgpack (1.7.0)
msgpack (1.7.1)
multi_json (1.15.0)
multi_xml (0.6.0)
net-imap (0.3.4)
@@ -426,8 +434,8 @@ GEM
net-smtp (0.3.3)
net-protocol
nio4r (2.5.9)
nokogiri (1.14.3)
mini_portile2 (~> 2.8.0)
nokogiri (1.15.2)
mini_portile2 (~> 2.8.2)
racc (~> 1.4)
oauth2 (1.4.11)
faraday (>= 0.17.3, < 3.0)
@@ -462,11 +470,12 @@ GEM
paper_trail (12.3.0)
activerecord (>= 5.2)
request_store (~> 1.1)
parallel (1.22.1)
paranoia (2.6.1)
parallel (1.23.0)
paranoia (2.6.2)
activerecord (>= 5.1, < 7.1)
parser (3.2.2.0)
parser (3.2.2.3)
ast (~> 2.4.1)
racc
paypal-sdk-core (0.3.4)
multi_json (~> 1.0)
xml-simple
@@ -479,19 +488,19 @@ GEM
ruby-rc4
ttfunk
pg (1.2.3)
power_assert (2.0.2)
power_assert (2.0.3)
private_address_check (0.5.0)
pry (0.13.1)
coderay (~> 1.1)
method_source (~> 1.0)
public_suffix (5.0.1)
puma (6.2.2)
puma (6.3.0)
nio4r (~> 2.0)
query_count (1.1.1)
activerecord (>= 4.2)
railties (>= 4.2)
raabro (1.4.0)
racc (1.6.2)
racc (1.7.0)
rack (2.2.7)
rack-mini-profiler (2.3.4)
rack (>= 1.2.0)
@@ -509,20 +518,20 @@ GEM
rack-test (2.1.0)
rack (>= 1.3)
rack-timeout (0.6.3)
rails (7.0.4.3)
actioncable (= 7.0.4.3)
actionmailbox (= 7.0.4.3)
actionmailer (= 7.0.4.3)
actionpack (= 7.0.4.3)
actiontext (= 7.0.4.3)
actionview (= 7.0.4.3)
activejob (= 7.0.4.3)
activemodel (= 7.0.4.3)
activerecord (= 7.0.4.3)
activestorage (= 7.0.4.3)
activesupport (= 7.0.4.3)
rails (7.0.5)
actioncable (= 7.0.5)
actionmailbox (= 7.0.5)
actionmailer (= 7.0.5)
actionpack (= 7.0.5)
actiontext (= 7.0.5)
actionview (= 7.0.5)
activejob (= 7.0.5)
activemodel (= 7.0.5)
activerecord (= 7.0.5)
activestorage (= 7.0.5)
activesupport (= 7.0.5)
bundler (>= 1.15.0)
railties (= 7.0.4.3)
railties (= 7.0.5)
rails-controller-testing (1.0.5)
actionpack (>= 5.0.1.rc1)
actionview (>= 5.0.1.rc1)
@@ -535,15 +544,16 @@ GEM
activesupport (>= 4.2)
choice (~> 0.2.0)
ruby-graphviz (~> 1.2)
rails-html-sanitizer (1.5.0)
loofah (~> 2.19, >= 2.19.1)
rails-i18n (7.0.6)
rails-html-sanitizer (1.6.0)
loofah (~> 2.21)
nokogiri (~> 1.14)
rails-i18n (7.0.7)
i18n (>= 0.7, < 2)
railties (>= 6.0.0, < 8)
rails_safe_tasks (1.0.0)
railties (7.0.4.3)
actionpack (= 7.0.4.3)
activesupport (= 7.0.4.3)
railties (7.0.5)
actionpack (= 7.0.5)
activesupport (= 7.0.5)
method_source
rake (>= 12.2)
thor (~> 1.0)
@@ -557,11 +567,13 @@ GEM
rb-fsevent (0.11.2)
rb-inotify (0.10.1)
ffi (~> 1.0)
rdf (3.2.9)
link_header (~> 0.0, >= 0.0.8)
redcarpet (3.6.0)
redis (4.8.1)
redis-client (0.14.1)
connection_pool
regexp_parser (2.8.0)
regexp_parser (2.8.1)
reline (0.3.3)
io-console (~> 0.5)
request_store (1.5.1)
@@ -594,7 +606,7 @@ GEM
rspec-mocks (3.12.5)
diff-lcs (>= 1.2.0, < 2.0)
rspec-support (~> 3.12.0)
rspec-rails (6.0.2)
rspec-rails (6.0.3)
actionpack (>= 6.1)
activesupport (>= 6.1)
railties (>= 6.1)
@@ -615,17 +627,17 @@ GEM
rswag-ui (2.9.0)
actionpack (>= 3.1, < 7.1)
railties (>= 3.1, < 7.1)
rubocop (1.50.2)
rubocop (1.52.1)
json (~> 2.3)
parallel (~> 1.10)
parser (>= 3.2.0.0)
parser (>= 3.2.2.3)
rainbow (>= 2.2.2, < 4.0)
regexp_parser (>= 1.8, < 3.0)
rexml (>= 3.2.5, < 4.0)
rubocop-ast (>= 1.28.0, < 2.0)
ruby-progressbar (~> 1.7)
unicode-display_width (>= 2.4.0, < 3.0)
rubocop-ast (1.28.0)
rubocop-ast (1.29.0)
parser (>= 3.2.1.0)
rubocop-rails (2.19.1)
activesupport (>= 4.2.0)
@@ -655,12 +667,12 @@ GEM
semantic_range (3.0.0)
shoulda-matchers (5.3.0)
activesupport (>= 5.2.0)
sidekiq (7.1.0)
sidekiq (7.1.2)
concurrent-ruby (< 2)
connection_pool (>= 2.3.0)
rack (>= 2.2.4)
redis-client (>= 0.14.0)
sidekiq-scheduler (5.0.2)
sidekiq-scheduler (5.0.3)
rufus-scheduler (~> 3.2)
sidekiq (>= 6, < 8)
tilt (>= 1.4.0)
@@ -707,9 +719,9 @@ GEM
attr_required (>= 0.0.5)
httpclient (>= 2.4)
temple (0.8.2)
test-unit (3.5.7)
test-unit (3.6.0)
power_assert
thor (1.2.1)
thor (1.2.2)
thread-local (1.1.0)
tilt (2.1.0)
timecop (0.9.6)
@@ -729,7 +741,7 @@ GEM
activemodel (>= 3.0.0)
public_suffix
vcr (6.1.0)
view_component (3.0.0)
view_component (3.2.0)
activesupport (>= 5.2.0, < 8.0)
concurrent-ruby (~> 1.0)
method_source (~> 1.0)
@@ -737,6 +749,8 @@ GEM
rails (>= 5.2, < 8.0)
stimulus_reflex (>= 3.5.0.pre2)
view_component (>= 2.28.0)
virtual_assembly-semantizer (1.0.4)
json-ld (~> 3.2, >= 3.2.3)
warden (1.2.9)
rack (>= 2.0.9)
web-console (4.2.0)
@@ -802,6 +816,7 @@ DEPENDENCIES
combine_pdf
cuprite
database_cleaner
datafoodconsortium-connector
db2fog!
ddtrace
debug (>= 1.0.0)
@@ -844,7 +859,6 @@ DEPENDENCIES
mime-types
mimemagic (> 0.3.5)
mini_portile2 (~> 2.8)
mini_racer
monetize (~> 1.11)
oauth2 (~> 1.4.7)
omniauth-rails_csrf_protection

View File

@@ -7,7 +7,6 @@
// jquery and angular
//= require jquery2
//= require jquery_ujs
//= require jquery.ui.all
//= require jquery.powertip
//= require jquery.cookie

View File

@@ -9,6 +9,7 @@ angular.module("admin.lineItems").controller 'LineItemsCtrl', ($scope, $timeout,
$scope.sharedResource = false
$scope.columns = Columns.columns
$scope.sorting = SortOptions
$scope.sorting.toggle("order_date")
$scope.pagination = LineItems.pagination
$scope.per_page_options = [
{id: 15, name: t('js.admin.orders.index.per_page', results: 15)},
@@ -22,6 +23,7 @@ angular.module("admin.lineItems").controller 'LineItemsCtrl', ($scope, $timeout,
"order_bill_address_phone",
"order_bill_address_firstname",
"order_bill_address_lastname",
"order_bill_address_full_name",
"variant_product_supplier_name",
"order_email",
"order_number",
@@ -60,6 +62,8 @@ angular.module("admin.lineItems").controller 'LineItemsCtrl', ($scope, $timeout,
$scope.dereferenceLoadedData()
$scope.loadOrders = ->
return $scope.orders = [] unless $scope.line_items.length
RequestMonitor.load $scope.orders = Orders.index(
"q[id_in][]": $scope.line_items.map((line_item) -> line_item.order.id)
)
@@ -78,6 +82,7 @@ angular.module("admin.lineItems").controller 'LineItemsCtrl', ($scope, $timeout,
"q[order_order_cycle_id_eq]": $scope.orderCycleFilter,
"q[order_completed_at_gteq]": if formattedStartDate then formattedStartDate else undefined,
"q[order_completed_at_lt]": if formattedEndDate then formattedEndDate else undefined,
"q[s]": "order_completed_at desc",
"page": $scope.page,
"per_page": $scope.per_page
)
@@ -121,16 +126,16 @@ angular.module("admin.lineItems").controller 'LineItemsCtrl', ($scope, $timeout,
else
StatusMessage.display 'failure', t "unsaved_changes_error"
$scope.cancelOrder = (order, sendEmailCancellation) ->
$scope.cancelOrder = (order, sendEmailCancellation, restock_items) ->
return $http(
method: 'GET'
url: "/admin/orders/#{order.number}/fire?e=cancel&send_cancellation_email=#{sendEmailCancellation}")
url: "/admin/orders/#{order.number}/fire?e=cancel&send_cancellation_email=#{sendEmailCancellation}&restock_items=#{restock_items}")
$scope.deleteLineItem = (lineItem) ->
if lineItem.order.item_count == 1
ofnCancelOrderAlert((confirm, sendEmailCancellation) ->
ofnCancelOrderAlert((confirm, sendEmailCancellation, restock_items) ->
if confirm
$scope.cancelOrder(lineItem.order, sendEmailCancellation).then(->
$scope.cancelOrder(lineItem.order, sendEmailCancellation, restock_items).then(->
$scope.refreshData()
)
else
@@ -152,11 +157,11 @@ angular.module("admin.lineItems").controller 'LineItemsCtrl', ($scope, $timeout,
willCancelOrders = true if (order.item_count == itemsPerOrder.get(order).length)
if willCancelOrders
ofnCancelOrderAlert((confirm, sendEmailCancellation) ->
ofnCancelOrderAlert((confirm, sendEmailCancellation, restock_items) ->
if confirm
itemsPerOrder.forEach (items, order) =>
if order.item_count == items.length
$scope.cancelOrder(order, sendEmailCancellation).then(-> $scope.refreshData())
$scope.cancelOrder(order, sendEmailCancellation, restock_items).then(-> $scope.refreshData())
else
Promise.all(LineItems.delete(item) for item in items).then(-> $scope.refreshData())
, "js.admin.deleting_item_will_cancel_order")

View File

@@ -1,32 +0,0 @@
angular.module("admin.orders").controller "bulkInvoiceCtrl", ($scope, $http, $timeout) ->
$scope.createBulkInvoice = ->
$scope.invoice_id = null
$scope.poll = 1
$scope.loading = true
$scope.message = null
$scope.error = null
$scope.poll_wait = 5 # 5 Seconds between each check
$scope.poll_retries = 80 # Maximum checks before stopping
$http.post('/admin/orders/invoices', {order_ids: $scope.selected_orders}).then (response) ->
$scope.invoice_id = response.data
$scope.pollBulkInvoice()
$scope.pollBulkInvoice = ->
$timeout($scope.nextPoll, $scope.poll_wait * 1000)
$scope.nextPoll = ->
$http.get('/admin/orders/invoices/'+$scope.invoice_id+'/poll').then (response) ->
$scope.loading = false
$scope.message = t('js.admin.orders.index.bulk_invoice_created')
.catch (response) ->
$scope.poll++
if $scope.poll > $scope.poll_retries
$scope.loading = false
$scope.error = t('js.admin.orders.index.bulk_invoice_failed')
return
$scope.pollBulkInvoice()

View File

@@ -1,117 +0,0 @@
angular.module("admin.orders").controller "ordersCtrl", ($scope, $timeout, RequestMonitor, Orders, SortOptions, $window, $filter, $location, KeyValueMapStore) ->
$scope.RequestMonitor = RequestMonitor
$scope.pagination = Orders.pagination
$scope.orders = Orders.all
$scope.sortOptions = SortOptions
$scope.per_page_options = [
{id: 15, name: t('js.admin.orders.index.per_page', results: 15)},
{id: 50, name: t('js.admin.orders.index.per_page', results: 50)},
{id: 100, name: t('js.admin.orders.index.per_page', results: 100)}
]
$scope.selected_orders = []
$scope.checkboxes = {}
$scope.selected = false
$scope.select_all = false
$scope.poll = 0
$scope.rowStatus = {}
KeyValueMapStore.localStorageKey = 'ordersFilters'
KeyValueMapStore.storableKeys = ["q", "sorting", "page", "per_page"]
$scope.initialise = ->
unless KeyValueMapStore.restoreValues($scope)
$scope.setDefaults()
$scope.fetchResults()
$scope.setDefaults = ->
$scope.per_page = 15
$scope.q = {
completed_at_not_null: true
}
e = new CustomEvent("flatpickr_clear");
window.dispatchEvent(e)
$scope.clearFilters = () ->
KeyValueMapStore.clearKeyValueMap()
$scope.setDefaults()
$scope.fetchResults()
$scope.fetchResults = (page=1) ->
startDateWithTime = $scope.appendStringIfNotEmpty($scope.q?.completed_at_gteq, ' 00:00:00')
endDateWithTime = $scope.appendStringIfNotEmpty($scope.q?.completed_at_lteq, ' 23:59:59')
$scope.resetSelected()
params = {
'q[completed_at_gteq]': startDateWithTime,
'q[completed_at_lteq]': endDateWithTime,
'q[state_eq]': $scope.q?.state_eq,
'q[number_cont]': $scope.q?.number_cont,
'q[email_cont]': $scope.q?.email_cont,
'q[bill_address_firstname_start]': $scope.q?.bill_address_firstname_start,
'q[bill_address_lastname_start]': $scope.q?.bill_address_lastname_start,
# Set default checkbox values to null. See: https://github.com/openfoodfoundation/openfoodnetwork/pull/3076#issuecomment-440010498
'q[completed_at_not_null]': $scope.q?.completed_at_not_null || null,
'q[distributor_id_in][]': $scope.q?.distributor_id_in,
'q[order_cycle_id_in][]': $scope.q?.order_cycle_id_in,
'q[s]': $scope.sorting || 'completed_at desc',
shipping_method_id: $scope.q?.shipping_method_id,
per_page: $scope.per_page,
page: page
}
KeyValueMapStore.setStoredValues($scope)
RequestMonitor.load(Orders.index(params).$promise)
$scope.appendStringIfNotEmpty = (baseString, stringToAppend) ->
return baseString unless baseString
return baseString if baseString.endsWith(stringToAppend)
baseString + stringToAppend
$scope.resetSelected = ->
$scope.selected_orders.length = 0
$scope.selected = false
$scope.select_all = false
$scope.checkboxes = {}
$scope.toggleSelection = (id) ->
index = $scope.selected_orders.indexOf(id)
if index == -1
$scope.selected_orders.push(id)
else
$scope.selected_orders.splice(index, 1)
$scope.toggleAll = ->
$scope.selected_orders.length = 0
$scope.orders.forEach (order) ->
$scope.checkboxes[order.id] = $scope.select_all
$scope.selected_orders.push order.id if $scope.select_all
$scope.$watch 'sortOptions', (sort) ->
return unless sort && sort.predicate != ""
$scope.sorting = sort.getSortingExpr()
$scope.fetchResults()
, true
$scope.capturePayment = (order) ->
$scope.rowAction('capture', order)
$scope.shipOrder = (order) ->
$scope.rowAction('ship', order)
$scope.rowAction = (action, order) ->
$scope.rowStatus[order.id] = "loading"
Orders[action](order).$promise.then (data) ->
$scope.rowStatus[order.id] = "success"
$timeout(->
$scope.rowStatus[order.id] = null
, 1500)
, (error) ->
$scope.rowStatus[order.id] = "error"
$scope.changePage = (newPage) ->
$scope.page = newPage
$scope.fetchResults(newPage)

View File

@@ -1,5 +0,0 @@
angular.module("admin.orders").directive "invoicesModal", ($modal) ->
restrict: 'C'
link: (scope, elem, attrs, ctrl) ->
elem.on "click", (ev) =>
scope.uploadModal = $modal.open(templateUrl: 'admin/modals/bulk_invoice.html', controller: ctrl, scope: scope, windowClass: 'simple-modal')

View File

@@ -100,6 +100,7 @@ adjustItems = function(shipment_number, variant_id, quantity, restock_item){
doAdjustItems(shipment_number, variant_id, quantity, inventory_units, restock_item, () => {
var redirectTo = new URL(Spree.routes.cancel_order.toString());
redirectTo.searchParams.append("send_cancellation_email", sendEmailCancellation);
redirectTo.searchParams.append("restock_item", restock_item);
window.location.href = redirectTo.toString();
});
}

View File

@@ -10,6 +10,12 @@ angular.module("admin.utils").directive "variantAutocomplete", ($timeout) ->
element.select2
placeholder: t('admin.orders.select_variant')
minimumInputLength: 3
formatInputTooShort: ->
t('admin.select2.minimal_search_length', count: 3)
formatSearching: ->
t('admin.select2.searching')
formatNoMatches: ->
t('admin.select2.no_matches')
ajax:
url: Spree.routes.variants_search
datatype: "json"

View File

@@ -5,8 +5,8 @@ angular.module("admin.utils").factory "StatusMessage", ->
alert: {style: {color: 'grey'}}
notice: {style: {color: 'grey'}}
success: {style: {color: '#9fc820'}}
failure: {style: {color: '#da5354'}}
error: {style: {color: '#da5354'}}
failure: {style: {color: '#C85136'}}
error: {style: {color: '#C85136'}}
statusMessage:
text: ""

View File

@@ -0,0 +1,34 @@
// This is a manifest file that'll be compiled into including all the files listed below.
// Add new JavaScript/Coffee code in separate files in this directory and they'll automatically
// be included in the compiled file accessible from http://example.com/assets/application.js
// It's not advisable to add code directly here, but if you do, it'll appear at the bottom of the
// the compiled file.
//
//= require jquery2
//= require admin/spree/spree-select2
//= require admin/spree/handlebar_extensions
//= require i18n/translations
//= require darkswarm/i18n.translate.js
//= require moment/min/moment.min.js
//= require moment/locale/ar.js
//= require moment/locale/ca.js
//= require moment/locale/de.js
//= require moment/locale/en-gb.js
//= require moment/locale/es.js
//= require moment/locale/fil.js
//= require moment/locale/fr.js
//= require moment/locale/it.js
//= require moment/locale/nb.js
//= require moment/locale/nl-be.js
//= require moment/locale/pt-br.js
//= require moment/locale/pt.js
//= require moment/locale/ru.js
//= require moment/locale/sv.js
//= require moment/locale/tr.js
//= require moment/locale/pl.js
//= require js-big-decimal/dist/web/js-big-decimal.min.js
window.angular = { module: function(noop){ return { value: function(){} } } }

View File

@@ -67,11 +67,3 @@ document.addEventListener "turbo:before-render", ->
rootscope = null
window.injector = null
true
document.addEventListener "ajax:beforeSend", (event) =>
window.Turbo.navigator.adapter.progressBar.setValue(0)
window.Turbo.navigator.adapter.progressBar.show()
document.addEventListener "ajax:complete", (event) =>
window.Turbo.navigator.adapter.progressBar.setValue(100)
window.Turbo.navigator.adapter.progressBar.hide()

View File

@@ -1,22 +0,0 @@
angular.module('Darkswarm').controller "AccordionCtrl", ($scope, localStorageService, $timeout, $document, CurrentHub) ->
$scope.accordionSections = ["details", "billing", "shipping", "payment"]
$scope.accordion = { details: true, billing: true, shipping: true, payment: true }
$scope.show = (section) ->
$scope.accordion[section] = true
$scope.scrollTo = (section) ->
# Scrolling is confused by our position:fixed top bar - add an offset to scroll
# to the correct location, plus 5px buffer
offset_height = $("nav.top-bar").height() + 5
$document.scrollTo($("##{section}"), offset_height, 400)
$scope.$on 'purchaseFormInvalid', (event, form) ->
# Scroll to first invalid section
for section in $scope.accordionSections
if not form[section].$valid
$scope.show section
$timeout ->
$scope.scrollTo(section)
, 50
break

View File

@@ -1,12 +0,0 @@
angular.module('Darkswarm').controller "BillingCtrl", ($scope, $timeout, $controller) ->
angular.extend this, $controller('FieldsetMixin', {$scope: $scope})
$scope.name = "billing"
$scope.nextPanel = "shipping"
$scope.summary = ->
[$scope.order.bill_address.address1,
$scope.order.bill_address.city,
$scope.order.bill_address.zipcode]
$timeout $scope.onTimeout

View File

@@ -1,43 +0,0 @@
angular.module('Darkswarm').controller "CheckoutCtrl", ($scope, localStorageService, Checkout, CurrentUser, CurrentHub, $http) ->
$scope.Checkout = Checkout
$scope.submitted = false
# Bind to local storage
$scope.fieldsToBind = ["bill_address", "email", "payment_method_id", "shipping_method_id", "ship_address"]
prefix = "order_#{Checkout.order.id}#{CurrentUser.id or ""}#{CurrentHub.hub.id}"
for field in $scope.fieldsToBind
localStorageService.bind $scope, "Checkout.order.#{field}", Checkout.order[field], "#{prefix}_#{field}"
localStorageService.bind $scope, "Checkout.ship_address_same_as_billing", true, "#{prefix}_sameasbilling"
localStorageService.bind $scope, "Checkout.default_bill_address", false, "#{prefix}_defaultasbilladdress"
localStorageService.bind $scope, "Checkout.default_ship_address", false, "#{prefix}_defaultasshipaddress"
$scope.order = Checkout.order # Ordering is important
$scope.secrets = Checkout.secrets
$scope.enabled = !!CurrentUser.id?
$scope.purchase = (event, form) ->
event.preventDefault()
$scope.formdata = form
$scope.submitted = true
if CurrentUser.id
$scope.validateForm(form)
else
$scope.ensureUserIsGuest()
$scope.validateForm = ->
if $scope.formdata.$valid
$scope.Checkout.purchase()
else
$scope.$broadcast 'purchaseFormInvalid', $scope.formdata
$scope.ensureUserIsGuest = (callback = null) ->
$http.post("/user/registered_email", {email: $scope.order.email})
.then (response)->
window.CableReady.perform(response.data)
.catch ->
$scope.validateForm() if $scope.submitted
callback() if callback

View File

@@ -1,8 +0,0 @@
angular.module('Darkswarm').controller "CountryCtrl", ($scope, availableCountries) ->
$scope.countries = availableCountries
$scope.countriesById = $scope.countries.reduce (obj, country) ->
obj[country.id] = country
obj
, {}

View File

@@ -1,24 +0,0 @@
angular.module('Darkswarm').controller "DetailsCtrl", ($scope, $timeout, $http, CurrentUser, SpreeUser, $controller) ->
angular.extend this, $controller('FieldsetMixin', {$scope: $scope})
$scope.name = "details"
$scope.nextPanel = "billing"
$scope.login_or_next = (event) ->
event.preventDefault()
unless CurrentUser.id
$scope.ensureUserIsGuest($scope.next)
return
$scope.next()
$scope.summary = ->
[$scope.fullName(),
$scope.order.email,
$scope.order.bill_address.phone]
$scope.fullName = ->
[$scope.order.bill_address.firstname ? null,
$scope.order.bill_address.lastname ? null].join(" ").trim()
$timeout $scope.onTimeout

View File

@@ -1,19 +0,0 @@
angular.module('Darkswarm').controller "PaymentCtrl", ($scope, $timeout, savedCreditCards, Dates, $controller) ->
angular.extend this, $controller('FieldsetMixin', {$scope: $scope})
$scope.savedCreditCards = savedCreditCards
$scope.name = "payment"
$scope.months = Dates.months
$scope.years = Dates.years
$scope.secrets.card_month = "1"
$scope.secrets.card_year = moment().year()
for card in savedCreditCards when card.is_default
$scope.secrets.selected_card = card.id
break
$scope.summary = ->
[$scope.Checkout.paymentMethod()?.name]
$timeout $scope.onTimeout

View File

@@ -1,11 +0,0 @@
angular.module('Darkswarm').controller "ShippingCtrl", ($scope, $timeout, ShippingMethods, $controller) ->
angular.extend this, $controller('FieldsetMixin', {$scope: $scope})
$scope.ShippingMethods = ShippingMethods
$scope.name = "shipping"
$scope.nextPanel = "payment"
$scope.summary = ->
[$scope.Checkout.shippingMethod()?.name]
$timeout $scope.onTimeout

View File

@@ -25,6 +25,8 @@ angular.module('Darkswarm').controller "OrderCycleChangeCtrl", ($scope, $rootSco
Cart.reloadFinalisedLineItems()
ChangeableOrdersAlert.reload()
$rootScope.$broadcast 'orderCycleSelected'
event = new CustomEvent('orderCycleSelected')
window.dispatchEvent(event)
$scope.closesInLessThan3Months = () ->
moment().diff(moment(OrderCycle.orders_close_at(), "YYYY-MM-DD HH:mm:SS Z"), 'days') > -75

View File

@@ -1,22 +0,0 @@
angular.module('Darkswarm').controller "PageSelectionCtrl", ($scope, $rootScope, $location) ->
$scope.selectedPage = ->
# The path looks like `/contact` for the URL `https://ofn.org/shop#/contact`.
# We remove the slash at the beginning.
page = $location.path()[1..]
return $scope.whitelist[0] unless page
# If the path points to an unrelated path like `/login`, stay where we were.
return $scope.lastPage unless page in $scope.whitelist
$scope.lastPage = page
page
$scope.whitelistPages = (pages) ->
$scope.whitelist = pages
$scope.lastPage = pages[0]
# when an order cycle is changed, ensure the shop tab is active to save a click
$rootScope.$on "orderCycleSelected", ->
if $scope.selectedPage() != "shop"
$location.path("shop")

View File

@@ -4,7 +4,16 @@
{{ 'admin.actions' | t }}
%i{ 'ng-class' => "expanded && 'icon-caret-up' || !expanded && 'icon-caret-down'" }
%div.menu{ 'ng-show' => "expanded" }
%a.menu_item{ 'ng-repeat' => "link in links", href: '{{link.url}}', target: "{{link.target || '_self'}}", data: { method: "{{ link.method || 'get' }}", confirm: "{{link.confirm}}" } }
%span
%i{ ng: { class: "link.icon" } }
%span {{ link.name }}
%div{ 'ng-repeat' => "link in links" }
%a.menu_item{ 'ng-if': "link.method", href: '{{link.url}}', target: "{{link.target || '_self'}}", data: { method: "{{ link.method }}", "ujs-navigate": "false", confirm: "{{link.confirm}}" } }
%span
%i{ ng: { class: "link.icon" } }
%span {{ link.name }}
%a.menu_item{ 'ng-if': "link.confirm && !link.method", href: '{{link.url}}', target: "{{link.target || '_self'}}", "data-confirm": "{{link.confirm}}" }
%span
%i{ ng: { class: "link.icon" } }
%span {{ link.name }}
%a.menu_item{ 'ng-if': "!link.confirm && !link.method", href: '{{link.url}}', target: "{{link.target || '_self'}}" }
%span
%i{ ng: { class: "link.icon" } }
%span {{ link.name }}

View File

@@ -3,7 +3,7 @@
.seven.columns.alpha
%h5#status-message{ ng: { show: "StatusMessage.invalidMessage == ''", style: 'StatusMessage.statusMessage.style' } }
{{ StatusMessage.statusMessage.text || "&nbsp;" }}
%h5#status-message{ ng: { show: "StatusMessage.invalidMessage !== ''" }, style: 'color: #da5354' }
%h5#status-message{ ng: { show: "StatusMessage.invalidMessage !== ''" }, style: 'color: #C85136' }
{{ StatusMessage.invalidMessage || "&nbsp;" }}
.nine.columns.omega.text-right{ ng: { transclude: true } }

View File

@@ -15,6 +15,6 @@
.columns.small-12.medium-6.large-6.product-img
%img{"ng-src" => "{{::product.largeImage}}", "ng-if" => "::product.largeImage"}
%img.placeholder{ src: "/noimage/large.png", "ng-if" => "::!product.largeImage"}
%img.placeholder{ src: Spree::Image.default_image_url(:large), "ng-if" => "::!product.largeImage"}
%ng-include{src: "'partials/close.html'"}

View File

@@ -0,0 +1,13 @@
# frozen_string_literal: true
class SessionChannel < ApplicationCable::Channel
def self.for_request(request)
"SessionChannel:#{request.session.id}"
end
def subscribed
return reject if current_user.nil?
stream_from "SessionChannel:#{session_id}"
end
end

View File

@@ -1,11 +1,12 @@
# frozen_string_literal: true
class ConfirmModalComponent < ModalComponent
def initialize(id:, confirm_actions: nil, controllers: nil, message: nil, confirm_reflexes: nil)
def initialize(id:, confirm_actions: nil, reflex: nil, controller: nil, message: nil, confirm_reflexes: nil)
super(id: id, close_button: true)
@confirm_actions = confirm_actions
@reflex = reflex
@confirm_reflexes = confirm_reflexes
@controllers = controllers
@controller = controller
@message = message
end

View File

@@ -1,4 +1,4 @@
%div{ id: @id, "data-controller": "modal #{@controllers}", "data-action": "keyup@document->modal#closeIfEscapeKey" }
%div{ id: @id, "data-controller": "modal #{@controller}", "data-action": "keyup@document->modal#closeIfEscapeKey", "data-#{@controller}-reflex-value": @reflex }
.reveal-modal-bg.fade{ "data-modal-target": "background", "data-action": "click->modal#close" }
.reveal-modal.fade.tiny.help-modal{ "data-modal-target": "modal" }
= content

View File

@@ -1,6 +1,6 @@
%tr
- @columns.each do |column|
%td.products_column{class: column[:id]}
- if column[:id] == "name" && @image
- if column[:id] == "name" && @image&.attachment.present?
= image_tag @image.url(:mini)
= column[:value]

View File

@@ -173,8 +173,7 @@ class ProductsTableComponent < ViewComponentReflex::Component
:default_price,
:stock_locations,
:stock_items,
:variant_overrides,
{ option_values: :option_type }
:variant_overrides
]
]
end

View File

@@ -11,9 +11,8 @@ module Admin
@line_items = order_permissions.
editable_line_items.where(order_id: orders).
includes(variant: { option_values: :option_type }).
ransack(params[:q]).result.
reorder('spree_line_items.order_id ASC, spree_line_items.id ASC')
includes(:variant).
ransack(params[:q]).result
@pagy, @line_items = pagy(@line_items) if pagination_required?

View File

@@ -7,6 +7,7 @@ module Admin
before_action :load_enterprise_fee_set, only: :index
before_action :load_data
before_action :check_enterprise_fee_input, only: [:bulk_update]
before_action :check_calculators_compatibility_with_taxes, only: [:bulk_update]
def index
@include_calculators = params[:include_calculators].present?
@@ -24,7 +25,6 @@ module Admin
format.json {
render_as_json @collection, controller: self, include_calculators: @include_calculators
}
# format.json { @presented_collection = @collection.each_with_index.map { |ef, i| EnterpriseFeePresenter.new(self, ef, i) } }
end
end
@@ -62,7 +62,9 @@ module Admin
when :for_order_cycle
order_cycle = OrderCycle.find_by(id: params[:order_cycle_id]) if params[:order_cycle_id]
coordinator = Enterprise.find_by(id: params[:coordinator_id]) if params[:coordinator_id]
order_cycle = OrderCycle.new(coordinator: coordinator) if order_cycle.nil? && coordinator.present?
if order_cycle.nil? && coordinator.present?
order_cycle = OrderCycle.new(coordinator: coordinator)
end
enterprises = OpenFoodNetwork::OrderCyclePermissions.new(spree_current_user,
order_cycle).visible_enterprises
EnterpriseFee.for_enterprises(enterprises).order('enterprise_id', 'fee_type', 'name')
@@ -119,5 +121,17 @@ module Admin
end
end
end
def check_calculators_compatibility_with_taxes
enterprise_fee_bulk_params['collection_attributes'].each do |_, enterprise_fee|
next unless enterprise_fee['inherits_tax_category'] == "true"
next unless EnterpriseFee::PER_ORDER_CALCULATORS.include?(enterprise_fee['calculator_type'])
flash[:error] = I18n.t(
'activerecord.errors.models.enterprise_fee.inherit_tax_requires_per_item_calculator'
)
return redirect_to redirect_path
end
end
end
end

View File

@@ -29,7 +29,6 @@ module Admin
after_action :geocode_address_if_use_geocoder, only: [:create, :update]
helper 'spree/products'
include OrderCyclesHelper
def index
@@ -47,6 +46,7 @@ module Admin
def edit
@object = Enterprise.where(permalink: params[:id]).
includes(users: [:ship_address, :bill_address]).first
@object.build_custom_tab if @object.custom_tab.nil?
if params[:stimulus]
@enterprise.is_primary_producer = params[:is_primary_producer]
@enterprise.sells = params[:enterprise_sells]
@@ -64,6 +64,8 @@ module Admin
update_tag_rules(tag_rules_attributes) if tag_rules_attributes.present?
update_enterprise_notifications
delete_custom_tab if params[:custom_tab] == 'false'
if @object.update(enterprise_params)
flash[:success] = flash_message_for(@object, :successfully_updated)
respond_with(@object) do |format|
@@ -136,6 +138,11 @@ module Admin
protected
def delete_custom_tab
@object.custom_tab.destroy if @object.custom_tab.present?
enterprise_params.delete(:custom_tab_attributes)
end
def build_resource
enterprise = super
enterprise.address ||= Spree::Address.new
@@ -171,7 +178,9 @@ module Admin
when :for_order_cycle
@order_cycle = OrderCycle.find_by(id: params[:order_cycle_id]) if params[:order_cycle_id]
coordinator = Enterprise.find_by(id: params[:coordinator_id]) if params[:coordinator_id]
@order_cycle = OrderCycle.new(coordinator: coordinator) if @order_cycle.nil? && coordinator.present?
if @order_cycle.nil? && coordinator.present?
@order_cycle = OrderCycle.new(coordinator: coordinator)
end
enterprises = OpenFoodNetwork::OrderCyclePermissions.new(spree_current_user, @order_cycle)
.visible_enterprises
@@ -179,7 +188,7 @@ module Admin
if enterprises.present?
enterprises.includes(
supplied_products:
[:supplier, { master: [:images], variants: { option_values: :option_type } }]
[:supplier, :variants, { master: [:images] }]
)
end
when :index
@@ -188,7 +197,8 @@ module Admin
editable_enterprises.
order('is_primary_producer ASC, name')
elsif json_request?
OpenFoodNetwork::Permissions.new(spree_current_user).editable_enterprises.ransack(params[:q]).result
OpenFoodNetwork::Permissions.new(spree_current_user)
.editable_enterprises.ransack(params[:q]).result
else
Enterprise.where("1=0")
end
@@ -196,7 +206,6 @@ module Admin
OpenFoodNetwork::Permissions.new(spree_current_user).visible_enterprises
.includes(:shipping_methods, :payment_methods).ransack(params[:q]).result
else
# TODO was ordered with is_distributor DESC as well, not sure why or how we want to sort this now
OpenFoodNetwork::Permissions.new(spree_current_user).
editable_enterprises.
order('is_primary_producer ASC, name')
@@ -317,7 +326,9 @@ module Admin
:producer_properties_attributes).nil?
names = Spree::Property.pluck(:name)
enterprise_params[:producer_properties_attributes].each do |key, property|
enterprise_params[:producer_properties_attributes].delete key unless names.include? property[:property_name]
unless names.include? property[:property_name]
enterprise_params[:producer_properties_attributes].delete key
end
end
end
end

View File

@@ -37,7 +37,7 @@ module Admin
end
def reset_absent_products
@importer = ProductImport::ProductImporter.new(File.new(params[:filepath]),
@importer = ProductImport::ProductImporter.new(File.new(file_path),
spree_current_user, import_into: params[:import_into], enterprises_to_reset: params[:enterprises_to_reset], updated_ids: params[:updated_ids], settings: params[:settings])
if params.key?(:enterprises_to_reset) && params.key?(:updated_ids)
@@ -56,7 +56,7 @@ module Admin
end
def process_data(method)
@importer = ProductImport::ProductImporter.new(File.new(params[:filepath]),
@importer = ProductImport::ProductImporter.new(File.new(file_path),
spree_current_user, start: params[:start], end: params[:end], settings: params[:settings])
begin
@@ -112,5 +112,25 @@ module Admin
def model_class
ProductImport::ProductImporter
end
def file_path
@file_path ||= validate_file_path(sanitize_file_path(params[:filepath]))
end
def sanitize_file_path(file_path)
FilePathSanitizer.new.sanitize(file_path, on_error: method(:raise_invalid_file_path))
end
def validate_file_path(file_path)
return file_path if file_path.to_s.match?(TEMP_FILE_PATH_REGEX)
raise_invalid_file_path
end
def raise_invalid_file_path
redirect_to '/admin/product_import', notice: I18n.t(:product_import_no_data_in_spreadsheet_notice)
raise 'Invalid File Path'
end
TEMP_FILE_PATH_REGEX = %r{^/tmp/product_import[A-Za-z0-9-]*/import\.csv$}
end
end

View File

@@ -77,7 +77,7 @@ module Admin
assign_view_data
if @blob
@error = ".report_taking_longer_html"
@error_url = @blob.url
@error_url = @blob.expiring_service_url
else
@error = ".report_taking_longer"
@error_url = ""

View File

@@ -40,8 +40,11 @@ module Admin
def index
respond_to do |format|
format.json do
render_as_json @collection, ams_prefix: params[:ams_prefix],
editable_schedule_ids: permissions.editable_schedules.pluck(:id)
render_as_json(
@collection,
ams_prefix: params[:ams_prefix],
editable_schedule_ids: permissions.editable_schedules.pluck(:id)
)
end
end
end
@@ -119,7 +122,8 @@ module Admin
.pluck(:id)
result = @existing_order_cycle_ids
result |= (requested & permitted) # add any requested & permitted ids
result -= ((result & permitted) - requested) # remove any existing and permitted ids that were not specifically requested
# remove any existing and permitted ids that were not specifically requested
result -= ((result & permitted) - requested)
result
end

View File

@@ -26,11 +26,14 @@ module Admin
private
def load_enterprise
@enterprise = Enterprise.find_by permalink: params[:enterprise_id]
@enterprise = OpenFoodNetwork::Permissions
.new(spree_current_user)
.editable_enterprises
.find_by(permalink: params[:enterprise_id])
end
def permitted_resource_params
params.require(:voucher).permit(:code)
params.require(:voucher).permit(:code, :amount)
end
end
end

View File

@@ -80,8 +80,12 @@ module Api
end
def permitted_ransack_params
[:name_or_meta_keywords_or_variants_display_as_or_variants_display_name_or_supplier_name_cont,
:with_properties, :primary_taxon_id_in_any]
[
"#{[:name, :meta_keywords, :variants_display_as,
:variants_display_name, :supplier_name]
.join('_or_')}_cont",
:with_properties, :primary_taxon_id_in_any
]
end
def distributor

View File

@@ -47,17 +47,15 @@ module Api
def capture
authorize! :admin, order
pending_payment = order.pending_payments.first
payment_capture = OrderCaptureService.new(order)
return payment_capture_failed unless order.payment_required? && pending_payment
if pending_payment.capture!
if payment_capture.call
render json: order.reload, serializer: Api::Admin::OrderSerializer, status: :ok
elsif payment_capture.gateway_error.present?
error_during_processing(payment_capture.gateway_error)
else
payment_capture_failed
end
rescue Spree::Core::GatewayError => e
error_during_processing(e)
end
private

View File

@@ -116,9 +116,8 @@ module Api
def product_query_includes
[
master: [:images],
variants: [:default_price, :stock_locations, :stock_items, :variant_overrides,
{ option_values: :option_type }]
master: { images: { attachment_attachment: :blob } },
variants: [:default_price, :stock_locations, :stock_items, :variant_overrides]
]
end

View File

@@ -21,7 +21,9 @@ module Api
@shipment.refresh_rates
@shipment.save!
render json: @shipment.reload, serializer: Api::ShipmentSerializer, status: :ok
OrderWorkflow.new(@order).advance_to_payment if @order.line_items.any?
render json: @shipment, serializer: Api::ShipmentSerializer, status: :ok
end
def update
@@ -32,7 +34,7 @@ module Api
@shipment.fee_adjustment.fire_events(:open)
if @shipment.update(shipment_params)
@order.updater.update_totals_and_states
@order.update_totals_and_states
end
@shipment.fee_adjustment.close

View File

@@ -9,12 +9,12 @@ module Api
before_action :product
def index
@variants = scope.includes(option_values: :option_type).ransack(params[:q]).result
@variants = scope.ransack(params[:q]).result
render json: @variants, each_serializer: Api::VariantSerializer
end
def show
@variant = scope.includes(option_values: :option_type).find(params[:id])
@variant = scope.find(params[:id])
render json: @variant, serializer: Api::VariantSerializer
end

View File

@@ -9,6 +9,7 @@ require 'spree/core/controller_helpers/common'
require 'open_food_network/referer_parser'
class ApplicationController < ActionController::Base
include CablecarResponses
include Pagy::Backend
include RequestTimeouts

View File

@@ -1,187 +0,0 @@
# frozen_string_literal: true
require 'open_food_network/address_finder'
class CheckoutController < ::BaseController
include OrderStockCheck
include OrderCompletion
include WhiteLabel
layout 'darkswarm'
helper 'terms_and_conditions'
helper 'checkout'
# We need pessimistic locking to avoid race conditions.
# Otherwise we fail on duplicate indexes or end up with negative stock.
prepend_around_action CurrentOrderLocker, only: [:edit, :update]
prepend_before_action :check_hub_ready_for_checkout
prepend_before_action :check_order_cycle_expiry
prepend_before_action :require_order_cycle
prepend_before_action :require_distributor_chosen
before_action :load_order
before_action :handle_insufficient_stock
before_action :associate_user
before_action :check_authorization
before_action :hide_ofn_navigation, only: :edit
helper 'spree/orders'
def edit; end
def update
params_adapter = Checkout::FormDataAdapter.new(permitted_params, @order, spree_current_user)
return action_failed unless @order.update(params_adapter.params[:order] || {})
checkout_workflow(params_adapter.shipping_method_id)
rescue Spree::Core::GatewayError => e
gateway_error(e)
action_failed(e)
rescue StandardError => e
flash[:error] = I18n.t("checkout.failed")
action_failed(e)
ensure
@order.update_order!
end
private
def check_authorization
authorize!(:edit, current_order, session[:access_token])
end
def load_order
load_checkout_order
return handle_invalid_stock unless valid_order_line_items?
before_address
setup_for_current_state
end
def handle_invalid_stock
reset_order_to_cart
respond_to do |format|
format.html do
redirect_to main_app.cart_path
end
format.json do
render json: { path: main_app.cart_path }, status: :bad_request
end
end
end
def setup_for_current_state
method_name = :"before_#{@order.state}"
__send__(method_name) if respond_to?(method_name, true)
end
def before_address
associate_user
finder = OpenFoodNetwork::AddressFinder.new(@order.email, @order.customer, spree_current_user)
@order.bill_address = finder.bill_address
@order.ship_address = finder.ship_address
end
def before_payment
current_order.payments.destroy_all if request.put?
end
def checkout_workflow(shipping_method_id)
while @order.state != "complete"
if @order.state == "payment"
update_payment_total
return if redirect_to_payment_gateway
return action_failed if @order.errors.any?
return action_failed unless @order.process_payments!
end
next if OrderWorkflow.new(@order).next({ "shipping_method_id" => shipping_method_id })
return action_failed
end
update_response
end
def update_payment_total
@order.updater.update_totals
@order.updater.update_pending_payment
end
def redirect_to_payment_gateway
return unless selected_payment_method.external_gateway?
return unless (redirect_url = selected_payment_method.external_payment_url(order: @order))
render json: { path: redirect_url }, status: :ok
true
end
def selected_payment_method
@selected_payment_method ||= Spree::PaymentMethod.find(
params.dig(:order, :payments_attributes, 0, :payment_method_id)
)
end
def update_response
if order_complete?
processing_succeeded
update_succeeded_response
else
action_failed(RuntimeError.new("Order not complete after the checkout workflow"))
end
end
def order_complete?
@order.state == "complete" || @order.completed?
end
def update_succeeded_response
respond_to do |format|
format.html do
respond_with(@order, location: order_completion_route)
end
format.json do
render json: { path: order_completion_route }, status: :ok
end
end
end
def action_failed(error = RuntimeError.new(order_processing_error))
processing_failed(error)
action_failed_response
end
def action_failed_response
respond_to do |format|
format.html do
render :edit
end
format.json do
discard_flash_errors
render json: { errors: @order.errors, flash: flash.to_hash }.to_json, status: :bad_request
end
end
end
def permitted_params
PermittedAttributes::Checkout.new(params).call
end
def discard_flash_errors
# Marks flash errors for deletion after the current action has completed.
# This ensures flash errors generated during XHR requests are not persisted in the
# session for longer than expected.
flash.discard(:error)
end
end

View File

@@ -30,6 +30,8 @@ module CheckoutCallbacks
@order.manual_shipping_selection = true
@order.checkout_processing = true
@voucher_adjustment = @order.voucher_adjustments.first
redirect_to(main_app.shop_path) && return if redirect_to_shop?
redirect_to_cart_path && return unless valid_order_line_items?
end

View File

@@ -13,8 +13,6 @@ module OrderStockCheck
def handle_insufficient_stock
return if sufficient_stock?
reset_order_to_cart
flash[:error] = Spree.t(:inventory_error_flash_for_insufficient_quantity)
redirect_to main_app.cart_path
end
@@ -43,10 +41,4 @@ module OrderStockCheck
def sufficient_stock?
@sufficient_stock ||= @order.insufficient_stock_lines.blank?
end
def reset_order_to_cart
return if OpenFoodNetwork::FeatureToggle.enabled? :split_checkout, spree_current_user
OrderCheckoutRestart.new(@order).call
end
end

View File

@@ -5,8 +5,6 @@ module WhiteLabel
include EnterprisesHelper
def hide_ofn_navigation(distributor = current_distributor)
return false unless OpenFoodNetwork::FeatureToggle.enabled?(:white_label)
# if the distributor has the hide_ofn_navigation preference set to true
# then we should hide the OFN navigation
@hide_ofn_navigation = distributor.hide_ofn_navigation

View File

@@ -4,7 +4,6 @@ require 'open_food_network/enterprise_injection_data'
class EnterprisesController < BaseController
layout "darkswarm"
helper Spree::ProductsHelper
include OrderCyclesHelper
include SerializerHelper
include WhiteLabel

View File

@@ -29,11 +29,11 @@ module PaymentGateways
flash[:error] =
Spree.t('flash.generic_error', scope: 'paypal',
reasons: pp_response.errors.map(&:long_message).join(" "))
redirect_to main_app.checkout_state_path(:payment)
redirect_to main_app.checkout_step_path(:payment)
end
rescue SocketError
flash[:error] = Spree.t('flash.connection_failed', scope: 'paypal')
redirect_to main_app.checkout_state_path(:payment)
redirect_to main_app.checkout_step_path(:payment)
end
end

View File

@@ -30,6 +30,8 @@ class SplitCheckoutController < ::BaseController
end
def update
return process_voucher if params[:apply_voucher].present?
if confirm_order || update_order
return if performed?
@@ -59,6 +61,27 @@ class SplitCheckoutController < ::BaseController
replace("#flashes", partial("shared/flashes", locals: { flashes: flash }))
end
def render_voucher_section_or_redirect
respond_to do |format|
format.cable_ready { render_voucher_section }
format.html { redirect_to checkout_step_path(:payment) }
end
end
# Using the power of cable_car we replace only the #voucher_section instead of reloading the page
def render_voucher_section
render(
status: :ok,
cable_ready: cable_car.replace(
"#voucher-section",
partial(
"split_checkout/voucher_section",
locals: { order: @order, voucher_adjustment: @order.voucher_adjustments.first }
)
)
)
end
def order_error_messages
# Remove ship_address.* errors if no shipping method is not selected
remove_ship_address_errors if no_ship_address_needed?
@@ -149,7 +172,7 @@ class SplitCheckoutController < ::BaseController
@order.select_shipping_method(params[:shipping_method_id])
@order.update(order_params)
@order.updater.update_totals_and_states
@order.update_totals_and_states
validate_current_step!
@@ -179,10 +202,47 @@ class SplitCheckoutController < ::BaseController
selected_shipping_method.first.require_ship_address == false
end
def process_voucher
if add_voucher
render_voucher_section_or_redirect
elsif @order.errors.present?
render_error
end
end
def add_voucher
if params.dig(:order, :voucher_code).blank?
@order.errors.add(:voucher, I18n.t('split_checkout.errors.voucher_not_found'))
return false
end
# Fetch Voucher
voucher = Voucher.find_by(code: params[:order][:voucher_code], enterprise: @order.distributor)
if voucher.nil?
@order.errors.add(:voucher, I18n.t('split_checkout.errors.voucher_not_found'))
return false
end
adjustment = voucher.create_adjustment(voucher.code, @order)
if !adjustment.valid?
@order.errors.add(:voucher, I18n.t('split_checkout.errors.add_voucher_error'))
adjustment.errors.each { |error| @order.errors.import(error) }
return false
end
true
end
def summary_step?
params[:step] == "summary"
end
def payment_step?
params[:step] == "payment"
end
def advance_order_state
return if @order.complete?
@@ -252,5 +312,14 @@ class SplitCheckoutController < ::BaseController
def recalculate_tax
@order.create_tax_charge!
@order.update_order!
apply_voucher if @order.voucher_adjustments.present?
end
def apply_voucher
VoucherAdjustmentsService.calculate(@order)
# update order to take into account the voucher we applied
@order.update_order!
end
end

View File

@@ -14,7 +14,7 @@ module Spree
def update_order
@order.reload
@order.updater.update_totals_and_states
@order.update_totals_and_states
end
def collection

View File

@@ -58,7 +58,7 @@ module Spree
@order.create_tax_charge!
Spree::TaxRate.adjust(@order, @order.adjustments.admin)
@order.updater.update_totals_and_states
@order.update_totals_and_states
end
def order_params

View File

@@ -8,56 +8,50 @@ module Spree
include OpenFoodNetwork::SpreeApiKeyLoader
helper CheckoutHelper
before_action :load_order, only: [:edit, :update, :fire, :resend,
:invoice, :print, :distribution]
before_action :load_distribution_choices, only: [:new, :edit, :update, :distribution]
before_action :load_order, only: [:edit, :update, :fire, :resend, :invoice, :print]
before_action :load_distribution_choices, only: [:new, :create, :edit, :update]
before_action :require_distributor_abn, only: :invoice
before_action :restore_saved_query!, only: :index
respond_to :html, :json
def new
@order = Order.create
@order.created_by = spree_current_user
@order.generate_order_number
@order.save
redirect_to spree.distribution_admin_order_path(@order)
def index
orders = SearchOrders.new(search_params, spree_current_user).orders
@pagy, @orders = pagy(orders, items: params[:per_page] || 15)
update_search_results if searching?
end
def distribution
return if order_params.blank?
on_update
@order.assign_attributes(order_params)
return unless @order.save(context: :set_distribution_step)
redirect_to spree.admin_order_customer_path(@order)
def new
@order = Spree::Order.new
end
def edit
@order.shipments.map(&:refresh_rates)
end
OrderWorkflow.new(@order).advance_to_payment
@order.errors.clear
def create
@order = Spree::Order.new(order_params.merge(created_by: spree_current_user))
if @order.save(context: :require_distribution)
redirect_to spree.admin_order_customer_path(@order)
else
render :new
end
end
def update
on_update
if params[:set_distribution_step] && @order.update(order_params)
return redirect_to spree.admin_order_customer_path(@order)
end
unless order_params.present? && @order.update(order_params) && @order.line_items.present?
if @order.line_items.empty? && !params[:suppress_error_msg]
@order.errors.add(:line_items, Spree.t('errors.messages.blank'))
end
order_updated = order_params.present? && @order.update(order_params)
unless order_updated && line_items_present?
flash[:error] = @order.errors.full_messages.join(', ') if @order.errors.present?
return redirect_to spree.edit_admin_order_path(@order)
end
OrderWorkflow.new(@order).advance_to_payment
if @order.complete?
redirect_to spree.edit_admin_order_path(@order)
else
@@ -110,6 +104,43 @@ module Spree
private
def line_items_present?
return true if @order.line_items.any?
@order.errors.add(:line_items, Spree.t('errors.messages.blank'))
false
end
def update_search_results
session[:admin_orders_search] = search_params
render cable_ready: cable_car.inner_html(
"#orders-index",
partial("spree/admin/orders/table", locals: { pagy: @pagy, orders: @orders })
)
end
def searching?
params[:q].present? && request.format.symbol == :cable_ready
end
def search_params
default_filters.deep_merge(
params.permit(:page, :per_page, :shipping_method_id, q: {})
).to_h.with_indifferent_access
end
def default_filters
{ q: { completed_at_not_null: 1, s: "completed_at desc" } }
end
def restore_saved_query!
return unless request.format.html?
@_params = ActionController::Parameters.new(session[:admin_orders_search] || {})
@stored_query = search_params.to_query
end
def on_update
@order.recreate_all_fees!

View File

@@ -129,7 +129,8 @@ module Spree
@payment_methods.first
end
@previous_cards = @order.credit_cards.with_payment_profile
credit_card_ids = @order.payments.from_credit_card.pluck(:source_id).uniq
@previous_cards = CreditCard.where(id: credit_card_ids).with_payment_profile
end
# At this point admin should have passed through Customer Details step

View File

@@ -7,7 +7,6 @@ require 'open_food_network/permissions'
module Spree
module Admin
class ProductsController < ::Admin::ResourceController
helper 'spree/products'
include OpenFoodNetwork::SpreeApiKeyLoader
include OrderCyclesHelper
include EnterprisesHelper
@@ -23,10 +22,6 @@ module Spree
def create
delete_stock_params_and_set_after do
if params[:product][:prototype_id].present?
@prototype = Spree::Prototype.find(params[:product][:prototype_id])
end
@object.attributes = permitted_resource_params
if @object.save
flash[:success] = flash_message_for(@object, :successfully_created)
@@ -117,7 +112,6 @@ module Spree
def load_data
@taxons = Taxon.order(:name)
@option_types = OptionType.order(:name)
@tax_categories = TaxCategory.order(:name)
@shipping_categories = ShippingCategory.order(:name)
end
@@ -127,7 +121,7 @@ module Spree
end
def product_includes
[{ variants: [:images, { option_values: :option_type }] },
[{ variants: [:images] },
{ master: [:images, :default_price] }]
end

View File

@@ -5,7 +5,6 @@ require 'open_food_network/scope_variants_for_search'
module Spree
module Admin
class VariantsController < ::Admin::ResourceController
helper 'spree/products'
belongs_to 'spree/product', find_by: :permalink
before_action :assign_default_attributes, only: :new
@@ -81,8 +80,6 @@ module Spree
end
def create_before
option_values = params[:new_variant]
option_values&.each_value { |id| @object.option_values << OptionValue.find(id) }
@object.save
end

View File

@@ -10,7 +10,7 @@ module Spree
layout 'darkswarm'
rescue_from ActiveRecord::RecordNotFound, with: :render_404
helper 'spree/products', 'spree/orders'
helper 'spree/orders'
respond_to :html, :json
@@ -78,7 +78,7 @@ module Spree
format.html do
if params.key?(:checkout)
@order.next_transition.run_callbacks if @order.cart?
redirect_to main_app.checkout_state_path(@order.checkout_steps.first)
redirect_to main_app.checkout_step_path(@order.checkout_steps.first)
elsif @order.complete?
redirect_to main_app.order_path(@order)
else

View File

@@ -0,0 +1,32 @@
# frozen_string_literal: true
class VoucherAdjustmentsController < BaseController
include CablecarResponses
def destroy
@order = current_order
@order.voucher_adjustments.find_by(id: params[:id])&.destroy
respond_to do |format|
format.cable_ready { render_voucher_section }
format.html { redirect_to checkout_step_path(:payment) }
end
end
private
# Using the power of cable_car we replace only the #voucher_section instead of reloading the page
def render_voucher_section
render(
status: :ok,
cable_ready: cable_car.replace(
"#voucher-section",
partial(
"split_checkout/voucher_section",
locals: { order: @order, voucher_adjustment: @order.voucher_adjustments.first }
)
)
)
end
end

View File

@@ -49,13 +49,8 @@ module Admin
{ name: 'tag_rules', icon_class: "icon-random", show: is_shop },
{ name: 'shop_preferences', icon_class: "icon-shopping-cart", show: is_shop },
{ name: 'users', icon_class: "icon-user", show: true },
] + [add_white_label_if_feature_activated].compact
end
def add_white_label_if_feature_activated
return nil unless OpenFoodNetwork::FeatureToggle.enabled?(:white_label)
{ name: 'white_label', icon_class: "icon-leaf", show: true }
{ name: 'white_label', icon_class: "icon-leaf", show: true },
]
end
end
end

View File

@@ -34,7 +34,13 @@ class AngularFormBuilder < ActionView::Helpers::FormBuilder
options.reverse_merge!('id' => angular_id(method), 'ng-model' => angular_model(method).to_s)
@template.select_tag angular_name(method),
@template.ng_options_from_collection_for_select(collection, value_method, text_method, angular_field), options
@template.ng_options_from_collection_for_select(
collection,
value_method,
text_method,
angular_field
),
options
end
private

View File

@@ -89,16 +89,6 @@ module InjectionHelper
render partial: "json/injection_ams", locals: { name: "orderCycleData", json: json }
end
def inject_available_shipping_methods
inject_json_array "shippingMethods", available_shipping_methods,
Api::ShippingMethodSerializer, current_order: current_order
end
def inject_available_payment_methods
inject_json_array "paymentMethods", available_payment_methods,
Api::PaymentMethodSerializer, current_order: current_order
end
def inject_taxons
inject_json_array "taxons", Spree::Taxon.all.to_a, Api::TaxonSerializer
end

View File

@@ -53,7 +53,8 @@ module OrderCyclesHelper
end
def simple_index
@simple_index ||= !OpenFoodNetwork::Permissions.new(spree_current_user).can_manage_complex_order_cycles?
@simple_index ||=
!OpenFoodNetwork::Permissions.new(spree_current_user).can_manage_complex_order_cycles?
end
def pickup_time(order_cycle = current_order_cycle)
@@ -73,7 +74,8 @@ module OrderCyclesHelper
def validated_enterprise_options(enterprises, options = {})
enterprises.map do |e|
disabled_message = nil
if options[:shipping_and_payment_methods] && (e.shipping_methods.empty? || e.payment_methods.available.empty?)
if options[:shipping_and_payment_methods] &&
(e.shipping_methods.empty? || e.payment_methods.available.empty?)
if e.shipping_methods.empty? && e.payment_methods.available.empty?
disabled_message = I18n.t(:no_shipping_or_payment)
elsif e.shipping_methods.empty?

View File

@@ -19,15 +19,27 @@ module ShopHelper
def shop_tabs
[
{ name: 'home', title: t(:shopping_tabs_home), show: show_home_tab? },
{ name: 'shop', title: t(:shopping_tabs_shop), show: !require_customer? },
{ name: 'home', title: t(:shopping_tabs_home), show: show_home_tab?,
default: show_home_tab? },
{ name: 'shop', title: t(:shopping_tabs_shop), show: !require_customer?,
default: !show_home_tab? },
{ name: 'about', title: t(:shopping_tabs_about), show: true },
{ name: 'producers', title: t(:shopping_tabs_producers), show: true },
{ name: 'contact', title: t(:shopping_tabs_contact), show: true },
{ name: 'groups', title: t(:shopping_tabs_groups), show: current_distributor.groups.any? },
{ name: 'groups', title: t(:shopping_tabs_groups), show: show_groups_tabs? },
custom_tab,
].select{ |tab| tab[:show] }
end
def custom_tab
{
name: "custom_#{current_distributor.custom_tab&.title&.parameterize}",
title: current_distributor.custom_tab&.title,
show: current_distributor.custom_tab.present?,
custom: true,
}
end
def shop_tab_names
shop_tabs.map { |tab| tab[:name] }
end
@@ -52,4 +64,10 @@ module ShopHelper
true
end
private
def show_groups_tabs?
!current_distributor.hide_groups_tab? && current_distributor.groups.any?
end
end

View File

@@ -26,15 +26,14 @@ module Spree
destination_url = options[:url] || spree.public_send("#{options[:route]}_path")
titleized_label = Spree.t(options[:label],
default: options[:label],
scope: [:admin, :tab]).titleize
scope: [:admin, :tab]).capitalize
css_classes = []
if options[:icon]
if options[:icon] && !feature?(:admin_style_v3, spree_current_user)
link = link_to_with_icon(options[:icon], titleized_label, destination_url)
css_classes << 'tab-with-icon'
else
titleized_label = raw("<span class='text'>#{titleized_label}</span>")
link = link_to(titleized_label, destination_url)
end

View File

@@ -62,7 +62,6 @@ module Spree
{ name: t(:resend_confirmation),
url: spree.resend_admin_order_path(@order),
icon: 'icon-email',
method: 'post',
confirm: t(:confirm_resend_order_confirmation) }
end
@@ -112,7 +111,7 @@ module Spree
event_label = I18n.t("cancel", scope: "actions")
button_link_to(event_label,
fire_admin_order_url(@order, e: "cancel"),
method: :put, icon: "icon-remove", form_id: "cancel_order_form")
method: :put, icon: "icon-cancel", form_id: "cancel_order_form")
end
def resume_event_link

View File

@@ -18,7 +18,9 @@ module Spree
def changeable_orders
# Only returns open order for the current user + shop + oc combo
return @changeable_orders unless @changeable_orders.nil?
return @changeable_orders = [] unless spree_current_user && current_distributor && current_order_cycle
unless spree_current_user && current_distributor && current_order_cycle
return @changeable_orders = []
end
return @changeable_orders = [] unless current_distributor.allow_order_changes?
@changeable_orders = Spree::Order.complete.where(

View File

@@ -1,13 +0,0 @@
# frozen_string_literal: true
module Spree
module ProductsHelper
def product_has_variant_unit_option_type?(product)
product.option_types.any? { |option_type| variant_unit_option_type? option_type }
end
def variant_unit_option_type?(option_type)
Spree::Product.all_variant_unit_option_types.include? option_type
end
end
end

View File

@@ -6,16 +6,6 @@ module TermsAndConditionsHelper
rel: "noopener")
end
def render_terms_and_conditions
if platform_terms_required? && distributor_terms_required?
render("checkout/all_terms_and_conditions")
elsif platform_terms_required?
render "checkout/platform_terms_of_service"
elsif distributor_terms_required?
render "checkout/terms_and_conditions"
end
end
def any_terms_required?(distributor)
TermsOfService.required?(distributor)
end

View File

@@ -1,7 +1,10 @@
# frozen_string_literal: true
class BulkInvoiceJob < ApplicationJob
def perform(order_ids, filepath)
include CableReady::Broadcaster
delegate :render, to: ActionController::Base
def perform(order_ids, filepath, options = {})
pdf = CombinePDF.new
sorted_orders(order_ids).each do |order|
@@ -10,7 +13,11 @@ class BulkInvoiceJob < ApplicationJob
pdf << CombinePDF.parse(invoice)
end
ensure_directory_exists filepath
pdf.save filepath
broadcast(filepath, options[:channel]) if options[:channel]
end
private
@@ -18,10 +25,26 @@ class BulkInvoiceJob < ApplicationJob
# Ensures the records are returned in the same order the ids were originally given in
def sorted_orders(order_ids)
orders_by_id = Spree::Order.where(id: order_ids).to_a.index_by(&:id)
order_ids.map { |id| orders_by_id[id] }
order_ids.map { |id| orders_by_id[id.to_i] }
end
def renderer
@renderer ||= InvoiceRenderer.new
end
def broadcast(filepath, channel)
file_id = filepath.split("/").last.split(".").first
cable_ready[channel].
inner_html(
selector: "#bulk_invoices_modal .modal-content",
html: render(partial: "spree/admin/orders/bulk/invoice_link",
locals: { invoice_url: "/admin/orders/invoices/#{file_id}" })
).
broadcast
end
def ensure_directory_exists(filepath)
FileUtils.mkdir_p(File.dirname(filepath))
end
end

View File

@@ -2,9 +2,24 @@
# Renders a report and stores it in a given blob.
class ReportJob < ApplicationJob
NOTIFICATION_TIME = 5.seconds
def perform(report_class, user, params, format, blob)
start_time = Time.zone.now
report = report_class.new(user, params, render: true)
result = report.render_as(format)
blob.store(result)
execution_time = Time.zone.now - start_time
email_result(user, blob) if execution_time > NOTIFICATION_TIME
end
def email_result(user, blob)
ReportMailer.with(
to: user.email,
blob: blob,
).report_ready.deliver_later
end
end

View File

@@ -60,7 +60,7 @@ class ProducerMailer < ApplicationMailer
def line_items_from(order_cycle, producer)
@line_items ||= Spree::LineItem.
includes(:option_values, variant: [:product, { option_values: :option_type }]).
includes(variant: [:product]).
from_order_cycle(order_cycle).
sorted_by_name_and_unit_value.
merge(Spree::Product.with_deleted.in_supplier(producer)).

View File

@@ -0,0 +1,12 @@
# frozen_string_literal: true
class ReportMailer < ApplicationMailer
def report_ready
# When we are in a background job then we don't have an HTTP request object
# and we need to tell ActiveStorage the hostname to generate URLs.
ActiveStorage::Current.url_options ||= url_options
@blob = params[:blob]
mail(params)
end
end

View File

@@ -28,6 +28,7 @@ module Spree
def confirm_email_for_customer(order_or_order_id, resend = false)
@order = find_order(order_or_order_id)
@hide_ofn_navigation = @order.distributor.hide_ofn_navigation
I18n.with_locale valid_locale(@order.user) do
subject = mail_subject(t('spree.order_mailer.confirm_email.subject'), resend)
mail(to: @order.email,

View File

@@ -11,6 +11,7 @@ class SubscriptionMailer < ApplicationMailer
def confirmation_email(order)
@type = 'confirmation'
@order = order
@hide_ofn_navigation = @order.distributor.hide_ofn_navigation
send_mail(order)
end

View File

@@ -1,6 +1,8 @@
# frozen_string_literal: true
class AdjustmentMetadata < ApplicationRecord
self.belongs_to_required_by_default = true
belongs_to :adjustment, class_name: 'Spree::Adjustment'
belongs_to :enterprise
end

View File

@@ -10,4 +10,12 @@ class ApplicationRecord < ActiveRecord::Base
include ArelHelpers::JoinAssociation
self.abstract_class = true
def self.image_service
ENV["S3_BUCKET"].present? ? :amazon_public : :local
end
def url_for(*args)
Rails.application.routes.url_helpers.url_for(*args)
end
end

View File

@@ -1,15 +1,10 @@
# frozen_string_literal: true
require 'spree/localized_number'
module Calculator
class Weight < Spree::Calculator
extend Spree::LocalizedNumber
preference :unit_from_list, :string, default: "kg"
preference :per_unit, :decimal, default: 0.0
localize_number :preferred_per_unit
def self.description
I18n.t('spree.weight')
end

View File

@@ -5,6 +5,8 @@ require 'open_food_network/column_preference_defaults'
class ColumnPreference < ApplicationRecord
extend OpenFoodNetwork::ColumnPreferenceDefaults
self.belongs_to_required_by_default = true
# Non-persisted attributes that only have one
# setting (ie. the default) for a given column
attr_accessor :name
@@ -48,6 +50,8 @@ class ColumnPreference < ApplicationRecord
def self.filter(default_preferences, user, action_name)
return unless action_name == 'order_cycles_index'
default_preferences.delete(:schedules) unless user.admin? || user.enterprises.where(enable_subscriptions: true).any?
return if user.admin? || user.enterprises.where(enable_subscriptions: true).any?
default_preferences.delete(:schedules)
end
end

View File

@@ -0,0 +1,42 @@
# frozen_string_literal: true
require 'active_support/concern'
module OrderValidations
extend ActiveSupport::Concern
private
def disallow_guest_order
return unless using_guest_checkout? && registered_email?
errors.add(:email, I18n.t('devise.failure.already_registered'))
end
# Check that line_items in the current order are available from a newly selected distribution
def products_available_from_new_distribution
return if OrderCycleDistributedVariants.new(order_cycle, distributor)
.distributes_order_variants?(self)
errors.add(:base, I18n.t(:spree_order_availability_error))
end
# Determine if email is required (we don't want validation errors before we hit the checkout)
def require_email
true unless (new_record? || cart?) && !checkout_processing
end
def ensure_line_items_present
return if line_items.present?
errors.add(:base, Spree.t(:there_are_no_items_for_this_order))
false
end
def ensure_available_shipping_rates
return unless shipments.empty? || shipments.any? { |shipment| shipment.shipping_rates.blank? }
errors.add(:base, Spree.t(:items_cannot_be_shipped))
false
end
end

View File

@@ -1,6 +1,8 @@
# frozen_string_literal: true
class CoordinatorFee < ApplicationRecord
self.belongs_to_required_by_default = true
belongs_to :order_cycle
belongs_to :enterprise_fee
end

7
app/models/custom_tab.rb Normal file
View File

@@ -0,0 +1,7 @@
# frozen_string_literal: false
class CustomTab < ApplicationRecord
belongs_to :enterprise, optional: false
validates :title, presence: true, length: { maximum: 20 }
end

View File

@@ -10,20 +10,22 @@
class Customer < ApplicationRecord
include SetUnusedAddressFields
self.belongs_to_required_by_default = true
acts_as_taggable
searchable_attributes :first_name, :last_name, :email, :code
belongs_to :enterprise, optional: false
belongs_to :user, class_name: "Spree::User"
belongs_to :enterprise
belongs_to :user, class_name: "Spree::User", optional: true
has_many :orders, class_name: "Spree::Order"
before_destroy :update_orders_and_delete_canceled_subscriptions
belongs_to :bill_address, class_name: "Spree::Address"
belongs_to :bill_address, class_name: "Spree::Address", optional: true
alias_attribute :billing_address, :bill_address
accepts_nested_attributes_for :bill_address
belongs_to :ship_address, class_name: "Spree::Address"
belongs_to :ship_address, class_name: "Spree::Address", optional: true
alias_attribute :shipping_address, :ship_address
accepts_nested_attributes_for :ship_address

View File

@@ -2,6 +2,8 @@
class DistributorPaymentMethod < ApplicationRecord
self.table_name = "distributors_payment_methods"
self.belongs_to_required_by_default = true
belongs_to :payment_method, class_name: "Spree::PaymentMethod", touch: true
belongs_to :distributor, class_name: "Enterprise", touch: true
end

View File

@@ -2,6 +2,8 @@
class DistributorShippingMethod < ApplicationRecord
self.table_name = "distributors_shipping_methods"
self.belongs_to_required_by_default = true
belongs_to :shipping_method, class_name: "Spree::ShippingMethod", touch: true
belongs_to :distributor, class_name: "Enterprise", touch: true
end

View File

@@ -5,20 +5,9 @@ class Enterprise < ApplicationRecord
ENTERPRISE_SEARCH_RADIUS = 100
# The next Rails version will have named variants but we need to store them
# ourselves for now.
LOGO_SIZES = {
thumb: { gravity: "Center", resize: "100x100^", crop: '100x100+0+0' },
small: { gravity: "Center", resize: "180x180^", crop: '180x180+0+0' },
medium: { gravity: "Center", resize: "300x300^", crop: '300x300+0+0' },
}.freeze
PROMO_IMAGE_SIZES = {
thumb: { resize_to_limit: [100, 100] },
medium: { resize_to_fill: [720, 156] },
large: { resize_to_fill: [1200, 260] },
}.freeze
WHITE_LABEL_LOGO_SIZES = {
default: { gravity: "Center", resize_to_fill: [217, 44] },
mobile: { gravity: "Center", resize_to_fill: [75, 26] },
}.freeze
LOGO_SIZES = [:thumb, :small, :medium].freeze
PROMO_IMAGE_SIZES = [:thumb, :medium, :large].freeze
WHITE_LABEL_LOGO_SIZES = [:default, :mobile].freeze
VALID_INSTAGRAM_REGEX = %r{\A[a-zA-Z0-9._]{1,30}([^/-]*)\z}
searchable_attributes :sells, :is_primary_producer, :name
@@ -61,8 +50,10 @@ class Enterprise < ApplicationRecord
has_many :users, through: :enterprise_roles
belongs_to :owner, class_name: 'Spree::User',
inverse_of: :owned_enterprises
has_many :distributor_payment_methods, foreign_key: :distributor_id
has_many :distributor_shipping_methods, foreign_key: :distributor_id
has_many :distributor_payment_methods,
inverse_of: :distributor, foreign_key: :distributor_id
has_many :distributor_shipping_methods,
inverse_of: :distributor, foreign_key: :distributor_id
has_many :payment_methods, through: :distributor_payment_methods
has_many :shipping_methods, through: :distributor_shipping_methods
has_many :customers
@@ -70,6 +61,7 @@ class Enterprise < ApplicationRecord
has_many :tag_rules
has_one :stripe_account, dependent: :destroy
has_many :vouchers
has_one :custom_tab, dependent: :destroy
delegate :latitude, :longitude, :city, :state_name, to: :address
@@ -84,11 +76,23 @@ class Enterprise < ApplicationRecord
reject_if: lambda { |tag_rule|
tag_rule[:preferred_customer_tags].blank?
}
accepts_nested_attributes_for :custom_tab
has_one_attached :logo
has_one_attached :promo_image
has_one_attached :terms_and_conditions
has_one_attached :white_label_logo
has_one_attached :logo, service: image_service do |attachment|
attachment.variant :thumb, resize_to_fill: [100, 100], crop: [0, 0, 100, 100]
attachment.variant :small, resize_to_fill: [180, 180], crop: [0, 0, 180, 180]
attachment.variant :medium, resize_to_fill: [300, 300], crop: [0, 0, 300, 300]
end
has_one_attached :promo_image, service: image_service do |attachment|
attachment.variant :thumb, resize_to_limit: [100, 100]
attachment.variant :medium, resize_to_fill: [720, 156]
attachment.variant :large, resize_to_fill: [1200, 260]
end
has_one_attached :white_label_logo, service: image_service do |attachment|
attachment.variant :default, resize_to_fill: [217, 44]
attachment.variant :mobile, resize_to_fill: [75, 26]
end
validates :logo,
processable_image: true,
@@ -115,6 +119,7 @@ class Enterprise < ApplicationRecord
with: VALID_INSTAGRAM_REGEX,
message: Spree.t('errors.messages.invalid_instagram_url')
}, allow_blank: true
validate :validate_white_label_logo_link
before_validation :initialize_permalink, if: lambda { permalink.nil? }
before_validation :set_unused_address_fields
@@ -292,27 +297,15 @@ class Enterprise < ApplicationRecord
end
def logo_url(name)
return unless logo.variable?
Rails.application.routes.url_helpers.url_for(
logo.variant(LOGO_SIZES[name])
)
image_url_for(logo, name)
end
def promo_image_url(name)
return unless promo_image.variable?
Rails.application.routes.url_helpers.url_for(
promo_image.variant(PROMO_IMAGE_SIZES[name])
)
image_url_for(promo_image, name)
end
def white_label_logo_url(name = :default)
return unless white_label_logo.variable?
Rails.application.routes.url_helpers.url_for(
white_label_logo.variant(WHITE_LABEL_LOGO_SIZES[name])
)
image_url_for(white_label_logo, name)
end
def website
@@ -452,6 +445,29 @@ class Enterprise < ApplicationRecord
private
def validate_white_label_logo_link
return if white_label_logo.blank?
return if white_label_logo_link.blank?
white_label_logo_link.strip!
uri = URI(white_label_logo_link)
self.white_label_logo_link = "http://#{white_label_logo_link}" if uri.scheme.nil?
rescue URI::InvalidURIError
errors.add(:white_label_logo_link, I18n.t(:invalid_url))
end
def image_url_for(image, name)
return unless image.variable?
return image.variant(name).processed.url if image.attachment.service.name == :amazon_public
url_for(image.variant(name))
rescue ActiveStorage::Error => e
Rails.logger.error(e.message)
nil
end
def current_exchange_variants
ExchangeVariant.joins(exchange: :order_cycle)
.merge(Exchange.outgoing)

View File

@@ -58,6 +58,12 @@ class EnterpriseFee < ApplicationRecord
elsif inherits_tax_category_changed?
self.tax_category_id = nil if inherits_tax_category?
end
if inherits_tax_category? && PER_ORDER_CALCULATORS.include?(calculator_type)
errors.add(:base, :inherit_tax_requires_per_item_calculator)
throw :abort
end
true
end
end

View File

@@ -25,8 +25,8 @@ class EnterpriseGroup < ApplicationRecord
delegate :phone, :address1, :address2, :city, :zipcode, :state, :country, to: :address
has_one_attached :logo
has_one_attached :promo_image
has_one_attached :logo, service: image_service
has_one_attached :promo_image, service: image_service
validates :logo,
processable_image: true,

View File

@@ -16,7 +16,7 @@ class Exchange < ApplicationRecord
belongs_to :sender, class_name: 'Enterprise'
belongs_to :receiver, class_name: 'Enterprise'
has_many :exchange_variants, dependent: :destroy
has_many :exchange_variants, dependent: :delete_all
has_many :variants, through: :exchange_variants
has_many :exchange_fees, dependent: :destroy
@@ -25,6 +25,8 @@ class Exchange < ApplicationRecord
validates :order_cycle, :sender, :receiver, presence: true
validates :sender_id, uniqueness: { scope: [:order_cycle_id, :receiver_id, :incoming] }
before_destroy :delete_related_exchange_variants, prepend: true
after_save :touch_receiver
accepts_nested_attributes_for :variants
@@ -86,9 +88,9 @@ class Exchange < ApplicationRecord
exchange = dup
exchange.order_cycle = new_order_cycle
exchange.enterprise_fee_ids = enterprise_fee_ids
exchange.variant_ids = variant_ids
exchange.tag_ids = tag_ids
exchange.save!
clone_all_exchange_variants(exchange.id)
exchange
end
@@ -105,4 +107,26 @@ class Exchange < ApplicationRecord
receiver.touch_later
end
private
# An Order Cycle can have thousands of ExchangeVariants.
# It's a simple association without any callbacks on creation. So we can
# insert in bulk and improve the performance tenfold for large order cycles.
def clone_all_exchange_variants(exchange_id)
return unless variant_ids.any?
ExchangeVariant.insert_all( # rubocop:disable Rails/SkipsModelValidations
variant_ids.map{ |variant_id| { variant_id: variant_id, exchange_id: exchange_id } }
)
end
def delete_related_exchange_variants
return unless incoming?
ExchangeVariant.where(variant_id: variant_ids).
joins(:exchange).
where(exchanges: { order_cycle: order_cycle, incoming: false }).
delete_all
end
end

View File

@@ -3,9 +3,15 @@
class ExchangeVariant < ApplicationRecord
belongs_to :exchange
belongs_to :variant, class_name: 'Spree::Variant'
after_destroy :destroy_related_outgoing_variants
def destroy_related_outgoing_variants
VariantDeleter.new.destroy_related_outgoing_variants(variant_id, exchange.order_cycle)
after_destroy :delete_related_outgoing_variants
def delete_related_outgoing_variants
return unless exchange.incoming?
ExchangeVariant.where(variant_id: variant_id).
joins(:exchange).
where(exchanges: { order_cycle: exchange.order_cycle, incoming: false }).
delete_all
end
end

View File

@@ -90,7 +90,8 @@ module ProductImport
end
def total_saved_count
@products_created + @variants_created + @variants_updated + @inventory_created + @inventory_updated
[@products_created, @variants_created, @variants_updated,
@inventory_created, @inventory_updated].sum
end
def permission_by_id?(enterprise_id)

View File

@@ -167,7 +167,7 @@ module ProductImport
def unit_fields_validation(entry)
unit_types = ['g', 'oz', 'lb', 'kg', 't', 'ml', 'l', 'kl', '']
unless entry.units&.present?
if entry.units.blank?
mark_as_invalid(entry, attribute: 'units',
error: I18n.t('admin.product_import.model.blank'))
end
@@ -180,7 +180,7 @@ module ProductImport
return if import_into_inventory?
# unit_type must be valid type
if entry.unit_type&.present?
if entry.unit_type.present?
unit_type = entry.unit_type.to_s.strip.downcase
unless unit_types.include?(unit_type)
mark_as_invalid(entry, attribute: 'unit_type',
@@ -190,7 +190,7 @@ module ProductImport
end
# variant_unit_name must be present if unit_type not present
return if entry.variant_unit_name&.present?
return if entry.variant_unit_name.present?
mark_as_invalid(entry, attribute: 'variant_unit_name',
error: I18n.t('admin.product_import.model.conditional_blank'))

View File

@@ -233,6 +233,8 @@ module ProductImport
def rows
return [] unless @sheet&.last_row
@sheet.parse(clean: true)
(2..@sheet.last_row).map do |i|
@sheet.row(i)
end

View File

@@ -2,6 +2,9 @@
# Stores a generated report.
class ReportBlob < ActiveStorage::Blob
# AWS S3 limits URL expiry to one week.
LIFETIME = 1.week
def self.create_for_upload_later!(filename)
# ActiveStorage discourages modifying a blob later but we need a blob
# before we know anything about the report file. It enables us to use the
@@ -12,7 +15,7 @@ class ReportBlob < ActiveStorage::Blob
checksum: "0",
content_type: content_type(filename),
).tap do |blob|
ActiveStorage::PurgeJob.set(wait: 1.month).perform_later(blob)
ActiveStorage::PurgeJob.set(wait: LIFETIME).perform_later(blob)
end
end
@@ -33,4 +36,8 @@ class ReportBlob < ActiveStorage::Blob
def result
@result ||= download.force_encoding(Encoding::UTF_8)
end
def expiring_service_url
url(expires_in: LIFETIME)
end
end

View File

@@ -22,8 +22,6 @@ module Spree
can :manage, :all
else
can [:index, :read], Country
can [:index, :read], OptionType
can [:index, :read], OptionValue
can :create, Order
can :read, Order do |order, token|
order.user == user || order.token && token == order.token

View File

@@ -4,7 +4,7 @@ module Spree
class Address < ApplicationRecord
include AddressDisplay
searchable_attributes :firstname, :lastname, :phone
searchable_attributes :firstname, :lastname, :phone, :full_name
searchable_associations :country, :state
belongs_to :country, class_name: "Spree::Country"
@@ -28,6 +28,12 @@ module Spree
alias_attribute :last_name, :lastname
delegate :name, to: :state, prefix: true, allow_nil: true
ransacker :full_name, formatter: proc { |value| value.to_s } do |parent|
Arel::Nodes::SqlLiteral.new(
"CONCAT(#{parent.table_name}.firstname, ' ', #{parent.table_name}.lastname)"
)
end
def self.default
new(country: DefaultCountry.country)
end

View File

@@ -42,9 +42,6 @@ module Spree
belongs_to :order, class_name: "Spree::Order"
belongs_to :tax_category, class_name: 'Spree::TaxCategory'
belongs_to :tax_rate, -> { where spree_adjustments: { originator_type: 'Spree::TaxRate' } },
foreign_key: 'originator_id'
validates :label, presence: true
validates :amount, numericality: true

View File

@@ -2,14 +2,12 @@
module Spree
class Image < Asset
SIZES = {
mini: { resize_to_fill: [48, 48] },
small: { resize_to_fill: [227, 227] },
product: { resize_to_limit: [240, 240] },
large: { resize_to_limit: [600, 600] },
}.freeze
has_one_attached :attachment
has_one_attached :attachment, service: image_service do |attachment|
attachment.variant :mini, resize_to_fill: [48, 48]
attachment.variant :small, resize_to_fill: [227, 227]
attachment.variant :product, resize_to_limit: [240, 240]
attachment.variant :large, resize_to_limit: [600, 600]
end
validates :attachment,
attached: true,
@@ -17,20 +15,33 @@ module Spree
content_type: %r{\Aimage/(png|jpeg|gif|jpg|svg\+xml|webp)\Z}
validate :no_attachment_errors
def self.default_image_url(size)
return "/noimage/product.png" unless size&.to_sym.in?([:mini, :small, :product, :large])
"/noimage/#{size}.png"
end
def variant(name)
if attachment.variable?
attachment.variant(SIZES[name])
attachment.variant(name)
else
attachment
end
end
def url(size)
return unless attachment.attached?
return self.class.default_image_url(size) unless attachment.attached?
return variant(size).processed.url if attachment.service.name == :amazon_public
Rails.application.routes.url_helpers.url_for(variant(size))
url_for(variant(size))
rescue ActiveStorage::Error => e
Rails.logger.error(e.message)
self.class.default_image_url(size)
end
private
# if there are errors from the plugin, then add a more meaningful message
def no_attachment_errors
return if errors[:attachment].empty?

View File

@@ -9,7 +9,7 @@ module Spree
include LineItemStockChanges
searchable_attributes :price, :quantity, :order_id, :variant_id, :tax_category_id
searchable_associations :order, :order_cycle, :variant, :product, :supplier, :tax_category, :option_values
searchable_associations :order, :order_cycle, :variant, :product, :supplier, :tax_category
searchable_scopes :with_tax, :without_tax
belongs_to :order, class_name: "Spree::Order", inverse_of: :line_items
@@ -22,9 +22,6 @@ module Spree
has_many :adjustments, as: :adjustable, dependent: :destroy
has_and_belongs_to_many :option_values, join_table: 'spree_option_values_line_items',
class_name: 'Spree::OptionValue'
before_validation :adjust_quantity
before_validation :copy_price
before_validation :copy_tax_category
@@ -42,12 +39,16 @@ module Spree
before_save :update_inventory
before_save :calculate_final_weight_volume, if: :quantity_changed?,
unless: :final_weight_volume_changed?
after_save :update_order
after_save :update_units
before_destroy :update_inventory_before_destroy
after_destroy :update_order
before_save :assign_units, if: ->(line_item) {
line_item.new_record? || line_item.final_weight_volume_changed?
}
delegate :product, :unit_description, :display_name, to: :variant
before_destroy :update_inventory_before_destroy
after_destroy :update_order
after_save :update_order
delegate :product, :variant_unit, :unit_description, :display_name, :display_as, to: :variant
attr_accessor :skip_stock_check, :target_shipment # Allows manual skipping of Stock::AvailabilityValidator

Some files were not shown because too many files have changed in this diff Show More