Compare commits

...

626 Commits

Author SHA1 Message Date
Luis Ramos
d5b37a5171 Merge pull request #4079 from HugsDaniel/defacepocalypse-payments
[Defacepocalypse] De-deface payments
2019-08-14 19:30:33 +01:00
Luis Ramos
3efe2f878d Merge pull request #4156 from coopdevs/fix-styling-in-paypal-tests
Fix Rubocop violations in PayPal tests
2019-08-14 15:59:14 +01:00
Luis Ramos
064fee79b3 Merge pull request #4151 from Matt-Yorkley/datadog_apm
Enable (optional) APM with Datadog
2019-08-14 15:58:48 +01:00
Luis Ramos
d13f182801 Merge pull request #4154 from Matt-Yorkley/fix_deployments2
Adjust user creation syntax
2019-08-14 15:56:32 +01:00
Luis Ramos
ee34935223 Fix a typo in docker.md 2019-08-14 13:55:58 +01:00
Pau Perez
0b7ce0d6db Fix Rubocop violations in PayPal tests 2019-08-14 13:33:53 +02:00
Matt-Yorkley
9dd02044a5 Fix "can't modify frozen string" error in validation callbacks 2019-08-14 10:24:30 +01:00
Matt-Yorkley
d8a7190f43 Adjust user creation syntax
#skip_confirmation! can't be chained...
2019-08-14 09:22:11 +01:00
Matt-Yorkley
e5e0fcc887 Enable DelayedJob APM 2019-08-14 08:20:47 +01:00
Pau Pérez Fabregat
6635a89af7 Merge pull request #4153 from Matt-Yorkley/fix_deployments
Fix deployments
2019-08-14 08:59:23 +02:00
Matt-Yorkley
8c95399292 Don't prompt if admin user already exists 2019-08-13 21:02:12 +01:00
Matt-Yorkley
14c1abb861 Skip confirmation email on initial admin user creation 2019-08-13 21:00:30 +01:00
Matt-Yorkley
be844253eb Enable (optional) Rails APM with Datadog 2019-08-13 18:57:49 +01:00
luisramos0
b4ffd4dcc2 Update all locales with the latest Transifex translations 2019-08-13 18:25:23 +01:00
Pau Pérez Fabregat
9eabbb8dab Merge pull request #4140 from openfoodfoundation/transifex
Transifex
2019-08-13 12:00:48 +02:00
Pau Pérez Fabregat
d4f2fcb98a Merge pull request #4126 from Matt-Yorkley/cart_dropdown
Cart dropdown now closes when clicking outside it.
2019-08-13 10:57:56 +02:00
Matt-Yorkley
0b2417849c Merge pull request #4142 from mkllnk/seed-user
Seed user
2019-08-13 08:42:07 +01:00
Matt-Yorkley
3e8369c8f5 Merge pull request #4123 from Matt-Yorkley/navigation-css
Navigation css
2019-08-13 08:41:47 +01:00
Maikel Linke
cbaedcec92 Fix seeding of default user without asking 2019-08-13 09:47:54 +10:00
Matt-Yorkley
0284eebf35 Fix cart dropdown positioning 2019-08-09 11:50:33 +01:00
Maikel Linke
e4ba515109 Seed admin user without asking by default 2019-08-09 14:16:01 +10:00
Maikel Linke
af1f6f6c6d Skip confirmation when creating first admin user 2019-08-09 14:16:01 +10:00
Maikel Linke
b0e8ee42c1 Restore spree_auth_devise user seeding 2019-08-09 13:48:50 +10:00
Maikel
86aeb6a3c7 Merge pull request #4135 from coopdevs/remove-bugherd-tests
Remove bugherd specs
2019-08-09 12:53:23 +10:00
Transifex-Openfoodnetwork
9820d7de38 Updating translations for config/locales/ca.yml 2019-08-09 02:36:02 +10:00
Pau Pérez Fabregat
910eca810a Merge pull request #4124 from Matt-Yorkley/order_email
Add SKU to order confirmation email
2019-08-08 18:35:20 +02:00
Transifex-Openfoodnetwork
6feaddf747 Updating translations for config/locales/es.yml 2019-08-09 02:33:35 +10:00
Transifex-Openfoodnetwork
10f6fb91f6 Updating translations for config/locales/ca.yml 2019-08-09 02:32:54 +10:00
Pau Pérez Fabregat
c7bd4b94b8 Merge pull request #4137 from openfoodfoundation/transifex
Transifex
2019-08-08 18:31:47 +02:00
Transifex-Openfoodnetwork
dd223a21f2 Updating translations for config/locales/nb.yml 2019-08-08 20:58:24 +10:00
Transifex-Openfoodnetwork
549366ff15 Updating translations for config/locales/fr.yml 2019-08-08 20:52:28 +10:00
Transifex-Openfoodnetwork
e92f60fb1c Updating translations for config/locales/fr.yml 2019-08-08 20:49:20 +10:00
Pau Pérez Fabregat
92b05c76a3 Merge pull request #4068 from luisramos0/replace_oc_rabl
Convert order_cycle.rabl to Api::OrderCycleSerializer
2019-08-08 12:23:09 +02:00
Hugo Daniel
fa6fa0be64 Add missing translation 2019-08-08 11:11:32 +02:00
Kristina Lim
752efac7cf Merge pull request #4051 from luisramos0/subs_unpause
Sync subscription (create/update orders) when subscription is unpaused
2019-08-08 01:09:09 +08:00
Pau Perez
2b1f1f748b Remove bugherd specs
I don't think these are worth the time it takes to execute them every
time but most importantly I believe we are not using Bugherd anymore.
2019-08-07 16:49:32 +02:00
Pau Pérez Fabregat
798cd9e778 Merge pull request #4114 from kristinalim/fix/4103-add_specs
4103 Add specs for referencing of shipments to deleted variants
2019-08-07 12:52:11 +02:00
Maikel
de2d4a5870 Merge pull request #4125 from Matt-Yorkley/variant_overrides
Variant overrides with on_demand
2019-08-07 10:25:32 +10:00
Matt-Yorkley
d3d6921a0f Use light grey colour with transparency. 2019-08-06 08:23:38 +01:00
Maikel
68393f1444 Merge pull request #4037 from luisramos0/subs_stock
Subscriptions - When editing subscriptions, check stock levels when changing orders in current OC
2019-08-06 15:16:00 +10:00
Maikel
229e6fa0a3 Merge pull request #4073 from luisramos0/kill_more_rabl
Replace update_prod_image.rabl with ImageSerializer in api/product_image_controller
2019-08-06 15:00:33 +10:00
Matt-Yorkley
8a069787d1 Cart dropdown now closes when clicking outside it. 2019-08-05 21:48:37 +01:00
Matt-Yorkley
29ed38a6cc Add unit tests for overriding #move 2019-08-05 17:01:56 +01:00
Matt-Yorkley
4c7d3a491a Don't decrement variant stock if override is on_demand 2019-08-05 17:01:56 +01:00
Matt-Yorkley
b0f90cf43c Add test for variant override with :on_demand 2019-08-05 17:01:54 +01:00
Pau Pérez Fabregat
02ec0634b3 Merge pull request #4120 from openfoodfoundation/dependabot/bundler/webmock-3.6.2
Bump webmock from 3.6.0 to 3.6.2
2019-08-05 15:13:31 +02:00
Pau Pérez Fabregat
64d21969f0 Merge pull request #4064 from luisramos0/convert_search_Rabl
Replace views/admin/variants/search.rabl with Api::Admin::VariantSerializer
2019-08-05 15:07:10 +02:00
Pau Pérez Fabregat
0995adeb59 Merge pull request #4085 from openfoodfoundation/dependabot/bundler/devise-encryptable-0.2.0
Bump devise-encryptable from 0.1.2 to 0.2.0
2019-08-05 15:01:46 +02:00
Pau Pérez Fabregat
073a3fe2b4 Merge pull request #4119 from openfoodfoundation/transifex
Transifex
2019-08-05 13:18:12 +02:00
Matt-Yorkley
c07df6a5a6 Fix table column alignments 2019-08-04 20:45:00 +01:00
Matt-Yorkley
a7d109833d Add SKU to order confirmation email 2019-08-04 20:43:55 +01:00
Matt-Yorkley
0364a14073 Add navigation bottom border on mobile view 2019-08-04 16:56:43 +01:00
Matt-Yorkley
ddc8d33356 Update border colour on navigation bar 2019-08-04 16:56:03 +01:00
Kristina Lim
cd81dfaead Move deleted variant to let block in feature spec 2019-08-02 21:52:36 +08:00
Kristina Lim
25073ada84 Move order to a let block in feature spec 2019-08-02 21:52:33 +08:00
Kristina Lim
15b6f9dd5e Add specs testing edit order page still okay when variant deleted
Note that the wrapping example group also loads the edit order page
before this "before" block. This will be fixed in the next commit.
2019-08-02 21:45:39 +08:00
Kristina Lim
0377e02dc1 Add specs testing that shipments see deleted variants 2019-08-02 21:45:38 +08:00
dependabot-preview[bot]
f679708a4e Bump webmock from 3.6.0 to 3.6.2
Bumps [webmock](https://github.com/bblimke/webmock) from 3.6.0 to 3.6.2.
- [Release notes](https://github.com/bblimke/webmock/releases)
- [Changelog](https://github.com/bblimke/webmock/blob/master/CHANGELOG.md)
- [Commits](https://github.com/bblimke/webmock/compare/v3.6.0...v3.6.2)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2019-08-01 19:15:26 +00:00
Transifex-Openfoodnetwork
0f748a3333 Updating translations for config/locales/en_GB.yml 2019-08-02 04:32:50 +10:00
Transifex-Openfoodnetwork
bdedaa06d8 Updating translations for config/locales/en_GB.yml 2019-08-02 04:29:40 +10:00
Pau Pérez Fabregat
6a41d9be87 Merge pull request #4092 from coopdevs/remove-admin-products-N+1
Remove N+1 while fetching distributors of OCs
2019-08-01 19:50:49 +02:00
Pau Perez
3616a27566 Update all locales with the latest Transifex translations 2019-08-01 15:07:09 +02:00
Matt-Yorkley
5ae61017f5 Merge pull request #4091 from Matt-Yorkley/missing_css
Move CSS rule to SCSS and remove broken css file reference
2019-07-31 23:48:52 +01:00
Luis Ramos
61dffb8821 Merge pull request #4093 from openfoodfoundation/dependabot/bundler/redcarpet-3.5.0
Bump redcarpet from 3.4.0 to 3.5.0
2019-07-31 20:53:43 +01:00
Luis Ramos
f9fabd088c Merge pull request #4075 from HugsDaniel/defacepocalypse-payment-methods
[Defacepocalypse] De-deface payment methods index
2019-07-31 15:49:48 +01:00
Hugo Daniel
a3af6617a9 Convert payments/show from erb to haml 2019-07-31 16:20:32 +02:00
Hugo Daniel
9f7fb654c8 Import payments/show.html.erb from spree_backend 2019-07-31 16:16:26 +02:00
Hugo Daniel
b4a6686eac Convert payments/_list from erb to haml 2019-07-31 16:15:38 +02:00
Hugo Daniel
ac13ff114c Import payments/_list.html.erb from spree_backend 2019-07-31 16:09:48 +02:00
Hugo Daniel
af9187947f Convert erb to haml 2019-07-31 16:02:48 +02:00
Hugo Daniel
f0fdbf7cf4 Import payments/index from spree_backend 2019-07-31 14:33:38 +02:00
Hugo Daniel
74ab31c0e6 Import gateway.html.erb and convert to haml 2019-07-31 14:28:15 +02:00
luisramos0
9400516b56 Fix broken (was always green) bulk_product_update_spec updating image spec where the old src url was not stored and the expect command was wrong with != 2019-07-30 20:37:26 +01:00
luisramos0
6ebfb02d0e Update ImageSerializer with missing image size urls: mini/thumb_url, product/image_url that is used in the product image modal 2019-07-30 20:15:21 +01:00
Luis Ramos
75c7e0b939 Merge pull request #4089 from luisramos0/undeface-fix
Add doctype declaration in layouts/admin view
2019-07-30 19:29:17 +01:00
Luis Ramos
62eb2bba13 Merge pull request #4059 from luisramos0/kill_rabl
Convert 2 rabl templates to AMS and remove a few unused ones
2019-07-30 19:28:21 +01:00
Luis Ramos
3fa9e857a8 Merge pull request #4067 from luisramos0/oc_icon
Add icon to OC menu entry
2019-07-30 14:08:08 +01:00
luisramos0
11a77043eb Switch from Spree::Api::BaseController to Api::BaseController so that AMS is activated 2019-07-30 12:20:14 +01:00
luisramos0
58b43c7bc9 Remove update_product_image.v1.rabl and switch controller from respond_with to render json to switch from rabl to AMS 2019-07-30 12:19:42 +01:00
dependabot-preview[bot]
7da10db055 Bump redcarpet from 3.4.0 to 3.5.0
Bumps [redcarpet](https://github.com/vmg/redcarpet) from 3.4.0 to 3.5.0.
- [Release notes](https://github.com/vmg/redcarpet/releases)
- [Changelog](https://github.com/vmg/redcarpet/blob/master/CHANGELOG.md)
- [Commits](https://github.com/vmg/redcarpet/compare/v3.4.0...v3.5.0)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2019-07-29 19:16:07 +00:00
luisramos0
be41271038 Make spelling coherent, as we have serializers with Z we get rid of the few serialisers with S we have 2019-07-29 19:57:12 +01:00
luisramos0
04e13e1136 Change css styling from id to class to make rubocop happy. Keeping id name as it may be needed in spree autocomplete css or js code 2019-07-29 19:46:12 +01:00
luisramos0
8868b7eb12 Fix rubocop issue: use nested class/module definition 2019-07-29 19:05:39 +01:00
Pau Perez
c85d00fcb8 Remove N+1 while fetching distributors of OCs
What used to be done as

```sql
SELECT "order_cycles".* FROM "order_cycles"
WHERE (order_cycles.orders_open_at <= '2019-07-29 17:45:20.137294'
  AND order_cycles.orders_close_at >= '2019-07-29 17:45:20.137333')

SELECT DISTINCT "enterprises".* FROM "enterprises"
INNER JOIN "exchanges" ON "enterprises"."id" = "exchanges"."receiver_id"
WHERE "exchanges"."order_cycle_id" = 1
  AND "exchanges"."incoming" = 'f'
(...)
SELECT DISTINCT "enterprises".* FROM "enterprises"
INNER JOIN "exchanges" ON "enterprises"."id" = "exchanges"."receiver_id"
WHERE "exchanges"."order_cycle_id" = 4
  AND "exchanges"."incoming" = 'f'
```

it became

```sql
SELECT "order_cycles".* FROM "order_cycles"
WHERE (order_cycles.orders_open_at <= '2019-07-29 17:45:20.137294'
  AND order_cycles.orders_close_at >= '2019-07-29 17:45:20.137333')

SELECT "exchanges".* FROM "exchanges"
WHERE "exchanges"."incoming" = 'f'
  AND "exchanges"."order_cycle_id" IN (1, 2, 3, 4)

SELECT "enterprises".* FROM "enterprises"
WHERE "enterprises"."id" IN (3, 4, 5, 6)
```

I haven't got any perf numbers yet but each of the N+1 queries took as
long as the single `enterprises` query on my dev machine.

This should have a noticeable perf impact since the changed method
belongs to the `BaseController` seems to be executed in all HTML
requests as it gets called by

```ruby
before_filter :warn_invalid_order_cycles, if: :html_request?
```
2019-07-29 20:02:47 +02:00
luisramos0
2c6dab9c85 Add spec for Api::OrderCycleSerializer 2019-07-29 18:56:49 +01:00
Matt-Yorkley
7b2a146404 Move CSS rule to SCSS and remove broken css file reference 2019-07-29 18:16:36 +01:00
luisramos0
c45194473b Add spec to cover inject_current_order_cycle 2019-07-29 18:14:00 +01:00
luisramos0
3c0e6eeee2 Make inject_current_order_cycle render {} instad of null if current_order_cycle is null 2019-07-29 18:13:29 +01:00
luisramos0
ca5a5bf301 Convert oc.rabl to oc serializer and use it in both haml file and controller 2019-07-29 18:13:29 +01:00
luisramos0
ddf68444fb Move head scripts from admin layout to haed partial 2019-07-29 17:04:57 +01:00
luisramos0
4867649fc9 Remove dead code related to unused variable in spree: expand_variants 2019-07-29 17:04:57 +01:00
Pau Pérez Fabregat
35841066d1 Merge pull request #4086 from openfoodfoundation/transifex
Transifex
2019-07-29 17:33:19 +02:00
luisramos0
9bc81f236c Add doctype declaration as it is defined in spree layouts/admin so that html5 mode is enabled, otherwise html 4 mode is used by browsers and the observed layout problems happen 2019-07-29 13:46:35 +01:00
luisramos0
e26a54d897 Fix indentation problem in layouts/admin view
We move most entries inside wrapper as it should be and the last ones "admin_footer_scripts" and Spree.api_key inside the body tag as it should be
2019-07-29 13:33:11 +01:00
Transifex-Openfoodnetwork
ed1d637eb5 Updating translations for config/locales/es.yml 2019-07-29 19:06:20 +10:00
Transifex-Openfoodnetwork
831284c5c8 Updating translations for config/locales/es.yml 2019-07-29 19:03:13 +10:00
Transifex-Openfoodnetwork
e45b8f6981 Updating translations for config/locales/ca.yml 2019-07-29 19:02:24 +10:00
Transifex-Openfoodnetwork
d0f8f985fb Updating translations for config/locales/es.yml 2019-07-29 19:00:02 +10:00
Transifex-Openfoodnetwork
33eec61af8 Updating translations for config/locales/ca.yml 2019-07-29 18:59:14 +10:00
Transifex-Openfoodnetwork
00c324ae45 Updating translations for config/locales/fr.yml 2019-07-29 18:01:09 +10:00
Transifex-Openfoodnetwork
12a016d31d Updating translations for config/locales/fr.yml 2019-07-29 17:57:59 +10:00
dependabot-preview[bot]
8c7a7348f4 Bump devise-encryptable from 0.1.2 to 0.2.0
Bumps [devise-encryptable](https://github.com/plataformatec/devise-encryptable) from 0.1.2 to 0.2.0.
- [Release notes](https://github.com/plataformatec/devise-encryptable/releases)
- [Changelog](https://github.com/plataformatec/devise-encryptable/blob/master/Changelog.md)
- [Commits](https://github.com/plataformatec/devise-encryptable/compare/v0.1.2...v0.2.0)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2019-07-26 23:12:41 +00:00
Luis Ramos
af50bde088 Merge pull request #3786 from ja9-look/feature/sticky_header_on_scroll_mobile
sticky header for mobile
2019-07-26 11:22:33 +01:00
Luis Ramos
340b92e580 Merge pull request #3700 from luisramos0/2-0-without-auth-devise
Remove dependency to spree_auth_devise
2019-07-26 10:57:38 +01:00
luisramos0
f64653db14 Add icon to OC menu entry 2019-07-26 10:52:31 +01:00
Maikel
e6ef661f0d Merge pull request #4066 from luisramos0/reorg_spec_serializers
Organizing spec/serializers - put each file in the correct place
2019-07-26 16:23:23 +10:00
Hugo Daniel
3c2b6f4ed1 Remove data-hooks 2019-07-25 14:38:09 +02:00
Hugo Daniel
6a621f47aa Remove data-hooks 2019-07-25 14:31:07 +02:00
Kristina Lim
dae23d3c3b Remove unused inclusion of $window in OffcanvasCtrl 2019-07-25 20:22:51 +08:00
Hugo Daniel
aae5ae9f1e De-deface payments/new 2019-07-25 13:27:41 +02:00
Hugo Daniel
888e0e0bb4 Convert erb partials to haml 2019-07-25 13:22:55 +02:00
Hugo Daniel
a0b0fb05a6 Import payments/new from spree_backend to ofn 2019-07-25 13:22:32 +02:00
Kristina Lim
def2693afc Move offcanvas JS to Angular controller 2019-07-25 17:01:46 +08:00
Luis Ramos
55f26f0a3d Merge pull request #4043 from luisramos0/bring_shipment
Bring spree/admin/orders/shipment and shipment_manifest partials from spree_backend and fix an authorization bug
2019-07-24 21:59:47 +01:00
Luis Ramos
7245d1eff4 Merge pull request #4049 from luisramos0/deface_admin_orders
De-deface admin orders adjustments page and customer details page
2019-07-24 21:59:08 +01:00
Hugo Daniel
87ef0215b8 De-deface payment_methods/index 2019-07-24 14:49:29 +02:00
Hugo Daniel
4b6a02cb92 Convert payment_methods/index from ERB to Haml 2019-07-24 14:39:59 +02:00
Hugo Daniel
196a301133 Import payment_methods/index.html.erb from spree_backend to ofn 2019-07-24 14:38:20 +02:00
luisramos0
b9b8bc70dd Remove stock location name from shipment header in the order edit page 2019-07-24 11:50:17 +01:00
Kristina Lim
d42da8737e Improve readability of selectors in page alert JS directive 2019-07-24 12:44:42 +08:00
Kristina Lim
6419edcb1f Integrate styles/animations for page alert, top bar, tab bar, off canvas 2019-07-24 12:44:42 +08:00
Kristina Lim
fca82375e8 Render home page alert as :page_alert outside main content 2019-07-24 12:44:42 +08:00
Kristina Lim
ca0f746cf1 Fix animation and layout for offcanvas menu
Uses strategy from this forum comment:
http://foundation.zurb.com/forum/posts/547#comment_8840
2019-07-24 12:43:44 +08:00
Kristina Lim
a93cf46f50 Fix syntax of existing animations for offcanvas 2019-07-24 12:37:42 +08:00
luisramos0
ffb8edef0b Fix rubocop css issues 2019-07-23 22:37:10 +01:00
luisramos0
74a030f6db Organizing spec/serializers - put each file in the correct place acccording to its namespace 2019-07-23 22:17:28 +01:00
luisramos0
7a8b5e89be Add specs to cover the most important new fields in api/admin/variant_serializer 2019-07-23 22:11:00 +01:00
luisramos0
90690cd238 Move api/admin/variant_serializer_spec to the correct folder under /spec 2019-07-23 22:03:40 +01:00
luisramos0
90c621ac07 Improve translations, css and add button aligment in subscriptions_line_items variant autocomplete 2019-07-23 21:38:29 +01:00
luisramos0
2d5eccbf97 Add :in_stock, :stock_location_id, :stock_location_name to admin variant serializer, these are needed for the variant_autocomplete js code from spree 2019-07-23 21:38:29 +01:00
luisramos0
7e6259da31 Replace admin/variants/search rabl template with existing admin variant serializer with a few added attributes
This commit fixes a bug as the image of the variatn was not being rendered, we need to fetch the image of the product, not the image of the variant.
2019-07-23 21:37:45 +01:00
Luis Ramos
1f75c7e5e4 Merge pull request #4047 from luisramos0/undeface
De-deface some admin configuration pages and the general admin layout and menu
2019-07-23 18:36:09 +01:00
luisramos0
a1e6e4c38f Fix rubocop issues 2019-07-23 14:35:24 +01:00
Luis Ramos
77fb73f802 Merge pull request #4065 from coopdevs/get-latest-spree-revision
Brings in the latest Spree fork's Git commit
2019-07-23 14:28:49 +01:00
Pau Perez
9f7376a5ae Brings in the latest Spree fork's Git commit
This successfully closes #3903 by bringing in the changes done in
https://github.com/openfoodfoundation/spree/pull/41.
2019-07-23 14:56:33 +02:00
luisramos0
5739a82c19 Remove unused admin variants search rabl template 2019-07-23 12:30:00 +01:00
Luis Ramos
eae373ef4b Merge pull request #4061 from openfoodfoundation/revert-3938-get-last-spree-fork-patch
Revert "Handle soft deleted variants in order edit"
2019-07-22 21:06:10 +01:00
Luis Ramos
465332d5f9 Revert "Handle soft deleted variants in order edit" 2019-07-22 21:05:41 +01:00
Luis Ramos
e98b89625f Merge pull request #3938 from openfoodfoundation/get-last-spree-fork-patch
Handle soft deleted variants in order edit
2019-07-22 21:05:12 +01:00
luisramos0
cf61254c9e Remove unnecesary rabl template 2019-07-22 18:42:20 +01:00
luisramos0
1d92d6cc33 Remove unused api endpoint order_cycles and also action enterprises/managed and respective views 2019-07-22 17:35:41 +01:00
luisramos0
6b32764c99 Remove unused taxon.rabl from views/json 2019-07-22 16:29:54 +01:00
Pau Perez
be4fbc4d23 Update Gemfile to get spree from a feature branch
This allows us to test
https://github.com/openfoodfoundation/spree/pull/41. If it passes
testing I will then revert it back to the `2-0-4-stable` branch but
updating the target commit in the Gemfile.lock.
2019-07-22 15:40:31 +02:00
luisramos0
ea72a10b9a Remove unused rabl files from views/json 2019-07-22 12:14:10 +01:00
luisramos0
9b567a6710 Remove injection_json that renders json partials, we only use ams serializers now, not rabl partials 2019-07-21 23:55:59 +01:00
luisramos0
a8ce31fa90 Replace views/json/_flash.rabl with an ams injector with serializer 2019-07-21 22:56:15 +01:00
luisramos0
4c964fea0d Replace views/json/_current_user.rabl with an ams injector with serializer 2019-07-21 22:48:36 +01:00
luisramos0
6d7c41c04b Bring db/default/users from spree_auth_devise, this is necessary to create the first user in the DB 2019-07-20 20:48:49 +01:00
Luis Ramos
a6a695660f Merge pull request #4002 from luisramos0/more_rails4
Adapting queries in permissions to Rails 4
2019-07-19 15:17:01 +01:00
Luis Ramos
0058ef5e04 Merge pull request #4048 from idanceinbetween/4034
Add grey line below nav bar, change logo img max height 44px
2019-07-19 12:13:14 +01:00
Luis Ramos
4831bae9cb Merge pull request #3953 from mkllnk/3727-first-credit-card-default
First stored credit card becomes default again
2019-07-19 12:12:09 +01:00
Luis Ramos
f7679780de Merge pull request #4032 from luisramos0/subs_oc_date_issue
3544 Add date format to moment date conversion
2019-07-18 19:52:49 +01:00
luisramos0
f2ac354e00 Make features/admin/orders_spec test a bit more reliable by expecting element to be there before using it 2019-07-18 14:29:38 +01:00
Maikel
88ffa46ce7 Merge pull request #4045 from openfoodfoundation/transifex
Transifex
2019-07-18 16:35:41 +10:00
Maikel
869431c68d Merge pull request #3926 from mkllnk/report-missing-payments
Add rake task to report lost payments
2019-07-18 15:01:14 +10:00
luisramos0
3d6fd10e59 Add warning about creation of orders when unpausing a subscription 2019-07-17 12:14:36 +01:00
luisramos0
81482683cf Extract method in subs controller 2019-07-17 12:08:51 +01:00
luisramos0
57f1742f24 Save subscription form on subs unpause so that proxy orders and orders are synced 2019-07-17 12:08:48 +01:00
Maikel
a1f8530489 Merge pull request #3962 from luisramos0/first_view_spec
First 2 view specs in OFN
2019-07-17 10:57:58 +10:00
luisramos0
a75a0da981 Remove unused deface in spree/admin/orders/show, this action doesnt exist in ofn v2 2019-07-16 21:12:48 +01:00
luisramos0
5744240f91 Move customer_details/_form defaces to the view 2019-07-16 21:12:09 +01:00
luisramos0
873c56a642 Move customer_details/edit/replace_customer_search deface to view 2019-07-16 21:09:48 +01:00
luisramos0
f53a75660f Convert spree/admin/orders/customer_details view from erb to haml 2019-07-16 21:05:19 +01:00
luisramos0
50dcbe0b57 Bring spree/admin/order/customer_details from spree_backend 2019-07-16 21:03:35 +01:00
luisramos0
f9861fee79 De-deface spree/admin/adjustments/_adjustments_table by moving deface content to the view 2019-07-16 21:01:08 +01:00
luisramos0
d8ae97f923 Move spree/admin/adjustments/_form/add_tax_rate deface to view 2019-07-16 20:53:24 +01:00
luisramos0
9f5db217fe Convert spree/admin/adjustments views from erb to haml 2019-07-16 20:51:55 +01:00
luisramos0
c1c5dcac09 Bring spree/admin/adjustments pages from spree_backend 2019-07-16 20:51:55 +01:00
luisramos0
6064f096a7 Fix a pre-existing problem in orders_tab by moving the links in to the li elements 2019-07-16 20:16:32 +01:00
luisramos0
a62fa755f5 Remove page_title_classes as it is breaking the rendering of the classes attribute and it is no longer used 2019-07-16 20:16:32 +01:00
luisramos0
fa25991f0f Fix problem in previous de-deface, move sections around in general settings page to keep order. No changes in code, just moving 2019-07-16 20:16:32 +01:00
luisramos0
6f2be1dfa6 Fix issue in layouts/admin view, make classes compute correctly 2019-07-16 20:16:32 +01:00
luisramos0
c81a9fd032 Fix error in js tag in head 2019-07-16 20:16:32 +01:00
luisramos0
665d0cc86b Fix error related to missing _hamlout method by replacing code with standard haml 2019-07-16 20:16:32 +01:00
luisramos0
a34d8a3f20 Revert "Move app_wrapper deface to spree/layouts/admin view"
This reverts commit bb18f6ecf3c1d0ecf7c010623215d161a6102f2b.
2019-07-16 20:16:32 +01:00
luisramos0
6e35701dd6 Remove unused add_enterprise_fees_to_admin_configurations_menu deface, this menu entry is already in the view 2019-07-16 20:16:32 +01:00
luisramos0
9991458d2a Remove spree/admin/shared/_order_details defaces, these are only used in admin/order/show which is a view that is not used in ofn anymore, only admin/order/edit is used 2019-07-16 20:16:32 +01:00
luisramos0
a843fd73b7 Remove admin/shared/_order_tabs/add_customer_name, this is already in the order tabs view 2019-07-16 20:16:32 +01:00
luisramos0
9765b1e908 Move admin/shared/_head/replace_spree_title deface to head view 2019-07-16 20:16:32 +01:00
luisramos0
5ccadc1f7d Convert spree/admin/shared/_head view from erb to haml 2019-07-16 20:16:32 +01:00
luisramos0
539805e2c2 Bring spree/admin/shared/head partial from spree_backend 2019-07-16 20:16:32 +01:00
luisramos0
fac64ef5bf Remove layouts/spree_application/inside_head deface, this view is in spree_frontend which is not used in ofn anymore 2019-07-16 20:16:32 +01:00
luisramos0
a17a0a62bc Move spree/layouts/bare_admin/add_login_nav deface to layout/bare_admin view 2019-07-16 20:16:32 +01:00
luisramos0
1e91de106f Move admin html head deface to layout admin view and remove repeated (in shared/head partial) content type tag 2019-07-16 20:16:32 +01:00
luisramos0
73252132a6 Move add_i18n_script deface to layout/admin view 2019-07-16 20:16:32 +01:00
luisramos0
e3c383c61c Convert spree/admin/shared/_tabs.html from erb to haml and move menu entries from layouts/admin to the tabs view 2019-07-16 20:16:32 +01:00
luisramos0
aafb134be7 Move spree/layouts/admin/ tabs deface to spree/layout/admin view 2019-07-16 20:16:32 +01:00
luisramos0
70a1996435 Move add_currency_config deface to spree/layout/admin view 2019-07-16 20:16:31 +01:00
luisramos0
1712cb2617 Move app_wrapper deface to spree/layouts/admin view
In admin layout, only adds a div after the body tag.
2019-07-16 20:16:31 +01:00
luisramos0
25df057d05 Move spree/layouts/admin/add_analytics deface to spree/layouts/admin view 2019-07-16 20:16:31 +01:00
luisramos0
24a9991162 Convert views/spree/layouts/admin.html from erb to haml 2019-07-16 20:16:31 +01:00
luisramos0
156ff2da89 Bring spree/layouts/admin from spree_backend to de-deface it 2019-07-16 20:16:31 +01:00
luisramos0
e36b4ed01a Move temp_controller_list deface to shipping_categories index view 2019-07-16 20:16:23 +01:00
idanceinbetween
41b775b173 Remove multiline 2019-07-16 20:10:18 +01:00
idanceinbetween
35570feba0 Comment out new changes 2019-07-16 20:04:50 +01:00
idanceinbetween
1d8cfe59a2 Change hex value to variable 2019-07-16 19:37:08 +01:00
idanceinbetween
abd3efe82a Replace lightgray to hex 2019-07-16 19:32:19 +01:00
idanceinbetween
389b53cb71 Add grey line below nav bar, change logo img max height 44px 2019-07-16 19:14:10 +01:00
luisramos0
4f60273198 Move temperature_controlled_form_element deface to shipping_categories form view 2019-07-16 14:50:16 +01:00
luisramos0
856fa8685a Convert spree/admin/shipping_categories views from erb to haml 2019-07-16 14:48:47 +01:00
luisramos0
9ac4c0ba30 Bring spree/admin/shipping categories from spree_backend so we can de-deface it 2019-07-16 14:46:26 +01:00
luisramos0
2709f237f5 Move image_format deface to image settings view 2019-07-16 14:44:38 +01:00
luisramos0
9db4edcd0d Convert spree/admin/image_settings/edit.html from erb to haml 2019-07-16 14:43:20 +01:00
luisramos0
22c9f33f4c Bring image_settings view from spree_backend 2019-07-16 14:39:14 +01:00
luisramos0
24ea2a4398 Move number_localization deface to general settings view 2019-07-16 14:28:47 +01:00
luisramos0
8178f5388c Move legal settings deface to general settings view 2019-07-16 14:27:32 +01:00
luisramos0
c0c5e9d7dd Move embedded_shopfronts deface to general settings view 2019-07-16 14:26:33 +01:00
luisramos0
19f8f5c6fa Convert general_settings/edit.html from erb to haml 2019-07-16 14:15:51 +01:00
luisramos0
83a306c31b Convert class attributes to . notation in haml 2019-07-16 14:09:48 +01:00
luisramos0
d6020cdb6f Bring general_settings/edit.html.erb from spree_backend to de-deface it 2019-07-16 13:57:35 +01:00
luisramos0
3b467dbae8 Adapt line_item_syncer to the case where item is not added to the completed order because of insufficient stock and the subscription quantity is updated for that item afterwards 2019-07-16 12:08:08 +01:00
Kristina Lim
77c78f35d3 Update all locales with the latest Transifex translations 2019-07-16 18:53:24 +08:00
luisramos0
306390440a Revert "Swith line_item_syncer.create_new_items from deleting line item in the case of stock issue, to simply set the quantity to zero. This makes things easier later as the line item is already present if the user tries to change quantity of the subscription_line_item"
This reverts commit d153e58933.
2019-07-16 11:00:21 +01:00
luisramos0
267131626e Fix typo and add test case to cover out of stock case 2019-07-16 10:58:25 +01:00
Luis Ramos
2280b15664 Merge pull request #4035 from kristinalim/fix/4033-remove_line_item_adjustments_when_line_item_removed
4033 Remove line item adjustments when line item removed
2019-07-16 09:54:33 +01:00
Transifex-Openfoodnetwork
f843a0b4d9 Updating translations for config/locales/en_AU.yml 2019-07-16 17:08:24 +10:00
Transifex-Openfoodnetwork
965a274332 Updating translations for config/locales/en_AU.yml 2019-07-16 17:05:40 +10:00
Transifex-Openfoodnetwork
cb2a842746 Updating translations for config/locales/en_AU.yml 2019-07-16 17:05:17 +10:00
luisramos0
a6655623d0 New admin orders edit view spec and workaround (current_ability) to make view specs work 2019-07-15 21:59:36 +01:00
luisramos0
2a2d05ad39 First view spec in OFN testing the print invoice button display in the orders list page 2019-07-15 21:59:36 +01:00
luisramos0
e8127d81dc Change how we display variant name in order edit page, use VariantAndLineItemNaming helper method 2019-07-15 18:37:19 +01:00
luisramos0
cd7906a57b Move translations from Spree.t to root and add them to en.yml 2019-07-15 17:48:10 +01:00
luisramos0
02c573f146 Remove logic that hides item split, because the partial is now in the ofn codebase, we can now simply remove the split-item button 2019-07-15 17:11:41 +01:00
luisramos0
112017a158 Remove variants/split partial from orders/shipments partial
In OFN we have one shipment per order so it doesnt make sense to split items between shipments
2019-07-15 17:07:33 +01:00
luisramos0
4a07d67037 Convert spree/admin/orders/_shipment partial from erb to haml 2019-07-15 16:42:45 +01:00
luisramos0
54156dfd32 Convert spree/admin/orders/_shipment_manifest partial from erb to haml 2019-07-15 16:42:19 +01:00
luisramos0
ee20d35487 Fix authorization issue in shipment actions, authorization was being done on a struct (shipment manifest), now it's done on the shipment itself
This is similar to https://github.com/spree/spree/pull/5624
2019-07-15 15:38:46 +01:00
luisramos0
be18244abc Bring views/spree/admin/orders/_shipment and views/spree/admin/orders/_shipment_manifest from spree backend 2019-07-15 15:37:24 +01:00
luisramos0
02099ebdae Remove details about stock in line_item_syncer so that we avoid confusing the user with stock numbers, this way the user will know what is the problem and can check stock levels and the order for more details 2019-07-14 21:40:57 +01:00
luisramos0
d153e58933 Swith line_item_syncer.create_new_items from deleting line item in the case of stock issue, to simply set the quantity to zero. This makes things easier later as the line item is already present if the user tries to change quantity of the subscription_line_item 2019-07-14 20:59:42 +01:00
luisramos0
c2a59a374c Fix rubocop issues by simplifying method 2019-07-14 17:21:15 +01:00
luisramos0
2a1011921b Reuse line_item_syncer.add_order_update_issue in line_item_syncer.update_item_quantities to add stock info to the update_quantity order issues 2019-07-14 16:43:46 +01:00
luisramos0
df27ee0d3e Refactor line_item_syncer.add_order_update_issue out of line_item_syncer.create_new_items 2019-07-14 16:06:09 +01:00
luisramos0
c2851015ce Fix deleting created item (destroy doesnt work before save) and add order_update_issue with message so that user can understand what happened 2019-07-14 15:58:00 +01:00
luisramos0
d0c246c345 Fix some rubocop issues 2019-07-14 12:28:32 +01:00
Kristina Lim
e58546a412 Move offcanvas menu content to separate partial 2019-07-14 13:52:47 +08:00
luisramos0
6aed9ba549 Make line_item_syncer delete new line items if stock is insufficient 2019-07-13 22:57:13 +01:00
luisramos0
4f2bc33ec3 Change line_item_syncer to verify stock if order is already complete, this will happen for orders in the current OC when a subscription is changed 2019-07-13 20:56:34 +01:00
luisramos0
0f3404ca27 Rename order_syncer.future_and_undated_orders to explicitly include completed orders from current OC: orders_in_order_cycles_not_closed 2019-07-12 22:20:09 +01:00
Kristina Lim
2c279fd02d Remove line item adjustments if line item deleted 2019-07-13 03:58:01 +10:00
Kristina Lim
8a048cc155 Add proof line item adjustments remain after line item removal 2019-07-13 01:43:07 +08:00
Luis Ramos
b3c378e8c1 Merge pull request #4029 from Matt-Yorkley/js_render_blocking2
Js render blocking 2
2019-07-12 16:34:31 +01:00
Luis Ramos
39475be792 Merge pull request #4030 from Matt-Yorkley/line_item_errors
LineItems can always access soft-deleted variants
2019-07-12 16:33:36 +01:00
luisramos0
9e2e460ac5 Add date format to moment date conversion. This conversion was not working on firefox 2019-07-12 12:01:18 +01:00
luisramos0
18006ea9c8 Change devise config to speed up password encryption in tests 2019-07-12 10:12:53 +01:00
luisramos0
71b648e9fa Add some tests to features/admin/users_spec from spree_auth_devise 2019-07-12 10:02:40 +01:00
luisramos0
eacd76bfa4 Add spec to features/admin/products_spec from spre_auth_devise 2019-07-11 19:47:17 +01:00
luisramos0
791ff842aa Add some tests to models/spree/user_spec from spre_auth_devise 2019-07-11 19:39:31 +01:00
luisramos0
ac0123734a Add some tests from spree/users_controller_spec from spree_auth_devise 2019-07-11 18:33:18 +01:00
luisramos0
7cab99efdf Run transpec on users_controller 2019-07-11 18:07:23 +01:00
luisramos0
5378bb7b34 Add adapted version of spree/admin/users_controller_spec from spree_auth_devise 2019-07-11 17:45:56 +01:00
luisramos0
942824cd74 Improve comments in UserMailer 2019-07-11 16:37:30 +01:00
Pau Pérez Fabregat
bdeb56bfaf Merge pull request #4028 from openfoodfoundation/transifex
Transifex
2019-07-11 17:28:38 +02:00
Matt-Yorkley
fb4e573cfa Add a soft-deleted test in line_item_spec 2019-07-11 16:07:30 +01:00
Transifex-Openfoodnetwork
e65df31bc3 Updating translations for config/locales/nl_BE.yml 2019-07-12 00:29:50 +10:00
Transifex-Openfoodnetwork
ce1ac57522 Updating translations for config/locales/de_DE.yml 2019-07-11 23:53:17 +10:00
Transifex-Openfoodnetwork
09ff57d462 Updating translations for config/locales/en_BE.yml 2019-07-11 23:50:31 +10:00
Transifex-Openfoodnetwork
542cf0cf4f Updating translations for config/locales/fr_BE.yml 2019-07-11 23:43:29 +10:00
Transifex-Openfoodnetwork
f4113745ce Updating translations for config/locales/fr.yml 2019-07-11 23:11:32 +10:00
Transifex-Openfoodnetwork
6d197c53e0 Updating translations for config/locales/en_ZA.yml 2019-07-11 21:40:38 +10:00
Matt-Yorkley
b2c6e6271c LineItems can always access soft-deleted variants 2019-07-11 11:33:34 +01:00
Luis Ramos
cdd36eeefc Merge pull request #3674 from Matt-Yorkley/spree2/import_description
Allow import to proceed when updating a product and `description` is set
2019-07-10 21:09:30 +01:00
Matt-Yorkley
97148f6f57 Send embedded Stripe javascript to :injection_data 2019-07-10 19:28:20 +01:00
Matt-Yorkley
6219b3f0c3 Revert "Revert "Fix JS render-blocking in Darkswarm""
This reverts commit ffeca41e
2019-07-10 17:14:08 +01:00
Transifex-Openfoodnetwork
d66cac7a26 Updating translations for config/locales/ca.yml 2019-07-10 21:20:51 +10:00
Transifex-Openfoodnetwork
07c11b9b1f Updating translations for config/locales/es.yml 2019-07-10 21:18:28 +10:00
Transifex-Openfoodnetwork
6a232a1f36 Updating translations for config/locales/ca.yml 2019-07-10 21:17:43 +10:00
Maikel
1a61357be8 Merge pull request #4024 from openfoodfoundation/transifex
Transifex
2019-07-10 11:17:12 +10:00
Maikel
b2eeb5d687 Merge pull request #4025 from openfoodfoundation/revert-3988-js_render_blocking
Revert "Fix JS render-blocking in Darkswarm"
2019-07-10 11:00:17 +10:00
Maikel
ffeca41ef4 Revert "Fix JS render-blocking in Darkswarm" 2019-07-10 10:24:25 +10:00
Transifex-Openfoodnetwork
68c0936766 Updating translations for config/locales/en_GB.yml 2019-07-10 04:39:47 +10:00
Luis Ramos
23b6267e30 Merge pull request #3916 from luisramos0/schedules_of_coordinator
OC schedules are now filtered to schedules of OCs with same coordinator
2019-07-09 14:21:34 +01:00
Luis Ramos
6872ccfb72 Merge pull request #3963 from luisramos0/hide_invoices
Hide invoices feature
2019-07-09 14:20:50 +01:00
luisramos0
b1b791e4ee Update all locales with the latest Transifex translations 2019-07-09 14:19:35 +01:00
Luis Ramos
1779b759f7 Merge pull request #4017 from openfoodfoundation/transifex
Transifex
2019-07-09 14:15:38 +01:00
Transifex-Openfoodnetwork
3ebbf5a55d Updating translations for config/locales/fr.yml 2019-07-09 22:42:05 +10:00
Luis Ramos
83ce2ac3dc Merge pull request #3988 from Matt-Yorkley/js_render_blocking
Fix JS render-blocking in Darkswarm
2019-07-09 12:30:30 +01:00
Luis Ramos
aaf850a095 Merge pull request #4010 from luisramos0/fuubar_upgrade
Apply 2.1.1 hotfix to master
2019-07-09 12:24:54 +01:00
Luis Ramos
3e9bf8aa1f Merge pull request #3964 from openfoodfoundation/hand-soft-deleted-products-in-orders-and-fulfillment-report
Handle soft deleted products in orders and fulfillment report
2019-07-09 12:19:28 +01:00
luisramos0
95832c96ac Delete redundant spec, this case is now covered in a view spec 2019-07-09 09:15:38 +01:00
Luis Ramos
8a700307d2 Merge pull request #3992 from Matt-Yorkley/cart_button_bug
Fix display bug in cart button on mobile menu
2019-07-08 18:33:36 +01:00
luisramos0
86accc227e Convert erb files brought from spree_auth_devise to haml 2019-07-08 18:09:03 +01:00
Luis Ramos
1756ddd0e9 Merge pull request #3989 from Matt-Yorkley/preload_primary_font
Preload primary font to speed up page rendering
2019-07-08 17:43:15 +01:00
Luis Ramos
fe71781d70 Merge pull request #3791 from jazzdragon/1766-registration-scroll
1766 registration scroll
2019-07-08 15:10:35 +01:00
Luis Ramos
ec65951ef3 Merge pull request #3959 from jonleighton/issue-1848
Edit tooltip text to make it readable
2019-07-08 15:09:11 +01:00
luisramos0
1681e8a572 Remove unused auth config 2019-07-08 14:06:01 +01:00
luisramos0
e897eb0439 Remove Spree::BaseController.class_eval, these methods are already in the application helper through spree::application_helpers
We can ignore the difference in spree_logout_path as spree.logout_path is the user_sessions#destroy route
2019-07-08 13:59:26 +01:00
luisramos0
36e3362fc1 Adding missing translation that is now being used after being brought from spree_auth_devise 2019-07-08 13:23:18 +01:00
luisramos0
10e123a9c4 Move spree/authentication_helpers injection from spree initializers directly to the application_controller
Also, switch from using send to public_send making rubocop happier
2019-07-08 13:11:57 +01:00
luisramos0
0101dcdd93 Remove unused Spree::Dash from controllers brought from spree_auth_devise 2019-07-08 13:10:52 +01:00
luisramos0
9416f61fb3 Remove spree/checkout_controller.completion_route only used in spree/checkout_controller.update which is never used in OFN. Checkout update happpens in the checkout_controller.update 2019-07-08 13:04:38 +01:00
luisramos0
8efd69c3d1 Remove unnecessary checkout registration code, it's not used in OFN 2019-07-08 12:57:17 +01:00
luisramos0
dcbdfbb081 Fix rubocop issues in multiple files copied from spree_auth_devise, mostly hash rockets 2019-07-08 11:22:56 +01:00
luisramos0
92968c5efe Merge spree/users_sessions_controller into spree/users_sessions from spree_auth_devise 2019-07-07 22:06:18 +01:00
luisramos0
c8ac64566f Merge spree/users_controller_decorator into spree/user_controller 2019-07-07 22:04:04 +01:00
Transifex-Openfoodnetwork
633c7737e4 Updating translations for config/locales/en_ZA.yml 2019-07-08 04:04:48 +10:00
luisramos0
05a72be273 Move handle_asynchronously :send_reset_password_instructions to after send_reset_password_instructions declaration
This was as it was before the merge of user_decorator and user, the declaration was in the original class and the handle_asynchronously part was in the decorator which was loaded after the main user class from spree_auth_devise, this commit restores the order and fixes a spec in authentication_spec
2019-07-07 17:53:12 +01:00
luisramos0
b1cd950051 Add missing translation keys from spree_auth_devise 2019-07-07 17:12:54 +01:00
luisramos0
f557996817 Add deface overrides from spree_auth_devise for the users menu tab, the admin top bar and the shared login bar (maybe dead code this last one) 2019-07-06 22:53:20 +01:00
luisramos0
1a64a737d4 Add ActionController::Metal frorm spree_auth_devise for api authentication 2019-07-06 10:50:48 +01:00
luisramos0
7c0087cb30 Remove reference to empty spree_auth css and js files from spree_auth_devise 2019-07-06 00:02:40 +01:00
luisramos0
17448699f9 Bring devise initializer from spree_auth_devise and fix spree initializer details 2019-07-05 22:45:59 +01:00
luisramos0
a413f22e12 Remove unnecessary dependency to spree/users helper 2019-07-05 22:37:07 +01:00
luisramos0
893952f46b Merge user_mailer_decorator into user_mailer 2019-07-05 22:31:06 +01:00
luisramos0
061e3cd722 Add user mailer from spree_auth_devise 2019-07-05 22:29:51 +01:00
luisramos0
a83790951d Add model auth_config from spree_auth_devise 2019-07-05 21:58:29 +01:00
luisramos0
4e33529845 Merge user_decorator.rb into user.rb 2019-07-05 21:58:28 +01:00
luisramos0
a2a8b330b7 Add User class from spree_auth_devise as is 2019-07-05 21:58:28 +01:00
luisramos0
9669016573 Add required views from spree_auth_devise 2019-07-05 21:58:28 +01:00
luisramos0
2755cb9ec7 Add users_tab partial from spree_auth_devise 2019-07-05 21:58:28 +01:00
luisramos0
fdcc4c2447 Remove dependency to spree auth devise 2019-07-05 21:58:07 +01:00
Pau Perez
f42bf72b32 Fix rubocop violations
It's not affordable to fix the failed Metrics cops in the scope of this
bug fix, but now, with a separate class, it'll be easier.
2019-07-05 18:19:58 +02:00
Pau Perez
8ab77b077b Fix spec
This needs to be revisited. I'm not sure it's the most appropriate spec
as it seems to be testing just part of story.
2019-07-05 18:19:58 +02:00
Pau Perez
9b03833df0 Extract orders & fulfillments default report clasts 2019-07-05 18:19:58 +02:00
Pau Perez
fada30435f DRY some procs from report 2019-07-05 18:19:58 +02:00
luisramos0
fc0ffda8ec Bring routes and controllers from spree_auth_devise 2019-07-05 15:08:42 +01:00
Luis Ramos
397729ed3d Merge pull request #4001 from pacodelaluna/3990-display-enterprise-id-in-profile
Display enterprise ID in profile
2019-07-05 11:14:43 +01:00
luisramos0
88312b8e4a Make OrdersHelper.invoice_links simpler 2019-07-05 11:08:51 +01:00
luisramos0
9be3ff90f7 Make OrdersHelper.complete_order_links simpler 2019-07-05 11:06:49 +01:00
luisramos0
a5b5e5de32 Remove trailing backslash 2019-07-05 10:58:53 +01:00
luisramos0
e66dea7e03 Improve query in filter_schedules_by_enterprise_id. Makes join to OCs explicity. 2019-07-05 10:37:27 +01:00
Maikel
4c5ed2fa45 Merge pull request #3999 from openfoodfoundation/transifex
Transifex
2019-07-05 11:59:40 +10:00
Maikel
40c0e69f11 Merge pull request #4000 from Matt-Yorkley/v2_migrations
Fix failing migration by clearing schema cache
2019-07-05 10:56:26 +10:00
Transifex-Openfoodnetwork
f3837fb6af Updating translations for config/locales/en_GB.yml 2019-07-05 05:08:46 +10:00
Pau Perez
db7b7bbde2 Fix finding supplier for a deleted product 2019-07-04 18:52:56 +02:00
luisramos0
ef61310bad Fix long lines in order_cycle_permissions and permissions 2019-07-04 17:17:58 +01:00
luisramos0
91da0114e3 Upgrade fuubar to 241 to skip yanked 240 2019-07-04 16:09:36 +01:00
Pau Perez
ee301c5e2f Address Code Climate (rubocop) issues 2019-07-04 17:01:06 +02:00
Pau Perez
4a67ffab25 Add a test case for reports with deleted products 2019-07-04 17:01:06 +02:00
Pau Perez
4d060815d0 Extract unscoping logic into method
DRYies out the code a bit.
2019-07-04 17:01:06 +02:00
Pau Perez
f91bd03c25 Add clarifying comment to report 2019-07-04 17:01:06 +02:00
Pau Perez
7de4ec2a90 Fix orders and fulfillments report
It bypasses the default_scope to retrieve deleted variants in the orders
and fulfillment report.
2019-07-04 17:01:06 +02:00
Pau Perez
812d8cac4a Make complex method a bit more readable 2019-07-04 17:01:06 +02:00
Transifex-Openfoodnetwork
d1faed282f Updating translations for config/locales/es.yml 2019-07-05 00:22:01 +10:00
Transifex-Openfoodnetwork
26195314eb Updating translations for config/locales/ca.yml 2019-07-05 00:09:05 +10:00
François Turbelin
912483660f Put the uid under the permalink 2019-07-04 09:51:32 +02:00
François Turbelin
d12a7c2c76 Apply last suggestions 2019-07-04 09:43:35 +02:00
luisramos0
dee1c3d139 Fix typo in order_cycle_permissions.rb 2019-07-03 22:58:33 +01:00
François Turbelin
101cff02c6 Add locale keys 2019-07-03 23:06:50 +02:00
luisramos0
bb9c54a445 Use enterprises.id instead of :id to remove ambiguous column errors 2019-07-03 22:03:40 +01:00
François Turbelin
5ce2af454e Clean id field 2019-07-03 23:00:36 +02:00
luisramos0
e5f396f975 Fix Permissions.related_enterprises_granted by adding explicit reference to table 2019-07-03 20:18:01 +01:00
luisramos0
a57a93d414 Adapt permissions.rb and order_cycle_permissions to rails 4 2019-07-03 20:18:01 +01:00
luisramos0
a82b1d8129 Adapt exchange.involving scope to rails 4 2019-07-03 20:18:00 +01:00
luisramos0
5184fa540c Adapt enterprise_relationship permitting and permitted_by scopes to rails 4 2019-07-03 20:18:00 +01:00
Luis Ramos
951787d456 Merge pull request #3987 from mkllnk/3978-optimise-products-cache
3978 Optimise products cache
2019-07-03 19:59:07 +01:00
Luis Ramos
b35743b6e4 Merge pull request #3968 from mkllnk/3924-rescue-failing-shipment
Rescue checkout on shipping id conflict
2019-07-03 19:56:24 +01:00
Luis Ramos
4fc30ba50e Merge pull request #3994 from openfoodfoundation/dependabot/bundler/knapsack-1.17.2
Bump knapsack from 1.17.1 to 1.17.2
2019-07-03 19:55:20 +01:00
François Turbelin
97a401a307 Display enterprise ID in profile 2019-07-03 18:10:59 +02:00
Pau Pérez Fabregat
232e3b8262 Merge pull request #3993 from openfoodfoundation/dependabot/bundler/simplecov-0.17.0
Bump simplecov from 0.16.1 to 0.17.0
2019-07-03 16:28:56 +02:00
Pau Pérez Fabregat
b3b66d5825 Merge pull request #3970 from mkllnk/444-feature-toggle-use-env
Toggle features via env instead of initializer
2019-07-03 16:27:01 +02:00
Pau Pérez Fabregat
1b532f995c Merge pull request #3919 from mkllnk/db-mirror-script
Db mirror script
2019-07-03 16:24:01 +02:00
Pau Pérez Fabregat
f5544494f0 Merge pull request #3997 from mkllnk/remove-ng-test-script
Remove obsolete Javascript test script
2019-07-03 16:23:41 +02:00
Pau Pérez Fabregat
2de32b54ba Merge pull request #3995 from mkllnk/how-to-not-archive-branches
Remove obsolete script to archive branches
2019-07-03 16:23:15 +02:00
Pau Pérez Fabregat
b6e2dadbb3 Merge pull request #3996 from mkllnk/remove-backup-script
Remove obsolete backup script
2019-07-03 16:22:36 +02:00
Matt-Yorkley
473e635d54 Merge pull request #3982 from luisramos0/mobile_bug
Fixes menu problem with long shop names
2019-07-03 13:30:41 +01:00
Transifex-Openfoodnetwork
3e11cdb5c1 Updating translations for config/locales/fr.yml 2019-07-03 22:14:43 +10:00
Transifex-Openfoodnetwork
842e8da2c3 Updating translations for config/locales/fr.yml 2019-07-03 22:11:35 +10:00
Matt-Yorkley
24f8e6d2ec Fix failing migration by clearing schema cache 2019-07-03 12:59:10 +01:00
Maikel
568d58405d Merge pull request #3986 from openfoodfoundation/transifex
Transifex
2019-07-03 18:46:14 +10:00
Maikel Linke
b23489fa40 Remove obsolete Javascript test script
This script has been replaced by a rake task a long time ago:

  bundle exec rake karma:run   # to run the specs once
  bundle exec rake karma:start # to run the spec after each change

We don't need it any more and it doesn't work on my machine.
2019-07-03 14:50:33 +10:00
Maikel Linke
503658f930 Remove obsolete backup script
This script doesn't work anymore. It was written for old an Australian
production server. We have automatic backups now. And if we wanted to
take a backup manually, we should probably give it a meaningful name,
not using a script.
2019-07-03 14:46:56 +10:00
Maikel Linke
24bf5f0fea Remove obsolete script to archive branches
Apparently, there was a practice to archive branches by tagging them
"archive/branch-name" and then deleting them. We don't practice that
anymore and I would suggest to not start doing it again. Our setup is a
bit different now.

We now use our own forks for feature branches and can have our own,
individual archiving practices in our forks. There is no need to have a
central graveyard of people's "work after progress".

The old feature branches we used to have in the central repository got
archived in another fork:
https://github.com/openfoodfoundation/openfoodnetwork-archive/

Branches associated to pull requests should be deleted after the pull
request has been closed. Github keeps a reference to those branches in
the pull request which is like an archive.

Special branches we still have and delete from time to time:

- transifex: Created for new translations, deleted afterwards.
- dependabot/*: Dependabot always creates pull requests. See above.
- 1-31-1-stable etc: They only live as long as they are supported.

I would also like to delete the old `archive/*` tags. They are in the
openfoodnetwork-archive repository and could confuse developers in the
main repository. Let's keep it clean.
2019-07-03 14:36:16 +10:00
Matt-Yorkley
9d86249bcb Merge pull request #3954 from openfoodfoundation/improve-database-yml
DRY and make database.yml more flexible
2019-07-02 21:43:49 +01:00
Kristina Lim
3e37c8a3f1 Change underscores in CSS classes to hyphens
These were triggering a warning from scss-lint.
2019-07-03 04:43:35 +08:00
Kristina Lim
691d7d735b Reduce padding between top bar menu items 2019-07-03 04:35:44 +08:00
Kristina Lim
6d1dd76590 Cap width of hub name in top bar and wrap 2019-07-03 04:30:06 +08:00
Kristina Lim
356e00bfbb Add space for tab bar in medium and below screens 2019-07-03 04:02:28 +08:00
Kristina Lim
5534109122 Undo setting of margin for home tagline 2019-07-03 04:02:22 +08:00
Janine Luk
ac8790ecb3 sticky header for mobile 2019-07-03 03:57:11 +08:00
Matt-Yorkley
2eb8121644 Update Docker config 2019-07-02 20:36:21 +01:00
Matt-Yorkley
b685e0d3a7 Add ENV var for db host 2019-07-02 20:34:16 +01:00
Matt-Yorkley
1dd3d86a2b Add prefixes to ENV vars 2019-07-02 20:34:16 +01:00
Pau Perez
7ee41902f2 DRY and make database.yml more flexible
This enables us to fix
https://github.com/openfoodfoundation/ofn-install/issues/387 and brings the
needed flexibility so things like
https://github.com/openfoodfoundation/openfoodnetwork/pull/3887 or any CI don't
require a custom version. That's what ENV vars are for!

For instance, I no longer need to mess with my LXC setup to connect to the DB.
I just need to have 2 env vars.
2019-07-02 20:34:16 +01:00
dependabot-preview[bot]
490ced4a92 Bump knapsack from 1.17.1 to 1.17.2
Bumps [knapsack](https://github.com/ArturT/knapsack) from 1.17.1 to 1.17.2.
- [Release notes](https://github.com/ArturT/knapsack/releases)
- [Changelog](https://github.com/ArturT/knapsack/blob/master/CHANGELOG.md)
- [Commits](https://github.com/ArturT/knapsack/compare/v1.17.1...v1.17.2)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2019-07-02 19:21:44 +00:00
dependabot-preview[bot]
a682115fb1 Bump simplecov from 0.16.1 to 0.17.0
Bumps [simplecov](https://github.com/colszowka/simplecov) from 0.16.1 to 0.17.0.
- [Release notes](https://github.com/colszowka/simplecov/releases)
- [Changelog](https://github.com/colszowka/simplecov/blob/master/CHANGELOG.md)
- [Commits](https://github.com/colszowka/simplecov/compare/v0.16.1...v0.17.0)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2019-07-02 19:19:31 +00:00
Kristina Lim
653067f58c Omit text for top bar items with icon in large
This affects only top bar menu items for:

* Language
* Profile

This does not update the "Log in" menu item, because the currently
selected icon might not be self explanatory.
2019-07-03 01:49:36 +08:00
Kristina Lim
06ed9c838e Remove extra left padding from top bar menu items 2019-07-03 01:49:35 +08:00
Matt-Yorkley
726d87de6b Fix display bug in cart button on mobile menu 2019-07-02 16:47:22 +01:00
Matt-Yorkley
fbb97c3db8 Fix JS render-blocking in Darkswarm 2019-07-02 13:43:20 +01:00
Matt-Yorkley
cea8cbd924 Preload primary font to speed up page rendering 2019-07-02 13:23:03 +01:00
Maikel Linke
73372a58ef Remove unused and dangerous Exchange#eql? override
The `eql?` override has been added in very early commits but was
actually not used except in a test. It also caused performance problems
since each call to `eql?` would issue two database queries. A developer
would unknowingly trigger these when using `exchanges.uniq`. A mistake
that could have happened again in the future.

I moved the implementation to the test that was actually using it and
made a second test a bit more explicit.
2019-07-02 18:42:02 +10:00
Maikel Linke
287d6a926a Document Exchange 2019-07-02 18:42:02 +10:00
Maikel Linke
04b07a1ff5 Further optimise querying affected exchanges
The implementation queried the database for each incoming variant that
was changed. This rewrite combines ActiveRecord relations so that it
creates only one query. This saves another 5-10% of execution time when
updating enterprise fees on production instances.
2019-07-02 18:42:01 +10:00
Maikel Linke
0da7c93bc6 Collect affected exchanges more efficiently
When an incoming exchange of an order cycle changes, the ProductsCache
queries all affected outgoing exchanges to update them. It was creating
a big collection of exchanges with duplicates and then calling `uniq`.
That call was hitting a custom implementation of `eql?` which is very
inefficient. And since `Exchange.eql?` is ignoring the order cycle id,
it was probably filtering too many exchanges from the collection.

Fixed bug: If two order cycles sell exactly the same variants to the
same shop, the two outgoing exchanges are seen as equal. When the
variants change, ProductsCache would only update one of those two
exchanges, leaving one order cycle out of sync. This case is very rare.
It only happens if there is a shop with two active order cycles selling
exactly the same.

The new uniqueness test looks only at the attributes that are later used
to refresh the cache. I measured a page speed improvement from 90
seconds to 3 seconds (30 times faster).
2019-07-02 18:29:50 +10:00
Maikel Linke
bfe41d4cbc Extract method to simplify 2019-07-02 18:29:50 +10:00
Maikel Linke
3e6e0b73ee Style products cache
The `private` modifier doesn't affect class methods. Class methods have
to be declared as private separately. Also using more guard clauses,
brackets and linebreaks.
2019-07-02 18:29:49 +10:00
Maikel
592a468448 Merge pull request #3960 from mkllnk/test-spec-stability
Remove retries from previously flaky specs
2019-07-02 13:50:16 +10:00
Transifex-Openfoodnetwork
f09b1fc1a8 Updating translations for config/locales/en_ZA.yml 2019-07-02 01:13:09 +10:00
Ecksi
bdbd869b06 Modify English tool tip text in yml file
Modify GB English tool tip text in yml file

Modify US English tool tip text in yml file
2019-06-28 10:59:50 +10:00
Maikel
8b42bd205a Merge pull request #3977 from openfoodfoundation/transifex
Transifex
2019-06-27 09:29:09 +10:00
Transifex-Openfoodnetwork
6108a74fec Updating translations for config/locales/fr.yml 2019-06-27 00:47:45 +10:00
Luis Ramos
5ecab7a0c2 Merge pull request #3971 from Matt-Yorkley/basket_errors
Avoid `undefined method 'order'` errors when removing lineitems from basket
2019-06-26 15:33:26 +01:00
Luis Ramos
d8785bdaba Merge pull request #3932 from luisramos0/shpfront_message
Improve message in private shopfront when user is not logged in or not a customer
2019-06-26 15:31:06 +01:00
Luis Ramos
00841cb537 Merge pull request #3923 from luisramos0/prod_image_error
User friendly error when creating a product with an image in an unsupported format
2019-06-26 15:30:18 +01:00
luisramos0
61c8859da8 Fix problem in array concatenation in orders helper and cover it with specs 2019-06-26 14:17:41 +01:00
luisramos0
e33ce235c4 Hide invoice links in order edit page if invoices are disabled 2019-06-26 14:17:41 +01:00
luisramos0
ec2f99a467 Refactor OrderHelper.order_links: extract some logic from order_links to make it more simple and pass rubocop tests 2019-06-26 14:17:41 +01:00
luisramos0
67b5f08b07 Refactor OrderHelper.order_links: extract links object to separate methods 2019-06-26 14:17:41 +01:00
luisramos0
95170bacd5 Show print invoices button in orders list page only if invoices are enabled in the backoffice 2019-06-26 14:17:25 +01:00
Maikel
eebc49f27c Merge pull request #3887 from pacodelaluna/add-docker-configuration-for-dev-setup
Add docker configuration for quick local setup
2019-06-26 21:23:34 +10:00
luisramos0
8b0296eae6 Use a single query to get filter_schedules_by_enterprise_id 2019-06-26 11:38:03 +01:00
François Turbelin
b6120a9105 Fix docker-compose application yml file 2019-06-26 11:03:20 +02:00
Maikel Linke
5d3dbca9c3 Toggle features via env instead of initializer
A FeatureToggle could be switched via a class_eval in an initializer.
The initializer was installed via ofn-install. We want to get rid of
custom, untracked initializers. Here I'm changing the FeatureToggle
class to use environment variables instead.

This change needs to be followed up with a change in ofn-install to use
the new environment variable. It affects only Australian production.
2019-06-26 11:43:22 +10:00
Maikel Linke
5bbd63bcd8 Add spec for rescuing order saving shipment 2019-06-26 11:32:01 +10:00
Maikel Linke
980b4a86ab Move shipment rescue to its own method 2019-06-26 10:48:51 +10:00
Luis Ramos
118ed79070 Merge pull request #3904 from luisramos0/subs_stock
Fix ofn-on-hand directive and fix usage of variant.on_hand in subscriptions order factory
2019-06-25 20:25:06 +01:00
François Turbelin
623d1e0285 Add missing file 2019-06-25 20:05:55 +02:00
François Turbelin
2dcced8810 Put back application example file as it was 2019-06-25 17:59:37 +02:00
Matt-Yorkley
5100ad6b51 Improve #line_items_for logic and add more tests 2019-06-25 15:33:42 +01:00
luisramos0
7e2bead54d Make finalizedquantity optional in the ofn-on-hand directive and extract avaiable quantity to a separate method for clarity 2019-06-25 14:50:03 +01:00
luisramos0
2b6e6c62dd Simplify order_factory_spec by extracting copy pasted code to method 2019-06-25 14:50:03 +01:00
luisramos0
05a15d9441 Extract method to remove some copy pasted code in order_factory_spec 2019-06-25 14:50:03 +01:00
luisramos0
567196fe0e Fix line item verification of stock on the browser side by adding logic to handle completed orders with some reserved stock
The shopping/orders_spec is now validating this edge case by using all stock available in one of the line items
2019-06-25 14:50:03 +01:00
luisramos0
7bd32d4967 Fix usage of variant.on_hand in subscriptions order factory, we now take on_demand into account
This fixes a problem introduced in 12eab1bfa9 (diff-c3c4192f302cc77e9a8547012fe86ddb), since then variant.on_hand does not return infinity if variant is on_demand
2019-06-25 14:47:47 +01:00
Luis Ramos
9b6f1a5e11 Merge pull request #3958 from Matt-Yorkley/pi_encoding
Improve handling of invalid characters in uploaded CSV files
2019-06-25 14:44:32 +01:00
François Turbelin
84389d1392 Fix setup script with new application YAML file 2019-06-25 14:38:38 +02:00
François Turbelin
da3b467d47 Use https to fetch Postgres repo 2019-06-25 14:09:59 +02:00
François Turbelin
ceffae2efc Delete extra example file 2019-06-25 14:08:18 +02:00
Matt-Yorkley
f19a6f0dec Add tests for class_eval on Spree::Calculator private method #line_items_for 2019-06-25 12:19:16 +01:00
Matt-Yorkley
0a155da273 Avoid undefined method 'order' errors when removing lineitems from basket 2019-06-25 11:13:56 +01:00
François Turbelin
c0d02c8d42 Fix errors while relauching container 2019-06-25 12:05:26 +02:00
François Turbelin
e68d72c0dd Update DOCKER.md 2019-06-25 11:47:54 +02:00
Matt-Yorkley
034e8b180a Use let for CSV data 2019-06-25 10:24:53 +01:00
Matt-Yorkley
ead0e1c08d Store attributes list in constant 2019-06-25 10:20:59 +01:00
Matt-Yorkley
8dfb628d88 Add test for ignoring non-updatable description field in validations when updating 2019-06-25 10:19:05 +01:00
Matt-Yorkley
85b3d7dac5 Move attribute check to method 2019-06-25 10:19:05 +01:00
Matt-Yorkley
84040fd2a6 Allow import to proceed when updating a product and description is set 2019-06-25 10:19:05 +01:00
François Turbelin
5dcf456c90 Remove old Rake task for sample data 2019-06-25 11:18:48 +02:00
François Turbelin
79ec3d5a3f Remove extra copy on Docker file 2019-06-25 11:18:48 +02:00
François Turbelin
e893197c49 Use example files instead of extra Docker ones 2019-06-25 11:18:48 +02:00
Matt-Yorkley
60e67ae1a4 Run all setup steps on startup
It's a bit dirty, but it works :)
2019-06-25 11:18:48 +02:00
Matt-Yorkley
53a0f70aa0 Add default login details via ENV vars 2019-06-25 11:18:48 +02:00
Matt-Yorkley
64d6ae445b Change postgres repo from precise to bionic 2019-06-25 11:18:48 +02:00
Matt-Yorkley
5712f67673 Remove phantomjs from dependencies 2019-06-25 11:18:48 +02:00
François Turbelin
9c45444ea6 Clean database.docker.yml file 2019-06-25 11:18:48 +02:00
François Turbelin
4e41a73c4f Enhance Dockerfile 2019-06-25 11:18:48 +02:00
François Turbelin
75267268d7 Update Postgres to 9.5 2019-06-25 11:18:48 +02:00
François Turbelin
7455053879 Update DOCKER.md file 2019-06-25 11:18:48 +02:00
François Turbelin
c5addb8c1d Fix comment spacings, gloupsss 2019-06-25 11:18:48 +02:00
François Turbelin
e5d4b216ba Add DOCKER.md file as documentation 2019-06-25 11:18:48 +02:00
François Turbelin
b4fe44510b Tune up the Rake task 2019-06-25 11:18:48 +02:00
François Turbelin
9df5d78f27 Add a Rake task in order to setup dev env 2019-06-25 11:18:48 +02:00
François Turbelin
f9d72e10d5 Add Docker configuration 2019-06-25 11:18:48 +02:00
Maikel
723499332a Merge pull request #3006 from mkllnk/i18n-error-detection
Raise error on missing translation keys
2019-06-25 16:13:15 +10:00
Maikel Linke
6a06e0ac3b Raise error on missing translation keys 2019-06-25 15:06:56 +10:00
Luis Ramos
5600102729 Merge pull request #3876 from luisramos0/3804_insuf_stock
3804 Fix editing cart when variant on_demand but its on_hand value is zero or negative
2019-06-24 22:24:15 +01:00
luisramos0
a6ea975848 Fix editing cart when variant on_demand but on_hand is zero or negative 2019-06-24 22:07:46 +01:00
Luis Ramos
57917a498b Merge pull request #3946 from luisramos0/missing_translatiojns
Fix last missing translations covered by specs
2019-06-24 20:52:59 +01:00
Luis Ramos
b30da27e92 Merge pull request #3950 from openfoodfoundation/dependabot/bundler/stripe-4.19.0
Bump stripe from 4.18.1 to 4.19.0
2019-06-24 20:44:57 +01:00
Maikel Linke
1e1e88fe51 Rescue checkout on shipping id conflict
Helps to investigate https://github.com/openfoodfoundation/openfoodnetwork/issues/3924

A better solution would be to move the update of shipments out of the
after_save callback and deal with it in controllers. Unfortunately,
that's a big and tricky task.

Since this exception is causing a lot of pain for some Australian
farmers, I introduced more logging here to understand the problem
better. The issue was observed in OFN v1 and may disappear with v2. But
we don't know that and should monitor it.
2019-06-21 16:05:54 +10:00
Maikel
e4c3c1664a Merge pull request #3943 from jonleighton/issue-2112
Bring back ‘Shop for X products at:’ title
2019-06-21 15:06:21 +10:00
Maikel
5b0c8bbaef Merge pull request #3836 from Matt-Yorkley/fast_and_furious2
Improve /shops, /producers, and /groups performance
2019-06-21 15:02:19 +10:00
Maikel
71f396a44f Merge pull request #3896 from luisramos0/clear_unit_desc
Clear product.variants.unit_description if product.variant_unit is items
2019-06-21 15:00:06 +10:00
Maikel
eb162f6b29 Merge pull request #3934 from openfoodfoundation/dependabot/bundler/activerecord-import-1.0.2
Bump activerecord-import from 1.0.1 to 1.0.2
2019-06-21 14:59:03 +10:00
Maikel
5aea361d87 Merge pull request #3709 from luisramos0/2-0-prepare-4-rails-4
Start upgrade to Rails 4
2019-06-21 14:58:24 +10:00
Maikel
3721c017fa Merge pull request #3670 from luisramos0/2-0-without-spree-fe-assets
[Spree Upgrade] Remove dependency to spree frontend - routes and controllers
2019-06-21 14:57:03 +10:00
Maikel
12f0ed9955 Merge pull request #3940 from luisramos0/zones
Remove matching of shipping method zone to user address on checkout
2019-06-21 14:43:40 +10:00
Maikel
4c4881430c Merge pull request #3908 from kristinalim/fix/3843-unit_type_in_product_import
3877,3843 Improve handling of units and unit type in product import
2019-06-21 14:43:01 +10:00
luisramos0
bcc02f35e7 Add new preference to invoice settings: enable invoices 2019-06-19 13:29:30 +01:00
Matt-Yorkley
08b2b19d5e Improve handling of invalid characters in uploaded CSV files 2019-06-19 09:29:59 +01:00
Maikel Linke
cccd35fdf3 Remove retries from previously flaky specs
It's not acceptable to have flaky specs that only pass once in three
tries. Our specs might be more stable now that we use Chrome as test
browser. Otherwise we have to find out why these specs are not stable.
It might be an important bug that happens only sometimes.
2019-06-19 16:48:04 +10:00
Maikel Linke
d8ece7cd8b First stored credit card becomes default again
A user can store their credit card when checking out. Due to a bug in
https://github.com/openfoodfoundation/openfoodnetwork/pull/3840 it
didn't become the default card any more. This behaviour is now restored.
If there is not default card yet, a new card added during checkout
becomes the default card.
2019-06-19 15:43:38 +10:00
Maikel Linke
ee65d70eec Deal with empty payments sequence
The task was crashing when there were no payments in the query range.
2019-06-19 09:58:47 +10:00
Matt-Yorkley
ab1ed53507 Merge pull request #3955 from openfoodfoundation/remove-travis-leftover
No need to keep old and used Travis config file
2019-06-18 16:48:13 +01:00
luisramos0
2b3865855d Simplify shipping_method.include? method 2019-06-18 11:42:34 +01:00
luisramos0
1da18d3386 Fix enterprise model scopes by making ready_for_checkout return enterprises and not ids again and by making not_ready_for_checkout select the id field from the ready_for_checkout scope 2019-06-18 10:52:56 +01:00
luisramos0
b025df1798 Fix a few more rubocop issues 2019-06-18 10:52:56 +01:00
luisramos0
178924af5d Fix long lines in order_cycle model 2019-06-18 10:52:45 +01:00
luisramos0
bb1f7fde2f Remove unused routes related to taxons
t/products was already an old route 4 years ago and t/*id is not currently working in master
2019-06-18 10:49:20 +01:00
luisramos0
c61e7a1672 Remove unused routes
This fix is in spree 2.1 here: ba420fe70e
2019-06-18 10:49:20 +01:00
luisramos0
3c964933b1 Remove stub of a deleted method #deadcode 2019-06-18 10:49:20 +01:00
luisramos0
e7b625edcf Remove spree locale route
This route is not used, ofn code uses query param locale that is picked up in base controller set_locale
2019-06-18 10:49:20 +01:00
luisramos0
eab6cc563b Fix rubocop issues 2019-06-18 10:49:20 +01:00
luisramos0
8daf9b9247 Revert fix in previous commit (orders/populate route used in product import view) and adding a simple fix by setting the product import route to use in the form 2019-06-18 10:49:20 +01:00
luisramos0
5ba0f906a1 For some reason we need the orders populate route to make product import routes work 2019-06-18 10:49:20 +01:00
luisramos0
35c8236c21 Add missing datepicker/cal.gif to ofn assets 2019-06-18 10:49:20 +01:00
luisramos0
b397a8e661 Remove spree_frontend and spree_sample from ofn's gemfile
spree_frontend will only be removed from gemfile.lock when spree_auth_devise is removed from OFN
2019-06-18 10:49:20 +01:00
luisramos0
61def8f2e7 Convert match routes to get routes to be compatible with rails 4 2019-06-18 10:49:20 +01:00
luisramos0
4ff0bf8162 Change gemfile to depend on the different spree gems, not spree as a whole 2019-06-18 10:49:20 +01:00
luisramos0
02b9fca620 Remove unused spree checkout and spree cart routes 2019-06-18 10:49:19 +01:00
luisramos0
40f7d07e27 Remove unnecessary method from spree storecontroller and spree orderscontroller 2019-06-18 10:47:34 +01:00
luisramos0
c56486d7ae Remove unnecessary methods from spree checkoutcontroller 2019-06-18 10:47:34 +01:00
luisramos0
56db90f49e Remove unused checkout controller update action and order controller populate action
Additionally, remove routes of these actions as well as routes already defined in routes.rb (checkout and cart)
2019-06-18 10:47:34 +01:00
luisramos0
a8b4037885 Remove dependency to coupon code logic in checkoutcontroller, ofn doesnt have that feature 2019-06-18 10:47:34 +01:00
luisramos0
fc145d472d Add home controller to ofn codebase from spree frontend 2019-06-18 10:47:34 +01:00
luisramos0
5037cce6f5 Add all the code missing from checkout, order and store controllers to ofn controllers 2019-06-18 10:47:34 +01:00
luisramos0
c399491314 Move spree frontend routes to ofn and transform decorators with class_eval to controller classes 2019-06-18 10:47:34 +01:00
luisramos0
c15c5435ff Fix long lines in exchange model 2019-06-18 10:45:01 +01:00
luisramos0
0cdb49818d Remove distinct from enterprise.ready_for_checkout scope
Adapt use of enterprise scope not_ready_for_checkout to rails 4 by adding enterprises table alias to selected field id
2019-06-18 10:40:49 +01:00
luisramos0
9548f5c5f7 Adapt order_cycle scopes to rail 4 2019-06-18 10:40:49 +01:00
luisramos0
ba91abd20e Adapt exchanges.with_any_variant scope to rails 4 2019-06-18 10:40:49 +01:00
luisramos0
0d07bf2a3b Adapt enterprise.distributing_products scope to rails 4 2019-06-18 10:40:49 +01:00
luisramos0
07a6e62d09 Adapt query in product destroy process to rails 4 2019-06-18 10:40:49 +01:00
luisramos0
e9667ab289 Adapt product.managed_by scope to rails 4 2019-06-18 10:40:49 +01:00
Pau Perez
d003ba81e3 No need to keep old and used Travis config file
If we ever want to come back to Travis we just need to do a git revert.
Meanwhile, no need to care about it.
2019-06-18 11:12:14 +02:00
Luis Ramos
a783f4609a Merge pull request #3942 from jonleighton/exit-if-no-nodenv
Exit script/setup if node is not found
2019-06-17 22:10:44 +01:00
dependabot-preview[bot]
756b3ec73b Bump stripe from 4.18.1 to 4.19.0
Bumps [stripe](https://github.com/stripe/stripe-ruby) from 4.18.1 to 4.19.0.
- [Release notes](https://github.com/stripe/stripe-ruby/releases)
- [Changelog](https://github.com/stripe/stripe-ruby/blob/master/CHANGELOG.md)
- [Commits](https://github.com/stripe/stripe-ruby/compare/v4.18.1...v4.19.0)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2019-06-17 19:19:17 +00:00
Luis Ramos
d9b47ad1b3 Merge pull request #3944 from openfoodfoundation/transifex
Transifex
2019-06-17 16:39:25 +01:00
luisramos0
0235a04530 Add missing translation key in user sessins controller 2019-06-17 15:48:52 +01:00
luisramos0
043abdef39 Add missing translations in the account confirmation process 2019-06-17 15:48:52 +01:00
luisramos0
b372e131a1 Add missing translation key in Spree.
This was fixed in spree 2.1, 7de7fcd502
2019-06-17 15:48:52 +01:00
luisramos0
642d3cbfbd Fix translation key namespace in subs order confirm email subject 2019-06-17 15:48:52 +01:00
Transifex-Openfoodnetwork
930de1b6a2 Updating translations for config/locales/en_ZA.yml 2019-06-17 20:33:27 +10:00
Pau Pérez Fabregat
e3db218e7c Merge pull request #3941 from luisramos0/enza
Add en_ZA.yml copied from en_GB.yml as requested by instance manager
2019-06-17 11:54:09 +02:00
Jon Leighton
fcff302d55 Bring back ‘Shop for X products at:’ title
Fixes #2112

It looks like this bug was accidentally introduced during a refactor in
e5ca494db8. The `bo-html` attribute was
replaced with `ng-html`, but it appears that it should actually have
used `ng-bind-html`
(https://docs.angularjs.org/api/ng/directive/ngBindHtml) because the
former is not a valid AngularJS directive.

It was also necessary to bubble up the `.cta-container` class in order to
get the appropriate styling on the title.
2019-06-17 15:43:15 +10:00
Jon Leighton
150310bf67 Exit script/setup if node is not found
This mirrors what the script already does if ruby is not found
2019-06-17 11:26:54 +10:00
luisramos0
926fc5ee43 Add en_ZA.yml copied from en_GB.yml as requested by instance manager 2019-06-16 20:43:20 +01:00
luisramos0
ccc7a43a06 Bypass validation of shipping methods zone on checkout 2019-06-15 21:11:51 +01:00
luisramos0
e4fcaa5992 Fix typo in package.rb 2019-06-15 20:45:57 +01:00
Luis Ramos
b1d4461c77 Merge pull request #3936 from luisramos0/factories_refactor
Extract factories to separate files and fix rubocop issues
2019-06-14 22:28:55 +01:00
Pau Pérez Fabregat
45c77196b3 Merge pull request #3935 from mkllnk/update-rubocop-style
Update rubocop style
2019-06-14 19:52:22 +02:00
luisramos0
13d41dc1aa Remove duplicate modify entry in factories 2019-06-14 13:59:24 +01:00
luisramos0
5ca382be42 Remove spec/factories.rb from rubocop exceptions, it doesnt look like a problem any longer 2019-06-14 13:55:47 +01:00
luisramos0
3259db69f0 Remove unnecessary code, this code as been accepted in spree code base and included in spree v1.2 2019-06-14 13:43:30 +01:00
luisramos0
6efb71d903 Fix more rubocop issues in spec/factories 2019-06-14 13:42:27 +01:00
Luis Ramos
91401446a5 Merge pull request #3915 from mkllnk/3844-permalink-conflicts
Consider deleted products when creating permalinks
2019-06-14 13:20:35 +01:00
luisramos0
59593c824a Fix rubocop issues in different factories 2019-06-14 13:10:53 +01:00
luisramos0
79cf03b124 Fix rubocop issues in spec/factories 2019-06-14 13:01:08 +01:00
luisramos0
a6b3c26bbe Extract users factories to separate file 2019-06-14 12:50:26 +01:00
luisramos0
8345765ada Extract tag rules factories to separate file 2019-06-14 12:49:17 +01:00
luisramos0
03fb33ba86 Extract variant factory modify to separate file 2019-06-14 12:48:04 +01:00
luisramos0
2c8ce6e4e5 Extract products factories to separate file 2019-06-14 12:45:55 +01:00
luisramos0
3e10c703bf Extract shipments factories to separate file 2019-06-14 12:43:07 +01:00
luisramos0
42f8b2efed Fix static file path in order_cycle_factory 2019-06-14 12:30:36 +01:00
luisramos0
bd493c392a Extract shipping_methods factories to separate file 2019-06-14 12:25:10 +01:00
luisramos0
dc701f55b3 Extract calculators factories to separate file 2019-06-14 12:23:32 +01:00
luisramos0
06e3328ce2 Extract orders factories to separate file 2019-06-14 12:17:24 +01:00
luisramos0
91fcb7c7c4 Extract enterprises factories to separate file 2019-06-14 12:12:45 +01:00
luisramos0
42f2e78b10 Extract subscriptions factories to separate file 2019-06-14 12:10:54 +01:00
luisramos0
0501859c23 Extract order_cycle factories to separate file 2019-06-14 12:10:27 +01:00
luisramos0
a7c970054c Add rescue in product controller create action to avoid server error and send appropriate error message to client when product image upload fails 2019-06-14 10:20:28 +01:00
luisramos0
c97925aa4a Improve message in private shopfront when closed or when user is not logged in 2019-06-14 10:13:33 +01:00
Maikel
5e89c54144 Merge pull request #3931 from openfoodfoundation/RachL-patch-1-3
Update README.md
2019-06-14 14:20:22 +10:00
Maikel
2307df980c Merge pull request #3930 from openfoodfoundation/transifex
Transifex
2019-06-14 14:19:13 +10:00
Maikel Linke
b5f3f98f87 Make BlockLength style apply to all files except todo list 2019-06-14 11:49:27 +10:00
Maikel Linke
ac79e44d9a Fix current rubocop violations 2019-06-14 11:40:09 +10:00
Maikel Linke
bf8a31abda Add rake task to report lost payments
In rare cases, payment records can get lost through database rollbacks.
This new rake task tries to find log entries for lost transactions and
reports them as CSV.
2019-06-14 11:10:31 +10:00
Transifex-Openfoodnetwork
f0977f3c39 Updating translations for config/locales/nb.yml 2019-06-14 08:08:37 +10:00
dependabot-preview[bot]
16ad94f3a8 Bump activerecord-import from 1.0.1 to 1.0.2
Bumps [activerecord-import](https://github.com/zdennis/activerecord-import) from 1.0.1 to 1.0.2.
- [Release notes](https://github.com/zdennis/activerecord-import/releases)
- [Changelog](https://github.com/zdennis/activerecord-import/blob/master/CHANGELOG.md)
- [Commits](https://github.com/zdennis/activerecord-import/compare/v1.0.1...v1.0.2)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2019-06-13 19:23:40 +00:00
luisramos0
6223a738a7 Fix rubocop issues in collapsible.css 2019-06-13 19:32:33 +01:00
luisramos0
a370216f54 Change default translation in the registration introduction so that it looks better when collapsed 2019-06-13 19:28:31 +01:00
luisramos0
473fb45132 Remove an extra break line to remove html space and make sure alignment is correct 2019-06-13 19:28:10 +01:00
luisramos0
ae0563a58f Merge branch 'master' into 1766-registration-scroll 2019-06-13 19:10:05 +01:00
Luis Ramos
2b593a59f5 Merge pull request #3900 from luisramos0/subs_trans
Missing translations in Subscriptions
2019-06-13 18:51:20 +01:00
Rachel Arnould
d3cb106ae4 Update README.md
In order to benefit from a free unlimited account at Browser stack, they asked us to 
*Give us a shoutout on your GitHub project page. Post an hyperlink and a line about how you use BrowserStack.*
2019-06-13 18:58:58 +02:00
Luis Ramos
ddfd14ebb3 Merge pull request #3905 from openfoodfoundation/dependabot/bundler/i18n-js-3.3.0
Bump i18n-js from 3.2.2 to 3.3.0
2019-06-13 17:33:50 +01:00
luisramos0
1db220e1e0 Remove unnecessary referer setting from products controller spec 2019-06-13 17:22:09 +01:00
Luis Ramos
29bc961e8a Merge pull request #3890 from luisramos0/transl_prod_page
Add missing translation keys to the create product page
2019-06-13 17:13:40 +01:00
Transifex-Openfoodnetwork
216e181c6e Updating translations for config/locales/en_GB.yml 2019-06-14 01:53:18 +10:00
Transifex-Openfoodnetwork
b65b94b6f9 Updating translations for config/locales/en_GB.yml 2019-06-14 01:50:11 +10:00
Luis Ramos
85ee1e7806 Merge pull request #3889 from luisramos0/tag_rules_transl
Fix missing translations in tag rules management page
2019-06-13 16:15:49 +01:00
Luis Ramos
7d24bcf868 Merge pull request #3798 from m-budryte/order_cycles_add_fee_remove_link
the translations for Remove in the exchange forms added
2019-06-13 16:15:28 +01:00
Luis Ramos
1df1ba9403 Merge pull request #3888 from luisramos0/translations
Add translation keys to actions in the order payments list page
2019-06-13 15:36:43 +01:00
Luis Ramos
e15ccdbd74 Merge pull request #3840 from mkllnk/3727-default-credit-cards
Make only reusable credit cards the default card
2019-06-13 14:13:32 +01:00
Luis Ramos
1a2703f630 Merge pull request #3886 from luisramos0/fees_translations
Make a few more things translatable in the Enterprise Fees management page
2019-06-13 14:12:16 +01:00
Luis Ramos
09a5426095 Merge pull request #3880 from kristinalim/fix/3792-optimize_order_cycle_variant_updates
3792 Optimize saving Order Cycle changes
2019-06-13 12:33:22 +01:00
Luis Ramos
bb7a2d7a5e Merge pull request #3252 from mllocs/fix/navbar-right-items-styles
Top navbar redesign and cleanup
2019-06-13 12:04:20 +01:00
Pau Pérez Fabregat
080689ccfa Merge pull request #3917 from luisramos0/subs_visible
Make subs radio button visible to all managers
2019-06-12 16:42:31 +02:00
Matt-Yorkley
785595a951 Reduce initial queries on shop page by ~95% 2019-06-12 09:47:01 +01:00
Matt-Yorkley
0aa8b1a30e Make shop hidden ams injection consistent with other uses 2019-06-12 09:47:01 +01:00
Matt-Yorkley
874fb884b8 Refactor Angular controllers further 2019-06-12 09:47:01 +01:00
Matt-Yorkley
a91ae8947b Only query visible enterprises 2019-06-12 09:47:01 +01:00
Matt-Yorkley
11e83af0b6 Remove duplication of enterprise angular controllers
We can re-use the enterprise and producers controllers here in their respective groups tabs, no need for a third controller
2019-06-12 09:47:01 +01:00
Matt-Yorkley
9703d848ef Improve syntax in injection_helper 2019-06-12 09:47:01 +01:00
Matt-Yorkley
4155b17633 Remove tests that reference removed code 2019-06-12 09:47:01 +01:00
Matt-Yorkley
d5bd058754 Fix groups show page
It can definitely be cleaned up more in the future, but this should get us around a 90% reduction in page load times.
2019-06-12 09:47:01 +01:00
Matt-Yorkley
4ec46c2db6 Fix groups index page 2019-06-12 09:47:01 +01:00
Matt-Yorkley
aca1f92060 Adapt specs to new loading methods 2019-06-12 09:47:01 +01:00
Matt-Yorkley
1b8dfaf049 Fix HashNavigation reload bug 2019-06-12 09:47:01 +01:00
Matt-Yorkley
ae8f1a92e8 Remove "profiles" from /shops 2019-06-12 09:47:01 +01:00
Matt-Yorkley
698d3672a6 List only current taxons for active enterprises 2019-06-12 09:47:01 +01:00
Matt-Yorkley
ed97400a23 Improve producers performance 2019-06-12 09:47:01 +01:00
Matt-Yorkley
45d65baf8e Improve shops performance 2019-06-12 09:47:01 +01:00
Matt-Yorkley
e329b4bfb0 Improve queries for serializers 2019-06-12 09:47:01 +01:00
Maikel Linke
76d77ceb51 Update and generalise database mirror script
The old script was specfic to the use in Australia and out of date. The
new version isn't perfect but works well for me.
2019-06-12 10:19:56 +10:00
luisramos0
f23094df09 Fix file name of js unit test files in admin/order_cycles/controllers 2019-06-11 21:28:55 +01:00
luisramos0
9c539da811 Fix rubocop issue in schedules_controller.collection by extracting method 2019-06-11 21:28:55 +01:00
luisramos0
6cf705ea55 In the order cycle pages (both create and edit, both simple and normal), add OC coordinator to schedules request to the server and make the controller filter schedules of order cycles coordinated by that enterprise id. 2019-06-11 21:28:52 +01:00
Maikel Linke
d1901cbea4 Allow class_eval to have more than 25 lines 2019-06-11 18:01:41 +01:00
Maikel Linke
5c72c35060 Use better credit card factory for subs specs
The specs for subscriptions were creating simple one-time-use credit
cards. They should not be used for subscriptions. After this was fixed
in previous commits, these integration tests failed. Now we use a new
factory that mimics stored credit cards that can be used for
subscriptions.
2019-06-11 18:01:41 +01:00
Maikel Linke
b3b8cb778f Make only reusable credit cards the default card
https://github.com/openfoodfoundation/openfoodnetwork/issues/3727

When a user didn't have a default credit card and then checked out with
a credit card it became the default even when the user didn't intend to
store it. That lead to subscriptions trying to charge a one-time card
which fails.
2019-06-11 18:01:41 +01:00
luisramos0
d8a7f60f40 Make subs radio button visible to all managers 2019-06-11 17:21:13 +01:00
Maikel Linke
a10bb5acbd Consider deleted products when creating permalinks
https://github.com/openfoodfoundation/openfoodnetwork/issues/3844

Spree's implementation and our implementation to create a unique
permalink failed to notice conflicts with soft-deleted products. This
patch looks at deleted products as well.
2019-06-11 18:20:41 +10:00
Kristina Lim
cf11ef8ba2 Ignore parameter list length for ProductImport::EntryValidator
This can be done in a separate PR. More tests might be needed when
extracting to a class.
2019-06-10 04:20:04 +08:00
Kristina Lim
8c69ee67b8 Refactor code for validating variant in reference to existing product 2019-06-10 04:20:04 +08:00
Kristina Lim
70614de955 Require product import rows to match unit of preceding rows 2019-06-10 04:20:03 +08:00
Kristina Lim
5d282f7e9f Update code layout in ProductImporter method 2019-06-10 04:20:03 +08:00
Kristina Lim
73b388da87 Simplify product import all_entries method 2019-06-10 04:20:03 +08:00
Kristina Lim
38519b2bae Simplify building of product import entries for range 2019-06-10 04:19:50 +08:00
Kristina Lim
37101a6b64 Extract build_entries_from_rows for product import 2019-06-09 23:38:36 +08:00
dependabot-preview[bot]
93811a6d8f Bump i18n-js from 3.2.2 to 3.3.0
Bumps [i18n-js](https://github.com/fnando/i18n-js) from 3.2.2 to 3.3.0.
- [Release notes](https://github.com/fnando/i18n-js/releases)
- [Changelog](https://github.com/fnando/i18n-js/blob/master/CHANGELOG.md)
- [Commits](https://github.com/fnando/i18n-js/commits)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2019-06-06 19:19:50 +00:00
luisramos0
ff2901a9d1 Add address suburb translation key to fix edit subscription address page
Keeping these in the root of the translations file so that they can be used in other places later
2019-06-04 20:59:45 +01:00
luisramos0
9944f3e1e6 Make translations of tooltips in subscriptions list page work again 2019-06-04 20:59:45 +01:00
luisramos0
cfcf73b6a1 Make save and saving messages translatable in subscriptions items panel 2019-06-04 20:59:45 +01:00
luisramos0
eb42e81afc Make some text entries translatable in create subscription pages: title in step 1 details and 4 review and date placeholders in step 1 details 2019-06-04 20:59:45 +01:00
luisramos0
64af81a4a2 Make search_by_email text translatable in subscriptions list page 2019-06-04 20:59:42 +01:00
luisramos0
1a4e83d633 Change products controller to clear variants unit description if variant_unit is items 2019-06-01 16:56:17 +01:00
luisramos0
9078a1edaa Add missing translation keys to the create product page: fields names displayed in error messages 2019-05-30 23:50:51 +01:00
luisramos0
32c107ab5a move translation to use relative path so that the new translation key is used 2019-05-30 23:26:23 +01:00
Masha
fbf52dd1f9 removed translations that are not required, left exchange_form.remove key but reference a global remove in the table 2019-05-30 23:08:05 +01:00
Masha
436a2ba0a2 went much shorted way 2019-05-30 23:08:05 +01:00
Masha
412fffba1d the translations for Remove in the exchange forms added 2019-05-30 23:08:05 +01:00
luisramos0
5024da4123 Make tag rules type descriptions in the management page translatable 2019-05-30 20:39:58 +01:00
luisramos0
6620243603 Make the submit button on the add tag rule dialog translatable 2019-05-30 20:22:02 +01:00
luisramos0
48361b146c Add translation keys to actions in the order payments list page 2019-05-30 20:13:17 +01:00
luisramos0
1d4529092f Make fee type options in enterprise fees page translatable 2019-05-30 00:46:20 +01:00
luisramos0
6e08310744 Make the fields in the column calculator values in the enterprise fees page translatable for all fields of all current calculators 2019-05-29 21:57:03 +01:00
luisramos0
5719455731 Make enterprise fees name placeholder translatable 2019-05-29 21:33:30 +01:00
Kristina Lim
99f163d294 Make code style changes for spec file 2019-05-28 21:32:25 +08:00
Kristina Lim
75fdfb3c6a Remove some usage of guard clauses for OC update 2019-05-28 21:32:25 +08:00
Kristina Lim
56a2347ea0 Extract removal of unauthorized OC exchange attributes to method 2019-05-28 21:29:20 +08:00
Kristina Lim
ea8d189d6c Bulk update OC variant changes in OC form 2019-05-28 21:27:43 +08:00
Kristina Lim
bc6f14105e Require spec_helper.rb in spec file for OC form applicator 2019-05-28 21:26:33 +08:00
Kristina Lim
9def777d02 Install activerecord-import gem 2019-05-28 21:26:32 +08:00
luisramos0
4143c50b1f Move joyride translations to the correct path 2019-05-24 23:54:00 +01:00
luisramos0
dc32d282a6 Fix some rubocop issues in menu css file 2019-05-24 23:54:00 +01:00
luisramos0
2654db7c82 Add new menu style as per design 2019-05-24 23:53:56 +01:00
luisramos0
0dc0776705 Separate mobile menu cart code from large menu cart code 2019-05-24 15:17:41 +01:00
luisramos0
ec9d50c824 Add new cart icon and extract cart joyride from cart haml file 2019-05-24 15:16:36 +01:00
luisramos0
60c08347a5 Extract language selector from large menu haml file, add language name and clean up the code that generates the shopping@ label 2019-05-24 15:12:31 +01:00
luisramos0
15360971b0 Move signed_* files to views/shared/menu and add new logged in and profile icons 2019-05-23 15:58:02 +01:00
jazzdragon
37d15a1be3 Add classes to indicate collapsible is for medium screens or smaller 2019-05-04 20:12:12 -07:00
jazzdragon
623471290e Make sure styling doesn't get messed up if resizing down and back up 2019-05-04 19:52:08 -07:00
jazzdragon
a876f81f0a Make collapsible always visible on large screen 2019-05-04 19:48:30 -07:00
jazzdragon
271330d2fc Add collapsible elements and styles 2019-05-04 19:43:46 -07:00
442 changed files with 11436 additions and 4348 deletions

4
.dockerignore Normal file
View File

@@ -0,0 +1,4 @@
.git
.gitignore
log/*
tmp/*

View File

@@ -68,7 +68,6 @@ Metrics/LineLength:
- app/helpers/shop_helper.rb
- app/helpers/spree/admin/base_helper_decorator.rb
- app/helpers/spree/admin/navigation_helper_decorator.rb
- app/helpers/spree/admin/orders_helper_decorator.rb
- app/helpers/spree/orders_helper.rb
- app/jobs/subscription_confirm_job.rb
- app/mailers/subscription_mailer.rb
@@ -81,9 +80,7 @@ Metrics/LineLength:
- app/models/enterprise_fee.rb
- app/models/enterprise_group.rb
- app/models/enterprise_role.rb
- app/models/exchange.rb
- app/models/inventory_item.rb
- app/models/order_cycle.rb
- app/models/product_import/entry_processor.rb
- app/models/product_import/entry_validator.rb
- app/models/product_import/product_importer.rb
@@ -126,14 +123,11 @@ Metrics/LineLength:
- app/serializers/api/admin/subscription_serializer.rb
- app/serializers/api/admin/tag_rule_serializer.rb
- app/serializers/api/admin/variant_override_serializer.rb
- app/serializers/api/admin/variant_serializer.rb
- app/services/cart_service.rb
- app/services/default_stock_location.rb
- app/services/embedded_page_service.rb
- app/services/line_item_syncer.rb
- app/services/order_cycle_form.rb
- app/services/order_factory.rb
- app/services/order_syncer.rb
- app/services/subscriptions_count.rb
- app/services/variants_stock_levels.rb
- app/views/json/_groups.rabl
@@ -154,15 +148,12 @@ Metrics/LineLength:
- lib/open_food_network/order_and_distributor_report.rb
- lib/open_food_network/order_cycle_form_applicator.rb
- lib/open_food_network/order_cycle_management_report.rb
- lib/open_food_network/order_cycle_permissions.rb
- lib/open_food_network/order_grouper.rb
- lib/open_food_network/orders_and_fulfillments_report.rb
- lib/open_food_network/payments_report.rb
- lib/open_food_network/permalink_generator.rb
- lib/open_food_network/permissions.rb
- lib/open_food_network/products_cache.rb
- lib/open_food_network/products_renderer.rb
- lib/open_food_network/proxy_order_syncer.rb
- lib/open_food_network/reports/bulk_coop_allocation_report.rb
- lib/open_food_network/reports/line_items.rb
- lib/open_food_network/sales_tax_report.rb
@@ -349,10 +340,8 @@ Metrics/LineLength:
- spec/models/tag_rule/filter_shipping_methods_spec.rb
- spec/models/variant_override_spec.rb
- spec/performance/orders_controller_spec.rb
- spec/performance/proxy_order_syncer_spec.rb
- spec/performance/shop_controller_spec.rb
- spec/requests/checkout/failed_checkout_spec.rb
- spec/requests/checkout/paypal_spec.rb
- spec/requests/checkout/stripe_connect_spec.rb
- spec/requests/embedded_shopfronts_headers_spec.rb
- spec/requests/shop_spec.rb
@@ -429,7 +418,6 @@ Metrics/AbcSize:
- app/helpers/checkout_helper.rb
- app/helpers/i18n_helper.rb
- app/helpers/order_cycles_helper.rb
- app/helpers/spree/admin/orders_helper_decorator.rb
- app/helpers/spree/orders_helper.rb
- app/jobs/subscription_placement_job.rb
- app/mailers/producer_mailer.rb
@@ -472,6 +460,7 @@ Metrics/AbcSize:
- lib/open_food_network/orders_and_fulfillments_report.rb
- lib/open_food_network/packing_report.rb
- lib/open_food_network/payments_report.rb
- lib/open_food_network/permissions.rb
- lib/open_food_network/products_and_inventory_report.rb
- lib/open_food_network/reports/line_items.rb
- lib/open_food_network/sales_tax_report.rb
@@ -493,6 +482,72 @@ Metrics/AbcSize:
- spec/models/product_importer_spec.rb
- spec/support/performance_helper.rb
Metrics/BlockLength:
Max: 25
ExcludedMethods: ["class_eval", "collection", "context", "describe", "it", "member", "namespace", "resource", "resources"]
Exclude:
- lib/tasks/data.rake
- lib/tasks/dev.rake
- spec/controllers/spree/admin/invoices_controller_spec.rb
- spec/factories/variant_factory.rb
- spec/features/admin/adjustments_spec.rb
- spec/features/admin/bulk_order_management_spec.rb
- spec/features/admin/bulk_product_update_spec.rb
- spec/features/admin/caching_spec.rb
- spec/features/admin/content_spec.rb
- spec/features/admin/customers_spec.rb
- spec/features/admin/enterprise_fees_spec.rb
- spec/features/admin/enterprise_groups_spec.rb
- spec/features/admin/enterprise_relationships_spec.rb
- spec/features/admin/enterprise_roles_spec.rb
- spec/features/admin/enterprises/images_spec.rb
- spec/features/admin/enterprises/index_spec.rb
- spec/features/admin/enterprises_spec.rb
- spec/features/admin/enterprise_user_spec.rb
- spec/features/admin/multilingual_spec.rb
- spec/features/admin/order_cycles_spec.rb
- spec/features/admin/orders_spec.rb
- spec/features/admin/overview_spec.rb
- spec/features/admin/payment_method_spec.rb
- spec/features/admin/product_import_spec.rb
- spec/features/admin/products_spec.rb
- spec/features/admin/reports/enterprise_fee_summaries_spec.rb
- spec/features/admin/reports_spec.rb
- spec/features/admin/schedules_spec.rb
- spec/features/admin/shipping_methods_spec.rb
- spec/features/admin/subscriptions_spec.rb
- spec/features/admin/tag_rules_spec.rb
- spec/features/admin/tax_settings_spec.rb
- spec/features/admin/users_spec.rb
- spec/features/admin/variant_overrides_spec.rb
- spec/features/admin/variants_spec.rb
- spec/features/consumer/account/cards_spec.rb
- spec/features/consumer/account/settings_spec.rb
- spec/features/consumer/account_spec.rb
- spec/features/consumer/authentication_spec.rb
- spec/features/consumer/cookies_spec.rb
- spec/features/consumer/external_services_spec.rb
- spec/features/consumer/groups_spec.rb
- spec/features/consumer/multilingual_spec.rb
- spec/features/consumer/producers_spec.rb
- spec/features/consumer/registration_spec.rb
- spec/features/consumer/shopping/cart_spec.rb
- spec/features/consumer/shopping/checkout_auth_spec.rb
- spec/features/consumer/shopping/checkout_spec.rb
- spec/features/consumer/shopping/embedded_groups_spec.rb
- spec/features/consumer/shopping/embedded_shopfronts_spec.rb
- spec/features/consumer/shopping/orders_spec.rb
- spec/features/consumer/shopping/products_spec.rb
- spec/features/consumer/shopping/shopping_spec.rb
- spec/features/consumer/shopping/variant_overrides_spec.rb
- spec/features/consumer/shops_spec.rb
- spec/lib/open_food_network/group_buy_report_spec.rb
- spec/models/tag_rule/discount_order_spec.rb
- spec/spec_helper.rb
- spec/support/delayed_job_helper.rb
- spec/support/matchers/select2_matchers.rb
- spec/support/matchers/table_matchers.rb
Metrics/CyclomaticComplexity:
Max: 6
Exclude:
@@ -504,7 +559,6 @@ Metrics/CyclomaticComplexity:
- app/helpers/checkout_helper.rb
- app/helpers/i18n_helper.rb
- app/helpers/order_cycles_helper.rb
- app/helpers/spree/admin/orders_helper_decorator.rb
- app/models/enterprise.rb
- app/models/enterprise_relationship.rb
- app/models/product_import/entry_processor.rb
@@ -534,7 +588,6 @@ Metrics/PerceivedComplexity:
- app/helpers/checkout_helper.rb
- app/helpers/i18n_helper.rb
- app/helpers/order_cycles_helper.rb
- app/helpers/spree/admin/orders_helper_decorator.rb
- app/models/enterprise_relationship.rb
- app/models/product_import/entry_processor.rb
- app/models/product_import/entry_validator.rb
@@ -580,7 +633,6 @@ Metrics/MethodLength:
- app/controllers/user_registrations_controller.rb
- app/helpers/checkout_helper.rb
- app/helpers/order_cycles_helper.rb
- app/helpers/spree/admin/orders_helper_decorator.rb
- app/jobs/subscription_placement_job.rb
- app/mailers/producer_mailer.rb
- app/models/column_preference.rb

View File

@@ -13,8 +13,6 @@ AllCops:
- 'script/**/*'
- 'vendor/**/*'
- 'node_modules/**/*'
# The parser gem fails to parse this file with out current Ruby version.
- 'spec/factories.rb'
# Excluding: inadequate Naming/FileName rule rejects GemFile name with camelcase
- 'engines/web/Gemfile'
@@ -187,7 +185,8 @@ Metrics/AbcSize:
Max: 15
Metrics/BlockLength:
ExcludedMethods: ["collection", "context", "describe", "it", "member", "namespace", "resource", "resources"]
Max: 25
ExcludedMethods: ["class_eval", "collection", "context", "describe", "it", "member", "namespace", "resource", "resources"]
Metrics/BlockNesting:
Max: 3

View File

@@ -61,7 +61,6 @@ Lint/IneffectiveAccessModifier:
- 'app/models/column_preference.rb'
- 'app/services/mail_configuration.rb'
- 'lib/open_food_network/feature_toggle.rb'
- 'lib/open_food_network/products_cache.rb'
- 'spec/lib/open_food_network/reports/report_spec.rb'
# Offense count: 1
@@ -87,7 +86,6 @@ Lint/UselessAccessModifier:
- 'app/models/column_preference.rb'
- 'app/services/mail_configuration.rb'
- 'lib/open_food_network/feature_toggle.rb'
- 'lib/open_food_network/products_cache.rb'
- 'lib/open_food_network/reports/bulk_coop_report.rb'
- 'spec/lib/open_food_network/reports/report_spec.rb'
@@ -122,11 +120,6 @@ Naming/AccessorMethodName:
- 'spec/support/request/shop_workflow.rb'
- 'spec/support/request/web_helper.rb'
# Offense count: 1
Naming/BinaryOperatorParameterName:
Exclude:
- 'app/models/exchange.rb'
# Offense count: 1
# Configuration parameters: Blacklist.
# Blacklist: (?-mix:(^|\s)(EO[A-Z]{1}|END)(\s|$))
@@ -175,7 +168,6 @@ Naming/UncommunicativeMethodParamName:
- 'app/helpers/admin/injection_helper.rb'
- 'app/helpers/spree/admin/base_helper_decorator.rb'
- 'app/helpers/spree/base_helper_decorator.rb'
- 'app/models/exchange.rb'
- 'app/services/subscription_validator.rb'
- 'lib/open_food_network/reports/bulk_coop_report.rb'
- 'lib/open_food_network/xero_invoices_report.rb'
@@ -433,7 +425,6 @@ Style/GuardClause:
- 'app/services/order_syncer.rb'
- 'lib/discourse/single_sign_on.rb'
- 'lib/open_food_network/order_cycle_form_applicator.rb'
- 'lib/open_food_network/products_cache.rb'
- 'lib/open_food_network/products_renderer.rb'
- 'lib/open_food_network/rack_request_blocker.rb'
- 'lib/open_food_network/variant_and_line_item_naming.rb'

View File

@@ -1,60 +0,0 @@
language: ruby
sudo: false
cache: bundler
bundler_args: --without development
rvm:
- "2.1.5"
addons:
postgresql: "9.5"
# Set the timezone for phantomjs with TZ
# Set the timezone for karma with TIMEZONE
env:
global:
- TZ="Australia/Melbourne"
- TIMEZONE="Australia/Melbourne"
- CI_NODE_TOTAL=5
matrix:
- CI_NODE_INDEX=0
- CI_NODE_INDEX=1
- CI_NODE_INDEX=2
- CI_NODE_INDEX=3 RSPEC_ENGINES="true"
- CI_NODE_INDEX=4 KARMA="true" GITHUB_DEPLOY="true"
before_script:
- cp config/database.travis.yml config/database.yml
- cp config/application.yml.example config/application.yml
- RAILS_ENV=test bundle exec rake db:create db:schema:load
# Only install PhantomJS if it is not already present (ie. cached)
- npm list -g phantomjs-prebuilt@~2.1.7 --depth=0 || npm install -g phantomjs-prebuilt@~2.1.7
- export PATH=`npm bin -g`:$PATH
- >
if [ "$KARMA" = "true" ]; then
npm install -g npm@'3.8.8'
npm install
npm install -g karma-cli@0.1.2
fi
script:
- 'if [ "$KARMA" = "true" ]; then bundle exec rake karma:run; else echo "Skipping karma run"; fi'
- 'if [ "$RSPEC_ENGINES" = "true" ]; then bundle exec rake ofn:specs:engines:rspec; else echo "Skipping RSpec run in engines"; fi'
- "bundle exec rake 'knapsack:rspec[--format progress --tag ~performance]'"
after_success:
- >
if [ "$GITHUB_DEPLOY" = "true" -a "$TRAVIS_PULL_REQUEST" = "false" -a -n "$TRAVIS_BRANCH" -a "$TRAVIS_BRANCH" != "transifex" -a -n "$GITHUB_API_SECRET" ]; then
description="`git show "$TRAVIS_BRANCH" -s --oneline --no-color`"
data="{
\"ref\":\"$TRAVIS_BRANCH\",
\"description\":\"$description\",
\"environment\":\"staging\",
\"required_contexts\":[]}"
curl -u "$GITHUB_API_SECRET" -d "$data" "https://api.github.com/repos/$TRAVIS_REPO_SLUG/deployments"
else
echo "Not deploying on this build."
fi
notifications:
email: false

47
DOCKER.md Normal file
View File

@@ -0,0 +1,47 @@
### Docker
It is possible to setup the Open Food Network app easily with Docker and Docker Compose.
The objective is to spare configuration time, in order to help people testing the app and contribute to it.
It can also be used as documentation. It is not perfect but it is used in many other projects and many devs are used to it nowadays.
### Install Docker
Please check the documentation here, https://docs.docker.com/install/ to install Docker.
For Docker Compose, information are here: https://docs.docker.com/compose/install/.
Better to have at least 2GB free on your computer in order to download images and create containers for Open Food Network app.
### Use Docker with Open Food Network
Open a terminal with a shell.
Clone the repository:
```sh
$ git clone git@github.com:openfoodfoundation/openfoodnetwork.git
```
Go at the root of the app:
```sh
$ cd openfoodnetwork
```
Download the Docker images and build the containers:
```sh
$ docker-compose build
```
Run the app with all the required containers:
```sh
$ docker-compose up
```
This command will setup the database and seed it with sample data. The default admin user is 'ofn@example.com' with 'ofn123' password.
Check the app in the browser at `http://localhost:3000`.
You will then get the trace of the containers in the terminal. You can stop the containers using Ctrl-C in the terminal.

31
Dockerfile Normal file
View File

@@ -0,0 +1,31 @@
FROM ubuntu:18.04
# Install all the requirements
RUN apt-get update && apt-get install -y curl git build-essential software-properties-common wget zlib1g-dev libssl1.0-dev libreadline-dev libyaml-dev libffi-dev libxml2-dev libxslt1-dev wait-for-it
# Setup ENV variables
ENV PATH /usr/local/src/rbenv/shims:/usr/local/src/rbenv/bin:$PATH
ENV RBENV_ROOT /usr/local/src/rbenv
ENV RUBY_VERSION 2.1.5
ENV CONFIGURE_OPTS --disable-install-doc
# Rbenv & Ruby part
RUN git clone https://github.com/rbenv/rbenv.git ${RBENV_ROOT} && \
git clone https://github.com/rbenv/ruby-build.git ${RBENV_ROOT}/plugins/ruby-build && \
${RBENV_ROOT}/plugins/ruby-build/install.sh && \
echo 'eval "$(rbenv init -)"' >> /etc/profile.d/rbenv.sh && \
rbenv install $RUBY_VERSION && \
rbenv global $RUBY_VERSION && \
gem install bundler --version=1.17.2
# Postgres
RUN sh -c "echo 'deb https://apt.postgresql.org/pub/repos/apt/ bionic-pgdg main' > /etc/apt/sources.list.d/pgdg.list" && \
wget --quiet -O - https://apt.postgresql.org/pub/repos/apt/ACCC4CF8.asc | apt-key add - && \
apt-get update && \
apt-get install -yqq --no-install-recommends postgresql-client-9.5 libpq-dev
ENV BUNDLE_PATH /bundles
COPY . /usr/src/app/
WORKDIR /usr/src/app

16
Gemfile
View File

@@ -3,11 +3,12 @@ ruby "2.1.5"
git_source(:github) { |repo_name| "https://github.com/#{repo_name}.git" }
gem 'i18n', '~> 0.6.11'
gem 'i18n-js', '~> 3.2.2'
gem 'i18n-js', '~> 3.3.0'
gem 'rails', '~> 3.2.22'
gem 'rails-i18n', '~> 3.0.0'
gem 'rails_safe_tasks', '~> 1.0'
gem "activerecord-import"
# Patched version. See http://rubysec.com/advisories/CVE-2015-5312/.
gem 'nokogiri', '>= 1.6.7.1'
@@ -19,9 +20,10 @@ gem 'pg'
# OFN-maintained and patched version of Spree v2.0.4. See
# https://github.com/openfoodfoundation/openfoodnetwork/wiki/Spree-2.0-upgrade
# for details.
gem 'spree', github: 'openfoodfoundation/spree', branch: '2-0-4-stable'
gem 'spree_api', github: 'openfoodfoundation/spree', branch: '2-0-4-stable'
gem 'spree_backend', github: 'openfoodfoundation/spree', branch: '2-0-4-stable'
gem 'spree_core', github: 'openfoodfoundation/spree', branch: '2-0-4-stable'
gem 'spree_auth_devise', github: 'spree/spree_auth_devise', branch: '2-0-stable'
gem 'spree_i18n', github: 'spree/spree_i18n', branch: '1-3-stable'
# Our branch contains two changes
@@ -34,6 +36,8 @@ gem 'stripe'
# which is needed for Pin Payments (and possibly others).
gem 'activemerchant', '~> 1.78'
gem 'devise', '~> 2.2.5'
gem 'devise-encryptable', '0.2.0'
gem 'jwt', '~> 2.2'
gem 'oauth2', '~> 1.4.1' # Used for Stripe Connect
@@ -115,6 +119,10 @@ gem 'jquery-rails', '3.0.4'
gem 'ofn-qz', github: 'openfoodfoundation/ofn-qz', ref: '60da2ae4c44cbb4c8d602f59fb5fff8d0f21db3c'
group :production, :staging do
gem 'ddtrace'
end
group :test, :development do
# Pretty printed test output
gem 'atomic'
@@ -122,7 +130,7 @@ group :test, :development do
gem 'capybara', '>= 2.15.4'
gem 'database_cleaner', '0.7.1', require: false
gem "factory_bot_rails", require: false
gem 'fuubar', '~> 2.4.0'
gem 'fuubar', '~> 2.4.1'
gem 'json_spec', '~> 1.1.4'
gem 'knapsack'
gem 'letter_opener', '>= 1.4.1'

View File

@@ -31,16 +31,9 @@ GIT
GIT
remote: https://github.com/openfoodfoundation/spree.git
revision: 46d6f8f5fd434105b0c69958276d1727a3066a97
revision: 8a8585a43cd04d1a50dc65227f337a91b18d66d5
branch: 2-0-4-stable
specs:
spree (2.0.4)
spree_api (= 2.0.4)
spree_backend (= 2.0.4)
spree_cmd (= 2.0.4)
spree_core (= 2.0.4)
spree_frontend (= 2.0.4)
spree_sample (= 2.0.4)
spree_api (2.0.4)
rabl (= 0.8.4)
spree_core (= 2.0.4)
@@ -53,8 +46,6 @@ GIT
select2-rails (~> 3.4.7)
spree_api (= 2.0.4)
spree_core (= 2.0.4)
spree_cmd (2.0.4)
thor (>= 0.14.6)
spree_core (2.0.4)
activemerchant (~> 1.34)
acts_as_list (= 0.2.0)
@@ -75,28 +66,6 @@ GIT
state_machine (= 1.2.0)
stringex (~> 1.5.1)
truncate_html (= 0.9.2)
spree_frontend (2.0.4)
canonical-rails
deface (>= 0.9.0)
jquery-rails (~> 3.0.0)
rails (~> 3.2.13)
spree_api (= 2.0.4)
spree_core (= 2.0.4)
stringex (~> 1.5.1)
spree_sample (2.0.4)
spree_core (= 2.0.4)
GIT
remote: https://github.com/spree/spree_auth_devise.git
revision: 0181835fb6ac77a05191d26f6f32a0f4a548d851
branch: 2-0-stable
specs:
spree_auth_devise (2.0.0)
devise (~> 2.2.5)
devise-encryptable (= 0.1.2)
spree_backend (~> 2.0.0)
spree_core (~> 2.0.0)
spree_frontend (~> 2.0.0)
GIT
remote: https://github.com/spree/spree_i18n.git
@@ -160,6 +129,8 @@ GEM
activesupport (= 3.2.22.5)
arel (~> 3.0.2)
tzinfo (~> 0.3.29)
activerecord-import (1.0.2)
activerecord (>= 3.2)
activeresource (3.2.22.5)
activemodel (= 3.2.22.5)
activesupport (= 3.2.22.5)
@@ -189,7 +160,7 @@ GEM
json (~> 1.4)
nokogiri (>= 1.4.4)
uuidtools (~> 2.1)
bcrypt (3.1.11)
bcrypt (3.1.13)
bcrypt-ruby (3.1.5)
bcrypt (>= 3.1.3)
blockenspiel (0.5.0)
@@ -198,8 +169,6 @@ GEM
builder (3.0.4)
byebug (9.0.6)
cancan (1.6.10)
canonical-rails (0.1.0)
rails (>= 3.1, < 5.1)
capybara (2.18.0)
addressable
mini_mime (>= 0.1.3)
@@ -254,6 +223,8 @@ GEM
activerecord (>= 3.2.0, < 5.0)
fog (~> 1.0)
rails (>= 3.2.0, < 5.0)
ddtrace (0.26.0)
msgpack
debugger-linecache (1.2.0)
deface (1.0.2)
colorize (>= 0.5.8)
@@ -275,11 +246,11 @@ GEM
orm_adapter (~> 0.1)
railties (~> 3.1)
warden (~> 1.2.1)
devise-encryptable (0.1.2)
devise-encryptable (0.2.0)
devise (>= 2.1.0)
diff-lcs (1.3)
diffy (3.3.0)
docile (1.3.1)
docile (1.3.2)
dry-inflector (0.1.2)
em-websocket (0.5.1)
eventmachine (>= 0.12.9)
@@ -456,7 +427,7 @@ GEM
foundation-rails (5.5.2.1)
railties (>= 3.1.0)
sass (>= 3.3.0, < 3.5)
fuubar (2.4.0)
fuubar (2.4.1)
rspec-core (~> 3.0)
ruby-progressbar (~> 1.4)
geocoder (1.1.8)
@@ -485,14 +456,14 @@ GEM
rspec (>= 2.99.0, < 4.0)
haml (4.0.7)
tilt
hashdiff (0.4.0)
hashdiff (1.0.0)
highline (1.6.18)
hike (1.2.3)
http_parser.rb (0.6.0)
httparty (0.16.2)
multi_xml (>= 0.5.2)
i18n (0.6.11)
i18n-js (3.2.2)
i18n-js (3.3.0)
i18n (>= 0.6.6)
immigrant (0.3.6)
activerecord (>= 3.0)
@@ -514,7 +485,7 @@ GEM
actionpack (>= 3.0.0)
activesupport (>= 3.0.0)
kgio (2.11.2)
knapsack (1.17.1)
knapsack (1.17.2)
rake
launchy (2.4.3)
addressable (~> 2.3)
@@ -536,6 +507,7 @@ GEM
railties (>= 3.1)
money (5.1.1)
i18n (~> 0.6.0)
msgpack (1.3.1)
multi_json (1.13.1)
multi_xml (0.6.0)
multipart-post (2.1.1)
@@ -586,7 +558,7 @@ GEM
pry-byebug (3.4.3)
byebug (>= 9.0, < 9.1)
pry (~> 0.10)
public_suffix (3.0.3)
public_suffix (3.1.1)
rabl (0.8.4)
activesupport (>= 2.3.14)
rack (1.4.7)
@@ -622,7 +594,7 @@ GEM
thor (>= 0.14.6, < 2.0)
rainbow (3.0.0)
raindrops (0.19.0)
rake (12.3.2)
rake (12.3.3)
ransack (0.7.2)
actionpack (~> 3.0)
activerecord (~> 3.0)
@@ -637,7 +609,7 @@ GEM
trollop (~> 2.1)
rdoc (3.12.2)
json (~> 1.4)
redcarpet (3.4.0)
redcarpet (3.5.0)
ref (2.0.0)
request_store (1.4.1)
rack (>= 1.4)
@@ -704,7 +676,7 @@ GEM
shellany (0.0.1)
shoulda-matchers (2.8.0)
activesupport (>= 3.0.0)
simplecov (0.16.1)
simplecov (0.17.0)
docile (~> 1.1)
json (>= 1.8, < 3)
simplecov-html (~> 0.10.0)
@@ -729,7 +701,7 @@ GEM
tilt (~> 1.1, != 1.3.0)
state_machine (1.2.0)
stringex (1.5.1)
stripe (4.18.1)
stripe (4.19.0)
faraday (~> 0.13)
net-http-persistent (~> 3.0)
therubyracer (0.12.0)
@@ -767,7 +739,7 @@ GEM
nokogiri (~> 1.6)
rubyzip (~> 1.0)
selenium-webdriver (~> 3.0)
webmock (3.6.0)
webmock (3.6.2)
addressable (>= 2.3.6)
crack (>= 0.3.2)
hashdiff (>= 0.4.0, < 2.0.0)
@@ -785,6 +757,7 @@ PLATFORMS
DEPENDENCIES
active_model_serializers (= 0.8.4)
activemerchant (~> 1.78)
activerecord-import
acts-as-taggable-on (~> 3.4)
andand
angular-rails-templates (~> 0.3.0)
@@ -805,10 +778,13 @@ DEPENDENCIES
dalli
database_cleaner (= 0.7.1)
db2fog
ddtrace
debugger-linecache
deface (= 1.0.2)
delayed_job_active_record
delayed_job_web
devise (~> 2.2.5)
devise-encryptable (= 0.2.0)
diffy
eventmachine (>= 1.2.3)
factory_bot_rails
@@ -817,7 +793,7 @@ DEPENDENCIES
foundation-icons-sass-rails
foundation-rails
foundation_rails_helper!
fuubar (~> 2.4.0)
fuubar (~> 2.4.1)
geocoder
gmaps4rails
guard
@@ -826,7 +802,7 @@ DEPENDENCIES
guard-rspec (~> 4.7.3)
haml
i18n (~> 0.6.11)
i18n-js (~> 3.2.2)
i18n-js (~> 3.3.0)
immigrant
jquery-migrate-rails
jquery-rails (= 3.0.4)
@@ -868,8 +844,9 @@ DEPENDENCIES
simplecov
skylight (< 2.0)
spinjs-rails
spree!
spree_auth_devise!
spree_api!
spree_backend!
spree_core!
spree_i18n!
spree_paypal_express!
spring (= 1.7.2)

View File

@@ -27,10 +27,13 @@ If you're interested in provisioning a server, see [ofn-install][ofn-install] fo
We also have a [Super Admin Guide][super-admin-guide] to help with configuration of new servers.
## Testing
We use [BrowserStack](https://www.browserstack.com/) as a manual testing tool. BrowserStack provides open source projects with unlimited and free of charge accounts. A big thanks to them!
## Licence
Copyright (c) 2012 - 2018 Open Food Foundation, released under the AGPL licence.
Copyright (c) 2012 - 2019 Open Food Foundation, released under the AGPL licence.
[survey]: https://docs.google.com/a/eaterprises.com.au/forms/d/1zxR5vSiU9CigJ9cEaC8-eJLgYid8CR8er7PPH9Mc-30/edit#
[slack-invite]: https://openfoodnetwork.org/slack-invite

Binary file not shown.

After

Width:  |  Height:  |  Size: 127 B

View File

@@ -0,0 +1,3 @@
<svg xmlns="http://www.w3.org/2000/svg" width="20" height="18" viewBox="0 0 20 18">
<path fill="#FFF" fill-opacity=".5" fill-rule="nonzero" d="M18.338 10.593l1.64-7.312a.841.841 0 0 0-.812-1.031H5.528L5.21.675A.836.836 0 0 0 4.393 0H.833A.839.839 0 0 0 0 .844v.562c0 .466.373.844.833.844H3.26l2.439 12.074c-.584.34-.977.977-.977 1.707 0 1.088.87 1.969 1.945 1.969 1.074 0 1.944-.881 1.944-1.969 0-.55-.224-1.049-.584-1.406h7.28c-.36.357-.585.855-.585 1.406 0 1.088.87 1.969 1.945 1.969 1.074 0 1.944-.881 1.944-1.969 0-.78-.447-1.453-1.096-1.772l.191-.853a.841.841 0 0 0-.812-1.031h-9.32l-.228-1.125h10.179c.389 0 .726-.273.813-.657z"/>
</svg>

After

Width:  |  Height:  |  Size: 648 B

View File

@@ -0,0 +1,7 @@
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16">
<g fill="none" fill-rule="evenodd">
<path d="M0 0h16v16H0z"/>
<path fill="#F4704C" d="M13.85 5.928h-1.234v-1.54c0-2.338-2.026-4.234-4.525-4.234-2.5 0-4.526 1.896-4.526 4.235v1.54H2.33c-.682 0-1.235.516-1.235 1.154v7.7c0 .637.553 1.154 1.235 1.154h11.52c.681 0 1.234-.517 1.234-1.154v-7.7c0-.638-.553-1.155-1.234-1.155zM4.8 4.388c0-1.7 1.473-3.08 3.29-3.08 1.818 0 3.292 1.38 3.292 3.08v1.54H4.799v-1.54z"/>
<path fill="#FFF" d="M8.296 13.23c1.243 0 2.25-.942 2.25-2.105 0-1.162-1.007-2.105-2.25-2.105-1.242 0-2.25.943-2.25 2.105.003 1.162 1.009 2.103 2.25 2.106zm0-3.211c.654 0 1.183.495 1.183 1.106 0 .612-.53 1.107-1.183 1.107s-1.183-.495-1.183-1.107c0-.61.53-1.106 1.183-1.106z"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 812 B

View File

@@ -0,0 +1,6 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="16" height="16" viewBox="0 0 16 16">
<defs>
<path id="a" d="M15 15.2a.79.79 0 0 1-.778.8H1.778A.79.79 0 0 1 1 15.2v-2.4c0-2.21 1.741-4 3.889-4h6.222c2.148 0 3.889 1.79 3.889 4v2.4zM8 8C5.852 8 4.111 6.21 4.111 4S5.852 0 8 0c2.148 0 3.889 1.79 3.889 4S10.148 8 8 8z"/>
</defs>
<use fill="#F4704C" fill-rule="nonzero" xlink:href="#a"/>
</svg>

After

Width:  |  Height:  |  Size: 451 B

View File

@@ -15,7 +15,6 @@
//= require angular-animate
//= require angular-sanitize
//= require admin/spree_backend
//= require admin/spree_auth
//= require admin/spree_paypal_express
//= require ../shared/ng-infinite-scroll.min.js
//= require ../shared/ng-tags-input.min.js

View File

@@ -5,7 +5,7 @@ angular.module('admin.orderCycles')
$scope.distributor_enterprises = Enterprise.hub_enterprises
$scope.supplied_products = Enterprise.supplied_products
$scope.enterprise_fees = EnterpriseFee.index(coordinator_id: ocInstance.coordinator_id)
$scope.schedules = Schedules.index()
$scope.schedules = Schedules.index({enterprise_id: ocInstance.coordinator_id})
$scope.OrderCycle = OrderCycle
$scope.order_cycle = OrderCycle.new({ coordinator_id: ocInstance.coordinator_id})

View File

@@ -1,12 +1,12 @@
angular.module('admin.orderCycles')
.controller 'AdminEditOrderCycleCtrl', ($scope, $filter, $location, $window, OrderCycle, Enterprise, EnterpriseFee, StatusMessage, Schedules, RequestMonitor) ->
.controller 'AdminEditOrderCycleCtrl', ($scope, $filter, $location, $window, OrderCycle, Enterprise, EnterpriseFee, StatusMessage, Schedules, RequestMonitor, ocInstance) ->
order_cycle_id = $location.absUrl().match(/\/admin\/order_cycles\/(\d+)/)[1]
$scope.enterprises = Enterprise.index(order_cycle_id: order_cycle_id)
$scope.supplier_enterprises = Enterprise.producer_enterprises
$scope.distributor_enterprises = Enterprise.hub_enterprises
$scope.supplied_products = Enterprise.supplied_products
$scope.enterprise_fees = EnterpriseFee.index(order_cycle_id: order_cycle_id)
$scope.schedules = Schedules.index()
$scope.schedules = Schedules.index({enterprise_id: ocInstance.coordinator_id})
$scope.OrderCycle = OrderCycle
$scope.order_cycle = OrderCycle.load(order_cycle_id)

View File

@@ -1,7 +1,7 @@
angular.module('admin.orderCycles').controller "AdminSimpleCreateOrderCycleCtrl", ($scope, $window, OrderCycle, Enterprise, EnterpriseFee, StatusMessage, Schedules, RequestMonitor, ocInstance) ->
$scope.StatusMessage = StatusMessage
$scope.OrderCycle = OrderCycle
$scope.schedules = Schedules.index()
$scope.schedules = Schedules.index({enterprise_id: ocInstance.coordinator_id})
$scope.order_cycle = OrderCycle.new {coordinator_id: ocInstance.coordinator_id}, =>
# TODO: make this a get method, which only fetches one enterprise
$scope.enterprises = Enterprise.index {coordinator_id: ocInstance.coordinator_id}, (enterprises) =>

View File

@@ -1,11 +1,11 @@
angular.module('admin.orderCycles').controller "AdminSimpleEditOrderCycleCtrl", ($scope, $location, $window, OrderCycle, Enterprise, EnterpriseFee, Schedules, RequestMonitor, StatusMessage) ->
angular.module('admin.orderCycles').controller "AdminSimpleEditOrderCycleCtrl", ($scope, $location, $window, OrderCycle, Enterprise, EnterpriseFee, Schedules, RequestMonitor, StatusMessage, ocInstance) ->
$scope.orderCycleId = ->
$location.absUrl().match(/\/admin\/order_cycles\/(\d+)/)[1]
$scope.StatusMessage = StatusMessage
$scope.enterprises = Enterprise.index(order_cycle_id: $scope.orderCycleId())
$scope.enterprise_fees = EnterpriseFee.index(order_cycle_id: $scope.orderCycleId())
$scope.schedules = Schedules.index()
$scope.schedules = Schedules.index({enterprise_id: ocInstance.coordinator_id})
$scope.OrderCycle = OrderCycle
$scope.order_cycle = OrderCycle.load $scope.orderCycleId(), (order_cycle) =>
$scope.init()

View File

@@ -24,8 +24,3 @@ angular.module("admin.orders").controller "orderCtrl", ($scope, shops, orderCycl
for shop in $scope.shops
shop.disabled = !$scope.distributorHasOrderCycles(shop)
# Removes the split button introduced by spree in the order form
# We only have one stock location in OFN so it's meaningless to split the order between stock locations
# We delete it instead of hiding or changing CSS so that, when spree code toggles the element, nothing hapens
$('.split-item').remove()

View File

@@ -3,6 +3,8 @@ angular.module("admin.resources").factory 'ScheduleResource', ($resource) ->
'index':
method: 'GET'
isArray: true
params:
enterprise_id: '@enterprise_id'
'create':
method: 'POST'
'update':

View File

@@ -40,7 +40,7 @@ angular.module("admin.resources").factory "Schedules", ($q, $injector, RequestMo
delete @byID[schedule.id]
StatusMessage.display 'success', "#{t('js.admin.order_cycles.schedules.deleted_schedule')}: '#{schedule.name}'"
index: ->
request = ScheduleResource.index (data) => @load(data)
index: (params) ->
request = ScheduleResource.index params, (data) => @load(data)
RequestMonitor.load(request.$promise)
request

View File

@@ -5,7 +5,7 @@ angular.module("admin.subscriptions").controller "OrderUpdateIssuesController",
OrderCycles.byID[id].name
$scope.orderCycleCloses = (id) ->
closes_at = moment(OrderCycles.byID[id].orders_close_at)
closes_at = moment(OrderCycles.byID[id].orders_close_at, "YYYY-MM-DD HH:mm:SS Z")
key = if closes_at > moment() then "closes" else "closed"
text = t("js.subscriptions." + key)
"#{text} #{closes_at.fromNow()}"

View File

@@ -15,7 +15,7 @@ angular.module("admin.subscriptions").controller "OrdersPanelController", ($scop
$scope.orderCycleCloses = (id) ->
oc = OrderCycles.byID[id]
return t('js.subscriptions.close_date_not_set') unless oc?.orders_close_at?
closes_at = moment(oc.orders_close_at)
closes_at = moment(oc.orders_close_at, "YYYY-MM-DD HH:mm:SS Z")
text = if closes_at > moment() then t('js.subscriptions.closes') else t('js.subscriptions.closed')
"#{text} #{closes_at.fromNow()}"

View File

@@ -10,14 +10,14 @@ angular.module("admin.subscriptions").controller "ProductsPanelController", ($sc
$scope.save = ->
$scope.saving = true
StatusMessage.display 'progress', 'Saving...'
StatusMessage.display 'progress', t('js.saving')
$scope.subscription.update().then (response) ->
$scope.saving = false
StatusMessage.display 'success', 'Saved'
StatusMessage.display 'success', t('js.changes_saved')
, (response) ->
$scope.saving = false
if response.data?.errors?
keys = Object.keys(response.data.errors)
StatusMessage.display 'failure', response.data.errors[keys[0]][0]
else
StatusMessage.display 'success', 'Saved'
StatusMessage.display 'success', t('js.changes_saved')

View File

@@ -4,8 +4,8 @@ angular.module("admin.tagRules").directive "tagRule", ->
link: (scope, element, attrs) ->
scope.opt =
"TagRule::FilterShippingMethods":
textTop: "Shipping methods tagged"
textBottom: "are:"
textTop: t('js.admin.tag_rules.shipping_method_tagged_top')
textBottom: t('js.admin.tag_rules.shipping_method_tagged_bottom')
taggable: "shipping_method"
tagsAttr: "shipping_method_tags"
tagListAttr: "preferred_shipping_method_tags"
@@ -13,8 +13,8 @@ angular.module("admin.tagRules").directive "tagRule", ->
tagListFor: (rule) ->
rule.preferred_shipping_method_tags
"TagRule::FilterPaymentMethods":
textTop: "Payment methods tagged"
textBottom: "are:"
textTop: t('js.admin.tag_rules.payment_method_tagged_top')
textBottom: t('js.admin.tag_rules.payment_method_tagged_bottom')
taggable: "payment_method"
tagsAttr: "payment_method_tags"
tagListAttr: "preferred_payment_method_tags"
@@ -22,8 +22,8 @@ angular.module("admin.tagRules").directive "tagRule", ->
tagListFor: (rule) ->
rule.preferred_payment_method_tags
"TagRule::FilterOrderCycles":
textTop: "Order Cycles tagged"
textBottom: "are:"
textTop: t('js.admin.tag_rules.order_cycle_tagged_top')
textBottom: t('js.admin.tag_rules.order_cycle_tagged_bottom')
taggable: "exchange"
tagsAttr: "exchange_tags"
tagListAttr: "preferred_exchange_tags"
@@ -31,8 +31,8 @@ angular.module("admin.tagRules").directive "tagRule", ->
tagListFor: (rule) ->
rule.preferred_exchange_tags
"TagRule::FilterProducts":
textTop: "Inventory variants tagged"
textBottom: "are:"
textTop: t('js.admin.tag_rules.inventory_tagged_top')
textBottom: t('js.admin.tag_rules.inventory_tagged_bottom')
taggable: "variant"
tagsAttr: "variant_tags"
tagListAttr: "preferred_variant_tags"

View File

@@ -27,8 +27,6 @@ angular.module("admin.utils").directive "variantAutocomplete", ($timeout) ->
window.variants = data # this is how spree auto complete JS code picks up variants
results: data
formatResult: (variant) ->
if variant["images"][0] != undefined && variant["images"][0].image != undefined
variant.image = variant.images[0].image.mini_url
variantTemplate variant: variant
formatSelection: (variant) ->
element.parent().children(".options_placeholder").html variant.options_text

View File

@@ -1,12 +0,0 @@
Darkswarm.controller "GroupEnterpriseNodeCtrl", ($scope, CurrentHub) ->
$scope.active = false
$scope.toggle = ->
$scope.active = !$scope.active
$scope.open = ->
$scope.active
$scope.current = ->
$scope.hub.id is CurrentHub.hub.id

View File

@@ -1,22 +1,6 @@
Darkswarm.controller "GroupPageCtrl", ($scope, group_enterprises, Enterprises, MapConfiguration, OfnMap, visibleFilter, Navigation) ->
Darkswarm.controller "GroupPageCtrl", ($scope, enterprises, Enterprises, MapConfiguration, OfnMap) ->
$scope.Enterprises = Enterprises
all_enterprises_by_id = Enterprises.enterprises_by_id
dereferenced_enterprises = group_enterprises.map (enterprise) =>
all_enterprises_by_id[enterprise.id]
visible_enterprises = visibleFilter dereferenced_enterprises
# TODO: this is duplicate code with app/assets/javascripts/darkswarm/services/enterprises.js.coffee
# It would be better to load only the needed enterprises (group + related shops).
$scope.group_producers = visible_enterprises.filter (enterprise) ->
enterprise.category in ["producer_hub", "producer_shop", "producer"]
$scope.group_hubs = visible_enterprises.filter (enterprise) ->
enterprise.category in ["hub", "hub_profile", "producer_hub", "producer_shop"]
$scope.producers_to_filter = $scope.group_producers
$scope.map = angular.copy MapConfiguration.options
$scope.mapMarkers = OfnMap.enterprise_markers visible_enterprises
$scope.embedded_layout = window.location.search.indexOf("embedded_shopfront=true") != -1
$scope.mapMarkers = OfnMap.enterprise_markers enterprises
$scope.embedded_layout = window.location.search.indexOf("embedded_shopfront=true") != -1

View File

@@ -1,9 +1,44 @@
Darkswarm.controller "HubNodeCtrl", ($scope, HashNavigation, Navigation, $location, $templateCache, CurrentHub) ->
$scope.toggle = (e) ->
HashNavigation.toggle $scope.hub.hash if !angular.element(e.target).inheritedData('is-link')
Darkswarm.controller "HubNodeCtrl", ($scope, HashNavigation, CurrentHub, $http, $timeout) ->
$scope.shopfront_loading = false
$scope.enterprise_details = []
$timeout ->
if $scope.open()
$scope.load_shopfront()
# Toggles shopfront tabs open/closed. Fetches enterprise details from the api, diplays them and adds them
# to $scope.enterprise_details, or simply displays the details again if previously fetched
$scope.toggle = (event) ->
if $scope.open()
$scope.toggle_tab(event)
return
if $scope.enterprise_details[$scope.hub.id]
$scope.hub = $scope.enterprise_details[$scope.hub.id]
$scope.toggle_tab(event)
return
$scope.load_shopfront(event)
$scope.load_shopfront = (event=null) ->
$scope.shopfront_loading = true
$scope.toggle_tab(event)
$http.get("/api/enterprises/" + $scope.hub.id + "/shopfront")
.success (data) ->
$scope.shopfront_loading = false
$scope.hub = data
$scope.enterprise_details[$scope.hub.id] = $scope.hub
.error (data) ->
console.error(data)
$scope.toggle_tab = (event) ->
HashNavigation.toggle $scope.hub.hash if event && !angular.element(event.target).inheritedData('is-link')
# Returns boolean: pulldown tab is currently open/closed
$scope.open = ->
HashNavigation.active $scope.hub.hash
# Returns boolean: is this hub the hub that the user is currently "shopping" in?
$scope.current = ->
$scope.hub.id is CurrentHub.hub.id

View File

@@ -0,0 +1,11 @@
Darkswarm.controller "OffcanvasCtrl", ($scope) ->
$scope.menu = $(".left-off-canvas-menu")
$scope.setOffcanvasMenuHeight = ->
$scope.menu.height($(window).height())
$scope.bind = ->
$(window).on("resize", $scope.setOffcanvasMenuHeight)
$scope.setOffcanvasMenuHeight()
$scope.bind()

View File

@@ -1,6 +1,39 @@
Darkswarm.controller "ProducerNodeCtrl", ($scope, HashNavigation, $anchorScroll) ->
$scope.toggle = ->
HashNavigation.toggle $scope.producer.hash
Darkswarm.controller "ProducerNodeCtrl", ($scope, HashNavigation, $anchorScroll, $http, $timeout) ->
$scope.shopfront_loading = false
$scope.enterprise_details = []
$timeout ->
if $scope.open()
$scope.load_shopfront()
# Toggles shopfront tabs open/closed. Fetches enterprise details from the api, diplays them and adds them
# to $scope.enterprise_details, or simply displays the details again if previously fetched
$scope.toggle = (event) ->
if $scope.open()
$scope.toggle_tab(event)
return
if $scope.enterprise_details[$scope.producer.id]
$scope.producer = $scope.enterprise_details[$scope.producer.id]
$scope.toggle_tab(event)
return
$scope.load_shopfront(event)
$scope.load_shopfront = (event=null) ->
$scope.shopfront_loading = true
$scope.toggle_tab(event)
$http.get("/api/enterprises/" + $scope.producer.id + "/shopfront")
.success (data) ->
$scope.shopfront_loading = false
$scope.producer = data
$scope.enterprise_details[$scope.producer.id] = $scope.producer
.error (data) ->
console.error(data)
$scope.toggle_tab = (event) ->
HashNavigation.toggle $scope.producer.hash if event && !angular.element(event.target).inheritedData('is-link')
$scope.open = ->
HashNavigation.active($scope.producer.hash)

View File

@@ -1,2 +1,2 @@
Darkswarm.controller "AboutUsCtrl", ($scope, CurrentHub) ->
$scope.CurrentHub = CurrentHub
Darkswarm.controller "AboutUsCtrl", ($scope, Shopfront) ->
$scope.shopfront = Shopfront.shopfront

View File

@@ -1,4 +1,2 @@
Darkswarm.controller "ProducersTabCtrl", ($scope, CurrentHub, Enterprises, EnterpriseModal) ->
# Injecting Enterprises so CurrentHub.producers is dereferenced.
# We should probably dereference here instead and separate out CurrentHub dereferencing from the Enterprise factory.
$scope.CurrentHub = CurrentHub
Darkswarm.controller "ProducersTabCtrl", ($scope, Shopfront, EnterpriseModal) ->
$scope.shopfront = Shopfront.shopfront

View File

@@ -1,8 +0,0 @@
Darkswarm.directive "cart", ->
# Toggles visibility of the "cart" popover
restrict: 'A'
link: (scope, elem, attr)->
scope.open = false
elem.bind 'click', ->
scope.$apply ->
scope.open = !scope.open

View File

@@ -0,0 +1,19 @@
Darkswarm.directive "cartToggle", ($document) ->
# Toggles visibility of the "cart" popover
restrict: 'A'
link: (scope, elem, attr)->
scope.open = false
$document.bind 'click', (event) ->
cart_button = elem[0]
element_and_parents = [event.target, event.target.parentElement, event.target.parentElement.parentElement]
cart_button_clicked = (element_and_parents.indexOf(cart_button) != -1)
if cart_button_clicked
scope.$apply ->
scope.open = !scope.open
else
scope.$apply ->
scope.open = false
return

View File

@@ -1,15 +1,10 @@
Darkswarm.directive "enterpriseModal", ($modal, Enterprises, EnterpriseResource) ->
Darkswarm.directive "enterpriseModal", (EnterpriseModal) ->
restrict: 'E'
replace: true
template: "<a ng-transclude></a>"
transclude: true
link: (scope, elem, attrs, ctrl) ->
elem.on "click", (ev) =>
ev.stopPropagation()
params =
id: scope.enterprise.id
EnterpriseResource.relatives params, (data) =>
Enterprises.addEnterprises data
scope.enterprise = Enterprises.enterprises_by_id[scope.enterprise.id]
Enterprises.dereferenceEnterprise scope.enterprise
scope.modalInstance = $modal.open(controller: ctrl, templateUrl: 'enterprise_modal.html', scope: scope)
elem.on "click", (event) =>
event.stopPropagation()
scope.modalInstance = EnterpriseModal.open scope.enterprise

View File

@@ -13,11 +13,16 @@ Darkswarm.directive "ofnOnHand", ->
ngModel.$setDirty = setDirty
ngModel.$parsers.push (viewValue) ->
on_hand = parseInt(attr.ofnOnHand)
if parseInt(viewValue) > on_hand
alert t("js.insufficient_stock", {on_hand: on_hand})
viewValue = on_hand
available_quantity = scope.available_quantity()
if parseInt(viewValue) > available_quantity
alert t("js.insufficient_stock", {on_hand: available_quantity})
viewValue = available_quantity
ngModel.$setViewValue viewValue
ngModel.$render()
viewValue
scope.available_quantity = ->
on_hand = parseInt(attr.ofnOnHand)
finalized_quantity = parseInt(attr.finalizedquantity) || 0 # finalizedquantity is optional
on_hand + finalized_quantity

View File

@@ -2,7 +2,14 @@ Darkswarm.directive "ofnPageAlert", ($timeout) ->
restrict: 'A'
scope: true
link: (scope, elem, attrs) ->
container_elems = $(".off-canvas-wrap .inner-wrap, .off-canvas-wrap .inner-wrap .fixed, .page-alert")
moveSelectors = [".off-canvas-wrap .inner-wrap",
".off-canvas-wrap .inner-wrap .fixed",
".off-canvas-fixed .top-bar",
".off-canvas-fixed ofn-flash",
".off-canvas-fixed nav.tab-bar",
".off-canvas-fixed .page-alert"]
container_elems = $(moveSelectors.join(", "))
# Wait a moment after page load before showing the alert. Otherwise we often miss the
# start of the animation.

View File

@@ -1,18 +1,21 @@
Darkswarm.factory 'Enterprises', (enterprises, CurrentHub, Taxons, Dereferencer, visibleFilter, Matcher, Geo, $rootScope) ->
Darkswarm.factory 'Enterprises', (enterprises, CurrentHub, Taxons, Dereferencer, Matcher, Geo, $rootScope) ->
new class Enterprises
enterprises_by_id: {}
constructor: ->
# Populate Enterprises.enterprises from json in page.
@enterprises = enterprises
# Map enterprises to id/object pairs for lookup.
for enterprise in enterprises
@enterprises_by_id[enterprise.id] = enterprise
# Replace enterprise and taxons ids with actual objects.
@dereferenceEnterprises()
@visible_enterprises = visibleFilter @enterprises
@producers = @visible_enterprises.filter (enterprise)->
@producers = @enterprises.filter (enterprise)->
enterprise.category in ["producer_hub", "producer_shop", "producer"]
@hubs = @visible_enterprises.filter (enterprise)->
@hubs = @enterprises.filter (enterprise)->
enterprise.category in ["hub", "hub_profile", "producer_hub", "producer_shop"]
dereferenceEnterprises: ->
@@ -22,8 +25,6 @@ Darkswarm.factory 'Enterprises', (enterprises, CurrentHub, Taxons, Dereferencer,
@dereferenceEnterprise enterprise
dereferenceEnterprise: (enterprise) ->
@dereferenceProperty(enterprise, 'hubs', @enterprises_by_id)
@dereferenceProperty(enterprise, 'producers', @enterprises_by_id)
@dereferenceProperty(enterprise, 'taxons', Taxons.taxons_by_id)
@dereferenceProperty(enterprise, 'supplied_taxons', Taxons.taxons_by_id)

View File

@@ -1,14 +1,3 @@
Darkswarm.factory 'Groups', (groups, Enterprises, Dereferencer) ->
Darkswarm.factory 'Groups', (groups) ->
new class Groups
groups: groups
groups_by_id: {}
constructor: ->
for group in @groups
@groups_by_id[group.id] = group
@dereference()
dereference: ->
for group in @groups
Dereferencer.dereference group.enterprises, Enterprises.enterprises_by_id
for enterprise in Enterprises.enterprises
Dereferencer.dereference enterprise.groups, @groups_by_id

View File

@@ -1,4 +1,4 @@
Darkswarm.factory "OfnMap", (Enterprises, EnterpriseModal, visibleFilter) ->
Darkswarm.factory "OfnMap", (Enterprises, EnterpriseModal) ->
new class OfnMap
constructor: ->
@enterprises = @enterprise_markers(Enterprises.enterprises)
@@ -6,7 +6,7 @@ Darkswarm.factory "OfnMap", (Enterprises, EnterpriseModal, visibleFilter) ->
enterprise.latitude != null || enterprise.longitude != null # Remove enterprises w/o lat or long
enterprise_markers: (enterprises) ->
@extend(enterprise) for enterprise in visibleFilter(enterprises)
@extend(enterprise) for enterprise in enterprises
# Adding methods to each enterprise
extend: (enterprise) ->

View File

@@ -1,4 +1,4 @@
Darkswarm.factory 'Products', ($resource, Enterprises, Dereferencer, Taxons, Properties, Cart, Variants) ->
Darkswarm.factory 'Products', ($resource, Shopfront, Dereferencer, Taxons, Properties, Cart, Variants) ->
new class Products
constructor: ->
@update()
@@ -31,7 +31,7 @@ Darkswarm.factory 'Products', ($resource, Enterprises, Dereferencer, Taxons, Pro
dereference: ->
for product in @products
product.supplier = Enterprises.enterprises_by_id[product.supplier.id]
product.supplier = Shopfront.producers_by_id[product.supplier.id]
Dereferencer.dereference product.taxons, Taxons.taxons_by_id
product.properties = angular.copy(product.properties_with_values)

View File

@@ -0,0 +1,8 @@
Darkswarm.factory 'Shopfront', (shopfront) ->
new class Shopfront
shopfront: shopfront
producers_by_id: {}
constructor: ->
for producer in shopfront.producers
@producers_by_id[producer.id] = producer

View File

@@ -1,6 +1,6 @@
#new-subscription-dialog
.text-normal.margin-bottom-30.text-center
= t('admin.subscriptions.index.please_select_a_shop')
= t('js.admin.subscriptions.new.please_select_a_shop')
%form{ name: 'new_subscription_form', novalidate: true, ng: { submit: "newSubscription()" }}
@@ -8,7 +8,7 @@
%input.ofn-select2.fullwidth#new_subscription_shop_id{ ng: { model: 'shop_id' }, required: true, name: 'shop_id', data: 'shops' }
%div{ ng: { show: "submitted && new_subscription_form.$pristine" } }
.error{ ng: { show: "new_subscription_form.shop_id.$error.required" } }
= t('admin.subscriptions.index.please_select_a_shop')
= t('js.admin.subscriptions.new.please_select_a_shop')
.text-center
%input.button.red.icon-plus{ type: 'submit', value: t('continue') }

View File

@@ -7,4 +7,4 @@
%input.ofn-select2.fullwidth{ :id => 'rule_type_selector', ng: { model: "ruleType" }, data: "ruleTypes", 'min-search' => "5" }
.text-center
%input.button.red.icon-plus{ type: 'button', value: "Add Rule", ng: { click: 'addRule(tagGroup, ruleType)' } }
%input.button.red.icon-plus{ type: 'button', value: "{{ 'js.admin.new_tag_rule_dialog.add_rule' | t }}", ng: { click: 'addRule(tagGroup, ruleType)' } }

View File

@@ -2,14 +2,14 @@
-# Do not show this for producer shops selling only their own produce,
-# Since a shopping link will already have been displayed in hub_details.html.haml
.row.active_table_row.pad-top{ "ng-if" => "enterprise.is_primary_producer && enterprise.hubs.length > 0 && !(enterprise.hubs.length == 1 && enterprise.hubs[0] == enterprise)"}
.columns.small-12
.columns.small-12.cta-container
.row
.columns.small-12.fat
%div{"ng-if" => "::enterprise.name"}
%label{"ng-html" => "::'shop_for_products_html' | t:{enterprise: enterprise.name}"}
%label{"ng-bind-html" => "::'shop_for_products_html' | t:{enterprise: enterprise.name}"}
%div.show-for-medium-up{"ng-if" => "::!enterprise.name"}
&nbsp;
.row.cta-container
.row
.columns.small-12
%a.cta-hub{"ng-repeat" => "hub in enterprise.hubs | filter:{id: '!'+enterprise.id} | orderBy:'-active'",
"ng-href" => "{{::hub.path}}", "ofn-empties-cart" => "hub",

View File

@@ -5,12 +5,10 @@
*
*= require admin/spree_backend
*= require admin/spree_auth
*= require jquery-ui-timepicker-addon
*= require shared/textAngular
*= require shared/ng-tags-input.min
*= require admin/custom
*= require_self
*/

View File

@@ -1,2 +1 @@
/* Custom fix */
.ui-timepicker-div.ui-timepicker-oneLine dl dd { width: 25%; }

View File

@@ -0,0 +1,11 @@
.add-line-item {
fieldset {
.vertical-align-top {
vertical-align: top;
}
.actions {
padding-top: 18px;
}
}
}

View File

@@ -10,6 +10,7 @@
@import 'foundation-icons';
@import 'base/*';
@import 'layout/*';
@import '*';
@import 'pages/*';
@import '../web/all';

View File

@@ -35,5 +35,6 @@ $med-grey: #666;
$med-drk-grey: #444;
$dark-grey: #333;
$light-grey: #ddd;
$light-grey-transparency: rgba(0, 0, 0, .1);
$black: #000;
$white: #fff;

View File

@@ -0,0 +1,52 @@
// A bit arbitrary, works for it's use at time of implementation
$collapsible-max-height: 350px;
.collapsible-checkbox {
display: none;
}
.collapsible-label > ::before {
border-bottom: 5px solid transparent;
border-left: 5px solid currentColor;
border-top: 5px solid transparent;
content: ' ';
display: inline-block;
margin-right: .7rem;
transform: translateY(-2px);
transition: transform .2s ease-out;
vertical-align: middle;
}
.collapsible-content {
max-height: 0;
overflow: hidden;
transition: max-height .25s ease-in-out;
}
.collapsible-checkbox:checked + .collapsible-label + .collapsible-content {
max-height: $collapsible-max-height;
}
.collapsible-checkbox:checked + .collapsible-label > ::before {
transform: rotate(90deg) translateX(-3px);
}
@media only screen and (min-width: 1025px) {
// This double class is used to so this rule is more specific than the one in
// all.scss
.collapsible-label.collapsible-label-md {
margin-left: 0;
}
.collapsible-label-md > ::before {
display: none;
}
.collapsible-content-md {
max-height: $collapsible-max-height;
}
}

View File

@@ -60,7 +60,6 @@ body.embedded {
vertical-align: top;
&.cart {
div.joyride-tip-guide { // Cart Dropdown
top: 75px;
overflow: visible;

View File

@@ -1,31 +0,0 @@
@import "variables";
nav.top-bar {
margin-bottom: 0px;
a.icon {
&:hover {
text-decoration: none;
}
height: $topbar-height;
color: white;
i {
font-size: 29px;
line-height: $topbar-height;
}
span {
font-size: 13px;
display: inline-block;
line-height: $topbar-height;
height: $topbar-height;
vertical-align: top;
}
}
}
body > section[role='main'] {
padding: 0px;
}

View File

@@ -0,0 +1,17 @@
@import "compass/css3/transition";
.off-canvas-fixed {
@include transition(transform 1000ms ease-in-out);
}
.move-right > .off-canvas-fixed {
height: 100%;
-webkit-transform: translate3d(15.625rem, 0, 0);
transform: translate3d(15.625rem, 0, 0);
}
.left-off-canvas-menu {
-webkit-transform: none;
transform: none;
margin-left: -15.625rem;
}

View File

@@ -1,103 +1,213 @@
@import "compass";
@import "branding";
@import "mixins";
@import "typography";
@import "variables";
@import 'compass';
@import 'branding';
@import 'mixins';
@import 'typography';
@import 'variables';
nav {
nav.top-bar {
@include textpress;
text-shadow: none;
// Create center style for nav ul (foundation provides left and right)
text-align: center;
font-size: 16px;
margin-bottom: 0;
height: $topbar-height;
}
.top-bar-section {
// Avoid menu items blocking logo
li:not(.has-form), li:not(.has-form) a:not(.button), li:not(.has-form) a:not(.button):hover {
background-color: transparent;
}
ul.center {
display: inline-block;
// By default, we center between the left and right uls, but we want to be centered
// relative to the whole page. The difference in width between the other uls is 74px,
// so we offset by that amount here.
margin-left: -74px;
}
}
.joyride-tip-guide .button {
text-shadow: none;
}
// Default overrides - big menu
.top-bar-section .has-dropdown > a {
padding-right: ($topbar-height / 3) !important;
i.ofn-i_022-cog, .ofn-i_071-globe {
font-size: 24px;
line-height: $topbar-height;
}
i.ofn-i_071-globe {
color: #666;
font-size: 27px
}
}
.top-bar-section .has-dropdown > a:after {
@media #{$large-only} {
.top-bar--menu-item-with-icon span {
display: none;
}
.top-bar-section ul li > a {
font-size: 0.75rem;
height: $topbar-height;
opacity: 0.8;
&:hover, &:focus, &:active {
opacity: 1;
}
@include transition(all 0.3s ease-in-out);
}
.top-bar-section ul li.ofn-logo > a {
display: table-cell;
.top-bar--current-hub-prefix,
.top-bar--current-hub-name {
display: inline-block;
vertical-align: middle;
opacity: 1;
}
.nav-branded {
color: $brand-colour;
.top-bar--current-hub-name {
max-width: 10em;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
}
span {
font-size: 13px;
.top-bar-section ul li > a.top-bar--menu-item-with-icon {
display: inline;
}
.top-bar--menu-item-with-icon i,
.top-bar--menu-item-with-icon img {
line-height: $topbar-height;
}
.top-bar-section {
border-bottom: 1px solid $light-grey-transparency;
a.icon {
&:hover {
text-decoration: none;
}
> span {
display: inline-block;
font-weight: 300;
height: $topbar-height;
line-height: $topbar-height;
vertical-align: top;
}
}
.nav-primary {
@include headingFont;
font-size: 0.875rem;
font-weight: 300;
// Avoid menu items blocking logo
li:not(.has-form), li:not(.has-form) a:not(.button), li:not(.has-form) a:not(.button):hover {
background-color: transparent;
}
ul .nav-primary {
text-transform: uppercase;
li.cart {
background-color: #f4704c;
a span {
color: white;
}
i {
color: white;
}
.count {
position: relative;
img {
width: 32px;
height: 26px;
margin-top: 16px;
margin-right: 5px;
}
span {
background-color: white;
border-radius: 20px;
color: #f4704c;
font-size: 12px;
line-height: 18px;
position: absolute;
right: -8px;
top: 8px;
width: 18px;
}
}
}
ul.center {
display: inline-block;
// By default, we center between the left and right uls, but we want to be centered
// relative to the whole page. The difference in width between the other uls is 74px,
// so we offset by that amount here.
margin-left: -74px;
}
ul.dropdown {
border: 1px solid $smoke;
border-top: none;
}
ul.right {
> li {
border-left: 1px solid #ddd;
padding: 0 14px;
@media screen and (max-width: 1450px) {
padding: 0 6px;
}
}
li > a {
opacity: 0.8;
&:hover, &:focus, &:active {
opacity: 1;
}
i {
color: #f4704c;
display: inline-block;
margin-right: 2px;
margin-top: -3px;
vertical-align: middle;
}
img {
margin-right: 2px;
margin-top: -5px;
}
}
}
ul li > a {
font-size: 16px;
height: $topbar-height;
}
ul li.ofn-logo > a {
display: table-cell;
vertical-align: middle;
}
ul .nav-primary {
@include headingFont;
text-transform: uppercase;
font-weight: 300;
font-size: 16px;
}
.joyride-tip-guide .button {
text-shadow: none;
}
}
// Mobile Menu
.tab-bar {
background-color: white;
border-bottom: 1px solid $light-grey-transparency;
height: 2.8em;
position: fixed;
width: 100%;
z-index: 1;
.cart-span {
background-color: #f4704c;
padding: 13px;
a,
span {
color: white;
display: inline-block;
}
.count {
position: relative;
img {
margin-left: 2px;
width: 26px;
}
span {
background-color: white;
border-radius: 20px;
color: #f4704c;
font-size: 12px;
line-height: 16px;
position: absolute;
right: -10px;
text-align: center;
top: -9px;
width: 16px;
}
}
}
}
.off-canvas-list li.language-switcher ul li {
@@ -114,8 +224,6 @@ nav {
}
.off-canvas-wrap.move-right .tab-bar .menu-icon span {
-moz-box-shadow: 0 0px 0 1px #666, 0 7px 0 1px #666, 0 14px 0 1px #666;
-webkit-box-shadow: 0 0px 0 1px #666, 0 7px 0 1px #666, 0 14px 0 1px #666;
box-shadow: 0 0px 0 1px #666, 0 7px 0 1px #666, 0 14px 0 1px #666;
}
@@ -127,10 +235,19 @@ nav {
padding: 9px 0 0 9px;
}
// Leave space for tab bar, in screens smaller than large.
[role="main"] {
margin-top: 2.8em;
@media #{$large-up} {
margin-top: 0;
}
}
.top-bar .ofn-logo img {
height: auto;
width: auto;
max-height: 51px;
max-height: 44px;
max-width: 250px;
}
@@ -138,7 +255,7 @@ nav {
background-color: white;
}
.off-canvas-wrap.move-right ul.off-canvas-list {
.off-canvas-wrap ul.off-canvas-list {
font-size: 0.875rem;
.li-menu {
@@ -158,12 +275,10 @@ nav {
background-color: transparent;
color: $brand-colour;
}
@include transition(all 0.3s ease-in-out);
}
}
.off-canvas-wrap.move-right ul.off-canvas-list i {
.off-canvas-wrap ul.off-canvas-list i {
font-size: 1.5rem;
margin-right: 0.25rem;
}
@@ -172,7 +287,8 @@ nav {
@media screen and (max-width: 1450px) {
nav .top-bar-section {
ul li a, .has-dropdown > a {
ul li a,
.has-dropdown > a {
padding: 0 ($topbar-height / 8) !important;
}
@@ -194,10 +310,4 @@ nav {
// padding required to placehold for fixed menu bar
padding-top: 0;
}
section.right {
.nav-branded {
padding: 0 1em;
}
}
}

View File

@@ -2,10 +2,12 @@
@import "animations";
@import "compass/css3/transition";
$page-alert-height: 55px;
// Basic style \\
.page-alert {
.alert-box {
height: 55px;
height: $page-alert-height;
overflow: hidden;
border: 1px solid rgba($dark-grey, 0.35);
border-left: none;
@@ -45,33 +47,26 @@
}
// Show-hide animation \\
.off-canvas-wrap .inner-wrap, .off-canvas-wrap .inner-wrap .fixed, nav.tab-bar {
@include transition(all, 1000ms, ease-in-out);
.off-canvas-wrap .inner-wrap,
.off-canvas-fixed .top-bar,
.off-canvas-fixed ofn-flash,
.off-canvas-fixed nav.tab-bar,
.off-canvas-fixed .page-alert {
@include transition(all 1000ms ease-in-out);
&.move-down {
margin-top: 55px;
@include transition(all, 1000ms, ease-in-out);
margin-top: $page-alert-height;
}
}
.off-canvas-wrap .inner-wrap .page-alert.fixed {
top: -55px;
z-index: 1;
// TODO: Compass to disable transition
-moz-transition: none;
-webkit-transition: none;
-o-transition: color 0 ease-in;
transition: none;
.off-canvas-wrap .page-alert {
top: -1 * $page-alert-height;
z-index: 100;
}
.off-canvas-wrap.move-right .inner-wrap.move-down {
.page-alert {
top: -55px * 2;
}
.left-off-canvas-menu {
top: -55px;
top: -1 * $page-alert-height;
}
}

View File

@@ -1,4 +1,5 @@
@import '../base/colors';
@import '../collapsible';
// Styling for login modal to style tabs
.reveal-modal.login-modal {
@@ -23,3 +24,10 @@
}
}
}
@media only screen and (min-width: 1025px) {
// make sure styling doesn't get messed up if resizing down and back up
.collapsible-menus-container {
min-height: 250px;
}
}

View File

@@ -1,6 +1,7 @@
@import "mixins";
@import "branding";
@import "compass/css3/user-interface";
@import 'variables';
.cart {
@include user-select(none);
@@ -15,8 +16,8 @@
.joyride-tip-guide {
display: block;
right: 10px;
top: 55px;
right: 0;
top: $topbar-height;
width: 480px;
@media screen and (min-width: 641px) {

View File

@@ -13,8 +13,9 @@
$brand-colour: #f27052;
// Topbar
$topbar-height: rem-calc(75);
$topbar-link-padding: $topbar-height / 3;
$topbar-height: rem-calc(64);
$topbar-link-padding: $topbar-height / 4;
$topbar-arrows: false;
$topbar-bg: $white;
$topbar-bg-color: $topbar-bg;

View File

@@ -31,7 +31,16 @@ module Admin
def collection
return Schedule.where("1=0") unless json_request?
permissions.visible_schedules
if params[:enterprise_id]
filter_schedules_by_enterprise_id(permissions.visible_schedules, params[:enterprise_id])
else
permissions.visible_schedules
end
end
# Filter schedules by OCs with a given coordinator id
def filter_schedules_by_enterprise_id(schedules, enterprise_id)
schedules.joins(:order_cycles).where(order_cycles: { coordinator_id: enterprise_id.to_i })
end
def collection_actions

View File

@@ -1,4 +1,5 @@
require 'open_food_network/permissions'
require 'open_food_network/proxy_order_syncer'
module Admin
class SubscriptionsController < ResourceController
@@ -32,21 +33,11 @@ module Admin
end
def create
form = SubscriptionForm.new(@subscription, params[:subscription])
if form.save
render_as_json @subscription
else
render json: { errors: form.json_errors }, status: :unprocessable_entity
end
save_form_and_render(false)
end
def update
form = SubscriptionForm.new(@subscription, params[:subscription])
if form.save
render_as_json @subscription, order_update_issues: form.order_update_issues
else
render json: { errors: form.json_errors }, status: :unprocessable_entity
end
save_form_and_render
end
def cancel
@@ -67,12 +58,26 @@ module Admin
end
def unpause
@subscription.update_attributes(paused_at: nil)
render_as_json @subscription
params[:subscription][:paused_at] = nil
save_form_and_render
end
private
def save_form_and_render(render_issues = true)
form = SubscriptionForm.new(@subscription, params[:subscription])
unless form.save
render json: { errors: form.json_errors }, status: :unprocessable_entity
return
end
if render_issues
render_as_json @subscription, order_update_issues: form.order_update_issues
else
render_as_json @subscription
end
end
def permissions
return @permissions unless @permissions.nil?
@permissions = OpenFoodNetwork::Permissions.new(spree_current_user)

View File

@@ -9,8 +9,8 @@ module Admin
def map_by_tag
respond_to do |format|
format.json do
serialiser = ActiveModel::ArraySerializer.new(collection)
render json: serialiser.to_json
serializer = ActiveModel::ArraySerializer.new(collection)
render json: serializer.to_json
end
end
end

View File

@@ -5,12 +5,7 @@ module Api
before_filter :override_sells, only: [:create, :update]
before_filter :override_visible, only: [:create, :update]
respond_to :json
skip_authorization_check only: [:shopfront, :managed]
def managed
@enterprises = Enterprise.ransack(params[:q]).result.managed_by(current_api_user)
render params[:template] || :bulk_index
end
skip_authorization_check only: [:shopfront]
def create
authorize! :create, Enterprise

View File

@@ -1,25 +0,0 @@
module Api
class OrderCyclesController < Spree::Api::BaseController
respond_to :json
def managed
authorize! :admin, OrderCycle
authorize! :read, OrderCycle
@order_cycles = OrderCycle.ransack(params[:q]).result.managed_by(current_api_user)
render params[:template] || :bulk_index
end
def accessible
@order_cycles = if params[:as] == "distributor"
OrderCycle.ransack(params[:q]).result.
involving_managed_distributors_of(current_api_user).order('updated_at DESC')
elsif params[:as] == "producer"
OrderCycle.ransack(params[:q]).result.
involving_managed_producers_of(current_api_user).order('updated_at DESC')
else
OrderCycle.ransack(params[:q]).result.accessible_by(current_api_user)
end
render params[:template] || :bulk_index
end
end
end

View File

@@ -1,5 +1,5 @@
module Api
class ProductImagesController < Spree::Api::BaseController
class ProductImagesController < BaseController
respond_to :json
def update_product_image
@@ -8,11 +8,11 @@ module Api
if @product.images.first.nil?
@image = Spree::Image.create(attachment: params[:file], viewable_id: @product.master.id, viewable_type: 'Spree::Variant')
respond_with(@image, status: 201)
render json: @image, serializer: ImageSerializer, status: :created
else
@image = @product.images.first
@image.update_attributes(attachment: params[:file])
respond_with(@image, status: 200)
render json: @image, serializer: ImageSerializer, status: :ok
end
end
end

View File

@@ -1,4 +1,5 @@
require 'open_food_network/referer_parser'
require 'spree/authentication_helpers'
class ApplicationController < ActionController::Base
protect_from_forgery
@@ -7,6 +8,7 @@ class ApplicationController < ActionController::Base
before_filter :set_cache_headers # prevent cart emptying via cache when using back button #1213
include EnterprisesHelper
include Spree::AuthenticationHelpers
def redirect_to(options = {}, response_status = {})
::Rails.logger.error("Redirected by #{begin

View File

@@ -8,7 +8,6 @@ class CheckoutController < Spree::CheckoutController
prepend_before_filter :require_order_cycle
prepend_before_filter :require_distributor_chosen
skip_before_filter :check_registration
before_filter :enable_embedded_shopfront
include OrderCyclesHelper
@@ -175,10 +174,6 @@ class CheckoutController < Spree::CheckoutController
end
end
def skip_state_validation?
true
end
def load_order
@order = current_order
redirect_to(main_app.shop_path) && return unless @order && @order.checkout_allowed?
@@ -206,11 +201,11 @@ class CheckoutController < Spree::CheckoutController
def redirect_to_cart_path
respond_to do |format|
format.html do
redirect_to cart_path
redirect_to main_app.cart_path
end
format.json do
render json: { path: cart_path }, status: :bad_request
render json: { path: main_app.cart_path }, status: :bad_request
end
end
end

View File

@@ -4,6 +4,7 @@ class EnterprisesController < BaseController
layout "darkswarm"
helper Spree::ProductsHelper
include OrderCyclesHelper
include SerializerHelper
# These prepended filters are in the reverse order of execution
prepend_before_filter :set_order_cycles, :require_distributor_chosen, :reset_order, only: :shop
@@ -14,18 +15,10 @@ class EnterprisesController < BaseController
respond_to :js, only: :permalink_checker
def shop
return redirect_to spree.cart_path unless enough_stock?
return redirect_to main_app.cart_path unless enough_stock?
set_noindex_meta_tag
enterprises = current_distributor
.plus_relatives_and_oc_producers(shop_order_cycles)
.activated
.includes(address: :state)
.all
enterprises = inject_json_ams('enterprises', enterprises)
render locals: { enterprises: enterprises }
@enterprise = current_distributor
end
def relatives
@@ -111,14 +104,4 @@ class EnterprisesController < BaseController
def set_noindex_meta_tag
@noindex_meta_tag = true unless current_distributor.visible?
end
def inject_json_ams(name, object)
options = {
each_serializer: Api::EnterpriseSerializer,
data: OpenFoodNetwork::EnterpriseInjectionData.new
}
serializer_instance = ActiveModel::ArraySerializer.new(object, options)
{ name: name, json: serializer_instance.to_json }
end
end

View File

@@ -1,10 +1,6 @@
class GroupsController < BaseController
layout 'darkswarm'
def index
@groups = EnterpriseGroup.on_front_page.by_position
end
def show
enable_embedded_shopfront
@hide_menu = true if @shopfront_layout == 'embedded'

View File

@@ -0,0 +1,6 @@
# For the API
ActionController::Metal.class_eval do
def spree_current_user
@spree_current_user ||= env['warden'].user
end
end

View File

@@ -3,5 +3,14 @@ class ProducersController < BaseController
before_filter :enable_embedded_shopfront
def index; end
def index
@enterprises = Enterprise
.activated
.visible
.is_primary_producer
.includes(address: :state)
.includes(:properties)
.includes(supplied_products: :properties)
.all
end
end

View File

@@ -27,12 +27,12 @@ class ShopController < BaseController
if oc = OrderCycle.with_distributor(@distributor).active.find_by_id(params[:order_cycle_id])
current_order(true).set_order_cycle! oc
@current_order_cycle = oc
render partial: "json/order_cycle"
render json: @current_order_cycle, serializer: Api::OrderCycleSerializer
else
render status: :not_found, json: ""
end
else
render partial: "json/order_cycle"
render json: current_order_cycle, serializer: Api::OrderCycleSerializer
end
end

View File

@@ -6,6 +6,8 @@ class ShopsController < BaseController
def index
@enterprises = Enterprise
.activated
.visible
.is_distributor
.includes(address: :state)
.includes(:properties)
.includes(supplied_products: :properties)

View File

@@ -47,12 +47,22 @@ Spree::Admin::BaseController.class_eval do
end
end
protected
def model_class
const_name = controller_name.classify
if Spree.const_defined?(const_name)
return "Spree::#{const_name}".constantize
end
nil
end
private
def active_distributors_not_ready_for_checkout
ocs = OrderCycle.managed_by(spree_current_user).active
distributors = ocs.map(&:distributors).flatten.uniq
Enterprise.where('id IN (?)', distributors).not_ready_for_checkout
distributors = ocs.includes(:distributors).map(&:distributors).flatten.uniq
Enterprise.where('enterprises.id IN (?)', distributors).not_ready_for_checkout
end
def active_distributors_not_ready_for_checkout_message(distributors)

View File

@@ -1,4 +1,5 @@
Spree::Admin::Orders::CustomerDetailsController.class_eval do
before_filter :check_authorization
before_filter :set_guest_checkout_status, only: :update
def update
@@ -25,6 +26,17 @@ Spree::Admin::Orders::CustomerDetailsController.class_eval do
private
def check_authorization
load_order
session[:access_token] ||= params[:token]
resource = @order
action = params[:action].to_sym
action = :edit if action == :show # show route renders :edit for this controller
authorize! action, resource, session[:access_token]
end
def set_guest_checkout_status
registered_user = Spree::User.find_by_email(params[:order][:email])

View File

@@ -33,12 +33,18 @@ Spree::Admin::ProductsController.class_eval do
delete_stock_params_and_set_after do
super
end
rescue Paperclip::Errors::NotIdentifiedByImageMagickError
invoke_callbacks(:create, :fails)
@object.errors.add(:base, t('spree.admin.products.image_upload_error'))
respond_with(@object)
end
def update
delete_stock_params_and_set_after do
super
end
clear_variants_unit_description if @object.variant_unit == 'items'
end
def bulk_update
@@ -154,4 +160,10 @@ Spree::Admin::ProductsController.class_eval do
def set_product_master_variant_price_to_zero
@product.price = 0 if @product.price.nil?
end
def clear_variants_unit_description
@object.variants.each do |variant|
variant.update_attribute :unit_description, ''
end
end
end

View File

@@ -14,3 +14,7 @@ module AuthorizeOnLoadResource
end
Spree::Admin::ResourceController.prepend(AuthorizeOnLoadResource)
Spree::Admin::ResourceController.class_eval do
rescue_from CanCan::AccessDenied, :with => :unauthorized
end

View File

@@ -0,0 +1,131 @@
module Spree
module Admin
class UsersController < ResourceController
rescue_from Spree::User::DestroyWithOrdersError, with: :user_destroy_with_orders_error
after_filter :sign_in_if_change_own_password, only: :update
# http://spreecommerce.com/blog/2010/11/02/json-hijacking-vulnerability/
before_filter :check_json_authenticity, only: :index
before_filter :load_roles, only: [:edit, :new, :update, :create,
:generate_api_key, :clear_api_key]
def index
respond_with(@collection) do |format|
format.html
format.json { render json: json_data }
end
end
def create
if params[:user]
roles = params[:user].delete("spree_role_ids")
end
@user = Spree::User.new(params[:user])
if @user.save
if roles
@user.spree_roles = roles.reject(&:blank?).collect{ |r| Spree::Role.find(r) }
end
flash.now[:success] = Spree.t(:created_successfully)
render :edit
else
render :new
end
end
def update
if params[:user]
roles = params[:user].delete("spree_role_ids")
end
if @user.update_attributes(params[:user])
if roles
@user.spree_roles = roles.reject(&:blank?).collect{ |r| Spree::Role.find(r) }
end
flash.now[:success] = Spree.t(:account_updated)
end
render :edit
end
def generate_api_key
if @user.generate_spree_api_key!
flash[:success] = Spree.t('api.key_generated')
end
redirect_to edit_admin_user_path(@user)
end
def clear_api_key
if @user.clear_spree_api_key!
flash[:success] = Spree.t('api.key_cleared')
end
redirect_to edit_admin_user_path(@user)
end
protected
def collection
return @collection if @collection.present?
if request.xhr? && params[:q].present?
# Disabling proper nested include here due to rails 3.1 bug
@collection = Spree::User.
includes(:bill_address, :ship_address).
where("spree_users.email #{LIKE} :search
OR (spree_addresses.firstname #{LIKE} :search
AND spree_addresses.id = spree_users.bill_address_id)
OR (spree_addresses.lastname #{LIKE} :search
AND spree_addresses.id = spree_users.bill_address_id)
OR (spree_addresses.firstname #{LIKE} :search
AND spree_addresses.id = spree_users.ship_address_id)
OR (spree_addresses.lastname #{LIKE} :search
AND spree_addresses.id = spree_users.ship_address_id)",
search: "#{params[:q].strip}%").
limit(params[:limit] || 100)
else
@search = Spree::User.registered.ransack(params[:q])
@collection = @search.
result.
page(params[:page]).
per(Spree::Config[:admin_products_per_page])
end
end
private
# handling raise from Spree::Admin::ResourceController#destroy
def user_destroy_with_orders_error
invoke_callbacks(:destroy, :fails)
render status: :forbidden, text: Spree.t(:error_user_destroy_with_orders)
end
# Allow different formats of json data to suit different ajax calls
def json_data
json_format = params[:json_format] || 'default'
case json_format
when 'basic'
collection.map { |u| { 'id' => u.id, 'name' => u.email } }.to_json
else
address_fields = [:firstname, :lastname, :address1, :address2, :city,
:zipcode, :phone, :state_name, :state_id, :country_id]
includes = { only: address_fields, include: { state: { only: :name },
country: { only: :name } } }
collection.to_json(only: [:id, :email], include:
{ bill_address: includes, ship_address: includes })
end
end
def sign_in_if_change_own_password
return unless spree_current_user == @user && @user.password.present?
sign_in(@user, event: :authentication, bypass: true)
end
def load_roles
@roles = Spree::Role.scoped
end
end
end
end

View File

@@ -18,6 +18,7 @@ Spree::Admin::VariantsController.class_eval do
def search
scoper = OpenFoodNetwork::ScopeVariantsForSearch.new(params)
@variants = scoper.search
render json: @variants, each_serializer: Api::Admin::VariantSerializer
end
def destroy

View File

@@ -0,0 +1,93 @@
require 'open_food_network/address_finder'
module Spree
class CheckoutController < Spree::StoreController
include CheckoutHelper
ssl_required
before_filter :load_order
before_filter :ensure_order_not_completed
before_filter :ensure_checkout_allowed
before_filter :ensure_sufficient_stock_lines
before_filter :associate_user
before_filter :check_authorization
before_filter :enable_embedded_shopfront
helper 'spree/orders'
rescue_from Spree::Core::GatewayError, :with => :rescue_from_spree_gateway_error
def edit
flash.keep
redirect_to main_app.checkout_path
end
private
def load_order
@order = current_order
redirect_to main_app.cart_path && return unless @order
if params[:state]
redirect_to checkout_state_path(@order.state) if @order.can_go_to_state?(params[:state])
@order.state = params[:state]
end
setup_for_current_state
end
def ensure_checkout_allowed
redirect_to main_app.cart_path unless @order.checkout_allowed?
end
def ensure_order_not_completed
redirect_to main_app.cart_path if @order.completed?
end
def ensure_sufficient_stock_lines
if @order.insufficient_stock_lines.present?
flash[:error] = Spree.t(:inventory_error_flash_for_insufficient_quantity)
redirect_to main_app.cart_path
end
end
def setup_for_current_state
method_name = :"before_#{@order.state}"
send(method_name) if respond_to?(method_name, true)
end
# Adapted from spree_last_address gem: https://github.com/TylerRick/spree_last_address
# Originally, we used a forked version of this gem, but encountered strange errors where
# it worked in dev but only intermittently in staging/prod.
def before_address
associate_user
finder = OpenFoodNetwork::AddressFinder.new(@order.email)
@order.bill_address = finder.bill_address
@order.ship_address = finder.ship_address
end
def before_delivery
return if params[:order].present?
packages = @order.shipments.map(&:to_package)
@differentiator = Spree::Stock::Differentiator.new(@order, packages)
end
def before_payment
current_order.payments.destroy_all if request.put?
end
def rescue_from_spree_gateway_error
flash[:error] = Spree.t(:spree_gateway_error_flash_for_checkout)
render :edit
end
def check_authorization
authorize!(:edit, current_order, session[:access_token])
end
end
end

View File

@@ -1,30 +0,0 @@
require 'open_food_network/address_finder'
Spree::CheckoutController.class_eval do
include CheckoutHelper
before_filter :enable_embedded_shopfront
def edit
flash.keep
redirect_to main_app.checkout_path
end
private
def before_payment
current_order.payments.destroy_all if request.put?
end
# Adapted from spree_last_address gem: https://github.com/TylerRick/spree_last_address
# Originally, we used a forked version of this gem, but encountered strange errors where
# it worked in dev but only intermittently in staging/prod.
def before_address
associate_user
finder = OpenFoodNetwork::AddressFinder.new(@order.email)
@order.bill_address = finder.bill_address
@order.ship_address = finder.ship_address
end
end

View File

@@ -0,0 +1,7 @@
module Spree
class HomeController < Spree::StoreController
respond_to :html
def index; end
end
end

View File

@@ -0,0 +1,226 @@
require 'spree/core/controller_helpers/order_decorator'
require 'spree/core/controller_helpers/auth_decorator'
module Spree
class OrdersController < Spree::StoreController
include OrderCyclesHelper
layout 'darkswarm'
ssl_required :show
before_filter :check_authorization
rescue_from ActiveRecord::RecordNotFound, :with => :render_404
helper 'spree/products', 'spree/orders'
respond_to :html
respond_to :json
before_filter :update_distribution, only: :update
before_filter :filter_order_params, only: :update
before_filter :enable_embedded_shopfront
prepend_before_filter :require_order_authentication, only: :show
prepend_before_filter :require_order_cycle, only: :edit
prepend_before_filter :require_distributor_chosen, only: :edit
before_filter :check_hub_ready_for_checkout, only: :edit
before_filter :check_at_least_one_line_item, only: :update
def show
@order = Spree::Order.find_by_number!(params[:id])
end
def empty
if @order = current_order
@order.empty!
end
redirect_to main_app.cart_path
end
def check_authorization
session[:access_token] ||= params[:token]
order = Spree::Order.find_by_number(params[:id]) || current_order
if order
authorize! :edit, order, session[:access_token]
else
authorize! :create, Spree::Order
end
end
# Patching to redirect to shop if order is empty
def edit
@order = current_order(true)
@insufficient_stock_lines = @order.insufficient_stock_lines
@unavailable_order_variants = OrderCycleDistributedVariants.
new(current_order_cycle, current_distributor).unavailable_order_variants(@order)
if @order.line_items.empty?
redirect_to main_app.shop_path
else
associate_user
if @order.insufficient_stock_lines.present? || @unavailable_order_variants.present?
flash[:error] = t("spree.orders.error_flash_for_unavailable_items")
end
end
end
def update
@insufficient_stock_lines = []
@order = order_to_update
unless @order
flash[:error] = t(:order_not_found)
redirect_to(root_path) && return
end
if @order.update_attributes(params[:order])
discard_empty_line_items
with_open_adjustments { update_totals_and_taxes }
if @order == current_order
fire_event('spree.order.contents_changed')
else
@order.update_distribution_charge!
end
respond_with(@order) do |format|
format.html do
if params.key?(:checkout)
@order.next_transition.run_callbacks if @order.cart?
redirect_to checkout_state_path(@order.checkout_steps.first)
elsif @order.complete?
redirect_to order_path(@order)
else
redirect_to main_app.cart_path
end
end
end
else
# Show order with original values, not newly entered ones
@insufficient_stock_lines = @order.insufficient_stock_lines
@order.line_items(true)
respond_with(@order)
end
end
def update_distribution
@order = current_order(true)
if params[:commit] == 'Choose Hub'
distributor = Enterprise.is_distributor.find params[:order][:distributor_id]
@order.set_distributor! distributor
flash[:notice] = I18n.t(:order_choosing_hub_notice)
redirect_to request.referer
elsif params[:commit] == 'Choose Order Cycle'
@order.empty! # empty cart
order_cycle = OrderCycle.active.find params[:order][:order_cycle_id]
@order.set_order_cycle! order_cycle
flash[:notice] = I18n.t(:order_choosing_hub_notice)
redirect_to request.referer
end
end
def filter_order_params
if params[:order] && params[:order][:line_items_attributes]
params[:order][:line_items_attributes] =
remove_missing_line_items(params[:order][:line_items_attributes])
end
end
def remove_missing_line_items(attrs)
attrs.select do |_i, line_item|
Spree::LineItem.find_by_id(line_item[:id])
end
end
def clear
@order = current_order(true)
@order.empty!
@order.set_order_cycle! nil
redirect_to main_app.enterprise_path(@order.distributor.id)
end
def order_cycle_expired
@order_cycle = OrderCycle.find session[:expired_order_cycle_id]
end
def cancel
@order = Spree::Order.find_by_number!(params[:id])
authorize! :cancel, @order
if @order.cancel
flash[:success] = I18n.t(:orders_your_order_has_been_cancelled)
else
flash[:error] = I18n.t(:orders_could_not_cancel)
end
redirect_to request.referer || order_path(@order)
end
private
# Updates the various denormalized total attributes of the order and
# recalculates the shipment taxes
def update_totals_and_taxes
@order.updater.update_totals
@order.shipment.ensure_correct_adjustment_with_included_tax if @order.shipment
end
# Sets the adjustments to open to perform the block's action and restores
# their state to whatever the they had. Note that it does not change any new
# adjustments that might get created in the yielded block.
def with_open_adjustments
previous_states = @order.adjustments.each_with_object({}) do |adjustment, hash|
hash[adjustment.id] = adjustment.state
end
@order.adjustments.each(&:open)
yield
@order.adjustments.each do |adjustment|
previous_state = previous_states[adjustment.id]
adjustment.update_attribute(:state, previous_state) if previous_state
end
end
def discard_empty_line_items
@order.line_items = @order.line_items.select { |li| li.quantity > 0 }
end
def require_order_authentication
return if session[:access_token] || params[:token] || spree_current_user
flash[:error] = I18n.t("spree.orders.edit.login_to_view_order")
require_login_then_redirect_to request.env['PATH_INFO']
end
def order_to_update
return @order_to_update if defined? @order_to_update
return @order_to_update = current_order unless params[:id]
@order_to_update = changeable_order_from_number
end
# If a specific order is requested, return it if it is COMPLETE and
# changes are allowed and the user has access. Return nil if not.
def changeable_order_from_number
order = Spree::Order.complete.find_by_number(params[:id])
return nil unless order.andand.changes_allowed? && can?(:update, order)
order
end
def check_at_least_one_line_item
return unless order_to_update.andand.complete?
items = params[:order][:line_items_attributes]
.andand.select{ |_k, attrs| attrs["quantity"].to_i > 0 }
if items.empty?
flash[:error] = I18n.t(:orders_cannot_remove_the_final_item)
redirect_to order_path(order_to_update)
end
end
end
end

View File

@@ -1,194 +0,0 @@
require 'spree/core/controller_helpers/order_decorator'
require 'spree/core/controller_helpers/auth_decorator'
Spree::OrdersController.class_eval do
before_filter :update_distribution, only: :update
before_filter :filter_order_params, only: :update
before_filter :enable_embedded_shopfront
prepend_before_filter :require_order_authentication, only: :show
prepend_before_filter :require_order_cycle, only: :edit
prepend_before_filter :require_distributor_chosen, only: :edit
before_filter :check_hub_ready_for_checkout, only: :edit
before_filter :check_at_least_one_line_item, only: :update
include OrderCyclesHelper
layout 'darkswarm'
respond_to :json
# Patching to redirect to shop if order is empty
def edit
@order = current_order(true)
@insufficient_stock_lines = @order.insufficient_stock_lines
@unavailable_order_variants = OrderCycleDistributedVariants.new(current_order_cycle, current_distributor).unavailable_order_variants(@order)
if @order.line_items.empty?
redirect_to main_app.shop_path
else
associate_user
if @order.insufficient_stock_lines.present? || @unavailable_order_variants.present?
flash[:error] = t("spree.orders.error_flash_for_unavailable_items")
end
end
end
def update
@insufficient_stock_lines = []
@order = order_to_update
unless @order
flash[:error] = t(:order_not_found)
redirect_to(root_path) && return
end
if @order.update_attributes(params[:order])
discard_empty_line_items
with_open_adjustments { update_totals_and_taxes }
render(:edit) && return unless apply_coupon_code
if @order == current_order
fire_event('spree.order.contents_changed')
else
@order.update_distribution_charge!
end
respond_with(@order) do |format|
format.html do
if params.key?(:checkout)
@order.next_transition.run_callbacks if @order.cart?
redirect_to checkout_state_path(@order.checkout_steps.first)
elsif @order.complete?
redirect_to order_path(@order)
else
redirect_to cart_path
end
end
end
else
# Show order with original values, not newly entered ones
@insufficient_stock_lines = @order.insufficient_stock_lines
@order.line_items(true)
respond_with(@order)
end
end
def update_distribution
@order = current_order(true)
if params[:commit] == 'Choose Hub'
distributor = Enterprise.is_distributor.find params[:order][:distributor_id]
@order.set_distributor! distributor
flash[:notice] = I18n.t(:order_choosing_hub_notice)
redirect_to request.referer
elsif params[:commit] == 'Choose Order Cycle'
@order.empty! # empty cart
order_cycle = OrderCycle.active.find params[:order][:order_cycle_id]
@order.set_order_cycle! order_cycle
flash[:notice] = I18n.t(:order_choosing_hub_notice)
redirect_to request.referer
end
end
def filter_order_params
if params[:order] && params[:order][:line_items_attributes]
params[:order][:line_items_attributes] = remove_missing_line_items(params[:order][:line_items_attributes])
end
end
def remove_missing_line_items(attrs)
attrs.select do |_i, line_item|
Spree::LineItem.find_by_id(line_item[:id])
end
end
def clear
@order = current_order(true)
@order.empty!
@order.set_order_cycle! nil
redirect_to main_app.enterprise_path(@order.distributor.id)
end
def order_cycle_expired
@order_cycle = OrderCycle.find session[:expired_order_cycle_id]
end
def cancel
@order = Spree::Order.find_by_number!(params[:id])
authorize! :cancel, @order
if @order.cancel
flash[:success] = I18n.t(:orders_your_order_has_been_cancelled)
else
flash[:error] = I18n.t(:orders_could_not_cancel)
end
redirect_to request.referer || order_path(@order)
end
private
# Updates the various denormalized total attributes of the order and
# recalculates the shipment taxes
def update_totals_and_taxes
@order.updater.update_totals
@order.shipment.ensure_correct_adjustment_with_included_tax if @order.shipment
end
# Sets the adjustments to open to perform the block's action and restores
# their state to whatever the they had. Note that it does not change any new
# adjustments that might get created in the yielded block.
def with_open_adjustments
previous_states = @order.adjustments.each_with_object({}) do |adjustment, hash|
hash[adjustment.id] = adjustment.state
end
@order.adjustments.each(&:open)
yield
@order.adjustments.each do |adjustment|
previous_state = previous_states[adjustment.id]
adjustment.update_attribute(:state, previous_state) if previous_state
end
end
def discard_empty_line_items
@order.line_items = @order.line_items.select { |li| li.quantity > 0 }
end
def require_order_authentication
return if session[:access_token] || params[:token] || spree_current_user
flash[:error] = I18n.t("spree.orders.edit.login_to_view_order")
require_login_then_redirect_to request.env['PATH_INFO']
end
def order_to_update
return @order_to_update if defined? @order_to_update
return @order_to_update = current_order unless params[:id]
@order_to_update = changeable_order_from_number
end
# If a specific order is requested, return it if it is COMPLETE and
# changes are allowed and the user has access. Return nil if not.
def changeable_order_from_number
order = Spree::Order.complete.find_by_number(params[:id])
return nil unless order.andand.changes_allowed? && can?(:update, order)
order
end
def check_at_least_one_line_item
return unless order_to_update.andand.complete?
items = params[:order][:line_items_attributes]
.andand.select{ |_k, attrs| attrs["quantity"].to_i > 0 }
if items.empty?
flash[:error] = I18n.t(:orders_cannot_remove_the_final_item)
redirect_to order_path(order_to_update)
end
end
end

View File

@@ -0,0 +1,14 @@
module Spree
class StoreController < Spree::BaseController
layout 'darkswarm'
include Spree::Core::ControllerHelpers::Order
include I18nHelper
before_filter :set_locale
def unauthorized
render 'shared/unauthorized', status: :unauthorized
end
end
end

View File

@@ -1,10 +0,0 @@
class Spree::StoreController
layout 'darkswarm'
include I18nHelper
before_filter :set_locale
def unauthorized
render 'shared/unauthorized', status: :unauthorized
end
end

View File

@@ -0,0 +1,44 @@
module Spree
class UserPasswordsController < Devise::PasswordsController
helper 'spree/base', 'spree/store'
include Spree::Core::ControllerHelpers::Auth
include Spree::Core::ControllerHelpers::Common
include Spree::Core::ControllerHelpers::Order
include Spree::Core::ControllerHelpers::SSL
ssl_required
# Overridden due to bug in Devise.
# respond_with resource, :location => new_session_path(resource_name)
# is generating bad url /session/new.user
#
# overridden to:
# respond_with resource, :location => spree.login_path
#
def create
self.resource = resource_class.send_reset_password_instructions(params[resource_name])
if resource.errors.empty?
set_flash_message(:notice, :send_instructions) if is_navigational_format?
respond_with resource, location: spree.login_path
else
respond_with_navigational(resource) { render :new }
end
end
# Devise::PasswordsController allows for blank passwords.
# Silly Devise::PasswordsController!
# Fixes spree/spree#2190.
def update
if params[:spree_user][:password].blank?
self.resource = resource_class.new
resource.reset_password_token = params[:spree_user][:reset_password_token]
set_flash_message(:error, :cannot_be_blank)
render :edit
else
super
end
end
end
end

View File

@@ -0,0 +1,65 @@
module Spree
class UserRegistrationsController < Devise::RegistrationsController
helper 'spree/base', 'spree/store'
include Spree::Core::ControllerHelpers::Auth
include Spree::Core::ControllerHelpers::Common
include Spree::Core::ControllerHelpers::Order
include Spree::Core::ControllerHelpers::SSL
ssl_required
before_filter :check_permissions, only: [:edit, :update]
skip_before_filter :require_no_authentication
# GET /resource/sign_up
def new
super
@user = resource
end
# POST /resource/sign_up
def create
@user = build_resource(params[:spree_user])
if resource.save
set_flash_message(:notice, :signed_up)
sign_in(:spree_user, @user)
session[:spree_user_signup] = true
associate_user
respond_with resource, location: after_sign_up_path_for(resource)
else
clean_up_passwords(resource)
render :new
end
end
# GET /resource/edit
def edit
super
end
# PUT /resource
def update
super
end
# DELETE /resource
def destroy
super
end
# GET /resource/cancel
# Forces the session data which is usually expired after sign
# in to be expired now. This is useful if the user wants to
# cancel oauth signing in/up in the middle of the process,
# removing all OAuth session data.
def cancel
super
end
protected
def check_permissions
authorize!(:create, resource)
end
end
end

View File

@@ -0,0 +1,56 @@
module Spree
class UserSessionsController < Devise::SessionsController
helper 'spree/base', 'spree/store'
include Spree::Core::ControllerHelpers::Auth
include Spree::Core::ControllerHelpers::Common
include Spree::Core::ControllerHelpers::Order
include Spree::Core::ControllerHelpers::SSL
ssl_required :new, :create, :destroy, :update
ssl_allowed :login_bar
before_filter :set_checkout_redirect, only: :create
def create
authenticate_spree_user!
if spree_user_signed_in?
respond_to do |format|
format.html {
flash[:success] = t('devise.success.logged_in_succesfully')
redirect_back_or_default(after_sign_in_path_for(spree_current_user))
}
format.js {
render json: { email: spree_current_user.login }, status: :ok
}
end
else
respond_to do |format|
format.html {
flash.now[:error] = t('devise.failure.invalid')
render :new
}
format.js {
render json: { message: t('devise.failure.invalid') }, status: :unauthorized
}
end
end
end
def nav_bar
render partial: 'spree/shared/nav_bar'
end
private
def accurate_title
Spree.t(:login)
end
def redirect_back_or_default(default)
redirect_to(session["spree_user_return_to"] || default)
session["spree_user_return_to"] = nil
end
end
end

View File

@@ -1,29 +0,0 @@
Spree::UserSessionsController.class_eval do
before_filter :set_checkout_redirect, only: :create
def create
authenticate_spree_user!
if spree_user_signed_in?
respond_to do |format|
format.html {
flash[:success] = t(:logged_in_succesfully)
redirect_back_or_default(after_sign_in_path_for(spree_current_user))
}
format.js {
render json: { email: spree_current_user.login }, status: :ok
}
end
else
respond_to do |format|
format.html {
flash.now[:error] = t('devise.failure.invalid')
render :new
}
format.js {
render json: { message: t('devise.failure.invalid') }, status: :unauthorized
}
end
end
end
end

View File

@@ -0,0 +1,74 @@
module Spree
class UsersController < Spree::StoreController
layout 'darkswarm'
ssl_required
skip_before_filter :set_current_order, only: :show
prepend_before_filter :load_object, only: [:show, :edit, :update]
prepend_before_filter :authorize_actions, only: :new
include Spree::Core::ControllerHelpers
include I18nHelper
before_filter :set_locale
before_filter :enable_embedded_shopfront
# Ignores invoice orders, only order where state: 'complete'
def show
@orders = @user.orders.where(state: 'complete').order('completed_at desc')
@unconfirmed_email = spree_current_user.unconfirmed_email
end
# Endpoint for queries to check if a user is already registered
def registered_email
user = Spree.user_class.find_by_email params[:email]
render json: { registered: user.present? }
end
def create
@user = Spree::User.new(params[:user])
if @user.save
if current_order
session[:guest_token] = nil
end
redirect_back_or_default(root_url)
else
render :new
end
end
def update
if @user.update_attributes(params[:user])
if params[:user][:password].present?
# this logic needed b/c devise wants to log us out after password changes
Spree::User.reset_password_by_token(params[:user])
sign_in(@user, event: :authentication,
bypass: true)
end
redirect_to spree.account_url, notice: Spree.t(:account_updated)
else
render :edit
end
end
private
def load_object
@user ||= spree_current_user
if @user
authorize! params[:action].to_sym, @user
else
redirect_to spree.login_path
end
end
def authorize_actions
authorize! params[:action].to_sym, Spree::User.new
end
def accurate_title
Spree.t(:my_account)
end
end
end

View File

@@ -1,20 +0,0 @@
Spree::UsersController.class_eval do
layout 'darkswarm'
include I18nHelper
before_filter :set_locale
before_filter :enable_embedded_shopfront
# Override of spree_auth_devise default
# Ignores invoice orders, only order where state: 'complete'
def show
@orders = @user.orders.where(state: 'complete').order('completed_at desc')
@unconfirmed_email = spree_current_user.unconfirmed_email
end
# Endpoint for queries to check if a user is already registered
def registered_email
user = Spree.user_class.find_by_email params[:email]
render json: { registered: user.present? }
end
end

View File

@@ -8,6 +8,6 @@ module EnterpriseFeesHelper
end
def enterprise_fee_type_options
EnterpriseFee::FEE_TYPES.map { |f| [f.capitalize, f] }
EnterpriseFee::FEE_TYPES.map { |fee_type| [t("#{fee_type}_fee"), fee_type] }
end
end

View File

@@ -1,19 +1,41 @@
require 'open_food_network/enterprise_injection_data'
module InjectionHelper
include SerializerHelper
def inject_enterprises(enterprises = Enterprise.activated.includes(address: :state).all)
inject_json_ams(
'enterprises',
"enterprises",
enterprises,
Api::EnterpriseSerializer,
enterprise_injection_data
)
end
def inject_enterprise_shopfront_list
def inject_groups
select_only = required_attributes EnterpriseGroup, Api::GroupListSerializer
inject_json_ams(
'enterprises',
Enterprise.activated.includes(address: :state).all,
"groups",
EnterpriseGroup.on_front_page.by_position.select(select_only).includes(address: :state).all,
Api::GroupListSerializer
)
end
def inject_enterprise_shopfront(enterprise)
inject_json_ams(
"shopfront",
enterprise,
Api::EnterpriseShopfrontSerializer
)
end
def inject_enterprise_shopfront_list
select_only = required_attributes Enterprise, Api::EnterpriseShopfrontListSerializer
inject_json_ams(
"enterprises",
Enterprise.activated.visible.select(select_only).includes(address: :state).all,
Api::EnterpriseShopfrontListSerializer
)
end
@@ -23,7 +45,12 @@ module InjectionHelper
end
def inject_group_enterprises
inject_json_ams "group_enterprises", @group.enterprises.activated.all, Api::EnterpriseSerializer, enterprise_injection_data
inject_json_ams(
"enterprises",
@group.enterprises.activated.all,
Api::EnterpriseSerializer,
enterprise_injection_data
)
end
def inject_current_hub
@@ -34,6 +61,12 @@ module InjectionHelper
inject_json_ams "currentOrder", current_order, Api::CurrentOrderSerializer, current_distributor: current_distributor, current_order_cycle: current_order_cycle
end
def inject_current_order_cycle
serializer = Api::OrderCycleSerializer.new(current_order_cycle)
json = serializer.object.present? ? serializer.to_json : "{}"
render partial: "json/injection_ams", locals: { name: "orderCycleData", json: json }
end
def inject_available_shipping_methods
inject_json_ams "shippingMethods", available_shipping_methods,
Api::ShippingMethodSerializer, current_order: current_order
@@ -79,17 +112,17 @@ module InjectionHelper
end
def inject_saved_credit_cards
data = if spree_current_user
spree_current_user.credit_cards.with_payment_profile.all
else
[]
end
data = spree_current_user ? spree_current_user.credit_cards.with_payment_profile.all : []
inject_json_ams "savedCreditCards", data, Api::CreditCardSerializer
end
def inject_json(name, partial, opts = {})
render partial: "json/injection", locals: { name: name, partial: partial }.merge(opts)
def inject_current_user
inject_json_ams "user", spree_current_user, Api::UserSerializer
end
def inject_rails_flash
inject_json_ams "railsFlash", OpenStruct.new(flash.to_hash), Api::RailsFlashSerializer
end
def inject_json_ams(name, data, serializer, opts = {})

View File

@@ -3,4 +3,13 @@ module SerializerHelper
return [] if ids.blank?
ids.map { |id| { id: id } }
end
# Returns an array of the fields a serializer needs from it's object
# so we can #select only what the serializer will actually use
def required_attributes(model, serializer)
model_attributes = model.attribute_names
serializer_attributes = serializer._attributes.keys.map(&:to_s)
(serializer_attributes & model_attributes).map { |attr| "#{model.table_name}.#{attr}" }
end
end

View File

@@ -2,27 +2,102 @@ module Spree
module Admin
module OrdersHelper
def order_links(order)
@order ||= order
links = []
links << { name: t(:edit_order), url: edit_admin_order_path(order), icon: 'icon-edit' } unless action_name == "edit"
if @order.complete?
links << { name: t(:resend_confirmation), url: resend_admin_order_path(order), icon: 'icon-email', method: 'post', confirm: t(:confirm_resend_order_confirmation) }
if @order.distributor.can_invoice?
links << { name: t(:send_invoice), url: invoice_admin_order_path(order), icon: 'icon-email', confirm: t(:confirm_send_invoice) }
else
links << { name: t(:send_invoice), url: "#", icon: 'icon-email', confirm: t(:must_have_valid_business_number, enterprise_name: order.distributor.name) }
end
links << { name: t(:print_invoice), url: print_admin_order_path(order), icon: 'icon-print', target: "_blank" }
if Spree::Config.enable_receipt_printing?
links << { name: t(:print_ticket), url: print_ticket_admin_order_path(order), icon: 'icon-print', target: "_blank" }
links << { name: t(:select_ticket_printer), url: "#{print_ticket_admin_order_path(order)}#select-printer", icon: 'icon-print', target: "_blank" }
end
end
if @order.ready_to_ship?
links << { name: t(:ship_order), url: fire_admin_order_path(@order, e: 'ship'), method: 'put', icon: 'icon-truck', confirm: t(:are_you_sure) }
end
links << { name: t(:cancel_order), url: fire_admin_order_path(@order.number, e: 'cancel'), icon: 'icon-trash', confirm: t(:are_you_sure) } if order.can_cancel?
links << edit_order_link unless action_name == "edit"
links.concat(complete_order_links) if @order.complete?
links << ship_order_link if @order.ready_to_ship?
links << cancel_order_link if @order.can_cancel?
links
end
private
def complete_order_links
[resend_confirmation_link] + invoice_links + ticket_links
end
def invoice_links
return [] unless Spree::Config[:enable_invoices?]
[send_invoice_link, print_invoice_link]
end
def send_invoice_link
if @order.distributor.can_invoice?
send_invoice_link_with_url
else
send_invoice_link_without_url
end
end
def ticket_links
return [] unless Spree::Config[:enable_receipt_printing?]
[print_ticket_link, select_ticket_printer_link]
end
def edit_order_link
{ name: t(:edit_order),
url: edit_admin_order_path(@order),
icon: 'icon-edit' }
end
def resend_confirmation_link
{ name: t(:resend_confirmation),
url: resend_admin_order_path(@order),
icon: 'icon-email',
method: 'post',
confirm: t(:confirm_resend_order_confirmation) }
end
def send_invoice_link_with_url
{ name: t(:send_invoice),
url: invoice_admin_order_path(@order),
icon: 'icon-email',
confirm: t(:confirm_send_invoice) }
end
def send_invoice_link_without_url
{ name: t(:send_invoice),
url: "#",
icon: 'icon-email',
confirm: t(:must_have_valid_business_number, enterprise_name: @order.distributor.name) }
end
def print_invoice_link
{ name: t(:print_invoice),
url: print_admin_order_path(@order),
icon: 'icon-print',
target: "_blank" }
end
def print_ticket_link
{ name: t(:print_ticket),
url: print_ticket_admin_order_path(@order),
icon: 'icon-print',
target: "_blank" }
end
def select_ticket_printer_link
{ name: t(:select_ticket_printer),
url: "#{print_ticket_admin_order_path(@order)}#select-printer",
icon: 'icon-print',
target: "_blank" }
end
def ship_order_link
{ name: t(:ship_order),
url: fire_admin_order_path(@order, e: 'ship'),
method: 'put',
icon: 'icon-truck',
confirm: t(:are_you_sure) }
end
def cancel_order_link
{ name: t(:cancel_order),
url: fire_admin_order_path(@order.number, e: 'cancel'),
icon: 'icon-trash',
confirm: t(:are_you_sure) }
end
end
end
end

View File

@@ -0,0 +1,47 @@
# This mailer is configured to be the Devise mailer
# Some methods here override Devise::Mailer methods
module Spree
class UserMailer < BaseMailer
include I18nHelper
# Overrides `Devise::Mailer.reset_password_instructions`
def reset_password_instructions(user)
recipient = user.respond_to?(:id) ? user : Spree.user_class.find(user)
@edit_password_reset_url = spree.
edit_spree_user_password_url(reset_password_token: recipient.reset_password_token)
mail(to: recipient.email, from: from_address,
subject: Spree::Config[:site_name] + ' ' +
I18n.t(:subject, scope: [:devise, :mailer, :reset_password_instructions]))
end
# This is a OFN specific email, not from Devise::Mailer
def signup_confirmation(user)
@user = user
I18n.with_locale valid_locale(@user) do
mail(to: user.email, from: from_address,
subject: t(:welcome_to) + Spree::Config[:site_name])
end
end
# Overrides `Devise::Mailer.confirmation_instructions`
def confirmation_instructions(user, _opts)
@user = user
@instance = Spree::Config[:site_name]
@contact = ContentConfig.footer_email
I18n.with_locale valid_locale(@user) do
subject = t('spree.user_mailer.confirmation_instructions.subject')
mail(to: confirmation_email_address,
from: from_address,
subject: subject)
end
end
private
def confirmation_email_address
@user.pending_reconfirmation? ? @user.unconfirmed_email : @user.email
end
end
end

View File

@@ -1,32 +0,0 @@
Spree::UserMailer.class_eval do
include I18nHelper
def signup_confirmation(user)
@user = user
I18n.with_locale valid_locale(@user) do
mail(to: user.email, from: from_address,
subject: t(:welcome_to) + Spree::Config[:site_name])
end
end
# Overriding `Spree::UserMailer.confirmation_instructions` which is
# overriding `Devise::Mailer.confirmation_instructions`.
def confirmation_instructions(user, _opts)
@user = user
@instance = Spree::Config[:site_name]
@contact = ContentConfig.footer_email
I18n.with_locale valid_locale(@user) do
subject = t('spree.user_mailer.confirmation_instructions.subject')
mail(to: confirmation_email_address,
from: from_address,
subject: subject)
end
end
private
def confirmation_email_address
@user.pending_reconfirmation? ? @user.unconfirmed_email : @user.email
end
end

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