@c8y/ngx-components
Version:
Angular modules for Cumulocity IoT applications
102 lines • 13.8 kB
JavaScript
import { Component, ContentChildren, QueryList, ContentChild, ElementRef, Renderer2, Optional } from '@angular/core';
import { GuideHrefDirective } from './guide-href.directive';
import { DocsService } from './docs.service';
import { C8yTranslateDirective } from '../i18n/c8y-translate.directive';
import { ReplaySubject } from 'rxjs';
import { takeUntil } from 'rxjs/operators';
import * as i0 from "@angular/core";
import * as i1 from "./docs.service";
import * as i2 from "../i18n/c8y-translate.directive";
import * as i3 from "@angular/common";
export class GuideDocsComponent {
get translateDirective() {
return this._translateDirective;
}
set translateDirective(value) {
if (!value) {
return;
}
this._translateDirective = value;
}
constructor(docs, el, renderer, translateDirective) {
this.docs = docs;
this.el = el;
this.renderer = renderer;
this.destroyed$ = new ReplaySubject(1);
this.translateDirective = translateDirective;
}
ngOnInit() {
this.baseUrl = this.docs.getBaseUrl();
}
/**
* After content is initialized we subscribe for translation events, then we are able to modify
* anchor just as C8yGuideHrefDirective does.
*/
ngAfterContentInit() {
if (this.translateDirective) {
this.translateDirective.htmlUpdateEvent.pipe(takeUntil(this.destroyed$)).subscribe(() => {
this.replaceAnchorAttributes();
});
}
else {
this.replaceAnchorAttributes();
}
this.links.forEach(guide => {
guide.baseHref = this.baseUrl;
});
}
/**
* Find and modify anchor elements
*/
replaceAnchorAttributes() {
const anchors = this.findGuideAnchors(this.el.nativeElement);
anchors.forEach(a => {
const guideHref = `${this.baseUrl}/${a.getAttribute('c8y-guide-href')}`;
this.renderer.setAttribute(a, 'href', guideHref);
if (!a.hasAttribute('target')) {
this.renderer.setAttribute(a, 'target', '_blank');
this.renderer.setAttribute(a, 'rel', 'noopener noreferrer');
}
});
}
/**
* Recursive function, returns array of Anchor elements inside HTMLElement.
*/
findGuideAnchors(el) {
const isAnchor = () => el.nodeName === 'A';
const hasGuideHrefAttr = () => !!el.attributes.getNamedItem('c8y-guide-href');
const hasChildren = () => el.childNodes && el.childNodes.length > 0;
let result = [];
if (isAnchor() && hasGuideHrefAttr()) {
result.push(el);
}
else if (hasChildren()) {
el.childNodes.forEach((node) => {
const searchResult = this.findGuideAnchors(node);
if (searchResult) {
result = [...result, ...searchResult];
}
});
}
return result;
}
ngOnDestroy() {
this.destroyed$.next(true);
this.destroyed$.complete();
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: GuideDocsComponent, deps: [{ token: i1.DocsService }, { token: i0.ElementRef }, { token: i0.Renderer2 }, { token: i2.C8yTranslateDirective, optional: true }], target: i0.ɵɵFactoryTarget.Component }); }
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: GuideDocsComponent, selector: "[c8y-guide-docs]", queries: [{ propertyName: "translateDirective", first: true, predicate: C8yTranslateDirective, descendants: true, static: true }, { propertyName: "links", predicate: GuideHrefDirective, descendants: true }], ngImport: i0, template: "<ng-container *ngIf=\"!!baseUrl\">\n <ng-content></ng-content>\n</ng-container>\n", dependencies: [{ kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: GuideDocsComponent, decorators: [{
type: Component,
args: [{ selector: '[c8y-guide-docs]', template: "<ng-container *ngIf=\"!!baseUrl\">\n <ng-content></ng-content>\n</ng-container>\n" }]
}], ctorParameters: () => [{ type: i1.DocsService }, { type: i0.ElementRef }, { type: i0.Renderer2 }, { type: i2.C8yTranslateDirective, decorators: [{
type: Optional
}] }], propDecorators: { links: [{
type: ContentChildren,
args: [GuideHrefDirective, { descendants: true }]
}], translateDirective: [{
type: ContentChild,
args: [C8yTranslateDirective, { static: true }]
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3VpZGUtZG9jcy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9jb3JlL2RvY3MvZ3VpZGUtZG9jcy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9jb3JlL2RvY3MvZ3VpZGUtZG9jcy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUVULGVBQWUsRUFDZixTQUFTLEVBQ1QsWUFBWSxFQUNaLFVBQVUsRUFDVixTQUFTLEVBR1QsUUFBUSxFQUNULE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQzVELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM3QyxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUN4RSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3JDLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQzs7Ozs7QUFNM0MsTUFBTSxPQUFPLGtCQUFrQjtJQVM3QixJQUNJLGtCQUFrQjtRQUNwQixPQUFPLElBQUksQ0FBQyxtQkFBbUIsQ0FBQztJQUNsQyxDQUFDO0lBQ0QsSUFBSSxrQkFBa0IsQ0FBQyxLQUE0QjtRQUNqRCxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDWCxPQUFPO1FBQ1QsQ0FBQztRQUNELElBQUksQ0FBQyxtQkFBbUIsR0FBRyxLQUFLLENBQUM7SUFDbkMsQ0FBQztJQUlELFlBQ1UsSUFBaUIsRUFDakIsRUFBYyxFQUNkLFFBQW1CLEVBQ2Ysa0JBQXlDO1FBSDdDLFNBQUksR0FBSixJQUFJLENBQWE7UUFDakIsT0FBRSxHQUFGLEVBQUUsQ0FBWTtRQUNkLGFBQVEsR0FBUixRQUFRLENBQVc7UUFMckIsZUFBVSxHQUEyQixJQUFJLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FB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LENBQUM7SUFDaEIsQ0FBQztJQUVELFdBQVc7UUFDVCxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUMzQixJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQzdCLENBQUM7K0dBN0ZVLGtCQUFrQjttR0FBbEIsa0JBQWtCLHdHQVNmLHFCQUFxQix5RUFQbEIsa0JBQWtCLGdEQ3hCckMsb0ZBR0E7OzRGRG1CYSxrQkFBa0I7a0JBSjlCLFNBQVM7K0JBQ0Usa0JBQWtCOzswQkE2QnpCLFFBQVE7eUNBeEJpRCxLQUFLO3NCQUFoRSxlQUFlO3VCQUFDLGtCQUFrQixFQUFFLEVBQUUsV0FBVyxFQUFFLElBQUksRUFBRTtnQkFRdEQsa0JBQWtCO3NCQURyQixZQUFZO3VCQUFDLHFCQUFxQixFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENvbXBvbmVudCxcbiAgT25Jbml0LFxuICBDb250ZW50Q2hpbGRyZW4sXG4gIFF1ZXJ5TGlzdCxcbiAgQ29udGVudENoaWxkLFxuICBFbGVtZW50UmVmLFxuICBSZW5kZXJlcjIsXG4gIE9uRGVzdHJveSxcbiAgQWZ0ZXJDb250ZW50SW5pdCxcbiAgT3B0aW9uYWxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBHdWlkZUhyZWZEaXJlY3RpdmUgfSBmcm9tICcuL2d1aWRlLWhyZWYuZGlyZWN0aXZlJztcbmltcG9ydCB7IERvY3NTZXJ2aWNlIH0gZnJvbSAnLi9kb2NzLnNlcnZpY2UnO1xuaW1wb3J0IHsgQzh5VHJhbnNsYXRlRGlyZWN0aXZlIH0gZnJvbSAnLi4vaTE4bi9jOHktdHJhbnNsYXRlLmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBSZXBsYXlTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyB0YWtlVW50aWwgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ1tjOHktZ3VpZGUtZG9jc10nLFxuICB0ZW1wbGF0ZVVybDogJy4vZ3VpZGUtZG9jcy5jb21wb25lbnQuaHRtbCdcbn0pXG5leHBvcnQgY2xhc3MgR3VpZGVEb2NzQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBBZnRlckNvbnRlbnRJbml0LCBPbkRlc3Ryb3kge1xuICBiYXNlVXJsOiBzdHJpbmc7XG4gIEBDb250ZW50Q2hpbGRyZW4oR3VpZGVIcmVmRGlyZWN0aXZlLCB7IGRlc2NlbmRhbnRzOiB0cnVlIH0pIGxpbmtzOiBRdWVyeUxpc3Q8R3VpZGVIcmVmRGlyZWN0aXZlPjtcblxuICAvKipcbiAgICogUHJvdmlkZXMgYWNjZXNzIHRvIHRyYW5zbGF0ZSBkaXJlY3RpdmUsIHNvIGl0IGlzIHBvc3NpYmxlIHRvIGFkanVzdCBhbmNob3IgaHRtbCB0YWdzLCBhZnRlclxuICAgKiBjb250ZW50IGlzIHRyYW5zbGF0ZWQuXG4gICAqL1xuICBwcml2YXRlIF90cmFuc2xhdGVEaXJlY3RpdmU6IEM4eVRyYW5zbGF0ZURpcmVjdGl2ZTtcbiAgQENvbnRlbnRDaGlsZChDOHlUcmFuc2xhdGVEaXJlY3RpdmUsIHsgc3RhdGljOiB0cnVlIH0pXG4gIGdldCB0cmFuc2xhdGVEaXJlY3RpdmUoKTogQzh5VHJhbnNsYXRlRGlyZWN0aXZlIHtcbiAgICByZXR1cm4gdGhpcy5fdHJhbnNsYXRlRGlyZWN0aXZlO1xuICB9XG4gIHNldCB0cmFuc2xhdGVEaXJlY3RpdmUodmFsdWU6IEM4eVRyYW5zbGF0ZURpcmVjdGl2ZSkge1xuICAgIGlmICghdmFsdWUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5fdHJhbnNsYXRlRGlyZWN0aXZlID0gdmFsdWU7XG4gIH1cblxuICBwcml2YXRlIGRlc3Ryb3llZCQ6IFJlcGxheVN1YmplY3Q8Ym9vbGVhbj4gPSBuZXcgUmVwbGF5U3ViamVjdCgxKTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGRvY3M6IERvY3NTZXJ2aWNlLFxuICAgIHByaXZhdGUgZWw6IEVsZW1lbnRSZWYsXG4gICAgcHJpdmF0ZSByZW5kZXJlcjogUmVuZGVyZXIyLFxuICAgIEBPcHRpb25hbCgpIHRyYW5zbGF0ZURpcmVjdGl2ZTogQzh5VHJhbnNsYXRlRGlyZWN0aXZlXG4gICkge1xuICAgIHRoaXMudHJhbnNsYXRlRGlyZWN0aXZlID0gdHJhbnNsYXRlRGlyZWN0aXZlO1xuICB9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5iYXNlVXJsID0gdGhpcy5kb2NzLmdldEJhc2VVcmwoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZnRlciBjb250ZW50IGlzIGluaXRpYWxpemVkIHdlIHN1YnNjcmliZSBmb3IgdHJhbnNsYXRpb24gZXZlbnRzLCB0aGVuIHdlIGFyZSBhYmxlIHRvIG1vZGlmeVxuICAgKiBhbmNob3IganVzdCBhcyBDOHlHdWlkZUhyZWZEaXJlY3RpdmUgZG9lcy5cbiAgICovXG4gIG5nQWZ0ZXJDb250ZW50SW5pdCgpIHtcbiAgICBpZiAodGhpcy50cmFuc2xhdGVEaXJlY3RpdmUpIHtcbiAgICAgIHRoaXMudHJhbnNsYXRlRGlyZWN0aXZlLmh0bWxVcGRhdGVFdmVudC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3llZCQpKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICB0aGlzLnJlcGxhY2VBbmNob3JBdHRyaWJ1dGVzKCk7XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5yZXBsYWNlQW5jaG9yQXR0cmlidXRlcygpO1xuICAgIH1cbiAgICB0aGlzLmxpbmtzLmZvckVhY2goZ3VpZGUgPT4ge1xuICAgICAgZ3VpZGUuYmFzZUhyZWYgPSB0aGlzLmJhc2VVcmw7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogRmluZCBhbmQgbW9kaWZ5IGFuY2hvciBlbGVtZW50c1xuICAgKi9cbiAgcmVwbGFjZUFuY2hvckF0dHJpYnV0ZXMoKSB7XG4gICAgY29uc3QgYW5jaG9ycyA9IHRoaXMuZmluZEd1aWRlQW5jaG9ycyh0aGlzLmVsLm5hdGl2ZUVsZW1lbnQpO1xuICAgIGFuY2hvcnMuZm9yRWFjaChhID0+IHtcbiAgICAgIGNvbnN0IGd1aWRlSHJlZiA9IGAke3RoaXMuYmFzZVVybH0vJHthLmdldEF0dHJpYnV0ZSgnYzh5LWd1aWRlLWhyZWYnKX1gO1xuICAgICAgdGhpcy5yZW5kZXJlci5zZXRBdHRyaWJ1dGUoYSwgJ2hyZWYnLCBndWlkZUhyZWYpO1xuICAgICAgaWYgKCFhLmhhc0F0dHJpYnV0ZSgndGFyZ2V0JykpIHtcbiAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRBdHRyaWJ1dGUoYSwgJ3RhcmdldCcsICdfYmxhbmsnKTtcbiAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRBdHRyaWJ1dGUoYSwgJ3JlbCcsICdub29wZW5lciBub3JlZmVycmVyJyk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogUmVjdXJzaXZlIGZ1bmN0aW9uLCByZXR1cm5zIGFycmF5IG9mIEFuY2hvciBlbGVtZW50cyBpbnNpZGUgSFRNTEVsZW1lbnQuXG4gICAqL1xuICBmaW5kR3VpZGVBbmNob3JzKGVsOiBIVE1MRWxlbWVudCk6IEhUTUxFbGVtZW50W10ge1xuICAgIGNvbnN0IGlzQW5jaG9yID0gKCkgPT4gZWwubm9kZU5hbWUgPT09ICdBJztcbiAgICBjb25zdCBoYXNHdWlkZUhyZWZBdHRyID0gKCkgPT4gISFlbC5hdHRyaWJ1dGVzLmdldE5hbWVkSXRlbSgnYzh5LWd1aWRlLWhyZWYnKTtcbiAgICBjb25zdCBoYXNDaGlsZHJlbiA9ICgpID0+IGVsLmNoaWxkTm9kZXMgJiYgZWwuY2hpbGROb2Rlcy5sZW5ndGggPiAwO1xuXG4gICAgbGV0IHJlc3VsdCA9IFtdO1xuXG4gICAgaWYgKGlzQW5jaG9yKCkgJiYgaGFzR3VpZGVIcmVmQXR0cigpKSB7XG4gICAgICByZXN1bHQucHVzaChlbCk7XG4gICAgfSBlbHNlIGlmIChoYXNDaGlsZHJlbigpKSB7XG4gICAgICBlbC5jaGlsZE5vZGVzLmZvckVhY2goKG5vZGU6IEhUTUxFbGVtZW50KSA9PiB7XG4gICAgICAgIGNvbnN0IHNlYXJjaFJlc3VsdCA9IHRoaXMuZmluZEd1aWRlQW5jaG9ycyhub2RlKTtcbiAgICAgICAgaWYgKHNlYXJjaFJlc3VsdCkge1xuICAgICAgICAgIHJlc3VsdCA9IFsuLi5yZXN1bHQsIC4uLnNlYXJjaFJlc3VsdF07XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgdGhpcy5kZXN0cm95ZWQkLm5leHQodHJ1ZSk7XG4gICAgdGhpcy5kZXN0cm95ZWQkLmNvbXBsZXRlKCk7XG4gIH1cbn1cbiIsIjxuZy1jb250YWluZXIgKm5nSWY9XCIhIWJhc2VVcmxcIj5cbiAgPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PlxuPC9uZy1jb250YWluZXI+XG4iXX0=