router-link-delegate.mjs 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154
  1. import { Directive, HostListener, Input, Optional } from '@angular/core';
  2. import * as i0 from "@angular/core";
  3. import * as i1 from "@angular/common";
  4. import * as i2 from "../../providers/nav-controller";
  5. import * as i3 from "@angular/router";
  6. /**
  7. * Adds support for Ionic routing directions and animations to the base Angular router link directive.
  8. *
  9. * When the router link is clicked, the directive will assign the direction and
  10. * animation so that the routing integration will transition correctly.
  11. */
  12. export class RouterLinkDelegateDirective {
  13. locationStrategy;
  14. navCtrl;
  15. elementRef;
  16. router;
  17. routerLink;
  18. routerDirection = 'forward';
  19. routerAnimation;
  20. constructor(locationStrategy, navCtrl, elementRef, router, routerLink) {
  21. this.locationStrategy = locationStrategy;
  22. this.navCtrl = navCtrl;
  23. this.elementRef = elementRef;
  24. this.router = router;
  25. this.routerLink = routerLink;
  26. }
  27. ngOnInit() {
  28. this.updateTargetUrlAndHref();
  29. this.updateTabindex();
  30. }
  31. ngOnChanges() {
  32. this.updateTargetUrlAndHref();
  33. }
  34. /**
  35. * The `tabindex` is set to `0` by default on the host element when
  36. * the `routerLink` directive is used. This causes issues with Ionic
  37. * components that wrap an `a` or `button` element, such as `ion-item`.
  38. * See issue https://github.com/angular/angular/issues/28345
  39. *
  40. * This method removes the `tabindex` attribute from the host element
  41. * to allow the Ionic component to manage the focus state correctly.
  42. */
  43. updateTabindex() {
  44. // Ionic components that render a native anchor or button element
  45. const ionicComponents = [
  46. 'ION-BACK-BUTTON',
  47. 'ION-BREADCRUMB',
  48. 'ION-BUTTON',
  49. 'ION-CARD',
  50. 'ION-FAB-BUTTON',
  51. 'ION-ITEM',
  52. 'ION-ITEM-OPTION',
  53. 'ION-MENU-BUTTON',
  54. 'ION-SEGMENT-BUTTON',
  55. 'ION-TAB-BUTTON',
  56. ];
  57. const hostElement = this.elementRef.nativeElement;
  58. if (ionicComponents.includes(hostElement.tagName)) {
  59. if (hostElement.getAttribute('tabindex') === '0') {
  60. hostElement.removeAttribute('tabindex');
  61. }
  62. }
  63. }
  64. updateTargetUrlAndHref() {
  65. if (this.routerLink?.urlTree) {
  66. const href = this.locationStrategy.prepareExternalUrl(this.router.serializeUrl(this.routerLink.urlTree));
  67. this.elementRef.nativeElement.href = href;
  68. }
  69. }
  70. /**
  71. * @internal
  72. */
  73. onClick(ev) {
  74. this.navCtrl.setDirection(this.routerDirection, undefined, undefined, this.routerAnimation);
  75. /**
  76. * This prevents the browser from
  77. * performing a page reload when pressing
  78. * an Ionic component with routerLink.
  79. * The page reload interferes with routing
  80. * and causes ion-back-button to disappear
  81. * since the local history is wiped on reload.
  82. */
  83. ev.preventDefault();
  84. }
  85. /** @nocollapse */ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: RouterLinkDelegateDirective, deps: [{ token: i1.LocationStrategy }, { token: i2.NavController }, { token: i0.ElementRef }, { token: i3.Router }, { token: i3.RouterLink, optional: true }], target: i0.ɵɵFactoryTarget.Directive });
  86. /** @nocollapse */ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "16.2.12", type: RouterLinkDelegateDirective, selector: ":not(a):not(area)[routerLink]", inputs: { routerDirection: "routerDirection", routerAnimation: "routerAnimation" }, host: { listeners: { "click": "onClick($event)" } }, usesOnChanges: true, ngImport: i0 });
  87. }
  88. i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: RouterLinkDelegateDirective, decorators: [{
  89. type: Directive,
  90. args: [{
  91. selector: ':not(a):not(area)[routerLink]',
  92. }]
  93. }], ctorParameters: function () { return [{ type: i1.LocationStrategy }, { type: i2.NavController }, { type: i0.ElementRef }, { type: i3.Router }, { type: i3.RouterLink, decorators: [{
  94. type: Optional
  95. }] }]; }, propDecorators: { routerDirection: [{
  96. type: Input
  97. }], routerAnimation: [{
  98. type: Input
  99. }], onClick: [{
  100. type: HostListener,
  101. args: ['click', ['$event']]
  102. }] } });
  103. export class RouterLinkWithHrefDelegateDirective {
  104. locationStrategy;
  105. navCtrl;
  106. elementRef;
  107. router;
  108. routerLink;
  109. routerDirection = 'forward';
  110. routerAnimation;
  111. constructor(locationStrategy, navCtrl, elementRef, router, routerLink) {
  112. this.locationStrategy = locationStrategy;
  113. this.navCtrl = navCtrl;
  114. this.elementRef = elementRef;
  115. this.router = router;
  116. this.routerLink = routerLink;
  117. }
  118. ngOnInit() {
  119. this.updateTargetUrlAndHref();
  120. }
  121. ngOnChanges() {
  122. this.updateTargetUrlAndHref();
  123. }
  124. updateTargetUrlAndHref() {
  125. if (this.routerLink?.urlTree) {
  126. const href = this.locationStrategy.prepareExternalUrl(this.router.serializeUrl(this.routerLink.urlTree));
  127. this.elementRef.nativeElement.href = href;
  128. }
  129. }
  130. /**
  131. * @internal
  132. */
  133. onClick() {
  134. this.navCtrl.setDirection(this.routerDirection, undefined, undefined, this.routerAnimation);
  135. }
  136. /** @nocollapse */ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: RouterLinkWithHrefDelegateDirective, deps: [{ token: i1.LocationStrategy }, { token: i2.NavController }, { token: i0.ElementRef }, { token: i3.Router }, { token: i3.RouterLink, optional: true }], target: i0.ɵɵFactoryTarget.Directive });
  137. /** @nocollapse */ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "16.2.12", type: RouterLinkWithHrefDelegateDirective, selector: "a[routerLink],area[routerLink]", inputs: { routerDirection: "routerDirection", routerAnimation: "routerAnimation" }, host: { listeners: { "click": "onClick()" } }, usesOnChanges: true, ngImport: i0 });
  138. }
  139. i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: RouterLinkWithHrefDelegateDirective, decorators: [{
  140. type: Directive,
  141. args: [{
  142. selector: 'a[routerLink],area[routerLink]',
  143. }]
  144. }], ctorParameters: function () { return [{ type: i1.LocationStrategy }, { type: i2.NavController }, { type: i0.ElementRef }, { type: i3.Router }, { type: i3.RouterLink, decorators: [{
  145. type: Optional
  146. }] }]; }, propDecorators: { routerDirection: [{
  147. type: Input
  148. }], routerAnimation: [{
  149. type: Input
  150. }], onClick: [{
  151. type: HostListener,
  152. args: ['click']
  153. }] } });
  154. //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGVyLWxpbmstZGVsZWdhdGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9jb21tb24vc3JjL2RpcmVjdGl2ZXMvbmF2aWdhdGlvbi9yb3V0ZXItbGluay1kZWxlZ2F0ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQWlDLFNBQVMsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxNQUFNLGVBQWUsQ0FBQzs7Ozs7QUFNeEc7Ozs7O0dBS0c7QUFJSCxNQUFNLE9BQU8sMkJBQTJCO0lBUTVCO0lBQ0E7SUFDQTtJQUNBO0lBQ1k7SUFWdEIsZUFBZSxHQUFvQixTQUFTLENBQUM7SUFHN0MsZUFBZSxDQUFvQjtJQUVuQyxZQUNVLGdCQUFrQyxFQUNsQyxPQUFzQixFQUN0QixVQUFzQixFQUN0QixNQUFjLEVBQ0YsVUFBdUI7UUFKbkMscUJBQWdCLEdBQWhCLGdCQUFnQixDQUFrQjtRQUNsQyxZQUFPLEdBQVAsT0FBTyxDQUFlO1FBQ3RCLGVBQVUsR0FBVixVQUFVLENBQVk7UUFDdEIsV0FBTSxHQUFOLE1BQU0sQ0FBUTtRQUNGLGVBQVUsR0FBVixVQUFVLENBQWE7SUFDMUMsQ0FBQztJQUVKLFFBQVE7UUFDTixJQUFJLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztRQUM5QixJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7SUFDeEIsQ0FBQztJQUVELFdBQVc7UUFDVCxJQUFJLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztJQUNoQyxDQUFDO0lBRUQ7Ozs7Ozs7O09BUUc7SUFDSyxjQUFjO1FBQ3BCLGlFQUFpRTtRQUNqRSxNQUFNLGVBQWUsR0FBRztZQUN0QixpQkFBaUI7WUFDakIsZ0JBQWdCO1lBQ2hCLFlBQVk7WUFDWixVQUFVO1lBQ1YsZ0JBQWdCO1lBQ2hCLFVBQVU7WUFDVixpQkFBaUI7WUFDakIsaUJBQWlCO1lBQ2pCLG9CQUFvQjtZQUNwQixnQkFBZ0I7U0FDakIsQ0FBQztRQUNGLE1B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QkE4Qk4sT0FBTztzQkFETixZQUFZO3VCQUFDLE9BQU8iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBMb2NhdGlvblN0cmF0ZWd5IH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IEVsZW1lbnRSZWYsIE9uQ2hhbmdlcywgT25Jbml0LCBEaXJlY3RpdmUsIEhvc3RMaXN0ZW5lciwgSW5wdXQsIE9wdGlvbmFsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBSb3V0ZXIsIFJvdXRlckxpbmsgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0IHR5cGUgeyBBbmltYXRpb25CdWlsZGVyLCBSb3V0ZXJEaXJlY3Rpb24gfSBmcm9tICdAaW9uaWMvY29yZS9jb21wb25lbnRzJztcblxuaW1wb3J0IHsgTmF2Q29udHJvbGxlciB9IGZyb20gJy4uLy4uL3Byb3ZpZGVycy9uYXYtY29udHJvbGxlcic7XG5cbi8qKlxuICogQWRkcyBzdXBwb3J0IGZvciBJb25pYyByb3V0aW5nIGRpcmVjdGlvbnMgYW5kIGFuaW1hdGlvbnMgdG8gdGhlIGJhc2UgQW5ndWxhciByb3V0ZXIgbGluayBkaXJlY3RpdmUuXG4gKlxuICogV2hlbiB0aGUgcm91dGVyIGxpbmsgaXMgY2xpY2tlZCwgdGhlIGRpcmVjdGl2ZSB3aWxsIGFzc2lnbiB0aGUgZGlyZWN0aW9uIGFuZFxuICogYW5pbWF0aW9uIHNvIHRoYXQgdGhlIHJvdXRpbmcgaW50ZWdyYXRpb24gd2lsbCB0cmFuc2l0aW9uIGNvcnJlY3RseS5cbiAqL1xuQERpcmVjdGl2ZSh7XG4gIHNlbGVjdG9yOiAnOm5vdChhKTpub3QoYXJlYSlbcm91dGVyTGlua10nLFxufSlcbmV4cG9ydCBjbGFzcyBSb3V0ZXJMaW5rRGVsZWdhdGVEaXJlY3RpdmUgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcyB7XG4gIEBJbnB1dCgpXG4gIHJvdXRlckRpcmVjdGlvbjogUm91dGVyRGlyZWN0aW9uID0gJ2ZvcndhcmQnO1xuXG4gIEBJbnB1dCgpXG4gIHJvdXRlckFuaW1hdGlvbj86IEFuaW1hdGlvbkJ1aWxkZXI7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBsb2NhdGlvblN0cmF0ZWd5OiBMb2NhdGlvblN0cmF0ZWd5LFxuICAgIHByaXZhdGUgbmF2Q3RybDogTmF2Q29udHJvbGxlcixcbiAgICBwcml2YXRlIGVsZW1lbnRSZWY6IEVsZW1lbnRSZWYsXG4gICAgcHJpdmF0ZSByb3V0ZXI6IFJvdXRlcixcbiAgICBAT3B0aW9uYWwoKSBwcml2YXRlIHJvdXRlckxpbms/OiBSb3V0ZXJMaW5rXG4gICkge31cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLnVwZGF0ZVRhcmdldFVybEFuZEhyZWYoKTtcbiAgICB0aGlzLnVwZGF0ZVRhYmluZGV4KCk7XG4gIH1cblxuICBuZ09uQ2hhbmdlcygpOiB2b2lkIHtcbiAgICB0aGlzLnVwZGF0ZVRhcmdldFVybEFuZEhyZWYoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgYHRhYmluZGV4YCBpcyBzZXQgdG8gYDBgIGJ5IGRlZmF1bHQgb24gdGhlIGhvc3QgZWxlbWVudCB3aGVuXG4gICAqIHRoZSBgcm91dGVyTGlua2AgZGlyZWN0aXZlIGlzIHVzZWQuIFRoaXMgY2F1c2VzIGlzc3VlcyB3aXRoIElvbmljXG4gICAqIGNvbXBvbmVudHMgdGhhdCB3cmFwIGFuIGBhYCBvciBgYnV0dG9uYCBlbGVtZW50LCBzdWNoIGFzIGBpb24taXRlbWAuXG4gICAqIFNlZSBpc3N1ZSBodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci9hbmd1bGFyL2lzc3Vlcy8yODM0NVxuICAgKlxuICAgKiBUaGlzIG1ldGhvZCByZW1vdmVzIHRoZSBgdGFiaW5kZXhgIGF0dHJpYnV0ZSBmcm9tIHRoZSBob3N0IGVsZW1lbnRcbiAgICogdG8gYWxsb3cgdGhlIElvbmljIGNvbXBvbmVudCB0byBtYW5hZ2UgdGhlIGZvY3VzIHN0YXRlIGNvcnJlY3RseS5cbiAgICovXG4gIHByaXZhdGUgdXBkYXRlVGFiaW5kZXgoKSB7XG4gICAgLy8gSW9uaWMgY29tcG9uZW50cyB0aGF0IHJlbmRlciBhIG5hdGl2ZSBhbmNob3Igb3IgYnV0dG9uIGVsZW1lbnRcbiAgICBjb25zdCBpb25pY0NvbXBvbmVudHMgPSBbXG4gICAgICAnSU9OLUJBQ0stQlVUVE9OJyxcbiAgICAgICdJT04tQlJFQURDUlVNQicsXG4gICAgICAnSU9OLUJVVFRPTicsXG4gICAgICAnSU9OLUNBUkQnLFxuICAgICAgJ0lPTi1GQUItQlVUVE9OJyxcbiAgICAgICdJT04tSVRFTScsXG4gICAgICAnSU9OLUlURU0tT1BUSU9OJyxcbiAgICAgICdJT04tTUVOVS1CVVRUT04nLFxuICAgICAgJ0lPTi1TRUdNRU5ULUJVVFRPTicsXG4gICAgICAnSU9OLVRBQi1CVVRUT04nLFxuICAgIF07XG4gICAgY29uc3QgaG9zdEVsZW1lbnQgPSB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudDtcblxuICAgIGlmIChpb25pY0NvbXBvbmVudHMuaW5jbHVkZXMoaG9zdEVsZW1lbnQudGFnTmFtZSkpIHtcbiAgICAgIGlmIChob3N0RWxlbWVudC5nZXRBdHRyaWJ1dGUoJ3RhYmluZGV4JykgPT09ICcwJykge1xuICAgICAgICBob3N0RWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoJ3RhYmluZGV4Jyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVUYXJnZXRVcmxBbmRIcmVmKCkge1xuICAgIGlmICh0aGlzLnJvdXRlckxpbms/LnVybFRyZWUpIHtcbiAgICAgIGNvbnN0IGhyZWYgPSB0aGlzLmxvY2F0aW9uU3RyYXRlZ3kucHJlcGFyZUV4dGVybmFsVXJsKHRoaXMucm91dGVyLnNlcmlhbGl6ZVVybCh0aGlzLnJvdXRlckxpbmsudXJsVHJlZSkpO1xuICAgICAgdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuaHJlZiA9IGhyZWY7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgQEhvc3RMaXN0ZW5lcignY2xpY2snLCBbJyRldmVudCddKVxuICBvbkNsaWNrKGV2OiBVSUV2ZW50KTogdm9pZCB7XG4gICAgdGhpcy5uYXZDdHJsLnNldERpcmVjdGlvbih0aGlzLnJvdXRlckRpcmVjdGlvbiwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHRoaXMucm91dGVyQW5pbWF0aW9uKTtcblxuICAgIC8qKlxuICAgICAqIFRoaXMgcHJldmVudHMgdGhlIGJyb3dzZXIgZnJvbVxuICAgICAqIHBlcmZvcm1pbmcgYSBwYWdlIHJlbG9hZCB3aGVuIHByZXNzaW5nXG4gICAgICogYW4gSW9uaWMgY29tcG9uZW50IHdpdGggcm91dGVyTGluay5cbiAgICAgKiBUaGUgcGFnZSByZWxvYWQgaW50ZXJmZXJlcyB3aXRoIHJvdXRpbmdcbiAgICAgKiBhbmQgY2F1c2VzIGlvbi1iYWNrLWJ1dHRvbiB0byBkaXNhcHBlYXJcbiAgICAgKiBzaW5jZSB0aGUgbG9jYWwgaGlzdG9yeSBpcyB3aXBlZCBvbiByZWxvYWQuXG4gICAgICovXG4gICAgZXYucHJldmVudERlZmF1bHQoKTtcbiAgfVxufVxuXG5ARGlyZWN0aXZlKHtcbiAgc2VsZWN0b3I6ICdhW3JvdXRlckxpbmtdLGFyZWFbcm91dGVyTGlua10nLFxufSlcbmV4cG9ydCBjbGFzcyBSb3V0ZXJMaW5rV2l0aEhyZWZEZWxlZ2F0ZURpcmVjdGl2ZSBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzIHtcbiAgQElucHV0KClcbiAgcm91dGVyRGlyZWN0aW9uOiBSb3V0ZXJEaXJlY3Rpb24gPSAnZm9yd2FyZCc7XG5cbiAgQElucHV0KClcbiAgcm91dGVyQW5pbWF0aW9uPzogQW5pbWF0aW9uQnVpbGRlcjtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGxvY2F0aW9uU3RyYXRlZ3k6IExvY2F0aW9uU3RyYXRlZ3ksXG4gICAgcHJpdmF0ZSBuYXZDdHJsOiBOYXZDb250cm9sbGVyLFxuICAgIHByaXZhdGUgZWxlbWVudFJlZjogRWxlbWVudFJlZixcbiAgICBwcml2YXRlIHJvdXRlcjogUm91dGVyLFxuICAgIEBPcHRpb25hbCgpIHByaXZhdGUgcm91dGVyTGluaz86IFJvdXRlckxpbmtcbiAgKSB7fVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMudXBkYXRlVGFyZ2V0VXJsQW5kSHJlZigpO1xuICB9XG5cbiAgbmdPbkNoYW5nZXMoKTogdm9pZCB7XG4gICAgdGhpcy51cGRhdGVUYXJnZXRVcmxBbmRIcmVmKCk7XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZVRhcmdldFVybEFuZEhyZWYoKSB7XG4gICAgaWYgKHRoaXMucm91dGVyTGluaz8udXJsVHJlZSkge1xuICAgICAgY29uc3QgaHJlZiA9IHRoaXMubG9jYXRpb25TdHJhdGVneS5wcmVwYXJlRXh0ZXJuYWxVcmwodGhpcy5yb3V0ZXIuc2VyaWFsaXplVXJsKHRoaXMucm91dGVyTGluay51cmxUcmVlKSk7XG4gICAgICB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5ocmVmID0gaHJlZjtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQGludGVybmFsXG4gICAqL1xuICBASG9zdExpc3RlbmVyKCdjbGljaycpXG4gIG9uQ2xpY2soKTogdm9pZCB7XG4gICAgdGhpcy5uYXZDdHJsLnNldERpcmVjdGlvbih0aGlzLnJvdXRlckRpcmVjdGlvbiwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHRoaXMucm91dGVyQW5pbWF0aW9uKTtcbiAgfVxufVxuIl19