Dashboard and nginx fixes

Change-Id: I4ee34b24779f929f41852d4662018caead860ab6
diff --git a/src/app/core/header/header.ts b/src/app/core/header/header.ts
index efaa385..849767f 100644
--- a/src/app/core/header/header.ts
+++ b/src/app/core/header/header.ts
@@ -35,7 +35,7 @@
       // tapToDismiss: false
     });
 
-    this.userEmail = this.authService.getUser().email;
+    this.userEmail = this.authService.getUser() ? this.authService.getUser().email : '';
 
     this.syncStore.query()
       .subscribe(
diff --git a/src/app/core/nav/nav.scss b/src/app/core/nav/nav.scss
index 7646cd9..ef3020b 100644
--- a/src/app/core/nav/nav.scss
+++ b/src/app/core/nav/nav.scss
@@ -1,5 +1,18 @@
 xos-nav {
+  .navigation {
+    max-height: 100%;
+    display: block;
+    overflow-y: scroll;
+
+    nav {
+      margin-bottom: 200px;
+    }
+  }
+
   .nav-info {
+    position: fixed !important;
+    bottom: 0;
+    width: 200px;
     .row + .row:last-child {
       margin-top: 20px;
     }
diff --git a/src/app/core/services/helpers/config.helpers.ts b/src/app/core/services/helpers/config.helpers.ts
index f9b76f0..599edaf 100644
--- a/src/app/core/services/helpers/config.helpers.ts
+++ b/src/app/core/services/helpers/config.helpers.ts
@@ -30,7 +30,8 @@
     'no_policy',
     'omf_friendly',
     'enabled',
-    'validators'
+    'validators',
+    'password'
   ];
 
   constructor() {
diff --git a/src/app/core/table/table.html b/src/app/core/table/table.html
index 23b5a2f..382dbec 100644
--- a/src/app/core/table/table.html
+++ b/src/app/core/table/table.html
@@ -8,19 +8,20 @@
                     ng-model="vm.query"/>
         </div>
     </div>
-    <table ng-class="vm.classes">
+    <div class="table-responsive">
+        <table ng-class="vm.classes">
         <thead>
         <tr>
             <th ng-repeat="col in vm.columns">
                 {{col.label}}
-                <span ng-if="vm.config.order">
+                <div ng-if="vm.config.order">
                     <a href="" ng-click="vm.orderBy = col.prop; vm.reverse = false">
                       <i class="fa fa-chevron-up"></i>
                     </a>
                     <a href="" ng-click="vm.orderBy = col.prop; vm.reverse = true">
                       <i class="fa fa-chevron-down"></i>
                     </a>
-                  </span>
+                </div>
             </th>
             <th ng-if="vm.config.actions">Actions:</th>
         </tr>
@@ -90,6 +91,7 @@
         </tr>
         </tbody>
     </table>
+    </div>
 <!--</div>-->
 <!--<div ng-show="(vm.data.length == 0 || !vm.data) && vm.loader == false">-->
     <!--<xos-alert config="{type: 'info'}">-->
diff --git a/src/app/core/table/table.scss b/src/app/core/table/table.scss
index fbf6ee7..a2af05e 100644
--- a/src/app/core/table/table.scss
+++ b/src/app/core/table/table.scss
@@ -1,7 +1,10 @@
+xos-table {
+  .row + .table-responsive {
+    margin-top: 10px;
+  }
+}
+
 table {
-  width: 100%;
-  max-width: 100%;
-  margin-bottom: 20px;
   border-collapse: collapse !important;
   background: darken(grey, 20);
   border: 1px solid darken(grey, 35);
diff --git a/src/app/core/table/table.ts b/src/app/core/table/table.ts
index dba740e..1ed258d 100644
--- a/src/app/core/table/table.ts
+++ b/src/app/core/table/table.ts
@@ -22,13 +22,15 @@
 }
 
 interface IXosTableCgfOrder {
-  reverse: boolean;
+  reverse?: boolean;
   field: string;
 }
 
 export interface IXosTableCfg {
   columns: any[];
-  order?: IXosTableCgfOrder; // | boolean;
+  order?: IXosTableCgfOrder;
+  filter?: string;
+  actions?: any[]; // TODO create interface
 }
 
 class TableCtrl {
diff --git a/src/app/datasources/rest/auth.rest.ts b/src/app/datasources/rest/auth.rest.ts
index e7a593c..f963799 100644
--- a/src/app/datasources/rest/auth.rest.ts
+++ b/src/app/datasources/rest/auth.rest.ts
@@ -21,7 +21,8 @@
 export interface IXosAuthService {
   login(data: IAuthRequestData): Promise<any>;
   logout(): Promise<any>;
-  getUser(): IXosUser;
+  getUser(): any; // NOTE how to define return user || false ???
+  isAuthenticated(): boolean;
 }
 export class AuthService {
 
@@ -67,6 +68,16 @@
   }
 
   public getUser(): IXosUser {
-    return JSON.parse(this.$cookies.get('xosuser'));
+    const user = this.$cookies.get('xosuser');
+    if (angular.isDefined(user)) {
+      return JSON.parse(user);
+    }
+    return;
+  }
+
+  public isAuthenticated(): boolean {
+    const token = this.$cookies.get('xoscsrftoken');
+    const session = this.$cookies.get('xossessionid');
+    return angular.isDefined(token) && angular.isDefined(session);
   }
 }
diff --git a/src/app/datasources/rest/model.rest.ts b/src/app/datasources/rest/model.rest.ts
index 908ca0f..eca4221 100644
--- a/src/app/datasources/rest/model.rest.ts
+++ b/src/app/datasources/rest/model.rest.ts
@@ -16,6 +16,6 @@
   }
 
   public getResource(url: string): ng.resource.IResourceClass<ng.resource.IResource<any>> {
-    return this.resource = this.$resource(`${AppConfig.apiEndpoint}${url}/:id`);
+    return this.resource = this.$resource(`${AppConfig.apiEndpoint}${url}/:id`, {id: '@id'});
   }
 }
diff --git a/src/app/datasources/stores/model.store.ts b/src/app/datasources/stores/model.store.ts
index fa3ab06..0839cc7 100644
--- a/src/app/datasources/stores/model.store.ts
+++ b/src/app/datasources/stores/model.store.ts
@@ -18,6 +18,8 @@
     private ModelRest: IXosResourceService
   ) {
   }
+  // FIXME if called multiple time (for different collection),
+  // it return the same observable while it should return different ones
 
   query(model: string) {
     this.loadInitialData(model);
diff --git a/src/app/views/dashboard/dashboard.html b/src/app/views/dashboard/dashboard.html
new file mode 100644
index 0000000..de4c358
--- /dev/null
+++ b/src/app/views/dashboard/dashboard.html
@@ -0,0 +1,42 @@
+<section class="content">
+    <div class="container-fluid">
+        <!--<h1>Dashboard</h1>-->
+        <div class="row">
+            <div class="col-xs-4">
+                <div class="panel panel-filled">
+                    <div class="panel-body text-center">
+                        <h2 class="m-b-none">
+                            {{vm.nodes}}
+                            <!--<span class="slight"><i class="fa fa-play fa-rotate-270 text-warning"> </i> +20%</span>-->
+                        </h2>
+                        <h4>Nodes</h4>
+                        <!--<div class="small">% New Sessions</div>-->
+                        <!--<div class="slight m-t-sm"><i class="fa fa-clock-o"> </i> Updated: <span class="c-white">10:22pm</span></div>-->
+                    </div>
+                </div>
+            </div>
+
+            <div class="col-xs-4">
+                <div class="panel panel-filled">
+                    <div class="panel-body text-center">
+                        <h2 class="m-b-none">
+                            {{vm.slices}}
+                        </h2>
+                        <h4>Slices</h4>
+                    </div>
+                </div>
+            </div>
+
+            <div class="col-xs-4">
+                <div class="panel panel-filled">
+                    <div class="panel-body text-center">
+                        <h2 class="m-b-none">
+                            {{vm.instances}}
+                        </h2>
+                        <h4>Instances</h4>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+</section>
\ No newline at end of file
diff --git a/src/app/views/dashboard/dashboard.ts b/src/app/views/dashboard/dashboard.ts
new file mode 100644
index 0000000..776acf6
--- /dev/null
+++ b/src/app/views/dashboard/dashboard.ts
@@ -0,0 +1,46 @@
+import {IModelStoreService} from '../../datasources/stores/model.store';
+import {IXosAuthService} from '../../datasources/rest/auth.rest';
+class DashboardController {
+  static $inject = ['$state', 'ModelStore', 'AuthService'];
+
+  public nodes: number;
+  public slices: number;
+  public instances: number;
+
+  constructor(
+    private $state: ng.ui.IStateService,
+    private store: IModelStoreService,
+    private auth: IXosAuthService
+  ) {
+
+    if (!this.auth.isAuthenticated()) {
+      this.$state.go('login');
+    }
+    else {
+      // this.store.query('node')
+      //   .subscribe((event) => {
+      //     console.log(`node`, event);
+      //     this.nodes = event.length;
+      // });
+      this.store.query('slice')
+        .subscribe((event) => {
+          // console.log('slice', event);
+          this.slices = event.length;
+      });
+      // this.store.query('instance')
+      //   .subscribe((event) => {
+      //     console.log('isntance', event);
+      //     this.instances = event.length;
+      // });
+      this.instances = 0;
+      this.nodes = 2;
+      this.slices = 3;
+    }
+  }
+}
+
+export const xosDashboard: angular.IComponentOptions = {
+  template: require('./dashboard.html'),
+  controllerAs: 'vm',
+  controller: DashboardController
+};
diff --git a/src/app/views/index.ts b/src/app/views/index.ts
index 495e2a4..ee87ef9 100644
--- a/src/app/views/index.ts
+++ b/src/app/views/index.ts
@@ -1,8 +1,10 @@
 import {xosCore} from '../core/index';
 import {xosCrud} from './crud/crud';
+import {xosDashboard} from './dashboard/dashboard';
 
 export const xosViews = 'xosViews';
 
 angular
   .module('xosViews', [xosCore])
-  .component('xosCrud', xosCrud);
+  .component('xosCrud', xosCrud)
+  .component('xosDashboard', xosDashboard);
diff --git a/src/index.ts b/src/index.ts
index 48244ef..4ba1f3d 100644
--- a/src/index.ts
+++ b/src/index.ts
@@ -90,7 +90,20 @@
               model: m.name,
               related: m.relations,
               xosTableCfg: {
-                columns: ConfigHelpers.modeldefToTableCfg(m.fields, stateUrl)
+                columns: ConfigHelpers.modeldefToTableCfg(m.fields, stateUrl),
+                filter: 'fulltext',
+                order: {field: 'id', reverse: false}, // TODO understand dynamic interfaces
+                actions: [
+                  {
+                    label: 'delete',
+                    icon: 'remove',
+                    color: 'red',
+                    cb: (item) => {
+                      console.log(item);
+                      item.$delete();
+                    }
+                  }
+                ]
               },
               // TODO add form config
             }
diff --git a/src/interceptors.ts b/src/interceptors.ts
index 57f79f2..ef765c0 100644
--- a/src/interceptors.ts
+++ b/src/interceptors.ts
@@ -33,7 +33,7 @@
       if (!$cookies.get('xoscsrftoken') || !$cookies.get('xossessionid')) {
         return req;
       }
-      // req.headers['X-CSRFToken'] = $cookies.get('xoscsrftoken');
+      req.headers['X-CSRFToken'] = $cookies.get('xoscsrftoken');
       req.headers['x-csrftoken'] = $cookies.get('xoscsrftoken');
       req.headers['x-sessionid'] = $cookies.get('xossessionid');
       return req;
diff --git a/src/routes.ts b/src/routes.ts
index e972d22..3e9274e 100644
--- a/src/routes.ts
+++ b/src/routes.ts
@@ -18,7 +18,7 @@
     .state('xos.dashboard', {
       url: '',
       parent: 'xos',
-      template: '<h1>Dashboard</h1>'
+      template: '<xos-dashboard></xos-dashboard>'
     })
     .state('xos.core', {
       url: 'core',