@c8y/ngx-components
Version:
Angular modules for Cumulocity IoT applications
160 lines • 19.1 kB
JavaScript
import { Injectable } from '@angular/core';
import { combineLatest, BehaviorSubject } from 'rxjs';
import { map, debounceTime, distinctUntilChanged, delay } from 'rxjs/operators';
import { OptionsService } from '../common/options.service';
import { StateService } from '../common/state-service.abstract';
import { HumanizeAppNamePipe } from '../common/humanize-app-name.pipe';
import { DrawerService } from '../drawer/drawer.service';
import * as i0 from "@angular/core";
import * as i1 from "../common/options.service";
import * as i2 from "../common/humanize-app-name.pipe";
import * as i3 from "../drawer/drawer.service";
/**
* A service which defines header functions.
*/
export class HeaderService extends StateService {
constructor(options, humanizeAppName, drawerService) {
super();
this.options = options;
this.humanizeAppName = humanizeAppName;
this.drawerService = drawerService;
this.headerOpen = false;
this.hideHeader = false;
this.state$ = new BehaviorSubject({
title: undefined,
nav: {
open: false
},
rightDrawer: {
open: false
}
});
this.DELAY_TO_AVOID_FLICKERING_ON_ASYNC_NODES = 1000;
this.header$ = this.map((header) => header);
this.canToggleNavigator$ = this.drawerService.items$.pipe(map(items => !!items.filter(tmp => tmp.position === 'left' && !tmp.noneRequired)?.length), distinctUntilChanged(), delay(this.DELAY_TO_AVOID_FLICKERING_ON_ASYNC_NODES));
this.navigatorOpen$ = combineLatest([
this.map(({ nav }) => nav.open),
this.canToggleNavigator$
]).pipe(map(([open, hasItems]) => open && hasItems));
this.rightDrawerOpen$ = this.map(({ rightDrawer }) => rightDrawer.open).pipe();
const titleReference = document.querySelector('title');
this.title = {
elementRef: titleReference,
titleSuffix: '',
titlePrefix: ''
};
combineLatest([
this.humanizeAppName.transform(options.name),
this.options.get$('globalTitle', '', false)
]).subscribe(([nameTranslated, globalTitle]) => {
this.title.titleSuffix = this.isGlobalTitleValid(globalTitle)
? `${globalTitle} - ${nameTranslated}`
: nameTranslated;
this.changePageTitle(this.title.titlePrefix);
});
this.hideHeader = this.options.get('hideHeader', false);
}
get state() {
return this.state$.value;
}
get navigatorHiddenOnStartup() {
return this.options.hideNavigator;
}
get largeWidth() {
return document.documentElement.clientWidth > 1200;
}
get shouldToggle() {
return this.largeWidth && !this.navigatorHiddenOnStartup && !this.state.nav.open;
}
/**
* Toggles the main header menu in mobile view.
*/
toggle() {
this.headerOpen = !this.headerOpen;
}
/**
* Toggles the navigator open status.
*/
toggleNavigator() {
this.state.nav.open = !this.state.nav.open;
this.emitNewState();
}
/**
* Force to close the navigator.
*/
closeNavigator() {
this.state.nav.open = false;
this.emitNewState();
}
/**
* Toggles the right drawer open status.
*/
toggleRightDrawer() {
this.state.rightDrawer.open = !this.state.rightDrawer.open;
this.emitNewState();
}
/**
* Force to close the right drawer.
*/
closeRightDrawer() {
this.state.rightDrawer.open = false;
this.emitNewState();
}
/**
* Configures navigation options.
* @param config Object with the properties:
* - open: Boolean
*/
configNavigator(config = {}) {
this.state.nav = Object.assign(this.state.nav, config);
this.emitNewState();
}
/**
* Change the application title.
* @param newTitle The new title of the application.
*/
changeTitle(newTitle, pageTitleUpdate = true) {
this.state.title = newTitle;
this.state.pageTitleUpdate = pageTitleUpdate;
this.emitNewState();
}
/**
* Change the page title.
* @param newTitle The new title of the page.
*/
changePageTitle(newTitle) {
this.title.titlePrefix = newTitle;
// only really needed for unit tests
if (!this.title.elementRef) {
return;
}
this.title.elementRef.innerText = newTitle
? `${newTitle} / ${this.title.titleSuffix}`
: `${this.title.titleSuffix}`;
}
/**
* This methods checks if the navigator toggles on startup
* or if an item is added to the navigator node.
* Delay of 300ms is intended for animation purpose.
*/
verifyIfNavOpen() {
this.canToggleNavigator$
.pipe(debounceTime(300))
.subscribe(hasItems => hasItems && this.shouldToggle && this.toggleNavigator());
}
shouldShowBreadcrumbs() {
return this.options.breadcrumbs;
}
isGlobalTitleValid(globalTitle) {
return !!globalTitle && typeof globalTitle === 'string' && globalTitle.length > 0;
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: HeaderService, deps: [{ token: i1.OptionsService }, { token: i2.HumanizeAppNamePipe }, { token: i3.DrawerService }], target: i0.ɵɵFactoryTarget.Injectable }); }
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: HeaderService, providedIn: 'root' }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: HeaderService, decorators: [{
type: Injectable,
args: [{
providedIn: 'root'
}]
}], ctorParameters: () => [{ type: i1.OptionsService }, { type: i2.HumanizeAppNamePipe }, { type: i3.DrawerService }] });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGVhZGVyLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9jb3JlL2hlYWRlci9oZWFkZXIuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNDLE9BQU8sRUFBRSxhQUFhLEVBQUUsZUFBZSxFQUFjLE1BQU0sTUFBTSxDQUFDO0FBQ2xFLE9BQU8sRUFBRSxHQUFHLEVBQUUsWUFBWSxFQUFFLG9CQUFvQixFQUFFLEtBQUssRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ2hGLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUMzRCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFFaEUsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFDdkUsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLDBCQUEwQixDQUFDOzs7OztBQUV6RDs7R0FFRztBQUlILE1BQU0sT0FBTyxhQUFjLFNBQVEsWUFBWTtJQXFCN0MsWUFDVSxPQUF1QixFQUN2QixlQUFvQyxFQUNwQyxhQUE0QjtRQUVwQyxLQUFLLEVBQUUsQ0FBQztRQUpBLFlBQU8sR0FBUCxPQUFPLENBQWdCO1FBQ3ZCLG9CQUFlLEdBQWYsZUFBZSxDQUFxQjtRQUNwQyxrQkFBYSxHQUFiLGFBQWEsQ0FBZTtRQXZCdEMsZUFBVSxHQUFHLEtBQUssQ0FBQztRQUtuQixlQUFVLEdBQUcsS0FBSyxDQUFDO1FBRW5CLFdBQU0sR0FBNEIsSUFBSSxlQUFlLENBQVM7WUFDNUQsS0FBSyxFQUFFLFNBQVM7WUFDaEIsR0FBRyxFQUFFO2dCQUNILElBQUksRUFBRSxLQUFLO2FBQ1o7WUFDRCxXQUFXLEVBQUU7Z0JBQ1gsSUFBSSxFQUFFLEtBQUs7YUFDWjtTQUNGLENBQUMsQ0FBQztRQUdNLDZDQUF3QyxHQUFHLElBQUksQ0FBQztRQVF2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J0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgY29tYmluZUxhdGVzdCwgQmVoYXZpb3JTdWJqZWN0LCBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBtYXAsIGRlYm91bmNlVGltZSwgZGlzdGluY3RVbnRpbENoYW5nZWQsIGRlbGF5IH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgT3B0aW9uc1NlcnZpY2UgfSBmcm9tICcuLi9jb21tb24vb3B0aW9ucy5zZXJ2aWNlJztcbmltcG9ydCB7IFN0YXRlU2VydmljZSB9IGZyb20gJy4uL2NvbW1vbi9zdGF0ZS1zZXJ2aWNlLmFic3RyYWN0JztcbmltcG9ydCB7IEhlYWRlciB9IGZyb20gJy4vaGVhZGVyLm1vZGVsJztcbmltcG9ydCB7IEh1bWFuaXplQXBwTmFtZVBpcGUgfSBmcm9tICcuLi9jb21tb24vaHVtYW5pemUtYXBwLW5hbWUucGlwZSc7XG5pbXBvcnQgeyBEcmF3ZXJTZXJ2aWNlIH0gZnJvbSAnLi4vZHJhd2VyL2RyYXdlci5zZXJ2aWNlJztcblxuLyoqXG4gKiBBIHNlcnZpY2Ugd2hpY2ggZGVmaW5lcyBoZWFkZXIgZnVuY3Rpb25zLlxuICovXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290J1xufSlcbmV4cG9ydCBjbGFzcyBIZWFkZXJTZXJ2aWNlIGV4dGVuZHMgU3RhdGVTZXJ2aWNlIHtcbiAgaGVhZGVyT3BlbiA9IGZhbHNlO1xuICBoZWFkZXIkOiBPYnNlcnZhYmxlPEhlYWRlcj47XG4gIG5hdmlnYXRvck9wZW4kOiBPYnNlcnZhYmxlPGJvb2xlYW4+O1xuICByaWdodERyYXdlck9wZW4kOiBPYnNlcnZhYmxlPGJvb2xlYW4+O1xuICBjYW5Ub2dnbGVOYXZpZ2F0b3IkOiBPYnNlcnZhYmxlPGJvb2xlYW4+O1xuICBoaWRlSGVhZGVyID0gZmFsc2U7XG5cbiAgc3RhdGUkOiBCZWhhdmlvclN1YmplY3Q8SGVhZGVyPiA9IG5ldyBCZWhhdmlvclN1YmplY3Q8SGVhZGVyPih7XG4gICAgdGl0bGU6IHVuZGVmaW5lZCxcbiAgICBuYXY6IHtcbiAgICAgIG9wZW46IGZhbHNlXG4gICAgfSxcbiAgICByaWdodERyYXdlcjoge1xuICAgICAgb3BlbjogZmFsc2VcbiAgICB9XG4gIH0pO1xuXG4gIHRpdGxlOiB7IGVsZW1lbnRSZWY/OiBIVE1MVGl0bGVFbGVtZW50OyB0aXRsZVN1ZmZpeDogc3RyaW5nOyB0aXRsZVByZWZpeDogc3RyaW5nIH0gfCB1bmRlZmluZWQ7XG4gIHJlYWRvbmx5IERFTEFZX1RPX0FWT0lEX0ZMSUNLRVJJTkdfT05fQVNZTkNfTk9ERVMgPSAxMDAwO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgb3B0aW9uczogT3B0aW9uc1NlcnZpY2UsXG4gICAgcHJpdmF0ZSBodW1hbml6ZUFwcE5hbWU6IEh1bWFuaXplQXBwTmFtZVBpcGUsXG4gICAgcHJpdmF0ZSBkcmF3ZXJTZXJ2aWNlOiBEcmF3ZXJTZXJ2aWNlXG4gICkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5oZWFkZXIkID0gdGhpcy5tYXAoKGhlYWRlcjogSGVhZGVyKSA9PiBoZWFkZXIpO1xuICAgIHRoaXMuY2FuVG9nZ2xlTmF2aWdhdG9yJCA9IHRoaXMuZHJhd2VyU2VydmljZS5pdGVtcyQucGlwZShcbiAgICAgIG1hcChpdGVtcyA9PiAhIWl0ZW1zLmZpbHRlcih0bXAgPT4gdG1wLnBvc2l0aW9uID09PSAnbGVmdCcgJiYgIXRtcC5ub25lUmVxdWlyZWQpPy5sZW5ndGgpLFxuICAgICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKSxcbiAgICAgIGRlbGF5KHRoaXMuREVMQVlfVE9fQVZPSURfRkxJQ0tFUklOR19PTl9BU1lOQ19OT0RFUylcbiAgICApO1xuICAgIHRoaXMubmF2aWdhdG9yT3BlbiQgPSBjb21iaW5lTGF0ZXN0KFtcbiAgICAgIHRoaXMubWFwKCh7IG5hdiB9KSA9PiBuYXYub3BlbiksXG4gICAgICB0aGlzLmNhblRvZ2dsZU5hdmlnYXRvciRcbiAgICBdKS5waXBlKG1hcCgoW29wZW4sIGhhc0l0ZW1zXSkgPT4gb3BlbiAmJiBoYXNJdGVtcykpO1xuICAgIHRoaXMucmlnaHREcmF3ZXJPcGVuJCA9IHRoaXMubWFwKCh7IHJpZ2h0RHJhd2VyIH0pID0+IHJpZ2h0RHJhd2VyLm9wZW4pLnBpcGUoKTtcbiAgICBjb25zdCB0aXRsZVJlZmVyZW5jZSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ3RpdGxlJyk7XG5cbiAgICB0aGlzLnRpdGxlID0ge1xuICAgICAgZWxlbWVudFJlZjogdGl0bGVSZWZlcmVuY2UsXG4gICAgICB0aXRsZVN1ZmZpeDogJycsXG4gICAgICB0aXRsZVByZWZpeDogJydcbiAgICB9O1xuXG4gICAgY29tYmluZUxhdGVzdChbXG4gICAgICB0aGlzLmh1bWFuaXplQXBwTmFtZS50cmFuc2Zvcm0ob3B0aW9ucy5uYW1lKSxcbiAgICAgIHRoaXMub3B0aW9ucy5nZXQkKCdnbG9iYWxUaXRsZScsICcnLCBmYWxzZSlcbiAgICBdKS5zdWJzY3JpYmUoKFtuYW1lVHJhbnNsYXRlZCwgZ2xvYmFsVGl0bGVdKSA9PiB7XG4gICAgICB0aGlzLnRpdGxlLnRpdGxlU3VmZml4ID0gdGhpcy5pc0dsb2JhbFRpdGxlVmFsaWQoZ2xvYmFsVGl0bGUpXG4gICAgICAgID8gYCR7Z2xvYmFsVGl0bGV9IC0gJHtuYW1lVHJhbnNsYXRlZH1gXG4gICAgICAgIDogbmFtZVRyYW5zbGF0ZWQ7XG5cbiAgICAgIHRoaXMuY2hhbmdlUGFnZVRpdGxlKHRoaXMudGl0bGUudGl0bGVQcmVmaXgpO1xuICAgIH0pO1xuICAgIHRoaXMuaGlkZUhlYWRlciA9IHRoaXMub3B0aW9ucy5nZXQoJ2hpZGVIZWFkZXInLCBmYWxzZSk7XG4gIH1cblxuICBnZXQgc3RhdGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuc3RhdGUkLnZhbHVlO1xuICB9XG5cbiAgZ2V0IG5hdmlnYXRvckhpZGRlbk9uU3RhcnR1cCgpIHtcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLmhpZGVOYXZpZ2F0b3I7XG4gIH1cblxuICBnZXQgbGFyZ2VXaWR0aCgpIHtcbiAgICByZXR1cm4gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoID4gMTIwMDtcbiAgfVxuXG4gIGdldCBzaG91bGRUb2dnbGUoKSB7XG4gICAgcmV0dXJuIHRoaXMubGFyZ2VXaWR0aCAmJiAhdGhpcy5uYXZpZ2F0b3JIaWRkZW5PblN0YXJ0dXAgJiYgIXRoaXMuc3RhdGUubmF2Lm9wZW47XG4gIH1cblxuICAvKipcbiAgICogVG9nZ2xlcyB0aGUgbWFpbiBoZWFkZXIgbWVudSBpbiBtb2JpbGUgdmlldy5cbiAgICovXG4gIHRvZ2dsZSgpIHtcbiAgICB0aGlzLmhlYWRlck9wZW4gPSAhdGhpcy5oZWFkZXJPcGVuO1xuICB9XG5cbiAgLyoqXG4gICAqIFRvZ2dsZXMgdGhlIG5hdmlnYXRvciBvcGVuIHN0YXR1cy5cbiAgICovXG4gIHRvZ2dsZU5hdmlnYXRvcigpIHtcbiAgICB0aGlzLnN0YXRlLm5hdi5vcGVuID0gIXRoaXMuc3RhdGUubmF2Lm9wZW47XG4gICAgdGhpcy5lbWl0TmV3U3RhdGUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGb3JjZSB0byBjbG9zZSB0aGUgbmF2aWdhdG9yLlxuICAgKi9cbiAgY2xvc2VOYXZpZ2F0b3IoKSB7XG4gICAgdGhpcy5zdGF0ZS5uYXYub3BlbiA9IGZhbHNlO1xuICAgIHRoaXMuZW1pdE5ld1N0YXRlKCk7XG4gIH1cblxuICAvKipcbiAgICogVG9nZ2xlcyB0aGUgcmlnaHQgZHJhd2VyIG9wZW4gc3RhdHVzLlxuICAgKi9cbiAgdG9nZ2xlUmlnaHREcmF3ZXIoKSB7XG4gICAgdGhpcy5zdGF0ZS5yaWdodERyYXdlci5vcGVuID0gIXRoaXMuc3RhdGUucmlnaHREcmF3ZXIub3BlbjtcbiAgICB0aGlzLmVtaXROZXdTdGF0ZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZvcmNlIHRvIGNsb3NlIHRoZSByaWdodCBkcmF3ZXIuXG4gICAqL1xuICBjbG9zZVJpZ2h0RHJhd2VyKCkge1xuICAgIHRoaXMuc3RhdGUucmlnaHREcmF3ZXIub3BlbiA9IGZhbHNlO1xuICAgIHRoaXMuZW1pdE5ld1N0YXRlKCk7XG4gIH1cblxuICAvKipcbiAgICogQ29uZmlndXJlcyBuYXZpZ2F0aW9uIG9wdGlvbnMuXG4gICAqIEBwYXJhbSBjb25maWcgT2JqZWN0IHdpdGggdGhlIHByb3BlcnRpZXM6XG4gICAqIC0gb3BlbjogQm9vbGVhblxuICAgKi9cbiAgY29uZmlnTmF2aWdhdG9yKGNvbmZpZzogUGFydGlhbDxIZWFkZXJbJ25hdiddPiA9IHt9KSB7XG4gICAgdGhpcy5zdGF0ZS5uYXYgPSBPYmplY3QuYXNzaWduKHRoaXMuc3RhdGUubmF2LCBjb25maWcpO1xuICAgIHRoaXMuZW1pdE5ld1N0YXRlKCk7XG4gIH1cblxuICAvKipcbiAgICogQ2hhbmdlIHRoZSBhcHBsaWNhdGlvbiB0aXRsZS5cbiAgICogQHBhcmFtIG5ld1RpdGxlIFRoZSBuZXcgdGl0bGUgb2YgdGhlIGFwcGxpY2F0aW9uLlxuICAgKi9cbiAgY2hhbmdlVGl0bGUobmV3VGl0bGU/OiB1bmtub3duLCBwYWdlVGl0bGVVcGRhdGUgPSB0cnVlKSB7XG4gICAgdGhpcy5zdGF0ZS50aXRsZSA9IG5ld1RpdGxlO1xuICAgIHRoaXMuc3RhdGUucGFnZVRpdGxlVXBkYXRlID0gcGFnZVRpdGxlVXBkYXRlO1xuXG4gICAgdGhpcy5lbWl0TmV3U3RhdGUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGFuZ2UgdGhlIHBhZ2UgdGl0bGUuXG4gICAqIEBwYXJhbSBuZXdUaXRsZSBUaGUgbmV3IHRpdGxlIG9mIHRoZSBwYWdlLlxuICAgKi9cbiAgY2hhbmdlUGFnZVRpdGxlKG5ld1RpdGxlPzogc3RyaW5nKSB7XG4gICAgdGhpcy50aXRsZS50aXRsZVByZWZpeCA9IG5ld1RpdGxlO1xuICAgIC8vIG9ubHkgcmVhbGx5IG5lZWRlZCBmb3IgdW5pdCB0ZXN0c1xuICAgIGlmICghdGhpcy50aXRsZS5lbGVtZW50UmVmKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMudGl0bGUuZWxlbWVudFJlZi5pbm5lclRleHQgPSBuZXdUaXRsZVxuICAgICAgPyBgJHtuZXdUaXRsZX0gLyAke3RoaXMudGl0bGUudGl0bGVTdWZmaXh9YFxuICAgICAgOiBgJHt0aGlzLnRpdGxlLnRpdGxlU3VmZml4fWA7XG4gIH1cblxuICAvKipcbiAgICogVGhpcyBtZXRob2RzIGNoZWNrcyBpZiB0aGUgbmF2aWdhdG9yIHRvZ2dsZXMgb24gc3RhcnR1cFxuICAgKiBvciBpZiBhbiBpdGVtIGlzIGFkZGVkIHRvIHRoZSBuYXZpZ2F0b3Igbm9kZS5cbiAgICogRGVsYXkgb2YgMzAwbXMgaXMgaW50ZW5kZWQgZm9yIGFuaW1hdGlvbiBwdXJwb3NlLlxuICAgKi9cbiAgdmVyaWZ5SWZOYXZPcGVuKCkge1xuICAgIHRoaXMuY2FuVG9nZ2xlTmF2aWdhdG9yJFxuICAgICAgLnBpcGUoZGVib3VuY2VUaW1lKDMwMCkpXG4gICAgICAuc3Vic2NyaWJlKGhhc0l0ZW1zID0+IGhhc0l0ZW1zICYmIHRoaXMuc2hvdWxkVG9nZ2xlICYmIHRoaXMudG9nZ2xlTmF2aWdhdG9yKCkpO1xuICB9XG5cbiAgc2hvdWxkU2hvd0JyZWFkY3J1bWJzKCkge1xuICAgIHJldHVybiB0aGlzLm9wdGlvbnMuYnJlYWRjcnVtYnM7XG4gIH1cblxuICBwcml2YXRlIGlzR2xvYmFsVGl0bGVWYWxpZChnbG9iYWxUaXRsZTogc3RyaW5nKSB7XG4gICAgcmV0dXJuICEhZ2xvYmFsVGl0bGUgJiYgdHlwZW9mIGdsb2JhbFRpdGxlID09PSAnc3RyaW5nJyAmJiBnbG9iYWxUaXRsZS5sZW5ndGggPiAwO1xuICB9XG59XG4iXX0=