@universis/common
Version:
Universis - common directives and services
139 lines (138 loc) • 17 kB
JavaScript
import { ChangeDetectorRef, Injectable, Inject, InjectionToken } from '@angular/core';
import { TranslateService, TranslatePipe } from '@ngx-translate/core';
import * as i0 from "@angular/core";
import * as i1 from "@ngx-translate/core";
export let GUEST_SIDEBAR_LOCATIONS = new InjectionToken('app.guest-sidebar.locations');
class TranslationChangeDetector extends ChangeDetectorRef {
checkNoChanges() {
}
detach() {
}
detectChanges() {
}
markForCheck() {
}
reattach() {
}
}
export class AppGuestSidebarService {
constructor(_translateService, sidebarLocations) {
this._translateService = _translateService;
this.sidebarLocations = sidebarLocations;
this.navigationItems = [];
this._changeDetector = new TranslationChangeDetector();
}
loadConfig() {
return new Promise((resolve, reject) => {
this.addRange(this.sidebarLocations);
return resolve();
});
}
/**
* Adds one or more navigation items to application sidebar
* @param {AppSidebarNavigationItem} item
*/
add(...item) {
// initialize translate pipe with null change detector
const pipe = new TranslatePipe(this._translateService, this._changeDetector);
// add navigation items to array
this.navigationItems.push.apply(this.navigationItems, item.map(navigationItem => {
// translate name
const x = Object.assign(navigationItem, {
name: pipe.transform(navigationItem.key)
});
if (Array.isArray(x.children)) {
// translate children
x.children = x.children.map(child => {
return Object.assign(child, {
name: pipe.transform(child.key)
});
});
}
return x;
}));
}
/**
* Adds a collection of navigation items to application sidebar
* @param {Array<AppSidebarNavigationItem>} items
*/
addRange(items) {
return this.add.apply(this, items);
}
/**
* Remove one navigation item from application sidebar
* @param {AppSidebarNavigationItem} item
*/
remove(item) {
// find item to remove
const itemIndex = this.navigationItems.findIndex(el => el.name === item.name || el.url === item.url || el.key === item.key);
// if item is found
if (itemIndex !== -1) {
this.navigationItems.splice(itemIndex, 1);
}
}
/**
* Removes one or more navigation items from application sidebar
* @param {Array<AppSidebarNavigationItem>} items
*/
removeRange(items) {
for (const item of items) {
this.remove(item);
}
}
/**
* Adds one or more navigation items to as children to a sidebar item
* @param {AppSidebarNavigationItem} parent
* @param {AppSidebarNavigationItem} item
*/
addChild(parent, ...item) {
// initialize translate pipe with null change detector
const pipe = new TranslatePipe(this._translateService, this._changeDetector);
// translate child
const translatedChild = item.map(navigationItem => {
// translate name
const x = Object.assign(navigationItem, {
name: pipe.transform(navigationItem.key)
});
if (Array.isArray(x.children)) {
// translate children
x.children = x.children.map(child => {
return Object.assign(child, {
name: pipe.transform(child.key)
});
});
}
return x;
});
// find parent by index and insert into place
const parentIndex = this.navigationItems.findIndex(el => el.name === parent.name || el.url === parent.url || el.key === parent.key);
if (parentIndex) {
const parentWithChildren = this.navigationItems[parentIndex];
const childrenArray = parentWithChildren.children || [];
childrenArray.push.apply(childrenArray, translatedChild);
parentWithChildren.children = childrenArray;
// Replaces parent with parentWithChildren
this.navigationItems.splice(parentIndex, 1, parentWithChildren);
}
}
/**
* Adds a collection of navigation items to as children to a parent
* @param {AppSidebarNavigationItem} parent
* @param {Array<AppSidebarNavigationItem>} items
*/
addChildren(parent, items) {
return this.addChild.apply(this, [parent, ...items]);
}
}
AppGuestSidebarService.decorators = [
{ type: Injectable, args: [{
providedIn: 'root'
},] }
];
/** @nocollapse */
AppGuestSidebarService.ctorParameters = () => [
{ type: TranslateService },
{ type: Array, decorators: [{ type: Inject, args: [GUEST_SIDEBAR_LOCATIONS,] }] }
];
AppGuestSidebarService.ngInjectableDef = i0.defineInjectable({ factory: function AppGuestSidebarService_Factory() { return new AppGuestSidebarService(i0.inject(i1.TranslateService), i0.inject(GUEST_SIDEBAR_LOCATIONS)); }, token: AppGuestSidebarService, providedIn: "root" });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwLWd1ZXN0LXNpZGViYXIuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0B1bml2ZXJzaXMvY29tbW9uLyIsInNvdXJjZXMiOlsic2hhcmVkL3NlcnZpY2VzL2FwcC1ndWVzdC1zaWRlYmFyLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLGlCQUFpQixFQUFFLFVBQVUsRUFBWSxNQUFNLEVBQUUsY0FBYyxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQzlGLE9BQU8sRUFBQyxnQkFBZ0IsRUFBRSxhQUFhLEVBQUMsTUFBTSxxQkFBcUIsQ0FBQzs7O0FBWXBFLE1BQU0sQ0FBQyxJQUFJLHVCQUF1QixHQUFHLElBQUksY0FBYyxDQUFrQyw2QkFBNkIsQ0FBQyxDQUFDO0FBRXhILCtCQUFnQyxTQUFRLGlCQUFpQjtJQUN2RCxjQUFjO0lBQ2QsQ0FBQztJQUVELE1BQU07SUFDTixDQUFDO0lBRUQsYUFBYTtJQUNiLENBQUM7SUFFRCxZQUFZO0lBQ1osQ0FBQztJQUVELFFBQVE7SUFDUixDQUFDO0NBRUY7QUFLRCxNQUFNO0lBSUosWUFBb0IsaUJBQW1DLEVBQ1osZ0JBQWlEO1FBRHhFLHNCQUFpQixHQUFqQixpQkFBaUIsQ0FBa0I7UUFDWixxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQWlDO1FBSHJGLG9CQUFlLEdBQW9DLEVBQUUsQ0FBQztRQUkzRCxJQUFJLENBQUMsZUFBZSxHQUFHLElBQUkseUJBQXlCLEVBQUUsQ0FBQztJQUN6RCxDQUFDO0lBRU0sVUFBVTtRQUNmLE9BQU8sSUFBSSxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsTUFBTSxFQUFFLEVBQUU7WUFDckMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztZQUNyQyxPQUFPLE9BQU8sRUFBRSxDQUFDO1FBQ25CLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVEOzs7T0FHRztJQUNJLEdBQUcsQ0FBQyxHQUFHLElBQXFD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WUFsQ08sZ0JBQWdCO1lBd0N1QyxLQUFLLHVCQUEvRCxNQUFNLFNBQUMsdUJBQXVCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtDaGFuZ2VEZXRlY3RvclJlZiwgSW5qZWN0YWJsZSwgT3B0aW9uYWwsIEluamVjdCwgSW5qZWN0aW9uVG9rZW59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtUcmFuc2xhdGVTZXJ2aWNlLCBUcmFuc2xhdGVQaXBlfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcblxuZXhwb3J0IGRlY2xhcmUgaW50ZXJmYWNlIEFwcFNpZGViYXJOYXZpZ2F0aW9uSXRlbSB7XG4gIGtleTogc3RyaW5nO1xuICB1cmw6IHN0cmluZztcbiAgbmFtZT86IHN0cmluZztcbiAgY2xhc3M/OiBzdHJpbmc7XG4gIGluZGV4PzogbnVtYmVyO1xuICBpY29uPzogc3RyaW5nO1xuICBjaGlsZHJlbj86IEFycmF5PEFwcFNpZGViYXJOYXZpZ2F0aW9uSXRlbT47XG59XG5cbmV4cG9ydCBsZXQgR1VFU1RfU0lERUJBUl9MT0NBVElPTlMgPSBuZXcgSW5qZWN0aW9uVG9rZW48QXJyYXk8QXBwU2lkZWJhck5hdmlnYXRpb25JdGVtPj4oJ2FwcC5ndWVzdC1zaWRlYmFyLmxvY2F0aW9ucycpO1xuXG5jbGFzcyBUcmFuc2xhdGlvbkNoYW5nZURldGVjdG9yIGV4dGVuZHMgQ2hhbmdlRGV0ZWN0b3JSZWYge1xuICBjaGVja05vQ2hhbmdlcygpOiB2b2lkIHtcbiAgfVxuXG4gIGRldGFjaCgpOiB2b2lkIHtcbiAgfVxuXG4gIGRldGVjdENoYW5nZXMoKTogdm9pZCB7XG4gIH1cblxuICBtYXJrRm9yQ2hlY2soKTogdm9pZCB7XG4gIH1cblxuICByZWF0dGFjaCgpOiB2b2lkIHtcbiAgfVxuXG59XG5cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnXG59KVxuZXhwb3J0IGNsYXNzIEFwcEd1ZXN0U2lkZWJhclNlcnZpY2Uge1xuXG4gIHB1YmxpYyBuYXZpZ2F0aW9uSXRlbXM6IEFycmF5PEFwcFNpZGViYXJOYXZpZ2F0aW9uSXRlbT4gPSBbXTtcbiAgcHJpdmF0ZSByZWFkb25seSBfY2hhbmdlRGV0ZWN0b3I6IFRyYW5zbGF0aW9uQ2hhbmdlRGV0ZWN0b3I7XG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgX3RyYW5zbGF0ZVNlcnZpY2U6IFRyYW5zbGF0ZVNlcnZpY2UsXG4gICAgQEluamVjdChHVUVTVF9TSURFQkFSX0xPQ0FUSU9OUykgcHJpdmF0ZSBzaWRlYmFyTG9jYXRpb25zOiBBcnJheTxBcHBTaWRlYmFyTmF2aWdhdGlvbkl0ZW0+KSB7XG4gICAgdGhpcy5fY2hhbmdlRGV0ZWN0b3IgPSBuZXcgVHJhbnNsYXRpb25DaGFuZ2VEZXRlY3RvcigpO1xuICB9XG5cbiAgcHVibGljIGxvYWRDb25maWcoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRoaXMuYWRkUmFuZ2UodGhpcy5zaWRlYmFyTG9jYXRpb25zKTtcbiAgICAgIHJldHVybiByZXNvbHZlKCk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBvbmUgb3IgbW9yZSBuYXZpZ2F0aW9uIGl0ZW1zIHRvIGFwcGxpY2F0aW9uIHNpZGViYXJcbiAgICogQHBhcmFtIHtBcHBTaWRlYmFyTmF2aWdhdGlvbkl0ZW19IGl0ZW1cbiAgICovXG4gIHB1YmxpYyBhZGQoLi4uaXRlbTogQXJyYXk8QXBwU2lkZWJhck5hdmlnYXRpb25JdGVtPik6IHZvaWQge1xuICAgICAgICAvLyBpbml0aWFsaXplIHRyYW5zbGF0ZSBwaXBlIHdpdGggbnVsbCBjaGFuZ2UgZGV0ZWN0b3JcbiAgICAgICAgY29uc3QgcGlwZSA9IG5ldyBUcmFuc2xhdGVQaXBlKHRoaXMuX3RyYW5zbGF0ZVNlcnZpY2UsIHRoaXMuX2NoYW5nZURldGVjdG9yKTtcbiAgICAgICAgLy8gYWRkIG5hdmlnYXRpb24gaXRlbXMgdG8gYXJyYXlcbiAgICAgICAgdGhpcy5uYXZpZ2F0aW9uSXRlbXMucHVzaC5hcHBseSh0aGlzLm5hdmlnYXRpb25JdGVtcywgaXRlbS5tYXAobmF2aWdhdGlvbkl0ZW0gPT4ge1xuICAgICAgICAgIC8vIHRyYW5zbGF0ZSBuYW1lXG4gICAgICAgIGNvbnN0IHggPSBPYmplY3QuYXNzaWduKG5hdmlnYXRpb25JdGVtLCB7XG4gICAgICAgICAgbmFtZTogcGlwZS50cmFuc2Zvcm0obmF2aWdhdGlvbkl0ZW0ua2V5KVxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoeC5jaGlsZHJlbikpIHtcbiAgICAgICAgICAvLyB0cmFuc2xhdGUgY2hpbGRyZW5cbiAgICAgICAgICB4LmNoaWxkcmVuID0geC5jaGlsZHJlbi5tYXAoIGNoaWxkID0+IHtcbiAgICAgICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKGNoaWxkLCB7XG4gICAgICAgICAgICAgIG5hbWU6IHBpcGUudHJhbnNmb3JtKGNoaWxkLmtleSlcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB4O1xuICAgICAgfSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYSBjb2xsZWN0aW9uIG9mIG5hdmlnYXRpb24gaXRlbXMgdG8gYXBwbGljYXRpb24gc2lkZWJhclxuICAgKiBAcGFyYW0ge0FycmF5PEFwcFNpZGViYXJOYXZpZ2F0aW9uSXRlbT59IGl0ZW1zXG4gICAqL1xuICBwdWJsaWMgYWRkUmFuZ2UoaXRlbXM6IEFycmF5PEFwcFNpZGViYXJOYXZpZ2F0aW9uSXRlbT4pOiB2b2lkIHtcbiAgICByZXR1cm4gdGhpcy5hZGQuYXBwbHkodGhpcywgaXRlbXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZSBvbmUgbmF2aWdhdGlvbiBpdGVtIGZyb20gYXBwbGljYXRpb24gc2lkZWJhclxuICAgKiBAcGFyYW0ge0FwcFNpZGViYXJOYXZpZ2F0aW9uSXRlbX0gaXRlbVxuICAgKi9cbiAgcHVibGljIHJlbW92ZShpdGVtOiBBcHBTaWRlYmFyTmF2aWdhdGlvbkl0ZW0pOiB2b2lkIHtcbiAgICAvLyBmaW5kIGl0ZW0gdG8gcmVtb3ZlXG4gICAgY29uc3QgaXRlbUluZGV4ID0gdGhpcy5uYXZpZ2F0aW9uSXRlbXMuZmluZEluZGV4KGVsID0+IGVsLm5hbWUgPT09IGl0ZW0ubmFtZSB8fCBlbC51cmwgPT09IGl0ZW0udXJsIHx8ICBlbC5rZXkgPT09IGl0ZW0ua2V5KTtcbiAgICAvLyBpZiBpdGVtIGlzIGZvdW5kXG4gICAgaWYgKGl0ZW1JbmRleCAhPT0gLTEpIHtcbiAgICAgIHRoaXMubmF2aWdhdGlvbkl0ZW1zLnNwbGljZShpdGVtSW5kZXgsIDEsICk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZXMgb25lIG9yIG1vcmUgbmF2aWdhdGlvbiBpdGVtcyBmcm9tIGFwcGxpY2F0aW9uIHNpZGViYXJcbiAgICogQHBhcmFtIHtBcnJheTxBcHBTaWRlYmFyTmF2aWdhdGlvbkl0ZW0+fSBpdGVtc1xuICAgKi9cbiAgcHVibGljIHJlbW92ZVJhbmdlKGl0ZW1zOiBBcnJheTxBcHBTaWRlYmFyTmF2aWdhdGlvbkl0ZW0+KTogdm9pZCB7XG4gICAgZm9yIChjb25zdCBpdGVtIG9mIGl0ZW1zKSB7XG4gICAgICB0aGlzLnJlbW92ZShpdGVtKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBvbmUgb3IgbW9yZSBuYXZpZ2F0aW9uIGl0ZW1zIHRvIGFzIGNoaWxkcmVuIHRvIGEgc2lkZWJhciBpdGVtXG4gICAqIEBwYXJhbSB7QXBwU2lkZWJhck5hdmlnYXRpb25JdGVtfSBwYXJlbnRcbiAgICogQHBhcmFtIHtBcHBTaWRlYmFyTmF2aWdhdGlvbkl0ZW19IGl0ZW1cbiAgICovXG4gIHB1YmxpYyBhZGRDaGlsZChwYXJlbnQ6IEFwcFNpZGViYXJOYXZpZ2F0aW9uSXRlbSwgLi4uaXRlbTogQXJyYXk8QXBwU2lkZWJhck5hdmlnYXRpb25JdGVtPik6IHZvaWQge1xuICAgIC8vIGluaXRpYWxpemUgdHJhbnNsYXRlIHBpcGUgd2l0aCBudWxsIGNoYW5nZSBkZXRlY3RvclxuICAgIGNvbnN0IHBpcGUgPSBuZXcgVHJhbnNsYXRlUGlwZSh0aGlzLl90cmFuc2xhdGVTZXJ2aWNlLCB0aGlzLl9jaGFuZ2VEZXRlY3Rvcik7XG4gICAgLy8gdHJhbnNsYXRlIGNoaWxkXG4gICAgY29uc3QgdHJhbnNsYXRlZENoaWxkID0gaXRlbS5tYXAobmF2aWdhdGlvbkl0ZW0gPT4ge1xuICAgICAgLy8gdHJhbnNsYXRlIG5hbWVcbiAgICAgIGNvbnN0IHggPSBPYmplY3QuYXNzaWduKG5hdmlnYXRpb25JdGVtLCB7XG4gICAgICAgIG5hbWU6IHBpcGUudHJhbnNmb3JtKG5hdmlnYXRpb25JdGVtLmtleSlcbiAgICAgIH0pO1xuICAgICAgaWYgKEFycmF5LmlzQXJyYXkoeC5jaGlsZHJlbikpIHtcbiAgICAgICAgLy8gdHJhbnNsYXRlIGNoaWxkcmVuXG4gICAgICAgIHguY2hpbGRyZW4gPSB4LmNoaWxkcmVuLm1hcCggY2hpbGQgPT4ge1xuICAgICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKGNoaWxkLCB7XG4gICAgICAgICAgICBuYW1lOiBwaXBlLnRyYW5zZm9ybShjaGlsZC5rZXkpXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHg7XG4gICAgfSk7XG4gICAgLy8gZmluZCBwYXJlbnQgYnkgaW5kZXggYW5kIGluc2VydCBpbnRvIHBsYWNlXG4gICAgY29uc3QgcGFyZW50SW5kZXggPSB0aGlzLm5hdmlnYXRpb25JdGVtcy5maW5kSW5kZXgoZWwgPT4gZWwubmFtZSA9PT0gcGFyZW50Lm5hbWUgfHwgZWwudXJsID09PSBwYXJlbnQudXJsIHx8IGVsLmtleSA9PT0gcGFyZW50LmtleSk7XG4gICAgaWYgKHBhcmVudEluZGV4KSB7XG4gICAgICBjb25zdCBwYXJlbnRXaXRoQ2hpbGRyZW4gPSB0aGlzLm5hdmlnYXRpb25JdGVtc1twYXJlbnRJbmRleF07XG4gICAgICBjb25zdCBjaGlsZHJlbkFycmF5ID0gcGFyZW50V2l0aENoaWxkcmVuLmNoaWxkcmVuIHx8IFtdO1xuICAgICAgY2hpbGRyZW5BcnJheS5wdXNoLmFwcGx5KGNoaWxkcmVuQXJyYXksIHRyYW5zbGF0ZWRDaGlsZCk7XG4gICAgICBwYXJlbnRXaXRoQ2hpbGRyZW4uY2hpbGRyZW4gPSBjaGlsZHJlbkFycmF5O1xuICAgICAgLy8gUmVwbGFjZXMgcGFyZW50IHdpdGggcGFyZW50V2l0aENoaWxkcmVuXG4gICAgICB0aGlzLm5hdmlnYXRpb25JdGVtcy5zcGxpY2UocGFyZW50SW5kZXgsIDEsIHBhcmVudFdpdGhDaGlsZHJlbik7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYSBjb2xsZWN0aW9uIG9mIG5hdmlnYXRpb24gaXRlbXMgdG8gYXMgY2hpbGRyZW4gdG8gYSBwYXJlbnRcbiAgICogQHBhcmFtIHtBcHBTaWRlYmFyTmF2aWdhdGlvbkl0ZW19IHBhcmVudFxuICAgKiBAcGFyYW0ge0FycmF5PEFwcFNpZGViYXJOYXZpZ2F0aW9uSXRlbT59IGl0ZW1zXG4gICAqL1xuICBwdWJsaWMgYWRkQ2hpbGRyZW4ocGFyZW50OiBBcHBTaWRlYmFyTmF2aWdhdGlvbkl0ZW0sIGl0ZW1zOiBBcnJheTxBcHBTaWRlYmFyTmF2aWdhdGlvbkl0ZW0+KTogdm9pZCB7XG4gICAgcmV0dXJuIHRoaXMuYWRkQ2hpbGQuYXBwbHkodGhpcywgW3BhcmVudCwgLi4uaXRlbXNdKTtcbiAgfVxufVxuIl19