Compare commits

...

247 Commits

Author SHA1 Message Date
Maikel Linke
b35f9551eb Update translations 2023-01-27 17:12:37 +11:00
Maikel
4193cdb9f1 Merge pull request #10320 from dacook/remove-ie-warning
Remove unnecessary IE warning
2023-01-27 17:02:53 +11:00
David Cook
57678b7566 Remove IE warning
It brings me great pleasure to remove this. I've been waiting my whole career: IE is finally gone!!
2023-01-27 12:45:46 +11:00
Maikel
ee5f255fc9 Merge pull request #10326 from openfoodfoundation/dependabot/bundler/bootsnap-1.16.0
Bump bootsnap from 1.15.0 to 1.16.0
2023-01-27 12:10:52 +11:00
Maikel
408c2f7a04 Merge pull request #10325 from openfoodfoundation/dependabot/bundler/rubocop-1.44.1
Bump rubocop from 1.44.0 to 1.44.1
2023-01-27 11:59:21 +11:00
Filipe
1cfc13e66f Merge pull request #10208 from jibees/9424-calculator-provide-a-calculator-none
Admin: Include a "None" option for calculator type user in shipping method and payment method forms
2023-01-26 14:48:41 +00:00
dependabot[bot]
110c594353 Bump rubocop from 1.44.0 to 1.44.1
Bumps [rubocop](https://github.com/rubocop/rubocop) from 1.44.0 to 1.44.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.44.0...v1.44.1)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-01-26 14:31:42 +00:00
dependabot[bot]
1748274e72 Bump bootsnap from 1.15.0 to 1.16.0
Bumps [bootsnap](https://github.com/Shopify/bootsnap) from 1.15.0 to 1.16.0.
- [Release notes](https://github.com/Shopify/bootsnap/releases)
- [Changelog](https://github.com/Shopify/bootsnap/blob/main/CHANGELOG.md)
- [Commits](https://github.com/Shopify/bootsnap/compare/v1.15.0...v1.16.0)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-01-26 14:31:00 +00:00
Filipe
e6863f83fc Merge pull request #10328 from jibees/10327-flaky-specsystemconsumersplit_checkout_specrb486
SplitCheckout, Specs: fix errors count when submitting form with errors
2023-01-26 14:27:03 +00:00
jibees
e48ba1b5fa Specify assertions by grouping them into page section
Co-Authored-By: Filipe <49817236+filipefurtad0@users.noreply.github.com>
2023-01-26 15:06:00 +01:00
Jean-Baptiste Bellet
999440da0a Fix errors count when user submit the form
Since https://github.com/openfoodfoundation/openfoodnetwork/pull/10317 we are displaying the error message also in the flash message. For unknown reason, build didn't fail for that PR, but, as the PR adds some error message, we need to change the spec to reflect that change.

This PR separates error in checkout page itself, and errors in flash message banner.
2023-01-26 11:05:55 +01:00
Filipe
1ea7304549 Merge pull request #10276 from jibees/10250-split-checkout-responsiveness-is-broken-on-iphone
Split Checkout, increase input to 16px for small devices and iOS devices
2023-01-25 17:32:10 +00:00
Filipe
ad4670705e Merge pull request #10245 from jibees/10222-in-bom-dont-show-group-buy-info-if-equal-to-0
Admin, BOM: Don't display "group by size" if group by product value is actually null
2023-01-25 15:29:05 +00:00
Filipe
5e4afb765b Merge pull request #10307 from rioug/10271-add-mandatory-asterisk-in-business-detail
Add required asterisk in business details panel
2023-01-25 13:23:39 +00:00
Filipe
d2d9e318fc Merge pull request #10310 from openfoodfoundation/dependabot/bundler/sidekiq-scheduler-5.0.0
Bump sidekiq-scheduler from 4.0.3 to 5.0.0
2023-01-25 12:42:16 +00:00
Filipe
a2a1d8b7e2 Merge pull request #10264 from dacook/readonly-mail-settings
Update mail settings notice
2023-01-25 12:25:05 +00:00
Filipe
65d8337d3d Merge pull request #10319 from mkllnk/show-flash-until-closed-by-user
Show new flash messages until discarded by user
2023-01-25 12:19:45 +00:00
Filipe
7f3cf743f7 Merge pull request #10317 from mkllnk/9056-stuck-in-split-checkout
Display checkout error messages to user for convencience
2023-01-25 12:15:36 +00:00
Rachel Arnould
27e8d89325 Merge pull request #10313 from jibees/split-checkout-do-not-display-payment-method-instruction-if-empty
SplitCheckout: On step3, do not display payment method description if not present
2023-01-25 11:43:19 +01:00
Maikel Linke
882d7a1215 Simplify method according to style rules 2023-01-25 15:49:44 +11:00
Maikel Linke
cec9d2987e Name order attributes similar to other text
Rails' auto-generated names used in error messages were a bit cryptic
for users.
2023-01-25 15:49:44 +11:00
Maikel Linke
2bba38134e Show new flash messages until discarded by user
We currently have two mechanisms to display flash messages. The old one
through AngularJS and the new one with StimulusReflex.

The AngularJS directive showed flashes for 10 seconds. The
StimulusReflex controller showed them only for 3 seconds. But any time
based disappearance of error messages is problematic. There's important
information in there and some error messages can be long. It's also
possible that a request takes a while, the user leaves the computer and
comes back later. If we hide the flash automatically then the user may
have no idea what went wrong. They may even think that everything is
fine and their order went through.

I removed the time-based removal of flash messages from the new
StimulusReflex controller to address this problem. But I didn't touch
the AngularJS directive because it will be removed anyway. There may
also be many more messages that could be annoying if they didn't
disappear, for example a simple "login successful".

I personally think that flash messages that are not important to keep,
don't need to be shown in the first place. The best UX makes the success
obvious on the page. And success should be assumed.
2023-01-25 15:33:17 +11:00
Maikel Linke
ab7e1ac39f Display error messages to user for convencience
It will also help us to debug the application if the error is not
obvious.
2023-01-25 14:50:28 +11:00
Maikel Linke
0782447863 Drop superflous js flag from system spec 2023-01-25 14:50:28 +11:00
Maikel
1a71e55029 Merge pull request #10316 from openfoodfoundation/dependabot/npm_and_yarn/ua-parser-js-0.7.33
Bump ua-parser-js from 0.7.30 to 0.7.33
2023-01-25 14:42:03 +11:00
Jean-Baptiste Bellet
f082dfdb79 Move scheduler options to scheduler key in the sidekiq.yml
As requested by https://github.com/sidekiq-scheduler/sidekiq-scheduler/blob/v5.0.0.beta1/CHANGELOG.md#500beta1 and https://github.com/sidekiq-scheduler/sidekiq-scheduler/pull/412

```
[BREAKING CHANGE] Moves all sidekiq-scheduler config options under the scheduler key in the sidekiq.yml file #412

If you're migrating from v4 to v5, any sidekiq-scheduler config you may have in your sidekiq.yml should be moved under the scheduler key.
See #412 to see which are the config options that you need to move under the scheduler key.
```
2023-01-25 10:43:44 +11:00
dependabot[bot]
10060be300 Bump ua-parser-js from 0.7.30 to 0.7.33
Bumps [ua-parser-js](https://github.com/faisalman/ua-parser-js) from 0.7.30 to 0.7.33.
- [Release notes](https://github.com/faisalman/ua-parser-js/releases)
- [Changelog](https://github.com/faisalman/ua-parser-js/blob/master/changelog.md)
- [Commits](https://github.com/faisalman/ua-parser-js/compare/0.7.30...0.7.33)

---
updated-dependencies:
- dependency-name: ua-parser-js
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-01-24 23:05:42 +00:00
David Cook
6424b37e70 Merge pull request #10314 from jibees/upgrade-Brakeman-version
Upgrade brakeman to its latest version
2023-01-25 10:03:30 +11:00
Jean-Baptiste Bellet
ada164d29b Upgrade brakeman to its latest version 2023-01-24 16:23:15 +01:00
Gaetan Craig-Riou
8194ae1eae Add required asterisk in business details panel 2023-01-24 15:24:14 +01:00
Jean-Baptiste Bellet
64b7ccc2ba Do not display payment method description if not present
This avoid an empty section with `Instructions` title empty
2023-01-24 15:06:46 +01:00
Jean-Baptiste Bellet
3e8ec039f7 Increase input to 16px for small devices and iOS devices
This avoid that "zoom on input focus" on iOS devices
2023-01-24 12:05:09 +01:00
Filipe
f917027cb1 Merge pull request #10249 from jibees/10228-split-checkout-error-422-on-step-2-payment-update-highlighted-fields
SplitCheckout: Fix an issue that was sending unintentionally bad params for payment
2023-01-24 10:31:49 +00:00
jibees
5d7ab0973a Merge pull request #10311 from openfoodfoundation/dependabot/bundler/rubocop-1.44.0
Bump rubocop from 1.43.0 to 1.44.0
2023-01-24 10:45:18 +01:00
dependabot[bot]
ee07b81cd6 Bump rubocop from 1.43.0 to 1.44.0
Bumps [rubocop](https://github.com/rubocop/rubocop) from 1.43.0 to 1.44.0.
- [Release notes](https://github.com/rubocop/rubocop/releases)
- [Changelog](https://github.com/rubocop/rubocop/blob/master/CHANGELOG.md)
- [Commits](https://github.com/rubocop/rubocop/compare/v1.43.0...v1.44.0)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-01-24 09:06:15 +00:00
dependabot[bot]
04e7b3b617 Bump sidekiq-scheduler from 4.0.3 to 5.0.0
Bumps [sidekiq-scheduler](https://github.com/moove-it/sidekiq-scheduler) from 4.0.3 to 5.0.0.
- [Release notes](https://github.com/moove-it/sidekiq-scheduler/releases)
- [Changelog](https://github.com/sidekiq-scheduler/sidekiq-scheduler/blob/master/CHANGELOG.md)
- [Commits](https://github.com/moove-it/sidekiq-scheduler/compare/v4.0.3...v5.0.0)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-01-24 09:01:21 +00:00
Maikel
2fc935e99c Merge pull request #10167 from openfoodfoundation/dependabot/bundler/ddtrace-1.8.0
Bump ddtrace from 0.54.1 to 1.8.0
2023-01-24 14:53:12 +11:00
Maikel
00d9c2836d Merge pull request #10309 from mkllnk/flaky-serializer-spec
Parse JSON to test ids separately and avoid flakiness
2023-01-24 14:32:20 +11:00
Maikel Linke
79887c0b44 Clarify array intend of array operation in spec 2023-01-24 14:17:46 +11:00
Maikel Linke
5b6a855dfe Clarify test result structure 2023-01-24 13:39:48 +11:00
Maikel Linke
d18d0ef6b1 Parse JSON to test variant and distributor ids
We looked at the whole JSON string before and sometimes a distributor id
would match a variant id which made the test flaky.
2023-01-24 11:51:44 +11:00
Maikel Linke
d37fa9fc5f Simplify spec structure without defining modules
Specs should test classes and modules independently and they should not
be in the same module. It also avoids indentation and accidental
namespace polution.
2023-01-24 11:41:06 +11:00
Filipe
7b14afbabe Merge pull request #10294 from abdellani/fix_invoice_print_spec
fix the pending invoice print spec
2023-01-23 19:06:36 +00:00
Filipe
bc788b6d60 Merge pull request #10243 from jibees/10242-change-how-orders-are-loaded-in-bom-+-filters
Admin, BOM: add pagination, remove date range filtering on first load
2023-01-23 17:48:05 +00:00
Jean-Baptiste Bellet
3247c32191 Be consistant and use data-paymentmethod-id attribute
as already used on other element
2023-01-23 17:48:54 +01:00
Jean-Baptiste Bellet
251ab2ac9a Payment method id attribute don't need to start with paymentmethod 2023-01-23 17:46:26 +01:00
jibees
dafe4b599f Merge pull request #10303 from mkllnk/webpacker-ignores-tmp-files
Ignore vi .swp files when webpack dev reloads page
2023-01-23 17:12:29 +01:00
Filipe
d7c99a9d8b Merge pull request #10275 from filipefurtad0/update_orders_spec
Updates system spec for orders page
2023-01-23 16:00:38 +00:00
Rachel Arnould
53fb906861 Merge pull request #10254 from jibees/10246-split-checkout-order-summary-page-design-changes
Split checkout: order summary page design changes
2023-01-23 15:52:06 +01:00
filipefurtad0
fa96f7339d Replaces URL with routing syntax 2023-01-23 11:35:53 +00:00
Sigmund Petersen
78bbb08666 Merge pull request #10301 from openfoodfoundation/update-getting-started
Docs: Suggest using SSH instead of HTTPS for cloning
2023-01-23 08:36:17 +01:00
Sigmund Petersen
e260112eb8 Merge pull request #10296 from filipefurtad0/add_no_sandbox_to_cuprite_settings
Sets no-sandbox option, for CI env.; increases timeout values
2023-01-23 08:34:09 +01:00
Maikel Linke
a91ece8f3b Replace outdated datadog config syntax 2023-01-23 16:40:36 +11:00
Jean-Baptiste Bellet
6327370401 Update datadog settings from 0.x to 1.x
Reference: https://github.com/DataDog/dd-trace-rb/blob/master/docs/UpgradeGuide.md#settings-have-been-renamed
2023-01-23 16:25:03 +11:00
Maikel Linke
b91b85febc Ignore vi .swp files when webpack dev reloads page
The webpack dev server watches assets and reloads the page when files
change on disk. I'm adding vi's temporary files to the ignore list.
2023-01-23 14:42:08 +11:00
Mohamed ABDELLANI
f4a5130cb5 remove pending from tests 2023-01-21 08:35:12 +01:00
Mohamed ABDELLANI
8823b2ac89 add display_line_items_taxes to expected message in invoice view spec 2023-01-21 08:35:01 +01:00
Mohamed ABDELLANI
9bff2718c7 implement display_line_items_taxes to render included & added tax 2023-01-21 08:16:05 +01:00
filipefurtad0
7dc14cc35a Adds coverage for bulk pdf generation
and order cancelling
2023-01-20 18:31:33 +00:00
Mohamed ABDELLANI
a4f388336a remove duplicated test 2023-01-20 18:00:04 +01:00
Jean-Baptiste Bellet
370e476fc5 has:() relational pseudo class is not available for firefox
cf. https://caniuse.com/css-has

So be more generic, as the only `checkout-input` is for that checkbox for T&Cs
2023-01-20 15:37:52 +01:00
filipefurtad0
8bfb17144c Filters by order state 2023-01-20 13:56:40 +00:00
filipefurtad0
f984cd89c2 Filters by invoice number 2023-01-20 13:14:23 +00:00
filipefurtad0
336210b898 Tests shipping methods filtering 2023-01-20 13:10:18 +00:00
filipefurtad0
9323394eb7 Adds CI condition browser_options; sets timeouts to 60 2023-01-20 11:13:31 +00:00
jibees
895fc94a75 Merge pull request #10295 from openfoodfoundation/dependabot/bundler/aws-sdk-s3-1.118.0
Bump aws-sdk-s3 from 1.117.2 to 1.118.0
2023-01-20 11:43:14 +01:00
jibees
aa725ec8a4 Merge pull request #10299 from openfoodfoundation/dependabot/bundler/globalid-1.0.1
Bump globalid from 1.0.0 to 1.0.1
2023-01-20 11:37:20 +01:00
Sigmund Petersen
f921bbfe45 Merge pull request #10288 from openfoodfoundation/dependabot/bundler/rack-2.2.6.2
Bump rack from 2.2.4 to 2.2.6.2
2023-01-20 11:31:49 +01:00
Jean-Baptiste Bellet
f8b8e79725 Specify a bit when T&Cs label is longer that summary width
and therefore on two lines
2023-01-20 11:20:35 +01:00
Jean-Baptiste Bellet
b559171d0e Put order summary footer into its own file _totals_footer.html.haml 2023-01-20 11:20:35 +01:00
Jean-Baptiste Bellet
3e7e0e4d81 Instead of adding inline style, create a CSS rule 2023-01-20 11:20:35 +01:00
Jean-Baptiste Bellet
c5d94d372f Remove unnecessary within block 2023-01-20 11:20:35 +01:00
Jean-Baptiste Bellet
c99ec38c85 By default, we reject all adjustements with amount equal to 0 2023-01-20 11:20:35 +01:00
Jean-Baptiste Bellet
37f359542e Remove bold on firstname+lastname 2023-01-20 11:20:35 +01:00
Jean-Baptiste Bellet
21b74386f9 Introduce mobile view for summary step 2023-01-20 11:20:35 +01:00
Jean-Baptiste Bellet
53c701e04c In fact, it seems likely to be strictly less. 2023-01-20 11:20:35 +01:00
Jean-Baptiste Bellet
ef572668d5 Let's keep fees next to the payment or shipping method 2023-01-20 11:20:35 +01:00
Jean-Baptiste Bellet
fa8e36fbeb As this is used in a odd/even table, background needs to be transparent
Otherwise, it's set via `checkout h5`
2023-01-20 11:20:34 +01:00
Jean-Baptiste Bellet
1ea9c15bb8 Put total on the summary box on the right 2023-01-20 11:20:34 +01:00
Jean-Baptiste Bellet
cc838d2c88 Remove sentence 2023-01-20 11:20:34 +01:00
Jean-Baptiste Bellet
99fcbad0f0 On split checkout, do not display footer on order summary
introduced via `display_footer` which is by default `true`
2023-01-20 11:20:34 +01:00
Jean-Baptiste Bellet
52959a913f New step3: two columns, more condensed 2023-01-20 11:20:34 +01:00
David Cook
097bfd953f Suggest using SSH instead of HTTPS for cloning
This basically reverts 3a0c5bf0c3
2023-01-20 14:46:47 +11:00
dependabot[bot]
b9039f4b1f Bump globalid from 1.0.0 to 1.0.1
Bumps [globalid](https://github.com/rails/globalid) from 1.0.0 to 1.0.1.
- [Release notes](https://github.com/rails/globalid/releases)
- [Commits](https://github.com/rails/globalid/compare/v1.0.0...v1.0.1)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-01-19 22:24:49 +00:00
filipefurtad0
f7d4d7595c Filters by customer/billing address first and last names 2023-01-19 16:22:53 +00:00
filipefurtad0
28782775ad adds filter by Email assertion 2023-01-19 16:22:53 +00:00
filipefurtad0
6f35b38fa8 Asserts on the correct display of orders
(for a given distributor)
2023-01-19 16:22:53 +00:00
filipefurtad0
9757ab2a6c Creates customers and enterprise owners (users)
Fixes typo and removes unecessary js: true line
2023-01-19 16:22:53 +00:00
dependabot[bot]
381c4e6146 Bump aws-sdk-s3 from 1.117.2 to 1.118.0
Bumps [aws-sdk-s3](https://github.com/aws/aws-sdk-ruby) from 1.117.2 to 1.118.0.
- [Release notes](https://github.com/aws/aws-sdk-ruby/releases)
- [Changelog](https://github.com/aws/aws-sdk-ruby/blob/version-3/gems/aws-sdk-s3/CHANGELOG.md)
- [Commits](https://github.com/aws/aws-sdk-ruby/commits)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-01-19 09:08:10 +00:00
David Cook
4e7c50e22b Merge pull request #10283 from mkllnk/application-job
Add Rails standard ApplicationJob for consistency
2023-01-19 14:23:22 +11:00
David Cook
9b4538790e Update translations 2023-01-19 13:29:59 +11:00
Maikel Linke
075b8d2585 Add Rails standard ApplicationJob for consistency
New Rails apps come with this class already, the job generator creates
it for every new job and Rubocop requires it as well. Let's make our
lives easier and use the same structure as other Rails projects. This
class may be handy one day.
2023-01-19 13:25:46 +11:00
dependabot[bot]
828c6e5427 Bump rack from 2.2.4 to 2.2.6.2
Bumps [rack](https://github.com/rack/rack) from 2.2.4 to 2.2.6.2.
- [Release notes](https://github.com/rack/rack/releases)
- [Changelog](https://github.com/rack/rack/blob/main/CHANGELOG.md)
- [Commits](https://github.com/rack/rack/compare/2.2.4...v2.2.6.2)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-01-19 00:47:53 +00:00
Filipe
b54f4ef686 Merge pull request #10258 from mkllnk/report-job
Render reports in a separate process (feature-toggled)
2023-01-18 23:47:09 +00:00
Maikel
4a8e3a751d Explain what Process.waitall does
Co-authored-by: David Cook <david@redcliffs.net>
2023-01-18 23:12:26 +00:00
Maikel Linke
6472070517 Configure MiniRacer to allow forking
The spec for forking was hanging. This could be revisited after
upgrading to mini_racer 0.6.1.
2023-01-18 23:12:26 +00:00
Maikel Linke
26402397ea Stop report workers when parent times out
No need to keep running when nobody is collecting the result (yet).
2023-01-18 23:12:26 +00:00
Maikel Linke
b19456535d Isolate report rendering in separate child process
Sidekiq doesn't have any features to limit memory usage or execution
time. We need a separate process for this. Forking avoids the boot time
of a fresh process and copy-on-write ensures minimal memory overheads.
2023-01-18 23:12:26 +00:00
Maikel Linke
a177f4c066 Add feature to render reports in the background
This is supposed to lower the memory footprint of all Puma workers. The
reports code will occupy needed memory in one Sidekiq worker instead of
in several Puma processes.

The current code doesn't limit the execution time yet. We either need a
way to terminate the report rendering after a while or send an email
with a link to access a rendered report.
2023-01-18 23:12:26 +00:00
Maikel Linke
19c4596b9e Untie report from request object
We want simple report arguments to store it as background job.
2023-01-18 23:12:26 +00:00
Maikel Linke
0c769706aa Split method for easier reading 2023-01-18 23:12:26 +00:00
Maikel Linke
65843fbd68 Render on-screen report as HTML in renderer
So it can be treated like any other format.
2023-01-18 23:12:26 +00:00
Jean-Baptiste Bellet
7320a1714c Instead of selecting the controller, send an event handled by stripe-cards
Using a query selector to find controller in order to call method could be dangerous as the DOM can change. Using an event should be more robust.
2023-01-18 17:40:17 +01:00
Jean-Baptiste Bellet
9b4f9314bc Make a proper alignement for filtering options
I used inline style, because:
 - I didn't find any pre-existing CSS for this page
 - I think that flex is self-explaining and I think adding class (for what?) won't add any value
2023-01-18 17:39:42 +01:00
Jean-Baptiste Bellet
455c11c289 Put columns selector component on left, and per_page component on right 2023-01-18 17:39:42 +01:00
Jean-Baptiste Bellet
31dc35c500 Remove that awful double arrow on each select2 component
Already defined via `app/webpacker/css/admin/plugins/select2.scss`
2023-01-18 17:39:42 +01:00
Jean-Baptiste Bellet
35791034cc Remove orders/_per_page_controls and use the shared one 2023-01-18 17:39:42 +01:00
Jean-Baptiste Bellet
1a874d6fcf Introduce pagination for BOM page 2023-01-18 17:39:42 +01:00
Jean-Baptiste Bellet
85a748af99 When selecting an OC, do not pre-fill date range with OC date range
+ update specs as well
2023-01-18 17:39:42 +01:00
Jean-Baptiste Bellet
121a4a08af On filters reseting , set dates to undefined: range is not mandatory
+ send flatpickr event to reset the component

+ update specs as well
2023-01-18 17:39:09 +01:00
Jean-Baptiste Bellet
b75b123cba Don't check date range before refreshing data: they aren't mandatory
- Creates a simple formatDates method that handle date formatting before sending it as params instead of creating scoped variable (useless)
 - Put key to `undefined` (ie. don't then the params) if no date: already handled by the backend
2023-01-18 17:39:09 +01:00
jibees
d2e6b7d164 Merge pull request #10286 from filipefurtad0/comment_flaky_bom_flatpickr_date_selection
Comments out flaky example on BOM spec
2023-01-18 17:37:17 +01:00
filipefurtad0
fd1391cda9 Comments out flaky example on BOM spec 2023-01-18 16:24:31 +00:00
Maikel
54c58c6ba6 Merge pull request #10278 from mkllnk/pg_stat_statements
Enable pg_stat_statements in development like prod
2023-01-18 08:51:25 +11:00
jibees
e04a23cb3c Merge pull request #10277 from mkllnk/spec-cleanup
Remove outdated spec
2023-01-17 10:42:15 +01:00
Maikel Linke
4364b1283b Enable pg_stat_statements in development like prod
We activated this database extension in production via ofn-install. But
this had not been reflected in Rails' schema.rb.

This change avoids inconsistent db/schema.rb files on production servers
and makes development more similar to production.
2023-01-17 15:41:35 +11:00
Maikel Linke
da5fa8f608 Remove outdated spec
It's just testing that we are not using code which has been deleted in
the past. I don't think that there's a risk that we introduce this again
by accident. Right now, this spec just wastes resources.
2023-01-17 15:18:52 +11:00
dependabot[bot]
fd4fb53df1 Bump ddtrace from 0.54.1 to 1.8.0
Bumps [ddtrace](https://github.com/DataDog/dd-trace-rb) from 0.54.1 to 1.8.0.
- [Release notes](https://github.com/DataDog/dd-trace-rb/releases)
- [Changelog](https://github.com/DataDog/dd-trace-rb/blob/master/CHANGELOG.md)
- [Commits](https://github.com/DataDog/dd-trace-rb/compare/v0.54.1...v1.8.0)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-01-17 01:39:59 +00:00
Maikel
3f8ca55975 Merge pull request #10273 from mkllnk/mini_racer
Bump mini_racer from 0.4.0 to 0.6.3
2023-01-17 12:38:41 +11:00
dependabot[bot]
287f0572c2 Merge pull request #10259 from openfoodfoundation/dependabot/bundler/rubocop-1.43.0 2023-01-16 14:59:16 +00:00
Jean-Baptiste Bellet
5a61722f8b + force FlatRate as calculator for payment methods in spec 2023-01-16 09:31:15 +01:00
Jean-Baptiste Bellet
719025f98e Only set calculator if it's a new record (having an id)
Unless we have a ActiveRecord::NotNullViolation
```
     ActiveRecord::NotNullViolation:
       PG::NotNullViolation: ERROR:  null value in column "calculable_id" of relation "spree_calculators" violates not-null constraint
       DETAIL:  Failing row contains (9370, Calculator::None, null, Spree::ShippingMethod, 2023-01-12 15:09:44.381142, 2023-01-12 15:09:44.381142).
     # ------------------
     # --- Caused by: ---
     # PG::NotNullViolation:
     #   ERROR:  null value in column "calculable_id" of relation "spree_calculators" violates not-null constraint
     #   DETAIL:  Failing row contains (9370, Calculator::None, null, Spree::ShippingMethod, 2023-01-12 15:09:44.381142, 2023-01-12 15:09:44.381142).

```
2023-01-16 09:31:15 +01:00
Jean-Baptiste Bellet
a9097df112 Already defined via CalculatedAdjustments 2023-01-16 09:31:15 +01:00
Jean-Baptiste Bellet
7015cb30c3 Calculator 'None' is the default one for both shipping and payment method
+ update specs as well

Update shipping_method.rb
2023-01-16 09:31:15 +01:00
Maikel Linke
ec5077c75b Bump mini_racer from 0.4.0 to 0.6.3
Open mini_racer dependency for updates

I'm hoping that the new version will work with forking code.
2023-01-16 15:22:04 +11:00
Maikel Linke
657fd72f69 Bump bundler from 2.1.4 to 2.4.3
It fixes a problem with installing newer mini_racer versions.
2023-01-16 15:21:12 +11:00
Jean-Baptiste Bellet
eb663af292 Update all locales with the latest Transifex translations 2023-01-13 09:55:18 +01:00
Filipe
5c04d00ff8 Merge pull request #10178 from jibees/9573-split-checkout-typing-checkoutcart-on-the-url-bar-brings-back-legacy-checkout
When `split_checkout` is enabled, redirect to split checkout controller in any cases
2023-01-12 17:05:53 +00:00
dependabot[bot]
fd446970ca Merge pull request #10265 from openfoodfoundation/dependabot/bundler/view_component-2.82.0 2023-01-12 09:46:15 +00:00
dependabot[bot]
be004383a4 Bump view_component from 2.80.0 to 2.82.0
Bumps [view_component](https://github.com/viewcomponent/view_component) from 2.80.0 to 2.82.0.
- [Release notes](https://github.com/viewcomponent/view_component/releases)
- [Changelog](https://github.com/ViewComponent/view_component/blob/main/docs/CHANGELOG.md)
- [Commits](https://github.com/viewcomponent/view_component/compare/v2.80.0...v2.82.0)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-01-12 09:02:24 +00:00
David Cook
702bf1b76e Update mail settings notice
It is confusing how these settings work, hopefully the message makes it clear now.

We could just disable the fields entirely, but it was chosen to allow temporary updates so that instance managers can troubleshoot mail issues (063d44fecc).
2023-01-12 17:40:54 +11:00
Maikel Linke
1e77b96c2c Simplify negated feature toggle constraint 2023-01-11 10:10:30 +00:00
Jean-Baptiste Bellet
b2db63178f Redirect /checkout/whatever to /checkout when split_checkout is activate
+ constraint the legacy checkout routes when `split_checkout` feature is disabled

+ add specs
2023-01-11 10:10:30 +00:00
dependabot[bot]
798f1dfdfa Bump rubocop from 1.42.0 to 1.43.0
Bumps [rubocop](https://github.com/rubocop/rubocop) from 1.42.0 to 1.43.0.
- [Release notes](https://github.com/rubocop/rubocop/releases)
- [Changelog](https://github.com/rubocop/rubocop/blob/master/CHANGELOG.md)
- [Commits](https://github.com/rubocop/rubocop/compare/v1.42.0...v1.43.0)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-01-11 09:02:47 +00:00
David Cook
ee70645d04 Merge pull request #10251 from openfoodfoundation/dependabot/bundler/listen-3.8.0
Bump listen from 3.7.1 to 3.8.0
2023-01-11 13:46:21 +11:00
Konrad
c4b89e466b Merge pull request #9804 from jibees/9420-resend-confirmation-email-in-bulk
Admin, Orders list: Resend confirmation email in bulk
2023-01-11 00:16:57 +01:00
Filipe
57aeee94f9 Merge pull request #10229 from mkllnk/report-paths
Link relative report path instead of absolute URL
2023-01-10 15:35:32 +00:00
Filipe
3a9be42389 Merge pull request #10234 from mkllnk/drop-spree_product_groups
Remove unused Spree database tables
2023-01-10 15:16:52 +00:00
dependabot[bot]
b7930e7d38 Merge pull request #10252 from openfoodfoundation/dependabot/bundler/spring-4.1.1 2023-01-10 09:15:37 +00:00
dependabot[bot]
7c69cc5aa9 Bump listen from 3.7.1 to 3.8.0
Bumps [listen](https://github.com/guard/listen) from 3.7.1 to 3.8.0.
- [Release notes](https://github.com/guard/listen/releases)
- [Commits](https://github.com/guard/listen/compare/v3.7.1...v3.8.0)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-01-10 09:05:05 +00:00
dependabot[bot]
2baa55262b Bump spring from 4.1.0 to 4.1.1
Bumps [spring](https://github.com/rails/spring) from 4.1.0 to 4.1.1.
- [Release notes](https://github.com/rails/spring/releases)
- [Changelog](https://github.com/rails/spring/blob/main/CHANGELOG.md)
- [Commits](https://github.com/rails/spring/compare/v4.1.0...v4.1.1)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-01-10 09:04:31 +00:00
David Cook
2835265a1e Update release template
The release is now posted automatically, thanks to whomever set that up\!
2023-01-10 10:49:39 +11:00
Filipe
bd20a8c16f Merge pull request #10237 from mkllnk/report-rendering
Remove report dependency on report controller
2023-01-09 18:49:19 +00:00
Rachel Arnould
61175c036a Merge pull request #10131 from jibees/10125-change-oc-page-colors
[WIP 🚧 ] `/admin/order_cycles` behind feature toggle `admin_style_v2`
2023-01-06 15:07:41 +01:00
Jean-Baptiste Bellet
2258af9cec Don't display "group by size" if value is actually null or empty
+ add spec
2023-01-06 14:39:39 +01:00
dependabot[bot]
6b3a0fa14a Merge pull request #10244 from openfoodfoundation/dependabot/bundler/bugsnag-6.25.1 2023-01-06 13:14:53 +00:00
Jean-Baptiste Bellet
e403a2c174 Secondary button can actually be disabled 2023-01-06 14:03:40 +01:00
Jean-Baptiste Bellet
5aca76e520 OC, incoming|outgoing products, have the actions inside the table 2023-01-06 14:03:40 +01:00
Jean-Baptiste Bellet
73a2b90e1b On hovering, all the tr should be colored
This needs to be respecified with an `!important` keyword

Even if already defined in `app/webpacker/css/admin/openfoodnetwork.scss`
2023-01-06 14:03:40 +01:00
Jean-Baptiste Bellet
c7d4c4c195 Put action in the flex container for incoming|outgoing products in OC 2023-01-06 14:03:40 +01:00
Jean-Baptiste Bellet
bba1d6c725 Do not specify sizes, let the browser fix the best layout for table 2023-01-06 10:46:01 +01:00
Jean-Baptiste Bellet
52cb6d4eec Put all actions in the same flex container, aligned to right 2023-01-06 10:45:30 +01:00
Jean-Baptiste Bellet
fc6bd53720 Put some specials rules for listing_orders as generics for all tables
- `.actions` is now integrated to the table itself, with the same design
- We have to use `!important` keyword as already defined like this...
2023-01-06 10:33:27 +01:00
dependabot[bot]
650fd69f60 Bump bugsnag from 6.25.0 to 6.25.1
Bumps [bugsnag](https://github.com/bugsnag/bugsnag-ruby) from 6.25.0 to 6.25.1.
- [Release notes](https://github.com/bugsnag/bugsnag-ruby/releases)
- [Changelog](https://github.com/bugsnag/bugsnag-ruby/blob/master/CHANGELOG.md)
- [Commits](https://github.com/bugsnag/bugsnag-ruby/compare/v6.25.0...v6.25.1)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-01-06 09:12:10 +00:00
Maikel Linke
22a086ebc1 Remove report dependency on report controller
The ReportsController was referencing the report and the report was
referencing the controller. It's unlikely that this circular dependency
created a memory leak but it's generally a bad design. And we need to
make the reporting independent of the controller to isolate it in a
background job.
2023-01-05 15:06:41 +11:00
Maikel Linke
446fa2ddab Remove confusing and unused db table
This table came from Spree but has never been used. We soon want to use
the term Product Group and having this table would be confusing.
2023-01-05 15:04:52 +11:00
Maikel Linke
59a565c446 Remove confusing and unused db table
This table came from Spree but has never been used.
2023-01-05 15:04:01 +11:00
Maikel
dc6ac99a3f Merge pull request #10223 from filipefurtad0/sets_pending_on_complex_creating_specific_time_spec
Comments out flaky example with xit
2023-01-05 14:10:11 +11:00
David Cook
5c8c4c36f7 Update all locales with the latest Transifex translations 2023-01-05 13:35:44 +11:00
David Cook
be25ea0b9e Merge pull request #10235 from mkllnk/drop-skrill
Remove unused Spree database table
2023-01-05 13:27:51 +11:00
Maikel Linke
9cba9395e3 Remove unused "skrill" translations 2023-01-05 11:16:12 +11:00
Maikel Linke
cdd39f526d Remove unused Spree database table
I randomly stumbled across this one and couldn't find any use of it. I
think that it refers to an old payment gateway that may have been used
by Spree once upon a time.
2023-01-05 11:05:15 +11:00
Maikel
31f7cadd92 Merge pull request #10217 from openfoodfoundation/dependabot/bundler/puma-6.0.2
Bump puma from 5.6.5 to 6.0.2 // Blocked by ofn-install/pull/855
2023-01-05 10:16:16 +11:00
Jean-Baptiste Bellet
972e0b5d0b Specify color for h4. Same as others titles. 2023-01-04 10:41:30 +01:00
Jean-Baptiste Bellet
927c1c81e5 Border and background for a panel 2023-01-04 10:41:30 +01:00
Jean-Baptiste Bellet
fd87013a63 Colorize and customize tagging componenent 2023-01-04 10:41:30 +01:00
Jean-Baptiste Bellet
274e0d0335 Same color but with variable 2023-01-04 10:41:30 +01:00
Jean-Baptiste Bellet
c5f3d3fa71 Use a darker grey for disabled button 2023-01-04 10:41:30 +01:00
Jean-Baptiste Bellet
26684f7db5 New colors for wizard progress 2023-01-04 10:41:30 +01:00
Jean-Baptiste Bellet
2ccb7de004 Specify cursor: default when button is disabled 2023-01-04 10:41:30 +01:00
Jean-Baptiste Bellet
7c321922ad Actually, this needs to be white since the body is no more white 2023-01-04 10:41:30 +01:00
Jean-Baptiste Bellet
d7e3e81c8c Adjust border color when active 2023-01-04 10:41:30 +01:00
Jean-Baptiste Bellet
d7454ecb9f Adjust border radius when drop is above 2023-01-04 10:41:30 +01:00
Jean-Baptiste Bellet
4c172b5ace Adjust color and height between input type text and select 2023-01-04 10:41:30 +01:00
Jean-Baptiste Bellet
6529a8d98f #clear_all_filters button as a secondary one 2023-01-04 10:41:30 +01:00
Jean-Baptiste Bellet
ccfc632149 Whatever the condition, display the td
And put the `ng-if` inside the `td`, attached to a new `div`
2023-01-04 10:41:30 +01:00
dependabot[bot]
32ec39ad8c Merge pull request #10231 from openfoodfoundation/dependabot/npm_and_yarn/json5-1.0.2 2023-01-04 09:39:08 +00:00
dependabot[bot]
449d500371 Bump json5 from 1.0.1 to 1.0.2
Bumps [json5](https://github.com/json5/json5) from 1.0.1 to 1.0.2.
- [Release notes](https://github.com/json5/json5/releases)
- [Changelog](https://github.com/json5/json5/blob/main/CHANGELOG.md)
- [Commits](https://github.com/json5/json5/compare/v1.0.1...v1.0.2)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-01-04 09:25:17 +00:00
dependabot[bot]
cbb7e52795 Merge pull request #10230 from openfoodfoundation/dependabot/bundler/bullet-7.0.7 2023-01-04 09:24:24 +00:00
dependabot[bot]
1eb1beda3b Bump bullet from 7.0.5 to 7.0.7
Bumps [bullet](https://github.com/flyerhzm/bullet) from 7.0.5 to 7.0.7.
- [Release notes](https://github.com/flyerhzm/bullet/releases)
- [Changelog](https://github.com/flyerhzm/bullet/blob/main/CHANGELOG.md)
- [Commits](https://github.com/flyerhzm/bullet/compare/7.0.5...7.0.7)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-01-04 09:03:38 +00:00
Maikel Linke
da4069679c Link relative report path instead of absolute URL
You can reach a development server under localhost, 127.0.0.1, 0.0.0.0
or other names you define in your environment. The reports were using
absolute links to localhost though and therefore breaking your session
(login) while navigating.

I'm not sure why this was done though. Sebastian didn't explain this in
the commit message and it may have been accidental.
2023-01-04 15:43:12 +11:00
Jean-Baptiste Bellet
b858371735 Be more specific on allowed request origins by adding OFN_URL
+ add same configuration for production
2023-01-03 10:32:11 +01:00
Jean-Baptiste Bellet
992b497b75 Allow request origins
https://guides.rubyonrails.org/action_cable_overview.html#allowed-request-origins
2023-01-03 10:32:11 +01:00
Jean-Baptiste Bellet
53fa2ef8d5 Change order of the Actions menu: resend, print, cancel
It's more close to the Actions menu for a specific order (ie. on page `/admin/orders/[ORDER_ID]/edit`)
2023-01-03 10:32:11 +01:00
Maikel
79f602b4ea Remove unnecessary spec line 2023-01-03 10:32:11 +01:00
Jean-Baptiste Bellet
ab39341192 Add permission management with cancancan 2023-01-03 10:32:11 +01:00
Jean-Baptiste Bellet
edc0c189df Add spec for bulk "Resend email confirmation" action 2023-01-03 10:32:11 +01:00
Jean-Baptiste Bellet
7e844ee289 Implement resend email confirmation bulk action
- Create a controller that send a reflex action with the order_ids array
2023-01-03 10:32:11 +01:00
Jean-Baptiste Bellet
bcc9d447e1 Create a reflex that handle re-send email confirmation to user 2023-01-03 10:32:11 +01:00
Jean-Baptiste Bellet
9997fe26fc Small adjustments to make it usable in admin section 2023-01-03 10:32:11 +01:00
Jean-Baptiste Bellet
519c15a9d5 Create a ConfirmModalComponent
- Inherits from ModalComponent
 - Has a close button
 - Accept `confirm_actions` to trigger reflexes
 - Accept `controller` to encapsulate stimulus reflexe controllers
2023-01-03 10:32:11 +01:00
Jean-Baptiste Bellet
64ca0a4eea Extract open/close/closeIfEscapeKey methods to a mixins
therefore we can compose any controller from it
 - simplify `help-modal-controller` then
 - + create a simple `modal-controller` that close on `modal:close` event
2023-01-03 10:30:25 +01:00
Jean-Baptiste Bellet
2fde3abe37 Extract a StimulusJS modal_controller
+ make `help_modal_link_controller` inherit from it
2023-01-03 10:30:25 +01:00
Jean-Baptiste Bellet
c3805b8187 Create ModalComponent and make HelpModalComponent inherit from it 2023-01-03 10:30:25 +01:00
dependabot[bot]
70b1888d45 Merge pull request #10225 from openfoodfoundation/dependabot/npm_and_yarn/js-big-decimal-1.3.15 2023-01-03 09:27:11 +00:00
dependabot[bot]
f03df26e4e Merge pull request #10224 from openfoodfoundation/dependabot/npm_and_yarn/husky-8.0.3 2023-01-03 09:22:35 +00:00
dependabot[bot]
662ca16aa3 Bump js-big-decimal from 1.3.13 to 1.3.15
Bumps [js-big-decimal](https://github.com/royNiladri/js-big-decimal) from 1.3.13 to 1.3.15.
- [Release notes](https://github.com/royNiladri/js-big-decimal/releases)
- [Commits](https://github.com/royNiladri/js-big-decimal/compare/v1.3.13...v1.3.15)

---
updated-dependencies:
- dependency-name: js-big-decimal
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-01-03 09:01:30 +00:00
dependabot[bot]
07f9379956 Bump husky from 8.0.2 to 8.0.3
Bumps [husky](https://github.com/typicode/husky) from 8.0.2 to 8.0.3.
- [Release notes](https://github.com/typicode/husky/releases)
- [Commits](https://github.com/typicode/husky/compare/v8.0.2...v8.0.3)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-01-03 09:01:14 +00:00
Maikel
f122f4bf50 Merge pull request #10188 from filipefurtad0/error_message_inventory_import
Adds coverage for error message in product and inventory import
2023-01-03 16:28:25 +11:00
Maikel
4a250f41f3 Merge pull request #10168 from filipefurtad0/updates_bom_spec
Updates BOM system spec - prepares for #10123
2023-01-03 15:20:37 +11:00
Maikel
388923e963 Merge pull request #10218 from openfoodfoundation/dependabot/bundler/bullet-7.0.5
Bump bullet from 7.0.4 to 7.0.5
2023-01-03 15:18:27 +11:00
Maikel
235f4bb767 Merge pull request #10219 from openfoodfoundation/dependabot/bundler/rubocop-1.42.0
Bump rubocop from 1.41.1 to 1.42.0
2023-01-03 15:17:58 +11:00
filipefurtad0
3a3fc066dc Comments out flaky example with xit 2023-01-02 19:20:00 +00:00
filipefurtad0
f3ff70a9f2 Updates BOM system spec after changes from #10123 2023-01-02 12:58:22 +00:00
filipefurtad0
5ae6223a8c Updates error messages after #10174 merge 2023-01-02 11:15:26 +00:00
filipefurtad0
a465093d12 Adds coverage for inconsistent variant unit name on csv - product creation 2023-01-02 11:15:26 +00:00
filipefurtad0
95c9f9afbb Adds coverage for inconsistent variant unit name on csv - inventory import 2023-01-02 11:15:26 +00:00
dependabot[bot]
2842f2bb9e Bump rubocop from 1.41.1 to 1.42.0
Bumps [rubocop](https://github.com/rubocop/rubocop) from 1.41.1 to 1.42.0.
- [Release notes](https://github.com/rubocop/rubocop/releases)
- [Changelog](https://github.com/rubocop/rubocop/blob/master/CHANGELOG.md)
- [Commits](https://github.com/rubocop/rubocop/compare/v1.41.1...v1.42.0)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-01-02 09:05:39 +00:00
dependabot[bot]
dc8ccba972 Bump bullet from 7.0.4 to 7.0.5
Bumps [bullet](https://github.com/flyerhzm/bullet) from 7.0.4 to 7.0.5.
- [Release notes](https://github.com/flyerhzm/bullet/releases)
- [Changelog](https://github.com/flyerhzm/bullet/blob/main/CHANGELOG.md)
- [Commits](https://github.com/flyerhzm/bullet/compare/7.0.4...7.0.5)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-01-02 09:04:05 +00:00
dependabot[bot]
a0d7f10256 Bump puma from 5.6.5 to 6.0.2
Bumps [puma](https://github.com/puma/puma) from 5.6.5 to 6.0.2.
- [Release notes](https://github.com/puma/puma/releases)
- [Changelog](https://github.com/puma/puma/blob/master/History.md)
- [Commits](https://github.com/puma/puma/compare/v5.6.5...v6.0.2)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-01-02 09:02:00 +00:00
Sigmund Petersen
d5ef68323e Merge pull request #10169 from cillian/remove-unused-angular-directives
Remove unused angular directives
2023-01-01 13:14:23 +01:00
Rachel Arnould
6c1c103272 Merge pull request #10080 from jibees/10075-change-edit-order-page-colors
[WIP 🚧 ] Admin - Order edition, behind feature toggle `admin_style_v2`: adjust colors
2022-12-30 11:42:23 +01:00
dependabot[bot]
985cf990d6 Merge pull request #10214 from openfoodfoundation/dependabot/bundler/knapsack_pro-3.7.0 2022-12-30 09:35:54 +00:00
dependabot[bot]
22eee4493f Bump knapsack_pro from 3.6.0 to 3.7.0
Bumps [knapsack_pro](https://github.com/KnapsackPro/knapsack_pro-ruby) from 3.6.0 to 3.7.0.
- [Release notes](https://github.com/KnapsackPro/knapsack_pro-ruby/releases)
- [Changelog](https://github.com/KnapsackPro/knapsack_pro-ruby/blob/master/CHANGELOG.md)
- [Commits](https://github.com/KnapsackPro/knapsack_pro-ruby/compare/v3.6.0...v3.7.0)

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

Signed-off-by: dependabot[bot] <support@github.com>
2022-12-30 09:01:14 +00:00
Jean-Baptiste Bellet
74b618230f Put action icons on the same line inside a .flex container 2022-12-30 09:39:01 +01:00
Jean-Baptiste Bellet
5601a6d3b6 Darken labels since the background is now more white but light grey 2022-12-29 14:47:12 +01:00
Jean-Baptiste Bellet
7b7718977f Put action icons on the same line with .flex container
As they are now `display: flex;` (due to alignement of the background, and the icon itself), we are obliged to add this small container
2022-12-29 14:44:30 +01:00
Jean-Baptiste Bellet
a793fc9f99 Create a "None" calculator for shipping and payment methods
Only for payment and shipping methods
2022-12-27 17:49:48 +01:00
Jean-Baptiste Bellet
2ff50587d8 Align icon content in the center via display: flex; 2022-12-19 11:53:58 +01:00
Jean-Baptiste Bellet
2296a51dd2 Remove useless CSS class .filte-row 2022-12-19 10:50:00 +01:00
Cillian O'Ruanaidh
c000010d0b Update CSS comment to reflect that singleLineSelectors directive was replaced by filterSelectors 2022-12-16 16:24:42 +00:00
Cillian O'Ruanaidh
26baad53e4 Remove unused singleLineSelectors angular directive 2022-12-16 14:50:09 +00:00
Jean-Baptiste Bellet
86c437ee24 No need to be as specific
Didn't work for firefox.
Seems to be useless now, removing it.
2022-12-16 15:49:38 +01:00
Jean-Baptiste Bellet
19bd067379 White background for dropdowns 2022-12-16 15:49:38 +01:00
Jean-Baptiste Bellet
20596b9441 Mark as icon-remove and then considered as secondary 2022-12-16 15:49:38 +01:00
Jean-Baptiste Bellet
d8e22a5ee7 Add rounded corner on top of table header 2022-12-16 15:49:38 +01:00
Jean-Baptiste Bellet
896743ee34 Icon road (ie. ship button) should be dark blue on hover 2022-12-16 15:49:38 +01:00
Jean-Baptiste Bellet
f935a27253 Override border color when open or active for multi select 2022-12-16 15:49:38 +01:00
Jean-Baptiste Bellet
54fd768aa4 Darker blue instead of green on the side menu when active or hover 2022-12-16 15:49:38 +01:00
Jean-Baptiste Bellet
89acd3a589 Body is now with bg-color $v2-body-bg, ie. #f7f9fa 2022-12-16 15:49:38 +01:00
Jean-Baptiste Bellet
819cf5cc49 Add this td even if empty
easier to design table then
2022-12-16 15:49:38 +01:00
Jean-Baptiste Bellet
10b0f9b650 Be more and more specific to be sure that this overrides applies 2022-12-16 15:49:38 +01:00
Jean-Baptiste Bellet
67cca34daa Consider remove button as a secondary one 2022-12-16 15:49:38 +01:00
Jean-Baptiste Bellet
19f3fd872f Re-organise to be as clear as possible
Use default then override
2022-12-16 15:49:38 +01:00
Jean-Baptiste Bellet
3175f0f68c Specify for edit, capture, ok and plus icons: background is always blue
The previously success color (which is green) is doesn't fit the v2 design
2022-12-16 15:49:38 +01:00
Jean-Baptiste Bellet
5f7f7c78b0 Change tom-select colors
cf. select2
2022-12-16 15:49:38 +01:00
Jean-Baptiste Bellet
aa26e15e6b Permit to use hovering background color get from the state
Do not override, and then, icon can be:
 - red if it's a delete icon,
 - green if it's ..
2022-12-16 15:49:38 +01:00
Jean-Baptiste Bellet
64d467ce39 Specify table#listing_orders and be as generic as possible for table 2022-12-16 15:49:38 +01:00
Jean-Baptiste Bellet
727e6d4966 Only called in a v2 context, no need to specify a selector
+ adjust that should be adjusted
2022-12-16 15:49:38 +01:00
Jean-Baptiste Bellet
66134c24b7 Sidebar should be blue instead of green 2022-12-16 15:48:36 +01:00
Jean-Baptiste Bellet
19d5723dd6 In v2, .cancel button are secondary 2022-12-16 15:48:36 +01:00
Jean-Baptiste Bellet
03c38aee3c Only import v2 scss files in a v2 context 2022-12-16 15:48:36 +01:00
Jean-Baptiste Bellet
ada76a9bf7 Create a palette mixin that override global color variables
This is widely used elsewhere and especially for all the state colors
2022-12-16 15:48:26 +01:00
Jean-Baptiste Bellet
bf073599d7 Align before pseudo component by using flex (and not width and padding) 2022-12-16 15:48:26 +01:00
Jean-Baptiste Bellet
faf106b282 Specify color for [class*="icon-"] as well 2022-12-16 15:48:26 +01:00
Cillian O'Ruanaidh
d79b4bdcf9 Remove unused fillVertical angular directive 2022-12-16 13:10:36 +00:00
Cillian O'Ruanaidh
d90d352a86 Remove unused showMore angular directive 2022-12-16 12:55:28 +00:00
207 changed files with 3015 additions and 1803 deletions

View File

@@ -23,8 +23,7 @@ assignees: ''
## Finish on Tuesday
- [ ] Publish and notify [#global-community]:
> The next release is ready: https://github.com/openfoodfoundation/openfoodnetwork/releases/latest
- [ ] Publish and notify [#global-community] (this is automatically posted with a plugin)
- [ ] Deploy the new release to all managed instances.
<details><summary>Command line instructions</summary>
<pre>

View File

@@ -33,7 +33,7 @@ jobs:
- name: Setup Brakeman
env:
BRAKEMAN_VERSION: '4.10' # SARIF support is provided in Brakeman version 4.10+
BRAKEMAN_VERSION: '5.4.0'
run: |
gem install brakeman --version $BRAKEMAN_VERSION

View File

@@ -684,17 +684,6 @@ Rails/ApplicationController:
Exclude:
- 'engines/dfc_provider/app/controllers/dfc_provider/base_controller.rb'
# Offense count: 6
# This cop supports unsafe autocorrection (--autocorrect-all).
Rails/ApplicationJob:
Exclude:
- 'app/jobs/bulk_invoice_job.rb'
- 'app/jobs/heartbeat_job.rb'
- 'app/jobs/order_cycle_closing_job.rb'
- 'app/jobs/order_cycle_notification_job.rb'
- 'app/jobs/subscription_confirm_job.rb'
- 'app/jobs/subscription_placement_job.rb'
# Offense count: 1
# This cop supports unsafe autocorrection (--autocorrect-all).
Rails/ApplicationMailer:

View File

@@ -28,7 +28,7 @@ For those new to Rails, the following tutorial will help get you up to speed wit
So you have set up your local environment according to the requirements listed above. If you're planning on contributing code to the project (which we [LOVE](CONTRIBUTING.md)), it is a good idea to begin by forking this repo using the `Fork` button in the top-right corner of this screen. You should then be able to use `git clone` to copy your fork onto your local machine:
git clone https://github.com/YOUR_GITHUB_USERNAME_HERE/openfoodnetwork
git clone git@github.com:YOUR_GITHUB_USERNAME_HERE/openfoodnetwork.git
Jump into your new local copy of the Open Food Network:
@@ -36,7 +36,7 @@ Jump into your new local copy of the Open Food Network:
And then add an `upstream` remote that points to the main repo:
git remote add upstream https://github.com/openfoodfoundation/openfoodnetwork
git remote add upstream git@github.com:openfoodfoundation/openfoodnetwork.git
Fetch the latest version of `master` from `upstream` (ie. the main repo):

View File

@@ -118,7 +118,7 @@ gem 'test-unit', '~> 3.5'
gem 'coffee-rails', '~> 5.0.0'
gem 'mini_racer', '0.4.0'
gem 'mini_racer'
gem 'angular_rails_csrf'

View File

@@ -158,16 +158,16 @@ GEM
awesome_nested_set (3.5.0)
activerecord (>= 4.0.0, < 7.1)
aws-eventstream (1.2.0)
aws-partitions (1.669.0)
aws-sdk-core (3.168.2)
aws-partitions (1.695.0)
aws-sdk-core (3.169.0)
aws-eventstream (~> 1, >= 1.0.2)
aws-partitions (~> 1, >= 1.651.0)
aws-sigv4 (~> 1.5)
jmespath (~> 1, >= 1.6.1)
aws-sdk-kms (1.60.0)
aws-sdk-kms (1.62.0)
aws-sdk-core (~> 3, >= 3.165.0)
aws-sigv4 (~> 1.1)
aws-sdk-s3 (1.117.2)
aws-sdk-s3 (1.118.0)
aws-sdk-core (~> 3, >= 3.165.0)
aws-sdk-kms (~> 1)
aws-sigv4 (~> 1.4)
@@ -177,12 +177,12 @@ GEM
bigdecimal (3.0.2)
bindata (2.4.12)
bindex (0.8.1)
bootsnap (1.15.0)
bootsnap (1.16.0)
msgpack (~> 1.2)
bugsnag (6.25.0)
bugsnag (6.25.1)
concurrent-ruby (~> 1.0)
builder (3.2.4)
bullet (7.0.4)
bullet (7.0.7)
activesupport (>= 3.0.0)
uniform_notifier (~> 1.11)
cable_ready (5.0.0.pre9)
@@ -221,7 +221,7 @@ GEM
combine_pdf (1.0.22)
matrix
ruby-rc4 (>= 0.1.5)
concurrent-ruby (1.1.10)
concurrent-ruby (1.2.0)
connection_pool (2.3.0)
crack (0.4.5)
rexml
@@ -237,10 +237,12 @@ GEM
activerecord (>= 5.a)
database_cleaner-core (~> 2.0.0)
database_cleaner-core (2.0.1)
ddtrace (0.54.1)
debase-ruby_core_source (= 0.10.12)
ddtrace (1.8.0)
debase-ruby_core_source (>= 0.10.16, <= 0.10.18)
libdatadog (~> 0.9.0.1.0)
libddwaf (~> 1.5.1.0.0)
msgpack
debase-ruby_core_source (0.10.12)
debase-ruby_core_source (0.10.18)
debug (1.7.1)
irb (>= 1.5.0)
reline (>= 0.3.1)
@@ -313,7 +315,7 @@ GEM
nokogiri (>= 1.5.11, < 2.0.0)
foreman (0.87.2)
formatador (0.2.5)
fugit (1.7.1)
fugit (1.8.1)
et-orbi (~> 1, >= 1.2.7)
raabro (~> 1.4)
fuubar (2.5.1)
@@ -324,7 +326,7 @@ GEM
addressable (~> 2.7)
omniauth (>= 1.9, < 3)
openid_connect (~> 1.2)
globalid (1.0.0)
globalid (1.0.1)
activesupport (>= 5.0)
gmaps4rails (2.1.2)
good_migrations (0.2.1)
@@ -375,14 +377,17 @@ GEM
jsonapi-serializer (2.2.0)
activesupport (>= 4.2)
jwt (2.6.0)
knapsack_pro (3.6.0)
knapsack_pro (3.7.0)
rake
launchy (2.5.0)
addressable (~> 2.7)
letter_opener (1.8.1)
launchy (>= 2.2, < 3)
libv8-node (15.14.0.1)
listen (3.7.1)
libdatadog (0.9.0.1.0)
libddwaf (1.5.1.0.0)
ffi (~> 1.0)
libv8-node (16.10.0.0)
listen (3.8.0)
rb-fsevent (~> 0.10, >= 0.10.3)
rb-inotify (~> 0.9, >= 0.9.10)
loofah (2.19.1)
@@ -402,9 +407,9 @@ GEM
mini_magick (4.11.0)
mini_mime (1.1.2)
mini_portile2 (2.8.1)
mini_racer (0.4.0)
libv8-node (~> 15.14.0.0)
minitest (5.16.3)
mini_racer (0.6.3)
libv8-node (~> 16.10.0.0)
minitest (5.17.0)
monetize (1.12.0)
money (~> 6.12)
money (6.16.0)
@@ -453,7 +458,7 @@ GEM
parallel (1.22.1)
paranoia (2.6.1)
activerecord (>= 5.1, < 7.1)
parser (3.1.3.0)
parser (3.2.0.0)
ast (~> 2.4.1)
paypal-sdk-core (0.3.4)
multi_json (~> 1.0)
@@ -472,11 +477,11 @@ GEM
coderay (~> 1.1)
method_source (~> 1.0)
public_suffix (5.0.0)
puma (5.6.5)
puma (6.0.2)
nio4r (~> 2.0)
raabro (1.4.0)
racc (1.6.1)
rack (2.2.4)
rack (2.2.6.2)
rack-mini-profiler (2.3.4)
rack (>= 1.2.0)
rack-oauth2 (1.21.3)
@@ -540,12 +545,12 @@ GEM
activerecord (>= 5.2.4)
activesupport (>= 5.2.4)
i18n
rb-fsevent (0.11.0)
rb-fsevent (0.11.2)
rb-inotify (0.10.1)
ffi (~> 1.0)
redcarpet (3.5.1)
redis (4.8.0)
regexp_parser (2.6.1)
regexp_parser (2.6.2)
reline (0.3.2)
io-console (~> 0.5)
request_store (1.5.0)
@@ -599,17 +604,17 @@ GEM
rswag-ui (2.8.0)
actionpack (>= 3.1, < 7.1)
railties (>= 3.1, < 7.1)
rubocop (1.41.1)
rubocop (1.44.1)
json (~> 2.3)
parallel (~> 1.10)
parser (>= 3.1.2.1)
parser (>= 3.2.0.0)
rainbow (>= 2.2.2, < 4.0)
regexp_parser (>= 1.8, < 3.0)
rexml (>= 3.2.5, < 4.0)
rubocop-ast (>= 1.23.0, < 2.0)
rubocop-ast (>= 1.24.1, < 2.0)
ruby-progressbar (~> 1.7)
unicode-display_width (>= 1.4.0, < 3.0)
rubocop-ast (1.24.0)
unicode-display_width (>= 2.4.0, < 3.0)
rubocop-ast (1.24.1)
parser (>= 3.1.1.0)
rubocop-rails (2.17.4)
activesupport (>= 4.2.0)
@@ -640,10 +645,9 @@ GEM
connection_pool (>= 2.2.5, < 3)
rack (~> 2.0)
redis (>= 4.5.0, < 5)
sidekiq-scheduler (4.0.3)
redis (>= 4.2.0)
sidekiq-scheduler (5.0.0)
rufus-scheduler (~> 3.2)
sidekiq (>= 4, < 7)
sidekiq (>= 4, < 8)
tilt (>= 1.4.0)
simplecov (0.22.0)
docile (~> 1.1)
@@ -654,7 +658,7 @@ GEM
spreadsheet_architect (5.0.0)
caxlsx (>= 3.3.0, < 4)
rodf (>= 1.0.0, < 2)
spring (4.1.0)
spring (4.1.1)
spring-commands-rspec (1.0.4)
spring (>= 0.9.1)
sprockets (3.7.2)
@@ -698,7 +702,7 @@ GEM
ttfunk (1.7.0)
tzinfo (2.0.5)
concurrent-ruby (~> 1.0)
unicode-display_width (2.3.0)
unicode-display_width (2.4.2)
uniform_notifier (1.16.0)
valid_email2 (4.0.4)
activemodel (>= 3.2)
@@ -710,7 +714,7 @@ GEM
activemodel (>= 3.0.0)
public_suffix
vcr (6.1.0)
view_component (2.80.0)
view_component (2.82.0)
activesupport (>= 5.2.0, < 8.0)
concurrent-ruby (~> 1.0)
method_source (~> 1.0)
@@ -825,7 +829,7 @@ DEPENDENCIES
mime-types
mimemagic (> 0.3.5)
mini_portile2 (~> 2.8)
mini_racer (= 0.4.0)
mini_racer
monetize (~> 1.11)
oauth2 (~> 1.4.7)
ofn-qz!
@@ -894,4 +898,4 @@ RUBY VERSION
ruby 3.0.3p157
BUNDLED WITH
2.1.4
2.4.3

View File

@@ -1,12 +0,0 @@
angular.module("admin.indexUtils").component 'showMore',
templateUrl: 'admin/show_more.html'
bindings:
data: "="
limit: "="
increment: "="
# For now, this component is not being used.
# Something about binding "data" to a variable on the parent scope that is continually refreshed by
# being assigned within an ng-repeat means that we get $digest iteration errors. Seems to be solved
# by using the new "as" syntax for ng-repeat to assign and alias the outcome of the filters, but this
# has the limitation of not being able to be limited AFTER the assignment has been made, which we need

View File

@@ -9,38 +9,39 @@ angular.module("admin.lineItems").controller 'LineItemsCtrl', ($scope, $timeout,
$scope.sharedResource = false
$scope.columns = Columns.columns
$scope.sorting = SortOptions
$scope.pagination = Orders.pagination
$scope.per_page_options = [
{id: 15, name: t('js.admin.orders.index.per_page', results: 15)},
{id: 50, name: t('js.admin.orders.index.per_page', results: 50)},
{id: 100, name: t('js.admin.orders.index.per_page', results: 100)}
]
$scope.page = 1
$scope.per_page = $scope.per_page_options[0].id
$scope.confirmRefresh = ->
LineItems.allSaved() || confirm(t("unsaved_changes_warning"))
$scope.initStartAndEnDate = ->
$scope.startDate = moment().startOf('day').subtract(7, 'days').format('YYYY-MM-DD')
$scope.endDate = moment().startOf('day').format('YYYY-MM-DD')
$scope.resetFilters = ->
$scope.distributorFilter = ''
$scope.supplierFilter = ''
$scope.orderCycleFilter = ''
$scope.quickSearch = ''
$scope.initStartAndEnDate()
event = new CustomEvent('flatpickr:change', {
detail: {
startDate: $scope.startDate,
endDate: $scope.endDate
}
})
$scope.startDate = undefined
$scope.endDate = undefined
event = new CustomEvent('flatpickr:clear')
window.dispatchEvent(event)
$scope.resetSelectFilters = ->
$scope.resetFilters()
$scope.refreshData()
$scope.fetchResults = ->
# creates indirection in order to factorize the code between orders and bulk orders
# used in app/views/admin/shared/_angular_per_page_controls.html.haml
$scope.refreshData()
$scope.refreshData = ->
$scope.formattedStartDate = moment($scope.startDate).format()
$scope.formattedEndDate = moment($scope.endDate).add(1,'day').format()
return unless moment($scope.formattedStartDate).isValid() and moment($scope.formattedEndDate).isValid()
return "cancel" unless $scope.confirmRefresh()
$scope.loadOrders()
@@ -51,33 +52,24 @@ angular.module("admin.lineItems").controller 'LineItemsCtrl', ($scope, $timeout,
$scope.dereferenceLoadedData()
$scope.setOrderCycleDateRange = ->
start_date = OrderCycles.byID[$scope.orderCycleFilter].orders_open_at
end_date = OrderCycles.byID[$scope.orderCycleFilter].orders_close_at
format = "YYYY-MM-DD HH:mm:ss Z"
$scope.startDate = moment(start_date, format).format('YYYY-MM-DD')
$scope.endDate = moment(end_date, format).startOf('day').format('YYYY-MM-DD')
# throw a flatpickr:change event to change the date back in the datepicker
event = new CustomEvent('flatpickr:change', {
detail: {
startDate: $scope.startDate,
endDate: $scope.endDate
}
})
window.dispatchEvent(event)
$scope.loadOrders = ->
[formattedStartDate, formattedEndDate] = $scope.formatDates($scope.startDate, $scope.endDate)
RequestMonitor.load $scope.orders = Orders.index(
"q[state_not_eq]": "canceled",
"q[shipment_state_not_eq]": "shipped",
"q[completed_at_not_null]": "true",
"q[distributor_id_eq]": $scope.distributorFilter,
"q[order_cycle_id_eq]": $scope.orderCycleFilter,
"q[completed_at_gteq]": $scope.formattedStartDate,
"q[completed_at_lt]": $scope.formattedEndDate
"q[completed_at_gteq]": if formattedStartDate then formattedStartDate else undefined,
"q[completed_at_lt]": if formattedEndDate then formattedEndDate else undefined,
"page": $scope.page,
"per_page": $scope.per_page
)
$scope.loadLineItems = ->
[formattedStartDate, formattedEndDate] = $scope.formatDates($scope.startDate, $scope.endDate)
RequestMonitor.load LineItems.index(
"q[order_state_not_eq]": "canceled",
"q[order_shipment_state_not_eq]": "shipped",
@@ -85,10 +77,17 @@ angular.module("admin.lineItems").controller 'LineItemsCtrl', ($scope, $timeout,
"q[order_distributor_id_eq]": $scope.distributorFilter,
"q[variant_product_supplier_id_eq]": $scope.supplierFilter,
"q[order_order_cycle_id_eq]": $scope.orderCycleFilter,
"q[order_completed_at_gteq]": $scope.formattedStartDate,
"q[order_completed_at_lt]": $scope.formattedEndDate
"q[order_completed_at_gteq]": if formattedStartDate then formattedStartDate else undefined,
"q[order_completed_at_lt]": if formattedEndDate then formattedEndDate else undefined,
"page": $scope.page,
"per_page": $scope.per_page
)
$scope.formatDates = (startDate, endDate) ->
formattedStartDate = moment(startDate).format('YYYY-MM-DD') if startDate
formattedEndDate = moment(endDate).add(1,'day').format('YYYY-MM-DD') if endDate
return [formattedStartDate, formattedEndDate]
$scope.loadAssociatedData = ->
RequestMonitor.load $scope.distributors = Enterprises.index(action: "visible", ams_prefix: "basic", "q[sells_in][]": ["own", "any"])
RequestMonitor.load $scope.orderCycles = OrderCycles.index(ams_prefix: "basic", as: "distributor", "q[orders_close_at_gt]": "#{moment().subtract(90,'days').format()}")
@@ -219,7 +218,7 @@ angular.module("admin.lineItems").controller 'LineItemsCtrl', ($scope, $timeout,
$scope.getGroupBySizeFormattedValueWithUnitName = (value, unitsProduct, unitsVariant) ->
scale = $scope.getScale(unitsProduct, unitsVariant)
if scale
if scale && value
value = value / scale if scale != 28.35 && scale != 1 && scale != 453.6 # divide by scale if not smallest unit
$scope.getFormattedValueWithUnitName(value, unitsProduct, unitsVariant, scale)
else
@@ -263,4 +262,8 @@ angular.module("admin.lineItems").controller 'LineItemsCtrl', ($scope, $timeout,
lineItem.final_weight_volume = LineItems.pristineByID[lineItem.id].final_weight_volume * lineItem.quantity / LineItems.pristineByID[lineItem.id].quantity
$scope.weightAdjustedPrice(lineItem)
$scope.changePage = (newPage) ->
$scope.page = newPage
$scope.refreshData()
$scope.resetSelectFilters()

View File

@@ -1,9 +0,0 @@
angular.module('Darkswarm').directive "fillVertical", ($window)->
# Makes something fill the window vertically. Used on the Google Map.
restrict: 'A'
link: (scope, element, attrs)->
setSize = ->
element.css "height", ($window.innerHeight - element.offset().top)
setSize()
angular.element($window).bind "resize", ->
setSize()

View File

@@ -1,82 +0,0 @@
angular.module('Darkswarm').directive 'singleLineSelectors', ($timeout, $filter) ->
restrict: 'E'
templateUrl: "single_line_selectors.html"
scope:
selectors: "="
objects: "&"
activeSelectors: "="
selectorName: "@activeSelectors"
link: (scope, element, attrs) ->
scope.fitting = false
scope.refit = ->
if scope.allSelectors?
scope.fitting = true
selector.fits = true for selector in scope.allSelectors
$timeout(loadWidths, 0, true).then ->
$timeout fit, 0, true
fit = ->
used = $(element).find("li.more").outerWidth(true)
used += selector.width for selector in scope.allSelectors when selector.fits
available = $(element).parent(".filter-shopfront").innerWidth() - used
if available > 0
for selector in scope.allSelectors when !selector.fits
available -= selector.width
selector.fits = true if available > 0
else
if scope.allSelectors.length > 0
for i in [scope.allSelectors.length-1..0]
selector = scope.allSelectors[i]
if !selector.fits
continue
else
if available < 0
selector.fits = false
available += selector.width
scope.fitting = false
loadWidths = ->
$(element).find("li").not(".more").each (i) ->
if i < scope.allSelectors.length
scope.allSelectors[i].width = $(this).outerWidth(true)
return null # So we don't exit the loop weirdly
scope.overFlowSelectors = ->
return [] unless scope.allSelectors?
$filter('filter')(scope.allSelectors, { fits: false })
scope.selectedOverFlowSelectors = ->
$filter('filter')(scope.overFlowSelectors(), { active: true })
# had to duplicate this to make overflow selectors work
scope.emit = ->
scope.activeSelectors = scope.allSelectors.filter (selector)->
selector.active
.map (selector) ->
selector.object.id
# From: http://stackoverflow.com/questions/4298612/jquery-how-to-call-resize-event-only-once-its-finished-resizing
debouncer = (func, timeout) ->
timeoutID = undefined
timeout = timeout or 50
->
subject = this
args = arguments
clearTimeout timeoutID
timeoutID = setTimeout(->
func.apply subject, Array::slice.call(args)
, timeout)
# -- Event management
scope.$watchCollection "allSelectors", ->
scope.refit()
scope.$on "filtersToggled", ->
scope.refit()
$(window).resize debouncer (e) ->
scope.fitting = true
if scope.allSelectors?
$timeout fit, 0, true

View File

@@ -1,5 +0,0 @@
$( document ).ready(function() {
$("#closeie").click(function() {
$("#ie-warning").hide();
});
})

View File

@@ -1,3 +0,0 @@
%div{ ng: { show: "data.length > limit" } }
%input{ type: 'button', value: t(:show_more), ng: { click: 'limit = limit + increment' } }
%input{ type: 'button', value: t(:show_all_with_more, num: '{{ data.length - limit }}'), ng: { click: 'limit = data.length' } }

View File

@@ -1,14 +0,0 @@
-# In order for the single-line-selector scope to have access to the available selectors,
%filter-selector{"selector-set" => "selectors", objects: "objects()", "active-selectors" => "activeSelectors", "all-selectors" => "allSelectors" }
%ul{ ng: { if: "overFlowSelectors().length > 0 || fitting" } }
%li.more
%a.dropdown{ data: { dropdown: "{{ 'show-more-' + selectorName }}" }, ng: { class: "{active: selectedOverFlowSelectors().length > 0}" } }
%span
{{ 'js.more_items' | t:{ count: overFlowSelectors().length } }}
%i.ofn-i_052-point-down
.f-dropdown.text-right.content{ ng: { attr: { id: "{{ 'show-more-' + selectorName }}" } } }
%ul
%active-selector{ ng: { repeat: "selector in overFlowSelectors()", hide: "selector.fits" } }
%render-svg{path: "{{selector.object.icon}}", ng: { if: "selector.object.icon"}}
%span {{ selector.object.name }}

View File

@@ -0,0 +1,15 @@
# frozen_string_literal: true
class ConfirmModalComponent < ModalComponent
def initialize(id:, confirm_actions: nil, controllers: nil)
super(id: id, close_button: true)
@confirm_actions = confirm_actions
@controllers = controllers
end
private
def close_button_class
"secondary"
end
end

View File

@@ -0,0 +1,8 @@
%div{ id: @id, "data-controller": "modal #{@controllers}", "data-action": "keyup@document->modal#closeIfEscapeKey" }
.reveal-modal-bg.fade{ "data-modal-target": "background", "data-action": "click->modal#close" }
.reveal-modal.fade.tiny.help-modal{ "data-modal-target": "modal" }
= content
.modal-actions
%input{ class: "button icon-plus #{close_button_class}", type: 'button', value: t('js.admin.modals.cancel'), "data-action": "click->modal#close" }
%input{ class: "button icon-plus primary", type: 'button', value: t('js.admin.modals.confirm'), "data-action": @confirm_actions }

View File

@@ -0,0 +1,4 @@
.modal-actions {
display: flex;
justify-content: space-around;
}

View File

@@ -1,26 +1,7 @@
# frozen_string_literal: true
class HelpModalComponent < ViewComponent::Base
class HelpModalComponent < ModalComponent
def initialize(id:, close_button: true)
@id = id
@close_button = close_button
end
private
def close_button_class
if namespace == "admin"
"red"
else
"primary"
end
end
def close_button?
!!@close_button
end
def namespace
helpers.controller_path.split("/").first
super(id: id, close_button: close_button)
end
end

View File

@@ -0,0 +1,26 @@
# frozen_string_literal: true
class ModalComponent < ViewComponent::Base
def initialize(id:, close_button: true)
@id = id
@close_button = close_button
end
private
def close_button_class
if namespace == "admin"
"red"
else
"primary"
end
end
def close_button?
!!@close_button
end
def namespace
helpers.controller_path.split("/").first
end
end

View File

@@ -3,11 +3,16 @@
require "open_food_network/feature_toggle"
class FeatureToggleConstraint
def initialize(feature_name)
def initialize(feature_name, negate: false)
@feature = feature_name
@negate = negate
end
def matches?(request)
enabled?(request) ^ @negate
end
def enabled?(request)
OpenFoodNetwork::FeatureToggle.enabled?(@feature, current_user(request))
end

View File

@@ -19,22 +19,22 @@ module Admin
end
def show
@report = report_class.new(spree_current_user, params, request)
@report = report_class.new(spree_current_user, params, render: render_data?)
if report_format.present?
export_report
else
render_report
show_report
end
end
private
def export_report
send_data @report.render_as(report_format, controller: self), filename: report_filename
send_data render_report_as(report_format), filename: report_filename
end
def render_report
def show_report
assign_view_data
render "show"
end
@@ -43,13 +43,29 @@ module Admin
@report_type = report_type
@report_subtypes = report_subtypes
@report_subtype = report_subtype
@report_title = if report_subtype
report_subtype_title
else
I18n.t(:name, scope: [:admin, :reports, @report_type])
end
@report_title = report_title
@rendering_options = rendering_options
@table = render_report_as(:html) if render_data?
@data = Reporting::FrontendData.new(spree_current_user)
end
def render_data?
request.post?
end
def render_report_as(format)
if OpenFoodNetwork::FeatureToggle.enabled?(:background_reports, spree_current_user)
job = ReportJob.new
JobProcessor.perform_forked(
job,
report_class, spree_current_user, params, format
)
# This result has been rendered by Rails in safe mode already.
job.result.html_safe # rubocop:disable Rails/OutputSafety
else
@report.render_as(format)
end
end
end
end

View File

@@ -39,6 +39,14 @@ module ReportsActions
params[:report_subtype] || report_subtypes_codes.first
end
def report_title
if report_subtype
report_subtype_title
else
I18n.t(:name, scope: [:admin, :reports, report_type])
end
end
def report_subtype_title
report_subtypes.select { |_name, key| key.to_sym == report_subtype.to_sym }.first[0]
end

View File

@@ -36,11 +36,7 @@ class SplitCheckoutController < ::BaseController
advance_order_state
redirect_to_step
else
flash.now[:error] ||= I18n.t('split_checkout.errors.global')
render status: :unprocessable_entity, operations: cable_car.
replace("#checkout", partial("split_checkout/checkout")).
replace("#flashes", partial("shared/flashes", locals: { flashes: flash }))
render_error
end
rescue Spree::Core::GatewayError => e
flash[:error] = I18n.t(:spree_gateway_error_flash_for_checkout, error: e.message)
@@ -50,6 +46,17 @@ class SplitCheckoutController < ::BaseController
private
def render_error
flash.now[:error] ||= I18n.t(
'split_checkout.errors.saving_failed',
messages: @order.errors.full_messages.to_sentence
)
render status: :unprocessable_entity, operations: cable_car.
replace("#checkout", partial("split_checkout/checkout")).
replace("#flashes", partial("shared/flashes", locals: { flashes: flash }))
end
def flash_error_when_no_shipping_method_available
flash[:error] = I18n.t('split_checkout.errors.no_shipping_methods_available')
end

View File

@@ -11,6 +11,7 @@ module CheckoutHelper
def checkout_adjustments_for(order, opts = {})
exclude = opts[:exclude] || {}
reject_zero_amount = opts.fetch(:reject_zero_amount, true)
adjustments = order.all_adjustments.eligible.to_a
@@ -32,6 +33,10 @@ module CheckoutHelper
}
end
if reject_zero_amount
adjustments.reject! { |a| a.amount == 0 }
end
adjustments
end

View File

@@ -133,7 +133,7 @@ module Spree
event_label = I18n.t("cancel", scope: "actions")
button_link_to(event_label,
fire_admin_order_url(@order, e: "cancel"),
method: :put, icon: "icon-cancel", form_id: "cancel_order_form")
method: :put, icon: "icon-remove", form_id: "cancel_order_form")
end
def resume_event_link

View File

@@ -12,6 +12,16 @@ module TaxHelper
end
end
def display_line_items_taxes(line_item, display_zero: true)
if line_item.included_tax.positive?
Spree::Money.new(line_item.included_tax, currency: line_item.currency)
elsif line_item.added_tax.positive?
Spree::Money.new(line_item.added_tax, currency: line_item.currency)
elsif display_zero
Spree::Money.new(0.00, currency: line_item.currency)
end
end
def display_total_with_tax(taxable)
total = taxable.amount + taxable.additional_tax_total
Spree::Money.new(total, currency: taxable.currency)

View File

@@ -0,0 +1,10 @@
# frozen_string_literal: true
# Rails standard class for common job code.
class ApplicationJob < ActiveJob::Base
# Automatically retry jobs that encountered a deadlock
# retry_on ActiveRecord::Deadlocked
# Most jobs are safe to ignore if the underlying records are no longer available
# discard_on ActiveJob::DeserializationError
end

View File

@@ -1,6 +1,6 @@
# frozen_string_literal: true
class BulkInvoiceJob < ActiveJob::Base
class BulkInvoiceJob < ApplicationJob
def perform(order_ids, filepath)
pdf = CombinePDF.new

View File

@@ -1,6 +1,6 @@
# frozen_string_literal: true
class HeartbeatJob < ActiveJob::Base
class HeartbeatJob < ApplicationJob
def perform
Spree::Config.last_job_queue_heartbeat_at = Time.now.in_time_zone
end

View File

@@ -1,6 +1,6 @@
# frozen_string_literal: true
class OrderCycleClosingJob < ActiveJob::Base
class OrderCycleClosingJob < ApplicationJob
def perform
return if recently_closed_order_cycles.empty?

View File

@@ -1,7 +1,7 @@
# frozen_string_literal: true
# Delivers an email with a report of the order cycle to each of its suppliers
class OrderCycleNotificationJob < ActiveJob::Base
class OrderCycleNotificationJob < ApplicationJob
def perform(order_cycle_id)
order_cycle = OrderCycle.find(order_cycle_id)
order_cycle.suppliers.each do |supplier|

34
app/jobs/report_job.rb Normal file
View File

@@ -0,0 +1,34 @@
# frozen_string_literal: true
# Renders a report and saves it to a temporary file.
class ReportJob < ActiveJob::Base
def perform(report_class, user, params, format)
report = report_class.new(user, params, render: true)
result = report.render_as(format)
write(result)
end
def done?
@done ||= File.file?(filename)
end
def result
@result ||= read_result
end
private
def write(result)
File.write(filename, result)
end
def read_result
File.read(filename)
ensure
File.unlink(filename)
end
def filename
Rails.root.join("tmp/report-#{job_id}")
end
end

View File

@@ -3,7 +3,7 @@
require 'order_management/subscriptions/summarizer'
# Confirms orders of unconfirmed proxy orders in recently closed Order Cycles
class SubscriptionConfirmJob < ActiveJob::Base
class SubscriptionConfirmJob < ApplicationJob
def perform
confirm_proxy_orders!
end

View File

@@ -2,7 +2,7 @@
require 'order_management/subscriptions/summarizer'
class SubscriptionPlacementJob < ActiveJob::Base
class SubscriptionPlacementJob < ApplicationJob
def perform
proxy_orders.each do |proxy_order|
place_order_for(proxy_order)

View File

@@ -0,0 +1,13 @@
# frozen_string_literal: false
module Calculator
class None < Spree::Calculator
def self.description
I18n.t(:none)
end
def compute(_object = nil)
0
end
end
end

View File

@@ -186,6 +186,10 @@ module Spree
adjustments.tax.inclusive.sum(:amount)
end
def added_tax
adjustments.tax.additional.sum(:amount)
end
def tax_rates
product.tax_category&.tax_rates || []
end

View File

@@ -113,7 +113,7 @@ module Spree
end
def init
self.calculator ||= ::Calculator::FlatRate.new(preferred_amount: 0)
self.calculator ||= ::Calculator::None.new
end
def has_distributor?(distributor)

View File

@@ -32,6 +32,8 @@ module Spree
validate :at_least_one_shipping_category
validates :display_on, inclusion: { in: DISPLAY_ON_OPTIONS.values }, allow_nil: true
after_initialize :init
after_save :touch_distributors
scope :managed_by, lambda { |user|
@@ -67,10 +69,6 @@ module Spree
tracking_url.gsub(/:tracking/, tracking) unless tracking.blank? || tracking_url.blank?
end
def self.calculators
spree_calculators.__send__ model_name_without_spree_namespace
end
# Some shipping methods are only meant to be set via backend
def frontend?
display_on != "back_end"
@@ -110,6 +108,10 @@ module Spree
where(display_on: [nil, ""])
end
def init
self.calculator ||= ::Calculator::None.new if new_record?
end
private
def no_active_or_upcoming_order_cycle_distributors_with_only_one_shipping_method?

View File

@@ -16,4 +16,11 @@ class ApplicationReflex < StimulusReflex::Reflex
#
# For code examples, considerations and caveats, see:
# https://docs.stimulusreflex.com/rtfm/patterns#internationalization
include CanCan::ControllerAdditions
delegate :current_user, to: :connection
def current_ability
Spree::Ability.new(current_user)
end
end

View File

@@ -0,0 +1,13 @@
# frozen_string_literal: true
class ResendConfirmationEmailReflex < ApplicationReflex
def confirm(order_ids)
Spree::Order.where(id: order_ids).find_each do |o|
Spree::OrderMailer.confirm_email_for_customer(o.id, true).deliver_later if can? :resend, o
end
flash[:success] = I18n.t("admin.resend_confirmation_emails_feedback", count: order_ids.count)
cable_ready.dispatch_event(name: "modal:close")
morph "#flashes", render(partial: "shared/flashes", locals: { flashes: flash })
end
end

View File

@@ -0,0 +1,29 @@
# frozen_string_literal: true
# Forks into a separate process to contain memory usage and timeout errors.
class JobProcessor
def self.perform_forked(job, *args)
# Reports should abort when puma threads are killed to avoid wasting
# resources. Nobody would be collecting the result. We still need to
# implement a way to email or download reports later.
timeout = ENV.fetch("RACK_TIMEOUT_WAIT_TIMEOUT", "30").to_i
child = fork do
Process.setproctitle("Job worker #{job.job_id}")
Timeout.timeout(timeout) do
job.perform(*args)
end
# Exit is not a good idea within a Rails process but Rubocop doesn't know
# that we are in a forked process.
exit # rubocop:disable Rails/Exit
end
# Wait for all forked child processes to exit
Process.waitall
ensure
# If this Puma thread is interrupted then we need to detach the child
# process to avoid it becoming a zombie.
Process.detach(child)
end
end

View File

@@ -102,7 +102,6 @@
%td.actions
%a{ 'ng-click' => "deleteCustomer(customer)", :class => "delete-customer icon-trash no-text" }
-# %show-more.text-center{ data: "filteredCustomers", limit: "customerLimit", increment: "20" }
%div.text-center{ ng: { show: "filteredCustomers.length > customerLimit" } }
%input{ type: 'button', value: t(:show_more), ng: { click: 'customerLimit = customerLimit + 20' } }
%input{ type: 'button', value: t(:show_all_with_more, num: '{{ filteredCustomers.length - customerLimit }}'), ng: { click: 'customerLimit = filteredCustomers.length' } }

View File

@@ -1,6 +1,12 @@
.row
= t(:required_fields)
(
%span.required *
)
.row
.three.columns.alpha
= bf.label :company, t(".company_legal_name")
%span.required *
%i.text-big.icon-question-sign{ "data-controller": "help-modal-link", "data-action": "click->help-modal-link#open", "data-help-modal-link-target-value": "business_address_info_modal" }
.eight.columns.omega
= bf.text_field :company, { placeholder: t(".company_placeholder") }
@@ -8,6 +14,7 @@
.row
.three.columns.alpha
= bf.label :address1, t('.address1')
%span.required *
%i.text-big.icon-question-sign{ "data-controller": "help-modal-link", "data-action": "click->help-modal-link#open", "data-help-modal-link-target-value": "business_address_info_modal" }
.eight.columns.omega
= bf.text_field :address1, { placeholder: t(".address1_placeholder") }
@@ -19,8 +26,10 @@
.row
.three.columns.alpha
= bf.label :city, t(:city)
%span.required *
\/
= bf.label :zipcode, t(:postcode)
%span.required *
.four.columns
= bf.text_field :city, { placeholder: t(:city_placeholder) }
.four.columns.omega
@@ -28,8 +37,10 @@
.row{"data-controller": "dependent-select", "data-dependent-select-options-value": countries_with_states }
.three.columns.alpha
= bf.label :country_id, t(:country)
%span.required *
\/
= bf.label :state_id, t(:state)
%span.required *
.four.columns
= bf.select :country_id, options_for_select(available_countries.map { |c| [c.name, c.id] }, @enterprise.business_address.country_id), {}, { "data-controller": "tom-select", "data-dependent-select-target": "source", "data-action": "dependent-select#handleSelectChange", class: "primary" }
.four.columns.omega
@@ -39,6 +50,7 @@
.row
.three.columns.alpha
= bf.label :phone, t(".legal_phone_number")
%span.required *
%i.text-big.icon-question-sign{ "data-controller": "help-modal-link", "data-action": "click->help-modal-link#open", "data-help-modal-link-target-value": "business_address_info_modal" }
.eight.columns.omega
= bf.text_field :phone, { placeholder: t(".phone_placeholder") }

View File

@@ -3,4 +3,4 @@
{{ enterprise.name }}
= "{{ enterprise.issues_summary_#{type} ? '('+enterprise.issues_summary_#{type}+')' : '' }}"
= f.submit t(".add_#{type}"), 'ng-click' => "add#{type.capitalize}($event)", 'ng-disabled' => "!new_#{type}_id || !OrderCycle.novel#{type.capitalize}(new_#{type}_id)"
= f.submit t(".add_#{type}"), 'ng-click' => "add#{type.capitalize}($event)", 'ng-disabled' => "!new_#{type}_id || !OrderCycle.novel#{type.capitalize}(new_#{type}_id)", "class": "secondary"

View File

@@ -26,15 +26,16 @@
= f.submit t('.add_fee'), 'ng-click' => 'addExchangeFee($event, exchange)', 'ng-hide' => '!enterprises[exchange.enterprise_id].managed && !order_cycle.viewing_as_coordinator'
%td.actions
%a{'ng-click' => 'removeExchange($event, exchange)', :class => "icon-trash no-text remove-exchange"}
.flex
%a{'ng-click' => 'removeExchange($event, exchange)', :class => "icon-trash no-text remove-exchange"}
- if type == 'supplier'
%tr.panel-row{ object: "exchange",
panels: "{products: 'exchange_products_supplied'}",
locals: "$index,exchangeTotalVariants,order_cycle,exchange,enterprises,setExchangeVariants,selectAllVariants,suppliedVariants,removeDistributionOfVariant,initializeExchangeProductsPanel,loadMoreExchangeProducts,loadAllExchangeProducts,productsLoading",
colspan: 4 }
colspan: if feature?(:admin_style_v2, spree_current_user) then 5 else 4 end }
- if type == 'distributor'
%tr.panel-row{ object: "exchange",
panels: "{products: 'exchange_products_distributed', tags: 'exchange_tags'}",
locals: "$index,exchangeTotalVariants,order_cycle,exchange,enterprises,setExchangeVariants,incomingExchangeVariantsFor,variantSuppliedToOrderCycle,initializeExchangeProductsPanel,loadMoreExchangeProducts,loadAllExchangeProducts,productsLoading",
colspan: 5 }
colspan: if feature?(:admin_style_v2, spree_current_user) then 6 else 5 end }

View File

@@ -1,16 +1,16 @@
%colgroup
%col{ ng: { show: 'columns.name.visible' } }
%col{ ng: { show: 'columns.schedules.visible' } }
%col{ ng: { show: 'columns.open.visible' }, style: 'width: 20%;' }
%col{ ng: { show: 'columns.close.visible' }, style: 'width: 20%;' }
%col{ ng: { show: 'columns.open.visible' } }
%col{ ng: { show: 'columns.close.visible' } }
- unless simple_index
%col{ ng: { show: 'columns.producers.visible' } }
%col{ ng: { show: 'columns.coordinator.visible' } }
%col{ ng: { show: 'columns.shops.visible' } }
%col{ ng: { show: 'columns.products.visible' } }
%col{ style: 'width: 5%;' }
%col{ style: 'width: 5%;' }
%col{ style: 'width: 5%;' }
%col
%col
%col
%thead
%tr
@@ -32,5 +32,3 @@
%th{ ng: { show: 'columns.products.visible' } }
=t :products
%th.actions
%th.actions
%th.actions

View File

@@ -32,8 +32,9 @@
= t('.variants')
%td.actions
%a.edit-order-cycle.icon-edit.no-text{ ng: { href: '{{orderCycle.edit_path}}'}, 'ofn-with-tip' => t(:edit) }
%td.actions{ ng: { if: 'orderCycle.viewing_as_coordinator' } }
%a.clone-order-cycle.icon-copy.no-text{ ng: { href: '{{orderCycle.clone_path}}'}, 'ofn-with-tip' => t(:clone) }
%td.actions{ ng: { if: 'orderCycle.deletable && orderCycle.viewing_as_coordinator' }}
%a.delete-order-cycle.icon-trash.no-text{ ng: { href: '{{orderCycle.delete_path}}'}, data: { method: 'delete', confirm: t(:are_you_sure) }, 'ofn-with-tip' => t(:remove) }
.flex
%a.edit-order-cycle.icon-edit.no-text{ ng: { href: '{{orderCycle.edit_path}}'}, 'ofn-with-tip' => t(:edit) }
%div{ ng: { if: 'orderCycle.viewing_as_coordinator' } }
%a.clone-order-cycle.icon-copy.no-text{ ng: { href: '{{orderCycle.clone_path}}'}, 'ofn-with-tip' => t(:clone) }
%div{ ng: { if: 'orderCycle.deletable && orderCycle.viewing_as_coordinator' }}
%a.delete-order-cycle.icon-trash.no-text{ ng: { href: '{{orderCycle.delete_path}}'}, data: { method: 'delete', confirm: t(:are_you_sure) }, 'ofn-with-tip' => t(:remove) }

View File

@@ -1,5 +1,5 @@
%ul{style: "margin-left: 12pt"}
- report_subtypes.each do |report_subtype|
%li
- url = main_app.admin_report_url(report_type: report_type, report_subtype: report_subtype[1])
- url = main_app.admin_report_path(report_type: report_type, report_subtype: report_subtype[1])
= link_to report_subtype[0], url

View File

@@ -1,5 +1,3 @@
- report ||= @report
.report__table-container
%table.report__table
%thead

View File

@@ -1,7 +1,7 @@
- content_for :page_title do
= @report_title
= form_for @report.search, :url => url_for(only_path: false) do |f|
= form_for @report.search, :url => url_for do |f|
%fieldset.no-border-bottom.print-hidden
%legend{ align: 'center'}= t(:report_filters)
= render partial: "admin/reports/filters/#{@report_type}", locals: { f: f }
@@ -19,7 +19,4 @@
- if request.post?
%button.btn-print.icon-print{ onclick: "window.print()"}= t(:report_print)
/ We don't want to render data unless search params are supplied.
/ Compiling data can take a long time.
- if request.post?
= render "table"
= @table

View File

@@ -1,4 +1,3 @@
-# %show-more.text-center{ data: "filteredProducts", limit: "productLimit", increment: "10" }
.text-center{ ng: { show: "filteredProducts.length > productLimit" } }
%input{ type: 'button', value: t(:show_more), ng: { click: 'productLimit = productLimit + 10' } }

View File

@@ -9,7 +9,7 @@
= t :checkout_cart_total
%td.cart-total.text-right= display_checkout_subtotal(@order)
- checkout_adjustments_for(current_order, exclude: [:shipping, :payment, :line_item]).reject{ |a| a.amount == 0 }.each do |adjustment|
- checkout_adjustments_for(current_order, exclude: [:shipping, :payment, :line_item]).each do |adjustment|
%tr.adjustment
%th= adjustment.label
%td.text-right= adjustment.display_amount.to_html

View File

@@ -36,10 +36,6 @@
= action_cable_meta_tag
%body{ class: body_classes, "body-scroll": "true", "data-turbo": "false" }
/ [if lte IE 8]
= render partial: "shared/ie_warning"
= javascript_include_tag "iehack"
.off-canvas-wrap{ offcanvas: true }
.fixed.off-canvas-fixed
= render "shared/menu/menu" unless @hide_menu

View File

@@ -19,10 +19,6 @@
= csrf_meta_tags
%body.off-canvas{ style: "background-image: url(#{image_pack_path('tile-wide.png')})", "data-turbo": "false" }
/ [if lte IE 8]
= render partial: "shared/ie_warning"
= javascript_include_tag "iehack"
.off-canvas-wrap{offcanvas: true}
.inner-wrap

View File

@@ -3,7 +3,7 @@
.small-12.medium-6.columns.text-right
&nbsp;
.row.animate-show.filter-row{"ng-show" => "filtersActive"}
.row.animate-show{"ng-show" => "filtersActive"}
.small-12.columns
.row.filter-box
.small-12.columns

View File

@@ -2,6 +2,6 @@
- if defined? flashes
- flashes.each do |type, msg|
%alert.animate-show{"data-controller": "flash"}
%div{type: "#{type}", class: "alert-box #{type == 'error' ? 'alert' : type}"}
.flash{type: "#{type}", class: "alert-box #{type == 'error' ? 'alert' : type}"}
%span= msg
%a.small.close{"data-action": "click->flash#close"} ×

View File

@@ -1,31 +0,0 @@
.alert-box.alert#ie-warning{"data-alert" => ""}
.row.ie-msg
.small-4.large-2.columns
%i.ofn-i_012-warning
.small-8.large-10.columns
%h3
= t :ie_warning_headline
%p
= t :ie_warning_text
.row
.small-4.columns.browserbtn
%a.browserlogo{href: "https://www.google.com/intl/en_au/chrome/browser/", target: "_blank"}
%img{src: image_pack_path("browser-logos/chrome.png") }
%a{href: "https://www.google.com/intl/en_au/chrome/browser/", target: "_blank"}
= t :ie_warning_chrome
.small-4.columns.browserbtn
%a.browserlogo{href: "http://www.mozilla.org/en-US/firefox/new/", target: "_blank"}
%img{src: image_pack_path("browser-logos/firefox.png") }
%a{href: "http://www.mozilla.org/en-US/firefox/new/", target: "_blank"}
= t :ie_warning_firefox
.small-4.columns.browserbtn
%a.browserlogo{href: "http://windows.microsoft.com/en-AU/internet-explorer/download-ie", target: "_blank"}
%img{src: image_pack_path("browser-logos/internet-explorer.png") }
%a{href: "http://windows.microsoft.com/en-AU/internet-explorer/download-ie", target: "_blank"}
= t :ie_warning_ie
.row.ie-msg
.small-12.large-12.columns
.text-center
%em
= t :ie_warning_other
%a#closeie.close{href: "#"} ×

View File

@@ -4,7 +4,7 @@
.row
= render 'shared/components/filter_controls'
.row.animate-show.filter-row{"ng-show" => "filtersActive"}
.row.animate-show{"ng-show" => "filtersActive"}
.small-12.columns
.row.filter-box
.small-12.large-9.columns

View File

@@ -1,3 +1,3 @@
.already-ordered
.panel.medium-6
.panel
= t("split_checkout.already_ordered.message_html", cart: link_to(t('split_checkout.already_ordered.cart'), "#{main_app.cart_path}#bought-products"))

View File

@@ -1,5 +1,4 @@
%checkout.row#checkout
.small-12.medium-12.columns
= render partial: "split_checkout/tabs"
= render partial: "split_checkout/already_ordered" if show_bought_items? && checkout_step?(:summary)
= render partial: "split_checkout/form"

View File

@@ -89,7 +89,7 @@
"data-action": "toggle#toggle shippingmethod#selectShippingMethod",
"data-toggle-show": shipping_method.require_ship_address
= shipping_method_form.label shipping_method.id, shipping_method.name, {for: "shipping_method_" + shipping_method.id.to_s }
%em= payment_or_shipping_price(shipping_method, @order)
%em.fees= payment_or_shipping_price(shipping_method, @order)
- display_ship_address = display_ship_address || (ship_method_is_selected && shipping_method.require_ship_address)
%div.checkout-input{"data-shippingmethod-target": "shippingMethodDescription", "data-shippingmethodid": shipping_method.id , style: "display: #{ship_method_is_selected ? 'block' : 'none'}" }
#distributor_address.panel

View File

@@ -1,7 +1,7 @@
- content_for :injection_data do
= inject_saved_credit_cards
%div.checkout-step
%div.checkout-step{"class": if checkout_step?(:summary) then "checkout-summary" end}
= form_with url: checkout_update_path(checkout_step), model: @order, method: :put,
data: { remote: "true" } do |form|

View File

@@ -12,12 +12,12 @@
name: "order[payments_attributes][][payment_method_id]",
checked: (payment_method.id == selected_payment_method),
"data-action": "paymentmethod#selectPaymentMethod",
"data-paymentmethod-id": "paymentmethod#{payment_method.id}",
"data-paymentmethod-id": "#{payment_method.id}",
"data-paymentmethod-target": "input"
= f.label :payment_method_id, "#{payment_method.name}", for: "payment_method_#{payment_method.id}"
%em=payment_or_shipping_price(payment_method, @order)
%em.fees=payment_or_shipping_price(payment_method, @order)
.paymentmethod-container{"data-paymentmethod-id": "paymentmethod#{payment_method.id}", style: "display: #{payment_method.id == selected_payment_method ? "block" : "none"}"}
.paymentmethod-container{"data-paymentmethod-id": "#{payment_method.id}", style: "display: #{payment_method.id == selected_payment_method ? "block" : "none"}"}
- if payment_method.description && !payment_method.description.empty?
.paymentmethod-description.panel
#{payment_method.description}

View File

@@ -1,81 +1,95 @@
.medium-10
%div.checkout-substep
%div.checkout-title
= t("split_checkout.step3.your_details.title")
%div.summary
%span.summary-label
= t("split_checkout.step1.billing_address.first_name.label")
%span.summary-value
= @order.bill_address.firstname
%div.summary
%span.summary-label
= t("split_checkout.step1.billing_address.last_name.label")
%span.summary-value
= @order.bill_address.lastname
%div.summary
%span.summary-label
= t("split_checkout.step1.contact_information.email.label")
%span.summary-value
= @order.user ? @order.user.email : "Change me"
%div.summary
%span.summary-label
= t("split_checkout.step1.contact_information.phone.label")
%span.summary-value
= @order.bill_address.phone
%div.checkout-substep
%div.checkout-title
= t("split_checkout.step3.billing_address.title")
= render "summary_address", address: @order.bill_address
%div.checkout-substep
%div.checkout-title
= t("split_checkout.step3.shipping_address.title")
= render "summary_address", address: @order.shipping_address
%div.checkout-substep
%div.checkout-title
= t("split_checkout.step3.delivery_info.title")
%div.summary
%span.summary-label
= t("split_checkout.step1.shipping_info.title")
%span.summary-value
= @order.shipping_method.name
%div.summary-description
= @order.shipping_method.description
.summary-main
= render partial: "split_checkout/already_ordered" if show_bought_items? && checkout_step?(:summary)
.checkout-substep
.checkout-title
= t("split_checkout.step3.delivery_details.title")
%a.summary-edit{href: main_app.checkout_step_path(:details)}
= t("split_checkout.step3.your_details.edit")
= t("split_checkout.step3.delivery_details.edit")
%div.checkout-substep
%div.checkout-title
.summary-subtitle
= @order.shipping_method.name
%em.fees= payment_or_shipping_price(@order.shipping_method, @order)
.two-columns
%div
.summary-subtitle
= t("split_checkout.step3.delivery_details.address")
%span
= @order.bill_address.firstname
= @order.bill_address.lastname
%div
= @order.bill_address.phone
%div
= @order.user.email if @order.user
%br
%div
= @order.bill_address.address1
- unless @order.bill_address.address2.blank?
%div
= @order.bill_address.address2
%div
= @order.bill_address.city
%div
= @order.bill_address.state
%div
= @order.bill_address.zipcode
%div
= @order.bill_address.country
- if @order.shipping_method.description.present?
%div
.summary-subtitle
= t("split_checkout.step3.delivery_details.instructions")
%div
= @order.shipping_method.description
%hr
.checkout-substep
.checkout-title
= t("split_checkout.step3.payment_method.title")
%div.summary
%span.summary-value
= last_payment_method(@order)&.name
%div.summary-description
= last_payment_method(@order)&.description
%a.summary-edit{href: main_app.checkout_step_path(:payment)}
= t("split_checkout.step3.payment_method.edit")
.two-columns
%div
- payment_method = last_payment_method(@order)
= payment_method&.name
%em.fees=payment_or_shipping_price(payment_method, @order)
- if payment_method&.description.present?
%div
.summary-subtitle
= t("split_checkout.step3.payment_method.instructions")
%div
= last_payment_method(@order)&.description
%div.checkout-substep
%div.checkout-title
= t("split_checkout.step3.order.title")
%a.summary-edit{href: main_app.cart_path}
= t("split_checkout.step3.order.edit")
= render 'spree/orders/summary', order: @order
= render 'spree/orders/summary', order: @order, display_footer: false
.checkout-step3{"data-controller": "sticky", "data-sticky-target": "container"}
- if any_terms_required?(@order.distributor)
= render partial: "terms_and_conditions", locals: { f: f }
.medium-6
.checkout-submit
= f.submit t("split_checkout.step3.submit"), name: "confirm_order", class: "button primary", disabled: @terms_and_conditions_accepted == false || @platform_tos_accepted == false
%a.button.cancel{href: main_app.checkout_step_path(:payment)}
= t("split_checkout.step3.cancel")
.summary-right{ "data-controller": "sticky", "data-sticky-target": "container" }
.summary-right-line.total
.summary-right-line-label= t :order_total_price
.summary-right-line-value#order_total= @order.display_total.to_html
.summary-right-line
.summary-right-line-label= t :order_produce
.summary-right-line-value= display_checkout_subtotal(@order)
- checkout_adjustments_for(@order, exclude: [:line_item]).reverse_each do |adjustment|
.summary-right-line
.summary-right-line-label= adjustment.label
.summary-right-line-value= adjustment.display_amount.to_html
- if @order.total_tax > 0
.summary-right-line
.summary-right-line-label= t :order_includes_tax
.summary-right-line-value#tax-row= display_checkout_tax_total(@order)
.checkout-submit
- if any_terms_required?(@order.distributor)
= render partial: "terms_and_conditions", locals: { f: f }
= f.submit t("split_checkout.step3.submit"), name: "confirm_order", class: "button primary", disabled: @terms_and_conditions_accepted == false || @platform_tos_accepted == false

View File

@@ -1,36 +0,0 @@
%div.summary
%span.summary-label
= t("split_checkout.step1.address.address1.label")
%span.summary-value
= address.address1
- unless @order.bill_address.address2.blank?
%div.summary
%span.summary-label
= t("split_checkout.step1.address.address2.label")
%span.summary-value
= address.address2
%div.summary
%span.summary-label
= t("split_checkout.step1.address.city.label")
%span.summary-value
= address.city
%div.summary
%span.summary-label
= t("split_checkout.step1.address.state_id.label")
%span.summary-value
= address.state
%div.summary
%span.summary-label
= t("split_checkout.step1.address.zipcode.label")
%span.summary-value
= address.zipcode
%div.summary
%span.summary-label
= t("split_checkout.step1.address.country_id.label")
%span.summary-value
= address.country

View File

@@ -1,4 +1,4 @@
%div.checkout-substep.medium-6
%div.checkout-substep
%div.checkout-input
- if platform_terms_required? && distributor_terms_required?
= f.check_box :accept_terms, { name: "accept_terms", checked: all_terms_and_conditions_already_accepted? }, 1, nil
@@ -14,6 +14,3 @@
= t('split_checkout.step3.terms_and_conditions.message_html', terms_and_conditions_link: link_to( t("split_checkout.step3.terms_and_conditions.link_text"), @order.distributor.terms_and_conditions, target: '_blank'))
= f.error_message_on :terms_and_conditions, standalone: true
%div.checkout-input
= t("split_checkout.step3.agree")

View File

@@ -1,4 +1,4 @@
%div{"data-controller": "stripe-cards"}
%div{"data-controller": "stripe-cards", "data-paymentmethod-id": "#{payment_method.id}" }
- if @saved_credit_cards.any?
.checkout-input
%label

View File

@@ -20,11 +20,11 @@
%td{:align => "right"}
= item.quantity
%td{:align => "right"}
= item.included_tax > 0 ? item.display_included_tax : ""
= display_line_items_taxes(item)
%td{:align => "right"}
= item.display_amount_with_adjustments
- checkout_adjustments_for(@order, exclude: [:line_item]).reject{ |a| a.amount == 0 }.reverse_each do |adjustment|
- checkout_adjustments_for(@order, exclude: [:line_item]).reverse_each do |adjustment|
- taxable = adjustment.adjustable_type == "Spree::Shipment" ? adjustment.adjustable : adjustment
%tr
%td

View File

@@ -30,7 +30,7 @@
%td{:align => "right"}
= display_line_item_tax_rates(item)
- checkout_adjustments_for(@order, exclude: [:line_item]).reject{ |a| a.amount == 0 }.reverse_each do |adjustment|
- checkout_adjustments_for(@order, exclude: [:line_item]).reverse_each do |adjustment|
%tr
%td
%strong= "#{raw(adjustment.label)}"

View File

@@ -20,7 +20,8 @@
= t(".no_note_present")
%td.actions
= link_to '', '', class: 'edit-note icon_link icon-edit no-text with-tip', data: { action: 'edit' }, title: Spree.t('edit')
- if @order.note.present?
= link_to '', '', class: 'delete-note icon_link icon-trash no-text with-tip', data: { action: 'remove' }, title: Spree.t('delete')
.flex
= link_to '', '', class: 'edit-note icon_link icon-edit no-text with-tip', data: { action: 'edit' }, title: Spree.t('edit')
- if @order.note.present?
= link_to '', '', class: 'delete-note icon_link icon-trash no-text with-tip', data: { action: 'remove' }, title: Spree.t('delete')

View File

@@ -26,7 +26,7 @@
= Spree.t(:price)
%th
= Spree.t(:quantity)
%th
%th.force-rounded-right
= Spree.t(:total)
%th.orders-actions.actions{ "data-hook" => "admin_order_form_line_items_header_actions" }
@@ -57,8 +57,8 @@
%span
= shipment.fee_adjustment.display_amount
- if shipment.fee_adjustment.present? && shipment.can_modify?
%td.actions
%td.actions
- if shipment.fee_adjustment.present? && shipment.can_modify?
- if can? :update, shipment
= link_to '', '', :class => 'edit-method icon_link icon-edit no-text with-tip', :data => { :action => 'edit' }, :title => Spree.t('edit')
@@ -70,8 +70,9 @@
%td.actions
- if can?(:update, shipment) && !shipment.canceled?
= link_to '', '', :class => 'save-tracking icon_link icon-ok no-text with-tip', :data => { 'shipment-number' => shipment.number, :action => 'save' }, :title => I18n.t('actions.save')
= link_to '', '', :class => 'cancel-tracking icon_link icon-cancel no-text with-tip', :data => { :action => 'cancel' }, :title => I18n.t('actions.cancel')
.flex
= link_to '', '', :class => 'save-tracking icon_link icon-ok no-text with-tip', :data => { 'shipment-number' => shipment.number, :action => 'save' }, :title => I18n.t('actions.save')
= link_to '', '', :class => 'cancel-tracking icon_link icon-cancel no-text with-tip', :data => { :action => 'cancel' }, :title => I18n.t('actions.cancel')
%tr.show-tracking.total
%td{ :colspan => "5" }
@@ -84,6 +85,7 @@
%td.actions
- if can?(:update, shipment) && shipment.can_modify?
= link_to '', '', :class => 'edit-tracking icon_link icon-edit no-text with-tip', :data => { :action => 'edit' }, :title => Spree.t('edit')
- if shipment.tracking.present?
= link_to '', '', :class => 'delete-tracking icon_link icon-trash no-text with-tip', :data => { 'shipment-number' => shipment.number, :action => 'remove' }, :title => Spree.t('delete')
.flex
= link_to '', '', :class => 'edit-tracking icon_link icon-edit no-text with-tip', :data => { :action => 'edit' }, :title => Spree.t('edit')
- if shipment.tracking.present?
= link_to '', '', :class => 'delete-tracking icon_link icon-trash no-text with-tip', :data => { 'shipment-number' => shipment.number, :action => 'remove' }, :title => Spree.t('delete')

View File

@@ -19,10 +19,11 @@
%td.cart-item-delete.actions{ "data-hook" => "cart_item_delete" }
- if shipment.can_modify? && can?(:update, shipment)
= link_to '', '#', :class => 'save-item icon_link icon-ok no-text with-tip', :data => {'shipment-number' => shipment.number, 'variant-id' => item.variant.id, :action => 'save'}, :title => t('actions.save'), :style => 'display: none'
= link_to '', '#', :class => 'cancel-item icon_link icon-cancel no-text with-tip', :data => {:action => 'cancel'}, :title => t('actions.cancel'), :style => 'display: none'
= link_to '', '#', :class => 'edit-item icon_link icon-edit no-text with-tip', :data => {:action => 'edit'}, :title => t('actions.edit')
= link_to '', '#', :class => 'delete-item icon-trash no-text with-tip', :data => {'shipment-number' => shipment.number, 'variant-id' => item.variant.id, :action => 'remove'}, :title => t('actions.delete')
.flex
= link_to '', '#', :class => 'save-item icon_link icon-ok no-text with-tip', :data => {'shipment-number' => shipment.number, 'variant-id' => item.variant.id, :action => 'save'}, :title => t('actions.save'), :style => 'display: none'
= link_to '', '#', :class => 'cancel-item icon_link icon-cancel no-text with-tip', :data => {:action => 'cancel'}, :title => t('actions.cancel'), :style => 'display: none'
= link_to '', '#', :class => 'edit-item icon_link icon-edit no-text with-tip', :data => {:action => 'edit'}, :title => t('actions.edit')
= link_to '', '#', :class => 'delete-item icon-trash no-text with-tip', :data => {'shipment-number' => shipment.number, 'variant-id' => item.variant.id, :action => 'remove'}, :title => t('actions.delete')
= render 'spree/admin/shared/custom-alert'
= render 'spree/admin/shared/custom-confirm'

View File

@@ -32,7 +32,7 @@
%label{ :for => 'order_cycle_filter' }
= t("admin.order_cycle")
%br
%input#order_cycle_filter.ofn-select2.fullwidth{ type: 'number', 'min-search' => 5, data: 'orderCycles', placeholder: "#{t(:all)}", blank: "{ id: '', name: '#{t(:all)}' }", on: { selecting: "confirmRefresh" }, ng: { model: 'orderCycleFilter', change: "setOrderCycleDateRange()" } }
%input#order_cycle_filter.ofn-select2.fullwidth{ type: 'number', 'min-search' => 5, data: 'orderCycles', placeholder: "#{t(:all)}", blank: "{ id: '', name: '#{t(:all)}' }", on: { selecting: "confirmRefresh" }, ng: { model: 'orderCycleFilter' } }
.date_filter{class: "four columns"}
%label
= t("date_range")
@@ -94,14 +94,20 @@
= t("admin.orders.bulk_management.variants_without_unit_value")
%hr.divider.sixteen.columns.alpha.omega
.clear
.controls.sixteen.columns.alpha.omega{ ng: { hide: 'RequestMonitor.loading || line_items.length == 0' } }
%div.three.columns.alpha
%div{ ng: { hide: 'RequestMonitor.loading || line_items.length == 0' }, style: "display: flex; justify-content: flex-start; column-gap: 10px; margin-bottom: 15px" }
%div{ style: "flex-grow: 1" }
%input.fullwidth{ :type => "text", :id => 'quick_search', 'ng-model' => 'quickSearch', :placeholder => 'Quick Search' }
%div.three.columns
-# This -20px is a hack to make the dropdowns align properly
%div{ style: "margin-right: -20px;" }
= render 'admin/shared/bulk_actions_dropdown'
%div.ten.columns
%div
%columns-dropdown{ action: "#{controller_name}_#{action_name}" }
%div{ style: "flex-grow: 1"}
%div{ style: "float: right;"}
= render partial: 'admin/shared/angular_per_page_controls', locals: { position: "right" }
%div.sixteen.columns.alpha#loading{ 'ng-if' => 'RequestMonitor.loading' }
= render partial: "components/admin_spinner"
@@ -184,4 +190,7 @@
%td.actions
%a{ 'ng-click' => "deleteLineItem(line_item)", :class => "delete-line-item icon-trash no-text" }
%div{'ng-show' => "!RequestMonitor.loading && orders.length > 0" }
= render partial: 'admin/shared/angular_pagination'
= render 'spree/admin/shared/custom-confirm'

View File

@@ -30,15 +30,17 @@
="#{t('admin.actions')}".html_safe
%span{ 'ng-class' => "expanded && 'icon-caret-up' || !expanded && 'icon-caret-down'" }
%div.menu{ 'ng-show' => "expanded" }
%div.menu_item
%span.name{ "data-controller": "modal-link", "data-action": "click->modal-link#open", "data-modal-link-target-value": "resend_confirmation" }
= t('.resend_confirmation')
%div.menu_item
%span.name.invoices-modal{'ng-controller' => 'bulkInvoiceCtrl', 'ng-click' => 'createBulkInvoice()' }
= t('.print_invoices')
%div.menu_item
%span.name{'ng-controller' => 'bulkCancelCtrl', 'ng-click' => 'cancelSelectedOrders()' }
= t('.cancel_orders')
= render partial: 'per_page_controls', locals: { position: "right" }
= render partial: 'admin/shared/angular_per_page_controls', locals: { position: "right" }
%table#listing_orders.index.responsive{width: "100%", 'ng-init' => 'initialise()', 'ng-show' => "!RequestMonitor.loading && orders.length > 0" }
%colgroup
@@ -63,7 +65,7 @@
%tbody
%tr{ng: {repeat: 'order in orders track by order.id', class: {even: "'even'", odd: "'odd'"}}, 'ng-class' => "{'state-{{order.state}}': true, 'row-loading': rowStatus[order.id] == 'loading'}"}
%td.align-center
%input{type: 'checkbox', 'ng-model' => 'checkboxes[order.id]', 'ng-change' => 'toggleSelection(order.id)'}
%input{type: 'checkbox', 'ng-model' => 'checkboxes[order.id]', 'ng-change' => 'toggleSelection(order.id)', value: '{{order.id}}', name: 'order_ids[]'}
%td.align-center
{{order.distributor_name}}
%td.align-center
@@ -118,3 +120,7 @@
= t('.no_orders_found')
= render 'spree/admin/shared/custom-confirm'
= render ConfirmModalComponent.new(id: "resend_confirmation", confirm_actions: "click->resend-confirmation-email#confirm", controllers: "resend-confirmation-email") do
.margin-bottom-30
= t('.resend_confirmation_confirm_html')

View File

@@ -43,7 +43,7 @@
j(line_item.display_amount_with_adjustments.format(symbol: false, with_currency: false))] }
.join('" + \'\x0A\' + "')}",
'\x0A',
"#{checkout_adjustments_for(@order, exclude: [:line_item])
"#{checkout_adjustments_for(@order, exclude: [:line_item], reject_zero_amount: false)
.reject{ |a| a.amount == 0 }
.reverse.map { |adjustment| '%5s %-27.27s%8.8s' %
["",

View File

@@ -15,5 +15,6 @@
%td.align-center
%span{class: "state #{payment.state}"}= t(payment.state, scope: "spree.payment_states", default: payment.state.capitalize)
%td.actions
- payment.actions.each do |action|
= link_to_with_icon "icon-#{action}", Spree.t(action), fire_admin_order_payment_path(@order, payment, e: action), method: :put, no_text: true, data: {action: action, disable_with: ""}
.flex
- payment.actions.each do |action|
= link_to_with_icon "icon-#{action}", Spree.t(action), fire_admin_order_payment_path(@order, payment, e: action), method: :put, no_text: true, data: {action: action, disable_with: ""}

View File

@@ -14,7 +14,10 @@
%link{:href => "https://fonts.googleapis.com/css?family=Open+Sans:400italic,600italic,400,600,700&subset=latin,cyrillic,greek,vietnamese", :rel => "stylesheet", :type => "text/css"}
= stylesheet_pack_tag 'admin-styles', media: "screen, print"
- if feature?(:admin_style_v2, spree_current_user)
= stylesheet_pack_tag 'admin-styles-v2', media: "screen, print"
- else
= stylesheet_pack_tag 'admin-styles', media: "screen, print"
= render "layouts/bugsnag_js"
= javascript_include_tag 'admin/all'

View File

@@ -11,6 +11,8 @@
- if flash[:success]
.flash.success= flash[:success]
= render partial: "shared/flashes"
= render partial: "spree/layouts/admin/progress_spinner"
%header#header{"data-hook" => ""}

View File

@@ -40,7 +40,7 @@
= t :email_order_summary_subtotal
%td{align: "right"}
= display_checkout_subtotal(@order)
- checkout_adjustments_for(@order, exclude: [:line_item]).reject{ |a| a.amount == 0 }.reverse_each do |adjustment|
- checkout_adjustments_for(@order, exclude: [:line_item]).reverse_each do |adjustment|
%tr
%td{align: "right", colspan: "3"}
= "#{raw(adjustment.label)}:"

View File

@@ -31,7 +31,7 @@
%span.order-total.item-total= display_checkout_subtotal(@order)
%td
- checkout_adjustments_for(@order, exclude: [:line_item]).reject{ |a| a.amount == 0 }.reverse_each do |adjustment|
- checkout_adjustments_for(@order, exclude: [:line_item]).reverse_each do |adjustment|
%tr.order-adjustment
%td.text-right{:colspan => "3"}
= adjustment.label

View File

@@ -1,3 +1,5 @@
- display_footer = true if display_footer.nil?
%table#line-items{"data-hook" => "order_details"}
%col{valign: "middle"}/
%col{halign: "center", valign: "middle", width: "5%"}/
@@ -26,36 +28,4 @@
%td.text-right.total{"data-hook" => "order_item_total"}
%span= item.display_amount_with_adjustments.to_html
%tfoot
#subtotal{"data-hook" => "order_details_subtotal"}
%tr#subtotal-row.total
%td.text-right{colspan: "3"}
%strong
= t :order_produce
%td.text-right.total
%span= display_checkout_subtotal(order)
#order-charges{"data-hook" => "order_details_adjustments"}
- checkout_adjustments_for(order, exclude: [:line_item]).reject{ |a| a.amount == 0 }.reverse_each do |adjustment|
%tr.total
%td.text-right{:colspan => "3"}
%strong
= adjustment.label
%td.text-right.total
%span= adjustment.display_amount.to_html
#order-total{"data-hook" => "order_details_total"}
%tr.total
%td.text-right{colspan: "3"}
%h5
= t :order_total_price
%td.text-right.total
%h5#order_total= order.display_total.to_html
- if order.total_tax > 0
#tax{"data-hook" => "order_details_tax"}
%tr#tax-row.total
%td.text-right{colspan: "3"}
= t :order_includes_tax
%td.text-right.total
%span= display_checkout_tax_total(order)
= render partial: "spree/orders/totals_footer", locals: { order: order } if display_footer

View File

@@ -0,0 +1,33 @@
%tfoot
#subtotal{"data-hook" => "order_details_subtotal"}
%tr#subtotal-row.total
%td.text-right{colspan: "3"}
%strong
= t :order_produce
%td.text-right.total
%span= display_checkout_subtotal(order)
#order-charges{"data-hook" => "order_details_adjustments"}
- checkout_adjustments_for(order, exclude: [:line_item]).reverse_each do |adjustment|
%tr.total
%td.text-right{:colspan => "3"}
%strong
= adjustment.label
%td.text-right.total
%span= adjustment.display_amount.to_html
#order-total{"data-hook" => "order_details_total"}
%tr.total
%td.text-right{colspan: "3"}
%h5
= t :order_total_price
%td.text-right.total
%h5#order_total= order.display_total.to_html
- if order.total_tax > 0
#tax{"data-hook" => "order_details_tax"}
%tr#tax-row.total
%td.text-right{colspan: "3"}
= t :order_includes_tax
%td.text-right.total
%span= display_checkout_tax_total(order)

View File

@@ -5,15 +5,6 @@ document.addEventListener("turbolinks:before-cache", () =>
);
export default class extends Controller {
connect() {
setTimeout(this.fadeout.bind(this), 3000);
}
fadeout() {
this.element.classList.add("animate-hide-500");
setTimeout(this.close.bind(this), 500);
}
close() {
this.element.remove();
}

View File

@@ -55,6 +55,7 @@ export default class extends Flatpickr {
mode,
};
window.addEventListener("flatpickr:change", this.onChangeEvent.bind(this));
window.addEventListener("flatpickr:clear", this.clear.bind(this));
}
clear(e) {

View File

@@ -1,33 +1,10 @@
import { Controller } from "stimulus";
import { useOpenAndCloseAsAModal } from "./mixins/useOpenAndCloseAsAModal";
export default class extends Controller {
static targets = ["background", "modal"];
open() {
this.backgroundTarget.style.display = "block";
this.modalTarget.style.display = "block";
setTimeout(() => {
this.modalTarget.classList.add("in");
this.backgroundTarget.classList.add("in");
document.querySelector("body").classList.add("modal-open");
});
}
close() {
this.modalTarget.classList.remove("in");
this.backgroundTarget.classList.remove("in");
document.querySelector("body").classList.remove("modal-open");
setTimeout(() => {
this.backgroundTarget.style.display = "none";
this.modalTarget.style.display = "none";
}, 200);
}
closeIfEscapeKey(e) {
if (e.code == "Escape") {
this.close();
}
connect() {
useOpenAndCloseAsAModal(this);
}
}

View File

@@ -1,15 +1,7 @@
import { Controller } from "stimulus";
import ModalLinkController from "./modal_link_controller";
export default class extends Controller {
static values = { target: String };
open() {
let helpModal = document.getElementById(this.targetValue);
let helpModalController =
this.application.getControllerForElementAndIdentifier(
helpModal,
"help-modal"
);
helpModalController.open();
export default class extends ModalLinkController {
getIdentifier() {
return "help-modal";
}
}

View File

@@ -0,0 +1,31 @@
export const useOpenAndCloseAsAModal = (controller) => {
Object.assign(controller, {
open: function () {
this.backgroundTarget.style.display = "block";
this.modalTarget.style.display = "block";
setTimeout(() => {
this.modalTarget.classList.add("in");
this.backgroundTarget.classList.add("in");
document.querySelector("body").classList.add("modal-open");
});
}.bind(controller),
close: function () {
this.modalTarget.classList.remove("in");
this.backgroundTarget.classList.remove("in");
document.querySelector("body").classList.remove("modal-open");
setTimeout(() => {
this.backgroundTarget.style.display = "none";
this.modalTarget.style.display = "none";
}, 200);
}.bind(controller),
closeIfEscapeKey: function (e) {
if (e.code == "Escape") {
this.close();
}
}.bind(controller),
});
};

View File

@@ -0,0 +1,15 @@
import { Controller } from "stimulus";
import { useOpenAndCloseAsAModal } from "./mixins/useOpenAndCloseAsAModal";
export default class extends Controller {
static targets = ["background", "modal"];
connect() {
useOpenAndCloseAsAModal(this);
window.addEventListener("modal:close", this.close.bind(this));
}
disconnect() {
window.removeEventListener("modal:close", this.close);
}
}

View File

@@ -0,0 +1,18 @@
import { Controller } from "stimulus";
export default class extends Controller {
static values = { target: String };
open() {
let modal = document.getElementById(this.targetValue);
let modalController = this.application.getControllerForElementAndIdentifier(
modal,
this.getIdentifier()
);
modalController.open();
}
getIdentifier() {
return "modal";
}
}

View File

@@ -12,17 +12,12 @@ export default class extends Controller {
selectPaymentMethod(event) {
this.setPaymentMethod(event.target.dataset.paymentmethodId);
const stripeCardSelector =
this.application.getControllerForElementAndIdentifier(
document
.querySelector(
`[data-paymentmethod-id="${event.target.dataset.paymentmethodId}"]`
)
.querySelector('[data-controller="stripe-cards"]'),
"stripe-cards"
);
stripeCardSelector?.initSelectedCard();
// Send an event to the right (ie. the one with the same paymentmethodId)
// StripeCardsController to initialize the form elements with the selected card
const customEvent = new CustomEvent("stripecards:initSelectedCard", {
detail: event.target.dataset.paymentmethodId,
});
document.dispatchEvent(customEvent);
}
setPaymentMethod(paymentMethodContainerId) {

View File

@@ -0,0 +1,18 @@
import ApplicationController from "./application_controller";
export default class extends ApplicationController {
connect() {
super.connect();
}
confirm() {
const order_ids = [];
document
.querySelectorAll("#listing_orders input[name='order_ids[]']:checked")
.forEach((checkbox) => {
order_ids.push(checkbox.value);
});
this.stimulate("ResendConfirmationEmailReflex#confirm", order_ids);
}
}

View File

@@ -15,7 +15,7 @@ export default class extends Controller {
this.containerTarget.style.bottom = "-1px";
const observer = new IntersectionObserver(
([e]) => {
e.target.classList.toggle("sticked", e.intersectionRatio <= 1);
e.target.classList.toggle("sticked", e.intersectionRatio < 1);
},
{ threshold: [1] }
);

View File

@@ -7,6 +7,11 @@ export default class extends Controller {
connect() {
this.initSelectedCard();
document.addEventListener("stripecards:initSelectedCard", (e) => {
if (e.detail == this.element.dataset.paymentmethodId) {
this.initSelectedCard();
}
});
}
initSelectedCard() {

View File

@@ -127,5 +127,4 @@
@import "app/components/pagination_component/pagination_component";
@import "app/components/table_header_component/table_header_component";
@import "app/components/search_input_component/search_input_component";
@import "v2/main.scss";
@import 'app/components/confirm_modal_component/confirm_modal_component';

View File

@@ -38,6 +38,7 @@
font-size: 120%;
color: $color-1;
font-weight: 600;
margin-top: 0;
&.notice { background-color: rgba($color-notice, 0.8) }
&.success { background-color: rgba($color-success, 0.8) }

View File

@@ -0,0 +1,16 @@
// Basic color palette for admin
$color-1: #FFFFFF !default; // White
$color-2: #9FC820 !default; // Green
$color-3: #5498DA !default; // Light Blue
$color-4: #6788A2 !default; // Dark Blue
$color-5: #C60F13 !default; // Red
$color-6: #FF9300 !default; // Yellow
@mixin basicColorPalette($color1, $color2, $color3, $color4, $color5, $color6) {
$color-1: $color1 !global;
$color-2: $color2 !global;
$color-3: $color3 !global;
$color-4: $color4 !global;
$color-5: $color5 !global;
$color-6: $color6 !global;
}

View File

@@ -9,14 +9,6 @@ $base-font-family: "Open Sans", "Helvetica Neue", "Helvetica", Helvetica, Arial,
// Colors
//--------------------------------------------------------------
// Basic color palette for admin
$color-1: #FFFFFF !default; // White
$color-2: #9FC820 !default; // Green
$color-3: #5498DA !default; // Light Blue
$color-4: #6788A2 !default; // Dark Blue
$color-5: #C60F13 !default; // Red
$color-6: #FF9300 !default; // Yellow
// Body base colors
$color-body-bg: $color-1 !default;
$color-body-text: $color-4 !default;

View File

@@ -11,27 +11,41 @@ select[type="submit"],
input[type="button"],
select[type="button"],
.select2-container-multi [type="button"].select2-choices,
button,
button:not(.no-text),
.button,
.actions a:not([class*="icon-"]),
.actions a:not(.no-text),
fieldset .filter-actions button, // Be more specific to be sure to override the form button style (with a white border)
fieldset .filter-actions .button:hover,
.admin__section-header .ofn-drop-down // Same behavior as the button
{
&.disabled,
&[disabled] {
@include backgroundAndBorder($v2-light-grey);
@include backgroundAndBorder($v2-blue-light);
&:hover {
@include backgroundAndBorder($v2-blue);
box-shadow: $v2-box-shadow;
}
&:not(.disabled):not([disabled]):not(.secondary) {
// Change the color of the button only if it's not disabled
@include backgroundAndBorder($v2-blue-light);
&.disabled,
&[disabled],
&.disabled.secondary,
&[disabled].secondary {
@include backgroundAndBorder($v2-dark-light-grey);
box-shadow: none;
cursor: default;
color: white;
&:hover {
@include backgroundAndBorder($v2-blue);
box-shadow: $v2-box-shadow;
@include backgroundAndBorder($v2-dark-light-grey);
box-shadow: none;
cursor: default;
color: white;
}
}
&.secondary {
&.secondary,
&.cancel,
&.icon-remove,
&#clear_all_filters {
background-color: $white;
border: 2px solid $v2-blue-light;
color: $v2-blue-light;
@@ -60,7 +74,6 @@ button,
}
}
#table-filter fieldset:has(.actions) {
// do not apply border to filter actions as it's drawn by the #table-filter .actions before and after pseudo elements
#table-filter fieldset {
border-bottom: 0;
}

View File

@@ -0,0 +1,9 @@
/* Override app/webpacker/css/admin/dropdown.scss */
.ofn-drop-down,
.ofn-drop-down-with-prepend .ofn-drop-down-prepend {
background-color: white;
&.disabled {
opacity: 0.9;
}
}

View File

@@ -0,0 +1,11 @@
/* Override file app/webpacker/css/admin/components/sidebar.scss */
#sidebar {
border-color: #e7e7e7;
.sidebar-title {
color: $v2-blue;
& > span {
background-color: $v2-body-bg;
}
}
}

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