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',