Basic form

Change-Id: I7ee858b208730b110b355d3f72037f0975aaa356
diff --git a/src/app/core/field/field.ts b/src/app/core/field/field.ts
new file mode 100644
index 0000000..ad36473
--- /dev/null
+++ b/src/app/core/field/field.ts
@@ -0,0 +1,59 @@
+import {IXosConfigHelpersService} from '../services/helpers/config.helpers';
+import {IXosFormHelpersService} from '../form/form-helpers';
+import * as _ from 'lodash';
+
+class FieldCtrl {
+  static $inject = ['$attrs', '$scope', 'ConfigHelpers', 'XosFormHelpers'];
+  // $inject = ['$onInit'];
+
+  public field: any;
+  public name: string;
+  public ngModel: any;
+  public getType = this.XosFormHelpers._getFieldFormat;
+  public formatLabel = this.ConfigHelpers.toLabel;
+
+  constructor(
+    private $attrs: ng.IAttributes,
+    private $scope: ng.IScope,
+    private ConfigHelpers: IXosConfigHelpersService,
+    private XosFormHelpers: IXosFormHelpersService
+  ) {
+
+  }
+
+  public isEmptyObject = (o: any) => o ? Object.keys(o).length === 0 : true;
+
+  $onInit() {
+    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.field.type) {
+      throw new Error('[xosField] Please provide a type in the field definition');
+    }
+    if (!this.$attrs['ngModel']) {
+      throw new Error('[xosField] Please provide an ng-model');
+    }
+
+
+    if (this.field.type === 'array') {
+      this.$scope.$watch(() => this.ngModel.length, () => {
+        this.field.availableOptions = _.difference(this.field.options, this.ngModel);
+      });
+    }
+
+  }
+}
+
+export const xosField: angular.IComponentOptions = {
+  template: require('./field.html'),
+  controllerAs: 'vm',
+  controller: FieldCtrl,
+  bindings: {
+    ngModel: '=',
+    name: '=',
+    field: '='
+  }
+};