From 1a874d6fcfc8af8e7bcc594017ba937e634e4c2b Mon Sep 17 00:00:00 2001 From: Jean-Baptiste Bellet Date: Thu, 5 Jan 2023 17:30:08 +0100 Subject: [PATCH] Introduce pagination for BOM page --- .../line_items_controller.js.coffee | 26 +++++++++++++++++-- .../_angular_per_page_controls.html.haml | 7 +++++ .../admin/orders/bulk_management.html.haml | 8 +++++- .../line_items_controller_spec.js.coffee | 2 +- 4 files changed, 39 insertions(+), 4 deletions(-) create mode 100644 app/views/admin/shared/_angular_per_page_controls.html.haml diff --git a/app/assets/javascripts/admin/line_items/controllers/line_items_controller.js.coffee b/app/assets/javascripts/admin/line_items/controllers/line_items_controller.js.coffee index 4a9b13c355..5a37a3377d 100644 --- a/app/assets/javascripts/admin/line_items/controllers/line_items_controller.js.coffee +++ b/app/assets/javascripts/admin/line_items/controllers/line_items_controller.js.coffee @@ -9,6 +9,15 @@ angular.module("admin.lineItems").controller 'LineItemsCtrl', ($scope, $timeout, $scope.sharedResource = false $scope.columns = Columns.columns $scope.sorting = SortOptions + $scope.pagination = Orders.pagination + $scope.per_page_options = [ + {id: 15, name: t('js.admin.orders.index.per_page', results: 15)}, + {id: 50, name: t('js.admin.orders.index.per_page', results: 50)}, + {id: 100, name: t('js.admin.orders.index.per_page', results: 100)} + ] + $scope.page = 1 + $scope.per_page = $scope.per_page_options[0].id + $scope.confirmRefresh = -> LineItems.allSaved() || confirm(t("unsaved_changes_warning")) @@ -27,6 +36,11 @@ angular.module("admin.lineItems").controller 'LineItemsCtrl', ($scope, $timeout, $scope.resetFilters() $scope.refreshData() + $scope.fetchResults = -> + # creates indirection in order to factorize the code between orders and bulk orders + # used in app/views/admin/shared/_angular_per_page_controls.html.haml + $scope.refreshData() + $scope.refreshData = -> return "cancel" unless $scope.confirmRefresh() @@ -48,7 +62,9 @@ angular.module("admin.lineItems").controller 'LineItemsCtrl', ($scope, $timeout, "q[distributor_id_eq]": $scope.distributorFilter, "q[order_cycle_id_eq]": $scope.orderCycleFilter, "q[completed_at_gteq]": if formattedStartDate then formattedStartDate else undefined, - "q[completed_at_lt]": if formattedEndDate then formattedEndDate else undefined + "q[completed_at_lt]": if formattedEndDate then formattedEndDate else undefined, + "page": $scope.page, + "per_page": $scope.per_page ) $scope.loadLineItems = -> @@ -62,7 +78,9 @@ angular.module("admin.lineItems").controller 'LineItemsCtrl', ($scope, $timeout, "q[variant_product_supplier_id_eq]": $scope.supplierFilter, "q[order_order_cycle_id_eq]": $scope.orderCycleFilter, "q[order_completed_at_gteq]": if formattedStartDate then formattedStartDate else undefined, - "q[order_completed_at_lt]": if formattedEndDate then formattedEndDate else undefined + "q[order_completed_at_lt]": if formattedEndDate then formattedEndDate else undefined, + "page": $scope.page, + "per_page": $scope.per_page ) $scope.formatDates = (startDate, endDate) -> @@ -244,4 +262,8 @@ angular.module("admin.lineItems").controller 'LineItemsCtrl', ($scope, $timeout, lineItem.final_weight_volume = LineItems.pristineByID[lineItem.id].final_weight_volume * lineItem.quantity / LineItems.pristineByID[lineItem.id].quantity $scope.weightAdjustedPrice(lineItem) + $scope.changePage = (newPage) -> + $scope.page = newPage + $scope.refreshData() + $scope.resetSelectFilters() diff --git a/app/views/admin/shared/_angular_per_page_controls.html.haml b/app/views/admin/shared/_angular_per_page_controls.html.haml new file mode 100644 index 0000000000..fbde2d5f06 --- /dev/null +++ b/app/views/admin/shared/_angular_per_page_controls.html.haml @@ -0,0 +1,7 @@ +- position ||= "" +.per-page{'ng-show' => '!RequestMonitor.loading && orders.length > 0', class: ("right" if position == "right") } + %input.per-page-select.ofn-select2{type: 'number', data: 'per_page_options', 'min-search' => 999, 'ng-model' => 'per_page', 'ng-change' => 'fetchResults()'} + + %span.per-page-feedback + {{ 'spree.admin.orders.index.results_found' | t:{number: pagination.results} }} + {{ 'spree.admin.orders.index.viewing' | t:{start: ((pagination.page -1) * pagination.per_page) +1, end: ((pagination.page -1) * pagination.per_page) + orders.length} }} diff --git a/app/views/spree/admin/orders/bulk_management.html.haml b/app/views/spree/admin/orders/bulk_management.html.haml index f82d289aa3..629f9725fc 100644 --- a/app/views/spree/admin/orders/bulk_management.html.haml +++ b/app/views/spree/admin/orders/bulk_management.html.haml @@ -100,8 +100,11 @@ %input.fullwidth{ :type => "text", :id => 'quick_search', 'ng-model' => 'quickSearch', :placeholder => 'Quick Search' } %div.three.columns = render 'admin/shared/bulk_actions_dropdown' - %div.ten.columns + %div.five.columns %columns-dropdown{ action: "#{controller_name}_#{action_name}" } + %div.five.columns + = render partial: 'admin/shared/angular_per_page_controls', locals: { position: "right" } + %div.sixteen.columns.alpha#loading{ 'ng-if' => 'RequestMonitor.loading' } = render partial: "components/admin_spinner" @@ -184,4 +187,7 @@ %td.actions %a{ 'ng-click' => "deleteLineItem(line_item)", :class => "delete-line-item icon-trash no-text" } + %div{'ng-show' => "!RequestMonitor.loading && orders.length > 0" } + = render partial: 'admin/shared/angular_pagination' + = render 'spree/admin/shared/custom-confirm' diff --git a/spec/javascripts/unit/admin/line_items/controllers/line_items_controller_spec.js.coffee b/spec/javascripts/unit/admin/line_items/controllers/line_items_controller_spec.js.coffee index 3e472b155f..74bbedb100 100644 --- a/spec/javascripts/unit/admin/line_items/controllers/line_items_controller_spec.js.coffee +++ b/spec/javascripts/unit/admin/line_items/controllers/line_items_controller_spec.js.coffee @@ -49,7 +49,7 @@ describe "LineItemsCtrl", -> return Promise.resolve() allSaved: jasmine.createSpy('allSaved').and.returnValue(true) - httpBackend.expectGET("/api/v0/orders.json?q%5Bcompleted_at_not_null%5D=true&q%5Bdistributor_id_eq%5D=&q%5Border_cycle_id_eq%5D=&q%5Bshipment_state_not_eq%5D=shipped&q%5Bstate_not_eq%5D=canceled").respond {orders: [order], pagination: {page: 1, pages: 1, results: 1}} + httpBackend.expectGET("/api/v0/orders.json?page=1&per_page=15&q%5Bcompleted_at_not_null%5D=true&q%5Bdistributor_id_eq%5D=&q%5Border_cycle_id_eq%5D=&q%5Bshipment_state_not_eq%5D=shipped&q%5Bstate_not_eq%5D=canceled").respond {orders: [order], pagination: {page: 1, pages: 1, results: 1}} httpBackend.expectGET("/admin/enterprises/visible.json?ams_prefix=basic&q%5Bsells_in%5D%5B%5D=own&q%5Bsells_in%5D%5B%5D=any").respond [distributor] httpBackend.expectGET("/admin/order_cycles.json?ams_prefix=basic&as=distributor&q%5Borders_close_at_gt%5D=SomeDate").respond [orderCycle] httpBackend.expectGET("/admin/enterprises/visible.json?ams_prefix=basic&q%5Bis_primary_producer_eq%5D=true").respond [supplier]