@mintplayer/ng-bootstrap 21.23.1 → 21.24.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/fesm2022/mintplayer-ng-bootstrap-navbar.mjs +56 -2
- package/fesm2022/mintplayer-ng-bootstrap-navbar.mjs.map +1 -1
- package/fesm2022/mintplayer-ng-bootstrap-navigation-lock.mjs +172 -70
- package/fesm2022/mintplayer-ng-bootstrap-navigation-lock.mjs.map +1 -1
- package/package.json +1 -1
- package/types/mintplayer-ng-bootstrap-navbar.d.ts +28 -1
- package/types/mintplayer-ng-bootstrap-navigation-lock.d.ts +97 -37
|
@@ -8,8 +8,10 @@ import { Color } from '@mintplayer/ng-bootstrap';
|
|
|
8
8
|
import { SlideUpDownAnimation } from '@mintplayer/ng-animations';
|
|
9
9
|
import { ClickOutsideDirective } from '@mintplayer/ng-click-outside';
|
|
10
10
|
import { BsHasOverlayComponent } from '@mintplayer/ng-bootstrap/has-overlay';
|
|
11
|
-
import { Router } from '@angular/router';
|
|
11
|
+
import { Router, NavigationEnd } from '@angular/router';
|
|
12
12
|
import { DomPortal } from '@angular/cdk/portal';
|
|
13
|
+
import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
|
|
14
|
+
import { filter } from 'rxjs/operators';
|
|
13
15
|
|
|
14
16
|
class BsNavbarComponent {
|
|
15
17
|
constructor() {
|
|
@@ -460,6 +462,58 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.11", ngImpo
|
|
|
460
462
|
}]
|
|
461
463
|
}], ctorParameters: () => [], propDecorators: { navbar: [{ type: i0.Input, args: [{ isSignal: true, alias: "bsNavbarContent", required: false }] }] } });
|
|
462
464
|
|
|
465
|
+
/**
|
|
466
|
+
* Marks a navbar dropdown trigger anchor. Replaces both `routerLink` and
|
|
467
|
+
* `routerLinkActive` on a trigger element: toggles the active CSS class when a
|
|
468
|
+
* sub-route under the bound URL is active, but does NOT navigate on click
|
|
469
|
+
* (which `routerLink` would do via its own host listener, even when other
|
|
470
|
+
* click handlers `preventDefault`).
|
|
471
|
+
*
|
|
472
|
+
* @example
|
|
473
|
+
* ```html
|
|
474
|
+
* <a bsNavbarTrigger="/overlays">Overlays</a>
|
|
475
|
+
* ```
|
|
476
|
+
*
|
|
477
|
+
* Items inside the dropdown panel still use real `[routerLink]`s for
|
|
478
|
+
* navigation. Use this directive only for the trigger anchor that opens the
|
|
479
|
+
* dropdown panel.
|
|
480
|
+
*/
|
|
481
|
+
class BsNavbarTriggerDirective {
|
|
482
|
+
constructor() {
|
|
483
|
+
this.router = inject(Router);
|
|
484
|
+
this.bsNavbarTrigger = input.required(...(ngDevMode ? [{ debugName: "bsNavbarTrigger" }] : /* istanbul ignore next */ []));
|
|
485
|
+
this.currentUrl = signal(this.router.url, ...(ngDevMode ? [{ debugName: "currentUrl" }] : /* istanbul ignore next */ []));
|
|
486
|
+
this.targetUrl = computed(() => {
|
|
487
|
+
const v = this.bsNavbarTrigger();
|
|
488
|
+
if (Array.isArray(v)) {
|
|
489
|
+
// join with '/', collapse double slashes; ensure leading slash
|
|
490
|
+
const joined = v.join('/').replace(/\/+/g, '/');
|
|
491
|
+
return joined.startsWith('/') ? joined : '/' + joined;
|
|
492
|
+
}
|
|
493
|
+
return v;
|
|
494
|
+
}, ...(ngDevMode ? [{ debugName: "targetUrl" }] : /* istanbul ignore next */ []));
|
|
495
|
+
this.isActive = computed(() => {
|
|
496
|
+
const url = this.currentUrl();
|
|
497
|
+
const target = this.targetUrl();
|
|
498
|
+
return url === target || url.startsWith(target + '/');
|
|
499
|
+
}, ...(ngDevMode ? [{ debugName: "isActive" }] : /* istanbul ignore next */ []));
|
|
500
|
+
this.router.events.pipe(filter(ev => ev instanceof NavigationEnd), takeUntilDestroyed()).subscribe(() => this.currentUrl.set(this.router.url));
|
|
501
|
+
}
|
|
502
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.11", ngImport: i0, type: BsNavbarTriggerDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
|
|
503
|
+
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "21.2.11", type: BsNavbarTriggerDirective, isStandalone: true, selector: "[bsNavbarTrigger]", inputs: { bsNavbarTrigger: { classPropertyName: "bsNavbarTrigger", publicName: "bsNavbarTrigger", isSignal: true, isRequired: true, transformFunction: null } }, host: { attributes: { "href": "javascript:void(0)" }, listeners: { "click": "$event.preventDefault()" }, properties: { "class.active": "isActive()" } }, ngImport: i0 }); }
|
|
504
|
+
}
|
|
505
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.11", ngImport: i0, type: BsNavbarTriggerDirective, decorators: [{
|
|
506
|
+
type: Directive,
|
|
507
|
+
args: [{
|
|
508
|
+
selector: '[bsNavbarTrigger]',
|
|
509
|
+
host: {
|
|
510
|
+
'href': 'javascript:void(0)',
|
|
511
|
+
'[class.active]': 'isActive()',
|
|
512
|
+
'(click)': '$event.preventDefault()',
|
|
513
|
+
},
|
|
514
|
+
}]
|
|
515
|
+
}], ctorParameters: () => [], propDecorators: { bsNavbarTrigger: [{ type: i0.Input, args: [{ isSignal: true, alias: "bsNavbarTrigger", required: true }] }] } });
|
|
516
|
+
|
|
463
517
|
class BsExpandButtonDirective {
|
|
464
518
|
constructor() {
|
|
465
519
|
const navbar = inject(BsNavbarComponent);
|
|
@@ -539,5 +593,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.11", ngImpo
|
|
|
539
593
|
* Generated bundle index. Do not edit.
|
|
540
594
|
*/
|
|
541
595
|
|
|
542
|
-
export { BsExpandButtonContext, BsExpandButtonDirective, BsNavbarBrandComponent, BsNavbarComponent, BsNavbarContentDirective, BsNavbarDropdownComponent, BsNavbarItemComponent, BsNavbarNavComponent, DropdownToggleDirective, NavLinkDirective };
|
|
596
|
+
export { BsExpandButtonContext, BsExpandButtonDirective, BsNavbarBrandComponent, BsNavbarComponent, BsNavbarContentDirective, BsNavbarDropdownComponent, BsNavbarItemComponent, BsNavbarNavComponent, BsNavbarTriggerDirective, DropdownToggleDirective, NavLinkDirective };
|
|
543
597
|
//# sourceMappingURL=mintplayer-ng-bootstrap-navbar.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mintplayer-ng-bootstrap-navbar.mjs","sources":["../../../../libs/mintplayer-ng-bootstrap/navbar/src/navbar/navbar.component.ts","../../../../libs/mintplayer-ng-bootstrap/navbar/src/navbar/navbar.component.html","../../../../libs/mintplayer-ng-bootstrap/navbar/src/navbar-brand/navbar-brand.component.ts","../../../../libs/mintplayer-ng-bootstrap/navbar/src/navbar-brand/navbar-brand.component.html","../../../../libs/mintplayer-ng-bootstrap/navbar/src/navbar-nav/navbar-nav.component.ts","../../../../libs/mintplayer-ng-bootstrap/navbar/src/navbar-nav/navbar-nav.component.html","../../../../libs/mintplayer-ng-bootstrap/navbar/src/navbar-item/navbar-item.component.ts","../../../../libs/mintplayer-ng-bootstrap/navbar/src/navbar-item/navbar-item.component.html","../../../../libs/mintplayer-ng-bootstrap/navbar/src/navbar-dropdown/navbar-dropdown.component.ts","../../../../libs/mintplayer-ng-bootstrap/navbar/src/navbar-dropdown/navbar-dropdown.component.html","../../../../libs/mintplayer-ng-bootstrap/navbar/src/navbar-content/navbar-content.directive.ts","../../../../libs/mintplayer-ng-bootstrap/navbar/src/expand-button/expand-button.directive.ts","../../../../libs/mintplayer-ng-bootstrap/navbar/src/dropdown-toggle/dropdown-toggle.directive.ts","../../../../libs/mintplayer-ng-bootstrap/navbar/src/nav-link/nav-link.directive.ts","../../../../libs/mintplayer-ng-bootstrap/navbar/mintplayer-ng-bootstrap-navbar.ts"],"sourcesContent":["import { ChangeDetectionStrategy, Component, computed, ElementRef, input, signal, TemplateRef, viewChild } from '@angular/core';\nimport { NgTemplateOutlet } from '@angular/common';\nimport { BsContainerComponent } from '@mintplayer/ng-bootstrap/container';\nimport { BsUserAgentDirective } from '@mintplayer/ng-bootstrap/user-agent';\nimport { BsNoNoscriptDirective } from '@mintplayer/ng-bootstrap/no-noscript';\nimport { Breakpoint, Color } from '@mintplayer/ng-bootstrap';\n\n@Component({\n selector: 'bs-navbar',\n templateUrl: './navbar.component.html',\n styleUrls: ['./navbar.component.scss'],\n imports: [NgTemplateOutlet, BsContainerComponent, BsUserAgentDirective, BsNoNoscriptDirective],\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n '(window:resize)': 'onWindowResize()',\n },\n})\nexport class BsNavbarComponent {\n\n private resizeTimeout: ReturnType<typeof setTimeout> | null = null;\n\n constructor() {\n this.onWindowResize();\n }\n\n onWindowResize() {\n this.isResizing.set(true);\n if (typeof window !== 'undefined') {\n this.windowWidth.set(window.innerWidth);\n }\n\n // Clear any existing timeout to debounce\n if (this.resizeTimeout) {\n clearTimeout(this.resizeTimeout);\n }\n\n // Reset isResizing after debounce period\n this.resizeTimeout = setTimeout(() => {\n this.isResizing.set(false);\n }, 300);\n }\n\n readonly nav = viewChild.required<ElementRef>('nav');\n autoclose = input(true);\n\n expandButtonTemplate = signal<TemplateRef<any> | null>(null);\n\n isExpanded = signal<boolean>(false);\n windowWidth = signal<number | null>(null);\n isResizing = signal<boolean>(false);\n\n color = input<Color | null>(null);\n breakpoint = input<Breakpoint | null>('md');\n\n expandAt = computed(() => {\n const breakpoint = this.breakpoint();\n switch (breakpoint) {\n case 'xxl': return 1400;\n case 'xl': return 1200;\n case 'lg': return 992;\n case 'md': return 768;\n case 'sm': return 576;\n case 'xs': return 0;\n default: return null;\n }\n });\n\n isSmallMode = computed(() => {\n const expandAt = this.expandAt();\n const windowWidth = this.windowWidth();\n if (windowWidth === null) {\n return true;\n } else if (!expandAt) {\n return true;\n } else if (windowWidth >= expandAt) {\n return false;\n } else {\n return true;\n }\n });\n\n expandClass = computed(() => {\n const breakpoint = this.breakpoint();\n if (breakpoint === null) {\n return null;\n } else {\n return `navbar-expand-${breakpoint}`;\n }\n });\n\n wAutoClass = computed(() => {\n const breakpoint = this.breakpoint();\n if (breakpoint === null) {\n return null;\n } else {\n return `w-${breakpoint}-auto`;\n }\n });\n\n dNoneClass = computed(() => {\n const breakpoint = this.breakpoint();\n if (breakpoint === null) {\n return null;\n } else {\n return `d-${breakpoint}-none`;\n }\n });\n\n backgroundColorClass = computed(() => {\n const color = this.color();\n switch (color) {\n case Color.light:\n case null:\n return ['navbar-light'];\n default:\n return ['navbar-dark', `bg-${Color[color]}`];\n }\n });\n\n navClassList = computed(() => {\n const expandClass = this.expandClass();\n const backgroundColorClass = this.backgroundColorClass();\n const result: string[] = [];\n return result.concat(expandClass ?? [], ...backgroundColorClass);\n });\n\n toggleExpanded() {\n this.isExpanded.update(v => !v);\n }\n}\n","<bs-container>\n <nav #nav class=\"navbar position-fixed\" [class]=\"navClassList()\" bsUserAgent bsNoNoscript aria-label=\"Main navigation\">\n <div class=\"container-fluid nav-wrapper\">\n <div class=\"d-flex w-100\" [class]=\"wAutoClass()\">\n <ng-content select=\"bs-navbar-brand\"></ng-content>\n <div class=\"flex-end d-flex tw\" [class]=\"dNoneClass()\">\n <button (click)=\"toggleExpanded()\"\n class=\"align-self-center\"\n [class.navbar-toggler]=\"!expandButtonTemplate()\"\n [class.bg-transparent]=\"expandButtonTemplate()\"\n [class.shadow-none]=\"expandButtonTemplate()\"\n [class.border-0]=\"expandButtonTemplate()\"\n type=\"button\"\n aria-label=\"Toggle navigation\"\n [attr.aria-expanded]=\"isExpanded()\"\n aria-controls=\"navbar-collapse\">\n <ng-container *ngTemplateOutlet=\"expandButtonTemplate() ?? defaultExpandButton; context: { $implicit: isExpanded() }\"></ng-container>\n </button>\n </div>\n </div>\n <ng-content></ng-content>\n </div>\n </nav>\n</bs-container>\n\n<ng-template #defaultExpandButton>\n <span class=\"navbar-toggler-icon\" aria-hidden=\"true\"></span>\n</ng-template>\n","import { AfterContentChecked, Component, ElementRef, inject, input, ChangeDetectionStrategy} from '@angular/core';\n\n@Component({\n selector: 'bs-navbar-brand',\n templateUrl: './navbar-brand.component.html',\n styleUrls: ['./navbar-brand.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n '[class.mx-auto]': 'true',\n },\n})\nexport class BsNavbarBrandComponent implements AfterContentChecked {\n private element = inject(ElementRef);\n readonly routerLink = input<any[]>([]);\n\n ngAfterContentChecked() {\n const anchor = this.element.nativeElement.querySelector('a');\n if (anchor) {\n anchor.classList.add('nav-link');\n }\n }\n}\n","<span class=\"navbar-brand mx-auto mx-md-unset\">\n <ng-content></ng-content>\n</span>","import { ChangeDetectionStrategy, Component, computed, inject, input, signal } from '@angular/core';\nimport { SlideUpDownAnimation } from '@mintplayer/ng-animations';\nimport { BsNavbarComponent } from '../navbar/navbar.component';\n\n@Component({\n selector: 'bs-navbar-nav',\n templateUrl: './navbar-nav.component.html',\n styleUrls: ['./navbar-nav.component.scss'],\n animations: [SlideUpDownAnimation],\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n '(window:resize)': 'onWindowResize()',\n },\n})\nexport class BsNavbarNavComponent {\n\n bsNavbar = inject(BsNavbarComponent);\n\n windowWidth = signal<number | null>(null);\n isResizing = signal<boolean>(false);\n collapse = input<boolean>(true);\n\n private resizeTimeout: ReturnType<typeof setTimeout> | null = null;\n\n showNavs = computed(() => {\n const isExpanded = this.bsNavbar.isExpanded();\n const expandAt = this.bsNavbar.expandAt();\n const windowWidth = this.windowWidth();\n\n if (windowWidth === null) {\n return false;\n } else if (expandAt === null) {\n return isExpanded;\n } else if (windowWidth >= expandAt) {\n return true;\n } else {\n return isExpanded;\n }\n });\n\n constructor() {\n this.onWindowResize();\n }\n\n onWindowResize() {\n this.isResizing.set(true);\n if (typeof window !== 'undefined') {\n this.windowWidth.set(window.innerWidth);\n }\n\n // Clear any existing timeout to debounce\n if (this.resizeTimeout) {\n clearTimeout(this.resizeTimeout);\n }\n\n // Reset isResizing after debounce period\n this.resizeTimeout = setTimeout(() => {\n this.isResizing.set(false);\n }, 300);\n }\n}\n","<div class=\"navbar-collapse w-100 show\" [class.collapse]=\"collapse()\" [@slideUpDown]=\"showNavs()\" [@.disabled]=\"isResizing()\">\n <ul class=\"navbar-nav mr-auto\">\n <ng-content></ng-content>\n </ul>\n</div>\n","import { AfterContentChecked, AfterContentInit, ChangeDetectionStrategy, Component, computed, contentChildren, DestroyRef, effect, ElementRef, forwardRef, inject, PLATFORM_ID } from '@angular/core';\nimport { isPlatformServer } from '@angular/common';\nimport { Router } from '@angular/router';\nimport { BsNavbarComponent } from '../navbar/navbar.component';\nimport { BsNavbarDropdownComponent } from '../navbar-dropdown/navbar-dropdown.component';\n\n/** Duration of the navbar collapse animation in milliseconds */\nconst NAVBAR_ANIMATION_DURATION = 300;\n\n@Component({\n selector: 'bs-navbar-item',\n templateUrl: './navbar-item.component.html',\n styleUrls: ['./navbar-item.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class BsNavbarItemComponent implements AfterContentInit, AfterContentChecked {\n\n private navbar = inject(BsNavbarComponent);\n element = inject(ElementRef);\n private destroy = inject(DestroyRef);\n private platformId = inject(PLATFORM_ID);\n private router = inject(Router);\n parentDropdown = inject(forwardRef(() => BsNavbarDropdownComponent), { optional: true });\n\n readonly hasDropdown = computed(() => this.dropdowns().length > 0);\n anchorTag: HTMLAnchorElement | null = null;\n readonly dropdowns = contentChildren<BsNavbarDropdownComponent>(forwardRef(() => BsNavbarDropdownComponent));\n\n constructor() {\n // Effect handles future isSmallMode changes after content is initialized\n effect(() => {\n const isSmallMode = this.navbar.isSmallMode();\n this.dropdowns().forEach((dropdown) => {\n dropdown.showInOverlay = !isSmallMode;\n });\n });\n }\n\n ngAfterContentInit() {\n // Set initial showInOverlay state after content children are resolved\n // This is needed because the effect runs before @ContentChildren is populated\n const isSmallMode = this.navbar.isSmallMode();\n this.dropdowns().forEach((dropdown) => {\n dropdown.showInOverlay = !isSmallMode;\n });\n }\n\n ngAfterContentChecked() {\n this.anchorTag = this.element.nativeElement.querySelector('li a');\n\n // Add nav-link or dropdown-item class (previously done by NavLinkDirective)\n if (this.anchorTag && !this.anchorTag.getAttribute('nav-link-class-added')) {\n if (this.parentDropdown === null) {\n this.anchorTag.classList.add('nav-link');\n } else {\n this.anchorTag.classList.add('dropdown-item');\n }\n this.anchorTag.classList.add('cursor-pointer');\n this.anchorTag.setAttribute('nav-link-class-added', 'true');\n }\n\n if (this.hasDropdown()) {\n if (this.anchorTag) {\n this.anchorTag.classList.add('dropdown-toggle');\n\n if (isPlatformServer(this.platformId)) {\n this.anchorTag.href = 'javascript:;';\n }\n\n if (!this.anchorTag.getAttribute('close-init-b')) {\n this.anchorTag.setAttribute('close-init-b', '1');\n this.anchorTag.addEventListener('click', (ev: MouseEvent) => {\n ev.preventDefault();\n this.dropdowns().forEach((dropdown) => {\n const newVisible = !dropdown.isVisible();\n dropdown.isVisible.set(newVisible);\n if (!newVisible) {\n dropdown.childDropdowns().forEach((child) => child.isVisible.set(false));\n }\n });\n return false;\n });\n }\n }\n } else {\n\n if ((this.dropdowns().length === 0) && this.anchorTag && !this.anchorTag.getAttribute('close-init-a')) {\n this.anchorTag.setAttribute('close-init-a', '1');\n this.anchorTag.addEventListener('click', (ev: MouseEvent) => {\n let d = this.parentDropdown;\n while (d && d.autoclose()) {\n d.isVisible.set(false);\n d = d.parentDropdown;\n }\n if (this.navbar.autoclose()) {\n // Get the fragment from the link's href\n const href = this.anchorTag?.getAttribute('href') ?? '';\n const fragmentMatch = href.match(/#(.+)$/);\n const fragment = fragmentMatch ? fragmentMatch[1] : null;\n\n // Always collapse the navbar\n this.navbar.isExpanded.set(false);\n\n // If in small mode with a fragment, prevent default navigation and\n // navigate after the collapse animation completes to avoid double scroll\n if (this.navbar.isSmallMode() && fragment) {\n ev.preventDefault();\n\n // After the collapse animation completes, navigate to the anchor\n // This ensures correct scroll position since navbar height is stable\n setTimeout(() => {\n this.router.navigateByUrl(href);\n }, NAVBAR_ANIMATION_DURATION);\n }\n }\n });\n }\n\n }\n }\n}\n","<li [class.nav-item]=\"parentDropdown === null\" [class.dropdown]=\"(dropdowns().length > 0) && (parentDropdown === null)\" [class.dropend]=\"(dropdowns().length > 0) && (parentDropdown !== null)\">\n <ng-content></ng-content>\n</li>","import { DOCUMENT, isPlatformServer } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, contentChildren, computed, DestroyRef, effect, ElementRef, forwardRef, inject, Injector, input, OnDestroy, PLATFORM_ID, signal, SkipSelf, viewChild } from '@angular/core';\nimport { ClickOutsideDirective } from '@mintplayer/ng-click-outside';\nimport { BsHasOverlayComponent } from '@mintplayer/ng-bootstrap/has-overlay';\nimport { BsNoNoscriptDirective } from '@mintplayer/ng-bootstrap/no-noscript';\nimport { BsNavbarComponent } from '../navbar/navbar.component';\nimport { BsNavbarItemComponent } from '../navbar-item/navbar-item.component';\nimport { DomPortal } from '@angular/cdk/portal';\nimport { OverlayRef } from '@angular/cdk/overlay';\n\n@Component({\n selector: 'bs-navbar-dropdown',\n templateUrl: './navbar-dropdown.component.html',\n styleUrls: ['./navbar-dropdown.component.scss'],\n imports: [BsHasOverlayComponent, BsNoNoscriptDirective, ClickOutsideDirective],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class BsNavbarDropdownComponent implements OnDestroy {\n\n private navbar = inject(BsNavbarComponent);\n parentDropdown = inject(BsNavbarDropdownComponent, { skipSelf: true, optional: true });\n navbarItem = inject(forwardRef(() => BsNavbarItemComponent), { host: true });\n element = inject<ElementRef<HTMLElement>>(ElementRef);\n private injector = inject(Injector);\n private document = inject(DOCUMENT);\n private platformId = inject(PLATFORM_ID);\n\n private readonly isAttached = signal<boolean>(false);\n private readonly isDestroyed = signal<boolean>(false);\n private domPortal?: DomPortal;\n private overlay?: OverlayRef;\n private pendingShowInOverlay: boolean | null = null;\n\n autoclose = input(true);\n readonly dropdownElement = viewChild.required<ElementRef<HTMLDivElement>>('dd');\n isBrowser = !isPlatformServer(this.platformId);\n\n isVisible = signal<boolean>(false);\n topPos = signal<number | null>(null);\n\n maxHeight = computed(() => {\n const topPos = this.topPos();\n const w: Window | null = this.document.defaultView;\n if (!topPos) {\n return null;\n } else if (w && this.dropdownElement()) {\n const style = w.getComputedStyle(this.dropdownElement().nativeElement);\n return `calc(100vh - ${topPos}px - ${style.getPropertyValue('padding-top')} - ${style.getPropertyValue('padding-bottom')})`;\n } else {\n return null;\n }\n });\n\n maxHeightOrNull = computed(() => {\n const maxHeight = this.maxHeight();\n const isSmallMode = this.navbar.isSmallMode();\n if (isSmallMode) {\n return null;\n } else if (isPlatformServer(this.platformId)) {\n return this.parentDropdown ? null : maxHeight;\n } else {\n return maxHeight;\n }\n });\n\n constructor() {\n effect(() => {\n const isVisible = this.isVisible();\n if (isVisible) {\n setTimeout(() => {\n try { this.overlay?.updatePosition(); }\n catch (ex) { }\n }, 20);\n this.topPos.set(this.element.nativeElement.offsetTop);\n } else {\n this.topPos.set(null);\n }\n });\n\n if (!!this.parentDropdown && this.isBrowser) {\n import('@angular/cdk/overlay').then(({ Overlay }) => {\n // Guard against accessing injector after component is destroyed\n if (this.isDestroyed()) {\n return;\n }\n const overlayService = this.injector.get(Overlay);\n this.domPortal = new DomPortal(this.element);\n this.overlay = overlayService.create({\n positionStrategy: overlayService.position()\n .flexibleConnectedTo(this.navbarItem.element)\n .withPositions([\n { originX: 'end', originY: 'top', overlayX: 'start', overlayY: 'top', offsetX: -9, offsetY: -9 }\n ])\n });\n\n // Apply pending showInOverlay state if it was set before overlay was ready\n if (this.pendingShowInOverlay !== null) {\n const pending = this.pendingShowInOverlay;\n this.pendingShowInOverlay = null;\n this.showInOverlay = pending;\n }\n });\n }\n }\n\n ngOnDestroy() {\n this.isDestroyed.set(true);\n this.overlay?.dispose();\n }\n\n public set showInOverlay(value: boolean) {\n if (this.overlay && this.domPortal) {\n if (value && !this.isAttached()) {\n this.overlay.attach(this.domPortal);\n this.isAttached.set(true);\n }\n if (!value && this.isAttached()) {\n this.overlay.detach();\n this.isAttached.set(false);\n }\n } else {\n // Store the value to apply once the overlay is ready\n this.pendingShowInOverlay = value;\n }\n }\n\n get elementsToExclude() {\n return [this.navbarItem.anchorTag].filter((a) => a).map((a) => <HTMLElement>a);\n }\n\n readonly childDropdowns = contentChildren<BsNavbarDropdownComponent>(forwardRef(() => BsNavbarDropdownComponent), { descendants: true });\n}\n","<bs-has-overlay></bs-has-overlay>\n<ul #dd class=\"dropdown-menu me-3\" [class.show]=\"isVisible()\" [class.submenu]=\"!!parentDropdown\" [class.overflow-y-auto]=\"isBrowser\" [style.max-height]=\"maxHeightOrNull()\" bsNoNoscript (clickOutside)=\"isVisible.set(false)\" [exclude]=\"elementsToExclude\" aria-labelledby=\"navbarDropdown\">\n <ng-content></ng-content>\n</ul>\n\n<!--\n - Working demo: https://codepen.io/agop/pen/VwwMGR\n - Location must be set through javascript\n - bsNoScript => If noscript, 2nd-level submenus must be shown inside the 1st-level submenu\n -->\n <!--\n - Another option: https://stackblitz.com/edit/web-platform-vmsr4l?file=index.html\n - But this doesn't seem to work here\n -->\n","import { isPlatformServer } from '@angular/common';\nimport { AfterViewInit, Directive, effect, ElementRef, inject, input, OnDestroy, PLATFORM_ID, signal } from '@angular/core';\nimport { BsNavbarComponent } from '../navbar/navbar.component';\n\n@Directive({\n selector: '[bsNavbarContent]',\n})\nexport class BsNavbarContentDirective implements AfterViewInit, OnDestroy {\n\n private element = inject(ElementRef);\n private platformId = inject(PLATFORM_ID);\n\n navbar = input<BsNavbarComponent | undefined>(undefined, { alias: 'bsNavbarContent' });\n private viewInit = signal<boolean>(false);\n resizeObserver: ResizeObserver | null = null;\n initialPadding = 0;\n\n constructor() {\n effect(() => {\n const viewInit = this.viewInit();\n const navbar = this.navbar();\n\n if (viewInit && navbar) {\n if (isPlatformServer(this.platformId)) {\n this.element.nativeElement.style.paddingTop = (this.initialPadding + 58) + 'px';\n } else {\n this.resizeObserver = new ResizeObserver((entries) => {\n const height = navbar.nav().nativeElement.offsetHeight;\n this.element.nativeElement.style.paddingTop = (this.initialPadding + height) + 'px';\n });\n\n const px = getComputedStyle(this.element.nativeElement).getPropertyValue('padding-top');\n const pt = parseInt(px.replace(/px$/, ''));\n this.initialPadding = isNaN(pt) ? 0 : pt;\n if (this.resizeObserver && navbar) {\n this.resizeObserver.observe(navbar.nav().nativeElement);\n }\n }\n }\n });\n }\n\n ngAfterViewInit() {\n this.viewInit.set(true);\n }\n\n ngOnDestroy() {\n const navbar = this.navbar();\n if (navbar) {\n this.resizeObserver?.unobserve(navbar.nav().nativeElement);\n }\n }\n}\n","import { Directive, inject, TemplateRef } from '@angular/core';\nimport { BsNavbarComponent } from '../navbar/navbar.component';\n\n@Directive({\n selector: '[bsExpandButton]',\n})\nexport class BsExpandButtonDirective {\n\n constructor() {\n const navbar = inject(BsNavbarComponent);\n const templateRef = inject(TemplateRef);\n navbar.expandButtonTemplate.set(templateRef);\n }\n \n public static ngTemplateContextGuard(\n dir: BsExpandButtonDirective,\n ctx: any\n ): ctx is BsExpandButtonContext {\n return true;\n }\n\n}\n\nexport class BsExpandButtonContext {\n public $implicit: boolean = null!;\n}","import { ContentChildren, Directive, ElementRef, forwardRef, inject, QueryList } from '@angular/core';\nimport { BsNavbarItemComponent } from '../navbar-item/navbar-item.component';\nimport { BsNavbarDropdownComponent } from '../navbar-dropdown/navbar-dropdown.component';\n\n@Directive({\n // selector: 'bs-navbar-item > a[routerLink]',\n selector: 'bs-navbar-item',\n queries: {\n childDropdowns: new ContentChildren(forwardRef(() => BsNavbarDropdownComponent))\n },\n})\nexport class DropdownToggleDirective {\n\n private elementRef = inject<ElementRef<HTMLAnchorElement>>(ElementRef);\n private bsNavbarItem = inject<BsNavbarItemComponent>(forwardRef(() => BsNavbarItemComponent));\n\n childDropdowns!: QueryList<BsNavbarDropdownComponent>;\n}","import { Directive, ElementRef, forwardRef, inject } from '@angular/core';\nimport { BsNavbarDropdownComponent } from '../navbar-dropdown/navbar-dropdown.component';\nimport { BsNavbarComponent } from '../navbar/navbar.component';\n\n@Directive({\n selector: 'bs-navbar-item > li > a',\n // Below selector doesn't work well either (does not select the github link)\n // selector: 'bs-navbar-item > a[routerLink]'\n // Below selector seems to target other a's that aren't even remotely inside a bs-navbar-item\n // selector: 'bs-navbar-item:first-child > a'\n host: {\n '[class.cursor-pointer]': 'cursorPointer',\n },\n})\nexport class NavLinkDirective {\n\n private elementRef = inject<ElementRef<HTMLAnchorElement>>(ElementRef);\n private parentNavbar = inject(BsNavbarComponent, { optional: true });\n private parentDropdown = inject<BsNavbarDropdownComponent>(forwardRef(() => BsNavbarDropdownComponent), { optional: true });\n\n cursorPointer: boolean;\n\n constructor() {\n if (this.parentNavbar) {\n if (this.parentDropdown == null) {\n this.elementRef.nativeElement.classList.add('nav-link');\n } else {\n this.elementRef.nativeElement.classList.add('dropdown-item');\n }\n }\n this.cursorPointer = !!this.parentNavbar;\n }\n\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"mintplayer-ng-bootstrap-navbar.mjs","sources":["../../../../libs/mintplayer-ng-bootstrap/navbar/src/navbar/navbar.component.ts","../../../../libs/mintplayer-ng-bootstrap/navbar/src/navbar/navbar.component.html","../../../../libs/mintplayer-ng-bootstrap/navbar/src/navbar-brand/navbar-brand.component.ts","../../../../libs/mintplayer-ng-bootstrap/navbar/src/navbar-brand/navbar-brand.component.html","../../../../libs/mintplayer-ng-bootstrap/navbar/src/navbar-nav/navbar-nav.component.ts","../../../../libs/mintplayer-ng-bootstrap/navbar/src/navbar-nav/navbar-nav.component.html","../../../../libs/mintplayer-ng-bootstrap/navbar/src/navbar-item/navbar-item.component.ts","../../../../libs/mintplayer-ng-bootstrap/navbar/src/navbar-item/navbar-item.component.html","../../../../libs/mintplayer-ng-bootstrap/navbar/src/navbar-dropdown/navbar-dropdown.component.ts","../../../../libs/mintplayer-ng-bootstrap/navbar/src/navbar-dropdown/navbar-dropdown.component.html","../../../../libs/mintplayer-ng-bootstrap/navbar/src/navbar-content/navbar-content.directive.ts","../../../../libs/mintplayer-ng-bootstrap/navbar/src/navbar-trigger/navbar-trigger.directive.ts","../../../../libs/mintplayer-ng-bootstrap/navbar/src/expand-button/expand-button.directive.ts","../../../../libs/mintplayer-ng-bootstrap/navbar/src/dropdown-toggle/dropdown-toggle.directive.ts","../../../../libs/mintplayer-ng-bootstrap/navbar/src/nav-link/nav-link.directive.ts","../../../../libs/mintplayer-ng-bootstrap/navbar/mintplayer-ng-bootstrap-navbar.ts"],"sourcesContent":["import { ChangeDetectionStrategy, Component, computed, ElementRef, input, signal, TemplateRef, viewChild } from '@angular/core';\nimport { NgTemplateOutlet } from '@angular/common';\nimport { BsContainerComponent } from '@mintplayer/ng-bootstrap/container';\nimport { BsUserAgentDirective } from '@mintplayer/ng-bootstrap/user-agent';\nimport { BsNoNoscriptDirective } from '@mintplayer/ng-bootstrap/no-noscript';\nimport { Breakpoint, Color } from '@mintplayer/ng-bootstrap';\n\n@Component({\n selector: 'bs-navbar',\n templateUrl: './navbar.component.html',\n styleUrls: ['./navbar.component.scss'],\n imports: [NgTemplateOutlet, BsContainerComponent, BsUserAgentDirective, BsNoNoscriptDirective],\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n '(window:resize)': 'onWindowResize()',\n },\n})\nexport class BsNavbarComponent {\n\n private resizeTimeout: ReturnType<typeof setTimeout> | null = null;\n\n constructor() {\n this.onWindowResize();\n }\n\n onWindowResize() {\n this.isResizing.set(true);\n if (typeof window !== 'undefined') {\n this.windowWidth.set(window.innerWidth);\n }\n\n // Clear any existing timeout to debounce\n if (this.resizeTimeout) {\n clearTimeout(this.resizeTimeout);\n }\n\n // Reset isResizing after debounce period\n this.resizeTimeout = setTimeout(() => {\n this.isResizing.set(false);\n }, 300);\n }\n\n readonly nav = viewChild.required<ElementRef>('nav');\n autoclose = input(true);\n\n expandButtonTemplate = signal<TemplateRef<any> | null>(null);\n\n isExpanded = signal<boolean>(false);\n windowWidth = signal<number | null>(null);\n isResizing = signal<boolean>(false);\n\n color = input<Color | null>(null);\n breakpoint = input<Breakpoint | null>('md');\n\n expandAt = computed(() => {\n const breakpoint = this.breakpoint();\n switch (breakpoint) {\n case 'xxl': return 1400;\n case 'xl': return 1200;\n case 'lg': return 992;\n case 'md': return 768;\n case 'sm': return 576;\n case 'xs': return 0;\n default: return null;\n }\n });\n\n isSmallMode = computed(() => {\n const expandAt = this.expandAt();\n const windowWidth = this.windowWidth();\n if (windowWidth === null) {\n return true;\n } else if (!expandAt) {\n return true;\n } else if (windowWidth >= expandAt) {\n return false;\n } else {\n return true;\n }\n });\n\n expandClass = computed(() => {\n const breakpoint = this.breakpoint();\n if (breakpoint === null) {\n return null;\n } else {\n return `navbar-expand-${breakpoint}`;\n }\n });\n\n wAutoClass = computed(() => {\n const breakpoint = this.breakpoint();\n if (breakpoint === null) {\n return null;\n } else {\n return `w-${breakpoint}-auto`;\n }\n });\n\n dNoneClass = computed(() => {\n const breakpoint = this.breakpoint();\n if (breakpoint === null) {\n return null;\n } else {\n return `d-${breakpoint}-none`;\n }\n });\n\n backgroundColorClass = computed(() => {\n const color = this.color();\n switch (color) {\n case Color.light:\n case null:\n return ['navbar-light'];\n default:\n return ['navbar-dark', `bg-${Color[color]}`];\n }\n });\n\n navClassList = computed(() => {\n const expandClass = this.expandClass();\n const backgroundColorClass = this.backgroundColorClass();\n const result: string[] = [];\n return result.concat(expandClass ?? [], ...backgroundColorClass);\n });\n\n toggleExpanded() {\n this.isExpanded.update(v => !v);\n }\n}\n","<bs-container>\n <nav #nav class=\"navbar position-fixed\" [class]=\"navClassList()\" bsUserAgent bsNoNoscript aria-label=\"Main navigation\">\n <div class=\"container-fluid nav-wrapper\">\n <div class=\"d-flex w-100\" [class]=\"wAutoClass()\">\n <ng-content select=\"bs-navbar-brand\"></ng-content>\n <div class=\"flex-end d-flex tw\" [class]=\"dNoneClass()\">\n <button (click)=\"toggleExpanded()\"\n class=\"align-self-center\"\n [class.navbar-toggler]=\"!expandButtonTemplate()\"\n [class.bg-transparent]=\"expandButtonTemplate()\"\n [class.shadow-none]=\"expandButtonTemplate()\"\n [class.border-0]=\"expandButtonTemplate()\"\n type=\"button\"\n aria-label=\"Toggle navigation\"\n [attr.aria-expanded]=\"isExpanded()\"\n aria-controls=\"navbar-collapse\">\n <ng-container *ngTemplateOutlet=\"expandButtonTemplate() ?? defaultExpandButton; context: { $implicit: isExpanded() }\"></ng-container>\n </button>\n </div>\n </div>\n <ng-content></ng-content>\n </div>\n </nav>\n</bs-container>\n\n<ng-template #defaultExpandButton>\n <span class=\"navbar-toggler-icon\" aria-hidden=\"true\"></span>\n</ng-template>\n","import { AfterContentChecked, Component, ElementRef, inject, input, ChangeDetectionStrategy} from '@angular/core';\n\n@Component({\n selector: 'bs-navbar-brand',\n templateUrl: './navbar-brand.component.html',\n styleUrls: ['./navbar-brand.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n '[class.mx-auto]': 'true',\n },\n})\nexport class BsNavbarBrandComponent implements AfterContentChecked {\n private element = inject(ElementRef);\n readonly routerLink = input<any[]>([]);\n\n ngAfterContentChecked() {\n const anchor = this.element.nativeElement.querySelector('a');\n if (anchor) {\n anchor.classList.add('nav-link');\n }\n }\n}\n","<span class=\"navbar-brand mx-auto mx-md-unset\">\n <ng-content></ng-content>\n</span>","import { ChangeDetectionStrategy, Component, computed, inject, input, signal } from '@angular/core';\nimport { SlideUpDownAnimation } from '@mintplayer/ng-animations';\nimport { BsNavbarComponent } from '../navbar/navbar.component';\n\n@Component({\n selector: 'bs-navbar-nav',\n templateUrl: './navbar-nav.component.html',\n styleUrls: ['./navbar-nav.component.scss'],\n animations: [SlideUpDownAnimation],\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n '(window:resize)': 'onWindowResize()',\n },\n})\nexport class BsNavbarNavComponent {\n\n bsNavbar = inject(BsNavbarComponent);\n\n windowWidth = signal<number | null>(null);\n isResizing = signal<boolean>(false);\n collapse = input<boolean>(true);\n\n private resizeTimeout: ReturnType<typeof setTimeout> | null = null;\n\n showNavs = computed(() => {\n const isExpanded = this.bsNavbar.isExpanded();\n const expandAt = this.bsNavbar.expandAt();\n const windowWidth = this.windowWidth();\n\n if (windowWidth === null) {\n return false;\n } else if (expandAt === null) {\n return isExpanded;\n } else if (windowWidth >= expandAt) {\n return true;\n } else {\n return isExpanded;\n }\n });\n\n constructor() {\n this.onWindowResize();\n }\n\n onWindowResize() {\n this.isResizing.set(true);\n if (typeof window !== 'undefined') {\n this.windowWidth.set(window.innerWidth);\n }\n\n // Clear any existing timeout to debounce\n if (this.resizeTimeout) {\n clearTimeout(this.resizeTimeout);\n }\n\n // Reset isResizing after debounce period\n this.resizeTimeout = setTimeout(() => {\n this.isResizing.set(false);\n }, 300);\n }\n}\n","<div class=\"navbar-collapse w-100 show\" [class.collapse]=\"collapse()\" [@slideUpDown]=\"showNavs()\" [@.disabled]=\"isResizing()\">\n <ul class=\"navbar-nav mr-auto\">\n <ng-content></ng-content>\n </ul>\n</div>\n","import { AfterContentChecked, AfterContentInit, ChangeDetectionStrategy, Component, computed, contentChildren, DestroyRef, effect, ElementRef, forwardRef, inject, PLATFORM_ID } from '@angular/core';\nimport { isPlatformServer } from '@angular/common';\nimport { Router } from '@angular/router';\nimport { BsNavbarComponent } from '../navbar/navbar.component';\nimport { BsNavbarDropdownComponent } from '../navbar-dropdown/navbar-dropdown.component';\n\n/** Duration of the navbar collapse animation in milliseconds */\nconst NAVBAR_ANIMATION_DURATION = 300;\n\n@Component({\n selector: 'bs-navbar-item',\n templateUrl: './navbar-item.component.html',\n styleUrls: ['./navbar-item.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class BsNavbarItemComponent implements AfterContentInit, AfterContentChecked {\n\n private navbar = inject(BsNavbarComponent);\n element = inject(ElementRef);\n private destroy = inject(DestroyRef);\n private platformId = inject(PLATFORM_ID);\n private router = inject(Router);\n parentDropdown = inject(forwardRef(() => BsNavbarDropdownComponent), { optional: true });\n\n readonly hasDropdown = computed(() => this.dropdowns().length > 0);\n anchorTag: HTMLAnchorElement | null = null;\n readonly dropdowns = contentChildren<BsNavbarDropdownComponent>(forwardRef(() => BsNavbarDropdownComponent));\n\n constructor() {\n // Effect handles future isSmallMode changes after content is initialized\n effect(() => {\n const isSmallMode = this.navbar.isSmallMode();\n this.dropdowns().forEach((dropdown) => {\n dropdown.showInOverlay = !isSmallMode;\n });\n });\n }\n\n ngAfterContentInit() {\n // Set initial showInOverlay state after content children are resolved\n // This is needed because the effect runs before @ContentChildren is populated\n const isSmallMode = this.navbar.isSmallMode();\n this.dropdowns().forEach((dropdown) => {\n dropdown.showInOverlay = !isSmallMode;\n });\n }\n\n ngAfterContentChecked() {\n this.anchorTag = this.element.nativeElement.querySelector('li a');\n\n // Add nav-link or dropdown-item class (previously done by NavLinkDirective)\n if (this.anchorTag && !this.anchorTag.getAttribute('nav-link-class-added')) {\n if (this.parentDropdown === null) {\n this.anchorTag.classList.add('nav-link');\n } else {\n this.anchorTag.classList.add('dropdown-item');\n }\n this.anchorTag.classList.add('cursor-pointer');\n this.anchorTag.setAttribute('nav-link-class-added', 'true');\n }\n\n if (this.hasDropdown()) {\n if (this.anchorTag) {\n this.anchorTag.classList.add('dropdown-toggle');\n\n if (isPlatformServer(this.platformId)) {\n this.anchorTag.href = 'javascript:;';\n }\n\n if (!this.anchorTag.getAttribute('close-init-b')) {\n this.anchorTag.setAttribute('close-init-b', '1');\n this.anchorTag.addEventListener('click', (ev: MouseEvent) => {\n ev.preventDefault();\n this.dropdowns().forEach((dropdown) => {\n const newVisible = !dropdown.isVisible();\n dropdown.isVisible.set(newVisible);\n if (!newVisible) {\n dropdown.childDropdowns().forEach((child) => child.isVisible.set(false));\n }\n });\n return false;\n });\n }\n }\n } else {\n\n if ((this.dropdowns().length === 0) && this.anchorTag && !this.anchorTag.getAttribute('close-init-a')) {\n this.anchorTag.setAttribute('close-init-a', '1');\n this.anchorTag.addEventListener('click', (ev: MouseEvent) => {\n let d = this.parentDropdown;\n while (d && d.autoclose()) {\n d.isVisible.set(false);\n d = d.parentDropdown;\n }\n if (this.navbar.autoclose()) {\n // Get the fragment from the link's href\n const href = this.anchorTag?.getAttribute('href') ?? '';\n const fragmentMatch = href.match(/#(.+)$/);\n const fragment = fragmentMatch ? fragmentMatch[1] : null;\n\n // Always collapse the navbar\n this.navbar.isExpanded.set(false);\n\n // If in small mode with a fragment, prevent default navigation and\n // navigate after the collapse animation completes to avoid double scroll\n if (this.navbar.isSmallMode() && fragment) {\n ev.preventDefault();\n\n // After the collapse animation completes, navigate to the anchor\n // This ensures correct scroll position since navbar height is stable\n setTimeout(() => {\n this.router.navigateByUrl(href);\n }, NAVBAR_ANIMATION_DURATION);\n }\n }\n });\n }\n\n }\n }\n}\n","<li [class.nav-item]=\"parentDropdown === null\" [class.dropdown]=\"(dropdowns().length > 0) && (parentDropdown === null)\" [class.dropend]=\"(dropdowns().length > 0) && (parentDropdown !== null)\">\n <ng-content></ng-content>\n</li>","import { DOCUMENT, isPlatformServer } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, contentChildren, computed, DestroyRef, effect, ElementRef, forwardRef, inject, Injector, input, OnDestroy, PLATFORM_ID, signal, SkipSelf, viewChild } from '@angular/core';\nimport { ClickOutsideDirective } from '@mintplayer/ng-click-outside';\nimport { BsHasOverlayComponent } from '@mintplayer/ng-bootstrap/has-overlay';\nimport { BsNoNoscriptDirective } from '@mintplayer/ng-bootstrap/no-noscript';\nimport { BsNavbarComponent } from '../navbar/navbar.component';\nimport { BsNavbarItemComponent } from '../navbar-item/navbar-item.component';\nimport { DomPortal } from '@angular/cdk/portal';\nimport { OverlayRef } from '@angular/cdk/overlay';\n\n@Component({\n selector: 'bs-navbar-dropdown',\n templateUrl: './navbar-dropdown.component.html',\n styleUrls: ['./navbar-dropdown.component.scss'],\n imports: [BsHasOverlayComponent, BsNoNoscriptDirective, ClickOutsideDirective],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class BsNavbarDropdownComponent implements OnDestroy {\n\n private navbar = inject(BsNavbarComponent);\n parentDropdown = inject(BsNavbarDropdownComponent, { skipSelf: true, optional: true });\n navbarItem = inject(forwardRef(() => BsNavbarItemComponent), { host: true });\n element = inject<ElementRef<HTMLElement>>(ElementRef);\n private injector = inject(Injector);\n private document = inject(DOCUMENT);\n private platformId = inject(PLATFORM_ID);\n\n private readonly isAttached = signal<boolean>(false);\n private readonly isDestroyed = signal<boolean>(false);\n private domPortal?: DomPortal;\n private overlay?: OverlayRef;\n private pendingShowInOverlay: boolean | null = null;\n\n autoclose = input(true);\n readonly dropdownElement = viewChild.required<ElementRef<HTMLDivElement>>('dd');\n isBrowser = !isPlatformServer(this.platformId);\n\n isVisible = signal<boolean>(false);\n topPos = signal<number | null>(null);\n\n maxHeight = computed(() => {\n const topPos = this.topPos();\n const w: Window | null = this.document.defaultView;\n if (!topPos) {\n return null;\n } else if (w && this.dropdownElement()) {\n const style = w.getComputedStyle(this.dropdownElement().nativeElement);\n return `calc(100vh - ${topPos}px - ${style.getPropertyValue('padding-top')} - ${style.getPropertyValue('padding-bottom')})`;\n } else {\n return null;\n }\n });\n\n maxHeightOrNull = computed(() => {\n const maxHeight = this.maxHeight();\n const isSmallMode = this.navbar.isSmallMode();\n if (isSmallMode) {\n return null;\n } else if (isPlatformServer(this.platformId)) {\n return this.parentDropdown ? null : maxHeight;\n } else {\n return maxHeight;\n }\n });\n\n constructor() {\n effect(() => {\n const isVisible = this.isVisible();\n if (isVisible) {\n setTimeout(() => {\n try { this.overlay?.updatePosition(); }\n catch (ex) { }\n }, 20);\n this.topPos.set(this.element.nativeElement.offsetTop);\n } else {\n this.topPos.set(null);\n }\n });\n\n if (!!this.parentDropdown && this.isBrowser) {\n import('@angular/cdk/overlay').then(({ Overlay }) => {\n // Guard against accessing injector after component is destroyed\n if (this.isDestroyed()) {\n return;\n }\n const overlayService = this.injector.get(Overlay);\n this.domPortal = new DomPortal(this.element);\n this.overlay = overlayService.create({\n positionStrategy: overlayService.position()\n .flexibleConnectedTo(this.navbarItem.element)\n .withPositions([\n { originX: 'end', originY: 'top', overlayX: 'start', overlayY: 'top', offsetX: -9, offsetY: -9 }\n ])\n });\n\n // Apply pending showInOverlay state if it was set before overlay was ready\n if (this.pendingShowInOverlay !== null) {\n const pending = this.pendingShowInOverlay;\n this.pendingShowInOverlay = null;\n this.showInOverlay = pending;\n }\n });\n }\n }\n\n ngOnDestroy() {\n this.isDestroyed.set(true);\n this.overlay?.dispose();\n }\n\n public set showInOverlay(value: boolean) {\n if (this.overlay && this.domPortal) {\n if (value && !this.isAttached()) {\n this.overlay.attach(this.domPortal);\n this.isAttached.set(true);\n }\n if (!value && this.isAttached()) {\n this.overlay.detach();\n this.isAttached.set(false);\n }\n } else {\n // Store the value to apply once the overlay is ready\n this.pendingShowInOverlay = value;\n }\n }\n\n get elementsToExclude() {\n return [this.navbarItem.anchorTag].filter((a) => a).map((a) => <HTMLElement>a);\n }\n\n readonly childDropdowns = contentChildren<BsNavbarDropdownComponent>(forwardRef(() => BsNavbarDropdownComponent), { descendants: true });\n}\n","<bs-has-overlay></bs-has-overlay>\n<ul #dd class=\"dropdown-menu me-3\" [class.show]=\"isVisible()\" [class.submenu]=\"!!parentDropdown\" [class.overflow-y-auto]=\"isBrowser\" [style.max-height]=\"maxHeightOrNull()\" bsNoNoscript (clickOutside)=\"isVisible.set(false)\" [exclude]=\"elementsToExclude\" aria-labelledby=\"navbarDropdown\">\n <ng-content></ng-content>\n</ul>\n\n<!--\n - Working demo: https://codepen.io/agop/pen/VwwMGR\n - Location must be set through javascript\n - bsNoScript => If noscript, 2nd-level submenus must be shown inside the 1st-level submenu\n -->\n <!--\n - Another option: https://stackblitz.com/edit/web-platform-vmsr4l?file=index.html\n - But this doesn't seem to work here\n -->\n","import { isPlatformServer } from '@angular/common';\nimport { AfterViewInit, Directive, effect, ElementRef, inject, input, OnDestroy, PLATFORM_ID, signal } from '@angular/core';\nimport { BsNavbarComponent } from '../navbar/navbar.component';\n\n@Directive({\n selector: '[bsNavbarContent]',\n})\nexport class BsNavbarContentDirective implements AfterViewInit, OnDestroy {\n\n private element = inject(ElementRef);\n private platformId = inject(PLATFORM_ID);\n\n navbar = input<BsNavbarComponent | undefined>(undefined, { alias: 'bsNavbarContent' });\n private viewInit = signal<boolean>(false);\n resizeObserver: ResizeObserver | null = null;\n initialPadding = 0;\n\n constructor() {\n effect(() => {\n const viewInit = this.viewInit();\n const navbar = this.navbar();\n\n if (viewInit && navbar) {\n if (isPlatformServer(this.platformId)) {\n this.element.nativeElement.style.paddingTop = (this.initialPadding + 58) + 'px';\n } else {\n this.resizeObserver = new ResizeObserver((entries) => {\n const height = navbar.nav().nativeElement.offsetHeight;\n this.element.nativeElement.style.paddingTop = (this.initialPadding + height) + 'px';\n });\n\n const px = getComputedStyle(this.element.nativeElement).getPropertyValue('padding-top');\n const pt = parseInt(px.replace(/px$/, ''));\n this.initialPadding = isNaN(pt) ? 0 : pt;\n if (this.resizeObserver && navbar) {\n this.resizeObserver.observe(navbar.nav().nativeElement);\n }\n }\n }\n });\n }\n\n ngAfterViewInit() {\n this.viewInit.set(true);\n }\n\n ngOnDestroy() {\n const navbar = this.navbar();\n if (navbar) {\n this.resizeObserver?.unobserve(navbar.nav().nativeElement);\n }\n }\n}\n","import { Directive, computed, inject, input, signal } from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { NavigationEnd, Router } from '@angular/router';\nimport { filter } from 'rxjs/operators';\n\n/**\n * Marks a navbar dropdown trigger anchor. Replaces both `routerLink` and\n * `routerLinkActive` on a trigger element: toggles the active CSS class when a\n * sub-route under the bound URL is active, but does NOT navigate on click\n * (which `routerLink` would do via its own host listener, even when other\n * click handlers `preventDefault`).\n *\n * @example\n * ```html\n * <a bsNavbarTrigger=\"/overlays\">Overlays</a>\n * ```\n *\n * Items inside the dropdown panel still use real `[routerLink]`s for\n * navigation. Use this directive only for the trigger anchor that opens the\n * dropdown panel.\n */\n@Directive({\n selector: '[bsNavbarTrigger]',\n host: {\n 'href': 'javascript:void(0)',\n '[class.active]': 'isActive()',\n '(click)': '$event.preventDefault()',\n },\n})\nexport class BsNavbarTriggerDirective {\n private router = inject(Router);\n\n readonly bsNavbarTrigger = input.required<string | readonly string[]>();\n\n private currentUrl = signal(this.router.url);\n\n private targetUrl = computed(() => {\n const v = this.bsNavbarTrigger();\n if (Array.isArray(v)) {\n // join with '/', collapse double slashes; ensure leading slash\n const joined = (v as readonly string[]).join('/').replace(/\\/+/g, '/');\n return joined.startsWith('/') ? joined : '/' + joined;\n }\n return v as string;\n });\n\n readonly isActive = computed(() => {\n const url = this.currentUrl();\n const target = this.targetUrl();\n return url === target || url.startsWith(target + '/');\n });\n\n constructor() {\n this.router.events.pipe(\n filter(ev => ev instanceof NavigationEnd),\n takeUntilDestroyed(),\n ).subscribe(() => this.currentUrl.set(this.router.url));\n }\n}\n","import { Directive, inject, TemplateRef } from '@angular/core';\nimport { BsNavbarComponent } from '../navbar/navbar.component';\n\n@Directive({\n selector: '[bsExpandButton]',\n})\nexport class BsExpandButtonDirective {\n\n constructor() {\n const navbar = inject(BsNavbarComponent);\n const templateRef = inject(TemplateRef);\n navbar.expandButtonTemplate.set(templateRef);\n }\n \n public static ngTemplateContextGuard(\n dir: BsExpandButtonDirective,\n ctx: any\n ): ctx is BsExpandButtonContext {\n return true;\n }\n\n}\n\nexport class BsExpandButtonContext {\n public $implicit: boolean = null!;\n}","import { ContentChildren, Directive, ElementRef, forwardRef, inject, QueryList } from '@angular/core';\nimport { BsNavbarItemComponent } from '../navbar-item/navbar-item.component';\nimport { BsNavbarDropdownComponent } from '../navbar-dropdown/navbar-dropdown.component';\n\n@Directive({\n // selector: 'bs-navbar-item > a[routerLink]',\n selector: 'bs-navbar-item',\n queries: {\n childDropdowns: new ContentChildren(forwardRef(() => BsNavbarDropdownComponent))\n },\n})\nexport class DropdownToggleDirective {\n\n private elementRef = inject<ElementRef<HTMLAnchorElement>>(ElementRef);\n private bsNavbarItem = inject<BsNavbarItemComponent>(forwardRef(() => BsNavbarItemComponent));\n\n childDropdowns!: QueryList<BsNavbarDropdownComponent>;\n}","import { Directive, ElementRef, forwardRef, inject } from '@angular/core';\nimport { BsNavbarDropdownComponent } from '../navbar-dropdown/navbar-dropdown.component';\nimport { BsNavbarComponent } from '../navbar/navbar.component';\n\n@Directive({\n selector: 'bs-navbar-item > li > a',\n // Below selector doesn't work well either (does not select the github link)\n // selector: 'bs-navbar-item > a[routerLink]'\n // Below selector seems to target other a's that aren't even remotely inside a bs-navbar-item\n // selector: 'bs-navbar-item:first-child > a'\n host: {\n '[class.cursor-pointer]': 'cursorPointer',\n },\n})\nexport class NavLinkDirective {\n\n private elementRef = inject<ElementRef<HTMLAnchorElement>>(ElementRef);\n private parentNavbar = inject(BsNavbarComponent, { optional: true });\n private parentDropdown = inject<BsNavbarDropdownComponent>(forwardRef(() => BsNavbarDropdownComponent), { optional: true });\n\n cursorPointer: boolean;\n\n constructor() {\n if (this.parentNavbar) {\n if (this.parentDropdown == null) {\n this.elementRef.nativeElement.classList.add('nav-link');\n } else {\n this.elementRef.nativeElement.classList.add('dropdown-item');\n }\n }\n this.cursorPointer = !!this.parentNavbar;\n }\n\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
@@ -1,103 +1,205 @@
|
|
|
1
1
|
import * as i0 from '@angular/core';
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import { take } from 'rxjs';
|
|
2
|
+
import { InjectionToken, inject, PLATFORM_ID, DestroyRef, isDevMode, Injectable, input, Directive, makeEnvironmentProviders } from '@angular/core';
|
|
3
|
+
import { isPlatformBrowser } from '@angular/common';
|
|
4
|
+
import { ROUTER_CONFIGURATION, provideRouter, withRouterConfig } from '@angular/router';
|
|
5
|
+
import { isObservable, firstValueFrom, take, defaultIfEmpty } from 'rxjs';
|
|
6
6
|
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
7
|
+
/** Confirm hook used by the directive's fallback path (canExit undefined + exitMessage set). */
|
|
8
|
+
const BS_NAVIGATION_LOCK_CONFIRM = new InjectionToken('BS_NAVIGATION_LOCK_CONFIRM', {
|
|
9
|
+
providedIn: 'root',
|
|
10
|
+
factory: () => (message) => typeof window === 'undefined' ? true : window.confirm(message),
|
|
11
|
+
});
|
|
12
|
+
class BsNavigationLockService {
|
|
13
|
+
constructor() {
|
|
14
|
+
this.platformId = inject(PLATFORM_ID);
|
|
15
|
+
this.destroy = inject(DestroyRef);
|
|
16
|
+
this.locks = new Set();
|
|
17
|
+
this.pending = null;
|
|
18
|
+
if (isDevMode()) {
|
|
19
|
+
// canceledNavigationResolution is needed to restore the history stack
|
|
20
|
+
// on popstate-cancel. Default 'replace' loses the popped entry. The
|
|
21
|
+
// value is set via ROUTER_CONFIGURATION (typically through
|
|
22
|
+
// withRouterConfig in provideRouter); read it directly from the token
|
|
23
|
+
// since Router.options is private in the public type.
|
|
24
|
+
const config = inject(ROUTER_CONFIGURATION, { optional: true });
|
|
25
|
+
if (config?.canceledNavigationResolution !== 'computed') {
|
|
26
|
+
console.warn('[BsNavigationLockService] Router.canceledNavigationResolution is not "computed". ' +
|
|
27
|
+
'Pass withRouterConfig({ canceledNavigationResolution: "computed" }) to provideRouter ' +
|
|
28
|
+
'so popstate cancellations restore the history stack correctly.');
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
if (isPlatformBrowser(this.platformId)) {
|
|
32
|
+
const handler = (ev) => this.onBeforeUnload(ev);
|
|
33
|
+
window.addEventListener('beforeunload', handler);
|
|
34
|
+
this.destroy.onDestroy(() => window.removeEventListener('beforeunload', handler));
|
|
11
35
|
}
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
36
|
+
}
|
|
37
|
+
/** Internal — called by directive on init. */
|
|
38
|
+
register(lock) {
|
|
39
|
+
this.locks.add(lock);
|
|
40
|
+
}
|
|
41
|
+
/** Internal — called by directive on destroy. */
|
|
42
|
+
unregister(lock) {
|
|
43
|
+
this.locks.delete(lock);
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Programmatic check: ask every active lock if exit is OK.
|
|
47
|
+
* Resolves true only when every lock allows exit. Short-circuits on first false.
|
|
48
|
+
*
|
|
49
|
+
* Re-entrant calls while a check is already in flight return the same Promise
|
|
50
|
+
* — only the first `reason` is consulted. This dedups both router-driven
|
|
51
|
+
* fires (e.g. `canMatch` running once) and programmatic call sites that
|
|
52
|
+
* might invoke `requestExit` multiple times in the same tick.
|
|
53
|
+
*/
|
|
54
|
+
requestExit(reason) {
|
|
55
|
+
if (this.pending)
|
|
56
|
+
return this.pending;
|
|
57
|
+
this.pending = this.doRequestExit(reason);
|
|
58
|
+
return this.pending;
|
|
59
|
+
}
|
|
60
|
+
async doRequestExit(reason) {
|
|
61
|
+
try {
|
|
62
|
+
for (const lock of this.locks) {
|
|
63
|
+
const ok = await this.normalise(lock.requestCanExit(reason));
|
|
64
|
+
if (!ok)
|
|
65
|
+
return false;
|
|
66
|
+
}
|
|
67
|
+
return true;
|
|
68
|
+
}
|
|
69
|
+
finally {
|
|
70
|
+
this.pending = null;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
onBeforeUnload(ev) {
|
|
74
|
+
// PRD §5.4 — sync-first, browser does NOT await async results.
|
|
75
|
+
for (const lock of this.locks) {
|
|
76
|
+
const result = lock.requestCanExit();
|
|
77
|
+
if (typeof result === 'boolean') {
|
|
78
|
+
if (!result) {
|
|
79
|
+
ev.preventDefault();
|
|
80
|
+
ev.returnValue = '';
|
|
81
|
+
return;
|
|
82
|
+
}
|
|
83
|
+
continue;
|
|
84
|
+
}
|
|
85
|
+
// Promise / Observable — safe default: prompt the browser confirm.
|
|
86
|
+
ev.preventDefault();
|
|
87
|
+
ev.returnValue = '';
|
|
88
|
+
return;
|
|
15
89
|
}
|
|
16
90
|
}
|
|
17
|
-
|
|
18
|
-
|
|
91
|
+
normalise(r) {
|
|
92
|
+
if (typeof r === 'boolean')
|
|
93
|
+
return Promise.resolve(r);
|
|
94
|
+
if (isObservable(r))
|
|
95
|
+
return firstValueFrom(r.pipe(take(1), defaultIfEmpty(true)));
|
|
96
|
+
return r;
|
|
97
|
+
}
|
|
98
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.11", ngImport: i0, type: BsNavigationLockService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
99
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.11", ngImport: i0, type: BsNavigationLockService, providedIn: 'root' }); }
|
|
19
100
|
}
|
|
20
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.11", ngImport: i0, type:
|
|
101
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.11", ngImport: i0, type: BsNavigationLockService, decorators: [{
|
|
21
102
|
type: Injectable,
|
|
22
|
-
args: [{
|
|
23
|
-
|
|
24
|
-
}]
|
|
25
|
-
}] });
|
|
103
|
+
args: [{ providedIn: 'root' }]
|
|
104
|
+
}], ctorParameters: () => [] });
|
|
26
105
|
|
|
27
106
|
/**
|
|
28
|
-
*
|
|
107
|
+
* Marks the host as a navigation-blocker. Drop `[bsNavigationLock]` on a real
|
|
108
|
+
* element (typically the form). Set `[canExit]` to a boolean, function, or
|
|
109
|
+
* Observable. The service consults every active lock on Router navigation
|
|
110
|
+
* (via `bsNavigationLockGuard` registered at the root) and on `beforeunload`.
|
|
29
111
|
*
|
|
30
|
-
*
|
|
31
|
-
*
|
|
32
|
-
|
|
33
|
-
* canDeactivate: [BsNavigationLockGuard]
|
|
34
|
-
* ```
|
|
35
|
-
*
|
|
36
|
-
* and implement the `BsHasNavigationLock` on the page:
|
|
37
|
-
*
|
|
38
|
-
* ```ts
|
|
39
|
-
* ViewChild('navigationLock') navigationLock!: BsNavigationLockDirective;
|
|
40
|
-
* ```
|
|
41
|
-
*
|
|
42
|
-
**/
|
|
112
|
+
* Fallback: if `canExit` is not set but `exitMessage` is, the directive uses
|
|
113
|
+
* the injected `BS_NAVIGATION_LOCK_CONFIRM` hook with that message.
|
|
114
|
+
*/
|
|
43
115
|
class BsNavigationLockDirective {
|
|
44
116
|
constructor() {
|
|
45
|
-
this.router = inject(Router);
|
|
46
|
-
this.route = inject(ActivatedRoute);
|
|
47
117
|
this.destroy = inject(DestroyRef);
|
|
118
|
+
this.service = inject(BsNavigationLockService);
|
|
119
|
+
this.confirmFn = inject(BS_NAVIGATION_LOCK_CONFIRM);
|
|
48
120
|
this.canExit = input(undefined, ...(ngDevMode ? [{ debugName: "canExit" }] : /* istanbul ignore next */ []));
|
|
49
121
|
this.exitMessage = input(undefined, ...(ngDevMode ? [{ debugName: "exitMessage" }] : /* istanbul ignore next */ []));
|
|
122
|
+
this.service.register(this);
|
|
123
|
+
this.destroy.onDestroy(() => this.service.unregister(this));
|
|
50
124
|
}
|
|
51
|
-
requestCanExit() {
|
|
125
|
+
requestCanExit(reason) {
|
|
52
126
|
const canExit = this.canExit();
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
resolve(canExit);
|
|
59
|
-
}
|
|
60
|
-
else if (typeof canExit === 'function') {
|
|
61
|
-
const result = canExit();
|
|
62
|
-
resolve(result);
|
|
63
|
-
}
|
|
64
|
-
else {
|
|
65
|
-
canExit.pipe(take(1), takeUntilDestroyed(this.destroy))
|
|
66
|
-
.subscribe((result) => resolve(result));
|
|
67
|
-
}
|
|
68
|
-
});
|
|
69
|
-
}
|
|
70
|
-
async onBeforeUnload(ev) {
|
|
71
|
-
const canExit = await this.requestCanExit();
|
|
72
|
-
if (!canExit) {
|
|
73
|
-
ev.preventDefault();
|
|
74
|
-
ev.returnValue = false;
|
|
75
|
-
return 'Are you sure?';
|
|
76
|
-
}
|
|
77
|
-
else {
|
|
78
|
-
return undefined;
|
|
127
|
+
if (canExit === undefined) {
|
|
128
|
+
const msg = this.exitMessage();
|
|
129
|
+
if (msg)
|
|
130
|
+
return Promise.resolve(this.confirmFn(msg));
|
|
131
|
+
return true;
|
|
79
132
|
}
|
|
80
|
-
|
|
81
|
-
|
|
133
|
+
if (typeof canExit === 'boolean')
|
|
134
|
+
return canExit;
|
|
135
|
+
if (typeof canExit === 'function')
|
|
136
|
+
return canExit(reason);
|
|
137
|
+
return canExit; // Observable<boolean>
|
|
82
138
|
}
|
|
83
139
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.11", ngImport: i0, type: BsNavigationLockDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
|
|
84
|
-
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "21.2.11", type: BsNavigationLockDirective, isStandalone: true, selector: "[bsNavigationLock]", inputs: { canExit: { classPropertyName: "canExit", publicName: "canExit", isSignal: true, isRequired: false, transformFunction: null }, exitMessage: { classPropertyName: "exitMessage", publicName: "exitMessage", isSignal: true, isRequired: false, transformFunction: null } },
|
|
140
|
+
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "21.2.11", type: BsNavigationLockDirective, isStandalone: true, selector: "[bsNavigationLock]", inputs: { canExit: { classPropertyName: "canExit", publicName: "canExit", isSignal: true, isRequired: false, transformFunction: null }, exitMessage: { classPropertyName: "exitMessage", publicName: "exitMessage", isSignal: true, isRequired: false, transformFunction: null } }, exportAs: ["bsNavigationLock"], ngImport: i0 }); }
|
|
85
141
|
}
|
|
86
142
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.11", ngImport: i0, type: BsNavigationLockDirective, decorators: [{
|
|
87
143
|
type: Directive,
|
|
88
144
|
args: [{
|
|
89
145
|
selector: '[bsNavigationLock]',
|
|
90
146
|
exportAs: 'bsNavigationLock',
|
|
91
|
-
host: {
|
|
92
|
-
'(window:beforeunload)': 'onBeforeUnload($event)',
|
|
93
|
-
'(window:unload)': 'onUnload($event)',
|
|
94
|
-
},
|
|
95
147
|
}]
|
|
96
|
-
}], propDecorators: { canExit: [{ type: i0.Input, args: [{ isSignal: true, alias: "canExit", required: false }] }], exitMessage: [{ type: i0.Input, args: [{ isSignal: true, alias: "exitMessage", required: false }] }] } });
|
|
148
|
+
}], ctorParameters: () => [], propDecorators: { canExit: [{ type: i0.Input, args: [{ isSignal: true, alias: "canExit", required: false }] }], exitMessage: [{ type: i0.Input, args: [{ isSignal: true, alias: "exitMessage", required: false }] }] } });
|
|
149
|
+
|
|
150
|
+
/**
|
|
151
|
+
* Functional `canMatch` guard the consumer registers ONCE at the root route:
|
|
152
|
+
*
|
|
153
|
+
* ```ts
|
|
154
|
+
* { path: '', canMatch: [bsNavigationLockGuard], children: [...] }
|
|
155
|
+
* ```
|
|
156
|
+
*
|
|
157
|
+
* `canMatch` is the right Angular guard for "should this navigation be allowed
|
|
158
|
+
* to start": it runs once per route-match attempt, regardless of how deeply
|
|
159
|
+
* nested the destination is. (`canActivateChild` would fire once per descendant
|
|
160
|
+
* activation — N prompts for an N-deep destination.)
|
|
161
|
+
*
|
|
162
|
+
* Note: when `canMatch` returns false the router treats the route as not
|
|
163
|
+
* matching; if a sibling route or wildcard fallback matches the destination URL,
|
|
164
|
+
* the user lands there instead of staying put. Most apps don't have a `**`
|
|
165
|
+
* redirect that conflicts; if yours does, additionally guard the wildcard.
|
|
166
|
+
*
|
|
167
|
+
* Programmatic call sites that need a `reason` argument should call
|
|
168
|
+
* `BsNavigationLockService.requestExit(reason)` directly.
|
|
169
|
+
*/
|
|
170
|
+
const bsNavigationLockGuard = () => {
|
|
171
|
+
return inject(BsNavigationLockService).requestExit();
|
|
172
|
+
};
|
|
173
|
+
|
|
174
|
+
/**
|
|
175
|
+
* Optional provider. Without it, the service is still root-provided and
|
|
176
|
+
* uses `window.confirm` as the default fallback confirm UI.
|
|
177
|
+
*/
|
|
178
|
+
function provideNavigationLock(opts) {
|
|
179
|
+
return makeEnvironmentProviders([
|
|
180
|
+
...(opts?.confirm
|
|
181
|
+
? [{ provide: BS_NAVIGATION_LOCK_CONFIRM, useValue: opts.confirm }]
|
|
182
|
+
: []),
|
|
183
|
+
]);
|
|
184
|
+
}
|
|
185
|
+
/**
|
|
186
|
+
* One-call router setup for navigation-lock. Wraps `routes` in a root
|
|
187
|
+
* `{ path: '', canMatch: [bsNavigationLockGuard], children }` entry and
|
|
188
|
+
* applies `canceledNavigationResolution: 'computed'` (required for
|
|
189
|
+
* popstate-cancel to restore the history stack). Pass any additional router
|
|
190
|
+
* features (`withPreloading`, `withInMemoryScrolling`, …) as extra arguments.
|
|
191
|
+
*
|
|
192
|
+
* If you also pass your own `withRouterConfig`, make sure it includes
|
|
193
|
+
* `canceledNavigationResolution: 'computed'` — the dev-mode warning from
|
|
194
|
+
* `BsNavigationLockService` will fire otherwise.
|
|
195
|
+
*/
|
|
196
|
+
function provideNavigationLockRouter(routes, ...features) {
|
|
197
|
+
return provideRouter([{ path: '', canMatch: [bsNavigationLockGuard], children: routes }], withRouterConfig({ canceledNavigationResolution: 'computed' }), ...features);
|
|
198
|
+
}
|
|
97
199
|
|
|
98
200
|
/**
|
|
99
201
|
* Generated bundle index. Do not edit.
|
|
100
202
|
*/
|
|
101
203
|
|
|
102
|
-
export { BsNavigationLockDirective,
|
|
204
|
+
export { BS_NAVIGATION_LOCK_CONFIRM, BsNavigationLockDirective, BsNavigationLockService, bsNavigationLockGuard, provideNavigationLock, provideNavigationLockRouter };
|
|
103
205
|
//# sourceMappingURL=mintplayer-ng-bootstrap-navigation-lock.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mintplayer-ng-bootstrap-navigation-lock.mjs","sources":["../../../../libs/mintplayer-ng-bootstrap/navigation-lock/src/guard/navigation-lock.guard.ts","../../../../libs/mintplayer-ng-bootstrap/navigation-lock/src/directive/navigation-lock.directive.ts","../../../../libs/mintplayer-ng-bootstrap/navigation-lock/mintplayer-ng-bootstrap-navigation-lock.ts"],"sourcesContent":["import { Injectable } from '@angular/core';\nimport { ActivatedRouteSnapshot, RouterStateSnapshot, UrlTree } from '@angular/router';\nimport { BsHasNavigationLock } from '../interface/has-navigation-lock';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class BsNavigationLockGuard {\n canDeactivate(\n component: BsHasNavigationLock,\n currentRoute: ActivatedRouteSnapshot,\n currentState: RouterStateSnapshot,\n nextState?: RouterStateSnapshot): Promise<boolean | UrlTree> {\n if (component.navigationLock()) {\n return component.navigationLock().requestCanExit();\n } else {\n console.warn('When using <bs-navigation-lock>, you should implement BsHasNavigationLock and add \"readonly navigationLock = viewChild.required<BsNavigationLockDirective>(\\'navigationLock\\');\" to your page');\n return new Promise<boolean>(resolve => resolve(false));\n }\n }\n \n}\n","import { DestroyRef, Directive, inject, input } from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { ActivatedRoute, Router } from '@angular/router';\nimport { take, Observable } from 'rxjs';\n\n\n/**\n * Places a navigation lock on this page.\n *\n * Don't forget to add the following to your route:\n *\n * ```ts\n * canDeactivate: [BsNavigationLockGuard]\n * ```\n *\n * and implement the `BsHasNavigationLock` on the page:\n *\n * ```ts\n * ViewChild('navigationLock') navigationLock!: BsNavigationLockDirective;\n * ```\n *\n **/\n@Directive({\n selector: '[bsNavigationLock]',\n exportAs: 'bsNavigationLock',\n host: {\n '(window:beforeunload)': 'onBeforeUnload($event)',\n '(window:unload)': 'onUnload($event)',\n },\n})\nexport class BsNavigationLockDirective {\n private router = inject(Router);\n private route = inject(ActivatedRoute);\n private destroy = inject(DestroyRef);\n\n readonly canExit = input<boolean | (() => boolean) | Observable<boolean> | undefined>(undefined);\n readonly exitMessage = input<string | undefined>(undefined);\n\n requestCanExit() {\n const canExit = this.canExit();\n return new Promise<boolean>((resolve, reject) => {\n if (typeof canExit === 'undefined') {\n resolve(true);\n } else if (typeof canExit === 'boolean') {\n resolve(canExit);\n } else if (typeof canExit === 'function') {\n const result = canExit();\n resolve(result);\n } else {\n canExit.pipe(take(1), takeUntilDestroyed(this.destroy))\n .subscribe((result) => resolve(result));\n }\n });\n }\n\n async onBeforeUnload(ev: BeforeUnloadEvent): Promise<string | undefined> {\n const canExit = await this.requestCanExit();\n if (!canExit) {\n ev.preventDefault();\n ev.returnValue = false;\n return 'Are you sure?';\n } else {\n return undefined;\n }\n }\n\n onUnload(ev: Event) {\n\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;;;MAOa,qBAAqB,CAAA;AAChC,IAAA,aAAa,CACX,SAA8B,EAC9B,YAAoC,EACpC,YAAiC,EACjC,SAA+B,EAAA;AAC7B,QAAA,IAAI,SAAS,CAAC,cAAc,EAAE,EAAE;AAC9B,YAAA,OAAO,SAAS,CAAC,cAAc,EAAE,CAAC,cAAc,EAAE;QACpD;aAAO;AACL,YAAA,OAAO,CAAC,IAAI,CAAC,+LAA+L,CAAC;AAC7M,YAAA,OAAO,IAAI,OAAO,CAAU,OAAO,IAAI,OAAO,CAAC,KAAK,CAAC,CAAC;QACxD;IACJ;+GAZW,qBAAqB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;AAArB,IAAA,SAAA,IAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,qBAAqB,cAFpB,MAAM,EAAA,CAAA,CAAA;;4FAEP,qBAAqB,EAAA,UAAA,EAAA,CAAA;kBAHjC,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE;AACb,iBAAA;;;ACAD;;;;;;;;;;;;;;;AAeI;MASS,yBAAyB,CAAA;AARtC,IAAA,WAAA,GAAA;AASU,QAAA,IAAA,CAAA,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;AACvB,QAAA,IAAA,CAAA,KAAK,GAAG,MAAM,CAAC,cAAc,CAAC;AAC9B,QAAA,IAAA,CAAA,OAAO,GAAG,MAAM,CAAC,UAAU,CAAC;AAE3B,QAAA,IAAA,CAAA,OAAO,GAAG,KAAK,CAA8D,SAAS,8EAAC;AACvF,QAAA,IAAA,CAAA,WAAW,GAAG,KAAK,CAAqB,SAAS,kFAAC;AAiC5D,IAAA;IA/BC,cAAc,GAAA;AACZ,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,EAAE;QAC9B,OAAO,IAAI,OAAO,CAAU,CAAC,OAAO,EAAE,MAAM,KAAI;AAC9C,YAAA,IAAI,OAAO,OAAO,KAAK,WAAW,EAAE;gBAClC,OAAO,CAAC,IAAI,CAAC;YACf;AAAO,iBAAA,IAAI,OAAO,OAAO,KAAK,SAAS,EAAE;gBACvC,OAAO,CAAC,OAAO,CAAC;YAClB;AAAO,iBAAA,IAAI,OAAO,OAAO,KAAK,UAAU,EAAE;AACxC,gBAAA,MAAM,MAAM,GAAG,OAAO,EAAE;gBACxB,OAAO,CAAC,MAAM,CAAC;YACjB;iBAAO;AACL,gBAAA,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,kBAAkB,CAAC,IAAI,CAAC,OAAO,CAAC;qBACnD,SAAS,CAAC,CAAC,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;YAC3C;AACF,QAAA,CAAC,CAAC;IACJ;IAEA,MAAM,cAAc,CAAC,EAAqB,EAAA;AACxC,QAAA,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,cAAc,EAAE;QAC3C,IAAI,CAAC,OAAO,EAAE;YACZ,EAAE,CAAC,cAAc,EAAE;AACnB,YAAA,EAAE,CAAC,WAAW,GAAG,KAAK;AACtB,YAAA,OAAO,eAAe;QACxB;aAAO;AACL,YAAA,OAAO,SAAS;QAClB;IACF;AAEA,IAAA,QAAQ,CAAC,EAAS,EAAA;IAElB;+GAtCW,yBAAyB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;mGAAzB,yBAAyB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,EAAA,OAAA,EAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,WAAA,EAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,UAAA,EAAA,aAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,qBAAA,EAAA,wBAAA,EAAA,eAAA,EAAA,kBAAA,EAAA,EAAA,EAAA,QAAA,EAAA,CAAA,kBAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA,CAAA;;4FAAzB,yBAAyB,EAAA,UAAA,EAAA,CAAA;kBARrC,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,oBAAoB;AAC9B,oBAAA,QAAQ,EAAE,kBAAkB;AAC5B,oBAAA,IAAI,EAAE;AACJ,wBAAA,uBAAuB,EAAE,wBAAwB;AACjD,wBAAA,iBAAiB,EAAE,kBAAkB;AACtC,qBAAA;AACF,iBAAA;;;AC7BD;;AAEG;;;;"}
|
|
1
|
+
{"version":3,"file":"mintplayer-ng-bootstrap-navigation-lock.mjs","sources":["../../../../libs/mintplayer-ng-bootstrap/navigation-lock/src/service/navigation-lock.service.ts","../../../../libs/mintplayer-ng-bootstrap/navigation-lock/src/directive/navigation-lock.directive.ts","../../../../libs/mintplayer-ng-bootstrap/navigation-lock/src/guard/navigation-lock.guard.ts","../../../../libs/mintplayer-ng-bootstrap/navigation-lock/src/providers/navigation-lock.provider.ts","../../../../libs/mintplayer-ng-bootstrap/navigation-lock/mintplayer-ng-bootstrap-navigation-lock.ts"],"sourcesContent":["import { isPlatformBrowser } from '@angular/common';\nimport { DestroyRef, inject, Injectable, InjectionToken, isDevMode, PLATFORM_ID } from '@angular/core';\nimport { ROUTER_CONFIGURATION } from '@angular/router';\nimport { defaultIfEmpty, firstValueFrom, isObservable, Observable, take } from 'rxjs';\nimport { BsNavigationLockHandle } from './navigation-lock-handle';\n\n/** Confirm hook used by the directive's fallback path (canExit undefined + exitMessage set). */\nexport const BS_NAVIGATION_LOCK_CONFIRM = new InjectionToken<\n (message: string) => boolean | Promise<boolean>\n>('BS_NAVIGATION_LOCK_CONFIRM', {\n providedIn: 'root',\n factory: () => (message: string) =>\n typeof window === 'undefined' ? true : window.confirm(message),\n});\n\n@Injectable({ providedIn: 'root' })\nexport class BsNavigationLockService {\n private readonly platformId = inject(PLATFORM_ID);\n private readonly destroy = inject(DestroyRef);\n private readonly locks = new Set<BsNavigationLockHandle>();\n private pending: Promise<boolean> | null = null;\n\n constructor() {\n if (isDevMode()) {\n // canceledNavigationResolution is needed to restore the history stack\n // on popstate-cancel. Default 'replace' loses the popped entry. The\n // value is set via ROUTER_CONFIGURATION (typically through\n // withRouterConfig in provideRouter); read it directly from the token\n // since Router.options is private in the public type.\n const config = inject(ROUTER_CONFIGURATION, { optional: true });\n if (config?.canceledNavigationResolution !== 'computed') {\n console.warn(\n '[BsNavigationLockService] Router.canceledNavigationResolution is not \"computed\". ' +\n 'Pass withRouterConfig({ canceledNavigationResolution: \"computed\" }) to provideRouter ' +\n 'so popstate cancellations restore the history stack correctly.',\n );\n }\n }\n\n if (isPlatformBrowser(this.platformId)) {\n const handler = (ev: BeforeUnloadEvent) => this.onBeforeUnload(ev);\n window.addEventListener('beforeunload', handler);\n this.destroy.onDestroy(() => window.removeEventListener('beforeunload', handler));\n }\n }\n\n /** Internal — called by directive on init. */\n register(lock: BsNavigationLockHandle): void {\n this.locks.add(lock);\n }\n\n /** Internal — called by directive on destroy. */\n unregister(lock: BsNavigationLockHandle): void {\n this.locks.delete(lock);\n }\n\n /**\n * Programmatic check: ask every active lock if exit is OK.\n * Resolves true only when every lock allows exit. Short-circuits on first false.\n *\n * Re-entrant calls while a check is already in flight return the same Promise\n * — only the first `reason` is consulted. This dedups both router-driven\n * fires (e.g. `canMatch` running once) and programmatic call sites that\n * might invoke `requestExit` multiple times in the same tick.\n */\n requestExit(reason?: string): Promise<boolean> {\n if (this.pending) return this.pending;\n this.pending = this.doRequestExit(reason);\n return this.pending;\n }\n\n private async doRequestExit(reason?: string): Promise<boolean> {\n try {\n for (const lock of this.locks) {\n const ok = await this.normalise(lock.requestCanExit(reason));\n if (!ok) return false;\n }\n return true;\n } finally {\n this.pending = null;\n }\n }\n\n private onBeforeUnload(ev: BeforeUnloadEvent): void {\n // PRD §5.4 — sync-first, browser does NOT await async results.\n for (const lock of this.locks) {\n const result = lock.requestCanExit();\n if (typeof result === 'boolean') {\n if (!result) { ev.preventDefault(); ev.returnValue = ''; return; }\n continue;\n }\n // Promise / Observable — safe default: prompt the browser confirm.\n ev.preventDefault();\n ev.returnValue = '';\n return;\n }\n }\n\n private normalise(r: boolean | Promise<boolean> | Observable<boolean>): Promise<boolean> {\n if (typeof r === 'boolean') return Promise.resolve(r);\n if (isObservable(r)) return firstValueFrom(r.pipe(take(1), defaultIfEmpty(true)));\n return r;\n }\n}\n","import { DestroyRef, Directive, inject, input } from '@angular/core';\nimport { Observable } from 'rxjs';\nimport { BS_NAVIGATION_LOCK_CONFIRM, BsNavigationLockService } from '../service/navigation-lock.service';\nimport { BsNavigationLockHandle } from '../service/navigation-lock-handle';\n\n/**\n * Marks the host as a navigation-blocker. Drop `[bsNavigationLock]` on a real\n * element (typically the form). Set `[canExit]` to a boolean, function, or\n * Observable. The service consults every active lock on Router navigation\n * (via `bsNavigationLockGuard` registered at the root) and on `beforeunload`.\n *\n * Fallback: if `canExit` is not set but `exitMessage` is, the directive uses\n * the injected `BS_NAVIGATION_LOCK_CONFIRM` hook with that message.\n */\n@Directive({\n selector: '[bsNavigationLock]',\n exportAs: 'bsNavigationLock',\n})\nexport class BsNavigationLockDirective implements BsNavigationLockHandle {\n private readonly destroy = inject(DestroyRef);\n private readonly service = inject(BsNavigationLockService);\n private readonly confirmFn = inject(BS_NAVIGATION_LOCK_CONFIRM);\n\n readonly canExit = input<\n | boolean\n | ((reason?: string) => boolean | Promise<boolean> | Observable<boolean>)\n | Observable<boolean>\n | undefined\n >(undefined);\n readonly exitMessage = input<string | undefined>(undefined);\n\n constructor() {\n this.service.register(this);\n this.destroy.onDestroy(() => this.service.unregister(this));\n }\n\n requestCanExit(reason?: string): boolean | Promise<boolean> | Observable<boolean> {\n const canExit = this.canExit();\n if (canExit === undefined) {\n const msg = this.exitMessage();\n if (msg) return Promise.resolve(this.confirmFn(msg));\n return true;\n }\n if (typeof canExit === 'boolean') return canExit;\n if (typeof canExit === 'function') return canExit(reason);\n return canExit; // Observable<boolean>\n }\n}\n","import { inject } from '@angular/core';\nimport { CanMatchFn } from '@angular/router';\nimport { BsNavigationLockService } from '../service/navigation-lock.service';\n\n/**\n * Functional `canMatch` guard the consumer registers ONCE at the root route:\n *\n * ```ts\n * { path: '', canMatch: [bsNavigationLockGuard], children: [...] }\n * ```\n *\n * `canMatch` is the right Angular guard for \"should this navigation be allowed\n * to start\": it runs once per route-match attempt, regardless of how deeply\n * nested the destination is. (`canActivateChild` would fire once per descendant\n * activation — N prompts for an N-deep destination.)\n *\n * Note: when `canMatch` returns false the router treats the route as not\n * matching; if a sibling route or wildcard fallback matches the destination URL,\n * the user lands there instead of staying put. Most apps don't have a `**`\n * redirect that conflicts; if yours does, additionally guard the wildcard.\n *\n * Programmatic call sites that need a `reason` argument should call\n * `BsNavigationLockService.requestExit(reason)` directly.\n */\nexport const bsNavigationLockGuard: CanMatchFn = () => {\n return inject(BsNavigationLockService).requestExit();\n};\n","import { EnvironmentProviders, makeEnvironmentProviders } from '@angular/core';\nimport { provideRouter, RouterFeatures, Routes, withRouterConfig } from '@angular/router';\nimport { bsNavigationLockGuard } from '../guard/navigation-lock.guard';\nimport { BS_NAVIGATION_LOCK_CONFIRM } from '../service/navigation-lock.service';\n\nexport interface NavigationLockOptions {\n confirm?: (message: string) => boolean | Promise<boolean>;\n}\n\n/**\n * Optional provider. Without it, the service is still root-provided and\n * uses `window.confirm` as the default fallback confirm UI.\n */\nexport function provideNavigationLock(opts?: NavigationLockOptions): EnvironmentProviders {\n return makeEnvironmentProviders([\n ...(opts?.confirm\n ? [{ provide: BS_NAVIGATION_LOCK_CONFIRM, useValue: opts.confirm }]\n : []),\n ]);\n}\n\n/**\n * One-call router setup for navigation-lock. Wraps `routes` in a root\n * `{ path: '', canMatch: [bsNavigationLockGuard], children }` entry and\n * applies `canceledNavigationResolution: 'computed'` (required for\n * popstate-cancel to restore the history stack). Pass any additional router\n * features (`withPreloading`, `withInMemoryScrolling`, …) as extra arguments.\n *\n * If you also pass your own `withRouterConfig`, make sure it includes\n * `canceledNavigationResolution: 'computed'` — the dev-mode warning from\n * `BsNavigationLockService` will fire otherwise.\n */\nexport function provideNavigationLockRouter(\n routes: Routes,\n ...features: RouterFeatures[]\n): EnvironmentProviders {\n return provideRouter(\n [{ path: '', canMatch: [bsNavigationLockGuard], children: routes }],\n withRouterConfig({ canceledNavigationResolution: 'computed' }),\n ...features,\n );\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -107,6 +107,33 @@ declare class BsNavbarContentDirective implements AfterViewInit, OnDestroy {
|
|
|
107
107
|
static ɵdir: _angular_core.ɵɵDirectiveDeclaration<BsNavbarContentDirective, "[bsNavbarContent]", never, { "navbar": { "alias": "bsNavbarContent"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
|
|
108
108
|
}
|
|
109
109
|
|
|
110
|
+
/**
|
|
111
|
+
* Marks a navbar dropdown trigger anchor. Replaces both `routerLink` and
|
|
112
|
+
* `routerLinkActive` on a trigger element: toggles the active CSS class when a
|
|
113
|
+
* sub-route under the bound URL is active, but does NOT navigate on click
|
|
114
|
+
* (which `routerLink` would do via its own host listener, even when other
|
|
115
|
+
* click handlers `preventDefault`).
|
|
116
|
+
*
|
|
117
|
+
* @example
|
|
118
|
+
* ```html
|
|
119
|
+
* <a bsNavbarTrigger="/overlays">Overlays</a>
|
|
120
|
+
* ```
|
|
121
|
+
*
|
|
122
|
+
* Items inside the dropdown panel still use real `[routerLink]`s for
|
|
123
|
+
* navigation. Use this directive only for the trigger anchor that opens the
|
|
124
|
+
* dropdown panel.
|
|
125
|
+
*/
|
|
126
|
+
declare class BsNavbarTriggerDirective {
|
|
127
|
+
private router;
|
|
128
|
+
readonly bsNavbarTrigger: _angular_core.InputSignal<string | readonly string[]>;
|
|
129
|
+
private currentUrl;
|
|
130
|
+
private targetUrl;
|
|
131
|
+
readonly isActive: _angular_core.Signal<boolean>;
|
|
132
|
+
constructor();
|
|
133
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<BsNavbarTriggerDirective, never>;
|
|
134
|
+
static ɵdir: _angular_core.ɵɵDirectiveDeclaration<BsNavbarTriggerDirective, "[bsNavbarTrigger]", never, { "bsNavbarTrigger": { "alias": "bsNavbarTrigger"; "required": true; "isSignal": true; }; }, {}, never, never, true, never>;
|
|
135
|
+
}
|
|
136
|
+
|
|
110
137
|
declare class BsExpandButtonDirective {
|
|
111
138
|
constructor();
|
|
112
139
|
static ngTemplateContextGuard(dir: BsExpandButtonDirective, ctx: any): ctx is BsExpandButtonContext;
|
|
@@ -135,4 +162,4 @@ declare class NavLinkDirective {
|
|
|
135
162
|
static ɵdir: _angular_core.ɵɵDirectiveDeclaration<NavLinkDirective, "bs-navbar-item > li > a", never, {}, {}, never, never, true, never>;
|
|
136
163
|
}
|
|
137
164
|
|
|
138
|
-
export { BsExpandButtonContext, BsExpandButtonDirective, BsNavbarBrandComponent, BsNavbarComponent, BsNavbarContentDirective, BsNavbarDropdownComponent, BsNavbarItemComponent, BsNavbarNavComponent, DropdownToggleDirective, NavLinkDirective };
|
|
165
|
+
export { BsExpandButtonContext, BsExpandButtonDirective, BsNavbarBrandComponent, BsNavbarComponent, BsNavbarContentDirective, BsNavbarDropdownComponent, BsNavbarItemComponent, BsNavbarNavComponent, BsNavbarTriggerDirective, DropdownToggleDirective, NavLinkDirective };
|
|
@@ -1,57 +1,117 @@
|
|
|
1
|
-
import { ActivatedRouteSnapshot, RouterStateSnapshot, UrlTree } from '@angular/router';
|
|
2
1
|
import * as i0 from '@angular/core';
|
|
3
|
-
import {
|
|
2
|
+
import { InjectionToken, EnvironmentProviders } from '@angular/core';
|
|
4
3
|
import { Observable } from 'rxjs';
|
|
4
|
+
import { CanMatchFn, Routes, RouterFeatures } from '@angular/router';
|
|
5
5
|
|
|
6
6
|
/**
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
7
|
+
* Contract a navigation lock implements so the service can consult it.
|
|
8
|
+
* Implemented by `BsNavigationLockDirective`; consumers may also register
|
|
9
|
+
* arbitrary handles via `BsNavigationLockService.register(...)`.
|
|
10
|
+
*/
|
|
11
|
+
interface BsNavigationLockHandle {
|
|
12
|
+
/**
|
|
13
|
+
* Returns whether this lock allows exit. May be sync, Promise, or Observable.
|
|
14
|
+
* `reason` is forwarded from `BsNavigationLockService.requestExit(reason)` for
|
|
15
|
+
* programmatic call sites (e.g. `'logout'`); the functional CanActivateChild
|
|
16
|
+
* guard passes `undefined`.
|
|
17
|
+
*/
|
|
18
|
+
requestCanExit(reason?: string): boolean | Promise<boolean> | Observable<boolean>;
|
|
19
|
+
/** Optional message shown in the fallback confirm dialog when no `canExit` is set. */
|
|
20
|
+
exitMessage(): string | undefined;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* Marks the host as a navigation-blocker. Drop `[bsNavigationLock]` on a real
|
|
25
|
+
* element (typically the form). Set `[canExit]` to a boolean, function, or
|
|
26
|
+
* Observable. The service consults every active lock on Router navigation
|
|
27
|
+
* (via `bsNavigationLockGuard` registered at the root) and on `beforeunload`.
|
|
20
28
|
*
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
private destroy;
|
|
26
|
-
readonly
|
|
29
|
+
* Fallback: if `canExit` is not set but `exitMessage` is, the directive uses
|
|
30
|
+
* the injected `BS_NAVIGATION_LOCK_CONFIRM` hook with that message.
|
|
31
|
+
*/
|
|
32
|
+
declare class BsNavigationLockDirective implements BsNavigationLockHandle {
|
|
33
|
+
private readonly destroy;
|
|
34
|
+
private readonly service;
|
|
35
|
+
private readonly confirmFn;
|
|
36
|
+
readonly canExit: i0.InputSignal<boolean | Observable<boolean> | ((reason?: string) => boolean | Promise<boolean> | Observable<boolean>) | undefined>;
|
|
27
37
|
readonly exitMessage: i0.InputSignal<string | undefined>;
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
onUnload(ev: Event): void;
|
|
38
|
+
constructor();
|
|
39
|
+
requestCanExit(reason?: string): boolean | Promise<boolean> | Observable<boolean>;
|
|
31
40
|
static ɵfac: i0.ɵɵFactoryDeclaration<BsNavigationLockDirective, never>;
|
|
32
41
|
static ɵdir: i0.ɵɵDirectiveDeclaration<BsNavigationLockDirective, "[bsNavigationLock]", ["bsNavigationLock"], { "canExit": { "alias": "canExit"; "required": false; "isSignal": true; }; "exitMessage": { "alias": "exitMessage"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
|
|
33
42
|
}
|
|
34
43
|
|
|
35
44
|
/**
|
|
36
|
-
*
|
|
37
|
-
*
|
|
38
|
-
* @example
|
|
45
|
+
* Functional `canMatch` guard the consumer registers ONCE at the root route:
|
|
39
46
|
*
|
|
40
47
|
* ```ts
|
|
41
|
-
*
|
|
48
|
+
* { path: '', canMatch: [bsNavigationLockGuard], children: [...] }
|
|
42
49
|
* ```
|
|
43
50
|
*
|
|
44
|
-
*
|
|
51
|
+
* `canMatch` is the right Angular guard for "should this navigation be allowed
|
|
52
|
+
* to start": it runs once per route-match attempt, regardless of how deeply
|
|
53
|
+
* nested the destination is. (`canActivateChild` would fire once per descendant
|
|
54
|
+
* activation — N prompts for an N-deep destination.)
|
|
55
|
+
*
|
|
56
|
+
* Note: when `canMatch` returns false the router treats the route as not
|
|
57
|
+
* matching; if a sibling route or wildcard fallback matches the destination URL,
|
|
58
|
+
* the user lands there instead of staying put. Most apps don't have a `**`
|
|
59
|
+
* redirect that conflicts; if yours does, additionally guard the wildcard.
|
|
60
|
+
*
|
|
61
|
+
* Programmatic call sites that need a `reason` argument should call
|
|
62
|
+
* `BsNavigationLockService.requestExit(reason)` directly.
|
|
45
63
|
*/
|
|
46
|
-
|
|
47
|
-
|
|
64
|
+
declare const bsNavigationLockGuard: CanMatchFn;
|
|
65
|
+
|
|
66
|
+
/** Confirm hook used by the directive's fallback path (canExit undefined + exitMessage set). */
|
|
67
|
+
declare const BS_NAVIGATION_LOCK_CONFIRM: InjectionToken<(message: string) => boolean | Promise<boolean>>;
|
|
68
|
+
declare class BsNavigationLockService {
|
|
69
|
+
private readonly platformId;
|
|
70
|
+
private readonly destroy;
|
|
71
|
+
private readonly locks;
|
|
72
|
+
private pending;
|
|
73
|
+
constructor();
|
|
74
|
+
/** Internal — called by directive on init. */
|
|
75
|
+
register(lock: BsNavigationLockHandle): void;
|
|
76
|
+
/** Internal — called by directive on destroy. */
|
|
77
|
+
unregister(lock: BsNavigationLockHandle): void;
|
|
78
|
+
/**
|
|
79
|
+
* Programmatic check: ask every active lock if exit is OK.
|
|
80
|
+
* Resolves true only when every lock allows exit. Short-circuits on first false.
|
|
81
|
+
*
|
|
82
|
+
* Re-entrant calls while a check is already in flight return the same Promise
|
|
83
|
+
* — only the first `reason` is consulted. This dedups both router-driven
|
|
84
|
+
* fires (e.g. `canMatch` running once) and programmatic call sites that
|
|
85
|
+
* might invoke `requestExit` multiple times in the same tick.
|
|
86
|
+
*/
|
|
87
|
+
requestExit(reason?: string): Promise<boolean>;
|
|
88
|
+
private doRequestExit;
|
|
89
|
+
private onBeforeUnload;
|
|
90
|
+
private normalise;
|
|
91
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<BsNavigationLockService, never>;
|
|
92
|
+
static ɵprov: i0.ɵɵInjectableDeclaration<BsNavigationLockService>;
|
|
48
93
|
}
|
|
49
94
|
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
static ɵfac: i0.ɵɵFactoryDeclaration<BsNavigationLockGuard, never>;
|
|
53
|
-
static ɵprov: i0.ɵɵInjectableDeclaration<BsNavigationLockGuard>;
|
|
95
|
+
interface NavigationLockOptions {
|
|
96
|
+
confirm?: (message: string) => boolean | Promise<boolean>;
|
|
54
97
|
}
|
|
98
|
+
/**
|
|
99
|
+
* Optional provider. Without it, the service is still root-provided and
|
|
100
|
+
* uses `window.confirm` as the default fallback confirm UI.
|
|
101
|
+
*/
|
|
102
|
+
declare function provideNavigationLock(opts?: NavigationLockOptions): EnvironmentProviders;
|
|
103
|
+
/**
|
|
104
|
+
* One-call router setup for navigation-lock. Wraps `routes` in a root
|
|
105
|
+
* `{ path: '', canMatch: [bsNavigationLockGuard], children }` entry and
|
|
106
|
+
* applies `canceledNavigationResolution: 'computed'` (required for
|
|
107
|
+
* popstate-cancel to restore the history stack). Pass any additional router
|
|
108
|
+
* features (`withPreloading`, `withInMemoryScrolling`, …) as extra arguments.
|
|
109
|
+
*
|
|
110
|
+
* If you also pass your own `withRouterConfig`, make sure it includes
|
|
111
|
+
* `canceledNavigationResolution: 'computed'` — the dev-mode warning from
|
|
112
|
+
* `BsNavigationLockService` will fire otherwise.
|
|
113
|
+
*/
|
|
114
|
+
declare function provideNavigationLockRouter(routes: Routes, ...features: RouterFeatures[]): EnvironmentProviders;
|
|
55
115
|
|
|
56
|
-
export { BsNavigationLockDirective,
|
|
57
|
-
export type {
|
|
116
|
+
export { BS_NAVIGATION_LOCK_CONFIRM, BsNavigationLockDirective, BsNavigationLockService, bsNavigationLockGuard, provideNavigationLock, provideNavigationLockRouter };
|
|
117
|
+
export type { BsNavigationLockHandle, NavigationLockOptions };
|