From 25639a822a29cdd35029c9ab4c1cd91e529d7ded Mon Sep 17 00:00:00 2001 From: Rob Harrington Date: Thu, 15 Dec 2016 16:02:48 +1100 Subject: [PATCH] Implementing standing order feature toggle on back-end interface --- app/helpers/enterprises_helper.rb | 4 +++ app/models/column_preference.rb | 8 +++++ .../admin/order_cycles/_filters.html.haml | 13 ++++---- .../_name_and_timing_form.html.haml | 30 ++++++++++--------- app/views/admin/order_cycles/index.html.haml | 7 +++-- .../admin/shared/_order_sub_menu.html.erb | 4 ++- spec/features/admin/order_cycles_spec.rb | 2 ++ spec/features/admin/schedules_spec.rb | 6 ++-- spec/features/admin/standing_orders_spec.rb | 6 ++-- 9 files changed, 51 insertions(+), 29 deletions(-) diff --git a/app/helpers/enterprises_helper.rb b/app/helpers/enterprises_helper.rb index 7d4591da90..e93debeff4 100644 --- a/app/helpers/enterprises_helper.rb +++ b/app/helpers/enterprises_helper.rb @@ -101,4 +101,8 @@ module EnterprisesHelper def show_bought_items? order_changes_allowed? && current_order.finalised_line_items.present? end + + def standing_orders_enabled? + spree_current_user.admin? || spree_current_user.enterprises.where(enable_standing_orders: true).any? + end end diff --git a/app/models/column_preference.rb b/app/models/column_preference.rb index 09ad0e55a4..189efb5ec0 100644 --- a/app/models/column_preference.rb +++ b/app/models/column_preference.rb @@ -21,6 +21,7 @@ class ColumnPreference < ActiveRecord::Base def self.for(user, action_name) stored_preferences = where(user_id: user.id, action_name: action_name) default_preferences = send("#{action_name}_columns") + filter(default_preferences, user, action_name) default_preferences.each_with_object([]) do |(column_name, default_attributes), preferences| stored_preference = stored_preferences.find_by_column_name(column_name) if stored_preference @@ -43,4 +44,11 @@ class ColumnPreference < ActiveRecord::Base OpenFoodNetwork::ColumnPreferenceDefaults.private_instance_methods .select{|m| m.to_s.end_with?("_columns")}.map{ |m| m.to_s.sub /_columns$/, ''} end + + # Arbitrary filtering of default_preferences + def self.filter(default_preferences, user, action_name) + if action_name == 'order_cycles_index' + default_preferences.delete(:schedules) unless user.admin? || user.enterprises.where(enable_standing_orders: true).any? + end + end end diff --git a/app/views/admin/order_cycles/_filters.html.haml b/app/views/admin/order_cycles/_filters.html.haml index b353e60a8c..a6999f38ff 100644 --- a/app/views/admin/order_cycles/_filters.html.haml +++ b/app/views/admin/order_cycles/_filters.html.haml @@ -7,11 +7,14 @@ %label{ :for => 'involving_filter' }=t('.involving') %br %input.ofn-select2.fullwidth{ :id => 'involving_filter', type: 'number', blank: "{id: 0, name: 'Any Enterprise'}", data: 'enterprises', ng: { model: 'involvingFilter' } } - .filter_select.four.columns - %label{ :for => 'schedule_filter' }=t('admin.order_cycles.index.schedule') - %br - %input.ofn-select2.fullwidth{ :id => 'schedule_filter', type: 'number', blank: "{id: 0, name: 'Any Schedule'}", data: 'schedules', ng: { model: 'scheduleFilter' } } - .two.columns   + - if standing_orders_enabled? + .filter_select.four.columns + %label{ :for => 'schedule_filter' }=t('admin.order_cycles.index.schedule') + %br + %input.ofn-select2.fullwidth{ :id => 'schedule_filter', type: 'number', blank: "{id: 0, name: 'Any Schedule'}", data: 'schedules', ng: { model: 'scheduleFilter' } } + .two.columns   + - else + .six.columns   .filter_clear.two.columns.omega %label{ :for => 'clear_all_filters' } %br diff --git a/app/views/admin/order_cycles/_name_and_timing_form.html.haml b/app/views/admin/order_cycles/_name_and_timing_form.html.haml index 75b983aae0..ed3935dfb3 100644 --- a/app/views/admin/order_cycles/_name_and_timing_form.html.haml +++ b/app/views/admin/order_cycles/_name_and_timing_form.html.haml @@ -27,17 +27,19 @@ - else {{ order_cycle.orders_close_at }} -.row - .two.columns.alpha - = f.label :schedule_ids, t('admin.order_cycles.schedules') - .twelve.columns - - if viewing_as_coordinator_of?(@order_cycle) - %input.fullwidth.ofn-select2#schedule_ids{ name: 'order_cycle[schedule_ids]', - data: 'schedules', - multiple: 'true', - filter: '{viewing_as_coordinator: true}', - ng: { model: 'order_cycle.schedule_ids' } } - - else - %schedule-list{ 'order-cycle' => 'order_cycle' } - .two.columns.omega -   + +- if standing_orders_enabled? + .row + .two.columns.alpha + = f.label :schedule_ids, t('admin.order_cycles.schedules') + .twelve.columns + - if viewing_as_coordinator_of?(@order_cycle) + %input.fullwidth.ofn-select2#schedule_ids{ name: 'order_cycle[schedule_ids]', + data: 'schedules', + multiple: 'true', + filter: '{viewing_as_coordinator: true}', + ng: { model: 'order_cycle.schedule_ids' } } + - else + %schedule-list{ 'order-cycle' => 'order_cycle' } + .two.columns.omega +   diff --git a/app/views/admin/order_cycles/index.html.haml b/app/views/admin/order_cycles/index.html.haml index c43d41d3fe..87d766762e 100644 --- a/app/views/admin/order_cycles/index.html.haml +++ b/app/views/admin/order_cycles/index.html.haml @@ -5,9 +5,10 @@ = "ng-app='admin.orderCycles'" = content_for :page_actions do - %li - %a.button.icon-plus#new-schedule{ "schedule-dialog" => true } - = t('admin.order_cycles.index.new_schedule') + - if standing_orders_enabled? + %li + %a.button.icon-plus#new-schedule{ "schedule-dialog" => true } + = t('admin.order_cycles.index.new_schedule') %li#new_order_cycle_link = button_link_to t(:new_order_cycle), main_app.new_admin_order_cycle_path, icon: 'icon-plus', id: 'admin_new_order_cycle_link' diff --git a/app/views/spree/admin/shared/_order_sub_menu.html.erb b/app/views/spree/admin/shared/_order_sub_menu.html.erb index e9039a0109..effb489551 100644 --- a/app/views/spree/admin/shared/_order_sub_menu.html.erb +++ b/app/views/spree/admin/shared/_order_sub_menu.html.erb @@ -2,6 +2,8 @@ <% end %> diff --git a/spec/features/admin/order_cycles_spec.rb b/spec/features/admin/order_cycles_spec.rb index 0aaaf09cf8..a93d3b3644 100644 --- a/spec/features/admin/order_cycles_spec.rb +++ b/spec/features/admin/order_cycles_spec.rb @@ -702,6 +702,7 @@ feature %q{ end scenario "creating a new order cycle" do + distributor_managed.update_attribute(:enable_standing_orders, true) # Make the page long enough to avoid the save bar overlaying the form page.driver.resize(1280, 2000) @@ -795,6 +796,7 @@ feature %q{ scenario "editing an order cycle" do oc = create(:simple_order_cycle, { suppliers: [supplier_managed, supplier_permitted, supplier_unmanaged], coordinator: distributor_managed, distributors: [distributor_managed, distributor_permitted, distributor_unmanaged], name: 'Order Cycle 1' } ) + distributor_managed.update_attribute(:enable_standing_orders, true) visit edit_admin_order_cycle_path(oc) diff --git a/spec/features/admin/schedules_spec.rb b/spec/features/admin/schedules_spec.rb index 1b45ad45d1..85bfb47910 100644 --- a/spec/features/admin/schedules_spec.rb +++ b/spec/features/admin/schedules_spec.rb @@ -6,9 +6,9 @@ feature 'Schedules', js: true do context "as an enterprise user" do let(:user) { create(:user, enterprise_limit: 10) } - let(:managed_enterprise) { create(:distributor_enterprise, owner: user) } - let(:unmanaged_enterprise) { create(:distributor_enterprise) } - let(:managed_enterprise2) { create(:distributor_enterprise, owner: user) } + let(:managed_enterprise) { create(:distributor_enterprise, owner: user, enable_standing_orders: true) } + let(:unmanaged_enterprise) { create(:distributor_enterprise, enable_standing_orders: true) } + let(:managed_enterprise2) { create(:distributor_enterprise, owner: user, enable_standing_orders: true) } let!(:oc1) { create(:simple_order_cycle, coordinator: managed_enterprise, name: 'oc1') } let!(:oc2) { create(:simple_order_cycle, coordinator: managed_enterprise, name: 'oc2') } let!(:oc3) { create(:simple_order_cycle, coordinator: managed_enterprise, name: 'oc3') } diff --git a/spec/features/admin/standing_orders_spec.rb b/spec/features/admin/standing_orders_spec.rb index a53fa9f5e8..3a80d87d90 100644 --- a/spec/features/admin/standing_orders_spec.rb +++ b/spec/features/admin/standing_orders_spec.rb @@ -6,9 +6,9 @@ feature 'Standing Orders' do context "as an enterprise user", js: true do let!(:user) { create_enterprise_user(enterprise_limit: 10) } - let!(:shop) { create(:distributor_enterprise, owner: user) } - let!(:shop2) { create(:distributor_enterprise, owner: user) } - let!(:shop_unmanaged) { create(:distributor_enterprise) } + let!(:shop) { create(:distributor_enterprise, owner: user, enable_standing_orders: true) } + let!(:shop2) { create(:distributor_enterprise, owner: user, enable_standing_orders: true) } + let!(:shop_unmanaged) { create(:distributor_enterprise, enable_standing_orders: true) } before { quick_login_as user }