@ngrdt/router 0.0.99 → 0.1.1
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/ngrdt-router.mjs +1 -1465
- package/package.json +4 -4
- package/types/ngrdt-router.d.ts +3 -3
- package/README.md +0 -255
- package/fesm2022/ngrdt-router.mjs.map +0 -1
package/package.json
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ngrdt/router",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.1.1",
|
|
4
4
|
"peerDependencies": {
|
|
5
5
|
"@angular/common": ">=21.0.0",
|
|
6
6
|
"@angular/core": ">=21.0.0",
|
|
7
7
|
"@angular/router": ">=21.0.0",
|
|
8
8
|
"rxjs": ">=7.0.0",
|
|
9
|
-
"@ngrdt/utils": "^0.
|
|
10
|
-
"@ngrdt/core": "^0.
|
|
11
|
-
"@ngrdt/button": "^0.
|
|
9
|
+
"@ngrdt/utils": "^0.1.1",
|
|
10
|
+
"@ngrdt/core": "^0.1.1",
|
|
11
|
+
"@ngrdt/button": "^0.1.1"
|
|
12
12
|
},
|
|
13
13
|
"sideEffects": false,
|
|
14
14
|
"module": "fesm2022/ngrdt-router.mjs",
|
package/types/ngrdt-router.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import * as i0 from '@angular/core';
|
|
2
2
|
import { Provider, EnvironmentProviders, Type, Injector, InjectionToken, OnInit, OnChanges, SimpleChanges, DestroyRef } from '@angular/core';
|
|
3
3
|
import * as i1 from '@angular/router';
|
|
4
|
-
import { LoadChildrenCallback, Route, ResolveFn, CanActivateFn, CanDeactivateFn, CanActivateChildFn, RunGuardsAndResolvers, Data, Params, NavigationEnd, IsActiveMatchOptions
|
|
4
|
+
import { LoadChildrenCallback, Route, ResolveFn, CanActivateFn, CanDeactivateFn, CanActivateChildFn, RunGuardsAndResolvers, Data, Params, NavigationEnd, IsActiveMatchOptions } from '@angular/router';
|
|
5
5
|
import * as _ngrdt_router from '@ngrdt/router';
|
|
6
6
|
import { Observable } from 'rxjs';
|
|
7
7
|
import { RdtGuardedContainer } from '@ngrdt/core';
|
|
@@ -412,6 +412,7 @@ declare class RdtRouterService {
|
|
|
412
412
|
readonly baseHref: string;
|
|
413
413
|
private readonly location;
|
|
414
414
|
private readonly router;
|
|
415
|
+
private readonly viewStateService;
|
|
415
416
|
private _previousUrl;
|
|
416
417
|
private _currentUrl;
|
|
417
418
|
get previousUrl(): string | null;
|
|
@@ -567,8 +568,7 @@ declare class RdtRouterLinkDirective<T extends object> {
|
|
|
567
568
|
* before the guard potentially rejects it.
|
|
568
569
|
*/
|
|
569
570
|
declare class GlobalRouteGuardService {
|
|
570
|
-
private router;
|
|
571
|
-
constructor(router: Router);
|
|
571
|
+
private readonly router;
|
|
572
572
|
ensureGlobalGuards(): void;
|
|
573
573
|
private ensureCanDeactivateGuards;
|
|
574
574
|
static ɵfac: i0.ɵɵFactoryDeclaration<GlobalRouteGuardService, never>;
|
package/README.md
DELETED
|
@@ -1,255 +0,0 @@
|
|
|
1
|
-
# @ngrdt/router
|
|
2
|
-
|
|
3
|
-
Main use for this package is to define routes and their parameters in one place in app. It is recommended to define special `routes` module in every app using `@ngrdt/router` where all `RdtRoute` objects are defined using `RdtRouteBuilder`. Individual application modules then import these objects, define Angular routes and provide implementation details such as which component is rendered, state, guards, etc.
|
|
4
|
-
|
|
5
|
-
This approach ensures that each route is defined exactly once and can be easily edited if necessary. `@ngrdt/router` also provides set of useful tools to help you with common routing tasks.
|
|
6
|
-
|
|
7
|
-
### Instalation
|
|
8
|
-
|
|
9
|
-
`npm install @ngrdt/router`
|
|
10
|
-
|
|
11
|
-
## Basic usage
|
|
12
|
-
|
|
13
|
-
### Application routes file
|
|
14
|
-
|
|
15
|
-
Create special `nx` library (not `NgModule`) for instance `@example-app/routes`. In this library you will create file called `routes.ts` and in it individual `RdtRoute` objects like so:
|
|
16
|
-
|
|
17
|
-
```typescript
|
|
18
|
-
export const DASHBOARD_ITEM_ROUTE = new RdtRouteBuilder()
|
|
19
|
-
.setName('Dashboard item')
|
|
20
|
-
.setPath(':id')
|
|
21
|
-
.setParam('id', 'number')
|
|
22
|
-
.build();
|
|
23
|
-
|
|
24
|
-
export const DASHBOARD_ROUTE = new RdtRouteBuilder()
|
|
25
|
-
.setName('Dashboard')
|
|
26
|
-
.setPath('dashboard')
|
|
27
|
-
.setChildren(DASHBOARD_ITEM_ROUTE)
|
|
28
|
-
.build();
|
|
29
|
-
|
|
30
|
-
export const SETTINGS_ROUTE = new RdtRouteBuilder()
|
|
31
|
-
.setName('Settings')
|
|
32
|
-
.setPath('settings')
|
|
33
|
-
.setCanBeEntered(() =>
|
|
34
|
-
inject(ExampleAppPermissionService).hasPermission('SETTINGS_ACCESS')
|
|
35
|
-
)
|
|
36
|
-
.build();
|
|
37
|
-
```
|
|
38
|
-
|
|
39
|
-
This file should only contain imports to interfaces used by `RdtRouteBuilder` as template parameter. No component, ngModule or guards such as `CanActivateFn` should be imported here. This approach will save you later headache with circular dependency.
|
|
40
|
-
|
|
41
|
-
`RdtRouterService` needs to be aware of all routes defined therefore you must provide it in your `ApplicationConfig` like so:
|
|
42
|
-
|
|
43
|
-
```typescript
|
|
44
|
-
import { RDT_ROUTES_PROVIDER, RdtRoute } from '@ngrdt/router';
|
|
45
|
-
import * as ALL_ROUTES_OBJ from './rdt-routes';
|
|
46
|
-
const ALL_ROUTES = Object.values(ALL_ROUTES_OBJ) as RdtRoute[];
|
|
47
|
-
|
|
48
|
-
export const appConfig: ApplicationConfig = {
|
|
49
|
-
providers: [
|
|
50
|
-
{
|
|
51
|
-
provide: RDT_ROUTES_PROVIDER,
|
|
52
|
-
useValue: ALL_ROUTES,
|
|
53
|
-
},
|
|
54
|
-
]
|
|
55
|
-
}
|
|
56
|
-
```
|
|
57
|
-
|
|
58
|
-
### Angular routes files
|
|
59
|
-
|
|
60
|
-
Now you have to bind `RdtRoute` objects to individual modules, components, states, effects, guards and other implementation details. Instead of defining routes directly you import `RdtRoute` from `@example-app/routes` and then define `routes.ts` like so:
|
|
61
|
-
|
|
62
|
-
```typescript
|
|
63
|
-
export const routes: Route[] = [
|
|
64
|
-
DASHBOARD_ROUTE.toAngularRoute()
|
|
65
|
-
.setComponent(DashboardComponent)
|
|
66
|
-
.setChildren(
|
|
67
|
-
DASHBOARD_ITEM_ROUTE.toAngularRoute()
|
|
68
|
-
.setComponent(DashboardItemComponent)
|
|
69
|
-
.addCanDeactivate(preventDataLossGuardFn)
|
|
70
|
-
.build()
|
|
71
|
-
)
|
|
72
|
-
.build(),
|
|
73
|
-
]
|
|
74
|
-
```
|
|
75
|
-
|
|
76
|
-
This array is then used as in regular Angular project. Note that child routes must be added as children here as well.
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
### Child routes and parameters
|
|
80
|
-
|
|
81
|
-
You may nest child routes and also create routes with typed parameters to link them with particular type.
|
|
82
|
-
|
|
83
|
-
For instance lets say there's a route displaying users which has a child route to display more information about a single user. By providing `User` type to `RdtRouteBuilder` and defining types of parameters we can use `RdtRoute` object to parse path to extract parameters.
|
|
84
|
-
|
|
85
|
-
```typescript
|
|
86
|
-
interface User {
|
|
87
|
-
userId: number;
|
|
88
|
-
name: string;
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
export const USER_DETAIL_ROUTE = new RdtRouteBuilder<User>()
|
|
92
|
-
.setName('User detail')
|
|
93
|
-
.setPath(':userId/:name')
|
|
94
|
-
.setParam('userId', 'number')
|
|
95
|
-
.setParam('name', 'string')
|
|
96
|
-
.build();
|
|
97
|
-
|
|
98
|
-
export const USER_LIST_ROUTE = new RdtRouteBuilder()
|
|
99
|
-
.setName('Users')
|
|
100
|
-
.setPath('users')
|
|
101
|
-
.setChildren(USER_DETAIL_ROUTE)
|
|
102
|
-
.build();
|
|
103
|
-
```
|
|
104
|
-
|
|
105
|
-
Then we navigate to user detail like so:
|
|
106
|
-
|
|
107
|
-
```typescript
|
|
108
|
-
const params: Partial<User> = {
|
|
109
|
-
userId: 123,
|
|
110
|
-
name: 'Josef',
|
|
111
|
-
};
|
|
112
|
-
|
|
113
|
-
inject(RdtRouterService).navigate(USER_DETAIL_ROUTE, params);
|
|
114
|
-
```
|
|
115
|
-
|
|
116
|
-
`RdtRouterService` is aware of the type so you can use it to parse absolute path into `User` object. Route knows `userId` is `number` so it will parse it. If parameter is missing or is of wrong type, then `parseAbsoluteUrl` returns `null`. Return value is a wrapper object with `get(route: RdtRoute)` method to get parsed parameters of given route or its parents.
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
```typescript
|
|
120
|
-
const user: User = USER_DETAIL_ROUTE
|
|
121
|
-
.parse('/users/123/Josef')
|
|
122
|
-
.get(USER_DETAIL_ROUTE);
|
|
123
|
-
```
|
|
124
|
-
|
|
125
|
-
### More parameter examples
|
|
126
|
-
|
|
127
|
-
#### Static parameters
|
|
128
|
-
|
|
129
|
-
Imagine your app contains list of users and each user has set of tasks. The routes are defined as follows:
|
|
130
|
-
|
|
131
|
-
```typescript
|
|
132
|
-
interface User {
|
|
133
|
-
userId: number,
|
|
134
|
-
name: string,
|
|
135
|
-
address: string,
|
|
136
|
-
tasks: Task[]
|
|
137
|
-
}
|
|
138
|
-
|
|
139
|
-
interface Task {
|
|
140
|
-
taskId: number,
|
|
141
|
-
description: string
|
|
142
|
-
}
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
export const TASK_DETAIL_ROUTE = new RdtRouteBuilder<Task>()
|
|
146
|
-
.setName('Task detail')
|
|
147
|
-
.setPath('task/:taskId')
|
|
148
|
-
.setParam('taskId', 'number')
|
|
149
|
-
.build();
|
|
150
|
-
|
|
151
|
-
export const USER_DETAIL_ROUTE = new RdtRouteBuilder<User>()
|
|
152
|
-
.setName('User detail')
|
|
153
|
-
.setPath(':userId')
|
|
154
|
-
.setParam('userId', 'number')
|
|
155
|
-
.setChildren(TASK_DETAIL_ROUTE)
|
|
156
|
-
.build();
|
|
157
|
-
|
|
158
|
-
export const USER_LIST_ROUTE = new RdtRouteBuilder()
|
|
159
|
-
.setName('Users')
|
|
160
|
-
.setPath('user')
|
|
161
|
-
.setChildren(USER_DETAIL_ROUTE)
|
|
162
|
-
.build();
|
|
163
|
-
```
|
|
164
|
-
|
|
165
|
-
This translates into path `/user/:userId/task/:taskId` for task detail route.
|
|
166
|
-
|
|
167
|
-
Now inside `UserDetailComponent` there's a for loop rendering individual tasks and you want to have links to them. You cannot use directly:
|
|
168
|
-
|
|
169
|
-
```html
|
|
170
|
-
<button [rdtRouterLink]="TASK_DETAIL_ROUTE" [params]="task"></button>
|
|
171
|
-
```
|
|
172
|
-
Because task does not specify `userId`. For this you must provide static parameters for every parent route - `User` for `USER_DETAIL_ROUTE` in this case:
|
|
173
|
-
|
|
174
|
-
```typescript
|
|
175
|
-
@Input()
|
|
176
|
-
user!: User;
|
|
177
|
-
|
|
178
|
-
taskRoute!: RdtRoute<Task>;
|
|
179
|
-
|
|
180
|
-
ngOnInit() {
|
|
181
|
-
this.taskRoute = TASK_DETAIL_ROUTE.withStaticParams(USER_DETAIL_ROUTE, this.user);
|
|
182
|
-
}
|
|
183
|
-
```
|
|
184
|
-
Method `withStaticParams()` returns clone of `TASK_DETAIL_ROUTE` and all of its parent routes while fixing parameters. You can chain calling `withStaticParams` with itself or other method calls.
|
|
185
|
-
|
|
186
|
-
```html
|
|
187
|
-
<button [rdtRouterLink]="taskRoute" [params]="task"></button>
|
|
188
|
-
```
|
|
189
|
-
|
|
190
|
-
## Ecosystem
|
|
191
|
-
|
|
192
|
-
### RdtRouterLink
|
|
193
|
-
|
|
194
|
-
`RdtRouterLink` is equivalent of `RouterLink` in Angular. It supports basically the same functionality, but adds type safety. `RdtRouterLink` will be disabled if `canBeEntered` of its route returns `false`.
|
|
195
|
-
|
|
196
|
-
```typescript
|
|
197
|
-
readonly userRoute = USER_DETAIL_ROUTE;
|
|
198
|
-
readonly user$ = inject(UserService).getUser$();
|
|
199
|
-
```
|
|
200
|
-
|
|
201
|
-
```html
|
|
202
|
-
<button
|
|
203
|
-
[rdtRouterLink]="userRoute"
|
|
204
|
-
[params]="user$ | async"
|
|
205
|
-
target="_blank">
|
|
206
|
-
Link to user
|
|
207
|
-
</button>
|
|
208
|
-
```
|
|
209
|
-
|
|
210
|
-
### RdtMenu
|
|
211
|
-
|
|
212
|
-
`RdtRoute` can be passed directly into `RdtMenuItem`. If `canBeEntered` returns `false`, then the item won't be visible. This is useful to hide items user has no permission for.
|
|
213
|
-
|
|
214
|
-
Method `withStaticParams` lets us provide parameters for given `RdtRoute`, because `RdtMenuItem` does not accept route parameters.
|
|
215
|
-
|
|
216
|
-
```typescript
|
|
217
|
-
public getMenuItems(): RdtMenuItem[] {
|
|
218
|
-
const user: Partial<User> = {
|
|
219
|
-
userId: 123,
|
|
220
|
-
name: 'Josef'
|
|
221
|
-
};
|
|
222
|
-
|
|
223
|
-
return [
|
|
224
|
-
{
|
|
225
|
-
label: 'All users',
|
|
226
|
-
routerLink: USER_LIST_ROUTE
|
|
227
|
-
},
|
|
228
|
-
{
|
|
229
|
-
label: 'Josef',
|
|
230
|
-
routerLink: USER_DETAIL_ROUTE.withStaticParams(user)
|
|
231
|
-
}
|
|
232
|
-
];
|
|
233
|
-
}
|
|
234
|
-
```
|
|
235
|
-
|
|
236
|
-
### RdtAngularRoute
|
|
237
|
-
|
|
238
|
-
`RdtAngularRoute` is a container class for `RdtRoute` which functionally does two things: verifies that routes were defined correctly and enables you to provide guards, effects, component or module. Don't forget to call `build()` for it to generate Angular `Route`.
|
|
239
|
-
|
|
240
|
-
### RdtRouterService
|
|
241
|
-
|
|
242
|
-
`RdtRouterService` has similar features as Angular `Router`.
|
|
243
|
-
|
|
244
|
-
#### `parseAbsoluteUrl()`
|
|
245
|
-
Method will parse absolute path, recognize `RdtRoute` and parse its parameters. If no parameter is provided, then window location is used.
|
|
246
|
-
|
|
247
|
-
#### `navigateBack()`
|
|
248
|
-
|
|
249
|
-
Will push parent route to navigation stack. Function works anywhere in the app unlike similar Angular-based solution using `ActivatedRoute`.
|
|
250
|
-
|
|
251
|
-
Hitting native browser back button will take you back forward. In case you want true back function, use `inject(Location).back()` which removes from navigation stack, but can potentially take you outside of the app or close browser window.
|
|
252
|
-
|
|
253
|
-
#### `previousUrl` and `currentUrl`
|
|
254
|
-
|
|
255
|
-
Cached sync values of previous and current path values. For example `/dashboard` or `/user/123/task/xyz`.
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ngrdt-router.mjs","sources":["../../../../@ngrdt/router/src/lib/services/rdt-cannot-be-entered.token.ts","../../../../@ngrdt/router/src/lib/rdt-route/utils.ts","../../../../@ngrdt/router/src/lib/rdt-route/constants.ts","../../../../@ngrdt/router/src/lib/rdt-route/rdt-angular-route.ts","../../../../@ngrdt/router/src/lib/rdt-route/rdt-route-base.ts","../../../../@ngrdt/router/src/lib/rdt-route/rdt-route.ts","../../../../@ngrdt/router/src/lib/services/rdt-routes.token.ts","../../../../@ngrdt/router/src/lib/services/rdt-router.service.ts","../../../../@ngrdt/router/src/lib/rdt-route/rdt-route-builder.ts","../../../../@ngrdt/router/src/lib/directives/rdt-any-route-active.directive.ts","../../../../@ngrdt/router/src/lib/directives/rdt-back-link.directive.ts","../../../../@ngrdt/router/src/lib/directives/rdt-router-link.directive.ts","../../../../@ngrdt/router/src/lib/guards/prevent-data-loss.guard.ts","../../../../@ngrdt/router/src/lib/guards/global-route-guard.service.ts","../../../../@ngrdt/router/src/ngrdt-router.ts"],"sourcesContent":["import { InjectionToken } from '@angular/core';\nimport { RdtRedirectFn, RdtRedirectReturnType } from '../rdt-route/utils';\n\n/**\n * Injection token that defines behavior when route cannot be entered (canBeEntered returns false).\n * If value is undefined, route will be redirected to ''.\n */\nexport const RDT_CANNOT_BE_ENTERED_PROVIDER = new InjectionToken<\n RdtRedirectFn | RdtRedirectReturnType\n>('RDT_CANNOT_BE_ENTERED', { factory: () => undefined, providedIn: 'root' });\n","import { Params, Route } from '@angular/router';\r\nimport { RdtRoute } from './rdt-route';\r\n\r\n/**\r\n * Defines how a route parameter is matched and parsed.\r\n * - `'string'` — matches any non-slash character (`[^/]+`), value is URI-decoded.\r\n * - `'number'` — matches digits only (`\\d+`), value is parsed to a number.\r\n * - `string[]` — enum: matches only the listed values exactly. Invalid values are rejected at both URL creation and parsing time.\r\n */\r\nexport type ParamType = 'string' | 'number' | string[];\r\n\r\nexport type ParamTypeMap<T> = {\r\n [key in keyof T]?: ParamType;\r\n};\r\n\r\n/**\r\n * Maps between a database/model field name and the URL parameter name.\r\n * Used with `RdtRoute.withParamMappings()` when the URL param (e.g. `:id`)\r\n * differs from the property name on the data object (e.g. `userId`).\r\n */\r\nexport interface ParamMapping {\r\n /** Parameter name as it appears in the URL path (e.g. `'id'` for `:id`). */\r\n urlName: string;\r\n /** Property name on the data object (e.g. `'userId'`). */\r\n tableName: string;\r\n}\r\n\r\nexport interface StaticRouteParams {\r\n [absolutePath: string]: object;\r\n}\r\n\r\nexport type RdtRedirectReturnType = string | void | undefined;\r\n\r\n/**\r\n * Function invoked when a route's `canBeEntered` guard returns false.\r\n * Return a URL string to redirect to, or `undefined` to block navigation without redirect.\r\n * Runs in injection context — you can call `inject()` inside.\r\n */\r\nexport type RdtRedirectFn = (\r\n currentPath: string,\r\n targetPath: string,\r\n targetRoute: RdtRoute\r\n) => RdtRedirectReturnType;\r\n\r\n/**\r\n * Type-safe container for route parameters keyed by route instance.\r\n * Stores params for multiple routes in a hierarchy (e.g. parent + child params from a single URL).\r\n * Parameters are keyed internally by absolute path, so two different `RdtRoute` instances\r\n * with the same path share the same slot.\r\n */\r\nexport class RdtParameters {\r\n constructor(private params: StaticRouteParams = {}) {}\r\n\r\n get<T extends object>(route: RdtRoute<T>): Partial<T> | null {\r\n return (this.params[route.absolutePath] as Partial<T>) ?? null;\r\n }\r\n\r\n set<T extends object>(route: RdtRoute<T>, params: Partial<T>) {\r\n this.params[route.absolutePath] = params;\r\n return this;\r\n }\r\n\r\n append<T extends object>(route: RdtRoute<T>, params: Partial<T>) {\r\n const existing = this.get(route) ?? {};\r\n this.params[route.absolutePath] = { ...existing, ...params };\r\n return this;\r\n }\r\n\r\n setAll(params: RdtParameters) {\r\n this.params = { ...this.params, ...params.params };\r\n return this;\r\n }\r\n\r\n *[Symbol.iterator]() {\r\n const keys = Object.keys(this.params);\r\n keys.sort((a, b) => a.length - b.length);\r\n for (const key of keys) {\r\n yield [key, this.params[key]];\r\n }\r\n }\r\n}\r\n\r\nexport type LoadComponentCallback = Route['loadComponent'];\r\n\r\nexport function ALWAYS_TRUE() {\r\n return true;\r\n}\r\n\r\n/**\r\n * Synchronous guard function that determines whether a route can be entered.\r\n * Used by `[rdtRouterLink]` and `RdtMenu` to hide/disable links, and by the\r\n * built-in `canActivate` guard to block navigation.\r\n * Runs in injection context when an `Injector` is available — you can call `inject()` inside.\r\n *\r\n * The entire parent chain is evaluated: if any ancestor's guard returns `false`, the route is blocked.\r\n */\r\nexport type RdtCanBeEnteredFn<T extends object> = (\r\n route: RdtRoute<T>,\r\n params: RdtCombinedRouteParams<T>\r\n) => boolean;\r\n\r\n/**\r\n * Combined parameters available to guard functions and URL parsing results.\r\n */\r\nexport interface RdtCombinedRouteParams<T extends object> {\r\n /** Parameters extracted for the specific route being evaluated. */\r\n params: Partial<T>;\r\n /** Parameters for all routes in the hierarchy (parent + child), keyed by route. */\r\n route: RdtParameters;\r\n /** Query string parameters. */\r\n query: Params;\r\n /** `history.state` parameters. */\r\n state: Params;\r\n}\r\n","export enum RdtNavigationSource {\r\n BREADCRUMB = 'breadcrumb',\r\n}\r\n","import { Location } from '@angular/common';\r\nimport {\r\n EnvironmentInjector,\r\n EnvironmentProviders,\r\n inject,\r\n Provider,\r\n runInInjectionContext,\r\n Type,\r\n} from '@angular/core';\r\nimport {\r\n ActivatedRouteSnapshot,\r\n CanActivateChildFn,\r\n CanActivateFn,\r\n CanDeactivateFn,\r\n CanMatchFn,\r\n Data,\r\n LoadChildrenCallback,\r\n ResolveFn,\r\n Route,\r\n Router,\r\n RouterStateSnapshot,\r\n RunGuardsAndResolvers,\r\n UrlSegment,\r\n} from '@angular/router';\r\nimport { RDT_CANNOT_BE_ENTERED_PROVIDER } from '../services/rdt-cannot-be-entered.token';\r\nimport { RdtRouterService } from '../services/rdt-router.service';\r\nimport { RdtNavigationSource } from './constants';\r\nimport { RdtRoute } from './rdt-route';\r\nimport {\r\n LoadComponentCallback,\r\n RdtCombinedRouteParams,\r\n RdtParameters,\r\n} from './utils';\r\n\r\n/**\r\n * Bridges an `RdtRoute` to Angular's `Route` config.\r\n * Obtained via `RdtRoute.toAngularRoute()`. Use the fluent API to attach\r\n * components, guards, resolvers, and providers, then call `build()` to produce\r\n * the Angular `Route` object.\r\n *\r\n * `build()` validates that children defined on the `RdtRoute` match the children\r\n * passed via `withChildren()` — a mismatch throws at startup, catching misconfiguration early.\r\n *\r\n * When a route has both a component and children, `build()` automatically restructures\r\n * the output into Angular's required wrapper format (parent with empty-path child for the component).\r\n */\r\nexport class RdtAngularRoute<T extends object> {\r\n private route: RdtRoute<T>;\r\n private children: Route[] = [];\r\n\r\n // Must be set from component declaration files\r\n private loadComponent?: LoadComponentCallback;\r\n private loadChildren?: LoadChildrenCallback;\r\n private component?: Type<any>;\r\n private providers: (Provider | EnvironmentProviders)[] = [];\r\n private providersForChildren: (Provider | EnvironmentProviders)[] = [];\r\n private resolvers: { [key: string]: ResolveFn<unknown> } = {};\r\n private canActivate: CanActivateFn[] = [];\r\n private canActivateChild: CanActivateChildFn[] = [];\r\n private canDeactivate: CanDeactivateFn<T>[] = [];\r\n private runGuardsAndResolvers?: RunGuardsAndResolvers;\r\n private data?: Data;\r\n\r\n constructor(route: RdtRoute<T>) {\r\n this.route = route;\r\n }\r\n\r\n provide(...provider: (Provider | EnvironmentProviders)[]) {\r\n this.providers.push(...provider);\r\n return this;\r\n }\r\n\r\n provideToChildren(...provider: (Provider | EnvironmentProviders)[]) {\r\n this.providersForChildren.push(...provider);\r\n this.providers.push(...provider);\r\n return this;\r\n }\r\n\r\n withLazyComponent(callback: LoadComponentCallback) {\r\n this.loadComponent = callback;\r\n return this;\r\n }\r\n\r\n withModule(callback: LoadChildrenCallback) {\r\n this.loadChildren = callback;\r\n return this;\r\n }\r\n /**\r\n * @deprecated Use withModule() instead.\r\n */\r\n setModule(callback: LoadChildrenCallback) {\r\n this.loadChildren = callback;\r\n return this;\r\n }\r\n\r\n withComponent(comp: Type<any>) {\r\n this.component = comp;\r\n return this;\r\n }\r\n /**\r\n * @deprecated Use withComponent() instead.\r\n */\r\n setComponent(comp: Type<any>) {\r\n return this.withComponent(comp);\r\n }\r\n\r\n withChildren(...routes: Route[]) {\r\n this.children = routes;\r\n return this;\r\n }\r\n /**\r\n * @deprecated Use withChildren() instead.\r\n */\r\n setChildren(...routes: Route[]) {\r\n return this.withChildren(...routes);\r\n }\r\n\r\n addResolve(paramName: string, resolver: ResolveFn<unknown>) {\r\n this.resolvers[paramName] = resolver;\r\n return this;\r\n }\r\n\r\n addCanActivate(...fns: CanActivateFn[]) {\r\n this.canActivate.push(...fns);\r\n return this;\r\n }\r\n\r\n addCanDeactivate(...fns: CanDeactivateFn<any>[]) {\r\n this.canDeactivate.push(...fns);\r\n return this;\r\n }\r\n\r\n addCanActivateChild(...fns: CanActivateChildFn[]) {\r\n this.canActivateChild.push(...fns);\r\n return this;\r\n }\r\n\r\n withRunGuardsAndResolvers(value: RunGuardsAndResolvers) {\r\n this.runGuardsAndResolvers = value;\r\n return this;\r\n }\r\n /**\r\n * @deprecated Use withRunGuardsAndResolvers() instead.\r\n */\r\n setRunGuardsAndResolvers(value: RunGuardsAndResolvers) {\r\n return this.withRunGuardsAndResolvers(value);\r\n }\r\n\r\n build(): Route {\r\n this.checkChildrenMatch();\r\n\r\n let res: Route = {\r\n path: this.route.path,\r\n providers: this.providers,\r\n title: this.route.name,\r\n canMatch: this.getCanMatch(),\r\n };\r\n\r\n if (this.component) {\r\n res.component = this.component;\r\n } else if (this.loadChildren) {\r\n res.loadChildren = this.loadChildren;\r\n } else if (this.loadComponent) {\r\n res.loadComponent = this.loadComponent;\r\n }\r\n\r\n res.data = this.data ?? {\r\n breadcrumb: {\r\n label: this.route.name,\r\n disable: this.route.entryDisabled,\r\n staticStateParams: {\r\n src: RdtNavigationSource.BREADCRUMB,\r\n },\r\n },\r\n ...this.route.data,\r\n };\r\n\r\n const guard: CanActivateFn = (\r\n route: ActivatedRouteSnapshot,\r\n state: RouterStateSnapshot\r\n ) => {\r\n const injector = inject(EnvironmentInjector);\r\n const rdtRouter = inject(RdtRouterService);\r\n const parsed = rdtRouter.parseAbsoluteUrl(state.url);\r\n const combinedParams: RdtCombinedRouteParams<T> = parsed?.params ?? {\r\n params: {},\r\n query: {},\r\n state: {},\r\n route: new RdtParameters(),\r\n };\r\n combinedParams.query = route.queryParams;\r\n\r\n if (\r\n runInInjectionContext(injector, () =>\r\n this.route.canBeEnteredFn(parsed?.route ?? this.route, combinedParams)\r\n )\r\n ) {\r\n return true;\r\n } else {\r\n const router = inject(Router);\r\n const location = inject(Location);\r\n let url = inject(RDT_CANNOT_BE_ENTERED_PROVIDER);\r\n if (typeof url === 'function') {\r\n url = runInInjectionContext(\r\n injector,\r\n url.bind(\r\n url,\r\n location.path(),\r\n state.url,\r\n parsed?.route ?? this.route\r\n )\r\n );\r\n }\r\n if (typeof url === 'string') {\r\n return router.parseUrl(url);\r\n } else {\r\n return false;\r\n }\r\n }\r\n };\r\n this.canActivate.push(guard);\r\n\r\n res.canActivate = this.canActivate;\r\n res.canDeactivate = this.canDeactivate;\r\n\r\n if (this.providersForChildren.length > 0) {\r\n this.children.forEach((ch) => this.provideToChildrenRec(ch));\r\n }\r\n\r\n // If children exist, change\r\n // {\r\n // path: '/path',\r\n // component: FeatureComponent,\r\n // children: [...]\r\n // }\r\n // into\r\n // {\r\n // path: '/path',\r\n // children: [\r\n // {\r\n // path: '',\r\n // component: FeatureComponent\r\n // },\r\n // ...\r\n // ]\r\n // }\r\n if (this.children.length > 0) {\r\n if (this.loadChildren || this.component || this.loadComponent) {\r\n const path = res.path;\r\n res.path = '';\r\n res.pathMatch = 'full';\r\n res.canMatch = undefined;\r\n res = {\r\n path: path,\r\n pathMatch: 'prefix',\r\n children: [res, ...this.children],\r\n canActivateChild: this.canActivateChild,\r\n canMatch: this.getCanMatch(),\r\n data: res.data,\r\n providers: res.providers,\r\n canActivate: res.canActivate,\r\n canDeactivate: res.canDeactivate,\r\n };\r\n } else {\r\n res.children = this.children;\r\n }\r\n }\r\n\r\n if (Object.keys(this.resolvers).length > 0) {\r\n res.resolve = this.resolvers;\r\n }\r\n\r\n if (this.runGuardsAndResolvers) {\r\n res.runGuardsAndResolvers = this.runGuardsAndResolvers;\r\n }\r\n\r\n return res;\r\n }\r\n\r\n private getCanMatch(): CanMatchFn[] | undefined {\r\n const paramMap = this.route.paramMap;\r\n const hasConstrainedParams = Object.keys(paramMap).some(\r\n (p) => paramMap[p as keyof T] === 'number' || Array.isArray(paramMap[p as keyof T])\r\n );\r\n if (!hasConstrainedParams) {\r\n return undefined;\r\n }\r\n const routeSegmentLength = this.route.path.split('/').length;\r\n const regex = this.route.regex\r\n ? new RegExp(`^${this.route.regex.source}$`)\r\n : this.route.absoluteRegex;\r\n return [\r\n (route: Route, segments: UrlSegment[]) => {\r\n const path = segments\r\n .slice(0, routeSegmentLength)\r\n .map((s) => s.path)\r\n .join('/');\r\n return regex.test(path);\r\n },\r\n ];\r\n }\r\n\r\n private provideToChildrenRec(child: Route) {\r\n if (!child.providers) {\r\n child.providers = [];\r\n }\r\n this.providersForChildren.forEach((p) => {\r\n if (typeof p === 'object' && 'provide' in p) {\r\n const exists = child.providers!.some((pr) => {\r\n if (typeof pr === 'object' && 'provide' in pr) {\r\n return pr.provide === p.provide;\r\n }\r\n return false;\r\n });\r\n if (!exists) {\r\n child.providers!.unshift(p);\r\n }\r\n } else {\r\n child.providers!.unshift(p);\r\n }\r\n });\r\n if (child.children) {\r\n child.children.forEach((ch) => this.provideToChildrenRec(ch));\r\n }\r\n }\r\n\r\n private checkChildrenMatch() {\r\n // Check that all routes are present if route is not\r\n // lazy loaded module.\r\n if (\r\n !this.loadChildren &&\r\n (this.route.children.length > 0 || this.children.length > 0)\r\n ) {\r\n if (this.children.length < this.route.children.length) {\r\n throw new Error(\r\n `RdtRoute ${this.route.name} has ${\r\n this.route.children.length\r\n } children, but RdtAngularRoute has ${\r\n this.children.length\r\n }. These numbers must match. Did you forget to call .setChildren() method in global routes definition? Routes with following names should be present: ${this.route.children\r\n .map((ch) => ch.name)\r\n .join(', ')}`\r\n );\r\n } else if (this.children.length > this.route.children.length) {\r\n throw new Error(\r\n `RdtRoute ${this.route.name} has ${\r\n this.route.children.length\r\n } children, but RdtAngularRoute has ${\r\n this.children.length\r\n }. These numbers must match. Did you forget to call .setChildren() method in feature shell routes definition? Routes with following paths should be present: ${this.children\r\n .map((ch) => ch.path)\r\n .join(', ')}`\r\n );\r\n }\r\n const n1 = this.children.map((ch) => ch.path!);\r\n const n2 = this.route.children.map((ch) => ch.path);\r\n n1.sort();\r\n n2.sort();\r\n for (let i = 0; i < n1.length; i++) {\r\n if (n1[i] !== n2[i]) {\r\n throw new Error(\r\n `Paths of children provided in RdtRoute and\r\n RdtAngularRoute do not match. ${n1[i]} != ${n2[i]}`\r\n );\r\n }\r\n }\r\n }\r\n }\r\n}\r\n","import { Data } from '@angular/router';\nimport { RdtRoute } from './rdt-route';\nimport {\n ALWAYS_TRUE,\n ParamMapping,\n ParamTypeMap,\n RdtCanBeEnteredFn,\n} from './utils';\n\nexport class RdtRouteBase<T extends object> {\n protected _orderedParams: string[] = [];\n protected _paramMap: ParamTypeMap<T> = {};\n protected _regex: RegExp | null = null;\n protected _paramMappings: ParamMapping[] = [];\n\n protected _name!: string;\n protected _path!: string;\n protected _parent: RdtRoute | null = null;\n protected _children: RdtRoute[] = [];\n protected _entryDisabled = false;\n protected _canBeEntered: RdtCanBeEnteredFn<T> = ALWAYS_TRUE;\n protected _data: Data = {};\n\n /**\n * Data that is passed to Angular route definition.\n */\n get data() {\n return this._data;\n }\n\n /**\n * Regular expression route path relative to parent route.\n * Hostname excluded.\n */\n get regex() {\n return this._regex;\n }\n\n /**\n * Denotes disabled route entry.\n * If true, route should have no NgModule\n * or component and only serves as virtual module\n * for breadcrumb.\n */\n get entryDisabled() {\n return this._entryDisabled;\n }\n\n /**\n * Map of parameters and their types.\n */\n get paramMap(): Readonly<ParamTypeMap<T>> {\n return this._paramMap;\n }\n\n /**\n * Human readable name for display in breadcrumbs, title, etc.\n */\n get name() {\n return this._name;\n }\n\n /**\n * Path of the route relative to parent route.\n */\n get path() {\n return this._path;\n }\n\n /**\n * Parent route.\n */\n get parent() {\n return this._parent;\n }\n\n /**\n * Child routes.\n */\n get children() {\n return this._children;\n }\n}\n","import { Injector, runInInjectionContext } from '@angular/core';\r\nimport { Params } from '@angular/router';\r\nimport { RdtStringUtils } from '@ngrdt/utils';\r\nimport { RdtAngularRoute } from './rdt-angular-route';\r\nimport { RdtRouteBase } from './rdt-route-base';\r\nimport { RdtRouteBuilder } from './rdt-route-builder';\r\nimport {\r\n ALWAYS_TRUE,\r\n ParamMapping,\r\n RdtCombinedRouteParams,\r\n RdtParameters,\r\n} from './utils';\r\n\r\n/**\r\n * Immutable, type-safe route definition. Created via `RdtRouteBuilder.build()`.\r\n *\r\n * Each instance represents a single route in the hierarchy and holds its path pattern,\r\n * parameter types, parent reference, and access guard. Use `withStaticParams()`,\r\n * `withQueryParams()`, or `withStateParams()` to create derived instances with\r\n * pre-filled values (the original is never mutated).\r\n *\r\n * To bridge to Angular's router, call `toAngularRoute()` to get an `RdtAngularRoute`\r\n * builder that produces an Angular `Route` config object.\r\n *\r\n * @typeParam T - Shape of this route's own parameters.\r\n */\r\nexport class RdtRoute<T extends object = any> extends RdtRouteBase<T> {\r\n private _absoluteRegex?: RegExp;\r\n protected _staticParams: Partial<T> = {};\r\n protected _queryParams: Params = {};\r\n protected _stateParams: Params = {};\r\n\r\n /**\r\n * Absolute path of parent route or '/' if there is no parent.\r\n * Hostname excluded.\r\n */\r\n get basePath(): string {\r\n return this._parent ? this._parent.absolutePath : '/';\r\n }\r\n\r\n /**\r\n * Absolute path of the route. Hostname excluded.\r\n */\r\n get absolutePath() {\r\n return RdtStringUtils.joinPaths(this.basePath, this._path);\r\n }\r\n\r\n /**\r\n * Regular expression to match only this route (not children\r\n * or parent routes). Hostname excluded.\r\n */\r\n get absoluteRegex(): RegExp {\r\n if (this._absoluteRegex) {\r\n return this._absoluteRegex;\r\n }\r\n\r\n if (!this._regex) {\r\n this._absoluteRegex = new RegExp('^/$');\r\n if (this._parent) {\r\n throw new Error('Nested route with empty path is not allowed.');\r\n }\r\n } else if (this._parent) {\r\n // Remove initial ^ and ending $\r\n const parent = this._parent.absoluteRegex.source.slice(1, -1);\r\n this._absoluteRegex = new RegExp(\r\n '^' + RdtStringUtils.joinPaths(parent, this._regex.source) + '$'\r\n );\r\n } else {\r\n this._absoluteRegex = new RegExp(\r\n '^' + RdtStringUtils.joinPaths('/', this._regex.source) + '$'\r\n );\r\n }\r\n return this._absoluteRegex;\r\n }\r\n\r\n /**\r\n * Statically set state params used when navigating to this instance.\r\n */\r\n get stateParams() {\r\n return this._stateParams;\r\n }\r\n\r\n /**\r\n * Statically set query params used when navigating to this instance.\r\n */\r\n get queryParams() {\r\n return this._queryParams;\r\n }\r\n\r\n /**\r\n * @param url Absolute path to test.\r\n * @returns True if url matches this route.\r\n */\r\n testUrl(url: string) {\r\n return this.absoluteRegex.test(url);\r\n }\r\n\r\n /**\r\n * Statically set parameters used when navigating to this instance.\r\n */\r\n get staticParams() {\r\n return { ...this._staticParams };\r\n }\r\n\r\n get hasCanBeEnteredGuard() {\r\n return this._canBeEntered !== ALWAYS_TRUE;\r\n }\r\n\r\n /**\r\n * Meta guard that is used by [rdtRouterLink] and RdtMenu\r\n * to determine if route can be entered.\r\n * @param injector Environment or custom injector.\r\n * @param params Optional parameters to pass to guard function.\r\n * @returns True if route can be entered.\r\n */\r\n canBeEntered(\r\n injector?: Injector,\r\n combinedParams: Partial<RdtCombinedRouteParams<T>> = {}\r\n ): boolean {\r\n const route = this.getStaticParams();\r\n let query = this._queryParams;\r\n let state = this._stateParams;\r\n if (combinedParams.params) {\r\n route.set(this, combinedParams.params);\r\n }\r\n if (combinedParams.route) {\r\n route.setAll(combinedParams.route);\r\n }\r\n if (combinedParams.query) {\r\n query = { ...query, ...combinedParams.query };\r\n }\r\n if (combinedParams.state) {\r\n state = { ...state, ...combinedParams.state };\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-this-alias\r\n let current: RdtRoute | null = this;\r\n\r\n while (current) {\r\n const combined: RdtCombinedRouteParams<T> = {\r\n params: route.get(current) ?? {},\r\n route: route,\r\n query: query,\r\n state: state,\r\n };\r\n\r\n if (injector) {\r\n const c = current;\r\n if (\r\n !runInInjectionContext(injector, () => c._canBeEntered(c, combined))\r\n ) {\r\n return false;\r\n }\r\n } else if (!current._canBeEntered(current, combined)) {\r\n return false;\r\n }\r\n current = current._parent;\r\n }\r\n return true;\r\n }\r\n\r\n get canBeEnteredFn() {\r\n return this._canBeEntered;\r\n }\r\n\r\n /**\r\n * Extracts url parameters from absolute path for this path and each parent.\r\n */\r\n parseAbsoluteUrl(url: string): RdtCombinedRouteParams<T> | null {\r\n const path = RdtStringUtils.stripQueryParams(url);\r\n const reg = this.absoluteRegex;\r\n const matches = reg.exec(path);\r\n if (matches) {\r\n const query = RdtStringUtils.parseQueryParams(url);\r\n const values = matches.slice(1).reverse();\r\n const obj = this.fill(values);\r\n const route = new RdtParameters(obj);\r\n const params = route.get(this) ?? {};\r\n\r\n return {\r\n params: params,\r\n route: route,\r\n query: query,\r\n state: {},\r\n };\r\n } else {\r\n return null;\r\n }\r\n }\r\n\r\n private fill(values: string[], res: Record<string, any> = {}) {\r\n const params: { [key in keyof T]?: string | number } = {};\r\n const reversedParams = this._orderedParams.slice().reverse();\r\n for (let i = 0; i < reversedParams.length && i < values.length; i++) {\r\n const key = reversedParams[i] as keyof T;\r\n const mappedKey =\r\n this._paramMappings.find((m) => m.urlName === key)?.tableName ?? key;\r\n let val: string | number = decodeURIComponent(values[i]);\r\n\r\n if (this._paramMap[key] === 'number') {\r\n val = parseInt(val);\r\n }\r\n params[mappedKey as keyof T] = val;\r\n }\r\n res[this.absolutePath] = params;\r\n\r\n if (values.length > reversedParams.length && this._parent) {\r\n this._parent.fill(values.slice(reversedParams.length), res);\r\n }\r\n return res;\r\n }\r\n\r\n /**\r\n * Fills parameters in path with values from paramMap.\r\n * Use withStaticParams() beforehand in case parent paths contain parameters.\r\n * @param paramMap Must contain all parameters for this route.\r\n * @returns Absolute path.\r\n */\r\n createAbsoluteUrl(paramMap: Partial<T> = this._staticParams): string {\r\n if (!this._parent) {\r\n return this.createUrl(this.absolutePath, paramMap);\r\n } else {\r\n return RdtStringUtils.joinPaths(\r\n this._parent.createAbsoluteUrl(),\r\n this.createRelativeUrl(paramMap)\r\n );\r\n }\r\n }\r\n\r\n createRelativeUrl(paramMap: Partial<T> = this._staticParams) {\r\n return this.createUrl(this.path, paramMap);\r\n }\r\n\r\n private createUrl(path: string, paramMap: Partial<T>) {\r\n const paramNames = Object.keys(this._paramMap);\r\n paramNames.sort((a, b) => b.length - a.length);\r\n const extendedParamMap: any = { ...paramMap };\r\n\r\n this._paramMappings.forEach((mapping) => {\r\n if (mapping.tableName in paramMap) {\r\n extendedParamMap[mapping.urlName] = (paramMap as any)[\r\n mapping.tableName\r\n ];\r\n }\r\n });\r\n\r\n paramNames.forEach((param) => {\r\n if (!(param in extendedParamMap)) {\r\n throw new Error(\r\n `Param ${param} is missing for route ${this.absolutePath}. Please pass object with required parameters.`\r\n );\r\n }\r\n const value = extendedParamMap[param as keyof T];\r\n const type = this._paramMap[param as keyof T];\r\n if (Array.isArray(type) && !type.includes(`${value}`)) {\r\n throw new Error(\r\n `Value \"${value}\" is not allowed for enum param \"${param}\" in route ${\r\n this.absolutePath\r\n }. Allowed values: ${type.join(', ')}`\r\n );\r\n }\r\n path = path.replace(`:${param}`, encodeURIComponent(`${value}`));\r\n });\r\n\r\n return path;\r\n }\r\n\r\n toAngularRoute() {\r\n return new RdtAngularRoute<T>(this);\r\n }\r\n\r\n /**\r\n * Provides static mapping for parameter names tableName -> urlName.\r\n * Returns new instance of RdtRoute<T> that is clone of\r\n * this route and its parents (NOT children).\r\n * @returns Clone of this route with mapped parameter names.\r\n */\r\n withParamMappings(mappings: ParamMapping[]) {\r\n const clone = this.clone();\r\n clone._paramMappings = mappings;\r\n return clone;\r\n }\r\n\r\n /**\r\n * Sets static parameters for this route.\r\n * @param params Static parameters for this route.\r\n * @returns Clone of this with static parameters set.\r\n */\r\n withStaticParams(params: T): RdtRoute<T>;\r\n withStaticParams<T2 extends object>(\r\n route: RdtRoute<T2>,\r\n params: T2\r\n ): RdtRoute<T>;\r\n\r\n /**\r\n * Sets parameters for itself or parents.\r\n * Returns new instance of RdtRoute<T> that is clone of\r\n * this route and its parents (NOT children).\r\n * @returns Clone of this route with static parameters set.\r\n */\r\n withStaticParams<T2 extends object>(param1: RdtRoute<T2> | T, param2?: T2) {\r\n const clone = this.clone();\r\n\r\n if (param2) {\r\n const routeAbsPath = (param1 as RdtRoute<T2>).absolutePath;\r\n let current: RdtRoute | null = clone;\r\n\r\n while (current) {\r\n if (current.absolutePath === routeAbsPath) {\r\n current._staticParams = param2;\r\n }\r\n current = current._parent;\r\n }\r\n } else {\r\n clone._staticParams = param1 as T;\r\n }\r\n return clone;\r\n }\r\n\r\n withQueryParams(queryParams: Params) {\r\n const clone = this.clone();\r\n clone._queryParams = { ...queryParams };\r\n return clone;\r\n }\r\n\r\n withStateParams(stateParams: Params) {\r\n const clone = this.clone();\r\n clone._stateParams = { ...stateParams };\r\n return clone;\r\n }\r\n\r\n /**\r\n * @returns Partial of object that only contains properties necessary to create this route.\r\n */\r\n extractRouteParams(row: T): Partial<T> {\r\n const res: Partial<T> = {};\r\n\r\n this._orderedParams.forEach((param) => {\r\n const mapping = this._paramMappings.find((m) => m.urlName === param);\r\n const mappedParam = (mapping?.tableName ?? param) as keyof T;\r\n if (mappedParam in row) {\r\n res[mappedParam] = row[mappedParam];\r\n }\r\n });\r\n\r\n return res;\r\n }\r\n\r\n getStaticParams(): RdtParameters {\r\n const res = new RdtParameters();\r\n // eslint-disable-next-line @typescript-eslint/no-this-alias\r\n let current: RdtRoute | null = this;\r\n while (current) {\r\n res.set(current, current._staticParams);\r\n current = current._parent;\r\n }\r\n return res;\r\n }\r\n\r\n /**\r\n * @returns New instance of RdtRoute<T> that is clone of\r\n * this route and its parents (NOT children).\r\n */\r\n clone() {\r\n const clone = new RdtRoute<T>();\r\n clone._name = this._name;\r\n clone._parent = this._parent?.clone() ?? null;\r\n clone._path = this.path;\r\n clone._entryDisabled = this._entryDisabled;\r\n clone._orderedParams = [...this._orderedParams];\r\n clone._paramMap = { ...this._paramMap };\r\n clone._regex = this._regex ? new RegExp(this._regex) : null;\r\n clone._paramMappings = this._paramMappings;\r\n clone._staticParams = { ...this._staticParams };\r\n clone._stateParams = { ...this._stateParams };\r\n clone._canBeEntered = this._canBeEntered;\r\n clone._queryParams = { ...this._queryParams };\r\n return clone;\r\n }\r\n\r\n private static getGroup(type: 'string' | 'number' | string[]): string {\r\n if (Array.isArray(type)) {\r\n return (\r\n '(' +\r\n type.map((v) => v.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')).join('|') +\r\n ')'\r\n );\r\n }\r\n return RdtRoute.groups[type];\r\n }\r\n\r\n private setRegex() {\r\n const params = Object.keys(this._paramMap);\r\n params.sort((a, b) => b.length - a.length);\r\n let substituted = this.path;\r\n params.forEach((p) => {\r\n const type = this._paramMap[p as keyof T];\r\n if (!type) {\r\n throw new Error('Params is not set i');\r\n }\r\n substituted = substituted.replace(`:${p}`, RdtRoute.getGroup(type));\r\n });\r\n\r\n if (substituted === '') {\r\n this._regex = null;\r\n } else {\r\n this._regex = new RegExp(substituted);\r\n }\r\n }\r\n\r\n static fromBuilder<T extends object>(builder: RdtRouteBuilder<T>) {\r\n const route = new RdtRoute<T>();\r\n route._name = builder.name;\r\n route._path = builder.path;\r\n route._entryDisabled = builder.entryDisabled;\r\n route._orderedParams = builder.orderedParams;\r\n route._canBeEntered = builder.canBeEntered;\r\n route._paramMap = builder.paramMap;\r\n route._regex = builder.regex ? new RegExp(builder.regex) : null;\r\n route._paramMappings = builder.paramMappings;\r\n route._children = builder.children;\r\n route._data = builder.data;\r\n route._children.forEach((child) => (child._parent = route));\r\n route.setRegex();\r\n return route;\r\n }\r\n\r\n private static readonly groups = {\r\n string: '([^/]+)',\r\n number: '(-?\\\\d+)',\r\n };\r\n}\r\n","import {\r\n EnvironmentProviders,\r\n InjectionToken,\r\n makeEnvironmentProviders,\r\n} from '@angular/core';\r\nimport { RdtRoute } from '../rdt-route/rdt-route';\r\n\r\n/**\r\n * Injection token holding all application routes as a flat array.\r\n * Used internally by `RdtRouterService` to match URLs and enable type-safe navigation.\r\n * Prefer using `provideRdtRoutes()` instead of providing this token directly.\r\n */\r\nexport const RDT_ROUTES_PROVIDER = new InjectionToken<RdtRoute[]>(\r\n 'RDT_ROUTES_PROVIDER'\r\n);\r\n\r\n/**\r\n * Provides all application routes to `RdtRouterService`.\r\n * Accepts either a route module object (`import * as routes from './routes'`)\r\n * or a plain array of `RdtRoute` instances.\r\n *\r\n * @example\r\n * ```ts\r\n * import * as ALL_ROUTES from './rdt-routes';\r\n *\r\n * export const appConfig: ApplicationConfig = {\r\n * providers: [\r\n * provideRdtRoutes(ALL_ROUTES),\r\n * ],\r\n * };\r\n * ```\r\n */\r\nexport function provideRdtRoutes(\r\n routes: Record<string, unknown> | RdtRoute[]\r\n): EnvironmentProviders {\r\n const routeArray = Array.isArray(routes)\r\n ? routes\r\n : Object.values(routes).filter(\r\n (v): v is RdtRoute => v instanceof RdtRoute\r\n );\r\n\r\n return makeEnvironmentProviders([\r\n { provide: RDT_ROUTES_PROVIDER, useValue: routeArray },\r\n ]);\r\n}\r\n","import { Location, PlatformLocation } from '@angular/common';\r\nimport { inject, Injectable } from '@angular/core';\r\nimport { NavigationEnd, Params, Router } from '@angular/router';\r\nimport { RdtStringUtils } from '@ngrdt/utils';\r\nimport { filter, Observable, take } from 'rxjs';\r\nimport { RdtRoute } from '../rdt-route/rdt-route';\r\nimport { RdtCombinedRouteParams, RdtParameters } from '../rdt-route/utils';\r\nimport { RDT_ROUTES_PROVIDER } from './rdt-routes.token';\r\n\r\n/**\r\n * Additional options for `RdtRouterService.navigate()`.\r\n * These take priority over any params set on the route via `withQueryParams()` / `withStateParams()`.\r\n */\r\nexport interface RdtNavigateExtras {\r\n /** Data passed via `history.state`. */\r\n state?: Params;\r\n /** Query string parameters appended to the URL. */\r\n query?: Params;\r\n /** Window target. Use `'_blank'` to open in a new tab. Defaults to `'_self'`. */\r\n target?: '_blank' | '_self' | '_parent' | '_top';\r\n /** Replace the current history entry instead of pushing a new one. */\r\n replaceUrl?: boolean;\r\n}\r\n\r\nconst DEFAULT_TARGET = '_self';\r\nconst RDT_STATE_PARAMS_KEY = 'RdtStateParams';\r\n\r\n/**\r\n * Central navigation service for type-safe routing.\r\n * Wraps Angular's `Router` with `RdtRoute`-based navigation, URL parsing, and history tracking.\r\n * Requires `RDT_ROUTES_PROVIDER` to be configured with all application routes.\r\n */\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class RdtRouterService {\r\n readonly allRoutes = inject(RDT_ROUTES_PROVIDER, { optional: true });\r\n readonly baseHref = inject(PlatformLocation).getBaseHrefFromDOM();\r\n\r\n private readonly location = inject(Location);\r\n private readonly router = inject(Router);\r\n\r\n private _previousUrl: string | null = null;\r\n private _currentUrl: string | null = null;\r\n\r\n get previousUrl() {\r\n return this._previousUrl;\r\n }\r\n\r\n get currentUrl() {\r\n return this._currentUrl;\r\n }\r\n\r\n parsePreviousUrl() {\r\n return this._previousUrl ? this.parseAbsoluteUrl(this._previousUrl) : null;\r\n }\r\n\r\n parseCurrentUrl() {\r\n return this._currentUrl ? this.parseAbsoluteUrl(this._currentUrl) : null;\r\n }\r\n\r\n readonly navigationEnd$ = this.router.events.pipe(\r\n filter((e) => e instanceof NavigationEnd)\r\n ) as Observable<NavigationEnd>;\r\n\r\n readonly nextNavigationEnd$ = this.navigationEnd$.pipe(take(1));\r\n\r\n constructor() {\r\n if (this.allRoutes === null) {\r\n console.warn(\r\n 'All routes not provided. Make sure to provide RDT_ROUTES_PROVIDER with RdtRoute[].'\r\n );\r\n this.allRoutes = [];\r\n }\r\n\r\n this.navigationEnd$.subscribe((e) => {\r\n this._previousUrl = this._currentUrl;\r\n this._currentUrl = e.url;\r\n });\r\n }\r\n\r\n /**\r\n * @returns window.history.state extended by state parameters passed from parent window.\r\n */\r\n getHistoryState() {\r\n if (\r\n 'RdtStateParams' in window &&\r\n typeof window[RDT_STATE_PARAMS_KEY] === 'object'\r\n ) {\r\n return { ...window[RDT_STATE_PARAMS_KEY], ...(history.state ?? {}) };\r\n } else {\r\n return history.state ?? {};\r\n }\r\n }\r\n\r\n /**\r\n * Navigates to the specified route.\r\n * @param link Route to navigate to.\r\n * @param params Parameter of route passed as first argument or RdtParameters object.\r\n * @param extras Allows you to specify additional parameters for navigation. These extras have higher priority than those defined in the route.\r\n * @returns Promise that resolves when navigation is complete.\r\n */\r\n navigate<T extends object>(\r\n link: RdtRoute<T>,\r\n params?: Partial<T> | RdtParameters,\r\n extras?: RdtNavigateExtras\r\n ) {\r\n let url: string;\r\n if (params instanceof RdtParameters) {\r\n let linkCpy = link;\r\n for (let r: RdtRoute | null = linkCpy; r !== null; r = r.parent) {\r\n const p = params.get(r as RdtRoute);\r\n if (p) {\r\n linkCpy = linkCpy.withStaticParams(r, p);\r\n }\r\n }\r\n url = linkCpy.createAbsoluteUrl();\r\n } else {\r\n url = params ? link.createAbsoluteUrl(params) : link.createAbsoluteUrl();\r\n }\r\n\r\n const target = extras?.target ?? DEFAULT_TARGET;\r\n const queryParams = extras?.query ?? link.queryParams;\r\n const stateParams = extras?.state ?? link.stateParams;\r\n\r\n if (target === '_self') {\r\n return this.router.navigate([url], {\r\n queryParams: queryParams,\r\n state: stateParams,\r\n replaceUrl: extras?.replaceUrl,\r\n });\r\n }\r\n\r\n const absolutePath = RdtStringUtils.createAbsoluteUrl(url, this.baseHref);\r\n const pathWithParams = RdtStringUtils.appendQueryParams(\r\n absolutePath,\r\n queryParams\r\n );\r\n const win = window.open(pathWithParams, target);\r\n if (win) {\r\n (win as any)[RDT_STATE_PARAMS_KEY] = stateParams;\r\n }\r\n return Promise.resolve(true);\r\n }\r\n\r\n navigateHome(extras?: RdtNavigateExtras) {\r\n return this.router.navigateByUrl(\r\n RdtStringUtils.appendQueryParams('/', extras?.query ?? {}),\r\n {\r\n state: extras?.state,\r\n replaceUrl: extras?.replaceUrl,\r\n }\r\n );\r\n }\r\n\r\n navigateBack(extras?: RdtNavigateExtras) {\r\n const parsed = this.parseAbsoluteUrl();\r\n if (parsed) {\r\n let route: RdtRoute | null = parsed.route.withStaticParams(parsed.params);\r\n do {\r\n route = route.parent;\r\n } while (route && route.entryDisabled);\r\n\r\n // In case route has no ancestor with allowed entry,\r\n if (!route) {\r\n return this.navigateHome(extras);\r\n }\r\n if (extras) {\r\n if (extras.query) {\r\n route = route.withQueryParams(extras.query);\r\n }\r\n if (extras.state) {\r\n route = route.withStateParams(extras.state);\r\n }\r\n }\r\n return this.navigate(route, extras);\r\n } else {\r\n console.warn(\r\n `Cannot go back from ${this.location.path()} because no route matches current url`\r\n );\r\n return null;\r\n }\r\n }\r\n\r\n /**\r\n * This method will try to find matching route for given absolute URL, extract its parameters and return them.\r\n * If no route matches the URL, it returns null. Parameters are extracted only for the last matching route, not ancestors.\r\n * @param url Absolute URL to parse (e.g. '/home/details/123?query=abc').\r\n * @returns Object containing the matching route and its parameters, or null if no route is matching.\r\n */\r\n parseAbsoluteUrl(url = this.location.path()) {\r\n const stripped = RdtStringUtils.stripQueryParams(url);\r\n if (this.allRoutes) {\r\n for (const route of this.allRoutes) {\r\n const params = route.parseAbsoluteUrl(stripped);\r\n if (params) {\r\n return { route, params };\r\n }\r\n }\r\n }\r\n return null;\r\n }\r\n\r\n extractAllParams(\r\n currentRoute?: RdtRoute\r\n ): RdtCombinedRouteParams<any> | null {\r\n if (!currentRoute) {\r\n const parsed = this.parseAbsoluteUrl();\r\n if (!parsed) {\r\n console.warn('No route matches current url.');\r\n return null;\r\n }\r\n currentRoute = parsed.route;\r\n }\r\n const url = this.location.path();\r\n return currentRoute.parseAbsoluteUrl(url);\r\n }\r\n\r\n isParentOfCurrentLocation(route: RdtRoute) {\r\n return true;\r\n }\r\n\r\n removeQueryParams(...paramNames: string[]) {\r\n const regex = new RegExp(`[?&](${paramNames.join('|')})=[^&]*`, 'g');\r\n\r\n return history.replaceState(\r\n history.state,\r\n '',\r\n location.pathname + location.search.replace(regex, '').replace(/^&/, '?')\r\n );\r\n }\r\n}\r\n","import { Data } from '@angular/router';\r\nimport { RdtRoute } from './rdt-route';\r\nimport { RdtRouteBase } from './rdt-route-base';\r\nimport { RdtCanBeEnteredFn } from './utils';\r\n\r\nconst DEFAULT_PARAM_TYPE = 'number';\r\n\r\n/**\r\n * Fluent builder for creating `RdtRoute` instances.\r\n * Routes are defined once in a central file and referenced everywhere by object, eliminating string-based path typos.\r\n *\r\n * @example\r\n * ```ts\r\n * const USER_DETAIL = new RdtRouteBuilder<{ userId: number }>()\r\n * .withName('User Detail')\r\n * .withPath(':userId')\r\n * .withParam('userId', 'number')\r\n * .withCanBeEntered((route, params) => params.params.userId !== 0)\r\n * .build();\r\n * ```\r\n *\r\n * @typeParam T - Shape of the route's parameters. Enforced at compile time when navigating or creating URLs.\r\n */\r\nexport class RdtRouteBuilder<T extends object = any> extends RdtRouteBase<T> {\r\n get canBeEntered() {\r\n return this._canBeEntered;\r\n }\r\n\r\n get orderedParams() {\r\n return this._orderedParams;\r\n }\r\n\r\n get paramMappings() {\r\n return this._paramMappings;\r\n }\r\n\r\n /**\r\n * CanBeEntered function is synchronous function which\r\n * lets framework hide menu buttons and disable links.\r\n * Function is run in environment injection context, so\r\n * you can inject global services, tokens, etc.\r\n * @param fn\r\n */\r\n withCanBeEntered(fn: RdtCanBeEnteredFn<T>) {\r\n this._canBeEntered = fn;\r\n return this;\r\n }\r\n /**\r\n * @deprecated Use withCanBeEntered() instead.\r\n */\r\n setCanBeEntered(fn: RdtCanBeEnteredFn<T>) {\r\n return this.withCanBeEntered(fn);\r\n }\r\n\r\n /**\r\n * Entry disabled route will generate disabled breadcrumb.\r\n * It should not have any component nor module added to it.\r\n * @param value\r\n * @returns\r\n */\r\n withEntryDisabled(value = true) {\r\n this._entryDisabled = value;\r\n return this;\r\n }\r\n /**\r\n * @deprecated Use withEntryDisabled() instead.\r\n */\r\n setEntryDisabled(value = true) {\r\n return this.withEntryDisabled(value);\r\n }\r\n\r\n /**\r\n * Sets path relative to parent. It is defined the same way as Angular route path including parameters.\r\n * You need to call setParam() for each parameter you use in the path.\r\n */\r\n withPath(path: string) {\r\n this._path = path;\r\n const s = path.split('/');\r\n const params: string[] = [];\r\n s.forEach((part) => {\r\n if (part.includes(':')) {\r\n const param = part.split(':')[1] as keyof T;\r\n if (param) {\r\n params.push(param as string);\r\n if (!this._paramMap[param]) {\r\n this._paramMap[param] = DEFAULT_PARAM_TYPE;\r\n }\r\n }\r\n }\r\n });\r\n this._orderedParams = params;\r\n return this;\r\n }\r\n /**\r\n * @deprecated Use withPath() instead.\r\n */\r\n setPath(path: string) {\r\n return this.withPath(path);\r\n }\r\n\r\n /**\r\n * Sets Angular route data.\r\n * @param data Angular route data object. Breadcrumb key is merged into it.\r\n */\r\n withData(data: Data) {\r\n this._data = data;\r\n return this;\r\n }\r\n /**\r\n * @deprecated Use withData() instead.\r\n */\r\n setData(data: Data) {\r\n return this.withData(data);\r\n }\r\n\r\n /**\r\n * Defines parameter type and lets framework parse it.\r\n * @param paramName Name of the parameter in the path.\r\n * @param type 'string', 'number', or an array of allowed string values (enum).\r\n */\r\n withParam(paramName: keyof T, type: 'string' | 'number' | string[]) {\r\n this._paramMap[paramName] = type;\r\n return this;\r\n }\r\n /**\r\n * @deprecated Use withParam() instead.\r\n */\r\n setParam(paramName: keyof T, type: 'string' | 'number' | string[]) {\r\n return this.withParam(paramName, type);\r\n }\r\n\r\n /**\r\n * Sets name to display in breadcrumb, etc.\r\n */\r\n withName(name: string) {\r\n this._name = name;\r\n return this;\r\n }\r\n /**\r\n * @deprecated Use withName() instead.\r\n */\r\n setName(name: string) {\r\n return this.withName(name);\r\n }\r\n\r\n /**\r\n * Call .build() on children before you call this method!\r\n */\r\n withChildren(...children: RdtRoute[]) {\r\n this._children = children;\r\n return this;\r\n }\r\n /**\r\n * @deprecated Use withChildren() instead.\r\n */\r\n setChildren(...children: RdtRoute[]) {\r\n return this.withChildren(...children);\r\n }\r\n\r\n build() {\r\n if (typeof this._path !== 'string') {\r\n throw new Error(\r\n 'Please provide path for route. Empty string is acceptable.'\r\n );\r\n }\r\n return RdtRoute.fromBuilder(this);\r\n }\r\n}\r\n","import {\r\n DestroyRef,\r\n Directive,\r\n ElementRef,\r\n Input,\r\n OnChanges,\r\n OnInit,\r\n Renderer2,\r\n SimpleChanges,\r\n inject,\r\n} from '@angular/core';\r\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\r\nimport {\r\n IsActiveMatchOptions,\r\n NavigationEnd,\r\n Router,\r\n RouterModule,\r\n} from '@angular/router';\r\nimport { filter } from 'rxjs';\r\n\r\nconst EXACT_TRUE_OPTS: IsActiveMatchOptions = {\r\n paths: 'exact',\r\n queryParams: 'exact',\r\n fragment: 'ignored',\r\n matrixParams: 'ignored',\r\n};\r\n\r\nconst EXACT_FALSE_OPTS: IsActiveMatchOptions = {\r\n paths: 'subset',\r\n queryParams: 'subset',\r\n fragment: 'ignored',\r\n matrixParams: 'ignored',\r\n};\r\n\r\n/**\r\n * Directive that appends class to host if any of the watched routes is active.\r\n */\r\n@Directive({\r\n selector: '[rdtAnyRouteActive]',\r\n standalone: true,\r\n providers: [RouterModule],\r\n})\r\nexport class RdtAnyRouteActiveDirective implements OnInit, OnChanges {\r\n private readonly destroyRef = inject(DestroyRef);\r\n private readonly router = inject(Router);\r\n private readonly renderer = inject(Renderer2);\r\n private readonly elRef: ElementRef<HTMLElement> = inject(ElementRef);\r\n\r\n @Input({ required: true, alias: 'rdtAnyRouteActive' })\r\n set anyRouteActive(data: string[] | string) {\r\n this.classes = this.parseClasses(data);\r\n }\r\n\r\n @Input({ required: true })\r\n watchedRoutes: (string | string[])[] = [];\r\n\r\n @Input()\r\n set anyRouteActiveOptions(value: { exact: boolean } | IsActiveMatchOptions) {\r\n this._anyRouteActiveOptions = this.parseOptions(value);\r\n }\r\n private _anyRouteActiveOptions: IsActiveMatchOptions = EXACT_FALSE_OPTS;\r\n\r\n @Input()\r\n ariaCurrentWhenActive?:\r\n | 'page'\r\n | 'step'\r\n | 'location'\r\n | 'date'\r\n | 'time'\r\n | true\r\n | false;\r\n\r\n get isActive() {\r\n return this._isActive;\r\n }\r\n private _isActive = false;\r\n\r\n private classes: string[] = [];\r\n\r\n ngOnInit() {\r\n this.update();\r\n this.listenRouterEvents();\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n if (changes['anyRouteActive']?.previousValue) {\r\n const prev = this.parseClasses(changes['anyRouteActive'].previousValue);\r\n prev.forEach((c) => this.removeClass(c));\r\n }\r\n\r\n this.update();\r\n }\r\n\r\n update() {\r\n this._isActive = this.watchedRoutes.some((route) => {\r\n const param =\r\n typeof route === 'string' ? route : this.router.createUrlTree(route);\r\n return this.router.isActive(param, this._anyRouteActiveOptions);\r\n });\r\n this.setClasses();\r\n this.setAriaCurrent();\r\n }\r\n\r\n private setAriaCurrent() {\r\n const el = this.elRef.nativeElement;\r\n\r\n if (this._isActive && this.ariaCurrentWhenActive !== undefined) {\r\n const value = this.ariaCurrentWhenActive.toString();\r\n this.renderer.setAttribute(el, 'aria-current', value);\r\n } else {\r\n this.renderer.removeAttribute(el, 'aria-current');\r\n }\r\n }\r\n\r\n private setClasses() {\r\n if (this._isActive) {\r\n this.classes.forEach((c) => this.addClass(c));\r\n } else {\r\n this.classes.forEach((c) => this.removeClass(c));\r\n }\r\n }\r\n\r\n private addClass(className: string) {\r\n this.renderer.addClass(this.elRef.nativeElement, className);\r\n }\r\n\r\n private removeClass(className: string) {\r\n this.renderer.removeClass(this.elRef.nativeElement, className);\r\n }\r\n\r\n private listenRouterEvents() {\r\n this.router.events\r\n .pipe(\r\n filter((ev) => ev instanceof NavigationEnd),\r\n takeUntilDestroyed(this.destroyRef)\r\n )\r\n .subscribe(() => this.update());\r\n }\r\n\r\n private parseClasses(data: string[] | string) {\r\n const classes = Array.isArray(data) ? data : data.split(' ');\r\n return classes.filter((c) => !!c);\r\n }\r\n\r\n private parseOptions(input: { exact: boolean } | IsActiveMatchOptions) {\r\n if ('exact' in input) {\r\n if (input.exact) {\r\n return EXACT_TRUE_OPTS;\r\n } else {\r\n return EXACT_FALSE_OPTS;\r\n }\r\n } else {\r\n return input;\r\n }\r\n }\r\n}\r\n","import { Location } from '@angular/common';\nimport {\n afterNextRender,\n DestroyRef,\n Directive,\n ElementRef,\n inject,\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { RDT_BUTTON_BASE_PROVIDER } from '@ngrdt/button';\nimport { fromEvent } from 'rxjs';\n\n@Directive({\n selector: '[rdtBackLink]',\n})\nexport class RdtBackLinkDirective {\n readonly destroyRef = inject(DestroyRef);\n private readonly location = inject(Location);\n private readonly elRef = inject(ElementRef<HTMLElement>);\n private readonly buttonClass = inject(RDT_BUTTON_BASE_PROVIDER);\n private readonly buttonRef = inject(this.buttonClass, {\n optional: true,\n host: true,\n });\n\n constructor() {\n afterNextRender(() => {\n if (this.buttonRef) {\n this.buttonRef.click.subscribe(() => this.location.back());\n } else {\n fromEvent(this.elRef.nativeElement, 'click')\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe(() => this.location.back());\n }\n });\n }\n}\n","import {\r\n booleanAttribute,\r\n computed,\r\n Directive,\r\n effect,\r\n EnvironmentInjector,\r\n inject,\r\n input,\r\n linkedSignal,\r\n} from '@angular/core';\r\nimport { Params, RouterLink } from '@angular/router';\r\nimport { RDT_BUTTON_BASE_PROVIDER } from '@ngrdt/button';\r\nimport { RdtRoute } from '../rdt-route/rdt-route';\r\n\r\nexport const PERMISSION_DISABLED_KEY = Symbol();\r\n\r\n@Directive({\r\n selector: '[rdtRouterLink]',\r\n standalone: true,\r\n hostDirectives: [\r\n {\r\n directive: RouterLink,\r\n inputs: ['target', 'replaceUrl'],\r\n },\r\n ],\r\n})\r\nexport class RdtRouterLinkDirective<T extends object> {\r\n private readonly buttonClass = inject(RDT_BUTTON_BASE_PROVIDER);\r\n private readonly buttonRef = inject(this.buttonClass, {\r\n host: true,\r\n optional: true,\r\n });\r\n private readonly routerLinkRef = inject(RouterLink, { self: true });\r\n private readonly envInjector = inject(EnvironmentInjector);\r\n\r\n readonly routeInput = input.required<RdtRoute<T>>({ alias: 'rdtRouterLink' });\r\n readonly route = linkedSignal<RdtRoute<T> | null>(() => this.routeInput());\r\n readonly target = input<'_blank' | '_self' | '_parent' | '_top'>('_self');\r\n readonly params = input<Partial<T> | undefined>();\r\n readonly queryParams = input<Params | undefined>();\r\n readonly stateParams = input<Params | undefined>();\r\n readonly disabled = input(false, {\r\n alias: 'rdtDisabled',\r\n transform: booleanAttribute,\r\n });\r\n\r\n readonly canBeEntered = computed(() => {\r\n const route = this.route();\r\n const disabled = this.disabled();\r\n if (!route || disabled) {\r\n return false;\r\n }\r\n const combinedParams = {\r\n params: this.params(),\r\n query: this.queryParams(),\r\n state: this.stateParams(),\r\n };\r\n\r\n return route.canBeEntered(this.envInjector, combinedParams);\r\n });\r\n\r\n protected readonly updateEffect = effect(() => {\r\n if (this.buttonRef) {\r\n this.updateButton();\r\n } else {\r\n this.updateRouterLink();\r\n }\r\n });\r\n\r\n private updateButton() {\r\n const route = this.route();\r\n if (!route) {\r\n this.clearButtonLink();\r\n return;\r\n }\r\n if (this.canBeEntered()) {\r\n this.setButtonLink(route);\r\n } else {\r\n this.disableButtonLink();\r\n }\r\n }\r\n\r\n private setButtonLink(route: RdtRoute<T>) {\r\n const button = this.buttonRef!;\r\n try {\r\n const ngHref = this.getNgHref(route);\r\n button.ngHref.set(ngHref);\r\n button.stateParams.set(this.stateParams() ?? route.stateParams);\r\n button.queryParams.set(this.queryParams() ?? route.queryParams);\r\n button.setDisabledState(false, PERMISSION_DISABLED_KEY);\r\n } catch (err) {\r\n console.error(err);\r\n this.disableButtonLink();\r\n }\r\n }\r\n\r\n private disableButtonLink() {\r\n const button = this.buttonRef!;\r\n button.ngHref.set(null);\r\n button.setDisabledState(true, PERMISSION_DISABLED_KEY);\r\n }\r\n\r\n private clearButtonLink() {\r\n const button = this.buttonRef!;\r\n button.ngHref.set(null);\r\n button.stateParams.set(undefined);\r\n button.queryParams.set(undefined);\r\n button.setDisabledState(false, PERMISSION_DISABLED_KEY);\r\n }\r\n\r\n private updateRouterLink() {\r\n const route = this.route();\r\n if (!route) {\r\n this.clearRouterLink();\r\n } else if (this.canBeEntered()) {\r\n this.setRouterLink(route);\r\n } else {\r\n this.disableRouterLink();\r\n }\r\n }\r\n\r\n private setRouterLink(route: RdtRoute<T>) {\r\n try {\r\n const ngHref = this.getNgHref(route);\r\n this.routerLinkRef.routerLink = ngHref;\r\n this.routerLinkRef.state = this.stateParams() ?? route.stateParams;\r\n this.routerLinkRef.queryParams = this.queryParams() ?? route.queryParams;\r\n this.routerLinkRef.ngOnChanges({});\r\n } catch (err) {\r\n console.error(err);\r\n this.disableRouterLink();\r\n }\r\n }\r\n\r\n private disableRouterLink() {\r\n this.routerLinkRef.routerLink = null;\r\n this.routerLinkRef.ngOnChanges({});\r\n }\r\n\r\n private clearRouterLink() {\r\n this.routerLinkRef.routerLink = null;\r\n this.routerLinkRef.state = undefined;\r\n this.routerLinkRef.queryParams = undefined;\r\n this.routerLinkRef.ngOnChanges({});\r\n }\r\n\r\n private getNgHref(route: RdtRoute<T>) {\r\n return route.createAbsoluteUrl(this.params());\r\n }\r\n}\r\n","import { CanDeactivateFn } from '@angular/router';\r\nimport { RdtGuardedContainer } from '@ngrdt/core';\r\n\r\n/**\r\n * `CanDeactivate` guard that blocks navigation when there are unsaved changes.\r\n * The routed component must implement `RdtGuardedContainer` from `@ngrdt/core`.\r\n * Add to routes via `RdtAngularRoute.addCanDeactivate(preventDataLossGuardFn)`.\r\n */\r\nexport const preventDataLossGuardFn: CanDeactivateFn<RdtGuardedContainer> = (component) => {\r\n if (!component.guardRegistry.hasLeaveBlockers()) return true;\r\n return component.guardRegistry.canLeaveAll();\r\n};\r\n","import { Injectable } from '@angular/core';\r\nimport {\r\n ActivatedRouteSnapshot,\r\n GuardsCheckStart,\r\n NavigationEnd,\r\n Route,\r\n Router,\r\n} from '@angular/router';\r\nimport { preventDataLossGuardFn } from './prevent-data-loss.guard';\r\n\r\n/**\r\n * Ensures that `preventDataLossGuardFn` is applied to every route at runtime,\r\n * even if it was not explicitly added in the route definition.\r\n * Call `ensureGlobalGuards()` once during app initialization.\r\n *\r\n * Also patches the browser back button behavior: replaces the URL back to the\r\n * previous value during guard checks so the address bar doesn't flash the new URL\r\n * before the guard potentially rejects it.\r\n */\r\n@Injectable({ providedIn: 'root' })\r\nexport class GlobalRouteGuardService {\r\n constructor(private router: Router) {}\r\n\r\n public ensureGlobalGuards() {\r\n let lastUrl = '';\r\n\r\n this.router.events.subscribe((e) => {\r\n // Remember last url after successful navigation\r\n if (e instanceof NavigationEnd) {\r\n lastUrl = location.href;\r\n }\r\n if (e instanceof GuardsCheckStart) {\r\n let lastChild: ActivatedRouteSnapshot = e.state.root;\r\n while (lastChild?.firstChild) {\r\n lastChild = lastChild.firstChild;\r\n }\r\n // Native back button will immediately replace url on click\r\n // Replace it back to last url before guard check is finished.\r\n // Angular will set it to correct value afterwards.\r\n history.replaceState(window.history.state, '', lastUrl);\r\n\r\n if (lastChild?.routeConfig) {\r\n this.ensureCanDeactivateGuards(lastChild.routeConfig);\r\n }\r\n }\r\n });\r\n }\r\n\r\n private ensureCanDeactivateGuards(routeConfig: Route) {\r\n if (!routeConfig.canDeactivate) {\r\n routeConfig.canDeactivate = [];\r\n }\r\n\r\n const canDeactivateGuards = routeConfig.canDeactivate;\r\n\r\n // ensure that the \"MySpecialCanDeactivateGuard\" is in effect.\r\n if (!canDeactivateGuards.find((o) => o == preventDataLossGuardFn)) {\r\n canDeactivateGuards.push(preventDataLossGuardFn);\r\n }\r\n }\r\n}\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|