@platform-mesh/portal-ui-lib 0.55.0 → 0.55.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/assets/platform-mesh-portal-ui-wc.js +127 -127
- package/fesm2022/platform-mesh-portal-ui-lib-portal-options.mjs +10 -8
- package/fesm2022/platform-mesh-portal-ui-lib-portal-options.mjs.map +1 -1
- package/fesm2022/platform-mesh-portal-ui-lib-services.mjs +5 -2
- package/fesm2022/platform-mesh-portal-ui-lib-services.mjs.map +1 -1
- package/fesm2022/platform-mesh-portal-ui-lib-utils.mjs +2 -2
- package/fesm2022/platform-mesh-portal-ui-lib-utils.mjs.map +1 -1
- package/package.json +1 -1
- package/types/platform-mesh-portal-ui-lib-services.d.ts +1 -0
|
@@ -1145,12 +1145,16 @@ class NodeContextProcessingServiceImpl {
|
|
|
1145
1145
|
return;
|
|
1146
1146
|
}
|
|
1147
1147
|
const { kcpPath, accountPath } = await this.crdGatewayKcpPatchResolver.resolveCrdGatewayKcpPath(entityNode, entityId, kind);
|
|
1148
|
+
const namespace = this.luigiCoreService.routing().getSearchParams().namespace !==
|
|
1149
|
+
ALL_NAMESPACE
|
|
1150
|
+
? this.luigiCoreService.routing().getSearchParams().namespace
|
|
1151
|
+
: undefined;
|
|
1148
1152
|
// update the current already calculated by Luigi context for a node
|
|
1149
|
-
this.addFieldsToContext(ctx, entityId, kcpPath, accountPath, kind);
|
|
1153
|
+
this.addFieldsToContext(ctx, entityId, kcpPath, accountPath, kind, namespace);
|
|
1150
1154
|
// update the node context of sa node to contain the entity for future context calculations
|
|
1151
|
-
this.addFieldsToContext(entityNode.context, entityId, kcpPath, accountPath, kind);
|
|
1155
|
+
this.addFieldsToContext(entityNode.context, entityId, kcpPath, accountPath, kind, namespace);
|
|
1152
1156
|
this.accamulatePortalPermissions(ctx);
|
|
1153
|
-
this.getEntityPermissions(ctx);
|
|
1157
|
+
this.getEntityPermissions(ctx, namespace);
|
|
1154
1158
|
try {
|
|
1155
1159
|
const accountInfo = await firstValueFrom(this.accountInfoService.read({
|
|
1156
1160
|
portalContext: {
|
|
@@ -1172,11 +1176,12 @@ class NodeContextProcessingServiceImpl {
|
|
|
1172
1176
|
}
|
|
1173
1177
|
}
|
|
1174
1178
|
}
|
|
1175
|
-
addFieldsToContext(ctx, entityId, kcpPath, accountPath, kind) {
|
|
1179
|
+
addFieldsToContext(ctx, entityId, kcpPath, accountPath, kind, namespace) {
|
|
1176
1180
|
ctx.kcpPath = kcpPath;
|
|
1177
1181
|
ctx.entityName = entityId;
|
|
1178
1182
|
ctx.entityKind = kind;
|
|
1179
1183
|
ctx.accountPath = accountPath;
|
|
1184
|
+
ctx.namespaceId = namespace;
|
|
1180
1185
|
}
|
|
1181
1186
|
addFieldsToContextFromAccountInfo(ctx, entityId, accountInfo) {
|
|
1182
1187
|
const accountOriginClusterId = accountInfo.spec.account.originClusterId;
|
|
@@ -1186,7 +1191,7 @@ class NodeContextProcessingServiceImpl {
|
|
|
1186
1191
|
ctx.entityId = `${accountOriginClusterId}/${entityId}`;
|
|
1187
1192
|
ctx.kcpCA = btoa(accountInfo.spec.clusterInfo.ca);
|
|
1188
1193
|
}
|
|
1189
|
-
getEntityPermissions(ctx) {
|
|
1194
|
+
getEntityPermissions(ctx, namespace) {
|
|
1190
1195
|
const resourceDefinition = ctx.resourceDefinition;
|
|
1191
1196
|
if (!resourceDefinition || !resourceDefinition?.permissionsDefinition) {
|
|
1192
1197
|
return;
|
|
@@ -1195,9 +1200,6 @@ class NodeContextProcessingServiceImpl {
|
|
|
1195
1200
|
if (!name) {
|
|
1196
1201
|
return;
|
|
1197
1202
|
}
|
|
1198
|
-
const namespace = this.luigiCoreService
|
|
1199
|
-
.routing()
|
|
1200
|
-
.getSearchParams().namespace;
|
|
1201
1203
|
return this.instancePermissionsService
|
|
1202
1204
|
.checkInstance(ctx, resourceDefinition.permissionsDefinition, {
|
|
1203
1205
|
name,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"platform-mesh-portal-ui-lib-portal-options.mjs","sources":["../../projects/lib/portal-options/services/custom-global-nodes.service.ts","../../projects/lib/portal-options/services/header-bar-renderers/breadcrumb-renderer.ts","../../projects/lib/portal-options/services/header-bar-renderers/namespace-selection-renderer.service.ts","../../projects/lib/portal-options/services/header-bar-config.service.ts","../../projects/lib/portal-options/services/luigi-extended-global-context-config.service.ts","../../projects/lib/portal-options/services/navigation-redirect-strategy.service.ts","../../projects/lib/portal-options/persistent-panel/persistent-panel.types.ts","../../projects/lib/portal-options/persistent-panel/persistent-panel.ts","../../projects/lib/portal-options/persistent-panel/persistent-panel.html","../../projects/lib/portal-options/persistent-panel/persistent-panel.service.ts","../../projects/lib/portal-options/utils/account-hierarchy.util.ts","../../projects/lib/portal-options/services/crd-gateway-kcp-patch-resolver.service.ts","../../projects/lib/portal-options/services/node-change-hook-config.service.ts","../../projects/lib/portal-options/services/node-context-processing.service.ts","../../projects/lib/portal-options/services/router-config.service.ts","../../projects/lib/portal-options/services/user-profile-config.service.ts","../../projects/lib/portal-options/persistent-panel/open-persistent-panel.listener.ts","../../projects/lib/portal-options/platform-mesh-portal-ui-lib-portal-options.ts"],"sourcesContent":["import { PortalNodeContext } from '../models/luigi-context';\nimport { PortalLuigiNode } from '../models/luigi-node';\nimport { Injectable, inject } from '@angular/core';\nimport {\n CustomGlobalNodesService,\n EntityType,\n I18nService,\n NodeContext,\n} from '@openmfp/portal-ui-lib';\n\n@Injectable({ providedIn: 'root' })\nexport class CustomGlobalNodesServiceImpl implements CustomGlobalNodesService {\n private i18nService = inject(I18nService);\n\n async getCustomGlobalNodes(): Promise<PortalLuigiNode[]> {\n return [\n {\n pathSegment: 'error',\n order: 1000,\n hideFromNav: true,\n showBreadcrumbs: false,\n context: {} as PortalNodeContext,\n children: [\n {\n pathSegment: ':id',\n entityType: EntityType.ENTITY_ERROR,\n hideFromNav: true,\n hideSideNav: true,\n viewUrl: '/assets/platform-mesh-portal-ui-wc.js#error-component',\n context: {\n id: ':id',\n translationTable: this.i18nService.translationTable,\n } as any as NodeContext,\n webcomponent: {\n selfRegistered: true,\n type: 'module',\n },\n },\n ],\n },\n {\n pathSegment: 'users',\n showBreadcrumbs: false,\n hideSideNav: true,\n hideFromNav: true,\n context: {} as PortalNodeContext,\n entityType: 'global',\n children: [\n {\n pathSegment: ':userId',\n hideSideNav: true,\n hideFromNav: true,\n defineEntity: {\n id: 'user',\n },\n context: {\n userId: ':userId',\n } as PortalNodeContext,\n children: [\n {\n pathSegment: 'overview',\n context: {} as PortalNodeContext,\n hideSideNav: true,\n hideFromNav: true,\n defineEntity: {\n id: 'overview',\n },\n compound: {\n children: [],\n },\n },\n ],\n },\n ],\n },\n ];\n }\n}\n","import '@ui5/webcomponents/dist/Breadcrumbs.js';\nimport '@ui5/webcomponents/dist/BreadcrumbsItem.js';\n\nexport const breadcrumbRenderer = (\n containerElement: HTMLElement,\n nodeItems: any[],\n clickHandler: (item: any) => void,\n): HTMLElement => {\n containerElement.style.width = '100%';\n\n const ui5breadcrumbs = document.createElement('ui5-breadcrumbs');\n ui5breadcrumbs.setAttribute('separators', 'Slash');\n containerElement.appendChild(ui5breadcrumbs);\n\n nodeItems.forEach((item) => {\n if (item.node?.hideFromBreadcrumb) {\n return;\n }\n\n const itemCmp = document.createElement('ui5-breadcrumbs-item');\n itemCmp.textContent = item.label ?? '';\n (itemCmp as any)._item = item;\n ui5breadcrumbs.appendChild(itemCmp);\n });\n\n ui5breadcrumbs.addEventListener('item-click', (event: any) => {\n if (\n !(\n event.detail.ctrlKey ||\n event.detail.altKey ||\n event.detail.shiftKey ||\n event.detail.metaKey\n )\n ) {\n event.preventDefault();\n clickHandler(event.detail.item._item);\n }\n });\n\n return ui5breadcrumbs;\n};\n","import { DestroyRef, Injectable, inject } from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport {\n AuthService,\n LuigiCoreService,\n LuigiNode,\n PortalConfig,\n} from '@openmfp/portal-ui-lib';\nimport {\n ALL_NAMESPACE,\n PlatformMeshFieldDefinition,\n Resource,\n ResourceDefinition,\n ResourceListResult,\n} from '@platform-mesh/portal-ui-lib/models';\nimport {\n ResourceNodeContext,\n ResourceService,\n} from '@platform-mesh/portal-ui-lib/services';\nimport {\n generateGraphQLFields,\n isNamespacedResource,\n mergeListWithSubscriptionResult,\n} from '@platform-mesh/portal-ui-lib/utils';\nimport '@ui5/webcomponents/dist/ComboBox.js';\nimport { Observable, Subject, defer, of } from 'rxjs';\nimport {\n catchError,\n retry,\n scan,\n shareReplay,\n startWith,\n switchMap,\n takeUntil,\n tap,\n} from 'rxjs/operators';\n\nconst defaultColumns: PlatformMeshFieldDefinition[] = [\n {\n label: 'Name',\n property: 'metadata.name',\n },\n];\n\n@Injectable({ providedIn: 'root' })\nexport class NamespaceSelectionRendererService {\n private namespaceResourcesCache?: {\n key: string;\n value$: Observable<Resource[]>;\n stop$: Subject<void>;\n };\n\n private resourceService = inject(ResourceService);\n private authService = inject(AuthService);\n private luigiCoreService = inject(LuigiCoreService);\n private destroyRef = inject(DestroyRef);\n\n public create(portalConfig: PortalConfig) {\n return (\n containerElement: HTMLElement,\n nodeItems: any[],\n _clickHandler: any,\n ) => {\n containerElement.style.paddingBottom = '0.5rem';\n\n const lastNode = nodeItems.at(-1)?.node as LuigiNode | undefined;\n const namespace = this.luigiCoreService\n .routing()\n .getSearchParams().namespace;\n const kcpPath = lastNode?.context?.kcpPath;\n\n if (lastNode?.context && !isNamespacedResource(lastNode.context)) {\n return containerElement;\n }\n\n const ui5combobox = this.createCombobox(containerElement);\n\n this.addComboboxItems(portalConfig, ui5combobox, namespace, kcpPath);\n\n ui5combobox.addEventListener('change', (event: any) => {\n const value = (event?.target as any)?.value.trim() ?? '';\n this.changeNamespace(value);\n });\n\n return ui5combobox as HTMLElement;\n };\n }\n\n private createCombobox(containerElement: HTMLElement) {\n const ui5combobox = document.createElement('ui5-combobox');\n ui5combobox.setAttribute('placeholder', 'Namespaces');\n ui5combobox.setAttribute('data-testid', 'namespace-selection-combobox');\n containerElement.appendChild(ui5combobox);\n\n return ui5combobox;\n }\n\n private addComboboxItems(\n portalConfig: PortalConfig,\n ui5combobox: HTMLElement,\n namespace: string | null,\n kcpPath?: string,\n ) {\n this.getNamespaceResourcesCached(portalConfig, kcpPath).subscribe(\n (resources) => {\n this.syncComboboxItems(ui5combobox, resources);\n this.setSelectedValue(ui5combobox, resources, namespace);\n },\n );\n }\n\n private getNamespaceResourcesCached(\n portalConfig: PortalConfig,\n kcpPath?: string,\n ): Observable<Resource[]> {\n const cacheKey = this.getNamespaceResourcesCacheKey(kcpPath);\n if (this.namespaceResourcesCache?.key === cacheKey) {\n return this.namespaceResourcesCache.value$;\n }\n\n if (this.namespaceResourcesCache) {\n this.namespaceResourcesCache.stop$.next();\n this.namespaceResourcesCache.stop$.complete();\n this.namespaceResourcesCache = undefined;\n }\n\n const stop$ = new Subject<void>();\n const value$ = this.getNamespaceResources(\n portalConfig,\n kcpPath,\n stop$,\n ).pipe(shareReplay(1), takeUntilDestroyed(this.destroyRef));\n this.namespaceResourcesCache = {\n key: cacheKey,\n value$,\n stop$,\n };\n\n return value$;\n }\n\n private getNamespaceResourcesCacheKey(kcpPath?: string): string {\n return kcpPath ?? '';\n }\n\n private syncComboboxItems(ui5combobox: HTMLElement, resources: Resource[]) {\n ui5combobox.replaceChildren();\n\n resources.forEach((resource) => {\n const name = resource.metadata?.name;\n if (!name) {\n return;\n }\n const resourceOption = document.createElement('ui5-cb-item');\n resourceOption.setAttribute('text', name);\n resourceOption.setAttribute(\n 'data-testid',\n `namespace-selection-combobox-item-${name}`,\n );\n ui5combobox.appendChild(resourceOption);\n });\n\n const allOption = document.createElement('ui5-cb-item');\n allOption.setAttribute('text', ALL_NAMESPACE);\n allOption.setAttribute(\n 'data-testid',\n 'namespace-selection-combobox-item-all',\n );\n ui5combobox.appendChild(allOption);\n }\n\n private setSelectedValue(\n ui5combobox: HTMLElement,\n resources: Resource[],\n namespace: string | null,\n ) {\n const currentNamespace = this.luigiCoreService\n .routing()\n .getSearchParams().namespace;\n\n if (currentNamespace) {\n ui5combobox.setAttribute('value', currentNamespace);\n return;\n }\n\n if (\n namespace &&\n resources.find((resource) => resource.metadata?.name === namespace)\n ) {\n ui5combobox.setAttribute('value', namespace);\n } else {\n ui5combobox.setAttribute('value', ALL_NAMESPACE);\n this.changeNamespace(ALL_NAMESPACE);\n }\n }\n\n private getNamespaceResources(\n portalConfig: PortalConfig,\n kcpPath: string | undefined,\n stop$: Subject<void>,\n ): Observable<Resource[]> {\n const operation = 'v1_namespaces';\n const fields = generateGraphQLFields(defaultColumns);\n const context = {\n portalContext: {\n crdGatewayApiUrl: portalConfig.portalContext['crdGatewayApiUrl'],\n },\n resourceDefinition: {\n version: 'v1',\n entityCollection: 'Namespaces',\n entity: 'Namespace',\n scope: 'Cluster',\n } as ResourceDefinition,\n kcpPath,\n token: this.authService.getToken(),\n } as ResourceNodeContext;\n\n return defer(() =>\n this.resourceService.list(operation, fields, context),\n ).pipe(\n retry(3),\n takeUntil(stop$),\n switchMap((result: ResourceListResult) =>\n this.resourceService\n .resourceChangeSubscription(\n operation,\n fields,\n context,\n result.resourceVersion,\n false,\n )\n .pipe(\n startWith(undefined),\n scan(\n (resources, subscriptionResult) =>\n mergeListWithSubscriptionResult(resources, subscriptionResult, {\n getItemKey: (resource) => resource.metadata?.name,\n mapSubscriptionObjectToItem: (object) => object,\n }),\n result.items,\n ),\n tap((result) => {\n const namespaces = result.map((e) => e.metadata?.name);\n this.luigiCoreService.setInGlobalContext({ namespaces });\n }),\n takeUntil(stop$),\n ),\n ),\n catchError((error) => {\n console.error(`Failed to read entities from ${operation}`, error);\n return of([]);\n }),\n );\n }\n\n private changeNamespace(value: string): void {\n if (!value) {\n return;\n }\n\n const oldValue = this.luigiCoreService\n .routing()\n .getSearchParams().namespace;\n\n if (oldValue === value) {\n return;\n }\n\n this.luigiCoreService.routing().addSearchParams({ namespace: value });\n }\n}\n","import { breadcrumbRenderer } from './header-bar-renderers/breadcrumb-renderer';\nimport { NamespaceSelectionRendererService } from './header-bar-renderers/namespace-selection-renderer.service';\nimport { Injectable, inject } from '@angular/core';\nimport {\n ConfigService,\n HeaderBarConfig,\n HeaderBarConfigService,\n} from '@openmfp/portal-ui-lib';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class HeaderBarConfigServiceImpl implements HeaderBarConfigService {\n private configService = inject(ConfigService);\n private namespaceSelectionRendererService = inject(\n NamespaceSelectionRendererService,\n );\n\n public async getConfig(): Promise<HeaderBarConfig> {\n const portalConfig = await this.configService.getPortalConfig();\n\n return {\n pendingItemLabel: '...',\n omitRoot: false,\n clearBeforeRender: true,\n autoHide: true,\n leftRenderers: [breadcrumbRenderer],\n rightRenderers: [\n this.namespaceSelectionRendererService.create(portalConfig),\n ],\n };\n }\n}\n","import { kcpRootOrgsPath } from '../models/constants';\nimport { Injectable, inject } from '@angular/core';\nimport {\n EnvConfigService,\n LuigiExtendedGlobalContextConfigService,\n} from '@openmfp/portal-ui-lib';\n\n@Injectable({ providedIn: 'root' })\nexport class LuigiExtendedGlobalContextConfigServiceImpl implements LuigiExtendedGlobalContextConfigService {\n private envConfigService = inject(EnvConfigService);\n\n async createLuigiExtendedGlobalContext(): Promise<Record<string, any>> {\n const idpName = (await this.envConfigService.getEnvConfig()).idpName;\n\n if (idpName === 'welcome') {\n return {};\n }\n\n return {\n organization: idpName,\n kcpPath: `${kcpRootOrgsPath}:${idpName}`,\n entityName: idpName,\n };\n }\n}\n","import { Injectable } from '@angular/core';\nimport {\n LocalStorageKeys,\n NavigationRedirectStrategy,\n} from '@openmfp/portal-ui-lib';\n\n@Injectable({ providedIn: 'root' })\nexport class NavigationRedirectStrategyServiceImpl implements NavigationRedirectStrategy {\n getRedirectUrl(): string {\n return localStorage.getItem(LocalStorageKeys.LAST_NAVIGATION_URL) || '';\n }\n\n saveRedirectUrl(url: string): void {\n if (url.startsWith('/error')) {\n return;\n }\n\n localStorage.setItem(LocalStorageKeys.LAST_NAVIGATION_URL, url);\n }\n\n clearRedirectUrl(): void {\n localStorage.removeItem(LocalStorageKeys.LAST_NAVIGATION_URL);\n }\n}\n","import type { NodeContext } from '@openmfp/portal-ui-lib';\n\nexport const OPEN_PERSISTENT_PANEL_MESSAGE = 'portal.open-provider-panel';\n\nexport const PROVIDER_PANEL_MESSAGE = {\n close: 'portal.provider-panel.close',\n closeFailed: 'portal.provider-panel.close-failed',\n closed: 'portal.provider-panel.closed',\n context: 'portal.provider-panel.context',\n ready: 'portal.provider-panel.ready',\n requestClose: 'portal.provider-panel.request-close',\n} as const;\n\nexport interface PersistentPanelConfig {\n id: string;\n title: string;\n url: string;\n origin: string;\n}\n\nexport interface PersistentPanelTarget {\n organization?: string;\n organizationId?: string;\n account?: string;\n accountPath?: string;\n workspacePath?: string;\n namespace?: string;\n resource?: {\n group?: string;\n version?: string;\n kind?: string;\n name?: string;\n };\n}\n\nexport interface RegisteredProviderNode {\n viewUrl?: string;\n context?: Partial<NodeContext> & {\n persistentPanel?: unknown;\n };\n}\n\nexport function mergePersistentPanelTargets(\n current: PersistentPanelTarget,\n update: PersistentPanelTarget,\n): PersistentPanelTarget {\n const organizationChanged =\n current.organization !== undefined &&\n update.organization !== undefined &&\n current.organization !== update.organization;\n const accountChanged =\n current.account !== undefined &&\n update.account !== undefined &&\n current.account !== update.account;\n\n if (organizationChanged || accountChanged) {\n return structuredClone(update);\n }\n\n // Provider nodes normally contain only panel capability metadata. Keep the\n // target tracked by navigation and overlay any bounded scope that the\n // requesting node does carry.\n return structuredClone({ ...current, ...update });\n}\n\ninterface OpenPanelMessage extends Record<string, unknown> {\n id: string;\n}\n\nconst panelIdPattern = /^[a-z0-9](?:[a-z0-9.-]{0,62}[a-z0-9])?$/;\nconst workspaceSegmentPattern = /^[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?$/;\n\nexport function parsePersistentPanelConfig(\n message: OpenPanelMessage,\n providerNode: RegisteredProviderNode | undefined,\n portalOrigin: string,\n): PersistentPanelConfig {\n if (message.id !== OPEN_PERSISTENT_PANEL_MESSAGE) {\n throw new Error('Persistent panel request is invalid');\n }\n\n const capability = recordValue(providerNode?.context?.persistentPanel);\n const id = boundedString(capability['id'], 64);\n const title = boundedString(capability['title'], 80);\n if (!id || !panelIdPattern.test(id)) {\n throw new Error('Registered persistent panel id is invalid');\n }\n if (!title) {\n throw new Error('Registered persistent panel title is invalid');\n }\n\n const registeredViewUrl = boundedString(providerNode?.viewUrl, 2048);\n if (!registeredViewUrl) {\n throw new Error('Registered provider UI URL is missing');\n }\n\n const portalURL = new URL(portalOrigin);\n const url = new URL(registeredViewUrl, portalURL);\n if (\n url.origin === portalURL.origin ||\n !allowedPanelURL(url, portalURL) ||\n url.username ||\n url.password\n ) {\n throw new Error('Registered provider UI URL is invalid');\n }\n\n return { id, title, url: url.toString(), origin: url.origin };\n}\n\nfunction allowedPanelURL(url: URL, portalURL: URL): boolean {\n if (url.protocol === 'https:') {\n return true;\n }\n return (\n portalURL.protocol === 'http:' &&\n url.protocol === 'http:' &&\n ['localhost', '127.0.0.1', '[::1]'].includes(url.hostname)\n );\n}\n\nexport function persistentPanelTarget(\n globalContext: Record<string, unknown>,\n nodeContext?: NodeContext | Record<string, unknown>,\n): PersistentPanelTarget {\n const context = { ...globalContext, ...(nodeContext ?? {}) };\n const entityContext = recordValue(context['entityContext']);\n const accountContext = recordValue(entityContext['account']);\n const resourceDefinition = recordValue(context['resourceDefinition']);\n\n const organization = boundedString(context['organization'], 253);\n const organizationId = boundedString(context['organizationId'], 512);\n const rawAccountPath = boundedString(context['accountPath'], 1024);\n const account =\n boundedString(accountContext['id'], 253) ||\n boundedString(context['accountId'], 253) ||\n boundedString(context['core_platform-mesh_io_accountId'], 253) ||\n accountFromPath(rawAccountPath, organization) ||\n accountFromEntity(context);\n\n // Organization-only scope is valid, but descendants without an account are\n // not. Organization context can carry a kcpPath, so fail closed before\n // projecting workspace fields.\n if (!account) {\n return compact({ organization, organizationId });\n }\n\n const accountPath = validatedAccountPath(\n rawAccountPath,\n organization,\n account,\n );\n\n const workspacePath =\n validatedWorkspacePath(context['workspacePath'], organization, account) ||\n validatedWorkspacePath(context['kcpPath'], organization, account) ||\n validatedWorkspacePath(rawAccountPath, organization, account) ||\n canonicalAccountPath(organization, account);\n const namespace =\n boundedString(context['namespaceId'], 253) ||\n boundedString(resourceDefinition['namespace'], 253);\n const resource = compact({\n group:\n boundedString(resourceDefinition['group'], 253) ||\n boundedString(resourceDefinition['apiGroup'], 253),\n version: boundedString(resourceDefinition['version'], 63),\n kind:\n boundedString(resourceDefinition['kind'], 253) ||\n boundedString(context['entityKind'], 253),\n name: boundedString(context['entityName'], 253),\n });\n\n return compact({\n organization,\n organizationId,\n account,\n accountPath,\n workspacePath,\n namespace,\n resource: Object.keys(resource).length > 0 ? resource : undefined,\n });\n}\n\nfunction accountFromPath(\n accountPath: string | undefined,\n organization: string | undefined,\n): string | undefined {\n if (!accountPath) {\n return undefined;\n }\n if (workspaceSegmentPattern.test(accountPath)) {\n return accountPath;\n }\n const segments = accountPath.split(':');\n if (\n segments.length < 4 ||\n segments[0] !== 'root' ||\n segments[1] !== 'orgs' ||\n segments.some((segment) => !workspaceSegmentPattern.test(segment)) ||\n (organization !== undefined && segments[2] !== organization)\n ) {\n return undefined;\n }\n return boundedString(segments.at(-1), 253);\n}\n\nfunction accountFromEntity(\n context: Record<string, unknown>,\n): string | undefined {\n if (boundedString(context['entityKind'], 253) !== 'Account') {\n return undefined;\n }\n return boundedString(context['entityName'], 253);\n}\n\nfunction canonicalWorkspacePath(\n accountPath: string | undefined,\n): string | undefined {\n if (!accountPath?.startsWith('root:')) {\n return undefined;\n }\n const segments = accountPath.split(':');\n if (\n segments.length < 3 ||\n segments.some((segment) => !workspaceSegmentPattern.test(segment))\n ) {\n return undefined;\n }\n return accountPath;\n}\n\nfunction validatedWorkspacePath(\n value: unknown,\n organization: string | undefined,\n account: string | undefined,\n): string | undefined {\n if (!organization || !account) {\n return undefined;\n }\n const path = canonicalWorkspacePath(boundedString(value, 1024));\n const segments = path?.split(':');\n if (\n !segments ||\n segments.length < 4 ||\n segments[0] !== 'root' ||\n segments[1] !== 'orgs' ||\n segments[2] !== organization ||\n segments.at(-1) !== account\n ) {\n return undefined;\n }\n return path;\n}\n\nfunction validatedAccountPath(\n value: string | undefined,\n organization: string | undefined,\n account: string,\n): string | undefined {\n if (!value) {\n return undefined;\n }\n if (workspaceSegmentPattern.test(value)) {\n return value === account ? value : undefined;\n }\n return validatedWorkspacePath(value, organization, account);\n}\n\nfunction canonicalAccountPath(\n organization: string | undefined,\n account: string | undefined,\n): string | undefined {\n if (\n !organization ||\n !account ||\n !workspaceSegmentPattern.test(organization) ||\n !workspaceSegmentPattern.test(account)\n ) {\n return undefined;\n }\n return `root:orgs:${organization}:${account}`;\n}\n\nfunction compact<T extends Record<string, unknown>>(value: T): T {\n return Object.fromEntries(\n Object.entries(value).filter(([, item]) => item !== undefined),\n ) as T;\n}\n\nfunction boundedString(value: unknown, maxLength: number): string | undefined {\n if (typeof value !== 'string') {\n return undefined;\n }\n const trimmed = value.trim();\n if (!trimmed || trimmed.length > maxLength || trimmed.includes('\\u0000')) {\n return undefined;\n }\n return trimmed;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction recordValue(value: unknown): Record<string, unknown> {\n return isRecord(value) ? value : {};\n}\n","import {\n PROVIDER_PANEL_MESSAGE,\n PersistentPanelConfig,\n PersistentPanelTarget,\n} from './persistent-panel.types';\nimport { CommonModule } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n OnDestroy,\n ViewChild,\n computed,\n inject,\n signal,\n} from '@angular/core';\nimport { DomSanitizer, SafeResourceUrl } from '@angular/platform-browser';\n\ntype PanelState = 'hidden' | 'expanded' | 'maximized';\n\nconst PORTAL_MAIN_AREA_SELECTOR = '.iframeContainer';\nconst PORTAL_LAYOUT_SELECTORS = [\n PORTAL_MAIN_AREA_SELECTOR,\n '.spinnerContainer.appSpinner',\n '#splitViewContainer',\n '#splitViewDragger',\n '#splitViewDraggerBackdrop',\n '#tabsContainer',\n].join(',');\n\ninterface InlineStyleValue {\n value: string;\n priority: string;\n}\n\n@Component({\n selector: 'pm-persistent-panel',\n imports: [CommonModule],\n standalone: true,\n templateUrl: './persistent-panel.html',\n styleUrl: './persistent-panel.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class PersistentPanelComponent implements OnDestroy {\n @ViewChild('panelFrame') panelFrame?: ElementRef<HTMLIFrameElement>;\n @ViewChild('reopenButton') reopenButton?: ElementRef<HTMLButtonElement>;\n\n private readonly dimensions = panelDimensions();\n private readonly preferredPanelWidth = signal(this.dimensions.defaultWidth);\n\n readonly state = signal<PanelState>('hidden');\n readonly title = signal('');\n readonly source = signal<SafeResourceUrl | null>(null);\n readonly closing = signal(false);\n readonly closeError = signal('');\n readonly resizing = signal(false);\n readonly maxPanelWidth = signal(this.availablePanelWidth());\n readonly minPanelWidth = computed(() =>\n Math.min(this.dimensions.minimumWidth, this.maxPanelWidth()),\n );\n readonly panelWidth = computed(() =>\n Math.max(\n this.minPanelWidth(),\n Math.min(\n this.state() === 'maximized'\n ? this.maxPanelWidth()\n : this.preferredPanelWidth(),\n this.maxPanelWidth(),\n ),\n ),\n );\n\n private readonly sanitizer = inject(DomSanitizer);\n private config: PersistentPanelConfig | null = null;\n private target: PersistentPanelTarget = {};\n private sequence = 0;\n private closeSequence = 0;\n private closeTimeout: number | null = null;\n private closeRequestIdSent: number | null = null;\n private destroyed = false;\n private ready = false;\n private returnFocusElement: HTMLElement | null = null;\n private resizePointerId: number | null = null;\n private observingPortalLayout = false;\n private observedMainArea: HTMLElement | null = null;\n private readonly portalLayoutStyles = new Map<\n HTMLElement,\n InlineStyleValue\n >();\n private readonly portalLayoutObserver = new MutationObserver(() => {\n if (this.state() === 'hidden') {\n return;\n }\n this.maxPanelWidth.set(this.availablePanelWidth());\n this.syncPortalLayout();\n });\n private readonly mainAreaResizeObserver =\n typeof ResizeObserver === 'undefined'\n ? null\n : new ResizeObserver(() => {\n if (this.state() === 'hidden') {\n return;\n }\n this.maxPanelWidth.set(this.availablePanelWidth());\n this.syncPortalLayout();\n });\n\n constructor() {\n window.addEventListener('message', this.onMessage);\n window.addEventListener('resize', this.onWindowResize);\n }\n\n ngOnDestroy(): void {\n this.destroyed = true;\n window.removeEventListener('message', this.onMessage);\n window.removeEventListener('resize', this.onWindowResize);\n this.clearCloseTimeout();\n this.resizePointerId = null;\n this.resizing.set(false);\n this.portalLayoutObserver.disconnect();\n this.mainAreaResizeObserver?.disconnect();\n this.restorePortalLayout();\n }\n\n open(config: PersistentPanelConfig, target: PersistentPanelTarget): void {\n if (this.closing()) {\n this.closeSequence += 1;\n }\n this.clearCloseTimeout();\n this.closeRequestIdSent = null;\n this.closing.set(false);\n this.closeError.set('');\n const sourceChanged = this.config?.url !== config.url;\n if (!this.source()) {\n this.returnFocusElement =\n document.activeElement instanceof HTMLElement\n ? document.activeElement\n : null;\n }\n if (sourceChanged) {\n this.ready = false;\n }\n this.config = config;\n this.target = structuredClone(target);\n this.title.set(config.title);\n if (sourceChanged || !this.source()) {\n this.source.set(\n this.sanitizer.bypassSecurityTrustResourceUrl(config.url),\n );\n }\n this.maxPanelWidth.set(this.availablePanelWidth());\n this.state.set('expanded');\n this.syncPortalLayout();\n queueMicrotask(() => {\n if (this.destroyed) {\n return;\n }\n this.publishTarget();\n this.focusPanel();\n });\n }\n\n updateTarget(target: PersistentPanelTarget): void {\n this.target = structuredClone(target);\n this.maxPanelWidth.set(this.availablePanelWidth());\n this.syncPortalLayout();\n this.publishTarget();\n }\n\n collapse(): void {\n this.state.set('hidden');\n this.syncPortalLayout();\n queueMicrotask(() => {\n if (this.destroyed) {\n return;\n }\n this.reopenButton?.nativeElement.focus();\n });\n }\n\n expand(): void {\n this.maxPanelWidth.set(this.availablePanelWidth());\n this.state.set('expanded');\n this.syncPortalLayout();\n queueMicrotask(() => {\n if (this.destroyed) {\n return;\n }\n this.focusPanel();\n });\n }\n\n toggleSize(): void {\n this.state.update((state) =>\n state === 'maximized' ? 'expanded' : 'maximized',\n );\n this.syncPortalLayout();\n }\n\n beginResize(event: PointerEvent): void {\n if (\n this.state() !== 'expanded' ||\n event.button !== 0 ||\n event.isPrimary === false\n ) {\n return;\n }\n this.resizePointerId = event.pointerId;\n this.resizing.set(true);\n (event.currentTarget as HTMLElement).setPointerCapture(event.pointerId);\n event.preventDefault();\n }\n\n resize(event: PointerEvent): void {\n if (event.pointerId !== this.resizePointerId) {\n return;\n }\n this.setPanelWidth(window.innerWidth - event.clientX);\n event.preventDefault();\n }\n\n finishResize(event: PointerEvent): void {\n if (event.pointerId !== this.resizePointerId) {\n return;\n }\n const handle = event.currentTarget as HTMLElement;\n if (handle.hasPointerCapture(event.pointerId)) {\n handle.releasePointerCapture(event.pointerId);\n }\n this.resizePointerId = null;\n this.resizing.set(false);\n event.preventDefault();\n }\n\n resizeWithKeyboard(event: KeyboardEvent): void {\n let width: number;\n switch (event.key) {\n case 'ArrowLeft':\n width = this.panelWidth() + this.dimensions.keyboardStep;\n break;\n case 'ArrowRight':\n width = this.panelWidth() - this.dimensions.keyboardStep;\n break;\n case 'Home':\n width = this.minPanelWidth();\n break;\n case 'End':\n width = this.maxPanelWidth();\n break;\n default:\n return;\n }\n this.setPanelWidth(width);\n event.preventDefault();\n }\n\n close(): void {\n if (!this.source() || this.closing()) {\n return;\n }\n this.closeSequence += 1;\n const requestId = this.closeSequence;\n this.closeRequestIdSent = null;\n this.closing.set(true);\n this.closeError.set('');\n this.state.set('hidden');\n this.syncPortalLayout();\n this.focusReturnTarget();\n this.requestCloseIfReady(requestId);\n this.closeTimeout = window.setTimeout(() => {\n this.failClose(requestId);\n }, 30_000);\n }\n\n private failClose(requestId: number): void {\n if (!this.closing() || requestId !== this.closeSequence) {\n return;\n }\n this.clearCloseTimeout();\n this.closeRequestIdSent = null;\n this.closing.set(false);\n this.closeError.set('Provider cleanup is incomplete. Try closing again.');\n this.maxPanelWidth.set(this.availablePanelWidth());\n this.state.set('expanded');\n this.syncPortalLayout();\n queueMicrotask(() => {\n if (this.destroyed) {\n return;\n }\n this.focusPanel();\n });\n }\n\n private finishClose(requestId: number): void {\n if (\n !this.closing() ||\n requestId !== this.closeSequence ||\n this.closeRequestIdSent !== requestId\n ) {\n return;\n }\n this.clearCloseTimeout();\n this.closeRequestIdSent = null;\n this.closing.set(false);\n this.closeError.set('');\n this.config = null;\n this.ready = false;\n this.source.set(null);\n this.title.set('');\n this.state.set('hidden');\n this.syncPortalLayout();\n this.focusReturnTarget();\n this.returnFocusElement = null;\n }\n\n private clearCloseTimeout(): void {\n if (this.closeTimeout !== null) {\n window.clearTimeout(this.closeTimeout);\n this.closeTimeout = null;\n }\n }\n\n frameLoaded(): void {\n this.maxPanelWidth.set(this.availablePanelWidth());\n this.syncPortalLayout();\n this.publishTarget();\n }\n\n private publishTarget(): void {\n if (!this.config) {\n return;\n }\n this.sequence += 1;\n this.post({\n type: PROVIDER_PANEL_MESSAGE.context,\n panelId: this.config.id,\n sequence: this.sequence,\n target: this.target,\n });\n }\n\n private requestCloseIfReady(requestId: number): void {\n if (\n !this.ready ||\n !this.closing() ||\n requestId !== this.closeSequence ||\n this.closeRequestIdSent === requestId\n ) {\n return;\n }\n this.closeRequestIdSent = requestId;\n this.post({ type: PROVIDER_PANEL_MESSAGE.close, requestId });\n }\n\n private focusPanel(): void {\n this.panelFrame?.nativeElement.focus?.();\n }\n\n private focusReturnTarget(): void {\n if (this.returnFocusElement?.isConnected) {\n this.returnFocusElement.focus();\n }\n }\n\n private post(message: Record<string, unknown>): void {\n if (!this.config) {\n return;\n }\n this.panelFrame?.nativeElement.contentWindow?.postMessage(\n message,\n this.config.origin,\n );\n }\n\n private setPanelWidth(width: number): void {\n this.preferredPanelWidth.set(\n Math.min(Math.max(width, this.minPanelWidth()), this.maxPanelWidth()),\n );\n this.syncPortalLayout();\n }\n\n private availablePanelWidth(): number {\n if (this.isMobileViewport()) {\n return Math.max(1, window.innerWidth);\n }\n return Math.max(1, Math.floor(this.availableMainAreaWidth() / 2));\n }\n\n private availableMainAreaWidth(): number {\n const mainArea = document.querySelector<HTMLElement>(\n PORTAL_MAIN_AREA_SELECTOR,\n );\n if (mainArea) {\n return Math.max(\n 1,\n window.innerWidth - mainArea.getBoundingClientRect().left,\n );\n }\n return Math.max(1, window.innerWidth);\n }\n\n private syncPortalLayout(): void {\n if (this.state() === 'hidden' || this.isMobileViewport()) {\n this.stopObservingPortalLayout();\n this.restorePortalLayout();\n return;\n }\n\n this.observePortalLayout();\n const offset = `${this.panelWidth()}px`;\n document\n .querySelectorAll<HTMLElement>(PORTAL_LAYOUT_SELECTORS)\n .forEach((element) => {\n if (!this.portalLayoutStyles.has(element)) {\n this.portalLayoutStyles.set(element, {\n value: element.style.getPropertyValue('right'),\n priority: element.style.getPropertyPriority('right'),\n });\n }\n element.style.setProperty('right', offset);\n });\n }\n\n private restorePortalLayout(): void {\n this.portalLayoutStyles.forEach(({ value, priority }, element) => {\n if (value) {\n element.style.setProperty('right', value, priority);\n } else {\n element.style.removeProperty('right');\n }\n });\n this.portalLayoutStyles.clear();\n }\n\n private observePortalLayout(): void {\n this.observeMainAreaResize();\n if (this.observingPortalLayout) {\n return;\n }\n this.portalLayoutObserver.observe(document.body, {\n childList: true,\n subtree: true,\n });\n this.observingPortalLayout = true;\n }\n\n private stopObservingPortalLayout(): void {\n this.portalLayoutObserver.disconnect();\n this.mainAreaResizeObserver?.disconnect();\n this.observedMainArea = null;\n this.observingPortalLayout = false;\n }\n\n private observeMainAreaResize(): void {\n const mainArea = document.querySelector<HTMLElement>(\n PORTAL_MAIN_AREA_SELECTOR,\n );\n if (!this.mainAreaResizeObserver || mainArea === this.observedMainArea) {\n return;\n }\n this.mainAreaResizeObserver.disconnect();\n this.observedMainArea = mainArea;\n if (mainArea) {\n this.mainAreaResizeObserver.observe(mainArea);\n }\n }\n\n private isMobileViewport(): boolean {\n return window.innerWidth <= 600;\n }\n\n private readonly onWindowResize = (): void => {\n this.maxPanelWidth.set(this.availablePanelWidth());\n this.syncPortalLayout();\n };\n\n private readonly onMessage = (event: MessageEvent<unknown>): void => {\n const frame = this.panelFrame?.nativeElement;\n if (\n !frame ||\n event.source !== frame.contentWindow ||\n event.origin !== this.config?.origin ||\n !isRecord(event.data)\n ) {\n return;\n }\n if (event.data['type'] === PROVIDER_PANEL_MESSAGE.ready) {\n this.ready = true;\n if (this.closing()) {\n this.requestCloseIfReady(this.closeSequence);\n } else {\n this.publishTarget();\n }\n }\n if (event.data['type'] === PROVIDER_PANEL_MESSAGE.requestClose) {\n this.close();\n }\n if (\n event.data['type'] === PROVIDER_PANEL_MESSAGE.closeFailed &&\n typeof event.data['requestId'] === 'number' &&\n event.data['requestId'] === this.closeRequestIdSent\n ) {\n this.failClose(event.data['requestId']);\n }\n if (\n event.data['type'] === PROVIDER_PANEL_MESSAGE.closed &&\n typeof event.data['requestId'] === 'number'\n ) {\n this.finishClose(event.data['requestId']);\n }\n };\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction panelDimensions() {\n const rootFontSize = Number.parseFloat(\n window.getComputedStyle(document.documentElement).fontSize,\n );\n const rem =\n Number.isFinite(rootFontSize) && rootFontSize > 0 ? rootFontSize : 16;\n return {\n defaultWidth: 34 * rem,\n minimumWidth: 20 * rem,\n keyboardStep: 2 * rem,\n };\n}\n","<section\n class=\"persistent-panel fd-dialog__content\"\n role=\"complementary\"\n aria-labelledby=\"persistent-panel-title\"\n [attr.aria-hidden]=\"state() === 'hidden'\"\n [class.maximized]=\"state() === 'maximized'\"\n [class.open]=\"state() !== 'hidden'\"\n [class.resizing]=\"resizing()\"\n [style.--pm-panel-width]=\"panelWidth() + 'px'\"\n>\n <div\n class=\"persistent-panel-resizer\"\n role=\"separator\"\n aria-label=\"Resize provider panel\"\n aria-orientation=\"vertical\"\n aria-controls=\"persistent-panel-content\"\n [attr.aria-valuemin]=\"minPanelWidth()\"\n [attr.aria-valuemax]=\"maxPanelWidth()\"\n [attr.aria-valuenow]=\"panelWidth()\"\n tabindex=\"0\"\n (pointerdown)=\"beginResize($event)\"\n (pointermove)=\"resize($event)\"\n (pointerup)=\"finishResize($event)\"\n (pointercancel)=\"finishResize($event)\"\n (lostpointercapture)=\"finishResize($event)\"\n (keydown)=\"resizeWithKeyboard($event)\"\n ></div>\n <header\n class=\"persistent-panel-header fd-dialog__header fd-bar fd-bar--header\"\n >\n <div class=\"fd-bar__left persistent-panel-title-area\">\n <div class=\"fd-bar__element persistent-panel-title-element\">\n <h2\n id=\"persistent-panel-title\"\n class=\"fd-title fd-title--h5 persistent-panel-title\"\n >\n {{ title() }}\n </h2>\n </div>\n </div>\n <div class=\"fd-bar__right persistent-panel-actions\">\n <div class=\"fd-bar__element\">\n <button\n class=\"fd-button fd-button--transparent fd-button--compact\"\n aria-label=\"Toggle panel size\"\n [attr.aria-pressed]=\"state() === 'maximized'\"\n title=\"Toggle panel size\"\n type=\"button\"\n (click)=\"toggleSize()\"\n >\n <i\n class=\"sap-icon\"\n [class.sap-icon--exitfullscreen]=\"state() === 'maximized'\"\n [class.sap-icon--full-screen]=\"state() !== 'maximized'\"\n aria-hidden=\"true\"\n ></i>\n </button>\n </div>\n <div class=\"fd-bar__element\">\n <button\n class=\"fd-button fd-button--transparent fd-button--compact\"\n aria-label=\"Collapse panel\"\n title=\"Collapse panel\"\n type=\"button\"\n (click)=\"collapse()\"\n >\n <i class=\"sap-icon sap-icon--collapse\" aria-hidden=\"true\"></i>\n </button>\n </div>\n <div class=\"fd-bar__element\">\n <button\n class=\"fd-button fd-button--transparent fd-button--compact\"\n aria-label=\"Close panel\"\n title=\"Close panel\"\n type=\"button\"\n (click)=\"close()\"\n >\n <i class=\"sap-icon sap-icon--decline\" aria-hidden=\"true\"></i>\n </button>\n </div>\n </div>\n </header>\n <div class=\"persistent-panel-body fd-dialog__body\">\n @if (closeError()) {\n <p class=\"persistent-panel-error\" role=\"alert\">{{ closeError() }}</p>\n } @if (source()) {\n <iframe\n #panelFrame\n id=\"persistent-panel-content\"\n class=\"persistent-panel-frame\"\n referrerpolicy=\"no-referrer\"\n sandbox=\"allow-forms allow-popups allow-popups-to-escape-sandbox allow-same-origin allow-scripts\"\n [src]=\"source()\"\n [title]=\"title()\"\n (load)=\"frameLoaded()\"\n ></iframe>\n }\n </div>\n</section>\n\n@if (state() === 'hidden' && source() && !closing()) {\n<button\n #reopenButton\n class=\"persistent-panel-reopen fd-button fd-button--emphasized fd-button--compact\"\n [attr.aria-label]=\"'Open ' + title()\"\n type=\"button\"\n (click)=\"expand()\"\n>\n {{ title() }}\n</button>\n}\n","import { PersistentPanelComponent } from './persistent-panel';\nimport {\n PersistentPanelConfig,\n PersistentPanelTarget,\n persistentPanelTarget,\n} from './persistent-panel.types';\nimport {\n ApplicationRef,\n ComponentRef,\n EnvironmentInjector,\n Injectable,\n OnDestroy,\n createComponent,\n inject,\n} from '@angular/core';\n\n@Injectable({ providedIn: 'root' })\nexport class PersistentPanelService implements OnDestroy {\n private readonly appRef = inject(ApplicationRef);\n private readonly environmentInjector = inject(EnvironmentInjector);\n private panelRef: ComponentRef<PersistentPanelComponent> | null = null;\n private target: PersistentPanelTarget = {};\n private targetUpdateSequence = 0;\n\n open(config: PersistentPanelConfig, target: PersistentPanelTarget): void {\n this.target = target;\n if (!this.panelRef) {\n this.panelRef = createComponent(PersistentPanelComponent, {\n environmentInjector: this.environmentInjector,\n });\n this.appRef.attachView(this.panelRef.hostView);\n document.body.appendChild(\n this.panelRef.location.nativeElement as HTMLElement,\n );\n }\n this.panelRef.instance.open(config, target);\n // createComponent() is outside a template tree, so it has no initial\n // render until change detection is run explicitly. Subsequent signal\n // updates are scheduled normally once the view has been initialized.\n this.panelRef.changeDetectorRef.detectChanges();\n }\n\n beginTargetUpdate(): (context: Record<string, unknown>) => void {\n const targetUpdateSequence = ++this.targetUpdateSequence;\n return (context) => {\n if (targetUpdateSequence !== this.targetUpdateSequence) {\n return;\n }\n this.updateTarget(context);\n };\n }\n\n private updateTarget(context: Record<string, unknown>): void {\n const target = persistentPanelTarget({}, context);\n this.target = target;\n this.panelRef?.instance.updateTarget(target);\n }\n\n currentTarget(): PersistentPanelTarget {\n return structuredClone(this.target);\n }\n\n destroy(): void {\n this.targetUpdateSequence += 1;\n if (this.panelRef) {\n const host = this.panelRef.location.nativeElement as HTMLElement;\n this.appRef.detachView(this.panelRef.hostView);\n this.panelRef.destroy();\n host.remove();\n this.panelRef = null;\n }\n this.target = {};\n }\n\n ngOnDestroy(): void {\n this.destroy();\n }\n}\n","import { PortalLuigiNode } from '../models/luigi-node';\n\nexport function collectAccountNamesFromNodeHierarchy(\n node: PortalLuigiNode | undefined,\n): string[] {\n const accountNames: string[] = [];\n let currentNode: PortalLuigiNode | undefined = node;\n\n while (currentNode) {\n const entityName = currentNode.context?.entityName;\n const entityKind = currentNode.context?.entityKind;\n if (entityName && entityKind?.toLowerCase() === 'account') {\n accountNames.unshift(entityName);\n }\n currentNode = currentNode.parent;\n }\n\n return accountNames;\n}\n\nexport function getInitialAccountId(\n entityId?: string,\n kind?: string,\n): string | undefined {\n return kind?.toLowerCase() === 'account' && entityId ? entityId : undefined;\n}\n\nexport function calculateAccountHierarchy(\n entityNode: PortalLuigiNode,\n entityId?: string,\n kind?: string,\n): string[] {\n const initialAccountId = getInitialAccountId(entityId, kind);\n // when we are on a dynamic node and the id any kind has changed we need to reset the context data\n if (entityNode.defineEntity?.contextKey && initialAccountId) {\n entityNode.context.entityName = undefined;\n entityNode.context.entityKind = undefined;\n }\n\n const accountNames = collectAccountNamesFromNodeHierarchy(entityNode);\n\n if (initialAccountId) {\n accountNames.push(initialAccountId);\n }\n return accountNames;\n}\n","import { kcpRootOrgsPath } from '../models/constants';\nimport { PortalLuigiNode } from '../models/luigi-node';\nimport {\n calculateAccountHierarchy,\n getInitialAccountId,\n} from '../utils/account-hierarchy.util';\nimport { Injectable, inject } from '@angular/core';\nimport { EnvConfigService } from '@openmfp/portal-ui-lib';\nimport { GatewayService } from '@platform-mesh/portal-ui-lib/services';\n\nexport interface KcpData {\n kcpPath: string;\n accountPath: string | undefined;\n}\n\n@Injectable({ providedIn: 'root' })\nexport class CrdGatewayKcpPatchResolver {\n private gatewayService = inject(GatewayService);\n private envConfigService = inject(EnvConfigService);\n\n public async resolveCrdGatewayKcpPath(\n nextNode: PortalLuigiNode,\n entityId?: string,\n kind?: string,\n ): Promise<KcpData> {\n if (nextNode.context?.kcpPath && !getInitialAccountId(entityId, kind)) {\n this.gatewayService.updateCrdGatewayUrlWithEntityPath(\n nextNode.context.kcpPath,\n );\n return {\n kcpPath: nextNode.context.kcpPath,\n accountPath: nextNode.context.accountPath,\n };\n }\n\n const accountNames = calculateAccountHierarchy(nextNode, entityId, kind);\n\n const accountPath =\n accountNames.length > 0 ? `${accountNames.join(':')}` : '';\n\n const org = (await this.envConfigService.getEnvConfig()).idpName;\n const kcpPath = `${kcpRootOrgsPath}:${org}${accountPath ? ':' + accountPath : ''}`;\n this.gatewayService.updateCrdGatewayUrlWithEntityPath(kcpPath);\n\n if (nextNode.context) {\n nextNode.context.kcpPath = kcpPath;\n nextNode.context.accountPath = accountPath;\n }\n return { kcpPath, accountPath };\n }\n}\n","import { PortalLuigiNode } from '../models/luigi-node';\nimport { PersistentPanelService } from '../persistent-panel/persistent-panel.service';\nimport { CrdGatewayKcpPatchResolver } from './crd-gateway-kcp-patch-resolver.service';\nimport { Injectable, inject } from '@angular/core';\nimport {\n LuigiCoreService,\n NodeChangeHookConfigService,\n NodeContext,\n} from '@openmfp/portal-ui-lib';\n\n@Injectable({ providedIn: 'root' })\nexport class NodeChangeHookConfigServiceImpl implements NodeChangeHookConfigService {\n private luigiCoreService = inject(LuigiCoreService);\n private crdGatewayKcpPatchResolver = inject(CrdGatewayKcpPatchResolver);\n private persistentPanelService = inject(PersistentPanelService);\n\n async nodeChangeHook(\n prevNode: PortalLuigiNode,\n nextNode: PortalLuigiNode,\n currentContext: NodeContext,\n ) {\n const updatePersistentPanelTarget =\n this.persistentPanelService.beginTargetUpdate();\n\n if (\n nextNode.initialRoute &&\n nextNode.virtualTree &&\n !(nextNode as any)._virtualTree\n ) {\n this.luigiCoreService.navigation().navigate(nextNode.initialRoute);\n }\n\n this.accumulatePortalPermissions(prevNode, nextNode, currentContext);\n await this.crdGatewayKcpPatchResolver.resolveCrdGatewayKcpPath(nextNode);\n updatePersistentPanelTarget({\n ...currentContext,\n ...(nextNode.context ?? {}),\n });\n }\n\n private accumulatePortalPermissions(\n prevNode: PortalLuigiNode,\n nextNode: PortalLuigiNode,\n currentContext: NodeContext,\n ) {\n const portalPermissions =\n prevNode?.context?.portalPermissions ??\n currentContext?.portalPermissions ??\n {};\n\n nextNode.context?.nodesPermissions?.forEach((permission) => {\n portalPermissions[permission.resource] = permission.actions;\n });\n\n currentContext.portalPermissions = portalPermissions;\n\n if (nextNode.context) {\n nextNode.context.portalPermissions = portalPermissions;\n }\n }\n}\n","import { PortalNodeContext } from '../models/luigi-context';\nimport { PortalLuigiNode } from '../models/luigi-node';\nimport { CrdGatewayKcpPatchResolver } from './crd-gateway-kcp-patch-resolver.service';\nimport { Injectable, inject } from '@angular/core';\nimport {\n LuigiCoreService,\n NodeContextProcessingService,\n} from '@openmfp/portal-ui-lib';\nimport { AccountInfo } from '@platform-mesh/portal-ui-lib/models';\nimport {\n AccountInfoService,\n ErrorHandlerService,\n InstancePermissionsService,\n OrganizationReadyService,\n} from '@platform-mesh/portal-ui-lib/services';\nimport { permissionKey } from '@platform-mesh/portal-ui-lib/utils';\nimport { firstValueFrom } from 'rxjs';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class NodeContextProcessingServiceImpl implements NodeContextProcessingService {\n private crdGatewayKcpPatchResolver = inject(CrdGatewayKcpPatchResolver);\n private accountInfoService = inject(AccountInfoService);\n private instancePermissionsService = inject(InstancePermissionsService);\n private organizationReadyService = inject(OrganizationReadyService);\n private errorHandlerService = inject(ErrorHandlerService);\n private luigiCoreService = inject(LuigiCoreService);\n\n public async processNodeContext(\n dynamicEntityId: string,\n entityNode: PortalLuigiNode,\n ctx: PortalNodeContext,\n ) {\n const kind = entityNode.defineEntity?.type;\n const entityId =\n dynamicEntityId || entityNode.context.resourceDefinition?.name;\n\n if (!entityId) {\n return;\n }\n\n const { kcpPath, accountPath } =\n await this.crdGatewayKcpPatchResolver.resolveCrdGatewayKcpPath(\n entityNode,\n entityId,\n kind,\n );\n\n // update the current already calculated by Luigi context for a node\n this.addFieldsToContext(ctx, entityId, kcpPath, accountPath, kind);\n\n // update the node context of sa node to contain the entity for future context calculations\n this.addFieldsToContext(\n entityNode.context,\n entityId,\n kcpPath,\n accountPath,\n kind,\n );\n\n this.accamulatePortalPermissions(ctx);\n this.getEntityPermissions(ctx);\n try {\n const accountInfo = await firstValueFrom(\n this.accountInfoService.read({\n portalContext: {\n crdGatewayApiUrl: ctx.portalContext.crdGatewayApiUrl,\n },\n token: ctx.token,\n accountId: entityId,\n }),\n );\n\n // update the current already calculated by Luigi context for a node\n this.addFieldsToContextFromAccountInfo(ctx, entityId, accountInfo);\n\n // update the node context of sa node to contain the entity for future context calculations\n this.addFieldsToContextFromAccountInfo(\n entityNode.context,\n entityId,\n accountInfo,\n );\n\n // we were able to ready the account info so on this kcpPath we can query for the organization ready state\n this.organizationReadyService.checkOrganizationReady();\n } catch (e) {\n if (!this.errorHandlerService.isUnauthorizedAccess(e)) {\n console.error('Failed to read account info', e);\n }\n }\n }\n\n private addFieldsToContext(\n ctx: PortalNodeContext,\n entityId: string | undefined,\n kcpPath: string,\n accountPath: string | undefined,\n kind: string | undefined,\n ) {\n ctx.kcpPath = kcpPath;\n ctx.entityName = entityId;\n ctx.entityKind = kind;\n ctx.accountPath = accountPath;\n }\n\n private addFieldsToContextFromAccountInfo(\n ctx: PortalNodeContext,\n entityId: string,\n accountInfo: AccountInfo,\n ) {\n const accountOriginClusterId = accountInfo.spec.account.originClusterId;\n const organizationOriginClusterId =\n accountInfo.spec.organization.originClusterId;\n const organization = accountInfo.spec.organization.name;\n\n ctx.organizationId = `${organizationOriginClusterId}/${organization}`;\n ctx.entityId = `${accountOriginClusterId}/${entityId}`;\n ctx.kcpCA = btoa(accountInfo.spec.clusterInfo.ca);\n }\n\n private getEntityPermissions(ctx: PortalNodeContext) {\n const resourceDefinition = ctx.resourceDefinition;\n\n if (!resourceDefinition || !resourceDefinition?.permissionsDefinition) {\n return;\n }\n\n const name = ctx[resourceDefinition.permissionsDefinition.entityContextKey];\n\n if (!name) {\n return;\n }\n\n const namespace = this.luigiCoreService\n .routing()\n .getSearchParams().namespace;\n\n return this.instancePermissionsService\n .checkInstance(ctx, resourceDefinition.permissionsDefinition!, {\n name,\n namespace,\n })\n .subscribe((result) => {\n const portalPermissions = ctx.portalPermissions ?? {};\n\n result.forEach((permission) => {\n portalPermissions[`${permissionKey(permission)}`] =\n permission.actions;\n });\n\n ctx.portalPermissions = portalPermissions;\n });\n }\n\n private accamulatePortalPermissions(ctx: PortalNodeContext) {\n const portalPermissions = ctx.portalPermissions ?? {};\n\n ctx.nodesPermissions?.forEach((permission) => {\n portalPermissions[permission.resource] = permission.actions;\n });\n\n ctx.portalPermissions = portalPermissions;\n }\n}\n","import { Injectable, inject } from '@angular/core';\nimport {\n ClientEnvironment,\n EnvConfigService,\n RoutingConfigService,\n} from '@openmfp/portal-ui-lib';\n\n@Injectable()\nexport class CustomRoutingConfigServiceImpl implements RoutingConfigService {\n private envConfigService = inject(EnvConfigService);\n private envConfig: ClientEnvironment | null = null;\n\n constructor() {\n this.getEnvConfig();\n }\n\n async getEnvConfig(): Promise<void> {\n this.envConfig = await this.envConfigService.getEnvConfig();\n }\n\n getRoutingConfig(): any {\n return {\n preserveQueryParams: true,\n pageNotFoundHandler: () => {\n if (!this.envConfig?.baseDomain) {\n return this.redirectTo('error/404');\n }\n\n if (window.location.hostname === this.envConfig.baseDomain) {\n return this.redirectTo('welcome');\n }\n\n return this.redirectTo('error/404');\n },\n };\n }\n\n public redirectTo(path: string, keepURL = true): any {\n return {\n redirectTo: path,\n keepURL,\n };\n }\n}\n","import { Injectable, inject } from '@angular/core';\nimport {\n AuthService,\n UserProfile,\n UserProfileConfigService,\n} from '@openmfp/portal-ui-lib';\n\n@Injectable({ providedIn: 'root' })\nexport class UserProfileConfigServiceImpl implements UserProfileConfigService {\n private authService = inject(AuthService);\n async getProfile(): Promise<UserProfile> {\n const { email } = this.authService.getUserInfo();\n\n return {\n items: [\n {\n label: 'PROFILE_PROFILE',\n icon: 'customer',\n link: `/users/${email}/overview`,\n },\n ],\n };\n }\n}\n","import { PersistentPanelService } from './persistent-panel.service';\nimport {\n OPEN_PERSISTENT_PANEL_MESSAGE,\n mergePersistentPanelTargets,\n parsePersistentPanelConfig,\n persistentPanelTarget,\n} from './persistent-panel.types';\nimport { Injectable, inject } from '@angular/core';\nimport {\n CustomMessageListener,\n LuigiCoreService,\n NodeContext,\n} from '@openmfp/portal-ui-lib';\n\n@Injectable({ providedIn: 'root' })\nexport class OpenPersistentPanelListener implements CustomMessageListener {\n private readonly luigiCoreService = inject(LuigiCoreService);\n private readonly persistentPanelService = inject(PersistentPanelService);\n\n messageId(): string {\n return OPEN_PERSISTENT_PANEL_MESSAGE;\n }\n\n onCustomMessageReceived(\n customMessage: Record<string, unknown>,\n _microFrontend: unknown,\n microFrontendNode: { context?: NodeContext; viewUrl?: string } | undefined,\n ): void {\n const config = parsePersistentPanelConfig(\n customMessage as { id: string },\n microFrontendNode,\n new URL(document.baseURI).origin,\n );\n const target = mergePersistentPanelTargets(\n this.persistentPanelService.currentTarget(),\n persistentPanelTarget(\n this.luigiCoreService.getGlobalContext(),\n microFrontendNode?.context,\n ),\n );\n this.persistentPanelService.open(config, target);\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["isRecord"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"platform-mesh-portal-ui-lib-portal-options.mjs","sources":["../../projects/lib/portal-options/services/custom-global-nodes.service.ts","../../projects/lib/portal-options/services/header-bar-renderers/breadcrumb-renderer.ts","../../projects/lib/portal-options/services/header-bar-renderers/namespace-selection-renderer.service.ts","../../projects/lib/portal-options/services/header-bar-config.service.ts","../../projects/lib/portal-options/services/luigi-extended-global-context-config.service.ts","../../projects/lib/portal-options/services/navigation-redirect-strategy.service.ts","../../projects/lib/portal-options/persistent-panel/persistent-panel.types.ts","../../projects/lib/portal-options/persistent-panel/persistent-panel.ts","../../projects/lib/portal-options/persistent-panel/persistent-panel.html","../../projects/lib/portal-options/persistent-panel/persistent-panel.service.ts","../../projects/lib/portal-options/utils/account-hierarchy.util.ts","../../projects/lib/portal-options/services/crd-gateway-kcp-patch-resolver.service.ts","../../projects/lib/portal-options/services/node-change-hook-config.service.ts","../../projects/lib/portal-options/services/node-context-processing.service.ts","../../projects/lib/portal-options/services/router-config.service.ts","../../projects/lib/portal-options/services/user-profile-config.service.ts","../../projects/lib/portal-options/persistent-panel/open-persistent-panel.listener.ts","../../projects/lib/portal-options/platform-mesh-portal-ui-lib-portal-options.ts"],"sourcesContent":["import { PortalNodeContext } from '../models/luigi-context';\nimport { PortalLuigiNode } from '../models/luigi-node';\nimport { Injectable, inject } from '@angular/core';\nimport {\n CustomGlobalNodesService,\n EntityType,\n I18nService,\n NodeContext,\n} from '@openmfp/portal-ui-lib';\n\n@Injectable({ providedIn: 'root' })\nexport class CustomGlobalNodesServiceImpl implements CustomGlobalNodesService {\n private i18nService = inject(I18nService);\n\n async getCustomGlobalNodes(): Promise<PortalLuigiNode[]> {\n return [\n {\n pathSegment: 'error',\n order: 1000,\n hideFromNav: true,\n showBreadcrumbs: false,\n context: {} as PortalNodeContext,\n children: [\n {\n pathSegment: ':id',\n entityType: EntityType.ENTITY_ERROR,\n hideFromNav: true,\n hideSideNav: true,\n viewUrl: '/assets/platform-mesh-portal-ui-wc.js#error-component',\n context: {\n id: ':id',\n translationTable: this.i18nService.translationTable,\n } as any as NodeContext,\n webcomponent: {\n selfRegistered: true,\n type: 'module',\n },\n },\n ],\n },\n {\n pathSegment: 'users',\n showBreadcrumbs: false,\n hideSideNav: true,\n hideFromNav: true,\n context: {} as PortalNodeContext,\n entityType: 'global',\n children: [\n {\n pathSegment: ':userId',\n hideSideNav: true,\n hideFromNav: true,\n defineEntity: {\n id: 'user',\n },\n context: {\n userId: ':userId',\n } as PortalNodeContext,\n children: [\n {\n pathSegment: 'overview',\n context: {} as PortalNodeContext,\n hideSideNav: true,\n hideFromNav: true,\n defineEntity: {\n id: 'overview',\n },\n compound: {\n children: [],\n },\n },\n ],\n },\n ],\n },\n ];\n }\n}\n","import '@ui5/webcomponents/dist/Breadcrumbs.js';\nimport '@ui5/webcomponents/dist/BreadcrumbsItem.js';\n\nexport const breadcrumbRenderer = (\n containerElement: HTMLElement,\n nodeItems: any[],\n clickHandler: (item: any) => void,\n): HTMLElement => {\n containerElement.style.width = '100%';\n\n const ui5breadcrumbs = document.createElement('ui5-breadcrumbs');\n ui5breadcrumbs.setAttribute('separators', 'Slash');\n containerElement.appendChild(ui5breadcrumbs);\n\n nodeItems.forEach((item) => {\n if (item.node?.hideFromBreadcrumb) {\n return;\n }\n\n const itemCmp = document.createElement('ui5-breadcrumbs-item');\n itemCmp.textContent = item.label ?? '';\n (itemCmp as any)._item = item;\n ui5breadcrumbs.appendChild(itemCmp);\n });\n\n ui5breadcrumbs.addEventListener('item-click', (event: any) => {\n if (\n !(\n event.detail.ctrlKey ||\n event.detail.altKey ||\n event.detail.shiftKey ||\n event.detail.metaKey\n )\n ) {\n event.preventDefault();\n clickHandler(event.detail.item._item);\n }\n });\n\n return ui5breadcrumbs;\n};\n","import { DestroyRef, Injectable, inject } from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport {\n AuthService,\n LuigiCoreService,\n LuigiNode,\n PortalConfig,\n} from '@openmfp/portal-ui-lib';\nimport {\n ALL_NAMESPACE,\n PlatformMeshFieldDefinition,\n Resource,\n ResourceDefinition,\n ResourceListResult,\n} from '@platform-mesh/portal-ui-lib/models';\nimport {\n ResourceNodeContext,\n ResourceService,\n} from '@platform-mesh/portal-ui-lib/services';\nimport {\n generateGraphQLFields,\n isNamespacedResource,\n mergeListWithSubscriptionResult,\n} from '@platform-mesh/portal-ui-lib/utils';\nimport '@ui5/webcomponents/dist/ComboBox.js';\nimport { Observable, Subject, defer, of } from 'rxjs';\nimport {\n catchError,\n retry,\n scan,\n shareReplay,\n startWith,\n switchMap,\n takeUntil,\n tap,\n} from 'rxjs/operators';\n\nconst defaultColumns: PlatformMeshFieldDefinition[] = [\n {\n label: 'Name',\n property: 'metadata.name',\n },\n];\n\n@Injectable({ providedIn: 'root' })\nexport class NamespaceSelectionRendererService {\n private namespaceResourcesCache?: {\n key: string;\n value$: Observable<Resource[]>;\n stop$: Subject<void>;\n };\n\n private resourceService = inject(ResourceService);\n private authService = inject(AuthService);\n private luigiCoreService = inject(LuigiCoreService);\n private destroyRef = inject(DestroyRef);\n\n public create(portalConfig: PortalConfig) {\n return (\n containerElement: HTMLElement,\n nodeItems: any[],\n _clickHandler: any,\n ) => {\n containerElement.style.paddingBottom = '0.5rem';\n\n const lastNode = nodeItems.at(-1)?.node as LuigiNode | undefined;\n const namespace = this.luigiCoreService\n .routing()\n .getSearchParams().namespace;\n const kcpPath = lastNode?.context?.kcpPath;\n\n if (lastNode?.context && !isNamespacedResource(lastNode.context)) {\n return containerElement;\n }\n\n const ui5combobox = this.createCombobox(containerElement);\n\n this.addComboboxItems(portalConfig, ui5combobox, namespace, kcpPath);\n\n ui5combobox.addEventListener('change', (event: any) => {\n const value = (event?.target as any)?.value.trim() ?? '';\n this.changeNamespace(value);\n });\n\n return ui5combobox as HTMLElement;\n };\n }\n\n private createCombobox(containerElement: HTMLElement) {\n const ui5combobox = document.createElement('ui5-combobox');\n ui5combobox.setAttribute('placeholder', 'Namespaces');\n ui5combobox.setAttribute('data-testid', 'namespace-selection-combobox');\n containerElement.appendChild(ui5combobox);\n\n return ui5combobox;\n }\n\n private addComboboxItems(\n portalConfig: PortalConfig,\n ui5combobox: HTMLElement,\n namespace: string | null,\n kcpPath?: string,\n ) {\n this.getNamespaceResourcesCached(portalConfig, kcpPath).subscribe(\n (resources) => {\n this.syncComboboxItems(ui5combobox, resources);\n this.setSelectedValue(ui5combobox, resources, namespace);\n },\n );\n }\n\n private getNamespaceResourcesCached(\n portalConfig: PortalConfig,\n kcpPath?: string,\n ): Observable<Resource[]> {\n const cacheKey = this.getNamespaceResourcesCacheKey(kcpPath);\n if (this.namespaceResourcesCache?.key === cacheKey) {\n return this.namespaceResourcesCache.value$;\n }\n\n if (this.namespaceResourcesCache) {\n this.namespaceResourcesCache.stop$.next();\n this.namespaceResourcesCache.stop$.complete();\n this.namespaceResourcesCache = undefined;\n }\n\n const stop$ = new Subject<void>();\n const value$ = this.getNamespaceResources(\n portalConfig,\n kcpPath,\n stop$,\n ).pipe(shareReplay(1), takeUntilDestroyed(this.destroyRef));\n this.namespaceResourcesCache = {\n key: cacheKey,\n value$,\n stop$,\n };\n\n return value$;\n }\n\n private getNamespaceResourcesCacheKey(kcpPath?: string): string {\n return kcpPath ?? '';\n }\n\n private syncComboboxItems(ui5combobox: HTMLElement, resources: Resource[]) {\n ui5combobox.replaceChildren();\n\n resources.forEach((resource) => {\n const name = resource.metadata?.name;\n if (!name) {\n return;\n }\n const resourceOption = document.createElement('ui5-cb-item');\n resourceOption.setAttribute('text', name);\n resourceOption.setAttribute(\n 'data-testid',\n `namespace-selection-combobox-item-${name}`,\n );\n ui5combobox.appendChild(resourceOption);\n });\n\n const allOption = document.createElement('ui5-cb-item');\n allOption.setAttribute('text', ALL_NAMESPACE);\n allOption.setAttribute(\n 'data-testid',\n 'namespace-selection-combobox-item-all',\n );\n ui5combobox.appendChild(allOption);\n }\n\n private setSelectedValue(\n ui5combobox: HTMLElement,\n resources: Resource[],\n namespace: string | null,\n ) {\n const currentNamespace = this.luigiCoreService\n .routing()\n .getSearchParams().namespace;\n\n if (currentNamespace) {\n ui5combobox.setAttribute('value', currentNamespace);\n return;\n }\n\n if (\n namespace &&\n resources.find((resource) => resource.metadata?.name === namespace)\n ) {\n ui5combobox.setAttribute('value', namespace);\n } else {\n ui5combobox.setAttribute('value', ALL_NAMESPACE);\n this.changeNamespace(ALL_NAMESPACE);\n }\n }\n\n private getNamespaceResources(\n portalConfig: PortalConfig,\n kcpPath: string | undefined,\n stop$: Subject<void>,\n ): Observable<Resource[]> {\n const operation = 'v1_namespaces';\n const fields = generateGraphQLFields(defaultColumns);\n const context = {\n portalContext: {\n crdGatewayApiUrl: portalConfig.portalContext['crdGatewayApiUrl'],\n },\n resourceDefinition: {\n version: 'v1',\n entityCollection: 'Namespaces',\n entity: 'Namespace',\n scope: 'Cluster',\n } as ResourceDefinition,\n kcpPath,\n token: this.authService.getToken(),\n } as ResourceNodeContext;\n\n return defer(() =>\n this.resourceService.list(operation, fields, context),\n ).pipe(\n retry(3),\n takeUntil(stop$),\n switchMap((result: ResourceListResult) =>\n this.resourceService\n .resourceChangeSubscription(\n operation,\n fields,\n context,\n result.resourceVersion,\n false,\n )\n .pipe(\n startWith(undefined),\n scan(\n (resources, subscriptionResult) =>\n mergeListWithSubscriptionResult(resources, subscriptionResult, {\n getItemKey: (resource) => resource.metadata?.name,\n mapSubscriptionObjectToItem: (object) => object,\n }),\n result.items,\n ),\n tap((result) => {\n const namespaces = result.map((e) => e.metadata?.name);\n this.luigiCoreService.setInGlobalContext({ namespaces });\n }),\n takeUntil(stop$),\n ),\n ),\n catchError((error) => {\n console.error(`Failed to read entities from ${operation}`, error);\n return of([]);\n }),\n );\n }\n\n private changeNamespace(value: string): void {\n if (!value) {\n return;\n }\n\n const oldValue = this.luigiCoreService\n .routing()\n .getSearchParams().namespace;\n\n if (oldValue === value) {\n return;\n }\n\n this.luigiCoreService.routing().addSearchParams({ namespace: value });\n }\n}\n","import { breadcrumbRenderer } from './header-bar-renderers/breadcrumb-renderer';\nimport { NamespaceSelectionRendererService } from './header-bar-renderers/namespace-selection-renderer.service';\nimport { Injectable, inject } from '@angular/core';\nimport {\n ConfigService,\n HeaderBarConfig,\n HeaderBarConfigService,\n} from '@openmfp/portal-ui-lib';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class HeaderBarConfigServiceImpl implements HeaderBarConfigService {\n private configService = inject(ConfigService);\n private namespaceSelectionRendererService = inject(\n NamespaceSelectionRendererService,\n );\n\n public async getConfig(): Promise<HeaderBarConfig> {\n const portalConfig = await this.configService.getPortalConfig();\n\n return {\n pendingItemLabel: '...',\n omitRoot: false,\n clearBeforeRender: true,\n autoHide: true,\n leftRenderers: [breadcrumbRenderer],\n rightRenderers: [\n this.namespaceSelectionRendererService.create(portalConfig),\n ],\n };\n }\n}\n","import { kcpRootOrgsPath } from '../models/constants';\nimport { Injectable, inject } from '@angular/core';\nimport {\n EnvConfigService,\n LuigiExtendedGlobalContextConfigService,\n} from '@openmfp/portal-ui-lib';\n\n@Injectable({ providedIn: 'root' })\nexport class LuigiExtendedGlobalContextConfigServiceImpl implements LuigiExtendedGlobalContextConfigService {\n private envConfigService = inject(EnvConfigService);\n\n async createLuigiExtendedGlobalContext(): Promise<Record<string, any>> {\n const idpName = (await this.envConfigService.getEnvConfig()).idpName;\n\n if (idpName === 'welcome') {\n return {};\n }\n\n return {\n organization: idpName,\n kcpPath: `${kcpRootOrgsPath}:${idpName}`,\n entityName: idpName,\n };\n }\n}\n","import { Injectable } from '@angular/core';\nimport {\n LocalStorageKeys,\n NavigationRedirectStrategy,\n} from '@openmfp/portal-ui-lib';\n\n@Injectable({ providedIn: 'root' })\nexport class NavigationRedirectStrategyServiceImpl implements NavigationRedirectStrategy {\n getRedirectUrl(): string {\n return localStorage.getItem(LocalStorageKeys.LAST_NAVIGATION_URL) || '';\n }\n\n saveRedirectUrl(url: string): void {\n if (url.startsWith('/error')) {\n return;\n }\n\n localStorage.setItem(LocalStorageKeys.LAST_NAVIGATION_URL, url);\n }\n\n clearRedirectUrl(): void {\n localStorage.removeItem(LocalStorageKeys.LAST_NAVIGATION_URL);\n }\n}\n","import type { NodeContext } from '@openmfp/portal-ui-lib';\n\nexport const OPEN_PERSISTENT_PANEL_MESSAGE = 'portal.open-provider-panel';\n\nexport const PROVIDER_PANEL_MESSAGE = {\n close: 'portal.provider-panel.close',\n closeFailed: 'portal.provider-panel.close-failed',\n closed: 'portal.provider-panel.closed',\n context: 'portal.provider-panel.context',\n ready: 'portal.provider-panel.ready',\n requestClose: 'portal.provider-panel.request-close',\n} as const;\n\nexport interface PersistentPanelConfig {\n id: string;\n title: string;\n url: string;\n origin: string;\n}\n\nexport interface PersistentPanelTarget {\n organization?: string;\n organizationId?: string;\n account?: string;\n accountPath?: string;\n workspacePath?: string;\n namespace?: string;\n resource?: {\n group?: string;\n version?: string;\n kind?: string;\n name?: string;\n };\n}\n\nexport interface RegisteredProviderNode {\n viewUrl?: string;\n context?: Partial<NodeContext> & {\n persistentPanel?: unknown;\n };\n}\n\nexport function mergePersistentPanelTargets(\n current: PersistentPanelTarget,\n update: PersistentPanelTarget,\n): PersistentPanelTarget {\n const organizationChanged =\n current.organization !== undefined &&\n update.organization !== undefined &&\n current.organization !== update.organization;\n const accountChanged =\n current.account !== undefined &&\n update.account !== undefined &&\n current.account !== update.account;\n\n if (organizationChanged || accountChanged) {\n return structuredClone(update);\n }\n\n // Provider nodes normally contain only panel capability metadata. Keep the\n // target tracked by navigation and overlay any bounded scope that the\n // requesting node does carry.\n return structuredClone({ ...current, ...update });\n}\n\ninterface OpenPanelMessage extends Record<string, unknown> {\n id: string;\n}\n\nconst panelIdPattern = /^[a-z0-9](?:[a-z0-9.-]{0,62}[a-z0-9])?$/;\nconst workspaceSegmentPattern = /^[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?$/;\n\nexport function parsePersistentPanelConfig(\n message: OpenPanelMessage,\n providerNode: RegisteredProviderNode | undefined,\n portalOrigin: string,\n): PersistentPanelConfig {\n if (message.id !== OPEN_PERSISTENT_PANEL_MESSAGE) {\n throw new Error('Persistent panel request is invalid');\n }\n\n const capability = recordValue(providerNode?.context?.persistentPanel);\n const id = boundedString(capability['id'], 64);\n const title = boundedString(capability['title'], 80);\n if (!id || !panelIdPattern.test(id)) {\n throw new Error('Registered persistent panel id is invalid');\n }\n if (!title) {\n throw new Error('Registered persistent panel title is invalid');\n }\n\n const registeredViewUrl = boundedString(providerNode?.viewUrl, 2048);\n if (!registeredViewUrl) {\n throw new Error('Registered provider UI URL is missing');\n }\n\n const portalURL = new URL(portalOrigin);\n const url = new URL(registeredViewUrl, portalURL);\n if (\n url.origin === portalURL.origin ||\n !allowedPanelURL(url, portalURL) ||\n url.username ||\n url.password\n ) {\n throw new Error('Registered provider UI URL is invalid');\n }\n\n return { id, title, url: url.toString(), origin: url.origin };\n}\n\nfunction allowedPanelURL(url: URL, portalURL: URL): boolean {\n if (url.protocol === 'https:') {\n return true;\n }\n return (\n portalURL.protocol === 'http:' &&\n url.protocol === 'http:' &&\n ['localhost', '127.0.0.1', '[::1]'].includes(url.hostname)\n );\n}\n\nexport function persistentPanelTarget(\n globalContext: Record<string, unknown>,\n nodeContext?: NodeContext | Record<string, unknown>,\n): PersistentPanelTarget {\n const context = { ...globalContext, ...(nodeContext ?? {}) };\n const entityContext = recordValue(context['entityContext']);\n const accountContext = recordValue(entityContext['account']);\n const resourceDefinition = recordValue(context['resourceDefinition']);\n\n const organization = boundedString(context['organization'], 253);\n const organizationId = boundedString(context['organizationId'], 512);\n const rawAccountPath = boundedString(context['accountPath'], 1024);\n const account =\n boundedString(accountContext['id'], 253) ||\n boundedString(context['accountId'], 253) ||\n boundedString(context['core_platform-mesh_io_accountId'], 253) ||\n accountFromPath(rawAccountPath, organization) ||\n accountFromEntity(context);\n\n // Organization-only scope is valid, but descendants without an account are\n // not. Organization context can carry a kcpPath, so fail closed before\n // projecting workspace fields.\n if (!account) {\n return compact({ organization, organizationId });\n }\n\n const accountPath = validatedAccountPath(\n rawAccountPath,\n organization,\n account,\n );\n\n const workspacePath =\n validatedWorkspacePath(context['workspacePath'], organization, account) ||\n validatedWorkspacePath(context['kcpPath'], organization, account) ||\n validatedWorkspacePath(rawAccountPath, organization, account) ||\n canonicalAccountPath(organization, account);\n const namespace =\n boundedString(context['namespaceId'], 253) ||\n boundedString(resourceDefinition['namespace'], 253);\n const resource = compact({\n group:\n boundedString(resourceDefinition['group'], 253) ||\n boundedString(resourceDefinition['apiGroup'], 253),\n version: boundedString(resourceDefinition['version'], 63),\n kind:\n boundedString(resourceDefinition['kind'], 253) ||\n boundedString(context['entityKind'], 253),\n name: boundedString(context['entityName'], 253),\n });\n\n return compact({\n organization,\n organizationId,\n account,\n accountPath,\n workspacePath,\n namespace,\n resource: Object.keys(resource).length > 0 ? resource : undefined,\n });\n}\n\nfunction accountFromPath(\n accountPath: string | undefined,\n organization: string | undefined,\n): string | undefined {\n if (!accountPath) {\n return undefined;\n }\n if (workspaceSegmentPattern.test(accountPath)) {\n return accountPath;\n }\n const segments = accountPath.split(':');\n if (\n segments.length < 4 ||\n segments[0] !== 'root' ||\n segments[1] !== 'orgs' ||\n segments.some((segment) => !workspaceSegmentPattern.test(segment)) ||\n (organization !== undefined && segments[2] !== organization)\n ) {\n return undefined;\n }\n return boundedString(segments.at(-1), 253);\n}\n\nfunction accountFromEntity(\n context: Record<string, unknown>,\n): string | undefined {\n if (boundedString(context['entityKind'], 253) !== 'Account') {\n return undefined;\n }\n return boundedString(context['entityName'], 253);\n}\n\nfunction canonicalWorkspacePath(\n accountPath: string | undefined,\n): string | undefined {\n if (!accountPath?.startsWith('root:')) {\n return undefined;\n }\n const segments = accountPath.split(':');\n if (\n segments.length < 3 ||\n segments.some((segment) => !workspaceSegmentPattern.test(segment))\n ) {\n return undefined;\n }\n return accountPath;\n}\n\nfunction validatedWorkspacePath(\n value: unknown,\n organization: string | undefined,\n account: string | undefined,\n): string | undefined {\n if (!organization || !account) {\n return undefined;\n }\n const path = canonicalWorkspacePath(boundedString(value, 1024));\n const segments = path?.split(':');\n if (\n !segments ||\n segments.length < 4 ||\n segments[0] !== 'root' ||\n segments[1] !== 'orgs' ||\n segments[2] !== organization ||\n segments.at(-1) !== account\n ) {\n return undefined;\n }\n return path;\n}\n\nfunction validatedAccountPath(\n value: string | undefined,\n organization: string | undefined,\n account: string,\n): string | undefined {\n if (!value) {\n return undefined;\n }\n if (workspaceSegmentPattern.test(value)) {\n return value === account ? value : undefined;\n }\n return validatedWorkspacePath(value, organization, account);\n}\n\nfunction canonicalAccountPath(\n organization: string | undefined,\n account: string | undefined,\n): string | undefined {\n if (\n !organization ||\n !account ||\n !workspaceSegmentPattern.test(organization) ||\n !workspaceSegmentPattern.test(account)\n ) {\n return undefined;\n }\n return `root:orgs:${organization}:${account}`;\n}\n\nfunction compact<T extends Record<string, unknown>>(value: T): T {\n return Object.fromEntries(\n Object.entries(value).filter(([, item]) => item !== undefined),\n ) as T;\n}\n\nfunction boundedString(value: unknown, maxLength: number): string | undefined {\n if (typeof value !== 'string') {\n return undefined;\n }\n const trimmed = value.trim();\n if (!trimmed || trimmed.length > maxLength || trimmed.includes('\\u0000')) {\n return undefined;\n }\n return trimmed;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction recordValue(value: unknown): Record<string, unknown> {\n return isRecord(value) ? value : {};\n}\n","import {\n PROVIDER_PANEL_MESSAGE,\n PersistentPanelConfig,\n PersistentPanelTarget,\n} from './persistent-panel.types';\nimport { CommonModule } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n OnDestroy,\n ViewChild,\n computed,\n inject,\n signal,\n} from '@angular/core';\nimport { DomSanitizer, SafeResourceUrl } from '@angular/platform-browser';\n\ntype PanelState = 'hidden' | 'expanded' | 'maximized';\n\nconst PORTAL_MAIN_AREA_SELECTOR = '.iframeContainer';\nconst PORTAL_LAYOUT_SELECTORS = [\n PORTAL_MAIN_AREA_SELECTOR,\n '.spinnerContainer.appSpinner',\n '#splitViewContainer',\n '#splitViewDragger',\n '#splitViewDraggerBackdrop',\n '#tabsContainer',\n].join(',');\n\ninterface InlineStyleValue {\n value: string;\n priority: string;\n}\n\n@Component({\n selector: 'pm-persistent-panel',\n imports: [CommonModule],\n standalone: true,\n templateUrl: './persistent-panel.html',\n styleUrl: './persistent-panel.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class PersistentPanelComponent implements OnDestroy {\n @ViewChild('panelFrame') panelFrame?: ElementRef<HTMLIFrameElement>;\n @ViewChild('reopenButton') reopenButton?: ElementRef<HTMLButtonElement>;\n\n private readonly dimensions = panelDimensions();\n private readonly preferredPanelWidth = signal(this.dimensions.defaultWidth);\n\n readonly state = signal<PanelState>('hidden');\n readonly title = signal('');\n readonly source = signal<SafeResourceUrl | null>(null);\n readonly closing = signal(false);\n readonly closeError = signal('');\n readonly resizing = signal(false);\n readonly maxPanelWidth = signal(this.availablePanelWidth());\n readonly minPanelWidth = computed(() =>\n Math.min(this.dimensions.minimumWidth, this.maxPanelWidth()),\n );\n readonly panelWidth = computed(() =>\n Math.max(\n this.minPanelWidth(),\n Math.min(\n this.state() === 'maximized'\n ? this.maxPanelWidth()\n : this.preferredPanelWidth(),\n this.maxPanelWidth(),\n ),\n ),\n );\n\n private readonly sanitizer = inject(DomSanitizer);\n private config: PersistentPanelConfig | null = null;\n private target: PersistentPanelTarget = {};\n private sequence = 0;\n private closeSequence = 0;\n private closeTimeout: number | null = null;\n private closeRequestIdSent: number | null = null;\n private destroyed = false;\n private ready = false;\n private returnFocusElement: HTMLElement | null = null;\n private resizePointerId: number | null = null;\n private observingPortalLayout = false;\n private observedMainArea: HTMLElement | null = null;\n private readonly portalLayoutStyles = new Map<\n HTMLElement,\n InlineStyleValue\n >();\n private readonly portalLayoutObserver = new MutationObserver(() => {\n if (this.state() === 'hidden') {\n return;\n }\n this.maxPanelWidth.set(this.availablePanelWidth());\n this.syncPortalLayout();\n });\n private readonly mainAreaResizeObserver =\n typeof ResizeObserver === 'undefined'\n ? null\n : new ResizeObserver(() => {\n if (this.state() === 'hidden') {\n return;\n }\n this.maxPanelWidth.set(this.availablePanelWidth());\n this.syncPortalLayout();\n });\n\n constructor() {\n window.addEventListener('message', this.onMessage);\n window.addEventListener('resize', this.onWindowResize);\n }\n\n ngOnDestroy(): void {\n this.destroyed = true;\n window.removeEventListener('message', this.onMessage);\n window.removeEventListener('resize', this.onWindowResize);\n this.clearCloseTimeout();\n this.resizePointerId = null;\n this.resizing.set(false);\n this.portalLayoutObserver.disconnect();\n this.mainAreaResizeObserver?.disconnect();\n this.restorePortalLayout();\n }\n\n open(config: PersistentPanelConfig, target: PersistentPanelTarget): void {\n if (this.closing()) {\n this.closeSequence += 1;\n }\n this.clearCloseTimeout();\n this.closeRequestIdSent = null;\n this.closing.set(false);\n this.closeError.set('');\n const sourceChanged = this.config?.url !== config.url;\n if (!this.source()) {\n this.returnFocusElement =\n document.activeElement instanceof HTMLElement\n ? document.activeElement\n : null;\n }\n if (sourceChanged) {\n this.ready = false;\n }\n this.config = config;\n this.target = structuredClone(target);\n this.title.set(config.title);\n if (sourceChanged || !this.source()) {\n this.source.set(\n this.sanitizer.bypassSecurityTrustResourceUrl(config.url),\n );\n }\n this.maxPanelWidth.set(this.availablePanelWidth());\n this.state.set('expanded');\n this.syncPortalLayout();\n queueMicrotask(() => {\n if (this.destroyed) {\n return;\n }\n this.publishTarget();\n this.focusPanel();\n });\n }\n\n updateTarget(target: PersistentPanelTarget): void {\n this.target = structuredClone(target);\n this.maxPanelWidth.set(this.availablePanelWidth());\n this.syncPortalLayout();\n this.publishTarget();\n }\n\n collapse(): void {\n this.state.set('hidden');\n this.syncPortalLayout();\n queueMicrotask(() => {\n if (this.destroyed) {\n return;\n }\n this.reopenButton?.nativeElement.focus();\n });\n }\n\n expand(): void {\n this.maxPanelWidth.set(this.availablePanelWidth());\n this.state.set('expanded');\n this.syncPortalLayout();\n queueMicrotask(() => {\n if (this.destroyed) {\n return;\n }\n this.focusPanel();\n });\n }\n\n toggleSize(): void {\n this.state.update((state) =>\n state === 'maximized' ? 'expanded' : 'maximized',\n );\n this.syncPortalLayout();\n }\n\n beginResize(event: PointerEvent): void {\n if (\n this.state() !== 'expanded' ||\n event.button !== 0 ||\n event.isPrimary === false\n ) {\n return;\n }\n this.resizePointerId = event.pointerId;\n this.resizing.set(true);\n (event.currentTarget as HTMLElement).setPointerCapture(event.pointerId);\n event.preventDefault();\n }\n\n resize(event: PointerEvent): void {\n if (event.pointerId !== this.resizePointerId) {\n return;\n }\n this.setPanelWidth(window.innerWidth - event.clientX);\n event.preventDefault();\n }\n\n finishResize(event: PointerEvent): void {\n if (event.pointerId !== this.resizePointerId) {\n return;\n }\n const handle = event.currentTarget as HTMLElement;\n if (handle.hasPointerCapture(event.pointerId)) {\n handle.releasePointerCapture(event.pointerId);\n }\n this.resizePointerId = null;\n this.resizing.set(false);\n event.preventDefault();\n }\n\n resizeWithKeyboard(event: KeyboardEvent): void {\n let width: number;\n switch (event.key) {\n case 'ArrowLeft':\n width = this.panelWidth() + this.dimensions.keyboardStep;\n break;\n case 'ArrowRight':\n width = this.panelWidth() - this.dimensions.keyboardStep;\n break;\n case 'Home':\n width = this.minPanelWidth();\n break;\n case 'End':\n width = this.maxPanelWidth();\n break;\n default:\n return;\n }\n this.setPanelWidth(width);\n event.preventDefault();\n }\n\n close(): void {\n if (!this.source() || this.closing()) {\n return;\n }\n this.closeSequence += 1;\n const requestId = this.closeSequence;\n this.closeRequestIdSent = null;\n this.closing.set(true);\n this.closeError.set('');\n this.state.set('hidden');\n this.syncPortalLayout();\n this.focusReturnTarget();\n this.requestCloseIfReady(requestId);\n this.closeTimeout = window.setTimeout(() => {\n this.failClose(requestId);\n }, 30_000);\n }\n\n private failClose(requestId: number): void {\n if (!this.closing() || requestId !== this.closeSequence) {\n return;\n }\n this.clearCloseTimeout();\n this.closeRequestIdSent = null;\n this.closing.set(false);\n this.closeError.set('Provider cleanup is incomplete. Try closing again.');\n this.maxPanelWidth.set(this.availablePanelWidth());\n this.state.set('expanded');\n this.syncPortalLayout();\n queueMicrotask(() => {\n if (this.destroyed) {\n return;\n }\n this.focusPanel();\n });\n }\n\n private finishClose(requestId: number): void {\n if (\n !this.closing() ||\n requestId !== this.closeSequence ||\n this.closeRequestIdSent !== requestId\n ) {\n return;\n }\n this.clearCloseTimeout();\n this.closeRequestIdSent = null;\n this.closing.set(false);\n this.closeError.set('');\n this.config = null;\n this.ready = false;\n this.source.set(null);\n this.title.set('');\n this.state.set('hidden');\n this.syncPortalLayout();\n this.focusReturnTarget();\n this.returnFocusElement = null;\n }\n\n private clearCloseTimeout(): void {\n if (this.closeTimeout !== null) {\n window.clearTimeout(this.closeTimeout);\n this.closeTimeout = null;\n }\n }\n\n frameLoaded(): void {\n this.maxPanelWidth.set(this.availablePanelWidth());\n this.syncPortalLayout();\n this.publishTarget();\n }\n\n private publishTarget(): void {\n if (!this.config) {\n return;\n }\n this.sequence += 1;\n this.post({\n type: PROVIDER_PANEL_MESSAGE.context,\n panelId: this.config.id,\n sequence: this.sequence,\n target: this.target,\n });\n }\n\n private requestCloseIfReady(requestId: number): void {\n if (\n !this.ready ||\n !this.closing() ||\n requestId !== this.closeSequence ||\n this.closeRequestIdSent === requestId\n ) {\n return;\n }\n this.closeRequestIdSent = requestId;\n this.post({ type: PROVIDER_PANEL_MESSAGE.close, requestId });\n }\n\n private focusPanel(): void {\n this.panelFrame?.nativeElement.focus?.();\n }\n\n private focusReturnTarget(): void {\n if (this.returnFocusElement?.isConnected) {\n this.returnFocusElement.focus();\n }\n }\n\n private post(message: Record<string, unknown>): void {\n if (!this.config) {\n return;\n }\n this.panelFrame?.nativeElement.contentWindow?.postMessage(\n message,\n this.config.origin,\n );\n }\n\n private setPanelWidth(width: number): void {\n this.preferredPanelWidth.set(\n Math.min(Math.max(width, this.minPanelWidth()), this.maxPanelWidth()),\n );\n this.syncPortalLayout();\n }\n\n private availablePanelWidth(): number {\n if (this.isMobileViewport()) {\n return Math.max(1, window.innerWidth);\n }\n return Math.max(1, Math.floor(this.availableMainAreaWidth() / 2));\n }\n\n private availableMainAreaWidth(): number {\n const mainArea = document.querySelector<HTMLElement>(\n PORTAL_MAIN_AREA_SELECTOR,\n );\n if (mainArea) {\n return Math.max(\n 1,\n window.innerWidth - mainArea.getBoundingClientRect().left,\n );\n }\n return Math.max(1, window.innerWidth);\n }\n\n private syncPortalLayout(): void {\n if (this.state() === 'hidden' || this.isMobileViewport()) {\n this.stopObservingPortalLayout();\n this.restorePortalLayout();\n return;\n }\n\n this.observePortalLayout();\n const offset = `${this.panelWidth()}px`;\n document\n .querySelectorAll<HTMLElement>(PORTAL_LAYOUT_SELECTORS)\n .forEach((element) => {\n if (!this.portalLayoutStyles.has(element)) {\n this.portalLayoutStyles.set(element, {\n value: element.style.getPropertyValue('right'),\n priority: element.style.getPropertyPriority('right'),\n });\n }\n element.style.setProperty('right', offset);\n });\n }\n\n private restorePortalLayout(): void {\n this.portalLayoutStyles.forEach(({ value, priority }, element) => {\n if (value) {\n element.style.setProperty('right', value, priority);\n } else {\n element.style.removeProperty('right');\n }\n });\n this.portalLayoutStyles.clear();\n }\n\n private observePortalLayout(): void {\n this.observeMainAreaResize();\n if (this.observingPortalLayout) {\n return;\n }\n this.portalLayoutObserver.observe(document.body, {\n childList: true,\n subtree: true,\n });\n this.observingPortalLayout = true;\n }\n\n private stopObservingPortalLayout(): void {\n this.portalLayoutObserver.disconnect();\n this.mainAreaResizeObserver?.disconnect();\n this.observedMainArea = null;\n this.observingPortalLayout = false;\n }\n\n private observeMainAreaResize(): void {\n const mainArea = document.querySelector<HTMLElement>(\n PORTAL_MAIN_AREA_SELECTOR,\n );\n if (!this.mainAreaResizeObserver || mainArea === this.observedMainArea) {\n return;\n }\n this.mainAreaResizeObserver.disconnect();\n this.observedMainArea = mainArea;\n if (mainArea) {\n this.mainAreaResizeObserver.observe(mainArea);\n }\n }\n\n private isMobileViewport(): boolean {\n return window.innerWidth <= 600;\n }\n\n private readonly onWindowResize = (): void => {\n this.maxPanelWidth.set(this.availablePanelWidth());\n this.syncPortalLayout();\n };\n\n private readonly onMessage = (event: MessageEvent<unknown>): void => {\n const frame = this.panelFrame?.nativeElement;\n if (\n !frame ||\n event.source !== frame.contentWindow ||\n event.origin !== this.config?.origin ||\n !isRecord(event.data)\n ) {\n return;\n }\n if (event.data['type'] === PROVIDER_PANEL_MESSAGE.ready) {\n this.ready = true;\n if (this.closing()) {\n this.requestCloseIfReady(this.closeSequence);\n } else {\n this.publishTarget();\n }\n }\n if (event.data['type'] === PROVIDER_PANEL_MESSAGE.requestClose) {\n this.close();\n }\n if (\n event.data['type'] === PROVIDER_PANEL_MESSAGE.closeFailed &&\n typeof event.data['requestId'] === 'number' &&\n event.data['requestId'] === this.closeRequestIdSent\n ) {\n this.failClose(event.data['requestId']);\n }\n if (\n event.data['type'] === PROVIDER_PANEL_MESSAGE.closed &&\n typeof event.data['requestId'] === 'number'\n ) {\n this.finishClose(event.data['requestId']);\n }\n };\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction panelDimensions() {\n const rootFontSize = Number.parseFloat(\n window.getComputedStyle(document.documentElement).fontSize,\n );\n const rem =\n Number.isFinite(rootFontSize) && rootFontSize > 0 ? rootFontSize : 16;\n return {\n defaultWidth: 34 * rem,\n minimumWidth: 20 * rem,\n keyboardStep: 2 * rem,\n };\n}\n","<section\n class=\"persistent-panel fd-dialog__content\"\n role=\"complementary\"\n aria-labelledby=\"persistent-panel-title\"\n [attr.aria-hidden]=\"state() === 'hidden'\"\n [class.maximized]=\"state() === 'maximized'\"\n [class.open]=\"state() !== 'hidden'\"\n [class.resizing]=\"resizing()\"\n [style.--pm-panel-width]=\"panelWidth() + 'px'\"\n>\n <div\n class=\"persistent-panel-resizer\"\n role=\"separator\"\n aria-label=\"Resize provider panel\"\n aria-orientation=\"vertical\"\n aria-controls=\"persistent-panel-content\"\n [attr.aria-valuemin]=\"minPanelWidth()\"\n [attr.aria-valuemax]=\"maxPanelWidth()\"\n [attr.aria-valuenow]=\"panelWidth()\"\n tabindex=\"0\"\n (pointerdown)=\"beginResize($event)\"\n (pointermove)=\"resize($event)\"\n (pointerup)=\"finishResize($event)\"\n (pointercancel)=\"finishResize($event)\"\n (lostpointercapture)=\"finishResize($event)\"\n (keydown)=\"resizeWithKeyboard($event)\"\n ></div>\n <header\n class=\"persistent-panel-header fd-dialog__header fd-bar fd-bar--header\"\n >\n <div class=\"fd-bar__left persistent-panel-title-area\">\n <div class=\"fd-bar__element persistent-panel-title-element\">\n <h2\n id=\"persistent-panel-title\"\n class=\"fd-title fd-title--h5 persistent-panel-title\"\n >\n {{ title() }}\n </h2>\n </div>\n </div>\n <div class=\"fd-bar__right persistent-panel-actions\">\n <div class=\"fd-bar__element\">\n <button\n class=\"fd-button fd-button--transparent fd-button--compact\"\n aria-label=\"Toggle panel size\"\n [attr.aria-pressed]=\"state() === 'maximized'\"\n title=\"Toggle panel size\"\n type=\"button\"\n (click)=\"toggleSize()\"\n >\n <i\n class=\"sap-icon\"\n [class.sap-icon--exitfullscreen]=\"state() === 'maximized'\"\n [class.sap-icon--full-screen]=\"state() !== 'maximized'\"\n aria-hidden=\"true\"\n ></i>\n </button>\n </div>\n <div class=\"fd-bar__element\">\n <button\n class=\"fd-button fd-button--transparent fd-button--compact\"\n aria-label=\"Collapse panel\"\n title=\"Collapse panel\"\n type=\"button\"\n (click)=\"collapse()\"\n >\n <i class=\"sap-icon sap-icon--collapse\" aria-hidden=\"true\"></i>\n </button>\n </div>\n <div class=\"fd-bar__element\">\n <button\n class=\"fd-button fd-button--transparent fd-button--compact\"\n aria-label=\"Close panel\"\n title=\"Close panel\"\n type=\"button\"\n (click)=\"close()\"\n >\n <i class=\"sap-icon sap-icon--decline\" aria-hidden=\"true\"></i>\n </button>\n </div>\n </div>\n </header>\n <div class=\"persistent-panel-body fd-dialog__body\">\n @if (closeError()) {\n <p class=\"persistent-panel-error\" role=\"alert\">{{ closeError() }}</p>\n } @if (source()) {\n <iframe\n #panelFrame\n id=\"persistent-panel-content\"\n class=\"persistent-panel-frame\"\n referrerpolicy=\"no-referrer\"\n sandbox=\"allow-forms allow-popups allow-popups-to-escape-sandbox allow-same-origin allow-scripts\"\n [src]=\"source()\"\n [title]=\"title()\"\n (load)=\"frameLoaded()\"\n ></iframe>\n }\n </div>\n</section>\n\n@if (state() === 'hidden' && source() && !closing()) {\n<button\n #reopenButton\n class=\"persistent-panel-reopen fd-button fd-button--emphasized fd-button--compact\"\n [attr.aria-label]=\"'Open ' + title()\"\n type=\"button\"\n (click)=\"expand()\"\n>\n {{ title() }}\n</button>\n}\n","import { PersistentPanelComponent } from './persistent-panel';\nimport {\n PersistentPanelConfig,\n PersistentPanelTarget,\n persistentPanelTarget,\n} from './persistent-panel.types';\nimport {\n ApplicationRef,\n ComponentRef,\n EnvironmentInjector,\n Injectable,\n OnDestroy,\n createComponent,\n inject,\n} from '@angular/core';\n\n@Injectable({ providedIn: 'root' })\nexport class PersistentPanelService implements OnDestroy {\n private readonly appRef = inject(ApplicationRef);\n private readonly environmentInjector = inject(EnvironmentInjector);\n private panelRef: ComponentRef<PersistentPanelComponent> | null = null;\n private target: PersistentPanelTarget = {};\n private targetUpdateSequence = 0;\n\n open(config: PersistentPanelConfig, target: PersistentPanelTarget): void {\n this.target = target;\n if (!this.panelRef) {\n this.panelRef = createComponent(PersistentPanelComponent, {\n environmentInjector: this.environmentInjector,\n });\n this.appRef.attachView(this.panelRef.hostView);\n document.body.appendChild(\n this.panelRef.location.nativeElement as HTMLElement,\n );\n }\n this.panelRef.instance.open(config, target);\n // createComponent() is outside a template tree, so it has no initial\n // render until change detection is run explicitly. Subsequent signal\n // updates are scheduled normally once the view has been initialized.\n this.panelRef.changeDetectorRef.detectChanges();\n }\n\n beginTargetUpdate(): (context: Record<string, unknown>) => void {\n const targetUpdateSequence = ++this.targetUpdateSequence;\n return (context) => {\n if (targetUpdateSequence !== this.targetUpdateSequence) {\n return;\n }\n this.updateTarget(context);\n };\n }\n\n private updateTarget(context: Record<string, unknown>): void {\n const target = persistentPanelTarget({}, context);\n this.target = target;\n this.panelRef?.instance.updateTarget(target);\n }\n\n currentTarget(): PersistentPanelTarget {\n return structuredClone(this.target);\n }\n\n destroy(): void {\n this.targetUpdateSequence += 1;\n if (this.panelRef) {\n const host = this.panelRef.location.nativeElement as HTMLElement;\n this.appRef.detachView(this.panelRef.hostView);\n this.panelRef.destroy();\n host.remove();\n this.panelRef = null;\n }\n this.target = {};\n }\n\n ngOnDestroy(): void {\n this.destroy();\n }\n}\n","import { PortalLuigiNode } from '../models/luigi-node';\n\nexport function collectAccountNamesFromNodeHierarchy(\n node: PortalLuigiNode | undefined,\n): string[] {\n const accountNames: string[] = [];\n let currentNode: PortalLuigiNode | undefined = node;\n\n while (currentNode) {\n const entityName = currentNode.context?.entityName;\n const entityKind = currentNode.context?.entityKind;\n if (entityName && entityKind?.toLowerCase() === 'account') {\n accountNames.unshift(entityName);\n }\n currentNode = currentNode.parent;\n }\n\n return accountNames;\n}\n\nexport function getInitialAccountId(\n entityId?: string,\n kind?: string,\n): string | undefined {\n return kind?.toLowerCase() === 'account' && entityId ? entityId : undefined;\n}\n\nexport function calculateAccountHierarchy(\n entityNode: PortalLuigiNode,\n entityId?: string,\n kind?: string,\n): string[] {\n const initialAccountId = getInitialAccountId(entityId, kind);\n // when we are on a dynamic node and the id any kind has changed we need to reset the context data\n if (entityNode.defineEntity?.contextKey && initialAccountId) {\n entityNode.context.entityName = undefined;\n entityNode.context.entityKind = undefined;\n }\n\n const accountNames = collectAccountNamesFromNodeHierarchy(entityNode);\n\n if (initialAccountId) {\n accountNames.push(initialAccountId);\n }\n return accountNames;\n}\n","import { kcpRootOrgsPath } from '../models/constants';\nimport { PortalLuigiNode } from '../models/luigi-node';\nimport {\n calculateAccountHierarchy,\n getInitialAccountId,\n} from '../utils/account-hierarchy.util';\nimport { Injectable, inject } from '@angular/core';\nimport { EnvConfigService } from '@openmfp/portal-ui-lib';\nimport { GatewayService } from '@platform-mesh/portal-ui-lib/services';\n\nexport interface KcpData {\n kcpPath: string;\n accountPath: string | undefined;\n}\n\n@Injectable({ providedIn: 'root' })\nexport class CrdGatewayKcpPatchResolver {\n private gatewayService = inject(GatewayService);\n private envConfigService = inject(EnvConfigService);\n\n public async resolveCrdGatewayKcpPath(\n nextNode: PortalLuigiNode,\n entityId?: string,\n kind?: string,\n ): Promise<KcpData> {\n if (nextNode.context?.kcpPath && !getInitialAccountId(entityId, kind)) {\n this.gatewayService.updateCrdGatewayUrlWithEntityPath(\n nextNode.context.kcpPath,\n );\n return {\n kcpPath: nextNode.context.kcpPath,\n accountPath: nextNode.context.accountPath,\n };\n }\n\n const accountNames = calculateAccountHierarchy(nextNode, entityId, kind);\n\n const accountPath =\n accountNames.length > 0 ? `${accountNames.join(':')}` : '';\n\n const org = (await this.envConfigService.getEnvConfig()).idpName;\n const kcpPath = `${kcpRootOrgsPath}:${org}${accountPath ? ':' + accountPath : ''}`;\n this.gatewayService.updateCrdGatewayUrlWithEntityPath(kcpPath);\n\n if (nextNode.context) {\n nextNode.context.kcpPath = kcpPath;\n nextNode.context.accountPath = accountPath;\n }\n return { kcpPath, accountPath };\n }\n}\n","import { PortalLuigiNode } from '../models/luigi-node';\nimport { PersistentPanelService } from '../persistent-panel/persistent-panel.service';\nimport { CrdGatewayKcpPatchResolver } from './crd-gateway-kcp-patch-resolver.service';\nimport { Injectable, inject } from '@angular/core';\nimport {\n LuigiCoreService,\n NodeChangeHookConfigService,\n NodeContext,\n} from '@openmfp/portal-ui-lib';\n\n@Injectable({ providedIn: 'root' })\nexport class NodeChangeHookConfigServiceImpl implements NodeChangeHookConfigService {\n private luigiCoreService = inject(LuigiCoreService);\n private crdGatewayKcpPatchResolver = inject(CrdGatewayKcpPatchResolver);\n private persistentPanelService = inject(PersistentPanelService);\n\n async nodeChangeHook(\n prevNode: PortalLuigiNode,\n nextNode: PortalLuigiNode,\n currentContext: NodeContext,\n ) {\n const updatePersistentPanelTarget =\n this.persistentPanelService.beginTargetUpdate();\n\n if (\n nextNode.initialRoute &&\n nextNode.virtualTree &&\n !(nextNode as any)._virtualTree\n ) {\n this.luigiCoreService.navigation().navigate(nextNode.initialRoute);\n }\n\n this.accumulatePortalPermissions(prevNode, nextNode, currentContext);\n await this.crdGatewayKcpPatchResolver.resolveCrdGatewayKcpPath(nextNode);\n updatePersistentPanelTarget({\n ...currentContext,\n ...(nextNode.context ?? {}),\n });\n }\n\n private accumulatePortalPermissions(\n prevNode: PortalLuigiNode,\n nextNode: PortalLuigiNode,\n currentContext: NodeContext,\n ) {\n const portalPermissions =\n prevNode?.context?.portalPermissions ??\n currentContext?.portalPermissions ??\n {};\n\n nextNode.context?.nodesPermissions?.forEach((permission) => {\n portalPermissions[permission.resource] = permission.actions;\n });\n\n currentContext.portalPermissions = portalPermissions;\n\n if (nextNode.context) {\n nextNode.context.portalPermissions = portalPermissions;\n }\n }\n}\n","import { PortalNodeContext } from '../models/luigi-context';\nimport { PortalLuigiNode } from '../models/luigi-node';\nimport { CrdGatewayKcpPatchResolver } from './crd-gateway-kcp-patch-resolver.service';\nimport { Injectable, inject } from '@angular/core';\nimport {\n LuigiCoreService,\n NodeContextProcessingService,\n} from '@openmfp/portal-ui-lib';\nimport {\n ALL_NAMESPACE,\n AccountInfo,\n} from '@platform-mesh/portal-ui-lib/models';\nimport {\n AccountInfoService,\n ErrorHandlerService,\n InstancePermissionsService,\n OrganizationReadyService,\n ResourceService,\n} from '@platform-mesh/portal-ui-lib/services';\nimport {\n generateGraphQLFields,\n isNamespacedResource,\n permissionKey,\n} from '@platform-mesh/portal-ui-lib/utils';\nimport { firstValueFrom } from 'rxjs';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class NodeContextProcessingServiceImpl implements NodeContextProcessingService {\n private crdGatewayKcpPatchResolver = inject(CrdGatewayKcpPatchResolver);\n private accountInfoService = inject(AccountInfoService);\n private instancePermissionsService = inject(InstancePermissionsService);\n private organizationReadyService = inject(OrganizationReadyService);\n private errorHandlerService = inject(ErrorHandlerService);\n private luigiCoreService = inject(LuigiCoreService);\n\n public async processNodeContext(\n dynamicEntityId: string,\n entityNode: PortalLuigiNode,\n ctx: PortalNodeContext,\n ) {\n const kind = entityNode.defineEntity?.type;\n const entityId =\n dynamicEntityId || entityNode.context.resourceDefinition?.name;\n\n if (!entityId) {\n return;\n }\n\n const { kcpPath, accountPath } =\n await this.crdGatewayKcpPatchResolver.resolveCrdGatewayKcpPath(\n entityNode,\n entityId,\n kind,\n );\n\n const namespace =\n this.luigiCoreService.routing().getSearchParams().namespace !==\n ALL_NAMESPACE\n ? this.luigiCoreService.routing().getSearchParams().namespace\n : undefined;\n\n // update the current already calculated by Luigi context for a node\n this.addFieldsToContext(\n ctx,\n entityId,\n kcpPath,\n accountPath,\n kind,\n namespace,\n );\n\n // update the node context of sa node to contain the entity for future context calculations\n this.addFieldsToContext(\n entityNode.context,\n entityId,\n kcpPath,\n accountPath,\n kind,\n namespace,\n );\n\n this.accamulatePortalPermissions(ctx);\n this.getEntityPermissions(ctx, namespace);\n try {\n const accountInfo = await firstValueFrom(\n this.accountInfoService.read({\n portalContext: {\n crdGatewayApiUrl: ctx.portalContext.crdGatewayApiUrl,\n },\n token: ctx.token,\n accountId: entityId,\n }),\n );\n\n // update the current already calculated by Luigi context for a node\n this.addFieldsToContextFromAccountInfo(ctx, entityId, accountInfo);\n\n // update the node context of sa node to contain the entity for future context calculations\n this.addFieldsToContextFromAccountInfo(\n entityNode.context,\n entityId,\n accountInfo,\n );\n\n // we were able to ready the account info so on this kcpPath we can query for the organization ready state\n this.organizationReadyService.checkOrganizationReady();\n } catch (e) {\n if (!this.errorHandlerService.isUnauthorizedAccess(e)) {\n console.error('Failed to read account info', e);\n }\n }\n }\n\n private addFieldsToContext(\n ctx: PortalNodeContext,\n entityId: string | undefined,\n kcpPath: string,\n accountPath: string | undefined,\n kind: string | undefined,\n namespace: string | undefined,\n ) {\n ctx.kcpPath = kcpPath;\n ctx.entityName = entityId;\n ctx.entityKind = kind;\n ctx.accountPath = accountPath;\n ctx.namespaceId = namespace;\n }\n\n private addFieldsToContextFromAccountInfo(\n ctx: PortalNodeContext,\n entityId: string,\n accountInfo: AccountInfo,\n ) {\n const accountOriginClusterId = accountInfo.spec.account.originClusterId;\n const organizationOriginClusterId =\n accountInfo.spec.organization.originClusterId;\n const organization = accountInfo.spec.organization.name;\n\n ctx.organizationId = `${organizationOriginClusterId}/${organization}`;\n ctx.entityId = `${accountOriginClusterId}/${entityId}`;\n ctx.kcpCA = btoa(accountInfo.spec.clusterInfo.ca);\n }\n\n private getEntityPermissions(\n ctx: PortalNodeContext,\n namespace: string | undefined,\n ) {\n const resourceDefinition = ctx.resourceDefinition;\n\n if (!resourceDefinition || !resourceDefinition?.permissionsDefinition) {\n return;\n }\n\n const name = ctx[resourceDefinition.permissionsDefinition.entityContextKey];\n\n if (!name) {\n return;\n }\n\n return this.instancePermissionsService\n .checkInstance(ctx, resourceDefinition.permissionsDefinition!, {\n name,\n namespace,\n })\n .subscribe((result) => {\n const portalPermissions = ctx.portalPermissions ?? {};\n\n result.forEach((permission) => {\n portalPermissions[`${permissionKey(permission)}`] =\n permission.actions;\n });\n\n ctx.portalPermissions = portalPermissions;\n });\n }\n\n private accamulatePortalPermissions(ctx: PortalNodeContext) {\n const portalPermissions = ctx.portalPermissions ?? {};\n\n ctx.nodesPermissions?.forEach((permission) => {\n portalPermissions[permission.resource] = permission.actions;\n });\n\n ctx.portalPermissions = portalPermissions;\n }\n}\n","import { Injectable, inject } from '@angular/core';\nimport {\n ClientEnvironment,\n EnvConfigService,\n RoutingConfigService,\n} from '@openmfp/portal-ui-lib';\n\n@Injectable()\nexport class CustomRoutingConfigServiceImpl implements RoutingConfigService {\n private envConfigService = inject(EnvConfigService);\n private envConfig: ClientEnvironment | null = null;\n\n constructor() {\n this.getEnvConfig();\n }\n\n async getEnvConfig(): Promise<void> {\n this.envConfig = await this.envConfigService.getEnvConfig();\n }\n\n getRoutingConfig(): any {\n return {\n preserveQueryParams: true,\n pageNotFoundHandler: () => {\n if (!this.envConfig?.baseDomain) {\n return this.redirectTo('error/404');\n }\n\n if (window.location.hostname === this.envConfig.baseDomain) {\n return this.redirectTo('welcome');\n }\n\n return this.redirectTo('error/404');\n },\n };\n }\n\n public redirectTo(path: string, keepURL = true): any {\n return {\n redirectTo: path,\n keepURL,\n };\n }\n}\n","import { Injectable, inject } from '@angular/core';\nimport {\n AuthService,\n UserProfile,\n UserProfileConfigService,\n} from '@openmfp/portal-ui-lib';\n\n@Injectable({ providedIn: 'root' })\nexport class UserProfileConfigServiceImpl implements UserProfileConfigService {\n private authService = inject(AuthService);\n async getProfile(): Promise<UserProfile> {\n const { email } = this.authService.getUserInfo();\n\n return {\n items: [\n {\n label: 'PROFILE_PROFILE',\n icon: 'customer',\n link: `/users/${email}/overview`,\n },\n ],\n };\n }\n}\n","import { PersistentPanelService } from './persistent-panel.service';\nimport {\n OPEN_PERSISTENT_PANEL_MESSAGE,\n mergePersistentPanelTargets,\n parsePersistentPanelConfig,\n persistentPanelTarget,\n} from './persistent-panel.types';\nimport { Injectable, inject } from '@angular/core';\nimport {\n CustomMessageListener,\n LuigiCoreService,\n NodeContext,\n} from '@openmfp/portal-ui-lib';\n\n@Injectable({ providedIn: 'root' })\nexport class OpenPersistentPanelListener implements CustomMessageListener {\n private readonly luigiCoreService = inject(LuigiCoreService);\n private readonly persistentPanelService = inject(PersistentPanelService);\n\n messageId(): string {\n return OPEN_PERSISTENT_PANEL_MESSAGE;\n }\n\n onCustomMessageReceived(\n customMessage: Record<string, unknown>,\n _microFrontend: unknown,\n microFrontendNode: { context?: NodeContext; viewUrl?: string } | undefined,\n ): void {\n const config = parsePersistentPanelConfig(\n customMessage as { id: string },\n microFrontendNode,\n new URL(document.baseURI).origin,\n );\n const target = mergePersistentPanelTargets(\n this.persistentPanelService.currentTarget(),\n persistentPanelTarget(\n this.luigiCoreService.getGlobalContext(),\n microFrontendNode?.context,\n ),\n );\n this.persistentPanelService.open(config, target);\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["isRecord"],"mappings":"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"}
|
|
@@ -370,13 +370,16 @@ class ResourceService {
|
|
|
370
370
|
}))
|
|
371
371
|
.map((r) => ({
|
|
372
372
|
...r,
|
|
373
|
-
id: r
|
|
373
|
+
id: this.getResourceId(r),
|
|
374
374
|
isAvailable: this.isAvailable(r, resourceDefinition.availableWhenNotReady),
|
|
375
375
|
accessibleName: this.getAccessibleName(r),
|
|
376
376
|
}));
|
|
377
377
|
return { ...resourceListResult, items: processedResult };
|
|
378
378
|
}));
|
|
379
379
|
}
|
|
380
|
+
getResourceId(resource) {
|
|
381
|
+
return `${resource.metadata.name}${resource.metadata.namespace ? '_' + resource.metadata.namespace : ''}`;
|
|
382
|
+
}
|
|
380
383
|
isAvailable(item, availableWhenNotReady = false) {
|
|
381
384
|
return ((!!item.ready || availableWhenNotReady) &&
|
|
382
385
|
!item.metadata?.deletionTimestamp);
|
|
@@ -434,7 +437,7 @@ class ResourceService {
|
|
|
434
437
|
const resource = getValueByPath(res.data, lowerCaseOperation);
|
|
435
438
|
if (resource) {
|
|
436
439
|
resource.object.ready = this.getResourceReadyStatus(resource.object, nodeContext);
|
|
437
|
-
resource.object.id = resource.object
|
|
440
|
+
resource.object.id = this.getResourceId(resource.object);
|
|
438
441
|
resource.object.isAvailable = this.isAvailable(resource.object, nodeContext.resourceDefinition?.availableWhenNotReady);
|
|
439
442
|
resource.object.accessibleName = this.getAccessibleName(resource.object);
|
|
440
443
|
}
|