@trismegisto/spine 2.1.1 → 3.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/README.md +105 -19
- package/fesm2022/trismegisto-spine-audit.mjs +264 -10
- package/fesm2022/trismegisto-spine-audit.mjs.map +1 -1
- package/fesm2022/trismegisto-spine-auto-service-apps.technical-BAKdkVdz.mjs +84 -0
- package/fesm2022/trismegisto-spine-auto-service-apps.technical-BAKdkVdz.mjs.map +1 -0
- package/fesm2022/trismegisto-spine-auto-service-apps.usage-CAXMP5r8.mjs +87 -0
- package/fesm2022/trismegisto-spine-auto-service-apps.usage-CAXMP5r8.mjs.map +1 -0
- package/fesm2022/{trismegisto-spine-auto-service-audit.technical-C901aIIQ.mjs → trismegisto-spine-auto-service-audit.technical-B75d4mh2.mjs} +6 -5
- package/fesm2022/trismegisto-spine-auto-service-audit.technical-B75d4mh2.mjs.map +1 -0
- package/fesm2022/{trismegisto-spine-auto-service-audit.usage-GIJ2RwuH.mjs → trismegisto-spine-auto-service-audit.usage-IdXMruv5.mjs} +9 -8
- package/fesm2022/trismegisto-spine-auto-service-audit.usage-IdXMruv5.mjs.map +1 -0
- package/fesm2022/{trismegisto-spine-auto-service-auto-service-audit.component-CCiz-q8o.mjs → trismegisto-spine-auto-service-auto-service-audit.component-BIL8tH1I.mjs} +4 -4
- package/fesm2022/{trismegisto-spine-auto-service-auto-service-audit.component-CCiz-q8o.mjs.map → trismegisto-spine-auto-service-auto-service-audit.component-BIL8tH1I.mjs.map} +1 -1
- package/fesm2022/{trismegisto-spine-auto-service-auto-service-client-picker.component-Z0wCANF6.mjs → trismegisto-spine-auto-service-auto-service-client-picker.component-CBt_0Uli.mjs} +3 -3
- package/fesm2022/{trismegisto-spine-auto-service-auto-service-client-picker.component-Z0wCANF6.mjs.map → trismegisto-spine-auto-service-auto-service-client-picker.component-CBt_0Uli.mjs.map} +1 -1
- package/fesm2022/{trismegisto-spine-auto-service-auto-service-client.component-C7SPavrX.mjs → trismegisto-spine-auto-service-auto-service-client.component-DAxhZC-a.mjs} +123 -27
- package/fesm2022/trismegisto-spine-auto-service-auto-service-client.component-DAxhZC-a.mjs.map +1 -0
- package/fesm2022/trismegisto-spine-auto-service-auto-service-delete-CoJYTtBU.mjs +87 -0
- package/fesm2022/trismegisto-spine-auto-service-auto-service-delete-CoJYTtBU.mjs.map +1 -0
- package/fesm2022/trismegisto-spine-auto-service-auto-service-groups.component-UVMGF7-B.mjs +544 -0
- package/fesm2022/trismegisto-spine-auto-service-auto-service-groups.component-UVMGF7-B.mjs.map +1 -0
- package/fesm2022/trismegisto-spine-auto-service-auto-service-login-attempts.component-Boi-kG0G.mjs +37 -0
- package/fesm2022/trismegisto-spine-auto-service-auto-service-login-attempts.component-Boi-kG0G.mjs.map +1 -0
- package/fesm2022/trismegisto-spine-auto-service-auto-service.component-DmLafUkX.mjs +943 -0
- package/fesm2022/trismegisto-spine-auto-service-auto-service.component-DmLafUkX.mjs.map +1 -0
- package/fesm2022/{trismegisto-spine-auto-service-client.technical-BHWhpyWv.mjs → trismegisto-spine-auto-service-client.technical-DP5G8i3o.mjs} +24 -3
- package/fesm2022/trismegisto-spine-auto-service-client.technical-DP5G8i3o.mjs.map +1 -0
- package/fesm2022/{trismegisto-spine-auto-service-client.usage-CM2WB2e2.mjs → trismegisto-spine-auto-service-client.usage-CcJANb20.mjs} +15 -6
- package/fesm2022/trismegisto-spine-auto-service-client.usage-CcJANb20.mjs.map +1 -0
- package/fesm2022/trismegisto-spine-auto-service-groups.technical-BlktCM70.mjs +65 -0
- package/fesm2022/trismegisto-spine-auto-service-groups.technical-BlktCM70.mjs.map +1 -0
- package/fesm2022/trismegisto-spine-auto-service-groups.usage-Cz5sCKgn.mjs +81 -0
- package/fesm2022/trismegisto-spine-auto-service-groups.usage-Cz5sCKgn.mjs.map +1 -0
- package/fesm2022/{trismegisto-spine-auto-service-home.component-vl3BPFnk.mjs → trismegisto-spine-auto-service-home.component-5_aji1hf.mjs} +5 -4
- package/fesm2022/trismegisto-spine-auto-service-home.component-5_aji1hf.mjs.map +1 -0
- package/fesm2022/trismegisto-spine-auto-service-login-attempts.technical-CasKIIws.mjs +37 -0
- package/fesm2022/trismegisto-spine-auto-service-login-attempts.technical-CasKIIws.mjs.map +1 -0
- package/fesm2022/trismegisto-spine-auto-service-login-attempts.usage-BMgLNu7W.mjs +60 -0
- package/fesm2022/trismegisto-spine-auto-service-login-attempts.usage-BMgLNu7W.mjs.map +1 -0
- package/fesm2022/trismegisto-spine-auto-service.mjs +49 -29
- package/fesm2022/trismegisto-spine-auto-service.mjs.map +1 -1
- package/fesm2022/trismegisto-spine-layout.mjs +1850 -217
- package/fesm2022/trismegisto-spine-layout.mjs.map +1 -1
- package/fesm2022/trismegisto-spine-shell.mjs +28 -8
- package/fesm2022/trismegisto-spine-shell.mjs.map +1 -1
- package/fesm2022/trismegisto-spine.mjs +1163 -87
- package/fesm2022/trismegisto-spine.mjs.map +1 -1
- package/package.json +6 -6
- package/types/trismegisto-spine-audit.d.ts +180 -5
- package/types/trismegisto-spine-audit.d.ts.map +1 -1
- package/types/trismegisto-spine-auto-service.d.ts +100 -7
- package/types/trismegisto-spine-auto-service.d.ts.map +1 -1
- package/types/trismegisto-spine-layout.d.ts +885 -22
- package/types/trismegisto-spine-layout.d.ts.map +1 -1
- package/types/trismegisto-spine-shell.d.ts +11 -2
- package/types/trismegisto-spine-shell.d.ts.map +1 -1
- package/types/trismegisto-spine.d.ts +496 -34
- package/types/trismegisto-spine.d.ts.map +1 -1
- package/fesm2022/trismegisto-spine-auto-service-apps.technical-ClMKB9cK.mjs +0 -48
- package/fesm2022/trismegisto-spine-auto-service-apps.technical-ClMKB9cK.mjs.map +0 -1
- package/fesm2022/trismegisto-spine-auto-service-apps.usage-Cf5SG-oQ.mjs +0 -55
- package/fesm2022/trismegisto-spine-auto-service-apps.usage-Cf5SG-oQ.mjs.map +0 -1
- package/fesm2022/trismegisto-spine-auto-service-audit.technical-C901aIIQ.mjs.map +0 -1
- package/fesm2022/trismegisto-spine-auto-service-audit.usage-GIJ2RwuH.mjs.map +0 -1
- package/fesm2022/trismegisto-spine-auto-service-auto-service-client.component-C7SPavrX.mjs.map +0 -1
- package/fesm2022/trismegisto-spine-auto-service-auto-service-delete-6Bk46MOf.mjs +0 -39
- package/fesm2022/trismegisto-spine-auto-service-auto-service-delete-6Bk46MOf.mjs.map +0 -1
- package/fesm2022/trismegisto-spine-auto-service-auto-service-groups.component-CqIVe2LU.mjs +0 -357
- package/fesm2022/trismegisto-spine-auto-service-auto-service-groups.component-CqIVe2LU.mjs.map +0 -1
- package/fesm2022/trismegisto-spine-auto-service-auto-service.component-BLN49F4a.mjs +0 -502
- package/fesm2022/trismegisto-spine-auto-service-auto-service.component-BLN49F4a.mjs.map +0 -1
- package/fesm2022/trismegisto-spine-auto-service-client.technical-BHWhpyWv.mjs.map +0 -1
- package/fesm2022/trismegisto-spine-auto-service-client.usage-CM2WB2e2.mjs.map +0 -1
- package/fesm2022/trismegisto-spine-auto-service-groups.technical-jQlwaQPn.mjs +0 -39
- package/fesm2022/trismegisto-spine-auto-service-groups.technical-jQlwaQPn.mjs.map +0 -1
- package/fesm2022/trismegisto-spine-auto-service-groups.usage-Bh7ig2zZ.mjs +0 -54
- package/fesm2022/trismegisto-spine-auto-service-groups.usage-Bh7ig2zZ.mjs.map +0 -1
- package/fesm2022/trismegisto-spine-auto-service-home.component-vl3BPFnk.mjs.map +0 -1
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
// Especificação técnica da tela Aplicações do auto-serviço (`RouteDocument.loadTechnical`), em Markdown. Módulo próprio,
|
|
2
|
+
// carregado só pelo `import()` de `AUTO_SERVICE_DOCUMENTS`: vira um chunk à parte no FESM e fica fora do
|
|
3
|
+
// bundle inicial. Não importe estaticamente nem reexporte no `public-api.ts`.
|
|
4
|
+
var apps_technical = `# Aplicações — especificação técnica
|
|
5
|
+
|
|
6
|
+
Tela \`AutoServiceComponent\` (seletor de client + \`AutoServiceAppsComponent\`), ligada ao router de template
|
|
7
|
+
\`AUTO_SERVICE_APPS_TEMPLATE_ROUTER_ID\` (\`ad100002-…\`). Fala com o argos-admin-server em \`{adminApi}/auto-service\`
|
|
8
|
+
(\`AutoServiceService\`), com o token no cabeçalho \`x-access-token\`.
|
|
9
|
+
|
|
10
|
+
## Endpoints
|
|
11
|
+
|
|
12
|
+
| Ação | Endpoint |
|
|
13
|
+
| --- | --- |
|
|
14
|
+
| Client administrado (só o do token; ver Grupos) | \`GET /auto-service\` |
|
|
15
|
+
| Aplicações do projeto do client | \`GET /auto-service/:clientId/apps\` |
|
|
16
|
+
| Cadastrar (devolve o \`secret\`) | \`POST /auto-service/:clientId/apps\` (\`{ name, allowed_grants }\`) |
|
|
17
|
+
| Editar / ativar / desativar | \`PUT /auto-service/:clientId/apps/:appId\` (\`{ name, allowed_grants, enabled }\` ou só \`{ enabled }\`) |
|
|
18
|
+
| Excluir | \`DELETE /auto-service/:clientId/apps/:appId\` |
|
|
19
|
+
| Gerar novo segredo | \`POST /auto-service/:clientId/apps/:appId/secret\` (resposta \`{ id, secret }\`, \`no-store\`) |
|
|
20
|
+
| Operações registradas | \`GET /auto-service/:clientId/apps/:appId/operations\` |
|
|
21
|
+
| Grupos com acesso (consumers) | \`GET /auto-service/:clientId/apps/:appId/consumers\` (\`{ consumers: [{ consumer_id, group_id, group_name, group_type_name, group_type_level, group_is_admin, app_id, app_name, created_at }] }\`) |
|
|
22
|
+
| Grupos oferecidos em "Novo acesso" | \`GET /auto-service/:clientId/groups\` |
|
|
23
|
+
| Novo acesso | \`POST /auto-service/:clientId/apps/:appId/consumers\` (\`{ group_id }\`) |
|
|
24
|
+
| Remover acesso | \`DELETE /auto-service/:clientId/apps/consumers/:consumerId\` |
|
|
25
|
+
| Operações liberadas ao grupo | \`GET /auto-service/:clientId/apps/consumers/:consumerId/permissions\` |
|
|
26
|
+
| Liberar / retirar operação | \`POST .../consumers/:consumerId/permissions\` (\`{ operation_id }\`) / \`DELETE .../permissions/:permissionId\` |
|
|
27
|
+
| Tokens de API da aplicação | \`GET /auto-service/:clientId/apps/:appId/tokens\` (\`{ tokens: [{ id, consumer_id, name, description, token_prefix, expires_at, revoked_at, created_at, last_used_at }] }\`) |
|
|
28
|
+
| Novo token | \`POST /auto-service/:clientId/apps/:appId/tokens\` (\`{ name, description?, expires_at, operation_ids? }\`; resposta 201 \`{ id, consumer_id, name, token }\`) |
|
|
29
|
+
| Revogar token | \`DELETE /auto-service/:clientId/apps/:appId/tokens/:tokenId\` (204) |
|
|
30
|
+
| Operações do token (consumer dele) | as mesmas rotas de \`.../apps/consumers/:consumerId/permissions\` acima |
|
|
31
|
+
|
|
32
|
+
## Tela
|
|
33
|
+
|
|
34
|
+
- Tabela (\`hm-data-grid\`, \`AutoServiceAppsComponent\`) com Nome/Grants/Situação, **Cadastrar** na barra e, no menu da
|
|
35
|
+
linha (primeira coluna), Editar, Desativar/Ativar (só a que cabe na situação), Gerar novo segredo e Excluir (com o
|
|
36
|
+
\`confirm\` da grade). Clicar na linha (\`rowClickable\`) ou no botão do nome abre a aplicação embaixo: resumo com as
|
|
37
|
+
mesmas ações e as abas Operações, Acessos e Tokens. Não há mais combobox + "Consultar".
|
|
38
|
+
- Recarregar a lista (salvar, ativar, excluir) mantém a aplicação aberta com os dados novos ou a fecha se sumiu;
|
|
39
|
+
trocar de client fecha a aplicação aberta.
|
|
40
|
+
|
|
41
|
+
## Regras
|
|
42
|
+
|
|
43
|
+
- **Autorização** (\`clientAdminGuard\`): grupo que administra o projeto do client + crachá Administrador ativo.
|
|
44
|
+
App, consumer ou grupo de outro client responde 404, nunca 403 (\`assertAppBelongsToClient\`,
|
|
45
|
+
\`assertConsumerBelongsToClient\`, \`assertBodyGroupVisibleToClient\`).
|
|
46
|
+
- **Grupo de administração fora da aba Acessos** (decisão 32 do Argos): o servidor não lista o consumer dele, recusa
|
|
47
|
+
\`POST .../consumers\` com ele (404 "Grupo não encontrado") e responde 404 às permissões e à remoção dele. A tela
|
|
48
|
+
ainda descarta, por defesa, o consumer com \`group_is_admin: true\` e o grupo com \`is_admin: true\` em "Novo
|
|
49
|
+
acesso" (servidor antigo). Consumers de token de API (aba Tokens) não são grupo e não mudam.
|
|
50
|
+
- O \`secret\` só vem na resposta do \`POST\`; a tela mostra num \`hm-alert\` até ser fechado e não o guarda.
|
|
51
|
+
- Grants: texto separado por vírgula, enviado como lista (\`allowed_grants\`) sem itens vazios.
|
|
52
|
+
- **Excluir** passa por \`HermesDialogService.confirm\` (perigo, com o nome da aplicação) e **Remover** (acesso) pelo
|
|
53
|
+
\`confirm\` da ação no \`hm-data-grid\`; só depois do sim sai o \`DELETE\`. Sucesso e falha viram toast
|
|
54
|
+
(\`AutoServiceDeleteFeedback\`: \`deleteDone\`, ou o \`detail\` do servidor / \`deleteError\`). **Ativar/Desativar** chama o
|
|
55
|
+
servidor direto (reversível).
|
|
56
|
+
- O \`secret\` exibido some ao trocar de client e ao excluir a aplicação.
|
|
57
|
+
- **Gerar novo segredo** passa por \`HermesDialogService.confirm\` (perigo) e mostra o segredo num \`hm-modal\` com
|
|
58
|
+
\`hm-copy-button\`, uma vez: fechar (Concluir, Esc) descarta. Falha vira toast: 404 (aplicação de outro client),
|
|
59
|
+
403 (client que a pessoa não administra) ou o \`detail\` do servidor / \`rotateSecretError\`.
|
|
60
|
+
- Ids nos caminhos vão codificados (\`urlPath\` de \`@trismegisto/primitives\`).
|
|
61
|
+
- As abas são preguiçosas (\`*hmTabContent\`): cada uma só busca ao ser aberta. Abrir outra aplicação volta para
|
|
62
|
+
**Operações**.
|
|
63
|
+
- **Gerenciar operações** cruza \`operations\` com \`permissions\` (por \`operation_id\`) e grava só a diferença, em
|
|
64
|
+
sequência: primeiro as liberações, depois as retiradas. Só \`protected\` depende de permissão: operação de outro nível
|
|
65
|
+
sem permissão gravada vem marcada e desabilitada (\`free\`) e fica fora da diferença; com uma permissão antiga, segue
|
|
66
|
+
editável para dar para retirar (o servidor recusa liberar uma não protegida com 400 \`operation_not_protected\`).
|
|
67
|
+
Falha vira toast (\`autoServiceErrorText\`, ou \`permissionsSaveError\`) e o painel fica aberto.
|
|
68
|
+
- **Tokens** (\`AutoServiceAppTokensComponent\`, \`AutoServiceTokenCreateComponent\`; mirror da aba Tokens do
|
|
69
|
+
argos-admin): situação calculada no cliente (\`revoked_at\` → Revogado; \`expires_at\` vencido → Expirado; senão
|
|
70
|
+
Ativo). **Novo token** relê as operações da aplicação: \`protected\` escolhíveis, as outras marcadas e desabilitadas e
|
|
71
|
+
nunca enviadas em \`operation_ids\`. Validade num \`hm-date-picker\` de amanhã até hoje + 365 dias (padrão 90), enviada
|
|
72
|
+
como a meia-noite LOCAL do dia (\`localDayStartIso\`) — o servidor aceita só datas no futuro e até agora + 365 dias.
|
|
73
|
+
O \`token\` da resposta aparece uma única vez no modal (\`hm-copy-button\`); fechar descarta. Revogar passa pelo
|
|
74
|
+
\`confirm\` da grade e vira toast; o token fica na lista como revogado, sem ações. "Gerenciar operações" do token abre
|
|
75
|
+
o painel de permissões com o \`consumer_id\` do token (o nome no lugar do grupo).
|
|
76
|
+
- **Erros dos tokens** (\`autoServiceErrorText\`, pt-BR/en/es em \`autoService.tokenErrors\`): \`invalid_expires_at\`,
|
|
77
|
+
\`invalid_validity\`, \`invalid_operation_ids\`, \`operation_not_protected\`; 404 com \`error\` falando de aplicação ou de
|
|
78
|
+
token vira \`appNotFound\`/\`tokenNotFound\`; senão o \`detail\` do servidor e, por último, \`tokenSaveError\` /
|
|
79
|
+
\`tokenRevokeError\` / \`tokensLoadError\`. Erro ao criar aparece no modal (que continua aberto).
|
|
80
|
+
- A auditoria das aplicações tem tela própria (Auditoria, \`ad100004-…\`).
|
|
81
|
+
`;
|
|
82
|
+
|
|
83
|
+
export { apps_technical as default };
|
|
84
|
+
//# sourceMappingURL=trismegisto-spine-auto-service-apps.technical-BAKdkVdz.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"trismegisto-spine-auto-service-apps.technical-BAKdkVdz.mjs","sources":["../../../projects/ui/auto-service/src/docs/apps.technical.ts"],"sourcesContent":["// Especificação técnica da tela Aplicações do auto-serviço (`RouteDocument.loadTechnical`), em Markdown. Módulo próprio,\n// carregado só pelo `import()` de `AUTO_SERVICE_DOCUMENTS`: vira um chunk à parte no FESM e fica fora do\n// bundle inicial. Não importe estaticamente nem reexporte no `public-api.ts`.\nexport default `# Aplicações — especificação técnica\n\nTela \\`AutoServiceComponent\\` (seletor de client + \\`AutoServiceAppsComponent\\`), ligada ao router de template\n\\`AUTO_SERVICE_APPS_TEMPLATE_ROUTER_ID\\` (\\`ad100002-…\\`). Fala com o argos-admin-server em \\`{adminApi}/auto-service\\`\n(\\`AutoServiceService\\`), com o token no cabeçalho \\`x-access-token\\`.\n\n## Endpoints\n\n| Ação | Endpoint |\n| --- | --- |\n| Client administrado (só o do token; ver Grupos) | \\`GET /auto-service\\` |\n| Aplicações do projeto do client | \\`GET /auto-service/:clientId/apps\\` |\n| Cadastrar (devolve o \\`secret\\`) | \\`POST /auto-service/:clientId/apps\\` (\\`{ name, allowed_grants }\\`) |\n| Editar / ativar / desativar | \\`PUT /auto-service/:clientId/apps/:appId\\` (\\`{ name, allowed_grants, enabled }\\` ou só \\`{ enabled }\\`) |\n| Excluir | \\`DELETE /auto-service/:clientId/apps/:appId\\` |\n| Gerar novo segredo | \\`POST /auto-service/:clientId/apps/:appId/secret\\` (resposta \\`{ id, secret }\\`, \\`no-store\\`) |\n| Operações registradas | \\`GET /auto-service/:clientId/apps/:appId/operations\\` |\n| Grupos com acesso (consumers) | \\`GET /auto-service/:clientId/apps/:appId/consumers\\` (\\`{ consumers: [{ consumer_id, group_id, group_name, group_type_name, group_type_level, group_is_admin, app_id, app_name, created_at }] }\\`) |\n| Grupos oferecidos em \"Novo acesso\" | \\`GET /auto-service/:clientId/groups\\` |\n| Novo acesso | \\`POST /auto-service/:clientId/apps/:appId/consumers\\` (\\`{ group_id }\\`) |\n| Remover acesso | \\`DELETE /auto-service/:clientId/apps/consumers/:consumerId\\` |\n| Operações liberadas ao grupo | \\`GET /auto-service/:clientId/apps/consumers/:consumerId/permissions\\` |\n| Liberar / retirar operação | \\`POST .../consumers/:consumerId/permissions\\` (\\`{ operation_id }\\`) / \\`DELETE .../permissions/:permissionId\\` |\n| Tokens de API da aplicação | \\`GET /auto-service/:clientId/apps/:appId/tokens\\` (\\`{ tokens: [{ id, consumer_id, name, description, token_prefix, expires_at, revoked_at, created_at, last_used_at }] }\\`) |\n| Novo token | \\`POST /auto-service/:clientId/apps/:appId/tokens\\` (\\`{ name, description?, expires_at, operation_ids? }\\`; resposta 201 \\`{ id, consumer_id, name, token }\\`) |\n| Revogar token | \\`DELETE /auto-service/:clientId/apps/:appId/tokens/:tokenId\\` (204) |\n| Operações do token (consumer dele) | as mesmas rotas de \\`.../apps/consumers/:consumerId/permissions\\` acima |\n\n## Tela\n\n- Tabela (\\`hm-data-grid\\`, \\`AutoServiceAppsComponent\\`) com Nome/Grants/Situação, **Cadastrar** na barra e, no menu da\n linha (primeira coluna), Editar, Desativar/Ativar (só a que cabe na situação), Gerar novo segredo e Excluir (com o\n \\`confirm\\` da grade). Clicar na linha (\\`rowClickable\\`) ou no botão do nome abre a aplicação embaixo: resumo com as\n mesmas ações e as abas Operações, Acessos e Tokens. Não há mais combobox + \"Consultar\".\n- Recarregar a lista (salvar, ativar, excluir) mantém a aplicação aberta com os dados novos ou a fecha se sumiu;\n trocar de client fecha a aplicação aberta.\n\n## Regras\n\n- **Autorização** (\\`clientAdminGuard\\`): grupo que administra o projeto do client + crachá Administrador ativo.\n App, consumer ou grupo de outro client responde 404, nunca 403 (\\`assertAppBelongsToClient\\`,\n \\`assertConsumerBelongsToClient\\`, \\`assertBodyGroupVisibleToClient\\`).\n- **Grupo de administração fora da aba Acessos** (decisão 32 do Argos): o servidor não lista o consumer dele, recusa\n \\`POST .../consumers\\` com ele (404 \"Grupo não encontrado\") e responde 404 às permissões e à remoção dele. A tela\n ainda descarta, por defesa, o consumer com \\`group_is_admin: true\\` e o grupo com \\`is_admin: true\\` em \"Novo\n acesso\" (servidor antigo). Consumers de token de API (aba Tokens) não são grupo e não mudam.\n- O \\`secret\\` só vem na resposta do \\`POST\\`; a tela mostra num \\`hm-alert\\` até ser fechado e não o guarda.\n- Grants: texto separado por vírgula, enviado como lista (\\`allowed_grants\\`) sem itens vazios.\n- **Excluir** passa por \\`HermesDialogService.confirm\\` (perigo, com o nome da aplicação) e **Remover** (acesso) pelo\n \\`confirm\\` da ação no \\`hm-data-grid\\`; só depois do sim sai o \\`DELETE\\`. Sucesso e falha viram toast\n (\\`AutoServiceDeleteFeedback\\`: \\`deleteDone\\`, ou o \\`detail\\` do servidor / \\`deleteError\\`). **Ativar/Desativar** chama o\n servidor direto (reversível).\n- O \\`secret\\` exibido some ao trocar de client e ao excluir a aplicação.\n- **Gerar novo segredo** passa por \\`HermesDialogService.confirm\\` (perigo) e mostra o segredo num \\`hm-modal\\` com\n \\`hm-copy-button\\`, uma vez: fechar (Concluir, Esc) descarta. Falha vira toast: 404 (aplicação de outro client),\n 403 (client que a pessoa não administra) ou o \\`detail\\` do servidor / \\`rotateSecretError\\`.\n- Ids nos caminhos vão codificados (\\`urlPath\\` de \\`@trismegisto/primitives\\`).\n- As abas são preguiçosas (\\`*hmTabContent\\`): cada uma só busca ao ser aberta. Abrir outra aplicação volta para\n **Operações**.\n- **Gerenciar operações** cruza \\`operations\\` com \\`permissions\\` (por \\`operation_id\\`) e grava só a diferença, em\n sequência: primeiro as liberações, depois as retiradas. Só \\`protected\\` depende de permissão: operação de outro nível\n sem permissão gravada vem marcada e desabilitada (\\`free\\`) e fica fora da diferença; com uma permissão antiga, segue\n editável para dar para retirar (o servidor recusa liberar uma não protegida com 400 \\`operation_not_protected\\`).\n Falha vira toast (\\`autoServiceErrorText\\`, ou \\`permissionsSaveError\\`) e o painel fica aberto.\n- **Tokens** (\\`AutoServiceAppTokensComponent\\`, \\`AutoServiceTokenCreateComponent\\`; mirror da aba Tokens do\n argos-admin): situação calculada no cliente (\\`revoked_at\\` → Revogado; \\`expires_at\\` vencido → Expirado; senão\n Ativo). **Novo token** relê as operações da aplicação: \\`protected\\` escolhíveis, as outras marcadas e desabilitadas e\n nunca enviadas em \\`operation_ids\\`. Validade num \\`hm-date-picker\\` de amanhã até hoje + 365 dias (padrão 90), enviada\n como a meia-noite LOCAL do dia (\\`localDayStartIso\\`) — o servidor aceita só datas no futuro e até agora + 365 dias.\n O \\`token\\` da resposta aparece uma única vez no modal (\\`hm-copy-button\\`); fechar descarta. Revogar passa pelo\n \\`confirm\\` da grade e vira toast; o token fica na lista como revogado, sem ações. \"Gerenciar operações\" do token abre\n o painel de permissões com o \\`consumer_id\\` do token (o nome no lugar do grupo).\n- **Erros dos tokens** (\\`autoServiceErrorText\\`, pt-BR/en/es em \\`autoService.tokenErrors\\`): \\`invalid_expires_at\\`,\n \\`invalid_validity\\`, \\`invalid_operation_ids\\`, \\`operation_not_protected\\`; 404 com \\`error\\` falando de aplicação ou de\n token vira \\`appNotFound\\`/\\`tokenNotFound\\`; senão o \\`detail\\` do servidor e, por último, \\`tokenSaveError\\` /\n \\`tokenRevokeError\\` / \\`tokensLoadError\\`. Erro ao criar aparece no modal (que continua aberto).\n- A auditoria das aplicações tem tela própria (Auditoria, \\`ad100004-…\\`).\n`;\n"],"names":[],"mappings":"AAAA;AACA;AACA;AACA,qBAAe,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA6Ed;;"}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
// Manual de uso da tela Aplicações do auto-serviço (`RouteDocument.load`), em Markdown. Módulo próprio,
|
|
2
|
+
// carregado só pelo `import()` de `AUTO_SERVICE_DOCUMENTS`: vira um chunk à parte no FESM e fica fora do
|
|
3
|
+
// bundle inicial. Não importe estaticamente nem reexporte no `public-api.ts`.
|
|
4
|
+
var apps_usage = `# Aplicações
|
|
5
|
+
|
|
6
|
+
Gerencie as aplicações (credenciais \`client_credentials\`) do projeto do seu client, sem depender do painel
|
|
7
|
+
central: cadastre, ative ou desative e exclua aplicações, veja as operações que cada uma registra, defina quais
|
|
8
|
+
grupos podem chamar quais operações e crie os tokens de API das aplicações.
|
|
9
|
+
|
|
10
|
+
## Antes de começar
|
|
11
|
+
|
|
12
|
+
Como nas outras telas do auto-serviço, o client administrado é o do app em que você está logado: não há client
|
|
13
|
+
para escolher. É preciso estar no grupo de administração do projeto desse app e com o crachá **Administrador**
|
|
14
|
+
ativo.
|
|
15
|
+
|
|
16
|
+
## Como usar
|
|
17
|
+
|
|
18
|
+
1. A tela abre com a tabela das aplicações do projeto: **Nome**, **Grants** e **Situação** (**Ativo** ou
|
|
19
|
+
**Inativo**). Dá para ordenar pelo nome e pela situação.
|
|
20
|
+
2. Para criar uma aplicação, clique em **Cadastrar** (acima da tabela). No modal **Nova aplicação**, preencha o
|
|
21
|
+
**Nome** (obrigatório) e os **Grants** (separados por vírgula; já vem \`client_credentials\`) e clique em **Salvar**.
|
|
22
|
+
3. Ao criar, aparece no topo da tela o aviso **Aplicação criada** com o secret. **Copie e guarde o secret na hora:
|
|
23
|
+
ele não é exibido de novo.** O aviso some quando você o fecha, troca de client ou exclui a aplicação.
|
|
24
|
+
4. O menu **⋮** no começo de cada linha tem as ações da aplicação:
|
|
25
|
+
- **Editar**: muda nome, grants e a caixa **Ativo**.
|
|
26
|
+
- **Desativar** / **Ativar**: liga ou desliga a aplicação sem apagar nada.
|
|
27
|
+
- **Gerar novo segredo**: abre a confirmação **Gerar um novo segredo?**. Confirmando, o segredo atual deixa de
|
|
28
|
+
funcionar na hora (atualize o APP_SECRET do serviço que usa a aplicação; tokens já emitidos valem até expirar,
|
|
29
|
+
até 1 hora) e o novo aparece numa janela, **uma única vez**, com o botão **Copiar**. **Concluir** fecha a janela.
|
|
30
|
+
- **Excluir**: abre a confirmação **Excluir aplicação?** com o nome dela; só depois de **Excluir** no diálogo a
|
|
31
|
+
aplicação é apagada e a credencial dela para de funcionar. **Cancelar** (ou Esc) não muda nada.
|
|
32
|
+
5. Clique na linha (ou no nome, pelo teclado) para abrir a aplicação embaixo da tabela: o cartão com o nome, a
|
|
33
|
+
situação, os grants e as mesmas ações do menu, e as abas **Operações**, **Acessos** e **Tokens**.
|
|
34
|
+
|
|
35
|
+
> **Desativar** age na hora e se desfaz com **Ativar**. **Excluir** não tem volta: na dúvida, desative. Depois de
|
|
36
|
+
> excluir aparece a mensagem **Exclusão concluída.**; se o servidor recusar, a mensagem de erro diz o motivo e a
|
|
37
|
+
> aplicação continua na tela.
|
|
38
|
+
|
|
39
|
+
## Aba Operações
|
|
40
|
+
|
|
41
|
+
Lista, só para consulta, as operações registradas pela aplicação: **Identificador**, **Método**, **Nível** (o selo
|
|
42
|
+
fica verde para operação pública e amarelo para protegida), **Descrição** e **Grupos permitidos** (quantos grupos já
|
|
43
|
+
podem chamar a operação). A tela não cria nem edita operações.
|
|
44
|
+
|
|
45
|
+
## Aba Acessos
|
|
46
|
+
|
|
47
|
+
Mostra os grupos que têm acesso à aplicação (**Grupo** e **Tipo**). O grupo de administração do projeto não aparece:
|
|
48
|
+
o acesso dele às aplicações é gerido só no painel central do Argos.
|
|
49
|
+
|
|
50
|
+
- **Novo acesso**: escolha o **Grupo** e clique em **Criar**. Só aparecem os grupos do seu client (sem o de
|
|
51
|
+
administração).
|
|
52
|
+
- No menu de cada linha:
|
|
53
|
+
- **Gerenciar operações** abre o painel **Operações de nome do grupo**, com uma caixa por operação
|
|
54
|
+
(identificador, método, nível e descrição). Só as operações **protected** dependem de permissão: as **public** e
|
|
55
|
+
**private** aparecem marcadas e travadas (liberadas para todos ou para autenticados). Marque o que o grupo pode
|
|
56
|
+
chamar, desmarque o que não pode e clique em **Confirmar alterações** (o botão só habilita quando algo mudou).
|
|
57
|
+
**Cancelar** descarta.
|
|
58
|
+
- **Remover** pede confirmação (**Remover acesso à aplicação?**, com o nome do grupo) e só então tira o acesso do
|
|
59
|
+
grupo à aplicação e as permissões de operação dele.
|
|
60
|
+
|
|
61
|
+
Depois de criar o acesso, use **Gerenciar operações** para escolher o que o grupo pode chamar.
|
|
62
|
+
|
|
63
|
+
## Aba Tokens
|
|
64
|
+
|
|
65
|
+
Tokens de API da aplicação: a credencial que um serviço envia no cabeçalho \`x-api-token\` para chamar as operações
|
|
66
|
+
da aplicação sem login. A tabela mostra **Nome**, **Início do token** (os primeiros caracteres, para reconhecer),
|
|
67
|
+
**Situação** (**Ativo**, **Expirado** ou **Revogado**), **Expira em** e **Último uso**.
|
|
68
|
+
|
|
69
|
+
1. **Novo token** abre o formulário:
|
|
70
|
+
- **Nome** (obrigatório) e **Descrição** (opcional).
|
|
71
|
+
- **Expira em**: de amanhã até 365 dias a partir de hoje (vem com 90 dias). O token vale até a meia-noite desse
|
|
72
|
+
dia.
|
|
73
|
+
- **Operações liberadas ao token**: marque as operações **protected** que o token pode chamar. As **public** e
|
|
74
|
+
**private** já valem para ele e aparecem marcadas e travadas.
|
|
75
|
+
2. **Criar token** mostra o valor do token **uma única vez**, com o botão **Copiar**. **Copie e guarde na hora:
|
|
76
|
+
fechando a janela (Concluir ou Esc) não há como vê-lo de novo.** Se ele se perder, revogue e crie outro.
|
|
77
|
+
3. No menu de cada linha:
|
|
78
|
+
- **Gerenciar operações** abre o mesmo painel da aba Acessos, para mudar as operações liberadas ao token.
|
|
79
|
+
- **Revogar** pede confirmação (**Revogar token?**, com o nome dele). Confirmando, o token deixa de funcionar na
|
|
80
|
+
hora e fica na lista como **Revogado**. Não tem volta.
|
|
81
|
+
|
|
82
|
+
Token revogado não tem mais ações. Se o servidor recusar a criação (por exemplo, validade fora do intervalo), o
|
|
83
|
+
motivo aparece no próprio formulário.
|
|
84
|
+
`;
|
|
85
|
+
|
|
86
|
+
export { apps_usage as default };
|
|
87
|
+
//# sourceMappingURL=trismegisto-spine-auto-service-apps.usage-CAXMP5r8.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"trismegisto-spine-auto-service-apps.usage-CAXMP5r8.mjs","sources":["../../../projects/ui/auto-service/src/docs/apps.usage.ts"],"sourcesContent":["// Manual de uso da tela Aplicações do auto-serviço (`RouteDocument.load`), em Markdown. Módulo próprio,\n// carregado só pelo `import()` de `AUTO_SERVICE_DOCUMENTS`: vira um chunk à parte no FESM e fica fora do\n// bundle inicial. Não importe estaticamente nem reexporte no `public-api.ts`.\nexport default `# Aplicações\n\nGerencie as aplicações (credenciais \\`client_credentials\\`) do projeto do seu client, sem depender do painel\ncentral: cadastre, ative ou desative e exclua aplicações, veja as operações que cada uma registra, defina quais\ngrupos podem chamar quais operações e crie os tokens de API das aplicações.\n\n## Antes de começar\n\nComo nas outras telas do auto-serviço, o client administrado é o do app em que você está logado: não há client\npara escolher. É preciso estar no grupo de administração do projeto desse app e com o crachá **Administrador**\nativo.\n\n## Como usar\n\n1. A tela abre com a tabela das aplicações do projeto: **Nome**, **Grants** e **Situação** (**Ativo** ou\n **Inativo**). Dá para ordenar pelo nome e pela situação.\n2. Para criar uma aplicação, clique em **Cadastrar** (acima da tabela). No modal **Nova aplicação**, preencha o\n **Nome** (obrigatório) e os **Grants** (separados por vírgula; já vem \\`client_credentials\\`) e clique em **Salvar**.\n3. Ao criar, aparece no topo da tela o aviso **Aplicação criada** com o secret. **Copie e guarde o secret na hora:\n ele não é exibido de novo.** O aviso some quando você o fecha, troca de client ou exclui a aplicação.\n4. O menu **⋮** no começo de cada linha tem as ações da aplicação:\n - **Editar**: muda nome, grants e a caixa **Ativo**.\n - **Desativar** / **Ativar**: liga ou desliga a aplicação sem apagar nada.\n - **Gerar novo segredo**: abre a confirmação **Gerar um novo segredo?**. Confirmando, o segredo atual deixa de\n funcionar na hora (atualize o APP_SECRET do serviço que usa a aplicação; tokens já emitidos valem até expirar,\n até 1 hora) e o novo aparece numa janela, **uma única vez**, com o botão **Copiar**. **Concluir** fecha a janela.\n - **Excluir**: abre a confirmação **Excluir aplicação?** com o nome dela; só depois de **Excluir** no diálogo a\n aplicação é apagada e a credencial dela para de funcionar. **Cancelar** (ou Esc) não muda nada.\n5. Clique na linha (ou no nome, pelo teclado) para abrir a aplicação embaixo da tabela: o cartão com o nome, a\n situação, os grants e as mesmas ações do menu, e as abas **Operações**, **Acessos** e **Tokens**.\n\n> **Desativar** age na hora e se desfaz com **Ativar**. **Excluir** não tem volta: na dúvida, desative. Depois de\n> excluir aparece a mensagem **Exclusão concluída.**; se o servidor recusar, a mensagem de erro diz o motivo e a\n> aplicação continua na tela.\n\n## Aba Operações\n\nLista, só para consulta, as operações registradas pela aplicação: **Identificador**, **Método**, **Nível** (o selo\nfica verde para operação pública e amarelo para protegida), **Descrição** e **Grupos permitidos** (quantos grupos já\npodem chamar a operação). A tela não cria nem edita operações.\n\n## Aba Acessos\n\nMostra os grupos que têm acesso à aplicação (**Grupo** e **Tipo**). O grupo de administração do projeto não aparece:\no acesso dele às aplicações é gerido só no painel central do Argos.\n\n- **Novo acesso**: escolha o **Grupo** e clique em **Criar**. Só aparecem os grupos do seu client (sem o de\n administração).\n- No menu de cada linha:\n - **Gerenciar operações** abre o painel **Operações de nome do grupo**, com uma caixa por operação\n (identificador, método, nível e descrição). Só as operações **protected** dependem de permissão: as **public** e\n **private** aparecem marcadas e travadas (liberadas para todos ou para autenticados). Marque o que o grupo pode\n chamar, desmarque o que não pode e clique em **Confirmar alterações** (o botão só habilita quando algo mudou).\n **Cancelar** descarta.\n - **Remover** pede confirmação (**Remover acesso à aplicação?**, com o nome do grupo) e só então tira o acesso do\n grupo à aplicação e as permissões de operação dele.\n\nDepois de criar o acesso, use **Gerenciar operações** para escolher o que o grupo pode chamar.\n\n## Aba Tokens\n\nTokens de API da aplicação: a credencial que um serviço envia no cabeçalho \\`x-api-token\\` para chamar as operações\nda aplicação sem login. A tabela mostra **Nome**, **Início do token** (os primeiros caracteres, para reconhecer),\n**Situação** (**Ativo**, **Expirado** ou **Revogado**), **Expira em** e **Último uso**.\n\n1. **Novo token** abre o formulário:\n - **Nome** (obrigatório) e **Descrição** (opcional).\n - **Expira em**: de amanhã até 365 dias a partir de hoje (vem com 90 dias). O token vale até a meia-noite desse\n dia.\n - **Operações liberadas ao token**: marque as operações **protected** que o token pode chamar. As **public** e\n **private** já valem para ele e aparecem marcadas e travadas.\n2. **Criar token** mostra o valor do token **uma única vez**, com o botão **Copiar**. **Copie e guarde na hora:\n fechando a janela (Concluir ou Esc) não há como vê-lo de novo.** Se ele se perder, revogue e crie outro.\n3. No menu de cada linha:\n - **Gerenciar operações** abre o mesmo painel da aba Acessos, para mudar as operações liberadas ao token.\n - **Revogar** pede confirmação (**Revogar token?**, com o nome dele). Confirmando, o token deixa de funcionar na\n hora e fica na lista como **Revogado**. Não tem volta.\n\nToken revogado não tem mais ações. Se o servidor recusar a criação (por exemplo, validade fora do intervalo), o\nmotivo aparece no próprio formulário.\n`;\n"],"names":[],"mappings":"AAAA;AACA;AACA;AACA,iBAAe,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAgFd;;"}
|
|
@@ -1,11 +1,12 @@
|
|
|
1
|
-
// Especificação técnica da tela Auditoria do auto-serviço (`RouteDocument.loadTechnical`), em Markdown. Módulo próprio,
|
|
1
|
+
// Especificação técnica da tela Ações (menu Auditoria) do auto-serviço (`RouteDocument.loadTechnical`), em Markdown. Módulo próprio,
|
|
2
2
|
// carregado só pelo `import()` de `AUTO_SERVICE_DOCUMENTS`: vira um chunk à parte no FESM e fica fora do
|
|
3
3
|
// bundle inicial. Não importe estaticamente nem reexporte no `public-api.ts`.
|
|
4
|
-
var audit_technical = `#
|
|
4
|
+
var audit_technical = `# Ações — especificação técnica
|
|
5
5
|
|
|
6
6
|
Tela \`AutoServiceAuditComponent\`, ligada ao router de template \`AUTO_SERVICE_AUDIT_TEMPLATE_ROUTER_ID\`
|
|
7
|
-
(\`ad100004
|
|
8
|
-
|
|
7
|
+
(\`ad100004-…\`, página \`administration-audit-actions\` no menu \`administration-audit\`): o seletor de client +
|
|
8
|
+
\`SpineAuditComponent\` (\`@trismegisto/spine/audit\`) com \`scope="client"\`. É a mesma tela do painel central do Argos
|
|
9
|
+
(\`scope="admin"\`); só muda a base dos endpoints.
|
|
9
10
|
|
|
10
11
|
## Endpoints
|
|
11
12
|
|
|
@@ -39,4 +40,4 @@ Base: \`{adminApi}/auto-service/:clientId/audit\` (\`SpineAuditService\`, token
|
|
|
39
40
|
`;
|
|
40
41
|
|
|
41
42
|
export { audit_technical as default };
|
|
42
|
-
//# sourceMappingURL=trismegisto-spine-auto-service-audit.technical-
|
|
43
|
+
//# sourceMappingURL=trismegisto-spine-auto-service-audit.technical-B75d4mh2.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"trismegisto-spine-auto-service-audit.technical-B75d4mh2.mjs","sources":["../../../projects/ui/auto-service/src/docs/audit.technical.ts"],"sourcesContent":["// Especificação técnica da tela Ações (menu Auditoria) do auto-serviço (`RouteDocument.loadTechnical`), em Markdown. Módulo próprio,\n// carregado só pelo `import()` de `AUTO_SERVICE_DOCUMENTS`: vira um chunk à parte no FESM e fica fora do\n// bundle inicial. Não importe estaticamente nem reexporte no `public-api.ts`.\nexport default `# Ações — especificação técnica\n\nTela \\`AutoServiceAuditComponent\\`, ligada ao router de template \\`AUTO_SERVICE_AUDIT_TEMPLATE_ROUTER_ID\\`\n(\\`ad100004-…\\`, página \\`administration-audit-actions\\` no menu \\`administration-audit\\`): o seletor de client +\n\\`SpineAuditComponent\\` (\\`@trismegisto/spine/audit\\`) com \\`scope=\"client\"\\`. É a mesma tela do painel central do Argos\n(\\`scope=\"admin\"\\`); só muda a base dos endpoints.\n\n## Endpoints\n\nBase: \\`{adminApi}/auto-service/:clientId/audit\\` (\\`SpineAuditService\\`, token em \\`x-access-token\\`).\n\n| Ação | Endpoint |\n| --- | --- |\n| Clients que a pessoa administra | \\`GET /auto-service\\` |\n| Tabela por ações / por eventos | \\`GET .../actions\\` / \\`GET .../events\\` (cursor, \\`limit\\` = itens por página) |\n| Resumo e linha do tempo | \\`GET .../stats?tops=false\\` |\n| Rankings | \\`GET .../tops/:kind\\` (\\`apps\\`, \\`operations\\`, \\`users\\`; 5 por página) |\n| Detalhe do evento | \\`GET .../events/:eventId?occurred_at=\\` |\n| Cadeia (trace) | \\`GET .../traces/:traceId?occurred_at=\\` |\n| Aplicações do filtro | \\`GET /auto-service/:clientId/apps\\` |\n\n## Regras\n\n- **Autorização** (\\`clientAdminGuard\\`): grupo que administra o projeto do client + crachá Administrador ativo. O\n recorte aos apps do projeto é do servidor (\\`app_id IN\\` apps do client); \\`app_id\\` de fora no filtro → 403, que a\n tela mostra como \"sem acesso à auditoria de uma das aplicações escolhidas\".\n- Janela máxima de 31 dias, barrada antes de ir ao servidor (e \\`range_too_large\\` do servidor); filtro inválido\n (\\`invalid_filter\\`) mostra o detalhe do servidor.\n- Período padrão 24 h; unidade padrão **Ações**. Datas da barra de filtros vencem o período rápido. Filtros salvos\n ficam na chave \\`spine-audit-client\\`.\n- Atualização automática opcional a cada 30 s. Respostas fora de ordem (página, ranking, consulta ou detalhe já\n trocados) são descartadas; trocar de página mantém as linhas à vista com indicador de progresso.\n- Coluna, filtro e ranking \"por aplicação\" só aparecem com mais de um app.\n- Eventos da cadeia de apps fora do projeto não vêm; o servidor informa a contagem (\\`hidden_count\\`).\n- A tela fica no ponto \\`@trismegisto/spine/audit\\`, importado só pelo chunk lazy desta página (o \\`check-lazy\\` do\n build garante).\n`;\n"],"names":[],"mappings":"AAAA;AACA;AACA;AACA,sBAAe,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAoCd;;"}
|
|
@@ -1,16 +1,17 @@
|
|
|
1
|
-
// Manual de uso da tela Auditoria do auto-serviço (`RouteDocument.load`), em Markdown. Módulo próprio,
|
|
1
|
+
// Manual de uso da tela Ações (menu Auditoria) do auto-serviço (`RouteDocument.load`), em Markdown. Módulo próprio,
|
|
2
2
|
// carregado só pelo `import()` de `AUTO_SERVICE_DOCUMENTS`: vira um chunk à parte no FESM e fica fora do
|
|
3
3
|
// bundle inicial. Não importe estaticamente nem reexporte no `public-api.ts`.
|
|
4
|
-
var audit_usage = `#
|
|
4
|
+
var audit_usage = `# Ações
|
|
5
5
|
|
|
6
|
-
O que aconteceu nas aplicações do projeto do seu client: quem fez, o quê, quando e com que resultado.
|
|
7
|
-
de consulta: nada do que você faz aqui altera as
|
|
6
|
+
O que aconteceu nas aplicações do projeto do seu client: quem fez, o quê, quando e com que resultado. Fica no menu
|
|
7
|
+
**Auditoria**, ao lado de **Tentativas de login**. A tela é só de consulta: nada do que você faz aqui altera as
|
|
8
|
+
aplicações.
|
|
8
9
|
|
|
9
10
|
## Antes de começar
|
|
10
11
|
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
12
|
+
Como nas outras telas do auto-serviço, o client administrado é o do app em que você está logado: não há client
|
|
13
|
+
para escolher. É preciso estar no grupo de administração do projeto desse app e com o crachá **Administrador**
|
|
14
|
+
ativo. Você só vê os registros das aplicações do projeto desse client.
|
|
14
15
|
|
|
15
16
|
## Como usar
|
|
16
17
|
|
|
@@ -60,4 +61,4 @@ duração, rota, alvo, mensagem e trace. Campos que não foram registrados não
|
|
|
60
61
|
`;
|
|
61
62
|
|
|
62
63
|
export { audit_usage as default };
|
|
63
|
-
//# sourceMappingURL=trismegisto-spine-auto-service-audit.usage-
|
|
64
|
+
//# sourceMappingURL=trismegisto-spine-auto-service-audit.usage-IdXMruv5.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"trismegisto-spine-auto-service-audit.usage-IdXMruv5.mjs","sources":["../../../projects/ui/auto-service/src/docs/audit.usage.ts"],"sourcesContent":["// Manual de uso da tela Ações (menu Auditoria) do auto-serviço (`RouteDocument.load`), em Markdown. Módulo próprio,\n// carregado só pelo `import()` de `AUTO_SERVICE_DOCUMENTS`: vira um chunk à parte no FESM e fica fora do\n// bundle inicial. Não importe estaticamente nem reexporte no `public-api.ts`.\nexport default `# Ações\n\nO que aconteceu nas aplicações do projeto do seu client: quem fez, o quê, quando e com que resultado. Fica no menu\n**Auditoria**, ao lado de **Tentativas de login**. A tela é só de consulta: nada do que você faz aqui altera as\naplicações.\n\n## Antes de começar\n\nComo nas outras telas do auto-serviço, o client administrado é o do app em que você está logado: não há client\npara escolher. É preciso estar no grupo de administração do projeto desse app e com o crachá **Administrador**\nativo. Você só vê os registros das aplicações do projeto desse client.\n\n## Como usar\n\n1. **Ver por** escolhe a unidade da leitura:\n - **Ações** (padrão): uma linha por ação da pessoa, juntando as chamadas que ela gerou entre aplicações. O\n resultado da ação é o pior entre as etapas.\n - **Eventos**: cada registro, um por linha.\n2. **Período**: **Última hora**, **Últimas 6 horas**, **Últimas 24 horas** (padrão), **Últimos 7 dias** ou **Últimos\n 30 dias**. Se você escolher datas no filtro **Datas**, elas valem no lugar do período (o período máximo é de 31\n dias).\n3. **Atualizar** recarrega tudo; **Atualizar a cada 30 s** mantém a tela atualizando sozinha. O horário da última\n atualização aparece ao lado.\n4. **Filtros**: Datas, Aplicação (quando há mais de uma), Usuário, Operação, Método, Resultado, Nível, Permissão,\n Tipo de ator, Status HTTP, Trace e ID do usuário. **Só ações do usuário** aparece na leitura por **Eventos**. A\n barra de filtros permite salvar combinações para usar de novo.\n5. **Resumo do período**: o total (de ações ou de eventos), **Falhas** e **Negados**. Clique em **Falhas** ou\n **Negados** para filtrar a tabela por esse resultado; clique de novo para tirar o filtro.\n6. **Linha do tempo**: barras por intervalo, empilhando sucesso, falha e negado. Passe o mouse numa barra para ver\n os números.\n7. **Operações mais chamadas**, **Usuários mais ativos** e, com mais de uma aplicação, **Por aplicação**: rankings de\n 5 em 5, com as setas para a página anterior e a próxima. Clique num item para filtrar por ele.\n8. A tabela lista o período, do mais recente para o mais antigo: **Quando**, **Aplicação** (com mais de uma),\n **Usuário**, **Operação**, **Spans** (na leitura por ações), **Método**, **Resultado**, **HTTP** e **Duração**.\n Escolha quantas linhas por página no rodapé.\n\n## Detalhe\n\nClique numa linha para abrir o detalhe ao lado: quando, resultado, origem (**Ação do usuário** ou **Chamada entre\naplicações**), aplicação, usuário, tipo de ator, IP de origem, operação, método, nível, permissão, status HTTP,\nduração, rota, alvo, mensagem e trace. Campos que não foram registrados não aparecem.\n\n- **Ver cadeia (trace)** mostra as etapas da ação numa linha do tempo, com a duração de cada uma. Clique numa etapa\n para abrir o detalhe dela. Na leitura por ações, as etapas (spans) já aparecem no topo do detalhe.\n- **Filtrar a tabela por este trace** mostra na tabela só o que pertence a essa cadeia.\n- Etapas de aplicações fora do seu projeto não aparecem; um aviso diz quantas ficaram de fora.\n- O selo **sem entrada** marca uma ação cujo início não está no período (ou não foi registrado): ela aparece a\n partir da primeira chamada entre aplicações.\n\n## Quando algo não carrega\n\n- **Nenhuma ação (ou evento) no período:** amplie o período ou use **Limpar filtros**.\n- **Não foi possível carregar a auditoria:** **Tentar de novo**.\n- **O período máximo é de 31 dias:** escolha datas mais próximas.\n- **Algum filtro tem um valor inválido:** a mensagem explica qual; corrija o filtro ou limpe os filtros.\n- **Você não tem acesso à auditoria de uma das aplicações escolhidas:** tire do filtro a aplicação que não é do\n seu projeto.\n`;\n"],"names":[],"mappings":"AAAA;AACA;AACA;AACA,kBAAe,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAyDd;;"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import * as i0 from '@angular/core';
|
|
2
2
|
import { signal, ChangeDetectionStrategy, Component } from '@angular/core';
|
|
3
3
|
import { SpineAuditComponent } from '@trismegisto/spine/audit';
|
|
4
|
-
import { A as AutoServiceClientPickerComponent } from './trismegisto-spine-auto-service-auto-service-client-picker.component-
|
|
4
|
+
import { A as AutoServiceClientPickerComponent } from './trismegisto-spine-auto-service-auto-service-client-picker.component-CBt_0Uli.mjs';
|
|
5
5
|
|
|
6
6
|
/**
|
|
7
7
|
* Tela "Auditoria" do auto-serviço (router `AUTO_SERVICE_AUDIT_TEMPLATE_ROUTER_ID`): o dono/membro
|
|
@@ -20,7 +20,7 @@ class AutoServiceAuditComponent {
|
|
|
20
20
|
<br />
|
|
21
21
|
<spine-audit scope="client" [clientId]="c.id" />
|
|
22
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 }); }
|
|
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)}.as-secret{display:grid;gap:var(--hm-space-micro)}.as-secret__label{color:var(--hm-muted);font-size:var(--hm-font-size-xs)}.as-secret__row{display:flex;flex-wrap:wrap;align-items:center;gap:var(--hm-space-xs)}.as-secret__value{flex:1 1 240px;min-width:0;border:var(--hm-border-hairline) solid var(--hm-divider);border-radius:var(--hm-radius-control);padding:var(--hm-space-xs) var(--hm-space-sm);background:var(--hm-surface);color:var(--hm-text);font-family:var(--hm-font-mono);font-size:var(--hm-font-size-sm);overflow-wrap:anywhere;-webkit-user-select:all;user-select:all}\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
24
|
}
|
|
25
25
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.24", ngImport: i0, type: AutoServiceAuditComponent, decorators: [{
|
|
26
26
|
type: Component,
|
|
@@ -30,8 +30,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.24", ngImpo
|
|
|
30
30
|
<br />
|
|
31
31
|
<spine-audit scope="client" [clientId]="c.id" />
|
|
32
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"] }]
|
|
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)}.as-secret{display:grid;gap:var(--hm-space-micro)}.as-secret__label{color:var(--hm-muted);font-size:var(--hm-font-size-xs)}.as-secret__row{display:flex;flex-wrap:wrap;align-items:center;gap:var(--hm-space-xs)}.as-secret__value{flex:1 1 240px;min-width:0;border:var(--hm-border-hairline) solid var(--hm-divider);border-radius:var(--hm-radius-control);padding:var(--hm-space-xs) var(--hm-space-sm);background:var(--hm-surface);color:var(--hm-text);font-family:var(--hm-font-mono);font-size:var(--hm-font-size-sm);overflow-wrap:anywhere;-webkit-user-select:all;user-select:all}\n"] }]
|
|
34
34
|
}] });
|
|
35
35
|
|
|
36
36
|
export { AutoServiceAuditComponent };
|
|
37
|
-
//# sourceMappingURL=trismegisto-spine-auto-service-auto-service-audit.component-
|
|
37
|
+
//# sourceMappingURL=trismegisto-spine-auto-service-auto-service-audit.component-BIL8tH1I.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"trismegisto-spine-auto-service-auto-service-audit.component-
|
|
1
|
+
{"version":3,"file":"trismegisto-spine-auto-service-auto-service-audit.component-BIL8tH1I.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,w3CAAA,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,w3CAAA,CAAA,EAAA;;;"}
|
|
@@ -38,14 +38,14 @@ class AutoServiceClientPickerComponent {
|
|
|
38
38
|
this.clientChange.emit(this.clients.find(c => c.id === id) ?? null);
|
|
39
39
|
}
|
|
40
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 }); }
|
|
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)}.as-secret{display:grid;gap:var(--hm-space-micro)}.as-secret__label{color:var(--hm-muted);font-size:var(--hm-font-size-xs)}.as-secret__row{display:flex;flex-wrap:wrap;align-items:center;gap:var(--hm-space-xs)}.as-secret__value{flex:1 1 240px;min-width:0;border:var(--hm-border-hairline) solid var(--hm-divider);border-radius:var(--hm-radius-control);padding:var(--hm-space-xs) var(--hm-space-sm);background:var(--hm-surface);color:var(--hm-text);font-family:var(--hm-font-mono);font-size:var(--hm-font-size-sm);overflow-wrap:anywhere;-webkit-user-select:all;user-select:all}: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
42
|
}
|
|
43
43
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.24", ngImport: i0, type: AutoServiceClientPickerComponent, decorators: [{
|
|
44
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"] }]
|
|
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)}.as-secret{display:grid;gap:var(--hm-space-micro)}.as-secret__label{color:var(--hm-muted);font-size:var(--hm-font-size-xs)}.as-secret__row{display:flex;flex-wrap:wrap;align-items:center;gap:var(--hm-space-xs)}.as-secret__value{flex:1 1 240px;min-width:0;border:var(--hm-border-hairline) solid var(--hm-divider);border-radius:var(--hm-radius-control);padding:var(--hm-space-xs) var(--hm-space-sm);background:var(--hm-surface);color:var(--hm-text);font-family:var(--hm-font-mono);font-size:var(--hm-font-size-sm);overflow-wrap:anywhere;-webkit-user-select:all;user-select:all}:host{display:block}:host:empty{display:none}\n"] }]
|
|
46
46
|
}], ctorParameters: () => [{ type: AutoServiceService }], propDecorators: { clientChange: [{
|
|
47
47
|
type: Output
|
|
48
48
|
}] } });
|
|
49
49
|
|
|
50
50
|
export { AutoServiceClientPickerComponent as A };
|
|
51
|
-
//# sourceMappingURL=trismegisto-spine-auto-service-auto-service-client-picker.component-
|
|
51
|
+
//# sourceMappingURL=trismegisto-spine-auto-service-auto-service-client-picker.component-CBt_0Uli.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"trismegisto-spine-auto-service-auto-service-client-picker.component-
|
|
1
|
+
{"version":3,"file":"trismegisto-spine-auto-service-auto-service-client-picker.component-CBt_0Uli.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":";;;;;;;;MAqBa,gCAAgC,CAAA;AAQ3C,IAAA,WAAA,CAAoB,OAA2B,EAAA;QAA3B,IAAA,CAAA,OAAO,GAAP,OAAO;AAPR,QAAA,IAAA,CAAA,IAAI,GAAG,MAAM,CAAC,cAAc,CAAC,CAAC,WAAW;;AAE3C,QAAA,IAAA,CAAA,GAAG,GAAG,MAAM,CAAC,iBAAiB,CAAC;QAChD,IAAA,CAAA,OAAO,GAAG,IAAI;QACd,IAAA,CAAA,OAAO,GAAwB,EAAE;QACjC,IAAA,CAAA,gBAAgB,GAAG,EAAE;AACX,QAAA,IAAA,CAAA,YAAY,GAAG,IAAI,YAAY,EAA4B;IACnB;AAElD,IAAA,IAAI,aAAa,GAAA;AACf,QAAA,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,YAAY,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IACpF;AAEA,IAAA,MAAM,QAAQ,GAAA;AACZ,QAAA,IAAI,CAAC,OAAO,GAAG,IAAI;AACnB,QAAA,IAAI;YACF,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,YAAY,EAAE;AAC7C,YAAA,IAAI,CAAC,OAAO,GAAG,GAAG,CAAC,OAAO;AAC1B,YAAA,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC;AAAE,gBAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QACtE;gBAAU;AAAE,YAAA,IAAI,CAAC,OAAO,GAAG,KAAK;AAAE,YAAA,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE;QAAE;IAC7D;AAEA,IAAA,YAAY,CAAC,EAAU,EAAA;AACrB,QAAA,IAAI,CAAC,gBAAgB,GAAG,EAAE;QAC1B,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,IAAI,IAAI,CAAC;IACrE;+GA1BW,gCAAgC,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAA,kBAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAhC,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,gCAAgC,uICrB7C,ucAgBA,EAAA,MAAA,EAAA,CAAA,w7CAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDAY,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,IAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,aAAa,8JAAE,iBAAiB,EAAA,QAAA,EAAA,aAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,SAAA,EAAA,OAAA,EAAA,aAAA,EAAA,MAAA,EAAA,MAAA,EAAA,MAAA,EAAA,MAAA,EAAA,aAAA,EAAA,WAAA,EAAA,gBAAA,EAAA,SAAA,EAAA,kBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,aAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,KAAA,EAAA,CAAA,CAAA;;4FAK7C,gCAAgC,EAAA,UAAA,EAAA,CAAA;kBAR5C,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,kCAAkC,EAAA,UAAA,EAChC,IAAI,EAAA,OAAA,EACP,CAAC,YAAY,EAAE,aAAa,EAAE,iBAAiB,CAAC,EAAA,eAAA,EACxC,uBAAuB,CAAC,KAAK,EAAA,QAAA,EAAA,ucAAA,EAAA,MAAA,EAAA,CAAA,w7CAAA,CAAA,EAAA;;sBAW7C;;;"}
|