@meshmakers/shared-services 3.4.980 → 3.4.1000

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