@trismegisto/spine 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +56 -0
- package/README.md +207 -0
- package/fesm2022/trismegisto-spine-audit.mjs +1299 -0
- package/fesm2022/trismegisto-spine-audit.mjs.map +1 -0
- package/fesm2022/trismegisto-spine-auto-service-auto-service-audit.component-CCiz-q8o.mjs +37 -0
- package/fesm2022/trismegisto-spine-auto-service-auto-service-audit.component-CCiz-q8o.mjs.map +1 -0
- package/fesm2022/trismegisto-spine-auto-service-auto-service-client-picker.component-Z0wCANF6.mjs +51 -0
- package/fesm2022/trismegisto-spine-auto-service-auto-service-client-picker.component-Z0wCANF6.mjs.map +1 -0
- package/fesm2022/trismegisto-spine-auto-service-auto-service-client.component-BYkUOwWL.mjs +595 -0
- package/fesm2022/trismegisto-spine-auto-service-auto-service-client.component-BYkUOwWL.mjs.map +1 -0
- package/fesm2022/trismegisto-spine-auto-service-auto-service-groups.component-CqIVe2LU.mjs +357 -0
- package/fesm2022/trismegisto-spine-auto-service-auto-service-groups.component-CqIVe2LU.mjs.map +1 -0
- package/fesm2022/trismegisto-spine-auto-service-auto-service.component-B5tyJ2zY.mjs +477 -0
- package/fesm2022/trismegisto-spine-auto-service-auto-service.component-B5tyJ2zY.mjs.map +1 -0
- package/fesm2022/trismegisto-spine-auto-service-home.component-vl3BPFnk.mjs +238 -0
- package/fesm2022/trismegisto-spine-auto-service-home.component-vl3BPFnk.mjs.map +1 -0
- package/fesm2022/trismegisto-spine-auto-service.mjs +154 -0
- package/fesm2022/trismegisto-spine-auto-service.mjs.map +1 -0
- package/fesm2022/trismegisto-spine-graphql.mjs +347 -0
- package/fesm2022/trismegisto-spine-graphql.mjs.map +1 -0
- package/fesm2022/trismegisto-spine-layout.mjs +2848 -0
- package/fesm2022/trismegisto-spine-layout.mjs.map +1 -0
- package/fesm2022/trismegisto-spine-modal.mjs +141 -0
- package/fesm2022/trismegisto-spine-modal.mjs.map +1 -0
- package/fesm2022/trismegisto-spine-notification.mjs +122 -0
- package/fesm2022/trismegisto-spine-notification.mjs.map +1 -0
- package/fesm2022/trismegisto-spine-routing.mjs +398 -0
- package/fesm2022/trismegisto-spine-routing.mjs.map +1 -0
- package/fesm2022/trismegisto-spine-shell.mjs +409 -0
- package/fesm2022/trismegisto-spine-shell.mjs.map +1 -0
- package/fesm2022/trismegisto-spine-side-panel.mjs +142 -0
- package/fesm2022/trismegisto-spine-side-panel.mjs.map +1 -0
- package/fesm2022/trismegisto-spine.mjs +2574 -0
- package/fesm2022/trismegisto-spine.mjs.map +1 -0
- package/package.json +94 -0
- package/types/trismegisto-spine-audit.d.ts +948 -0
- package/types/trismegisto-spine-audit.d.ts.map +1 -0
- package/types/trismegisto-spine-auto-service.d.ts +110 -0
- package/types/trismegisto-spine-auto-service.d.ts.map +1 -0
- package/types/trismegisto-spine-graphql.d.ts +72 -0
- package/types/trismegisto-spine-graphql.d.ts.map +1 -0
- package/types/trismegisto-spine-layout.d.ts +1054 -0
- package/types/trismegisto-spine-layout.d.ts.map +1 -0
- package/types/trismegisto-spine-modal.d.ts +68 -0
- package/types/trismegisto-spine-modal.d.ts.map +1 -0
- package/types/trismegisto-spine-notification.d.ts +62 -0
- package/types/trismegisto-spine-notification.d.ts.map +1 -0
- package/types/trismegisto-spine-routing.d.ts +205 -0
- package/types/trismegisto-spine-routing.d.ts.map +1 -0
- package/types/trismegisto-spine-shell.d.ts +143 -0
- package/types/trismegisto-spine-shell.d.ts.map +1 -0
- package/types/trismegisto-spine-side-panel.d.ts +66 -0
- package/types/trismegisto-spine-side-panel.d.ts.map +1 -0
- package/types/trismegisto-spine.d.ts +1161 -0
- package/types/trismegisto-spine.d.ts.map +1 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"trismegisto-spine-audit.mjs","sources":["../../../projects/ui/audit/src/audit.model.ts","../../../projects/ui/audit/src/audit.service.ts","../../../projects/ui/audit/src/audit-top-card.component.ts","../../../projects/ui/audit/src/audit.component.ts","../../../projects/ui/audit/src/audit.component.html","../../../projects/ui/audit/src/public-api.ts","../../../projects/ui/audit/src/trismegisto-spine-audit.ts"],"sourcesContent":["/**\n * Leitura da auditoria (`audit.events`) do argos admin-server, nos dois escopos:\n * - `admin` → `GET {adminApi}/admin/audit/*` (painel central, todos os apps);\n * - `client` → `GET {adminApi}/auto-service/:clientId/audit/*` (só os apps do projeto do client; o\n * servidor recorta, `app_id` de fora → 403).\n * Endpoints: `actions`, `events`, `events/:id`, `traces/:traceId`, `stats` e `tops/:kind` (rankings paginados).\n * Unidade: a leitura padrão é por AÇÃO (uma linha por trace: o evento raiz + agregados dos spans);\n * `unit=events` nas agregações mantém a contagem por evento (registro).\n * Formatos e filtros fixados pelo contrato do admin-server; tudo aqui é TypeScript puro (tipos +\n * montagem da consulta).\n */\nimport { HttpParams } from '@angular/common/http';\n\nexport type AuditOutcome = 'success' | 'failure' | 'denied';\nexport type AuditMethod = 'read' | 'write' | 'delete' | 'stream';\nexport type AuditLevel = 'public' | 'private' | 'protected' | 'optional';\nexport type AuditPermissionResult = 'allowed' | 'forbidden' | 'unauthorized' | 'public';\nexport type AuditActorType = 'user' | 'app_token' | 'api_token' | 'public' | 'unauthenticated';\n\nexport const AUDIT_METHODS: readonly AuditMethod[] = ['read', 'write', 'delete', 'stream'];\nexport const AUDIT_OUTCOMES: readonly AuditOutcome[] = ['success', 'failure', 'denied'];\n\n/** Um evento como vem na lista (`GET .../audit/events`). Datas em ISO-8601 UTC. */\nexport interface AuditEvent {\n event_id: string;\n occurred_at: string;\n duration_ms: number | null;\n trace_id: string | null;\n span_id: string | null;\n parent_span_id: string | null;\n /** `true` = a ação de entrada (feita pela pessoa); `false` = chamada entre apps dentro da cadeia. */\n entry: boolean;\n realm_id: string | null;\n actor_type: AuditActorType | string | null;\n user_id: string | null;\n user_name: string | null;\n token_id: string | null;\n client_ip: string | null;\n app_id: string | null;\n app_name: string | null;\n client_id: string | null;\n route_id: string | null;\n route_name: string | null;\n operation_id: string | null;\n operation_identifier: string | null;\n operation_method: AuditMethod | string | null;\n operation_level: AuditLevel | string | null;\n operation_label: string | null;\n target_type: string | null;\n target_id: string | null;\n permission_result: AuditPermissionResult | string | null;\n outcome: AuditOutcome;\n status: number | null;\n message: string | null;\n}\n\n/** Unidade da leitura: `actions` (uma por trace, padrão) ou `events` (cada registro). */\nexport type AuditUnit = 'actions' | 'events';\nexport const AUDIT_UNITS: readonly AuditUnit[] = ['actions', 'events'];\n\n/**\n * Uma AÇÃO (`GET .../audit/actions`): os campos do evento raiz (entry=true) do trace, com os agregados\n * dos spans do mesmo trace dentro da janela. `outcome` = o pior dos spans (denied > failure > success);\n * `root_outcome` = o do próprio raiz. `orphan` = trace sem raiz na janela (a linha é o 1º span interno).\n * No escopo `client`, spans de apps de fora não entram nos agregados, só em `hidden_count`.\n */\nexport interface AuditAction extends AuditEvent {\n root_outcome?: AuditOutcome;\n orphan?: boolean;\n span_count: number;\n hidden_count?: number;\n apps?: string[];\n failures?: number;\n denied?: number;\n}\n\nexport interface AuditActionPage {\n items: AuditAction[];\n next_cursor: string | null;\n}\n\n/** O evento completo (`GET .../audit/events/:eventId?occurred_at=`). */\nexport interface AuditEventDetail extends AuditEvent {\n details?: unknown;\n received_at?: string | null;\n service_instance?: string | null;\n sdk?: string | null;\n}\n\nexport interface AuditPage {\n items: AuditEvent[];\n next_cursor: string | null;\n}\n\n/** A cadeia (trace) recortada ao escopo do projeto; `hidden_count` = eventos de apps de fora. */\nexport interface AuditTrace {\n items: AuditEvent[];\n hidden_count?: number;\n}\n\nexport interface AuditStats {\n total: number;\n /** Com `tops=false` na consulta, `by_app`/`top_operations`/`top_users` vêm vazios (use `tops/:kind`). */\n by_outcome: { success: number; failure: number; denied: number };\n by_app: { app_id: string; app_name: string | null; total: number; failures: number; denied: number }[];\n top_operations: { operation_identifier: string | null; operation_label: string | null; app_name: string | null; total: number; failures: number }[];\n top_users: { user_id: string | null; user_name: string | null; total: number }[];\n timeline: { bucket: string; total: number; failures: number; denied: number }[];\n}\n\n/** Os rankings paginados de `GET .../audit/tops/:kind`. */\nexport type AuditTopKind = 'apps' | 'operations' | 'users';\nexport const AUDIT_TOP_KINDS: readonly AuditTopKind[] = ['apps', 'operations', 'users'];\n/** Itens por página dos cards de ranking (o servidor aceita até 50). */\nexport const AUDIT_TOP_PAGE_SIZE = 5;\n\n/** Um item de ranking: os campos de identificação variam com o `kind`; contagens sempre presentes. */\nexport interface AuditTopItem {\n total: number;\n failures: number;\n denied: number;\n /** `apps` e `operations`. */\n app_id?: string | null;\n app_name?: string | null;\n /** `operations`. */\n operation_identifier?: string | null;\n operation_label?: string | null;\n /** `users`. */\n user_id?: string | null;\n user_name?: string | null;\n}\n\n/** Uma página de ranking; `total` = quantos itens (grupos) existem na consulta. */\nexport interface AuditTopPage {\n items: AuditTopItem[];\n total: number;\n}\n\n/** De onde a tela lê: o painel central (`admin`) ou o projeto de um client (`client`). */\nexport type SpineAuditScope = 'admin' | 'client';\n\nconst trimSlash = (url: string | null | undefined) => (url ?? '').replace(/\\/+$/, '');\n\n/**\n * Base dos endpoints da auditoria para o escopo (sem barra no fim). `null` quando falta o necessário\n * (sem `adminApi`, ou escopo `client` sem `clientId`).\n */\nexport function auditApiBase(adminApi: string | null | undefined, scope: SpineAuditScope, clientId?: string | null): string | null {\n const api = trimSlash(adminApi);\n if (!api) return null;\n if (scope === 'admin') return `${api}/admin/audit`;\n return clientId ? `${api}/auto-service/${encodeURIComponent(clientId)}/audit` : null;\n}\n\n/** Lista de apps para o filtro: todos (`admin`, `GET /admin/apps`) ou os do projeto do client. */\nexport function auditAppsUrl(adminApi: string | null | undefined, scope: SpineAuditScope, clientId?: string | null): string | null {\n const api = trimSlash(adminApi);\n if (!api) return null;\n if (scope === 'admin') return `${api}/admin/apps`;\n return clientId ? `${api}/auto-service/${encodeURIComponent(clientId)}/apps` : null;\n}\n\n/** Filtros da query string (todos opcionais). `app_id` repete o parâmetro. */\nexport interface AuditQuery {\n from?: string;\n to?: string;\n app_id?: readonly string[];\n user_id?: string;\n user?: string;\n operation?: string;\n method?: AuditMethod | string;\n level?: AuditLevel | string;\n outcome?: AuditOutcome | string;\n permission_result?: AuditPermissionResult | string;\n actor_type?: AuditActorType | string;\n entry?: boolean;\n trace_id?: string;\n route_id?: string;\n target_type?: string;\n target_id?: string;\n status?: number | string;\n /** Agregações (stats/tops/daily): padrão do servidor = `actions`. Ignorado nas listas. */\n unit?: AuditUnit;\n}\n\n/** Monta a query string: vazio/`null` some, lista repete a chave (`app_id=a&app_id=b`). */\nexport function auditParams(\n query: AuditQuery,\n page: { limit?: number; cursor?: string | null; offset?: number } = {},\n): HttpParams {\n let params = new HttpParams();\n for (const [key, value] of Object.entries(query)) {\n if (value === undefined || value === null || value === '') continue;\n if (Array.isArray(value)) for (const item of value) params = params.append(key, String(item));\n else params = params.set(key, String(value));\n }\n if (page.limit) params = params.set('limit', String(page.limit));\n if (page.cursor) params = params.set('cursor', page.cursor);\n if (page.offset !== undefined) params = params.set('offset', String(page.offset));\n return params;\n}\n\n/** Escolhas rápidas de período da tela. */\nexport type AuditPeriod = '1h' | '6h' | '24h' | '7d' | '30d';\n\nconst HOUR = 60 * 60 * 1000;\nexport const AUDIT_PERIOD_MS: Readonly<Record<AuditPeriod, number>> = {\n '1h': HOUR, '6h': 6 * HOUR, '24h': 24 * HOUR, '7d': 7 * 24 * HOUR, '30d': 30 * 24 * HOUR,\n};\n/** Janela máxima aceita pelo servidor (acima: 400 `range_too_large`). */\nexport const AUDIT_MAX_WINDOW_MS = 31 * 24 * HOUR;\n\n/**\n * Valor da faixa de filtros da tela (`hm-filter-bar`), por chave. `dates` é `{ start, end }` em\n * AAAA-MM-DD (dia local); `app` é lista (multisseleção; aceita um id só); `entry` é booleano; o resto\n * é texto.\n */\nexport interface AuditFilterInput {\n dates?: { start: string | null; end: string | null } | null;\n app?: string | readonly string[] | null;\n user?: string | null;\n user_id?: string | null;\n operation?: string | null;\n method?: string | null;\n level?: string | null;\n outcome?: string | null;\n permission_result?: string | null;\n actor_type?: string | null;\n status?: string | number | null;\n trace_id?: string | null;\n entry?: boolean | null;\n}\n\nexport type BuiltAuditQuery = { ok: true; query: AuditQuery } | { ok: false; reason: 'range_too_large' };\n\nfunction localDay(iso: string, endOfDay: boolean): Date {\n const [y, m, d] = iso.split('-').map(Number);\n return endOfDay ? new Date(y, m - 1, d, 23, 59, 59, 999) : new Date(y, m - 1, d, 0, 0, 0, 0);\n}\n\n/**\n * Período + filtros da tela → consulta do contrato. As datas da faixa (dia local inteiro) vencem a\n * escolha rápida; o fim nunca passa de `now`. A janela vira `from`/`to` absolutos, então as páginas\n * seguintes (cursor) e o resumo enxergam exatamente o mesmo intervalo.\n */\nexport function buildAuditQuery(period: AuditPeriod, filters: AuditFilterInput, now: Date): BuiltAuditQuery {\n let from: Date;\n let to: Date;\n const dates = filters.dates;\n if (dates && (dates.start || dates.end)) {\n to = dates.end ? new Date(Math.min(localDay(dates.end, true).getTime(), now.getTime())) : now;\n from = dates.start ? localDay(dates.start, false) : new Date(to.getTime() - AUDIT_PERIOD_MS['24h']);\n } else {\n to = now;\n from = new Date(now.getTime() - AUDIT_PERIOD_MS[period]);\n }\n if (to.getTime() - from.getTime() > AUDIT_MAX_WINDOW_MS) return { ok: false, reason: 'range_too_large' };\n\n const text = (v: string | number | null | undefined) => String(v ?? '').trim() || undefined;\n const apps = (Array.isArray(filters.app) ? filters.app : filters.app ? [filters.app] : []).filter(Boolean) as string[];\n const status = text(filters.status);\n const query: AuditQuery = {\n from: from.toISOString(),\n to: to.toISOString(),\n app_id: apps.length ? apps : undefined,\n user: text(filters.user),\n user_id: text(filters.user_id),\n operation: text(filters.operation),\n method: text(filters.method),\n level: text(filters.level),\n outcome: text(filters.outcome),\n permission_result: text(filters.permission_result),\n actor_type: text(filters.actor_type),\n // Status que não é número vai como está: o servidor responde 400 `invalid_filter` e a tela explica.\n status: status === undefined ? undefined : /^\\d+$/.test(status) ? Number(status) : status,\n trace_id: text(filters.trace_id)?.toLowerCase(),\n entry: typeof filters.entry === 'boolean' ? filters.entry : undefined,\n };\n for (const key of Object.keys(query) as (keyof AuditQuery)[]) if (query[key] === undefined) delete query[key];\n return { ok: true, query };\n}\n\n/**\n * Lê as datas do servidor, que vêm em ISO UTC com MICROssegundos (`2026-10-05T13:18:40.564281Z`): o\n * formato de data do ECMAScript só garante 3 casas, então a fração é cortada em milissegundos antes.\n */\nexport function parseAuditDate(iso: string | null | undefined): Date | null {\n if (!iso) return null;\n const d = new Date(iso.replace(/(\\.\\d{3})\\d+/, '$1'));\n return Number.isNaN(d.getTime()) ? null : d;\n}\n\n/** Maior `limit` aceito por `GET .../audit/events`. */\nexport const AUDIT_MAX_PAGE_SIZE = 200;\n\n/** Busca uma fatia da lista (`cursor` `null` = do começo). */\nexport type AuditPageFetcher = (cursor: string | null, limit: number) => Promise<AuditPage>;\n\n/** Uma página resolvida por `AuditCursorPager.page`. `offset` pode ser menor que o pedido (pedido além do fim). */\nexport interface AuditPagerResult {\n items: AuditEvent[];\n offset: number;\n hasMore: boolean;\n}\n\n/**\n * Paginação numerada (\"página N de M\") sobre a lista por cursor (keyset) do servidor, que não tem\n * OFFSET. Guarda o cursor de cada posição já vista (posição 0 = sem cursor); para abrir uma página\n * nunca vista, anda a partir da posição conhecida mais próxima em saltos de até 200 (o cursor só\n * depende do último evento lido, não do `limit`). Vale para UMA consulta (`from`/`to` + filtros\n * fixos): consulta nova = pager novo.\n */\nexport class AuditCursorPager {\n private readonly cursors = new Map<number, string>();\n /** Quantos eventos a consulta tem, quando a lista já chegou ao fim (`next_cursor` nulo). */\n private endAt: number | null = null;\n\n /** Total exato, conhecido depois de alguma página chegar ao fim da lista. */\n get end(): number | null {\n return this.endAt;\n }\n\n async page(offset: number, size: number, fetch: AuditPageFetcher, retry = true): Promise<AuditPagerResult> {\n size = Math.max(1, Math.min(AUDIT_MAX_PAGE_SIZE, Math.floor(size)));\n offset = Math.max(0, Math.floor(offset / size) * size);\n if (this.endAt !== null && offset > 0 && offset >= this.endAt) offset = Math.floor((this.endAt - 1) / size) * size;\n\n let at = 0;\n for (const known of this.cursors.keys()) if (known <= offset && known > at) at = known;\n let cursor = at ? this.cursors.get(at)! : null;\n while (at < offset) {\n const res = await fetch(cursor, Math.min(AUDIT_MAX_PAGE_SIZE, offset - at));\n const items = res.items ?? [];\n if (!res.next_cursor || !items.length) {\n // A lista acabou antes da página pedida: vai para a última que existe.\n this.endAt = at + items.length;\n if (!retry) return { items: [], offset: at, hasMore: false };\n return this.page(this.endAt ? Math.floor((this.endAt - 1) / size) * size : 0, size, fetch, false);\n }\n at += items.length;\n cursor = res.next_cursor;\n this.cursors.set(at, cursor);\n }\n\n const res = await fetch(cursor, size);\n const items = res.items ?? [];\n const hasMore = !!res.next_cursor && items.length > 0;\n if (hasMore) this.cursors.set(offset + items.length, res.next_cursor!);\n else this.endAt = offset + items.length;\n return { items, offset, hasMore };\n }\n}\n\n/**\n * Total do rodapé: o exato quando a lista já chegou ao fim; senão o do resumo (`stats.total`, mesma\n * consulta), nunca menor do que o que já se sabe existir (página atual + \"tem mais\").\n */\nexport function auditPagerTotal(statsTotal: number | null | undefined, end: number | null, loaded: AuditPagerResult | null): number {\n if (end !== null) return end;\n const seen = loaded ? loaded.offset + loaded.items.length + (loaded.hasMore ? 1 : 0) : 0;\n return Math.max(statsTotal ?? 0, seen);\n}\n\n/** Pior resultado (denied > failure > success) — o `outcome` de uma ação. */\nexport function worstOutcome(outcomes: readonly (string | null | undefined)[]): AuditOutcome {\n if (outcomes.includes('denied')) return 'denied';\n if (outcomes.includes('failure')) return 'failure';\n return 'success';\n}\n\n/** Um span na linha do tempo de uma ação (`buildSpanTimeline`). */\nexport interface AuditSpanRow {\n event: AuditEvent;\n /** Profundidade na hierarquia (parent_span_id → span_id); 0 = raiz(es). */\n depth: number;\n /** Início relativo ao 1º span, em ms. */\n offsetMs: number;\n /** Posição/largura da barra, em % da duração total (largura mínima para continuar visível). */\n left: number;\n width: number;\n}\n\nexport interface AuditSpanTimeline {\n rows: AuditSpanRow[];\n /** Do início do 1º span ao fim do último, em ms. */\n totalMs: number;\n}\n\n/** Largura mínima da barra (%), para um span de 0 ms continuar visível. */\nconst MIN_SPAN_WIDTH = 0.8;\n\n/**\n * Spans de um trace → linha do tempo: ordem em árvore (pai antes dos filhos, irmãos por início), com\n * profundidade pela cadeia parent_span_id → span_id. Span cujo pai não está na lista (de fora do escopo,\n * fora da janela) vira raiz. Fim do span = início + duration_ms (sem duração = instante).\n */\nexport function buildSpanTimeline(items: readonly AuditEvent[]): AuditSpanTimeline {\n const start = (e: AuditEvent) => parseAuditDate(e.occurred_at)?.getTime() ?? 0;\n const list = [...items].sort((a, b) => start(a) - start(b) || a.event_id.localeCompare(b.event_id));\n if (!list.length) return { rows: [], totalMs: 0 };\n const t0 = Math.min(...list.map(start));\n const t1 = Math.max(...list.map((e) => start(e) + Math.max(0, e.duration_ms ?? 0)));\n const total = Math.max(1, t1 - t0);\n\n const spans = new Set(list.map((e) => e.span_id?.trim()).filter(Boolean) as string[]);\n const children = new Map<string, AuditEvent[]>();\n const roots: AuditEvent[] = [];\n for (const e of list) {\n const parent = e.parent_span_id?.trim();\n if (parent && spans.has(parent) && parent !== e.span_id?.trim()) {\n const bucket = children.get(parent) ?? [];\n bucket.push(e);\n children.set(parent, bucket);\n } else roots.push(e);\n }\n\n const rows: AuditSpanRow[] = [];\n const seen = new Set<string>();\n const visit = (e: AuditEvent, depth: number) => {\n if (seen.has(e.event_id)) return;\n seen.add(e.event_id);\n const offsetMs = start(e) - t0;\n const left = (offsetMs / total) * 100;\n const width = Math.min(100 - left, Math.max(MIN_SPAN_WIDTH, ((e.duration_ms ?? 0) / total) * 100));\n rows.push({ event: e, depth, offsetMs, left, width: Math.max(0, width) });\n const span = e.span_id?.trim();\n for (const child of (span && children.get(span)) || []) visit(child, depth + 1);\n };\n for (const r of roots) visit(r, 0);\n // Ciclo (dado corrompido): o que sobrou entra como raiz.\n for (const e of list) visit(e, 0);\n return { rows, totalMs: t1 - t0 };\n}\n\n/** Código de erro do envelope do admin-server (`{ error, detail }`), quando houver. */\nexport function auditErrorCode(err: unknown): { status: number; code: string; detail: string } {\n const e = err as { status?: number; error?: { error?: unknown; detail?: unknown } } | null;\n return {\n status: e?.status ?? 0,\n code: typeof e?.error?.error === 'string' ? e.error.error : '',\n detail: typeof e?.error?.detail === 'string' ? e.error.detail : '',\n };\n}\n","import { HttpClient, HttpHeaders, HttpParams } from '@angular/common/http';\nimport { Injectable, inject } from '@angular/core';\nimport { firstValueFrom } from 'rxjs';\nimport { AuthorizationService } from '@orfeu/angular/core';\nimport {\n AuditActionPage, AuditEventDetail, AuditPage, AuditQuery, AuditStats, AuditTopKind, AuditTopPage, AuditTrace, auditParams,\n} from './audit.model';\n\n/**\n * HTTP da auditoria (só leitura), igual nos dois escopos: cada método recebe a `base` já resolvida\n * por `auditApiBase` (`{adminApi}/admin/audit` ou `{adminApi}/auto-service/:clientId/audit`). O\n * recorte do escopo `client` é do servidor — nada aqui decide o que a pessoa pode ver.\n */\n@Injectable({ providedIn: 'root' })\nexport class SpineAuditService {\n private readonly http = inject(HttpClient);\n private readonly auth = inject(AuthorizationService);\n\n private get headers(): HttpHeaders {\n return new HttpHeaders({ 'x-access-token': this.auth.getToken() ?? '' });\n }\n\n events(base: string, query: AuditQuery, page: { limit?: number; cursor?: string | null } = {}): Promise<AuditPage> {\n return firstValueFrom(this.http.get<AuditPage>(`${base}/events`, { headers: this.headers, params: auditParams(query, page) }));\n }\n\n /** Uma linha por AÇÃO (raiz do trace + agregados dos spans), mesmos filtros/cursor de `events`. */\n actions(base: string, query: AuditQuery, page: { limit?: number; cursor?: string | null } = {}): Promise<AuditActionPage> {\n return firstValueFrom(this.http.get<AuditActionPage>(`${base}/actions`, { headers: this.headers, params: auditParams(query, page) }));\n }\n\n event(base: string, eventId: string, occurredAt: string): Promise<AuditEventDetail> {\n const params = new HttpParams().set('occurred_at', occurredAt);\n return firstValueFrom(\n this.http.get<AuditEventDetail>(`${base}/events/${encodeURIComponent(eventId)}`, { headers: this.headers, params }),\n );\n }\n\n /** `occurredAt` (opcional) = o do evento de origem: o servidor limita a busca da cadeia a ±1 dia dele. */\n trace(base: string, traceId: string, occurredAt?: string | null): Promise<AuditTrace> {\n const params = occurredAt ? new HttpParams().set('occurred_at', occurredAt) : undefined;\n return firstValueFrom(\n this.http.get<AuditTrace>(`${base}/traces/${encodeURIComponent(traceId)}`, { headers: this.headers, params }),\n );\n }\n\n /** Resumo (KPIs + linha do tempo). `tops: false` pula os rankings — a tela os pagina por `tops()`. */\n stats(base: string, query: AuditQuery, opts: { tops?: boolean } = {}): Promise<AuditStats> {\n let params = auditParams(query);\n if (opts.tops === false) params = params.set('tops', 'false');\n return firstValueFrom(this.http.get<AuditStats>(`${base}/stats`, { headers: this.headers, params }));\n }\n\n /** Um ranking paginado (`apps` | `operations` | `users`) com os mesmos filtros/janela do resumo. */\n tops(base: string, kind: AuditTopKind, query: AuditQuery, page: { offset: number; limit: number }): Promise<AuditTopPage> {\n return firstValueFrom(\n this.http.get<AuditTopPage>(`${base}/tops/${kind}`, { headers: this.headers, params: auditParams(query, page) }),\n );\n }\n\n /** Apps para o filtro (`{ apps: [{ id, name }] }` — `/admin/apps` ou `/auto-service/:clientId/apps`). */\n apps(url: string): Promise<{ apps?: { id: string; name: string }[] }> {\n return firstValueFrom(this.http.get<{ apps?: { id: string; name: string }[] }>(url, { headers: this.headers }));\n }\n}\n","import { ChangeDetectionStrategy, Component, computed, inject, input, output } from '@angular/core';\nimport { IconButtonComponent, SpinnerComponent } from '@trismegisto/angular';\nimport { PluralMessage, formatMessage, pluralMessage } from '@trismegisto/primitives';\nimport { SPINE_MESSAGES } from '@trismegisto/spine';\n\n/** Uma linha de ranking já pronta para mostrar (o card não sabe de que tipo é). */\nexport interface AuditTopRow {\n key: string;\n name: string;\n /** Texto secundário ao lado do nome (ex.: o app de uma operação). */\n suffix?: string | null;\n /** Dica (tooltip) do item — ex.: a descrição da operação. */\n hint?: string | null;\n total: number;\n failures: number;\n denied: number;\n /** Sem como virar filtro (ex.: usuário sem nome nem id). */\n disabled?: boolean;\n}\n\nlet nextId = 0;\n\n/**\n * Card de ranking da Auditoria (\"Operações\", \"Usuários\", \"Por aplicação\") com paginação compacta\n * no servidor: `x–y de N` + anterior/próxima. Durante a troca de página as linhas atuais continuam\n * (esmaecidas, `aria-busy`), sem esqueleto. A barra é proporcional ao `max` (o 1º item da 1ª página),\n * então as páginas seguintes não \"enchem\" de novo. Clicar num item emite `picked` (vira filtro).\n */\n@Component({\n selector: 'spine-audit-top-card',\n imports: [IconButtonComponent, SpinnerComponent],\n template: `\n <section class=\"card card-block top\" [attr.aria-labelledby]=\"headingId\" [attr.aria-busy]=\"loading()\">\n <div class=\"top__head\">\n <h3 class=\"top__title\" [id]=\"headingId\">{{ heading() }}</h3>\n @if (loading() && rows().length) {\n <hm-spinner size=\"small\" [label]=\"text.updating\" />\n }\n </div>\n @if (rows().length) {\n <ol class=\"rank\" [class.rank--busy]=\"loading()\" [attr.start]=\"offset() + 1\">\n @for (row of rows(); track row.key) {\n <li>\n <button type=\"button\" class=\"rank__item\" [attr.title]=\"row.hint || fmt(text.filterBy, { name: row.name })\"\n [disabled]=\"row.disabled\" (click)=\"picked.emit(row)\">\n <span class=\"rank__name\">\n {{ row.name }}\n @if (row.suffix) { <span class=\"muted\"> · {{ row.suffix }}</span> }\n </span>\n <span class=\"rank__value\">\n {{ number(row.total) }}\n @if (row.failures) { <span class=\"rank__fail\"> · {{ plural(text.failureCount, row.failures) }}</span> }\n @if (row.denied) { <span class=\"rank__denied\"> · {{ plural(text.deniedCount, row.denied) }}</span> }\n </span>\n <span class=\"rank__track\" aria-hidden=\"true\">\n <!-- A barra é a própria linha (sempre cheia): sucesso, falhas e negados na proporção dela. -->\n <span class=\"rank__bar\">\n @if (row.failures) { <span class=\"rank__seg rank__seg--fail\" [style.width.%]=\"share(row.failures, row.total)\"></span> }\n @if (row.denied) { <span class=\"rank__seg rank__seg--denied\" [style.width.%]=\"share(row.denied, row.total)\"></span> }\n </span>\n </span>\n </button>\n </li>\n }\n </ol>\n @if (failed()) {\n <p class=\"muted top__error\" role=\"status\">{{ text.topsError }}</p>\n }\n } @else {\n <p class=\"muted\">{{ loading() ? text.loading : failed() ? text.topsError : text.noTop }}</p>\n }\n @if (total() > 0) {\n <div class=\"top__pager\">\n <span class=\"top__range\" role=\"status\">{{ range() }}</span>\n @if (total() > pageSize()) {\n <span class=\"top__buttons\">\n <hm-icon-button [label]=\"fmt(text.topsPrevious, { name: heading() })\" icon=\"angle\" iconDirection=\"left\"\n emphasis=\"subtle\" size=\"small\" [disabled]=\"offset() <= 0 || loading()\" (clicked)=\"go(-1)\" />\n <hm-icon-button [label]=\"fmt(text.topsNext, { name: heading() })\" icon=\"angle\" iconDirection=\"right\"\n emphasis=\"subtle\" size=\"small\" [disabled]=\"offset() + pageSize() >= total() || loading()\" (clicked)=\"go(1)\" />\n </span>\n }\n </div>\n }\n </section>\n `,\n styleUrl: './audit-top-card.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class SpineAuditTopCardComponent {\n readonly heading = input.required<string>();\n readonly rows = input.required<readonly AuditTopRow[]>();\n /** Quantos itens o ranking tem no total (todas as páginas). */\n readonly total = input(0);\n readonly offset = input(0);\n readonly pageSize = input(5);\n /** Referência da barra (o maior total do ranking); 0 = o maior da página. */\n readonly max = input(0);\n readonly loading = input(false);\n readonly failed = input(false);\n\n readonly picked = output<AuditTopRow>();\n /** Novo `offset` pedido (anterior/próxima). */\n readonly offsetChange = output<number>();\n\n private readonly messages = inject(SPINE_MESSAGES);\n protected readonly text = this.messages.autoServiceAudit;\n private readonly locale = this.messages.meta.locale;\n protected readonly fmt = formatMessage;\n protected readonly headingId = `spine-audit-top-${nextId++}`;\n\n private readonly reference = computed(() => Math.max(1, this.max(), ...this.rows().map((r) => r.total)));\n\n protected readonly range = computed(() => {\n const from = Math.min(this.total(), this.offset() + 1);\n const to = Math.min(this.total(), this.offset() + Math.max(this.rows().length, 1));\n return formatMessage(this.text.topsRange, { from: this.number(from), to: this.number(to), total: this.number(this.total()) });\n });\n\n protected go(direction: -1 | 1): void {\n const next = Math.max(0, this.offset() + direction * this.pageSize());\n if (next !== this.offset() && next < this.total()) this.offsetChange.emit(next);\n }\n\n /** Fatia (em % da própria barra) de falhas/negados dentro do total da linha. */\n protected share(part: number, total: number): number {\n return total > 0 ? Math.min(100, (part / total) * 100) : 0;\n }\n\n protected bar(total: number): number {\n return Math.max(2, Math.round((total / this.reference()) * 100));\n }\n\n protected number(n: number): string {\n return new Intl.NumberFormat(this.locale).format(n ?? 0);\n }\n\n protected plural(message: PluralMessage, count: number): string {\n return pluralMessage(message, count, this.locale);\n }\n}\n","import {\n ChangeDetectionStrategy, Component, WritableSignal, computed, effect, inject, input, signal, untracked,\n} from '@angular/core';\nimport {\n AlertComponent, ButtonComponent, DataGridCellDirective, DataGridColumn, DataGridComponent, DrawerComponent,\n FilterBarComponent, FilterBarField, FilterBarValue, ProgressComponent, SegmentedControlComponent, SegmentedOption,\n StatCardComponent, StateScreenComponent, StateScreenSituation, SwitchComponent, TagColor, TagComponent,\n} from '@trismegisto/angular';\nimport { PaginationState, PluralMessage, formatMessage, pluralMessage } from '@trismegisto/primitives';\nimport { Router } from '@angular/router';\nimport { SPINE_ADMIN_API, SPINE_MESSAGES } from '@trismegisto/spine';\nimport { AuditTopRow, SpineAuditTopCardComponent } from './audit-top-card.component';\nimport {\n AUDIT_METHODS, AUDIT_OUTCOMES, AUDIT_TOP_KINDS, AUDIT_TOP_PAGE_SIZE, AuditAction, AuditCursorPager, AuditEvent, AuditEventDetail,\n AuditFilterInput, AuditPagerResult, AuditPeriod, AuditQuery, AuditSpanRow, AuditSpanTimeline, AuditStats, AuditTopItem, AuditTopKind, AuditTrace,\n AuditUnit, SpineAuditScope, auditApiBase, auditAppsUrl, auditErrorCode, auditPagerTotal, buildAuditQuery, buildSpanTimeline,\n parseAuditDate, worstOutcome,\n} from './audit.model';\nimport { SpineAuditService } from './audit.service';\n\n/** Eventos por página da tabela, de saída (o servidor aceita até 200 — `AUDIT_MAX_PAGE_SIZE`). */\nexport const AUDIT_PAGE_SIZE = 10;\n/** Opções do seletor de eventos por página (todas dentro do `limit` máximo do servidor). */\nexport const AUDIT_PAGE_SIZES: readonly number[] = [10, 25, 50, 100, 200];\n/** Intervalo da atualização automática (opcional, desligada por padrão). */\nexport const AUDIT_AUTO_REFRESH_MS = 30_000;\n\nconst NO_VALUE = '—';\nconst LEVELS = ['public', 'private', 'protected', 'optional'] as const;\nconst PERMISSIONS = ['allowed', 'forbidden', 'unauthorized', 'public'] as const;\nconst ACTORS = ['user', 'app_token', 'api_token', 'public', 'unauthenticated'] as const;\n\ninterface AuditApp { id: string; name: string }\ninterface DetailField { label: string; value: string; code?: boolean }\ninterface TimelineBar { key: string; summary: string; ok: number; fail: number; denied: number }\ntype ErrorKind = 'range' | 'forbidden' | 'invalid' | 'generic';\n\n/** Estado de um card de ranking (página atual + total no servidor). */\ninterface TopState {\n items: readonly AuditTopItem[];\n total: number;\n offset: number;\n /** O maior total do ranking (1º item da 1ª página) — referência da barra nas páginas seguintes. */\n max: number;\n loading: boolean;\n failed: boolean;\n}\nconst EMPTY_TOP: TopState = { items: [], total: 0, offset: 0, max: 0, loading: false, failed: false };\n\n/**\n * A tela de Auditoria — a MESMA no auto-serviço e no painel central do argos admin. Só muda o escopo:\n * - `scope=\"client\"` + `clientId`: `{adminApi}/auto-service/:clientId/audit/*`, apps do projeto do client\n * (recorte feito no servidor);\n * - `scope=\"admin\"`: `{adminApi}/admin/audit/*`, todos os apps (guard `admin:audit:*` no servidor).\n * `adminApi` vem do input ou do `SPINE_ADMIN_API` (que o `provideAutoService` já fornece).\n *\n * Unidade: por padrão a tela lê AÇÕES (`GET .../actions`, uma linha por trace, coluna \"Spans\", detalhe\n * com os spans numa linha do tempo); o alternador \"Ações | Eventos\" volta à leitura por registro. KPIs,\n * linha do tempo e rankings seguem a unidade escolhida (`unit=` nas agregações).\n *\n * Conteúdo: período rápido (ou datas da faixa de filtros, que vencem), filtros, KPIs (falhas/negados\n * clicáveis viram filtro), linha do tempo, 3 rankings paginados no servidor (`tops/:kind`), a tabela\n * paginada no servidor (cursor) e o detalhe/cadeia (trace) de um evento.\n *\n * Recarga sem piscar: trocar de página (ou atualizar) mantém as linhas atuais à vista com um indicador\n * por cima — a grade só mostra esqueleto na 1ª carga. Toda resposta carrega um número de sequência e a\n * que chega fora de ordem (página/consulta já trocada) é descartada.\n *\n * Importe só de código carregado sob demanda (rota lazy, `import()`): o ponto `@trismegisto/spine/audit`\n * existe para a tela não entrar no bundle inicial de quem só usa o resto do spine.\n */\n@Component({\n selector: 'spine-audit',\n imports: [\n AlertComponent, ButtonComponent, DataGridCellDirective, DataGridComponent, DrawerComponent, FilterBarComponent,\n ProgressComponent, SegmentedControlComponent, SpineAuditTopCardComponent, StatCardComponent, StateScreenComponent,\n SwitchComponent, TagComponent,\n ],\n templateUrl: './audit.component.html',\n styleUrl: './audit.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class SpineAuditComponent {\n /** `admin` = painel central (todos os apps); `client` = apps do projeto do `clientId`. */\n readonly scope = input.required<SpineAuditScope>();\n /** Obrigatório com `scope=\"client\"`. */\n readonly clientId = input<string | null>(null);\n /** Base do argos admin-server; sem ele, vale o `SPINE_ADMIN_API`. */\n readonly adminApi = input<string | null>(null);\n\n private readonly service = inject(SpineAuditService);\n private readonly tokenApi = inject(SPINE_ADMIN_API, { optional: true });\n private readonly messages = inject(SPINE_MESSAGES);\n protected readonly text = this.messages.autoServiceAudit;\n private readonly locale = this.messages.meta.locale;\n protected readonly fmt = formatMessage;\n\n /** Base dos endpoints do escopo; muda → tudo recomeça (filtros, página, detalhe). */\n protected readonly base = computed(() => auditApiBase(this.adminApi() || this.tokenApi, this.scope(), this.clientId()));\n private readonly appsUrl = computed(() => auditAppsUrl(this.adminApi() || this.tokenApi, this.scope(), this.clientId()));\n\n protected readonly period = signal<AuditPeriod>('24h');\n /** Ações (uma linha por trace) ou eventos (cada registro). */\n protected readonly unit = signal<AuditUnit>('actions');\n protected readonly byActions = computed(() => this.unit() === 'actions');\n protected readonly unitOptions: readonly SegmentedOption[] = [\n { value: 'actions', label: this.text.unitActions },\n { value: 'events', label: this.text.unitEvents },\n ];\n /** Textos que mudam com a unidade. */\n protected readonly unitText = computed(() => {\n const t = this.text;\n return this.byActions()\n ? {\n kpiTotal: t.kpiTotalActions, kpiTotalDescription: t.kpiTotalActionsDescription, timelineSummary: t.timelineSummaryActions,\n bucketSummary: t.bucketSummaryActions, timelineEmpty: t.timelineEmptyActions, caption: t.actionsCaption,\n pageItems: t.pageItemsActions, pageError: t.pageErrorActions, emptyTitle: t.emptyTitleActions,\n }\n : {\n kpiTotal: t.kpiTotal, kpiTotalDescription: t.kpiTotalDescription, timelineSummary: t.timelineSummary,\n bucketSummary: t.bucketSummary, timelineEmpty: t.timelineEmpty, caption: t.eventsCaption,\n pageItems: t.pageItems, pageError: t.pageError, emptyTitle: t.emptyTitle,\n };\n });\n protected readonly filterValue = signal<FilterBarValue>({});\n protected readonly apps = signal<readonly AuditApp[]>([]);\n\n protected readonly stats = signal<AuditStats | null>(null);\n protected readonly events = signal<readonly AuditEvent[]>([]);\n protected readonly loading = signal(false);\n protected readonly pageLoading = signal(false);\n protected readonly pageFailed = signal(false);\n protected readonly pageState = signal<PaginationState>({ page: 1, size: AUDIT_PAGE_SIZE });\n protected readonly pageSizes = AUDIT_PAGE_SIZES;\n /** A página mostrada (posição + \"tem mais\") e o total exato quando a lista já chegou ao fim. */\n private readonly loaded = signal<AuditPagerResult | null>(null);\n private readonly listEnd = signal<number | null>(null);\n /** Total do rodapé da tabela. */\n protected readonly total = computed(() => auditPagerTotal(this.stats()?.total, this.listEnd(), this.loaded()));\n protected readonly errorKind = signal<ErrorKind | null>(null);\n private readonly errorDetail = signal('');\n protected readonly lastUpdated = signal<Date | null>(null);\n protected readonly autoRefresh = signal(false);\n\n /** Esqueleto da grade só quando ainda não há linha nenhuma para mostrar (1ª carga). */\n protected readonly gridSkeleton = computed(() => this.loading() && this.events().length === 0);\n /** Recarga com linhas à vista: elas ficam, com o indicador por cima. */\n protected readonly gridBusy = computed(() => (this.loading() || this.pageLoading()) && this.events().length > 0);\n\n protected readonly tops: Readonly<Record<AuditTopKind, WritableSignal<TopState>>> = {\n apps: signal(EMPTY_TOP),\n operations: signal(EMPTY_TOP),\n users: signal(EMPTY_TOP),\n };\n protected readonly topPageSize = AUDIT_TOP_PAGE_SIZE;\n\n protected readonly detailOpen = signal(false);\n protected readonly selected = signal<AuditEventDetail | null>(null);\n protected readonly detailLoading = signal(false);\n protected readonly detailFailed = signal(false);\n protected readonly trace = signal<AuditTrace | null>(null);\n /** A ação aberta (linha da tabela por ações): agregados que o detalhe do evento raiz não traz. */\n protected readonly selectedAction = signal<AuditAction | null>(null);\n /** O detalhe mostra a ação (o raiz dela), não um span qualquer da cadeia. */\n protected readonly showingAction = computed(() => {\n const a = this.selectedAction();\n return !!a && a.event_id === this.selected()?.event_id;\n });\n /** Resultado do cabeçalho do detalhe: o da ação (pior dos spans) ou o do evento. */\n protected readonly headOutcome = computed(() => {\n if (!this.showingAction()) return this.selected()?.outcome;\n const spans = this.trace()?.items;\n if (spans?.length) return worstOutcome(spans.map((s) => s.outcome));\n return this.selectedAction()!.outcome ?? this.selected()?.outcome;\n });\n /** Os spans da cadeia numa linha do tempo (hierarquia por parent_span_id). */\n protected readonly spanTimeline = computed<AuditSpanTimeline | null>(() => {\n const tr = this.trace();\n return tr ? buildSpanTimeline(tr.items) : null;\n });\n protected readonly traceLoading = signal(false);\n protected readonly traceFailed = signal(false);\n\n /** Consulta da última carga — a troca de página usa a mesma (mesma janela absoluta). */\n private query: AuditQuery | null = null;\n /** Cursores da consulta atual (consulta nova = pager novo). */\n private pager = new AuditCursorPager();\n /** Descartam respostas velhas (consulta/página/ranking/detalhe já trocados). */\n private seq = 0;\n private pageSeq = 0;\n private detailSeq = 0;\n private readonly topSeq: Record<AuditTopKind, number> = { apps: 0, operations: 0, users: 0 };\n\n protected readonly periodOptions: readonly SegmentedOption[] = [\n { value: '1h', label: this.text.periodLastHour },\n { value: '6h', label: this.text.period6h },\n { value: '24h', label: this.text.period24h },\n { value: '7d', label: this.text.period7d },\n { value: '30d', label: this.text.period30d },\n ];\n\n /** Há mais de um app à vista: coluna, filtro e ranking \"por aplicação\" aparecem. */\n protected readonly multiApp = computed(() => this.apps().length > 1 || this.tops.apps().total > 1);\n\n /** As datas da faixa estão valendo (a escolha rápida fica sem efeito). */\n protected readonly customDates = computed(() => {\n const dates = (this.filterValue() as AuditFilterInput).dates;\n return !!dates && !!(dates.start || dates.end);\n });\n\n protected readonly hasFilters = computed(() => Object.keys(this.filterValue()).length > 0);\n protected readonly selectedOutcome = computed(() => (this.filterValue() as AuditFilterInput).outcome ?? null);\n protected readonly storageKey = computed(() => `spine-audit-${this.scope()}`);\n\n protected readonly filterFields = computed<FilterBarField[]>(() => {\n const t = this.text;\n const options = <T extends string>(values: readonly T[], label: (v: T) => string) => values.map((v) => ({ value: v, label: label(v) }));\n const fields: FilterBarField[] = [{ key: 'dates', label: t.filterDates, type: 'date-range' }];\n if (this.multiApp()) {\n fields.push({ key: 'app', label: t.filterApp, type: 'multiselect', options: this.apps().map((a) => ({ value: a.id, label: a.name })) });\n }\n fields.push(\n { key: 'user', label: t.filterUser, type: 'text', placeholder: t.userPlaceholder },\n { key: 'operation', label: t.filterOperation, type: 'text', placeholder: t.operationPlaceholder },\n { key: 'method', label: t.filterMethod, type: 'select', options: options(AUDIT_METHODS, (m) => this.methodLabel(m)) },\n { key: 'outcome', label: t.filterOutcome, type: 'select', options: options(AUDIT_OUTCOMES, (o) => this.outcomeLabel(o)) },\n );\n // Por ação, \"só ações do usuário\" não se aplica (toda linha já é uma ação).\n if (!this.byActions()) fields.push({ key: 'entry', label: t.filterEntry, type: 'boolean' });\n fields.push(\n { key: 'level', label: t.filterLevel, type: 'select', options: options(LEVELS, (l) => this.levelLabel(l)) },\n { key: 'permission_result', label: t.filterPermission, type: 'select', options: options(PERMISSIONS, (p) => this.permissionLabel(p)) },\n { key: 'actor_type', label: t.filterActor, type: 'select', options: options(ACTORS, (a) => this.actorLabel(a)) },\n { key: 'status', label: t.filterStatus, type: 'text', placeholder: t.statusPlaceholder },\n { key: 'trace_id', label: t.filterTrace, type: 'text', placeholder: t.tracePlaceholder },\n { key: 'user_id', label: t.filterUserId, type: 'text', placeholder: t.userIdPlaceholder },\n );\n return fields;\n });\n\n protected readonly errorSituation = computed<StateScreenSituation>(() => {\n const kind = this.errorKind();\n return kind === 'forbidden' ? 'forbidden' : kind === 'range' || kind === 'invalid' ? 'attention' : 'error';\n });\n protected readonly errorText = computed(() => {\n switch (this.errorKind()) {\n case 'forbidden': return this.scope() === 'admin' ? this.text.forbiddenAdmin : this.text.forbidden;\n case 'range': return this.text.rangeTooLarge;\n case 'invalid': return formatMessage(this.text.invalidFilter, { detail: this.errorDetail() }).trim();\n default: return this.text.errorText;\n }\n });\n\n protected readonly empty = computed(() => !this.loading() && !this.errorKind() && !!this.stats() && this.stats()!.total === 0 && this.events().length === 0);\n\n protected readonly columns = computed<DataGridColumn<AuditEvent>[]>(() => {\n const t = this.text;\n const cols: DataGridColumn<AuditEvent>[] = [\n { key: 'occurred_at', title: t.colWhen, value: (e) => this.dateTime(e.occurred_at), initialWidth: '11rem' },\n ];\n if (this.multiApp()) cols.push({ key: 'app', title: t.colApp, value: (e) => e.app_name ?? NO_VALUE });\n cols.push(\n { key: 'user', title: t.colUser, value: (e) => this.userName(e) },\n // Só o identificador; a descrição fica na dica da célula e no detalhe do evento.\n { key: 'operation', title: t.colOperation, value: (e) => this.operationName(e) },\n );\n if (this.byActions()) {\n cols.push({ key: 'spans', title: t.colSpans, value: (e) => this.number((e as AuditAction).span_count ?? 1), align: 'end', initialWidth: '5rem' });\n }\n cols.push(\n { key: 'method', title: t.colMethod, value: (e) => this.methodLabel(e.operation_method), initialWidth: '8rem' },\n { key: 'outcome', title: t.colOutcome, value: (e) => this.outcomeLabel(e.outcome), initialWidth: '8rem' },\n { key: 'status', title: t.colStatus, value: (e) => (e.status == null ? NO_VALUE : String(e.status)), align: 'end', initialWidth: '5rem' },\n { key: 'duration', title: t.colDuration, value: (e) => this.duration(e.duration_ms), align: 'end', initialWidth: '7rem' },\n );\n return cols.map((c) => ({ sortable: false, filterable: false, ...c }));\n });\n protected readonly rowId = (e: AuditEvent): string => e.event_id;\n\n protected readonly timelineBars = computed<TimelineBar[]>(() => {\n const buckets = this.stats()?.timeline ?? [];\n const max = Math.max(1, ...buckets.map((b) => b.total));\n return buckets.map((b) => {\n const failures = Math.min(b.failures, b.total);\n const denied = Math.min(b.denied, b.total - failures);\n return {\n key: b.bucket,\n summary: formatMessage(this.unitText().bucketSummary, {\n time: this.bucketTime(b.bucket), total: this.number(b.total), failures: this.number(b.failures), denied: this.number(b.denied),\n }),\n ok: ((b.total - failures - denied) / max) * 100,\n fail: (failures / max) * 100,\n denied: (denied / max) * 100,\n };\n });\n });\n protected readonly timelineEdges = computed(() => {\n const buckets = this.stats()?.timeline ?? [];\n if (!buckets.length) return null;\n return { from: this.bucketTime(buckets[0].bucket), to: this.bucketTime(buckets[buckets.length - 1].bucket) };\n });\n protected readonly hasTimeline = computed(() => (this.stats()?.timeline ?? []).some((b) => b.total > 0));\n\n protected readonly topOperationRows = computed<AuditTopRow[]>(() =>\n this.tops.operations().items.map((o) => ({\n key: `${o.app_id ?? ''}|${o.operation_identifier ?? ''}`,\n name: o.operation_identifier || o.operation_label || NO_VALUE,\n suffix: this.multiApp() ? o.app_name : null,\n hint: o.operation_label,\n total: o.total, failures: o.failures, denied: o.denied,\n disabled: !o.operation_identifier,\n })),\n );\n protected readonly topUserRows = computed<AuditTopRow[]>(() =>\n this.tops.users().items.map((u) => ({\n key: u.user_id ?? u.user_name ?? '',\n name: this.userName({ user_name: u.user_name ?? null, user_id: u.user_id ?? null }),\n total: u.total, failures: u.failures, denied: u.denied,\n disabled: !u.user_name && !u.user_id,\n })),\n );\n protected readonly topAppRows = computed<AuditTopRow[]>(() =>\n this.tops.apps().items.map((a) => ({\n key: a.app_id ?? '',\n name: a.app_name || a.app_id || NO_VALUE,\n total: a.total, failures: a.failures, denied: a.denied,\n disabled: !a.app_id,\n })),\n );\n\n protected readonly detailFields = computed<DetailField[]>(() => {\n const e = this.selected();\n if (!e) return [];\n const t = this.text;\n const fields: (DetailField | null)[] = [\n { label: t.fieldWhen, value: this.dateTime(e.occurred_at) },\n { label: t.fieldOutcome, value: this.outcomeLabel(e.outcome) },\n { label: t.fieldOrigin, value: e.entry ? t.originEntry : t.originInternal },\n e.app_name ? { label: t.fieldApp, value: e.app_name } : null,\n { label: t.fieldUser, value: this.userName(e) },\n e.actor_type ? { label: t.fieldActor, value: this.actorLabel(e.actor_type) } : null,\n e.client_ip ? { label: t.fieldIp, value: e.client_ip, code: true } : null,\n e.operation_identifier ? { label: t.fieldIdentifier, value: e.operation_identifier, code: true } : null,\n e.operation_label ? { label: t.fieldOperation, value: e.operation_label } : null,\n e.operation_method ? { label: t.fieldMethod, value: this.methodLabel(e.operation_method) } : null,\n e.operation_level ? { label: t.fieldLevel, value: this.levelLabel(e.operation_level) } : null,\n e.permission_result ? { label: t.fieldPermission, value: this.permissionLabel(e.permission_result) } : null,\n e.status != null ? { label: t.fieldStatus, value: String(e.status) } : null,\n e.duration_ms != null ? { label: t.fieldDuration, value: this.duration(e.duration_ms) } : null,\n e.route_name || e.route_id ? { label: t.fieldRoute, value: e.route_name ?? e.route_id ?? '' } : null,\n e.target_type || e.target_id ? { label: t.fieldTarget, value: [e.target_type, e.target_id].filter(Boolean).join(' · '), code: true } : null,\n e.message ? { label: t.fieldMessage, value: e.message } : null,\n e.trace_id ? { label: t.fieldTrace, value: e.trace_id, code: true } : null,\n { label: t.fieldEventId, value: e.event_id, code: true },\n e.received_at ? { label: t.fieldReceivedAt, value: this.dateTime(e.received_at) } : null,\n e.service_instance ? { label: t.fieldInstance, value: e.service_instance, code: true } : null,\n e.sdk ? { label: t.fieldSdk, value: e.sdk, code: true } : null,\n ];\n return fields.filter((f): f is DetailField => !!f);\n });\n\n protected readonly detailsJson = computed(() => {\n const details = this.selected()?.details;\n if (details === undefined || details === null) return '';\n if (typeof details === 'object' && Object.keys(details as object).length === 0) return '';\n try {\n return typeof details === 'string' ? details : JSON.stringify(details, null, 2);\n } catch {\n return String(details);\n }\n });\n\n constructor() {\n // Escopo/client novo (ou o primeiro): zera filtros/detalhe e carrega de novo. `untracked` porque a\n // carga lê `period`/`filterValue` — essas mudanças recarregam pelos próprios handlers.\n effect(() => {\n const base = this.base();\n const appsUrl = this.appsUrl();\n untracked(() => {\n // 1ª carga: filtros e evento vindos da URL (links do dashboard: `?from&to&app_id&event_id…`).\n const fromUrl = this.urlConsumed ? null : this.readUrlState();\n this.urlConsumed = true;\n this.filterValue.set(fromUrl?.filters ?? {});\n this.firstPage();\n this.closeDetail();\n this.events.set([]);\n this.loaded.set(null);\n this.listEnd.set(null);\n this.stats.set(null);\n for (const kind of AUDIT_TOP_KINDS) this.tops[kind].set(EMPTY_TOP);\n void this.loadApps(appsUrl);\n if (base) {\n void this.reload().then(() => {\n if (fromUrl?.event) {\n if (this.byActions()) void this.openAction({ ...(fromUrl.event as AuditEvent), span_count: 0 });\n else void this.openEvent(fromUrl.event as AuditEvent);\n }\n });\n }\n });\n });\n // Atualização automática (opcional): só quando nada está carregando.\n effect((onCleanup) => {\n if (!this.autoRefresh()) return;\n const timer = setInterval(() => {\n if (!this.loading() && !this.pageLoading()) void this.reload();\n }, AUDIT_AUTO_REFRESH_MS);\n onCleanup(() => clearInterval(timer));\n });\n }\n\n private readonly router = inject(Router, { optional: true });\n private urlConsumed = false;\n\n /** Filtros/evento da query string (`from`, `to` ISO; `app_id` repetível; demais filtros pelo nome). */\n private readUrlState(): { filters: FilterBarValue; event: Partial<AuditEvent> | null } | null {\n if (!this.router) return null;\n const q = this.router.parseUrl(this.router.url).queryParamMap;\n if (!q.keys.length) return null;\n const filters: Record<string, unknown> = {};\n const day = (iso: string | null) => (iso ? iso.slice(0, 10) : null);\n if (q.has('from') || q.has('to')) filters['dates'] = { start: day(q.get('from')), end: day(q.get('to')) };\n const apps = q.getAll('app_id');\n if (apps.length) filters['app'] = apps;\n for (const key of ['user', 'operation', 'method', 'outcome', 'level', 'permission_result', 'actor_type', 'status', 'trace_id', 'user_id']) {\n const v = q.get(key);\n if (v) filters[key] = v;\n }\n if (q.get('entry') === 'true') filters['entry'] = true;\n const unit = q.get('unit');\n if (unit === 'actions' || unit === 'events') this.unit.set(unit);\n const eventId = q.get('event_id');\n const occurredAt = q.get('occurred_at');\n const event = eventId && occurredAt ? { event_id: eventId, occurred_at: occurredAt, trace_id: q.get('trace_id') ?? undefined } : null;\n return { filters: filters as FilterBarValue, event: event as Partial<AuditEvent> | null };\n }\n\n // ---- ações ------------------------------------------------------------------------------------\n\n protected setPeriod(value: string): void {\n if (value === this.period()) return;\n this.period.set(value as AuditPeriod);\n this.firstPage();\n void this.reload();\n }\n\n protected setUnit(value: string): void {\n if (value === this.unit() || (value !== 'actions' && value !== 'events')) return;\n this.unit.set(value);\n this.closeDetail();\n this.firstPage();\n void this.reload();\n }\n\n protected setFilters(value: FilterBarValue): void {\n this.filterValue.set(value);\n this.firstPage();\n void this.reload();\n }\n\n private firstPage(): void {\n this.pageState.update((s) => ({ ...s, page: 1 }));\n }\n\n protected clearFilters(): void {\n this.setFilters({});\n }\n\n /** Clique num item de ranking ou atalho: vira filtro (soma aos que já estão). */\n protected filterBy(key: keyof AuditFilterInput, value: string | readonly string[] | null | undefined): void {\n if (!value || (Array.isArray(value) && !value.length)) return;\n this.setFilters({ ...this.filterValue(), [key]: value } as FilterBarValue);\n }\n\n protected pickTop(kind: AuditTopKind, row: AuditTopRow): void {\n if (kind === 'apps') {\n this.filterBy('app', [row.key]);\n } else if (kind === 'operations') {\n this.filterBy('operation', row.key.slice(row.key.indexOf('|') + 1));\n } else {\n const user = this.tops.users().items.find((u) => (u.user_id ?? u.user_name ?? '') === row.key);\n if (user?.user_name) this.filterBy('user', user.user_name);\n else if (user?.user_id) this.filterBy('user_id', user.user_id);\n }\n }\n\n /** KPI \"Falhas\"/\"Negados\" clicável: liga/desliga o filtro de resultado. */\n protected toggleOutcome(outcome: 'failure' | 'denied', on: boolean): void {\n const next = { ...this.filterValue() } as Record<string, unknown>;\n if (on) next['outcome'] = outcome;\n else delete next['outcome'];\n this.setFilters(next as FilterBarValue);\n }\n\n /** Recarrega resumo, rankings e a página atual com a janela recalculada (`now` novo, cursores descartados). */\n async reload(): Promise<void> {\n const base = this.base();\n const seq = ++this.seq;\n const pageSeq = ++this.pageSeq;\n this.pager = new AuditCursorPager();\n this.pageLoading.set(false);\n this.pageFailed.set(false);\n this.errorKind.set(null);\n this.errorDetail.set('');\n if (!base) return;\n\n const built = buildAuditQuery(this.period(), this.filterValue() as AuditFilterInput, new Date());\n if (!built.ok) {\n this.query = null;\n this.clearData();\n this.errorKind.set('range');\n return;\n }\n // Por ação, `entry` não se aplica; `unit` faz stats/tops contarem na unidade escolhida.\n const query: AuditQuery = { ...built.query, unit: this.unit() };\n if (this.byActions()) delete query.entry;\n this.query = query;\n this.loading.set(true);\n for (const kind of AUDIT_TOP_KINDS) void this.loadTop(kind, 0);\n try {\n const pager = this.pager;\n const { page, size } = this.pageState();\n const [stats, result] = await Promise.all([\n this.service.stats(base, query, { tops: false }),\n pager.page((page - 1) * size, size, this.fetcher(base, query)),\n ]);\n if (seq !== this.seq) return;\n this.stats.set(stats);\n // Uma troca de página feita durante a recarga (mesma consulta) vence a página desta carga.\n if (pageSeq === this.pageSeq) this.showPage(result, size, pager);\n this.lastUpdated.set(new Date());\n } catch (err) {\n if (seq !== this.seq) return;\n this.clearData();\n this.setError(err);\n } finally {\n if (seq === this.seq) this.loading.set(false);\n }\n }\n\n /** Rodapé da tabela mudou de página ou de itens por página: busca só aquela página, mesma consulta. */\n async changePage(state: PaginationState): Promise<void> {\n this.pageState.set(state);\n const query = this.query;\n const base = this.base();\n if (!query || !base) return;\n const seq = this.seq;\n const pageSeq = ++this.pageSeq;\n const pager = this.pager;\n const current = () => seq === this.seq && pageSeq === this.pageSeq;\n this.pageLoading.set(true);\n this.pageFailed.set(false);\n try {\n const result = await pager.page((state.page - 1) * state.size, state.size, this.fetcher(base, query));\n if (current()) this.showPage(result, state.size, pager);\n } catch {\n if (current()) this.pageFailed.set(true);\n } finally {\n if (current()) this.pageLoading.set(false);\n }\n }\n\n /** Card de ranking pediu outra página (mesma consulta da última carga). */\n async loadTop(kind: AuditTopKind, offset: number): Promise<void> {\n const base = this.base();\n const query = this.query;\n if (!base || !query) return;\n const seq = ++this.topSeq[kind];\n const state = this.tops[kind];\n state.update((s) => ({ ...s, loading: true, failed: false }));\n try {\n const page = await this.service.tops(base, kind, query, { offset, limit: AUDIT_TOP_PAGE_SIZE });\n if (seq !== this.topSeq[kind]) return;\n const items = page.items ?? [];\n state.update((s) => ({\n items, total: page.total ?? items.length, offset, loading: false, failed: false,\n max: offset === 0 ? (items[0]?.total ?? 0) : s.max,\n }));\n } catch {\n if (seq === this.topSeq[kind]) state.update((s) => ({ ...s, loading: false, failed: true }));\n }\n }\n\n private fetcher(base: string, query: AuditQuery) {\n return query.unit === 'events'\n ? (cursor: string | null, limit: number) => this.service.events(base, query, { limit, cursor })\n : (cursor: string | null, limit: number) => this.service.actions(base, query, { limit, cursor });\n }\n\n private showPage(result: AuditPagerResult, size: number, pager: AuditCursorPager): void {\n this.events.set(result.items);\n this.loaded.set(result);\n this.listEnd.set(pager.end);\n // Pedido além do fim (o total encolheu): o pager devolveu a última página que existe.\n const page = Math.floor(result.offset / size) + 1;\n if (page !== this.pageState().page || size !== this.pageState().size) this.pageState.set({ page, size });\n }\n\n private clearData(): void {\n this.stats.set(null);\n this.events.set([]);\n this.loaded.set(null);\n this.listEnd.set(null);\n for (const kind of AUDIT_TOP_KINDS) {\n this.topSeq[kind]++;\n this.tops[kind].set(EMPTY_TOP);\n }\n }\n\n /** Clique numa linha da tabela: por ação abre o raiz e já carrega os spans; por evento, só o evento. */\n protected openRow(row: AuditEvent): void {\n if (this.byActions()) void this.openAction(row as AuditAction);\n else void this.openEvent(row);\n }\n\n /** Abre uma ação: o detalhe do evento raiz + a linha do tempo dos spans (trace) carregada junto. */\n async openAction(action: AuditAction): Promise<void> {\n const opening = this.openEvent(action);\n this.selectedAction.set(action);\n if (action.trace_id) void this.showTrace();\n await opening;\n }\n\n /** Abre o detalhe com o resumo da linha e completa com o evento inteiro. Da cadeia, mantém a cadeia. */\n async openEvent(event: AuditEvent, keepTrace = false): Promise<void> {\n const base = this.base();\n if (!base) return;\n const seq = ++this.detailSeq;\n const sameTrace = keepTrace && !!event.trace_id && this.trace() !== null && this.selected()?.trace_id === event.trace_id;\n if (!sameTrace) this.selectedAction.set(null);\n this.selected.set(event);\n this.detailOpen.set(true);\n this.detailFailed.set(false);\n if (!sameTrace) {\n this.trace.set(null);\n this.traceFailed.set(false);\n }\n this.detailLoading.set(true);\n try {\n const detail = await this.service.event(base, event.event_id, event.occurred_at);\n if (seq === this.detailSeq) this.selected.set({ ...event, ...detail });\n } catch {\n if (seq === this.detailSeq) this.detailFailed.set(true);\n } finally {\n if (seq === this.detailSeq) this.detailLoading.set(false);\n }\n }\n\n async showTrace(): Promise<void> {\n const base = this.base();\n const origin = this.selected();\n const traceId = origin?.trace_id;\n if (!base || !traceId) return;\n const seq = this.detailSeq;\n this.traceLoading.set(true);\n this.traceFailed.set(false);\n try {\n const trace = await this.service.trace(base, traceId, origin.occurred_at);\n if (seq === this.detailSeq) this.trace.set({ items: trace.items ?? [], hidden_count: trace.hidden_count ?? 0 });\n } catch {\n if (seq === this.detailSeq) this.traceFailed.set(true);\n } finally {\n if (seq === this.detailSeq) this.traceLoading.set(false);\n }\n }\n\n /** \"Filtrar a tabela por este trace\" (do detalhe): fecha o detalhe e aplica o filtro. */\n protected filterByTrace(traceId: string | null): void {\n if (!traceId) return;\n this.closeDetail();\n this.filterBy('trace_id', traceId);\n }\n\n protected onDetailOpenChange(open: boolean): void {\n if (!open) this.closeDetail();\n }\n\n private closeDetail(): void {\n this.detailSeq++;\n this.detailOpen.set(false);\n this.detailLoading.set(false);\n this.selectedAction.set(null);\n this.trace.set(null);\n this.traceLoading.set(false);\n this.traceFailed.set(false);\n }\n\n private async loadApps(url: string | null): Promise<void> {\n if (!url) {\n this.apps.set([]);\n return;\n }\n try {\n const res = await this.service.apps(url);\n if (url !== this.appsUrl()) return;\n const apps = (res.apps ?? []).map((a) => ({ id: a.id, name: a.name }));\n this.apps.set(apps.sort((a, b) => a.name.localeCompare(b.name, this.locale)));\n } catch {\n // Sem a lista (ex.: sem permissão de listar apps), o filtro de aplicação some; o resto não depende dela.\n if (url === this.appsUrl()) this.apps.set([]);\n }\n }\n\n private setError(err: unknown): void {\n const { status, code, detail } = auditErrorCode(err);\n if (code === 'range_too_large') this.errorKind.set('range');\n else if (status === 403) this.errorKind.set('forbidden');\n else if (status === 400 && (code === 'invalid_filter' || code === 'invalid_cursor')) {\n this.errorKind.set('invalid');\n this.errorDetail.set(detail);\n } else this.errorKind.set('generic');\n }\n\n // ---- formatação -------------------------------------------------------------------------------\n\n protected number(n: number): string {\n return new Intl.NumberFormat(this.locale).format(n ?? 0);\n }\n\n protected plural(message: PluralMessage, count: number): string {\n return pluralMessage(message, count, this.locale);\n }\n\n protected share(part: number): string {\n const total = this.stats()?.total ?? 0;\n const ratio = total > 0 ? part / total : 0;\n return formatMessage(this.text.kpiShare, {\n percent: new Intl.NumberFormat(this.locale, { style: 'percent', maximumFractionDigits: 1 }).format(ratio),\n });\n }\n\n protected dateTime(iso: string | null | undefined): string {\n if (!iso) return NO_VALUE;\n const d = parseAuditDate(iso);\n return d ? new Intl.DateTimeFormat(this.locale, { dateStyle: 'short', timeStyle: 'medium' }).format(d) : iso;\n }\n\n protected time(iso: string): string {\n const d = parseAuditDate(iso);\n return d ? new Intl.DateTimeFormat(this.locale, { timeStyle: 'medium' }).format(d) : iso;\n }\n\n protected clock(d: Date): string {\n return new Intl.DateTimeFormat(this.locale, { timeStyle: 'medium' }).format(d);\n }\n\n /** Rótulo do intervalo da linha do tempo: hora no dia, dia+hora até 3 dias, só o dia acima. */\n private bucketTime(iso: string): string {\n const d = parseAuditDate(iso);\n if (!d) return iso;\n const buckets = this.stats()?.timeline ?? [];\n const edge = (i: number) => parseAuditDate(buckets[i].bucket)?.getTime() ?? 0;\n const span = buckets.length > 1 ? edge(buckets.length - 1) - edge(0) : 0;\n const day = 24 * 60 * 60 * 1000;\n const opts: Intl.DateTimeFormatOptions =\n span <= day ? { hour: '2-digit', minute: '2-digit' }\n : span <= 3 * day ? { day: '2-digit', month: '2-digit', hour: '2-digit', minute: '2-digit' }\n : { day: '2-digit', month: '2-digit' };\n return new Intl.DateTimeFormat(this.locale, opts).format(d);\n }\n\n protected duration(ms: number | null | undefined): string {\n return ms == null ? NO_VALUE : formatMessage(this.text.durationMs, { ms: this.number(Math.round(ms)) });\n }\n\n protected userName(e: { user_name: string | null; user_id?: string | null }): string {\n return e.user_name || e.user_id || this.text.anonymous;\n }\n\n /** Rótulo acessível de uma linha da linha do tempo dos spans. */\n protected spanAria(row: AuditSpanRow): string {\n return formatMessage(this.text.spanRow, {\n app: row.event.app_name ?? NO_VALUE,\n operation: this.operationName(row.event),\n outcome: this.outcomeLabel(row.event.outcome),\n offset: this.duration(row.offsetMs),\n duration: this.duration(row.event.duration_ms),\n });\n }\n\n /** Dica da célula \"Spans\": aplicações envolvidas (+ spans de fora do escopo). */\n protected spansHint(a: AuditAction): string {\n const parts: string[] = [];\n if (a.apps?.length) parts.push(formatMessage(this.text.spansApps, { apps: a.apps.join(', ') }));\n if (a.hidden_count) parts.push(this.plural(this.text.spansHidden, a.hidden_count));\n return parts.join(' · ');\n }\n\n /** Nome da operação = o identificador (a descrição é complemento: dica e detalhe). */\n protected operationName(e: { operation_label: string | null; operation_identifier: string | null }): string {\n return e.operation_identifier || e.operation_label || NO_VALUE;\n }\n\n protected methodLabel(method: string | null | undefined): string {\n const t = this.text;\n switch (method) {\n case 'read': return t.methodRead;\n case 'write': return t.methodWrite;\n case 'delete': return t.methodDelete;\n case 'stream': return t.methodStream;\n default: return method || NO_VALUE;\n }\n }\n\n protected levelLabel(level: string | null | undefined): string {\n const t = this.text;\n switch (level) {\n case 'public': return t.levelPublic;\n case 'private': return t.levelPrivate;\n case 'protected': return t.levelProtected;\n case 'optional': return t.levelOptional;\n default: return level || NO_VALUE;\n }\n }\n\n protected permissionLabel(result: string | null | undefined): string {\n const t = this.text;\n switch (result) {\n case 'allowed': return t.permissionAllowed;\n case 'forbidden': return t.permissionForbidden;\n case 'unauthorized': return t.permissionUnauthorized;\n case 'public': return t.permissionPublic;\n default: return result || NO_VALUE;\n }\n }\n\n protected actorLabel(actor: string | null | undefined): string {\n const t = this.text;\n switch (actor) {\n case 'user': return t.actorUser;\n case 'app_token': return t.actorAppToken;\n case 'api_token': return t.actorApiToken;\n case 'public': return t.actorPublic;\n case 'unauthenticated': return t.actorUnauthenticated;\n default: return actor || NO_VALUE;\n }\n }\n\n protected outcomeLabel(outcome: string | null | undefined): string {\n const t = this.text;\n switch (outcome) {\n case 'success': return t.outcomeSuccess;\n case 'failure': return t.outcomeFailure;\n case 'denied': return t.outcomeDenied;\n default: return outcome || NO_VALUE;\n }\n }\n\n protected outcomeColor(outcome: string | null | undefined): TagColor {\n return outcome === 'success' ? 'success' : outcome === 'failure' ? 'danger' : outcome === 'denied' ? 'warning' : 'neutral';\n }\n}\n","<div class=\"audit\" [attr.aria-busy]=\"loading() || pageLoading()\">\n <!-- Período (escolha rápida; as datas da faixa de filtros vencem) + atualizar. -->\n <div class=\"audit__toolbar\">\n <!-- Unidade: por ação (uma linha por trace, padrão) ou por evento (cada registro). -->\n <hm-segmented-control\n [label]=\"text.unitLabel\"\n [options]=\"unitOptions\"\n [value]=\"unit()\"\n (valueChange)=\"setUnit($event)\"\n size=\"small\"\n emphasis=\"action\"\n />\n <hm-segmented-control\n [label]=\"text.period\"\n [options]=\"periodOptions\"\n [value]=\"period()\"\n (valueChange)=\"setPeriod($event)\"\n size=\"small\"\n emphasis=\"action\"\n />\n @if (customDates()) {\n <span class=\"muted audit__period-note\">{{ text.periodFromFilters }}</span>\n }\n <span class=\"audit__toolbar-end\">\n @if (lastUpdated(); as at) {\n <span class=\"muted audit__updated\" aria-live=\"polite\">{{ fmt(text.updatedAt, { time: clock(at) }) }}</span>\n }\n <hm-switch [label]=\"text.autoRefresh\" [value]=\"autoRefresh()\" (valueChange)=\"autoRefresh.set($event)\" />\n <hm-button emphasis=\"medium\" size=\"small\" icon=\"refresh\" [loading]=\"loading()\" (clicked)=\"reload()\">{{ text.refresh }}</hm-button>\n </span>\n </div>\n\n <hm-filter-bar\n class=\"audit__filters\"\n [label]=\"text.filters\"\n [filters]=\"filterFields()\"\n [value]=\"filterValue()\"\n (valueChange)=\"setFilters($event)\"\n [savedFilters]=\"true\"\n [storageKey]=\"storageKey()\"\n />\n\n @if (errorKind()) {\n <hm-state-screen\n class=\"audit__state\"\n [situation]=\"errorSituation()\"\n [heading]=\"text.errorTitle\"\n [description]=\"errorText()\"\n [action]=\"errorKind() === 'generic' ? text.retry : (hasFilters() ? text.clearFilters : '')\"\n actionIcon=\"refresh\"\n (actionTriggered)=\"errorKind() === 'generic' ? reload() : clearFilters()\"\n />\n } @else if (empty()) {\n <hm-state-screen\n class=\"audit__state\"\n situation=\"empty\"\n [heading]=\"unitText().emptyTitle\"\n [description]=\"text.emptyText\"\n [action]=\"hasFilters() ? text.clearFilters : ''\"\n (actionTriggered)=\"clearFilters()\"\n />\n } @else {\n <!-- KPIs: falhas/negados são filtros (alternância). -->\n <section class=\"audit__kpis\" [attr.aria-label]=\"text.kpis\">\n <hm-stat-card\n icon=\"list\"\n [label]=\"unitText().kpiTotal\"\n [value]=\"number(stats()?.total ?? 0)\"\n [description]=\"unitText().kpiTotalDescription\"\n [loading]=\"loading() && !stats()\"\n />\n <hm-stat-card\n icon=\"error-standard\"\n [label]=\"text.kpiFailures\"\n [value]=\"number(stats()?.by_outcome?.failure ?? 0)\"\n [intent]=\"(stats()?.by_outcome?.failure ?? 0) > 0 ? 'danger' : 'neutral'\"\n [description]=\"fmt(text.kpiFilterHint, { share: share(stats()?.by_outcome?.failure ?? 0) })\"\n [loading]=\"loading() && !stats()\"\n selectable\n [selected]=\"selectedOutcome() === 'failure'\"\n (selectedChange)=\"toggleOutcome('failure', $event)\"\n />\n <hm-stat-card\n icon=\"ban\"\n [label]=\"text.kpiDenied\"\n [value]=\"number(stats()?.by_outcome?.denied ?? 0)\"\n [intent]=\"(stats()?.by_outcome?.denied ?? 0) > 0 ? 'warning' : 'neutral'\"\n [description]=\"fmt(text.kpiFilterHint, { share: share(stats()?.by_outcome?.denied ?? 0) })\"\n [loading]=\"loading() && !stats()\"\n selectable\n [selected]=\"selectedOutcome() === 'denied'\"\n (selectedChange)=\"toggleOutcome('denied', $event)\"\n />\n </section>\n\n <!-- Linha do tempo: barras empilhadas em CSS (sucesso embaixo, falha, negado). Cada barra tem\n o resumo em texto (title + aria-label); o gráfico não é a única forma de ler o número. -->\n <section class=\"card card-block audit__timeline\" aria-labelledby=\"audit-timeline-title\">\n <h3 class=\"audit__section-title\" id=\"audit-timeline-title\">{{ text.timeline }}</h3>\n @if (hasTimeline()) {\n <ol class=\"timeline\" [attr.aria-label]=\"fmt(unitText().timelineSummary, { from: timelineEdges()?.from ?? '', to: timelineEdges()?.to ?? '' })\">\n @for (bar of timelineBars(); track bar.key) {\n <li class=\"timeline__bar\" [attr.title]=\"bar.summary\" [attr.aria-label]=\"bar.summary\">\n <span class=\"timeline__seg timeline__seg--denied\" [style.height.%]=\"bar.denied\"></span>\n <span class=\"timeline__seg timeline__seg--fail\" [style.height.%]=\"bar.fail\"></span>\n <span class=\"timeline__seg timeline__seg--ok\" [style.height.%]=\"bar.ok\"></span>\n </li>\n }\n </ol>\n <div class=\"timeline__axis\" aria-hidden=\"true\">\n <span>{{ timelineEdges()?.from }}</span>\n <span>{{ timelineEdges()?.to }}</span>\n </div>\n <ul class=\"timeline__legend\">\n <li><span class=\"swatch swatch--ok\"></span>{{ text.outcomeSuccess }}</li>\n <li><span class=\"swatch swatch--fail\"></span>{{ text.outcomeFailure }}</li>\n <li><span class=\"swatch swatch--denied\"></span>{{ text.outcomeDenied }}</li>\n </ul>\n } @else {\n <p class=\"muted\">{{ loading() ? text.loading : unitText().timelineEmpty }}</p>\n }\n </section>\n\n <!-- Rankings paginados no servidor (tops/:kind). Clicar num item vira filtro. -->\n <div class=\"audit__tops\" [class.audit__tops--three]=\"multiApp()\">\n @if (multiApp()) {\n <spine-audit-top-card\n class=\"audit__top audit__top--apps\"\n [heading]=\"text.topApps\"\n [rows]=\"topAppRows()\"\n [total]=\"tops.apps().total\"\n [offset]=\"tops.apps().offset\"\n [max]=\"tops.apps().max\"\n [pageSize]=\"topPageSize\"\n [loading]=\"tops.apps().loading\"\n [failed]=\"tops.apps().failed\"\n (offsetChange)=\"loadTop('apps', $event)\"\n (picked)=\"pickTop('apps', $event)\"\n />\n }\n <spine-audit-top-card\n class=\"audit__top audit__top--operations\"\n [heading]=\"text.topOperations\"\n [rows]=\"topOperationRows()\"\n [total]=\"tops.operations().total\"\n [offset]=\"tops.operations().offset\"\n [max]=\"tops.operations().max\"\n [pageSize]=\"topPageSize\"\n [loading]=\"tops.operations().loading\"\n [failed]=\"tops.operations().failed\"\n (offsetChange)=\"loadTop('operations', $event)\"\n (picked)=\"pickTop('operations', $event)\"\n />\n <spine-audit-top-card\n class=\"audit__top audit__top--users\"\n [heading]=\"text.topUsers\"\n [rows]=\"topUserRows()\"\n [total]=\"tops.users().total\"\n [offset]=\"tops.users().offset\"\n [max]=\"tops.users().max\"\n [pageSize]=\"topPageSize\"\n [loading]=\"tops.users().loading\"\n [failed]=\"tops.users().failed\"\n (offsetChange)=\"loadTop('users', $event)\"\n (picked)=\"pickTop('users', $event)\"\n />\n </div>\n\n <!-- Tabela: paginação no servidor. A grade não corta nada ([paginated]=false): mostra a página que veio\n (limit = itens por página) e o rodapé usa o total do resumo (mesma consulta). Esqueleto só na 1ª\n carga; nas seguintes as linhas ficam e o indicador aparece por cima (sem piscar). -->\n <div class=\"audit__grid\" [class.audit__grid--busy]=\"gridBusy()\" [attr.aria-busy]=\"gridBusy()\">\n @if (gridBusy()) {\n <hm-progress class=\"audit__grid-progress\" indeterminate [label]=\"text.updating\" labelHidden />\n }\n <hm-data-grid\n [caption]=\"unitText().caption\"\n [columns]=\"columns()\"\n [rows]=\"events()\"\n [rowId]=\"rowId\"\n [loading]=\"gridSkeleton()\"\n [filterable]=\"false\"\n [paginated]=\"false\"\n [totalItems]=\"total()\"\n [pageState]=\"pageState()\"\n (pageStateChange)=\"changePage($event)\"\n [pageSizes]=\"pageSizes\"\n [itemsLabel]=\"unitText().pageItems\"\n [pageSizeLabel]=\"text.pageSize\"\n remoteSort\n rowClickable\n (rowClicked)=\"openRow($event)\"\n >\n <ng-template hmCell=\"operation\" let-item>\n <span class=\"audit__op\" [attr.title]=\"item.operation_label || null\">{{ operationName(item) }}</span>\n </ng-template>\n <ng-template hmCell=\"spans\" let-item>\n <span class=\"audit__spans\" [attr.title]=\"spansHint(item) || null\">\n {{ number(item.span_count ?? 1) }}\n @if (item.orphan) {\n <hm-tag class=\"audit__orphan\" [name]=\"text.orphanTag\" color=\"neutral\" />\n }\n </span>\n </ng-template>\n <ng-template hmCell=\"outcome\" let-item>\n <hm-tag [name]=\"outcomeLabel(item.outcome)\" [color]=\"outcomeColor(item.outcome)\" />\n </ng-template>\n </hm-data-grid>\n </div>\n\n @if (pageFailed()) {\n <hm-alert class=\"audit__page-error\" variant=\"error\" size=\"small\">{{ unitText().pageError }}</hm-alert>\n }\n }\n</div>\n\n<!-- Detalhe do evento + a cadeia (trace). -->\n<hm-drawer [open]=\"detailOpen()\" (openChange)=\"onDetailOpenChange($event)\" [heading]=\"showingAction() ? text.actionDetailHeading : text.detailHeading\">\n @if (selected(); as ev) {\n <div class=\"detail\">\n <div class=\"detail__head\">\n <strong class=\"detail__title\">{{ operationName(ev) }}</strong>\n <hm-tag [name]=\"outcomeLabel(headOutcome())\" [color]=\"outcomeColor(headOutcome())\" />\n </div>\n @if (showingAction() && selectedAction()?.orphan) {\n <hm-alert class=\"detail__orphan\" variant=\"info\" size=\"small\">{{ text.orphanNote }}</hm-alert>\n }\n @if (ev.operation_label && ev.operation_identifier) {\n <p class=\"muted detail__description\">{{ ev.operation_label }}</p>\n }\n\n @if (detailLoading()) {\n <p class=\"muted\" role=\"status\">{{ text.detailLoading }}</p>\n }\n @if (detailFailed()) {\n <hm-alert variant=\"warning\" size=\"small\">{{ text.detailError }}</hm-alert>\n }\n\n <dl class=\"detail__list\">\n @for (field of detailFields(); track field.label) {\n <div class=\"detail__row\">\n <dt>{{ field.label }}</dt>\n <dd>\n @if (field.code) { <code>{{ field.value }}</code> } @else { {{ field.value }} }\n </dd>\n </div>\n }\n </dl>\n\n @if (detailsJson()) {\n <h3 class=\"audit__section-title\">{{ text.fieldDetails }}</h3>\n <pre class=\"detail__json\">{{ detailsJson() }}</pre>\n }\n\n <!-- Por ação, os spans sobem para logo abaixo do cabeçalho (order no CSS); por evento, ficam no fim. -->\n @if (ev.trace_id) {\n <div class=\"detail__chain\" [class.detail__chain--first]=\"showingAction()\">\n <div class=\"detail__actions\">\n @if (!trace() && !traceLoading()) {\n <hm-button emphasis=\"medium\" size=\"small\" icon=\"tree-view\" (clicked)=\"showTrace()\">{{ text.viewTrace }}</hm-button>\n }\n <hm-button emphasis=\"minimal\" size=\"small\" icon=\"filter\" (clicked)=\"filterByTrace(ev.trace_id)\">{{ text.filterByTrace }}</hm-button>\n </div>\n @if (traceLoading()) {\n <p class=\"muted\" role=\"status\">{{ text.traceLoading }}</p>\n }\n @if (traceFailed()) {\n <hm-alert variant=\"error\" size=\"small\">{{ text.traceError }}</hm-alert>\n }\n @if (trace(); as tr) {\n <section class=\"trace\" aria-labelledby=\"audit-trace-title\">\n <h3 class=\"audit__section-title\" id=\"audit-trace-title\">{{ showingAction() ? text.spansHeading : text.traceHeading }}</h3>\n @if (tr.hidden_count) {\n <hm-alert class=\"trace__hidden\" variant=\"info\" size=\"small\">{{ plural(text.traceHidden, tr.hidden_count) }}</hm-alert>\n }\n @if (!tr.items.length) {\n <p class=\"muted\">{{ text.traceEmpty }}</p>\n } @else if (spanTimeline(); as tl) {\n <p class=\"muted trace__summary\">{{ fmt(text.spansSummary, { count: number(tl.rows.length), duration: duration(tl.totalMs) }) }}</p>\n <!-- Linha do tempo: cada span é uma linha (recuo = profundidade pela cadeia parent_span_id) com a\n barra posicionada no tempo, proporcional à duração. O texto da linha (e o aria-label) traz\n tudo o que a barra mostra. -->\n <ol class=\"spans\">\n @for (row of tl.rows; track row.event.event_id) {\n <li class=\"spans__item\" [class.spans__item--current]=\"row.event.event_id === ev.event_id\">\n <button type=\"button\" class=\"spans__link\"\n [attr.aria-current]=\"row.event.event_id === ev.event_id ? 'true' : null\"\n [attr.aria-label]=\"spanAria(row)\"\n (click)=\"openEvent(row.event, true)\">\n <span class=\"spans__head\" [style.padding-inline-start.rem]=\"row.depth * 1\">\n <span class=\"spans__app\">{{ row.event.app_name ?? '' }}</span>\n <code class=\"spans__op\">{{ operationName(row.event) }}</code>\n </span>\n <hm-tag class=\"spans__tag\" [name]=\"outcomeLabel(row.event.outcome)\" [color]=\"outcomeColor(row.event.outcome)\" />\n <span class=\"spans__dur\">{{ duration(row.event.duration_ms) }}</span>\n <span class=\"spans__track\" aria-hidden=\"true\">\n <span class=\"spans__bar spans__bar--{{ row.event.outcome }}\" [style.left.%]=\"row.left\" [style.width.%]=\"row.width\"></span>\n </span>\n </button>\n </li>\n }\n </ol>\n }\n </section>\n }\n </div>\n }\n </div>\n }\n</hm-drawer>\n","/*\n * @trismegisto/spine/audit — a tela de Auditoria (leitura de `audit.events` do argos admin-server), a mesma\n * para o painel central (`scope=\"admin\"`) e para o auto-serviço (`scope=\"client\"` + `clientId`).\n *\n * Este ponto de entrada EXPORTA o componente: importe-o só de código carregado sob demanda (rota lazy,\n * `import('@trismegisto/spine/audit')`). O `@trismegisto/spine/auto-service` só o alcança por `import()`\n * dentro dos chunks das telas dele — `scripts/check-lazy.mjs` falha se o arquivo do ponto `auto-service`\n * passar a importá-lo estaticamente.\n */\nexport * from './audit.model';\nexport * from './audit.service';\nexport { SpineAuditComponent, AUDIT_PAGE_SIZE, AUDIT_PAGE_SIZES, AUDIT_AUTO_REFRESH_MS } from './audit.component';\nexport { SpineAuditTopCardComponent, type AuditTopRow } from './audit-top-card.component';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import * as i0 from '@angular/core';
|
|
2
|
+
import { signal, ChangeDetectionStrategy, Component } from '@angular/core';
|
|
3
|
+
import { SpineAuditComponent } from '@trismegisto/spine/audit';
|
|
4
|
+
import { A as AutoServiceClientPickerComponent } from './trismegisto-spine-auto-service-auto-service-client-picker.component-Z0wCANF6.mjs';
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Tela "Auditoria" do auto-serviço (router `AUTO_SERVICE_AUDIT_TEMPLATE_ROUTER_ID`): o dono/membro
|
|
8
|
+
* do projeto escolhe o client (como em Aplicações) e vê os eventos dos apps dele — com a MESMA tela do
|
|
9
|
+
* painel central (`SpineAuditComponent`, `@trismegisto/spine/audit`), no escopo `client`. Carregada só
|
|
10
|
+
* por `AUTO_SERVICE_SCREENS.audit` — nunca exportada pelo ponto de entrada (ver `public-api.ts`).
|
|
11
|
+
*/
|
|
12
|
+
class AutoServiceAuditComponent {
|
|
13
|
+
constructor() {
|
|
14
|
+
this.client = signal(null, ...(ngDevMode ? [{ debugName: "client" }] : /* istanbul ignore next */ []));
|
|
15
|
+
}
|
|
16
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.24", ngImport: i0, type: AutoServiceAuditComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
17
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.24", type: AutoServiceAuditComponent, isStandalone: true, selector: "spine-auto-service-audit", ngImport: i0, template: `
|
|
18
|
+
<spine-auto-service-client-picker (clientChange)="client.set($event)" />
|
|
19
|
+
@if (client(); as c) {
|
|
20
|
+
<br />
|
|
21
|
+
<spine-audit scope="client" [clientId]="c.id" />
|
|
22
|
+
}
|
|
23
|
+
`, isInline: true, styles: [".as-stack{display:flex;flex-direction:column;gap:var(--hm-space-md);min-inline-size:0}.as-actions{display:flex;flex-wrap:wrap;justify-content:flex-end;gap:var(--hm-space-xs)}.as-field-row{display:flex;flex-wrap:wrap;align-items:flex-end;gap:var(--hm-space-sm)}.as-field-row>:first-child{flex:1 1 20rem;min-inline-size:0}.as-summary{display:flex;flex-wrap:wrap;align-items:center;gap:var(--hm-space-sm)}.as-summary__info{display:flex;flex:1 1 16rem;flex-direction:column;gap:var(--hm-space-micro);min-inline-size:0}.as-summary__title{display:flex;flex-wrap:wrap;align-items:center;gap:var(--hm-space-xs);margin:0;color:var(--hm-text);font-size:var(--hm-font-size-md);font-weight:var(--hm-font-weight-semibold)}.as-summary__detail{margin:0;color:var(--hm-muted);font-size:var(--hm-font-size-sm)}.muted{color:var(--hm-muted)}\n"], dependencies: [{ kind: "component", type: AutoServiceClientPickerComponent, selector: "spine-auto-service-client-picker", outputs: ["clientChange"] }, { kind: "component", type: SpineAuditComponent, selector: "spine-audit", inputs: ["scope", "clientId", "adminApi"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
24
|
+
}
|
|
25
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.24", ngImport: i0, type: AutoServiceAuditComponent, decorators: [{
|
|
26
|
+
type: Component,
|
|
27
|
+
args: [{ selector: 'spine-auto-service-audit', imports: [AutoServiceClientPickerComponent, SpineAuditComponent], template: `
|
|
28
|
+
<spine-auto-service-client-picker (clientChange)="client.set($event)" />
|
|
29
|
+
@if (client(); as c) {
|
|
30
|
+
<br />
|
|
31
|
+
<spine-audit scope="client" [clientId]="c.id" />
|
|
32
|
+
}
|
|
33
|
+
`, changeDetection: ChangeDetectionStrategy.OnPush, styles: [".as-stack{display:flex;flex-direction:column;gap:var(--hm-space-md);min-inline-size:0}.as-actions{display:flex;flex-wrap:wrap;justify-content:flex-end;gap:var(--hm-space-xs)}.as-field-row{display:flex;flex-wrap:wrap;align-items:flex-end;gap:var(--hm-space-sm)}.as-field-row>:first-child{flex:1 1 20rem;min-inline-size:0}.as-summary{display:flex;flex-wrap:wrap;align-items:center;gap:var(--hm-space-sm)}.as-summary__info{display:flex;flex:1 1 16rem;flex-direction:column;gap:var(--hm-space-micro);min-inline-size:0}.as-summary__title{display:flex;flex-wrap:wrap;align-items:center;gap:var(--hm-space-xs);margin:0;color:var(--hm-text);font-size:var(--hm-font-size-md);font-weight:var(--hm-font-weight-semibold)}.as-summary__detail{margin:0;color:var(--hm-muted);font-size:var(--hm-font-size-sm)}.muted{color:var(--hm-muted)}\n"] }]
|
|
34
|
+
}] });
|
|
35
|
+
|
|
36
|
+
export { AutoServiceAuditComponent };
|
|
37
|
+
//# sourceMappingURL=trismegisto-spine-auto-service-auto-service-audit.component-CCiz-q8o.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"trismegisto-spine-auto-service-auto-service-audit.component-CCiz-q8o.mjs","sources":["../../../projects/ui/auto-service/src/audit/auto-service-audit.component.ts"],"sourcesContent":["import { ChangeDetectionStrategy, Component, signal } from '@angular/core';\nimport { SpineAuditComponent } from '@trismegisto/spine/audit';\nimport { AutoServiceClient, AutoServiceClientPickerComponent } from '../client-picker/auto-service-client-picker.component';\n\n/**\n * Tela \"Auditoria\" do auto-serviço (router `AUTO_SERVICE_AUDIT_TEMPLATE_ROUTER_ID`): o dono/membro\n * do projeto escolhe o client (como em Aplicações) e vê os eventos dos apps dele — com a MESMA tela do\n * painel central (`SpineAuditComponent`, `@trismegisto/spine/audit`), no escopo `client`. Carregada só\n * por `AUTO_SERVICE_SCREENS.audit` — nunca exportada pelo ponto de entrada (ver `public-api.ts`).\n */\n@Component({\n selector: 'spine-auto-service-audit',\n imports: [AutoServiceClientPickerComponent, SpineAuditComponent],\n // Sem título/descrição internos: vêm da barra da página do spine (nome da rota + descrição do router\n // AD100004 e das cópias dele, `web.router.description` -- migration 016 do argos).\n template: `\n <spine-auto-service-client-picker (clientChange)=\"client.set($event)\" />\n @if (client(); as c) {\n <br />\n <spine-audit scope=\"client\" [clientId]=\"c.id\" />\n }\n `,\n styleUrl: './auto-service-audit.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class AutoServiceAuditComponent {\n protected readonly client = signal<AutoServiceClient | null>(null);\n}\n"],"names":[],"mappings":";;;;;AAIA;;;;;AAKG;MAgBU,yBAAyB,CAAA;AAftC,IAAA,WAAA,GAAA;AAgBqB,QAAA,IAAA,CAAA,MAAM,GAAG,MAAM,CAA2B,IAAI,6EAAC;AACnE,IAAA;+GAFY,yBAAyB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAzB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,yBAAyB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,0BAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAV1B;;;;;;GAMT,EAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,0zBAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EATS,gCAAgC,wGAAE,mBAAmB,EAAA,QAAA,EAAA,aAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,UAAA,EAAA,UAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA,CAAA;;4FAapD,yBAAyB,EAAA,UAAA,EAAA,CAAA;kBAfrC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,0BAA0B,WAC3B,CAAC,gCAAgC,EAAE,mBAAmB,CAAC,EAAA,QAAA,EAGtD;;;;;;GAMT,EAAA,eAAA,EAEgB,uBAAuB,CAAC,MAAM,EAAA,MAAA,EAAA,CAAA,0zBAAA,CAAA,EAAA;;;"}
|
package/fesm2022/trismegisto-spine-auto-service-auto-service-client-picker.component-Z0wCANF6.mjs
ADDED
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import * as i0 from '@angular/core';
|
|
2
|
+
import { inject, ChangeDetectorRef, EventEmitter, Output, ChangeDetectionStrategy, Component } from '@angular/core';
|
|
3
|
+
import * as i2 from '@angular/common';
|
|
4
|
+
import { CommonModule } from '@angular/common';
|
|
5
|
+
import { CardComponent, ComboboxComponent } from '@trismegisto/angular';
|
|
6
|
+
import { SPINE_MESSAGES } from '@trismegisto/spine';
|
|
7
|
+
import { AutoServiceService } from './trismegisto-spine-auto-service.mjs';
|
|
8
|
+
|
|
9
|
+
class AutoServiceClientPickerComponent {
|
|
10
|
+
constructor(service) {
|
|
11
|
+
this.service = service;
|
|
12
|
+
this.text = inject(SPINE_MESSAGES).autoService;
|
|
13
|
+
/** Telas com estado em campo comum, preenchido depois de `await`: marca a view ao terminar (app sem zone.js). */
|
|
14
|
+
this.cdr = inject(ChangeDetectorRef);
|
|
15
|
+
this.loading = true;
|
|
16
|
+
this.clients = [];
|
|
17
|
+
this.selectedClientId = '';
|
|
18
|
+
this.clientChange = new EventEmitter();
|
|
19
|
+
}
|
|
20
|
+
get clientOptions() {
|
|
21
|
+
return this.clients.map((c) => ({ value: c.id, label: c.display_name || c.name }));
|
|
22
|
+
}
|
|
23
|
+
async ngOnInit() {
|
|
24
|
+
this.loading = true;
|
|
25
|
+
try {
|
|
26
|
+
const res = await this.service.getMyClients();
|
|
27
|
+
this.clients = res.clients;
|
|
28
|
+
if (this.clients.length === 1)
|
|
29
|
+
this.selectClient(this.clients[0].id);
|
|
30
|
+
}
|
|
31
|
+
finally {
|
|
32
|
+
this.loading = false;
|
|
33
|
+
this.cdr.markForCheck();
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
selectClient(id) {
|
|
37
|
+
this.selectedClientId = id;
|
|
38
|
+
this.clientChange.emit(this.clients.find(c => c.id === id) ?? null);
|
|
39
|
+
}
|
|
40
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.24", ngImport: i0, type: AutoServiceClientPickerComponent, deps: [{ token: AutoServiceService }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
41
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.2.24", type: AutoServiceClientPickerComponent, isStandalone: true, selector: "spine-auto-service-client-picker", outputs: { clientChange: "clientChange" }, ngImport: i0, template: "<hm-card *ngIf=\"loading\">\n <span class=\"muted\">{{ text.loading }}</span>\n</hm-card>\n\n<hm-card *ngIf=\"!loading && clients.length === 0\">\n <span [innerHTML]=\"text.noClients\"></span>\n</hm-card>\n\n<hm-card *ngIf=\"!loading && clients.length > 1\">\n <hm-combobox\n [label]=\"text.pickClient\"\n [options]=\"clientOptions\"\n [value]=\"selectedClientId\"\n (valueChange)=\"selectClient($event)\"\n ></hm-combobox>\n</hm-card>\n", styles: ["@charset \"UTF-8\";.as-stack{display:flex;flex-direction:column;gap:var(--hm-space-md);min-inline-size:0}.as-actions{display:flex;flex-wrap:wrap;justify-content:flex-end;gap:var(--hm-space-xs)}.as-field-row{display:flex;flex-wrap:wrap;align-items:flex-end;gap:var(--hm-space-sm)}.as-field-row>:first-child{flex:1 1 20rem;min-inline-size:0}.as-summary{display:flex;flex-wrap:wrap;align-items:center;gap:var(--hm-space-sm)}.as-summary__info{display:flex;flex:1 1 16rem;flex-direction:column;gap:var(--hm-space-micro);min-inline-size:0}.as-summary__title{display:flex;flex-wrap:wrap;align-items:center;gap:var(--hm-space-xs);margin:0;color:var(--hm-text);font-size:var(--hm-font-size-md);font-weight:var(--hm-font-weight-semibold)}.as-summary__detail{margin:0;color:var(--hm-muted);font-size:var(--hm-font-size-sm)}.muted{color:var(--hm-muted)}:host{display:block}:host:empty{display:none}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: CardComponent, selector: "hm-card", inputs: ["heading", "icon", "selected", "fill", "media", "mediaAlt", "mediaDecorative", "mediaPosition"] }, { kind: "component", type: ComboboxComponent, selector: "hm-combobox", inputs: ["label", "options", "value", "placeholder", "icon", "hint", "help", "size", "labelHidden", "clearable", "requiredManual", "loading", "allowCustomValue"], outputs: ["valueChange"] }], changeDetection: i0.ChangeDetectionStrategy.Eager }); }
|
|
42
|
+
}
|
|
43
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.24", ngImport: i0, type: AutoServiceClientPickerComponent, decorators: [{
|
|
44
|
+
type: Component,
|
|
45
|
+
args: [{ selector: 'spine-auto-service-client-picker', standalone: true, imports: [CommonModule, CardComponent, ComboboxComponent], changeDetection: ChangeDetectionStrategy.Eager, template: "<hm-card *ngIf=\"loading\">\n <span class=\"muted\">{{ text.loading }}</span>\n</hm-card>\n\n<hm-card *ngIf=\"!loading && clients.length === 0\">\n <span [innerHTML]=\"text.noClients\"></span>\n</hm-card>\n\n<hm-card *ngIf=\"!loading && clients.length > 1\">\n <hm-combobox\n [label]=\"text.pickClient\"\n [options]=\"clientOptions\"\n [value]=\"selectedClientId\"\n (valueChange)=\"selectClient($event)\"\n ></hm-combobox>\n</hm-card>\n", styles: ["@charset \"UTF-8\";.as-stack{display:flex;flex-direction:column;gap:var(--hm-space-md);min-inline-size:0}.as-actions{display:flex;flex-wrap:wrap;justify-content:flex-end;gap:var(--hm-space-xs)}.as-field-row{display:flex;flex-wrap:wrap;align-items:flex-end;gap:var(--hm-space-sm)}.as-field-row>:first-child{flex:1 1 20rem;min-inline-size:0}.as-summary{display:flex;flex-wrap:wrap;align-items:center;gap:var(--hm-space-sm)}.as-summary__info{display:flex;flex:1 1 16rem;flex-direction:column;gap:var(--hm-space-micro);min-inline-size:0}.as-summary__title{display:flex;flex-wrap:wrap;align-items:center;gap:var(--hm-space-xs);margin:0;color:var(--hm-text);font-size:var(--hm-font-size-md);font-weight:var(--hm-font-weight-semibold)}.as-summary__detail{margin:0;color:var(--hm-muted);font-size:var(--hm-font-size-sm)}.muted{color:var(--hm-muted)}:host{display:block}:host:empty{display:none}\n"] }]
|
|
46
|
+
}], ctorParameters: () => [{ type: AutoServiceService }], propDecorators: { clientChange: [{
|
|
47
|
+
type: Output
|
|
48
|
+
}] } });
|
|
49
|
+
|
|
50
|
+
export { AutoServiceClientPickerComponent as A };
|
|
51
|
+
//# sourceMappingURL=trismegisto-spine-auto-service-auto-service-client-picker.component-Z0wCANF6.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"trismegisto-spine-auto-service-auto-service-client-picker.component-Z0wCANF6.mjs","sources":["../../../projects/ui/auto-service/src/client-picker/auto-service-client-picker.component.ts","../../../projects/ui/auto-service/src/client-picker/auto-service-client-picker.component.html"],"sourcesContent":["import { Component, EventEmitter, OnInit, Output, ChangeDetectionStrategy, inject, ChangeDetectorRef } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { CardComponent, ComboboxComponent, ComboboxOption } from '@trismegisto/angular';\nimport { AutoServiceService } from '../auto-service.service';\nimport { SPINE_MESSAGES } from '@trismegisto/spine';\n\nexport interface AutoServiceClient {\n id: string;\n name: string;\n display_name: string | null;\n realm_id: string;\n}\n\n@Component({\n selector: 'spine-auto-service-client-picker',\n standalone: true,\n imports: [CommonModule, CardComponent, ComboboxComponent],\n changeDetection: ChangeDetectionStrategy.Eager,\n templateUrl: './auto-service-client-picker.component.html',\n styleUrl: './auto-service-client-picker.component.scss',\n})\nexport class AutoServiceClientPickerComponent implements OnInit {\n protected readonly text = inject(SPINE_MESSAGES).autoService;\n /** Telas com estado em campo comum, preenchido depois de `await`: marca a view ao terminar (app sem zone.js). */\n private readonly cdr = inject(ChangeDetectorRef);\n loading = true;\n clients: AutoServiceClient[] = [];\n selectedClientId = '';\n @Output() clientChange = new EventEmitter<AutoServiceClient | null>();\n constructor(private service: AutoServiceService) {}\n\n get clientOptions(): ComboboxOption[] {\n return this.clients.map((c) => ({ value: c.id, label: c.display_name || c.name }));\n }\n\n async ngOnInit() {\n this.loading = true;\n try {\n const res = await this.service.getMyClients();\n this.clients = res.clients;\n if (this.clients.length === 1) this.selectClient(this.clients[0].id);\n } finally { this.loading = false; this.cdr.markForCheck(); }\n }\n\n selectClient(id: string) {\n this.selectedClientId = id;\n this.clientChange.emit(this.clients.find(c => c.id === id) ?? null);\n }\n}\n","<hm-card *ngIf=\"loading\">\n <span class=\"muted\">{{ text.loading }}</span>\n</hm-card>\n\n<hm-card *ngIf=\"!loading && clients.length === 0\">\n <span [innerHTML]=\"text.noClients\"></span>\n</hm-card>\n\n<hm-card *ngIf=\"!loading && clients.length > 1\">\n <hm-combobox\n [label]=\"text.pickClient\"\n [options]=\"clientOptions\"\n [value]=\"selectedClientId\"\n (valueChange)=\"selectClient($event)\"\n ></hm-combobox>\n</hm-card>\n"],"names":["i1.AutoServiceService"],"mappings":"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"}
|