blob: 92d402dc7dfc32b8b83ca717ad0370eb4b7c73ca [file] [log] [blame]
import './header.scss';
import {StyleConfig} from '../../config/style.config';
import {IWSEvent} from '../../datasources/websocket/global';
import {IStoreService} from '../../datasources/stores/synchronizer.store';
import {IXosAuthService} from '../../datasources/rest/auth.rest';
import {IXosNavigationService, IXosNavigationRoute} from '../services/navigation';
import {IStateService} from 'angular-ui-router';
import * as _ from 'lodash';
import * as $ from 'jquery';
export interface INotification extends IWSEvent {
viewed?: boolean;
}
class HeaderController {
static $inject = ['$scope', '$state', 'AuthService', 'SynchronizerStore', 'toastr', 'toastrConfig', 'NavigationService'];
public notifications: INotification[] = [];
public newNotifications: INotification[] = [];
public version: string;
public userEmail: string;
public routeSelected: (route: IXosNavigationRoute) => void;
public states: IXosNavigationRoute[];
public query: string;
constructor(
private $scope: angular.IScope,
private $state: IStateService,
private authService: IXosAuthService,
private syncStore: IStoreService,
private toastr: ng.toastr.IToastrService,
private toastrConfig: ng.toastr.IToastrConfig,
private NavigationService: IXosNavigationService
) {
this.version = require('../../../../package.json').version;
angular.extend(this.toastrConfig, {
newestOnTop: false,
positionClass: 'toast-top-right',
preventDuplicates: false,
preventOpenDuplicates: false,
progressBar: true,
// autoDismiss: false,
// closeButton: false,
// timeOut: 0,
// tapToDismiss: false
});
// TODO set a global event after routes have been loaded
window.setTimeout(() => {
this.states = this.NavigationService.query().reduce((list, state) => {
// if it does not have child (otherwise it is abstract)
if (!state.children || state.children.length === 0) {
list.push(state);
}
// else push child
if (state.children && state.children.length > 0) {
state.children.forEach(c => {
list.push(c);
});
}
return list;
}, []);
this.states = _.uniqBy(this.states, 'state');
}, 500);
// listen for keypress
$(document).on('keyup', (e) => {
if (e.key === 'f') {
$('.navbar-form input').focus();
}
});
// redirect to selected page
this.routeSelected = (item: IXosNavigationRoute) => {
console.log(`go to: ${item.state}`);
this.$state.go(item.state);
this.query = null;
};
this.userEmail = this.authService.getUser() ? this.authService.getUser().email : '';
this.syncStore.query()
.subscribe(
(event: IWSEvent) => {
$scope.$evalAsync(() => {
let toastrMsg: string;
let toastrLevel: string;
if (event.msg.object.backend_status.indexOf('0') > -1) {
toastrMsg = 'Synchronization started for:';
toastrLevel = 'info';
}
else if (event.msg.object.backend_status.indexOf('1') > -1) {
toastrMsg = 'Synchronization succedeed for:';
toastrLevel = 'success';
}
else if (event.msg.object.backend_status.indexOf('2') > -1) {
toastrMsg = 'Synchronization failed for:';
toastrLevel = 'error';
}
if (toastrLevel && toastrMsg) {
this.toastr[toastrLevel](`${toastrMsg} ${event.msg.object.name}`, event.model);
}
// this.notifications.unshift(event);
// this.newNotifications = this.getNewNotifications(this.notifications);
});
}
);
}
public getLogo(): string {
return require(`../../images/brand/${StyleConfig.logo}`);
}
// TODO display a list of notification in the template (if it make sense)
// public viewNotification = (notification: INotification) => {
// notification.viewed = true;
// this.newNotifications = this.getNewNotifications(this.notifications);
// };
//
// private getNewNotifications = (notifications: INotification[]) => {
// return this.notifications.filter((n: INotification) => {
// return !n.viewed;
// });
// };
}
export const xosHeader: angular.IComponentOptions = {
template: require('./header.html'),
controllerAs: 'vm',
controller: HeaderController
};