diff --git a/app/assets/javascripts/admin/orders/controllers/bulk_cancel_controller.js.coffee b/app/assets/javascripts/admin/orders/controllers/bulk_cancel_controller.js.coffee new file mode 100644 index 0000000000..059f378e5d --- /dev/null +++ b/app/assets/javascripts/admin/orders/controllers/bulk_cancel_controller.js.coffee @@ -0,0 +1,14 @@ +angular.module("admin.orders").controller "bulkCancelCtrl", ($scope, $http, $timeout) -> + + $scope.cancelOrder = (orderIds, sendEmailCancellation, restock_items) -> + $http( + method: 'post' + url: "/admin/orders/bulk_cancel?order_ids=#{orderIds}&send_cancellation_email=#{sendEmailCancellation}&restock_items=#{restock_items}" ).then(-> + window.location.reload() + ) + + $scope.cancelSelectedOrders = -> + ofnCancelOrderAlert((confirm, sendEmailCancellation, restock_items) -> + if confirm + $scope.cancelOrder $scope.selected_orders, sendEmailCancellation, restock_items + ) diff --git a/app/controllers/spree/admin/orders_controller.rb b/app/controllers/spree/admin/orders_controller.rb index c7bd070146..2b686763be 100644 --- a/app/controllers/spree/admin/orders_controller.rb +++ b/app/controllers/spree/admin/orders_controller.rb @@ -67,6 +67,18 @@ module Spree load_spree_api_key end + def bulk_cancel + order_ids = params[:order_ids].split(',') + + Spree::Order.where(id: order_ids).find_each do |order| + order.send_cancellation_email = params[:send_cancellation_email] != "false" + order.restock_items = params.fetch(:restock_items, "true") == "true" + order.cancel + end + + flash[:success] = Spree.t(:order_updated) + end + def fire event = params[:e] @order.send_cancellation_email = params[:send_cancellation_email] != "false" diff --git a/app/models/spree/ability.rb b/app/models/spree/ability.rb index 63857559cd..0eee0d8935 100644 --- a/app/models/spree/ability.rb +++ b/app/models/spree/ability.rb @@ -99,7 +99,7 @@ module Spree item.order.changes_allowed? end - can [:cancel], Spree::Order do |order| + can [:cancel, :bulk_cancel], Spree::Order do |order| order.user == user end diff --git a/app/views/spree/admin/orders/index.html.haml b/app/views/spree/admin/orders/index.html.haml index d15694ced2..a12de2d13e 100644 --- a/app/views/spree/admin/orders/index.html.haml +++ b/app/views/spree/admin/orders/index.html.haml @@ -33,6 +33,9 @@ %div.menu_item %span.name.invoices-modal{'ng-controller' => 'bulkInvoiceCtrl', 'ng-click' => 'createBulkInvoice()' } = t('.print_invoices') + %div.menu_item + %span.name{'ng-controller' => 'bulkCancelCtrl', 'ng-click' => 'cancelSelectedOrders()' } + = t('.cancel_orders') = render partial: 'per_page_controls', locals: { position: "right" } @@ -43,7 +46,7 @@ %thead %tr %th - %input{type: 'checkbox', 'ng-change' => 'toggleAll()', 'ng-model' => 'select_all'} + %input#selectAll{type: 'checkbox', 'ng-change' => 'toggleAll()', 'ng-model' => 'select_all'} %th = t(:products_distributor) %th @@ -113,3 +116,5 @@ .no-objects-found{'ng-show' => "!RequestMonitor.loading && orders.length == 0"} = t('.no_orders_found') + += render 'spree/admin/shared/custom-confirm' diff --git a/config/locales/en.yml b/config/locales/en.yml index 63e4d3f830..f754daf8b9 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -3810,6 +3810,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}." print_invoices: "Print Invoices" + cancel_orders: "Cancel Orders" selected: zero: "No order selected" one: "1 order selected" diff --git a/config/routes/spree.rb b/config/routes/spree.rb index 2a02783eb5..df57d57bfa 100644 --- a/config/routes/spree.rb +++ b/config/routes/spree.rb @@ -31,6 +31,7 @@ Spree::Core::Engine.routes.draw do end resource :account, :controller => 'users' + match '/admin/orders/bulk_cancel' => 'admin/orders#bulk_cancel', :as => "admin_bulk_cancel", via: :post match '/admin/orders/bulk_management' => 'admin/orders#bulk_management', :as => "admin_bulk_order_management", via: :get match '/admin/payment_methods/show_provider_preferences' => 'admin/payment_methods#show_provider_preferences', :via => :get diff --git a/spec/system/admin/bulk_order_cancellation_spec.rb b/spec/system/admin/bulk_order_cancellation_spec.rb new file mode 100644 index 0000000000..de9489b72b --- /dev/null +++ b/spec/system/admin/bulk_order_cancellation_spec.rb @@ -0,0 +1,43 @@ +# frozen_string_literal: true + +require 'system_helper' + +describe ' + As an Administrator + I want to be able to delete orders in bulk +' do + include AdminHelper + include AuthenticationHelper + include WebHelper + + context "deleting orders" do + let!(:o1) { + create(:order_with_distributor, state: 'complete', shipment_state: 'ready', + completed_at: Time.zone.now ) + } + let!(:o2) { + create(:order_with_distributor, state: 'complete', shipment_state: 'ready', + completed_at: Time.zone.now ) + } + + before :each do + login_as_admin_and_visit spree.admin_orders_path + end + + it "deletes orders" do + # Verify that the orders have a STATE of COMPLETE + expect(page).to have_selector('span', text: 'COMPLETE', count: 2) + + page.check('selectAll') + page.find('.ofn-drop-down').click + page.find('.menu').find('span', text: 'Cancel Orders').click + + within '.modal' do + click_on "OK" + end + + # Verify that the orders have a STATE of CANCELLED + expect(page).to have_selector('span', text: 'CANCELLED', count: 2) + end + end +end