ngx-transloco-markup-router-link
Version:
Link renderer for ngx-tranlate-markup that supports router links
73 lines • 10.4 kB
JavaScript
import { Injectable } from '@angular/core';
import { isRouterLink } from './router-link.model';
import * as i0 from "@angular/core";
import * as i1 from "@angular/router";
import * as i2 from "@angular/common";
/**
* An implementation of `LinkRenderer` that supports the rendering of `RouterLink` values: links that target an (internal) Angular route.
*/
export class RouterLinkRenderer {
constructor(router, locationStrategy) {
this.router = router;
this.locationStrategy = locationStrategy;
}
/**
* @inheritdoc
*/
supports(link) {
return isRouterLink(link);
}
/**
* @inheritdoc
*/
render(link, targetElement) {
this.setAnchorElementHref(targetElement, link);
this.setAnchorElementTarget(targetElement, link);
this.setAnchorElementClickHandler(targetElement, link);
}
setAnchorElementHref(anchorElement, link) {
anchorElement.href = this.getRouterLinkTargetUrl(link);
}
setAnchorElementTarget(anchorElement, link) {
if (link.target !== undefined) {
anchorElement.target = link.target;
}
}
setAnchorElementClickHandler(anchorElement, link) {
anchorElement.addEventListener('click', (clickEvent) => {
const useDefaultClickHandling = clickEventTargetsDifferentWindow(clickEvent) ||
routerLinkTargetsDifferentWindow(link);
if (!useDefaultClickHandling) {
clickEvent.preventDefault();
this.navigateTo(link);
}
});
}
navigateTo(link) {
this.router.navigateByUrl(this.convertRouterLinkToUrlTree(link), link);
}
getRouterLinkTargetUrl(link) {
const urlTree = this.convertRouterLinkToUrlTree(link);
const serializedUrl = this.router.serializeUrl(urlTree);
return this.locationStrategy.prepareExternalUrl(serializedUrl);
}
convertRouterLinkToUrlTree(link) {
const navigationCommands = getRouterLinkNavigationCommands(link);
return this.router.createUrlTree(navigationCommands, link);
}
}
RouterLinkRenderer.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.1.0", ngImport: i0, type: RouterLinkRenderer, deps: [{ token: i1.Router }, { token: i2.LocationStrategy }], target: i0.ɵɵFactoryTarget.Injectable });
RouterLinkRenderer.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "14.1.0", ngImport: i0, type: RouterLinkRenderer });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.1.0", ngImport: i0, type: RouterLinkRenderer, decorators: [{
type: Injectable
}], ctorParameters: function () { return [{ type: i1.Router }, { type: i2.LocationStrategy }]; } });
function getRouterLinkNavigationCommands(link) {
return Array.isArray(link.route) ? link.route : [link.route];
}
function clickEventTargetsDifferentWindow(clickEvent) {
return clickEvent.button !== 0 || clickEvent.ctrlKey || clickEvent.metaKey || clickEvent.shiftKey;
}
function routerLinkTargetsDifferentWindow(link) {
return link.target !== undefined && link.target !== '_self';
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGVyLWxpbmstcmVuZGVyZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9saWIvc3JjL3JvdXRlci1saW5rLXJlbmRlcmVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFJM0MsT0FBTyxFQUFpQyxZQUFZLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQzs7OztBQUVsRjs7R0FFRztBQUVILE1BQU0sT0FBTyxrQkFBa0I7SUFDM0IsWUFDcUIsTUFBYyxFQUNkLGdCQUFrQztRQURsQyxXQUFNLEdBQU4sTUFBTSxDQUFRO1FBQ2QscUJBQWdCLEdBQWhCLGdCQUFnQixDQUFrQjtJQUNwRCxDQUFDO0lBRUo7O09BRUc7SUFDSSxRQUFRLENBQUMsSUFBYTtRQUN6QixPQUFPLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUM5QixDQUFDO0lBRUQ7O09BRUc7SUFDSSxNQUFNLENBQUMsSUFBZ0IsRUFBRSxhQUFnQztRQUM1RCxJQUFJLENBQUMsb0JBQW9CLENBQUMsYUFBYSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQy9DLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDakQsSUFBSSxDQUFDLDRCQUE0QixDQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMsQ0FBQztJQUMzRCxDQUFDO0lBRU8sb0JBQW9CLENBQUMsYUFBZ0MsRUFBRSxJQUFnQjtRQUMzRSxhQUFhLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUMzRCxDQUFDO0lBRU8sc0JBQXNCLENBQUMsYUFBZ0MsRUFBRSxJQUFnQjtRQUM3RSxJQUFJLElBQUksQ0FBQyxNQUFNLEtBQUssU0FBUyxFQUFFO1lBQzNCLGFBQWEsQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQztTQUN0QztJQUNMLENBQUM7SUFFTyw0QkFBNEIsQ0FBQyxhQUFnQyxFQUFFLElBQWdCO1FBQ25GLGFBQWEsQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxVQUFVLEVBQUUsRUFBRTtZQUNuRCxNQUFNLHVCQUF1QixHQUN6QixnQ0FBZ0MsQ0FBQyxVQUFVLENBQUM7Z0JBQzVDLGdDQUFnQyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBRTNDLElBQUksQ0FBQyx1QkFBdUIsRUFBRTtnQkFDMUIsVUFBVSxDQUFDLGNBQWMsRUFBRSxDQUFDO2dCQUM1QixJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO2FBQ3pCO1FBQ0wsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDO0lBRU8sVUFBVSxDQUFDLElBQWdCO1FBQy9CLElBQUksQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxJQUFJLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztJQUMzRSxDQUFDO0lBRU8sc0JBQXNCLENBQUMsSUFBZ0I7UUFDM0MsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLDBCQUEwQixDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3RELE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBRXhELE9BQU8sSUFBSSxDQUFDLGdCQUFnQixDQUFDLGtCQUFrQixDQUFDLGFBQWEsQ0FBQyxDQUFDO0lBQ25FLENBQUM7SUFFTywwQkFBMEIsQ0FBQyxJQUFnQjtRQUMvQyxNQUFNLGtCQUFrQixHQUFHLCtCQUErQixDQUFDLElBQUksQ0FBQyxDQUFDO1FBRWpFLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsa0JBQWtCLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDL0QsQ0FBQzs7K0dBNURRLGtCQUFrQjttSEFBbEIsa0JBQWtCOzJGQUFsQixrQkFBa0I7a0JBRDlCLFVBQVU7O0FBZ0VYLFNBQVMsK0JBQStCLENBQUMsSUFBZ0I7SUFDckQsT0FBTyxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDakUsQ0FBQztBQUVELFNBQVMsZ0NBQWdDLENBQUMsVUFBc0I7SUFDNUQsT0FBTyxVQUFVLENBQUMsTUFBTSxLQUFLLENBQUMsSUFBSSxVQUFVLENBQUMsT0FBTyxJQUFJLFVBQVUsQ0FBQyxPQUFPLElBQUksVUFBVSxDQUFDLFFBQVEsQ0FBQztBQUN0RyxDQUFDO0FBRUQsU0FBUyxnQ0FBZ0MsQ0FBQyxJQUFnQjtJQUN0RCxPQUFPLElBQUksQ0FBQyxNQUFNLEtBQUssU0FBUyxJQUFJLElBQUksQ0FBQyxNQUFNLEtBQUssT0FBTyxDQUFDO0FBQ2hFLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBMb2NhdGlvblN0cmF0ZWd5IH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFJvdXRlciwgVXJsVHJlZSB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQgeyBMaW5rUmVuZGVyZXIgfSBmcm9tICduZ3gtdHJhbnNsb2NvLW1hcmt1cCc7XG5cbmltcG9ydCB7IE5hdmlnYXRpb25Db21tYW5kLCBSb3V0ZXJMaW5rLCBpc1JvdXRlckxpbmsgfSBmcm9tICcuL3JvdXRlci1saW5rLm1vZGVsJztcblxuLyoqXG4gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiBgTGlua1JlbmRlcmVyYCB0aGF0IHN1cHBvcnRzIHRoZSByZW5kZXJpbmcgb2YgYFJvdXRlckxpbmtgIHZhbHVlczogbGlua3MgdGhhdCB0YXJnZXQgYW4gKGludGVybmFsKSBBbmd1bGFyIHJvdXRlLlxuICovXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgUm91dGVyTGlua1JlbmRlcmVyIGltcGxlbWVudHMgTGlua1JlbmRlcmVyPFJvdXRlckxpbms+IHtcbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSByb3V0ZXI6IFJvdXRlcixcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSBsb2NhdGlvblN0cmF0ZWd5OiBMb2NhdGlvblN0cmF0ZWd5LFxuICAgICkge31cblxuICAgIC8qKlxuICAgICAqIEBpbmhlcml0ZG9jXG4gICAgICovXG4gICAgcHVibGljIHN1cHBvcnRzKGxpbms6IHVua25vd24pOiBsaW5rIGlzIFJvdXRlckxpbmsge1xuICAgICAgICByZXR1cm4gaXNSb3V0ZXJMaW5rKGxpbmspO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBpbmhlcml0ZG9jXG4gICAgICovXG4gICAgcHVibGljIHJlbmRlcihsaW5rOiBSb3V0ZXJMaW5rLCB0YXJnZXRFbGVtZW50OiBIVE1MQW5jaG9yRWxlbWVudCk6IHZvaWQge1xuICAgICAgICB0aGlzLnNldEFuY2hvckVsZW1lbnRIcmVmKHRhcmdldEVsZW1lbnQsIGxpbmspO1xuICAgICAgICB0aGlzLnNldEFuY2hvckVsZW1lbnRUYXJnZXQodGFyZ2V0RWxlbWVudCwgbGluayk7XG4gICAgICAgIHRoaXMuc2V0QW5jaG9yRWxlbWVudENsaWNrSGFuZGxlcih0YXJnZXRFbGVtZW50LCBsaW5rKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHNldEFuY2hvckVsZW1lbnRIcmVmKGFuY2hvckVsZW1lbnQ6IEhUTUxBbmNob3JFbGVtZW50LCBsaW5rOiBSb3V0ZXJMaW5rKTogdm9pZCB7XG4gICAgICAgIGFuY2hvckVsZW1lbnQuaHJlZiA9IHRoaXMuZ2V0Um91dGVyTGlua1RhcmdldFVybChsaW5rKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHNldEFuY2hvckVsZW1lbnRUYXJnZXQoYW5jaG9yRWxlbWVudDogSFRNTEFuY2hvckVsZW1lbnQsIGxpbms6IFJvdXRlckxpbmspOiB2b2lkIHtcbiAgICAgICAgaWYgKGxpbmsudGFyZ2V0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGFuY2hvckVsZW1lbnQudGFyZ2V0ID0gbGluay50YXJnZXQ7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHNldEFuY2hvckVsZW1lbnRDbGlja0hhbmRsZXIoYW5jaG9yRWxlbWVudDogSFRNTEFuY2hvckVsZW1lbnQsIGxpbms6IFJvdXRlckxpbmspOiB2b2lkIHtcbiAgICAgICAgYW5jaG9yRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChjbGlja0V2ZW50KSA9PiB7XG4gICAgICAgICAgICBjb25zdCB1c2VEZWZhdWx0Q2xpY2tIYW5kbGluZyA9XG4gICAgICAgICAgICAgICAgY2xpY2tFdmVudFRhcmdldHNEaWZmZXJlbnRXaW5kb3coY2xpY2tFdmVudCkgfHxcbiAgICAgICAgICAgICAgICByb3V0ZXJMaW5rVGFyZ2V0c0RpZmZlcmVudFdpbmRvdyhsaW5rKTtcblxuICAgICAgICAgICAgaWYgKCF1c2VEZWZhdWx0Q2xpY2tIYW5kbGluZykge1xuICAgICAgICAgICAgICAgIGNsaWNrRXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICB0aGlzLm5hdmlnYXRlVG8obGluayk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgbmF2aWdhdGVUbyhsaW5rOiBSb3V0ZXJMaW5rKTogdm9pZCB7XG4gICAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlQnlVcmwodGhpcy5jb252ZXJ0Um91dGVyTGlua1RvVXJsVHJlZShsaW5rKSwgbGluayk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRSb3V0ZXJMaW5rVGFyZ2V0VXJsKGxpbms6IFJvdXRlckxpbmspOiBzdHJpbmcge1xuICAgICAgICBjb25zdCB1cmxUcmVlID0gdGhpcy5jb252ZXJ0Um91dGVyTGlua1RvVXJsVHJlZShsaW5rKTtcbiAgICAgICAgY29uc3Qgc2VyaWFsaXplZFVybCA9IHRoaXMucm91dGVyLnNlcmlhbGl6ZVVybCh1cmxUcmVlKTtcblxuICAgICAgICByZXR1cm4gdGhpcy5sb2NhdGlvblN0cmF0ZWd5LnByZXBhcmVFeHRlcm5hbFVybChzZXJpYWxpemVkVXJsKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGNvbnZlcnRSb3V0ZXJMaW5rVG9VcmxUcmVlKGxpbms6IFJvdXRlckxpbmspOiBVcmxUcmVlIHtcbiAgICAgICAgY29uc3QgbmF2aWdhdGlvbkNvbW1hbmRzID0gZ2V0Um91dGVyTGlua05hdmlnYXRpb25Db21tYW5kcyhsaW5rKTtcblxuICAgICAgICByZXR1cm4gdGhpcy5yb3V0ZXIuY3JlYXRlVXJsVHJlZShuYXZpZ2F0aW9uQ29tbWFuZHMsIGxpbmspO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gZ2V0Um91dGVyTGlua05hdmlnYXRpb25Db21tYW5kcyhsaW5rOiBSb3V0ZXJMaW5rKTogTmF2aWdhdGlvbkNvbW1hbmRbXSB7XG4gICAgcmV0dXJuIEFycmF5LmlzQXJyYXkobGluay5yb3V0ZSkgPyBsaW5rLnJvdXRlIDogW2xpbmsucm91dGVdO1xufVxuXG5mdW5jdGlvbiBjbGlja0V2ZW50VGFyZ2V0c0RpZmZlcmVudFdpbmRvdyhjbGlja0V2ZW50OiBNb3VzZUV2ZW50KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGNsaWNrRXZlbnQuYnV0dG9uICE9PSAwIHx8IGNsaWNrRXZlbnQuY3RybEtleSB8fCBjbGlja0V2ZW50Lm1ldGFLZXkgfHwgY2xpY2tFdmVudC5zaGlmdEtleTtcbn1cblxuZnVuY3Rpb24gcm91dGVyTGlua1RhcmdldHNEaWZmZXJlbnRXaW5kb3cobGluazogUm91dGVyTGluayk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBsaW5rLnRhcmdldCAhPT0gdW5kZWZpbmVkICYmIGxpbmsudGFyZ2V0ICE9PSAnX3NlbGYnO1xufVxuIl19