From f263ef7dc00f1d85f629ef276dc08806b39b5156 Mon Sep 17 00:00:00 2001 From: Matt-Yorkley <9029026+Matt-Yorkley@users.noreply.github.com> Date: Fri, 5 Oct 2018 22:00:27 +0100 Subject: [PATCH 01/21] Add selectable checkboxes --- .../admin/orders/controllers/orders_controller.js.coffee | 7 +++++++ app/views/spree/admin/orders/index.html.haml | 5 +++++ config/locales/en.yml | 1 + 3 files changed, 13 insertions(+) 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 ad5bfff97d..fe85d427fd 100644 --- a/app/assets/javascripts/admin/orders/controllers/orders_controller.js.coffee +++ b/app/assets/javascripts/admin/orders/controllers/orders_controller.js.coffee @@ -8,6 +8,8 @@ angular.module("admin.orders").controller "ordersCtrl", ($scope, RequestMonitor, {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.selected = {} + $scope.select_all = false $scope.initialise = -> $scope.per_page = 15 @@ -36,6 +38,11 @@ angular.module("admin.orders").controller "ordersCtrl", ($scope, RequestMonitor, page: page }) + $scope.toggleAll = -> + $scope.select_all = !$scope.select_all + $scope.orders.forEach (order) -> + $scope.selected[order.id] = $scope.select_all + $scope.$watch 'sortOptions', (sort) -> if sort && sort.predicate != "" $scope.sorting = sort.predicate + ' desc' if sort.reverse diff --git a/app/views/spree/admin/orders/index.html.haml b/app/views/spree/admin/orders/index.html.haml index 3c0efc3793..47635c4a86 100644 --- a/app/views/spree/admin/orders/index.html.haml +++ b/app/views/spree/admin/orders/index.html.haml @@ -24,6 +24,9 @@ %col{style: "width: 10%"} %thead %tr + %th + = t('.select_all') + %input{type: 'checkbox', 'ng-click' => 'toggleAll()'} %th = t(:products_distributor) %th @@ -39,6 +42,8 @@ %th.actions %tbody %tr{ng: {repeat: 'order in orders track by $index', class: {even: "'even'", odd: "'odd'"}}, 'ng-class' => "'state-{{order.state}}'"} + %td.align-center + %input{type: 'checkbox', 'ng-model' => 'selected[order.id]'} %td.align-center {{order.distributor_name}} %td.align-center diff --git a/config/locales/en.yml b/config/locales/en.yml index b226b15044..6f13fd6291 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -2695,6 +2695,7 @@ See the %{link} to find out more about %{sitename}'s features and to start using no_orders_found: "No Orders Found" results_found: "%{number} Results found." viewing: "Viewing %{start} to %{end}." + select_all: "Select All" invoice: issued_on: Issued on tax_invoice: TAX INVOICE From 9a71236abd2278ddf30f8cd230d5542a4bb65a72 Mon Sep 17 00:00:00 2001 From: Matt-Yorkley <9029026+Matt-Yorkley@users.noreply.github.com> Date: Sun, 14 Oct 2018 12:27:11 +0100 Subject: [PATCH 02/21] Add combine_pdf gem --- Gemfile | 1 + Gemfile.lock | 4 ++++ 2 files changed, 5 insertions(+) diff --git a/Gemfile b/Gemfile index f354ea0512..2b8329cd12 100644 --- a/Gemfile +++ b/Gemfile @@ -72,6 +72,7 @@ gem 'paper_trail', '~> 3.0.8' gem 'diffy' gem 'skylight', '< 2.0' +gem 'combine_pdf' gem 'wicked_pdf' gem 'wkhtmltopdf-binary' diff --git a/Gemfile.lock b/Gemfile.lock index 11590c4cea..1b9a604ecb 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -228,6 +228,8 @@ GEM execjs coffee-script-source (1.10.0) colorize (0.8.1) + combine_pdf (1.0.15) + ruby-rc4 (>= 0.1.5) compass (1.0.3) chunky_png (~> 1.2) compass-core (~> 1.0.2) @@ -673,6 +675,7 @@ GEM unicode-display_width (~> 1.0, >= 1.0.1) ruby-ole (1.2.12.1) ruby-progressbar (1.10.0) + ruby-rc4 (0.1.5) rubyzip (1.2.2) safe_yaml (1.0.4) sass (3.3.14) @@ -771,6 +774,7 @@ DEPENDENCIES byebug (~> 9.0.0) capybara (>= 2.15.4) coffee-rails (~> 3.2.1) + combine_pdf compass-rails custom_error_message! daemons From 96d530b473a5ddb03f8b12769d1e0787f57b690c Mon Sep 17 00:00:00 2001 From: Matt-Yorkley <9029026+Matt-Yorkley@users.noreply.github.com> Date: Sun, 14 Oct 2018 12:30:20 +0100 Subject: [PATCH 03/21] Tidy up invoice template selection --- .../spree/admin/orders_controller_decorator.rb | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/app/controllers/spree/admin/orders_controller_decorator.rb b/app/controllers/spree/admin/orders_controller_decorator.rb index f7e1b56929..bac3509be3 100644 --- a/app/controllers/spree/admin/orders_controller_decorator.rb +++ b/app/controllers/spree/admin/orders_controller_decorator.rb @@ -37,8 +37,7 @@ Spree::Admin::OrdersController.class_eval do end def invoice - template = if Spree::Config.invoice_style2? then "spree/admin/orders/invoice2" else "spree/admin/orders/invoice" end - pdf = render_to_string pdf: "invoice-#{@order.number}.pdf", template: template, formats: [:html], encoding: "UTF-8" + pdf = render_to_string pdf: "invoice-#{@order.number}.pdf", template: invoice_template, formats: [:html], encoding: "UTF-8" Spree::OrderMailer.invoice_email(@order.id, pdf).deliver flash[:success] = t('admin.orders.invoice_email_sent') @@ -46,8 +45,7 @@ Spree::Admin::OrdersController.class_eval do end def print - template = if Spree::Config.invoice_style2? then "spree/admin/orders/invoice2" else "spree/admin/orders/invoice" end - render pdf: "invoice-#{@order.number}", template: template, encoding: "UTF-8" + render pdf: "invoice-#{@order.number}", template: invoice_template, encoding: "UTF-8" end def print_ticket @@ -60,6 +58,10 @@ Spree::Admin::OrdersController.class_eval do private + def invoice_template + Spree::Config.invoice_style2? ? "spree/admin/orders/invoice2" : "spree/admin/orders/invoice" + end + def require_distributor_abn unless @order.distributor.abn.present? flash[:error] = t(:must_have_valid_business_number, enterprise_name: @order.distributor.name) From 4ec0f0ff739caaa59fafdf261094ff31a83adf68 Mon Sep 17 00:00:00 2001 From: Matt-Yorkley <9029026+Matt-Yorkley@users.noreply.github.com> Date: Mon, 15 Oct 2018 13:44:21 +0100 Subject: [PATCH 04/21] Add bulk invoices printing --- .../controllers/orders_controller.js.coffee | 10 +++++++- app/assets/stylesheets/admin/orders.css.scss | 7 ++++++ .../admin/orders_controller_decorator.rb | 23 ++++++++++++++++++- app/models/spree/ability_decorator.rb | 4 +++- app/views/spree/admin/orders/index.html.haml | 5 +++- config/locales/en.yml | 1 + 6 files changed, 46 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 fe85d427fd..6aec2e8496 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, RequestMonitor, Orders, SortOptions) -> +angular.module("admin.orders").controller "ordersCtrl", ($scope, RequestMonitor, Orders, SortOptions, $http, $window) -> $scope.RequestMonitor = RequestMonitor $scope.pagination = Orders.pagination $scope.orders = Orders.all @@ -53,3 +53,11 @@ angular.module("admin.orders").controller "ordersCtrl", ($scope, RequestMonitor, $scope.changePage = (newPage) -> $scope.page = newPage $scope.fetchResults(newPage) + + $scope.bulkInvoice = -> + params = '' + angular.forEach $scope.selected, (selected, order_id) -> + params += 'order_ids[]='+order_id+'&' if selected + + $window.open('/admin/orders/bulk_invoice?'+params) + true diff --git a/app/assets/stylesheets/admin/orders.css.scss b/app/assets/stylesheets/admin/orders.css.scss index 0955d9fd46..d92fc11f6f 100644 --- a/app/assets/stylesheets/admin/orders.css.scss +++ b/app/assets/stylesheets/admin/orders.css.scss @@ -103,3 +103,10 @@ table.index td.actions { font-size: 1.2em; } } + +.index-controls { + + button { + float: right; + } +} diff --git a/app/controllers/spree/admin/orders_controller_decorator.rb b/app/controllers/spree/admin/orders_controller_decorator.rb index bac3509be3..cebbda5cc6 100644 --- a/app/controllers/spree/admin/orders_controller_decorator.rb +++ b/app/controllers/spree/admin/orders_controller_decorator.rb @@ -1,4 +1,5 @@ require 'open_food_network/spree_api_key_loader' +require 'combine_pdf' Spree::Admin::OrdersController.class_eval do include OpenFoodNetwork::SpreeApiKeyLoader @@ -37,13 +38,33 @@ Spree::Admin::OrdersController.class_eval do end def invoice - pdf = render_to_string pdf: "invoice-#{@order.number}.pdf", template: invoice_template, formats: [:html], encoding: "UTF-8" + pdf = render_to_string pdf: "invoice-#{@order.number}.pdf", + template: invoice_template, + formats: [:html], encoding: "UTF-8" + Spree::OrderMailer.invoice_email(@order.id, pdf).deliver flash[:success] = t('admin.orders.invoice_email_sent') respond_with(@order) { |format| format.html { redirect_to edit_admin_order_path(@order) } } end + def bulk_invoice + orders = params[:order_ids] + + combined_pdf = CombinePDF.new + + orders.each do |order_id| + @order = Spree::Order.find(order_id) + pdf_data = render_to_string pdf: "invoice-#{@order.number}.pdf", template: invoice_template, + formats: [:html], encoding: "UTF-8" + + combined_pdf << CombinePDF.parse(pdf_data) + end + + send_data combined_pdf.to_pdf, filename: "invoices.pdf", + type: "application/pdf", disposition: :inline + end + def print render pdf: "invoice-#{@order.number}", template: invoice_template, encoding: "UTF-8" end diff --git a/app/models/spree/ability_decorator.rb b/app/models/spree/ability_decorator.rb index 9d0941a220..2c68470840 100644 --- a/app/models/spree/ability_decorator.rb +++ b/app/models/spree/ability_decorator.rb @@ -210,7 +210,9 @@ class AbilityDecorator # during the order creation process from the admin backend order.distributor.nil? || user.enterprises.include?(order.distributor) || order.order_cycle.andand.coordinated_by?(user) end - can [:admin, :bulk_management, :managed], Spree::Order if user.admin? || user.enterprises.any?(&:is_distributor) + can [:admin, :bulk_management, :managed, :bulk_invoice], Spree::Order do + user.admin? || user.enterprises.any?(&:is_distributor) + end can [:admin, :visible], Enterprise can [:admin, :index, :create, :update, :destroy], :line_item can [:admin, :index, :create], Spree::LineItem diff --git a/app/views/spree/admin/orders/index.html.haml b/app/views/spree/admin/orders/index.html.haml index 47635c4a86..75a9a4b0fb 100644 --- a/app/views/spree/admin/orders/index.html.haml +++ b/app/views/spree/admin/orders/index.html.haml @@ -16,9 +16,12 @@ - content_for :table_filter do = render partial: 'filters' -.row +.row.index-controls{'ng-show' => '!RequestMonitor.loading && orders.length > 0'} = render partial: 'per_page_controls' + %button{'ng-click' => 'bulkInvoice()'} + = t('.print_invoices') + %table#listing_orders.index.responsive{width: "100%", 'ng-init' => 'initialise()', 'ng-show' => "!RequestMonitor.loading && orders.length > 0" } %colgroup %col{style: "width: 10%"} diff --git a/config/locales/en.yml b/config/locales/en.yml index 6f13fd6291..b9e2d509a9 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -2696,6 +2696,7 @@ See the %{link} to find out more about %{sitename}'s features and to start using results_found: "%{number} Results found." viewing: "Viewing %{start} to %{end}." select_all: "Select All" + print_invoices: "Print Invoices" invoice: issued_on: Issued on tax_invoice: TAX INVOICE From 42cf96e6354a9bab5b681ea12d3253bc572b49fc Mon Sep 17 00:00:00 2001 From: Matt-Yorkley <9029026+Matt-Yorkley@users.noreply.github.com> Date: Mon, 15 Oct 2018 14:24:19 +0100 Subject: [PATCH 05/21] Disable button unless orders selected --- .../controllers/orders_controller.js.coffee | 19 +++++++++++++++---- app/assets/stylesheets/admin/orders.css.scss | 4 ++++ app/views/spree/admin/orders/index.html.haml | 4 ++-- 3 files changed, 21 insertions(+), 6 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 6aec2e8496..842afefee6 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, RequestMonitor, Orders, SortOptions, $http, $window) -> +angular.module("admin.orders").controller "ordersCtrl", ($scope, RequestMonitor, Orders, SortOptions, $http, $window, $filter) -> $scope.RequestMonitor = RequestMonitor $scope.pagination = Orders.pagination $scope.orders = Orders.all @@ -8,7 +8,8 @@ angular.module("admin.orders").controller "ordersCtrl", ($scope, RequestMonitor, {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.selected = {} + $scope.selected_orders = {} + $scope.selected = false $scope.select_all = false $scope.initialise = -> @@ -41,7 +42,7 @@ angular.module("admin.orders").controller "ordersCtrl", ($scope, RequestMonitor, $scope.toggleAll = -> $scope.select_all = !$scope.select_all $scope.orders.forEach (order) -> - $scope.selected[order.id] = $scope.select_all + $scope.selected_orders[order.id] = $scope.select_all $scope.$watch 'sortOptions', (sort) -> if sort && sort.predicate != "" @@ -50,13 +51,23 @@ angular.module("admin.orders").controller "ordersCtrl", ($scope, RequestMonitor, $scope.fetchResults() , true + $scope.$watchCollection 'selected_orders', (selected_orders) -> + if selected_orders + orders_selected = false + angular.forEach selected_orders, (checked, order_id) -> + if checked + orders_selected = true + return + + $scope.selected = orders_selected + $scope.changePage = (newPage) -> $scope.page = newPage $scope.fetchResults(newPage) $scope.bulkInvoice = -> params = '' - angular.forEach $scope.selected, (selected, order_id) -> + angular.forEach $scope.selected_orders, (selected, order_id) -> params += 'order_ids[]='+order_id+'&' if selected $window.open('/admin/orders/bulk_invoice?'+params) diff --git a/app/assets/stylesheets/admin/orders.css.scss b/app/assets/stylesheets/admin/orders.css.scss index d92fc11f6f..5f53152901 100644 --- a/app/assets/stylesheets/admin/orders.css.scss +++ b/app/assets/stylesheets/admin/orders.css.scss @@ -108,5 +108,9 @@ table.index td.actions { button { float: right; + + &:disabled { + background-color: $disabled-button; + } } } diff --git a/app/views/spree/admin/orders/index.html.haml b/app/views/spree/admin/orders/index.html.haml index 75a9a4b0fb..96cddca13b 100644 --- a/app/views/spree/admin/orders/index.html.haml +++ b/app/views/spree/admin/orders/index.html.haml @@ -19,7 +19,7 @@ .row.index-controls{'ng-show' => '!RequestMonitor.loading && orders.length > 0'} = render partial: 'per_page_controls' - %button{'ng-click' => 'bulkInvoice()'} + %button{'ng-click' => 'bulkInvoice()', 'ng-disabled' => '!selected'} = t('.print_invoices') %table#listing_orders.index.responsive{width: "100%", 'ng-init' => 'initialise()', 'ng-show' => "!RequestMonitor.loading && orders.length > 0" } @@ -46,7 +46,7 @@ %tbody %tr{ng: {repeat: 'order in orders track by $index', class: {even: "'even'", odd: "'odd'"}}, 'ng-class' => "'state-{{order.state}}'"} %td.align-center - %input{type: 'checkbox', 'ng-model' => 'selected[order.id]'} + %input{type: 'checkbox', 'ng-model' => 'selected_orders[order.id]'} %td.align-center {{order.distributor_name}} %td.align-center From 5cc8bad42b2bd1b7dd6aed9ef745e57b71f28ecb Mon Sep 17 00:00:00 2001 From: Matt-Yorkley <9029026+Matt-Yorkley@users.noreply.github.com> Date: Mon, 15 Oct 2018 17:40:55 +0100 Subject: [PATCH 06/21] Improve UI layout for select all option --- app/views/spree/admin/orders/index.html.haml | 3 +-- config/locales/en.yml | 1 - 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/app/views/spree/admin/orders/index.html.haml b/app/views/spree/admin/orders/index.html.haml index 96cddca13b..ee1f4adad8 100644 --- a/app/views/spree/admin/orders/index.html.haml +++ b/app/views/spree/admin/orders/index.html.haml @@ -24,11 +24,10 @@ %table#listing_orders.index.responsive{width: "100%", 'ng-init' => 'initialise()', 'ng-show' => "!RequestMonitor.loading && orders.length > 0" } %colgroup - %col{style: "width: 10%"} + %col{style: "width: 3%"} %thead %tr %th - = t('.select_all') %input{type: 'checkbox', 'ng-click' => 'toggleAll()'} %th = t(:products_distributor) diff --git a/config/locales/en.yml b/config/locales/en.yml index b9e2d509a9..3f9c2f4b1b 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -2695,7 +2695,6 @@ See the %{link} to find out more about %{sitename}'s features and to start using no_orders_found: "No Orders Found" results_found: "%{number} Results found." viewing: "Viewing %{start} to %{end}." - select_all: "Select All" print_invoices: "Print Invoices" invoice: issued_on: Issued on From 24207053e465132eb5df3e6c966d0a9dc072bfc2 Mon Sep 17 00:00:00 2001 From: Matt-Yorkley <9029026+Matt-Yorkley@users.noreply.github.com> Date: Mon, 15 Oct 2018 17:53:37 +0100 Subject: [PATCH 07/21] Reset selected orders on filter change --- .../admin/orders/controllers/orders_controller.js.coffee | 7 ++++++- app/views/spree/admin/orders/index.html.haml | 2 +- 2 files changed, 7 insertions(+), 2 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 842afefee6..a89c97791f 100644 --- a/app/assets/javascripts/admin/orders/controllers/orders_controller.js.coffee +++ b/app/assets/javascripts/admin/orders/controllers/orders_controller.js.coffee @@ -20,6 +20,7 @@ angular.module("admin.orders").controller "ordersCtrl", ($scope, RequestMonitor, $scope.fetchResults() $scope.fetchResults = (page=1) -> + $scope.resetSelected() Orders.index({ 'q[completed_at_lt]': $scope['q']['completed_at_lt'], 'q[completed_at_gt]': $scope['q']['completed_at_gt'], @@ -39,8 +40,12 @@ angular.module("admin.orders").controller "ordersCtrl", ($scope, RequestMonitor, page: page }) + $scope.resetSelected = -> + $scope.selected_orders = {} + $scope.selected = false + $scope.select_all = false + $scope.toggleAll = -> - $scope.select_all = !$scope.select_all $scope.orders.forEach (order) -> $scope.selected_orders[order.id] = $scope.select_all diff --git a/app/views/spree/admin/orders/index.html.haml b/app/views/spree/admin/orders/index.html.haml index ee1f4adad8..114c177d22 100644 --- a/app/views/spree/admin/orders/index.html.haml +++ b/app/views/spree/admin/orders/index.html.haml @@ -28,7 +28,7 @@ %thead %tr %th - %input{type: 'checkbox', 'ng-click' => 'toggleAll()'} + %input{type: 'checkbox', 'ng-click' => 'toggleAll()', 'ng-model' => 'select_all'} %th = t(:products_distributor) %th From f3585befff5811afc5f6d2e8d37bf5edae7002a9 Mon Sep 17 00:00:00 2001 From: Matt-Yorkley <9029026+Matt-Yorkley@users.noreply.github.com> Date: Mon, 15 Oct 2018 18:10:00 +0100 Subject: [PATCH 08/21] Fix customer missing from some order records - guest checkout? --- app/views/spree/admin/orders/invoice.html.haml | 5 +++-- app/views/spree/admin/orders/invoice2.html.haml | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/app/views/spree/admin/orders/invoice.html.haml b/app/views/spree/admin/orders/invoice.html.haml index 0982ccc21f..982ef43f59 100644 --- a/app/views/spree/admin/orders/invoice.html.haml +++ b/app/views/spree/admin/orders/invoice.html.haml @@ -30,13 +30,14 @@   %td{ :align => "right" } %strong= "#{t('.to')}: #{@order.ship_address.full_name}" - - if @order.customer.code.present? + - if @order.andand.customer.andand.code.present? %br = "#{t('.code')}: #{@order.customer.code}" %br = @order.ship_address.full_address %br - = "#{@order.customer.email}," + - if @order.andand.customer.andand.email.present? + = "#{@order.customer.email}," = "#{@order.bill_address.phone}" = render 'spree/admin/orders/invoice_table' diff --git a/app/views/spree/admin/orders/invoice2.html.haml b/app/views/spree/admin/orders/invoice2.html.haml index 89f28ab308..837b2be21a 100644 --- a/app/views/spree/admin/orders/invoice2.html.haml +++ b/app/views/spree/admin/orders/invoice2.html.haml @@ -45,7 +45,7 @@ = t :invoice_billing_address %br %strong= @order.ship_address.full_name - - if @order.customer.code.present? + - if @order.andand.customer.andand.code.present? %br = "Code: #{@order.customer.code}" %br From 5279210254cd44c21dfde5c1127ff2921b49f11c Mon Sep 17 00:00:00 2001 From: Matt-Yorkley <9029026+Matt-Yorkley@users.noreply.github.com> Date: Wed, 24 Oct 2018 00:00:09 +0100 Subject: [PATCH 09/21] Improve invoice order querying --- .../spree/admin/orders_controller_decorator.rb | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/app/controllers/spree/admin/orders_controller_decorator.rb b/app/controllers/spree/admin/orders_controller_decorator.rb index cebbda5cc6..e9a3a7d92d 100644 --- a/app/controllers/spree/admin/orders_controller_decorator.rb +++ b/app/controllers/spree/admin/orders_controller_decorator.rb @@ -49,13 +49,13 @@ Spree::Admin::OrdersController.class_eval do end def bulk_invoice - orders = params[:order_ids] + orders = Spree::Order.where(id: params[:order_ids]) combined_pdf = CombinePDF.new - orders.each do |order_id| - @order = Spree::Order.find(order_id) - pdf_data = render_to_string pdf: "invoice-#{@order.number}.pdf", template: invoice_template, + orders.each do |order| + @order = order + pdf_data = render_to_string pdf: "invoice-#{order.number}.pdf", template: invoice_template, formats: [:html], encoding: "UTF-8" combined_pdf << CombinePDF.parse(pdf_data) From 4a88fb0626dc91c9a2fc35ac69123dbf42043863 Mon Sep 17 00:00:00 2001 From: Matt-Yorkley <9029026+Matt-Yorkley@users.noreply.github.com> Date: Fri, 26 Oct 2018 21:00:26 +0100 Subject: [PATCH 10/21] Use simpler array for selected ids --- .../controllers/orders_controller.js.coffee | 32 ++++++++++--------- app/views/spree/admin/orders/index.html.haml | 4 +-- 2 files changed, 19 insertions(+), 17 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 a89c97791f..a882def796 100644 --- a/app/assets/javascripts/admin/orders/controllers/orders_controller.js.coffee +++ b/app/assets/javascripts/admin/orders/controllers/orders_controller.js.coffee @@ -8,7 +8,8 @@ angular.module("admin.orders").controller "ordersCtrl", ($scope, RequestMonitor, {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.selected_orders = {} + $scope.selected_orders = [] + $scope.checkboxes = {} $scope.selected = false $scope.select_all = false @@ -41,13 +42,24 @@ angular.module("admin.orders").controller "ordersCtrl", ($scope, RequestMonitor, }) $scope.resetSelected = -> - $scope.selected_orders = {} + $scope.selected_orders.length = 0 $scope.selected = false $scope.select_all = false + $scope.checkboxes = {} + + $scope.toggleSelection = (id) -> + index = $scope.selected_orders.indexOf(id) + + if index == -1 + $scope.selected_orders.push(id) + else + $scope.selected_orders.splice(index, 1) $scope.toggleAll = -> + $scope.selected_orders.length = 0 $scope.orders.forEach (order) -> - $scope.selected_orders[order.id] = $scope.select_all + $scope.checkboxes[order.id] = $scope.select_all + $scope.selected_orders.push order.id if $scope.select_all $scope.$watch 'sortOptions', (sort) -> if sort && sort.predicate != "" @@ -56,24 +68,14 @@ angular.module("admin.orders").controller "ordersCtrl", ($scope, RequestMonitor, $scope.fetchResults() , true - $scope.$watchCollection 'selected_orders', (selected_orders) -> - if selected_orders - orders_selected = false - angular.forEach selected_orders, (checked, order_id) -> - if checked - orders_selected = true - return - - $scope.selected = orders_selected - $scope.changePage = (newPage) -> $scope.page = newPage $scope.fetchResults(newPage) $scope.bulkInvoice = -> params = '' - angular.forEach $scope.selected_orders, (selected, order_id) -> - params += 'order_ids[]='+order_id+'&' if selected + angular.forEach $scope.selected_orders, (order_id) -> + params += 'order_ids[]='+order_id+'&' $window.open('/admin/orders/bulk_invoice?'+params) true diff --git a/app/views/spree/admin/orders/index.html.haml b/app/views/spree/admin/orders/index.html.haml index 114c177d22..559f93eb72 100644 --- a/app/views/spree/admin/orders/index.html.haml +++ b/app/views/spree/admin/orders/index.html.haml @@ -19,7 +19,7 @@ .row.index-controls{'ng-show' => '!RequestMonitor.loading && orders.length > 0'} = render partial: 'per_page_controls' - %button{'ng-click' => 'bulkInvoice()', 'ng-disabled' => '!selected'} + %button{'ng-click' => 'bulkInvoice()', 'ng-disabled' => 'selected_orders.length == 0'} = t('.print_invoices') %table#listing_orders.index.responsive{width: "100%", 'ng-init' => 'initialise()', 'ng-show' => "!RequestMonitor.loading && orders.length > 0" } @@ -45,7 +45,7 @@ %tbody %tr{ng: {repeat: 'order in orders track by $index', class: {even: "'even'", odd: "'odd'"}}, 'ng-class' => "'state-{{order.state}}'"} %td.align-center - %input{type: 'checkbox', 'ng-model' => 'selected_orders[order.id]'} + %input{type: 'checkbox', 'ng-model' => 'checkboxes[order.id]', 'ng-change' => 'toggleSelection(order.id)'} %td.align-center {{order.distributor_name}} %td.align-center From 7d82020657ba40e0a918a71ae22c047f97b42d95 Mon Sep 17 00:00:00 2001 From: Matt-Yorkley <9029026+Matt-Yorkley@users.noreply.github.com> Date: Mon, 5 Nov 2018 18:23:13 +0000 Subject: [PATCH 11/21] Move bulk invoice to new RESTful route --- .../controllers/orders_controller.js.coffee | 2 +- .../spree/admin/invoices_controller.rb | 29 ++++++++++++++ .../admin/orders_controller_decorator.rb | 18 --------- config/routes/spree.rb | 4 ++ .../spree/admin/invoices_controller_spec.rb | 40 +++++++++++++++++++ 5 files changed, 74 insertions(+), 19 deletions(-) create mode 100644 app/controllers/spree/admin/invoices_controller.rb create mode 100644 spec/controllers/spree/admin/invoices_controller_spec.rb 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 a882def796..1fd92d36f7 100644 --- a/app/assets/javascripts/admin/orders/controllers/orders_controller.js.coffee +++ b/app/assets/javascripts/admin/orders/controllers/orders_controller.js.coffee @@ -77,5 +77,5 @@ angular.module("admin.orders").controller "ordersCtrl", ($scope, RequestMonitor, angular.forEach $scope.selected_orders, (order_id) -> params += 'order_ids[]='+order_id+'&' - $window.open('/admin/orders/bulk_invoice?'+params) + $window.open('/admin/orders/invoices/show?'+params) true diff --git a/app/controllers/spree/admin/invoices_controller.rb b/app/controllers/spree/admin/invoices_controller.rb new file mode 100644 index 0000000000..4bfeb7dcc5 --- /dev/null +++ b/app/controllers/spree/admin/invoices_controller.rb @@ -0,0 +1,29 @@ +require 'combine_pdf' + +module Spree + module Admin + class InvoicesController < Spree::Admin::BaseController + def show + combined_pdf = CombinePDF.new + + Spree::Order.where(id: params[:order_ids]).each do |order| + @order = order + pdf_data = render_to_string pdf: "invoice-#{order.number}.pdf", + template: invoice_template, + formats: [:html], encoding: "UTF-8" + + combined_pdf << CombinePDF.parse(pdf_data) + end + + send_data combined_pdf.to_pdf, filename: "invoices.pdf", + type: "application/pdf", disposition: :inline + end + + private + + def invoice_template + Spree::Config.invoice_style2? ? "spree/admin/orders/invoice2" : "spree/admin/orders/invoice" + end + end + end +end diff --git a/app/controllers/spree/admin/orders_controller_decorator.rb b/app/controllers/spree/admin/orders_controller_decorator.rb index e9a3a7d92d..84e66451ba 100644 --- a/app/controllers/spree/admin/orders_controller_decorator.rb +++ b/app/controllers/spree/admin/orders_controller_decorator.rb @@ -1,5 +1,4 @@ require 'open_food_network/spree_api_key_loader' -require 'combine_pdf' Spree::Admin::OrdersController.class_eval do include OpenFoodNetwork::SpreeApiKeyLoader @@ -48,23 +47,6 @@ Spree::Admin::OrdersController.class_eval do respond_with(@order) { |format| format.html { redirect_to edit_admin_order_path(@order) } } end - def bulk_invoice - orders = Spree::Order.where(id: params[:order_ids]) - - combined_pdf = CombinePDF.new - - orders.each do |order| - @order = order - pdf_data = render_to_string pdf: "invoice-#{order.number}.pdf", template: invoice_template, - formats: [:html], encoding: "UTF-8" - - combined_pdf << CombinePDF.parse(pdf_data) - end - - send_data combined_pdf.to_pdf, filename: "invoices.pdf", - type: "application/pdf", disposition: :inline - end - def print render pdf: "invoice-#{@order.number}", template: invoice_template, encoding: "UTF-8" end diff --git a/config/routes/spree.rb b/config/routes/spree.rb index a203ab0fb0..1912bb8a2a 100644 --- a/config/routes/spree.rb +++ b/config/routes/spree.rb @@ -74,6 +74,10 @@ Spree::Core::Engine.routes.prepend do get :print, on: :member get :print_ticket, on: :member get :managed, on: :collection + + collection do + resources :invoices, only: [:show] + end end end diff --git a/spec/controllers/spree/admin/invoices_controller_spec.rb b/spec/controllers/spree/admin/invoices_controller_spec.rb new file mode 100644 index 0000000000..80cb2f4244 --- /dev/null +++ b/spec/controllers/spree/admin/invoices_controller_spec.rb @@ -0,0 +1,40 @@ +require 'spec_helper' + +describe Spree::Admin::InvoicesController, type: :controller do + let(:order) { create(:order_with_totals_and_distribution) } + + before do + controller.stub spree_current_user: create(:admin_user) + end + + describe "#create" do + it "enqueues a job to create a bulk invoice and returns the filename" do + expect do + spree_post :create, order_ids: [order.id] + end.to enqueue_job BulkInvoiceJob + end + end + + describe "#poll" do + let(:invoice_id) { '479186263' } + + context "when the file is available" do + it "returns true" do + allow(File).to receive(:exist?).and_return(true) + spree_get :poll, invoice_id: invoice_id + + expect(response.body).to eq({ created: true }.to_json) + expect(response.status).to eq 200 + end + end + + context "when the file is not available" do + it "returns false" do + spree_get :poll, invoice_id: invoice_id + + expect(response.body).to eq({ created: false }.to_json) + expect(response.status).to eq 422 + end + end + end +end \ No newline at end of file From b0f75162ac412cbf07668d989825ee6b339cad3c Mon Sep 17 00:00:00 2001 From: Matt-Yorkley <9029026+Matt-Yorkley@users.noreply.github.com> Date: Mon, 19 Nov 2018 18:06:47 +0000 Subject: [PATCH 12/21] Add delayed job for create bulk invoice --- .../controllers/orders_controller.js.coffee | 10 ++--- .../spree/admin/invoices_controller.rb | 22 +++------- app/jobs/bulk_invoice_job.rb | 44 +++++++++++++++++++ config/routes/spree.rb | 2 +- 4 files changed, 54 insertions(+), 24 deletions(-) create mode 100644 app/jobs/bulk_invoice_job.rb 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 1fd92d36f7..896ffd7384 100644 --- a/app/assets/javascripts/admin/orders/controllers/orders_controller.js.coffee +++ b/app/assets/javascripts/admin/orders/controllers/orders_controller.js.coffee @@ -73,9 +73,7 @@ angular.module("admin.orders").controller "ordersCtrl", ($scope, RequestMonitor, $scope.fetchResults(newPage) $scope.bulkInvoice = -> - params = '' - angular.forEach $scope.selected_orders, (order_id) -> - params += 'order_ids[]='+order_id+'&' - - $window.open('/admin/orders/invoices/show?'+params) - true + $http.post("/admin/orders/invoices", {order_ids: $scope.selected_orders}).success (data) -> + console.log(data) + .error (data) -> + console.log(data) diff --git a/app/controllers/spree/admin/invoices_controller.rb b/app/controllers/spree/admin/invoices_controller.rb index 4bfeb7dcc5..05062c8bab 100644 --- a/app/controllers/spree/admin/invoices_controller.rb +++ b/app/controllers/spree/admin/invoices_controller.rb @@ -1,28 +1,16 @@ -require 'combine_pdf' - module Spree module Admin class InvoicesController < Spree::Admin::BaseController - def show - combined_pdf = CombinePDF.new + def create + Delayed::Job.enqueue BulkInvoiceJob.new(params[:order_ids], filename) - Spree::Order.where(id: params[:order_ids]).each do |order| - @order = order - pdf_data = render_to_string pdf: "invoice-#{order.number}.pdf", - template: invoice_template, - formats: [:html], encoding: "UTF-8" - - combined_pdf << CombinePDF.parse(pdf_data) - end - - send_data combined_pdf.to_pdf, filename: "invoices.pdf", - type: "application/pdf", disposition: :inline + render text: filename, status: :ok end private - def invoice_template - Spree::Config.invoice_style2? ? "spree/admin/orders/invoice2" : "spree/admin/orders/invoice" + def filename + @filename ||= Time.zone.now.to_i.to_s end end end diff --git a/app/jobs/bulk_invoice_job.rb b/app/jobs/bulk_invoice_job.rb new file mode 100644 index 0000000000..4859606d77 --- /dev/null +++ b/app/jobs/bulk_invoice_job.rb @@ -0,0 +1,44 @@ +BulkInvoiceJob = Struct.new(:order_ids, :filename) do + include WickedPdf::PdfHelper + + def perform + generate_pdf + rescue StandardError => e + log e + end + + private + + def generate_pdf + pdf = CombinePDF.new + orders = Spree::Order.where(id: order_ids) + renderer = ApplicationController.new + + orders.each do |order| + invoice = renderer.render_to_string pdf: "invoice-#{order.number}.pdf", + template: invoice_template, + formats: [:html], encoding: "UTF-8", + locals: { :@order => order } + + pdf << CombinePDF.parse(invoice) + end + + pdf.save "#{directory}/#{filename}.pdf" + end + + def invoice_template + Spree::Config.invoice_style2? ? "spree/admin/orders/invoice2" : "spree/admin/orders/invoice" + end + + def log(error) + logger = Logger.new('bulkinvoice.log') + logger.debug e.message + logger.debug e.backtrace[0] + end + + def directory + dir = 'tmp/invoices' + Dir.mkdir(dir) unless File.exist?(dir) + dir + end +end diff --git a/config/routes/spree.rb b/config/routes/spree.rb index 1912bb8a2a..e3e86455f6 100644 --- a/config/routes/spree.rb +++ b/config/routes/spree.rb @@ -76,7 +76,7 @@ Spree::Core::Engine.routes.prepend do get :managed, on: :collection collection do - resources :invoices, only: [:show] + resources :invoices, only: [:create] end end end From 638dc6eada162c66794c9ebc1c7302dea6872635 Mon Sep 17 00:00:00 2001 From: Matt-Yorkley <9029026+Matt-Yorkley@users.noreply.github.com> Date: Mon, 19 Nov 2018 22:46:49 +0000 Subject: [PATCH 13/21] Add polling and show action --- .../controllers/orders_controller.js.coffee | 37 ++++++++++++++++--- .../directives/invoices_modal.js.coffee | 5 +++ .../javascripts/admin/orders/orders.js.coffee | 2 +- .../admin/modals/bulk_invoice.html.haml | 16 ++++++++ app/assets/stylesheets/admin/orders.css.scss | 20 ++++++++++ .../spree/admin/invoices_controller.rb | 28 +++++++++++++- app/jobs/bulk_invoice_job.rb | 35 ++++++++---------- app/views/spree/admin/orders/index.html.haml | 2 +- config/locales/en.yml | 4 ++ config/routes/spree.rb | 4 +- 10 files changed, 124 insertions(+), 29 deletions(-) create mode 100644 app/assets/javascripts/admin/orders/directives/invoices_modal.js.coffee create mode 100644 app/assets/javascripts/templates/admin/modals/bulk_invoice.html.haml 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 896ffd7384..729674a8f3 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, RequestMonitor, Orders, SortOptions, $http, $window, $filter) -> +angular.module("admin.orders").controller "ordersCtrl", ($scope, RequestMonitor, Orders, SortOptions, $http, $timeout, $window, $filter) -> $scope.RequestMonitor = RequestMonitor $scope.pagination = Orders.pagination $scope.orders = Orders.all @@ -12,6 +12,7 @@ angular.module("admin.orders").controller "ordersCtrl", ($scope, RequestMonitor, $scope.checkboxes = {} $scope.selected = false $scope.select_all = false + $scope.poll = 0 $scope.initialise = -> $scope.per_page = 15 @@ -72,8 +73,32 @@ angular.module("admin.orders").controller "ordersCtrl", ($scope, RequestMonitor, $scope.page = newPage $scope.fetchResults(newPage) - $scope.bulkInvoice = -> - $http.post("/admin/orders/invoices", {order_ids: $scope.selected_orders}).success (data) -> - console.log(data) - .error (data) -> - console.log(data) + $scope.createBulkInvoice = -> + $scope.invoice_id = null + $scope.poll = 1 + $scope.loading = true + $scope.message = null + $scope.error = null + + $http.post('/admin/orders/invoices', {order_ids: $scope.selected_orders}).success (data) -> + $scope.invoice_id = data + $scope.pollBulkInvoice() + + $scope.pollBulkInvoice = -> + console.log('Polling... ') + + $timeout(-> + $http.get('/admin/orders/invoices/'+$scope.invoice_id+'/poll').success (data) -> + $scope.loading = false + $scope.message = t('js.admin.orders.index.bulk_invoice_created') + + .error (data) -> + $scope.poll++ + + if $scope.poll > 10 + $scope.loading = false + $scope.error = t('js.admin.orders.index.bulk_invoice_failed') + return + + $scope.pollBulkInvoice() + , 5000) diff --git a/app/assets/javascripts/admin/orders/directives/invoices_modal.js.coffee b/app/assets/javascripts/admin/orders/directives/invoices_modal.js.coffee new file mode 100644 index 0000000000..b774f05b57 --- /dev/null +++ b/app/assets/javascripts/admin/orders/directives/invoices_modal.js.coffee @@ -0,0 +1,5 @@ +angular.module("admin.orders").directive "invoicesModal", ($modal) -> + restrict: 'C' + link: (scope, elem, attrs, ctrl) -> + elem.on "click", (ev) => + scope.uploadModal = $modal.open(templateUrl: 'admin/modals/bulk_invoice.html', controller: ctrl, scope: scope, windowClass: 'bulk-invoice-modal') diff --git a/app/assets/javascripts/admin/orders/orders.js.coffee b/app/assets/javascripts/admin/orders/orders.js.coffee index 4e1ec754e3..1a8b267d30 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']) +angular.module("admin.orders", ['admin.indexUtils', 'ngResource', 'mm.foundation']) diff --git a/app/assets/javascripts/templates/admin/modals/bulk_invoice.html.haml b/app/assets/javascripts/templates/admin/modals/bulk_invoice.html.haml new file mode 100644 index 0000000000..5e39dbab23 --- /dev/null +++ b/app/assets/javascripts/templates/admin/modals/bulk_invoice.html.haml @@ -0,0 +1,16 @@ +%a.close-reveal-modal{ ng: { click: '$close()' } } + %i.fa.fa-times-circle + +%h4.modal-title + = t('js.admin.orders.index.compiling_invoices') + +%p.message{ ng: { show: 'message' } } + {{message}} +%p.error{ ng: { show: 'error' } } + {{error}} + +%img.spinner{ src: "/assets/spinning-circles.svg", ng: { show: "loading" } } + +%a.button{ target: '_blank', ng: { click: 'showBulkInvoice()', href: '/admin/orders/invoices/{{invoice_id}}', show: "!loading && !error" } } + = t('js.admin.orders.index.view_file') + diff --git a/app/assets/stylesheets/admin/orders.css.scss b/app/assets/stylesheets/admin/orders.css.scss index 5f53152901..2c0c37e657 100644 --- a/app/assets/stylesheets/admin/orders.css.scss +++ b/app/assets/stylesheets/admin/orders.css.scss @@ -114,3 +114,23 @@ table.index td.actions { } } } + +.bulk-invoice-modal { + text-align: center; + + .modal-title { + margin-bottom: 1.5em; + } + + .message { + margin-bottom: 1em; + } + + .error { + margin-bottom: 1em; + } + + .spinner { + + } +} diff --git a/app/controllers/spree/admin/invoices_controller.rb b/app/controllers/spree/admin/invoices_controller.rb index 05062c8bab..84a0082233 100644 --- a/app/controllers/spree/admin/invoices_controller.rb +++ b/app/controllers/spree/admin/invoices_controller.rb @@ -1,17 +1,43 @@ module Spree module Admin class InvoicesController < Spree::Admin::BaseController + respond_to :json + def create - Delayed::Job.enqueue BulkInvoiceJob.new(params[:order_ids], filename) + Delayed::Job.enqueue BulkInvoiceJob.new(params[:order_ids], directory, filename) render text: filename, status: :ok end + def show + invoice_id = params[:id] + + send_file(filepath(invoice_id), type: 'application/pdf', disposition: :inline) + end + + def poll + invoice_id = params[:invoice_id] + + if File.exist? filepath(invoice_id) + render json: { created: true }, status: :ok + else + render json: { created: false }, status: :unprocessable_entity + end + end + private def filename @filename ||= Time.zone.now.to_i.to_s end + + def directory + 'tmp/invoices' + end + + def filepath(invoice_id) + @filepath ||= "#{directory}/#{invoice_id}.pdf" + end end end end diff --git a/app/jobs/bulk_invoice_job.rb b/app/jobs/bulk_invoice_job.rb index 4859606d77..b2c4745ed1 100644 --- a/app/jobs/bulk_invoice_job.rb +++ b/app/jobs/bulk_invoice_job.rb @@ -1,18 +1,15 @@ -BulkInvoiceJob = Struct.new(:order_ids, :filename) do +class BulkInvoiceJob include WickedPdf::PdfHelper - def perform - generate_pdf - rescue StandardError => e - log e + def initialize(order_ids, directory, filename) + @order_ids = order_ids + @directory = directory + @filename = filename end - private - - def generate_pdf + def perform pdf = CombinePDF.new - orders = Spree::Order.where(id: order_ids) - renderer = ApplicationController.new + orders = Spree::Order.where(id: @order_ids) orders.each do |order| invoice = renderer.render_to_string pdf: "invoice-#{order.number}.pdf", @@ -23,21 +20,21 @@ BulkInvoiceJob = Struct.new(:order_ids, :filename) do pdf << CombinePDF.parse(invoice) end - pdf.save "#{directory}/#{filename}.pdf" + pdf.save "#{file_directory}/#{@filename}.pdf" + end + + private + + def renderer + ApplicationController.new end def invoice_template Spree::Config.invoice_style2? ? "spree/admin/orders/invoice2" : "spree/admin/orders/invoice" end - def log(error) - logger = Logger.new('bulkinvoice.log') - logger.debug e.message - logger.debug e.backtrace[0] - end - - def directory - dir = 'tmp/invoices' + def file_directory + dir = @directory Dir.mkdir(dir) unless File.exist?(dir) dir end diff --git a/app/views/spree/admin/orders/index.html.haml b/app/views/spree/admin/orders/index.html.haml index 559f93eb72..d09afe342a 100644 --- a/app/views/spree/admin/orders/index.html.haml +++ b/app/views/spree/admin/orders/index.html.haml @@ -19,7 +19,7 @@ .row.index-controls{'ng-show' => '!RequestMonitor.loading && orders.length > 0'} = render partial: 'per_page_controls' - %button{'ng-click' => 'bulkInvoice()', 'ng-disabled' => 'selected_orders.length == 0'} + %button.invoices-modal{'ng-click' => 'createBulkInvoice()', 'ng-disabled' => 'selected_orders.length == 0'} = t('.print_invoices') %table#listing_orders.index.responsive{width: "100%", 'ng-init' => 'initialise()', 'ng-show' => "!RequestMonitor.loading && orders.length > 0" } diff --git a/config/locales/en.yml b/config/locales/en.yml index 3f9c2f4b1b..12699b347c 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -2590,6 +2590,10 @@ See the %{link} to find out more about %{sitename}'s features and to start using orders: index: per_page: "%{results} per page" + view_file: View File + compiling_invoices: Compiling Invoices + bulk_invoice_created: Bulk Invoice created + bulk_invoice_failed: Failed to create Bulk Invoice resend_user_email_confirmation: resend: "Resend" sending: "Resend..." diff --git a/config/routes/spree.rb b/config/routes/spree.rb index e3e86455f6..2e9dc0b5c8 100644 --- a/config/routes/spree.rb +++ b/config/routes/spree.rb @@ -76,7 +76,9 @@ Spree::Core::Engine.routes.prepend do get :managed, on: :collection collection do - resources :invoices, only: [:create] + resources :invoices, only: [:create, :show] do + get :poll + end end end end From 6b6a41cfbcace496d2994adbb78ec7988c64bce2 Mon Sep 17 00:00:00 2001 From: Matt-Yorkley <9029026+Matt-Yorkley@users.noreply.github.com> Date: Mon, 19 Nov 2018 23:06:02 +0000 Subject: [PATCH 14/21] Update CSS --- .../admin/orders/directives/invoices_modal.js.coffee | 2 +- .../admin/products/directives/image_modal.js.coffee | 2 +- app/assets/stylesheets/admin/all.scss | 1 - .../simple_modal.css.scss} | 2 +- app/assets/stylesheets/admin/orders.css.scss | 10 +++------- spec/features/admin/bulk_product_update_spec.rb | 8 ++++---- 6 files changed, 10 insertions(+), 15 deletions(-) rename app/assets/stylesheets/admin/{pages/product_image_upload_modal.css.scss => components/simple_modal.css.scss} (87%) diff --git a/app/assets/javascripts/admin/orders/directives/invoices_modal.js.coffee b/app/assets/javascripts/admin/orders/directives/invoices_modal.js.coffee index b774f05b57..0f2eabe778 100644 --- a/app/assets/javascripts/admin/orders/directives/invoices_modal.js.coffee +++ b/app/assets/javascripts/admin/orders/directives/invoices_modal.js.coffee @@ -2,4 +2,4 @@ angular.module("admin.orders").directive "invoicesModal", ($modal) -> restrict: 'C' link: (scope, elem, attrs, ctrl) -> elem.on "click", (ev) => - scope.uploadModal = $modal.open(templateUrl: 'admin/modals/bulk_invoice.html', controller: ctrl, scope: scope, windowClass: 'bulk-invoice-modal') + scope.uploadModal = $modal.open(templateUrl: 'admin/modals/bulk_invoice.html', controller: ctrl, scope: scope, windowClass: 'simple-modal') diff --git a/app/assets/javascripts/admin/products/directives/image_modal.js.coffee b/app/assets/javascripts/admin/products/directives/image_modal.js.coffee index 526c14bf2a..69ca1731fd 100644 --- a/app/assets/javascripts/admin/products/directives/image_modal.js.coffee +++ b/app/assets/javascripts/admin/products/directives/image_modal.js.coffee @@ -2,5 +2,5 @@ angular.module("ofn.admin").directive "imageModal", ($modal, ProductImageService restrict: 'C' link: (scope, elem, attrs, ctrl) -> elem.on "click", (ev) => - scope.uploadModal = $modal.open(templateUrl: 'admin/modals/image_upload.html', controller: ctrl, scope: scope, windowClass: 'product-image-upload') + scope.uploadModal = $modal.open(templateUrl: 'admin/modals/image_upload.html', controller: ctrl, scope: scope, windowClass: 'simple-modal') ProductImageService.configure(scope.product) diff --git a/app/assets/stylesheets/admin/all.scss b/app/assets/stylesheets/admin/all.scss index 637f0b5d2c..4a16154bf4 100644 --- a/app/assets/stylesheets/admin/all.scss +++ b/app/assets/stylesheets/admin/all.scss @@ -17,4 +17,3 @@ @import 'variables'; @import 'components/*'; @import '*'; -@import 'pages/*'; diff --git a/app/assets/stylesheets/admin/pages/product_image_upload_modal.css.scss b/app/assets/stylesheets/admin/components/simple_modal.css.scss similarity index 87% rename from app/assets/stylesheets/admin/pages/product_image_upload_modal.css.scss rename to app/assets/stylesheets/admin/components/simple_modal.css.scss index 4dffade73e..453fe6da4f 100644 --- a/app/assets/stylesheets/admin/pages/product_image_upload_modal.css.scss +++ b/app/assets/stylesheets/admin/components/simple_modal.css.scss @@ -1,6 +1,6 @@ @import '../variables'; -.reveal-modal.product-image-upload { +.reveal-modal.simple-modal { width: 300px; .close-reveal-modal { diff --git a/app/assets/stylesheets/admin/orders.css.scss b/app/assets/stylesheets/admin/orders.css.scss index 2c0c37e657..6355a4499c 100644 --- a/app/assets/stylesheets/admin/orders.css.scss +++ b/app/assets/stylesheets/admin/orders.css.scss @@ -115,22 +115,18 @@ table.index td.actions { } } -.bulk-invoice-modal { +.simple-modal { text-align: center; .modal-title { margin-bottom: 1.5em; } - .message { + .message, .error { margin-bottom: 1em; } .error { - margin-bottom: 1em; - } - - .spinner { - + color: $warning-red; } } diff --git a/spec/features/admin/bulk_product_update_spec.rb b/spec/features/admin/bulk_product_update_spec.rb index 5ea80b6e5e..10edf3ecb8 100644 --- a/spec/features/admin/bulk_product_update_spec.rb +++ b/spec/features/admin/bulk_product_update_spec.rb @@ -759,9 +759,9 @@ feature %q{ end # Shows upload modal - expect(page).to have_selector "div.reveal-modal.product-image-upload" + expect(page).to have_selector "div.reveal-modal" - within "div.reveal-modal.product-image-upload" do + within "div.reveal-modal" do # Shows preview of current image expect(page).to have_css "img.preview" @@ -773,7 +773,7 @@ feature %q{ expect(page).to have_no_css "img.spinner", visible: true end - expect(page).to have_no_selector "div.reveal-modal.product-image-upload" + expect(page).to have_no_selector "div.reveal-modal" within "table#listing_products tr#p_#{product.id}" do # New thumbnail is shown in image column @@ -783,7 +783,7 @@ feature %q{ page.find("a.image-modal").trigger('click') end - expect(page).to have_selector "div.reveal-modal.product-image-upload" + expect(page).to have_selector "div.reveal-modal" end end end From bb814f91effa369c531c92ed47af00570bd259bd Mon Sep 17 00:00:00 2001 From: Matt-Yorkley <9029026+Matt-Yorkley@users.noreply.github.com> Date: Thu, 22 Nov 2018 19:18:15 +0000 Subject: [PATCH 15/21] Extract timeout to named function --- .../controllers/orders_controller.js.coffee | 26 +++++++++---------- 1 file changed, 13 insertions(+), 13 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 729674a8f3..a391950a7b 100644 --- a/app/assets/javascripts/admin/orders/controllers/orders_controller.js.coffee +++ b/app/assets/javascripts/admin/orders/controllers/orders_controller.js.coffee @@ -85,20 +85,20 @@ angular.module("admin.orders").controller "ordersCtrl", ($scope, RequestMonitor, $scope.pollBulkInvoice() $scope.pollBulkInvoice = -> - console.log('Polling... ') + $timeout($scope.nextPoll, 5000) - $timeout(-> - $http.get('/admin/orders/invoices/'+$scope.invoice_id+'/poll').success (data) -> + $scope.nextPoll = -> + $http.get('/admin/orders/invoices/'+$scope.invoice_id+'/poll').success (data) -> + $scope.loading = false + $scope.message = t('js.admin.orders.index.bulk_invoice_created') + + .error (data) -> + $scope.poll++ + + if $scope.poll > 10 $scope.loading = false - $scope.message = t('js.admin.orders.index.bulk_invoice_created') + $scope.error = t('js.admin.orders.index.bulk_invoice_failed') + return - .error (data) -> - $scope.poll++ + $scope.pollBulkInvoice() - if $scope.poll > 10 - $scope.loading = false - $scope.error = t('js.admin.orders.index.bulk_invoice_failed') - return - - $scope.pollBulkInvoice() - , 5000) From 003014daf8ffa542d0f4c87edb46445db00f894c Mon Sep 17 00:00:00 2001 From: Matt-Yorkley <9029026+Matt-Yorkley@users.noreply.github.com> Date: Thu, 22 Nov 2018 19:28:22 +0000 Subject: [PATCH 16/21] Extract invoice methods from ordersCtrl --- .../bulk_invoice_controller.js.coffee | 30 +++++++++++++++++ .../controllers/orders_controller.js.coffee | 32 +------------------ app/views/spree/admin/orders/index.html.haml | 2 +- 3 files changed, 32 insertions(+), 32 deletions(-) create mode 100644 app/assets/javascripts/admin/orders/controllers/bulk_invoice_controller.js.coffee diff --git a/app/assets/javascripts/admin/orders/controllers/bulk_invoice_controller.js.coffee b/app/assets/javascripts/admin/orders/controllers/bulk_invoice_controller.js.coffee new file mode 100644 index 0000000000..177045f1d2 --- /dev/null +++ b/app/assets/javascripts/admin/orders/controllers/bulk_invoice_controller.js.coffee @@ -0,0 +1,30 @@ +angular.module("admin.orders").controller "bulkInvoiceCtrl", ($scope, $http, $timeout) -> + $scope.createBulkInvoice = -> + $scope.invoice_id = null + $scope.poll = 1 + $scope.loading = true + $scope.message = null + $scope.error = null + + $http.post('/admin/orders/invoices', {order_ids: $scope.selected_orders}).success (data) -> + $scope.invoice_id = data + $scope.pollBulkInvoice() + + $scope.pollBulkInvoice = -> + $timeout($scope.nextPoll, 5000) + + $scope.nextPoll = -> + $http.get('/admin/orders/invoices/'+$scope.invoice_id+'/poll').success (data) -> + $scope.loading = false + $scope.message = t('js.admin.orders.index.bulk_invoice_created') + + .error (data) -> + $scope.poll++ + + if $scope.poll > 10 + $scope.loading = false + $scope.error = t('js.admin.orders.index.bulk_invoice_failed') + return + + $scope.pollBulkInvoice() + 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 a391950a7b..7adbba40c3 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, RequestMonitor, Orders, SortOptions, $http, $timeout, $window, $filter) -> +angular.module("admin.orders").controller "ordersCtrl", ($scope, RequestMonitor, Orders, SortOptions, $window, $filter) -> $scope.RequestMonitor = RequestMonitor $scope.pagination = Orders.pagination $scope.orders = Orders.all @@ -72,33 +72,3 @@ angular.module("admin.orders").controller "ordersCtrl", ($scope, RequestMonitor, $scope.changePage = (newPage) -> $scope.page = newPage $scope.fetchResults(newPage) - - $scope.createBulkInvoice = -> - $scope.invoice_id = null - $scope.poll = 1 - $scope.loading = true - $scope.message = null - $scope.error = null - - $http.post('/admin/orders/invoices', {order_ids: $scope.selected_orders}).success (data) -> - $scope.invoice_id = data - $scope.pollBulkInvoice() - - $scope.pollBulkInvoice = -> - $timeout($scope.nextPoll, 5000) - - $scope.nextPoll = -> - $http.get('/admin/orders/invoices/'+$scope.invoice_id+'/poll').success (data) -> - $scope.loading = false - $scope.message = t('js.admin.orders.index.bulk_invoice_created') - - .error (data) -> - $scope.poll++ - - if $scope.poll > 10 - $scope.loading = false - $scope.error = t('js.admin.orders.index.bulk_invoice_failed') - return - - $scope.pollBulkInvoice() - diff --git a/app/views/spree/admin/orders/index.html.haml b/app/views/spree/admin/orders/index.html.haml index d09afe342a..5d98bc4a22 100644 --- a/app/views/spree/admin/orders/index.html.haml +++ b/app/views/spree/admin/orders/index.html.haml @@ -19,7 +19,7 @@ .row.index-controls{'ng-show' => '!RequestMonitor.loading && orders.length > 0'} = render partial: 'per_page_controls' - %button.invoices-modal{'ng-click' => 'createBulkInvoice()', 'ng-disabled' => 'selected_orders.length == 0'} + %button.invoices-modal{'ng-controller' => 'bulkInvoiceCtrl', 'ng-click' => 'createBulkInvoice()', 'ng-disabled' => 'selected_orders.length == 0'} = t('.print_invoices') %table#listing_orders.index.responsive{width: "100%", 'ng-init' => 'initialise()', 'ng-show' => "!RequestMonitor.loading && orders.length > 0" } From 4f9f8adcd6bed2aa2b8ddd499c03ea7c6358a469 Mon Sep 17 00:00:00 2001 From: Matt-Yorkley <9029026+Matt-Yorkley@users.noreply.github.com> Date: Thu, 22 Nov 2018 22:57:05 +0000 Subject: [PATCH 17/21] Add Service and remove Job --- .../spree/admin/invoices_controller.rb | 24 +++-------- .../bulk_invoice_service.rb} | 37 ++++++++++++----- .../spree/admin/invoices_controller_spec.rb | 9 +++-- spec/services/bulk_invoice_service_spec.rb | 40 +++++++++++++++++++ 4 files changed, 78 insertions(+), 32 deletions(-) rename app/{jobs/bulk_invoice_job.rb => services/bulk_invoice_service.rb} (53%) create mode 100644 spec/services/bulk_invoice_service_spec.rb diff --git a/app/controllers/spree/admin/invoices_controller.rb b/app/controllers/spree/admin/invoices_controller.rb index 84a0082233..204f6e80a8 100644 --- a/app/controllers/spree/admin/invoices_controller.rb +++ b/app/controllers/spree/admin/invoices_controller.rb @@ -4,40 +4,28 @@ module Spree respond_to :json def create - Delayed::Job.enqueue BulkInvoiceJob.new(params[:order_ids], directory, filename) + invoice_service = BulkInvoiceService.new + invoice_service.create_bulk_invoice(params[:order_ids]) - render text: filename, status: :ok + render json: invoice_service.id, status: :ok end def show invoice_id = params[:id] + invoice_pdf = BulkInvoiceService.new.filepath(invoice_id) - send_file(filepath(invoice_id), type: 'application/pdf', disposition: :inline) + send_file(invoice_pdf, type: 'application/pdf', disposition: :inline) end def poll invoice_id = params[:invoice_id] - if File.exist? filepath(invoice_id) + if BulkInvoiceService.new.invoice_created? invoice_id render json: { created: true }, status: :ok else render json: { created: false }, status: :unprocessable_entity end end - - private - - def filename - @filename ||= Time.zone.now.to_i.to_s - end - - def directory - 'tmp/invoices' - end - - def filepath(invoice_id) - @filepath ||= "#{directory}/#{invoice_id}.pdf" - end end end end diff --git a/app/jobs/bulk_invoice_job.rb b/app/services/bulk_invoice_service.rb similarity index 53% rename from app/jobs/bulk_invoice_job.rb rename to app/services/bulk_invoice_service.rb index b2c4745ed1..7108a747e5 100644 --- a/app/jobs/bulk_invoice_job.rb +++ b/app/services/bulk_invoice_service.rb @@ -1,15 +1,14 @@ -class BulkInvoiceJob +class BulkInvoiceService include WickedPdf::PdfHelper + attr_reader :id - def initialize(order_ids, directory, filename) - @order_ids = order_ids - @directory = directory - @filename = filename + def initialize + @id = new_invoice_id end - def perform + def create_bulk_invoice(order_ids) pdf = CombinePDF.new - orders = Spree::Order.where(id: @order_ids) + orders = Spree::Order.where(id: order_ids) orders.each do |order| invoice = renderer.render_to_string pdf: "invoice-#{order.number}.pdf", @@ -20,11 +19,28 @@ class BulkInvoiceJob pdf << CombinePDF.parse(invoice) end - pdf.save "#{file_directory}/#{@filename}.pdf" + pdf.save "#{file_directory}/#{@id}.pdf" + end + handle_asynchronously :create_bulk_invoice + + def invoice_created?(invoice_id) + File.exist? filepath(invoice_id) + end + + def filepath(invoice_id) + "#{directory}/#{invoice_id}.pdf" end private + def new_invoice_id + Time.zone.now.to_i.to_s + end + + def directory + 'tmp/invoices' + end + def renderer ApplicationController.new end @@ -34,8 +50,7 @@ class BulkInvoiceJob end def file_directory - dir = @directory - Dir.mkdir(dir) unless File.exist?(dir) - dir + Dir.mkdir(directory) unless File.exist?(directory) + directory end end diff --git a/spec/controllers/spree/admin/invoices_controller_spec.rb b/spec/controllers/spree/admin/invoices_controller_spec.rb index 80cb2f4244..efc2dc5b23 100644 --- a/spec/controllers/spree/admin/invoices_controller_spec.rb +++ b/spec/controllers/spree/admin/invoices_controller_spec.rb @@ -2,16 +2,19 @@ require 'spec_helper' describe Spree::Admin::InvoicesController, type: :controller do let(:order) { create(:order_with_totals_and_distribution) } + let(:user) { create(:admin_user) } before do - controller.stub spree_current_user: create(:admin_user) + allow(controller).to receive(:spree_current_user) { user } end describe "#create" do it "enqueues a job to create a bulk invoice and returns the filename" do expect do spree_post :create, order_ids: [order.id] - end.to enqueue_job BulkInvoiceJob + end.to enqueue_job Delayed::PerformableMethod + + expect(Delayed::Job.last.payload_object.method_name).to eq :create_bulk_invoice_without_delay end end @@ -37,4 +40,4 @@ describe Spree::Admin::InvoicesController, type: :controller do end end end -end \ No newline at end of file +end diff --git a/spec/services/bulk_invoice_service_spec.rb b/spec/services/bulk_invoice_service_spec.rb new file mode 100644 index 0000000000..4611a46846 --- /dev/null +++ b/spec/services/bulk_invoice_service_spec.rb @@ -0,0 +1,40 @@ +require 'spec_helper' + +describe BulkInvoiceService do + let(:service) { BulkInvoiceService.new } + + describe "#start_pdf_job" do + it "starts a background process to create a pdf with multiple invoices" do + expect do + service.start_pdf_job [1, 2] + end.to enqueue_job Delayed::PerformableMethod + + expect(Delayed::Job.last.payload_object.method_name).to eq :start_pdf_job_without_delay + end + end + + describe "#invoice_created?" do + context "when the invoice has been created" do + it "returns true" do + allow(File).to receive(:exist?).and_return(true) + + created = service.invoice_created? '45891723' + expect(created).to be_truthy + end + end + + context "when the invoice has not been created" do + it "returns false" do + created = service.invoice_created? '1234567' + expect(created).to_not be_truthy + end + end + end + + describe "#filepath" do + it "returns the filepath of a given invoice" do + filepath = service.filepath '1234567' + expect(filepath).to eq 'tmp/invoices/1234567.pdf' + end + end +end From 66ac61f591ddf4ac6245ebe7892025cd4306d84b Mon Sep 17 00:00:00 2001 From: Matt-Yorkley <9029026+Matt-Yorkley@users.noreply.github.com> Date: Sun, 25 Nov 2018 18:18:35 +0000 Subject: [PATCH 18/21] Rename background processing method --- app/controllers/spree/admin/invoices_controller.rb | 2 +- app/services/bulk_invoice_service.rb | 4 ++-- spec/controllers/spree/admin/invoices_controller_spec.rb | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/app/controllers/spree/admin/invoices_controller.rb b/app/controllers/spree/admin/invoices_controller.rb index 204f6e80a8..230d01322b 100644 --- a/app/controllers/spree/admin/invoices_controller.rb +++ b/app/controllers/spree/admin/invoices_controller.rb @@ -5,7 +5,7 @@ module Spree def create invoice_service = BulkInvoiceService.new - invoice_service.create_bulk_invoice(params[:order_ids]) + invoice_service.start_pdf_job(params[:order_ids]) render json: invoice_service.id, status: :ok end diff --git a/app/services/bulk_invoice_service.rb b/app/services/bulk_invoice_service.rb index 7108a747e5..397020635e 100644 --- a/app/services/bulk_invoice_service.rb +++ b/app/services/bulk_invoice_service.rb @@ -6,7 +6,7 @@ class BulkInvoiceService @id = new_invoice_id end - def create_bulk_invoice(order_ids) + def start_pdf_job(order_ids) pdf = CombinePDF.new orders = Spree::Order.where(id: order_ids) @@ -21,7 +21,7 @@ class BulkInvoiceService pdf.save "#{file_directory}/#{@id}.pdf" end - handle_asynchronously :create_bulk_invoice + handle_asynchronously :start_pdf_job def invoice_created?(invoice_id) File.exist? filepath(invoice_id) diff --git a/spec/controllers/spree/admin/invoices_controller_spec.rb b/spec/controllers/spree/admin/invoices_controller_spec.rb index efc2dc5b23..1eff65ba2c 100644 --- a/spec/controllers/spree/admin/invoices_controller_spec.rb +++ b/spec/controllers/spree/admin/invoices_controller_spec.rb @@ -14,7 +14,7 @@ describe Spree::Admin::InvoicesController, type: :controller do spree_post :create, order_ids: [order.id] end.to enqueue_job Delayed::PerformableMethod - expect(Delayed::Job.last.payload_object.method_name).to eq :create_bulk_invoice_without_delay + expect(Delayed::Job.last.payload_object.method_name).to eq :start_pdf_job_without_delay end end From 0e478ff501334eddc633cb7384eb087bf51fc2fc Mon Sep 17 00:00:00 2001 From: Matt-Yorkley <9029026+Matt-Yorkley@users.noreply.github.com> Date: Fri, 21 Dec 2018 14:20:26 +0000 Subject: [PATCH 19/21] Increase polling to 150 seconds maximum before showing error message. --- .../admin/orders/controllers/bulk_invoice_controller.js.coffee | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/assets/javascripts/admin/orders/controllers/bulk_invoice_controller.js.coffee b/app/assets/javascripts/admin/orders/controllers/bulk_invoice_controller.js.coffee index 177045f1d2..9c8e5e8286 100644 --- a/app/assets/javascripts/admin/orders/controllers/bulk_invoice_controller.js.coffee +++ b/app/assets/javascripts/admin/orders/controllers/bulk_invoice_controller.js.coffee @@ -21,7 +21,7 @@ angular.module("admin.orders").controller "bulkInvoiceCtrl", ($scope, $http, $ti .error (data) -> $scope.poll++ - if $scope.poll > 10 + if $scope.poll > 30 $scope.loading = false $scope.error = t('js.admin.orders.index.bulk_invoice_failed') return From e624faaacb42e1a993edfff929c941574f733265 Mon Sep 17 00:00:00 2001 From: Matt-Yorkley <9029026+Matt-Yorkley@users.noreply.github.com> Date: Fri, 21 Dec 2018 14:31:04 +0000 Subject: [PATCH 20/21] Add 'please wait' message to bulk invoice modal --- .../templates/admin/modals/bulk_invoice.html.haml | 5 ++--- app/assets/stylesheets/admin/orders.css.scss | 4 ++++ config/locales/en.yml | 1 + 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/app/assets/javascripts/templates/admin/modals/bulk_invoice.html.haml b/app/assets/javascripts/templates/admin/modals/bulk_invoice.html.haml index 5e39dbab23..16ddb39508 100644 --- a/app/assets/javascripts/templates/admin/modals/bulk_invoice.html.haml +++ b/app/assets/javascripts/templates/admin/modals/bulk_invoice.html.haml @@ -1,6 +1,3 @@ -%a.close-reveal-modal{ ng: { click: '$close()' } } - %i.fa.fa-times-circle - %h4.modal-title = t('js.admin.orders.index.compiling_invoices') @@ -10,6 +7,8 @@ {{error}} %img.spinner{ src: "/assets/spinning-circles.svg", ng: { show: "loading" } } +%p{ ng: { show: "loading" } } + = t('js.admin.orders.index.please_wait') %a.button{ target: '_blank', ng: { click: 'showBulkInvoice()', href: '/admin/orders/invoices/{{invoice_id}}', show: "!loading && !error" } } = t('js.admin.orders.index.view_file') diff --git a/app/assets/stylesheets/admin/orders.css.scss b/app/assets/stylesheets/admin/orders.css.scss index 6355a4499c..4858c0685a 100644 --- a/app/assets/stylesheets/admin/orders.css.scss +++ b/app/assets/stylesheets/admin/orders.css.scss @@ -126,6 +126,10 @@ table.index td.actions { margin-bottom: 1em; } + .spinner { + margin-bottom: 1em; + } + .error { color: $warning-red; } diff --git a/config/locales/en.yml b/config/locales/en.yml index 12699b347c..932fb97207 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -2594,6 +2594,7 @@ See the %{link} to find out more about %{sitename}'s features and to start using compiling_invoices: Compiling Invoices bulk_invoice_created: Bulk Invoice created bulk_invoice_failed: Failed to create Bulk Invoice + please_wait: Please wait until the PDF is ready before closing this modal. resend_user_email_confirmation: resend: "Resend" sending: "Resend..." From e7e208061f554a4c2d540f26ea39eb9bbb420443 Mon Sep 17 00:00:00 2001 From: Matt-Yorkley <9029026+Matt-Yorkley@users.noreply.github.com> Date: Fri, 21 Dec 2018 20:01:16 +0000 Subject: [PATCH 21/21] Assign polling numbers to variables and add comments --- .../orders/controllers/bulk_invoice_controller.js.coffee | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/app/assets/javascripts/admin/orders/controllers/bulk_invoice_controller.js.coffee b/app/assets/javascripts/admin/orders/controllers/bulk_invoice_controller.js.coffee index 9c8e5e8286..0442564e2e 100644 --- a/app/assets/javascripts/admin/orders/controllers/bulk_invoice_controller.js.coffee +++ b/app/assets/javascripts/admin/orders/controllers/bulk_invoice_controller.js.coffee @@ -5,13 +5,15 @@ angular.module("admin.orders").controller "bulkInvoiceCtrl", ($scope, $http, $ti $scope.loading = true $scope.message = null $scope.error = null + $scope.poll_wait = 5 # 5 Seconds between each check + $scope.poll_retries = 80 # Maximum checks before stopping $http.post('/admin/orders/invoices', {order_ids: $scope.selected_orders}).success (data) -> $scope.invoice_id = data $scope.pollBulkInvoice() $scope.pollBulkInvoice = -> - $timeout($scope.nextPoll, 5000) + $timeout($scope.nextPoll, $scope.poll_wait * 1000) $scope.nextPoll = -> $http.get('/admin/orders/invoices/'+$scope.invoice_id+'/poll').success (data) -> @@ -21,7 +23,7 @@ angular.module("admin.orders").controller "bulkInvoiceCtrl", ($scope, $http, $ti .error (data) -> $scope.poll++ - if $scope.poll > 30 + if $scope.poll > $scope.poll_retries $scope.loading = false $scope.error = t('js.admin.orders.index.bulk_invoice_failed') return