Compare commits

...

617 Commits

Author SHA1 Message Date
filipefurtad0
d54dbdfe2d Update all locales with the latest Transifex translations 2024-08-05 11:33:39 +01:00
Gaetan Craig-Riou
11ba33d7f4 Merge pull request #12696 from openfoodfoundation/dependabot/npm_and_yarn/floating-ui/dom-1.6.8
Bump @floating-ui/dom from 1.6.7 to 1.6.8
2024-08-05 16:38:03 +10:00
dependabot[bot]
8e663dac3f Bump @floating-ui/dom from 1.6.7 to 1.6.8
Bumps [@floating-ui/dom](https://github.com/floating-ui/floating-ui/tree/HEAD/packages/dom) from 1.6.7 to 1.6.8.
- [Release notes](https://github.com/floating-ui/floating-ui/releases)
- [Changelog](https://github.com/floating-ui/floating-ui/blob/master/packages/dom/CHANGELOG.md)
- [Commits](https://github.com/floating-ui/floating-ui/commits/@floating-ui/dom@1.6.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>
2024-08-05 04:38:50 +00:00
Gaetan Craig-Riou
df0795acf1 Merge pull request #12689 from openfoodfoundation/dependabot/npm_and_yarn/hotwired/turbo-8.0.5
Bump @hotwired/turbo from 8.0.4 to 8.0.5
2024-08-05 14:36:05 +10:00
Gaetan Craig-Riou
7e1af9e04b Merge pull request #12723 from johansenja/optimise-shops-page
Preload enterprise logos and promo images for /shops page
2024-08-05 13:54:20 +10:00
Gaetan Craig-Riou
4805adec42 Merge pull request #12730 from openfoodfoundation/revert-12665-wb-OFN-12532
Revert "Pluralize admin products search result [OFN-12532]"
2024-08-05 10:29:52 +10:00
Filipe
7939bf8038 Revert "Pluralize admin products search result [OFN-12532]" 2024-08-05 10:03:58 +10:00
filipefurtad0
0afbdf157e Update all locales with the latest Transifex translations 2024-08-02 11:42:59 +01:00
Filipe
5012c52438 Merge pull request #12711 from cillian/wider-item-column-on-invoice-pdf
Make Item column wider and tax and quantity columns narrower in invoice PDF
2024-08-02 10:20:24 +01:00
Maikel
615a81c55d Merge pull request #12728 from mkllnk/flaky-order-cycle-spec
Fix flaky spec with fixed order of products
2024-08-02 14:39:42 +10:00
Maikel Linke
99b31d05cb Fix flaky spec with fixed order of products 2024-08-02 14:26:54 +10:00
Konrad
1a72b5b227 Merge pull request #12563 from abdulazizali77/bugfix/11326-incoming-exchange-per-item-calculator
Display only per_item fees for oc incoming exchange #11326
2024-08-02 03:11:27 +02:00
Joseph Johansen
ffe4603f2f Preload enterprise logos and promo images for shops page 2024-08-01 14:10:53 +01:00
David Cook
1288592d58 Merge pull request #12715 from rioug/add-request-id-log
Add request_id to logs for production and staging
2024-08-01 10:01:25 +10:00
David Cook
0836d844a6 Merge pull request #12677 from openfoodfoundation/dependabot/npm_and_yarn/trix-2.1.3
Bump trix from 2.1.2 to 2.1.3
2024-08-01 09:49:07 +10:00
David Cook
96355a1ed4 Merge pull request #12719 from dacook/ActivateAdminStyleV3For50PcUsers
[BUU] Activate admin_style_v3 for ~50% of users
2024-08-01 09:24:33 +10:00
Filipe
ce44f19b4a Merge pull request #12704 from cyrillefr/FilteringProductBySupplierPropertyBreaksWhenEnterpriseHasCustomSortingByCategorySet
Fixes 422 error due to bad sql building
2024-07-31 19:45:09 +01:00
Filipe
6c214543ad Merge pull request #12690 from wandji20/wb-OFN-12666
Require variant category and supplier when creating new product variants [OFN-12666]
2024-07-31 19:28:31 +01:00
Filipe
8b1713d169 Merge pull request #12665 from wandji20/wb-OFN-12532
Pluralize admin products search result [OFN-12532]
2024-07-31 18:55:53 +01:00
David Cook
587ce5ad9d Activate admin_style_v3 for 50% of users 2024-07-31 16:55:12 +10:00
Rachel Arnould
f51705cb57 Merge pull request #12676 from dacook/add-affiliate_sales_data-connected_app-12550
Add "Affiliate Sales Data" connected app option
2024-07-30 16:14:27 +02:00
wandji20
55df9416cc Add test to check when new variant category and producer is empty [OFN-12666] 2024-07-30 12:09:59 +01:00
wandji20
0376c04ad5 Fix failing specs [OFN-12666] 2024-07-30 12:07:50 +01:00
wandji20
2709479bf2 Require varian t category when creating new product variant [OFN-12666] 2024-07-30 12:07:50 +01:00
David Cook
c5fc621aa4 Use scope to determine which enterprises are ready to be affiliated 2024-07-30 15:21:29 +10:00
Gaetan Craig-Riou
bfd0e7f784 Add request_id to logs for production and staging
It will prepend a request unique id to each log lines, it makes it
easier to debug individual request.
2024-07-30 11:38:46 +10:00
David Cook
fece8beef5 Style/Send 2024-07-29 14:13:22 +10:00
David Cook
53e3621e04 Merge pull request #12703 from johansenja/fix-rubocop-style-send
Fix rubocop Style/Send group
2024-07-29 14:02:01 +10:00
David Cook
1949839056 Update interpolation variable name
This avoids error 'missing interpolation argument'.
2024-07-29 10:41:11 +10:00
Konrad
00a0006ff2 Merge pull request #12691 from ccozkan/use-vertical-transitions-for-cloning-and-deleting
Use vertical transitions for cloning and deleting products
2024-07-28 18:25:07 +02:00
Konrad
325f9aa6f3 Merge pull request #12664 from wandji20/wb-OFN-12551
Remove SR from clear search button [OFN-12551]
2024-07-28 14:31:08 +02:00
Konrad
95ec5c3c58 Merge pull request #12655 from wandji20/wb-OFN-11513
(Fix) [User->New] Language is displayed twice [OFN-11513]
2024-07-28 13:46:51 +02:00
wandji20
ef87cdb167 Revert changes and use selectable locales for helper local_options [OFN-11513] 2024-07-28 12:52:01 +02:00
wandji20
65d4596f3b Fix failling spec [OFN-11513] 2024-07-28 12:52:01 +02:00
wandji20
a9e295bc11 (Fix) [User->New] Language is displayed twice [OFN-11513] 2024-07-28 12:52:01 +02:00
Abdul Aziz Ali
ac8caf7710 Revert to use .order_cycle_id #11326 2024-07-28 17:57:56 +08:00
Abdul Aziz Ali
8a1e61fd60 Fix incoming_controller_spec. Remove .order_cycle_id usage #11326 2024-07-27 17:54:39 +08:00
Abdul Aziz Ali
baf38b6b30 Only set per_item flag in order_cycle incoming controller #11326 2024-07-27 16:12:26 +08:00
Cillian O'Ruanaidh
3507405dae Make Item column wider and tax and quantity columns narrower in invoice PDF 2024-07-26 15:36:42 +01:00
Filipe
c25fe6ae57 Merge pull request #12654 from wandji20/wb-OFN-112509
Use public contact email at the bottom of order confirmation email [OFN-12509]
2024-07-25 20:14:47 +01:00
Filipe
7bcf3206d8 Merge pull request #12678 from chahmedejaz/bugfix/11640-products-page-broken-URL
Fix URL State management on the Products page
2024-07-25 20:00:49 +01:00
David Cook
df81e8ed35 Add task to connect all enterprises
Example usage:
 rake ofn:enterprises:activate_connected_app_type[affiliate_sales_data]
2024-07-25 21:14:04 +10:00
David Cook
e9d7a0b099 Add User#affiliate_enterprises 2024-07-25 21:14:01 +10:00
David Cook
da7bbcf82f Enable/disable affiliate sales data 2024-07-25 17:06:13 +10:00
David Cook
1742d2807f Add affiliate sales data to form 2024-07-25 17:06:13 +10:00
David Cook
d3c5e2365a Add AffiliateSalesData model
Using namespace subfolder to help organise it and show the inheritance.

Hmm, instead of scopes, we could have different has_many relationships on the Enterprise. Maybe it should be in a concern. We can refactor later I guess.
2024-07-25 17:06:13 +10:00
David Cook
27e53f9dcc Scope spec to section
Because there's going to be a new section with the same button label
2024-07-25 17:06:13 +10:00
David Cook
5d0f55b8c3 Re-organise spec
Best viewed with whitespac ignored.
2024-07-25 17:06:13 +10:00
David Cook
9d89b4726b Move connect logic to model
Then subtypes can override as needed.
2024-07-25 17:06:13 +10:00
David Cook
9b37eacb8d add scope for discover_regen 2024-07-25 17:06:13 +10:00
David Cook
bbe22bbfeb AddTypeToConnectedApps 2024-07-25 17:06:13 +10:00
David Cook
85d5e2ee70 Expect single connected_app record for discover regen 2024-07-25 17:05:42 +10:00
David Cook
9a4051f37b Move discover regen to named partial
To make way for a new type of connected app.

If only we could use [relative partial paths](https://github.com/rails/rails/issues/1143)
2024-07-25 17:05:42 +10:00
cyrillefr
05ed4639b2 Fixes 422 error due to bad sql building
- first part of query use supplier_properties parameter, but not
  second part, that can leads to mismatch between the 2 parts.
  Remove supplier_properties parameter + modify SQL to get it right.
- spec tests category filtering & sorting + producer properties
2024-07-24 21:49:11 +02:00
Abdul Aziz Ali
2bcf84d9a9 Add outgoing exchange scenario spec #11326 2024-07-24 17:38:10 +08:00
Gaetan Craig-Riou
99acf752f4 Update all locales with the latest Transifex translations 2024-07-24 15:34:16 +10:00
Joseph Johansen
5086f2d8b5 Fix rubocop Style/Send group 2024-07-23 14:18:26 +01:00
wandji20
0b46c41ffd Update reply email for order confirmation mail [OFN-12509] 2024-07-23 08:54:06 +01:00
wandji20
4fe3f60009 Use public contact email at the bottom of order confirmation email [OFN-12509] 2024-07-23 08:35:30 +01:00
Gaetan Craig-Riou
dfea0cd805 Merge pull request #12700 from rioug/fix-number-rounding-with-hu-locale
[BUU] fix error 500 on hungary instance
2024-07-23 16:35:48 +10:00
Gaetan Craig-Riou
0f04b2fb10 Fix call to ActiveSupport::NumberHelper.number_to_rounded
When running with :hu locale, call to `number_to_rounded` wiht parameter
precision: nil breaks, adding significant: false fixes the issue
2024-07-23 13:51:32 +10:00
Filipe
146296d0b2 Merge pull request #12694 from rioug/12692-revert-product-desxription-tuncation
Revert product description truncation fix
2024-07-22 12:22:56 +01:00
Ahmed Ejaz
a6efad73a8 12551 - add no-cache policy for Turbo cache control 2024-07-22 13:45:01 +05:00
Gaetan Craig-Riou
7f9bbd23e5 Revert fix introduced in https://github.com/openfoodfoundation/openfoodnetwork/issues/10685
It breaks wit Safari on Iphone
2024-07-22 14:59:30 +10:00
Çağrı Özkan
29d63b0f0f Change slide in animation to appear from top 2024-07-22 06:01:01 +03:00
Çağrı Özkan
25e9fd22d8 Change slide out animation to disappear towards top 2024-07-22 06:01:01 +03:00
Gaetan Craig-Riou
5caeb160ef Merge pull request #12684 from dacook/fix-spec
Fix flaky spec
2024-07-22 11:59:22 +10:00
David Cook
1310965975 Scope expectations to product/variant rows
This spec was getting flaky because:

> expected not to find text "20"
> in "Logged in as : olen@harveydenesik.biz Account Logout ... Weight (g) YES 1g On demand Enterprise 203 Enterprise 203
2024-07-22 11:42:50 +10:00
David Cook
0c43dd4222 Merge pull request #12686 from filipefurtad0/activate_25_p_cent_BUU_users
Activates admin_style_v3 for 25 per cent users
2024-07-22 10:28:19 +10:00
wandji20
bb427db66a Add spec for clearing search input when no results is found [OFN-12551] 2024-07-19 14:25:46 +01:00
wandji20
1165b00600 Remove SR from clear search button [OFN-12551] 2024-07-19 14:21:35 +01:00
dependabot[bot]
2d45952611 Bump @hotwired/turbo from 8.0.4 to 8.0.5
Bumps [@hotwired/turbo](https://github.com/hotwired/turbo) from 8.0.4 to 8.0.5.
- [Release notes](https://github.com/hotwired/turbo/releases)
- [Commits](https://github.com/hotwired/turbo/compare/v8.0.4...v8.0.5)

---
updated-dependencies:
- dependency-name: "@hotwired/turbo"
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-07-19 09:58:25 +00:00
filipefurtad0
17eb8d5cd8 Update all locales with the latest Transifex translations 2024-07-19 10:09:29 +01:00
filipefurtad0
c8ca993fa9 Activates admin_style_v3 for 25 per cent users 2024-07-18 16:39:35 +01:00
Rachel Arnould
de20dd949b Merge pull request #12668 from filipefurtad0/prepare_import_spec_for_admin_style_3
Prepare product_import_spec.rb for BUU as default
2024-07-18 16:33:56 +02:00
Konrad
4c9507caa3 Merge pull request #12602 from chahmedejaz/bugfix/12570-variant-unit-field-out-of-sync
12570 - Fix Variant Unit field is Out of Sync with the Pop-out
2024-07-18 13:32:27 +02:00
Filipe
f1e6f8bb66 Merge pull request #12683 from dacook/buu-troubleshoot-12682
[BUU] Handle corrupt data and troubleshooting
2024-07-18 12:28:18 +01:00
David Cook
918d4401ff Gracefully handle empty string 2024-07-18 12:05:56 +10:00
David Cook
4925e2088d Test for corrupt data
Ah ha, we found the problem.
2024-07-18 12:03:25 +10:00
David Cook
bba59c1ffd Force significant: false for NumberHelper
Although it defaults to false, somehow it seems to be evaluated as true on hu_prod...??!?!!1! (https://github.com/openfoodfoundation/openfoodnetwork/issues/12682)
Maybe this will help.
2024-07-18 11:06:45 +10:00
Filipe
f3e7ba0462 Merge pull request #12675 from zsoltiNagy/insert_cloned_below_the_original_product
Changed a single line in turbo to insert cloned products after the original product
2024-07-17 20:14:13 +01:00
Filipe
23fc77351e Merge pull request #12663 from cyrillefr/Inventory_Producer_column_is_empty_in_review_page
Replace product by variant to see producer name on views
2024-07-17 18:17:58 +01:00
Filipe
3bd5ae2eec Merge pull request #12680 from rioug/12670-fix-product-ordering-inventory
[inventory] Fix product sorting
2024-07-17 17:53:16 +01:00
filipefurtad0
0123d6fb2e Copies admin_style_v3 feature into ACTIVE_BY_DEFAULT section
This should have an effect on test environment
2024-07-17 14:51:29 +01:00
filipefurtad0
e0d7252fe3 Adds condition for dev environment only
We don't want to enable this in production just yet
2024-07-17 14:51:29 +01:00
filipefurtad0
24defac470 Adds a migration to enable the feature by default 2024-07-17 14:51:29 +01:00
filipefurtad0
46696dfa17 Removes references to enabling admin_style_v3 features
Reverts removal from bulk_product_spec.rb
2024-07-17 14:51:25 +01:00
Ahmed Ejaz
1af811cf51 11640 - fix per_page issue when the page is changed
- Fix the scenario when per_page is selected as 100 and next page is clicked, then per_page is empty in the request.
- Expected behavior should be that it retains the per_page selected previously
2024-07-17 10:17:06 +05:00
Ahmed Ejaz
1850f298a6 11640 - use turbo navigation 2024-07-17 10:16:52 +05:00
Gaetan Craig-Riou
ae3fa00429 Add ordering by producer and product name
It looks like the ordering by producer got lost in some rebase.
2024-07-17 11:22:49 +10:00
wandji20
80ade22bd6 Pluralize admin products search result [OFN-12532] 2024-07-16 13:10:22 +01:00
dependabot[bot]
4fb458afe0 Bump trix from 2.1.2 to 2.1.3
Bumps [trix](https://github.com/basecamp/trix) from 2.1.2 to 2.1.3.
- [Release notes](https://github.com/basecamp/trix/releases)
- [Commits](https://github.com/basecamp/trix/compare/v2.1.2...2.1.3)

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

Signed-off-by: dependabot[bot] <support@github.com>
2024-07-16 09:30:08 +00:00
zsoltiNagy
c25750387f Changed a single line in turbo to insert cloned products after the original product 2024-07-16 07:23:03 +02:00
Ahmed Ejaz
5b7fbc875a 12570 - address PR comments 2024-07-15 22:48:20 +05:00
filipefurtad0
e1976c6cc2 Brings back xpath selector
Fixes xpath
2024-07-15 11:32:04 +01:00
filipefurtad0
91daec4806 Removes TODO, preparing spec for admin_style_3 (1)
Removes TODO, preparing spec for admin_style_3 (2)

Uses xpath to point to on hand field
2024-07-15 11:32:04 +01:00
filipefurtad0
bdc42deeb6 Sets import column test as pending
As of now, it is not clear whether we wish to re-implement this feature on BUU
2024-07-15 11:32:04 +01:00
David Cook
a66fec0b26 Merge pull request #12662 from mkllnk/order-finalise-spec
Improve spec for Spree::Order#finalize!
2024-07-15 11:53:57 +10:00
Ahmed Ejaz
c52c2ebfe1 12570 - fix specs 2024-07-12 18:20:19 +05:00
Ahmed Ejaz
d8354298f5 12570 - add specs 2024-07-12 18:02:57 +05:00
Ahmed Ejaz
0986971473 12570 - fix variant's display_as field being empty issue
- New variant unit_value is empty, so +VariantUnits::OptionValueNamer.new(variant).name+ returns ""
- Now we are making sure that new variant unit_value won't be empty
2024-07-12 17:00:42 +05:00
Gaetan Craig-Riou
29aa3a8059 Remove useless code 2024-07-12 10:34:42 +10:00
Konrad
e09745179f Merge pull request #12649 from dacook/product_import-tmpfile
Use application tmp dir for product import
2024-07-11 19:53:32 +02:00
cyrillefr
49c6a22fde Replace product by variant to see producer name on views
- replace product by variant since there had been changes in
  product & variant models.
- add a line in spec to test producer name.
2024-07-11 13:41:49 +02:00
Maikel Linke
a37b0eb698 Replace mocking on tested order object
It's more realistic this way.
2024-07-11 15:42:23 +10:00
Maikel Linke
2e36c699f6 Test resulting stock instead of method calls
The next test case wasn't asserting anything as well. The referenced
method `decrease_stock_for_variant` doesn't actually exist.
2024-07-11 15:42:23 +10:00
Maikel Linke
cb4e7d6fe3 Fix spec to assert updating shipments
The spec was asserting on all shipments of the order but there were one.
In consequence, the spec didn't assert anything. Now I set up a shipment
that is asserted on. I'm stil not sure how useful this spec is though.
2024-07-11 15:42:23 +10:00
Maikel Linke
94d560d341 Replace expecting method call with outcome
This is more realistic and robust. Don't mock the class under test (even
though `touch` is actually provided by Active Record).
2024-07-11 15:42:22 +10:00
Maikel Linke
eea227bc22 Style order spec block a tiny bit 2024-07-11 15:42:22 +10:00
David Cook
6d6f8735e3 Update all locales with the latest Transifex translations 2024-07-11 14:41:47 +10:00
Maikel
aec9a960e2 Merge pull request #12652 from filipefurtad0/activate_admin_style_v3_for_dev_test_and_new_servers
[BUU] Prepares specs for enabling admin_style_v3 by default
2024-07-11 13:55:20 +10:00
Maikel
f1713b11a6 Merge pull request #12657 from dacook/buu/enable_feature_admin_style_v3_for_admins
[BUU] Activate admin_style_v3 for all super admins
2024-07-11 13:40:32 +10:00
David Cook
c86f7f9d50 Remove comments 2024-07-11 10:58:57 +10:00
filipefurtad0
5e933af079 Prepares spec for admin_style_v3 - replaces TODO (1) 2024-07-11 10:58:57 +10:00
filipefurtad0
f7c47fecc4 Removes the need for using overlapping_elements_helper
Improves the specs so we don't need to recurr to overlapping elements clicks, and removes the respective helper
2024-07-11 10:58:57 +10:00
filipefurtad0
7d1cb0c957 Sets up enterprise with payment and shipping methods
So that the warning does not need to be dismissed - which is not what we wish to test here
2024-07-11 10:58:57 +10:00
filipefurtad0
7f6780b5e9 Simplifies specs, by replacing selector declaration with click_button 2024-07-11 10:58:57 +10:00
filipefurtad0
dfcd9391d9 Prepares smoke_tests_spec for admin_style_v3
Enables admin_style_v3 for smoke_tests_spec
2024-07-11 10:58:57 +10:00
filipefurtad0
6dd4bb3e3b Removes test case around shipped product
This is already covered on the v3 version of the spec, under ./spec/system/admin/products_v3/products_spec.rb:452
2024-07-11 10:58:57 +10:00
David Cook
cda2408c69 Merge pull request #12661 from chahmedejaz/task/12497-reorganize-products_v3_specs
[BUU] Re-Organize products_v3 Feature specs
2024-07-11 10:55:52 +10:00
Maikel
eb22bff908 Merge pull request #12647 from cyrillefr/FixRailsSkipsModelValidations
Fixes Rails/SkipsModelValidations offenses
2024-07-11 09:12:26 +10:00
Ahmed Ejaz
9281cd1a62 12497 - add create spec 2024-07-11 02:04:08 +05:00
Ahmed Ejaz
b99d985b75 12497 - add actions spec 2024-07-11 02:04:08 +05:00
Konrad
ecfa47cd78 Merge pull request #12574 from rioug/refactor-products-renderer
[Product Refactor] Refactor products renderer
2024-07-10 17:59:38 +02:00
Konrad
10898fdcfc Merge pull request #12639 from wandji20/wb-OFN-11597
Redirect successful user signup request to main home page [OFN-11597]
2024-07-10 17:24:40 +02:00
Abdul Aziz Ali
718e6765e1 Enterprise fee controller: Add all fees scenario #11326 2024-07-10 19:42:47 +08:00
Gaetan Craig-Riou
686fe8c028 Per review, remove flag argument from products_relation
products_relation is now split in two, products_relation and
products_relation_incl_supplier_properties.
It avoids using a flag argument which is not a a good practice see:
https://martinfowler.com/bliki/FlagArgument.html
2024-07-10 13:19:08 +10:00
David Cook
cb0a30ef52 EnableFeatureAdminStyleV3ForAdmins 2024-07-10 11:55:10 +10:00
Gaetan Craig-Riou
5c3acbbcaf Per review, remove instance variable @query 2024-07-10 11:45:39 +10:00
Abdul Aziz Ali
31d49ee99e Rubocop. Fix simple spec long line #11326 2024-07-10 08:18:00 +08:00
Abdul Aziz Ali
1e08f2713e Remove sleep. Use Capybara select helper #11326 2024-07-10 08:12:19 +08:00
Konrad
f0fd3bb73c Merge pull request #12635 from wandji20/wb-OFN-10685
(Fix) Product description not correctly truncated
2024-07-09 19:51:46 +02:00
cyrillefr
6d22652dfa Requested changes on VariantOverrride
- change was not exactly equivalent, so reverting +
  rubo comment
2024-07-09 16:06:45 +02:00
David Cook
2ab6bcb2e4 Use system method to generate temporary file path
This method is not documented, but is used by Dir.mktmpdir.  https://apidock.com/ruby/Dir/Tmpname/create
2024-07-09 16:01:50 +10:00
David Cook
ca612282f9 Use Rails tmp dir for product imports again
In https://github.com/openfoodfoundation/openfoodnetwork/pull/3435, it was switched to the system tmp dir because it conventiently provided a method to generate a unique filename. However it didn't handle the case where the system provided a symlink (macOS).

I could have fixed that, but surely it's safer to use the Rails tmp directory.
So I changed back to that, using a tip from https://stackoverflow.com/questions/13787746/creating-a-thread-safe-temporary-file-name to generate a unique name. Perhaps we could use a larger string (eg uuid) or append a timestamp too, but I don't know that it's necessary. Instead, we can just check that the dir didn't exist first (as mentioned in the PR). Let's do that..
2024-07-09 15:47:54 +10:00
David Cook
823614c214 Always delete uploaded file on error
The file path was never going to be 'tmp/product_import', so I guess it never deleted the file.
Hmm but shouldn't we clean up on success too? I suppose the tmp dir will be cleaned up eventually, and maybe we want to keep them for debugging purposes.
2024-07-09 15:06:00 +10:00
David Cook
cc1fa7f563 Always avoid error on redirect_to 2024-07-09 13:57:06 +10:00
Abdul Aziz Ali
8955972b05 Rubocop. fix formatting #11326 2024-07-09 08:56:54 +08:00
Abdul Aziz Ali
5fe5804b56 Add enterprise fee check in system admin ordercycles simple spec #11326 2024-07-09 08:49:45 +08:00
Konrad
d60d29b685 Merge pull request #12634 from chahmedejaz/bugfix/12632-voucher-field-focus-issue
Fix Voucher Code Field Focus Issue
2024-07-08 12:19:19 +02:00
wandji20
ac347b9c8e Redirect successful user signup request to main home page [OFN-11597] 2024-07-08 10:12:33 +01:00
wandji20
8a8a178683 Fix Product description not correctly truncated [OFN-10685] 2024-07-08 10:04:16 +01:00
Gaetan Craig-Riou
5c136f8baa Fix OrderCycleController to use products_relation 2024-07-08 10:35:57 +10:00
Gaetan Craig-Riou
c372bf746a Refactor ProductRenderer
The sorting logic has been moved to
OrderCycles::DistributedProductsService#product_relations

Plus hopefully fix the spec flackiness
2024-07-08 10:35:57 +10:00
Gaetan Craig-Riou
79a22aefc3 Refactor #products_relation
Due to primary_taxon and supplier having moved to the variant, filtering
by_producer and by_category with a custom order involves some
complicated sql queries. So we moved the sorting logic from
ProductsRenderer to OrderCycles::DistributedProductsService so we can
keep the complicated SQL logic contained in one place
2024-07-08 10:35:57 +10:00
Gaetan Craig-Riou
17fe492bf4 Fix typo 2024-07-08 10:35:57 +10:00
Gaetan Craig-Riou
47faedc295 Merge pull request #12646 from openfoodfoundation/dependabot/npm_and_yarn/trix-2.1.2
Bump trix from 2.1.1 to 2.1.2
2024-07-08 09:48:54 +10:00
cyrillefr
ce8a2b3251 Fixes Rails/SkipsModelValidations offenses
- increments! & decrement! skip validations
 - replaced increment! method calls
 - one call was for a redefined increment! method
 - the other for a regular(ActiveRecord::Persistence)
 - removes increments/decrements definition now useless
2024-07-05 16:35:40 +02:00
dependabot[bot]
ac2f59bdb2 Bump trix from 2.1.1 to 2.1.2
Bumps [trix](https://github.com/basecamp/trix) from 2.1.1 to 2.1.2.
- [Release notes](https://github.com/basecamp/trix/releases)
- [Commits](https://github.com/basecamp/trix/compare/v2.1.1...v2.1.2)

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

Signed-off-by: dependabot[bot] <support@github.com>
2024-07-05 09:44:38 +00:00
Maikel Linke
8d327355f9 Update all locales with the latest Transifex translations 2024-07-05 13:29:17 +10:00
Maikel
c8cb15df33 Merge pull request #12644 from mkllnk/spec-fixes
Fix orders and distributors report after product refactor
2024-07-05 13:25:37 +10:00
Maikel Linke
d602482d91 Fix report spec referencing distributor 2024-07-05 12:08:33 +10:00
Maikel Linke
51f89b995a Update database include statement for report
Fixes:

* spec/lib/reports/orders_and_fulfillment/orders_cycle_supplier_totals_report_spec.rb
* spec/system/admin/reports_spec.rb
2024-07-05 12:04:14 +10:00
Maikel
2b10862779 Merge pull request #12641 from cyrillefr/FixRailsSelectMap
Fixes Rails/SelectMap offense
2024-07-05 11:27:23 +10:00
Maikel
6594b30bf4 Merge pull request #12640 from dacook/bulk-invoice-polling-12215
Poll to check when invoice file finished
2024-07-05 10:05:56 +10:00
Maikel Linke
b131c352a9 Spec backup polling of rendered invoice file 2024-07-05 09:36:50 +10:00
David Cook
e62b640372 Poll to check when invoice file finished
The BulkInvoiceJob already sends a notification via WebSockets once complete, but sometimes that fails. So this is added on top, just in case.
2024-07-05 08:58:10 +10:00
cyrillefr
838974973d Fixes Rails/SelectMap offense
Cf. cop @ https://docs.rubocop.org/rubocop-rails/cops_rails.html#railsselectmap
2024-07-03 13:17:02 +02:00
Rachel Arnould
2c41d065df Merge pull request #12594 from dacook/12559-fix-orders-and-distributors-report
Hide customer data on orders_and_distributors report
2024-07-03 13:12:42 +02:00
Rachel Arnould
045da3c0e5 Merge pull request #12562 from rioug/product-supplier-id
[Product Refactor]  Move supplier to Variant
2024-07-03 13:03:58 +02:00
Gaetan Craig-Riou
cfc51f399f More rebase fix 2024-07-03 13:07:17 +10:00
Gaetan Craig-Riou
fb2575aaeb Fix more rebase issue 2024-07-03 11:23:02 +10:00
Gaetan Craig-Riou
be5a228509 Fix rebase issue
and add missing translation
2024-07-03 11:23:02 +10:00
Gaetan Craig-Riou
dfe56c1eed Fix flacky spec
In practise we shouldn't have product with mutiple variant with
different supplier, so I think it's fine to not test it.
2024-07-03 11:23:02 +10:00
Gaetan Craig-Riou
1ead9208ee Fix rebase issue
Fix test by creating a variant instead of relying on some random data
from the database.
2024-07-03 11:23:02 +10:00
Gaetan Craig-Riou
1d86315108 Per review, update comment to match code 2024-07-03 11:23:02 +10:00
Gaetan Craig-Riou
f60a79437e Reworked the test to use variant factory
Creating a variant actually create an extra one via the associated
product, as it will create a "standard variant".
As far as I can see there is no way around it, but it should be fixed
once the Product refactor is finished, and product becomes product
group.
Added a comment on the variant factory to explain the problem.

It's not ideal as it will slow down the test suite a little, but I think
it's better to write the code the way you would expect it, and it will
eventually get fixed.
2024-07-03 11:23:02 +10:00
Gaetan Craig-Riou
f79691e4bf Ignore supplier_id for Spree::Product 2024-07-03 11:23:02 +10:00
Gaetan Craig-Riou
9549f4e506 Update product description 2024-07-03 11:23:02 +10:00
Gaetan Craig-Riou
448308710a Per review, distributor are now updated via variant
When a product is deleted, it will delete associated variant and
in turn will touch the affected distributors
2024-07-03 11:23:02 +10:00
Gaetan Craig-Riou
f73745a803 David's first review changes 2024-07-03 11:23:02 +10:00
Gaetan Craig-Riou
3788b33eb0 First round of code review change 2024-07-03 11:23:02 +10:00
Gaetan Craig-Riou
c328ee8087 Remove stockable_by from Product and Variant
It's not used anymore
2024-07-03 11:23:02 +10:00
Gaetan Craig-Riou
efbec02fb9 Fix rebase issue 2024-07-03 11:23:02 +10:00
Gaetan Craig-Riou
117f6d3300 First round of code review change 2024-07-03 11:21:28 +10:00
Gaetan Craig-Riou
56b58219da Update rubocop TODO 2024-07-03 11:21:28 +10:00
Gaetan Craig-Riou
260211cf15 Fix Ruboxop issue 2024-07-03 11:21:28 +10:00
Gaetan Craig-Riou
7219f72ac7 Fix rebase issue 2024-07-03 11:21:28 +10:00
Gaetan Craig-Riou
891f79666d Spree::Product remove in_supplier_or_distributor scope
It is not used anywhere
2024-07-03 11:21:28 +10:00
Gaetan Craig-Riou
312c240968 Fix mutilingual spec 2024-07-03 11:21:28 +10:00
Gaetan Craig-Riou
b6faa43879 Fix touching distributor callback spec
The original spec check if the supplier and distributor where
updated after deleting product. In reality, the supplier and the
distributor are the same, so no need to test with the supplier
2024-07-03 11:21:28 +10:00
Gaetan Craig-Riou
84197aca19 Fix the filtering by properties/supplier properties
- Apply OR when filtering by both product properties and supplier
properties
- Apply AND when filtering by supplier properties and taxon
Filtering by product properties and taxon is handled by ransack, so
no change there
2024-07-03 11:21:28 +10:00
Gaetan Craig-Riou
9632f42a40 Fix producer property filtering 2024-07-03 11:21:28 +10:00
Gaetan Craig-Riou
a52401107a Order cycle API, separate properties and producer_properties
Due to moving the supplier to the variant, we had to add manual search
for producer properties instead of using ransack. So we need a way
for the frontend to diferenciate between product properties and producer
properties. This is the first step towards that
2024-07-03 11:21:28 +10:00
Gaetan Craig-Riou
3704b18952 Fix property filtering in shopping system spec 2024-07-03 11:21:28 +10:00
Gaetan Craig-Riou
feb7e173b1 Fix order cycle controller spec, product properties filtering
And fix the underlying product renderer
2024-07-03 11:21:28 +10:00
Gaetan Craig-Riou
3dc7c2bf56 Fix spree product touch supplier
Take into account import product scenario, in this case the variant
doesn't have an assigned supplier yet.
2024-07-03 11:21:28 +10:00
Gaetan Craig-Riou
2d707e8acb Fix consumer producer system spec 2024-07-03 11:21:28 +10:00
Gaetan Craig-Riou
dd8f0aafab Fix ProductImport::EntryProcessor#count_existing_items
Plus spec
2024-07-03 11:21:28 +10:00
Gaetan Craig-Riou
564ea0bd49 Fix enterprise touching when associated record updated 2024-07-03 11:21:28 +10:00
Gaetan Craig-Riou
1c6d10d4e7 Remove supplier_id from simple product serializer 2024-07-03 11:21:28 +10:00
Gaetan Craig-Riou
b5cf47d306 Fix producer mailer 2024-07-03 11:21:28 +10:00
Gaetan Craig-Riou
34aba72dea Fix order summary mailer view 2024-07-03 11:21:28 +10:00
Gaetan Craig-Riou
7b6b365c4f Fix subscription form spec 2024-07-03 11:21:28 +10:00
Gaetan Craig-Riou
8244fa7685 Fix enterprise shopfront serializer spec 2024-07-03 11:21:28 +10:00
Gaetan Craig-Riou
3eae329cc4 Fix shop system spec 2024-07-03 11:21:28 +10:00
Gaetan Craig-Riou
848144d378 Fix DFC engine 2024-07-03 11:21:28 +10:00
Gaetan Craig-Riou
d614780059 Fix product serializer spec 2024-07-03 11:21:28 +10:00
Gaetan Craig-Riou
2550f8fd80 Fix cached enterprise serializer spec 2024-07-03 11:21:28 +10:00
Gaetan Craig-Riou
7c712f0058 Fix cart system spec 2024-07-03 11:21:28 +10:00
Gaetan Craig-Riou
725e2bfa48 Fix checkout summary system spec 2024-07-03 11:21:28 +10:00
Gaetan Craig-Riou
a2de846f2c Fix darkswarm caching system spec 2024-07-03 11:21:28 +10:00
Gaetan Craig-Riou
9b879da616 Fix Checkout payment system spec 2024-07-03 11:21:28 +10:00
Gaetan Craig-Riou
0f7f1a5d5c Fix shopping system spec 2024-07-03 11:21:28 +10:00
Gaetan Craig-Riou
8104d8e37b Fix checkout auth system spec 2024-07-03 11:21:28 +10:00
Gaetan Craig-Riou
4c274e0a90 Fix groups system spec 2024-07-03 11:21:28 +10:00
Gaetan Craig-Riou
470986dc19 Fix white label system spec 2024-07-03 11:21:28 +10:00
Gaetan Craig-Riou
a8cdca89a1 Fix shopping variant overrides system spec 2024-07-03 11:21:28 +10:00
Gaetan Craig-Riou
1061bf50b4 Fix shopping unit price system spec 2024-07-03 11:21:28 +10:00
Gaetan Craig-Riou
12c017ab99 Fix checkout tax incl system spec 2024-07-03 11:21:28 +10:00
Gaetan Craig-Riou
8db7352774 Fix tax not incl checkout system spec 2024-07-03 11:21:28 +10:00
Gaetan Craig-Riou
4396c39c83 Fix checkout details system spec 2024-07-03 11:21:28 +10:00
Gaetan Craig-Riou
d53bfe455d Fix guest checkout system spec 2024-07-03 11:21:28 +10:00
Gaetan Craig-Riou
6538c7adca Fix shopping system spec 2024-07-03 11:21:28 +10:00
Gaetan Craig-Riou
ca80177954 Fix admin order cycle system spec 2024-07-03 11:21:28 +10:00
Gaetan Craig-Riou
e901886915 Fix report system spec 2024-07-03 11:19:29 +10:00
Gaetan Craig-Riou
add6d15fc4 Fix bulk order management system spec 2024-07-03 11:16:53 +10:00
Gaetan Craig-Riou
0167357f8f Fic enterprise fee summary report system spec 2024-07-03 11:15:10 +10:00
Gaetan Craig-Riou
61750c51b3 Fix enterprise system spec 2024-07-03 11:15:10 +10:00
Gaetan Craig-Riou
93660efdf7 Fix subscription crud spec 2024-07-03 11:15:10 +10:00
Gaetan Craig-Riou
07fb607c35 Small test speed up
`select_datetime_from_datepicker` will manually click through the month
to find the given date. Setting the date to a month from now speed up
the test, and will prevent failing test after 2040
2024-07-03 11:15:10 +10:00
Gaetan Craig-Riou
62efde4c98 Fix subscription smoke test 2024-07-03 11:15:10 +10:00
Gaetan Craig-Riou
8937c3395a Fix order management subscription variant list 2024-07-03 11:15:10 +10:00
Gaetan Craig-Riou
4115b857f7 Fix revenue by hub system spec 2024-07-03 11:15:10 +10:00
Gaetan Craig-Riou
e0e78f2798 Fix order and fulfillment system spec 2024-07-03 11:15:10 +10:00
Gaetan Craig-Riou
315f951f8f Fix order cycle complex editing system spec 2024-07-03 11:15:10 +10:00
Gaetan Craig-Riou
93a63c5eb5 Fix payment report system spec 2024-07-03 11:15:10 +10:00
Gaetan Craig-Riou
03ee9529f1 Fix packing report system spec 2024-07-03 11:15:10 +10:00
Gaetan Craig-Riou
5884edaa1b Fix product import system spec 2024-07-03 11:15:10 +10:00
Gaetan Craig-Riou
1ea3160a6a Fic enterprises controller 2024-07-03 11:15:10 +10:00
Gaetan Craig-Riou
f161f51a0e Fix sales tax by producer report 2024-07-03 11:15:10 +10:00
Gaetan Craig-Riou
b156f722f1 Fix variant override spec 2024-07-03 11:15:10 +10:00
Gaetan Craig-Riou
07fb7b5b5e Fix variant system spec 2024-07-03 11:12:34 +10:00
Gaetan Craig-Riou
6c4c0ebf6f Refactor product page system spec
Remove some duplication and group related test
2024-07-03 11:12:34 +10:00
Gaetan Craig-Riou
ee88e2fdfa Fix product system spec 2024-07-03 11:11:03 +10:00
Gaetan Craig-Riou
9f612270c7 Fix bulk update product page old style
and related product pages
2024-07-03 11:05:01 +10:00
Gaetan Craig-Riou
2ab9ccf73d Bulk edit product, move supplier dropdown to variant 2024-07-03 11:05:00 +10:00
Gaetan Craig-Riou
78abe36327 Fix BUU product page specs 2024-07-03 11:05:00 +10:00
Gaetan Craig-Riou
b891a03468 Fix search by producer, BUU product page 2024-07-03 10:17:49 +10:00
Gaetan Craig-Riou
63807f198b Fix product set, to handle updating supplier on the variant 2024-07-03 10:17:49 +10:00
Gaetan Craig-Riou
25371ee9d0 Fix admin pages
- move supplier to variant row on Bulk Edit product page
- add supplier dropdow on add/update variant page
2024-07-03 10:17:49 +10:00
Gaetan Craig-Riou
6ee77fa406 Fix sales tax totals by order report 2024-07-03 10:17:49 +10:00
Gaetan Craig-Riou
83fa080f76 Fix product and inventory report 2024-07-03 10:17:49 +10:00
Gaetan Craig-Riou
17793e7b12 Fix packing report spec 2024-07-03 10:17:49 +10:00
Gaetan Craig-Riou
45f4365385 Fix order cycle management report 2024-07-03 10:17:49 +10:00
Gaetan Craig-Riou
bfb4997207 Fix product and inventory report, lettuce share 2024-07-03 10:17:49 +10:00
Gaetan Craig-Riou
c273c6b155 Fix enterprise fee with tax report specs 2024-07-03 10:17:49 +10:00
Gaetan Craig-Riou
40892580cd Fix enterprise fee summary report spec 2024-07-03 10:17:49 +10:00
Gaetan Craig-Riou
323602abbb Fix customer report specs 2024-07-03 10:17:49 +10:00
Gaetan Craig-Riou
fddfd0dbfb Fix bulk coop report 2024-07-03 10:17:49 +10:00
Gaetan Craig-Riou
c1dc87ae21 Fix enterprise fee calculator spec 2024-07-03 10:17:49 +10:00
Gaetan Craig-Riou
f8c2dfb3f7 Fix variants stock level sevice specs 2024-07-03 10:17:49 +10:00
Gaetan Craig-Riou
df209fdc2b Fix product tag rules filterer spec 2024-07-03 10:17:49 +10:00
Gaetan Craig-Riou
1f904a3e2f Fix orcer cycle form service spec 2024-07-03 10:17:49 +10:00
Gaetan Craig-Riou
80c4d9d03b Fix invoice template 2024-07-03 10:17:49 +10:00
Gaetan Craig-Riou
f38e13b1a0 Fix orders controller spec 2024-07-03 10:17:49 +10:00
Gaetan Craig-Riou
93922b484f Fix admin variants controller specs 2024-07-03 10:17:49 +10:00
Gaetan Craig-Riou
82b630c0c4 Partially fix admin product controller spec 2024-07-03 10:17:49 +10:00
Gaetan Craig-Riou
6d55f8ef2e Fix admin orders controller spec 2024-07-03 10:17:49 +10:00
Gaetan Craig-Riou
076200597d Fix shop controller spec 2024-07-03 10:17:49 +10:00
Gaetan Craig-Riou
5b3e79e6c8 Fix Line Items controller specs 2024-07-03 10:17:49 +10:00
Gaetan Craig-Riou
2e129eab8f Fix API V0 variants controller 2024-07-03 10:17:49 +10:00
Gaetan Craig-Riou
30decf3f34 Fix API V0 shops controller spec 2024-07-03 10:17:49 +10:00
Gaetan Craig-Riou
16709704fd Fix API v0 shipments controller 2024-07-03 10:17:49 +10:00
Gaetan Craig-Riou
656361c82d Fix API v0 packing report 2024-07-03 10:17:49 +10:00
Gaetan Craig-Riou
c82444efa9 Fix API v0 products controller 2024-07-03 10:17:49 +10:00
Gaetan Craig-Riou
507fa028c1 Fix api admin serializers 2024-07-03 10:17:49 +10:00
Gaetan Craig-Riou
e1c3f0a31c Fix product scope query
Plus a small name refactor
2024-07-03 10:17:49 +10:00
Gaetan Craig-Riou
e48cdeba20 Fix product related permissions 2024-07-03 10:17:49 +10:00
Gaetan Craig-Riou
71b6938961 Fix API V0 order controller spec 2024-07-03 10:17:49 +10:00
Gaetan Craig-Riou
586acad8f1 Fix most of api V0 order cycles controller 2024-07-03 10:17:49 +10:00
Gaetan Craig-Riou
0c9223809b Fix with_properties scope to accept any number of arguments 2024-07-03 10:17:49 +10:00
Gaetan Craig-Riou
53e7b02471 Fix admin api exchange products controller 2024-07-03 10:17:49 +10:00
Gaetan Craig-Riou
a873fa692b Fix exchange products renderer and specs 2024-07-03 10:17:49 +10:00
Gaetan Craig-Riou
04fb49bc25 Fix admin variant overrides controller specs 2024-07-03 10:17:49 +10:00
Gaetan Craig-Riou
b5e76e1dab Fix subscriptions controller specs 2024-07-03 10:17:49 +10:00
Gaetan Craig-Riou
2952ebb05c Fix admin report controller spec 2024-07-03 10:17:49 +10:00
Gaetan Craig-Riou
3d82309c5f Fix order permission and specs 2024-07-03 10:17:49 +10:00
Gaetan Craig-Riou
6d1a6c6d0e Fix orders and fulfillment reports
Plus specs
2024-07-03 10:17:49 +10:00
Gaetan Craig-Riou
b13a1e8843 Fix order cycle controller spec 2024-07-03 10:17:49 +10:00
Gaetan Craig-Riou
71e4911b9e Fix order cycle permission 2024-07-03 10:17:49 +10:00
Gaetan Craig-Riou
1b7a5fdb2c Fix inventory items controller 2024-07-03 10:17:49 +10:00
Gaetan Craig-Riou
765655ae25 Fix bulk line items controller specs 2024-07-03 10:17:49 +10:00
Gaetan Craig-Riou
ef298e3b62 Fix taxon 2024-07-03 10:17:49 +10:00
Gaetan Craig-Riou
95ed806370 Fix shipment specs 2024-07-03 10:17:49 +10:00
Gaetan Craig-Riou
612ab097b7 Fix order specs 2024-07-03 10:17:49 +10:00
Gaetan Craig-Riou
054d967323 Fix line items
* fix supplier related code
* Fix associations + plus spec
2024-07-03 10:17:49 +10:00
Gaetan Craig-Riou
859f7efd02 Fix Spree:Ability 2024-07-03 10:17:49 +10:00
Gaetan Craig-Riou
d5cc60fd3a Fix ProductImporter and related Class 2024-07-03 10:17:49 +10:00
Gaetan Craig-Riou
94faf4cf69 Fix invenrory reset strategy spec 2024-07-03 10:17:49 +10:00
Gaetan Craig-Riou
b86d8e1603 Fix product import entry validation 2024-07-03 10:17:49 +10:00
Gaetan Craig-Riou
a87f10b2a6 Fix order cycle spec 2024-07-03 10:17:49 +10:00
Gaetan Craig-Riou
80112709f3 Fix invoice and api serializer 2024-07-03 10:17:49 +10:00
Gaetan Craig-Riou
50bd274715 Fix Enterprise 2024-07-03 10:17:49 +10:00
Gaetan Craig-Riou
d073a181e9 Fix EnterpriseRelationship 2024-07-03 10:17:49 +10:00
Gaetan Craig-Riou
02b9dfb517 Add after update primary taxon call back
It updates supplier on primary taxon update. It fixes falling
enterprise caching specs.
2024-07-03 10:17:49 +10:00
Gaetan Craig-Riou
22f4ae115a Add missing associations and validations specs 2024-07-03 10:17:49 +10:00
Gaetan Craig-Riou
8abea0afcf Add missing associations and validations specs 2024-07-03 10:17:49 +10:00
Gaetan Craig-Riou
5cb59d941a Add transient attribute supplier_id to Spree::Product
supplier_id transient attribute will be saved on the variant
2024-07-03 10:17:49 +10:00
Gaetan Craig-Riou
7af36510c8 Fix lambda styling
It follows Style/Lambda cop :
https://docs.rubocop.org/rubocop/1.60/cops_style.html#stylelambda
2024-07-03 10:17:49 +10:00
Gaetan Craig-Riou
6290e7ad1c Test the suppliers are touched on destroy 2024-07-03 10:17:49 +10:00
Gaetan Craig-Riou
06b0b54685 Update attribute translation 2024-07-03 10:17:49 +10:00
Gaetan Craig-Riou
d9d77d2b25 Migrate supplier to variant 2024-07-03 10:17:49 +10:00
Gaetan Craig-Riou
4113880401 Move supplier to variant part 2
Variant model and specs
2024-07-03 10:17:49 +10:00
Gaetan Craig-Riou
d1dd563720 Move supplier to variant part 1 2024-07-03 10:17:48 +10:00
Ahmed Ejaz
ced3408aaa 12632 - add specs 2024-07-02 15:50:55 +05:00
Rachel Arnould
4c141df474 Merge pull request #12628 from rioug/fix-report-go-button
[Reports] Fix data-disable on Go button
2024-07-02 10:05:05 +02:00
David Cook
540d487584 Merge pull request #12595 from filipefurtad0/refactor_products_v3_specs
[BUU] Refactors products_v3 system specs
2024-07-02 16:59:50 +10:00
David Cook
3d9bc2ef4b Update description 2024-07-02 16:59:20 +10:00
David Cook
0d254a8ba4 Move listing block to index file also 2024-07-02 16:54:34 +10:00
filipefurtad0
3a75135029 Moves update and image edit into new file 2024-07-02 16:50:46 +10:00
filipefurtad0
1085da83a9 Moves sorting, pagination, and search describe blocks into new file
Deletes describe blocks from products_spec
2024-07-02 16:49:46 +10:00
filipefurtad0
5cf8eb5efc Extracts helper methods into helper file
The idea is to split the main spec into several smaller ones; these would share the helper file
2024-07-02 16:45:46 +10:00
Maikel
a83daae873 Merge pull request #11645 from filipefurtad0/activate_buu_toggle_by_default_to_run_the_test_suite
[BUU] Activate admin_style_v3 for most system specs
2024-07-02 11:27:54 +10:00
Maikel
d3e00cd4b7 Merge pull request #12633 from openfoodfoundation/dependabot/npm_and_yarn/floating-ui/dom-1.6.7
chore(deps): bump @floating-ui/dom from 1.6.6 to 1.6.7
2024-07-02 10:59:29 +10:00
Gaetan Craig-Riou
7a741d92e7 Merge pull request #12630 from dacook/cleanup
Remove unused spec code
2024-07-02 10:05:17 +10:00
Ahmed Ejaz
02c0c6aa5e 12632 - fix voucher field focus issue
- when disabling or enabling the control, we should only focus it if it's not a button.
2024-07-01 14:49:38 +05:00
dependabot[bot]
33b680c67c chore(deps): bump @floating-ui/dom from 1.6.6 to 1.6.7
Bumps [@floating-ui/dom](https://github.com/floating-ui/floating-ui/tree/HEAD/packages/dom) from 1.6.6 to 1.6.7.
- [Release notes](https://github.com/floating-ui/floating-ui/releases)
- [Changelog](https://github.com/floating-ui/floating-ui/blob/master/packages/dom/CHANGELOG.md)
- [Commits](https://github.com/floating-ui/floating-ui/commits/@floating-ui/dom@1.6.7/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>
2024-07-01 09:05:34 +00:00
David Cook
b1aafbf843 Remove old migration spec
It breaks due to a change of the spec environment. There's no point fixing it, it's no longer required.
2024-07-01 15:31:27 +10:00
David Cook
c80199e8b1 Use normal capitalisation for translation 2024-07-01 15:31:27 +10:00
David Cook
b1721d69a2 todo: make specs work with admin_style_v3 2024-07-01 15:31:25 +10:00
David Cook
109432d282 fixup: feature toggle old screen 2024-07-01 14:58:27 +10:00
David Cook
5f01bb40d2 Remove unecessary message
I'm not sure why it's not appearing on my computer, but it was an unnecessary duplicate message, so I'm happy to remove it.
2024-07-01 14:58:27 +10:00
David Cook
39cae4468a Fix more uppercase tests after rebase
These seem to have been changed since the previous rebase.
2024-07-01 14:58:22 +10:00
David Cook
3a8c44d0c6 fixup: Updates spec to create a variant within BUU design 2024-07-01 12:38:10 +10:00
filipefurtad0
6dfef8104d Fixes rebase 2024-07-01 12:24:26 +10:00
filipefurtad0
9e25893401 Sets variant creation scenarios on_hand/on_demand as shared examples 2024-07-01 12:24:26 +10:00
filipefurtad0
8028610fe6 Updates spec to create a variant within BUU design 2024-07-01 12:24:26 +10:00
filipefurtad0
ba355fdaab Removes mouse clicks to display variants
This feature does not exist in BUU

Replaces previous add variant button click with correct version
2024-07-01 12:24:26 +10:00
filipefurtad0
c226b10827 Updates case on orders_spec.rb 2024-07-01 12:24:26 +10:00
filipefurtad0
80e817725e Mouse hovering displays the text
on the New variant button

This test needs to be improved as, for Capybara, the text seems to be always visible, although it only does become visible by hovering.
2024-07-01 12:24:26 +10:00
filipefurtad0
9f98dc253d Adds assertions on table header 2024-07-01 12:24:26 +10:00
filipefurtad0
5824516ce0 Fixes case 2024-07-01 12:24:26 +10:00
filipefurtad0
bcbc7c7930 Fixes rubocop inconsistency 2024-07-01 12:24:26 +10:00
filipefurtad0
03a9f6811c Fixes rubocop inconsistency 2024-07-01 12:24:26 +10:00
filipefurtad0
4e24af2f94 Applies helper changes 2024-07-01 12:24:23 +10:00
filipefurtad0
0a4c2a1903 Updates tom_select_helper.rb with the recent changes from master 2024-07-01 12:24:00 +10:00
filipefurtad0
0fa272a125 Changes helper for dropdown selection 2024-07-01 12:24:00 +10:00
filipefurtad0
2c3778360b Updates selector 2024-07-01 12:24:00 +10:00
filipefurtad0
8b036e5108 Removes search block - covered already a few lines below
under _describe search_ block
2024-07-01 12:23:52 +10:00
filipefurtad0
c4b2748282 Adds pending test case on creating variants 2024-07-01 12:09:14 +10:00
filipefurtad0
5af5eb7ecf Replaces all with find, within tom_select helper method
Moves existing tom select helper methods into separate file
2024-07-01 12:09:14 +10:00
filipefurtad0
289414a504 Adds tests around product creation
Introduces a tom-select helper file
2024-07-01 12:09:14 +10:00
filipefurtad0
d88db1365d Updates specs to accomodate changes on warnings/banners 2024-07-01 12:09:14 +10:00
filipefurtad0
3af5330998 Updates product category test 2024-07-01 12:09:14 +10:00
filipefurtad0
e09fa3e04a Updates v3 products page 2024-07-01 12:09:14 +10:00
filipefurtad0
2937bdc1d2 Deals with overlapping elements 2024-07-01 12:09:14 +10:00
filipefurtad0
c7894892f6 Deals with overlapping elements
Comments assertion due to overlapping elements
2024-07-01 12:09:14 +10:00
filipefurtad0
7303c40c92 Introduces helper to deal with overlapping elements
Fixes overlapping elements
2024-07-01 12:09:14 +10:00
filipefurtad0
50c7392c5e Deals with overlapping elements 2024-07-01 12:09:14 +10:00
filipefurtad0
4871e0082e Deals with overlapping elements
Deals with elements outside page range
2024-07-01 12:09:14 +10:00
filipefurtad0
8897e99113 Clicks OC warning modal away so other buttons are reachable
Another option would have been to use page.find(:button, Save).trigger(click)
2024-07-01 12:09:14 +10:00
filipefurtad0
527136105f Fixes case on products_spec.rb 2024-07-01 12:09:14 +10:00
filipefurtad0
8a198705e3 Fixes case on reports_spec.rb 2024-07-01 12:09:14 +10:00
filipefurtad0
b9bb4a4dcb displays a list of products
...adapted from ./spec/system/admin/bulk_product_update_spec.rb:23

Sets test as pending from issue #11060
2024-07-01 12:09:14 +10:00
filipefurtad0
1c580c42f4 Adds assertions on products page, when no products are found
Removes migrated test from legacy product spec file
2024-07-01 12:09:14 +10:00
filipefurtad0
5e4381cc63 Fixes case on failing test 2024-07-01 12:09:14 +10:00
filipefurtad0
9aecf9feb4 Brings the tests back to green, after rebasing
This is a WIP branch, and each time we rebase we'll have some specs breaking. The changes in this commit mostly relate to the change in /admin/products URL, which points to the new BUU prodcts page; disabling the feature around related tests brings the branch back to green.
2024-07-01 12:09:14 +10:00
filipefurtad0
308c559810 Fixes case on assertions, on failing specs
Selects white_label tab with trigger(click)

Scrolling down did no fix it, it still fails https://github.com/openfoodfoundation/openfoodnetwork/actions/runs/6526149195/job/17719815533?pr=11645, selecting the element with trigger(click) should work

Updates invoice tests
2024-07-01 12:09:14 +10:00
filipefurtad0
500b9ed1c7 Enables admin_style_v3 toggle by default 2024-07-01 12:09:11 +10:00
David Cook
c747b2e60c Remove unused code
We don't use poltergeist, and it just works fine now.
2024-07-01 10:43:06 +10:00
Gaetan Craig-Riou
9833ac67df Fix data-disble on Go button 2024-07-01 10:04:50 +10:00
Konrad
5bb47823c6 Merge pull request #12619 from rioug/12559-disable-report-button
[Reports] Disable GO button once clicked
2024-06-28 17:11:29 +02:00
Konrad
909bc2792c Merge pull request #12565 from chahmedejaz/task/11987-remove-SR-from-clone
11987: Prevent Reloading the whole table upon Product Clone
2024-06-28 15:35:52 +02:00
Konrad
04dd463f8e Merge pull request #12592 from mkllnk/report-rendering
Load large on-screen reports on demand
2024-06-28 11:14:38 +02:00
Maikel Linke
b117fd03da Simplify spec checking for disabled button 2024-06-28 08:42:24 +10:00
David Cook
d799230440 Update controller to catch more specific error
We now know which errors to expect. We still let other unknown errors raise higher up, where they will be logged with BugSnag, and treated as internal_server_error.
2024-06-27 12:51:28 +10:00
David Cook
92bd7a5d37 Revert new product duplicator behaviour 2024-06-27 11:39:49 +10:00
David Cook
898ab08bab Add specs for invalid records
It turns out that the duplicator still raises an exception in some cases. Now I think I see why the the controller was catching the exceptions. At least now we know which exceptions to catch.
2024-06-27 11:39:49 +10:00
Ahmed Ejaz
b1a3bff2ed 11987: add failing spec for product clone 2024-06-26 16:48:14 +05:00
Ahmed Ejaz
4315a05eb8 11987: fix lint issue 2024-06-26 16:32:32 +05:00
Ahmed Ejaz
0aea201d53 11987: update mocking save! to save 2024-06-26 16:31:16 +05:00
Ahmed Ejaz
5a259f1b91 Merge branch 'master' into task/11987-remove-SR-from-clone 2024-06-26 16:18:42 +05:00
Ahmed Ejaz
9f832e6743 11987: update code as per new product duplicator behavior 2024-06-26 16:16:13 +05:00
Ahmed Ejaz
95972c75c6 11987: remove rescue StandardError from controller 2024-06-26 16:10:31 +05:00
Ahmed Ejaz
3f6e5e7d09 11987: duplicate product without raising error 2024-06-26 16:00:59 +05:00
David Cook
0001ffa970 Fix product index
The param product_index wasn't present, so it was always choosing 1.
The products on page are indexed 0-14, so of course it would always conflict.

It would be simpler if we just used product IDs as the index, I think I did earlier but don't remember why not.
Anyway, using a negative number seems to work.
If there's an error, there will only be one at a time.
2024-06-26 17:04:49 +10:00
Gaetan Craig-Riou
74fb6c3143 Disable GO button once clicked
It is disabled both on client side and server side, so even if the
server takes a while to respond the button is disabled
2024-06-26 16:01:05 +10:00
Gaetan Craig-Riou
ad78210b00 Update all locales with the latest Transifex translations 2024-06-26 14:18:59 +10:00
David Cook
a22c17a520 Merge pull request #12618 from dacook/buu/page-title
[BUU] Add translation for "Products V3" page title
2024-06-26 10:03:21 +10:00
David Cook
0e26df2c18 Add translation for products_v3 page title 2024-06-26 09:43:38 +10:00
David Cook
2269bcee4c Merge pull request #12616 from chahmedejaz/task/12603-auto-author-assign-workflow
Add Auto Author Assign Workflow for Pull Requests
2024-06-26 09:27:58 +10:00
Gaetan Craig-Riou
cb98f2f3d5 Merge pull request #12606 from dacook/buu/enable-admin_style_v3-new_users
[BUU] Enable admin_style_v3 for new users from 3/07/2024
2024-06-26 09:23:40 +10:00
Gaetan Craig-Riou
1f018292f7 Merge pull request #12605 from abdellani/12373_12374_fix_bulk_invoice_sending_printing
[Invoices] Notify if any order cannot be invoiced on bulk invoice printing (update the behavior only when invoice flag enabled )
2024-06-26 09:16:55 +10:00
Maikel
8dff2e6017 Merge pull request #12614 from cyrillefr/FixRailsUnknownEnv
Fixes Rails/UnknownEnv offense
2024-06-26 09:06:00 +10:00
Maikel
2619e12216 Merge pull request #12617 from openfoodfoundation/dependabot/npm_and_yarn/floating-ui/dom-1.6.6
chore(deps): bump @floating-ui/dom from 1.6.5 to 1.6.6
2024-06-26 09:03:49 +10:00
Abdul Aziz Ali
9d12e55bd7 Add enterprise fees controller spec #11326 2024-06-26 06:36:57 +08:00
Abdul Aziz Ali
b3570991f4 Rubocop. Fix cyclomatic complexity in fees controller #11326 2024-06-26 06:36:42 +08:00
dependabot[bot]
dd68ccdf2d chore(deps): bump @floating-ui/dom from 1.6.5 to 1.6.6
Bumps [@floating-ui/dom](https://github.com/floating-ui/floating-ui/tree/HEAD/packages/dom) from 1.6.5 to 1.6.6.
- [Release notes](https://github.com/floating-ui/floating-ui/releases)
- [Changelog](https://github.com/floating-ui/floating-ui/blob/master/packages/dom/CHANGELOG.md)
- [Commits](https://github.com/floating-ui/floating-ui/commits/@floating-ui/dom@1.6.6/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>
2024-06-25 09:59:33 +00:00
cyrillefr
b09f41136f Fixes Rails/UnknownEnv offense
- Cop: Rails/UnknownEnv
- Cf. https://docs.rubocop.org/rubocop-rails/cops_rails.html#railsunknownenv
- Rails.env.typo? will always return false and will not return an error
- The way to check this is to add environments in the Environments config parameter
- in the rubocop file.
2024-06-25 10:18:45 +02:00
Ahmed Ejaz
feb1fa1198 12603 - add auto-author-assign workflow 2024-06-25 12:20:24 +05:00
David Cook
93798ed54b Merge pull request #12599 from chahmedejaz/task/12346-rubocop-rails-pluck-and-pluck-where
12346 - Fix Rubocop Rails/Pluck and Rails/PluckInWhere
2024-06-25 17:12:18 +10:00
Ahmed Ejaz
bb6e69ff56 Merge branch 'master' into task/12346-rubocop-rails-pluck-and-pluck-where 2024-06-25 11:53:50 +05:00
David Cook
b4ef83b3a7 Enable admin_style_v3 for new users from 3/07/2024 2024-06-25 13:04:36 +10:00
Maikel
c8e134cef5 Remove redundant wait loading report content
Co-authored-by: Gaetan Craig-Riou <40413322+rioug@users.noreply.github.com>
2024-06-25 11:50:01 +10:00
Gaetan Craig-Riou
3afb3f5ba0 Merge pull request #12601 from cyrillefr/FixRailsRelativeDateConstant
Fixes Rails/RelativeDateConstant offense
2024-06-25 09:15:29 +10:00
Mohamed ABDELLANI
a3fd7b77c8 notify if any distributors doesn't have an abn 2024-06-24 14:46:01 +01:00
Ahmed Ejaz
72640cfc2a 12346: refactor orders_controller spec 2024-06-24 14:43:17 +05:00
Ahmed Ejaz
ff10a36e4a 12346: refactor bulk_line_items_controller spec 2024-06-24 14:25:34 +05:00
cyrillefr
980ce95ab2 Requested changes
- replace direct instance variable use by instance getter use
2024-06-24 10:37:43 +02:00
Gaetan Craig-Riou
c4470f76e3 Merge pull request #12593 from filipefurtad0/regression_spec_12591
Adds regression spec for #12591
2024-06-24 14:46:29 +10:00
Gaetan Craig-Riou
cd768a1fe9 Merge pull request #12585 from mkllnk/flaky-caching
Ensure all assets are compiled on test page visit
2024-06-24 14:44:11 +10:00
Gaetan Craig-Riou
c756afa1cc Merge pull request #12571 from filipefurtad0/adds_spec_on_abn_restriction
Adds test case to assure acceptance criteria from #12374 and #12373
2024-06-24 14:41:31 +10:00
Gaetan Craig-Riou
67cac1f4d6 Fix search to return expected data
As explained in Reporting::ReportTemplate::ReportsHelper, 'search' and
`query_result` are not supposed to return the same things
2024-06-24 14:04:35 +10:00
Ahmed Ejaz
afd09091a2 12346 - fix broken specs 2024-06-22 02:11:39 +05:00
cyrillefr
659111932c Fixes Rails/RelativeDateConstant offense
- Cop: Rails/RelativeDateConstant
- raises offense if Constant is relative data (ie: since, ago)
- Reason: relative data will be evaluated only once
- BUT here, Date should not be evaluated in a class method, and have a different
- value for each call. But the data should be the same for an instance
- Therefore: move the ago in init method
- Cf. https://docs.rubocop.org/rubocop-rails/cops_rails.html#railsrelativedateconstant

- Since there is no constant to be called form a class, but a date from an instance, the
  spec has been modified accordingly. The RemoveTransientData.new.call had to be splitted.
2024-06-21 23:07:16 +02:00
Ahmed Ejaz
9dd427ab7f 12346 - fix rubocop rails/pluckInWhere errors 2024-06-22 01:54:54 +05:00
Ahmed Ejaz
98e0b0e703 12346 - fix rubocop rails/pluck errors 2024-06-22 01:45:58 +05:00
Maikel
0dd7f264b9 Merge pull request #12542 from anansilva/12448-sanitise-html-custom-tab
Sanitize HTML in custom tab content [read only]
2024-06-21 08:35:26 +10:00
filipefurtad0
1d55c05900 Update all locales with the latest Transifex translations 2024-06-20 11:17:26 -06:00
Konrad
f9e1ff9238 Merge pull request #12567 from mkllnk/flash-css-fix-v3
Error messages don't block bottom of page clicks
2024-06-20 17:22:02 +02:00
Ana Nunes da Silva
d2c6db0d04 Sanitize CustomTab#content 2024-06-20 11:56:09 +02:00
Konrad
25d375bf8e Merge pull request #12577 from cyrillefr/WhiteLabelButtonAlwaysInactive
Update button should change status on modified white label
2024-06-20 11:39:58 +02:00
Ahmed Ejaz
349862c72e 11987: fix specs 2024-06-20 13:41:41 +05:00
Ahmed Ejaz
86c87962f9 11987: add missing translation 2024-06-20 13:09:48 +05:00
Ahmed Ejaz
4b9141f66d 11987 - add products table mutation listner 2024-06-20 12:44:55 +05:00
David Cook
d80e1efa7b Add includes for more efficient querying 2024-06-20 17:02:47 +10:00
David Cook
54d068ee08 Add spec for db queries 2024-06-20 17:02:47 +10:00
David Cook
141a883e4d Refactor report
So it turns out that all these features are built into the report framework.

LineItems includes complete_not_canceled_visible_orders.
It even takes care of masking non-editable orders.
2024-06-20 17:02:47 +10:00
David Cook
5b8f590520 Add spec for bug
You wouldn't believe how long it took me to figure out all the bits and pieces.
But now you don't have to!
2024-06-20 17:01:14 +10:00
David Cook
0cff734b86 Refactor spec
Linter said module was too big. I agreed, so made it smaller.

Best viewed with whitespace ignored.
2024-06-20 16:58:09 +10:00
Maikel Linke
98a29785a7 Load large on-screen reports on demand
Sending large reports via Cable Ready is unreliable. The events are
dropped at an unknown point and the report is never displayed to the
user. Instead we just send a link to the report via Cable Ready and
offer a button to load the report on screen.

This has the UX benefit of warning the user about the size as well.
Weaker devices can struggle rendering big HTML documents.
2024-06-20 11:32:33 +10:00
filipefurtad0
48a39f20e8 Adds regression spec for #12591 2024-06-19 19:30:42 -06:00
filipefurtad0
d1560ce15e Adds shared examples for bulk send invoices in PDF 2024-06-19 17:58:58 -06:00
David Cook
0e0a7d9d3e Merge pull request #12589 from cyrillefr/FixRailsRedundantActiveRecordAllMethodIssue
Fixes Rails/RedundantActiveRecordAllMethod issues
2024-06-20 09:40:56 +10:00
David Cook
66606eeeab Merge pull request #12584 from mkllnk/spec-refactor
Update spec for quotation mark replacement
2024-06-20 09:37:09 +10:00
David Cook
ef195876fa Merge pull request #12590 from abdellani/12452-improve-logging
update message logged when a product is deleted
2024-06-20 09:27:51 +10:00
Maikel
f933ae83c8 Merge pull request #12581 from dacook/cache-ci-yarn
Cache yarn global package data in CI
2024-06-20 09:01:05 +10:00
filipefurtad0
3380175c30 Restructures spec to accommodate shared example on bulk printing 2024-06-19 16:52:36 -06:00
Maikel
a9225543da Merge pull request #12554 from mkllnk/dfc-logo
Add enterprise logo and contact name to DFC API with standard attributes
2024-06-20 08:49:27 +10:00
filipefurtad0
59b6cdaf01 Extends tests to cases where ABN is an empty string
Removes pending and changes testcase

As discussed on Slack we will not fix old invoice model, for ref. see: https://openfoodnetwork.slack.com/archives/CG7NJ966B/p1718781775612759?thread_ts=1718249609.127149&cid=CG7NJ966B
2024-06-19 16:42:10 -06:00
Abdellani
0337464291 update logged message when a product is deleted 2024-06-19 15:15:04 +01:00
Abdellani
7a015bad96 populate destroyed_by on produce_v3_controller#destory 2024-06-19 15:14:32 +01:00
cyrillefr
654fda89ca Fix Rails/RedundantActiveRecordAllMethod issues
- Cop: Rails/RedundantActiveRecordAllMethod
- if receiver is an Active Record object, ".all" can be safely removed
- There are 2 allowed receivers that are listed in the
  styleguide file (those are defaults cf. cop documentation).
2024-06-19 14:32:21 +02:00
Maikel
ef7f1d335f Merge pull request #12587 from openfoodfoundation/revert-12536-stock-levels
Revert "Allow negative stock levels for on-demand products"
2024-06-19 15:46:54 +10:00
Maikel
8837f1caa2 Revert "Allow negative stock levels for on-demand products" 2024-06-19 15:18:57 +10:00
Maikel Linke
d5b77a4f80 Ensure all assets are compiled on test page visit 2024-06-19 11:45:28 +10:00
Maikel Linke
10f0eeef0b Update spec for quotation mark replacement
I'm not sure why, but the pre-compiling of assets triggered Rails to
render `style="..."` instead of `style='...'` in this case. But when
assets are compiled on-demand, we get the single quotes. So I changed
the spec to be agnostic of this detail. We actually just want to know
about the link and its href.
2024-06-19 11:40:09 +10:00
filipefurtad0
fe93e3ed97 Restructures spec
Separating into different contexts, with and without invoices feature enabled
2024-06-18 19:32:44 -06:00
Maikel
1e189207ed Merge pull request #12583 from dacook/add-attachment-translation
Add translation key for Spree::Image#attachment
2024-06-19 11:20:07 +10:00
Maikel
af2e7db155 Merge pull request #12582 from cyrillefr/FixRails_UnusedRenderContentIssues
Fixes offenses raised by Rails/UnusedRenderContent
2024-06-19 11:19:22 +10:00
Maikel
2188e96dfb Merge pull request #12575 from zanetagebka/RedundantInterpolationCops
Solve Rubocop RedundantInterpolation cops
2024-06-19 11:01:42 +10:00
David Cook
6ce442a42e Add translation key for Spree::Image#attachment 2024-06-19 09:49:15 +10:00
David Cook
2676891322 Merge pull request #12546 from dacook/buu/change-columns-11055
[BUU] Change product columns to be shown
2024-06-19 09:25:47 +10:00
Gaetan Craig-Riou
55ae1ba29f Merge pull request #12579 from openfoodfoundation/dependabot/npm_and_yarn/ws-6.2.3
chore(deps): bump ws from 6.2.2 to 6.2.3
2024-06-19 09:17:53 +10:00
David Cook
6fd3cada8c Fix classname 2024-06-19 09:13:53 +10:00
zanetagebka
b4bfcb7cc8 rubocop_todo recreate 2024-06-18 14:34:03 +02:00
zaneta.gebka
5cc33d1e0c Merge branch 'master' into RedundantInterpolationCops 2024-06-18 14:33:12 +02:00
zanetagebka
c6254a5b7e rubocop_todo recreate 2024-06-18 14:32:41 +02:00
cyrillefr
a155630b1c Fixes offenses raised by Rails/UnusedRenderContent
- in any cases, adding status: :no_content dropes content from response
- replaced by head :no_content (HTTP 204)
2024-06-18 13:33:19 +02:00
Rachel Arnould
0c6cc9b822 Merge pull request #12558 from cyrillefr/BUUUploadingCorruptProductImagesFailsSilently
BUU Display error messages when file not valid
2024-06-18 12:12:51 +02:00
David Cook
b8f8d6d042 Show/hide columns with CSS selectors instead
Well, that made the JS way simpler.

Adds a lot of classes though. Maybe we could do it based on column index instead, but this will do for now.
table.hide-col0 { td:nth-child(0) { display: none; } }
2024-06-18 15:35:53 +10:00
David Cook
4023dc2265 Cache yarn dependencies
I don't know what this actually does, because it doesn't install the dependencies, that still needs to happen next.
But surely any cache is a good thing?
2024-06-18 13:09:45 +10:00
dependabot[bot]
9543b597d0 chore(deps): bump ws from 6.2.2 to 6.2.3
Bumps [ws](https://github.com/websockets/ws) from 6.2.2 to 6.2.3.
- [Release notes](https://github.com/websockets/ws/releases)
- [Commits](https://github.com/websockets/ws/compare/6.2.2...6.2.3)

---
updated-dependencies:
- dependency-name: ws
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-06-18 02:16:27 +00:00
Ahmed Ejaz
d2737bd8b0 11987: refactored code 2024-06-18 00:44:10 +05:00
Ahmed Ejaz
05fe7cd4b9 11987: add flash messages for product clone 2024-06-17 23:17:32 +05:00
Ahmed Ejaz
30528cab0f 11987: add slide-in animation for product clone 2024-06-17 22:58:36 +05:00
Ahmed Ejaz
539ffb1f35 11987: add product clone turbo partial 2024-06-17 21:59:26 +05:00
Ahmed Ejaz
df2bad9b8f 11987: add product_variant_row partial 2024-06-17 21:59:07 +05:00
Ahmed Ejaz
fa3b84b71f 11987: add clone action 2024-06-17 21:58:07 +05:00
Ahmed Ejaz
2ca4febf90 11987: add product clone route 2024-06-17 21:57:19 +05:00
cyrillefr
8616847793 Update button should change status on modified white label
- swap position between users & white label so that user's inner form
- does not interfere with white_label own position in outer form
- modified spec so that lowermost user is clickable
2024-06-17 17:11:19 +02:00
zanetagebka
dd7ae1330f Merge remote-tracking branch 'origin/RedundantInterpolationCops' into RedundantInterpolationCops
# Conflicts:
#	.rubocop_todo.yml
2024-06-17 15:40:03 +02:00
zanetagebka
93eda48138 recreate rubocop_todo 2024-06-17 15:39:29 +02:00
zanetagebka
ad92d4b129 Solve Rubocop RedundantInterpolation cops 2024-06-17 15:37:39 +02:00
zanetagebka
422965748f Solve Rubocop RedundantInterpolation cops 2024-06-17 15:32:25 +02:00
David Cook
aff50f66c4 Name and Producer columns grow to fill and other tweaks
If neither are visible, the first column on the left (eg image) will grow. But that's not a likely scenario.

Min-widths help manage sizes on smaller screens in Chrome.
The title for Inherits Properties gets cut off, but I think it's better than cutting off content.

Oh look, it fixed a spec too!
2024-06-17 12:27:06 +10:00
Gaetan Craig-Riou
cc45b9a0d3 Merge pull request #12557 from filipefurtad0/feature_parity_buu
Updating specs for BUU (feature parity)
2024-06-17 09:39:01 +10:00
cyrillefr
e07cf6c628 Do not use rescue as control flow 2024-06-16 23:38:38 +02:00
Maikel Linke
885f679eb1 Update all locales with the latest Transifex translations 2024-06-14 11:26:09 +10:00
Maikel
70ad8c80e1 Merge pull request #12568 from openfoodfoundation/revert-12458-12374-bulkk-sending-invoice-must-show-error-if-abn-require-and-not-set
Revert "[Invoices] Notify if any order cannot be invoiced on bulk invoice sending"
2024-06-14 11:23:52 +10:00
Maikel Linke
6a4a238378 Avoid flakiness with Capybara features
Capybara should be clever enought to scroll to an element. The old
method failed nine times in CI. I couldn't reproduce it locally but
let's see if this is better.
2024-06-14 10:47:35 +10:00
Maikel Linke
3c9f77dc2b Restore image display with absolute width
The `min-width` property is ignored by Firefox. And we don't need the
column to grow any bigger than the picture size anyway. An absolute
width is correct here.

The specification says:

> Applies to all elements but non-replaced inline elements, table rows,
> and row groups.

Firefox is totally right in ignoring it.
2024-06-14 09:48:55 +10:00
filipefurtad0
9cd1977cf8 Removes product creation test
This is already covered some lines above and on e22bec014b/spec/system/admin/products_spec.rb (L29)
2024-06-13 12:15:24 -06:00
filipefurtad0
9e5c21f7cd Corrects test case by adding expect
has_select? only returns true or false, it requires an assertion to assure the test is evaluated

Improves syntax
2024-06-13 12:06:34 -06:00
Filipe
df30c1af98 Revert "[Invoices] Notify if any order cannot be invoiced on bulk invoice sending" 2024-06-13 08:55:59 -06:00
Filipe
e22bec014b Merge pull request #12538 from cyrillefr/UpdateAndRecalculateFeesAfterOrderAdjustedInBackend
Update and Recalculate Fees after Order Adjusted in Backoffice
2024-06-13 08:53:43 -06:00
cyrillefr
0470efa502 Requested changes: turbo_stream for success
- must respond via turbo for create and update for success
- changed the spec accordingly
2024-06-13 15:22:54 +02:00
Maikel Linke
81a8ee5a31 Error messages don't block bottom of page clicks
The flash container was set to 100% width to center the messages on the
screen. The messages were covering only part of the screen though. So
the container beyond the actual message box was covering part of the
page, blocking clicks on elements.

A new way of centering the container with CSS translate means that the
width of the container can be the same as the content, not covering
anyting accidentally.

And moving the whole container up instead of only moving the contained
message allows us to interact with elements below the flash message as
well.
2024-06-13 11:20:54 +10:00
David Cook
5d0e241f8c Pending spec
Probably due to column tweaks, revealing different existing problems.
2024-06-13 11:12:31 +10:00
David Cook
b25d2ed32a Refactor to fix Metrics/AbcSize linter 2024-06-13 10:51:35 +10:00
David Cook
db27fc5a2b Remove dead code
I'm pretty sure that case doesn't happen, and besides there's no spec for it.
2024-06-13 10:51:00 +10:00
David Cook
a7ef243262 Enable all columns by default 2024-06-13 10:43:33 +10:00
David Cook
e7774d7a24 Lint fix
Sorry didn't have time to go back and rebase
2024-06-13 10:39:19 +10:00
David Cook
9ae4d347aa Update widths
For some reason, minimum widths work now (I swear they didn't before).

Hmm i would really like to shorten that stimulus controller name.
2024-06-13 10:36:28 +10:00
Maikel
2f173cb5c2 Merge pull request #12536 from mkllnk/stock-levels
Allow negative stock levels for on-demand products
2024-06-13 10:26:01 +10:00
David Cook
d5456a85b7 Reset cell colspans
This might be a little simpler if we move the 'new variant' button to col 0, and assume colspan cells always span the whole table.
2024-06-13 10:09:02 +10:00
David Cook
70fab2bcc1 Show/hide columns using display instead of visibility
Visibility was way simpler, but the table doesn't recalculate column widths until you use display:none;

This is now using the same method as the old products screen.
But we still need to update colspans..
2024-06-13 10:08:56 +10:00
David Cook
0190d6f31d Update dropdown styles
The v2 dropdown is used in various places, and now looks more in line with the new design.
2024-06-13 10:08:02 +10:00
David Cook
8c75e6baa8 Make column selector a dropdown
With some styling tweaks.
2024-06-13 10:07:55 +10:00
Maikel
5b95ef3bd9 Merge pull request #12525 from mkllnk/fdc-import
Add compatibility to the DFC product import for FDC (Shopify) API
2024-06-13 09:51:05 +10:00
Filipe
b1f7807150 Merge pull request #12458 from abdellani/12374-bulkk-sending-invoice-must-show-error-if-abn-require-and-not-set
notify the user if any order cannot be invoiced on bulk invoice sending
2024-06-12 16:48:51 -06:00
David Cook
9ba3b4f2d5 Fix up styles 2024-06-12 14:58:09 +10:00
David Cook
c6452efa92 Isolate styles for their intended use
This also improves the styling of the orders action dropdowns (on index and edit pages). It adds the new chevron icon, but needed some fiddling to make it look right.
2024-06-12 14:58:09 +10:00
David Cook
e516e7f335 Tweak checkbox dropdown styles
Use the new design for checkboxes and fix alignment.

Removes redesigned-input, which is a small regression on the old design, but I think it's acceptable bcause we're going to shut it down soon.
2024-06-12 14:58:09 +10:00
David Cook
ae66a85cc5 Show error messages
There shouldn't normally be errors, but I got one due to bad data during development, and this helped sort it out.
2024-06-12 14:58:09 +10:00
David Cook
d81c3cb489 Show/hide columns based on checkboxes
The cols could have been a lot cleaner with simple classnames, but I preferred to mark up in a way that reveals the purpose (otherwise they could be used for styling).

It doesn't seem to be any faster comparing querySelector('[data]') vs class, or iterating through the dom nodes.
2024-06-12 14:58:00 +10:00
David Cook
89cedc4287 Submit and render with Turbo Stream 2024-06-12 14:49:59 +10:00
David Cook
50469fe53e Use consistent translation keys
Ensures that the column table names match the names in the selector.

I thought 'there must be a way to set the translation scope once'. With Rails, there's usually a way. Thankfully this one was quite simple. Or is it too much magic.. 🧙

https://coderwall.com/p/dvme9q/set-scope-of-i18n-translations-in-rails-with-a-block
2024-06-12 14:49:59 +10:00
David Cook
68da9c9e04 Add form to save column preferences 2024-06-12 14:49:53 +10:00
Abdul Aziz Ali
e2aca63fff Rubocop. Change yield_self to then #11326 2024-06-12 08:52:43 +08:00
Abdul Aziz Ali
e537bda9b7 Display only per_item fees for oc incoming exchange #11326
Add per_item param to EnterpriseFee angular service and rails controller
2024-06-12 08:29:34 +08:00
cyrillefr
c5decfc58b Bugfix introduced by last commit
- fixed bug created by last commit
- refactored to new method respond_with_error
- need for 2 cases in request spec: html & turbo
2024-06-12 00:31:19 +02:00
filipefurtad0
10dbe77f71 Adds test to check permissions when updating a product 2024-06-11 14:51:28 -06:00
filipefurtad0
417fd21470 Adds test to check permissions when creating a new product 2024-06-11 14:51:28 -06:00
filipefurtad0
8e2419040e Adds test around inactive product 2024-06-11 14:51:28 -06:00
filipefurtad0
0392034850 Adds test case on enterprise permissions 2024-06-11 14:51:28 -06:00
filipefurtad0
c4c7f03b6b Addresses Gaetans review
Removes assertions from before block, as Delete case is tested elsewhere

Declares enterprise_user variable as a non-instance variable
2024-06-11 14:51:28 -06:00
filipefurtad0
3b0779d3a7 reverts changes on products_spec 2024-06-11 14:51:28 -06:00
filipefurtad0
2725232902 Adds tests around managing rights -> 'as an enterprise manager' 2024-06-11 14:51:28 -06:00
filipefurtad0
d5ae9b5bcc Adds a test to assure that the new product path works as expected
The funcitonaliy itself should not be affected by BUU, so the tests remain at ./spec/system/admin/products_spec.rb
2024-06-11 14:51:28 -06:00
filipefurtad0
50359695b5 Removes comment on issue #7180, now closed 2024-06-11 14:51:28 -06:00
filipefurtad0
a8ff696792 Removes deleting and cloning test from the legacy bulk product edit page
These are covered in the new BUU products page
2024-06-11 14:51:28 -06:00
filipefurtad0
ae600d4bd6 Removes test case on access rights to the products page
Moves test on access rights to authentication_spec

The test on accessing the products page as an anonymous does not seem specific to the products page (IMO); as we're testing access rights and the Devise gem (right?) we're probably better off having this test in a more suitable and general context, such as as a spec dealing with authentications and redirects
2024-06-11 14:51:28 -06:00
filipefurtad0
95092b3b06 Adds test case around shipped product
Removes test case around shipped product for legacy products page
2024-06-11 14:51:28 -06:00
cyrillefr
942990612b Requested changes
- refined the code and applied it to create method too
- modified one request spec to work with turbo_stream
- added  2 examples in system specs
2024-06-11 22:29:12 +02:00
Maikel
b24ca03e28 Merge pull request #12547 from zanetagebka/StringConcatenationCops
Fix cops StringConcatenation
2024-06-11 15:53:37 +10:00
Maikel Linke
a8f0ebc408 Update Rubocop todo list 2024-06-11 15:33:28 +10:00
zanetagebka
e06df7d658 - Refactor method to fix StringConcatenation cop 2024-06-11 15:17:45 +10:00
zanetagebka
e62bdf987d Fix test 2024-06-11 15:17:34 +10:00
zanetagebka
a2a670c848 Fix cops StringConcatenation 2024-06-11 15:17:32 +10:00
Gaetan Craig-Riou
a84c947d66 Merge pull request #12548 from cyrillefr/RedundantPresenceValidationOnBelongs_part_VII
Fix RedundantPresenceValidationOnBelongs on Spree::Order model
2024-06-11 10:37:11 +10:00
Gaetan Craig-Riou
8b31fa1ee5 Merge pull request #12541 from openfoodfoundation/dependabot/bundler/rubocop-1.64.1
chore(deps-dev): bump rubocop from 1.63.5 to 1.64.1
2024-06-11 10:30:28 +10:00
cyrillefr
01612843b4 BUU Display error messages when file not valid
- implements a turbo response in controller
- display error messages on modal -> able for user to re upload
- removes a pending in spec that now tests error message
2024-06-10 14:32:08 +02:00
Abdellani
b0862d26f6 update tests 2024-06-07 17:58:59 +01:00
Mohamed ABDELLANI
55365be299 fix linter issue 2024-06-07 17:53:45 +01:00
Mohamed ABDELLANI
586a7055d7 notify if any distributors doesn't have an abn 2024-06-07 17:53:44 +01:00
Maikel Linke
23c175ea59 Update all locales with the latest Transifex translations 2024-06-07 20:04:53 +10:00
Maikel Linke
4d4d9daf42 Add OFN contact name as DFC main contact person 2024-06-06 14:32:37 +10:00
Maikel Linke
5b7b8872b6 Use standard logo attribute on DFC API
Still keeping the custom OFN attribute for compatibility. Integrations
can be updated once this is live.
2024-06-06 10:59:25 +10:00
Filipe
e4c0523ad1 Merge pull request #12094 from cyrillefr/Reports-500Error-if-date-range-end-is-before-date-range-start-in-Enterprise-Fee-Summary
Force start date before end date with range mode flatpickr
2024-06-05 23:39:24 +02:00
Filipe
4f7d5adb53 Merge pull request #12427 from abdulazizali77/bugfix/11680-order-additional-tax
Display additional tax total in order - fixes #11680
2024-06-05 23:22:31 +02:00
Filipe
5872515a35 Merge pull request #12515 from isidzukuri/12503_skip_saving_of_unchanged_products
Do not commit to db unchanged products in bulk save
2024-06-05 18:01:59 +02:00
Filipe
f6de15e196 Merge pull request #12518 from anansilva/12448-sanitise-html-product-description
Sanitise HTML in product description [read-only]
2024-06-05 11:13:56 +02:00
David Cook
9c0f55ad22 Refactor 2024-06-05 09:45:30 +10:00
David Cook
d34e7dbf9f Specify accepted format on client side
I don't know why, but even though the client sends http accept header for json, rails is treating it as html. This was being overridden in the route, but I want to support multiple formats next. So, we explicitly choose the format by adding it to the request path.
2024-06-05 09:45:30 +10:00
David Cook
2d0f206e8a Prepare spec 2024-06-05 09:45:30 +10:00
Maikel Linke
d9f013abbc Style/SendWithLiteralMethodName
Use method call directly instead of `public_send` with fixed argument.

The cop is declared unsafe. I think that is because it can also replace
`send` but we replace only `public_send` here.
2024-06-05 09:38:21 +10:00
Maikel Linke
e6ac2f0d88 Style/SuperArguments
Call super without arguments and parentheses when the signature is identical.
2024-06-05 09:29:42 +10:00
Maikel
a37274920e Merge pull request #12540 from openfoodfoundation/dependabot/npm_and_yarn/leaflet-geosearch-4.0.0
chore(deps): bump leaflet-geosearch from 3.11.1 to 4.0.0
2024-06-05 09:20:54 +10:00
cyrillefr
87f0be42e2 Fixes rubocop offenses on Spree::Order model
- removes old Rails 5 flag to not validating
belongs to association. Therefore optional fields must be marked so.
2024-06-04 18:17:12 +02:00
Filipe
db255b0d61 Merge pull request #12511 from chahmedejaz/task/12398-remove-reflex-from-product-variant-delete
Task/12398 remove reflex from product variant delete
2024-06-04 16:03:57 +02:00
David Cook
5a8eea398e Add comment 2024-06-04 10:24:40 +10:00
Filipe
dc994692a9 Merge pull request #12521 from dacook/buu/fix-blank-selects-12473
[BUU] Fix for blank dropdowns
2024-06-03 17:04:40 +02:00
cyrillefr
9495d62236 Requested changes on spec
- if possible no sleep in spec
2024-06-03 16:27:57 +02:00
Ana Nunes da Silva
205c7dafd2 Add div to sanitizer supported tags 2024-06-03 11:45:50 +01:00
Ana Nunes da Silva
5f54ea3877 Add safe trix tags to html sanitizer;
Use custom html sanitizer in product description.
2024-06-03 11:45:50 +01:00
Ana Nunes da Silva
a7dc243db9 Sanitize product description using rails default sanitizer 2024-06-03 11:45:49 +01:00
dependabot[bot]
3e1be86283 chore(deps-dev): bump rubocop from 1.63.5 to 1.64.1
Bumps [rubocop](https://github.com/rubocop/rubocop) from 1.63.5 to 1.64.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.63.5...v1.64.1)

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

Signed-off-by: dependabot[bot] <support@github.com>
2024-06-03 09:36:50 +00:00
dependabot[bot]
7fd8bdfaf1 chore(deps): bump leaflet-geosearch from 3.11.1 to 4.0.0
Bumps [leaflet-geosearch](https://github.com/smeijer/leaflet-geosearch) from 3.11.1 to 4.0.0.
- [Release notes](https://github.com/smeijer/leaflet-geosearch/releases)
- [Commits](https://github.com/smeijer/leaflet-geosearch/compare/v3.11.1...v4.0.0)

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

Signed-off-by: dependabot[bot] <support@github.com>
2024-06-03 09:04:12 +00:00
Abdul Aziz Ali
369ea7cd16 Define tax_on_fees i8n key #11680 2024-06-03 13:04:36 +08:00
Gaetan Craig-Riou
d5dac4d890 Merge pull request #12535 from mkllnk/panel-beating
Restore enterprise edit form as manager
2024-06-03 15:00:30 +10:00
Abdul Aziz Ali
82f75e344f Display additional tax total in order #11680
Add new text key admin.order.edit.additional_tax_included_in_price
Add spec file for additional tax display. Add new trait for enterprise fee and calculator factory
2024-06-03 12:50:37 +08:00
Gaetan Craig-Riou
76a76c74e3 Merge pull request #12537 from openfoodfoundation/dependabot/bundler/devise-i18n-1.12.1
chore(deps): bump devise-i18n from 1.12.0 to 1.12.1
2024-06-03 12:55:10 +10:00
Gaetan Craig-Riou
5326b332ee Merge pull request #12529 from cyrillefr/RedundantPresenceValidationOnBelongs_part_VI
Fix Redundant presence validation on belongs part VI
2024-06-03 12:53:35 +10:00
David Cook
15d4f9565d Merge pull request #12519 from filipefurtad0/feature_parity_admin_style_v3
Extracts BUU from branch in #11645
2024-06-03 09:56:25 +10:00
David Cook
999bc13fb5 Remove redundant code 2024-06-03 09:36:25 +10:00
filipefurtad0
ce36fb45a0 Removes tests on edit action, under the Delete section 2024-06-02 16:00:44 +02:00
Filipe
706da37f15 Merge pull request #12507 from mkllnk/connected-apps-super-admin
Allow only enterprise managers to connect apps
2024-06-01 18:16:28 +02:00
cyrillefr
073dfc4ab6 Update and Recalculate Fees after Order Adjusted in Backend
- when update on adjustment in payment, recalculation of
  correct adjustment was not done
- the corresponding spec
- an id to easy the finding of the change of fees in the spec
2024-05-31 16:39:02 +02:00
Filipe
925d257dc5 Merge pull request #12495 from cillian/osm-registration-map
Get registration location map working with OSM
2024-05-31 14:32:05 +02:00
dependabot[bot]
29e4535dff chore(deps): bump devise-i18n from 1.12.0 to 1.12.1
Bumps [devise-i18n](https://github.com/tigrish/devise-i18n) from 1.12.0 to 1.12.1.
- [Release notes](https://github.com/tigrish/devise-i18n/releases)
- [Changelog](https://github.com/tigrish/devise-i18n/blob/master/CHANGELOG.md)
- [Commits](https://github.com/tigrish/devise-i18n/compare/v1.12.0...v1.12.1)

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

Signed-off-by: dependabot[bot] <support@github.com>
2024-05-31 09:06:12 +00:00
Maikel Linke
ecbba894f7 Update stock levels of on-demand items
We weren't bothering with stock when items were on demand anyway. But we
want to track stock now so that we can backorder more when local stock
levels become negative.
2024-05-31 16:38:24 +10:00
Maikel Linke
d391faac64 Remove validation of positive stock when on demand
We weren't allowing negative stock to stop any bug from accidentally
drawing too much stock. But now we want to implement a backordering
logic that depends on negative stock levels to know how much is needed
to replenish stock levels.
2024-05-31 16:37:15 +10:00
Maikel Linke
f4a69b4664 Update locales 2024-05-31 12:16:18 +10:00
Maikel Linke
6a206b2a34 Move Connected Apps form out of Enterprise form
Nested forms are not valid HTML and we were submitting the wrong
authenticity token to Rails when updating the enterprise.

I inverted the hierarchy of the form and the panels. The menu and
tab-panel structure now sits above and the enterprise edit form is
nested within.

The current structure is not ideal but it's only a transition phase. I'm
expecting the page to get re-designed at some point and re-writen
without AngularJS.
2024-05-31 11:09:00 +10:00
Maikel
c0690d51e5 Merge pull request #12530 from openfoodfoundation/dependabot/bundler/rack-timeout-0.7.0
chore(deps): bump rack-timeout from 0.6.3 to 0.7.0
2024-05-31 09:42:30 +10:00
Maikel Linke
b15e136980 Remove obsolete rake task 2024-05-31 09:40:52 +10:00
Filipe
9eaf6c3b9c Merge pull request #12489 from mkllnk/available-locales
More realistic test env for translations
2024-05-30 15:00:36 +02:00
Filipe
a01dcaadcf Merge pull request #12506 from anansilva/12448-sanitise-html-enterprise-group
Sanitise HTML in long description of enterprise group [read-only]
2024-05-30 14:07:20 +02:00
Ahmed Ejaz
ce60a2a1e0 12398: add lazylookup for translations 2024-05-30 14:44:34 +05:00
Ahmed Ejaz
c2fa993432 12398: fix lint issues 2024-05-30 14:24:51 +05:00
Ahmed Ejaz
e932dabacb 12398: fix failing specs 2024-05-30 14:17:57 +05:00
filipefurtad0
3d1c94720a Applies existing helper to assert on rows with product name 2024-05-29 15:40:30 +01:00
filipefurtad0
2c081dc5f0 Assures the Edit button link is always displayed for the first variant,
although the delete button is not

Also should work for a second (non-default variant)

Removes unecessary test cases
2024-05-29 15:24:30 +01:00
dependabot[bot]
6dee200938 chore(deps): bump rack-timeout from 0.6.3 to 0.7.0
Bumps [rack-timeout](https://github.com/zombocom/rack-timeout) from 0.6.3 to 0.7.0.
- [Changelog](https://github.com/zombocom/rack-timeout/blob/main/CHANGELOG.md)
- [Commits](https://github.com/zombocom/rack-timeout/compare/v0.6.3...v0.7.0)

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

Signed-off-by: dependabot[bot] <support@github.com>
2024-05-29 09:35:40 +00:00
cyrillefr
4bb996e77f Fix RedundantPresenceValidationOnBelongs on some files (part VI)
- presence: true is redundant since Rails 5.0 BUT applies
   with new default config of
   belongs_to_required_by_default to true.
   Lots of files with belongs_to_required_by_default = false
   (backward compatibility).
   So: deleting this setting implies to adding optional: true
 - added 'NOT NULL' constraints so model constraints match
   with contraints on DB tables.
 - corresponding migration files to match AR Models &
   DB tables
 - rake tasks to check corrupt data (ie: NULL/nil in id fields)
   (previous commit)
 - updated the todo
2024-05-29 10:38:18 +02:00
cyrillefr
65fc144a46 Task to check missing foreing ids in spree_line_items 2024-05-29 10:32:21 +02:00
David Cook
f8f0a1bf58 Update comment
[skip ci]
2024-05-29 10:55:29 +10:00
Ahmed Ejaz
a93ce4ea55 12398: append flash in the flashes container 2024-05-29 01:20:10 +05:00
Ahmed Ejaz
8ee833d2d8 12398: add flash.now 2024-05-29 01:19:50 +05:00
Maikel Linke
fae7a089ee Import products from the FDC (Shopify) API 2024-05-28 17:00:06 +10:00
Maikel Linke
a1992aed7c Handle string values for variant unit value
The FDC API is returning all values as strings. This should probably be
handled in the Connector long-term.
2024-05-28 17:00:06 +10:00
Maikel Linke
1f00662709 Add service to access FDC API
The current implementation of the FDC is not adhering to the DFC
standard. The difference is added in this compatibility layer.

This should be temporary code. The FDC dev team should change their API
in their next development cycle.
2024-05-28 17:00:06 +10:00
Maikel Linke
635234a889 Enable POSTing DFC data 2024-05-28 15:10:05 +10:00
Maikel Linke
c94bd92311 Simplify DFC request retry logic
Big thanks to David Cook for a much better pattern.
2024-05-28 15:10:05 +10:00
David Cook
90c71c6a1a Remove unused method 2024-05-28 12:00:07 +10:00
David Cook
35c2297d55 Detect changes in price
Price is actually an association with lots of custom methods to make it look like a field, and so changes were ignored.
Now this issue is fixed, perhaps it should be moved to a concern..

Note, there are other delegated fields: product name and description may be assigned from the variant. But there's no hooks to save the prroduct, so I didn't include it when checking for changes.
2024-05-28 12:00:04 +10:00
Ahmed Ejaz
fb07794cf3 12398: add slide-out animation 2024-05-28 01:10:30 +05:00
David Cook
4f287ffe05 When dropdown fields don't allow blank, but are blank, show as changed
They were already counted as changed by the javascript, but didn't have a 'changed' class to indicate it.
The reason they are 'changed', is because the dropdown has no blank option, and is forced to select the first item in the list.

This is purely to cover the case of invalid data, but should help a lot when debugging data issues. I don't think it's any less efficient, because the extra 'classList.toggle' calls don't do anything on unchanged fields.
2024-05-27 17:14:18 +10:00
David Cook
c71eb2d6b5 Remove duplicate assign 2024-05-27 10:34:35 +10:00
isidzukuri
7565825b61 Do not commit to db unchanged products is bulk save 2024-05-27 10:22:58 +10:00
filipefurtad0
c711387c5a Removes pending test case - covered in:
- Changing producers, category and tax category, done in 15ee4f6

- Updating Unit value, done in 49226ff

Removes comment about errors for empty variant_unit_name

I think this was done in commit f05d27b

Would you agree @dacook?
2024-05-26 17:40:28 +01:00
filipefurtad0
80a682e2f5 Updates tests around product and variant search
Adds test for a non-existing product

Adds test for variant search

Improves tests with multiple variants
2024-05-25 16:03:54 +01:00
filipefurtad0
fb0be1c7f3 Adds tests around using the page
- with no products

- column display dropdown

- listing products with several variants
2024-05-25 15:13:59 +01:00
Cillian O'Ruanaidh
b2f20db90a Remove redundant spec type offence from MapHelper spec 2024-05-24 11:43:00 +01:00
Cillian O'Ruanaidh
46fdeefa14 Make sure OSM map is not enabled in test environment in case it abuses OSM tile servers 2024-05-24 11:24:57 +01:00
Cillian O'Ruanaidh
850385a8d3 Add tests to make sure the appropriate map is loaded e.g. Open Street Map or Google 2024-05-24 11:14:43 +01:00
Maikel Linke
4e8896d655 Clearer naming of helper method 2024-05-24 08:17:08 +10:00
Ahmed Ejaz
6a59d06de1 remove delete methods from products reflex 2024-05-24 02:45:26 +05:00
Ahmed Ejaz
a0f290c09f 12398: add turbo stream to delete variants 2024-05-24 02:41:51 +05:00
Ahmed Ejaz
2bdf8e2853 rename destroy.turbo_stream to make it more generic 2024-05-24 02:40:34 +05:00
Ahmed Ejaz
039b0d80ee 12398: implement the destroy action for products 2024-05-24 01:55:21 +05:00
Ahmed Ejaz
48615f1325 12398: fix rebasing mistake 2024-05-24 01:20:08 +05:00
Ahmed Ejaz
6659ffe530 12398: update modal-link-controller to dynamically set
form action as per the selected product to delete
2024-05-24 01:16:14 +05:00
Ahmed Ejaz
53fb77eb23 12398: add destroy action with turbo stream 2024-05-24 01:16:14 +05:00
Ahmed Ejaz
e5b9e07874 12398: update confirm_modal to use button_to form submission 2024-05-24 01:16:14 +05:00
Ahmed Ejaz
e740fb8f6e 12398: add turbo-rails 2024-05-24 01:16:08 +05:00
cyrillefr
3451be4043 Increasing the placeholder size 2024-05-23 09:13:18 +02:00
cyrillefr
396ea65bc6 Bugfix on spec 2024-05-23 09:13:18 +02:00
cyrillefr
72301f3ad8 Add Time in flatpickr control 2024-05-23 09:13:18 +02:00
cyrillefr
d27cd18f56 Force start date before end date with range mode flatpickr
- modify view to get a flatpickr component in range mode
  - modify spec to take into account range mode
2024-05-23 09:13:18 +02:00
Maikel Linke
968456e5e0 Create special locale for test environment
So hopefully we'll notice if our fallback mechanism fails.
2024-05-23 15:10:24 +10:00
Maikel Linke
f14945c155 More realistic test env for translations
Most production servers don't use the source locale `en`. Even if the
default language is English, they use a local variant like `en_AU` or
`en_GB` to customise some of the translations.

However the environment is configured, the app should always fallback to
`en` if no other translation is available.
2024-05-23 15:08:11 +10:00
Maikel Linke
7b9577b547 Allow only enterprise managers to connect apps
Otherwise it doesn't work because non-managers, like super admins, are
not authorised to access enterprise data via the DFC API.
2024-05-23 13:44:47 +10:00
Ana Nunes da Silva
73218fab05 Sanitize read and write long description in enterprise group 2024-05-22 22:40:24 +01:00
Cillian O'Ruanaidh
826d9eb36d Get registration location map working with OSM 2024-05-17 19:56:52 +01:00
503 changed files with 10265 additions and 5735 deletions

4
.env
View File

@@ -10,10 +10,10 @@ TIMEZONE="Melbourne"
DEFAULT_COUNTRY_CODE="AU"
# Locale for translation.
LOCALE="en"
LOCALE="en_AU"
# For multilingual - ENV doesn't have array so pass it as string with commas
AVAILABLE_LOCALES="en,es"
AVAILABLE_LOCALES="en_AU,es"
# Spree zone.
CHECKOUT_ZONE="Australia"

View File

@@ -5,6 +5,11 @@
#
# cp .env.development .env.local
# Locale for translation. Using a locale other than `en` tests the
# successful fallback to `en`. You will also see up-to-date text used
# in production
LOCALE="en_AU"
VERBOSE_QUERY_LOGS=true
SECRET_TOKEN="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"

View File

@@ -1,6 +1,9 @@
# ENV vars for the test environment
# Override locally with `.env.test.local`
# Locale for translation.
LOCALE="en_TEST"
OFN_REDIS_JOBS_URL="redis://localhost:6379/2"
SECRET_TOKEN="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"

View File

@@ -0,0 +1,14 @@
name: Auto Author Assign
on:
pull_request_target:
types: [opened, reopened]
permissions:
pull-requests: write
jobs:
assign-author:
runs-on: ubuntu-latest
steps:
- uses: toshimaru/auto-author-assign@v2.1.0

View File

@@ -59,6 +59,7 @@ jobs:
- uses: actions/setup-node@v3
with:
node-version-file: .node-version
cache: yarn
- name: Install JS dependencies
run: yarn install --frozen-lockfile
@@ -185,6 +186,7 @@ jobs:
- uses: actions/setup-node@v3
with:
node-version-file: .node-version
cache: yarn
- name: Install JS dependencies
run: yarn install --frozen-lockfile
@@ -262,6 +264,7 @@ jobs:
- uses: actions/setup-node@v3
with:
node-version-file: .node-version
cache: yarn
- name: Install JS dependencies
run: yarn install --frozen-lockfile
@@ -340,6 +343,7 @@ jobs:
- uses: actions/setup-node@v3
with:
node-version-file: .node-version
cache: yarn
- name: Install JS dependencies
run: yarn install --frozen-lockfile
@@ -418,6 +422,7 @@ jobs:
- uses: actions/setup-node@v3
with:
node-version-file: .node-version
cache: yarn
- name: Install JS dependencies
run: yarn install --frozen-lockfile
@@ -470,6 +475,7 @@ jobs:
- uses: actions/setup-node@v3
with:
node-version-file: .node-version
cache: yarn
- name: Install JS dependencies
run: yarn install --frozen-lockfile

View File

@@ -115,6 +115,11 @@ Rails/OutputSafety:
Exclude:
- spec/**/*
Rails/RedundantActiveRecordAllMethod:
AllowedReceivers:
- ActionMailer::Preview
- ActiveSupport::TimeZone
Rails/SkipsModelValidations:
AllowedMethods:
- touch
@@ -124,6 +129,13 @@ Rails/SkipsModelValidations:
- update_column
- update_columns
Rails/UnknownEnv:
Environments:
- development
- production
- staging
- test
Rails/WhereExists:
EnforcedStyle: where # Cf. conversion https://github.com/openfoodfoundation/openfoodnetwork/pull/12363

View File

@@ -1,11 +1,33 @@
# This configuration was generated by
# `rubocop --auto-gen-config --auto-gen-only-exclude --exclude-limit 1400 --no-auto-gen-timestamp`
# using RuboCop version 1.62.1.
# using RuboCop version 1.64.1.
# 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
# versions of RuboCop, may require this file to be generated again.
# Offense count: 1
# This cop supports safe autocorrection (--autocorrect).
Layout/EmptyLines:
Exclude:
- 'app/services/products_renderer.rb'
# Offense count: 6
# This cop supports safe autocorrection (--autocorrect).
# Configuration parameters: EnforcedStyle, IndentationWidth.
# SupportedStyles: aligned, indented, indented_relative_to_receiver
Layout/MultilineMethodCallIndentation:
Exclude:
- 'app/services/products_renderer.rb'
# Offense count: 2
# This cop supports safe autocorrection (--autocorrect).
# Configuration parameters: EnforcedStyle, IndentationWidth.
# SupportedStyles: aligned, indented
Layout/MultilineOperationIndentation:
Exclude:
- 'app/services/products_renderer.rb'
# Offense count: 16
# Configuration parameters: AllowComments, AllowEmptyLambdas.
Lint/EmptyBlock:
@@ -22,11 +44,10 @@ Lint/EmptyBlock:
- 'spec/jobs/subscription_placement_job_spec.rb'
- 'spec/models/product_import/entry_validator_spec.rb'
# Offense count: 6
# Offense count: 4
# Configuration parameters: AllowComments.
Lint/EmptyClass:
Exclude:
- 'spec/controllers/spree/admin/base_controller_spec.rb'
- 'spec/lib/reports/report_loader_spec.rb'
# Offense count: 1
@@ -80,7 +101,7 @@ Lint/UselessMethodDefinition:
Exclude:
- 'app/models/spree/gateway.rb'
# Offense count: 26
# Offense count: 23
# Configuration parameters: AllowedMethods, AllowedPatterns, CountRepeatedAttributes, Max.
Metrics/AbcSize:
Exclude:
@@ -93,7 +114,6 @@ Metrics/AbcSize:
- 'app/helpers/spree/admin/navigation_helper.rb'
- 'app/models/enterprise_group.rb'
- 'app/models/enterprise_relationship.rb'
- 'app/models/product_import/entry_processor.rb'
- 'app/models/spree/ability.rb'
- 'app/models/spree/address.rb'
- 'app/models/spree/order/checkout.rb'
@@ -102,7 +122,6 @@ Metrics/AbcSize:
- 'lib/open_food_network/order_cycle_form_applicator.rb'
- 'lib/open_food_network/order_cycle_permissions.rb'
- 'lib/spree/core/controller_helpers/order.rb'
- 'lib/tasks/enterprises.rake'
- 'spec/services/orders/checkout_restart_service_spec.rb'
# Offense count: 9
@@ -123,7 +142,7 @@ Metrics/BlockNesting:
Exclude:
- 'app/models/spree/payment/processing.rb'
# Offense count: 46
# Offense count: 47
# Configuration parameters: CountComments, Max, CountAsOne.
Metrics/ClassLength:
Exclude:
@@ -175,7 +194,7 @@ Metrics/ClassLength:
- 'lib/reporting/reports/enterprise_fee_summary/scope.rb'
- 'lib/reporting/reports/xero_invoices/base.rb'
# Offense count: 34
# Offense count: 32
# Configuration parameters: AllowedMethods, AllowedPatterns, Max.
Metrics/CyclomaticComplexity:
Exclude:
@@ -185,7 +204,6 @@ Metrics/CyclomaticComplexity:
- 'app/helpers/checkout_helper.rb'
- 'app/helpers/order_cycles_helper.rb'
- 'app/helpers/spree/admin/navigation_helper.rb'
- 'app/models/enterprise.rb'
- 'app/models/enterprise_relationship.rb'
- 'app/models/product_import/entry_validator.rb'
- 'app/models/spree/ability.rb'
@@ -206,7 +224,7 @@ Metrics/CyclomaticComplexity:
- 'lib/spree/localized_number.rb'
- 'spec/models/product_importer_spec.rb'
# Offense count: 25
# Offense count: 24
# Configuration parameters: CountComments, Max, CountAsOne, AllowedMethods, AllowedPatterns.
Metrics/MethodLength:
Exclude:
@@ -227,7 +245,7 @@ Metrics/MethodLength:
- 'lib/spree/localized_number.rb'
- 'lib/tasks/sample_data/product_factory.rb'
# Offense count: 48
# Offense count: 49
# Configuration parameters: CountComments, Max, CountAsOne.
Metrics/ModuleLength:
Exclude:
@@ -257,6 +275,7 @@ Metrics/ModuleLength:
- 'spec/controllers/payment_gateways/stripe_controller_spec.rb'
- 'spec/controllers/spree/admin/adjustments_controller_spec.rb'
- 'spec/controllers/spree/admin/payment_methods_controller_spec.rb'
- 'spec/controllers/spree/admin/variants_controller_spec.rb'
- 'spec/lib/open_food_network/address_finder_spec.rb'
- 'spec/lib/open_food_network/enterprise_fee_calculator_spec.rb'
- 'spec/lib/open_food_network/order_cycle_form_applicator_spec.rb'
@@ -391,7 +410,6 @@ RSpecRails/HaveHttpStatus:
- 'spec/controllers/user_registrations_controller_spec.rb'
- 'spec/requests/admin/images_spec.rb'
- 'spec/requests/api/routes_spec.rb'
- 'spec/requests/checkout/failed_checkout_spec.rb'
- 'spec/requests/checkout/stripe_sca_spec.rb'
- 'spec/requests/home_controller_spec.rb'
- 'spec/requests/omniauth_callbacks_controller_spec.rb'
@@ -407,7 +425,7 @@ RSpecRails/HttpStatus:
- 'spec/controllers/spree/admin/products_controller_spec.rb'
- 'spec/requests/api/orders_spec.rb'
# Offense count: 146
# Offense count: 144
# This cop supports unsafe autocorrection (--autocorrect-all).
# Configuration parameters: Inferences.
RSpecRails/InferredSpecType:
@@ -511,7 +529,6 @@ RSpecRails/InferredSpecType:
- 'spec/helpers/navigation_helper_spec.rb'
- 'spec/helpers/order_cycles_helper_spec.rb'
- 'spec/helpers/serializer_helper_spec.rb'
- 'spec/helpers/shared_helper_spec.rb'
- 'spec/helpers/shop_helper_spec.rb'
- 'spec/helpers/spree/admin/base_helper_spec.rb'
- 'spec/helpers/spree/admin/general_settings_helper_spec.rb'
@@ -545,7 +562,6 @@ RSpecRails/InferredSpecType:
- 'spec/requests/api/routes_spec.rb'
- 'spec/requests/api/v1/customers_spec.rb'
- 'spec/requests/api_docs_spec.rb'
- 'spec/requests/checkout/failed_checkout_spec.rb'
- 'spec/requests/checkout/paypal_spec.rb'
- 'spec/requests/checkout/routes_spec.rb'
- 'spec/requests/checkout/stripe_sca_spec.rb'
@@ -602,59 +618,6 @@ Rails/LexicallyScopedActionFilter:
- 'app/controllers/spree/admin/zones_controller.rb'
- 'app/controllers/spree/users_controller.rb'
# Offense count: 32
# This cop supports unsafe autocorrection (--autocorrect-all).
Rails/Pluck:
Exclude:
- 'app/controllers/admin/variant_overrides_controller.rb'
- 'app/services/cart_service.rb'
- 'lib/reporting/report_headers_builder.rb'
- 'spec/controllers/admin/bulk_line_items_controller_spec.rb'
- 'spec/controllers/admin/subscriptions_controller_spec.rb'
- 'spec/controllers/api/v0/order_cycles_controller_spec.rb'
- 'spec/controllers/api/v0/orders_controller_spec.rb'
- 'spec/controllers/api/v0/products_controller_spec.rb'
- 'spec/controllers/api/v0/shops_controller_spec.rb'
- 'spec/controllers/api/v0/states_controller_spec.rb'
- 'spec/controllers/api/v0/taxons_controller_spec.rb'
- 'spec/helpers/spree/admin/orders_helper_spec.rb'
- 'spec/lib/reports/lettuce_share_report_spec.rb'
- 'spec/lib/reports/users_and_enterprises_report_spec.rb'
- 'spec/serializers/api/admin/for_order_cycle/supplied_product_serializer_spec.rb'
- 'spec/support/api_helper.rb'
# Offense count: 1
# This cop supports unsafe autocorrection (--autocorrect-all).
# Configuration parameters: EnforcedStyle.
# SupportedStyles: conservative, aggressive
Rails/PluckInWhere:
Exclude:
- 'app/models/spree/variant.rb'
# Offense count: 4
# This cop supports unsafe autocorrection (--autocorrect-all).
# Configuration parameters: AllowedReceivers.
# AllowedReceivers: ActionMailer::Preview, ActiveSupport::TimeZone
Rails/RedundantActiveRecordAllMethod:
Exclude:
- 'app/models/spree/tax_rate.rb'
- 'app/models/spree/user.rb'
- 'app/models/spree/variant.rb'
- 'spec/system/admin/product_import_spec.rb'
# Offense count: 4
# This cop supports unsafe autocorrection (--autocorrect-all).
Rails/RedundantPresenceValidationOnBelongsTo:
Exclude:
- 'app/models/spree/line_item.rb'
- 'app/models/spree/order.rb'
# Offense count: 1
# This cop supports unsafe autocorrection (--autocorrect-all).
Rails/RelativeDateConstant:
Exclude:
- 'lib/tasks/data/remove_transient_data.rb'
# Offense count: 56
# This cop supports unsafe autocorrection (--autocorrect-all).
# Configuration parameters: Include.
@@ -681,20 +644,6 @@ Rails/RootPathnameMethods:
Exclude:
- 'spec/lib/reports/orders_and_fulfillment/order_cycle_customer_totals_report_spec.rb'
# Offense count: 1
# This cop supports unsafe autocorrection (--autocorrect-all).
Rails/SelectMap:
Exclude:
- 'app/models/enterprise.rb'
# Offense count: 4
# Configuration parameters: ForbiddenMethods, AllowedMethods.
# ForbiddenMethods: decrement!, decrement_counter, increment!, increment_counter, insert, insert!, insert_all, insert_all!, toggle!, touch, touch_all, update_all, update_attribute, update_column, update_columns, update_counters, upsert, upsert_all
Rails/SkipsModelValidations:
Exclude:
- 'app/models/variant_override.rb'
- 'spec/models/spree/line_item_spec.rb'
# Offense count: 7
# This cop supports unsafe autocorrection (--autocorrect-all).
# Configuration parameters: EnforcedStyle.
@@ -723,24 +672,6 @@ Rails/UniqueValidationWithoutIndex:
- 'app/models/spree/tax_category.rb'
- 'app/models/spree/zone.rb'
# Offense count: 1
# Configuration parameters: Severity, Environments.
# Environments: development, test, production
Rails/UnknownEnv:
Exclude:
- 'app/models/spree/app_configuration.rb'
# Offense count: 7
# Configuration parameters: Severity.
Rails/UnusedRenderContent:
Exclude:
- 'app/controllers/admin/bulk_line_items_controller.rb'
- 'app/controllers/admin/tag_rules_controller.rb'
- 'app/controllers/api/v0/enterprise_fees_controller.rb'
- 'app/controllers/api/v0/products_controller.rb'
- 'app/controllers/api/v0/taxons_controller.rb'
- 'app/controllers/api/v0/variants_controller.rb'
# Offense count: 1
Security/Open:
Exclude:
@@ -765,7 +696,7 @@ Style/CaseEquality:
Exclude:
- 'spec/models/spree/payment_spec.rb'
# Offense count: 25
# Offense count: 23
# This cop supports unsafe autocorrection (--autocorrect-all).
# Configuration parameters: EnforcedStyle.
# SupportedStyles: nested, compact
@@ -792,10 +723,9 @@ Style/ClassAndModuleChildren:
- 'app/serializers/api/taxon_serializer.rb'
- 'app/serializers/api/variant_serializer.rb'
- 'lib/open_food_network/locking.rb'
- 'spec/controllers/spree/admin/base_controller_spec.rb'
- 'spec/models/spree/payment_method_spec.rb'
# Offense count: 1
# Offense count: 2
# This cop supports unsafe autocorrection (--autocorrect-all).
# Configuration parameters: EnforcedStyle.
# SupportedStyles: always, always_true, never
@@ -845,12 +775,6 @@ Style/HashEachMethods:
- 'spec/models/product_importer_spec.rb'
- 'spec/support/cancan_helper.rb'
# Offense count: 1
# Configuration parameters: MinBranchesCount.
Style/HashLikeCase:
Exclude:
- 'app/models/enterprise.rb'
# Offense count: 4
# This cop supports unsafe autocorrection (--autocorrect-all).
Style/MapToHash:
@@ -939,19 +863,6 @@ Style/RedundantInitialize:
Exclude:
- 'spec/models/spree/gateway_spec.rb'
# Offense count: 2
# This cop supports unsafe autocorrection (--autocorrect-all).
Style/RedundantInterpolation:
Exclude:
- 'lib/tasks/karma.rake'
- 'spec/base_spec_helper.rb'
# Offense count: 8
# This cop supports safe autocorrection (--autocorrect).
Style/RedundantLineContinuation:
Exclude:
- 'lib/reporting/reports/enterprise_fee_summary/scope.rb'
# Offense count: 19
# This cop supports unsafe autocorrection (--autocorrect-all).
# Configuration parameters: AllowedMethods, AllowedPatterns.
@@ -961,67 +872,10 @@ Style/ReturnNilInPredicateMethodDefinition:
- 'app/serializers/api/admin/customer_serializer.rb'
- 'engines/order_management/app/services/order_management/subscriptions/validator.rb'
# Offense count: 204
Style/Send:
Exclude:
- 'spec/controllers/admin/subscriptions_controller_spec.rb'
- 'spec/controllers/payment_gateways/paypal_controller_spec.rb'
- 'spec/controllers/spree/admin/base_controller_spec.rb'
- 'spec/controllers/spree/orders_controller_spec.rb'
- 'spec/helpers/order_cycles_helper_spec.rb'
- 'spec/jobs/subscription_confirm_job_spec.rb'
- 'spec/jobs/subscription_placement_job_spec.rb'
- 'spec/lib/open_food_network/address_finder_spec.rb'
- 'spec/lib/open_food_network/enterprise_fee_applicator_spec.rb'
- 'spec/lib/open_food_network/enterprise_fee_calculator_spec.rb'
- 'spec/lib/open_food_network/order_cycle_form_applicator_spec.rb'
- 'spec/lib/open_food_network/permissions_spec.rb'
- 'spec/lib/open_food_network/tag_rule_applicator_spec.rb'
- 'spec/lib/reports/xero_invoices_report_spec.rb'
- 'spec/lib/stripe/webhook_handler_spec.rb'
- 'spec/models/calculator/weight_spec.rb'
- 'spec/models/enterprise_spec.rb'
- 'spec/models/exchange_spec.rb'
- 'spec/models/spree/order_inventory_spec.rb'
- 'spec/models/spree/payment_spec.rb'
- 'spec/models/spree/return_authorization_spec.rb'
- 'spec/models/tag_rule/filter_order_cycles_spec.rb'
- 'spec/models/tag_rule/filter_payment_methods_spec.rb'
- 'spec/models/tag_rule/filter_products_spec.rb'
- 'spec/models/tag_rule/filter_shipping_methods_spec.rb'
- 'spec/services/cart_service_spec.rb'
- 'spec/services/products_renderer_spec.rb'
- 'spec/services/variant_units/option_value_namer_spec.rb'
- 'spec/support/localized_number_helper.rb'
# Offense count: 4
# Offense count: 3
# This cop supports unsafe autocorrection (--autocorrect-all).
Style/SlicingWithRange:
Exclude:
- 'app/helpers/spree/admin/navigation_helper.rb'
- 'app/services/embedded_page_service.rb'
- 'engines/order_management/app/services/order_management/subscriptions/validator.rb'
# Offense count: 25
# This cop supports unsafe autocorrection (--autocorrect-all).
# Configuration parameters: Mode.
Style/StringConcatenation:
Exclude:
- 'app/controllers/admin/stripe_connect_settings_controller.rb'
- 'app/helpers/enterprises_helper.rb'
- 'app/helpers/spree/admin/base_helper.rb'
- 'app/mailers/spree/user_mailer.rb'
- 'app/models/enterprise.rb'
- 'app/models/spree/credit_card.rb'
- 'app/models/spree/payment_method.rb'
- 'app/serializers/api/cached_enterprise_serializer.rb'
- 'app/serializers/api/enterprise_shopfront_list_serializer.rb'
- 'app/services/embedded_page_service.rb'
- 'app/services/products_renderer.rb'
- 'lib/spree/api/controller_setup.rb'
- 'lib/spree/core/environment_extension.rb'
- 'spec/models/spree/line_item_spec.rb'
- 'spec/models/spree/product_spec.rb'
- 'spec/services/embedded_page_service_spec.rb'
- 'spec/support/features/datepicker_helper.rb'
- 'spec/system/admin/products_spec.rb'

View File

@@ -230,7 +230,7 @@ GEM
combine_pdf (1.0.26)
matrix
ruby-rc4 (>= 0.1.5)
concurrent-ruby (1.2.3)
concurrent-ruby (1.3.1)
connection_pool (2.4.1)
crack (1.0.0)
bigdecimal
@@ -263,7 +263,7 @@ GEM
warden (~> 1.2.3)
devise-encryptable (0.2.0)
devise (>= 2.1.0)
devise-i18n (1.12.0)
devise-i18n (1.12.1)
devise (>= 4.9.0)
devise-token_authenticatable (1.1.0)
devise (>= 4.0.0, < 5.0.0)
@@ -494,7 +494,7 @@ GEM
parallel (1.24.0)
paranoia (2.6.3)
activerecord (>= 5.1, < 7.2)
parser (3.3.1.0)
parser (3.3.2.0)
ast (~> 2.4.1)
racc
paypal-sdk-core (0.3.4)
@@ -522,7 +522,7 @@ GEM
activerecord (>= 4.2)
railties (>= 4.2)
raabro (1.4.0)
racc (1.7.3)
racc (1.8.0)
rack (2.2.9)
rack-mini-profiler (2.3.4)
rack (>= 1.2.0)
@@ -543,7 +543,7 @@ GEM
rack (< 3)
rack-test (2.1.0)
rack (>= 1.3)
rack-timeout (0.6.3)
rack-timeout (0.7.0)
rails (7.0.8)
actioncable (= 7.0.8)
actionmailbox (= 7.0.8)
@@ -604,7 +604,7 @@ GEM
redis-client (>= 0.22.0)
redis-client (0.22.1)
connection_pool
regexp_parser (2.9.0)
regexp_parser (2.9.2)
reline (0.5.0)
io-console (~> 0.5)
request_store (1.5.1)
@@ -667,7 +667,7 @@ GEM
rswag-ui (2.13.0)
actionpack (>= 3.1, < 7.2)
railties (>= 3.1, < 7.2)
rubocop (1.63.5)
rubocop (1.64.1)
json (~> 2.3)
language_server-protocol (>= 3.17.0)
parallel (~> 1.10)
@@ -843,7 +843,7 @@ GEM
xml-simple (1.1.8)
xpath (3.2.0)
nokogiri (~> 1.8)
zeitwerk (2.6.14)
zeitwerk (2.6.15)
PLATFORMS
ruby

View File

@@ -47,7 +47,7 @@ angular.module("ofn.admin").controller "AdminProductEditCtrl", ($scope, $timeout
removeClearedValues()
params = {
'q[name_cont]': $scope.q.query,
'q[supplier_id_eq]': $scope.q.producerFilter,
'q[variants_supplier_id_eq]': $scope.q.producerFilter,
'q[variants_primary_taxon_id_eq]': $scope.q.categoryFilter,
'q[s]': $scope.sorting,
import_date: $scope.q.importDateFilter,
@@ -126,8 +126,11 @@ angular.module("ofn.admin").controller "AdminProductEditCtrl", ($scope, $timeout
DisplayProperties.setShowVariants 0, showVariants
$scope.addVariant = (product) ->
# Set new variant category to same as last product variant category to keep compactibility with deleted variant callback to set new variant category
newVariantId = $scope.nextVariantId();
newVariantCategoryId = product.variants[product.variants.length - 1]?.category_id
product.variants.push
id: $scope.nextVariantId()
id: newVariantId
unit_value: null
unit_description: null
on_demand: false
@@ -136,8 +139,9 @@ angular.module("ofn.admin").controller "AdminProductEditCtrl", ($scope, $timeout
on_hand: null
price: null
tax_category_id: null
category_id: null
category_id: newVariantCategoryId
DisplayProperties.setShowVariants product.id, true
DirtyProducts.addVariantProperty(product.id, newVariantId, 'category_id', newVariantCategoryId)
$scope.nextVariantId = ->
@@ -217,7 +221,7 @@ angular.module("ofn.admin").controller "AdminProductEditCtrl", ($scope, $timeout
products: productsToSubmit
filters:
'q[name_cont]': $scope.q.query
'q[supplier_id_eq]': $scope.q.producerFilter
'q[variants_supplier_id_eq]': $scope.q.producerFilter
'q[variants_primary_taxon_id_eq]': $scope.q.categoryFilter
'q[s]': $scope.sorting
import_date: $scope.q.importDateFilter
@@ -314,9 +318,6 @@ filterSubmitProducts = (productsToFilter) ->
if product.hasOwnProperty("name")
filteredProduct.name = product.name
hasUpdatableProperty = true
if product.hasOwnProperty("producer_id")
filteredProduct.supplier_id = product.producer_id
hasUpdatableProperty = true
if product.hasOwnProperty("price")
filteredProduct.price = product.price
hasUpdatableProperty = true
@@ -379,6 +380,9 @@ filterSubmitVariant = (variant) ->
if variant.hasOwnProperty("display_as")
filteredVariant.display_as = variant.display_as
hasUpdatableProperty = true
if variant.hasOwnProperty("producer_id")
filteredVariant.supplier_id = variant.producer_id
hasUpdatableProperty = true
{filteredVariant: filteredVariant, hasUpdatableProperty: hasUpdatableProperty}

View File

@@ -1,12 +1,16 @@
# Used like a regular angular filter where an object is passed
# Adds the additional special case that a value of 0 for the filter
# acts as a bypass for that particular attribute
# NOTE the name doesn't reflect what the filter does, it only fiters on the variant.producer_id
angular.module("admin.indexUtils").filter "attrFilter", ($filter) ->
return (objects, filters) ->
Object.keys(filters).reduce (filtered, attr) ->
filter = filters[attr]
return filtered if !filter? || filter == 0
return $filter('filter')(filtered, (object) ->
object[attr] == filter
)
, objects
filter = filters["producer_id"]
return objects if !filter? || filter == 0
return $filter('filter')(objects, (product) ->
for variant in product.variants
return true if variant["producer_id"] == filter
false
, true)

View File

@@ -31,7 +31,7 @@ angular.module("admin.indexUtils").factory 'Columns', ($rootScope, $http, $injec
savePreferences: (action_name) =>
$http
method: "PUT"
url: "/admin/column_preferences/bulk_update"
url: "/admin/column_preferences/bulk_update.json"
data:
action_name: action_name
column_preferences: (preference for column_name, preference of @columns)

View File

@@ -27,7 +27,7 @@ angular.module("admin.lineItems").controller 'LineItemsCtrl', ($scope, $timeout,
"order_bill_address_full_name_reversed",
"order_bill_address_full_name_with_comma",
"order_bill_address_full_name_with_comma_reversed",
"variant_product_supplier_name",
"variant_supplier_name",
"order_email",
"order_number",
"product_name"].join("_or_") + "_cont"
@@ -81,7 +81,7 @@ angular.module("admin.lineItems").controller 'LineItemsCtrl', ($scope, $timeout,
"q[order_shipment_state_not_eq]": "shipped",
"q[order_completed_at_not_null]": "true",
"q[order_distributor_id_eq]": $scope.distributorFilter,
"q[variant_product_supplier_id_eq]": $scope.supplierFilter,
"q[variant_supplier_id_eq]": $scope.supplierFilter,
"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,
@@ -105,7 +105,7 @@ angular.module("admin.lineItems").controller 'LineItemsCtrl', ($scope, $timeout,
Dereferencer.dereferenceAttr $scope.line_items, "supplier", Enterprises.byID
$scope.loadOrders()
RequestMonitor.load $q.all([$scope.orders.$promise]).then ->
Dereferencer.dereferenceAttr $scope.line_items, "order", Orders.byID
Dereferencer.dereferenceAttr $scope.line_items, "order", Orders.byID
Dereferencer.dereferenceAttr $scope.orders, "distributor", Enterprises.byID
Dereferencer.dereferenceAttr $scope.orders, "order_cycle", OrderCycles.byID
$scope.bulk_order_form.$setPristine()
@@ -133,7 +133,7 @@ angular.module("admin.lineItems").controller 'LineItemsCtrl', ($scope, $timeout,
return $http(
method: 'GET'
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, restock_items) ->
@@ -167,7 +167,7 @@ angular.module("admin.lineItems").controller 'LineItemsCtrl', ($scope, $timeout,
$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")
, "js.admin.deleting_item_will_cancel_order")
else
ofnDeleteLineItemsAlert(() ->
Promise.all(LineItems.delete(item) for item in lineItemsToDelete).then(-> $scope.refreshData())
@@ -199,7 +199,7 @@ angular.module("admin.lineItems").controller 'LineItemsCtrl', ($scope, $timeout,
$scope.refreshData()
$scope.getLineItemScale = (lineItem) ->
if lineItem.units_product && lineItem.units_variant && (lineItem.units_product.variant_unit == "weight" || lineItem.units_product.variant_unit == "volume")
if lineItem.units_product && lineItem.units_variant && (lineItem.units_product.variant_unit == "weight" || lineItem.units_product.variant_unit == "volume")
lineItem.units_product.variant_unit_scale
else
1
@@ -252,7 +252,7 @@ angular.module("admin.lineItems").controller 'LineItemsCtrl', ($scope, $timeout,
scale = $scope.getScale(unitsProduct, unitsVariant)
if scale
$scope.getFormattedValueWithUnitName(value, unitsProduct, unitsVariant, scale)
else
else
''
$scope.fulfilled = (sumOfUnitValues) ->

View File

@@ -3,6 +3,7 @@ angular.module('admin.orderCycles')
$controller('AdminOrderCycleBasicCtrl', {$scope: $scope, ocInstance: ocInstance})
order_cycle_id = $location.absUrl().match(/\/admin\/order_cycles\/(\d+)/)[1]
$scope.order_cycle_id = order_cycle_id
$scope.order_cycle = OrderCycle.load(order_cycle_id)
$scope.enterprises = Enterprise.index(order_cycle_id: order_cycle_id)
$scope.enterprise_fees = EnterpriseFee.index(order_cycle_id: order_cycle_id)
@@ -25,4 +26,4 @@ angular.module('admin.orderCycles')
if $scope.order_cycle_form?.$dirty
t('admin.unsaved_confirm_leave')
NavigationCheck.register(warnAboutUnsavedChanges)
NavigationCheck.register(warnAboutUnsavedChanges)

View File

@@ -1,8 +1,9 @@
angular.module('admin.orderCycles').controller 'AdminOrderCycleIncomingCtrl', ($scope, $rootScope, $controller, $location, Enterprise, OrderCycle, ExchangeProduct, ocInstance) ->
angular.module('admin.orderCycles').controller 'AdminOrderCycleIncomingCtrl', ($scope, $rootScope, $controller, $location, Enterprise, EnterpriseFee, OrderCycle, ExchangeProduct, ocInstance) ->
$controller('AdminOrderCycleExchangesCtrl', {$scope: $scope, ocInstance: ocInstance, $location: $location})
$scope.view = 'incoming'
# NB: weirdly at this next line $scope.order_cycle.id comes out undefined so we use $scope.order_cycle_id instead
$scope.enterprise_fees = EnterpriseFee.index(order_cycle_id: $scope.order_cycle_id, per_item: true)
$scope.exchangeTotalVariants = (exchange) ->
return unless $scope.enterprises? && $scope.enterprises[exchange.enterprise_id]?

View File

@@ -6,6 +6,8 @@ angular.module('admin.orderCycles').factory('EnterpriseFee', ($resource) ->
params:
order_cycle_id: '@order_cycle_id'
coordinator_id: '@coordinator_id'
per_item: '@per_item'
per_order: '@per_order'
})
{

View File

@@ -2,10 +2,10 @@ angular.module("admin.variantOverrides").directive "trackInheritance", (VariantO
require: "ngModel"
link: (scope, element, attrs, ngModel) ->
# This is a bit hacky, but it allows us to load the inherit property on the VO, but then not submit it
scope.inherit = angular.equals scope.variantOverrides[scope.hub_id][scope.variant.id], VariantOverrides.newFor scope.hub_id, scope.variant.id
scope.inherit = angular.equals scope.variantOverrides[scope.hub_id][scope.variant.id], VariantOverrides.newFor scope.hub_id, scope.variant
ngModel.$parsers.push (viewValue) ->
if ngModel.$dirty && viewValue
DirtyVariantOverrides.inherit scope.hub_id, scope.variant.id, scope.variantOverrides[scope.hub_id][scope.variant.id].id
DirtyVariantOverrides.inherit scope.hub_id, scope.variant, scope.variantOverrides[scope.hub_id][scope.variant.id].id
scope.displayDirty()
viewValue

View File

@@ -2,4 +2,8 @@ angular.module("admin.variantOverrides").filter "hubPermissions", ($filter) ->
return (products, hubPermissions, hub_id) ->
return [] if !hub_id
return [] if !hubPermissions[hub_id]
return $filter('filter')(products, ((product) -> hubPermissions[hub_id].indexOf(product.producer_id) > -1), true)
return $filter('filter')(products, ((product) ->
for variant in product.variants
return hubPermissions[hub_id].indexOf(variant.producer_id) > -1
), true)

View File

@@ -12,11 +12,11 @@ angular.module("admin.variantOverrides").factory "DirtyVariantOverrides", ($http
@add(hub_id, variant_id, vo_id)
@dirtyVariantOverrides[hub_id][variant_id][attr] = value
inherit: (hub_id, variant_id, vo_id) ->
@add(hub_id, variant_id, vo_id)
blankVo = angular.copy(VariantOverrides.inherit(hub_id, variant_id))
inherit: (hub_id, variant, vo_id) ->
@add(hub_id, variant.id, vo_id)
blankVo = angular.copy(VariantOverrides.inherit(hub_id, variant))
delete blankVo[attr] for attr, value of blankVo when attr not in @requiredAttrs()
@dirtyVariantOverrides[hub_id][variant_id] = blankVo
@dirtyVariantOverrides[hub_id][variant.id] = blankVo
count: ->
count = 0

View File

@@ -13,17 +13,18 @@ angular.module("admin.variantOverrides").factory "VariantOverrides", (variantOve
@variantOverrides[hub.id] ||= {}
for product in products
for variant in product.variants
@inherit(hub.id, variant.id) unless @variantOverrides[hub.id][variant.id]
@inherit(hub.id, variant) unless @variantOverrides[hub.id][variant.id]
inherit: (hub_id, variant_id) ->
inherit: (hub_id, variant) ->
# This method is called from the trackInheritance directive, to reinstate inheritance
@variantOverrides[hub_id][variant_id] ||= {}
angular.extend @variantOverrides[hub_id][variant_id], @newFor hub_id, variant_id
@variantOverrides[hub_id][variant.id] ||= {}
angular.extend @variantOverrides[hub_id][variant.id], @newFor(hub_id, variant)
newFor: (hub_id, variant_id) ->
newFor: (hub_id, variant) ->
# These properties need to match those checked in VariantOverrideSet.deletable?
hub_id: hub_id
variant_id: variant_id
variant_id: variant.id
producer_id: variant.producer_id
sku: null
price: null
count_on_hand: null

View File

@@ -4,15 +4,18 @@ angular.module('Darkswarm').controller "ProductsCtrl", ($scope, $sce, $filter, $
$scope.query = ""
$scope.taxonSelectors = FilterSelectorsService.createSelectors()
$scope.propertySelectors = FilterSelectorsService.createSelectors()
$scope.producerPropertySelectors = FilterSelectorsService.createSelectors()
$scope.filtersActive = true
$scope.page = 1
$scope.per_page = 10
$scope.order_cycle = OrderCycle.order_cycle
$scope.supplied_taxons = null
$scope.supplied_properties = null
$scope.supplied_producer_properties = null
$scope.showFilterSidebar = false
$scope.activeTaxons = []
$scope.activeProperties = []
$scope.activeProducerProperties = []
# Update filters after initial load of shop tab
$timeout =>
@@ -45,6 +48,12 @@ angular.module('Darkswarm').controller "ProductsCtrl", ($scope, $sce, $filter, $
$scope.supplied_properties[property.id] = Properties.properties_by_id[property.id]
)
OrderCycleResource.producerProperties params, (data)=>
$scope.supplied_producer_properties = {}
data.map( (property) ->
$scope.supplied_producer_properties[property.id] = Properties.properties_by_id[property.id]
)
$scope.loadMore = ->
if ($scope.page * $scope.per_page) <= Products.products.length
$scope.loadMoreProducts()
@@ -52,6 +61,7 @@ angular.module('Darkswarm').controller "ProductsCtrl", ($scope, $sce, $filter, $
$scope.$watch 'query', (newValue, oldValue) -> $scope.loadProducts() if newValue != oldValue
$scope.$watchCollection 'activeTaxons', (newValue, oldValue) -> $scope.loadProducts() if newValue != oldValue
$scope.$watchCollection 'activeProperties', (newValue, oldValue) -> $scope.loadProducts() if newValue != oldValue
$scope.$watchCollection 'activeProducerProperties', (newValue, oldValue) -> $scope.loadProducts() if newValue != oldValue
$scope.loadProducts = ->
$scope.page = 1
@@ -66,8 +76,9 @@ angular.module('Darkswarm').controller "ProductsCtrl", ($scope, $sce, $filter, $
id: $scope.order_cycle.order_cycle_id,
page: page || $scope.page,
per_page: $scope.per_page,
'q[name_or_meta_keywords_or_variants_display_as_or_variants_display_name_or_supplier_name_cont]': $scope.query,
'q[name_or_meta_keywords_or_variants_display_as_or_variants_display_name_or_variants_supplier_name_cont]': $scope.query,
'q[with_properties][]': $scope.activeProperties,
'q[with_variants_supplier_properties][]': $scope.activeProducerProperties,
'q[variants_primary_taxon_id_in_any][]': $scope.activeTaxons
}
@@ -86,6 +97,12 @@ angular.module('Darkswarm').controller "ProductsCtrl", ($scope, $sce, $filter, $
Properties.properties_by_id[property_id].name
).join($scope.filtersJoinWord()) if $scope.activeProperties?
$scope.appliedProducerPropertiesList = ->
$scope.activeProducerProperties.map( (property_id) ->
Properties.properties_by_id[property_id].name
).join($scope.filtersJoinWord()) if $scope.activeProducerProperties?
$scope.filtersJoinWord = ->
$sce.trustAsHtml(" <span class='join-word'>#{t('products_or')}</span> ")
@@ -99,6 +116,7 @@ angular.module('Darkswarm').controller "ProductsCtrl", ($scope, $sce, $filter, $
$scope.clearFilters = ->
$scope.taxonSelectors.clearAll()
$scope.propertySelectors.clearAll()
$scope.producerPropertySelectors.clearAll()
$scope.refreshStaleData = ->
# If the products template has already been loaded but the controller is being initialized
@@ -109,7 +127,7 @@ angular.module('Darkswarm').controller "ProductsCtrl", ($scope, $sce, $filter, $
$scope.loadProducts()
$scope.filtersCount = () ->
$scope.taxonSelectors.totalActive() + $scope.propertySelectors.totalActive()
$scope.taxonSelectors.totalActive() + $scope.propertySelectors.totalActive() + $scope.producerPropertySelectors.totalActive()
$scope.toggleFilterSidebar = ->
$scope.showFilterSidebar = !$scope.showFilterSidebar

View File

@@ -42,8 +42,17 @@ angular.module('Darkswarm').controller "RegistrationCtrl", ($scope, Registration
$scope.toggleAddressConfirmed = ->
$scope.addressConfirmed = !$scope.addressConfirmed
if $scope.addressConfirmed
$scope.setLatLongIfUsingOpenStreetMap()
$scope.enterprise.address.latitude = $scope.latLong.latitude
$scope.enterprise.address.longitude = $scope.latLong.longitude
else
$scope.enterprise.address.latitude = null
$scope.enterprise.address.longitude = null
# When OpenStreetMaps is enabled the latitude and longitude are calculated via a Stimulus
# controller, so they need to be read from data properties to be accessible here.
$scope.setLatLongIfUsingOpenStreetMap = ->
openStreetMap = document.getElementById("open-street-map")
if !$scope.latLong && openStreetMap && openStreetMap.dataset.latitude && openStreetMap.dataset.longitude
$scope.latLong = { latitude: openStreetMap.dataset.latitude, longitude: openStreetMap.dataset.longitude }

View File

@@ -18,4 +18,11 @@ angular.module('Darkswarm').factory 'OrderCycleResource', ($resource) ->
url: '/api/v0/order_cycles/:id/properties.json'
params:
id: '@id'
'producerProperties':
method: 'GET'
isArray: true
url: '/api/v0/order_cycles/:id/producer_properties.json'
params:
id: '@id'
})

View File

@@ -39,7 +39,7 @@ angular.module('Darkswarm').factory 'Products', (OrderCycleResource, OrderCycle,
dereference: ->
for product in @fetched_products
product.supplier = Shopfront.producers_by_id[product.supplier.id]
product.supplier = Shopfront.producers_by_id[product.variants[0].supplier.id]
Dereferencer.dereference product.taxons, Taxons.taxons_by_id
product.properties = angular.copy(product.properties_with_values)

View File

@@ -5,8 +5,9 @@
%div.menu{ 'ng-show' => "expanded" }
.menu_items
.menu_item{ "ng-repeat": "column in columns", "ng-click": "toggle(column);" }
%input.redesigned-input{ type: "checkbox", "ng-checked": "column.visible" }
{{ column.name }}
%input{ type: "checkbox", "ng-checked": "column.visible" }
%span
{{ column.name }}
%hr
%div.menu_item.text-center
%input.fullwidth.orange{ type: "button", "ng-value": "saved() ? 'Saved': 'Saving'", "ng-show": "saved() || saving", "ng-disabled": "saved()" }

View File

@@ -2,6 +2,6 @@
class HelpModalComponent < ModalComponent
def initialize(id:, close_button: true)
super(id:, close_button:)
super
end
end

View File

@@ -9,5 +9,5 @@
%div.menu_items
- @options.each do |option|
%label.menu_item{ "data-multiple-checked-select-target": "option", "data-value": option[1], "data-label": option[0] }
%input.redesigned-input{ type: "checkbox", checked: @selected.include?(option[1]), name: "#{@name}[]", value: option[1] }
= option[0]
%input{ type: "checkbox", checked: @selected.include?(option[1]), name: "#{@name}[]", value: option[1] }
%span= option[0]

View File

@@ -35,7 +35,7 @@ module Admin
order.with_lock do
if order.contents.update_item(@line_item, line_item_params)
# No Content, does not trigger ng resource auto-update
render body: nil, status: :no_content
head :no_content
else
render json: { errors: @line_item.errors }, status: :precondition_failed
end
@@ -49,7 +49,7 @@ module Admin
authorize! :update, order
order.contents.remove(@line_item.variant)
render body: nil, status: :no_content # No Content, does not trigger ng resource auto-update
head :no_content # No Content, does not trigger ng resource auto-update
end
private

View File

@@ -4,17 +4,25 @@ module Admin
class ColumnPreferencesController < Admin::ResourceController
before_action :load_collection, only: [:bulk_update]
respond_to :json
def bulk_update
@cp_set.collection.each { |cp| authorize! :bulk_update, cp }
if @cp_set.save
render json: @cp_set.collection, each_serializer: Api::Admin::ColumnPreferenceSerializer
elsif @cp_set.errors.present?
render json: { errors: @cp_set.errors }, status: :bad_request
else
render body: nil, status: :internal_server_error
respond_to do |format|
if @cp_set.save
format.json {
render json: @cp_set.collection, each_serializer: Api::Admin::ColumnPreferenceSerializer
}
format.turbo_stream {
flash.now[:success] = t('.success')
render :bulk_update, locals: { action: permitted_params[:action_name] }
}
else
format.json { render json: { errors: @cp_set.errors }, status: :bad_request }
format.turbo_stream {
flash.now[:error] = @cp_set.errors.full_messages.to_sentence
render :bulk_update, locals: { action: permitted_params[:action_name] }
}
end
end
end
@@ -28,11 +36,26 @@ module Admin
end
def load_collection
collection_hash = Hash[permitted_params[:column_preferences].
each_with_index.map { |cp, i| [i, cp] }]
collection_hash.select!{ |_i, cp| cp[:action_name] == permitted_params[:action_name] }
@cp_set = Sets::ColumnPreferenceSet.new(@column_preferences,
collection_attributes: collection_hash)
collection_attributes = nil
respond_to do |format|
format.json do
collection_attributes = Hash[permitted_params[:column_preferences].
each_with_index.map { |cp, i| [i, cp] }]
collection_attributes.select!{ |_i, cp|
cp[:action_name] == permitted_params[:action_name]
}
end
format.all do
# Inject action name and user ID for each column_preference
collection_attributes = permitted_params[:column_preferences].to_h.each_value { |cp|
cp[:action_name] = permitted_params[:action_name]
cp[:user_id] = spree_current_user.id
}
end
end
@cp_set = Sets::ColumnPreferenceSet.new(@column_preferences, collection_attributes:)
end
def collection

View File

@@ -5,12 +5,12 @@ module Admin
def create
authorize! :admin, enterprise
app = ConnectedApp.create!(enterprise_id: enterprise.id)
attributes = {}
attributes[:type] = connected_app_params[:type] if connected_app_params[:type]
ConnectAppJob.perform_later(
app, spree_current_user.spree_api_key,
channel: SessionChannel.for_request(request),
)
app = ConnectedApp.create!(enterprise_id: enterprise.id, **attributes)
app.connect(api_key: spree_current_user.spree_api_key,
channel: SessionChannel.for_request(request))
render_panel
end
@@ -18,15 +18,9 @@ module Admin
def destroy
authorize! :admin, enterprise
app = enterprise.connected_apps.first
app = enterprise.connected_apps.find(params.require(:id))
app.destroy
WebhookDeliveryJob.perform_later(
app.data["destroy"],
"disconnect-app",
nil
)
render_panel
end
@@ -39,5 +33,9 @@ module Admin
def render_panel
redirect_to "#{edit_admin_enterprise_path(enterprise)}#/connected_apps_panel"
end
def connected_app_params
params.permit(:type)
end
end
end

View File

@@ -20,7 +20,7 @@ module Admin
catalog_url = params.require(:catalog_url)
json_catalog = DfcRequest.new(spree_current_user).get(catalog_url)
json_catalog = fetch_catalog(catalog_url)
graph = DfcIo.import(json_catalog)
# * First step: import all products for given enterprise.
@@ -34,6 +34,16 @@ module Admin
private
def fetch_catalog(url)
if url =~ /food-data-collaboration/
fdc_json = FdcRequest.new(spree_current_user).call(url)
fdc_message = JSON.parse(fdc_json)
fdc_message["products"]
else
DfcRequest.new(spree_current_user).call(url)
end
end
# Most of this code is the same as in the DfcProvider::SuppliedProductsController.
def import_product(subject, enterprise)
return unless subject.is_a? DataFoodConsortium::Connector::SuppliedProduct

View File

@@ -65,7 +65,9 @@ module Admin
order_cycle ||= OrderCycle.new(coordinator:) if coordinator.present?
enterprises = OpenFoodNetwork::OrderCyclePermissions.new(spree_current_user,
order_cycle).visible_enterprises
EnterpriseFee.for_enterprises(enterprises).order('enterprise_id', 'fee_type', 'name')
fees = EnterpriseFee.for_enterprises(enterprises).order('enterprise_id', 'fee_type', 'name')
filter_fees(fees)
else
collection = EnterpriseFee.managed_by(spree_current_user).order('enterprise_id',
'fee_type', 'name')
@@ -74,6 +76,12 @@ module Admin
end
end
def filter_fees(fees)
fees = fees.per_item if params[:per_item]
fees = fees.per_order if params[:per_order]
fees
end
def collection_actions
[:index, :for_order_cycle, :bulk_update]
end

View File

@@ -189,10 +189,7 @@ module Admin
.visible_enterprises
if enterprises.present?
enterprises.includes(
supplied_products:
[:supplier, :variants, :image]
)
enterprises.includes(supplied_products: [:variants, :image])
end
when :index
if spree_current_user.admin?

View File

@@ -4,6 +4,8 @@ require 'roo'
module Admin
class ProductImportController < Spree::Admin::BaseController
TMPDIR_PREFIX = "product_import-"
before_action :validate_upload_presence, except: %i[index guide validate_data]
def index
@@ -101,8 +103,7 @@ module Admin
def save_uploaded_file(upload)
extension = File.extname(upload.original_filename)
directory = Dir.mktmpdir 'product_import'
File.open(File.join(directory, "import#{extension}"), 'wb') do |f|
File.open(File.join(mktmpdir, "import#{extension}"), 'wb') do |f|
data = UploadSanitizer.new(upload.read).call
f.write(data)
f.path
@@ -126,6 +127,14 @@ module Admin
ProductImport::ProductImporter
end
def mktmpdir
Dir::Tmpname.create(TMPDIR_PREFIX, Rails.root.join('tmp') ) { |tmpname| Dir.mkdir(tmpname) }
end
def tmpdir_base
Rails.root.join('tmp', TMPDIR_PREFIX).to_s
end
def file_path
@file_path ||= validate_file_path(sanitize_file_path(params[:filepath]))
end
@@ -134,8 +143,9 @@ module Admin
FilePathSanitizer.new.sanitize(file_path, on_error: method(:raise_invalid_file_path))
end
# Ensure file is under the safe tmp directory
def validate_file_path(file_path)
return file_path if file_path.to_s.match?(TEMP_FILE_PATH_REGEX)
return file_path if file_path.to_s.match?(%r{^#{tmpdir_base}[A-Za-z0-9-]*/import\.csv$})
raise_invalid_file_path
end
@@ -145,6 +155,5 @@ module Admin
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

@@ -1,5 +1,6 @@
# frozen_string_literal: true
# rubocop:disable Metrics/ClassLength
module Admin
class ProductsV3Controller < Spree::Admin::BaseController
helper ProductsHelper
@@ -31,6 +32,67 @@ module Admin
end
end
def destroy
@record = ProductScopeQuery.new(
spree_current_user,
{ id: params[:id] }
).find_product
@record.destroyed_by = spree_current_user
status = :ok
if @record.destroy
flash.now[:success] = t('.delete_product.success')
else
flash.now[:error] = t('.delete_product.error')
status = :internal_server_error
end
respond_with do |format|
format.turbo_stream { render :destroy_product_variant, status: }
end
end
def destroy_variant
@record = Spree::Variant.active.find(params[:id])
authorize! :delete, @record
status = :ok
if VariantDeleter.new.delete(@record)
flash.now[:success] = t('.delete_variant.success')
else
flash.now[:error] = t('.delete_variant.error')
status = :internal_server_error
end
respond_with do |format|
format.turbo_stream { render :destroy_product_variant, status: }
end
end
def clone
@product = Spree::Product.find(params[:id])
status = :ok
begin
@cloned_product = @product.duplicate
flash.now[:success] = t('.success')
@product_index = "-#{@cloned_product.id}"
@producer_options = producers
@category_options = categories
@tax_category_options = tax_category_options
rescue ActiveRecord::ActiveRecordError => _e
flash.now[:error] = t('.error')
status = :unprocessable_entity
@product_index = "-1" # Create a unique enough index
end
respond_with do |format|
format.turbo_stream { render :clone, status: }
end
end
def index_url(params)
"/admin/products?#{params.to_query}" # todo: fix routing so this can be automaticly generated
end
@@ -87,7 +149,7 @@ module Admin
def ransack_query
query = {}
query.merge!(supplier_id_in: @producer_id) if @producer_id.present?
query.merge!(variants_supplier_id_in: @producer_id) if @producer_id.present?
if @search_term.present?
query.merge!(Spree::Variant::SEARCH_KEY => @search_term)
end
@@ -101,13 +163,13 @@ module Admin
def product_query_includes
[
:image,
:supplier,
{ variants: [
:default_price,
:primary_taxon,
:product,
:stock_items,
:tax_category,
:supplier,
] },
]
end
@@ -147,3 +209,4 @@ module Admin
end
end
end
# rubocop:enable Metrics/ClassLength

View File

@@ -61,6 +61,9 @@ module Admin
def render_in_background
cable_ready[ScopedChannel.for_id(params[:uuid])]
.inner_html(
selector: "#report-go",
html: helpers.button(t(:go), "report__submit-btn", "submit", disabled: true)
).inner_html(
selector: "#report-table",
html: render_to_string(partial: "admin/reports/loading")
).scroll_into_view(

View File

@@ -146,7 +146,7 @@ module Admin
return nil if parent_data.blank?
@parent ||= parent_data[:model_class].
public_send("find_by", parent_data[:find_by] => params["#{model_name}_id"])
find_by(parent_data[:find_by] => params["#{model_name}_id"])
instance_variable_set("@#{model_name}", @parent)
end

View File

@@ -37,7 +37,7 @@ module Admin
def obfuscated_secret_key
key = Stripe.api_key
key.first(8) + "****" + key.last(4)
"#{key.first(8)}****#{key.last(4)}"
end
def settings_params

View File

@@ -5,7 +5,7 @@ module Admin
respond_to :json
respond_override destroy: { json: {
success: lambda { render body: nil, status: :no_content }
success: lambda { head :no_content }
} }
def map_by_tag

View File

@@ -88,7 +88,7 @@ module Admin
end
def modified_variant_overrides_ids
variant_overrides_params.map { |vo| vo[:id] }
variant_overrides_params.pluck(:id)
end
def collection_actions

View File

@@ -9,7 +9,7 @@ module Api
authorize! :destroy, enterprise_fee
if enterprise_fee.destroy
render plain: I18n.t(:successfully_removed), status: :no_content
head :no_content
else
render plain: enterprise_fee.errors.full_messages.first, status: :forbidden
end

View File

@@ -7,9 +7,11 @@ module Api
include ApiActionCaching
skip_authorization_check
skip_before_action :authenticate_user, :ensure_api_key, only: [:taxons, :properties]
skip_before_action :authenticate_user, :ensure_api_key, only: [
:taxons, :properties, :producer_properties
]
caches_action :taxons, :properties,
caches_action :taxons, :properties, :producer_properties,
expires_in: CacheService::FILTERS_EXPIRY,
cache_path: proc { |controller| controller.request.url }
@@ -41,7 +43,13 @@ module Api
def properties
render plain: ActiveModel::ArraySerializer.new(
product_properties | producer_properties, each_serializer: Api::PropertySerializer
product_properties, each_serializer: Api::PropertySerializer
).to_json
end
def producer_properties
render plain: ActiveModel::ArraySerializer.new(
load_producer_properties, each_serializer: Api::PropertySerializer
).to_json
end
@@ -58,7 +66,7 @@ module Api
select('DISTINCT spree_properties.*')
end
def producer_properties
def load_producer_properties
producers = Enterprise.
joins(:supplied_products).
where(spree_products: { id: distributed_products })
@@ -86,8 +94,9 @@ module Api
end
def distributed_products
OrderCycles::DistributedProductsService.new(distributor, order_cycle,
customer).products_relation
OrderCycles::DistributedProductsService.new(
distributor, order_cycle, customer
).products_relation.pluck(:id)
end
end
end

View File

@@ -44,7 +44,7 @@ module Api
authorize! :delete, @product
@product.destroyed_by = current_api_user
@product.destroy
render json: @product, serializer: Api::Admin::ProductSerializer, status: :no_content
head :no_content
end
def bulk_products
@@ -54,7 +54,7 @@ module Api
end
def overridable
@products = product_finder.paged_products_for_producers
@products = product_finder.products_for_producers
render_paged_products @products, ::Api::Admin::ProductSimpleSerializer
end

View File

@@ -55,7 +55,7 @@ module Api
def destroy
authorize! :delete, Spree::Taxon
taxon.destroy
render json: taxon, serializer: Api::TaxonSerializer, status: :no_content
head :no_content
end
private

View File

@@ -44,7 +44,7 @@ module Api
authorize! :delete, @variant
VariantDeleter.new.delete(@variant)
render json: @variant, serializer: Api::VariantSerializer, status: :no_content
head :no_content
end
private

View File

@@ -60,7 +60,7 @@ class ApplicationController < ActionController::Base
rescue StandardError
'unknown'
end}")
super(options, response_status)
super
end
def set_checkout_redirect

View File

@@ -37,13 +37,14 @@ module Spree
if @object.save
flash[:success] = flash_message_for(@object, :successfully_created)
redirect_to location_after_save
respond_to do |format|
format.html { redirect_to location_after_save }
format.turbo_stream { render :update }
end
else
respond_with(@object)
respond_with_error(@object.errors)
end
rescue ActiveStorage::IntegrityError
@object.errors.add :attachment, :integrity_error
respond_with(@object)
end
def update
@@ -53,16 +54,13 @@ module Spree
if @object.update(permitted_resource_params)
flash[:success] = flash_message_for(@object, :successfully_updated)
respond_with do |format|
respond_to do |format|
format.html { redirect_to location_after_save }
format.turbo_stream
end
else
respond_with(@object)
respond_with_error(@object.errors)
end
rescue ActiveStorage::IntegrityError
@object.errors.add :attachment, :integrity_error
respond_with(@object)
end
def destroy
@@ -112,6 +110,14 @@ module Spree
:attachment, :viewable_id, :alt
)
end
def respond_with_error(errors)
@errors = errors.map(&:full_message)
respond_to do |format|
format.html { respond_with(@object) }
format.turbo_stream { render :edit }
end
end
end
end
end

View File

@@ -15,6 +15,8 @@ module Spree
invoice_pdf = filepath(invoice_id)
send_file(invoice_pdf, type: 'application/pdf', disposition: :inline)
rescue ActionController::MissingFile
render "errors/not_found", status: :not_found, formats: :html
end
def generate

View File

@@ -8,6 +8,7 @@ module Spree
before_action :setup_property, only: [:index]
def index
@supplier = @product.variants.first.supplier
@url_filters = ::ProductFilters.new.extract(request.query_parameters)
end

View File

@@ -12,6 +12,7 @@ module Spree
include EnterprisesHelper
before_action :load_data
before_action :load_producers, only: [:index, :new]
before_action :load_form_data, only: [:index, :new, :create, :edit, :update]
before_action :load_spree_api_key, only: [:index, :variant_overrides]
before_action :strip_new_properties, only: [:create, :update]
@@ -41,6 +42,7 @@ module Spree
flash[:success] = flash_message_for(@object, :successfully_created)
redirect_after_save
else
load_producers
# Re-fill the form with deleted params on product
@on_hand = request.params[:product][:on_hand]
@on_demand = request.params[:product][:on_demand]
@@ -52,14 +54,9 @@ module Spree
def update
@url_filters = ::ProductFilters.new.extract(request.query_parameters)
original_supplier_id = @product.supplier_id
delete_stock_params_and_set_after do
params[:product] ||= {} if params[:clear_product_properties]
if @object.update(permitted_resource_params)
if original_supplier_id != @product.supplier_id
ExchangeVariantDeleter.new.delete(@product)
end
flash[:success] = flash_message_for(@object, :successfully_updated)
end
redirect_to spree.edit_admin_product_url(@object, @url_filters)
@@ -157,12 +154,15 @@ module Spree
end
def load_form_data
@producers = OpenFoodNetwork::Permissions.new(spree_current_user).
managed_product_enterprises.is_primary_producer.by_name
@taxons = Spree::Taxon.order(:name)
@import_dates = product_import_dates.uniq.to_json
end
def load_producers
@producers = OpenFoodNetwork::Permissions.new(spree_current_user).
managed_product_enterprises.is_primary_producer.by_name
end
def product_import_dates
options = [{ id: '0', name: '' }]
product_import_dates_query.collect(&:import_date).
@@ -173,12 +173,10 @@ module Spree
def product_import_dates_query
Spree::Variant.
select('DISTINCT spree_variants.import_date').
joins(:product).
where(spree_products: { supplier_id: editable_enterprises.collect(&:id) }).
select('import_date').distinct.
where(supplier_id: editable_enterprises.collect(&:id)).
where.not(spree_variants: { import_date: nil }).
where(spree_variants: { deleted_at: nil }).
order('spree_variants.import_date DESC')
order('import_date DESC')
end
def strip_new_properties

View File

@@ -46,7 +46,13 @@ module Spree
def update
@url_filters = ::ProductFilters.new.extract(request.query_parameters)
original_supplier_id = @object.supplier_id
if @object.update(permitted_resource_params)
if original_supplier_id != @object.supplier_id
ExchangeVariantDeleter.new.delete(@object)
end
flash[:success] = flash_message_for(@object, :successfully_updated)
redirect_to spree.admin_product_variants_url(params[:product_id], @url_filters)
else
@@ -113,6 +119,8 @@ module Spree
private
def load_data
@producers = OpenFoodNetwork::Permissions.new(spree_current_user).
managed_product_enterprises.is_primary_producer.by_name
@tax_categories = TaxCategory.order(:name)
@shipping_categories = ShippingCategory.order(:name)
end

View File

@@ -47,14 +47,8 @@ module Spree
@user = Spree::User.new(user_params)
if @user.save
render cable_ready: cable_car.inner_html(
"#signup-feedback",
partial("layouts/alert",
locals: {
type: "success",
message: t('devise.user_registrations.spree_user.signed_up_but_unconfirmed')
})
)
flash[:success] = t('devise.user_registrations.spree_user.signed_up_but_unconfirmed')
render cable_ready: cable_car.redirect_to(url: main_app.root_path)
else
render status: :unprocessable_entity, cable_ready: cable_car.morph(
"#signup-tab",

View File

@@ -14,6 +14,10 @@ module Admin
producers.size == 1 ? producers.first.id : nil
end
def managed_by_user?(enterprise)
enterprise.in?(spree_current_user.enterprises)
end
def enterprise_side_menu_items(enterprise)
is_shop = enterprise.sells != "none"
show_properties = !!enterprise.is_primary_producer
@@ -62,8 +66,8 @@ module Admin
{ name: 'inventory_settings', icon_class: "icon-list-ol", show: is_shop },
{ 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 },
{ name: 'white_label', icon_class: "icon-leaf", show: true },
{ name: 'users', icon_class: "icon-user", show: true },
{ name: 'connected_apps', icon_class: "icon-puzzle-piece", show: show_connected_apps },
]
end

View File

@@ -11,9 +11,25 @@ module Admin
def order_adjustments_for_display(order)
order.adjustments +
voucher_included_tax_representations(order) +
additional_tax_total_representation(order) +
order.all_adjustments.payment_fee.eligible
end
def additional_tax_total_representation(order)
adjustment = Spree::Adjustment.additional.tax.where(
order_id: order.id, adjustable_type: 'Spree::Adjustment'
).sum(:amount)
return [] unless adjustment != 0
[
AdjustmentData.new(
I18n.t("admin.orders.edit.tax_on_fees"),
adjustment
)
]
end
def voucher_included_tax_representations(order)
return [] unless VoucherAdjustmentsService.new(order).voucher_included_tax.negative?

View File

@@ -9,5 +9,23 @@ module Admin
new_admin_product_image_path(product.id)
end
end
def prepare_new_variant(product)
product.variants.build do |variant|
variant.unit_value = 1.0 * (product.variant_unit_scale || 1)
variant.unit_presentation = VariantUnits::OptionValueNamer.new(variant).name
end
end
def unit_value_with_description(variant)
scaled_unit_value = variant.unit_value / (variant.product.variant_unit_scale || 1)
precised_unit_value = number_with_precision(
scaled_unit_value,
precision: nil,
strip_insignificant_zeros: true
)
[precised_unit_value, variant.unit_description].compact_blank.join(" ")
end
end
end

View File

@@ -8,6 +8,6 @@ class BulkFormBuilder < ActionView::Helpers::FormBuilder
opts[:class] = "#{opts[:class]} changed".strip
end
super(field, **opts)
super
end
end

View File

@@ -31,7 +31,7 @@ module EnterprisesHelper
def enterprises_options(enterprises)
enterprises.map { |enterprise|
[enterprise.name + ": " + enterprise.address.address1 + ", " + enterprise.address.city,
["#{enterprise.name}: #{enterprise.address.address1}, #{enterprise.address.city}",
enterprise.id.to_i]
}
end

View File

@@ -2,7 +2,7 @@
module I18nHelper
def locale_options
OpenFoodNetwork::I18nConfig.available_locales.map do |locale|
OpenFoodNetwork::I18nConfig.selectable_locales.map do |locale|
[t('language_name', locale:), locale]
end
end

View File

@@ -10,4 +10,8 @@ module MailerHelper
link_to ofn, "https://www.openfoodnetwork.org"
end
end
def order_reply_email(order)
order.distributor.email_address.presence || order.distributor.contact.email
end
end

View File

@@ -2,7 +2,9 @@
module MapHelper
def using_google_maps?
ENV["GOOGLE_MAPS_API_KEY"].present? || google_maps_configured_with_geocoder_api_key?
!ContentConfig.open_street_map_enabled && (
ENV["GOOGLE_MAPS_API_KEY"].present? || google_maps_configured_with_geocoder_api_key?
)
end
private

View File

@@ -108,7 +108,7 @@ module Spree
object.preferences.keys.map { |key|
preference_label = form.label("preferred_#{key}",
Spree.t(key.to_s.gsub("_from_list", "")) + ": ")
"#{Spree.t(key.to_s.gsub('_from_list', ''))}: ")
preference_field = preference_field_for(
form,
"preferred_#{key}",
@@ -120,7 +120,7 @@ module Spree
def link_to_add_fields(name, target, options = {})
name = '' if options[:no_text]
css_classes = options[:class] ? options[:class] + " spree_add_fields" : "spree_add_fields"
css_classes = options[:class] ? "#{options[:class]} spree_add_fields" : "spree_add_fields"
link_to_with_icon('icon-plus',
name,
'javascript:',

View File

@@ -17,10 +17,10 @@ class ConnectAppJob < ApplicationJob
return unless channel
selector = "#edit_enterprise_#{enterprise.id} #connected-app-discover-regen"
selector = "#connected-app-discover-regen.enterprise_#{enterprise.id}"
html = ApplicationController.render(
partial: "admin/enterprises/form/connected_apps",
locals: { enterprise: },
partial: "admin/enterprises/form/connected_apps/discover_regen",
locals: { enterprise:, connected_app: enterprise.connected_apps.discover_regen.first },
)
cable_ready[channel].morph(selector:, html:).broadcast

View File

@@ -39,10 +39,14 @@ class ReportJob < ApplicationJob
end
def broadcast_result(channel, format, blob)
cable_ready[channel].inner_html(
selector: "#report-table",
html: actioncable_content(format, blob)
).broadcast
cable_ready[channel]
.inner_html(
selector: "#report-go",
html: Spree::Admin::BaseController.helpers.button(I18n.t(:go), "report__submit-btn")
).inner_html(
selector: "#report-table",
html: actioncable_content(format, blob)
).broadcast
end
def broadcast_error(channel)
@@ -53,7 +57,14 @@ class ReportJob < ApplicationJob
end
def actioncable_content(format, blob)
return blob.result if format.to_sym == :html
if format.to_sym == :html
return blob.result if blob.byte_size < 10**6 # 1 MB
return render(
partial: "admin/reports/display",
locals: { file_url: blob.expiring_service_url }
)
end
render(partial: "admin/reports/download", locals: { file_url: blob.expiring_service_url })
end

View File

@@ -60,11 +60,12 @@ class ProducerMailer < ApplicationMailer
def line_items_from(order_cycle, producer)
@line_items ||= Spree::LineItem.
includes(variant: [:product]).
includes(variant: :product).
joins(variant: :product).
from_order_cycle(order_cycle).
sorted_by_name_and_unit_value.
merge(Spree::Product.with_deleted.in_supplier(producer)).
merge(Spree::Order.by_state(["complete", "resumed"]))
merge(Spree::Variant.with_deleted.where(supplier: producer)).
merge(Spree::Order.by_state(["complete", "resumed"])).
sorted_by_name_and_unit_value
end
def total_from_line_items(line_items)
@@ -81,7 +82,7 @@ class ProducerMailer < ApplicationMailer
line_items.map do |line_item|
{
sku: line_item.variant.sku,
supplier_name: line_item.product.supplier.name,
supplier_name: line_item.variant.supplier.name,
product_and_full_name: line_item.product_and_full_name,
quantity: line_item.quantity,
first_name: line_item.order.billing_address.first_name,

View File

@@ -25,7 +25,7 @@ module Spree
@user = user
I18n.with_locale valid_locale(@user) do
mail(to: user.email,
subject: t(:welcome_to) + ' ' + Spree::Config[:site_name])
subject: "#{t(:welcome_to)} #{Spree::Config[:site_name]}")
end
end

View File

@@ -22,7 +22,7 @@ module FilePreferences
if has_preference?("#{key}_blob_id")
:file
else
super(key)
super
end
end

View File

@@ -1,19 +0,0 @@
# frozen_string_literal: true
# Rails 5 introduced some breaking changes to these built-in methods, and the new versions
# no longer work correctly in relation to decrementing stock with LineItems / VariantOverrides.
# The following methods re-instate the pre-Rails-5 versions, which work as expected.
# https://apidock.com/rails/v4.2.9/ActiveRecord/Persistence/increment%21
# https://apidock.com/rails/v4.2.9/ActiveRecord/Persistence/decrement%21
module LineItemStockChanges
extend ActiveSupport::Concern
def increment!(attribute, by = 1)
increment(attribute, by).update_attribute(attribute, self[attribute])
end
def decrement!(attribute, by = 1)
decrement(attribute, by).update_attribute(attribute, self[attribute])
end
end

View File

@@ -10,9 +10,12 @@ module LogDestroyPerformer
after_destroy :log_who_destroyed
def log_who_destroyed
return if destroyed_by.nil?
Rails.logger.info "#{self.class} #{id} deleted by #{destroyed_by.id}"
message = if destroyed_by.nil?
"#{self.class} #{id} deleted"
else
"#{self.class} #{id} deleted by #{destroyed_by.id} <#{destroyed_by.email}>"
end
Rails.logger.info message
end
end
end

View File

@@ -5,7 +5,31 @@
# Here we store keys and links to access the app.
class ConnectedApp < ApplicationRecord
belongs_to :enterprise
after_destroy :disconnect
scope :discover_regen, -> { where(type: "ConnectedApp") }
scope :affiliate_sales_data, -> { where(type: "ConnectedApps::AffiliateSalesData") }
scope :connecting, -> { where(data: nil) }
scope :ready, -> { where.not(data: nil) }
def connecting?
data.nil?
end
def ready?
!connecting?
end
def connect(api_key:, channel:)
ConnectAppJob.perform_later(self, api_key, channel:)
end
def disconnect
WebhookDeliveryJob.perform_later(
data["destroy"],
"disconnect-app",
nil
)
end
end

View File

@@ -0,0 +1,13 @@
# frozen_string_literal: true
# An enterprise can opt-in for their data to be included in the affiliate_sales_data endpoint
#
module ConnectedApps
class AffiliateSalesData < ConnectedApp
def connect(_opts)
update! data: true # not-nil value indicates it is ready
end
def disconnect; end
end
end

View File

@@ -4,4 +4,14 @@ class CustomTab < ApplicationRecord
belongs_to :enterprise
validates :title, presence: true, length: { maximum: 20 }
# Remove any unsupported HTML.
def content
HtmlSanitizer.sanitize(super)
end
# Remove any unsupported HTML.
def content=(html)
super(HtmlSanitizer.sanitize(html))
end
end

View File

@@ -39,13 +39,13 @@ class Enterprise < ApplicationRecord
class_name: 'EnterpriseGroup'
has_many :producer_properties, foreign_key: 'producer_id', dependent: :destroy
has_many :properties, through: :producer_properties
has_many :supplied_products, class_name: 'Spree::Product',
foreign_key: 'supplier_id',
dependent: :destroy
has_many :supplied_variants, through: :supplied_products, source: :variants
has_many :supplied_variants,
class_name: 'Spree::Variant', foreign_key: 'supplier_id', dependent: :destroy
has_many :supplied_products, through: :supplied_variants, source: :product
has_many :distributed_orders, class_name: 'Spree::Order',
foreign_key: 'distributor_id',
dependent: :restrict_with_exception
belongs_to :address, class_name: 'Spree::Address'
belongs_to :business_address, optional: true, class_name: 'Spree::Address', dependent: :destroy
has_many :enterprise_fees, dependent: :restrict_with_exception
@@ -167,7 +167,7 @@ class Enterprise < ApplicationRecord
scope :is_distributor, -> { where.not(sells: 'none') }
scope :is_hub, -> { where(sells: 'any') }
scope :supplying_variant_in, lambda { |variants|
joins(supplied_products: :variants).
joins(:supplied_variants).
where(spree_variants: { id: variants }).
select('DISTINCT enterprises.*')
}
@@ -205,14 +205,14 @@ class Enterprise < ApplicationRecord
select('DISTINCT enterprises.*')
}
scope :distributing_products, lambda { |product_ids|
scope :distributing_variants, lambda { |variants_ids|
exchanges = joins("
INNER JOIN exchanges
ON (exchanges.receiver_id = enterprises.id AND exchanges.incoming = 'f')
ON (exchanges.receiver_id = enterprises.id AND exchanges.incoming = false)
").
joins('INNER JOIN exchange_variants ON (exchange_variants.exchange_id = exchanges.id)').
joins('INNER JOIN spree_variants ON (spree_variants.id = exchange_variants.variant_id)').
where(spree_variants: { product_id: product_ids }).select('DISTINCT enterprises.id')
where(spree_variants: { id: variants_ids }).select('DISTINCT enterprises.id')
where(id: exchanges)
}
@@ -376,7 +376,7 @@ class Enterprise < ApplicationRecord
def category
# Make this crazy logic human readable so we can argue about it sanely.
cat = is_primary_producer ? "producer_" : "non_producer_"
cat << ("sells_" + sells)
cat << ("sells_#{sells}")
# Map backend cases to front end cases.
case cat
@@ -427,10 +427,9 @@ class Enterprise < ApplicationRecord
test_permalink = UrlGenerator.to_url(test_permalink)
test_permalink = "my-enterprise" if test_permalink.blank?
existing = Enterprise.
select(:permalink).
order(:permalink).
where("permalink LIKE ?", "#{test_permalink}%").
map(&:permalink)
pluck(:permalink)
if existing.include?(test_permalink)
used_indices = existing.map do |p|
@@ -510,7 +509,7 @@ class Enterprise < ApplicationRecord
end
def correct_whatsapp_url(phone_number)
phone_number && ("https://wa.me/" + phone_number.tr('+ ', ''))
phone_number && "https://wa.me/#{phone_number.tr('+ ', '')}"
end
def correct_instagram_url(url)
@@ -598,7 +597,7 @@ class Enterprise < ApplicationRecord
# Touch distributors without them touching their distributors.
# We avoid an infinite loop and don't need to touch the whole distributor tree.
def touch_distributors
Enterprise.distributing_products(supplied_products.select(:id)).
Enterprise.distributing_variants(supplied_variants.select(:id)).
where.not(enterprises: { id: }).
update_all(updated_at: Time.zone.now)
end

View File

@@ -74,6 +74,16 @@ class EnterpriseGroup < ApplicationRecord
permalink
end
# Remove any unsupported HTML.
def long_description
HtmlSanitizer.sanitize(super)
end
# Remove any unsupported HTML.
def long_description=(html)
super(HtmlSanitizer.sanitize(html))
end
private
def sanitize_permalink

View File

@@ -108,6 +108,6 @@ class EnterpriseRelationship < ApplicationRecord
def child_variant_overrides
VariantOverride.unscoped.for_hubs(child)
.joins(variant: :product).where(spree_products: { supplier_id: parent })
.joins(:variant).where(spree_variants: { supplier_id: parent } )
end
end

View File

@@ -54,10 +54,7 @@ module ProductImport
if settings.importing_into_inventory?
VariantOverride.for_hubs([enterprise_id]).count
else
Spree::Variant.
joins(:product).
where(spree_products: { supplier_id: enterprise_id }).
count
Spree::Variant.where(supplier_id: enterprise_id).count
end
@enterprise_products[enterprise_id] = products_count
@@ -169,7 +166,6 @@ module ProductImport
product.assign_attributes(
entry.assignable_attributes.except('id', 'on_hand', 'on_demand', 'display_name')
)
product.supplier_id = entry.producer_id
if product.save
ensure_variant_updated(product, entry)
@@ -228,10 +224,13 @@ module ProductImport
# Ensure attributes are correctly copied to a new product's variant
variant = product.variants.first
variant.display_name = entry.display_name if entry.display_name
variant.import_date = @import_time
variant.supplier_id = entry.producer_id
variant.save
# on_demand and on_hand require a stock level, which is created after the variant is created
variant.on_demand = entry.on_demand if entry.on_demand
variant.on_hand = entry.on_hand if entry.on_hand
variant.import_date = @import_time
variant.save
end
end
end

View File

@@ -73,6 +73,7 @@ module ProductImport
# Variant needs a product. Product needs to be assigned first in order for
# delegate to work. name= will fail otherwise.
new_variant = Spree::Variant.new(product_id:, **variant_attributes)
new_variant.supplier_id = entry.producer_id
new_variant.save
if new_variant.persisted?
@@ -287,9 +288,7 @@ module ProductImport
end
def inventory_validation(entry)
products = Spree::Product.where(supplier_id: entry.producer_id,
name: entry.name,
deleted_at: nil)
products = Spree::Product.in_supplier(entry.producer_id).where(name: entry.name)
if products.empty?
mark_as_invalid(entry, attribute: 'name',
@@ -358,9 +357,7 @@ module ProductImport
end
def product_validation(entry)
products = Spree::Product.where(supplier_id: entry.enterprise_id,
name: entry.name,
deleted_at: nil)
products = Spree::Product.in_supplier(entry.enterprise_id).where(name: entry.name)
if products.empty?
mark_as_new_product(entry)
@@ -384,7 +381,6 @@ module ProductImport
new_product.assign_attributes(
entry.assignable_attributes.except('id', 'on_hand', 'on_demand', 'display_name')
)
new_product.supplier_id = entry.producer_id
entry.on_hand = 0 if entry.on_hand.nil?
if new_product.valid?

View File

@@ -287,8 +287,6 @@ module ProductImport
end
def delete_uploaded_file
return unless @file.path == Rails.root.join("tmp/product_import").to_s
File.delete(@file)
end

View File

@@ -189,20 +189,22 @@ module Spree
:seo, :group_buy_options,
:bulk_update, :clone, :delete,
:destroy], Spree::Product do |product|
OpenFoodNetwork::Permissions.new(user).managed_product_enterprises.include? product.supplier
OpenFoodNetwork::Permissions.new(user).managed_product_enterprises.include?(
product.variants.first.supplier
)
end
can [:admin, :index, :bulk_update], :products_v3
can [:admin, :index, :bulk_update, :destroy, :destroy_variant, :clone], :products_v3
can [:create], Spree::Variant
can [:admin, :index, :read, :edit,
:update, :search, :delete, :destroy], Spree::Variant do |variant|
OpenFoodNetwork::Permissions.new(user).
managed_product_enterprises.include? variant.product.supplier
managed_product_enterprises.include? variant.supplier
end
can [:admin, :index, :read, :update, :bulk_update, :bulk_reset], VariantOverride do |vo|
next false unless vo.hub.present? && vo.variant&.product&.supplier.present?
next false unless vo.hub.present? && vo.variant&.supplier.present?
hub_auth = OpenFoodNetwork::Permissions.new(user).
variant_override_hubs.
@@ -210,14 +212,14 @@ module Spree
producer_auth = OpenFoodNetwork::Permissions.new(user).
variant_override_producers.
include? vo.variant.product.supplier
include? vo.variant.supplier
hub_auth && producer_auth
end
can [:admin, :create, :update], InventoryItem do |ii|
next false unless ii.enterprise.present? &&
ii.variant&.product&.supplier.present?
ii.variant&.supplier.present?
hub_auth = OpenFoodNetwork::Permissions.new(user).
variant_override_hubs.
@@ -225,7 +227,7 @@ module Spree
producer_auth = OpenFoodNetwork::Permissions.new(user).
variant_override_producers.
include? ii.variant.product.supplier
include? ii.variant.supplier
hub_auth && producer_auth
end

View File

@@ -30,7 +30,7 @@ module Spree
def expiry=(expiry)
self[:month], self[:year] = expiry.split(" / ")
self[:year] = "20" + self[:year]
self[:year] = "20#{self[:year]}"
end
def number=(num)

View File

@@ -5,9 +5,6 @@ require 'open_food_network/scope_variant_to_hub'
module Spree
class LineItem < ApplicationRecord
include VariantUnits::VariantAndLineItemNaming
include LineItemStockChanges
self.belongs_to_required_by_default = false
searchable_attributes :price, :quantity, :order_id, :variant_id, :tax_category_id
searchable_associations :order, :order_cycle, :variant, :product, :supplier, :tax_category
@@ -18,8 +15,8 @@ module Spree
belongs_to :variant, -> { with_deleted }, class_name: "Spree::Variant"
has_one :product, through: :variant
has_one :supplier, through: :product
belongs_to :tax_category, class_name: "Spree::TaxCategory"
has_one :supplier, through: :variant
belongs_to :tax_category, class_name: "Spree::TaxCategory", optional: true
has_many :adjustments, as: :adjustable, dependent: :destroy
@@ -28,7 +25,6 @@ module Spree
before_validation :copy_tax_category
before_validation :copy_dimensions
validates :variant, presence: true
validates :quantity, numericality: {
only_integer: true,
greater_than: -1,
@@ -88,13 +84,11 @@ module Spree
where(order_cycles: { id: order_cycle })
}
# Here we are simply joining the line item to its variant and product
# We dont use joins here to avoid the default scopes,
# and with that, include deleted variants and deleted products
# Here we are simply joining the line item to its variant
# We dont use joins here to avoid the default scopes, and with that, include deleted variants
scope :supplied_by_any, lambda { |enterprises|
product_ids = Spree::Product.unscoped.where(supplier_id: enterprises).select(:id)
variant_ids = Spree::Variant.unscoped.where(product_id: product_ids).select(:id)
where(spree_line_items: { variant_id: variant_ids })
variant_ids = Spree::Variant.unscoped.where(supplier: enterprises).select(:id)
where(variant_id: variant_ids)
}
scope :with_tax, -> {

View File

@@ -8,8 +8,6 @@ module Spree
include Balance
include SetUnusedAddressFields
self.belongs_to_required_by_default = false
searchable_attributes :number, :state, :shipment_state, :payment_state, :distributor_id,
:order_cycle_id, :email, :total, :customer_id
searchable_associations :shipping_method, :bill_address, :distributor
@@ -33,13 +31,13 @@ module Spree
token_resource
belongs_to :user, class_name: "Spree::User"
belongs_to :created_by, class_name: "Spree::User"
belongs_to :user, class_name: "Spree::User", optional: true
belongs_to :created_by, class_name: "Spree::User", optional: true
belongs_to :bill_address, class_name: 'Spree::Address'
belongs_to :bill_address, class_name: 'Spree::Address', optional: true
alias_attribute :billing_address, :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
has_many :state_changes, as: :stateful, dependent: :destroy
@@ -70,9 +68,9 @@ module Spree
dependent: :destroy
has_many :invoices, dependent: :restrict_with_exception
belongs_to :order_cycle
belongs_to :distributor, class_name: 'Enterprise'
belongs_to :customer
belongs_to :order_cycle, optional: true
belongs_to :distributor, class_name: 'Enterprise', optional: true
belongs_to :customer, optional: true
has_one :proxy_order, dependent: :destroy
has_one :subscription, through: :proxy_order

View File

@@ -155,6 +155,7 @@ module Spree
if adjustment
adjustment.originator = payment_method
adjustment.label = adjustment_label
adjustment.amount = payment_method.compute_amount(self)
adjustment.save
elsif !processing_refund? && payment_method.present?
payment_method.create_adjustment(adjustment_label, self, true)

View File

@@ -118,7 +118,7 @@ module Spree
end
def self.clean_name
i18n_key = "spree.admin.payment_methods.providers." + name.demodulize.downcase
i18n_key = "spree.admin.payment_methods.providers.#{name.demodulize.downcase}"
I18n.t(i18n_key)
end

View File

@@ -24,10 +24,6 @@ module Spree
amount
end
def price_changed?
amount_changed?
end
def price=(price)
self[:amount] = parse_price(price)
end

View File

@@ -5,19 +5,15 @@ require 'open_food_network/property_merge'
# PRODUCTS
# Products represent an entity for sale in a store.
# Products can have variations, called variants
# Products properties include description, permalink, availability,
# shipping category, etc. that do not change by variant.
#
# MASTER VARIANT
# Every product has one master variant, which stores master price and sku, size and weight, etc.
# Price, SKU, size, weight, etc. are all delegated to the master variant.
# Contains on_hand inventory levels only when there are no variants for the product.
# Products properties include description, meta_keywork, etc. that do not change by variant.
#
# VARIANTS
# All variants can access the product properties directly (via reverse delegation).
# Every product has at least one variant (standard variant), which stores price and availability,
# shipping category, sku, size and weight, etc.
# All variants can access the product name, description, and meta_keyword directly (via reverse
# delegation).
# Inventory units are tied to Variant.
# The master variant can have inventory units, but not option values.
# All other variants have option values and may have inventory units.
# All variants have option values and may have inventory units.
# Sum of on_hand each variant's inventory level determine "on_hand" level for the product.
#
module Spree
@@ -26,15 +22,14 @@ module Spree
include LogDestroyPerformer
self.belongs_to_required_by_default = false
self.ignored_columns += [:supplier_id]
acts_as_paranoid
searchable_attributes :supplier_id, :meta_keywords, :sku
searchable_associations :supplier, :properties, :variants
searchable_attributes :meta_keywords, :sku
searchable_associations :properties, :variants
searchable_scopes :active, :with_properties
belongs_to :supplier, class_name: 'Enterprise', optional: false, touch: true
has_one :image, class_name: "Spree::Image", as: :viewable, dependent: :destroy
has_many :product_properties, dependent: :destroy
@@ -45,7 +40,6 @@ module Spree
has_many :prices, -> { order('spree_variants.id, currency') }, through: :variants
has_many :stock_items, through: :variants
has_many :supplier_properties, through: :supplier, source: :properties
has_many :variant_images, -> { order(:position) }, source: :images,
through: :variants
@@ -68,28 +62,27 @@ module Spree
accepts_nested_attributes_for :image
accepts_nested_attributes_for :product_properties,
allow_destroy: true,
reject_if: lambda { |pp| pp[:property_name].blank? }
reject_if: ->(pp) { pp[:property_name].blank? }
# Transient attributes used temporarily when creating a new product,
# these values are persisted on the product's variant
attr_accessor :price, :display_as, :unit_value, :unit_description, :tax_category_id,
:shipping_category_id, :primary_taxon_id
:shipping_category_id, :primary_taxon_id, :supplier_id
after_create :ensure_standard_variant
after_update :touch_supplier, if: :saved_change_to_primary_taxon_id?
around_destroy :destruction
after_save :update_units
after_touch :touch_supplier
# -- Scopes
scope :with_properties, ->(*property_ids) {
left_outer_joins(:product_properties).
left_outer_joins(:supplier_properties).
where(inherits_properties: true).
where(producer_properties: { property_id: property_ids }).
or(
where(spree_product_properties: { property_id: property_ids })
)
where(spree_product_properties: { property_id: property_ids })
}
scope :with_order_cycles_outer, -> {
scope :with_order_cycles_outer, lambda {
joins("
LEFT OUTER JOIN spree_variants AS o_spree_variants
ON (o_spree_variants.product_id = spree_products.id)").
@@ -111,9 +104,7 @@ module Spree
where(import_date: import_date.all_day))
}
scope :with_order_cycles_inner, -> {
joins(variants: { exchanges: :order_cycle })
}
scope :with_order_cycles_inner, -> { joins(variants: { exchanges: :order_cycle }) }
scope :visible_for, lambda { |enterprise|
joins('
@@ -126,8 +117,9 @@ module Spree
distinct
}
# -- Scopes
scope :in_supplier, lambda { |supplier| where(supplier_id: supplier) }
scope :in_supplier, lambda { |supplier|
distinct.joins(:variants).where(spree_variants: { supplier: })
}
# Products distributed via the given distributor through an OC
scope :in_distributor, lambda { |distributor|
@@ -144,18 +136,6 @@ module Spree
distinct
}
# Products supplied by a given enterprise or distributed via that enterprise through an OC
scope :in_supplier_or_distributor, lambda { |enterprise|
enterprise = enterprise.respond_to?(:id) ? enterprise.id : enterprise.to_i
with_order_cycles_outer.
where("
spree_products.supplier_id = ?
OR (o_exchanges.incoming = ? AND o_exchanges.receiver_id = ?)
", enterprise, false, enterprise).
select('distinct spree_products.*')
}
# Products distributed by the given order cycle
scope :in_order_cycle, lambda { |order_cycle|
with_order_cycles_inner.
@@ -170,27 +150,17 @@ module Spree
where.not(order_cycles: { id: nil })
}
scope :by_producer, -> { joins(:supplier).order('enterprises.name') }
scope :by_name, -> { order('name') }
scope :by_producer, -> { joins(variants: :supplier).order('enterprises.name') }
scope :by_name, -> { order('spree_products.name') }
scope :managed_by, lambda { |user|
if user.has_spree_role?('admin')
where(nil)
else
where(supplier_id: user.enterprises.select("enterprises.id"))
in_supplier(user.enterprises)
end
}
scope :stockable_by, lambda { |enterprise|
return where('1=0') if enterprise.blank?
permitted_producer_ids = EnterpriseRelationship.joins(:parent).permitting(enterprise.id)
.with_permission(:add_to_order_cycle)
.where(enterprises: { is_primary_producer: true })
.pluck(:parent_id)
where(spree_products: { supplier_id: [enterprise.id] | permitted_producer_ids })
}
scope :active, lambda { where(spree_products: { deleted_at: nil }) }
def self.group_by_products_id
@@ -236,7 +206,10 @@ module Spree
ps = product_properties.all
if inherits_properties
ps = OpenFoodNetwork::PropertyMerge.merge(ps, supplier.producer_properties)
# NOTE: Set the supplier as the first variant supplier. If variants have different supplier,
# result might not be correct
supplier = variants.first.supplier
ps = OpenFoodNetwork::PropertyMerge.merge(ps, supplier&.producer_properties || [])
end
ps.
@@ -263,8 +236,6 @@ module Spree
def destruction
transaction do
touch_distributors
ExchangeVariant.
where(exchange_variants: { variant_id: variants.with_deleted.
select(:id) }).destroy_all
@@ -285,6 +256,7 @@ module Spree
variant.tax_category_id = tax_category_id
variant.shipping_category_id = shipping_category_id
variant.primary_taxon_id = primary_taxon_id
variant.supplier_id = supplier_id
variants << variant
end
@@ -292,6 +264,7 @@ module Spree
def variant_unit_with_scale
scale_clean = ActiveSupport::NumberHelper.number_to_rounded(variant_unit_scale,
precision: nil,
significant: false,
strip_insignificant_zeros: true)
[variant_unit, scale_clean].compact_blank.join("_")
end
@@ -304,16 +277,41 @@ module Spree
)
end
# Remove any unsupported HTML.
def description
HtmlSanitizer.sanitize(super)
end
# Remove any unsupported HTML.
def description=(html)
super(HtmlSanitizer.sanitize(html))
end
private
def update_units
return unless saved_change_to_variant_unit? || saved_change_to_variant_unit_name?
variants.each(&:update_units)
variants.each do |v|
if v.persisted?
v.update_units
else
v.assign_units
end
end
end
def touch_distributors
Enterprise.distributing_products(id).each(&:touch)
def touch_supplier
return if variants.empty?
# Assume the product supplier is the supplier of the first variant
# Will breack if product has mutiple variants with different supplier
first_variant = variants.first
# The variant is invalid if no supplier is present, but this method can be triggered when
# importing product. In this scenario the variant has not been updated with the supplier yet
# hence the check.
first_variant.supplier.touch if first_variant.supplier.present?
end
def validate_image

View File

@@ -6,6 +6,8 @@ module Spree
has_many :products, through: :product_properties
has_many :producer_properties, dependent: :destroy
after_touch :touch_producer_properties
validates :name, :presentation, presence: true
scope :sorted, -> { order(:name) }
@@ -13,5 +15,11 @@ module Spree
def property
self
end
private
def touch_producer_properties
producer_properties.each(&:touch)
end
end
end

View File

@@ -31,7 +31,7 @@ module Spree
return [] if order.distributor && !order.distributor.charges_sales_tax
return [] unless order.tax_zone
all.includes(zone: { zone_members: :zoneable }).load.select do |rate|
includes(zone: { zone_members: :zoneable }).load.select do |rate|
rate.potentially_applicable?(order.tax_zone)
end
end

View File

@@ -57,7 +57,7 @@ module Spree
taxons = {}
Spree::Taxon.
joins(products: :supplier).
joins(variants: :supplier).
select('spree_taxons.*, enterprises.id AS enterprise_id').
each do |t|
taxons[t.enterprise_id.to_i] ||= Set.new

View File

@@ -96,7 +96,7 @@ module Spree
end
def build_enterprise_roles
Enterprise.all.find_each do |enterprise|
Enterprise.find_each do |enterprise|
unless enterprise_roles.find_by enterprise_id: enterprise.id
enterprise_roles.build(enterprise:)
end
@@ -156,6 +156,12 @@ module Spree
self.disabled_at = value == '1' ? Time.zone.now : nil
end
def affiliate_enterprises
return [] unless Flipper.enabled?(:affiliate_sales_data, self)
Enterprise.joins(:connected_apps).merge(ConnectedApps::AffiliateSalesData.ready)
end
protected
def password_required?

View File

@@ -13,8 +13,8 @@ module Spree
acts_as_paranoid
searchable_attributes :sku, :display_as, :display_name, :primary_taxon_id
searchable_associations :product, :default_price, :primary_taxon
searchable_attributes :sku, :display_as, :display_name, :primary_taxon_id, :supplier_id
searchable_associations :product, :default_price, :primary_taxon, :supplier
searchable_scopes :active, :deleted
NAME_FIELDS = ["display_name", "display_as", "weight", "unit_value", "unit_description"].freeze
@@ -23,12 +23,15 @@ module Spree
meta_keywords
variants_display_as
variants_display_name
supplier_name).join('_or_')}_cont".freeze
variants_supplier_name).join('_or_')}_cont".freeze
belongs_to :product, -> { with_deleted }, touch: true, class_name: 'Spree::Product'
belongs_to :product, -> {
with_deleted
}, touch: true, class_name: 'Spree::Product', optional: false
belongs_to :tax_category, class_name: 'Spree::TaxCategory'
belongs_to :shipping_category, class_name: 'Spree::ShippingCategory', optional: false
belongs_to :primary_taxon, class_name: 'Spree::Taxon', touch: true, optional: false
belongs_to :supplier, class_name: 'Enterprise', optional: false, touch: true
delegate :name, :name=, :description, :description=, :meta_keywords, to: :product
@@ -49,7 +52,7 @@ module Spree
has_many :prices,
class_name: 'Spree::Price',
dependent: :destroy
delegate :display_price, :display_amount, :price, :price_changed?, :price=,
delegate :display_price, :display_amount, :price, :price=,
:currency, :currency=,
to: :find_or_build_default_price
@@ -58,6 +61,7 @@ module Spree
has_many :variant_overrides, dependent: :destroy
has_many :inventory_items, dependent: :destroy
has_many :semantic_links, dependent: :delete_all
has_many :supplier_properties, through: :supplier, source: :properties
localize_number :price, :weight
@@ -65,7 +69,7 @@ module Spree
validate :check_currency
validates :price, numericality: { greater_than_or_equal_to: 0 }, presence: true
validates :tax_category, presence: true,
if: proc { Spree::Config[:products_require_tax_category] }
if: proc { Spree::Config.products_require_tax_category }
validates :unit_value, presence: true, if: ->(variant) {
%w(weight volume).include?(variant.product&.variant_unit)
@@ -83,7 +87,6 @@ module Spree
before_validation :ensure_unit_value
before_validation :update_weight_from_unit_value, if: ->(v) { v.product.present? }
before_validation :convert_variant_weight_to_decimal
before_validation :assign_related_taxon, if: ->(v) { v.primary_taxon.blank? }
before_save :assign_units, if: ->(variant) {
variant.new_record? || variant.changed_attributes.keys.intersection(NAME_FIELDS).any?
@@ -94,7 +97,7 @@ module Spree
after_save :save_default_price
# default variant scope only lists non-deleted variants
scope :deleted, lambda { where.not(deleted_at: nil) }
scope :deleted, -> { where.not(deleted_at: nil) }
scope :with_order_cycles_inner, -> { joins(exchanges: :order_cycle) }
@@ -139,11 +142,9 @@ module Spree
.where("o_inventory_items.id IS NULL OR o_inventory_items.visible = (?)", true)
}
scope :stockable_by, lambda { |enterprise|
return where("1=0") if enterprise.blank?
joins(:product).
where(spree_products: { id: Spree::Product.stockable_by(enterprise).pluck(:id) })
scope :with_properties, lambda { |property_ids|
left_outer_joins(:supplier_properties).
where(producer_properties: { property_id: property_ids })
}
# Define sope as class method to allow chaining with other scopes filtering id.
@@ -199,6 +200,11 @@ module Spree
price_in(currency).try(:amount)
end
def changed?
# We consider the variant changed if associated price is changed (it is saved after_save)
super || default_price.changed?
end
# can_supply? is implemented in VariantStock
def in_stock?(quantity = 1)
can_supply?(quantity)
@@ -210,10 +216,6 @@ module Spree
private
def assign_related_taxon
self.primary_taxon ||= product.variants.last&.primary_taxon
end
def check_currency
return unless currency.nil?
@@ -233,7 +235,7 @@ module Spree
end
def create_stock_items
StockLocation.all.find_each do |stock_location|
StockLocation.find_each do |stock_location|
stock_location.propagate_variant(self)
end
end
@@ -245,8 +247,16 @@ module Spree
end
def destruction
exchange_variants.reload.destroy_all
yield
transaction do
# Even tough Enterprise will touch associated variant distributors when touched,
# the variant will be removed from the exchange by the time it's triggered,
# so it won't be able to find the deleted variant's distributors.
# This why we do it here
touch_distributors
exchange_variants.reload.destroy_all
yield
end
end
def ensure_unit_value
@@ -263,5 +273,9 @@ module Spree
def convert_variant_weight_to_decimal
self.weight = weight.to_d
end
def touch_distributors
Enterprise.distributing_variants(id).each(&:touch)
end
end
end

View File

@@ -52,11 +52,14 @@ class VariantOverride < ApplicationRecord
return
end
# rubocop:disable Rails/SkipsModelValidations
# Cf. conversation https://github.com/openfoodfoundation/openfoodnetwork/pull/12647
if quantity > 0
increment! :count_on_hand, quantity
elsif quantity < 0
decrement! :count_on_hand, -quantity
end
# rubocop:enable Rails/SkipsModelValidations
end
def default_stock?

View File

@@ -31,16 +31,18 @@ class ProductScopeQuery
product_scope.find(@params[:product_id])
end
def paged_products_for_producers
def products_for_producers
producer_ids = OpenFoodNetwork::Permissions.new(@user).
variant_override_producers.by_name.select('enterprises.id')
# Use `order("enterprises.name")` instead of `by_producer scope`, the scope adds a join
# on variants which messes our query
Spree::Product.where(nil).
merge(product_scope).
includes(variants: [:product, :default_price, :stock_items]).
where(supplier_id: producer_ids).
by_producer.by_name.
ransack(@params[:q]).result
includes(variants: [:product, :default_price, :stock_items, :supplier]).
where(variants: { supplier_id: producer_ids }).
order("enterprises.name, spree_products.name").
ransack(@params[:q]).result(distinct: true)
end
def product_scope

View File

@@ -33,23 +33,16 @@ module Admin
end
def bulk_invoice(params)
visible_orders = editable_orders.invoiceable.where(id: params[:bulk_ids])
visible_orders = bulk_load_orders(params)
if Spree::Config.enterprise_number_required_on_invoices?
distributors_without_abn = Enterprise.where(
id: visible_orders.select(:distributor_id),
abn: nil,
)
return if notify_if_abn_related_issue(visible_orders)
if distributors_without_abn.exists?
render_business_number_required_error(distributors_without_abn)
return
end
end
file_id = "#{Time.zone.now.to_i}-#{SecureRandom.hex(2)}"
cable_ready.append(
selector: "#orders-index",
html: render(partial: "spree/admin/orders/bulk/invoice_modal")
html: render(partial: "spree/admin/orders/bulk/invoice_modal",
locals: { invoice_url: "/admin/orders/invoices/#{file_id}" })
).broadcast
# Preserve order of bulk_ids.
@@ -59,7 +52,7 @@ module Admin
BulkInvoiceJob.perform_later(
visible_order_ids,
"tmp/invoices/#{Time.zone.now.to_i}-#{SecureRandom.hex(2)}.pdf",
"tmp/invoices/#{file_id}.pdf",
channel: SessionChannel.for_request(request),
current_user_id: current_user.id
)
@@ -134,5 +127,35 @@ module Admin
enterprise_name: distributor_names.join(", "))
morph_admin_flashes
end
def bulk_load_orders(params)
editable_orders.invoiceable.where(id: params[:bulk_ids])
end
def notify_if_abn_related_issue(orders)
return false unless abn_required?
distributors = distributors_without_abn(orders)
return false if distributors.empty?
render_business_number_required_error(distributors)
true
end
def abn_required?
Spree::Config.enterprise_number_required_on_invoices?
end
def distributors_without_abn(orders)
abn = if OpenFoodNetwork::FeatureToggle.enabled?(:invoices)
[nil, ""]
else
[nil]
end
Enterprise.where(
id: orders.select(:distributor_id),
abn:,
)
end
end
end

View File

@@ -1,213 +0,0 @@
# frozen_string_literal: true
class ProductsReflex < ApplicationReflex
include Pagy::Backend
before_reflex :init_filters_params, :init_pagination_params
def change_per_page
@per_page = element.value.to_i
@page = 1
fetch_and_render_products_with_flash
end
def clear_search
@search_term = nil
@producer_id = nil
@category_id = nil
@page = 1
fetch_and_render_products_with_flash
end
def delete_product
id = current_id_from_element(element)
product = product_finder(id).find_product
authorize! :delete, product
if product.destroy
flash[:success] = I18n.t('admin.products_v3.delete_product.success')
else
flash[:error] = I18n.t('admin.products_v3.delete_product.error')
end
fetch_and_render_products_with_flash
end
def delete_variant
id = current_id_from_element(element)
variant = Spree::Variant.active.find(id)
authorize! :delete, variant
if VariantDeleter.new.delete(variant)
flash[:success] = I18n.t('admin.products_v3.delete_variant.success')
else
flash[:error] = I18n.t('admin.products_v3.delete_variant.error')
end
fetch_and_render_products_with_flash
end
private
def init_filters_params
# params comes from the form
# _params comes from the url
# priority is given to params from the form (if present) over url params
@search_term = params[:search_term] || params[:_search_term]
@producer_id = params[:producer_id] || params[:_producer_id]
@category_id = params[:category_id] || params[:_category_id]
end
def init_pagination_params
# prority is given to element dataset (if present) over url params
@page = element.dataset.page || params[:_page] || 1
@per_page = element.dataset.perpage || params[:_per_page] || 15
end
def fetch_and_render_products_with_flash
fetch_products
render_products
end
def render_products
cable_ready.replace(
selector: "#products-content",
html: render(partial: "admin/products_v3/content",
locals: { products: @products, pagy: @pagy, search_term: @search_term,
producer_options: producers, producer_id: @producer_id,
category_options: categories, tax_category_options:,
category_id: @category_id, flashes: flash })
)
cable_ready.replace_state(
url: current_url,
)
morph :nothing
end
def render_products_form_with_flash
locals = { products: @products }
locals[:error_counts] = @error_counts if @error_counts.present?
locals[:flashes] = flash if flash.any?
cable_ready.replace(
selector: "#products-form",
html: render(partial: "admin/products_v3/table", locals:)
)
morph :nothing
# dunno why this doesn't work. The HTML stops after the first `<col>` element, wtf?!
# morph "#products-form", render(partial: "admin/products_v3/table", locals:)
end
def producers
producers = OpenFoodNetwork::Permissions.new(current_user)
.managed_product_enterprises.is_primary_producer.by_name
producers.map { |p| [p.name, p.id] }
end
def categories
Spree::Taxon.order(:name).map { |c| [c.name, c.id] }
end
def tax_category_options
Spree::TaxCategory.order(:name).pluck(:name, :id)
end
def fetch_products
product_query = OpenFoodNetwork::Permissions.new(current_user)
.editable_products.merge(product_scope).ransack(ransack_query).result(distinct: true)
@pagy, @products = pagy(product_query.order(:name), items: @per_page, page: @page,
size: [1, 2, 2, 1])
end
def product_scope
scope = if current_user.has_spree_role?("admin") || current_user.enterprises.present?
Spree::Product
else
Spree::Product.active
end
scope.includes(product_query_includes)
end
def ransack_query
query = {}
query.merge!(supplier_id_in: @producer_id) if @producer_id.present?
if @search_term.present?
query.merge!(Spree::Variant::SEARCH_KEY => @search_term)
end
query.merge!(variants_primary_taxon_id_in: @category_id) if @category_id.present?
query
end
# Optimise by pre-loading required columns
def product_query_includes
# TODO: add other fields used in columns? (eg supplier: [:name])
[
# variants: [
# :default_price,
# :stock_locations,
# :stock_items,
# :variant_overrides
# ]
]
end
def current_url
url = URI(request.original_url)
url.query = url.query.present? ? "#{url.query}&" : ""
# add params with _ to avoid conflicts with params from the form
url.query += "_page=#{@page}"
url.query += "&_per_page=#{@per_page}"
url.query += "&_search_term=#{@search_term}" if @search_term.present?
url.query += "&_producer_id=#{@producer_id}" if @producer_id.present?
url.query += "&_category_id=#{@category_id}" if @category_id.present?
url.to_s
end
# Similar to spree/admin/products_controller
def product_set_from_params
# Form field names:
# '[products][0][id]' (hidden field)
# '[products][0][name]'
# '[products][0][variants_attributes][0][id]' (hidden field)
# '[products][0][variants_attributes][0][display_name]'
#
# Resulting in params:
# "products" => {
# "0" => {
# "id" => "123"
# "name" => "Pommes",
# "variants_attributes" => {
# "0" => {
# "id" => "1234",
# "display_name" => "Large box",
# }
# }
# }
collection_hash = products_bulk_params[:products]
.transform_values { |product|
# Convert variants_attributes form hash to an array if present
product[:variants_attributes] &&= product[:variants_attributes].values
product
}.with_indifferent_access
Sets::ProductSet.new(collection_attributes: collection_hash)
end
def products_bulk_params
params.permit(products: ::PermittedAttributes::Product.attributes)
.to_h.with_indifferent_access
end
def product_finder(id)
ProductScopeQuery.new(current_user, { id: })
end
def current_id_from_element(element)
element.dataset.current_id
end
end

View File

@@ -7,7 +7,7 @@ module Api
attributes :name, :supplier_name, :image_url, :variants
def supplier_name
object.supplier&.name
object.variants.first.supplier&.name
end
def image_url

View File

@@ -9,7 +9,7 @@ module Api
has_one :order, serializer: Api::Admin::IdSerializer
def supplier
{ id: object.product.supplier_id }
{ id: object.supplier.id }
end
def units_product

View File

@@ -7,8 +7,6 @@ module Api
:inherits_properties, :on_hand, :price, :import_date, :image_url,
:thumb_url, :variants
has_one :supplier, key: :producer_id, embed: :id
def variants
ActiveModel::ArraySerializer.new(
object.variants,

View File

@@ -3,13 +3,9 @@
module Api
module Admin
class ProductSimpleSerializer < ActiveModel::Serializer
attributes :id, :name, :producer_id
attributes :id, :name
has_many :variants, key: :variants, serializer: Api::Admin::VariantSimpleSerializer
def producer_id
object.supplier_id
end
end
end
end

View File

@@ -9,6 +9,7 @@ module Api
:price, :on_demand, :on_hand, :in_stock, :stock_location_id, :stock_location_name
has_one :primary_taxon, key: :category_id, embed: :id
has_one :supplier, key: :producer_id, embed: :id
def name
if object.full_name.present?
@@ -31,7 +32,7 @@ module Api
end
def producer_name
object.product.supplier.name
object.supplier.name
end
def image

View File

@@ -6,7 +6,7 @@ module Api
attributes :id, :name, :import_date,
:options_text, :unit_value, :unit_description, :unit_to_display,
:display_as, :display_name, :name_to_display,
:price, :on_demand, :on_hand
:price, :on_demand, :on_hand, :producer_id
has_many :variant_overrides
@@ -27,6 +27,10 @@ module Api
def price
object.price.nil? ? 0.to_f : object.price
end
def producer_id
object.supplier_id
end
end
end
end

View File

@@ -131,7 +131,7 @@ module Api
producer_shop: "map_003-producer-shop.svg",
producer: "map_001-producer-only.svg",
}
"/map_icons/" + (icons[enterprise.category] || "map_001-producer-only.svg")
"/map_icons/#{icons[enterprise.category] || 'map_001-producer-only.svg'}"
end
# Choose regular icon font for enterprises.

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