@mintplayer/ng-bootstrap 21.23.1 → 21.25.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-dock.mjs +198 -6
- package/fesm2022/mintplayer-ng-bootstrap-dock.mjs.map +1 -1
- 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-dock.d.ts +31 -5
- package/types/mintplayer-ng-bootstrap-navbar.d.ts +28 -1
- package/types/mintplayer-ng-bootstrap-navigation-lock.d.ts +97 -37
|
@@ -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":"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"}
|
|
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":";;;;;;AAMA;MACa,0BAA0B,GAAG,IAAI,cAAc,CAE1D,4BAA4B,EAAE;AAC9B,IAAA,UAAU,EAAE,MAAM;IAClB,OAAO,EAAE,MAAM,CAAC,OAAe,KAC7B,OAAO,MAAM,KAAK,WAAW,GAAG,IAAI,GAAG,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC;AACjE,CAAA;MAGY,uBAAuB,CAAA;AAMlC,IAAA,WAAA,GAAA;AALiB,QAAA,IAAA,CAAA,UAAU,GAAG,MAAM,CAAC,WAAW,CAAC;AAChC,QAAA,IAAA,CAAA,OAAO,GAAG,MAAM,CAAC,UAAU,CAAC;AAC5B,QAAA,IAAA,CAAA,KAAK,GAAG,IAAI,GAAG,EAA0B;QAClD,IAAA,CAAA,OAAO,GAA4B,IAAI;QAG7C,IAAI,SAAS,EAAE,EAAE;;;;;;AAMf,YAAA,MAAM,MAAM,GAAG,MAAM,CAAC,oBAAoB,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;AAC/D,YAAA,IAAI,MAAM,EAAE,4BAA4B,KAAK,UAAU,EAAE;gBACvD,OAAO,CAAC,IAAI,CACV,mFAAmF;oBACnF,uFAAuF;AACvF,oBAAA,gEAAgE,CACjE;YACH;QACF;AAEA,QAAA,IAAI,iBAAiB,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE;AACtC,YAAA,MAAM,OAAO,GAAG,CAAC,EAAqB,KAAK,IAAI,CAAC,cAAc,CAAC,EAAE,CAAC;AAClE,YAAA,MAAM,CAAC,gBAAgB,CAAC,cAAc,EAAE,OAAO,CAAC;AAChD,YAAA,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,MAAM,MAAM,CAAC,mBAAmB,CAAC,cAAc,EAAE,OAAO,CAAC,CAAC;QACnF;IACF;;AAGA,IAAA,QAAQ,CAAC,IAA4B,EAAA;AACnC,QAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC;IACtB;;AAGA,IAAA,UAAU,CAAC,IAA4B,EAAA;AACrC,QAAA,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC;IACzB;AAEA;;;;;;;;AAQG;AACH,IAAA,WAAW,CAAC,MAAe,EAAA;QACzB,IAAI,IAAI,CAAC,OAAO;YAAE,OAAO,IAAI,CAAC,OAAO;QACrC,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC;QACzC,OAAO,IAAI,CAAC,OAAO;IACrB;IAEQ,MAAM,aAAa,CAAC,MAAe,EAAA;AACzC,QAAA,IAAI;AACF,YAAA,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,EAAE;AAC7B,gBAAA,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;AAC5D,gBAAA,IAAI,CAAC,EAAE;AAAE,oBAAA,OAAO,KAAK;YACvB;AACA,YAAA,OAAO,IAAI;QACb;gBAAU;AACR,YAAA,IAAI,CAAC,OAAO,GAAG,IAAI;QACrB;IACF;AAEQ,IAAA,cAAc,CAAC,EAAqB,EAAA;;AAE1C,QAAA,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,EAAE;AAC7B,YAAA,MAAM,MAAM,GAAG,IAAI,CAAC,cAAc,EAAE;AACpC,YAAA,IAAI,OAAO,MAAM,KAAK,SAAS,EAAE;gBAC/B,IAAI,CAAC,MAAM,EAAE;oBAAE,EAAE,CAAC,cAAc,EAAE;AAAE,oBAAA,EAAE,CAAC,WAAW,GAAG,EAAE;oBAAE;gBAAQ;gBACjE;YACF;;YAEA,EAAE,CAAC,cAAc,EAAE;AACnB,YAAA,EAAE,CAAC,WAAW,GAAG,EAAE;YACnB;QACF;IACF;AAEQ,IAAA,SAAS,CAAC,CAAmD,EAAA;QACnE,IAAI,OAAO,CAAC,KAAK,SAAS;AAAE,YAAA,OAAO,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC;QACrD,IAAI,YAAY,CAAC,CAAC,CAAC;AAAE,YAAA,OAAO,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC;AACjF,QAAA,OAAO,CAAC;IACV;+GAtFW,uBAAuB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;AAAvB,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,uBAAuB,cADV,MAAM,EAAA,CAAA,CAAA;;4FACnB,uBAAuB,EAAA,UAAA,EAAA,CAAA;kBADnC,UAAU;mBAAC,EAAE,UAAU,EAAE,MAAM,EAAE;;;ACVlC;;;;;;;;AAQG;MAKU,yBAAyB,CAAA;AAapC,IAAA,WAAA,GAAA;AAZiB,QAAA,IAAA,CAAA,OAAO,GAAG,MAAM,CAAC,UAAU,CAAC;AAC5B,QAAA,IAAA,CAAA,OAAO,GAAG,MAAM,CAAC,uBAAuB,CAAC;AACzC,QAAA,IAAA,CAAA,SAAS,GAAG,MAAM,CAAC,0BAA0B,CAAC;AAEtD,QAAA,IAAA,CAAA,OAAO,GAAG,KAAK,CAKtB,SAAS,8EAAC;AACH,QAAA,IAAA,CAAA,WAAW,GAAG,KAAK,CAAqB,SAAS,kFAAC;AAGzD,QAAA,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC;AAC3B,QAAA,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;IAC7D;AAEA,IAAA,cAAc,CAAC,MAAe,EAAA;AAC5B,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,EAAE;AAC9B,QAAA,IAAI,OAAO,KAAK,SAAS,EAAE;AACzB,YAAA,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,EAAE;AAC9B,YAAA,IAAI,GAAG;gBAAE,OAAO,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;AACpD,YAAA,OAAO,IAAI;QACb;QACA,IAAI,OAAO,OAAO,KAAK,SAAS;AAAE,YAAA,OAAO,OAAO;QAChD,IAAI,OAAO,OAAO,KAAK,UAAU;AAAE,YAAA,OAAO,OAAO,CAAC,MAAM,CAAC;QACzD,OAAO,OAAO,CAAC;IACjB;+GA5BW,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,QAAA,EAAA,CAAA,kBAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA,CAAA;;4FAAzB,yBAAyB,EAAA,UAAA,EAAA,CAAA;kBAJrC,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,oBAAoB;AAC9B,oBAAA,QAAQ,EAAE,kBAAkB;AAC7B,iBAAA;;;ACbD;;;;;;;;;;;;;;;;;;;AAmBG;AACI,MAAM,qBAAqB,GAAe,MAAK;AACpD,IAAA,OAAO,MAAM,CAAC,uBAAuB,CAAC,CAAC,WAAW,EAAE;AACtD;;ACjBA;;;AAGG;AACG,SAAU,qBAAqB,CAAC,IAA4B,EAAA;AAChE,IAAA,OAAO,wBAAwB,CAAC;QAC9B,IAAI,IAAI,EAAE;AACR,cAAE,CAAC,EAAE,OAAO,EAAE,0BAA0B,EAAE,QAAQ,EAAE,IAAI,CAAC,OAAO,EAAE;cAChE,EAAE,CAAC;AACR,KAAA,CAAC;AACJ;AAEA;;;;;;;;;;AAUG;SACa,2BAA2B,CACzC,MAAc,EACd,GAAG,QAA0B,EAAA;AAE7B,IAAA,OAAO,aAAa,CAClB,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,QAAQ,EAAE,CAAC,qBAAqB,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,EACnE,gBAAgB,CAAC,EAAE,4BAA4B,EAAE,UAAU,EAAE,CAAC,EAC9D,GAAG,QAAQ,CACZ;AACH;;ACzCA;;AAEG;;;;"}
|
package/package.json
CHANGED
|
@@ -84,6 +84,9 @@ declare class MintDockManagerElement extends LitElement {
|
|
|
84
84
|
static configureDocument(documentRef: Document | null | undefined): void;
|
|
85
85
|
static get observedAttributes(): string[];
|
|
86
86
|
private static instanceCounter;
|
|
87
|
+
private static readonly TOUCH_LONG_PRESS_MS;
|
|
88
|
+
private static readonly TOUCH_LONG_PRESS_SLOP_PX;
|
|
89
|
+
private static readonly TOUCH_PRESS_FEEDBACK_DELAY_MS;
|
|
87
90
|
private documentRef;
|
|
88
91
|
private windowRef;
|
|
89
92
|
private rootEl;
|
|
@@ -199,13 +202,36 @@ declare class MintDockManagerElement extends LitElement {
|
|
|
199
202
|
private captureTabDragMetrics;
|
|
200
203
|
private clearPendingTabDragMetrics;
|
|
201
204
|
/**
|
|
202
|
-
* Pointerdown handler arms a "may become a drag" gesture.
|
|
203
|
-
*
|
|
204
|
-
* {@link
|
|
205
|
-
*
|
|
206
|
-
*
|
|
205
|
+
* Pointerdown handler arms a "may become a drag" gesture. Mouse / pen use a
|
|
206
|
+
* 5 px distance threshold and arm immediately; touch dispatches to
|
|
207
|
+
* {@link armPaneDragGestureTouch} which requires a 600 ms stationary hold
|
|
208
|
+
* (so the user can scroll the tabstrip natively without undocking).
|
|
209
|
+
* Once armed, both paths converge on {@link beginPaneDrag}. All listeners
|
|
210
|
+
* self-clean on resolve so the gesture stays scoped to a single pointerdown.
|
|
207
211
|
*/
|
|
208
212
|
private armPaneDragGesture;
|
|
213
|
+
/**
|
|
214
|
+
* Touch-specific gesture arming. With `.dock-tab` set to `touch-action:
|
|
215
|
+
* none`, the browser never arbitrates the gesture itself, so JS owns it
|
|
216
|
+
* from frame 1. Three outcomes from the pending state:
|
|
217
|
+
*
|
|
218
|
+
* - User holds within {@link TOUCH_LONG_PRESS_SLOP_PX} for
|
|
219
|
+
* {@link TOUCH_LONG_PRESS_MS} → timer fires → drag arms via
|
|
220
|
+
* {@link beginPaneDrag}.
|
|
221
|
+
* - User moves past slop and the move is mostly horizontal, and the
|
|
222
|
+
* strip's `<ul>` is scrollable → enter `scrolling` mode and drive
|
|
223
|
+
* `ul.scrollLeft` from JS for the rest of the gesture (no drag, no
|
|
224
|
+
* momentum — direct 1:1 finger follow).
|
|
225
|
+
* - User moves past slop in any other direction, releases, or
|
|
226
|
+
* pointercancel fires → abandoned, no drag, no scroll. Releases
|
|
227
|
+
* under slop fire the synthesized click that drives `tab-activate`.
|
|
228
|
+
*
|
|
229
|
+
* `touch-action: pan-x` was the original PRD design but doesn't work:
|
|
230
|
+
* the policy is frozen at touchstart and `setPointerCapture` doesn't
|
|
231
|
+
* promote it, so first move after a long-press fires pointercancel and
|
|
232
|
+
* strands the panel. JS-driven scroll is the only model that holds.
|
|
233
|
+
*/
|
|
234
|
+
private armPaneDragGestureTouch;
|
|
209
235
|
private beginPaneDrag;
|
|
210
236
|
private preparePaneDragSource;
|
|
211
237
|
private endPaneDrag;
|
|
@@ -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 };
|