UNPKG

@c8y/ngx-components

Version:

Angular modules for Cumulocity IoT applications

102 lines 13.8 kB
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=