blob: 22a48a98f6b41b30e8aee7a3553bbe3efdaa7d37 [file] [log] [blame]
/**
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
var App = require('app');
// move this to models cause some errors
App.Form = Em.View.extend({
/**
* generating fields from fieldsOptions
*/
classNames:["form-horizontal"],
attributeBindings: ['autocomplete'],
autocomplete: 'off',
i18nprefix:'form.',
fields:[],
field:{},
messages:[],
object:false,
result:0, // save result var (-1 - error; 0 - init; 1 - success)
templateName:require('templates/common/form'),
tagName:'form',
init:function () {
var thisForm = this;
if (!this.fields.length) {
this.fieldsOptions.forEach(
function (options) {
var field = App.FormField.create(options);
field.set('form', thisForm);
thisForm.fields.push(field);
thisForm.set("field." + field.get('name'), field);
}
);
}
this._super();
},
/**
* get field of form by name
* @param name
* @return {Object}
*/
getField: function (name) {
return this.get('fields').findProperty('name', name);
},
isValid:function () {
var isValid = true;
$.each(this.fields, function () {
this.validate();
if (!this.get('isValid')) {
isValid = false;
}
});
return isValid;
},
updateValues:function () {
var object = this.get('object');
if (object instanceof Em.Object) {
$.each(this.fields, function () {
this.set('value', (this.get('displayType') == 'password') ? '' : object.get(this.get('name')));
});
} else {
this.clearValues();
}
}.observes("object"),
/**
* reset values to default of every field in the form
*/
clearValues: function () {
this.get('fields').forEach(function (field) {
var value = (field.get('defaultValue') === undefined) ? '' : field.get('defaultValue');
field.set('value', value);
}, this);
},
visibleFields:Em.computed.filterBy('fields', 'isHiddenField', false),
resultText:function () {
var text = "";
switch (this.get('result')) {
case -1:
text = this.t("form.saveError");
break;
case 1:
text = this.t("form.saveSuccess");
break;
}
return text;
}.property('result')
});
App.FormField = Em.Object.extend({ // try to realize this as view
name:'',
displayName:'',
// defaultValue:'', NOT REALIZED YET
description:'',
disabled:false,
displayType:'string', // string, digits, number, directories, textarea, checkbox
disableRequiredOnPresent:false,
errorMessage:'',
warnMessage:'',
form:false,
isRequired:true, // by default a config property is required
unit:'',
value:'',
isValid:Em.computed.equal('errorMessage', ''),
viewClass:function () {
var options = {};
var element = Em.TextField;
switch (this.get('displayType')) {
case 'checkbox':
element = App.CheckboxView;
options.checkedBinding = "value";
break;
case 'select':
element = Em.Select;
options.content = this.get('values');
options.valueBinding = "value";
options.optionValuePath = "content.value";
options.optionLabelPath = "content.label";
break;
case 'password':
options['type'] = 'password';
break;
case 'textarea':
element = Em.TextArea;
break;
case 'hidden':
options.type = "hidden";
break;
}
return element.extend(options);
}.property('displayType'),
validate:function () {
var value = this.get('value');
var isError = false;
this.set('errorMessage', '');
if (this.get('isRequired') && (typeof value === 'string' && value.trim().length === 0)) {
this.set('errorMessage', 'This is required');
isError = true;
}
if (typeof value === 'string' && value.trim().length === 0) { // this is not to validate empty field.
isError = true;
}
if (!isError) {
this.set('errorMessage', '');
}
},
isHiddenField: Em.computed.equal('displayType', 'hidden')
});