From 5ec7a10e16b91f204502dca8f563a9e21f56f733 Mon Sep 17 00:00:00 2001 From: Rob H Date: Fri, 21 Feb 2014 14:01:33 +1100 Subject: [PATCH] Add date filter fields to BOM --- .../admin/bulk_order_management.js.coffee | 21 +++++++++++++++- .../admin/bulk_product_update.js.coffee | 19 +------------- .../admin/shared_directives.js.coffee | 18 +++++++++++++ app/assets/stylesheets/admin/orders.css.scss | 2 +- .../admin/orders/bulk_management.html.haml | 13 +++++++++- config/ng-test.conf.js | 1 + .../admin/bulk_order_management_spec.rb | 18 +++++++++++++ .../unit/bulk_order_management_spec.js.coffee | 25 ++++++++++++++++++- 8 files changed, 95 insertions(+), 22 deletions(-) create mode 100644 app/assets/javascripts/admin/shared_directives.js.coffee diff --git a/app/assets/javascripts/admin/bulk_order_management.js.coffee b/app/assets/javascripts/admin/bulk_order_management.js.coffee index 62469d0e2a..9e75a7e18e 100644 --- a/app/assets/javascripts/admin/bulk_order_management.js.coffee +++ b/app/assets/javascripts/admin/bulk_order_management.js.coffee @@ -1,4 +1,4 @@ -orderManagementModule = angular.module("ofn.bulk_order_management", ["ofn.shared_services"]) +orderManagementModule = angular.module("ofn.bulk_order_management", ["ofn.shared_services", "ofn.shared_directives"]) orderManagementModule.config [ "$httpProvider" @@ -67,8 +67,13 @@ orderManagementModule.controller "AdminOrderMgmtCtrl", [ "$scope", "$http", "dataFetcher", "blankEnterprise", "pendingChanges" ($scope, $http, dataFetcher, blankEnterprise, pendingChanges) -> + now = new Date + start = new Date( now.getTime() - ( 7 * (1440 * 60 * 1000) ) - ( now.getTime() % ( 1440 * 60 * 1000 ) - now.getTimezoneOffset() * 60 * 1000 ) ) + end = new Date( now.getTime() - ( now.getTime() % ( 1440 * 60 * 1000 ) - now.getTimezoneOffset() * 60 * 1000 ) + ( 1 * ( 1440 * 60 * 1000 ) ) ) $scope.lineItems = [] $scope.confirmDelete = true + $scope.startDate = formatDate start + $scope.endDate = formatDate end $scope.pendingChanges = pendingChanges $scope.initialise = (spree_api_key) -> @@ -168,3 +173,17 @@ orderManagementModule.factory "switchClass", [ element.removeClass classToAdd , timeout, true) ] + +formatDate = (date) -> + year = date.getFullYear() + month = twoDigitNumber date.getMonth() + 1 + day = twoDigitNumber date.getDate() + hours = twoDigitNumber date.getHours() + mins = twoDigitNumber date.getMinutes() + secs = twoDigitNumber date.getSeconds() + return year + "-" + month + "-" + day + " " + hours + ":" + mins + ":" + secs + +twoDigitNumber = (number) -> + twoDigits = "" + number + twoDigits = ("0" + number) if number < 10 + twoDigits \ No newline at end of file diff --git a/app/assets/javascripts/admin/bulk_product_update.js.coffee b/app/assets/javascripts/admin/bulk_product_update.js.coffee index c6028f21aa..64c52a6cbe 100644 --- a/app/assets/javascripts/admin/bulk_product_update.js.coffee +++ b/app/assets/javascripts/admin/bulk_product_update.js.coffee @@ -1,4 +1,4 @@ -productEditModule = angular.module("ofn.bulk_product_edit", ["ofn.shared_services"]) +productEditModule = angular.module("ofn.bulk_product_edit", ["ofn.shared_services", "ofn.shared_directives"]) productEditModule.config [ "$httpProvider" @@ -78,23 +78,6 @@ productEditModule.directive "ofnToggleColumn", -> scope.column.visible = true element.removeClass "unselected" -productEditModule.directive "datetimepicker", [ - "$parse" - ($parse) -> - return ( - require: "ngModel" - link: (scope, element, attrs, ngModel) -> - element.datetimepicker - dateFormat: "yy-mm-dd" - timeFormat: "HH:mm:ss" - stepMinute: 15 - onSelect: (dateText, inst) -> - scope.$apply (scope) -> - # Fires ngModel.$parsers - ngModel.$setViewValue dateText - ) -] - productEditModule.controller "AdminProductEditCtrl", [ "$scope", "$timeout", "$http", "dataFetcher" diff --git a/app/assets/javascripts/admin/shared_directives.js.coffee b/app/assets/javascripts/admin/shared_directives.js.coffee new file mode 100644 index 0000000000..95eeb30a75 --- /dev/null +++ b/app/assets/javascripts/admin/shared_directives.js.coffee @@ -0,0 +1,18 @@ +sharedDirectivesModule = angular.module("ofn.shared_directives", []) + +sharedDirectivesModule.directive "datetimepicker", [ + "$parse" + ($parse) -> + return ( + require: "ngModel" + link: (scope, element, attrs, ngModel) -> + element.datetimepicker + dateFormat: "yy-mm-dd" + timeFormat: "HH:mm:ss" + stepMinute: 15 + onSelect: (dateText, inst) -> + scope.$apply (scope) -> + # Fires ngModel.$parsers + ngModel.$setViewValue dateText + ) +] \ No newline at end of file diff --git a/app/assets/stylesheets/admin/orders.css.scss b/app/assets/stylesheets/admin/orders.css.scss index 4fb60593bf..a3f33a7c30 100644 --- a/app/assets/stylesheets/admin/orders.css.scss +++ b/app/assets/stylesheets/admin/orders.css.scss @@ -1,4 +1,4 @@ -.filter_select { +.filter_select, .date_filter { margin-bottom: 10px; } diff --git a/app/views/spree/admin/orders/bulk_management.html.haml b/app/views/spree/admin/orders/bulk_management.html.haml index a2cc517420..e5d2f4c926 100644 --- a/app/views/spree/admin/orders/bulk_management.html.haml +++ b/app/views/spree/admin/orders/bulk_management.html.haml @@ -15,7 +15,18 @@ Hub %br %select.select2{ :class => "four columns alpha", :id => 'distributor_filter', 'ng-model' => 'distributorFilter', 'ng-options' => 'd.name for d in distributors'} - + .spacer{ :class => "one column alpha" } +   + .date_filters{ :class => "four columns alpha" } + .date_filter{ :class => "four columns alpha" } + Start Date + %br + %input{ :class => "four columns alpha", :type => "text", :id => 'start_date_filter', 'ng-model' => 'startDate', 'datetimepicker' => "startDate" } + .date_filter{ :class => "four columns alpha" } + End Date + %br + %input{ :class => "four columns alpha", :type => "text", :id => 'end_date_filter', 'ng-model' => 'endDate', 'datetimepicker' => "endDate" } + %hr{ :class => "sixteen columns alpha", :style => "margin-bottom: 15px" } %table.index#listing_orders.bulk %thead %tr diff --git a/config/ng-test.conf.js b/config/ng-test.conf.js index b2535a6bd1..47c41afd67 100644 --- a/config/ng-test.conf.js +++ b/config/ng-test.conf.js @@ -10,6 +10,7 @@ module.exports = function(config) { 'app/assets/javascripts/shared/angular-*.js', 'app/assets/javascripts/shared/jquery.timeago.js', + 'app/assets/javascripts/admin/shared_directives.js.coffee', 'app/assets/javascripts/admin/shared_services.js.coffee', 'app/assets/javascripts/admin/order_cycle.js.erb.coffee', 'app/assets/javascripts/admin/bulk_order_management.js.coffee', diff --git a/spec/features/admin/bulk_order_management_spec.rb b/spec/features/admin/bulk_order_management_spec.rb index 1f5125745e..4defb90403 100644 --- a/spec/features/admin/bulk_order_management_spec.rb +++ b/spec/features/admin/bulk_order_management_spec.rb @@ -203,6 +203,24 @@ feature %q{ end end + context "using date restriction controls" do + let!(:o1) { FactoryGirl.create(:order, state: 'complete', completed_at: Time.now ) } + let!(:o2) { FactoryGirl.create(:order, state: 'complete', completed_at: Time.now ) } + let!(:li1) { FactoryGirl.create(:line_item, order: o1 ) } + let!(:li2) { FactoryGirl.create(:line_item, order: o2 ) } + + before :each do + visit '/admin/orders/bulk_management' + end + + it "displays date fields for filtering orders, with default values set" do + one_week_ago = (Date.today - 7).strftime("%F %T") + tonight = Date.tomorrow.strftime("%F %T") + page.should have_field "start_date_filter", with: one_week_ago + page.should have_field "end_date_filter", with: tonight + end + end + context "using action buttons" do context "using delete buttons" do let!(:o1) { FactoryGirl.create(:order, state: 'complete', completed_at: Time.now ) } diff --git a/spec/javascripts/unit/bulk_order_management_spec.js.coffee b/spec/javascripts/unit/bulk_order_management_spec.js.coffee index 54cf386d78..446692595a 100644 --- a/spec/javascripts/unit/bulk_order_management_spec.js.coffee +++ b/spec/javascripts/unit/bulk_order_management_spec.js.coffee @@ -371,4 +371,27 @@ describe "switchClass service", -> it "sets up a new timeout if 'timeout' parameter is an integer", -> switchClassService elementMock, "class1", ["class2"], 1000 expect(timeoutMock).toHaveBeenCalled() - expect(elementMock.timeout).toEqual "new timeout" \ No newline at end of file + expect(elementMock.timeout).toEqual "new timeout" + +describe "Auxiliary functions", -> + describe "getting a zero filled two digit number", -> + it "returns the number as a string if its value is greater than or equal to 10", -> + expect(twoDigitNumber(10)).toEqual "10" + expect(twoDigitNumber(15)).toEqual "15" + expect(twoDigitNumber(99)).toEqual "99" + + it "returns the number formatted as a zero filled string if its value is less than 10", -> + expect(twoDigitNumber(0)).toEqual "00" + expect(twoDigitNumber(1)).toEqual "01" + expect(twoDigitNumber(9)).toEqual "09" + + describe "formatting a date", -> + it "returns a date formatted as yyyy-mm-dd hh-MM:ss", -> + date = new Date + date.setYear(2010) + date.setMonth(5) # Zero indexed, so 5 is June + date.setDate(15) + date.setHours(5) + date.setMinutes(10) + date.setSeconds(30) + expect(formatDate(date)).toEqual "2010-06-15 05:10:30" \ No newline at end of file