diff --git a/app/assets/javascripts/admin/order_cycles/directives/schedule_dialog.js.coffee b/app/assets/javascripts/admin/order_cycles/directives/schedule_dialog.js.coffee index 30f033af43..2ff59bd1de 100644 --- a/app/assets/javascripts/admin/order_cycles/directives/schedule_dialog.js.coffee +++ b/app/assets/javascripts/admin/order_cycles/directives/schedule_dialog.js.coffee @@ -31,6 +31,13 @@ angular.module("admin.orderCycles").directive 'scheduleDialog', ($window, $compi if confirm(t('are_you_sure')) Schedules.remove(scope.schedule).$promise.then (data) -> scope.close() + , (response) -> + errors = response.data.errors + if errors? + scope.errors.push errors[0] + else + scope.errors.push "Could not delete schedule: #{scope.schedule.name}" + scope.loadMore = -> scope.showMore().then -> diff --git a/app/assets/javascripts/admin/resources/services/schedules.js.coffee b/app/assets/javascripts/admin/resources/services/schedules.js.coffee index e048639d3f..a4c34a0ce0 100644 --- a/app/assets/javascripts/admin/resources/services/schedules.js.coffee +++ b/app/assets/javascripts/admin/resources/services/schedules.js.coffee @@ -39,12 +39,6 @@ angular.module("admin.resources").factory "Schedules", ($q, $injector, RequestMo orderCycle.schedules.splice(i, 1) for s, i in orderCycle.schedules by -1 when s.id == schedule.id delete @byID[schedule.id] StatusMessage.display 'success', "#{t('admin.order_cycles.index.deleted_schedule')}: '#{schedule.name}'" - , (response) => - errors = response.data.errors - if errors? - InfoDialog.open 'error', errors[0] - else - InfoDialog.open 'error', "Could not delete schedule: #{schedule.name}" index: -> request = ScheduleResource.index (data) => @load(data) diff --git a/app/controllers/admin/schedules_controller.rb b/app/controllers/admin/schedules_controller.rb index dd8fcc8374..889169b0cc 100644 --- a/app/controllers/admin/schedules_controller.rb +++ b/app/controllers/admin/schedules_controller.rb @@ -4,6 +4,7 @@ require 'open_food_network/proxy_order_syncer' module Admin class SchedulesController < ResourceController before_filter :check_editable_order_cycle_ids, only: [:create, :update] + before_filter :check_dependent_subscriptions, only: [:destroy] create.after :sync_subscriptions update.after :sync_subscriptions @@ -49,6 +50,11 @@ module Admin @object.order_cycle_ids = result end + def check_dependent_subscriptions + return if Subscription.where(schedule_id: @schedule).empty? + render json: { errors: [t('admin.schedules.destroy.associated_subscriptions_error')] }, status: :conflict + end + def permissions return @permissions unless @permission.nil? @permissions = OpenFoodNetwork::Permissions.new(spree_current_user) diff --git a/config/locales/en.yml b/config/locales/en.yml index e0b1a924af..4bab4935a1 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -958,6 +958,10 @@ en: why_dont_you_add_one: Why don't you add one? :) no_matching_subscriptions: No matching subscriptions found + schedules: + destroy: + associated_subscriptions_error: This schedule cannot be deleted because it has associated subscriptions + stripe_connect_settings: edit: title: "Stripe Connect" diff --git a/spec/controllers/admin/schedules_controller_spec.rb b/spec/controllers/admin/schedules_controller_spec.rb index 33f20d547e..4758847499 100644 --- a/spec/controllers/admin/schedules_controller_spec.rb +++ b/spec/controllers/admin/schedules_controller_spec.rb @@ -200,8 +200,20 @@ describe Admin::SchedulesController, type: :controller do context "where I manage at least one of the schedule's coordinators" do before { params.merge!(id: coordinated_schedule.id) } - it "allows me to destroy the schedule" do - expect { spree_delete :destroy, params }.to change(Schedule, :count).by(-1) + context "when no dependent subscriptions are present" do + it "allows me to destroy the schedule" do + expect { spree_delete :destroy, params }.to change(Schedule, :count).by(-1) + end + end + + context "when a dependent subscription is present" do + let!(:subscription) { create(:subscription, schedule: coordinated_schedule) } + + it "returns an error message and prevents me from deleting the schedule" do + expect { spree_delete :destroy, params }.to_not change(Schedule, :count) + json_response = JSON.parse(response.body) + expect(json_response["errors"]).to include I18n.t('admin.schedules.destroy.associated_subscriptions_error') + end end end