Splitted form component
diff --git a/views/ngXosLib/xosHelpers/src/ui_components/dumbComponents/field/field.component.js b/views/ngXosLib/xosHelpers/src/ui_components/dumbComponents/field/field.component.js
new file mode 100644
index 0000000..923def6
--- /dev/null
+++ b/views/ngXosLib/xosHelpers/src/ui_components/dumbComponents/field/field.component.js
@@ -0,0 +1,89 @@
+/**
+ * © OpenCORD
+ *
+ * Visit http://guide.xosproject.org/devguide/addview/ for more information
+ *
+ * Created by teone on 5/25/16.
+ */
+
+(function () {
+ 'use strict';
+
+ angular.module('xos.uiComponents')
+ /**
+ * @ngdoc directive
+ * @name xos.uiComponents.directive:xosField
+ * @restrict E
+ * @description The xos-field directive.
+ * This component decide, give a field wich kind of input it need to print.
+ * @param {string} name The field name
+ * @param {object} field The field configuration:
+ * ```
+ * {
+ * label: 'Label',
+ * type: 'number', //typeof field
+ * validators: {} // see xosForm for more details
+ * }
+ * ```
+ * @param {mixed} ngModel The field value
+ */
+ .directive('xosField', function(){
+ return {
+ restrict: 'E',
+ scope: {
+ name: '=',
+ field: '=',
+ ngModel: '='
+ },
+ template: `
+ <label>{{vm.field.label}}</label>
+ <input
+ ng-if="vm.field.type !== 'boolean' && vm.field.type !== 'object'"
+ type="{{vm.field.type}}"
+ name="{{vm.name}}"
+ class="form-control"
+ ng-model="vm.ngModel"
+ ng-minlength="vm.field.validators.minlength || 0"
+ ng-maxlength="vm.field.validators.maxlength || 2000"
+ ng-required="vm.field.validators.required || false" />
+ <span class="boolean-field" ng-if="vm.field.type === 'boolean'">
+ <button
+ class="btn btn-success"
+ ng-show="vm.ngModel"
+ ng-click="vm.ngModel = false">
+ <i class="glyphicon glyphicon-ok"></i>
+ </button>
+ <button
+ class="btn btn-danger"
+ ng-show="!vm.ngModel"
+ ng-click="vm.ngModel = true">
+ <i class="glyphicon glyphicon-remove"></i>
+ </button>
+ </span>
+ <div
+ class="panel panel-default object-field"
+ ng-if="vm.field.type == 'object' "
+ >
+ <div class="panel-heading">Panel heading without title</div>
+ <div class="panel-body">
+ Panel content
+ </div>
+ </div>
+ `,
+ bindToController: true,
+ controllerAs: 'vm',
+ controller: function(){
+ // console.log('Field: ', this.name, this.field.type, this.ngModel);
+ if(!this.name){
+ throw new Error('[xosField] Please provide a field name');
+ }
+ if(!this.field){
+ throw new Error('[xosField] Please provide a field definition');
+ }
+ if(!this.ngModel){
+ throw new Error('[xosField] Please provide an ng-model');
+ }
+ }
+ }
+ });
+})();
\ No newline at end of file
diff --git a/views/ngXosLib/xosHelpers/src/ui_components/dumbComponents/form/form.component.js b/views/ngXosLib/xosHelpers/src/ui_components/dumbComponents/form/form.component.js
index 5294229..db4a2fd 100644
--- a/views/ngXosLib/xosHelpers/src/ui_components/dumbComponents/form/form.component.js
+++ b/views/ngXosLib/xosHelpers/src/ui_components/dumbComponents/form/form.component.js
@@ -48,6 +48,9 @@
* ```
* @element ANY
* @scope
+ * @requires xos.uiComponents.directive:xosField
+ * @requires xos.uiComponents.XosFormHelpers
+ * @requires xos.helpers._
* @example
Autogenerated form
@@ -159,31 +162,7 @@
template: `
<ng-form name="vm.{{vm.config.formName || 'form'}}">
<div class="form-group" ng-repeat="(name, field) in vm.formField">
- <label>{{field.label}}</label>
- <input
- ng-if="field.type !== 'boolean'"
- type="{{field.type}}"
- name="{{name}}"
- class="form-control"
- ng-model="vm.ngModel[name]"
- ng-minlength="field.validators.minlength || 0"
- ng-maxlength="field.validators.maxlength || 2000"
- ng-required="field.validators.required || false" />
- <span class="boolean-field" ng-if="field.type === 'boolean'">
- <button
- class="btn btn-success"
- ng-show="vm.ngModel[name]"
- ng-click="vm.ngModel[name] = false">
- <i class="glyphicon glyphicon-ok"></i>
- </button>
- <button
- class="btn btn-danger"
- ng-show="!vm.ngModel[name]"
- ng-click="vm.ngModel[name] = true">
- <i class="glyphicon glyphicon-remove"></i>
- </button>
- </span>
- <!-- <pre>{{vm[vm.config.formName][name].$error | json}}</pre> -->
+ <xos-field name="name" field="field" ng-model="vm.ngModel[name]"></xos-field>
<xos-validation errors="vm[vm.config.formName || 'form'][name].$error"></xos-validation>
</div>
<div class="form-group" ng-if="vm.config.actions">
@@ -233,76 +212,5 @@
}
}
- })
- .service('XosFormHelpers', function(_, LabelFormatter){
-
- this._isEmail = (text) => {
- var re = /(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))/;
- return re.test(text);
- };
-
- this._getFieldFormat = (value) => {
-
- // check if is date
- if (_.isDate(value) || (!Number.isNaN(Date.parse(value)) && new Date(value).getTime() > 631180800000)){
- return 'date';
- }
-
- // check if is boolean
- // isNaN(false) = false, false is a number (0), true is a number (1)
- if(typeof value === 'boolean'){
- return 'boolean';
- }
-
- // check if a string is a number
- if(!isNaN(value) && value !== null){
- return 'number';
- }
-
- // check if a string is an email
- if(this._isEmail(value)){
- return 'email';
- }
-
- // if null return string
- if(value === null){
- return 'string';
- }
-
- return typeof value;
- };
-
- this.buildFormStructure = (modelField, customField, model) => {
-
- modelField = Object.keys(modelField).length > 0 ? modelField : customField; //if no model field are provided, check custom
- customField = customField || {};
-
- return _.reduce(Object.keys(modelField), (form, f) => {
-
- form[f] = {
- label: (customField[f] && customField[f].label) ? `${customField[f].label}:` : LabelFormatter.format(f),
- type: (customField[f] && customField[f].type) ? customField[f].type : this._getFieldFormat(model[f]),
- validators: (customField[f] && customField[f].validators) ? customField[f].validators : {}
- };
-
- if(form[f].type === 'date'){
- model[f] = new Date(model[f]);
- }
-
- if(form[f].type === 'number'){
- model[f] = parseInt(model[f], 10);
- }
-
- return form;
- }, {});
- };
-
- this.parseModelField = (fields) => {
- return _.reduce(fields, (form, f) => {
- form[f] = {};
- return form;
- }, {});
- }
-
- })
+ });
})();
diff --git a/views/ngXosLib/xosHelpers/src/ui_components/smartComponents/smartTable/smartTable.component.js b/views/ngXosLib/xosHelpers/src/ui_components/smartComponents/smartTable/smartTable.component.js
index 059f461..b3a2eec 100644
--- a/views/ngXosLib/xosHelpers/src/ui_components/smartComponents/smartTable/smartTable.component.js
+++ b/views/ngXosLib/xosHelpers/src/ui_components/smartComponents/smartTable/smartTable.component.js
@@ -249,6 +249,7 @@
});
// build form structure
+ // TODO move in a pure function for testing purposes
props.forEach((p, i) => {
this.formConfig.fields[p] = {
label: LabelFormatter.format(labels[i]).replace(':', ''),