diff --git a/app/assets/javascripts/admin/order_cycles/controllers/create.js.coffee b/app/assets/javascripts/admin/order_cycles/controllers/create.js.coffee index f5bc6aeb4d..d4e1a2beb1 100644 --- a/app/assets/javascripts/admin/order_cycles/controllers/create.js.coffee +++ b/app/assets/javascripts/admin/order_cycles/controllers/create.js.coffee @@ -14,6 +14,9 @@ angular.module('admin.orderCycles') $scope.$watch 'order_cycle_form.$dirty', (newValue) -> StatusMessage.display 'notice', t("admin.unsaved_changes") if newValue + $scope.$watch 'order_cycle_form.$valid', (isValid) -> + StatusMessage.setValidation(isValid) + $scope.loaded = -> Enterprise.loaded && EnterpriseFee.loaded && OrderCycle.loaded diff --git a/app/assets/javascripts/admin/order_cycles/controllers/edit.js.coffee b/app/assets/javascripts/admin/order_cycles/controllers/edit.js.coffee index 0e1a0ab45c..d43e26c442 100644 --- a/app/assets/javascripts/admin/order_cycles/controllers/edit.js.coffee +++ b/app/assets/javascripts/admin/order_cycles/controllers/edit.js.coffee @@ -13,7 +13,10 @@ angular.module('admin.orderCycles') $scope.StatusMessage = StatusMessage $scope.$watch 'order_cycle_form.$dirty', (newValue) -> - StatusMessage.display 'notice', 'You have unsaved changes' if newValue + StatusMessage.display 'notice', t("admin.unsaved_changes") if newValue + + $scope.$watch 'order_cycle_form.$valid', (isValid) -> + StatusMessage.setValidation(isValid) $scope.loaded = -> Enterprise.loaded && EnterpriseFee.loaded && OrderCycle.loaded diff --git a/app/assets/javascripts/admin/order_cycles/controllers/simple_create.js.coffee b/app/assets/javascripts/admin/order_cycles/controllers/simple_create.js.coffee index 7a0a03f2bf..0d1f9482b6 100644 --- a/app/assets/javascripts/admin/order_cycles/controllers/simple_create.js.coffee +++ b/app/assets/javascripts/admin/order_cycles/controllers/simple_create.js.coffee @@ -8,7 +8,10 @@ angular.module('admin.orderCycles').controller "AdminSimpleCreateOrderCycleCtrl" $scope.enterprise_fees = EnterpriseFee.index(coordinator_id: ocInstance.coordinator_id) $scope.$watch 'order_cycle_form.$dirty', (newValue) -> - StatusMessage.display 'notice', 'You have unsaved changes' if newValue + StatusMessage.display 'notice', t("admin.unsaved_changes") if newValue + + $scope.$watch 'order_cycle_form.$valid', (isValid) -> + StatusMessage.setValidation(isValid) $scope.init = (enterprises) -> enterprise = enterprises[Object.keys(enterprises)[0]] diff --git a/app/assets/javascripts/admin/order_cycles/controllers/simple_edit.js.coffee b/app/assets/javascripts/admin/order_cycles/controllers/simple_edit.js.coffee index 7df7ddff34..d950d93119 100644 --- a/app/assets/javascripts/admin/order_cycles/controllers/simple_edit.js.coffee +++ b/app/assets/javascripts/admin/order_cycles/controllers/simple_edit.js.coffee @@ -10,7 +10,10 @@ angular.module('admin.orderCycles').controller "AdminSimpleEditOrderCycleCtrl", $scope.init() $scope.$watch 'order_cycle_form.$dirty', (newValue) -> - StatusMessage.display 'notice', 'You have unsaved changes' if newValue + StatusMessage.display 'notice', t("admin.unsaved_changes") if newValue + + $scope.$watch 'order_cycle_form.$valid', (isValid) -> + StatusMessage.setValidation(isValid) $scope.loaded = -> Enterprise.loaded && EnterpriseFee.loaded && OrderCycle.loaded diff --git a/app/assets/javascripts/admin/utils/services/status_message.js.coffee b/app/assets/javascripts/admin/utils/services/status_message.js.coffee index 6aac046a7f..0d752cdcd9 100644 --- a/app/assets/javascripts/admin/utils/services/status_message.js.coffee +++ b/app/assets/javascripts/admin/utils/services/status_message.js.coffee @@ -11,6 +11,14 @@ angular.module("admin.utils").factory "StatusMessage", ($timeout) -> text: "" style: {} + invalidMessage: "" + + setValidation: (isValid) -> + if isValid + StatusMessage.invalidMessage = '' + else + StatusMessage.invalidMessage = t("admin.form_invalid") + active: -> @statusMessage.text != '' diff --git a/app/assets/javascripts/templates/admin/save_bar.html.haml b/app/assets/javascripts/templates/admin/save_bar.html.haml index 12ccd4537c..e877e84747 100644 --- a/app/assets/javascripts/templates/admin/save_bar.html.haml +++ b/app/assets/javascripts/templates/admin/save_bar.html.haml @@ -1,6 +1,9 @@ #save-bar.animate-show{ ng: { show: 'dirty || persist || StatusMessage.active()' } } .container .eight.columns.alpha - %h5#status-message{ ng: { style: 'StatusMessage.statusMessage.style' } } + %h5#status-message{ ng: { show: "StatusMessage.invalidMessage == ''", style: 'StatusMessage.statusMessage.style' } } {{ StatusMessage.statusMessage.text || " " }} + %h5#status-message{ ng: { show: "StatusMessage.invalidMessage !== ''" }, style: 'color: #da5354' } + {{ StatusMessage.invalidMessage || " " }} .eight.columns.omega.text-right{ ng: { transclude: true } } + diff --git a/app/views/admin/order_cycles/edit.html.haml b/app/views/admin/order_cycles/edit.html.haml index 34f64c1ee7..ddfd10b38a 100644 --- a/app/views/admin/order_cycles/edit.html.haml +++ b/app/views/admin/order_cycles/edit.html.haml @@ -28,8 +28,8 @@ = form_for [main_app, :admin, @order_cycle], :url => '', :html => {:class => 'ng order_cycle', 'ng-app' => 'admin.orderCycles', 'ng-controller' => ng_controller, name: 'order_cycle_form'} do |f| %save-bar{ dirty: "order_cycle_form.$dirty", persist: "true" } - %input.red{ type: "button", value: t(:update), ng: { click: "submit($event, null)", disabled: "!order_cycle_form.$dirty" } } - %input.red{ type: "button", value: t('.update_and_close'), ng: { click: "submit($event, '#{main_app.admin_order_cycles_path}')", disabled: "!order_cycle_form.$dirty" } } + %input.red{ type: "button", value: t(:update), ng: { click: "submit($event, null)", disabled: "!order_cycle_form.$dirty || order_cycle_form.$invalid" } } + %input.red{ type: "button", value: t('.update_and_close'), ng: { click: "submit($event, '#{main_app.admin_order_cycles_path}')", disabled: "!order_cycle_form.$dirty || order_cycle_form.$invalid" } } %input{ type: "button", ng: { value: "order_cycle_form.$dirty ? 'Cancel' : 'Close'", click: "cancel('#{main_app.admin_order_cycles_path}')" } } - if order_cycles_simple_form diff --git a/app/views/admin/order_cycles/new.html.haml b/app/views/admin/order_cycles/new.html.haml index 6bc0946f01..a127ab5088 100644 --- a/app/views/admin/order_cycles/new.html.haml +++ b/app/views/admin/order_cycles/new.html.haml @@ -7,7 +7,7 @@ = form_for [main_app, :admin, @order_cycle], :url => '', :html => {:class => 'ng order_cycle', 'ng-app' => 'admin.orderCycles', 'ng-controller' => ng_controller, name: 'order_cycle_form'} do |f| %save-bar{ dirty: "order_cycle_form.$dirty", persist: "true" } - %input.red{ type: "button", value: t(:create), ng: { click: "submit($event, '#{main_app.admin_order_cycles_path}')", disabled: "!order_cycle_form.$dirty" } } + %input.red{ type: "button", value: t(:create), ng: { click: "submit($event, '#{main_app.admin_order_cycles_path}')", disabled: "!order_cycle_form.$dirty || order_cycle_form.$invalid" } } %input{ type: "button", ng: { value: "order_cycle_form.$dirty ? 'Cancel' : 'Close'", click: "cancel('#{main_app.admin_order_cycles_path}')" } } - if order_cycles_simple_form diff --git a/spec/features/admin/order_cycles_spec.rb b/spec/features/admin/order_cycles_spec.rb index 212fafd026..d9bfdfd345 100644 --- a/spec/features/admin/order_cycles_spec.rb +++ b/spec/features/admin/order_cycles_spec.rb @@ -350,6 +350,8 @@ feature %q{ fill_in 'order_cycle_outgoing_exchange_0_pickup_instructions', with: 'New instructions 0' fill_in 'order_cycle_outgoing_exchange_1_pickup_time', with: 'New time 1' fill_in 'order_cycle_outgoing_exchange_1_pickup_instructions', with: 'New instructions 1' + fill_in 'order_cycle_outgoing_exchange_2_pickup_time', with: 'New time 2' + fill_in 'order_cycle_outgoing_exchange_2_pickup_instructions', with: 'New instructions 2' page.find("table.exchanges tr.distributor-#{distributor.id} td.tags").click within ".exchange-tags" do @@ -616,6 +618,11 @@ feature %q{ select 'Permitted distributor', from: 'new_distributor_id' click_button 'Add distributor' + fill_in 'order_cycle_outgoing_exchange_0_pickup_time', with: 'pickup time' + fill_in 'order_cycle_outgoing_exchange_0_pickup_instructions', with: 'pickup instructions' + fill_in 'order_cycle_outgoing_exchange_1_pickup_time', with: 'pickup time 2' + fill_in 'order_cycle_outgoing_exchange_1_pickup_instructions', with: 'pickup instructions' + # Should only have suppliers / distributors listed which the user is managing or # has E2E permission to add products to order cycles page.should_not have_select 'new_supplier_id', with_options: [supplier_unmanaged.name]