@meshmakers/shared-services 3.4.980 → 3.4.1000
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.
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import * as i0 from '@angular/core';
|
|
2
2
|
import { inject, Injectable, InjectionToken, ErrorHandler, makeEnvironmentProviders } from '@angular/core';
|
|
3
|
-
import { ActivatedRoute, Router, NavigationEnd } from '@angular/router';
|
|
3
|
+
import { ActivatedRoute, Router, NavigationEnd, NavigationCancel, NavigationError } from '@angular/router';
|
|
4
4
|
import { BehaviorSubject, Subject, firstValueFrom, throwError } from 'rxjs';
|
|
5
5
|
import { filter, retry, catchError } from 'rxjs/operators';
|
|
6
6
|
|
|
@@ -129,6 +129,9 @@ class CommandService extends CommandBaseService {
|
|
|
129
129
|
options = inject(CommandOptions);
|
|
130
130
|
_drawerItems = new BehaviorSubject([]);
|
|
131
131
|
_commandsMap = new Map();
|
|
132
|
+
_builtItems = [];
|
|
133
|
+
_selectedId = null;
|
|
134
|
+
_routerEventsSubscription = null;
|
|
132
135
|
// noinspection JSUnusedLocalSymbols
|
|
133
136
|
constructor() {
|
|
134
137
|
const router = inject(Router);
|
|
@@ -138,9 +141,17 @@ class CommandService extends CommandBaseService {
|
|
|
138
141
|
// noinspection JSUnusedGlobalSymbols
|
|
139
142
|
async initialize() {
|
|
140
143
|
const items = new Array();
|
|
144
|
+
this._commandsMap.clear();
|
|
141
145
|
const commandItems = this.commandSettingsService.commandItems;
|
|
142
146
|
await this.createDrawerItems(commandItems, items, null);
|
|
143
|
-
this.
|
|
147
|
+
this._builtItems = items;
|
|
148
|
+
this._selectedId = await this.computeSelectedId(this.router.url);
|
|
149
|
+
this._drawerItems.next(this.applySelection());
|
|
150
|
+
this.subscribeToRouterEvents();
|
|
151
|
+
}
|
|
152
|
+
ngOnDestroy() {
|
|
153
|
+
this._routerEventsSubscription?.unsubscribe();
|
|
154
|
+
this._routerEventsSubscription = null;
|
|
144
155
|
}
|
|
145
156
|
async createDrawerItems(commandItems, items, parentId, depth = 0) {
|
|
146
157
|
for (const commandItem of commandItems) {
|
|
@@ -173,6 +184,107 @@ class CommandService extends CommandBaseService {
|
|
|
173
184
|
}
|
|
174
185
|
}
|
|
175
186
|
}
|
|
187
|
+
/*
|
|
188
|
+
* The drawer items are built once, but the drawer's visual selection must
|
|
189
|
+
* follow every navigation — not only drawer clicks: breadcrumbs, in-page
|
|
190
|
+
* links, redirects, deep links and the browser history all change the route
|
|
191
|
+
* without going through setSelectedDrawerItem. NavigationCancel/-Error are
|
|
192
|
+
* included so a click whose navigation a guard rejects snaps the highlight
|
|
193
|
+
* back to the page that is actually shown.
|
|
194
|
+
*/
|
|
195
|
+
subscribeToRouterEvents() {
|
|
196
|
+
if (this._routerEventsSubscription !== null) {
|
|
197
|
+
return;
|
|
198
|
+
}
|
|
199
|
+
this._routerEventsSubscription = this.router.events
|
|
200
|
+
.pipe(filter(event => event instanceof NavigationEnd ||
|
|
201
|
+
event instanceof NavigationCancel ||
|
|
202
|
+
event instanceof NavigationError))
|
|
203
|
+
.subscribe(() => {
|
|
204
|
+
void this.updateSelectionFromUrl();
|
|
205
|
+
});
|
|
206
|
+
}
|
|
207
|
+
async updateSelectionFromUrl() {
|
|
208
|
+
const url = this.router.url;
|
|
209
|
+
const selectedId = await this.computeSelectedId(url);
|
|
210
|
+
if (url !== this.router.url) {
|
|
211
|
+
// A newer navigation finished while the links resolved; its own
|
|
212
|
+
// router event triggers the update for the final URL.
|
|
213
|
+
return;
|
|
214
|
+
}
|
|
215
|
+
if (selectedId === this._selectedId) {
|
|
216
|
+
return;
|
|
217
|
+
}
|
|
218
|
+
this._selectedId = selectedId;
|
|
219
|
+
this._drawerItems.next(this.applySelection());
|
|
220
|
+
}
|
|
221
|
+
/*
|
|
222
|
+
* The longest matching link prefix wins, so a child route (documents/4711)
|
|
223
|
+
* keeps its list entry (documents) highlighted. A link that only points at
|
|
224
|
+
* the navigation base (a home entry like './') would be a prefix of every
|
|
225
|
+
* URL, so it must match exactly — it wins on the base URL itself and never
|
|
226
|
+
* steals the highlight from pages without their own drawer entry.
|
|
227
|
+
*/
|
|
228
|
+
async computeSelectedId(url) {
|
|
229
|
+
const currentSegments = CommandService.urlToSegments(url);
|
|
230
|
+
const baseSegments = this.baseRouteSegments();
|
|
231
|
+
let bestId = null;
|
|
232
|
+
let bestLength = -1;
|
|
233
|
+
for (const [id, commandItem] of this._commandsMap) {
|
|
234
|
+
const link = await CommandBaseService.getLink(commandItem);
|
|
235
|
+
if (link === null) {
|
|
236
|
+
continue;
|
|
237
|
+
}
|
|
238
|
+
const segments = CommandService.resolveLinkSegments(link, baseSegments);
|
|
239
|
+
const requiresExactMatch = segments.length <= baseSegments.length;
|
|
240
|
+
if (requiresExactMatch && segments.length !== currentSegments.length) {
|
|
241
|
+
continue;
|
|
242
|
+
}
|
|
243
|
+
if (segments.length > currentSegments.length || segments.length <= bestLength) {
|
|
244
|
+
continue;
|
|
245
|
+
}
|
|
246
|
+
if (segments.every((segment, index) => segment === currentSegments[index])) {
|
|
247
|
+
bestId = id;
|
|
248
|
+
bestLength = segments.length;
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
return bestId;
|
|
252
|
+
}
|
|
253
|
+
/*
|
|
254
|
+
* Command links navigate relative to navigateRelativeToRoute (see
|
|
255
|
+
* CommandBaseService.navigateAsync), so their absolute segments are that
|
|
256
|
+
* route's path plus the link — mirroring what router.navigate resolves.
|
|
257
|
+
*/
|
|
258
|
+
baseRouteSegments() {
|
|
259
|
+
return (this.commandSettingsService.navigateRelativeToRoute?.snapshot?.pathFromRoot ?? [])
|
|
260
|
+
.flatMap(route => route.url.map(segment => segment.path));
|
|
261
|
+
}
|
|
262
|
+
static resolveLinkSegments(link, baseSegments) {
|
|
263
|
+
const segments = link.startsWith('/') ? [] : [...baseSegments];
|
|
264
|
+
for (const part of link.split('/')) {
|
|
265
|
+
if (part === '' || part === '.') {
|
|
266
|
+
continue;
|
|
267
|
+
}
|
|
268
|
+
if (part === '..') {
|
|
269
|
+
segments.pop();
|
|
270
|
+
continue;
|
|
271
|
+
}
|
|
272
|
+
segments.push(part);
|
|
273
|
+
}
|
|
274
|
+
return segments;
|
|
275
|
+
}
|
|
276
|
+
applySelection() {
|
|
277
|
+
return this._builtItems.map(item => item.separator === true
|
|
278
|
+
? item
|
|
279
|
+
: { ...item, selected: item.id === this._selectedId });
|
|
280
|
+
}
|
|
281
|
+
static urlToSegments(url) {
|
|
282
|
+
const path = url.split('#')[0].split('?')[0];
|
|
283
|
+
return path
|
|
284
|
+
.split('/')
|
|
285
|
+
.map(segment => decodeURIComponent(segment.split(';')[0]))
|
|
286
|
+
.filter(segment => segment.length > 0);
|
|
287
|
+
}
|
|
176
288
|
// noinspection JSUnusedGlobalSymbols
|
|
177
289
|
get drawerItems() {
|
|
178
290
|
return this._drawerItems;
|
|
@@ -561,48 +673,91 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
|
|
|
561
673
|
* ```
|
|
562
674
|
*/
|
|
563
675
|
const ON_CONNECTION_LOST = new InjectionToken('ON_CONNECTION_LOST');
|
|
676
|
+
/**
|
|
677
|
+
* Structural check instead of `instanceof HttpErrorResponse` on purpose: a host that compiles this
|
|
678
|
+
* library from source next to its own `@angular/common` copy (the Studio's Karma run does) sees
|
|
679
|
+
* two class identities, and `instanceof` would silently answer `false` there.
|
|
680
|
+
*/
|
|
681
|
+
function isHttpErrorResponse(error) {
|
|
682
|
+
return typeof error === 'object'
|
|
683
|
+
&& error !== null
|
|
684
|
+
&& error.name === 'HttpErrorResponse'
|
|
685
|
+
&& typeof error.status === 'number';
|
|
686
|
+
}
|
|
564
687
|
class MmHttpErrorInterceptor {
|
|
565
688
|
messageService = inject(MessageService);
|
|
566
689
|
onConnectionLost = inject(ON_CONNECTION_LOST, { optional: true });
|
|
690
|
+
/**
|
|
691
|
+
* Whether the interceptor itself reports this error to the user — as a toast or through the
|
|
692
|
+
* `ON_CONNECTION_LOST` handler. A caller that catches a failed request and shows its own message
|
|
693
|
+
* must skip that message when this returns `true`, otherwise the user sees the same reason twice
|
|
694
|
+
* (once from the interceptor, once from the page — which is what the 409 of the capability
|
|
695
|
+
* disable guards produced, AB#4255). Mirrors exactly the branches `intercept` acts on; anything
|
|
696
|
+
* that is not an `HttpErrorResponse` is never reported here.
|
|
697
|
+
*/
|
|
698
|
+
static reportsToUser(error) {
|
|
699
|
+
return isHttpErrorResponse(error)
|
|
700
|
+
&& MmHttpErrorInterceptor.classify(error, error.url) !== null;
|
|
701
|
+
}
|
|
567
702
|
intercept(request, next) {
|
|
568
703
|
return next.handle(request).pipe(retry(0), catchError((error) => {
|
|
569
|
-
|
|
570
|
-
|
|
571
|
-
if (!isHealthCheck) {
|
|
704
|
+
switch (MmHttpErrorInterceptor.classify(error, request.url)) {
|
|
705
|
+
case 'connection-lost':
|
|
572
706
|
if (this.onConnectionLost) {
|
|
573
707
|
this.onConnectionLost();
|
|
574
708
|
}
|
|
575
709
|
else {
|
|
576
710
|
this.messageService.showError('OctoMesh backend is not reachable. Please check if your network connection is working or contact your Administrator.');
|
|
577
711
|
}
|
|
578
|
-
|
|
579
|
-
|
|
580
|
-
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
|
|
588
|
-
|
|
589
|
-
|
|
590
|
-
if (apiError.details && apiError.details.length > 0) {
|
|
591
|
-
for (const detail of apiError.details) {
|
|
592
|
-
if (detail.description) {
|
|
593
|
-
details += `\n✗ ${detail.description}`;
|
|
712
|
+
break;
|
|
713
|
+
case 'access-denied':
|
|
714
|
+
this.messageService.showError('Access denied. You do not have permission to access this tenant or resource.');
|
|
715
|
+
break;
|
|
716
|
+
case 'api-error': {
|
|
717
|
+
const apiError = error.error;
|
|
718
|
+
let details = '';
|
|
719
|
+
if (apiError.details && apiError.details.length > 0) {
|
|
720
|
+
for (const detail of apiError.details) {
|
|
721
|
+
if (detail.description) {
|
|
722
|
+
details += `\n✗ ${detail.description}`;
|
|
723
|
+
}
|
|
594
724
|
}
|
|
595
725
|
}
|
|
726
|
+
// Argument order is (message, details): the first argument becomes the toast headline,
|
|
727
|
+
// the second the expandable details. Passing them swapped rendered an empty headline
|
|
728
|
+
// whenever the body carried no details list — which is every OperationFailedErrorDto,
|
|
729
|
+
// so a rejected tenant create showed a blank error toast (AB#4762).
|
|
730
|
+
// A 400 body is classified on its statusCode alone, so it may carry no message; fall back
|
|
731
|
+
// to a generic headline rather than rendering "undefined" (the details still follow).
|
|
732
|
+
this.messageService.showErrorWithDetails(apiError.message || 'The request was rejected by the server.', details);
|
|
733
|
+
break;
|
|
596
734
|
}
|
|
597
|
-
// Argument order is (message, details): the first argument becomes the toast headline,
|
|
598
|
-
// the second the expandable details. Passing them swapped rendered an empty headline
|
|
599
|
-
// whenever the body carried no details list — which is every OperationFailedErrorDto,
|
|
600
|
-
// so a rejected tenant create showed a blank error toast (AB#4762).
|
|
601
|
-
this.messageService.showErrorWithDetails(apiError.message, details);
|
|
602
735
|
}
|
|
603
736
|
return throwError(() => error);
|
|
604
737
|
}));
|
|
605
738
|
}
|
|
739
|
+
/**
|
|
740
|
+
* The single place that decides which failed responses the interceptor reports. `intercept`
|
|
741
|
+
* passes the request URL (the health-check exemption is keyed on it); `reportsToUser` only has
|
|
742
|
+
* the response and uses its URL instead.
|
|
743
|
+
*/
|
|
744
|
+
static classify(error, requestUrl) {
|
|
745
|
+
if (error.status === 0) {
|
|
746
|
+
const isHealthCheck = requestUrl?.endsWith('/health') ?? false;
|
|
747
|
+
return isHealthCheck ? null : 'connection-lost';
|
|
748
|
+
}
|
|
749
|
+
if (error.status === 403) {
|
|
750
|
+
return 'access-denied';
|
|
751
|
+
}
|
|
752
|
+
// 409 is matched on the message alone: OperationFailedErrorDto hardcodes a BadRequest
|
|
753
|
+
// statusCode into its body, so a conflict response carries statusCode 400 and would never
|
|
754
|
+
// satisfy the check below. Without this branch a 409 is shown to the user as nothing at all
|
|
755
|
+
// (AB#4762).
|
|
756
|
+
if ((error.status === 400 && error.error?.statusCode) || (error.status === 409 && error.error?.message)) {
|
|
757
|
+
return 'api-error';
|
|
758
|
+
}
|
|
759
|
+
return null;
|
|
760
|
+
}
|
|
606
761
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: MmHttpErrorInterceptor, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
607
762
|
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: MmHttpErrorInterceptor });
|
|
608
763
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"meshmakers-shared-services.mjs","sources":["../../../../projects/meshmakers/shared-services/src/lib/options/commandOptions.ts","../../../../projects/meshmakers/shared-services/src/lib/services/command-settings.service.ts","../../../../projects/meshmakers/shared-services/src/lib/services/command-base.service.ts","../../../../projects/meshmakers/shared-services/src/lib/services/command.service.ts","../../../../projects/meshmakers/shared-services/src/lib/services/error-message.utils.ts","../../../../projects/meshmakers/shared-services/src/lib/services/message.service.ts","../../../../projects/meshmakers/shared-services/src/lib/services/component-menu.service.ts","../../../../projects/meshmakers/shared-services/src/lib/services/bread-crumb.service.ts","../../../../projects/meshmakers/shared-services/src/lib/services/app-title.service.ts","../../../../projects/meshmakers/shared-services/src/lib/shared/mm-http-error-interceptor.service.ts","../../../../projects/meshmakers/shared-services/src/lib/models/breadCrumbData.ts","../../../../projects/meshmakers/shared-services/src/lib/models/pagedResultDto.ts","../../../../projects/meshmakers/shared-services/src/lib/models/treeItemData.ts","../../../../projects/meshmakers/shared-services/src/lib/shared/stale-chunk-error-handler.ts","../../../../projects/meshmakers/shared-services/src/lib/compat/data-source-base.ts","../../../../projects/meshmakers/shared-services/src/lib/compat/iso-date-time.ts","../../../../projects/meshmakers/shared-services/src/lib/compat/qr-code-scanner.service.ts","../../../../projects/meshmakers/shared-services/src/lib/compat/error-message.ts","../../../../projects/meshmakers/shared-services/src/lib/compat/auto-complete-data-source.ts","../../../../projects/meshmakers/shared-services/src/public-api.ts","../../../../projects/meshmakers/shared-services/src/meshmakers-shared-services.ts"],"sourcesContent":["\nexport class CommandOptions{\n\n}\n","import {inject, Injectable} from '@angular/core';\nimport {CommandItem} from '../models/commandItem';\nimport {ActivatedRoute} from '@angular/router';\n\n@Injectable()\nexport class CommandSettingsService {\n\n private readonly _activatedRoute: ActivatedRoute;\n\n constructor() {\n this._activatedRoute = inject(ActivatedRoute);\n }\n\n public get navigateRelativeToRoute() : ActivatedRoute{\n return this._activatedRoute;\n }\n\n public get commandItems(): CommandItem[] {\n return [];\n }\n}\n","import {CommandSettingsService} from './command-settings.service';\nimport {CommandItem} from '../models/commandItem';\nimport {Router} from '@angular/router';\n\nexport abstract class CommandBaseService {\n\n protected constructor(protected readonly commandSettingsService: CommandSettingsService, private readonly router: Router) {\n }\n\n protected async navigateAsync(commandItem: CommandItem, data?: unknown): Promise<void> {\n\n console.debug('navigateAsync', commandItem);\n const hrefUri = await CommandBaseService.getHref(commandItem, data);\n const link = await CommandBaseService.getLink(commandItem, data);\n if (hrefUri) {\n window.open(hrefUri, commandItem.target ?? \"_blank\");\n } else if (link) {\n\n await this.router.navigate([link], {\n relativeTo: this.commandSettingsService.navigateRelativeToRoute\n });\n } else if (commandItem.onClick) {\n await CommandBaseService.executeClickEvent(commandItem, data);\n } else {\n console.debug('navigateAsync', 'no href or link');\n }\n }\n\n static getIsVisibleSync(commandItem: CommandItem, data?: unknown): boolean {\n if (commandItem.isVisible !== undefined) {\n if (typeof commandItem.isVisible === 'boolean') {\n return commandItem.isVisible;\n } else if (typeof commandItem.isVisible === 'function') {\n const result = commandItem.isVisible(data);\n if (result instanceof Promise) {\n return true;\n }\n return result;\n }\n }\n return true;\n }\n\n protected static async getIsVisible(commandItem: CommandItem): Promise<boolean> {\n if (commandItem.isVisible !== undefined) {\n if (typeof commandItem.isVisible === 'boolean') {\n return commandItem.isVisible;\n } else if (typeof commandItem.isVisible === 'function') {\n return await commandItem.isVisible();\n }\n }\n return true;\n }\n\n protected static getIsDisabled(commandItem: CommandItem, data?: unknown): boolean {\n if (commandItem.isDisabled !== undefined) {\n if (typeof commandItem.isDisabled === 'boolean') {\n return commandItem.isDisabled;\n } else if (typeof commandItem.isDisabled === 'function') {\n return commandItem.isDisabled(data);\n }\n }\n return false;\n }\n\n private static async getLink(commandItem: CommandItem, data?: unknown): Promise<string | null> {\n if (commandItem.link !== undefined) {\n if (typeof commandItem.link === 'string') {\n return CommandBaseService.interpolateString(commandItem.link, data);\n } else if (typeof commandItem.link === 'function') {\n return CommandBaseService.interpolateString(await commandItem.link({commandItem, data}), data);\n }\n }\n return null;\n }\n\n private static async getHref(commandItem: CommandItem, data?: unknown): Promise<string | null> {\n if (commandItem.href !== undefined) {\n if (typeof commandItem.href === 'string') {\n return CommandBaseService.interpolateString(commandItem.href, data);\n } else if (typeof commandItem.href === 'function') {\n return CommandBaseService.interpolateString(await commandItem.href({commandItem, data}), data);\n }\n }\n return null;\n }\n\n\n private static async executeClickEvent(commandItem: CommandItem, data?: unknown): Promise<void> {\n if (commandItem.onClick !== undefined) {\n return await commandItem.onClick({commandItem, data});\n }\n }\n\n private static interpolateString(template: string | null, data?: unknown): string | null {\n return template?.replace(/{{\\s*(\\w+)\\s*}}/g, (match, propName: string) => {\n if (data && typeof data === 'object' && propName in data) {\n return String((data as Record<string, unknown>)[propName]);\n }\n return match;\n }) ?? null;\n }\n}\n","import {CommandOptions} from '../options/commandOptions';\nimport {BehaviorSubject, Observable} from 'rxjs';\nimport { Injectable, inject } from '@angular/core';\nimport {DrawerItem} from '@progress/kendo-angular-layout';\nimport {CommandItem} from '../models/commandItem';\nimport {Router} from '@angular/router';\nimport {CommandSettingsService} from './command-settings.service';\nimport {CommandBaseService} from './command-base.service';\n\n@Injectable()\nexport class CommandService extends CommandBaseService {\n private readonly options = inject(CommandOptions);\n\n\n private readonly _drawerItems: BehaviorSubject<DrawerItem[]> = new BehaviorSubject<DrawerItem[]>([]);\n private readonly _commandsMap: Map<string, CommandItem> = new Map<string, CommandItem>();\n\n // noinspection JSUnusedLocalSymbols\n constructor() {\n const router = inject(Router);\n const commandSettingsService = inject(CommandSettingsService);\n\n super(commandSettingsService, router);\n }\n\n // noinspection JSUnusedGlobalSymbols\n public async initialize(): Promise<void> {\n const items = new Array<DrawerItem>();\n\n const commandItems = this.commandSettingsService.commandItems;\n await this.createDrawerItems(commandItems, items, null);\n\n this._drawerItems.next(items);\n }\n\n private async createDrawerItems(\n commandItems: CommandItem[],\n items: DrawerItem[],\n parentId: string | null,\n depth = 0,\n ) {\n for (const commandItem of commandItems) {\n const visible = await CommandBaseService.getIsVisible(commandItem);\n\n if (!visible) {\n continue;\n }\n\n const hierarchyClass = `mm-drawer-level-${depth}`;\n\n if (commandItem.type === 'separator') {\n items.push({\n id: commandItem.id,\n parentId: parentId ?? undefined,\n separator: true,\n cssClass: hierarchyClass\n });\n } else {\n items.push({\n id: commandItem.id,\n parentId: parentId ?? undefined,\n text: commandItem.text,\n selected: commandItem.selected,\n svgIcon: commandItem.svgIcon,\n cssClass: hierarchyClass\n });\n\n if (commandItem.children) {\n await this.createDrawerItems(commandItem.children, items, commandItem.id, depth + 1);\n }\n this._commandsMap.set(commandItem.id, commandItem);\n }\n }\n }\n\n\n\n // noinspection JSUnusedGlobalSymbols\n public get drawerItems(): Observable<DrawerItem[]> {\n return this._drawerItems;\n }\n\n // noinspection JSUnusedGlobalSymbols\n public async setSelectedDrawerItem(value: DrawerItem): Promise<void> {\n console.debug('setSelectedDrawerItem', value);\n\n if (typeof value.id !== \"string\") {\n return;\n }\n const commandItem = this._commandsMap.get(value.id);\n\n if (commandItem === undefined) {\n return;\n }\n await this.navigateAsync(commandItem);\n }\n}\n\n\n","/**\n * Transforms known backend error messages into user-friendly messages.\n * Returns null if the error message is not recognized and should be displayed as-is.\n */\nexport function transformErrorMessage(message: string): { userMessage: string; technicalDetails: string } | null {\n if (!message) return null;\n\n // MongoDB E11000 duplicate key error\n if (message.includes('E11000 duplicate key')) {\n return {\n userMessage: 'An entity with this ID already exists. If you are importing data, try using the \"Upsert\" strategy instead of \"Insert Only\".',\n technicalDetails: message\n };\n }\n\n return null;\n}\n","import {Injectable} from '@angular/core';\nimport {BehaviorSubject, Observable, Subject} from 'rxjs';\nimport {NotificationMessage} from '../models/notification-message';\nimport {transformErrorMessage} from './error-message.utils';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class MessageService {\n latestErrorMessage: BehaviorSubject<NotificationMessage | null>;\n errorMessages: NotificationMessage[];\n\n // New message stream for all message types\n private readonly messageSubject = new Subject<NotificationMessage>();\n public readonly messages$ = this.messageSubject.asObservable();\n\n constructor() {\n this.latestErrorMessage = new BehaviorSubject<NotificationMessage | null>(null);\n this.errorMessages = new Array<NotificationMessage>();\n }\n\n getErrorMessageCount(): number {\n return this.errorMessages.length;\n }\n\n getErrorMessage(index: number): NotificationMessage {\n return this.errorMessages[index];\n }\n\n getLatestErrorMessage(): Observable<NotificationMessage | null> {\n return this.latestErrorMessage.asObservable();\n }\n\n showErrorWithDetails(message: string, details: string): void {\n console.error(`${details}: ${message}`);\n\n const transformed = transformErrorMessage(message);\n const displayMessage = transformed ? transformed.userMessage : message;\n const displayDetails = transformed\n ? (details ? `${details}\\n\\n${transformed.technicalDetails}` : transformed.technicalDetails)\n : details;\n\n const notificationMessage = {\n level: \"error\",\n details: displayDetails,\n message: displayMessage,\n timestamp: new Date()\n } as NotificationMessage;\n this.errorMessages.push(notificationMessage);\n\n this.latestErrorMessage.next(notificationMessage);\n\n // Emit to the new message stream\n this.messageSubject.next(notificationMessage);\n }\n\n showError(message: string): void {\n console.error(message);\n\n const transformed = transformErrorMessage(message);\n const displayMessage = transformed ? transformed.userMessage : message;\n const displayDetails = transformed ? transformed.technicalDetails : undefined;\n\n const notificationMessage = {\n level: \"error\",\n message: displayMessage,\n details: displayDetails,\n timestamp: new Date()\n } as NotificationMessage;\n this.errorMessages.push(notificationMessage);\n\n this.latestErrorMessage.next(notificationMessage);\n\n // Emit to the new message stream\n this.messageSubject.next(notificationMessage);\n }\n\n showInformation(message: string): void {\n console.log(message);\n\n // Emit to the new message stream\n this.messageSubject.next({\n level: 'info',\n message,\n timestamp: new Date()\n });\n }\n\n showSuccess(message: string): void {\n console.log(message);\n\n // Emit to the new message stream\n this.messageSubject.next({\n level: 'success',\n message,\n timestamp: new Date()\n });\n }\n\n showWarning(message: string): void {\n console.warn(message);\n\n // Emit to the new message stream\n this.messageSubject.next({\n level: 'warning',\n message: message,\n timestamp: new Date()\n });\n }\n\n showWarningWithDetails(message: string, details: string): void {\n console.warn(`${message}: ${details}`);\n\n // Emit to the new message stream\n this.messageSubject.next({\n level: 'warning',\n details: details,\n message: message,\n timestamp: new Date()\n });\n }\n}\n","import { Injectable, inject } from '@angular/core';\nimport {BehaviorSubject, Observable} from 'rxjs';\nimport {MenuItem} from '@progress/kendo-angular-menu';\nimport {CommandItem} from '../models/commandItem';\nimport {ActivatedRoute, NavigationEnd, Router} from '@angular/router';\nimport {filter} from 'rxjs/operators';\nimport {CommandSettingsService} from './command-settings.service';\nimport {CommandBaseService} from './command-base.service';\n\n@Injectable()\nexport class ComponentMenuService extends CommandBaseService {\n private readonly activatedRoute = inject(ActivatedRoute);\n\n\n private readonly _menuItems: BehaviorSubject<MenuItem[]> = new BehaviorSubject<MenuItem[]>([]);\n\n constructor() {\n const commandSettingsService = inject(CommandSettingsService);\n const router = inject(Router);\n\n\n super(commandSettingsService, router);\n\n router.events\n .pipe(filter(event => event instanceof NavigationEnd))\n .subscribe(() => {\n this._menuItems.next(this.createNavigationMenu(this.activatedRoute.root));\n });\n\n this._menuItems.next(this.createNavigationMenu(this.activatedRoute.root));\n }\n\n // noinspection JSUnusedGlobalSymbols\n public get menuItems(): Observable<MenuItem[]> {\n return this._menuItems;\n }\n\n private createNavigationMenu(route: ActivatedRoute, path: MenuItem[] = []): MenuItem[] {\n const children = route.children;\n\n for (const child of children) {\n\n const commandItems: CommandItem[] = child.snapshot.data['navigationMenu'];\n if (commandItems) {\n\n path.push(...this.buildMenuItems(commandItems, child));\n }\n\n return this.createNavigationMenu(child, path);\n }\n\n return path;\n }\n\n // noinspection JSUnusedGlobalSymbols\n public async setSelectedMenuItem(value: MenuItem): Promise<void> {\n console.debug('setSelectedMenuItem', value);\n\n const commandItem = value.data as CommandItem;\n if (!commandItem) {\n return;\n }\n await this.navigateAsync(commandItem);\n }\n\n private buildMenuItems(commandItems: CommandItem[], activatedRoute: ActivatedRoute): MenuItem[] {\n\n const items = new Array<MenuItem>();\n\n for (const commandItem of commandItems) {\n\n if (commandItem.type === 'separator') {\n items.push({separator: true});\n } else {\n\n let childMenuItems: MenuItem[] | undefined = undefined;\n if (commandItem.children) {\n childMenuItems = this.buildMenuItems(commandItem.children, activatedRoute)\n }\n\n let label = commandItem.text;\n if (label) {\n // We replace the label parameters with the actual values from route (use updateBreadcrumbLabels to update the labels with data)\n // noinspection RegExpDuplicateCharacterInClass\n const labelParams = label.match(/[^{{]+(?=}})/g);\n if (labelParams) {\n for (const labelParam of labelParams) {\n const routerParamID = activatedRoute.snapshot.params[labelParam] as string;\n if (routerParamID) {\n label = label.replace('{{' + labelParam + '}}', routerParamID);\n }\n }\n }\n }\n\n items.push({\n text: label,\n svgIcon: commandItem.svgIcon,\n data: commandItem,\n items: childMenuItems\n });\n }\n }\n\n return items;\n }\n}\n","import { Injectable, inject } from '@angular/core';\nimport {BehaviorSubject, firstValueFrom, Observable} from 'rxjs';\nimport {ActivatedRoute, NavigationEnd, Router} from '@angular/router';\nimport {filter} from 'rxjs/operators';\nimport {BreadCrumbData} from '../models/breadCrumbData';\nimport {BreadCrumbRouteItem} from '../models/breadCrumbRouteItem';\n\n@Injectable()\nexport class BreadCrumbService {\n private readonly activatedRoute = inject(ActivatedRoute);\n private readonly router = inject(Router);\n\n private readonly _breadCrumbItems: BehaviorSubject<BreadCrumbData[]> = new BehaviorSubject<BreadCrumbData[]>([]);\n\n constructor() {\n\n this.router.events\n .pipe(filter(event => event instanceof NavigationEnd))\n .subscribe(() => {\n this._breadCrumbItems.next(this.createBreadCrumbs(this.activatedRoute.root));\n });\n this._breadCrumbItems.next(this.createBreadCrumbs(this.activatedRoute.root));\n }\n\n private createBreadCrumbs(route: ActivatedRoute, path: BreadCrumbData[] = [], lastBreadcrumbRef?: BreadCrumbRouteItem[]): BreadCrumbData[] {\n const children = route.children;\n\n for (const child of children) {\n\n const breadCrumbRouteItems: BreadCrumbRouteItem[] = child.snapshot.data['breadcrumb'];\n // Skip inherited breadcrumb data (Angular passes parent route data to children by reference)\n if (breadCrumbRouteItems && breadCrumbRouteItems !== lastBreadcrumbRef) {\n\n for (const breadCrumbRouteItem of breadCrumbRouteItems) {\n\n if (!breadCrumbRouteItem || typeof breadCrumbRouteItem !== 'object') {\n console.warn('BreadCrumbService: invalid breadcrumb item encountered. Skipping.');\n continue;\n }\n\n if (breadCrumbRouteItem.label === undefined || breadCrumbRouteItem.label === null) {\n const routePath = child.snapshot.url?.map(s => s.path).join('/') ?? '';\n console.warn(`BreadCrumbService: breadcrumb item is missing a 'label' property on route '${routePath}'. Skipping item.`);\n continue;\n }\n\n let label = String(breadCrumbRouteItem.label);\n let url = String(breadCrumbRouteItem.url ?? '');\n\n if (breadCrumbRouteItem.url === undefined || breadCrumbRouteItem.url === null) {\n const routePath = child.snapshot.url?.map(s => s.path).join('/') ?? '';\n console.warn(`BreadCrumbService: breadcrumb item '${label}' is missing a 'url' property on route '${routePath}'. ` +\n `Add 'url' to the breadcrumb route data, e.g. { label: '${label}', url: '${routePath}' }.`);\n }\n\n // We replace the route parameters with the actual values\n // Match all :paramName patterns in the URL\n if (url) {\n const paramMatches = url.match(/:([a-zA-Z0-9_]+)/g);\n if (paramMatches) {\n for (const match of paramMatches) {\n const paramName = match.substring(1); // Remove leading ':'\n const paramValue = child.snapshot.params[paramName] as string;\n if (paramValue) {\n url = url.replace(match, paramValue);\n }\n }\n }\n }\n\n // We replace the label parameters with the actual values from route (use updateBreadcrumbLabels to update the labels with data)\n if (label) {\n // noinspection RegExpDuplicateCharacterInClass\n const labelParams = label.match(/[^{{]+(?=}})/g);\n if (labelParams) {\n for (const labelParam of labelParams) {\n const routerParamID = child.snapshot.params[labelParam] as string;\n if (routerParamID) {\n label = label.replace('{{' + labelParam + '}}', routerParamID);\n }\n }\n }\n }\n\n // Replace any unresolved {{param}} placeholders with ellipsis for display\n const displayLabel = label.replace(/\\{\\{[^}]+}}/g, '\\u2026');\n\n path.push({\n text: displayLabel,\n title: displayLabel,\n labelTemplate: breadCrumbRouteItem.label,\n urlTemplate: breadCrumbRouteItem.url,\n svgIcon: breadCrumbRouteItem.svgIcon,\n url: url\n });\n }\n }\n\n return this.createBreadCrumbs(child, path, breadCrumbRouteItems ?? lastBreadcrumbRef);\n }\n\n return path;\n }\n\n /*\n * This method updates the breadcrumb labels with the data passed in the parameter. Parameters are passed in the label as {{paramName}}\n */\n // noinspection JSUnusedGlobalSymbols\n public async updateBreadcrumbLabels(data: Record<string, string>): Promise<void> {\n\n const list = await firstValueFrom(this._breadCrumbItems);\n for (const breadCrumbDataItem of list) {\n // Resolve {{param}} in labels\n if (breadCrumbDataItem.labelTemplate) {\n // noinspection RegExpDuplicateCharacterInClass\n const labelParams = breadCrumbDataItem.labelTemplate.match(/[^{{]+(?=}})/g);\n if (labelParams) {\n let resolvedLabel = breadCrumbDataItem.labelTemplate;\n for (const labelParam of labelParams) {\n const value = data[labelParam];\n if (value) {\n resolvedLabel = resolvedLabel.replace('{{' + labelParam + '}}', value);\n }\n }\n breadCrumbDataItem.title = resolvedLabel;\n breadCrumbDataItem.text = resolvedLabel;\n }\n }\n\n // Resolve {{param}} in URLs\n if (breadCrumbDataItem.urlTemplate) {\n // noinspection RegExpDuplicateCharacterInClass\n const urlParams = breadCrumbDataItem.urlTemplate.match(/[^{{]+(?=}})/g);\n if (urlParams) {\n let resolvedUrl = breadCrumbDataItem.urlTemplate;\n for (const urlParam of urlParams) {\n const value = data[urlParam];\n if (value) {\n resolvedUrl = resolvedUrl.replace('{{' + urlParam + '}}', value);\n }\n }\n breadCrumbDataItem.url = resolvedUrl;\n }\n }\n }\n // Re-emit to notify subscribers (e.g. translated breadcrumb pipes)\n this._breadCrumbItems.next(list);\n }\n\n // noinspection JSUnusedGlobalSymbols\n public get breadCrumbItems(): Observable<BreadCrumbData[]> {\n return this._breadCrumbItems;\n }\n\n}\n","import { Injectable } from '@angular/core';\nimport {BehaviorSubject, Observable} from 'rxjs';\n\n@Injectable()\nexport class AppTitleService {\n private readonly _appTitle: BehaviorSubject<string | null> = new BehaviorSubject<string | null>(null);\n\n public setTitle(title: string): void {\n this._appTitle.next(title);\n }\n\n public getTitle(): string | null {\n return this._appTitle.value;\n }\n\n public get appTitle(): Observable<string | null> {\n return this._appTitle.asObservable();\n }\n}\n","import { HttpErrorResponse, HttpEvent, HttpHandler, HttpInterceptor, HttpRequest } from '@angular/common/http';\nimport { Observable, throwError } from 'rxjs';\nimport { catchError, retry } from 'rxjs/operators';\nimport { inject, Injectable, InjectionToken } from \"@angular/core\";\nimport { MessageService } from \"../services/message.service\";\nimport { ApiErrorDto } from \"../models/apiErrorDto\";\n\n/**\n * Optional callback invoked when a network connectivity error (HTTP status 0) is detected.\n * When provided, the interceptor calls this handler instead of showing a generic error toast.\n * This allows host applications to implement custom connection-loss handling (e.g., a full-screen\n * error overlay with retry logic).\n *\n * @example\n * ```typescript\n * // In app.config.ts\n * {\n * provide: ON_CONNECTION_LOST,\n * useFactory: () => {\n * const configService = inject(AppConfigurationService);\n * return () => configService.reportConnectionLost();\n * }\n * }\n * ```\n */\nexport const ON_CONNECTION_LOST = new InjectionToken<() => void>('ON_CONNECTION_LOST');\n\n@Injectable()\nexport class MmHttpErrorInterceptor implements HttpInterceptor {\n\n private readonly messageService = inject(MessageService);\n private readonly onConnectionLost = inject(ON_CONNECTION_LOST, { optional: true });\n\n intercept(request: HttpRequest<unknown>, next: HttpHandler): Observable<HttpEvent<unknown>> {\n return next.handle(request).pipe(\n retry(0),\n catchError((error: HttpErrorResponse) => {\n\n if (error.status === 0) {\n const isHealthCheck = request.url.endsWith('/health');\n if (!isHealthCheck) {\n if (this.onConnectionLost) {\n this.onConnectionLost();\n } else {\n this.messageService.showError('OctoMesh backend is not reachable. Please check if your network connection is working or contact your Administrator.');\n }\n }\n }\n\n if (error.status === 403) {\n this.messageService.showError('Access denied. You do not have permission to access this tenant or resource.');\n }\n\n // 409 is matched on the message alone: OperationFailedErrorDto hardcodes a BadRequest\n // statusCode into its body, so a conflict response carries statusCode 400 and would never\n // satisfy the check below. Without this branch a 409 is shown to the user as nothing at all\n // (AB#4762).\n if ((error.status === 400 && error.error?.statusCode) || (error.status === 409 && error.error?.message)) {\n const apiError = error.error as ApiErrorDto;\n\n let details = '';\n if (apiError.details && apiError.details.length > 0) {\n for (const detail of apiError.details) {\n if (detail.description) {\n details += `\\n✗ ${detail.description}`;\n }\n }\n }\n\n // Argument order is (message, details): the first argument becomes the toast headline,\n // the second the expandable details. Passing them swapped rendered an empty headline\n // whenever the body carried no details list — which is every OperationFailedErrorDto,\n // so a rejected tenant create showed a blank error toast (AB#4762).\n this.messageService.showErrorWithDetails(apiError.message, details);\n }\n\n return throwError(() => error);\n })\n );\n }\n}\n","import {BreadCrumbItem} from '@progress/kendo-angular-navigation';\nimport {SVGIcon} from '@progress/kendo-svg-icons';\n\nexport class BreadCrumbData implements BreadCrumbItem {\n\n constructor(label: string, labelTemplate: string, url: string) {\n this.text = label;\n this.labelTemplate = labelTemplate;\n this.url = url;\n }\n\n text?: string;\n title?: string;\n disabled?: boolean;\n icon?: string;\n svgIcon?: SVGIcon;\n iconClass?: string;\n imageUrl?: string;\n\n labelTemplate: string;\n urlTemplate?: string;\n url: string;\n}\n","export class PagedResultDto<T> {\n skip: number;\n take: number;\n totalCount: number;\n list: T[];\n\n constructor() {\n this.skip = 0;\n this.take = 0;\n this.totalCount = 0;\n this.list = new Array<T>();\n }\n}\n","import {SVGIcon} from '@progress/kendo-svg-icons/dist/svg-icon.interface';\n\nexport interface TreeItemData {\n\n get id(): string;\n\n get text(): string;\n\n get tooltip(): string;\n\n get item(): unknown;\n\n get svgIcon(): SVGIcon | null;\n\n get expandable(): boolean;\n set expandable(value: boolean);\n\n get isExpanded(): boolean;\n set isExpanded(value: boolean);\n}\n\nexport class TreeItemDataTyped<TDto> implements TreeItemData {\n private _isExpandable: boolean;\n private _isExpanded: boolean;\n\n constructor(private readonly _id: string, private readonly _text: string, private readonly _tooltip: string,\n private readonly _item: TDto, private readonly _svgIcon: SVGIcon,\n expandable = false, isExpanded = false) {\n this._isExpandable = expandable;\n this._isExpanded = expandable && isExpanded;\n }\n\n public get id(): string {\n return this._id;\n }\n\n public get text(): string {\n return this._text;\n }\n\n public get tooltip(): string {\n return this._tooltip;\n }\n\n public get item(): TDto {\n return this._item;\n }\n\n public get svgIcon(): SVGIcon | null {\n return this._svgIcon;\n }\n\n public get expandable(): boolean {\n return this._isExpandable;\n }\n\n public set expandable(value: boolean) {\n this._isExpandable = value;\n }\n\n public get isExpanded(): boolean{\n return this._isExpanded;\n }\n public set isExpanded(value: boolean) {\n this._isExpanded = value;\n }\n}\n","import { ErrorHandler, Injectable, Provider } from '@angular/core';\n\n/**\n * Recognises errors that indicate the loaded JS bundle no longer matches the\n * server (typical symptoms after a redeploy while the tab was in the\n * background): the browser fails to fetch a lazy chunk whose hash changed,\n * and Angular then falls back to JIT compilation which is not available in\n * AOT builds.\n */\nfunction isStaleChunkError(error: unknown): boolean {\n if (!error) {\n return false;\n }\n const message = typeof error === 'string'\n ? error\n : (error as { message?: string }).message ?? '';\n return (\n message.includes('Loading chunk') ||\n message.includes('JIT compiler unavailable') ||\n message.includes('Failed to fetch dynamically imported module') ||\n message.includes(\"Importing a module script failed\") ||\n message.includes('ChunkLoadError')\n );\n}\n\nconst RELOAD_FLAG_KEY = 'octo_stale_chunk_reload_at';\n// Window during which a second reload is suppressed to avoid infinite loops\n// when the chunk error keeps happening even on the fresh bundle.\nconst RELOAD_GUARD_WINDOW_MS = 30_000;\n\n/**\n * Angular ErrorHandler that recovers from stale-bundle errors by reloading\n * the page once. A guard flag in sessionStorage prevents reload loops if the\n * error keeps re-occurring on the fresh bundle.\n *\n * Non-chunk errors are delegated to the default ErrorHandler implementation.\n */\n@Injectable()\nexport class StaleChunkErrorHandler extends ErrorHandler {\n override handleError(error: unknown): void {\n if (isStaleChunkError(error)) {\n this.attemptReload(error);\n return;\n }\n super.handleError(error);\n }\n\n private attemptReload(error: unknown): void {\n try {\n const now = Date.now();\n const last = Number(sessionStorage.getItem(RELOAD_FLAG_KEY) ?? '0');\n if (last && now - last < RELOAD_GUARD_WINDOW_MS) {\n console.error(\n 'StaleChunkErrorHandler: stale-chunk error after recent reload — not reloading again to avoid a loop',\n error\n );\n super.handleError(error);\n return;\n }\n sessionStorage.setItem(RELOAD_FLAG_KEY, String(now));\n console.warn(\n 'StaleChunkErrorHandler: detected stale bundle / lazy-chunk error — reloading page',\n error\n );\n window.location.reload();\n } catch (reloadErr) {\n console.error('StaleChunkErrorHandler: reload attempt failed', reloadErr);\n super.handleError(error);\n }\n }\n}\n\n/**\n * Registers {@link StaleChunkErrorHandler} as the application's global\n * ErrorHandler. Add to the root `providers` array.\n */\nexport function provideStaleChunkRecovery(): Provider {\n return { provide: ErrorHandler, useClass: StaleChunkErrorHandler };\n}\n","/**\n * Legacy DataSourceBase class for backward compatibility with libraries\n * that import DataSourceBase from @meshmakers/shared-services.\n *\n * In the current version, DataSourceBase moved to @meshmakers/shared-ui.\n * This re-export ensures old compiled libraries (octo-services, etc.) continue to work.\n */\nimport {BehaviorSubject, Observable} from 'rxjs';\nimport {PagedResultDto} from '../models/pagedResultDto';\n\nexport class DataSourceBase<TDto> {\n private readonly dataSubject = new BehaviorSubject<TDto[]>([]);\n private readonly loadingSubject = new BehaviorSubject<boolean>(false);\n private readonly totalCountSubject = new BehaviorSubject<number>(0);\n\n public readonly loading$ = this.loadingSubject.asObservable();\n public readonly totalCount$ = this.totalCountSubject.asObservable();\n\n private readonly addedDtoList: TDto[] = [];\n private readonly removedDtoList: TDto[] = [];\n private lastPagedResult: PagedResultDto<TDto> | null = null;\n\n public get totalCount(): Observable<number> {\n return this.totalCount$;\n }\n\n public reset(): void {\n this.addedDtoList.length = 0;\n this.removedDtoList.length = 0;\n }\n\n public addTemporaryDto(dto: TDto): void {\n const index = this.removedDtoList.indexOf(dto);\n if (index !== -1) {\n this.removedDtoList.splice(index, 1);\n } else {\n this.addedDtoList.push(dto);\n }\n this.onEndLoad();\n }\n\n public removeTemporaryDto(dto: TDto): void {\n const index = this.addedDtoList.indexOf(dto);\n if (index !== -1) {\n this.addedDtoList.splice(index, 1);\n } else {\n this.removedDtoList.push(dto);\n }\n this.onEndLoad();\n }\n\n public get addedTemporaryDtos(): TDto[] {\n return this.addedDtoList;\n }\n\n public get removedTemporaryDtos(): TDto[] {\n return this.removedDtoList;\n }\n\n connect(_collectionViewer: unknown): Observable<readonly TDto[]> {\n return this.dataSubject.asObservable();\n }\n\n disconnect(_collectionViewer: unknown): void {\n this.clear();\n }\n\n clear(): void {\n this.loadingSubject?.next(false);\n this.dataSubject?.next([]);\n this.totalCountSubject?.next(0);\n }\n\n protected onBeginLoad(): void {\n this.loadingSubject?.next(true);\n }\n\n protected onCompleteLoad(pagedResult: PagedResultDto<TDto>): void {\n this.lastPagedResult = pagedResult;\n this.onEndLoad();\n }\n\n private onEndLoad(): void {\n if (this.lastPagedResult !== null) {\n const totalCount = this.lastPagedResult.totalCount + this.addedDtoList.length - this.removedDtoList.length;\n const list = this.lastPagedResult.list.concat(this.addedDtoList).filter((x) => !this.removedDtoList.includes(x));\n this.loadingSubject?.next(false);\n this.dataSubject?.next(list);\n this.totalCountSubject?.next(totalCount);\n } else {\n const totalCount = this.addedDtoList.length;\n const list = this.addedDtoList;\n this.loadingSubject?.next(false);\n this.dataSubject?.next(list);\n this.totalCountSubject?.next(totalCount);\n }\n }\n}\n","/**\n * Legacy IsoDateTime utility class for backward compatibility.\n * Uses native Date API instead of date-fns.\n */\nexport class IsoDateTime {\n public static utcToLocalDateTimeIso(utcDateTime: string): string | null {\n if (!utcDateTime) {\n return null;\n }\n return new Date(utcDateTime).toISOString();\n }\n\n public static localToUtcDateTimeIso(localDateTime: string): string | null {\n if (!localDateTime) {\n return null;\n }\n return new Date(localDateTime).toISOString();\n }\n\n public static currentUtcDateTimeIso(): string {\n return new Date().toISOString();\n }\n}\n","/**\n * Legacy QrCodeScannerService for backward compatibility.\n */\nimport {Injectable} from '@angular/core';\n\ninterface BarcodeDetectorResult {\n rawValue: string;\n}\n\ninterface BarcodeDetectorInstance {\n detect(source: HTMLVideoElement): Promise<BarcodeDetectorResult[]>;\n}\n\ninterface BarcodeDetectorConstructor {\n new (options: { formats: string[] }): BarcodeDetectorInstance;\n getSupportedFormats(): Promise<string[]>;\n}\n\ninterface WindowWithBarcodeDetector {\n BarcodeDetector?: BarcodeDetectorConstructor;\n}\n\n@Injectable()\nexport class QrCodeScannerService {\n private stream: MediaStream | null = null;\n\n async isSupported(): Promise<boolean> {\n const BarcodeDetectorClass = (window as unknown as WindowWithBarcodeDetector).BarcodeDetector;\n return !!BarcodeDetectorClass &&\n await BarcodeDetectorClass.getSupportedFormats().then(\n (formats: string[]) => formats.includes('qr_code')\n );\n }\n\n async scan(video: HTMLVideoElement): Promise<string> {\n const BarcodeDetectorClass = (window as unknown as WindowWithBarcodeDetector).BarcodeDetector;\n if (!BarcodeDetectorClass) {\n throw new Error('BarcodeDetector is not supported');\n }\n const detector = new BarcodeDetectorClass({formats: ['qr_code']});\n\n try {\n this.stream = await navigator.mediaDevices.getUserMedia({\n video: {facingMode: 'environment'}\n });\n\n video.srcObject = this.stream;\n await video.play();\n\n return new Promise((resolve, reject) => {\n const detectLoop = async () => {\n try {\n const barcodes = await detector.detect(video);\n if (barcodes.length > 0) {\n this.stop();\n resolve(barcodes[0].rawValue);\n return;\n }\n } catch (err) {\n this.stop();\n reject(err);\n return;\n }\n requestAnimationFrame(detectLoop);\n };\n detectLoop();\n });\n } catch (err) {\n this.stop();\n throw err;\n }\n }\n\n stop(): void {\n if (this.stream) {\n this.stream.getTracks().forEach(track => track.stop());\n this.stream = null;\n }\n }\n}\n","/**\n * Legacy ErrorMessage class for backward compatibility.\n */\nexport class ErrorMessage {\n title?: string;\n message?: string;\n}\n","/**\n * Legacy AutoCompleteDataSource interface and AutoCompleteResult class\n * for backward compatibility.\n */\nimport {Observable} from 'rxjs';\n\nexport class AutoCompleteResult {\n searchTerm?: string;\n list?: string[];\n}\n\nexport interface AutoCompleteDataSource {\n onFilter: (filter: string) => Observable<AutoCompleteResult>;\n onPreprocessSearchString: (search: string) => string;\n}\n","/*\n * Public API Surface of shared-services\n */\nimport {CommandOptions} from './lib/options/commandOptions';\nimport {EnvironmentProviders, makeEnvironmentProviders} from '@angular/core';\nimport {CommandSettingsService} from './lib/services/command-settings.service';\nimport {CommandService} from './lib/services/command.service';\nimport {MessageService} from './lib/services/message.service';\nimport {ComponentMenuService} from './lib/services/component-menu.service';\nimport {BreadCrumbService} from './lib/services/bread-crumb.service';\nimport {AppTitleService} from './lib/services/app-title.service';\nimport {MmHttpErrorInterceptor} from './lib/shared/mm-http-error-interceptor.service';\n\nexport * from './lib/services/app-title.service';\nexport * from './lib/services/message.service';\nexport * from './lib/services/command.service';\nexport * from './lib/services/command-base.service';\nexport * from './lib/services/bread-crumb.service';\nexport * from './lib/services/command-settings.service';\nexport * from './lib/services/component-menu.service';\nexport * from './lib/models/notification-message';\nexport * from './lib/models/commandItem';\nexport * from './lib/models/breadCrumbData';\nexport * from './lib/models/breadCrumbRouteItem';\nexport * from './lib/models/pagedResultDto';\nexport * from './lib/models/treeItemData';\nexport * from './lib/options/commandOptions';\nexport * from './lib/shared/mm-http-error-interceptor.service';\nexport * from './lib/shared/stale-chunk-error-handler';\nexport * from './lib/data-sources/entity-select-data-source';\n\n// Backward-compatible re-exports for legacy libraries (shared-ui, octo-services)\n// that import these from @meshmakers/shared-services\nexport {BreadCrumbService as BreadcrumbService} from './lib/services/bread-crumb.service';\nexport * from './lib/compat/data-source-base';\nexport * from './lib/compat/iso-date-time';\nexport * from './lib/compat/qr-code-scanner.service';\nexport * from './lib/compat/error-message';\nexport * from './lib/compat/auto-complete-data-source';\n\nexport function provideMmSharedServices(commandOptions?: CommandOptions): EnvironmentProviders {\n return makeEnvironmentProviders([\n MessageService,\n CommandService,\n CommandSettingsService,\n ComponentMenuService,\n AppTitleService,\n MmHttpErrorInterceptor,\n BreadCrumbService,\n {\n provide: CommandOptions,\n useValue: commandOptions\n }\n ]);\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"meshmakers-shared-services.mjs","sources":["../../../../projects/meshmakers/shared-services/src/lib/options/commandOptions.ts","../../../../projects/meshmakers/shared-services/src/lib/services/command-settings.service.ts","../../../../projects/meshmakers/shared-services/src/lib/services/command-base.service.ts","../../../../projects/meshmakers/shared-services/src/lib/services/command.service.ts","../../../../projects/meshmakers/shared-services/src/lib/services/error-message.utils.ts","../../../../projects/meshmakers/shared-services/src/lib/services/message.service.ts","../../../../projects/meshmakers/shared-services/src/lib/services/component-menu.service.ts","../../../../projects/meshmakers/shared-services/src/lib/services/bread-crumb.service.ts","../../../../projects/meshmakers/shared-services/src/lib/services/app-title.service.ts","../../../../projects/meshmakers/shared-services/src/lib/shared/mm-http-error-interceptor.service.ts","../../../../projects/meshmakers/shared-services/src/lib/models/breadCrumbData.ts","../../../../projects/meshmakers/shared-services/src/lib/models/pagedResultDto.ts","../../../../projects/meshmakers/shared-services/src/lib/models/treeItemData.ts","../../../../projects/meshmakers/shared-services/src/lib/shared/stale-chunk-error-handler.ts","../../../../projects/meshmakers/shared-services/src/lib/compat/data-source-base.ts","../../../../projects/meshmakers/shared-services/src/lib/compat/iso-date-time.ts","../../../../projects/meshmakers/shared-services/src/lib/compat/qr-code-scanner.service.ts","../../../../projects/meshmakers/shared-services/src/lib/compat/error-message.ts","../../../../projects/meshmakers/shared-services/src/lib/compat/auto-complete-data-source.ts","../../../../projects/meshmakers/shared-services/src/public-api.ts","../../../../projects/meshmakers/shared-services/src/meshmakers-shared-services.ts"],"sourcesContent":["\nexport class CommandOptions{\n\n}\n","import {inject, Injectable} from '@angular/core';\nimport {CommandItem} from '../models/commandItem';\nimport {ActivatedRoute} from '@angular/router';\n\n@Injectable()\nexport class CommandSettingsService {\n\n private readonly _activatedRoute: ActivatedRoute;\n\n constructor() {\n this._activatedRoute = inject(ActivatedRoute);\n }\n\n public get navigateRelativeToRoute() : ActivatedRoute{\n return this._activatedRoute;\n }\n\n public get commandItems(): CommandItem[] {\n return [];\n }\n}\n","import {CommandSettingsService} from './command-settings.service';\nimport {CommandItem} from '../models/commandItem';\nimport {Router} from '@angular/router';\n\nexport abstract class CommandBaseService {\n\n protected constructor(protected readonly commandSettingsService: CommandSettingsService, protected readonly router: Router) {\n }\n\n protected async navigateAsync(commandItem: CommandItem, data?: unknown): Promise<void> {\n\n console.debug('navigateAsync', commandItem);\n const hrefUri = await CommandBaseService.getHref(commandItem, data);\n const link = await CommandBaseService.getLink(commandItem, data);\n if (hrefUri) {\n window.open(hrefUri, commandItem.target ?? \"_blank\");\n } else if (link) {\n\n await this.router.navigate([link], {\n relativeTo: this.commandSettingsService.navigateRelativeToRoute\n });\n } else if (commandItem.onClick) {\n await CommandBaseService.executeClickEvent(commandItem, data);\n } else {\n console.debug('navigateAsync', 'no href or link');\n }\n }\n\n static getIsVisibleSync(commandItem: CommandItem, data?: unknown): boolean {\n if (commandItem.isVisible !== undefined) {\n if (typeof commandItem.isVisible === 'boolean') {\n return commandItem.isVisible;\n } else if (typeof commandItem.isVisible === 'function') {\n const result = commandItem.isVisible(data);\n if (result instanceof Promise) {\n return true;\n }\n return result;\n }\n }\n return true;\n }\n\n protected static async getIsVisible(commandItem: CommandItem): Promise<boolean> {\n if (commandItem.isVisible !== undefined) {\n if (typeof commandItem.isVisible === 'boolean') {\n return commandItem.isVisible;\n } else if (typeof commandItem.isVisible === 'function') {\n return await commandItem.isVisible();\n }\n }\n return true;\n }\n\n protected static getIsDisabled(commandItem: CommandItem, data?: unknown): boolean {\n if (commandItem.isDisabled !== undefined) {\n if (typeof commandItem.isDisabled === 'boolean') {\n return commandItem.isDisabled;\n } else if (typeof commandItem.isDisabled === 'function') {\n return commandItem.isDisabled(data);\n }\n }\n return false;\n }\n\n protected static async getLink(commandItem: CommandItem, data?: unknown): Promise<string | null> {\n if (commandItem.link !== undefined) {\n if (typeof commandItem.link === 'string') {\n return CommandBaseService.interpolateString(commandItem.link, data);\n } else if (typeof commandItem.link === 'function') {\n return CommandBaseService.interpolateString(await commandItem.link({commandItem, data}), data);\n }\n }\n return null;\n }\n\n private static async getHref(commandItem: CommandItem, data?: unknown): Promise<string | null> {\n if (commandItem.href !== undefined) {\n if (typeof commandItem.href === 'string') {\n return CommandBaseService.interpolateString(commandItem.href, data);\n } else if (typeof commandItem.href === 'function') {\n return CommandBaseService.interpolateString(await commandItem.href({commandItem, data}), data);\n }\n }\n return null;\n }\n\n\n private static async executeClickEvent(commandItem: CommandItem, data?: unknown): Promise<void> {\n if (commandItem.onClick !== undefined) {\n return await commandItem.onClick({commandItem, data});\n }\n }\n\n private static interpolateString(template: string | null, data?: unknown): string | null {\n return template?.replace(/{{\\s*(\\w+)\\s*}}/g, (match, propName: string) => {\n if (data && typeof data === 'object' && propName in data) {\n return String((data as Record<string, unknown>)[propName]);\n }\n return match;\n }) ?? null;\n }\n}\n","import {CommandOptions} from '../options/commandOptions';\nimport {BehaviorSubject, Observable, Subscription} from 'rxjs';\nimport {filter} from 'rxjs/operators';\nimport { Injectable, OnDestroy, inject } from '@angular/core';\nimport {DrawerItem} from '@progress/kendo-angular-layout';\nimport {CommandItem} from '../models/commandItem';\nimport {NavigationCancel, NavigationEnd, NavigationError, Router} from '@angular/router';\nimport {CommandSettingsService} from './command-settings.service';\nimport {CommandBaseService} from './command-base.service';\n\n@Injectable()\nexport class CommandService extends CommandBaseService implements OnDestroy {\n private readonly options = inject(CommandOptions);\n\n\n private readonly _drawerItems: BehaviorSubject<DrawerItem[]> = new BehaviorSubject<DrawerItem[]>([]);\n private readonly _commandsMap: Map<string, CommandItem> = new Map<string, CommandItem>();\n\n private _builtItems: DrawerItem[] = [];\n private _selectedId: string | null = null;\n private _routerEventsSubscription: Subscription | null = null;\n\n // noinspection JSUnusedLocalSymbols\n constructor() {\n const router = inject(Router);\n const commandSettingsService = inject(CommandSettingsService);\n\n super(commandSettingsService, router);\n }\n\n // noinspection JSUnusedGlobalSymbols\n public async initialize(): Promise<void> {\n const items = new Array<DrawerItem>();\n\n this._commandsMap.clear();\n const commandItems = this.commandSettingsService.commandItems;\n await this.createDrawerItems(commandItems, items, null);\n\n this._builtItems = items;\n this._selectedId = await this.computeSelectedId(this.router.url);\n this._drawerItems.next(this.applySelection());\n this.subscribeToRouterEvents();\n }\n\n public ngOnDestroy(): void {\n this._routerEventsSubscription?.unsubscribe();\n this._routerEventsSubscription = null;\n }\n\n private async createDrawerItems(\n commandItems: CommandItem[],\n items: DrawerItem[],\n parentId: string | null,\n depth = 0,\n ) {\n for (const commandItem of commandItems) {\n const visible = await CommandBaseService.getIsVisible(commandItem);\n\n if (!visible) {\n continue;\n }\n\n const hierarchyClass = `mm-drawer-level-${depth}`;\n\n if (commandItem.type === 'separator') {\n items.push({\n id: commandItem.id,\n parentId: parentId ?? undefined,\n separator: true,\n cssClass: hierarchyClass\n });\n } else {\n items.push({\n id: commandItem.id,\n parentId: parentId ?? undefined,\n text: commandItem.text,\n selected: commandItem.selected,\n svgIcon: commandItem.svgIcon,\n cssClass: hierarchyClass\n });\n\n if (commandItem.children) {\n await this.createDrawerItems(commandItem.children, items, commandItem.id, depth + 1);\n }\n this._commandsMap.set(commandItem.id, commandItem);\n }\n }\n }\n\n /*\n * The drawer items are built once, but the drawer's visual selection must\n * follow every navigation — not only drawer clicks: breadcrumbs, in-page\n * links, redirects, deep links and the browser history all change the route\n * without going through setSelectedDrawerItem. NavigationCancel/-Error are\n * included so a click whose navigation a guard rejects snaps the highlight\n * back to the page that is actually shown.\n */\n private subscribeToRouterEvents(): void {\n if (this._routerEventsSubscription !== null) {\n return;\n }\n this._routerEventsSubscription = this.router.events\n .pipe(filter(event =>\n event instanceof NavigationEnd ||\n event instanceof NavigationCancel ||\n event instanceof NavigationError))\n .subscribe(() => {\n void this.updateSelectionFromUrl();\n });\n }\n\n private async updateSelectionFromUrl(): Promise<void> {\n const url = this.router.url;\n const selectedId = await this.computeSelectedId(url);\n\n if (url !== this.router.url) {\n // A newer navigation finished while the links resolved; its own\n // router event triggers the update for the final URL.\n return;\n }\n if (selectedId === this._selectedId) {\n return;\n }\n this._selectedId = selectedId;\n this._drawerItems.next(this.applySelection());\n }\n\n /*\n * The longest matching link prefix wins, so a child route (documents/4711)\n * keeps its list entry (documents) highlighted. A link that only points at\n * the navigation base (a home entry like './') would be a prefix of every\n * URL, so it must match exactly — it wins on the base URL itself and never\n * steals the highlight from pages without their own drawer entry.\n */\n private async computeSelectedId(url: string): Promise<string | null> {\n const currentSegments = CommandService.urlToSegments(url);\n const baseSegments = this.baseRouteSegments();\n\n let bestId: string | null = null;\n let bestLength = -1;\n for (const [id, commandItem] of this._commandsMap) {\n const link = await CommandBaseService.getLink(commandItem);\n if (link === null) {\n continue;\n }\n const segments = CommandService.resolveLinkSegments(link, baseSegments);\n const requiresExactMatch = segments.length <= baseSegments.length;\n if (requiresExactMatch && segments.length !== currentSegments.length) {\n continue;\n }\n if (segments.length > currentSegments.length || segments.length <= bestLength) {\n continue;\n }\n if (segments.every((segment, index) => segment === currentSegments[index])) {\n bestId = id;\n bestLength = segments.length;\n }\n }\n return bestId;\n }\n\n /*\n * Command links navigate relative to navigateRelativeToRoute (see\n * CommandBaseService.navigateAsync), so their absolute segments are that\n * route's path plus the link — mirroring what router.navigate resolves.\n */\n private baseRouteSegments(): string[] {\n return (this.commandSettingsService.navigateRelativeToRoute?.snapshot?.pathFromRoot ?? [])\n .flatMap(route => route.url.map(segment => segment.path));\n }\n\n private static resolveLinkSegments(link: string, baseSegments: string[]): string[] {\n const segments: string[] = link.startsWith('/') ? [] : [...baseSegments];\n\n for (const part of link.split('/')) {\n if (part === '' || part === '.') {\n continue;\n }\n if (part === '..') {\n segments.pop();\n continue;\n }\n segments.push(part);\n }\n return segments;\n }\n\n private applySelection(): DrawerItem[] {\n return this._builtItems.map(item =>\n item.separator === true\n ? item\n : {...item, selected: item.id === this._selectedId});\n }\n\n private static urlToSegments(url: string): string[] {\n const path = url.split('#')[0].split('?')[0];\n return path\n .split('/')\n .map(segment => decodeURIComponent(segment.split(';')[0]))\n .filter(segment => segment.length > 0);\n }\n\n // noinspection JSUnusedGlobalSymbols\n public get drawerItems(): Observable<DrawerItem[]> {\n return this._drawerItems;\n }\n\n // noinspection JSUnusedGlobalSymbols\n public async setSelectedDrawerItem(value: DrawerItem): Promise<void> {\n console.debug('setSelectedDrawerItem', value);\n\n if (typeof value.id !== \"string\") {\n return;\n }\n const commandItem = this._commandsMap.get(value.id);\n\n if (commandItem === undefined) {\n return;\n }\n await this.navigateAsync(commandItem);\n }\n}\n\n","/**\n * Transforms known backend error messages into user-friendly messages.\n * Returns null if the error message is not recognized and should be displayed as-is.\n */\nexport function transformErrorMessage(message: string): { userMessage: string; technicalDetails: string } | null {\n if (!message) return null;\n\n // MongoDB E11000 duplicate key error\n if (message.includes('E11000 duplicate key')) {\n return {\n userMessage: 'An entity with this ID already exists. If you are importing data, try using the \"Upsert\" strategy instead of \"Insert Only\".',\n technicalDetails: message\n };\n }\n\n return null;\n}\n","import {Injectable} from '@angular/core';\nimport {BehaviorSubject, Observable, Subject} from 'rxjs';\nimport {NotificationMessage} from '../models/notification-message';\nimport {transformErrorMessage} from './error-message.utils';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class MessageService {\n latestErrorMessage: BehaviorSubject<NotificationMessage | null>;\n errorMessages: NotificationMessage[];\n\n // New message stream for all message types\n private readonly messageSubject = new Subject<NotificationMessage>();\n public readonly messages$ = this.messageSubject.asObservable();\n\n constructor() {\n this.latestErrorMessage = new BehaviorSubject<NotificationMessage | null>(null);\n this.errorMessages = new Array<NotificationMessage>();\n }\n\n getErrorMessageCount(): number {\n return this.errorMessages.length;\n }\n\n getErrorMessage(index: number): NotificationMessage {\n return this.errorMessages[index];\n }\n\n getLatestErrorMessage(): Observable<NotificationMessage | null> {\n return this.latestErrorMessage.asObservable();\n }\n\n showErrorWithDetails(message: string, details: string): void {\n console.error(`${details}: ${message}`);\n\n const transformed = transformErrorMessage(message);\n const displayMessage = transformed ? transformed.userMessage : message;\n const displayDetails = transformed\n ? (details ? `${details}\\n\\n${transformed.technicalDetails}` : transformed.technicalDetails)\n : details;\n\n const notificationMessage = {\n level: \"error\",\n details: displayDetails,\n message: displayMessage,\n timestamp: new Date()\n } as NotificationMessage;\n this.errorMessages.push(notificationMessage);\n\n this.latestErrorMessage.next(notificationMessage);\n\n // Emit to the new message stream\n this.messageSubject.next(notificationMessage);\n }\n\n showError(message: string): void {\n console.error(message);\n\n const transformed = transformErrorMessage(message);\n const displayMessage = transformed ? transformed.userMessage : message;\n const displayDetails = transformed ? transformed.technicalDetails : undefined;\n\n const notificationMessage = {\n level: \"error\",\n message: displayMessage,\n details: displayDetails,\n timestamp: new Date()\n } as NotificationMessage;\n this.errorMessages.push(notificationMessage);\n\n this.latestErrorMessage.next(notificationMessage);\n\n // Emit to the new message stream\n this.messageSubject.next(notificationMessage);\n }\n\n showInformation(message: string): void {\n console.log(message);\n\n // Emit to the new message stream\n this.messageSubject.next({\n level: 'info',\n message,\n timestamp: new Date()\n });\n }\n\n showSuccess(message: string): void {\n console.log(message);\n\n // Emit to the new message stream\n this.messageSubject.next({\n level: 'success',\n message,\n timestamp: new Date()\n });\n }\n\n showWarning(message: string): void {\n console.warn(message);\n\n // Emit to the new message stream\n this.messageSubject.next({\n level: 'warning',\n message: message,\n timestamp: new Date()\n });\n }\n\n showWarningWithDetails(message: string, details: string): void {\n console.warn(`${message}: ${details}`);\n\n // Emit to the new message stream\n this.messageSubject.next({\n level: 'warning',\n details: details,\n message: message,\n timestamp: new Date()\n });\n }\n}\n","import { Injectable, inject } from '@angular/core';\nimport {BehaviorSubject, Observable} from 'rxjs';\nimport {MenuItem} from '@progress/kendo-angular-menu';\nimport {CommandItem} from '../models/commandItem';\nimport {ActivatedRoute, NavigationEnd, Router} from '@angular/router';\nimport {filter} from 'rxjs/operators';\nimport {CommandSettingsService} from './command-settings.service';\nimport {CommandBaseService} from './command-base.service';\n\n@Injectable()\nexport class ComponentMenuService extends CommandBaseService {\n private readonly activatedRoute = inject(ActivatedRoute);\n\n\n private readonly _menuItems: BehaviorSubject<MenuItem[]> = new BehaviorSubject<MenuItem[]>([]);\n\n constructor() {\n const commandSettingsService = inject(CommandSettingsService);\n const router = inject(Router);\n\n\n super(commandSettingsService, router);\n\n router.events\n .pipe(filter(event => event instanceof NavigationEnd))\n .subscribe(() => {\n this._menuItems.next(this.createNavigationMenu(this.activatedRoute.root));\n });\n\n this._menuItems.next(this.createNavigationMenu(this.activatedRoute.root));\n }\n\n // noinspection JSUnusedGlobalSymbols\n public get menuItems(): Observable<MenuItem[]> {\n return this._menuItems;\n }\n\n private createNavigationMenu(route: ActivatedRoute, path: MenuItem[] = []): MenuItem[] {\n const children = route.children;\n\n for (const child of children) {\n\n const commandItems: CommandItem[] = child.snapshot.data['navigationMenu'];\n if (commandItems) {\n\n path.push(...this.buildMenuItems(commandItems, child));\n }\n\n return this.createNavigationMenu(child, path);\n }\n\n return path;\n }\n\n // noinspection JSUnusedGlobalSymbols\n public async setSelectedMenuItem(value: MenuItem): Promise<void> {\n console.debug('setSelectedMenuItem', value);\n\n const commandItem = value.data as CommandItem;\n if (!commandItem) {\n return;\n }\n await this.navigateAsync(commandItem);\n }\n\n private buildMenuItems(commandItems: CommandItem[], activatedRoute: ActivatedRoute): MenuItem[] {\n\n const items = new Array<MenuItem>();\n\n for (const commandItem of commandItems) {\n\n if (commandItem.type === 'separator') {\n items.push({separator: true});\n } else {\n\n let childMenuItems: MenuItem[] | undefined = undefined;\n if (commandItem.children) {\n childMenuItems = this.buildMenuItems(commandItem.children, activatedRoute)\n }\n\n let label = commandItem.text;\n if (label) {\n // We replace the label parameters with the actual values from route (use updateBreadcrumbLabels to update the labels with data)\n // noinspection RegExpDuplicateCharacterInClass\n const labelParams = label.match(/[^{{]+(?=}})/g);\n if (labelParams) {\n for (const labelParam of labelParams) {\n const routerParamID = activatedRoute.snapshot.params[labelParam] as string;\n if (routerParamID) {\n label = label.replace('{{' + labelParam + '}}', routerParamID);\n }\n }\n }\n }\n\n items.push({\n text: label,\n svgIcon: commandItem.svgIcon,\n data: commandItem,\n items: childMenuItems\n });\n }\n }\n\n return items;\n }\n}\n","import { Injectable, inject } from '@angular/core';\nimport {BehaviorSubject, firstValueFrom, Observable} from 'rxjs';\nimport {ActivatedRoute, NavigationEnd, Router} from '@angular/router';\nimport {filter} from 'rxjs/operators';\nimport {BreadCrumbData} from '../models/breadCrumbData';\nimport {BreadCrumbRouteItem} from '../models/breadCrumbRouteItem';\n\n@Injectable()\nexport class BreadCrumbService {\n private readonly activatedRoute = inject(ActivatedRoute);\n private readonly router = inject(Router);\n\n private readonly _breadCrumbItems: BehaviorSubject<BreadCrumbData[]> = new BehaviorSubject<BreadCrumbData[]>([]);\n\n constructor() {\n\n this.router.events\n .pipe(filter(event => event instanceof NavigationEnd))\n .subscribe(() => {\n this._breadCrumbItems.next(this.createBreadCrumbs(this.activatedRoute.root));\n });\n this._breadCrumbItems.next(this.createBreadCrumbs(this.activatedRoute.root));\n }\n\n private createBreadCrumbs(route: ActivatedRoute, path: BreadCrumbData[] = [], lastBreadcrumbRef?: BreadCrumbRouteItem[]): BreadCrumbData[] {\n const children = route.children;\n\n for (const child of children) {\n\n const breadCrumbRouteItems: BreadCrumbRouteItem[] = child.snapshot.data['breadcrumb'];\n // Skip inherited breadcrumb data (Angular passes parent route data to children by reference)\n if (breadCrumbRouteItems && breadCrumbRouteItems !== lastBreadcrumbRef) {\n\n for (const breadCrumbRouteItem of breadCrumbRouteItems) {\n\n if (!breadCrumbRouteItem || typeof breadCrumbRouteItem !== 'object') {\n console.warn('BreadCrumbService: invalid breadcrumb item encountered. Skipping.');\n continue;\n }\n\n if (breadCrumbRouteItem.label === undefined || breadCrumbRouteItem.label === null) {\n const routePath = child.snapshot.url?.map(s => s.path).join('/') ?? '';\n console.warn(`BreadCrumbService: breadcrumb item is missing a 'label' property on route '${routePath}'. Skipping item.`);\n continue;\n }\n\n let label = String(breadCrumbRouteItem.label);\n let url = String(breadCrumbRouteItem.url ?? '');\n\n if (breadCrumbRouteItem.url === undefined || breadCrumbRouteItem.url === null) {\n const routePath = child.snapshot.url?.map(s => s.path).join('/') ?? '';\n console.warn(`BreadCrumbService: breadcrumb item '${label}' is missing a 'url' property on route '${routePath}'. ` +\n `Add 'url' to the breadcrumb route data, e.g. { label: '${label}', url: '${routePath}' }.`);\n }\n\n // We replace the route parameters with the actual values\n // Match all :paramName patterns in the URL\n if (url) {\n const paramMatches = url.match(/:([a-zA-Z0-9_]+)/g);\n if (paramMatches) {\n for (const match of paramMatches) {\n const paramName = match.substring(1); // Remove leading ':'\n const paramValue = child.snapshot.params[paramName] as string;\n if (paramValue) {\n url = url.replace(match, paramValue);\n }\n }\n }\n }\n\n // We replace the label parameters with the actual values from route (use updateBreadcrumbLabels to update the labels with data)\n if (label) {\n // noinspection RegExpDuplicateCharacterInClass\n const labelParams = label.match(/[^{{]+(?=}})/g);\n if (labelParams) {\n for (const labelParam of labelParams) {\n const routerParamID = child.snapshot.params[labelParam] as string;\n if (routerParamID) {\n label = label.replace('{{' + labelParam + '}}', routerParamID);\n }\n }\n }\n }\n\n // Replace any unresolved {{param}} placeholders with ellipsis for display\n const displayLabel = label.replace(/\\{\\{[^}]+}}/g, '\\u2026');\n\n path.push({\n text: displayLabel,\n title: displayLabel,\n labelTemplate: breadCrumbRouteItem.label,\n urlTemplate: breadCrumbRouteItem.url,\n svgIcon: breadCrumbRouteItem.svgIcon,\n url: url\n });\n }\n }\n\n return this.createBreadCrumbs(child, path, breadCrumbRouteItems ?? lastBreadcrumbRef);\n }\n\n return path;\n }\n\n /*\n * This method updates the breadcrumb labels with the data passed in the parameter. Parameters are passed in the label as {{paramName}}\n */\n // noinspection JSUnusedGlobalSymbols\n public async updateBreadcrumbLabels(data: Record<string, string>): Promise<void> {\n\n const list = await firstValueFrom(this._breadCrumbItems);\n for (const breadCrumbDataItem of list) {\n // Resolve {{param}} in labels\n if (breadCrumbDataItem.labelTemplate) {\n // noinspection RegExpDuplicateCharacterInClass\n const labelParams = breadCrumbDataItem.labelTemplate.match(/[^{{]+(?=}})/g);\n if (labelParams) {\n let resolvedLabel = breadCrumbDataItem.labelTemplate;\n for (const labelParam of labelParams) {\n const value = data[labelParam];\n if (value) {\n resolvedLabel = resolvedLabel.replace('{{' + labelParam + '}}', value);\n }\n }\n breadCrumbDataItem.title = resolvedLabel;\n breadCrumbDataItem.text = resolvedLabel;\n }\n }\n\n // Resolve {{param}} in URLs\n if (breadCrumbDataItem.urlTemplate) {\n // noinspection RegExpDuplicateCharacterInClass\n const urlParams = breadCrumbDataItem.urlTemplate.match(/[^{{]+(?=}})/g);\n if (urlParams) {\n let resolvedUrl = breadCrumbDataItem.urlTemplate;\n for (const urlParam of urlParams) {\n const value = data[urlParam];\n if (value) {\n resolvedUrl = resolvedUrl.replace('{{' + urlParam + '}}', value);\n }\n }\n breadCrumbDataItem.url = resolvedUrl;\n }\n }\n }\n // Re-emit to notify subscribers (e.g. translated breadcrumb pipes)\n this._breadCrumbItems.next(list);\n }\n\n // noinspection JSUnusedGlobalSymbols\n public get breadCrumbItems(): Observable<BreadCrumbData[]> {\n return this._breadCrumbItems;\n }\n\n}\n","import { Injectable } from '@angular/core';\nimport {BehaviorSubject, Observable} from 'rxjs';\n\n@Injectable()\nexport class AppTitleService {\n private readonly _appTitle: BehaviorSubject<string | null> = new BehaviorSubject<string | null>(null);\n\n public setTitle(title: string): void {\n this._appTitle.next(title);\n }\n\n public getTitle(): string | null {\n return this._appTitle.value;\n }\n\n public get appTitle(): Observable<string | null> {\n return this._appTitle.asObservable();\n }\n}\n","import { HttpErrorResponse, HttpEvent, HttpHandler, HttpInterceptor, HttpRequest } from '@angular/common/http';\nimport { Observable, throwError } from 'rxjs';\nimport { catchError, retry } from 'rxjs/operators';\nimport { inject, Injectable, InjectionToken } from \"@angular/core\";\nimport { MessageService } from \"../services/message.service\";\nimport { ApiErrorDto } from \"../models/apiErrorDto\";\n\n/**\n * Optional callback invoked when a network connectivity error (HTTP status 0) is detected.\n * When provided, the interceptor calls this handler instead of showing a generic error toast.\n * This allows host applications to implement custom connection-loss handling (e.g., a full-screen\n * error overlay with retry logic).\n *\n * @example\n * ```typescript\n * // In app.config.ts\n * {\n * provide: ON_CONNECTION_LOST,\n * useFactory: () => {\n * const configService = inject(AppConfigurationService);\n * return () => configService.reportConnectionLost();\n * }\n * }\n * ```\n */\nexport const ON_CONNECTION_LOST = new InjectionToken<() => void>('ON_CONNECTION_LOST');\n\n/**\n * How the interceptor reports a failed response to the user. `null` means it stays silent and the\n * caller is the only one who can tell the user anything.\n */\ntype ReportedErrorKind = 'connection-lost' | 'access-denied' | 'api-error';\n\n/** The part of an `HttpErrorResponse` the classification looks at. */\ntype HttpErrorLike = Pick<HttpErrorResponse, 'status' | 'error' | 'url'>;\n\n/**\n * Structural check instead of `instanceof HttpErrorResponse` on purpose: a host that compiles this\n * library from source next to its own `@angular/common` copy (the Studio's Karma run does) sees\n * two class identities, and `instanceof` would silently answer `false` there.\n */\nfunction isHttpErrorResponse(error: unknown): error is HttpErrorLike {\n return typeof error === 'object'\n && error !== null\n && (error as { name?: unknown }).name === 'HttpErrorResponse'\n && typeof (error as { status?: unknown }).status === 'number';\n}\n\n@Injectable()\nexport class MmHttpErrorInterceptor implements HttpInterceptor {\n\n private readonly messageService = inject(MessageService);\n private readonly onConnectionLost = inject(ON_CONNECTION_LOST, { optional: true });\n\n /**\n * Whether the interceptor itself reports this error to the user — as a toast or through the\n * `ON_CONNECTION_LOST` handler. A caller that catches a failed request and shows its own message\n * must skip that message when this returns `true`, otherwise the user sees the same reason twice\n * (once from the interceptor, once from the page — which is what the 409 of the capability\n * disable guards produced, AB#4255). Mirrors exactly the branches `intercept` acts on; anything\n * that is not an `HttpErrorResponse` is never reported here.\n */\n public static reportsToUser(error: unknown): boolean {\n return isHttpErrorResponse(error)\n && MmHttpErrorInterceptor.classify(error, error.url) !== null;\n }\n\n intercept(request: HttpRequest<unknown>, next: HttpHandler): Observable<HttpEvent<unknown>> {\n return next.handle(request).pipe(\n retry(0),\n catchError((error: HttpErrorResponse) => {\n\n switch (MmHttpErrorInterceptor.classify(error, request.url)) {\n case 'connection-lost':\n if (this.onConnectionLost) {\n this.onConnectionLost();\n } else {\n this.messageService.showError('OctoMesh backend is not reachable. Please check if your network connection is working or contact your Administrator.');\n }\n break;\n\n case 'access-denied':\n this.messageService.showError('Access denied. You do not have permission to access this tenant or resource.');\n break;\n\n case 'api-error': {\n const apiError = error.error as ApiErrorDto;\n\n let details = '';\n if (apiError.details && apiError.details.length > 0) {\n for (const detail of apiError.details) {\n if (detail.description) {\n details += `\\n✗ ${detail.description}`;\n }\n }\n }\n\n // Argument order is (message, details): the first argument becomes the toast headline,\n // the second the expandable details. Passing them swapped rendered an empty headline\n // whenever the body carried no details list — which is every OperationFailedErrorDto,\n // so a rejected tenant create showed a blank error toast (AB#4762).\n // A 400 body is classified on its statusCode alone, so it may carry no message; fall back\n // to a generic headline rather than rendering \"undefined\" (the details still follow).\n this.messageService.showErrorWithDetails(\n apiError.message || 'The request was rejected by the server.', details);\n break;\n }\n }\n\n return throwError(() => error);\n })\n );\n }\n\n /**\n * The single place that decides which failed responses the interceptor reports. `intercept`\n * passes the request URL (the health-check exemption is keyed on it); `reportsToUser` only has\n * the response and uses its URL instead.\n */\n private static classify(error: HttpErrorLike, requestUrl: string | null | undefined): ReportedErrorKind | null {\n if (error.status === 0) {\n const isHealthCheck = requestUrl?.endsWith('/health') ?? false;\n return isHealthCheck ? null : 'connection-lost';\n }\n\n if (error.status === 403) {\n return 'access-denied';\n }\n\n // 409 is matched on the message alone: OperationFailedErrorDto hardcodes a BadRequest\n // statusCode into its body, so a conflict response carries statusCode 400 and would never\n // satisfy the check below. Without this branch a 409 is shown to the user as nothing at all\n // (AB#4762).\n if ((error.status === 400 && error.error?.statusCode) || (error.status === 409 && error.error?.message)) {\n return 'api-error';\n }\n\n return null;\n }\n}\n","import {BreadCrumbItem} from '@progress/kendo-angular-navigation';\nimport {SVGIcon} from '@progress/kendo-svg-icons';\n\nexport class BreadCrumbData implements BreadCrumbItem {\n\n constructor(label: string, labelTemplate: string, url: string) {\n this.text = label;\n this.labelTemplate = labelTemplate;\n this.url = url;\n }\n\n text?: string;\n title?: string;\n disabled?: boolean;\n icon?: string;\n svgIcon?: SVGIcon;\n iconClass?: string;\n imageUrl?: string;\n\n labelTemplate: string;\n urlTemplate?: string;\n url: string;\n}\n","export class PagedResultDto<T> {\n skip: number;\n take: number;\n totalCount: number;\n list: T[];\n\n constructor() {\n this.skip = 0;\n this.take = 0;\n this.totalCount = 0;\n this.list = new Array<T>();\n }\n}\n","import {SVGIcon} from '@progress/kendo-svg-icons/dist/svg-icon.interface';\n\nexport interface TreeItemData {\n\n get id(): string;\n\n get text(): string;\n\n get tooltip(): string;\n\n get item(): unknown;\n\n get svgIcon(): SVGIcon | null;\n\n get expandable(): boolean;\n set expandable(value: boolean);\n\n get isExpanded(): boolean;\n set isExpanded(value: boolean);\n}\n\nexport class TreeItemDataTyped<TDto> implements TreeItemData {\n private _isExpandable: boolean;\n private _isExpanded: boolean;\n\n constructor(private readonly _id: string, private readonly _text: string, private readonly _tooltip: string,\n private readonly _item: TDto, private readonly _svgIcon: SVGIcon,\n expandable = false, isExpanded = false) {\n this._isExpandable = expandable;\n this._isExpanded = expandable && isExpanded;\n }\n\n public get id(): string {\n return this._id;\n }\n\n public get text(): string {\n return this._text;\n }\n\n public get tooltip(): string {\n return this._tooltip;\n }\n\n public get item(): TDto {\n return this._item;\n }\n\n public get svgIcon(): SVGIcon | null {\n return this._svgIcon;\n }\n\n public get expandable(): boolean {\n return this._isExpandable;\n }\n\n public set expandable(value: boolean) {\n this._isExpandable = value;\n }\n\n public get isExpanded(): boolean{\n return this._isExpanded;\n }\n public set isExpanded(value: boolean) {\n this._isExpanded = value;\n }\n}\n","import { ErrorHandler, Injectable, Provider } from '@angular/core';\n\n/**\n * Recognises errors that indicate the loaded JS bundle no longer matches the\n * server (typical symptoms after a redeploy while the tab was in the\n * background): the browser fails to fetch a lazy chunk whose hash changed,\n * and Angular then falls back to JIT compilation which is not available in\n * AOT builds.\n */\nfunction isStaleChunkError(error: unknown): boolean {\n if (!error) {\n return false;\n }\n const message = typeof error === 'string'\n ? error\n : (error as { message?: string }).message ?? '';\n return (\n message.includes('Loading chunk') ||\n message.includes('JIT compiler unavailable') ||\n message.includes('Failed to fetch dynamically imported module') ||\n message.includes(\"Importing a module script failed\") ||\n message.includes('ChunkLoadError')\n );\n}\n\nconst RELOAD_FLAG_KEY = 'octo_stale_chunk_reload_at';\n// Window during which a second reload is suppressed to avoid infinite loops\n// when the chunk error keeps happening even on the fresh bundle.\nconst RELOAD_GUARD_WINDOW_MS = 30_000;\n\n/**\n * Angular ErrorHandler that recovers from stale-bundle errors by reloading\n * the page once. A guard flag in sessionStorage prevents reload loops if the\n * error keeps re-occurring on the fresh bundle.\n *\n * Non-chunk errors are delegated to the default ErrorHandler implementation.\n */\n@Injectable()\nexport class StaleChunkErrorHandler extends ErrorHandler {\n override handleError(error: unknown): void {\n if (isStaleChunkError(error)) {\n this.attemptReload(error);\n return;\n }\n super.handleError(error);\n }\n\n private attemptReload(error: unknown): void {\n try {\n const now = Date.now();\n const last = Number(sessionStorage.getItem(RELOAD_FLAG_KEY) ?? '0');\n if (last && now - last < RELOAD_GUARD_WINDOW_MS) {\n console.error(\n 'StaleChunkErrorHandler: stale-chunk error after recent reload — not reloading again to avoid a loop',\n error\n );\n super.handleError(error);\n return;\n }\n sessionStorage.setItem(RELOAD_FLAG_KEY, String(now));\n console.warn(\n 'StaleChunkErrorHandler: detected stale bundle / lazy-chunk error — reloading page',\n error\n );\n window.location.reload();\n } catch (reloadErr) {\n console.error('StaleChunkErrorHandler: reload attempt failed', reloadErr);\n super.handleError(error);\n }\n }\n}\n\n/**\n * Registers {@link StaleChunkErrorHandler} as the application's global\n * ErrorHandler. Add to the root `providers` array.\n */\nexport function provideStaleChunkRecovery(): Provider {\n return { provide: ErrorHandler, useClass: StaleChunkErrorHandler };\n}\n","/**\n * Legacy DataSourceBase class for backward compatibility with libraries\n * that import DataSourceBase from @meshmakers/shared-services.\n *\n * In the current version, DataSourceBase moved to @meshmakers/shared-ui.\n * This re-export ensures old compiled libraries (octo-services, etc.) continue to work.\n */\nimport {BehaviorSubject, Observable} from 'rxjs';\nimport {PagedResultDto} from '../models/pagedResultDto';\n\nexport class DataSourceBase<TDto> {\n private readonly dataSubject = new BehaviorSubject<TDto[]>([]);\n private readonly loadingSubject = new BehaviorSubject<boolean>(false);\n private readonly totalCountSubject = new BehaviorSubject<number>(0);\n\n public readonly loading$ = this.loadingSubject.asObservable();\n public readonly totalCount$ = this.totalCountSubject.asObservable();\n\n private readonly addedDtoList: TDto[] = [];\n private readonly removedDtoList: TDto[] = [];\n private lastPagedResult: PagedResultDto<TDto> | null = null;\n\n public get totalCount(): Observable<number> {\n return this.totalCount$;\n }\n\n public reset(): void {\n this.addedDtoList.length = 0;\n this.removedDtoList.length = 0;\n }\n\n public addTemporaryDto(dto: TDto): void {\n const index = this.removedDtoList.indexOf(dto);\n if (index !== -1) {\n this.removedDtoList.splice(index, 1);\n } else {\n this.addedDtoList.push(dto);\n }\n this.onEndLoad();\n }\n\n public removeTemporaryDto(dto: TDto): void {\n const index = this.addedDtoList.indexOf(dto);\n if (index !== -1) {\n this.addedDtoList.splice(index, 1);\n } else {\n this.removedDtoList.push(dto);\n }\n this.onEndLoad();\n }\n\n public get addedTemporaryDtos(): TDto[] {\n return this.addedDtoList;\n }\n\n public get removedTemporaryDtos(): TDto[] {\n return this.removedDtoList;\n }\n\n connect(_collectionViewer: unknown): Observable<readonly TDto[]> {\n return this.dataSubject.asObservable();\n }\n\n disconnect(_collectionViewer: unknown): void {\n this.clear();\n }\n\n clear(): void {\n this.loadingSubject?.next(false);\n this.dataSubject?.next([]);\n this.totalCountSubject?.next(0);\n }\n\n protected onBeginLoad(): void {\n this.loadingSubject?.next(true);\n }\n\n protected onCompleteLoad(pagedResult: PagedResultDto<TDto>): void {\n this.lastPagedResult = pagedResult;\n this.onEndLoad();\n }\n\n private onEndLoad(): void {\n if (this.lastPagedResult !== null) {\n const totalCount = this.lastPagedResult.totalCount + this.addedDtoList.length - this.removedDtoList.length;\n const list = this.lastPagedResult.list.concat(this.addedDtoList).filter((x) => !this.removedDtoList.includes(x));\n this.loadingSubject?.next(false);\n this.dataSubject?.next(list);\n this.totalCountSubject?.next(totalCount);\n } else {\n const totalCount = this.addedDtoList.length;\n const list = this.addedDtoList;\n this.loadingSubject?.next(false);\n this.dataSubject?.next(list);\n this.totalCountSubject?.next(totalCount);\n }\n }\n}\n","/**\n * Legacy IsoDateTime utility class for backward compatibility.\n * Uses native Date API instead of date-fns.\n */\nexport class IsoDateTime {\n public static utcToLocalDateTimeIso(utcDateTime: string): string | null {\n if (!utcDateTime) {\n return null;\n }\n return new Date(utcDateTime).toISOString();\n }\n\n public static localToUtcDateTimeIso(localDateTime: string): string | null {\n if (!localDateTime) {\n return null;\n }\n return new Date(localDateTime).toISOString();\n }\n\n public static currentUtcDateTimeIso(): string {\n return new Date().toISOString();\n }\n}\n","/**\n * Legacy QrCodeScannerService for backward compatibility.\n */\nimport {Injectable} from '@angular/core';\n\ninterface BarcodeDetectorResult {\n rawValue: string;\n}\n\ninterface BarcodeDetectorInstance {\n detect(source: HTMLVideoElement): Promise<BarcodeDetectorResult[]>;\n}\n\ninterface BarcodeDetectorConstructor {\n new (options: { formats: string[] }): BarcodeDetectorInstance;\n getSupportedFormats(): Promise<string[]>;\n}\n\ninterface WindowWithBarcodeDetector {\n BarcodeDetector?: BarcodeDetectorConstructor;\n}\n\n@Injectable()\nexport class QrCodeScannerService {\n private stream: MediaStream | null = null;\n\n async isSupported(): Promise<boolean> {\n const BarcodeDetectorClass = (window as unknown as WindowWithBarcodeDetector).BarcodeDetector;\n return !!BarcodeDetectorClass &&\n await BarcodeDetectorClass.getSupportedFormats().then(\n (formats: string[]) => formats.includes('qr_code')\n );\n }\n\n async scan(video: HTMLVideoElement): Promise<string> {\n const BarcodeDetectorClass = (window as unknown as WindowWithBarcodeDetector).BarcodeDetector;\n if (!BarcodeDetectorClass) {\n throw new Error('BarcodeDetector is not supported');\n }\n const detector = new BarcodeDetectorClass({formats: ['qr_code']});\n\n try {\n this.stream = await navigator.mediaDevices.getUserMedia({\n video: {facingMode: 'environment'}\n });\n\n video.srcObject = this.stream;\n await video.play();\n\n return new Promise((resolve, reject) => {\n const detectLoop = async () => {\n try {\n const barcodes = await detector.detect(video);\n if (barcodes.length > 0) {\n this.stop();\n resolve(barcodes[0].rawValue);\n return;\n }\n } catch (err) {\n this.stop();\n reject(err);\n return;\n }\n requestAnimationFrame(detectLoop);\n };\n detectLoop();\n });\n } catch (err) {\n this.stop();\n throw err;\n }\n }\n\n stop(): void {\n if (this.stream) {\n this.stream.getTracks().forEach(track => track.stop());\n this.stream = null;\n }\n }\n}\n","/**\n * Legacy ErrorMessage class for backward compatibility.\n */\nexport class ErrorMessage {\n title?: string;\n message?: string;\n}\n","/**\n * Legacy AutoCompleteDataSource interface and AutoCompleteResult class\n * for backward compatibility.\n */\nimport {Observable} from 'rxjs';\n\nexport class AutoCompleteResult {\n searchTerm?: string;\n list?: string[];\n}\n\nexport interface AutoCompleteDataSource {\n onFilter: (filter: string) => Observable<AutoCompleteResult>;\n onPreprocessSearchString: (search: string) => string;\n}\n","/*\n * Public API Surface of shared-services\n */\nimport {CommandOptions} from './lib/options/commandOptions';\nimport {EnvironmentProviders, makeEnvironmentProviders} from '@angular/core';\nimport {CommandSettingsService} from './lib/services/command-settings.service';\nimport {CommandService} from './lib/services/command.service';\nimport {MessageService} from './lib/services/message.service';\nimport {ComponentMenuService} from './lib/services/component-menu.service';\nimport {BreadCrumbService} from './lib/services/bread-crumb.service';\nimport {AppTitleService} from './lib/services/app-title.service';\nimport {MmHttpErrorInterceptor} from './lib/shared/mm-http-error-interceptor.service';\n\nexport * from './lib/services/app-title.service';\nexport * from './lib/services/message.service';\nexport * from './lib/services/command.service';\nexport * from './lib/services/command-base.service';\nexport * from './lib/services/bread-crumb.service';\nexport * from './lib/services/command-settings.service';\nexport * from './lib/services/component-menu.service';\nexport * from './lib/models/notification-message';\nexport * from './lib/models/commandItem';\nexport * from './lib/models/breadCrumbData';\nexport * from './lib/models/breadCrumbRouteItem';\nexport * from './lib/models/pagedResultDto';\nexport * from './lib/models/treeItemData';\nexport * from './lib/options/commandOptions';\nexport * from './lib/shared/mm-http-error-interceptor.service';\nexport * from './lib/shared/stale-chunk-error-handler';\nexport * from './lib/data-sources/entity-select-data-source';\n\n// Backward-compatible re-exports for legacy libraries (shared-ui, octo-services)\n// that import these from @meshmakers/shared-services\nexport {BreadCrumbService as BreadcrumbService} from './lib/services/bread-crumb.service';\nexport * from './lib/compat/data-source-base';\nexport * from './lib/compat/iso-date-time';\nexport * from './lib/compat/qr-code-scanner.service';\nexport * from './lib/compat/error-message';\nexport * from './lib/compat/auto-complete-data-source';\n\nexport function provideMmSharedServices(commandOptions?: CommandOptions): EnvironmentProviders {\n return makeEnvironmentProviders([\n MessageService,\n CommandService,\n CommandSettingsService,\n ComponentMenuService,\n AppTitleService,\n MmHttpErrorInterceptor,\n BreadCrumbService,\n {\n provide: CommandOptions,\n useValue: commandOptions\n }\n ]);\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import * as i0 from '@angular/core';
|
|
2
|
-
import { InjectionToken, ErrorHandler, Provider, EnvironmentProviders } from '@angular/core';
|
|
2
|
+
import { OnDestroy, InjectionToken, ErrorHandler, Provider, EnvironmentProviders } from '@angular/core';
|
|
3
3
|
import { Observable, BehaviorSubject } from 'rxjs';
|
|
4
4
|
import { BreadCrumbItem } from '@progress/kendo-angular-navigation';
|
|
5
5
|
import { SVGIcon as SVGIcon$1 } from '@progress/kendo-svg-icons';
|
|
@@ -61,6 +61,8 @@ interface CommandItem {
|
|
|
61
61
|
isVisible?: boolean | ((data?: unknown) => boolean | Promise<boolean>);
|
|
62
62
|
isDisabled?: boolean | ((data?: unknown) => boolean);
|
|
63
63
|
children?: CommandItem[];
|
|
64
|
+
fillMode?: 'solid' | 'flat' | 'outline' | 'link' | 'clear';
|
|
65
|
+
tooltip?: string;
|
|
64
66
|
}
|
|
65
67
|
interface CommandItemExecuteEventArgs {
|
|
66
68
|
commandItem: CommandItem;
|
|
@@ -78,25 +80,36 @@ declare class CommandSettingsService {
|
|
|
78
80
|
|
|
79
81
|
declare abstract class CommandBaseService {
|
|
80
82
|
protected readonly commandSettingsService: CommandSettingsService;
|
|
81
|
-
|
|
83
|
+
protected readonly router: Router;
|
|
82
84
|
protected constructor(commandSettingsService: CommandSettingsService, router: Router);
|
|
83
85
|
protected navigateAsync(commandItem: CommandItem, data?: unknown): Promise<void>;
|
|
84
86
|
static getIsVisibleSync(commandItem: CommandItem, data?: unknown): boolean;
|
|
85
87
|
protected static getIsVisible(commandItem: CommandItem): Promise<boolean>;
|
|
86
88
|
protected static getIsDisabled(commandItem: CommandItem, data?: unknown): boolean;
|
|
87
|
-
|
|
89
|
+
protected static getLink(commandItem: CommandItem, data?: unknown): Promise<string | null>;
|
|
88
90
|
private static getHref;
|
|
89
91
|
private static executeClickEvent;
|
|
90
92
|
private static interpolateString;
|
|
91
93
|
}
|
|
92
94
|
|
|
93
|
-
declare class CommandService extends CommandBaseService {
|
|
95
|
+
declare class CommandService extends CommandBaseService implements OnDestroy {
|
|
94
96
|
private readonly options;
|
|
95
97
|
private readonly _drawerItems;
|
|
96
98
|
private readonly _commandsMap;
|
|
99
|
+
private _builtItems;
|
|
100
|
+
private _selectedId;
|
|
101
|
+
private _routerEventsSubscription;
|
|
97
102
|
constructor();
|
|
98
103
|
initialize(): Promise<void>;
|
|
104
|
+
ngOnDestroy(): void;
|
|
99
105
|
private createDrawerItems;
|
|
106
|
+
private subscribeToRouterEvents;
|
|
107
|
+
private updateSelectionFromUrl;
|
|
108
|
+
private computeSelectedId;
|
|
109
|
+
private baseRouteSegments;
|
|
110
|
+
private static resolveLinkSegments;
|
|
111
|
+
private applySelection;
|
|
112
|
+
private static urlToSegments;
|
|
100
113
|
get drawerItems(): Observable<DrawerItem[]>;
|
|
101
114
|
setSelectedDrawerItem(value: DrawerItem): Promise<void>;
|
|
102
115
|
static ɵfac: i0.ɵɵFactoryDeclaration<CommandService, never>;
|
|
@@ -208,7 +221,22 @@ declare const ON_CONNECTION_LOST: InjectionToken<() => void>;
|
|
|
208
221
|
declare class MmHttpErrorInterceptor implements HttpInterceptor {
|
|
209
222
|
private readonly messageService;
|
|
210
223
|
private readonly onConnectionLost;
|
|
224
|
+
/**
|
|
225
|
+
* Whether the interceptor itself reports this error to the user — as a toast or through the
|
|
226
|
+
* `ON_CONNECTION_LOST` handler. A caller that catches a failed request and shows its own message
|
|
227
|
+
* must skip that message when this returns `true`, otherwise the user sees the same reason twice
|
|
228
|
+
* (once from the interceptor, once from the page — which is what the 409 of the capability
|
|
229
|
+
* disable guards produced, AB#4255). Mirrors exactly the branches `intercept` acts on; anything
|
|
230
|
+
* that is not an `HttpErrorResponse` is never reported here.
|
|
231
|
+
*/
|
|
232
|
+
static reportsToUser(error: unknown): boolean;
|
|
211
233
|
intercept(request: HttpRequest<unknown>, next: HttpHandler): Observable<HttpEvent<unknown>>;
|
|
234
|
+
/**
|
|
235
|
+
* The single place that decides which failed responses the interceptor reports. `intercept`
|
|
236
|
+
* passes the request URL (the health-check exemption is keyed on it); `reportsToUser` only has
|
|
237
|
+
* the response and uses its URL instead.
|
|
238
|
+
*/
|
|
239
|
+
private static classify;
|
|
212
240
|
static ɵfac: i0.ɵɵFactoryDeclaration<MmHttpErrorInterceptor, never>;
|
|
213
241
|
static ɵprov: i0.ɵɵInjectableDeclaration<MmHttpErrorInterceptor>;
|
|
214
242
|
}
|