Basic form

Change-Id: I7ee858b208730b110b355d3f72037f0975aaa356
diff --git a/src/app/core/services/helpers/config.helpers.ts b/src/app/core/services/helpers/config.helpers.ts
index 3e0af96..9d0c191 100644
--- a/src/app/core/services/helpers/config.helpers.ts
+++ b/src/app/core/services/helpers/config.helpers.ts
@@ -8,7 +8,8 @@
 }
 
 export interface IXosConfigHelpersService {
-  modeldefToTableCfg(fields: IXosModelDefsField[]): any[]; // TODO use a proper interface
+  excluded_fields: string[];
+  modeldefToTableCfg(fields: IXosModelDefsField[], baseUrl: string): any[]; // TODO use a proper interface
   pluralize(string: string, quantity?: number, count?: boolean): string;
   toLabel(string: string, pluralize?: boolean): string;
   toLabels(string: string[], pluralize?: boolean): string[];
@@ -16,6 +17,22 @@
 
 export class ConfigHelpers {
 
+  excluded_fields = [
+    'created',
+    'updated',
+    'enacted',
+    'policed',
+    'backend_register',
+    'deleted',
+    'write_protect',
+    'lazy_blocked',
+    'no_sync',
+    'no_policy',
+    'omf_friendly',
+    'enabled',
+    'validators'
+  ];
+
   constructor() {
     pluralize.addIrregularRule('xos', 'xosses');
     pluralize.addPluralRule(/slice$/i, 'slices');
@@ -46,23 +63,10 @@
     return this.capitalizeFirst(string);
   }
 
-  modeldefToTableCfg(fields: IXosModelDefsField[]): IXosTableColumn[] {
-    const excluded_fields = [
-      'created',
-      'updated',
-      'enacted',
-      'policed',
-      'backend_register',
-      'deleted',
-      'write_protect',
-      'lazy_blocked',
-      'no_sync',
-      'no_policy',
-      'omf_friendly',
-      'enabled'
-    ];
+  modeldefToTableCfg(fields: IXosModelDefsField[], baseUrl: string): IXosTableColumn[] {
+
     const cfg =  _.map(fields, (f) => {
-      if (excluded_fields.indexOf(f.name) > -1) {
+      if (this.excluded_fields.indexOf(f.name) > -1) {
         return;
       }
       const col: IXosTableColumn =  {
@@ -70,6 +74,11 @@
         prop: f.name
       };
 
+      if (f.name === 'id') {
+        // NOTE can we find a better method to generalize?
+        col.link = item => `#/core${baseUrl.replace(':id?', item.id)}`;
+      }
+
       if (f.name === 'backend_status') {
         col.type = 'icon';
         col.formatter = (item) => {
diff --git a/src/app/core/services/page-title.spec.ts b/src/app/core/services/page-title.spec.ts
index 4ff2be6..0959e57 100644
--- a/src/app/core/services/page-title.spec.ts
+++ b/src/app/core/services/page-title.spec.ts
@@ -28,4 +28,9 @@
     service.set('sample');
     expect($window.document.title).toEqual(`${StyleConfig.projectName} - sample`);
   });
+
+  it('should convert dots to >', () => {
+    service.set('core.sample.bread.crumb');
+    expect($window.document.title).toEqual(`${StyleConfig.projectName} - core > sample > bread > crumb`);
+  });
 });
diff --git a/src/app/core/services/page-title.ts b/src/app/core/services/page-title.ts
index fb1e5a7..865149d 100644
--- a/src/app/core/services/page-title.ts
+++ b/src/app/core/services/page-title.ts
@@ -12,7 +12,7 @@
     private $transitions: any // missing definition
   ) {
     this.$transitions.onSuccess({ to: '**' }, (transtion) => {
-      this.set(this.formatStateName(transtion.$to().name));
+      this.set(transtion.$to().name);
     });
   }
 
@@ -21,12 +21,12 @@
   }
 
   set(title: string) {
-    this.$window.document.title = `${StyleConfig.projectName} - ${title}`;
+    this.$window.document.title = `${StyleConfig.projectName} - ${this.formatStateName(title)}`;
   }
 
   private formatStateName(stateName: string): string {
     // TODO pluralize and capitalize first letter only
-    return stateName.replace('xos.', '').toUpperCase();
+    return stateName.replace('xos.', '').split('.').join(' > ');
   }
 }