瀏覽代碼

AMBARI-9017. Alerts UI: saving notification with same name fails w/o informing user.(xiwang)

Xi Wang 10 年之前
父節點
當前提交
0e1cc1de43

+ 46 - 11
ambari-web/app/controllers/main/alerts/manage_alert_notifications_controller.js

@@ -350,16 +350,45 @@ App.ManageAlertNotificationsController = Em.Controller.extend({
         }.property('controller.inputFields.method.value'),
         }.property('controller.inputFields.method.value'),
 
 
         nameValidation: function () {
         nameValidation: function () {
-          this.set('parentView.hasErrors', !this.get('controller.inputFields.name.value').trim());
+          var newName = this.get('controller.inputFields.name.value').trim();
+          var errorMessage = '';
+          // on editing, save current notification name
+          if (newName && !this.get('currentName')) {
+            this.set('currentName', newName);
+          }
+          if (isEdit) {
+            // edit current alert notification
+            if (!newName) {
+              this.set('nameError', true);
+              errorMessage = Em.I18n.t('alerts.actions.manage_alert_notifications_popup.error.name.empty');
+            } else if (newName && newName != this.get('currentName') && self.get('alertNotifications').mapProperty('name').contains(newName)) {
+              this.set('nameError', true);
+              errorMessage = Em.I18n.t('alerts.actions.manage_alert_notifications_popup.error.name.existed');
+            } else {
+              this.set('nameError', false);
+            }
+          } else {
+            // add new alert notification
+            if (!newName) {
+              this.set('nameError', true);
+              errorMessage = Em.I18n.t('alerts.actions.manage_alert_notifications_popup.error.name.empty');
+            } else if (newName && self.get('alertNotifications').mapProperty('name').contains(newName)) {
+              this.set('nameError', true);
+              errorMessage = Em.I18n.t('alerts.actions.manage_alert_notifications_popup.error.name.existed');
+            } else {
+              this.set('nameError', false);
+            }
+          }
+          this.set('controller.inputFields.name.errorMsg', errorMessage);
         }.observes('controller.inputFields.name.value'),
         }.observes('controller.inputFields.name.value'),
 
 
         emailToValidation: function () {
         emailToValidation: function () {
           var emailTo = this.get('controller.inputFields.email.value');
           var emailTo = this.get('controller.inputFields.email.value');
           if (emailTo && !validator.isValidEmail(emailTo)) {
           if (emailTo && !validator.isValidEmail(emailTo)) {
-            this.set('parentView.hasErrors', true);
+            this.set('emailToError', true);
             this.set('controller.inputFields.email.errorMsg', Em.I18n.t('alerts.notifications.error.email'));
             this.set('controller.inputFields.email.errorMsg', Em.I18n.t('alerts.notifications.error.email'));
           } else {
           } else {
-            this.set('parentView.hasErrors', false);
+            this.set('emailToError', false);
             this.set('controller.inputFields.email.errorMsg', null);
             this.set('controller.inputFields.email.errorMsg', null);
           }
           }
         }.observes('controller.inputFields.email.value'),
         }.observes('controller.inputFields.email.value'),
@@ -367,10 +396,10 @@ App.ManageAlertNotificationsController = Em.Controller.extend({
         emailFromValidation: function () {
         emailFromValidation: function () {
           var emailFrom = this.get('controller.inputFields.emailFrom.value');
           var emailFrom = this.get('controller.inputFields.emailFrom.value');
           if (emailFrom && !validator.isValidEmail(emailFrom)) {
           if (emailFrom && !validator.isValidEmail(emailFrom)) {
-            this.set('parentView.hasErrors', true);
+            this.set('emailFromError', true);
             this.set('controller.inputFields.emailFrom.errorMsg', Em.I18n.t('alerts.notifications.error.email'));
             this.set('controller.inputFields.emailFrom.errorMsg', Em.I18n.t('alerts.notifications.error.email'));
           } else {
           } else {
-            this.set('parentView.hasErrors', false);
+            this.set('emailFromError', false);
             this.set('controller.inputFields.emailFrom.errorMsg', null);
             this.set('controller.inputFields.emailFrom.errorMsg', null);
           }
           }
         }.observes('controller.inputFields.emailFrom.value'),
         }.observes('controller.inputFields.emailFrom.value'),
@@ -378,10 +407,10 @@ App.ManageAlertNotificationsController = Em.Controller.extend({
         smtpPortValidation: function () {
         smtpPortValidation: function () {
           var value = this.get('controller.inputFields.SMTPPort.value');
           var value = this.get('controller.inputFields.SMTPPort.value');
           if (value && (!validator.isValidInt(value) || value < 0)) {
           if (value && (!validator.isValidInt(value) || value < 0)) {
-            this.set('parentView.hasErrors', true);
+            this.set('smtpPortError', true);
             this.set('controller.inputFields.SMTPPort.errorMsg', Em.I18n.t('alerts.notifications.error.integer'));
             this.set('controller.inputFields.SMTPPort.errorMsg', Em.I18n.t('alerts.notifications.error.integer'));
           } else {
           } else {
-            this.set('parentView.hasErrors', false);
+            this.set('smtpPortError', false);
             this.set('controller.inputFields.SMTPPort.errorMsg', null);
             this.set('controller.inputFields.SMTPPort.errorMsg', null);
           }
           }
         }.observes('controller.inputFields.SMTPPort.value'),
         }.observes('controller.inputFields.SMTPPort.value'),
@@ -389,10 +418,10 @@ App.ManageAlertNotificationsController = Em.Controller.extend({
         portValidation: function () {
         portValidation: function () {
           var value = this.get('controller.inputFields.port.value');
           var value = this.get('controller.inputFields.port.value');
           if (value && (!validator.isValidInt(value) || value < 0)) {
           if (value && (!validator.isValidInt(value) || value < 0)) {
-            this.set('parentView.hasErrors', true);
+            this.set('portError', true);
             this.set('controller.inputFields.port.errorMsg', Em.I18n.t('alerts.notifications.error.integer'));
             this.set('controller.inputFields.port.errorMsg', Em.I18n.t('alerts.notifications.error.integer'));
           } else {
           } else {
-            this.set('parentView.hasErrors', false);
+            this.set('portError', false);
             this.set('controller.inputFields.port.errorMsg', null);
             this.set('controller.inputFields.port.errorMsg', null);
           }
           }
         }.observes('controller.inputFields.port.value'),
         }.observes('controller.inputFields.port.value'),
@@ -401,14 +430,20 @@ App.ManageAlertNotificationsController = Em.Controller.extend({
           var passwordValue = this.get('controller.inputFields.SMTPPassword.value');
           var passwordValue = this.get('controller.inputFields.SMTPPassword.value');
           var retypePasswordValue = this.get('controller.inputFields.retypeSMTPPassword.value');
           var retypePasswordValue = this.get('controller.inputFields.retypeSMTPPassword.value');
           if (passwordValue !== retypePasswordValue) {
           if (passwordValue !== retypePasswordValue) {
-            this.set('parentView.hasErrors', true);
+            this.set('passwordError', true);
             this.set('controller.inputFields.retypeSMTPPassword.errorMsg', Em.I18n.t('alerts.notifications.error.retypePassword'));
             this.set('controller.inputFields.retypeSMTPPassword.errorMsg', Em.I18n.t('alerts.notifications.error.retypePassword'));
           } else {
           } else {
-            this.set('parentView.hasErrors', false);
+            this.set('passwordError', false);
             this.set('controller.inputFields.retypeSMTPPassword.errorMsg', null);
             this.set('controller.inputFields.retypeSMTPPassword.errorMsg', null);
           }
           }
         }.observes('controller.inputFields.retypeSMTPPassword.value', 'controller.inputFields.SMTPPassword.value'),
         }.observes('controller.inputFields.retypeSMTPPassword.value', 'controller.inputFields.SMTPPassword.value'),
 
 
+        setParentErrors: function () {
+          var hasErrors = this.get('nameError') || this.get('emailToError') || this.get('emailFromError') ||
+            this.get('smtpPortError') || this.get('portError') || this.get('passwordError');
+          this.set('parentView.hasErrors', hasErrors);
+        }.observes('nameError', 'emailToError', 'emailFromError', 'smtpPortError', 'portError', 'passwordError'),
+
 
 
         groupsSelectView: Em.Select.extend({
         groupsSelectView: Em.Select.extend({
           attributeBindings: ['disabled'],
           attributeBindings: ['disabled'],

+ 2 - 0
ambari-web/app/messages.js

@@ -1903,6 +1903,8 @@ Em.I18n.translations = {
   'alerts.actions.manage_alert_notifications_popup.selectAll':'Select All',
   'alerts.actions.manage_alert_notifications_popup.selectAll':'Select All',
   'alerts.actions.manage_alert_notifications_popup.confirmDeleteHeader':'Confirm Delete',
   'alerts.actions.manage_alert_notifications_popup.confirmDeleteHeader':'Confirm Delete',
   'alerts.actions.manage_alert_notifications_popup.confirmDeleteBody':'Are you sure you want to delete {0} notification?',
   'alerts.actions.manage_alert_notifications_popup.confirmDeleteBody':'Are you sure you want to delete {0} notification?',
+  'alerts.actions.manage_alert_notifications_popup.error.name.empty': 'Notification name is required',
+  'alerts.actions.manage_alert_notifications_popup.error.name.existed': 'Notification name already exists',
 
 
   'hosts.host.add':'Add New Hosts',
   'hosts.host.add':'Add New Hosts',
   'hosts.table.noHosts':'No hosts to display',
   'hosts.table.noHosts':'No hosts to display',

+ 5 - 1
ambari-web/app/templates/main/alerts/create_alert_notification.hbs

@@ -22,12 +22,16 @@
 
 
 
 
     {{! alert-notification name }}
     {{! alert-notification name }}
-    <div class="control-group">
+    <div {{bindAttr class=":control-group controller.inputFields.name.errorMsg:error"}}>
       <label class="control-label" for="inputName">{{controller.inputFields.name.label}}</label>
       <label class="control-label" for="inputName">{{controller.inputFields.name.label}}</label>
 
 
       <div class="controls">
       <div class="controls">
         {{view Em.TextField valueBinding="controller.inputFields.name.value" id="inputName" class="input-xlarge"}}
         {{view Em.TextField valueBinding="controller.inputFields.name.value" id="inputName" class="input-xlarge"}}
       </div>
       </div>
+
+      <div class="controls error-msg">
+        {{controller.inputFields.name.errorMsg}}
+      </div>
     </div>
     </div>
     {{! alert-notification name end }}
     {{! alert-notification name end }}
 
 

+ 31 - 0
ambari-web/test/controllers/main/alerts/manage_alert_notifications_controller_test.js

@@ -352,6 +352,7 @@ describe('App.ManageAlertNotificationsController', function () {
         view = controller.showCreateEditPopup().get('bodyClass').create({
         view = controller.showCreateEditPopup().get('bodyClass').create({
           controller: Em.Object.create({
           controller: Em.Object.create({
             inputFields: {
             inputFields: {
+              name: {},
               global: {},
               global: {},
               allGroups: {},
               allGroups: {},
               SMTPPassword: {},
               SMTPPassword: {},
@@ -404,6 +405,36 @@ describe('App.ManageAlertNotificationsController', function () {
 
 
       });
       });
 
 
+      describe('#nameValidation', function () {
+
+        it('should check inputFields.name.value', function () {
+          view.set('controller.inputFields.name.value', '');
+          expect(view.get('controller.inputFields.name.errorMsg')).to.equal(Em.I18n.t('alerts.actions.manage_alert_notifications_popup.error.name.empty'));
+          expect(view.get('parentView.hasErrors')).to.be.true;
+        });
+
+        it('should check inputFields.name.value', function () {
+          view.set('controller.inputFields.name.errorMsg', 'error');
+          view.set('controller.inputFields.name.value', 'test');
+          expect(view.get('controller.inputFields.name.errorMsg')).to.equal('');
+        });
+
+        it('should check inputFields.name.value', function () {
+          view.set('isEdit', true);
+          view.set('controller.inputFields.name.value', '');
+          expect(view.get('controller.inputFields.name.errorMsg')).to.equal(Em.I18n.t('alerts.actions.manage_alert_notifications_popup.error.name.empty'));
+          expect(view.get('parentView.hasErrors')).to.be.true;
+        });
+
+        it('should check inputFields.name.value', function () {
+          view.set('isEdit', true);
+          view.set('controller.inputFields.name.errorMsg', 'error');
+          view.set('controller.inputFields.name.value', 'test');
+          expect(view.get('controller.inputFields.name.errorMsg')).to.equal('');
+        });
+
+      });
+
       describe('#retypePasswordValidation', function () {
       describe('#retypePasswordValidation', function () {
 
 
         it('should check inputFields.retypeSMTPPassword.value', function () {
         it('should check inputFields.retypeSMTPPassword.value', function () {