@meshmakers/shared-services 3.5.520 → 3.5.550
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md
CHANGED
|
@@ -71,7 +71,7 @@ shared-services/
|
|
|
71
71
|
|
|
72
72
|
| Interceptor | Description |
|
|
73
73
|
|-------------|-------------|
|
|
74
|
-
| `MmHttpErrorInterceptor` | Handles HTTP errors (network errors, API 400 errors with details) |
|
|
74
|
+
| `MmHttpErrorInterceptor` | Handles HTTP errors (network errors, 403 access denied, API 400/409 errors with details, 403 `application/problem+json` refusals shown with their `title`/`detail`); callers that show their own error toast check `MmHttpErrorInterceptor.reportsToUser(error)` first |
|
|
75
75
|
|
|
76
76
|
## Models
|
|
77
77
|
|
|
@@ -710,6 +710,32 @@ function isHttpErrorResponse(error) {
|
|
|
710
710
|
&& error.name === 'HttpErrorResponse'
|
|
711
711
|
&& typeof error.status === 'number';
|
|
712
712
|
}
|
|
713
|
+
/**
|
|
714
|
+
* The readable text of an RFC 9457 problem body (`application/problem+json`), or `null` when the body
|
|
715
|
+
* is no problem or carries no deliberate text. Identity refuses role changes this way (AB#7914):
|
|
716
|
+
* `{ status: 403, title: 'You cannot grant additional roles to your own user.', code: 'self-grant' }`.
|
|
717
|
+
*
|
|
718
|
+
* - `title` counts only when the body carries the `code` extension: ASP.NET fills `title` of a
|
|
719
|
+
* default problem with the bare reason phrase ("Forbidden"), which says less than the generic text.
|
|
720
|
+
* - `detail` is always written on purpose and is the fallback.
|
|
721
|
+
*
|
|
722
|
+
* A body counts as a problem when it is an object with a numeric `status` or a string `type`/`code`.
|
|
723
|
+
*/
|
|
724
|
+
function problemMessage(body) {
|
|
725
|
+
if (typeof body !== 'object' || body === null) {
|
|
726
|
+
return null;
|
|
727
|
+
}
|
|
728
|
+
const problem = body;
|
|
729
|
+
const hasCode = typeof problem.code === 'string' && problem.code.length > 0;
|
|
730
|
+
const isProblem = typeof problem.status === 'number' || typeof problem.type === 'string' || hasCode;
|
|
731
|
+
if (!isProblem) {
|
|
732
|
+
return null;
|
|
733
|
+
}
|
|
734
|
+
if (hasCode && typeof problem.title === 'string' && problem.title.length > 0) {
|
|
735
|
+
return problem.title;
|
|
736
|
+
}
|
|
737
|
+
return typeof problem.detail === 'string' && problem.detail.length > 0 ? problem.detail : null;
|
|
738
|
+
}
|
|
713
739
|
class MmHttpErrorInterceptor {
|
|
714
740
|
/**
|
|
715
741
|
* Status-0 errors of `MM_OPTIONAL_REQUEST` requests the interceptor deliberately stayed silent
|
|
@@ -717,6 +743,13 @@ class MmHttpErrorInterceptor {
|
|
|
717
743
|
* recognises these by identity — the interceptor rethrows the very same object.
|
|
718
744
|
*/
|
|
719
745
|
static silencedOptionalErrors = new WeakSet();
|
|
746
|
+
/**
|
|
747
|
+
* Errors whose status the request marked as caller-handled (`MM_CALLER_HANDLED_STATUSES`): the
|
|
748
|
+
* interceptor stayed silent, so `reportsToUser` must answer `false` for them, or a caller that skips
|
|
749
|
+
* its own toast on `true` would leave the user with no message at all. Recognised by identity, like
|
|
750
|
+
* `silencedOptionalErrors`.
|
|
751
|
+
*/
|
|
752
|
+
static silencedCallerHandledErrors = new WeakSet();
|
|
720
753
|
messageService = inject(MessageService);
|
|
721
754
|
onConnectionLost = inject(ON_CONNECTION_LOST, { optional: true });
|
|
722
755
|
/**
|
|
@@ -730,11 +763,13 @@ class MmHttpErrorInterceptor {
|
|
|
730
763
|
static reportsToUser(error) {
|
|
731
764
|
return isHttpErrorResponse(error)
|
|
732
765
|
&& !MmHttpErrorInterceptor.silencedOptionalErrors.has(error)
|
|
766
|
+
&& !MmHttpErrorInterceptor.silencedCallerHandledErrors.has(error)
|
|
733
767
|
&& MmHttpErrorInterceptor.classify(error, error.url) !== null;
|
|
734
768
|
}
|
|
735
769
|
intercept(request, next) {
|
|
736
770
|
return next.handle(request).pipe(retry(0), catchError((error) => {
|
|
737
771
|
if (request.context.get(MM_CALLER_HANDLED_STATUSES).includes(error.status)) {
|
|
772
|
+
MmHttpErrorInterceptor.silencedCallerHandledErrors.add(error);
|
|
738
773
|
return throwError(() => error);
|
|
739
774
|
}
|
|
740
775
|
if (error.status === 0 && request.context.get(MM_OPTIONAL_REQUEST)) {
|
|
@@ -762,6 +797,12 @@ class MmHttpErrorInterceptor {
|
|
|
762
797
|
: 'Access denied. You do not have permission to access this tenant or resource.');
|
|
763
798
|
break;
|
|
764
799
|
}
|
|
800
|
+
case 'problem':
|
|
801
|
+
// A 403 refusal with a readable problem title (AB#7969): show that sentence, once, instead of
|
|
802
|
+
// the generic access-denied text. Pages that catch the error skip their own toast because
|
|
803
|
+
// reportsToUser answers true for it.
|
|
804
|
+
this.messageService.showError(problemMessage(error.error) ?? '');
|
|
805
|
+
break;
|
|
765
806
|
case 'api-error': {
|
|
766
807
|
const apiError = error.error;
|
|
767
808
|
let details = '';
|
|
@@ -795,6 +836,14 @@ class MmHttpErrorInterceptor {
|
|
|
795
836
|
const isHealthCheck = requestUrl?.endsWith('/health') ?? false;
|
|
796
837
|
return isHealthCheck ? null : 'connection-lost';
|
|
797
838
|
}
|
|
839
|
+
// A 403 problem body with a readable text (identity's role-change refusals, AB#7969) is shown as is
|
|
840
|
+
// instead of the generic "Access denied", which reads as a missing permission it is not. A 409
|
|
841
|
+
// problem stays the caller's job, as before: pages show it in place (identity's last-administrator /
|
|
842
|
+
// built-in-role refusals) or in a dialog (the CK upgrade guard's CK_UPGRADE_BLOCKED). A 403 with the
|
|
843
|
+
// middleware's {message} body is no problem and keeps the access-denied branch.
|
|
844
|
+
if (error.status === 403 && problemMessage(error.error) !== null) {
|
|
845
|
+
return 'problem';
|
|
846
|
+
}
|
|
798
847
|
if (error.status === 403) {
|
|
799
848
|
return 'access-denied';
|
|
800
849
|
}
|
|
@@ -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, 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', 'noopener,noreferrer');\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 { HttpContextToken, 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 * HTTP statuses the CALLER handles itself for one request: the interceptor does not report them\n * (no global toast) and the caller shows its own, more specific message. Example: a 403 of an\n * optional admin read that the page explains in place instead of a generic \"Access denied\".\n *\n * @example\n * ```typescript\n * http.get(url, { context: new HttpContext().set(MM_CALLER_HANDLED_STATUSES, [403]) });\n * ```\n */\nexport const MM_CALLER_HANDLED_STATUSES = new HttpContextToken<readonly number[]>(() => []);\n\n/**\n * Marks one request as optional (a probe or a widget read the page can do without): when it fails\n * at network level (status 0 — CORS rejection, DNS, offline) the interceptor does NOT treat that as\n * a lost backend connection, so neither `ON_CONNECTION_LOST` (the host's full-screen overlay) nor\n * the generic toast fires; the caller degrades locally. The error is still rethrown. A real outage\n * is still detected by the non-optional calls of the host (configuration, health, GraphQL).\n * HTTP responses (403, 400, ...) are reported as for any other request.\n *\n * @example\n * ```typescript\n * http.get(url, { context: new HttpContext().set(MM_OPTIONAL_REQUEST, true) });\n * ```\n */\nexport const MM_OPTIONAL_REQUEST = new HttpContextToken<boolean>(() => false);\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 Vitest 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 /**\n * Status-0 errors of `MM_OPTIONAL_REQUEST` requests the interceptor deliberately stayed silent\n * about (AB#6619). `reportsToUser` only receives the error, not the request context, so it\n * recognises these by identity — the interceptor rethrows the very same object.\n */\n private static readonly silencedOptionalErrors = new WeakSet<object>();\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.silencedOptionalErrors.has(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 if (request.context.get(MM_CALLER_HANDLED_STATUSES).includes(error.status)) {\n return throwError(() => error);\n }\n\n if (error.status === 0 && request.context.get(MM_OPTIONAL_REQUEST)) {\n MmHttpErrorInterceptor.silencedOptionalErrors.add(error);\n console.debug('Optional request failed at network level, not treated as connection loss', request.url);\n return throwError(() => error);\n }\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 // The tenant authorization middleware names the denial reason in a {message} body\n // (AB#5227) — e.g. \"tenant does not exist any more, re-create it first\" on a restore\n // into a deleted tenant. Prefer that over the generic text, which reads as a\n // permission problem it often is not.\n const deniedMessage = (error.error as { message?: unknown } | null)?.message;\n this.messageService.showError(typeof deniedMessage === 'string' && deniedMessage.length > 0\n ? deniedMessage\n : 'Access denied. You do not have permission to access this tenant or resource.');\n break;\n }\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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"}
|
|
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', 'noopener,noreferrer');\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 { HttpContextToken, 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 * HTTP statuses the CALLER handles itself for one request: the interceptor does not report them\n * (no global toast) and the caller shows its own, more specific message. Example: a 403 of an\n * optional admin read that the page explains in place instead of a generic \"Access denied\".\n *\n * @example\n * ```typescript\n * http.get(url, { context: new HttpContext().set(MM_CALLER_HANDLED_STATUSES, [403]) });\n * ```\n */\nexport const MM_CALLER_HANDLED_STATUSES = new HttpContextToken<readonly number[]>(() => []);\n\n/**\n * Marks one request as optional (a probe or a widget read the page can do without): when it fails\n * at network level (status 0 — CORS rejection, DNS, offline) the interceptor does NOT treat that as\n * a lost backend connection, so neither `ON_CONNECTION_LOST` (the host's full-screen overlay) nor\n * the generic toast fires; the caller degrades locally. The error is still rethrown. A real outage\n * is still detected by the non-optional calls of the host (configuration, health, GraphQL).\n * HTTP responses (403, 400, ...) are reported as for any other request.\n *\n * @example\n * ```typescript\n * http.get(url, { context: new HttpContext().set(MM_OPTIONAL_REQUEST, true) });\n * ```\n */\nexport const MM_OPTIONAL_REQUEST = new HttpContextToken<boolean>(() => false);\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' | 'problem' | '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 Vitest 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/**\n * The readable text of an RFC 9457 problem body (`application/problem+json`), or `null` when the body\n * is no problem or carries no deliberate text. Identity refuses role changes this way (AB#7914):\n * `{ status: 403, title: 'You cannot grant additional roles to your own user.', code: 'self-grant' }`.\n *\n * - `title` counts only when the body carries the `code` extension: ASP.NET fills `title` of a\n * default problem with the bare reason phrase (\"Forbidden\"), which says less than the generic text.\n * - `detail` is always written on purpose and is the fallback.\n *\n * A body counts as a problem when it is an object with a numeric `status` or a string `type`/`code`.\n */\nfunction problemMessage(body: unknown): string | null {\n if (typeof body !== 'object' || body === null) {\n return null;\n }\n const problem = body as { status?: unknown; type?: unknown; code?: unknown; title?: unknown; detail?: unknown };\n const hasCode = typeof problem.code === 'string' && problem.code.length > 0;\n const isProblem = typeof problem.status === 'number' || typeof problem.type === 'string' || hasCode;\n if (!isProblem) {\n return null;\n }\n if (hasCode && typeof problem.title === 'string' && problem.title.length > 0) {\n return problem.title;\n }\n return typeof problem.detail === 'string' && problem.detail.length > 0 ? problem.detail : null;\n}\n\n@Injectable()\nexport class MmHttpErrorInterceptor implements HttpInterceptor {\n\n /**\n * Status-0 errors of `MM_OPTIONAL_REQUEST` requests the interceptor deliberately stayed silent\n * about (AB#6619). `reportsToUser` only receives the error, not the request context, so it\n * recognises these by identity — the interceptor rethrows the very same object.\n */\n private static readonly silencedOptionalErrors = new WeakSet<object>();\n\n /**\n * Errors whose status the request marked as caller-handled (`MM_CALLER_HANDLED_STATUSES`): the\n * interceptor stayed silent, so `reportsToUser` must answer `false` for them, or a caller that skips\n * its own toast on `true` would leave the user with no message at all. Recognised by identity, like\n * `silencedOptionalErrors`.\n */\n private static readonly silencedCallerHandledErrors = new WeakSet<object>();\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.silencedOptionalErrors.has(error)\n && !MmHttpErrorInterceptor.silencedCallerHandledErrors.has(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 if (request.context.get(MM_CALLER_HANDLED_STATUSES).includes(error.status)) {\n MmHttpErrorInterceptor.silencedCallerHandledErrors.add(error);\n return throwError(() => error);\n }\n\n if (error.status === 0 && request.context.get(MM_OPTIONAL_REQUEST)) {\n MmHttpErrorInterceptor.silencedOptionalErrors.add(error);\n console.debug('Optional request failed at network level, not treated as connection loss', request.url);\n return throwError(() => error);\n }\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 // The tenant authorization middleware names the denial reason in a {message} body\n // (AB#5227) — e.g. \"tenant does not exist any more, re-create it first\" on a restore\n // into a deleted tenant. Prefer that over the generic text, which reads as a\n // permission problem it often is not.\n const deniedMessage = (error.error as { message?: unknown } | null)?.message;\n this.messageService.showError(typeof deniedMessage === 'string' && deniedMessage.length > 0\n ? deniedMessage\n : 'Access denied. You do not have permission to access this tenant or resource.');\n break;\n }\n\n case 'problem':\n // A 403 refusal with a readable problem title (AB#7969): show that sentence, once, instead of\n // the generic access-denied text. Pages that catch the error skip their own toast because\n // reportsToUser answers true for it.\n this.messageService.showError(problemMessage(error.error) ?? '');\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 // A 403 problem body with a readable text (identity's role-change refusals, AB#7969) is shown as is\n // instead of the generic \"Access denied\", which reads as a missing permission it is not. A 409\n // problem stays the caller's job, as before: pages show it in place (identity's last-administrator /\n // built-in-role refusals) or in a dialog (the CK upgrade guard's CK_UPGRADE_BLOCKED). A 403 with the\n // middleware's {message} body is no problem and keeps the access-denied branch.\n if (error.status === 403 && problemMessage(error.error) !== null) {\n return 'problem';\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
|
@@ -253,6 +253,13 @@ declare class MmHttpErrorInterceptor implements HttpInterceptor {
|
|
|
253
253
|
* recognises these by identity — the interceptor rethrows the very same object.
|
|
254
254
|
*/
|
|
255
255
|
private static readonly silencedOptionalErrors;
|
|
256
|
+
/**
|
|
257
|
+
* Errors whose status the request marked as caller-handled (`MM_CALLER_HANDLED_STATUSES`): the
|
|
258
|
+
* interceptor stayed silent, so `reportsToUser` must answer `false` for them, or a caller that skips
|
|
259
|
+
* its own toast on `true` would leave the user with no message at all. Recognised by identity, like
|
|
260
|
+
* `silencedOptionalErrors`.
|
|
261
|
+
*/
|
|
262
|
+
private static readonly silencedCallerHandledErrors;
|
|
256
263
|
private readonly messageService;
|
|
257
264
|
private readonly onConnectionLost;
|
|
258
265
|
/**
|