rt-query-params-router-link
Version:

116 lines • 13.1 kB
JavaScript
import { Directive, HostListener, Inject, Input } from '@angular/core';
import { WINDOW } from 'rt-platform';
import { Subscription } from 'rxjs';
import * as i0 from "@angular/core";
import * as i1 from "@angular/router";
class RtQueryParamsRouterLinkDirective {
el;
renderer;
router;
activatedRoute;
window;
linkQueryParams;
linkQueryParamsHandling = 'merge';
linkIsActive = true;
classActiveLink;
currentLink = false;
subscription = new Subscription();
constructor(el, renderer, router, activatedRoute, window) {
this.el = el;
this.renderer = renderer;
this.router = router;
this.activatedRoute = activatedRoute;
this.window = window;
}
onClick($event) {
if (!this.linkIsActive) {
return;
}
// Open link in new tab if clicked with ctrl or cmd.
if ($event.ctrlKey || $event.metaKey) {
$event.preventDefault();
$event.stopPropagation();
this.window.open(this.getStringifyUrl(), '_blank');
}
else {
this.router.navigate([], {
queryParams: this.linkQueryParams,
queryParamsHandling: this.linkQueryParamsHandling,
});
}
}
ngOnInit() {
this.subscription.add(this.activatedRoute.queryParams.subscribe((params) => {
if (this.checkKeyValuesPresence(this.linkQueryParams, params)) {
this.currentLink = true;
this.renderer.addClass(this.el.nativeElement, this.classActiveLink);
}
else {
this.currentLink = false;
this.renderer.removeClass(this.el.nativeElement, this.classActiveLink);
}
}));
}
ngOnDestroy() {
this.subscription.unsubscribe();
}
getStringifyUrl() {
const oldQueryParams = this.activatedRoute.snapshot.queryParams;
const mergedQueryParams = {
...oldQueryParams,
...this.linkQueryParams,
};
let url = '';
if (mergedQueryParams) {
url += '?';
for (const param of Object.keys(mergedQueryParams)) {
if (typeof mergedQueryParams[param] === 'object') {
for (const arr of mergedQueryParams[param]) {
url += `${param}=${arr}&`;
}
}
else {
url += `${param}=${mergedQueryParams[param]}&`;
}
}
url = url.slice(0, url.length - 1);
}
return url.replace(/ /g, '%20');
}
checkKeyValuesPresence(obj1, obj2) {
for (const key in obj1) {
if (Object.prototype.hasOwnProperty.call(obj1, key)) {
const value1 = obj1[key].toString();
const value2 = obj2[key]?.toString();
if (value2 === undefined || value1 !== value2) {
return false;
}
}
}
return true;
}
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.2", ngImport: i0, type: RtQueryParamsRouterLinkDirective, deps: [{ token: i0.ElementRef }, { token: i0.Renderer2 }, { token: i1.Router }, { token: i1.ActivatedRoute }, { token: WINDOW }], target: i0.ɵɵFactoryTarget.Directive });
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "16.1.2", type: RtQueryParamsRouterLinkDirective, selector: "[rtQueryParamsRouterLink]", inputs: { linkQueryParams: "linkQueryParams", linkQueryParamsHandling: "linkQueryParamsHandling", linkIsActive: "linkIsActive", classActiveLink: "classActiveLink" }, host: { listeners: { "click": "onClick($event)" } }, ngImport: i0 });
}
export { RtQueryParamsRouterLinkDirective };
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.2", ngImport: i0, type: RtQueryParamsRouterLinkDirective, decorators: [{
type: Directive,
args: [{
selector: '[rtQueryParamsRouterLink]',
}]
}], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.Renderer2 }, { type: i1.Router }, { type: i1.ActivatedRoute }, { type: Window, decorators: [{
type: Inject,
args: [WINDOW]
}] }]; }, propDecorators: { linkQueryParams: [{
type: Input
}], linkQueryParamsHandling: [{
type: Input
}], linkIsActive: [{
type: Input
}], classActiveLink: [{
type: Input
}], onClick: [{
type: HostListener,
args: ['click', ['$event']]
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnQtcXVlcnktcGFyYW1zLXJvdXRlci1saW5rLmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL3J0LXF1ZXJ5LXBhcmFtcy1yb3V0ZXItbGluay9zcmMvbGliL3J0LXF1ZXJ5LXBhcmFtcy1yb3V0ZXItbGluay5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLFNBQVMsRUFBYyxZQUFZLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBK0IsTUFBTSxlQUFlLENBQUM7QUFFL0csT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUNuQyxPQUFPLEVBQUMsWUFBWSxFQUFDLE1BQU0sTUFBTSxDQUFDOzs7QUFHbEMsTUFHYSxnQ0FBZ0M7SUFZakM7SUFDQTtJQUNBO0lBQ0E7SUFDZ0I7SUFmakIsZUFBZSxDQUFNO0lBQ3JCLHVCQUF1QixHQUF3QixPQUFPLENBQUM7SUFDdkQsWUFBWSxHQUFHLElBQUksQ0FBQztJQUNwQixlQUFlLENBQVM7SUFHakMsV0FBVyxHQUFHLEtBQUssQ0FBQztJQUVaLFlBQVksR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDO0lBRTFDLFlBQ1UsRUFBYyxFQUNkLFFBQW1CLEVBQ25CLE1BQWMsRUFDZCxjQUE4QixFQUNkLE1BQWM7UUFKOUIsT0FBRSxHQUFGLEVBQUUsQ0FBWTtRQUNkLGFBQVEsR0FBUixRQUFRLENBQVc7UUFDbkIsV0FBTSxHQUFOLE1BQU0sQ0FBUTtRQUNkLG1CQUFjLEdBQWQsY0FBYyxDQUFnQjtRQUNkLFdBQU0sR0FBTixNQUFNLENBQVE7SUFFeEMsQ0FBQztJQUdELE9BQU8sQ0FBQyxNQUFrQjtRQUN4QixJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRTtZQUN0QixPQUFPO1NBQ1I7UUFFRCxvREFBb0Q7UUFDcEQsSUFBSSxNQUFNLENBQUMsT0FBTyxJQUFJLE1BQU0sQ0FBQyxPQUFPLEVBQUU7WUFD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SSxNQUFNLEtBQUssU0FBUyxJQUFJLE1BQU0sS0FBSyxNQUFNLEVBQUU7b0JBQzdDLE9BQU8sS0FBSyxDQUFDO2lCQUNkO2FBQ0Y7U0FDRjtRQUNELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQzt1R0FoR1UsZ0NBQWdDLHlIQWdCakMsTUFBTTsyRkFoQkwsZ0NBQWdDOztTQUFoQyxnQ0FBZ0M7MkZBQWhDLGdDQUFnQztrQkFINUMsU0FBUzttQkFBQztvQkFDVCxRQUFRLEVBQUUsMkJBQTJCO2lCQUN0Qzs7MEJBaUJJLE1BQU07MkJBQUMsTUFBTTs0Q0FmUCxlQUFlO3NCQUF2QixLQUFLO2dCQUNHLHVCQUF1QjtzQkFBL0IsS0FBSztnQkFDRyxZQUFZO3NCQUFwQixLQUFLO2dCQUNHLGVBQWU7c0JBQXZCLEtBQUs7Z0JBaUJOLE9BQU87c0JBRE4sWUFBWTt1QkFBQyxPQUFPLEVBQUUsQ0FBQyxRQUFRLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0RpcmVjdGl2ZSwgRWxlbWVudFJlZiwgSG9zdExpc3RlbmVyLCBJbmplY3QsIElucHV0LCBPbkRlc3Ryb3ksIE9uSW5pdCwgUmVuZGVyZXIyfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7QWN0aXZhdGVkUm91dGUsIE5hdmlnYXRpb25FbmQsIFF1ZXJ5UGFyYW1zSGFuZGxpbmcsIFJvdXRlcn0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbmltcG9ydCB7V0lORE9XfSBmcm9tICdydC1wbGF0Zm9ybSc7XG5pbXBvcnQge1N1YnNjcmlwdGlvbn0gZnJvbSAncnhqcyc7XG5pbXBvcnQge2ZpbHRlcn0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5ARGlyZWN0aXZlKHtcbiAgc2VsZWN0b3I6ICdbcnRRdWVyeVBhcmFtc1JvdXRlckxpbmtdJyxcbn0pXG5leHBvcnQgY2xhc3MgUnRRdWVyeVBhcmFtc1JvdXRlckxpbmtEaXJlY3RpdmUgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XG4gIEBJbnB1dCgpIGxpbmtRdWVyeVBhcmFtczogYW55O1xuICBASW5wdXQoKSBsaW5rUXVlcnlQYXJhbXNIYW5kbGluZzogUXVlcnlQYXJhbXNIYW5kbGluZyA9ICdtZXJnZSc7XG4gIEBJbnB1dCgpIGxpbmtJc0FjdGl2ZSA9IHRydWU7XG4gIEBJbnB1dCgpIGNsYXNzQWN0aXZlTGluazogc3RyaW5nO1xuXG5cbiAgY3VycmVudExpbmsgPSBmYWxzZTtcblxuICBwcml2YXRlIHN1YnNjcmlwdGlvbiA9IG5ldyBTdWJzY3JpcHRpb24oKTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGVsOiBFbGVtZW50UmVmLFxuICAgIHByaXZhdGUgcmVuZGVyZXI6IFJlbmRlcmVyMixcbiAgICBwcml2YXRlIHJvdXRlcjogUm91dGVyLFxuICAgIHByaXZhdGUgYWN0aXZhdGVkUm91dGU6IEFjdGl2YXRlZFJvdXRlLFxuICAgIEBJbmplY3QoV0lORE9XKSBwcml2YXRlIHdpbmRvdzogV2luZG93LFxuICApIHtcbiAgfVxuXG4gIEBIb3N0TGlzdGVuZXIoJ2NsaWNrJywgWyckZXZlbnQnXSlcbiAgb25DbGljaygkZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMubGlua0lzQWN0aXZlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gT3BlbiBsaW5rIGluIG5ldyB0YWIgaWYgY2xpY2tlZCB3aXRoIGN0cmwgb3IgY21kLlxuICAgIGlmICgkZXZlbnQuY3RybEtleSB8fCAkZXZlbnQubWV0YUtleSkge1xuICAgICAgJGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICB0aGlzLndpbmRvdy5vcGVuKHRoaXMuZ2V0U3RyaW5naWZ5VXJsKCksICdfYmxhbmsnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoW10sIHtcbiAgICAgICAgcXVlcnlQYXJhbXM6IHRoaXMubGlua1F1ZXJ5UGFyYW1zLFxuICAgICAgICBxdWVyeVBhcmFtc0hhbmRsaW5nOiB0aGlzLmxpbmtRdWVyeVBhcmFtc0hhbmRsaW5nLFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5zdWJzY3JpcHRpb24uYWRkKHRoaXMuYWN0aXZhdGVkUm91dGUucXVlcnlQYXJhbXMuc3Vic2NyaWJlKChwYXJhbXMpID0+IHtcbiAgICAgIGlmICh0aGlzLmNoZWNrS2V5VmFsdWVzUHJlc2VuY2UodGhpcy5saW5rUXVlcnlQYXJhbXMsIHBhcmFtcykpIHtcbiAgICAgICAgdGhpcy5jdXJyZW50TGluayA9IHRydWU7XG4gICAgICAgIHRoaXMucmVuZGVyZXIuYWRkQ2xhc3ModGhpcy5lbC5uYXRpdmVFbGVtZW50LCB0aGlzLmNsYXNzQWN0aXZlTGluayk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmN1cnJlbnRMaW5rID0gZmFsc2U7XG4gICAgICAgIHRoaXMucmVuZGVyZXIucmVtb3ZlQ2xhc3ModGhpcy5lbC5uYXRpdmVFbGVtZW50LCB0aGlzLmNsYXNzQWN0aXZlTGluayk7XG4gICAgICB9XG4gICAgfSkpO1xuXG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLnN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICB9XG5cblxuXG4gIHByaXZhdGUgZ2V0U3RyaW5naWZ5VXJsKCk6IHN0cmluZyB7XG4gICAgY29uc3Qgb2xkUXVlcnlQYXJhbXMgPSB0aGlzLmFjdGl2YXRlZFJvdXRlLnNuYXBzaG90LnF1ZXJ5UGFyYW1zO1xuICAgIGNvbnN0IG1lcmdlZFF1ZXJ5UGFyYW1zID0ge1xuICAgICAgLi4ub2xkUXVlcnlQYXJhbXMsXG4gICAgICAuLi50aGlzLmxpbmtRdWVyeVBhcmFtcyxcbiAgICB9O1xuICAgIGxldCB1cmwgPSAnJztcbiAgICBpZiAobWVyZ2VkUXVlcnlQYXJhbXMpIHtcbiAgICAgIHVybCArPSAnPyc7XG5cbiAgICAgIGZvciAoY29uc3QgcGFyYW0gb2YgT2JqZWN0LmtleXMobWVyZ2VkUXVlcnlQYXJhbXMpKSB7XG4gICAgICAgIGlmICh0eXBlb2YgbWVyZ2VkUXVlcnlQYXJhbXNbcGFyYW1dID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgIGZvciAoY29uc3QgYXJyIG9mIG1lcmdlZFF1ZXJ5UGFyYW1zW3BhcmFtXSkge1xuICAgICAgICAgICAgdXJsICs9IGAke3BhcmFtfT0ke2Fycn0mYDtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdXJsICs9IGAke3BhcmFtfT0ke21lcmdlZFF1ZXJ5UGFyYW1zW3BhcmFtXX0mYDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdXJsID0gdXJsLnNsaWNlKDAsIHVybC5sZW5ndGggLSAxKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdXJsLnJlcGxhY2UoLyAvZywgJyUyMCcpO1xuICB9XG5cblxuICBwcml2YXRlIGNoZWNrS2V5VmFsdWVzUHJlc2VuY2Uob2JqMTogYW55LCBvYmoyOiBhbnkpOiBib29sZWFuIHtcbiAgICBmb3IgKGNvbnN0IGtleSBpbiBvYmoxKSB7XG4gICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iajEsIGtleSkpIHtcbiAgICAgICAgY29uc3QgdmFsdWUxID0gb2JqMVtrZXldLnRvU3RyaW5nKCk7XG4gICAgICAgIGNvbnN0IHZhbHVlMiA9IG9iajJba2V5XT8udG9TdHJpbmcoKTtcblxuICAgICAgICBpZiAodmFsdWUyID09PSB1bmRlZmluZWQgfHwgdmFsdWUxICE9PSB2YWx1ZTIpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbn1cbiJdfQ==