@rolatech/angular-platform 20.3.0-beta.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.
Files changed (51) hide show
  1. package/README.md +3 -0
  2. package/fesm2022/rolatech-angular-platform-application-create-DqPMquaO.mjs +129 -0
  3. package/fesm2022/rolatech-angular-platform-application-create-DqPMquaO.mjs.map +1 -0
  4. package/fesm2022/rolatech-angular-platform-application-detail-BoITs_yE.mjs +54 -0
  5. package/fesm2022/rolatech-angular-platform-application-detail-BoITs_yE.mjs.map +1 -0
  6. package/fesm2022/rolatech-angular-platform-application-index-BlCbJVDc.mjs +82 -0
  7. package/fesm2022/rolatech-angular-platform-application-index-BlCbJVDc.mjs.map +1 -0
  8. package/fesm2022/rolatech-angular-platform-application-organization-index-D7TJ8CID.mjs +54 -0
  9. package/fesm2022/rolatech-angular-platform-application-organization-index-D7TJ8CID.mjs.map +1 -0
  10. package/fesm2022/rolatech-angular-platform-application-role-index-9_XVRBgD.mjs +66 -0
  11. package/fesm2022/rolatech-angular-platform-application-role-index-9_XVRBgD.mjs.map +1 -0
  12. package/fesm2022/rolatech-angular-platform-application-routes-DE5CJMgn.mjs +38 -0
  13. package/fesm2022/rolatech-angular-platform-application-routes-DE5CJMgn.mjs.map +1 -0
  14. package/fesm2022/rolatech-angular-platform-platform-auth-client-detail-BMvM7PvP.mjs +137 -0
  15. package/fesm2022/rolatech-angular-platform-platform-auth-client-detail-BMvM7PvP.mjs.map +1 -0
  16. package/fesm2022/rolatech-angular-platform-platform-auth-client-editor-75GPRUsF.mjs +281 -0
  17. package/fesm2022/rolatech-angular-platform-platform-auth-client-editor-75GPRUsF.mjs.map +1 -0
  18. package/fesm2022/rolatech-angular-platform-platform-auth-client-index-DilT3UzO.mjs +95 -0
  19. package/fesm2022/rolatech-angular-platform-platform-auth-client-index-DilT3UzO.mjs.map +1 -0
  20. package/fesm2022/rolatech-angular-platform-platform-auth-client.routes-D_VFpAgu.mjs +21 -0
  21. package/fesm2022/rolatech-angular-platform-platform-auth-client.routes-D_VFpAgu.mjs.map +1 -0
  22. package/fesm2022/rolatech-angular-platform-platform-endpoint-detail-CEaO9MFQ.mjs +57 -0
  23. package/fesm2022/rolatech-angular-platform-platform-endpoint-detail-CEaO9MFQ.mjs.map +1 -0
  24. package/fesm2022/rolatech-angular-platform-platform-endpoint-index-69W62bRP.mjs +92 -0
  25. package/fesm2022/rolatech-angular-platform-platform-endpoint-index-69W62bRP.mjs.map +1 -0
  26. package/fesm2022/rolatech-angular-platform-platform-endpoint.routes-Cj66S7N-.mjs +13 -0
  27. package/fesm2022/rolatech-angular-platform-platform-endpoint.routes-Cj66S7N-.mjs.map +1 -0
  28. package/fesm2022/rolatech-angular-platform-platform-role-index-8kRxDJiW.mjs +35 -0
  29. package/fesm2022/rolatech-angular-platform-platform-role-index-8kRxDJiW.mjs.map +1 -0
  30. package/fesm2022/rolatech-angular-platform-platform-service-registry-detail-CQ4Wk1R8.mjs +89 -0
  31. package/fesm2022/rolatech-angular-platform-platform-service-registry-detail-CQ4Wk1R8.mjs.map +1 -0
  32. package/fesm2022/rolatech-angular-platform-platform-service-registry-editor-Bd3nIfxd.mjs +246 -0
  33. package/fesm2022/rolatech-angular-platform-platform-service-registry-editor-Bd3nIfxd.mjs.map +1 -0
  34. package/fesm2022/rolatech-angular-platform-platform-service-registry-index-D4470pau.mjs +95 -0
  35. package/fesm2022/rolatech-angular-platform-platform-service-registry-index-D4470pau.mjs.map +1 -0
  36. package/fesm2022/rolatech-angular-platform-platform-service-registry.routes-DlWUwwws.mjs +21 -0
  37. package/fesm2022/rolatech-angular-platform-platform-service-registry.routes-DlWUwwws.mjs.map +1 -0
  38. package/fesm2022/rolatech-angular-platform-platform-user-detail-fzo89PHV.mjs +81 -0
  39. package/fesm2022/rolatech-angular-platform-platform-user-detail-fzo89PHV.mjs.map +1 -0
  40. package/fesm2022/rolatech-angular-platform-platform-user-index-DBT4N0zi.mjs +89 -0
  41. package/fesm2022/rolatech-angular-platform-platform-user-index-DBT4N0zi.mjs.map +1 -0
  42. package/fesm2022/rolatech-angular-platform-platform-user.routes-C6OoAsWU.mjs +13 -0
  43. package/fesm2022/rolatech-angular-platform-platform-user.routes-C6OoAsWU.mjs.map +1 -0
  44. package/fesm2022/rolatech-angular-platform-role-permission-page-DslhArZQ.mjs +527 -0
  45. package/fesm2022/rolatech-angular-platform-role-permission-page-DslhArZQ.mjs.map +1 -0
  46. package/fesm2022/rolatech-angular-platform-role-permission-page.routes-IiX17wDW.mjs +11 -0
  47. package/fesm2022/rolatech-angular-platform-role-permission-page.routes-IiX17wDW.mjs.map +1 -0
  48. package/fesm2022/rolatech-angular-platform.mjs +293 -0
  49. package/fesm2022/rolatech-angular-platform.mjs.map +1 -0
  50. package/package.json +33 -0
  51. package/types/rolatech-angular-platform.d.ts +70 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rolatech-angular-platform-platform-auth-client-editor-75GPRUsF.mjs","sources":["../../../../packages/angular-platform/src/lib/store/platform-auth-client-editor.facade.ts","../../../../packages/angular-platform/src/lib/pages/client/platform-auth-client-editor/platform-auth-client-editor.ts","../../../../packages/angular-platform/src/lib/pages/client/platform-auth-client-editor/platform-auth-client-editor.html"],"sourcesContent":["import { Injectable, inject, signal } from '@angular/core';\nimport { PlatformAuthClientDetailResponse, PlatformAuthClientService } from '@rolatech/angular-services';\nimport { firstValueFrom } from 'rxjs';\n\n@Injectable()\nexport class PlatformAuthClientEditorFacade {\n private readonly authClientService = inject(PlatformAuthClientService);\n\n readonly loading = signal(false);\n readonly saving = signal(false);\n readonly deleting = signal(false);\n readonly error = signal<string | null>(null);\n\n readonly id = signal<string | null>(null);\n readonly clientId = signal('');\n readonly name = signal('');\n readonly description = signal('');\n readonly enabled = signal(true);\n readonly confidential = signal(true);\n readonly grantTypesText = signal('');\n readonly redirectUrisText = signal('');\n readonly scopesText = signal('');\n readonly permissionsText = signal('');\n readonly appId = signal('');\n readonly appSecret = signal('');\n readonly attributesText = signal('');\n\n async load(id: string): Promise<void> {\n this.loading.set(true);\n this.error.set(null);\n\n try {\n const item = await firstValueFrom(this.authClientService.findClientById(id));\n this.patchForm(item);\n } catch (error) {\n console.error(error);\n this.error.set('Unable to load the auth client.');\n } finally {\n this.loading.set(false);\n }\n }\n\n async save(): Promise<PlatformAuthClientDetailResponse | null> {\n const name = this.name().trim();\n if (!name) {\n this.error.set('Name is required.');\n return null;\n }\n\n const attributes = this.parseAttributes(this.attributesText());\n if (attributes === undefined) {\n return null;\n }\n\n this.saving.set(true);\n this.error.set(null);\n\n try {\n const payload = {\n clientId: this.clientId().trim() || null,\n name,\n description: this.description().trim() || null,\n enabled: this.enabled(),\n confidential: this.confidential(),\n grantTypes: this.parseList(this.grantTypesText()),\n redirectUris: this.parseList(this.redirectUrisText()),\n scopes: this.parseList(this.scopesText()),\n permissions: this.parseList(this.permissionsText()),\n appId: this.appId().trim() || null,\n appSecret: this.appSecret().trim() || null,\n attributes,\n };\n\n const result = this.id()\n ? await firstValueFrom(this.authClientService.updateClient(this.id()!, payload))\n : await firstValueFrom(this.authClientService.createClient(payload));\n\n this.patchForm(result);\n return result;\n } catch (error) {\n console.error(error);\n this.error.set('Unable to save the auth client.');\n return null;\n } finally {\n this.saving.set(false);\n }\n }\n\n async delete(id = this.id()): Promise<boolean> {\n if (!id) {\n this.error.set('Auth client ID is missing.');\n return false;\n }\n\n this.deleting.set(true);\n this.error.set(null);\n\n try {\n await firstValueFrom(this.authClientService.deleteClient(id));\n return true;\n } catch (error) {\n console.error(error);\n this.error.set('Unable to delete the auth client.');\n return false;\n } finally {\n this.deleting.set(false);\n }\n }\n\n setClientId(value: string): void {\n this.clientId.set(value);\n }\n\n setName(value: string): void {\n this.name.set(value);\n }\n\n setDescription(value: string): void {\n this.description.set(value);\n }\n\n setEnabled(value: boolean): void {\n this.enabled.set(value);\n }\n\n setConfidential(value: boolean): void {\n this.confidential.set(value);\n }\n\n setGrantTypesText(value: string): void {\n this.grantTypesText.set(value);\n }\n\n setRedirectUrisText(value: string): void {\n this.redirectUrisText.set(value);\n }\n\n setScopesText(value: string): void {\n this.scopesText.set(value);\n }\n\n setPermissionsText(value: string): void {\n this.permissionsText.set(value);\n }\n\n setAppId(value: string): void {\n this.appId.set(value);\n }\n\n setAppSecret(value: string): void {\n this.appSecret.set(value);\n }\n\n setAttributesText(value: string): void {\n this.attributesText.set(value);\n }\n\n private patchForm(item: PlatformAuthClientDetailResponse): void {\n this.id.set(item.id);\n this.clientId.set(item.clientId ?? '');\n this.name.set(item.name ?? '');\n this.description.set(item.description ?? '');\n this.enabled.set(item.enabled);\n this.confidential.set(item.confidential);\n this.grantTypesText.set(item.grantTypes.join('\\n'));\n this.redirectUrisText.set(item.redirectUris.join('\\n'));\n this.scopesText.set(item.scopes.join('\\n'));\n this.permissionsText.set(item.permissions.join('\\n'));\n this.appId.set(item.appId ?? '');\n this.appSecret.set(item.appSecret ?? '');\n this.attributesText.set(item.attributes ? JSON.stringify(item.attributes, null, 2) : '');\n }\n\n private parseList(value: string): string[] {\n return Array.from(\n new Set(\n value\n .split(/\\r?\\n|,/)\n .map((item) => item.trim())\n .filter(Boolean),\n ),\n );\n }\n\n private parseAttributes(value: string): Record<string, unknown> | null | undefined {\n const trimmed = value.trim();\n if (!trimmed) {\n return null;\n }\n\n try {\n const parsed = JSON.parse(trimmed);\n if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) {\n this.error.set('Additional attributes must be a JSON object.');\n return undefined;\n }\n\n return parsed as Record<string, unknown>;\n } catch (error) {\n console.error(error);\n this.error.set('Additional attributes must be valid JSON.');\n return undefined;\n }\n }\n}\n","import { ChangeDetectionStrategy, Component, OnInit, inject } from '@angular/core';\nimport { ActivatedRoute, Router } from '@angular/router';\nimport { MatSnackBar, MatSnackBarModule } from '@angular/material/snack-bar';\nimport { PlatformDetailPanel, PlatformPageHeader, PlatformStickyActionBar } from '../../../shared';\nimport { PlatformAuthClientEditorFacade } from '../../../store/platform-auth-client-editor.facade';\n\n@Component({\n selector: 'rolatech-platform-auth-client-editor-page',\n standalone: true,\n imports: [MatSnackBarModule, PlatformPageHeader, PlatformDetailPanel, PlatformStickyActionBar],\n templateUrl: './platform-auth-client-editor.html',\n styleUrl: './platform-auth-client-editor.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [PlatformAuthClientEditorFacade],\n})\nexport class PlatformAuthClientEditorPage implements OnInit {\n readonly facade = inject(PlatformAuthClientEditorFacade);\n private readonly route = inject(ActivatedRoute);\n private readonly router = inject(Router);\n private readonly snackBar = inject(MatSnackBar);\n\n readonly clientId = this.route.snapshot.paramMap.get('clientId');\n\n get isEdit(): boolean {\n return !!this.clientId;\n }\n\n ngOnInit(): void {\n if (this.clientId) {\n void this.facade.load(this.clientId);\n }\n }\n\n onClientIdInput(event: Event): void {\n this.facade.setClientId((event.target as HTMLInputElement).value);\n }\n\n onNameInput(event: Event): void {\n this.facade.setName((event.target as HTMLInputElement).value);\n }\n\n onDescriptionInput(event: Event): void {\n this.facade.setDescription((event.target as HTMLTextAreaElement).value);\n }\n\n onEnabledChange(event: Event): void {\n this.facade.setEnabled((event.target as HTMLInputElement).checked);\n }\n\n onConfidentialChange(event: Event): void {\n this.facade.setConfidential((event.target as HTMLInputElement).checked);\n }\n\n onGrantTypesInput(event: Event): void {\n this.facade.setGrantTypesText((event.target as HTMLTextAreaElement).value);\n }\n\n onRedirectUrisInput(event: Event): void {\n this.facade.setRedirectUrisText((event.target as HTMLTextAreaElement).value);\n }\n\n onScopesInput(event: Event): void {\n this.facade.setScopesText((event.target as HTMLTextAreaElement).value);\n }\n\n onPermissionsInput(event: Event): void {\n this.facade.setPermissionsText((event.target as HTMLTextAreaElement).value);\n }\n\n onAppIdInput(event: Event): void {\n this.facade.setAppId((event.target as HTMLInputElement).value);\n }\n\n onAppSecretInput(event: Event): void {\n this.facade.setAppSecret((event.target as HTMLInputElement).value);\n }\n\n onAttributesInput(event: Event): void {\n this.facade.setAttributesText((event.target as HTMLTextAreaElement).value);\n }\n\n async save(): Promise<void> {\n const result = await this.facade.save();\n if (!result) {\n return;\n }\n\n let message = this.isEdit ? 'Auth client updated.' : 'Auth client created.';\n if (!this.isEdit && result.clientSecret) {\n try {\n await this.copySecret(result.clientSecret);\n message = 'Auth client created. Client secret copied.';\n } catch (error) {\n console.error(error);\n message = 'Auth client created. Client secret is available on the detail page.';\n }\n }\n\n this.snackBar.open(message, 'Dismiss', { duration: 3000 });\n await this.router.navigate(['/platform/clients', result.id], {\n state: result.clientSecret ? { createdSecret: result.clientSecret } : undefined,\n });\n }\n\n async cancel(): Promise<void> {\n if (this.isEdit && this.clientId) {\n await this.router.navigate(['/platform/clients', this.clientId]);\n return;\n }\n\n await this.router.navigate(['/platform/clients']);\n }\n\n private async copySecret(secret: string): Promise<void> {\n if (!globalThis.navigator?.clipboard) {\n return;\n }\n\n await globalThis.navigator.clipboard.writeText(secret);\n }\n}\n","<section class=\"rt-platform-theme flex flex-col gap-6 bg-(--rt-base-background) p-6 text-(--rt-text-primary)\">\n <rolatech-platform-page-header>\n <div header-left class=\"space-y-1\">\n <h1 class=\"text-2xl font-semibold tracking-tight\">@if (isEdit) { Edit Auth Client } @else { Create Auth Client }</h1>\n <p class=\"text-sm text-muted-foreground\">\n @if (isEdit) { Update auth client configuration, redirect coverage, and linked app settings. } @else { Create a new auth client for platform-managed integrations. }\n </p>\n </div>\n </rolatech-platform-page-header>\n\n @if (facade.loading()) {\n <section class=\"rounded-2xl border border-(--rt-border-color) bg-card p-10 text-center text-muted-foreground shadow-sm\">Loading auth client...</section>\n } @else {\n @if (facade.error()) {\n <section class=\"rounded-2xl border border-rose-300/40 bg-rose-500/10 px-4 py-3 text-sm text-(--rt-text-primary)\">\n {{ facade.error() }}\n </section>\n }\n\n <rolatech-platform-detail-panel>\n <div panel-title>Basic Information</div>\n <div panel-description>Core client identity and activation state.</div>\n\n <div class=\"grid gap-4 md:grid-cols-2\">\n <label class=\"flex flex-col gap-2\">\n <span class=\"text-sm font-medium\">Name</span>\n <input\n type=\"text\"\n [value]=\"facade.name()\"\n (input)=\"onNameInput($event)\"\n placeholder=\"Store Console\"\n class=\"h-10 rounded-xl border border-(--rt-border-color) px-3 text-sm outline-none\"\n />\n </label>\n\n <label class=\"flex flex-col gap-2\">\n <span class=\"text-sm font-medium\">Client ID</span>\n <input\n type=\"text\"\n [value]=\"facade.clientId()\"\n (input)=\"onClientIdInput($event)\"\n [readOnly]=\"isEdit\"\n placeholder=\"Optional if generated by backend\"\n class=\"h-10 rounded-xl border border-(--rt-border-color) px-3 text-sm outline-none\"\n />\n </label>\n\n <label class=\"md:col-span-2 flex flex-col gap-2\">\n <span class=\"text-sm font-medium\">Description</span>\n <textarea\n rows=\"4\"\n [value]=\"facade.description()\"\n (input)=\"onDescriptionInput($event)\"\n placeholder=\"Describe where this client is used.\"\n class=\"rounded-xl border border-(--rt-border-color) px-3 py-2 text-sm outline-none\"\n ></textarea>\n </label>\n\n <label class=\"flex items-center gap-2 pt-8\">\n <input type=\"checkbox\" [checked]=\"facade.enabled()\" (change)=\"onEnabledChange($event)\" />\n <span class=\"text-sm font-medium\">Enabled</span>\n </label>\n\n <label class=\"flex items-center gap-2 pt-8\">\n <input type=\"checkbox\" [checked]=\"facade.confidential()\" (change)=\"onConfidentialChange($event)\" />\n <span class=\"text-sm font-medium\">Confidential client</span>\n </label>\n </div>\n </rolatech-platform-detail-panel>\n\n <section class=\"grid gap-6 xl:grid-cols-2\">\n <rolatech-platform-detail-panel>\n <div panel-title>OAuth Configuration</div>\n <div panel-description>One value per line or comma separated.</div>\n\n <div class=\"space-y-4\">\n <label class=\"flex flex-col gap-2\">\n <span class=\"text-sm font-medium\">Grant Types</span>\n <textarea\n rows=\"5\"\n [value]=\"facade.grantTypesText()\"\n (input)=\"onGrantTypesInput($event)\"\n placeholder=\"authorization_code&#10;refresh_token\"\n class=\"rounded-xl border border-(--rt-border-color) px-3 py-2 text-sm outline-none\"\n ></textarea>\n </label>\n\n <label class=\"flex flex-col gap-2\">\n <span class=\"text-sm font-medium\">Scopes</span>\n <textarea\n rows=\"5\"\n [value]=\"facade.scopesText()\"\n (input)=\"onScopesInput($event)\"\n placeholder=\"openid&#10;profile\"\n class=\"rounded-xl border border-(--rt-border-color) px-3 py-2 text-sm outline-none\"\n ></textarea>\n </label>\n\n <label class=\"flex flex-col gap-2\">\n <span class=\"text-sm font-medium\">Permissions</span>\n <textarea\n rows=\"5\"\n [value]=\"facade.permissionsText()\"\n (input)=\"onPermissionsInput($event)\"\n placeholder=\"platform.clients.read&#10;platform.clients.write\"\n class=\"rounded-xl border border-(--rt-border-color) px-3 py-2 text-sm outline-none\"\n ></textarea>\n </label>\n </div>\n </rolatech-platform-detail-panel>\n\n <rolatech-platform-detail-panel>\n <div panel-title>Endpoints And Attributes</div>\n <div panel-description>Redirect URIs and optional app-linked credentials.</div>\n\n <div class=\"space-y-4\">\n <label class=\"flex flex-col gap-2\">\n <span class=\"text-sm font-medium\">Redirect URIs</span>\n <textarea\n rows=\"6\"\n [value]=\"facade.redirectUrisText()\"\n (input)=\"onRedirectUrisInput($event)\"\n placeholder=\"https://console.rolatech.com/callback\"\n class=\"rounded-xl border border-(--rt-border-color) px-3 py-2 text-sm outline-none\"\n ></textarea>\n </label>\n\n <div class=\"grid gap-4 md:grid-cols-2\">\n <label class=\"flex flex-col gap-2\">\n <span class=\"text-sm font-medium\">App ID</span>\n <input\n type=\"text\"\n [value]=\"facade.appId()\"\n (input)=\"onAppIdInput($event)\"\n placeholder=\"Optional linked app id\"\n class=\"h-10 rounded-xl border border-(--rt-border-color) px-3 text-sm outline-none\"\n />\n </label>\n\n <label class=\"flex flex-col gap-2\">\n <span class=\"text-sm font-medium\">App Secret</span>\n <input\n type=\"text\"\n [value]=\"facade.appSecret()\"\n (input)=\"onAppSecretInput($event)\"\n placeholder=\"Optional linked app secret\"\n class=\"h-10 rounded-xl border border-(--rt-border-color) px-3 text-sm outline-none\"\n />\n </label>\n </div>\n\n <label class=\"flex flex-col gap-2\">\n <span class=\"text-sm font-medium\">Additional Attributes (JSON object)</span>\n <textarea\n rows=\"8\"\n [value]=\"facade.attributesText()\"\n (input)=\"onAttributesInput($event)\"\n placeholder='{\"owner\":\"platform\"}'\n class=\"rounded-xl border border-(--rt-border-color) px-3 py-2 font-mono text-sm outline-none\"\n ></textarea>\n </label>\n </div>\n </rolatech-platform-detail-panel>\n </section>\n\n <rolatech-platform-sticky-action-bar>\n <div action-message>@if (isEdit) { Save changes to this auth client. } @else { Create the auth client and keep the generated secret if one is returned. }</div>\n\n <div action-buttons class=\"flex flex-wrap gap-3\">\n <button\n type=\"button\"\n class=\"inline-flex items-center rounded-xl border border-(--rt-border-color) px-4 py-2 text-sm font-medium\"\n [disabled]=\"facade.saving()\"\n (click)=\"cancel()\"\n >\n Cancel\n </button>\n <button\n type=\"button\"\n class=\"inline-flex items-center rounded-xl bg-(--rt-accent) px-4 py-2 text-sm font-medium text-(--rt-accent-foreground)\"\n [disabled]=\"facade.saving()\"\n (click)=\"save()\"\n >\n @if (facade.saving()) { Saving... } @else if (isEdit) { Save Changes } @else { Create Client }\n </button>\n </div>\n </rolatech-platform-sticky-action-bar>\n }\n</section>\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,95 @@
1
+ import * as i0 from '@angular/core';
2
+ import { inject, signal, computed, Injectable, ChangeDetectionStrategy, Component } from '@angular/core';
3
+ import { Router } from '@angular/router';
4
+ import { PlatformPageHeader, PlatformStatCard, PlatformFilterPanel, PlatformDataTable, PlatformStatusBadge } from './rolatech-angular-platform.mjs';
5
+ import { firstValueFrom } from 'rxjs';
6
+ import { PlatformAuthClientService } from '@rolatech/angular-services';
7
+
8
+ class PlatformAuthClientIndexFacade {
9
+ authClientService = inject(PlatformAuthClientService);
10
+ loading = signal(false, ...(ngDevMode ? [{ debugName: "loading" }] : []));
11
+ error = signal(null, ...(ngDevMode ? [{ debugName: "error" }] : []));
12
+ items = signal([], ...(ngDevMode ? [{ debugName: "items" }] : []));
13
+ keyword = signal('', ...(ngDevMode ? [{ debugName: "keyword" }] : []));
14
+ status = signal('ALL', ...(ngDevMode ? [{ debugName: "status" }] : []));
15
+ filteredItems = computed(() => {
16
+ const keyword = this.keyword().trim().toLowerCase();
17
+ const status = this.status();
18
+ return this.items().filter((item) => {
19
+ const haystack = [item.name, item.clientId, item.description, ...item.grantTypes, ...item.scopes]
20
+ .filter(Boolean)
21
+ .join(' ')
22
+ .toLowerCase();
23
+ const matchesKeyword = !keyword || haystack.includes(keyword);
24
+ const itemStatus = item.enabled ? 'ENABLED' : 'DISABLED';
25
+ const matchesStatus = status === 'ALL' || itemStatus === status;
26
+ return matchesKeyword && matchesStatus;
27
+ });
28
+ }, ...(ngDevMode ? [{ debugName: "filteredItems" }] : []));
29
+ total = computed(() => this.items().length, ...(ngDevMode ? [{ debugName: "total" }] : []));
30
+ enabledCount = computed(() => this.items().filter((item) => item.enabled).length, ...(ngDevMode ? [{ debugName: "enabledCount" }] : []));
31
+ confidentialCount = computed(() => this.items().filter((item) => item.confidential).length, ...(ngDevMode ? [{ debugName: "confidentialCount" }] : []));
32
+ redirectCount = computed(() => this.items().reduce((sum, item) => sum + item.redirectUris.length, 0), ...(ngDevMode ? [{ debugName: "redirectCount" }] : []));
33
+ async load() {
34
+ this.loading.set(true);
35
+ this.error.set(null);
36
+ try {
37
+ const page = await firstValueFrom(this.authClientService.findClients({
38
+ limit: 100,
39
+ sort: ['updatedAt desc'],
40
+ }));
41
+ this.items.set(page.items ?? []);
42
+ }
43
+ catch (error) {
44
+ console.error(error);
45
+ this.items.set([]);
46
+ this.error.set('Unable to load auth clients.');
47
+ }
48
+ finally {
49
+ this.loading.set(false);
50
+ }
51
+ }
52
+ setKeyword(value) {
53
+ this.keyword.set(value);
54
+ }
55
+ setStatus(value) {
56
+ this.status.set(value);
57
+ }
58
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.1", ngImport: i0, type: PlatformAuthClientIndexFacade, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
59
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.1", ngImport: i0, type: PlatformAuthClientIndexFacade });
60
+ }
61
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.1", ngImport: i0, type: PlatformAuthClientIndexFacade, decorators: [{
62
+ type: Injectable
63
+ }] });
64
+
65
+ class PlatformAuthClientIndexPage {
66
+ facade = inject(PlatformAuthClientIndexFacade);
67
+ router = inject(Router);
68
+ ngOnInit() {
69
+ void this.facade.load();
70
+ }
71
+ onKeywordInput(event) {
72
+ this.facade.setKeyword(event.target.value);
73
+ }
74
+ onStatusChange(event) {
75
+ this.facade.setStatus(event.target.value);
76
+ }
77
+ openClient(clientId) {
78
+ void this.router.navigate(['/platform/clients', clientId]);
79
+ }
80
+ createClient() {
81
+ void this.router.navigate(['/platform/clients/create']);
82
+ }
83
+ editClient(clientId) {
84
+ void this.router.navigate(['/platform/clients', clientId, 'edit']);
85
+ }
86
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.1", ngImport: i0, type: PlatformAuthClientIndexPage, deps: [], target: i0.ɵɵFactoryTarget.Component });
87
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.1", type: PlatformAuthClientIndexPage, isStandalone: true, selector: "rolatech-platform-auth-client-index-page", providers: [PlatformAuthClientIndexFacade], ngImport: i0, template: "<section class=\"rt-platform-theme flex flex-col gap-6 bg-(--rt-base-background) p-6 text-(--rt-text-primary)\">\n <rolatech-platform-page-header>\n <div header-left class=\"space-y-1\">\n <h1 class=\"text-2xl font-semibold tracking-tight\">Auth Clients</h1>\n <p class=\"text-sm text-muted-foreground\">Review platform clients, grant types, redirect coverage, and secret posture.</p>\n </div>\n <div header-actions>\n <button\n type=\"button\"\n class=\"inline-flex items-center rounded-xl bg-(--rt-accent) px-4 py-2 text-sm font-medium text-(--rt-accent-foreground)\"\n (click)=\"createClient()\"\n >\n Create Client\n </button>\n </div>\n </rolatech-platform-page-header>\n\n <section class=\"grid gap-4 md:grid-cols-2 xl:grid-cols-4\">\n <rolatech-platform-stat-card>\n <div stat-label>Total Clients</div>\n <div stat-value>{{ facade.total() }}</div>\n </rolatech-platform-stat-card>\n\n <rolatech-platform-stat-card>\n <div stat-label>Enabled</div>\n <div stat-value>{{ facade.enabledCount() }}</div>\n </rolatech-platform-stat-card>\n\n <rolatech-platform-stat-card>\n <div stat-label>Confidential</div>\n <div stat-value>{{ facade.confidentialCount() }}</div>\n </rolatech-platform-stat-card>\n\n <rolatech-platform-stat-card>\n <div stat-label>Redirect URIs</div>\n <div stat-value>{{ facade.redirectCount() }}</div>\n </rolatech-platform-stat-card>\n </section>\n\n <section class=\"grid gap-6 xl:grid-cols-[320px_minmax(0,1fr)]\">\n <rolatech-platform-filter-panel>\n <div filter-title>Filters</div>\n <div filter-description>Refine visible auth clients.</div>\n\n <label class=\"flex flex-col gap-2\">\n <span class=\"text-sm font-medium\">Search</span>\n <input\n type=\"text\"\n [value]=\"facade.keyword()\"\n (input)=\"onKeywordInput($event)\"\n placeholder=\"Search name, client ID, scope\"\n class=\"h-10 rounded-xl border border-(--rt-border-color) px-3 text-sm outline-none\"\n />\n </label>\n\n <label class=\"flex flex-col gap-2\">\n <span class=\"text-sm font-medium\">Status</span>\n <select class=\"h-10 rounded-xl border border-(--rt-border-color) px-3 text-sm outline-none\" (change)=\"onStatusChange($event)\">\n <option value=\"ALL\">All</option>\n <option value=\"ENABLED\">Enabled</option>\n <option value=\"DISABLED\">Disabled</option>\n </select>\n </label>\n </rolatech-platform-filter-panel>\n\n <rolatech-platform-data-table>\n <div table-toolbar class=\"flex items-center justify-between gap-3\">\n <h2 class=\"text-base font-semibold\">Client Catalog</h2>\n <div class=\"text-sm text-muted-foreground\">{{ facade.filteredItems().length }} items</div>\n </div>\n\n @if (facade.error()) {\n <p class=\"mb-4 rounded-2xl border border-rose-300/40 bg-rose-500/10 px-4 py-3 text-sm text-(--rt-text-primary)\">\n {{ facade.error() }}\n </p>\n }\n\n <thead class=\"bg-muted/40\">\n <tr class=\"text-left\">\n <th class=\"px-4 py-3 font-medium\">Client</th>\n <th class=\"px-4 py-3 font-medium\">Grant Types</th>\n <th class=\"px-4 py-3 font-medium\">Redirect URIs</th>\n <th class=\"px-4 py-3 font-medium\">Scopes</th>\n <th class=\"px-4 py-3 font-medium\">Status</th>\n <th class=\"px-4 py-3 font-medium\">Actions</th>\n </tr>\n </thead>\n\n <tbody>\n @if (facade.loading()) {\n <tr>\n <td colspan=\"6\" class=\"px-4 py-10 text-center text-muted-foreground\">Loading auth clients...</td>\n </tr>\n } @else if (facade.filteredItems().length === 0) {\n <tr>\n <td colspan=\"6\" class=\"px-4 py-10 text-center text-muted-foreground\">No auth clients matched your filters.</td>\n </tr>\n } @else { @for (item of facade.filteredItems(); track item.id) {\n <tr class=\"border-t border-(--rt-border-color)\">\n <td class=\"px-4 py-3\">\n <div class=\"font-medium\">{{ item.name }}</div>\n <div class=\"text-sm text-muted-foreground break-all\">{{ item.clientId }}</div>\n </td>\n <td class=\"px-4 py-3\">\n <div class=\"flex flex-wrap gap-2\">\n @for (grantType of item.grantTypes; track grantType) {\n <span class=\"rt-platform-chip\">{{ grantType }}</span>\n } @if (item.grantTypes.length === 0) {\n <span class=\"text-sm text-muted-foreground\">No grant types</span>\n }\n </div>\n </td>\n <td class=\"px-4 py-3 text-muted-foreground\">{{ item.redirectUris.length }}</td>\n <td class=\"px-4 py-3 text-muted-foreground\">{{ item.scopes.length }}</td>\n <td class=\"px-4 py-3\">\n <rolatech-platform-status-badge [status]=\"item.status || (item.enabled ? 'ENABLED' : 'DISABLED')\" />\n </td>\n <td class=\"px-4 py-3\">\n <div class=\"flex flex-wrap gap-2\">\n <button\n type=\"button\"\n class=\"inline-flex items-center rounded-xl border border-(--rt-border-color) px-3 py-2 text-sm font-medium\"\n (click)=\"openClient(item.id)\"\n >\n View\n </button>\n <button\n type=\"button\"\n class=\"inline-flex items-center rounded-xl border border-(--rt-border-color) px-3 py-2 text-sm font-medium\"\n (click)=\"editClient(item.id)\"\n >\n Edit\n </button>\n </div>\n </td>\n </tr>\n } }\n </tbody>\n </rolatech-platform-data-table>\n </section>\n</section>\n", styles: [":host{display:block}.rt-platform-chip{display:inline-flex;align-items:center;border:1px solid var(--rt-outline);border-radius:9999px;padding:.25rem .75rem;font-size:.75rem;font-weight:600;background-color:color-mix(in srgb,var(--rt-brand-color) 10%,transparent);color:var(--rt-text-primary)}\n"], dependencies: [{ kind: "component", type: PlatformPageHeader, selector: "rolatech-platform-page-header" }, { kind: "component", type: PlatformStatCard, selector: "rolatech-platform-stat-card" }, { kind: "component", type: PlatformFilterPanel, selector: "rolatech-platform-filter-panel" }, { kind: "component", type: PlatformDataTable, selector: "rolatech-platform-data-table" }, { kind: "component", type: PlatformStatusBadge, selector: "rolatech-platform-status-badge", inputs: ["status"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
88
+ }
89
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.1", ngImport: i0, type: PlatformAuthClientIndexPage, decorators: [{
90
+ type: Component,
91
+ args: [{ selector: 'rolatech-platform-auth-client-index-page', standalone: true, imports: [PlatformPageHeader, PlatformStatCard, PlatformFilterPanel, PlatformDataTable, PlatformStatusBadge], changeDetection: ChangeDetectionStrategy.OnPush, providers: [PlatformAuthClientIndexFacade], template: "<section class=\"rt-platform-theme flex flex-col gap-6 bg-(--rt-base-background) p-6 text-(--rt-text-primary)\">\n <rolatech-platform-page-header>\n <div header-left class=\"space-y-1\">\n <h1 class=\"text-2xl font-semibold tracking-tight\">Auth Clients</h1>\n <p class=\"text-sm text-muted-foreground\">Review platform clients, grant types, redirect coverage, and secret posture.</p>\n </div>\n <div header-actions>\n <button\n type=\"button\"\n class=\"inline-flex items-center rounded-xl bg-(--rt-accent) px-4 py-2 text-sm font-medium text-(--rt-accent-foreground)\"\n (click)=\"createClient()\"\n >\n Create Client\n </button>\n </div>\n </rolatech-platform-page-header>\n\n <section class=\"grid gap-4 md:grid-cols-2 xl:grid-cols-4\">\n <rolatech-platform-stat-card>\n <div stat-label>Total Clients</div>\n <div stat-value>{{ facade.total() }}</div>\n </rolatech-platform-stat-card>\n\n <rolatech-platform-stat-card>\n <div stat-label>Enabled</div>\n <div stat-value>{{ facade.enabledCount() }}</div>\n </rolatech-platform-stat-card>\n\n <rolatech-platform-stat-card>\n <div stat-label>Confidential</div>\n <div stat-value>{{ facade.confidentialCount() }}</div>\n </rolatech-platform-stat-card>\n\n <rolatech-platform-stat-card>\n <div stat-label>Redirect URIs</div>\n <div stat-value>{{ facade.redirectCount() }}</div>\n </rolatech-platform-stat-card>\n </section>\n\n <section class=\"grid gap-6 xl:grid-cols-[320px_minmax(0,1fr)]\">\n <rolatech-platform-filter-panel>\n <div filter-title>Filters</div>\n <div filter-description>Refine visible auth clients.</div>\n\n <label class=\"flex flex-col gap-2\">\n <span class=\"text-sm font-medium\">Search</span>\n <input\n type=\"text\"\n [value]=\"facade.keyword()\"\n (input)=\"onKeywordInput($event)\"\n placeholder=\"Search name, client ID, scope\"\n class=\"h-10 rounded-xl border border-(--rt-border-color) px-3 text-sm outline-none\"\n />\n </label>\n\n <label class=\"flex flex-col gap-2\">\n <span class=\"text-sm font-medium\">Status</span>\n <select class=\"h-10 rounded-xl border border-(--rt-border-color) px-3 text-sm outline-none\" (change)=\"onStatusChange($event)\">\n <option value=\"ALL\">All</option>\n <option value=\"ENABLED\">Enabled</option>\n <option value=\"DISABLED\">Disabled</option>\n </select>\n </label>\n </rolatech-platform-filter-panel>\n\n <rolatech-platform-data-table>\n <div table-toolbar class=\"flex items-center justify-between gap-3\">\n <h2 class=\"text-base font-semibold\">Client Catalog</h2>\n <div class=\"text-sm text-muted-foreground\">{{ facade.filteredItems().length }} items</div>\n </div>\n\n @if (facade.error()) {\n <p class=\"mb-4 rounded-2xl border border-rose-300/40 bg-rose-500/10 px-4 py-3 text-sm text-(--rt-text-primary)\">\n {{ facade.error() }}\n </p>\n }\n\n <thead class=\"bg-muted/40\">\n <tr class=\"text-left\">\n <th class=\"px-4 py-3 font-medium\">Client</th>\n <th class=\"px-4 py-3 font-medium\">Grant Types</th>\n <th class=\"px-4 py-3 font-medium\">Redirect URIs</th>\n <th class=\"px-4 py-3 font-medium\">Scopes</th>\n <th class=\"px-4 py-3 font-medium\">Status</th>\n <th class=\"px-4 py-3 font-medium\">Actions</th>\n </tr>\n </thead>\n\n <tbody>\n @if (facade.loading()) {\n <tr>\n <td colspan=\"6\" class=\"px-4 py-10 text-center text-muted-foreground\">Loading auth clients...</td>\n </tr>\n } @else if (facade.filteredItems().length === 0) {\n <tr>\n <td colspan=\"6\" class=\"px-4 py-10 text-center text-muted-foreground\">No auth clients matched your filters.</td>\n </tr>\n } @else { @for (item of facade.filteredItems(); track item.id) {\n <tr class=\"border-t border-(--rt-border-color)\">\n <td class=\"px-4 py-3\">\n <div class=\"font-medium\">{{ item.name }}</div>\n <div class=\"text-sm text-muted-foreground break-all\">{{ item.clientId }}</div>\n </td>\n <td class=\"px-4 py-3\">\n <div class=\"flex flex-wrap gap-2\">\n @for (grantType of item.grantTypes; track grantType) {\n <span class=\"rt-platform-chip\">{{ grantType }}</span>\n } @if (item.grantTypes.length === 0) {\n <span class=\"text-sm text-muted-foreground\">No grant types</span>\n }\n </div>\n </td>\n <td class=\"px-4 py-3 text-muted-foreground\">{{ item.redirectUris.length }}</td>\n <td class=\"px-4 py-3 text-muted-foreground\">{{ item.scopes.length }}</td>\n <td class=\"px-4 py-3\">\n <rolatech-platform-status-badge [status]=\"item.status || (item.enabled ? 'ENABLED' : 'DISABLED')\" />\n </td>\n <td class=\"px-4 py-3\">\n <div class=\"flex flex-wrap gap-2\">\n <button\n type=\"button\"\n class=\"inline-flex items-center rounded-xl border border-(--rt-border-color) px-3 py-2 text-sm font-medium\"\n (click)=\"openClient(item.id)\"\n >\n View\n </button>\n <button\n type=\"button\"\n class=\"inline-flex items-center rounded-xl border border-(--rt-border-color) px-3 py-2 text-sm font-medium\"\n (click)=\"editClient(item.id)\"\n >\n Edit\n </button>\n </div>\n </td>\n </tr>\n } }\n </tbody>\n </rolatech-platform-data-table>\n </section>\n</section>\n", styles: [":host{display:block}.rt-platform-chip{display:inline-flex;align-items:center;border:1px solid var(--rt-outline);border-radius:9999px;padding:.25rem .75rem;font-size:.75rem;font-weight:600;background-color:color-mix(in srgb,var(--rt-brand-color) 10%,transparent);color:var(--rt-text-primary)}\n"] }]
92
+ }] });
93
+
94
+ export { PlatformAuthClientIndexPage };
95
+ //# sourceMappingURL=rolatech-angular-platform-platform-auth-client-index-DilT3UzO.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rolatech-angular-platform-platform-auth-client-index-DilT3UzO.mjs","sources":["../../../../packages/angular-platform/src/lib/store/platform-auth-client-index.facade.ts","../../../../packages/angular-platform/src/lib/pages/client/platform-auth-client-index/platform-auth-client-index.ts","../../../../packages/angular-platform/src/lib/pages/client/platform-auth-client-index/platform-auth-client-index.html"],"sourcesContent":["import { Injectable, computed, inject, signal } from '@angular/core';\nimport { firstValueFrom } from 'rxjs';\nimport { PlatformAuthClientService, PlatformAuthClientSummaryResponse } from '@rolatech/angular-services';\n\n@Injectable()\nexport class PlatformAuthClientIndexFacade {\n private readonly authClientService = inject(PlatformAuthClientService);\n\n readonly loading = signal(false);\n readonly error = signal<string | null>(null);\n readonly items = signal<PlatformAuthClientSummaryResponse[]>([]);\n\n readonly keyword = signal('');\n readonly status = signal<'ALL' | 'ENABLED' | 'DISABLED'>('ALL');\n\n readonly filteredItems = computed(() => {\n const keyword = this.keyword().trim().toLowerCase();\n const status = this.status();\n\n return this.items().filter((item) => {\n const haystack = [item.name, item.clientId, item.description, ...item.grantTypes, ...item.scopes]\n .filter(Boolean)\n .join(' ')\n .toLowerCase();\n const matchesKeyword = !keyword || haystack.includes(keyword);\n const itemStatus = item.enabled ? 'ENABLED' : 'DISABLED';\n const matchesStatus = status === 'ALL' || itemStatus === status;\n return matchesKeyword && matchesStatus;\n });\n });\n\n readonly total = computed(() => this.items().length);\n readonly enabledCount = computed(() => this.items().filter((item) => item.enabled).length);\n readonly confidentialCount = computed(() => this.items().filter((item) => item.confidential).length);\n readonly redirectCount = computed(() => this.items().reduce((sum, item) => sum + item.redirectUris.length, 0));\n\n async load(): Promise<void> {\n this.loading.set(true);\n this.error.set(null);\n\n try {\n const page = await firstValueFrom(\n this.authClientService.findClients({\n limit: 100,\n sort: ['updatedAt desc'],\n }),\n );\n this.items.set(page.items ?? []);\n } catch (error) {\n console.error(error);\n this.items.set([]);\n this.error.set('Unable to load auth clients.');\n } finally {\n this.loading.set(false);\n }\n }\n\n setKeyword(value: string): void {\n this.keyword.set(value);\n }\n\n setStatus(value: 'ALL' | 'ENABLED' | 'DISABLED'): void {\n this.status.set(value);\n }\n}\n","import { ChangeDetectionStrategy, Component, OnInit, inject } from '@angular/core';\nimport { Router } from '@angular/router';\nimport { PlatformDataTable, PlatformFilterPanel, PlatformPageHeader, PlatformStatCard, PlatformStatusBadge } from '../../../shared';\nimport { PlatformAuthClientIndexFacade } from '../../../store/platform-auth-client-index.facade';\n\n@Component({\n selector: 'rolatech-platform-auth-client-index-page',\n standalone: true,\n imports: [PlatformPageHeader, PlatformStatCard, PlatformFilterPanel, PlatformDataTable, PlatformStatusBadge],\n templateUrl: './platform-auth-client-index.html',\n styleUrl: './platform-auth-client-index.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [PlatformAuthClientIndexFacade],\n})\nexport class PlatformAuthClientIndexPage implements OnInit {\n readonly facade = inject(PlatformAuthClientIndexFacade);\n private readonly router = inject(Router);\n\n ngOnInit(): void {\n void this.facade.load();\n }\n\n onKeywordInput(event: Event): void {\n this.facade.setKeyword((event.target as HTMLInputElement).value);\n }\n\n onStatusChange(event: Event): void {\n this.facade.setStatus((event.target as HTMLSelectElement).value as 'ALL' | 'ENABLED' | 'DISABLED');\n }\n\n openClient(clientId: string): void {\n void this.router.navigate(['/platform/clients', clientId]);\n }\n\n createClient(): void {\n void this.router.navigate(['/platform/clients/create']);\n }\n\n editClient(clientId: string): void {\n void this.router.navigate(['/platform/clients', clientId, 'edit']);\n }\n}\n","<section class=\"rt-platform-theme flex flex-col gap-6 bg-(--rt-base-background) p-6 text-(--rt-text-primary)\">\n <rolatech-platform-page-header>\n <div header-left class=\"space-y-1\">\n <h1 class=\"text-2xl font-semibold tracking-tight\">Auth Clients</h1>\n <p class=\"text-sm text-muted-foreground\">Review platform clients, grant types, redirect coverage, and secret posture.</p>\n </div>\n <div header-actions>\n <button\n type=\"button\"\n class=\"inline-flex items-center rounded-xl bg-(--rt-accent) px-4 py-2 text-sm font-medium text-(--rt-accent-foreground)\"\n (click)=\"createClient()\"\n >\n Create Client\n </button>\n </div>\n </rolatech-platform-page-header>\n\n <section class=\"grid gap-4 md:grid-cols-2 xl:grid-cols-4\">\n <rolatech-platform-stat-card>\n <div stat-label>Total Clients</div>\n <div stat-value>{{ facade.total() }}</div>\n </rolatech-platform-stat-card>\n\n <rolatech-platform-stat-card>\n <div stat-label>Enabled</div>\n <div stat-value>{{ facade.enabledCount() }}</div>\n </rolatech-platform-stat-card>\n\n <rolatech-platform-stat-card>\n <div stat-label>Confidential</div>\n <div stat-value>{{ facade.confidentialCount() }}</div>\n </rolatech-platform-stat-card>\n\n <rolatech-platform-stat-card>\n <div stat-label>Redirect URIs</div>\n <div stat-value>{{ facade.redirectCount() }}</div>\n </rolatech-platform-stat-card>\n </section>\n\n <section class=\"grid gap-6 xl:grid-cols-[320px_minmax(0,1fr)]\">\n <rolatech-platform-filter-panel>\n <div filter-title>Filters</div>\n <div filter-description>Refine visible auth clients.</div>\n\n <label class=\"flex flex-col gap-2\">\n <span class=\"text-sm font-medium\">Search</span>\n <input\n type=\"text\"\n [value]=\"facade.keyword()\"\n (input)=\"onKeywordInput($event)\"\n placeholder=\"Search name, client ID, scope\"\n class=\"h-10 rounded-xl border border-(--rt-border-color) px-3 text-sm outline-none\"\n />\n </label>\n\n <label class=\"flex flex-col gap-2\">\n <span class=\"text-sm font-medium\">Status</span>\n <select class=\"h-10 rounded-xl border border-(--rt-border-color) px-3 text-sm outline-none\" (change)=\"onStatusChange($event)\">\n <option value=\"ALL\">All</option>\n <option value=\"ENABLED\">Enabled</option>\n <option value=\"DISABLED\">Disabled</option>\n </select>\n </label>\n </rolatech-platform-filter-panel>\n\n <rolatech-platform-data-table>\n <div table-toolbar class=\"flex items-center justify-between gap-3\">\n <h2 class=\"text-base font-semibold\">Client Catalog</h2>\n <div class=\"text-sm text-muted-foreground\">{{ facade.filteredItems().length }} items</div>\n </div>\n\n @if (facade.error()) {\n <p class=\"mb-4 rounded-2xl border border-rose-300/40 bg-rose-500/10 px-4 py-3 text-sm text-(--rt-text-primary)\">\n {{ facade.error() }}\n </p>\n }\n\n <thead class=\"bg-muted/40\">\n <tr class=\"text-left\">\n <th class=\"px-4 py-3 font-medium\">Client</th>\n <th class=\"px-4 py-3 font-medium\">Grant Types</th>\n <th class=\"px-4 py-3 font-medium\">Redirect URIs</th>\n <th class=\"px-4 py-3 font-medium\">Scopes</th>\n <th class=\"px-4 py-3 font-medium\">Status</th>\n <th class=\"px-4 py-3 font-medium\">Actions</th>\n </tr>\n </thead>\n\n <tbody>\n @if (facade.loading()) {\n <tr>\n <td colspan=\"6\" class=\"px-4 py-10 text-center text-muted-foreground\">Loading auth clients...</td>\n </tr>\n } @else if (facade.filteredItems().length === 0) {\n <tr>\n <td colspan=\"6\" class=\"px-4 py-10 text-center text-muted-foreground\">No auth clients matched your filters.</td>\n </tr>\n } @else { @for (item of facade.filteredItems(); track item.id) {\n <tr class=\"border-t border-(--rt-border-color)\">\n <td class=\"px-4 py-3\">\n <div class=\"font-medium\">{{ item.name }}</div>\n <div class=\"text-sm text-muted-foreground break-all\">{{ item.clientId }}</div>\n </td>\n <td class=\"px-4 py-3\">\n <div class=\"flex flex-wrap gap-2\">\n @for (grantType of item.grantTypes; track grantType) {\n <span class=\"rt-platform-chip\">{{ grantType }}</span>\n } @if (item.grantTypes.length === 0) {\n <span class=\"text-sm text-muted-foreground\">No grant types</span>\n }\n </div>\n </td>\n <td class=\"px-4 py-3 text-muted-foreground\">{{ item.redirectUris.length }}</td>\n <td class=\"px-4 py-3 text-muted-foreground\">{{ item.scopes.length }}</td>\n <td class=\"px-4 py-3\">\n <rolatech-platform-status-badge [status]=\"item.status || (item.enabled ? 'ENABLED' : 'DISABLED')\" />\n </td>\n <td class=\"px-4 py-3\">\n <div class=\"flex flex-wrap gap-2\">\n <button\n type=\"button\"\n class=\"inline-flex items-center rounded-xl border border-(--rt-border-color) px-3 py-2 text-sm font-medium\"\n (click)=\"openClient(item.id)\"\n >\n View\n </button>\n <button\n type=\"button\"\n class=\"inline-flex items-center rounded-xl border border-(--rt-border-color) px-3 py-2 text-sm font-medium\"\n (click)=\"editClient(item.id)\"\n >\n Edit\n </button>\n </div>\n </td>\n </tr>\n } }\n </tbody>\n </rolatech-platform-data-table>\n </section>\n</section>\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ const PLATFORM_AUTH_CLIENT_ROUTES = [
2
+ {
3
+ path: '',
4
+ loadComponent: () => import('./rolatech-angular-platform-platform-auth-client-index-DilT3UzO.mjs').then((m) => m.PlatformAuthClientIndexPage),
5
+ },
6
+ {
7
+ path: 'create',
8
+ loadComponent: () => import('./rolatech-angular-platform-platform-auth-client-editor-75GPRUsF.mjs').then((m) => m.PlatformAuthClientEditorPage),
9
+ },
10
+ {
11
+ path: ':clientId/edit',
12
+ loadComponent: () => import('./rolatech-angular-platform-platform-auth-client-editor-75GPRUsF.mjs').then((m) => m.PlatformAuthClientEditorPage),
13
+ },
14
+ {
15
+ path: ':clientId',
16
+ loadComponent: () => import('./rolatech-angular-platform-platform-auth-client-detail-BMvM7PvP.mjs').then((m) => m.PlatformAuthClientDetailPage),
17
+ },
18
+ ];
19
+
20
+ export { PLATFORM_AUTH_CLIENT_ROUTES };
21
+ //# sourceMappingURL=rolatech-angular-platform-platform-auth-client.routes-D_VFpAgu.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rolatech-angular-platform-platform-auth-client.routes-D_VFpAgu.mjs","sources":["../../../../packages/angular-platform/src/lib/pages/client/platform-auth-client.routes.ts"],"sourcesContent":["import { Routes } from '@angular/router';\n\nexport const PLATFORM_AUTH_CLIENT_ROUTES: Routes = [\n {\n path: '',\n loadComponent: () => import('./platform-auth-client-index/platform-auth-client-index').then((m) => m.PlatformAuthClientIndexPage),\n },\n {\n path: 'create',\n loadComponent: () => import('./platform-auth-client-editor/platform-auth-client-editor').then((m) => m.PlatformAuthClientEditorPage),\n },\n {\n path: ':clientId/edit',\n loadComponent: () => import('./platform-auth-client-editor/platform-auth-client-editor').then((m) => m.PlatformAuthClientEditorPage),\n },\n {\n path: ':clientId',\n loadComponent: () => import('./platform-auth-client-detail/platform-auth-client-detail').then((m) => m.PlatformAuthClientDetailPage),\n },\n];\n"],"names":[],"mappings":"AAEO,MAAM,2BAA2B,GAAW;AACjD,IAAA;AACE,QAAA,IAAI,EAAE,EAAE;AACR,QAAA,aAAa,EAAE,MAAM,OAAO,qEAAyD,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,2BAA2B,CAAC;AAClI,KAAA;AACD,IAAA;AACE,QAAA,IAAI,EAAE,QAAQ;AACd,QAAA,aAAa,EAAE,MAAM,OAAO,sEAA2D,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,4BAA4B,CAAC;AACrI,KAAA;AACD,IAAA;AACE,QAAA,IAAI,EAAE,gBAAgB;AACtB,QAAA,aAAa,EAAE,MAAM,OAAO,sEAA2D,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,4BAA4B,CAAC;AACrI,KAAA;AACD,IAAA;AACE,QAAA,IAAI,EAAE,WAAW;AACjB,QAAA,aAAa,EAAE,MAAM,OAAO,sEAA2D,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,4BAA4B,CAAC;AACrI,KAAA;;;;;"}
@@ -0,0 +1,57 @@
1
+ import { KeyValuePipe, JsonPipe } from '@angular/common';
2
+ import * as i0 from '@angular/core';
3
+ import { inject, signal, Injectable, ChangeDetectionStrategy, Component } from '@angular/core';
4
+ import { ActivatedRoute, RouterLink } from '@angular/router';
5
+ import { PlatformPageHeader, PlatformStatCard, PlatformDetailPanel, PlatformStatusBadge } from './rolatech-angular-platform.mjs';
6
+ import { firstValueFrom } from 'rxjs';
7
+ import { PlatformEndpointService } from '@rolatech/angular-services';
8
+
9
+ class PlatformEndpointDetailFacade {
10
+ endpointService = inject(PlatformEndpointService);
11
+ loading = signal(false, ...(ngDevMode ? [{ debugName: "loading" }] : []));
12
+ error = signal(null, ...(ngDevMode ? [{ debugName: "error" }] : []));
13
+ item = signal(null, ...(ngDevMode ? [{ debugName: "item" }] : []));
14
+ async load(endpointId) {
15
+ this.loading.set(true);
16
+ this.error.set(null);
17
+ try {
18
+ this.item.set(await firstValueFrom(this.endpointService.findEndpointById(endpointId)));
19
+ }
20
+ catch (error) {
21
+ console.error(error);
22
+ this.item.set(null);
23
+ this.error.set('Unable to load endpoint details.');
24
+ }
25
+ finally {
26
+ this.loading.set(false);
27
+ }
28
+ }
29
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.1", ngImport: i0, type: PlatformEndpointDetailFacade, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
30
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.1", ngImport: i0, type: PlatformEndpointDetailFacade });
31
+ }
32
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.1", ngImport: i0, type: PlatformEndpointDetailFacade, decorators: [{
33
+ type: Injectable
34
+ }] });
35
+
36
+ class PlatformEndpointDetailPage {
37
+ facade = inject(PlatformEndpointDetailFacade);
38
+ route = inject(ActivatedRoute);
39
+ endpointId = this.route.snapshot.paramMap.get('endpointId') ?? '';
40
+ ngOnInit() {
41
+ if (this.endpointId) {
42
+ void this.facade.load(this.endpointId);
43
+ }
44
+ }
45
+ routeLabel(method, path) {
46
+ return [method, path].filter(Boolean).join(' ') || '—';
47
+ }
48
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.1", ngImport: i0, type: PlatformEndpointDetailPage, deps: [], target: i0.ɵɵFactoryTarget.Component });
49
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.1", type: PlatformEndpointDetailPage, isStandalone: true, selector: "rolatech-platform-endpoint-detail-page", providers: [PlatformEndpointDetailFacade], ngImport: i0, template: "<section class=\"rt-platform-theme flex flex-col gap-6 bg-(--rt-base-background) p-6 text-(--rt-text-primary)\">\n @if (facade.loading()) {\n <section class=\"rounded-2xl border border-(--rt-border-color) bg-card p-10 text-center text-muted-foreground shadow-sm\">Loading endpoint...</section>\n } @else if (facade.item(); as item) {\n <rolatech-platform-page-header>\n <div header-left class=\"space-y-2\">\n <div class=\"flex items-center gap-2 text-sm text-muted-foreground\">\n <a routerLink=\"../\" class=\"hover:underline cursor-pointer\">Endpoints</a>\n <span>/</span>\n <span>{{ item.name }}</span>\n </div>\n\n <div>\n <h1 class=\"text-2xl font-semibold tracking-tight\">{{ item.name }}</h1>\n <div class=\"mt-1 text-sm text-muted-foreground\">{{ item.code || item.id }}</div>\n </div>\n\n @if (item.description) {\n <p class=\"max-w-3xl text-sm text-muted-foreground\">{{ item.description }}</p>\n }\n\n <div class=\"flex flex-wrap gap-2\">\n <rolatech-platform-status-badge [status]=\"item.status || (item.enabled ? 'ENABLED' : 'DISABLED')\" />\n <span class=\"rt-platform-chip\">{{ item.authType || 'DEFAULT' }}</span>\n <span class=\"rt-platform-chip\">{{ item.publicAccess ? 'Public' : 'Protected' }}</span>\n </div>\n </div>\n </rolatech-platform-page-header>\n\n <section class=\"grid gap-4 md:grid-cols-2 xl:grid-cols-4\">\n <rolatech-platform-stat-card>\n <div stat-label>Permissions</div>\n <div stat-value>{{ item.permissionCount }}</div>\n </rolatech-platform-stat-card>\n\n <rolatech-platform-stat-card>\n <div stat-label>Scopes</div>\n <div stat-value>{{ item.scopes.length }}</div>\n </rolatech-platform-stat-card>\n\n <rolatech-platform-stat-card>\n <div stat-label>Roles</div>\n <div stat-value>{{ item.roles.length }}</div>\n </rolatech-platform-stat-card>\n\n <rolatech-platform-stat-card>\n <div stat-label>Updated</div>\n <div stat-value class=\"text-sm\">{{ item.updatedAt || '\u2014' }}</div>\n </rolatech-platform-stat-card>\n </section>\n\n <section class=\"grid gap-6 xl:grid-cols-2\">\n <rolatech-platform-detail-panel>\n <div panel-title>Endpoint Details</div>\n <div panel-description>Primary route and service metadata.</div>\n\n <div class=\"grid gap-4 md:grid-cols-2\">\n <div>\n <div class=\"text-xs text-muted-foreground\">Route</div>\n <div class=\"font-medium\">{{ routeLabel(item.method, item.path) }}</div>\n </div>\n <div>\n <div class=\"text-xs text-muted-foreground\">Service</div>\n <div class=\"font-medium\">{{ item.serviceName || '\u2014' }}</div>\n </div>\n <div>\n <div class=\"text-xs text-muted-foreground\">Resource</div>\n <div class=\"font-medium\">{{ item.resource || '\u2014' }}</div>\n </div>\n <div>\n <div class=\"text-xs text-muted-foreground\">URI</div>\n <div class=\"font-medium break-all\">{{ item.uri || item.path || '\u2014' }}</div>\n </div>\n </div>\n </rolatech-platform-detail-panel>\n\n <rolatech-platform-detail-panel>\n <div panel-title>Access Coverage</div>\n <div panel-description>Derived access metadata returned by the backend.</div>\n\n <div class=\"space-y-4\">\n <div>\n <div class=\"text-xs text-muted-foreground\">Scopes</div>\n <div class=\"mt-2 flex flex-wrap gap-2\">\n @for (scope of item.scopes; track scope) {\n <span class=\"rt-platform-chip\">{{ scope }}</span>\n } @if (item.scopes.length === 0) {\n <span class=\"text-sm text-muted-foreground\">No scopes returned.</span>\n }\n </div>\n </div>\n\n <div>\n <div class=\"text-xs text-muted-foreground\">Roles</div>\n <div class=\"mt-2 flex flex-wrap gap-2\">\n @for (role of item.roles; track role) {\n <span class=\"rt-platform-chip\">{{ role }}</span>\n } @if (item.roles.length === 0) {\n <span class=\"text-sm text-muted-foreground\">No role constraints returned.</span>\n }\n </div>\n </div>\n </div>\n </rolatech-platform-detail-panel>\n </section>\n\n <rolatech-platform-detail-panel>\n <div panel-title>Additional Attributes</div>\n <div panel-description>Unmapped backend fields are surfaced here so platform admins can inspect raw metadata.</div>\n\n @if (item.attributes && (item.attributes | keyvalue).length > 0) {\n <div class=\"grid gap-4 md:grid-cols-2\">\n @for (entry of item.attributes | keyvalue; track entry.key) {\n <div class=\"rounded-2xl border border-(--rt-border-color) p-4\">\n <div class=\"text-xs text-muted-foreground\">{{ entry.key }}</div>\n <div class=\"mt-2 break-all text-sm font-medium\">{{ entry.value | json }}</div>\n </div>\n }\n </div>\n } @else {\n <div class=\"rounded-2xl border border-(--rt-border-color) border-dashed p-4 text-sm text-muted-foreground\">No additional endpoint metadata was returned.</div>\n }\n </rolatech-platform-detail-panel>\n } @else {\n <section class=\"rounded-2xl border border-(--rt-border-color) bg-card p-10 text-center text-muted-foreground shadow-sm\">Endpoint not found.</section>\n }\n</section>\n", styles: [":host{display:block}.rt-platform-chip{display:inline-flex;align-items:center;border:1px solid var(--rt-outline);border-radius:9999px;padding:.25rem .75rem;font-size:.75rem;font-weight:600;background-color:color-mix(in srgb,var(--rt-brand-color) 10%,transparent);color:var(--rt-text-primary)}\n"], dependencies: [{ kind: "directive", type: RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "component", type: PlatformPageHeader, selector: "rolatech-platform-page-header" }, { kind: "component", type: PlatformStatCard, selector: "rolatech-platform-stat-card" }, { kind: "component", type: PlatformDetailPanel, selector: "rolatech-platform-detail-panel" }, { kind: "component", type: PlatformStatusBadge, selector: "rolatech-platform-status-badge", inputs: ["status"] }, { kind: "pipe", type: KeyValuePipe, name: "keyvalue" }, { kind: "pipe", type: JsonPipe, name: "json" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
50
+ }
51
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.1", ngImport: i0, type: PlatformEndpointDetailPage, decorators: [{
52
+ type: Component,
53
+ args: [{ selector: 'rolatech-platform-endpoint-detail-page', standalone: true, imports: [RouterLink, KeyValuePipe, JsonPipe, PlatformPageHeader, PlatformStatCard, PlatformDetailPanel, PlatformStatusBadge], changeDetection: ChangeDetectionStrategy.OnPush, providers: [PlatformEndpointDetailFacade], template: "<section class=\"rt-platform-theme flex flex-col gap-6 bg-(--rt-base-background) p-6 text-(--rt-text-primary)\">\n @if (facade.loading()) {\n <section class=\"rounded-2xl border border-(--rt-border-color) bg-card p-10 text-center text-muted-foreground shadow-sm\">Loading endpoint...</section>\n } @else if (facade.item(); as item) {\n <rolatech-platform-page-header>\n <div header-left class=\"space-y-2\">\n <div class=\"flex items-center gap-2 text-sm text-muted-foreground\">\n <a routerLink=\"../\" class=\"hover:underline cursor-pointer\">Endpoints</a>\n <span>/</span>\n <span>{{ item.name }}</span>\n </div>\n\n <div>\n <h1 class=\"text-2xl font-semibold tracking-tight\">{{ item.name }}</h1>\n <div class=\"mt-1 text-sm text-muted-foreground\">{{ item.code || item.id }}</div>\n </div>\n\n @if (item.description) {\n <p class=\"max-w-3xl text-sm text-muted-foreground\">{{ item.description }}</p>\n }\n\n <div class=\"flex flex-wrap gap-2\">\n <rolatech-platform-status-badge [status]=\"item.status || (item.enabled ? 'ENABLED' : 'DISABLED')\" />\n <span class=\"rt-platform-chip\">{{ item.authType || 'DEFAULT' }}</span>\n <span class=\"rt-platform-chip\">{{ item.publicAccess ? 'Public' : 'Protected' }}</span>\n </div>\n </div>\n </rolatech-platform-page-header>\n\n <section class=\"grid gap-4 md:grid-cols-2 xl:grid-cols-4\">\n <rolatech-platform-stat-card>\n <div stat-label>Permissions</div>\n <div stat-value>{{ item.permissionCount }}</div>\n </rolatech-platform-stat-card>\n\n <rolatech-platform-stat-card>\n <div stat-label>Scopes</div>\n <div stat-value>{{ item.scopes.length }}</div>\n </rolatech-platform-stat-card>\n\n <rolatech-platform-stat-card>\n <div stat-label>Roles</div>\n <div stat-value>{{ item.roles.length }}</div>\n </rolatech-platform-stat-card>\n\n <rolatech-platform-stat-card>\n <div stat-label>Updated</div>\n <div stat-value class=\"text-sm\">{{ item.updatedAt || '\u2014' }}</div>\n </rolatech-platform-stat-card>\n </section>\n\n <section class=\"grid gap-6 xl:grid-cols-2\">\n <rolatech-platform-detail-panel>\n <div panel-title>Endpoint Details</div>\n <div panel-description>Primary route and service metadata.</div>\n\n <div class=\"grid gap-4 md:grid-cols-2\">\n <div>\n <div class=\"text-xs text-muted-foreground\">Route</div>\n <div class=\"font-medium\">{{ routeLabel(item.method, item.path) }}</div>\n </div>\n <div>\n <div class=\"text-xs text-muted-foreground\">Service</div>\n <div class=\"font-medium\">{{ item.serviceName || '\u2014' }}</div>\n </div>\n <div>\n <div class=\"text-xs text-muted-foreground\">Resource</div>\n <div class=\"font-medium\">{{ item.resource || '\u2014' }}</div>\n </div>\n <div>\n <div class=\"text-xs text-muted-foreground\">URI</div>\n <div class=\"font-medium break-all\">{{ item.uri || item.path || '\u2014' }}</div>\n </div>\n </div>\n </rolatech-platform-detail-panel>\n\n <rolatech-platform-detail-panel>\n <div panel-title>Access Coverage</div>\n <div panel-description>Derived access metadata returned by the backend.</div>\n\n <div class=\"space-y-4\">\n <div>\n <div class=\"text-xs text-muted-foreground\">Scopes</div>\n <div class=\"mt-2 flex flex-wrap gap-2\">\n @for (scope of item.scopes; track scope) {\n <span class=\"rt-platform-chip\">{{ scope }}</span>\n } @if (item.scopes.length === 0) {\n <span class=\"text-sm text-muted-foreground\">No scopes returned.</span>\n }\n </div>\n </div>\n\n <div>\n <div class=\"text-xs text-muted-foreground\">Roles</div>\n <div class=\"mt-2 flex flex-wrap gap-2\">\n @for (role of item.roles; track role) {\n <span class=\"rt-platform-chip\">{{ role }}</span>\n } @if (item.roles.length === 0) {\n <span class=\"text-sm text-muted-foreground\">No role constraints returned.</span>\n }\n </div>\n </div>\n </div>\n </rolatech-platform-detail-panel>\n </section>\n\n <rolatech-platform-detail-panel>\n <div panel-title>Additional Attributes</div>\n <div panel-description>Unmapped backend fields are surfaced here so platform admins can inspect raw metadata.</div>\n\n @if (item.attributes && (item.attributes | keyvalue).length > 0) {\n <div class=\"grid gap-4 md:grid-cols-2\">\n @for (entry of item.attributes | keyvalue; track entry.key) {\n <div class=\"rounded-2xl border border-(--rt-border-color) p-4\">\n <div class=\"text-xs text-muted-foreground\">{{ entry.key }}</div>\n <div class=\"mt-2 break-all text-sm font-medium\">{{ entry.value | json }}</div>\n </div>\n }\n </div>\n } @else {\n <div class=\"rounded-2xl border border-(--rt-border-color) border-dashed p-4 text-sm text-muted-foreground\">No additional endpoint metadata was returned.</div>\n }\n </rolatech-platform-detail-panel>\n } @else {\n <section class=\"rounded-2xl border border-(--rt-border-color) bg-card p-10 text-center text-muted-foreground shadow-sm\">Endpoint not found.</section>\n }\n</section>\n", styles: [":host{display:block}.rt-platform-chip{display:inline-flex;align-items:center;border:1px solid var(--rt-outline);border-radius:9999px;padding:.25rem .75rem;font-size:.75rem;font-weight:600;background-color:color-mix(in srgb,var(--rt-brand-color) 10%,transparent);color:var(--rt-text-primary)}\n"] }]
54
+ }] });
55
+
56
+ export { PlatformEndpointDetailPage };
57
+ //# sourceMappingURL=rolatech-angular-platform-platform-endpoint-detail-CEaO9MFQ.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rolatech-angular-platform-platform-endpoint-detail-CEaO9MFQ.mjs","sources":["../../../../packages/angular-platform/src/lib/store/platform-endpoint-detail.facade.ts","../../../../packages/angular-platform/src/lib/pages/endpoint/platform-endpoint-detail/platform-endpoint-detail.ts","../../../../packages/angular-platform/src/lib/pages/endpoint/platform-endpoint-detail/platform-endpoint-detail.html"],"sourcesContent":["import { Injectable, inject, signal } from '@angular/core';\nimport { firstValueFrom } from 'rxjs';\nimport { PlatformEndpointDetailResponse, PlatformEndpointService } from '@rolatech/angular-services';\n\n@Injectable()\nexport class PlatformEndpointDetailFacade {\n private readonly endpointService = inject(PlatformEndpointService);\n\n readonly loading = signal(false);\n readonly error = signal<string | null>(null);\n readonly item = signal<PlatformEndpointDetailResponse | null>(null);\n\n async load(endpointId: string): Promise<void> {\n this.loading.set(true);\n this.error.set(null);\n\n try {\n this.item.set(await firstValueFrom(this.endpointService.findEndpointById(endpointId)));\n } catch (error) {\n console.error(error);\n this.item.set(null);\n this.error.set('Unable to load endpoint details.');\n } finally {\n this.loading.set(false);\n }\n }\n}\n","import { JsonPipe, KeyValuePipe } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, OnInit, inject } from '@angular/core';\nimport { ActivatedRoute, RouterLink } from '@angular/router';\nimport { PlatformDetailPanel, PlatformPageHeader, PlatformStatCard, PlatformStatusBadge } from '../../../shared';\nimport { PlatformEndpointDetailFacade } from '../../../store/platform-endpoint-detail.facade';\n\n@Component({\n selector: 'rolatech-platform-endpoint-detail-page',\n standalone: true,\n imports: [RouterLink, KeyValuePipe, JsonPipe, PlatformPageHeader, PlatformStatCard, PlatformDetailPanel, PlatformStatusBadge],\n templateUrl: './platform-endpoint-detail.html',\n styleUrl: './platform-endpoint-detail.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [PlatformEndpointDetailFacade],\n})\nexport class PlatformEndpointDetailPage implements OnInit {\n readonly facade = inject(PlatformEndpointDetailFacade);\n private readonly route = inject(ActivatedRoute);\n\n readonly endpointId = this.route.snapshot.paramMap.get('endpointId') ?? '';\n\n ngOnInit(): void {\n if (this.endpointId) {\n void this.facade.load(this.endpointId);\n }\n }\n\n routeLabel(method: string | null | undefined, path: string | null | undefined): string {\n return [method, path].filter(Boolean).join(' ') || '—';\n }\n}\n","<section class=\"rt-platform-theme flex flex-col gap-6 bg-(--rt-base-background) p-6 text-(--rt-text-primary)\">\n @if (facade.loading()) {\n <section class=\"rounded-2xl border border-(--rt-border-color) bg-card p-10 text-center text-muted-foreground shadow-sm\">Loading endpoint...</section>\n } @else if (facade.item(); as item) {\n <rolatech-platform-page-header>\n <div header-left class=\"space-y-2\">\n <div class=\"flex items-center gap-2 text-sm text-muted-foreground\">\n <a routerLink=\"../\" class=\"hover:underline cursor-pointer\">Endpoints</a>\n <span>/</span>\n <span>{{ item.name }}</span>\n </div>\n\n <div>\n <h1 class=\"text-2xl font-semibold tracking-tight\">{{ item.name }}</h1>\n <div class=\"mt-1 text-sm text-muted-foreground\">{{ item.code || item.id }}</div>\n </div>\n\n @if (item.description) {\n <p class=\"max-w-3xl text-sm text-muted-foreground\">{{ item.description }}</p>\n }\n\n <div class=\"flex flex-wrap gap-2\">\n <rolatech-platform-status-badge [status]=\"item.status || (item.enabled ? 'ENABLED' : 'DISABLED')\" />\n <span class=\"rt-platform-chip\">{{ item.authType || 'DEFAULT' }}</span>\n <span class=\"rt-platform-chip\">{{ item.publicAccess ? 'Public' : 'Protected' }}</span>\n </div>\n </div>\n </rolatech-platform-page-header>\n\n <section class=\"grid gap-4 md:grid-cols-2 xl:grid-cols-4\">\n <rolatech-platform-stat-card>\n <div stat-label>Permissions</div>\n <div stat-value>{{ item.permissionCount }}</div>\n </rolatech-platform-stat-card>\n\n <rolatech-platform-stat-card>\n <div stat-label>Scopes</div>\n <div stat-value>{{ item.scopes.length }}</div>\n </rolatech-platform-stat-card>\n\n <rolatech-platform-stat-card>\n <div stat-label>Roles</div>\n <div stat-value>{{ item.roles.length }}</div>\n </rolatech-platform-stat-card>\n\n <rolatech-platform-stat-card>\n <div stat-label>Updated</div>\n <div stat-value class=\"text-sm\">{{ item.updatedAt || '—' }}</div>\n </rolatech-platform-stat-card>\n </section>\n\n <section class=\"grid gap-6 xl:grid-cols-2\">\n <rolatech-platform-detail-panel>\n <div panel-title>Endpoint Details</div>\n <div panel-description>Primary route and service metadata.</div>\n\n <div class=\"grid gap-4 md:grid-cols-2\">\n <div>\n <div class=\"text-xs text-muted-foreground\">Route</div>\n <div class=\"font-medium\">{{ routeLabel(item.method, item.path) }}</div>\n </div>\n <div>\n <div class=\"text-xs text-muted-foreground\">Service</div>\n <div class=\"font-medium\">{{ item.serviceName || '—' }}</div>\n </div>\n <div>\n <div class=\"text-xs text-muted-foreground\">Resource</div>\n <div class=\"font-medium\">{{ item.resource || '—' }}</div>\n </div>\n <div>\n <div class=\"text-xs text-muted-foreground\">URI</div>\n <div class=\"font-medium break-all\">{{ item.uri || item.path || '—' }}</div>\n </div>\n </div>\n </rolatech-platform-detail-panel>\n\n <rolatech-platform-detail-panel>\n <div panel-title>Access Coverage</div>\n <div panel-description>Derived access metadata returned by the backend.</div>\n\n <div class=\"space-y-4\">\n <div>\n <div class=\"text-xs text-muted-foreground\">Scopes</div>\n <div class=\"mt-2 flex flex-wrap gap-2\">\n @for (scope of item.scopes; track scope) {\n <span class=\"rt-platform-chip\">{{ scope }}</span>\n } @if (item.scopes.length === 0) {\n <span class=\"text-sm text-muted-foreground\">No scopes returned.</span>\n }\n </div>\n </div>\n\n <div>\n <div class=\"text-xs text-muted-foreground\">Roles</div>\n <div class=\"mt-2 flex flex-wrap gap-2\">\n @for (role of item.roles; track role) {\n <span class=\"rt-platform-chip\">{{ role }}</span>\n } @if (item.roles.length === 0) {\n <span class=\"text-sm text-muted-foreground\">No role constraints returned.</span>\n }\n </div>\n </div>\n </div>\n </rolatech-platform-detail-panel>\n </section>\n\n <rolatech-platform-detail-panel>\n <div panel-title>Additional Attributes</div>\n <div panel-description>Unmapped backend fields are surfaced here so platform admins can inspect raw metadata.</div>\n\n @if (item.attributes && (item.attributes | keyvalue).length > 0) {\n <div class=\"grid gap-4 md:grid-cols-2\">\n @for (entry of item.attributes | keyvalue; track entry.key) {\n <div class=\"rounded-2xl border border-(--rt-border-color) p-4\">\n <div class=\"text-xs text-muted-foreground\">{{ entry.key }}</div>\n <div class=\"mt-2 break-all text-sm font-medium\">{{ entry.value | json }}</div>\n </div>\n }\n </div>\n } @else {\n <div class=\"rounded-2xl border border-(--rt-border-color) border-dashed p-4 text-sm text-muted-foreground\">No additional endpoint metadata was returned.</div>\n }\n </rolatech-platform-detail-panel>\n } @else {\n <section class=\"rounded-2xl border border-(--rt-border-color) bg-card p-10 text-center text-muted-foreground shadow-sm\">Endpoint not found.</section>\n }\n</section>\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,92 @@
1
+ import * as i0 from '@angular/core';
2
+ import { inject, signal, computed, Injectable, ChangeDetectionStrategy, Component } from '@angular/core';
3
+ import { Router } from '@angular/router';
4
+ import { PlatformPageHeader, PlatformStatCard, PlatformFilterPanel, PlatformDataTable, PlatformStatusBadge } from './rolatech-angular-platform.mjs';
5
+ import { firstValueFrom } from 'rxjs';
6
+ import { PlatformEndpointService } from '@rolatech/angular-services';
7
+
8
+ class PlatformEndpointIndexFacade {
9
+ endpointService = inject(PlatformEndpointService);
10
+ loading = signal(false, ...(ngDevMode ? [{ debugName: "loading" }] : []));
11
+ error = signal(null, ...(ngDevMode ? [{ debugName: "error" }] : []));
12
+ items = signal([], ...(ngDevMode ? [{ debugName: "items" }] : []));
13
+ keyword = signal('', ...(ngDevMode ? [{ debugName: "keyword" }] : []));
14
+ status = signal('ALL', ...(ngDevMode ? [{ debugName: "status" }] : []));
15
+ filteredItems = computed(() => {
16
+ const keyword = this.keyword().trim().toLowerCase();
17
+ const status = this.status();
18
+ return this.items().filter((item) => {
19
+ const haystack = [item.name, item.code, item.resource, item.path, item.method, item.serviceName, item.authType]
20
+ .filter(Boolean)
21
+ .join(' ')
22
+ .toLowerCase();
23
+ const matchesKeyword = !keyword || haystack.includes(keyword);
24
+ const endpointStatus = item.enabled ? 'ENABLED' : 'DISABLED';
25
+ const matchesStatus = status === 'ALL' || endpointStatus === status;
26
+ return matchesKeyword && matchesStatus;
27
+ });
28
+ }, ...(ngDevMode ? [{ debugName: "filteredItems" }] : []));
29
+ total = computed(() => this.items().length, ...(ngDevMode ? [{ debugName: "total" }] : []));
30
+ enabledCount = computed(() => this.items().filter((item) => item.enabled).length, ...(ngDevMode ? [{ debugName: "enabledCount" }] : []));
31
+ publicCount = computed(() => this.items().filter((item) => item.publicAccess).length, ...(ngDevMode ? [{ debugName: "publicCount" }] : []));
32
+ protectedCount = computed(() => this.items().filter((item) => !item.publicAccess).length, ...(ngDevMode ? [{ debugName: "protectedCount" }] : []));
33
+ async load() {
34
+ this.loading.set(true);
35
+ this.error.set(null);
36
+ try {
37
+ const page = await firstValueFrom(this.endpointService.findEndpoints({
38
+ limit: 100,
39
+ sort: ['updatedAt desc'],
40
+ }));
41
+ this.items.set(page.items ?? []);
42
+ }
43
+ catch (error) {
44
+ console.error(error);
45
+ this.items.set([]);
46
+ this.error.set('Unable to load platform endpoints.');
47
+ }
48
+ finally {
49
+ this.loading.set(false);
50
+ }
51
+ }
52
+ setKeyword(value) {
53
+ this.keyword.set(value);
54
+ }
55
+ setStatus(value) {
56
+ this.status.set(value);
57
+ }
58
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.1", ngImport: i0, type: PlatformEndpointIndexFacade, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
59
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.1", ngImport: i0, type: PlatformEndpointIndexFacade });
60
+ }
61
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.1", ngImport: i0, type: PlatformEndpointIndexFacade, decorators: [{
62
+ type: Injectable
63
+ }] });
64
+
65
+ class PlatformEndpointIndexPage {
66
+ facade = inject(PlatformEndpointIndexFacade);
67
+ router = inject(Router);
68
+ ngOnInit() {
69
+ void this.facade.load();
70
+ }
71
+ onKeywordInput(event) {
72
+ this.facade.setKeyword(event.target.value);
73
+ }
74
+ onStatusChange(event) {
75
+ this.facade.setStatus(event.target.value);
76
+ }
77
+ openEndpoint(endpointId) {
78
+ void this.router.navigate(['/platform/endpoints', endpointId]);
79
+ }
80
+ routeLabel(method, path) {
81
+ return [method, path].filter(Boolean).join(' ') || '—';
82
+ }
83
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.1", ngImport: i0, type: PlatformEndpointIndexPage, deps: [], target: i0.ɵɵFactoryTarget.Component });
84
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.1", type: PlatformEndpointIndexPage, isStandalone: true, selector: "rolatech-platform-endpoint-index-page", providers: [PlatformEndpointIndexFacade], ngImport: i0, template: "<section class=\"rt-platform-theme flex flex-col gap-6 bg-(--rt-base-background) p-6 text-(--rt-text-primary)\">\n <rolatech-platform-page-header>\n <div header-left class=\"space-y-1\">\n <h1 class=\"text-2xl font-semibold tracking-tight\">Platform Endpoints</h1>\n <p class=\"text-sm text-muted-foreground\">Audit registered platform endpoints, auth mode, and permission coverage.</p>\n </div>\n </rolatech-platform-page-header>\n\n <section class=\"grid gap-4 md:grid-cols-2 xl:grid-cols-4\">\n <rolatech-platform-stat-card>\n <div stat-label>Total Endpoints</div>\n <div stat-value>{{ facade.total() }}</div>\n </rolatech-platform-stat-card>\n\n <rolatech-platform-stat-card>\n <div stat-label>Enabled</div>\n <div stat-value>{{ facade.enabledCount() }}</div>\n </rolatech-platform-stat-card>\n\n <rolatech-platform-stat-card>\n <div stat-label>Public</div>\n <div stat-value>{{ facade.publicCount() }}</div>\n </rolatech-platform-stat-card>\n\n <rolatech-platform-stat-card>\n <div stat-label>Protected</div>\n <div stat-value>{{ facade.protectedCount() }}</div>\n </rolatech-platform-stat-card>\n </section>\n\n <section class=\"grid gap-6 xl:grid-cols-[320px_minmax(0,1fr)]\">\n <rolatech-platform-filter-panel>\n <div filter-title>Filters</div>\n <div filter-description>Refine visible endpoints.</div>\n\n <label class=\"flex flex-col gap-2\">\n <span class=\"text-sm font-medium\">Search</span>\n <input\n type=\"text\"\n [value]=\"facade.keyword()\"\n (input)=\"onKeywordInput($event)\"\n placeholder=\"Search route, service, auth type\"\n class=\"h-10 rounded-xl border border-(--rt-border-color) px-3 text-sm outline-none\"\n />\n </label>\n\n <label class=\"flex flex-col gap-2\">\n <span class=\"text-sm font-medium\">Status</span>\n <select class=\"h-10 rounded-xl border border-(--rt-border-color) px-3 text-sm outline-none\" (change)=\"onStatusChange($event)\">\n <option value=\"ALL\">All</option>\n <option value=\"ENABLED\">Enabled</option>\n <option value=\"DISABLED\">Disabled</option>\n </select>\n </label>\n </rolatech-platform-filter-panel>\n\n <rolatech-platform-data-table>\n <div table-toolbar class=\"flex items-center justify-between gap-3\">\n <h2 class=\"text-base font-semibold\">Endpoint Catalog</h2>\n <div class=\"text-sm text-muted-foreground\">{{ facade.filteredItems().length }} items</div>\n </div>\n\n @if (facade.error()) {\n <p class=\"mb-4 rounded-2xl border border-rose-300/40 bg-rose-500/10 px-4 py-3 text-sm text-(--rt-text-primary)\">\n {{ facade.error() }}\n </p>\n }\n\n <thead class=\"bg-muted/40\">\n <tr class=\"text-left\">\n <th class=\"px-4 py-3 font-medium\">Endpoint</th>\n <th class=\"px-4 py-3 font-medium\">Route</th>\n <th class=\"px-4 py-3 font-medium\">Service</th>\n <th class=\"px-4 py-3 font-medium\">Auth</th>\n <th class=\"px-4 py-3 font-medium\">Permissions</th>\n <th class=\"px-4 py-3 font-medium\">Status</th>\n <th class=\"px-4 py-3 font-medium\">Actions</th>\n </tr>\n </thead>\n\n <tbody>\n @if (facade.loading()) {\n <tr>\n <td colspan=\"7\" class=\"px-4 py-10 text-center text-muted-foreground\">Loading endpoints...</td>\n </tr>\n } @else if (facade.filteredItems().length === 0) {\n <tr>\n <td colspan=\"7\" class=\"px-4 py-10 text-center text-muted-foreground\">No endpoints matched your filters.</td>\n </tr>\n } @else { @for (item of facade.filteredItems(); track item.id) {\n <tr class=\"border-t border-(--rt-border-color)\">\n <td class=\"px-4 py-3\">\n <div class=\"font-medium\">{{ item.name }}</div>\n <div class=\"text-sm text-muted-foreground\">{{ item.code || item.id }}</div>\n </td>\n <td class=\"px-4 py-3\">\n <div class=\"font-medium\">{{ routeLabel(item.method, item.path) }}</div>\n <div class=\"text-sm text-muted-foreground\">{{ item.resource || '\u2014' }}</div>\n </td>\n <td class=\"px-4 py-3 text-muted-foreground\">{{ item.serviceName || '\u2014' }}</td>\n <td class=\"px-4 py-3\">\n <div class=\"font-medium\">{{ item.authType || 'DEFAULT' }}</div>\n <div class=\"text-sm text-muted-foreground\">{{ item.publicAccess ? 'Public access' : 'Authenticated' }}</div>\n </td>\n <td class=\"px-4 py-3\">{{ item.permissionCount }}</td>\n <td class=\"px-4 py-3\">\n <rolatech-platform-status-badge [status]=\"item.status || (item.enabled ? 'ENABLED' : 'DISABLED')\" />\n </td>\n <td class=\"px-4 py-3\">\n <button\n type=\"button\"\n class=\"inline-flex items-center rounded-xl border border-(--rt-border-color) px-3 py-2 text-sm font-medium\"\n (click)=\"openEndpoint(item.id)\"\n >\n View\n </button>\n </td>\n </tr>\n } }\n </tbody>\n </rolatech-platform-data-table>\n </section>\n</section>\n", styles: [":host{display:block}\n"], dependencies: [{ kind: "component", type: PlatformPageHeader, selector: "rolatech-platform-page-header" }, { kind: "component", type: PlatformStatCard, selector: "rolatech-platform-stat-card" }, { kind: "component", type: PlatformFilterPanel, selector: "rolatech-platform-filter-panel" }, { kind: "component", type: PlatformDataTable, selector: "rolatech-platform-data-table" }, { kind: "component", type: PlatformStatusBadge, selector: "rolatech-platform-status-badge", inputs: ["status"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
85
+ }
86
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.1", ngImport: i0, type: PlatformEndpointIndexPage, decorators: [{
87
+ type: Component,
88
+ args: [{ selector: 'rolatech-platform-endpoint-index-page', standalone: true, imports: [PlatformPageHeader, PlatformStatCard, PlatformFilterPanel, PlatformDataTable, PlatformStatusBadge], changeDetection: ChangeDetectionStrategy.OnPush, providers: [PlatformEndpointIndexFacade], template: "<section class=\"rt-platform-theme flex flex-col gap-6 bg-(--rt-base-background) p-6 text-(--rt-text-primary)\">\n <rolatech-platform-page-header>\n <div header-left class=\"space-y-1\">\n <h1 class=\"text-2xl font-semibold tracking-tight\">Platform Endpoints</h1>\n <p class=\"text-sm text-muted-foreground\">Audit registered platform endpoints, auth mode, and permission coverage.</p>\n </div>\n </rolatech-platform-page-header>\n\n <section class=\"grid gap-4 md:grid-cols-2 xl:grid-cols-4\">\n <rolatech-platform-stat-card>\n <div stat-label>Total Endpoints</div>\n <div stat-value>{{ facade.total() }}</div>\n </rolatech-platform-stat-card>\n\n <rolatech-platform-stat-card>\n <div stat-label>Enabled</div>\n <div stat-value>{{ facade.enabledCount() }}</div>\n </rolatech-platform-stat-card>\n\n <rolatech-platform-stat-card>\n <div stat-label>Public</div>\n <div stat-value>{{ facade.publicCount() }}</div>\n </rolatech-platform-stat-card>\n\n <rolatech-platform-stat-card>\n <div stat-label>Protected</div>\n <div stat-value>{{ facade.protectedCount() }}</div>\n </rolatech-platform-stat-card>\n </section>\n\n <section class=\"grid gap-6 xl:grid-cols-[320px_minmax(0,1fr)]\">\n <rolatech-platform-filter-panel>\n <div filter-title>Filters</div>\n <div filter-description>Refine visible endpoints.</div>\n\n <label class=\"flex flex-col gap-2\">\n <span class=\"text-sm font-medium\">Search</span>\n <input\n type=\"text\"\n [value]=\"facade.keyword()\"\n (input)=\"onKeywordInput($event)\"\n placeholder=\"Search route, service, auth type\"\n class=\"h-10 rounded-xl border border-(--rt-border-color) px-3 text-sm outline-none\"\n />\n </label>\n\n <label class=\"flex flex-col gap-2\">\n <span class=\"text-sm font-medium\">Status</span>\n <select class=\"h-10 rounded-xl border border-(--rt-border-color) px-3 text-sm outline-none\" (change)=\"onStatusChange($event)\">\n <option value=\"ALL\">All</option>\n <option value=\"ENABLED\">Enabled</option>\n <option value=\"DISABLED\">Disabled</option>\n </select>\n </label>\n </rolatech-platform-filter-panel>\n\n <rolatech-platform-data-table>\n <div table-toolbar class=\"flex items-center justify-between gap-3\">\n <h2 class=\"text-base font-semibold\">Endpoint Catalog</h2>\n <div class=\"text-sm text-muted-foreground\">{{ facade.filteredItems().length }} items</div>\n </div>\n\n @if (facade.error()) {\n <p class=\"mb-4 rounded-2xl border border-rose-300/40 bg-rose-500/10 px-4 py-3 text-sm text-(--rt-text-primary)\">\n {{ facade.error() }}\n </p>\n }\n\n <thead class=\"bg-muted/40\">\n <tr class=\"text-left\">\n <th class=\"px-4 py-3 font-medium\">Endpoint</th>\n <th class=\"px-4 py-3 font-medium\">Route</th>\n <th class=\"px-4 py-3 font-medium\">Service</th>\n <th class=\"px-4 py-3 font-medium\">Auth</th>\n <th class=\"px-4 py-3 font-medium\">Permissions</th>\n <th class=\"px-4 py-3 font-medium\">Status</th>\n <th class=\"px-4 py-3 font-medium\">Actions</th>\n </tr>\n </thead>\n\n <tbody>\n @if (facade.loading()) {\n <tr>\n <td colspan=\"7\" class=\"px-4 py-10 text-center text-muted-foreground\">Loading endpoints...</td>\n </tr>\n } @else if (facade.filteredItems().length === 0) {\n <tr>\n <td colspan=\"7\" class=\"px-4 py-10 text-center text-muted-foreground\">No endpoints matched your filters.</td>\n </tr>\n } @else { @for (item of facade.filteredItems(); track item.id) {\n <tr class=\"border-t border-(--rt-border-color)\">\n <td class=\"px-4 py-3\">\n <div class=\"font-medium\">{{ item.name }}</div>\n <div class=\"text-sm text-muted-foreground\">{{ item.code || item.id }}</div>\n </td>\n <td class=\"px-4 py-3\">\n <div class=\"font-medium\">{{ routeLabel(item.method, item.path) }}</div>\n <div class=\"text-sm text-muted-foreground\">{{ item.resource || '\u2014' }}</div>\n </td>\n <td class=\"px-4 py-3 text-muted-foreground\">{{ item.serviceName || '\u2014' }}</td>\n <td class=\"px-4 py-3\">\n <div class=\"font-medium\">{{ item.authType || 'DEFAULT' }}</div>\n <div class=\"text-sm text-muted-foreground\">{{ item.publicAccess ? 'Public access' : 'Authenticated' }}</div>\n </td>\n <td class=\"px-4 py-3\">{{ item.permissionCount }}</td>\n <td class=\"px-4 py-3\">\n <rolatech-platform-status-badge [status]=\"item.status || (item.enabled ? 'ENABLED' : 'DISABLED')\" />\n </td>\n <td class=\"px-4 py-3\">\n <button\n type=\"button\"\n class=\"inline-flex items-center rounded-xl border border-(--rt-border-color) px-3 py-2 text-sm font-medium\"\n (click)=\"openEndpoint(item.id)\"\n >\n View\n </button>\n </td>\n </tr>\n } }\n </tbody>\n </rolatech-platform-data-table>\n </section>\n</section>\n", styles: [":host{display:block}\n"] }]
89
+ }] });
90
+
91
+ export { PlatformEndpointIndexPage };
92
+ //# sourceMappingURL=rolatech-angular-platform-platform-endpoint-index-69W62bRP.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rolatech-angular-platform-platform-endpoint-index-69W62bRP.mjs","sources":["../../../../packages/angular-platform/src/lib/store/platform-endpoint-index.facade.ts","../../../../packages/angular-platform/src/lib/pages/endpoint/platform-endpoint-index/platform-endpoint-index.ts","../../../../packages/angular-platform/src/lib/pages/endpoint/platform-endpoint-index/platform-endpoint-index.html"],"sourcesContent":["import { Injectable, computed, inject, signal } from '@angular/core';\nimport { firstValueFrom } from 'rxjs';\nimport { PlatformEndpointService, PlatformEndpointSummaryResponse } from '@rolatech/angular-services';\n\n@Injectable()\nexport class PlatformEndpointIndexFacade {\n private readonly endpointService = inject(PlatformEndpointService);\n\n readonly loading = signal(false);\n readonly error = signal<string | null>(null);\n readonly items = signal<PlatformEndpointSummaryResponse[]>([]);\n\n readonly keyword = signal('');\n readonly status = signal<'ALL' | 'ENABLED' | 'DISABLED'>('ALL');\n\n readonly filteredItems = computed(() => {\n const keyword = this.keyword().trim().toLowerCase();\n const status = this.status();\n\n return this.items().filter((item) => {\n const haystack = [item.name, item.code, item.resource, item.path, item.method, item.serviceName, item.authType]\n .filter(Boolean)\n .join(' ')\n .toLowerCase();\n const matchesKeyword = !keyword || haystack.includes(keyword);\n const endpointStatus = item.enabled ? 'ENABLED' : 'DISABLED';\n const matchesStatus = status === 'ALL' || endpointStatus === status;\n return matchesKeyword && matchesStatus;\n });\n });\n\n readonly total = computed(() => this.items().length);\n readonly enabledCount = computed(() => this.items().filter((item) => item.enabled).length);\n readonly publicCount = computed(() => this.items().filter((item) => item.publicAccess).length);\n readonly protectedCount = computed(() => this.items().filter((item) => !item.publicAccess).length);\n\n async load(): Promise<void> {\n this.loading.set(true);\n this.error.set(null);\n\n try {\n const page = await firstValueFrom(\n this.endpointService.findEndpoints({\n limit: 100,\n sort: ['updatedAt desc'],\n }),\n );\n this.items.set(page.items ?? []);\n } catch (error) {\n console.error(error);\n this.items.set([]);\n this.error.set('Unable to load platform endpoints.');\n } finally {\n this.loading.set(false);\n }\n }\n\n setKeyword(value: string): void {\n this.keyword.set(value);\n }\n\n setStatus(value: 'ALL' | 'ENABLED' | 'DISABLED'): void {\n this.status.set(value);\n }\n}\n","import { ChangeDetectionStrategy, Component, OnInit, inject } from '@angular/core';\nimport { Router } from '@angular/router';\nimport { PlatformDataTable, PlatformFilterPanel, PlatformPageHeader, PlatformStatCard, PlatformStatusBadge } from '../../../shared';\nimport { PlatformEndpointIndexFacade } from '../../../store/platform-endpoint-index.facade';\n\n@Component({\n selector: 'rolatech-platform-endpoint-index-page',\n standalone: true,\n imports: [PlatformPageHeader, PlatformStatCard, PlatformFilterPanel, PlatformDataTable, PlatformStatusBadge],\n templateUrl: './platform-endpoint-index.html',\n styleUrl: './platform-endpoint-index.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [PlatformEndpointIndexFacade],\n})\nexport class PlatformEndpointIndexPage implements OnInit {\n readonly facade = inject(PlatformEndpointIndexFacade);\n private readonly router = inject(Router);\n\n ngOnInit(): void {\n void this.facade.load();\n }\n\n onKeywordInput(event: Event): void {\n this.facade.setKeyword((event.target as HTMLInputElement).value);\n }\n\n onStatusChange(event: Event): void {\n this.facade.setStatus((event.target as HTMLSelectElement).value as 'ALL' | 'ENABLED' | 'DISABLED');\n }\n\n openEndpoint(endpointId: string): void {\n void this.router.navigate(['/platform/endpoints', endpointId]);\n }\n\n routeLabel(method: string | null | undefined, path: string | null | undefined): string {\n return [method, path].filter(Boolean).join(' ') || '—';\n }\n}\n","<section class=\"rt-platform-theme flex flex-col gap-6 bg-(--rt-base-background) p-6 text-(--rt-text-primary)\">\n <rolatech-platform-page-header>\n <div header-left class=\"space-y-1\">\n <h1 class=\"text-2xl font-semibold tracking-tight\">Platform Endpoints</h1>\n <p class=\"text-sm text-muted-foreground\">Audit registered platform endpoints, auth mode, and permission coverage.</p>\n </div>\n </rolatech-platform-page-header>\n\n <section class=\"grid gap-4 md:grid-cols-2 xl:grid-cols-4\">\n <rolatech-platform-stat-card>\n <div stat-label>Total Endpoints</div>\n <div stat-value>{{ facade.total() }}</div>\n </rolatech-platform-stat-card>\n\n <rolatech-platform-stat-card>\n <div stat-label>Enabled</div>\n <div stat-value>{{ facade.enabledCount() }}</div>\n </rolatech-platform-stat-card>\n\n <rolatech-platform-stat-card>\n <div stat-label>Public</div>\n <div stat-value>{{ facade.publicCount() }}</div>\n </rolatech-platform-stat-card>\n\n <rolatech-platform-stat-card>\n <div stat-label>Protected</div>\n <div stat-value>{{ facade.protectedCount() }}</div>\n </rolatech-platform-stat-card>\n </section>\n\n <section class=\"grid gap-6 xl:grid-cols-[320px_minmax(0,1fr)]\">\n <rolatech-platform-filter-panel>\n <div filter-title>Filters</div>\n <div filter-description>Refine visible endpoints.</div>\n\n <label class=\"flex flex-col gap-2\">\n <span class=\"text-sm font-medium\">Search</span>\n <input\n type=\"text\"\n [value]=\"facade.keyword()\"\n (input)=\"onKeywordInput($event)\"\n placeholder=\"Search route, service, auth type\"\n class=\"h-10 rounded-xl border border-(--rt-border-color) px-3 text-sm outline-none\"\n />\n </label>\n\n <label class=\"flex flex-col gap-2\">\n <span class=\"text-sm font-medium\">Status</span>\n <select class=\"h-10 rounded-xl border border-(--rt-border-color) px-3 text-sm outline-none\" (change)=\"onStatusChange($event)\">\n <option value=\"ALL\">All</option>\n <option value=\"ENABLED\">Enabled</option>\n <option value=\"DISABLED\">Disabled</option>\n </select>\n </label>\n </rolatech-platform-filter-panel>\n\n <rolatech-platform-data-table>\n <div table-toolbar class=\"flex items-center justify-between gap-3\">\n <h2 class=\"text-base font-semibold\">Endpoint Catalog</h2>\n <div class=\"text-sm text-muted-foreground\">{{ facade.filteredItems().length }} items</div>\n </div>\n\n @if (facade.error()) {\n <p class=\"mb-4 rounded-2xl border border-rose-300/40 bg-rose-500/10 px-4 py-3 text-sm text-(--rt-text-primary)\">\n {{ facade.error() }}\n </p>\n }\n\n <thead class=\"bg-muted/40\">\n <tr class=\"text-left\">\n <th class=\"px-4 py-3 font-medium\">Endpoint</th>\n <th class=\"px-4 py-3 font-medium\">Route</th>\n <th class=\"px-4 py-3 font-medium\">Service</th>\n <th class=\"px-4 py-3 font-medium\">Auth</th>\n <th class=\"px-4 py-3 font-medium\">Permissions</th>\n <th class=\"px-4 py-3 font-medium\">Status</th>\n <th class=\"px-4 py-3 font-medium\">Actions</th>\n </tr>\n </thead>\n\n <tbody>\n @if (facade.loading()) {\n <tr>\n <td colspan=\"7\" class=\"px-4 py-10 text-center text-muted-foreground\">Loading endpoints...</td>\n </tr>\n } @else if (facade.filteredItems().length === 0) {\n <tr>\n <td colspan=\"7\" class=\"px-4 py-10 text-center text-muted-foreground\">No endpoints matched your filters.</td>\n </tr>\n } @else { @for (item of facade.filteredItems(); track item.id) {\n <tr class=\"border-t border-(--rt-border-color)\">\n <td class=\"px-4 py-3\">\n <div class=\"font-medium\">{{ item.name }}</div>\n <div class=\"text-sm text-muted-foreground\">{{ item.code || item.id }}</div>\n </td>\n <td class=\"px-4 py-3\">\n <div class=\"font-medium\">{{ routeLabel(item.method, item.path) }}</div>\n <div class=\"text-sm text-muted-foreground\">{{ item.resource || '—' }}</div>\n </td>\n <td class=\"px-4 py-3 text-muted-foreground\">{{ item.serviceName || '—' }}</td>\n <td class=\"px-4 py-3\">\n <div class=\"font-medium\">{{ item.authType || 'DEFAULT' }}</div>\n <div class=\"text-sm text-muted-foreground\">{{ item.publicAccess ? 'Public access' : 'Authenticated' }}</div>\n </td>\n <td class=\"px-4 py-3\">{{ item.permissionCount }}</td>\n <td class=\"px-4 py-3\">\n <rolatech-platform-status-badge [status]=\"item.status || (item.enabled ? 'ENABLED' : 'DISABLED')\" />\n </td>\n <td class=\"px-4 py-3\">\n <button\n type=\"button\"\n class=\"inline-flex items-center rounded-xl border border-(--rt-border-color) px-3 py-2 text-sm font-medium\"\n (click)=\"openEndpoint(item.id)\"\n >\n View\n </button>\n </td>\n </tr>\n } }\n </tbody>\n </rolatech-platform-data-table>\n </section>\n</section>\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ const PLATFORM_ENDPOINT_ROUTES = [
2
+ {
3
+ path: '',
4
+ loadComponent: () => import('./rolatech-angular-platform-platform-endpoint-index-69W62bRP.mjs').then((m) => m.PlatformEndpointIndexPage),
5
+ },
6
+ {
7
+ path: ':endpointId',
8
+ loadComponent: () => import('./rolatech-angular-platform-platform-endpoint-detail-CEaO9MFQ.mjs').then((m) => m.PlatformEndpointDetailPage),
9
+ },
10
+ ];
11
+
12
+ export { PLATFORM_ENDPOINT_ROUTES };
13
+ //# sourceMappingURL=rolatech-angular-platform-platform-endpoint.routes-Cj66S7N-.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rolatech-angular-platform-platform-endpoint.routes-Cj66S7N-.mjs","sources":["../../../../packages/angular-platform/src/lib/pages/endpoint/platform-endpoint.routes.ts"],"sourcesContent":["import { Routes } from '@angular/router';\n\nexport const PLATFORM_ENDPOINT_ROUTES: Routes = [\n {\n path: '',\n loadComponent: () => import('./platform-endpoint-index/platform-endpoint-index').then((m) => m.PlatformEndpointIndexPage),\n },\n {\n path: ':endpointId',\n loadComponent: () => import('./platform-endpoint-detail/platform-endpoint-detail').then((m) => m.PlatformEndpointDetailPage),\n },\n];\n"],"names":[],"mappings":"AAEO,MAAM,wBAAwB,GAAW;AAC9C,IAAA;AACE,QAAA,IAAI,EAAE,EAAE;AACR,QAAA,aAAa,EAAE,MAAM,OAAO,kEAAmD,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,yBAAyB,CAAC;AAC1H,KAAA;AACD,IAAA;AACE,QAAA,IAAI,EAAE,aAAa;AACnB,QAAA,aAAa,EAAE,MAAM,OAAO,mEAAqD,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,0BAA0B,CAAC;AAC7H,KAAA;;;;;"}