import Ember from 'ember';

export default Ember.Component.extend({
    tagName: 'form',
    class: 'form-horizontal',
    classNameBindings: ['class'],
    attributeBindings: ['action'],
    properties: Ember.A([]),
    action: 'submit',
    submitButtonClass: 'btn btn-primary',
    submitText: 'Submit',
    cancelButtonClass: 'btn btn-default',
    cancelText: 'Cancel',

    notifyGroup(pid, property, message='', revalidate=true) {
        const childViews = this.get('childViews'),
              group     = _.detect(childViews, c => c.get('pid') === pid);
        if (!message && !revalidate) message = this.getMessage(property);
        if (revalidate)              message = this.validateProperty(property);
        group.set('message', message);
    },

    validateProperty(propertyKey) {
        this.get('model').validate({only: propertyKey});
        return this.getMessage(propertyKey);
    },

    getMessage(propertyKey) {
        const errors      = this.get('model.errors.content'),
              errorObject = _.detect(errors, 'attribute', propertyKey);
        return _.get(errorObject, 'message[0]', '');
    },

    submit(e) {
        if (e) e.preventDefault();
        const bool   = this.get('model').validate(),
              errors = this.get('model.errors.content');
        if (bool) return this.sendAction('submitAction');
        _.each(errors, e => {
            const pid = _.result(_.detect(this.get('properties'), p => {
                if (e) return _.contains(p.properties, e.attribute);
            }), 'pid');
            if (pid) this.notifyGroup(pid, e.attribute, e.message, false);
        });
    },

    actions: {
        cancel() {
            this.sendAction('cancelAction');
        }
    }

});

@@ -61,18 +61,16 @@
 xtend(%7B%0A
-  
   tagNam
@@ -80,18 +80,16 @@
 'form',%0A
-  
   class:
@@ -108,18 +108,16 @@
 ontal',%0A
-  
   classN
@@ -142,18 +142,16 @@
 ss'%5D,%0A  
- 
- 
 attribut
@@ -173,18 +173,16 @@
 tion'%5D,%0A
-  
   proper
@@ -200,18 +200,16 @@
 .A(%5B%5D),%0A
-  
   action
@@ -218,26 +218,24 @@
 'submit',%0A  
- 
- 
 submitButton
@@ -260,18 +260,16 @@
 imary',%0A
-  
   submit
@@ -282,26 +282,24 @@
 'Submit',%0A  
- 
- 
 cancelButton
@@ -324,18 +324,16 @@
 fault',%0A
-  
   cancel
@@ -349,18 +349,16 @@
 ncel',%0A%0A
-  
   notify
@@ -405,28 +405,24 @@
 ate=true) %7B%0A
-    
     const ch
@@ -462,28 +462,24 @@
 ,%0A          
-    
 group     = 
@@ -527,28 +527,24 @@
 = pid);%0A    
-   
- 
 if (!message
@@ -593,28 +593,24 @@
 (property);%0A
-    
     if (reva
@@ -673,28 +673,24 @@
 perty);%0A    
- 
-   
 group.set('m
@@ -708,26 +708,24 @@
 ssage);%0A
-  
   %7D,%0A%0A  
   valida
@@ -716,18 +716,16 @@
   %7D,%0A%0A  
- 
- 
 validate
@@ -744,26 +744,24 @@
 pertyKey) %7B%0A
-  
       this.g
@@ -805,26 +805,24 @@
 ey%7D);%0A      
-  
 return this.
@@ -856,18 +856,16 @@
   %7D,%0A%0A  
- 
- 
 getMessa
@@ -878,28 +878,24 @@
 pertyKey) %7B%0A
-    
     const er
@@ -946,28 +946,24 @@
 ,%0A          
-  
-  
 errorObject 
@@ -1008,20 +1008,16 @@
 tyKey);%0A
-    
     retu
@@ -1063,34 +1063,288 @@
 ;%0A  
-  %7D,%0A%0A    submit(e) %7B%0A    
+%7D,%0A%0A  clearAll() %7B%0A    const childViews = this.get('childViews'),%0A          properties = this.get('properties');%0A    _.each(properties, p =%3E %7B%0A      const group = _.detect(childViews, c =%3E c.get('pid') === p.pid);%0A      if (group) group.clearErrors();%0A    %7D);%0A  %7D,%0A%0A  submit(e) %7B%0A
     
@@ -1370,24 +1370,41 @@
 ault();%0A    
+this.clearAll();%0A
     const bo
@@ -1446,28 +1446,24 @@
 ,%0A          
-  
-  
 errors = thi
@@ -1489,28 +1489,24 @@
 .content');%0A
-    
     if (bool
@@ -1543,28 +1543,24 @@
 itAction');%0A
-    
     _.each(e
@@ -1579,22 +1579,16 @@
 %7B%0A      
-  
-    
 const pi
@@ -1640,24 +1640,16 @@
  p =%3E %7B%0A
-        
         
@@ -1707,22 +1707,16 @@
 ;%0A      
- 
-     
 %7D), 'pid
@@ -1719,22 +1719,16 @@
 'pid');%0A
-      
       if
@@ -1796,26 +1796,18 @@
     
- 
-   
 %7D);%0A  
- 
- 
 %7D,%0A%0A
-  
   ac
@@ -1815,20 +1815,16 @@
 ions: %7B%0A
-    
     canc
@@ -1836,22 +1836,16 @@
 %7B%0A      
-  
-    
 this.sen
@@ -1877,19 +1877,15 @@
     
-    %7D%0A    %7D
+%7D,%0A  %7D,
 %0A%0A%7D)

Clear errors before validation