@trismegisto/spine 3.0.0 → 3.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/fesm2022/{trismegisto-spine-auto-service-apps.technical-BAKdkVdz.mjs → trismegisto-spine-auto-service-apps.technical-D3W2Vwic.mjs} +26 -15
- package/fesm2022/trismegisto-spine-auto-service-apps.technical-D3W2Vwic.mjs.map +1 -0
- package/fesm2022/{trismegisto-spine-auto-service-apps.usage-CAXMP5r8.mjs → trismegisto-spine-auto-service-apps.usage-DeLfYMeO.mjs} +19 -13
- package/fesm2022/trismegisto-spine-auto-service-apps.usage-DeLfYMeO.mjs.map +1 -0
- package/fesm2022/trismegisto-spine-auto-service-auto-service-audit.component-BNtNWfiu.mjs +37 -0
- package/fesm2022/{trismegisto-spine-auto-service-auto-service-audit.component-BIL8tH1I.mjs.map → trismegisto-spine-auto-service-auto-service-audit.component-BNtNWfiu.mjs.map} +1 -1
- package/fesm2022/{trismegisto-spine-auto-service-auto-service-client-picker.component-CBt_0Uli.mjs → trismegisto-spine-auto-service-auto-service-client-picker.component-DdtDk_xl.mjs} +3 -3
- package/fesm2022/{trismegisto-spine-auto-service-auto-service-client-picker.component-CBt_0Uli.mjs.map → trismegisto-spine-auto-service-auto-service-client-picker.component-DdtDk_xl.mjs.map} +1 -1
- package/fesm2022/{trismegisto-spine-auto-service-auto-service-client.component-DAxhZC-a.mjs → trismegisto-spine-auto-service-auto-service-client.component-DXl1y6Sx.mjs} +15 -15
- package/fesm2022/{trismegisto-spine-auto-service-auto-service-client.component-DAxhZC-a.mjs.map → trismegisto-spine-auto-service-auto-service-client.component-DXl1y6Sx.mjs.map} +1 -1
- package/fesm2022/{trismegisto-spine-auto-service-auto-service-delete-CoJYTtBU.mjs → trismegisto-spine-auto-service-auto-service-delete-B1tXgMvi.mjs} +2 -1
- package/fesm2022/trismegisto-spine-auto-service-auto-service-delete-B1tXgMvi.mjs.map +1 -0
- package/fesm2022/{trismegisto-spine-auto-service-auto-service-groups.component-UVMGF7-B.mjs → trismegisto-spine-auto-service-auto-service-groups.component-C4iQ2GPX.mjs} +92 -37
- package/fesm2022/trismegisto-spine-auto-service-auto-service-groups.component-C4iQ2GPX.mjs.map +1 -0
- package/fesm2022/trismegisto-spine-auto-service-auto-service-login-attempts.component-B87vibNB.mjs +37 -0
- package/fesm2022/{trismegisto-spine-auto-service-auto-service-login-attempts.component-Boi-kG0G.mjs.map → trismegisto-spine-auto-service-auto-service-login-attempts.component-B87vibNB.mjs.map} +1 -1
- package/fesm2022/{trismegisto-spine-auto-service-auto-service.component-DmLafUkX.mjs → trismegisto-spine-auto-service-auto-service.component-DAXv__zg.mjs} +238 -100
- package/fesm2022/trismegisto-spine-auto-service-auto-service.component-DAXv__zg.mjs.map +1 -0
- package/fesm2022/{trismegisto-spine-auto-service-groups.technical-BlktCM70.mjs → trismegisto-spine-auto-service-groups.technical-D05838rU.mjs} +11 -7
- package/fesm2022/trismegisto-spine-auto-service-groups.technical-D05838rU.mjs.map +1 -0
- package/fesm2022/{trismegisto-spine-auto-service-groups.usage-Cz5sCKgn.mjs → trismegisto-spine-auto-service-groups.usage-ChGMgYU3.mjs} +11 -12
- package/fesm2022/trismegisto-spine-auto-service-groups.usage-ChGMgYU3.mjs.map +1 -0
- package/fesm2022/trismegisto-spine-auto-service.mjs +9 -9
- package/fesm2022/trismegisto-spine.mjs +60 -6
- package/fesm2022/trismegisto-spine.mjs.map +1 -1
- package/package.json +6 -6
- package/types/trismegisto-spine.d.ts +34 -7
- package/types/trismegisto-spine.d.ts.map +1 -1
- package/fesm2022/trismegisto-spine-auto-service-apps.technical-BAKdkVdz.mjs.map +0 -1
- package/fesm2022/trismegisto-spine-auto-service-apps.usage-CAXMP5r8.mjs.map +0 -1
- package/fesm2022/trismegisto-spine-auto-service-auto-service-audit.component-BIL8tH1I.mjs +0 -37
- package/fesm2022/trismegisto-spine-auto-service-auto-service-delete-CoJYTtBU.mjs.map +0 -1
- package/fesm2022/trismegisto-spine-auto-service-auto-service-groups.component-UVMGF7-B.mjs.map +0 -1
- package/fesm2022/trismegisto-spine-auto-service-auto-service-login-attempts.component-Boi-kG0G.mjs +0 -37
- package/fesm2022/trismegisto-spine-auto-service-auto-service.component-DmLafUkX.mjs.map +0 -1
- package/fesm2022/trismegisto-spine-auto-service-groups.technical-BlktCM70.mjs.map +0 -1
- package/fesm2022/trismegisto-spine-auto-service-groups.usage-Cz5sCKgn.mjs.map +0 -1
|
@@ -31,12 +31,12 @@ Tela \`AutoServiceComponent\` (seletor de client + \`AutoServiceAppsComponent\`)
|
|
|
31
31
|
|
|
32
32
|
## Tela
|
|
33
33
|
|
|
34
|
-
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
- Recarregar a lista (salvar, ativar, excluir) mantém a aplicação aberta com os dados novos ou a fecha
|
|
39
|
-
trocar de client fecha a aplicação aberta.
|
|
34
|
+
- \`AutoServiceAppsComponent\`: **Cadastrar** e um \`hm-card\` com \`hm-combobox\` (\`pickApp\`, as aplicações de
|
|
35
|
+
\`GET .../apps\`) + **Consultar**. A aplicação consultada abre embaixo: resumo com Editar, Desativar/Ativar (o que cabe
|
|
36
|
+
na situação), Gerar novo segredo e Excluir, e as abas Operações, Acessos e Tokens. (Na 3.0.0 a lista era um
|
|
37
|
+
\`hm-data-grid\`; voltou ao seletor a pedido do usuário.)
|
|
38
|
+
- Recarregar a lista (salvar, ativar, excluir) mantém a aplicação aberta com os dados novos ou a fecha (e limpa o
|
|
39
|
+
seletor) se sumiu; trocar de client fecha a aplicação aberta e limpa o seletor.
|
|
40
40
|
|
|
41
41
|
## Regras
|
|
42
42
|
|
|
@@ -60,25 +60,36 @@ Tela \`AutoServiceComponent\` (seletor de client + \`AutoServiceAppsComponent\`)
|
|
|
60
60
|
- Ids nos caminhos vão codificados (\`urlPath\` de \`@trismegisto/primitives\`).
|
|
61
61
|
- As abas são preguiçosas (\`*hmTabContent\`): cada uma só busca ao ser aberta. Abrir outra aplicação volta para
|
|
62
62
|
**Operações**.
|
|
63
|
-
- **Gerenciar operações** cruza \`operations\` com \`permissions\` (por \`operation_id\`)
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
63
|
+
- **Gerenciar operações** (mesmo painel do argos-admin) cruza \`operations\` com \`permissions\` (por \`operation_id\`)
|
|
64
|
+
num \`hm-tree\` com caixas: o identifier quebra em ':' (segmentos intermediários viram pastas, com chave terminada
|
|
65
|
+
em ':' para não colidir com uma operação de mesmo nome; a folha é a operação), pastas tri-state com o contador
|
|
66
|
+
\`permissionsFolderCount\` ("X de Y" das escolhíveis), selos de método e nível e a descrição no modelo \`hmTreeNode\`;
|
|
67
|
+
tudo começa recolhido. No topo, \`permissionsSummaryGroup\`/\`permissionsSummaryToken\` e, se houver travadas,
|
|
68
|
+
\`permissionsFreeGroup\`/\`permissionsFreeToken\`. O motivo da trava (\`freeForAll\`, \`freeForAuthenticated\`,
|
|
69
|
+
\`publicNoToken\`...) entra só no \`label\` do nó (nome acessível), não ao lado da operação. Grava só a diferença, em
|
|
70
|
+
sequência: primeiro as liberações, depois as retiradas. O painel tem \`mode\` (\`PermissionMode\`, em
|
|
71
|
+
\`operation-level.ts\`):
|
|
72
|
+
- \`group\` (aba Acessos): só \`protected\` depende de permissão; operação de outro nível sem permissão gravada vem
|
|
73
|
+
marcada e desabilitada e fica fora da diferença (o servidor recusa com 400 \`operation_not_protected\`).
|
|
74
|
+
- \`token\` (aba Tokens): o token não tem login, então \`protected\`, \`private\` (e \`optional\`) são escolhíveis e
|
|
75
|
+
nada vem marcado sem permissão gravada; \`public\` vem desmarcada e desabilitada (o servidor recusa com 400
|
|
76
|
+
\`operation_public\`).
|
|
77
|
+
Nos dois modos, uma permissão antiga numa operação travada segue editável, para dar para retirar.
|
|
67
78
|
Falha vira toast (\`autoServiceErrorText\`, ou \`permissionsSaveError\`) e o painel fica aberto.
|
|
68
79
|
- **Tokens** (\`AutoServiceAppTokensComponent\`, \`AutoServiceTokenCreateComponent\`; mirror da aba Tokens do
|
|
69
80
|
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
|
|
71
|
-
nunca
|
|
81
|
+
Ativo). **Novo token** relê as operações da aplicação, com a regra do modo \`token\`: nada pré-marcado, \`protected\` e
|
|
82
|
+
\`private\` escolhíveis, \`public\` desmarcada e desabilitada e nunca enviada em \`operation_ids\`. Validade num \`hm-date-picker\` de amanhã até hoje + 365 dias (padrão 90), enviada
|
|
72
83
|
como a meia-noite LOCAL do dia (\`localDayStartIso\`) — o servidor aceita só datas no futuro e até agora + 365 dias.
|
|
73
84
|
O \`token\` da resposta aparece uma única vez no modal (\`hm-copy-button\`); fechar descarta. Revogar passa pelo
|
|
74
85
|
\`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)
|
|
86
|
+
o painel de permissões com o \`consumer_id\` do token (o nome no lugar do grupo) e \`mode="token"\`.
|
|
76
87
|
- **Erros dos tokens** (\`autoServiceErrorText\`, pt-BR/en/es em \`autoService.tokenErrors\`): \`invalid_expires_at\`,
|
|
77
|
-
\`invalid_validity\`, \`invalid_operation_ids\`, \`operation_not_protected
|
|
88
|
+
\`invalid_validity\`, \`invalid_operation_ids\`, \`operation_public\` (token) e \`operation_not_protected\` (grupo); 404 com \`error\` falando de aplicação ou de
|
|
78
89
|
token vira \`appNotFound\`/\`tokenNotFound\`; senão o \`detail\` do servidor e, por último, \`tokenSaveError\` /
|
|
79
90
|
\`tokenRevokeError\` / \`tokensLoadError\`. Erro ao criar aparece no modal (que continua aberto).
|
|
80
91
|
- A auditoria das aplicações tem tela própria (Auditoria, \`ad100004-…\`).
|
|
81
92
|
`;
|
|
82
93
|
|
|
83
94
|
export { apps_technical as default };
|
|
84
|
-
//# sourceMappingURL=trismegisto-spine-auto-service-apps.technical-
|
|
95
|
+
//# sourceMappingURL=trismegisto-spine-auto-service-apps.technical-D3W2Vwic.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"trismegisto-spine-auto-service-apps.technical-D3W2Vwic.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- \\`AutoServiceAppsComponent\\`: **Cadastrar** e um \\`hm-card\\` com \\`hm-combobox\\` (\\`pickApp\\`, as aplicações de\n \\`GET .../apps\\`) + **Consultar**. A aplicação consultada abre embaixo: resumo com Editar, Desativar/Ativar (o que cabe\n na situação), Gerar novo segredo e Excluir, e as abas Operações, Acessos e Tokens. (Na 3.0.0 a lista era um\n \\`hm-data-grid\\`; voltou ao seletor a pedido do usuário.)\n- Recarregar a lista (salvar, ativar, excluir) mantém a aplicação aberta com os dados novos ou a fecha (e limpa o\n seletor) se sumiu; trocar de client fecha a aplicação aberta e limpa o seletor.\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** (mesmo painel do argos-admin) cruza \\`operations\\` com \\`permissions\\` (por \\`operation_id\\`)\n num \\`hm-tree\\` com caixas: o identifier quebra em ':' (segmentos intermediários viram pastas, com chave terminada\n em ':' para não colidir com uma operação de mesmo nome; a folha é a operação), pastas tri-state com o contador\n \\`permissionsFolderCount\\` (\"X de Y\" das escolhíveis), selos de método e nível e a descrição no modelo \\`hmTreeNode\\`;\n tudo começa recolhido. No topo, \\`permissionsSummaryGroup\\`/\\`permissionsSummaryToken\\` e, se houver travadas,\n \\`permissionsFreeGroup\\`/\\`permissionsFreeToken\\`. O motivo da trava (\\`freeForAll\\`, \\`freeForAuthenticated\\`,\n \\`publicNoToken\\`...) entra só no \\`label\\` do nó (nome acessível), não ao lado da operação. Grava só a diferença, em\n sequência: primeiro as liberações, depois as retiradas. O painel tem \\`mode\\` (\\`PermissionMode\\`, em\n \\`operation-level.ts\\`):\n - \\`group\\` (aba Acessos): só \\`protected\\` depende de permissão; operação de outro nível sem permissão gravada vem\n marcada e desabilitada e fica fora da diferença (o servidor recusa com 400 \\`operation_not_protected\\`).\n - \\`token\\` (aba Tokens): o token não tem login, então \\`protected\\`, \\`private\\` (e \\`optional\\`) são escolhíveis e\n nada vem marcado sem permissão gravada; \\`public\\` vem desmarcada e desabilitada (o servidor recusa com 400\n \\`operation_public\\`).\n Nos dois modos, uma permissão antiga numa operação travada segue editável, para dar para retirar.\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, com a regra do modo \\`token\\`: nada pré-marcado, \\`protected\\` e\n \\`private\\` escolhíveis, \\`public\\` desmarcada e desabilitada e nunca enviada 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) e \\`mode=\"token\"\\`.\n- **Erros dos tokens** (\\`autoServiceErrorText\\`, pt-BR/en/es em \\`autoService.tokenErrors\\`): \\`invalid_expires_at\\`,\n \\`invalid_validity\\`, \\`invalid_operation_ids\\`, \\`operation_public\\` (token) e \\`operation_not_protected\\` (grupo); 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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAwFd;;"}
|
|
@@ -15,13 +15,14 @@ ativo.
|
|
|
15
15
|
|
|
16
16
|
## Como usar
|
|
17
17
|
|
|
18
|
-
1. A tela abre com
|
|
19
|
-
|
|
20
|
-
2. Para criar uma aplicação, clique em **Cadastrar
|
|
18
|
+
1. A tela abre com o botão **Cadastrar** e um cartão com o seletor **Selecione uma aplicação**, que lista as
|
|
19
|
+
aplicações do projeto. Escolha uma e clique em **Consultar**.
|
|
20
|
+
2. Para criar uma aplicação, clique em **Cadastrar**. No modal **Nova aplicação**, preencha o
|
|
21
21
|
**Nome** (obrigatório) e os **Grants** (separados por vírgula; já vem \`client_credentials\`) e clique em **Salvar**.
|
|
22
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
23
|
ele não é exibido de novo.** O aviso some quando você o fecha, troca de client ou exclui a aplicação.
|
|
24
|
-
4.
|
|
24
|
+
4. A aplicação consultada abre embaixo do seletor: um cartão com o nome, a situação (**Ativo** ou **Inativo**),
|
|
25
|
+
os grants e os botões das ações da aplicação:
|
|
25
26
|
- **Editar**: muda nome, grants e a caixa **Ativo**.
|
|
26
27
|
- **Desativar** / **Ativar**: liga ou desliga a aplicação sem apagar nada.
|
|
27
28
|
- **Gerar novo segredo**: abre a confirmação **Gerar um novo segredo?**. Confirmando, o segredo atual deixa de
|
|
@@ -29,8 +30,8 @@ ativo.
|
|
|
29
30
|
até 1 hora) e o novo aparece numa janela, **uma única vez**, com o botão **Copiar**. **Concluir** fecha a janela.
|
|
30
31
|
- **Excluir**: abre a confirmação **Excluir aplicação?** com o nome dela; só depois de **Excluir** no diálogo a
|
|
31
32
|
aplicação é apagada e a credencial dela para de funcionar. **Cancelar** (ou Esc) não muda nada.
|
|
32
|
-
5.
|
|
33
|
-
|
|
33
|
+
5. Embaixo do cartão ficam as abas **Operações**, **Acessos** e **Tokens** da aplicação. Consultar outra
|
|
34
|
+
aplicação volta para a aba **Operações**.
|
|
34
35
|
|
|
35
36
|
> **Desativar** age na hora e se desfaz com **Ativar**. **Excluir** não tem volta: na dúvida, desative. Depois de
|
|
36
37
|
> excluir aparece a mensagem **Exclusão concluída.**; se o servidor recusar, a mensagem de erro diz o motivo e a
|
|
@@ -50,9 +51,11 @@ o acesso dele às aplicações é gerido só no painel central do Argos.
|
|
|
50
51
|
- **Novo acesso**: escolha o **Grupo** e clique em **Criar**. Só aparecem os grupos do seu client (sem o de
|
|
51
52
|
administração).
|
|
52
53
|
- No menu de cada linha:
|
|
53
|
-
- **Gerenciar operações** abre o painel **Operações de nome do grupo
|
|
54
|
-
|
|
55
|
-
|
|
54
|
+
- **Gerenciar operações** abre o painel **Operações de nome do grupo**: uma árvore com as operações agrupadas pelo
|
|
55
|
+
identificador (\`teams:members:add\` fica na pasta **teams** › **members**), cada uma com método, nível e descrição.
|
|
56
|
+
No topo, um resumo diz quantas operações protegidas estão liberadas para o grupo. Só as **protected** dependem de
|
|
57
|
+
permissão: as **public**, **private** e **optional** aparecem marcadas e travadas. Cada pasta mostra quantas das
|
|
58
|
+
operações escolhíveis dela estão marcadas (**X de Y**) e marcá-la marca todas elas. Marque o que o grupo pode
|
|
56
59
|
chamar, desmarque o que não pode e clique em **Confirmar alterações** (o botão só habilita quando algo mudou).
|
|
57
60
|
**Cancelar** descarta.
|
|
58
61
|
- **Remover** pede confirmação (**Remover acesso à aplicação?**, com o nome do grupo) e só então tira o acesso do
|
|
@@ -70,12 +73,15 @@ da aplicação sem login. A tabela mostra **Nome**, **Início do token** (os pri
|
|
|
70
73
|
- **Nome** (obrigatório) e **Descrição** (opcional).
|
|
71
74
|
- **Expira em**: de amanhã até 365 dias a partir de hoje (vem com 90 dias). O token vale até a meia-noite desse
|
|
72
75
|
dia.
|
|
73
|
-
- **Operações liberadas ao token**:
|
|
74
|
-
**private**
|
|
76
|
+
- **Operações liberadas ao token**: nada vem marcado. O token não tem login, então marque as operações
|
|
77
|
+
**protected**, **private** e **optional** que ele pode chamar; o que ficar desmarcado ele não chama. As **public** aparecem
|
|
78
|
+
desmarcadas e travadas, com a nota **pública: não precisa de token**.
|
|
75
79
|
2. **Criar token** mostra o valor do token **uma única vez**, com o botão **Copiar**. **Copie e guarde na hora:
|
|
76
80
|
fechando a janela (Concluir ou Esc) não há como vê-lo de novo.** Se ele se perder, revogue e crie outro.
|
|
77
81
|
3. No menu de cada linha:
|
|
78
|
-
- **Gerenciar operações** abre o mesmo painel
|
|
82
|
+
- **Gerenciar operações** abre o mesmo painel em árvore, para o token: marca o que já está liberado, deixa marcar e
|
|
83
|
+
desmarcar as **protected**, **private** e **optional** e mantém as **public** travadas e desmarcadas (o resumo
|
|
84
|
+
do topo diz quantas são). **Confirmar alterações** grava só o que mudou.
|
|
79
85
|
- **Revogar** pede confirmação (**Revogar token?**, com o nome dele). Confirmando, o token deixa de funcionar na
|
|
80
86
|
hora e fica na lista como **Revogado**. Não tem volta.
|
|
81
87
|
|
|
@@ -84,4 +90,4 @@ motivo aparece no próprio formulário.
|
|
|
84
90
|
`;
|
|
85
91
|
|
|
86
92
|
export { apps_usage as default };
|
|
87
|
-
//# sourceMappingURL=trismegisto-spine-auto-service-apps.usage-
|
|
93
|
+
//# sourceMappingURL=trismegisto-spine-auto-service-apps.usage-DeLfYMeO.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"trismegisto-spine-auto-service-apps.usage-DeLfYMeO.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 o botão **Cadastrar** e um cartão com o seletor **Selecione uma aplicação**, que lista as\n aplicações do projeto. Escolha uma e clique em **Consultar**.\n2. Para criar uma aplicação, clique em **Cadastrar**. 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. A aplicação consultada abre embaixo do seletor: um cartão com o nome, a situação (**Ativo** ou **Inativo**),\n os grants e os botões das 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. Embaixo do cartão ficam as abas **Operações**, **Acessos** e **Tokens** da aplicação. Consultar outra\n aplicação volta para a aba **Operações**.\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**: uma árvore com as operações agrupadas pelo\n identificador (\\`teams:members:add\\` fica na pasta **teams** › **members**), cada uma com método, nível e descrição.\n No topo, um resumo diz quantas operações protegidas estão liberadas para o grupo. Só as **protected** dependem de\n permissão: as **public**, **private** e **optional** aparecem marcadas e travadas. Cada pasta mostra quantas das\n operações escolhíveis dela estão marcadas (**X de Y**) e marcá-la marca todas elas. 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**: nada vem marcado. O token não tem login, então marque as operações\n **protected**, **private** e **optional** que ele pode chamar; o que ficar desmarcado ele não chama. As **public** aparecem\n desmarcadas e travadas, com a nota **pública: não precisa de token**.\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 em árvore, para o token: marca o que já está liberado, deixa marcar e\n desmarcar as **protected**, **private** e **optional** e mantém as **public** travadas e desmarcadas (o resumo\n do topo diz quantas são). **Confirmar alterações** grava só o que mudou.\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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAsFd;;"}
|
|
@@ -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-DdtDk_xl.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>hm-combobox{flex:1 1 16rem;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-empty{margin:var(--hm-space-xs) 0 0;font-size:var(--hm-font-size-sm)}.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
|
+
}
|
|
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>hm-combobox{flex:1 1 16rem;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-empty{margin:var(--hm-space-xs) 0 0;font-size:var(--hm-font-size-sm)}.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
|
+
}] });
|
|
35
|
+
|
|
36
|
+
export { AutoServiceAuditComponent };
|
|
37
|
+
//# sourceMappingURL=trismegisto-spine-auto-service-auto-service-audit.component-BNtNWfiu.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-BNtNWfiu.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,g8CAAA,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,g8CAAA,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
|
|
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>hm-combobox{flex:1 1 16rem;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-empty{margin:var(--hm-space-xs) 0 0;font-size:var(--hm-font-size-sm)}.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
|
|
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>hm-combobox{flex:1 1 16rem;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-empty{margin:var(--hm-space-xs) 0 0;font-size:var(--hm-font-size-sm)}.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-DdtDk_xl.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-DdtDk_xl.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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"}
|