From c5a2d183d864a3c3f0ef8c42bdddf8fa2246fe12 Mon Sep 17 00:00:00 2001 From: Jean-Baptiste Bellet Date: Thu, 20 May 2021 15:12:24 +0200 Subject: [PATCH 01/15] Save filter params to sessionStorage for orders list - Use sessionStorage to save the filters params each time a filter is modified --- .../javascripts/admin/admin_ofn.js.coffee | 3 ++- app/assets/javascripts/admin/all.js | 3 +++ .../controllers/orders_controller.js.coffee | 17 ++++++++---- .../javascripts/admin/orders/orders.js.coffee | 2 +- .../services/query_persistence.js.coffee | 27 +++++++++++++++++++ .../javascripts/shared/shared.js.coffee | 3 ++- app/views/spree/admin/orders/edit.html.haml | 10 +++++-- 7 files changed, 55 insertions(+), 10 deletions(-) create mode 100644 app/assets/javascripts/admin/services/query_persistence.js.coffee diff --git a/app/assets/javascripts/admin/admin_ofn.js.coffee b/app/assets/javascripts/admin/admin_ofn.js.coffee index bca7364525..92aa108402 100644 --- a/app/assets/javascripts/admin/admin_ofn.js.coffee +++ b/app/assets/javascripts/admin/admin_ofn.js.coffee @@ -8,6 +8,7 @@ angular.module("ofn.admin", [ "admin.dropdown", "admin.products", "admin.taxons", - "infinite-scroll" + "infinite-scroll", + "admin.orders" ]).config ($httpProvider) -> $httpProvider.defaults.headers.common["Accept"] = "application/json, text/javascript, */*" diff --git a/app/assets/javascripts/admin/all.js b/app/assets/javascripts/admin/all.js index f28f55565a..8b462886ad 100644 --- a/app/assets/javascripts/admin/all.js +++ b/app/assets/javascripts/admin/all.js @@ -110,5 +110,8 @@ // foundation //= require ../shared/mm-foundation-tpls-0.9.0-20180826174721.min.js +// LocalStorage +//= require ../shared/angular-local-storage.js + // requires the rest of the JS code in this folder //= require_tree . diff --git a/app/assets/javascripts/admin/orders/controllers/orders_controller.js.coffee b/app/assets/javascripts/admin/orders/controllers/orders_controller.js.coffee index 4afb7c1c22..a449431165 100644 --- a/app/assets/javascripts/admin/orders/controllers/orders_controller.js.coffee +++ b/app/assets/javascripts/admin/orders/controllers/orders_controller.js.coffee @@ -1,4 +1,4 @@ -angular.module("admin.orders").controller "ordersCtrl", ($scope, $timeout, RequestMonitor, Orders, SortOptions, $window, $filter) -> +angular.module("admin.orders").controller "ordersCtrl", ($scope, $timeout, RequestMonitor, Orders, SortOptions, $window, $filter, $location, QueryPersistence) -> $scope.RequestMonitor = RequestMonitor $scope.pagination = Orders.pagination $scope.orders = Orders.all @@ -15,11 +15,16 @@ angular.module("admin.orders").controller "ordersCtrl", ($scope, $timeout, Reque $scope.poll = 0 $scope.rowStatus = {} + QueryPersistence.storageKey = 'ordersFilters' + QueryPersistence.storableFilters = ["q", "sorting", "shipping_method_id", "page", "per_page"] + $scope.initialise = -> - $scope.per_page = 15 - $scope.q = { - completed_at_not_null: true - } + unless QueryPersistence.restoreFilters($scope) + $scope.per_page = 15 + $scope.q = { + completed_at_not_null: true + } + $scope.fetchResults() $scope.fetchResults = (page=1) -> @@ -44,10 +49,12 @@ angular.module("admin.orders").controller "ordersCtrl", ($scope, $timeout, Reque per_page: $scope.per_page, page: page } + QueryPersistence.setStoredFilters($scope) RequestMonitor.load(Orders.index(params).$promise) $scope.appendStringIfNotEmpty = (baseString, stringToAppend) -> return baseString unless baseString + return baseString if baseString.endsWith(stringToAppend) baseString + stringToAppend diff --git a/app/assets/javascripts/admin/orders/orders.js.coffee b/app/assets/javascripts/admin/orders/orders.js.coffee index 1a8b267d30..ee7cd29837 100644 --- a/app/assets/javascripts/admin/orders/orders.js.coffee +++ b/app/assets/javascripts/admin/orders/orders.js.coffee @@ -1 +1 @@ -angular.module("admin.orders", ['admin.indexUtils', 'ngResource', 'mm.foundation']) +angular.module("admin.orders", ['admin.indexUtils', 'ngResource', 'mm.foundation', "OFNShared"]) diff --git a/app/assets/javascripts/admin/services/query_persistence.js.coffee b/app/assets/javascripts/admin/services/query_persistence.js.coffee new file mode 100644 index 0000000000..1930160fbe --- /dev/null +++ b/app/assets/javascripts/admin/services/query_persistence.js.coffee @@ -0,0 +1,27 @@ +angular.module("admin.indexUtils").factory 'QueryPersistence', (localStorageService)-> + new class QueryPersistence + storageKey: '' + storableFilters: [] + + constructor: -> + localStorageService.setStorageType("sessionStorage") + + getStoredFilters: -> + localStorageService.get(@storageKey) || {} + + setStoredFilters: (scope) -> + filters = {} + for key in @storableFilters + filters[key] = scope[key] + localStorageService.set(@storageKey, filters) + + restoreFilters: (scope) -> + storedFilters = @getStoredFilters() + + if storedFilters + for k,v of storedFilters + scope[k] = v + + return true + + false diff --git a/app/assets/javascripts/shared/shared.js.coffee b/app/assets/javascripts/shared/shared.js.coffee index fffd667d1e..089612728e 100644 --- a/app/assets/javascripts/shared/shared.js.coffee +++ b/app/assets/javascripts/shared/shared.js.coffee @@ -1,4 +1,5 @@ window.OFNShared = angular.module("OFNShared", [ - "mm.foundation" + "mm.foundation", + "LocalStorageModule" ]).config ($httpProvider) -> $httpProvider.defaults.headers.common["Accept"] = "application/json, text/javascript, */*" diff --git a/app/views/spree/admin/orders/edit.html.haml b/app/views/spree/admin/orders/edit.html.haml index f86d2f6c1f..d5be74c809 100644 --- a/app/views/spree/admin/orders/edit.html.haml +++ b/app/views/spree/admin/orders/edit.html.haml @@ -1,10 +1,16 @@ = csrf_meta_tags + +- content_for :main_ng_app_name do + = "ofn.admin" + - content_for :page_actions do - if can?(:fire, @order) %li= event_links = render partial: 'spree/admin/shared/order_links' - if can?(:admin, Spree::Order) - %li= button_link_to t(:back_to_orders_list), admin_orders_path, :icon => 'icon-arrow-left' + %li{"ng-controller" => "ordersCtrl"} + %a.button.icon-arrow-left{icon: 'icon-arrow-left', ng: { href: admin_orders_path }} + = t(:back_to_orders_list) = render partial: "spree/admin/shared/order_page_title" = render partial: "spree/admin/shared/order_tabs", locals: { current: 'Order Details' } @@ -17,7 +23,7 @@ = admin_inject_shops(module: 'admin.orders') = admin_inject_order_cycles - %div{"ng-app" => "admin.orders", "ng-controller" => "orderCtrl", "ofn-distributor-id" => @order.distributor_id, "ofn-order-cycle-id" => @order.order_cycle_id} + %div{"ng-controller" => "orderCtrl", "ofn-distributor-id" => @order.distributor_id, "ofn-order-cycle-id" => @order.order_cycle_id} = render :partial => 'add_product' if can?(:update, @order) From c24ceac0636f9a3acbc0673f9272524eb68a7f8d Mon Sep 17 00:00:00 2001 From: Matt-Yorkley <9029026+Matt-Yorkley@users.noreply.github.com> Date: Mon, 3 May 2021 10:49:08 +0100 Subject: [PATCH 02/15] Extract default-setting to comment method --- .../orders/controllers/orders_controller.js.coffee | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/app/assets/javascripts/admin/orders/controllers/orders_controller.js.coffee b/app/assets/javascripts/admin/orders/controllers/orders_controller.js.coffee index a449431165..b526001a80 100644 --- a/app/assets/javascripts/admin/orders/controllers/orders_controller.js.coffee +++ b/app/assets/javascripts/admin/orders/controllers/orders_controller.js.coffee @@ -20,13 +20,16 @@ angular.module("admin.orders").controller "ordersCtrl", ($scope, $timeout, Reque $scope.initialise = -> unless QueryPersistence.restoreFilters($scope) - $scope.per_page = 15 - $scope.q = { - completed_at_not_null: true - } + $scope.setDefaults() $scope.fetchResults() + $scope.setDefaults = -> + $scope.per_page = 15 + $scope.q = { + completed_at_not_null: true + } + $scope.fetchResults = (page=1) -> startDateWithTime = $scope.appendStringIfNotEmpty($scope['q']['completed_at_gteq'], ' 00:00:00') endDateWithTime = $scope.appendStringIfNotEmpty($scope['q']['completed_at_lteq'], ' 23:59:59') From 47404b1dc840d7300bc718d5577d02931c0fa3c0 Mon Sep 17 00:00:00 2001 From: Matt-Yorkley <9029026+Matt-Yorkley@users.noreply.github.com> Date: Mon, 3 May 2021 13:14:04 +0100 Subject: [PATCH 03/15] Improve handling of nils --- .../controllers/orders_controller.js.coffee | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/app/assets/javascripts/admin/orders/controllers/orders_controller.js.coffee b/app/assets/javascripts/admin/orders/controllers/orders_controller.js.coffee index b526001a80..7a53177398 100644 --- a/app/assets/javascripts/admin/orders/controllers/orders_controller.js.coffee +++ b/app/assets/javascripts/admin/orders/controllers/orders_controller.js.coffee @@ -31,22 +31,22 @@ angular.module("admin.orders").controller "ordersCtrl", ($scope, $timeout, Reque } $scope.fetchResults = (page=1) -> - startDateWithTime = $scope.appendStringIfNotEmpty($scope['q']['completed_at_gteq'], ' 00:00:00') - endDateWithTime = $scope.appendStringIfNotEmpty($scope['q']['completed_at_lteq'], ' 23:59:59') + startDateWithTime = $scope.appendStringIfNotEmpty($scope.q?.completed_at_gteq, ' 00:00:00') + endDateWithTime = $scope.appendStringIfNotEmpty($scope.q?.completed_at_lteq, ' 23:59:59') $scope.resetSelected() params = { 'q[completed_at_gteq]': startDateWithTime, 'q[completed_at_lteq]': endDateWithTime, - 'q[state_eq]': $scope['q']['state_eq'], - 'q[number_cont]': $scope['q']['number_cont'], - 'q[email_cont]': $scope['q']['email_cont'], - 'q[bill_address_firstname_start]': $scope['q']['bill_address_firstname_start'], - 'q[bill_address_lastname_start]': $scope['q']['bill_address_lastname_start'], + 'q[state_eq]': $scope.q?.state_eq, + 'q[number_cont]': $scope.q?.number_cont, + 'q[email_cont]': $scope.q?.email_cont, + 'q[bill_address_firstname_start]': $scope.q?.bill_address_firstname_start, + 'q[bill_address_lastname_start]': $scope.q?.bill_address_lastname_start, # Set default checkbox values to null. See: https://github.com/openfoodfoundation/openfoodnetwork/pull/3076#issuecomment-440010498 - 'q[completed_at_not_null]': $scope['q']['completed_at_not_null'] || null, - 'q[distributor_id_in][]': $scope['q']['distributor_id_in'], - 'q[order_cycle_id_in][]': $scope['q']['order_cycle_id_in'], + 'q[completed_at_not_null]': $scope.q?.completed_at_not_null, + 'q[distributor_id_in][]': $scope.q?.distributor_id_in, + 'q[order_cycle_id_in][]': $scope.q?.order_cycle_id_in, 'q[s]': $scope.sorting || 'completed_at desc', shipping_method_id: $scope.shipping_method_id, per_page: $scope.per_page, From 93ebfb6a4fd878246d39a81a14ae02c4629d0a6a Mon Sep 17 00:00:00 2001 From: Matt-Yorkley <9029026+Matt-Yorkley@users.noreply.github.com> Date: Mon, 3 May 2021 13:15:08 +0100 Subject: [PATCH 04/15] Improve checking for presence of saved filters --- .../javascripts/admin/services/query_persistence.js.coffee | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/assets/javascripts/admin/services/query_persistence.js.coffee b/app/assets/javascripts/admin/services/query_persistence.js.coffee index 1930160fbe..0dad2341f6 100644 --- a/app/assets/javascripts/admin/services/query_persistence.js.coffee +++ b/app/assets/javascripts/admin/services/query_persistence.js.coffee @@ -18,7 +18,7 @@ angular.module("admin.indexUtils").factory 'QueryPersistence', (localStorageServ restoreFilters: (scope) -> storedFilters = @getStoredFilters() - if storedFilters + unless _.isEmpty(storedFilters) for k,v of storedFilters scope[k] = v From 1674c6a252ecdbcfd1e2cd6c516036053acd3cc8 Mon Sep 17 00:00:00 2001 From: Jean-Baptiste Bellet Date: Thu, 1 Apr 2021 21:50:31 +0200 Subject: [PATCH 05/15] Improve HTML to improve tests readability - Specify `for` attribute to `