UNPKG

rt-query-params-router-link

Version:

![](/projects/rt-query-params-router-link/rt-query-params-router-link.gif)

116 lines 13.1 kB
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==