      1 // ==========================================================================
      2 // Project:   The M-Project - Mobile HTML5 Application Framework
      3 // Copyright: (c) 2010 M-Way Solutions GmbH. All rights reserved.
      4 // Creator:   Dominik
      5 // Date:      25.11.2010
      6 // License:   Dual licensed under the MIT or GPL Version 2 licenses.
      7 //            http://github.com/mwaylabs/The-M-Project/blob/master/MIT-LICENSE
      8 //            http://github.com/mwaylabs/The-M-Project/blob/master/GPL-LICENSE
      9 // ==========================================================================
     10
     11 /**
     12  * @class
     13  *
     14  * M.FormViews is the prototype of a form view, a container like view for grouping
     15  * input views, e.g. M.TextFieldView. It covers a lot of the jobs concerning the
     16  * validation of input views. There is no visible representation of an M.FormView,
     17  * it is only used to ease the validation process and its accessing out of a
     18  * controller.
     19  *
     20  * @extends M.View
     21  */
     22 M.FormView = M.View.extend(
     23 /** @scope M.FormView.prototype */ {
     24
     25     /**
     26      * The type of this object.
     27      *
     28      * @type String
     29      */
     30     type: 'M.FormView',
     31
     32     /**
     33      * Determines whether to automatically show an alert dialog view out of the showError method
     34      * if the validation failed or not. So if set to YES, all error messages are shown in an alert
     35      * dialog view once the showError method is called.
     36      *
     37      * @type Boolean
     38      */
     39     showAlertDialogOnError: YES,
     40
     41     /**
     42      * The title of the alert view that comes up automatically if the validation fails, depending
     43      * one the 'showAlertOnError' property.
     44      *
     45      * @type String
     46      */
     47      alertTitle: 'Validation Error(s)',
     48
     49     /**
     50      * This method triggers the validate() on all child views, respectively
     51      * on their validators.
     52      *
     53      * @returns {Boolean} The result of the validation process: valid or not.
     54      */
     55     validate: function() {
     56         M.Validator.clearErrorBuffer();
     57         var isValid = YES;
     58         if(this.childViews) {
     59             var childViews = $.trim(this.childViews).split(' ');
     60             for(var i in childViews) {
     61                 var childView = this[childViews[i]];
     62                 if(childView && childView.validators) {
     63                     _.each(childView.validators, function(validator) {
     64                         if(!validator.validate(childView, childViews[i])) {
     65                             isValid = NO;
     66                         }
     67                     });
     68                 }
     69                 if(childView && childView.cssClassOnError) {
     70                     childView.removeCssClass(childView.cssClassOnError);
     71                 }
     72             }
     73         }
     74
     75         return isValid;
     76     },
     77
     78     /**
     79      * This method adds a css class specified by the cssClassOnError property to any
     80      * view that caused a validation error and has this property specified.
     81      *
     82      * If the showAlertDialogOnError property is set to YES, a alert dialog view
     83      * is display additionally, presenting the error messages of all invalid views.
     84      */
     85     showErrors: function() {
     86         var errors = '';
     87         _.each(M.Validator.validationErrors, function(error) {
     88             var view = M.ViewManager.getViewById(error.viewId);
     89             if(view && view.cssClassOnError) {
     90                 view.addCssClass(view.cssClassOnError);
     91             }
     92             errors += '<li>' + error.msg + '</li>';
     93         });
     94
     95         if(this.showAlertDialogOnError) {
     96             M.DialogView.alert({
     97                 title: this.alertTitle,
     98                 message: errors
     99             });
    100         }
    101     }
    102
    103 });