Dinamically generate views for CORE Models

Change-Id: Ib1d042f366f916c2ba8513ee62014e7256ceb53d
diff --git a/src/index.ts b/src/index.ts
index c654e52..bdb09ab 100644
--- a/src/index.ts
+++ b/src/index.ts
@@ -11,15 +11,83 @@
 
 import './index.scss';
 import {xosCore} from './app/core/index';
-import {xosRest} from './app/datasources/index';
+import {xosDataSources} from './app/datasources/index';
 import {xosViews} from './app/views/index';
-import {interceptorConfig, userStatusInterceptor, CredentialsInterceptor} from './interceptors';
+import {
+  interceptorConfig, userStatusInterceptor, CredentialsInterceptor,
+  NoHyperlinksInterceptor
+} from './interceptors';
+import {IRuntimeStatesService} from './app/core/services/runtime-states';
+import {IModeldefsService, IModeldef} from './app/datasources/rest/modeldefs.rest';
+import {IXosCrudData} from './app/views/crud/crud';
+import * as _ from 'lodash';
+import {IXosNavigationService} from './app/core/services/navigation';
+
+export interface IXosState extends angular.ui.IState {
+  data: IXosCrudData;
+};
+
+const modeldefToTableCfg = (fields: {name: string, type: string}[]): any[] => {
+  const excluded_fields = [
+    'created',
+    'updated',
+    'enacted',
+    'policed',
+    'backend_register',
+    'deleted',
+    'write_protect',
+    'lazy_blocked',
+    'no_sync',
+    'no_policy',
+    'omf_friendly',
+    'enabled'
+  ];
+  const cfg =  _.map(fields, (f) => {
+    if (excluded_fields.indexOf(f.name) > -1) {
+      return;
+    }
+    return {
+      label: `${f.name}`,
+      prop: f.name
+    };
+  })
+    .filter(v => angular.isDefined(v));
+
+  return cfg;
+};
 
 angular
-  .module('app', [xosCore, xosRest, xosViews, 'ui.router', 'ngResource'])
+  .module('app', [xosCore, xosDataSources, xosViews, 'ui.router', 'ngResource'])
   .config(routesConfig)
   .config(interceptorConfig)
   .factory('UserStatusInterceptor', userStatusInterceptor)
   .factory('CredentialsInterceptor', CredentialsInterceptor)
-  .component('xos', main);
+  .factory('NoHyperlinksInterceptor', NoHyperlinksInterceptor)
+  .component('xos', main)
+  .run((ModelDefs: IModeldefsService, RuntimeStates: IRuntimeStatesService, NavigationService: IXosNavigationService) => {
+    // Dinamically add a state
+    RuntimeStates.addState('test', {
+      parent: 'xos',
+      url: 'test',
+      template: 'Test State'
+    });
 
+    ModelDefs.get()
+      .then((models: IModeldef[]) => {
+        _.forEach(models, (m: IModeldef) => {
+          const state: IXosState = {
+            parent: 'xos',
+            url: `${m.name.toLowerCase()}s`,
+            component: 'xosCrud',
+            data: {
+              model: m.name,
+              xosTableCfg: {
+                columns: modeldefToTableCfg(m.fields)
+              }
+            }
+          };
+          RuntimeStates.addState(`${m.name.toLowerCase()}s`, state);
+          NavigationService.add({label: `${m.name}s`, url: `${m.name.toLowerCase()}s`});
+        });
+      });
+  });