From fe9f147ff0f4c500576ca0eea4954ba6c7a4cc6c Mon Sep 17 00:00:00 2001 From: Rob Harrington Date: Sun, 26 Jun 2016 17:35:27 +1000 Subject: [PATCH] Adding ability to filter OC index by OC name or 'involved' enterprise --- .../order_cycles_controller.js.coffee | 8 ++-- .../order_cycles/filters/involving.js.coffee | 6 +++ .../admin/order_cycles/_filters.html.haml | 14 ++++++ app/views/admin/order_cycles/_row.html.haml | 2 +- app/views/admin/order_cycles/index.html.haml | 23 ++++++---- config/locales/en.yml | 2 + spec/features/admin/order_cycles_spec.rb | 46 +++++++++++++++---- 7 files changed, 78 insertions(+), 23 deletions(-) create mode 100644 app/assets/javascripts/admin/order_cycles/filters/involving.js.coffee create mode 100644 app/views/admin/order_cycles/_filters.html.haml diff --git a/app/assets/javascripts/admin/order_cycles/controllers/order_cycles_controller.js.coffee b/app/assets/javascripts/admin/order_cycles/controllers/order_cycles_controller.js.coffee index 89b619f17d..c286f717a8 100644 --- a/app/assets/javascripts/admin/order_cycles/controllers/order_cycles_controller.js.coffee +++ b/app/assets/javascripts/admin/order_cycles/controllers/order_cycles_controller.js.coffee @@ -2,15 +2,17 @@ angular.module("admin.orderCycles").controller "OrderCyclesCtrl", ($scope, $q, S $scope.RequestMonitor = RequestMonitor $scope.saveAll = -> OrderCycles.saveChanges($scope.order_cycles_form) $scope.ordersCloseAtLimit = -31 # days + $scope.involvingFilter = 0 compileDataFor = (orderCycles) -> for orderCycle in orderCycles OrderCycles.linkToEnterprises(orderCycle) - orderCycle.producerNames = orderCycle.producers.map((producer) -> producer.name).join(", ") - orderCycle.shopNames = orderCycle.shops.map((shop) -> shop.name).join(", ") + orderCycle.involvedEnterpriseIDs = [orderCycle.coordinator.id] + orderCycle.producerNames = orderCycle.producers.map((producer) -> orderCycle.involvedEnterpriseIDs.push(producer.id); producer.name).join(", ") + orderCycle.shopNames = orderCycle.shops.map((shop) -> orderCycle.involvedEnterpriseIDs.push(shop.id); shop.name).join(", ") # NOTE: this is using the Enterprises service from the admin.enterprises module - RequestMonitor.load ($scope.enterprises = Enterprises.index(includeBlank: true, action: "visible", ams_prefix: "basic")).$promise + RequestMonitor.load ($scope.enterprises = Enterprises.index(action: "visible", ams_prefix: "basic")).$promise RequestMonitor.load ($scope.orderCycles = OrderCycles.index(ams_prefix: "index", "q[orders_close_at_gt]": "#{daysFromToday($scope.ordersCloseAtLimit)}")).$promise RequestMonitor.load $q.all([$scope.enterprises.$promise, $scope.orderCycles.$promise]).then -> compileDataFor($scope.orderCycles) diff --git a/app/assets/javascripts/admin/order_cycles/filters/involving.js.coffee b/app/assets/javascripts/admin/order_cycles/filters/involving.js.coffee new file mode 100644 index 0000000000..c03f19e6db --- /dev/null +++ b/app/assets/javascripts/admin/order_cycles/filters/involving.js.coffee @@ -0,0 +1,6 @@ +angular.module("admin.orderCycles").filter "involving", ($filter) -> + return (orderCycles, enterpriseID) -> + return orderCycles if enterpriseID == 0 + $filter('filter')(orderCycles, (orderCycle) -> + enterpriseID in orderCycle.involvedEnterpriseIDs + ) diff --git a/app/views/admin/order_cycles/_filters.html.haml b/app/views/admin/order_cycles/_filters.html.haml new file mode 100644 index 0000000000..73d7cea600 --- /dev/null +++ b/app/views/admin/order_cycles/_filters.html.haml @@ -0,0 +1,14 @@ +.filters.sixteen.columns.alpha.omega + .filter.four.columns.alpha + %label{ :for => 'query' }=t('admin.quick_search') + %br + %input.fullwidth{ :type => "text", :id => 'query', ng: { model: 'query' }, placeholder: "Search by Order Cycle name..." } + .filter_select.four.columns + %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' } } + .six.columns   + .filter_clear.two.columns.omega + %label{ :for => 'clear_all_filters' } + %br + %input.red.fullwidth{ :type => 'button', :id => 'clear_all_filters', :value => "#{t('admin.clear_all')}", ng: { click: "resetSelectFilters()" } } diff --git a/app/views/admin/order_cycles/_row.html.haml b/app/views/admin/order_cycles/_row.html.haml index 610faa4407..50e6720346 100644 --- a/app/views/admin/order_cycles/_row.html.haml +++ b/app/views/admin/order_cycles/_row.html.haml @@ -1,4 +1,4 @@ -%tr{ class: "order-cycle-{{orderCycle.id}} {{orderCycle.status}}", ng: { repeat: 'orderCycle in orderCycles track by orderCycle.id' } } +%tr{ class: "order-cycle-{{orderCycle.id}} {{orderCycle.status}}", ng: { repeat: 'orderCycle in orderCycles | involving:involvingFilter | filter:{name: query} track by orderCycle.id' } } %td %a{ ng: { href: '{{orderCycle.edit_path}}' } } {{ orderCycle.name }} diff --git a/app/views/admin/order_cycles/index.html.haml b/app/views/admin/order_cycles/index.html.haml index d8fa8ecd0b..a581b4d8c1 100644 --- a/app/views/admin/order_cycles/index.html.haml +++ b/app/views/admin/order_cycles/index.html.haml @@ -1,17 +1,22 @@ = content_for :page_title do = t :admin_order_cycles +- content_for :app_wrapper_attrs do + = "ng-app='admin.orderCycles'" + = content_for :page_actions do %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' +%div{ ng: { controller: 'OrderCyclesCtrl' } } + = render 'admin/order_cycles/filters' -%form{ name: 'order_cycles_form', ng: { app: "admin.orderCycles", controller: 'OrderCyclesCtrl' } } - %save-bar{ dirty: "order_cycles_form.$dirty", persist: "false" } - %input.red{ type: "button", value: t(:save_changes), ng: { click: "saveAll()", disabled: "!order_cycles_form.$dirty" } } - %table.index#listing_order_cycles{ ng: { show: 'orderCycles.length > 0' } } - = render 'admin/order_cycles/header' #, simple_index: simple_index - %tbody - = render 'admin/order_cycles/row' #, simple_index: simple_index - = render 'admin/order_cycles/loading_flash' - = render 'admin/order_cycles/show_more' + %form{ name: 'order_cycles_form' } + %save-bar{ dirty: "order_cycles_form.$dirty", persist: "false" } + %input.red{ type: "button", value: t(:save_changes), ng: { click: "saveAll()", disabled: "!order_cycles_form.$dirty" } } + %table.index#listing_order_cycles{ ng: { show: 'orderCycles.length > 0' } } + = render 'admin/order_cycles/header' #, simple_index: simple_index + %tbody + = render 'admin/order_cycles/row' #, simple_index: simple_index + = render 'admin/order_cycles/loading_flash' + = render 'admin/order_cycles/show_more' diff --git a/config/locales/en.yml b/config/locales/en.yml index 854735185b..5fbe2469ac 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -674,6 +674,8 @@ en: add_a_tag: Add a tag delivery_details: Pickup / Delivery details debug_info: Debug information + index: + involving: Involving name_and_timing_form: name: Name orders_open: Orders open at diff --git a/spec/features/admin/order_cycles_spec.rb b/spec/features/admin/order_cycles_spec.rb index 29bb04d253..a7def5705b 100644 --- a/spec/features/admin/order_cycles_spec.rb +++ b/spec/features/admin/order_cycles_spec.rb @@ -7,21 +7,21 @@ feature %q{ include AuthenticationWorkflow include WebHelper - scenario "listing order cycles" do + scenario "listing and filtering order cycles" do # Given some order cycles (created in an arbitrary order) - oc4 = create(:simple_order_cycle, name: '4', + oc4 = create(:simple_order_cycle, name: 'oc4', orders_open_at: 2.day.from_now, orders_close_at: 1.month.from_now) - oc2 = create(:simple_order_cycle, name: '2', orders_close_at: 1.month.from_now) - oc6 = create(:simple_order_cycle, name: '6', + oc2 = create(:simple_order_cycle, name: 'oc2', orders_close_at: 1.month.from_now) + oc6 = create(:simple_order_cycle, name: 'oc6', orders_open_at: 1.month.ago, orders_close_at: 3.weeks.ago) - oc3 = create(:simple_order_cycle, name: '3', + oc3 = create(:simple_order_cycle, name: 'oc3', orders_open_at: 1.day.from_now, orders_close_at: 1.month.from_now) - oc5 = create(:simple_order_cycle, name: '5', + oc5 = create(:simple_order_cycle, name: 'oc5', orders_open_at: 1.month.ago, orders_close_at: 2.weeks.ago) - oc1 = create(:order_cycle, name: '1') - oc0 = create(:simple_order_cycle, name: '0', + oc1 = create(:order_cycle, name: 'oc1') + oc0 = create(:simple_order_cycle, name: 'oc0', orders_open_at: nil, orders_close_at: nil) - oc7 = create(:simple_order_cycle, name: '0', + oc7 = create(:simple_order_cycle, name: 'oc7', orders_open_at: 2.months.ago, orders_close_at: 5.weeks.ago) # When I go to the admin order cycles page @@ -31,7 +31,7 @@ feature %q{ # Then the order cycles should be ordered correctly expect(page).to have_selector "#listing_order_cycles tr td:first-child", count: 7 page.all('#listing_order_cycles tr td:first-child').map(&:text).should == - ['0', '1', '2', '3', '4', '5', '6'] + ['oc0', 'oc1', 'oc2', 'oc3', 'oc4', 'oc5', 'oc6'] # And the rows should have the correct classes page.should have_selector "#listing_order_cycles tr.order-cycle-#{oc0.id}.undated" @@ -63,6 +63,32 @@ feature %q{ page.should have_no_selector "#listing_order_cycles tr.order-cycle-#{oc7.id}" click_button "Show 30 more days" page.should have_selector "#listing_order_cycles tr.order-cycle-#{oc7.id}" + + # I can filter order cycles by name + page.should have_selector "#listing_order_cycles tr.order-cycle-#{oc0.id}" + page.should have_selector "#listing_order_cycles tr.order-cycle-#{oc1.id}" + page.should have_selector "#listing_order_cycles tr.order-cycle-#{oc2.id}" + select2_select oc1.suppliers.first.name, from: "involving_filter" + page.should have_no_selector "#listing_order_cycles tr.order-cycle-#{oc0.id}" + page.should have_selector "#listing_order_cycles tr.order-cycle-#{oc1.id}" + page.should have_no_selector "#listing_order_cycles tr.order-cycle-#{oc2.id}" + select2_select "Any Enterprise", from: "involving_filter" + page.should have_selector "#listing_order_cycles tr.order-cycle-#{oc0.id}" + page.should have_selector "#listing_order_cycles tr.order-cycle-#{oc1.id}" + page.should have_selector "#listing_order_cycles tr.order-cycle-#{oc2.id}" + + # I can filter order cycle by involved enterprises + page.should have_selector "#listing_order_cycles tr.order-cycle-#{oc0.id}" + page.should have_selector "#listing_order_cycles tr.order-cycle-#{oc1.id}" + page.should have_selector "#listing_order_cycles tr.order-cycle-#{oc2.id}" + fill_in "query", with: oc0.name + page.should have_selector "#listing_order_cycles tr.order-cycle-#{oc0.id}" + page.should have_no_selector "#listing_order_cycles tr.order-cycle-#{oc1.id}" + page.should have_no_selector "#listing_order_cycles tr.order-cycle-#{oc2.id}" + fill_in "query", with: '' + page.should have_selector "#listing_order_cycles tr.order-cycle-#{oc0.id}" + page.should have_selector "#listing_order_cycles tr.order-cycle-#{oc1.id}" + page.should have_selector "#listing_order_cycles tr.order-cycle-#{oc2.id}" end describe 'listing order cycles with other locales' do