@trismegisto/spine 3.3.3 → 3.3.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (47) hide show
  1. package/README.md +15 -2
  2. package/fesm2022/trismegisto-spine-audit.mjs +6 -6
  3. package/fesm2022/trismegisto-spine-audit.mjs.map +1 -1
  4. package/fesm2022/{trismegisto-spine-auto-service-auto-service-client.component-BAfeLyTB.mjs → trismegisto-spine-auto-service-auto-service-client.component-kAXaCM5W.mjs} +8 -8
  5. package/fesm2022/{trismegisto-spine-auto-service-auto-service-client.component-BAfeLyTB.mjs.map → trismegisto-spine-auto-service-auto-service-client.component-kAXaCM5W.mjs.map} +1 -1
  6. package/fesm2022/{trismegisto-spine-auto-service-auto-service-groups.component-BYjIQ9ID.mjs → trismegisto-spine-auto-service-auto-service-groups.component-DE2QIGRH.mjs} +251 -85
  7. package/fesm2022/trismegisto-spine-auto-service-auto-service-groups.component-DE2QIGRH.mjs.map +1 -0
  8. package/fesm2022/{trismegisto-spine-auto-service-auto-service-news-page.component-CBemH4hr.mjs → trismegisto-spine-auto-service-auto-service-news-page.component-BW7BJ0oD.mjs} +2 -2
  9. package/fesm2022/{trismegisto-spine-auto-service-auto-service-news-page.component-CBemH4hr.mjs.map → trismegisto-spine-auto-service-auto-service-news-page.component-BW7BJ0oD.mjs.map} +1 -1
  10. package/fesm2022/{trismegisto-spine-auto-service-auto-service-ratings-page.component-C_THGTkw.mjs → trismegisto-spine-auto-service-auto-service-ratings-page.component-CHPU-QLJ.mjs} +2 -2
  11. package/fesm2022/{trismegisto-spine-auto-service-auto-service-ratings-page.component-C_THGTkw.mjs.map → trismegisto-spine-auto-service-auto-service-ratings-page.component-CHPU-QLJ.mjs.map} +1 -1
  12. package/fesm2022/trismegisto-spine-auto-service-auto-service-suggestions-page.component-CkiCTmXD.mjs +3733 -0
  13. package/fesm2022/trismegisto-spine-auto-service-auto-service-suggestions-page.component-CkiCTmXD.mjs.map +1 -0
  14. package/fesm2022/{trismegisto-spine-auto-service-auto-service.component-QsIQ61w2.mjs → trismegisto-spine-auto-service-auto-service.component-D58Ht9PH.mjs} +7 -7
  15. package/fesm2022/{trismegisto-spine-auto-service-auto-service.component-QsIQ61w2.mjs.map → trismegisto-spine-auto-service-auto-service.component-D58Ht9PH.mjs.map} +1 -1
  16. package/fesm2022/{trismegisto-spine-auto-service-groups.technical-_jQrg1Qh.mjs → trismegisto-spine-auto-service-groups.technical-CB1D3ANC.mjs} +12 -3
  17. package/fesm2022/trismegisto-spine-auto-service-groups.technical-CB1D3ANC.mjs.map +1 -0
  18. package/fesm2022/{trismegisto-spine-auto-service-groups.usage-OvWjNeeT.mjs → trismegisto-spine-auto-service-groups.usage-De2MhlE7.mjs} +7 -2
  19. package/fesm2022/{trismegisto-spine-auto-service-groups.usage-OvWjNeeT.mjs.map → trismegisto-spine-auto-service-groups.usage-De2MhlE7.mjs.map} +1 -1
  20. package/fesm2022/{trismegisto-spine-auto-service-suggestions.technical-BtUK6sKD.mjs → trismegisto-spine-auto-service-suggestions.technical-CGBBzAR8.mjs} +14 -1
  21. package/fesm2022/{trismegisto-spine-auto-service-suggestions.technical-BtUK6sKD.mjs.map → trismegisto-spine-auto-service-suggestions.technical-CGBBzAR8.mjs.map} +1 -1
  22. package/fesm2022/{trismegisto-spine-auto-service-suggestions.usage-BwO9Hjsx.mjs → trismegisto-spine-auto-service-suggestions.usage-DnAJS-Z0.mjs} +26 -3
  23. package/fesm2022/trismegisto-spine-auto-service-suggestions.usage-DnAJS-Z0.mjs.map +1 -0
  24. package/fesm2022/trismegisto-spine-auto-service.mjs +24 -11
  25. package/fesm2022/trismegisto-spine-auto-service.mjs.map +1 -1
  26. package/fesm2022/{trismegisto-spine-layout-suggestions-page.component-xI2gDMok.mjs → trismegisto-spine-layout-suggestions-page.component-CEKMqera.mjs} +3 -3
  27. package/fesm2022/{trismegisto-spine-layout-suggestions-page.component-xI2gDMok.mjs.map → trismegisto-spine-layout-suggestions-page.component-CEKMqera.mjs.map} +1 -1
  28. package/fesm2022/{trismegisto-spine-layout-trismegisto-spine-layout-Clphrsgc.mjs → trismegisto-spine-layout-trismegisto-spine-layout-DiAfxIGP.mjs} +428 -93
  29. package/fesm2022/trismegisto-spine-layout-trismegisto-spine-layout-DiAfxIGP.mjs.map +1 -0
  30. package/fesm2022/trismegisto-spine-layout.mjs +1 -1
  31. package/fesm2022/trismegisto-spine-side-panel.mjs +1 -1
  32. package/fesm2022/trismegisto-spine-side-panel.mjs.map +1 -1
  33. package/fesm2022/trismegisto-spine.mjs +528 -10
  34. package/fesm2022/trismegisto-spine.mjs.map +1 -1
  35. package/package.json +6 -6
  36. package/types/trismegisto-spine-auto-service.d.ts +20 -4
  37. package/types/trismegisto-spine-auto-service.d.ts.map +1 -1
  38. package/types/trismegisto-spine-layout.d.ts +327 -63
  39. package/types/trismegisto-spine-layout.d.ts.map +1 -1
  40. package/types/trismegisto-spine.d.ts +221 -3
  41. package/types/trismegisto-spine.d.ts.map +1 -1
  42. package/fesm2022/trismegisto-spine-auto-service-auto-service-groups.component-BYjIQ9ID.mjs.map +0 -1
  43. package/fesm2022/trismegisto-spine-auto-service-auto-service-suggestions-page.component-mMjE3JOL.mjs +0 -2179
  44. package/fesm2022/trismegisto-spine-auto-service-auto-service-suggestions-page.component-mMjE3JOL.mjs.map +0 -1
  45. package/fesm2022/trismegisto-spine-auto-service-groups.technical-_jQrg1Qh.mjs.map +0 -1
  46. package/fesm2022/trismegisto-spine-auto-service-suggestions.usage-BwO9Hjsx.mjs.map +0 -1
  47. package/fesm2022/trismegisto-spine-layout-trismegisto-spine-layout-Clphrsgc.mjs.map +0 -1
@@ -18,7 +18,7 @@ cabeçalho \`x-access-token\`. Peças: dois \`hm-combobox\` (nível de acesso e
18
18
  | Criar grupo | \`POST /auto-service/:clientId/groups\` (\`{ name, type_id, description? }\`) |
19
19
  | Editar grupo | \`PUT /auto-service/:clientId/groups/:groupId\` (\`{ name, type_id, description, enabled }\`) |
20
20
  | Excluir grupo | \`DELETE /auto-service/:clientId/groups/:groupId\` |
21
- | Membros do grupo | \`GET /auto-service/:clientId/groups/:groupId/members\` |
21
+ | Membros do grupo | \`GET /auto-service/:clientId/groups/:groupId/members?page=&limit=\` (\`{ members, total, page, limit }\`: uma página pelo login, \`limit\` padrão 50 e teto 200; a tela pede páginas de 200 até o fim) |
22
22
  | Busca de usuários | \`GET /auto-service/:clientId/users?search=&limit=\` |
23
23
  | Sugestões de membro | \`GET /auto-service/:clientId/groups/:groupId/member-suggestions?limit=8\` (quem está em outros grupos do projeto e não neste, com foto e os grupos) |
24
24
  | Adicionar membro | \`POST /auto-service/:clientId/groups/:groupId/members\` (\`{ user_id, role }\`) |
@@ -60,7 +60,16 @@ cabeçalho \`x-access-token\`. Peças: dois \`hm-combobox\` (nível de acesso e
60
60
  \`deleteError\`). O \`AutoServiceDeleteFeedback\` usa a mesma função em todas as exclusões do auto-serviço.
61
61
  - Sugestões: até 8, da rota própria (ordem do servidor: mais grupos do projeto primeiro), em chips; sem "ver mais".
62
62
  Falha na rota deixa sem sugestões. Busca: a partir de 2 caracteres, depois de 300 ms sem digitar, \`limit=10\`.
63
- Membros atuais são retirados dos dois.
63
+ Membros atuais são retirados dos dois (as sugestões já vêm sem eles do servidor; a busca, pelos membros já
64
+ carregados).
65
+ - **Carga progressiva** (desde a 3.3.4): a tabela de membros e o modal pedem o grupo inteiro em páginas de 200, uma
66
+ depois da outra (\`MembersLoader\`, \`groups/members-loader.ts\`), e funcionam desde a primeira; enquanto carrega
67
+ aparece \`membersLoadingProgress\` ("Carregando membros… 400 de 1.250") com \`membersPartialResults\`. Sem paginador:
68
+ a grade usa rolagem virtual. A busca é local e instantânea (nome, login, e-mail). Falha numa página mostra
69
+ \`membersLoadIncomplete\` com \`retryLoad\`, que continua da página que falhou. Fechar o modal, trocar de grupo ou
70
+ destruir a tela cancela a página pendente. \`countChange\` emite o total do servidor. No modal, um **Novo** que
71
+ aparece numa página que chega depois sai das inclusões (já era membro); o número ao lado de "Membros do grupo" é o
72
+ total do grupo mais os novos.
64
73
  - Funções oferecidas pela tela: Administrador e Editor; vazio grava \`role: null\` (membro sem função, que só vê os outros\n membros nas configurações do app). Outro valor o servidor recusa (\`400 invalid_role\`).
65
74
  - **Salvar alterações** grava só a diferença, em sequência: adições, depois remoções, depois trocas de função (dos
66
75
  membros que ficaram). Ao terminar, emite \`saved\` e a tabela de membros recarrega. Se uma chamada falhar, o modal mostra o
@@ -68,4 +77,4 @@ cabeçalho \`x-access-token\`. Peças: dois \`hm-combobox\` (nível de acesso e
68
77
  `;
69
78
 
70
79
  export { groups_technical as default };
71
- //# sourceMappingURL=trismegisto-spine-auto-service-groups.technical-_jQrg1Qh.mjs.map
80
+ //# sourceMappingURL=trismegisto-spine-auto-service-groups.technical-CB1D3ANC.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trismegisto-spine-auto-service-groups.technical-CB1D3ANC.mjs","sources":["../../../projects/ui/auto-service/src/docs/groups.technical.ts"],"sourcesContent":["// Especificação técnica da tela Grupos 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 `# Grupos — especificação técnica\n\nTela \\`AutoServiceGroupsComponent\\`, ligada ao router de template \\`AUTO_SERVICE_GROUPS_TEMPLATE_ROUTER_ID\\`\n(\\`ad100001-…\\`). Fala com o argos-admin-server em \\`{adminApi}/auto-service\\` (\\`AutoServiceService\\`), com o token no\ncabeçalho \\`x-access-token\\`. Peças: dois \\`hm-combobox\\` (nível de acesso e grupo) + Consultar, \\`AutoServiceGroupModalComponent\\` (criar/editar),\n\\`AutoServiceGroupMembersComponent\\` (membros do grupo aberto) e \\`AutoServiceGroupMembersModalComponent\\`.\n\n## Endpoints\n\n| Ação | Endpoint |\n| --- | --- |\n| Client administrado (só o do token) | \\`GET /auto-service\\` |\n| Grupos do projeto do client | \\`GET /auto-service/:clientId/groups\\` (\\`{ id, name, description, enabled, type }\\`, sem o grupo de administração) |\n| Tipos de grupo do realm | \\`GET /auto-service/:clientId/group-types\\` (\\`{ id, name, level, assignable }\\`) |\n| Criar grupo | \\`POST /auto-service/:clientId/groups\\` (\\`{ name, type_id, description? }\\`) |\n| Editar grupo | \\`PUT /auto-service/:clientId/groups/:groupId\\` (\\`{ name, type_id, description, enabled }\\`) |\n| Excluir grupo | \\`DELETE /auto-service/:clientId/groups/:groupId\\` |\n| Membros do grupo | \\`GET /auto-service/:clientId/groups/:groupId/members?page=&limit=\\` (\\`{ members, total, page, limit }\\`: uma página pelo login, \\`limit\\` padrão 50 e teto 200; a tela pede páginas de 200 até o fim) |\n| Busca de usuários | \\`GET /auto-service/:clientId/users?search=&limit=\\` |\n| Sugestões de membro | \\`GET /auto-service/:clientId/groups/:groupId/member-suggestions?limit=8\\` (quem está em outros grupos do projeto e não neste, com foto e os grupos) |\n| Adicionar membro | \\`POST /auto-service/:clientId/groups/:groupId/members\\` (\\`{ user_id, role }\\`) |\n| Trocar a função | \\`PUT /auto-service/:clientId/groups/:groupId/members/:userId\\` (\\`{ role }\\`) |\n| Remover membro | \\`DELETE /auto-service/:clientId/groups/:groupId/members/:userId\\` |\n\n## Regras\n\n- **Autorização** (\\`clientAdminGuard\\` no servidor): o \\`sub\\` é membro do grupo de administração (\\`is_admin\\`,\n habilitado) do projeto do client **e** está com o crachá Administrador ativo. Todo token só administra o client em\n que foi emitido: \\`GET /auto-service\\` devolve só ele. O seletor de client\n (\\`AutoServiceClientPickerComponent\\`) mostra \\`loading\\` enquanto busca; com um client, escolhe sozinho e não desenha\n mais nada; com nenhum, mostra\n \\`autoService.noClients\\`; a combobox só aparece se a API devolver mais de um.\n- Grupo de outro projeto responde \\`404\\` (\\`assertGroupBelongsToClient\\`).\n- Seletores: grupos e tipos carregados juntos ao escolher o client. **Nível de acesso** (\\`levelOptions\\`): os tipos\n de \\`group-types\\` com \\`assignable !== false\\` ou com algum grupo na lista (o Administrador fica de fora), mais os tipos\n que só aparecem nos grupos (sem a rota de tipos) e \"Sem nível\" (\\`NO_LEVEL\\`) se algum grupo não tiver tipo; do\n \\`level\\` maior para o menor. **Grupo** (\\`groupOptions\\`): só os do nível escolhido, em ordem alfabética; trocar o\n nível limpa o grupo. **Consultar** abre o grupo (resumo com Editar/Excluir + membros); abrir um grupo aponta os dois\n seletores para ele. Depois de criar/editar/excluir a lista recarrega; o grupo aberto é trocado pela versão nova (ou\n fecha, se sumiu); o grupo recém-criado já abre. (Na 3.0.0 a lista era um \\`hm-data-grid\\`; voltou ao seletor a\n pedido do usuário.)\n- Modal: nome obrigatório (1–100, aparado), tipo obrigatório, descrição opcional; na criação a descrição vazia não\n vai no corpo; na edição vai como \\`null\\` (apaga). Tipos oferecidos: só \\`assignable !== false\\`. A falha aparece no\n modal (\\`hm-alert\\`) e o modal continua aberto.\n- **Grupo de administração** (\\`is_admin\\`): gerido só no painel central (Argos), não aparece no auto-serviço. O\n servidor não o devolve em \\`GET /groups\\` e responde \\`404\\` a editar, excluir e mexer nos membros dele (como grupo\n de outro projeto). Servidor antigo que ainda o devolva (\\`is_admin: true\\`): a tela descarta na carga da lista\n (\\`load\\`) e na lista de grupos do novo acesso (**Cliente › Acesso**). O Administrador (\\`assignable: false\\`)\n nunca entra nos tipos do modal. Os textos \\`adminGroupTag\\`, \\`adminGroupNote\\`, \\`adminGroupEditNote\\` e\n \\`adminGroupLastMemberWarning\\` saíram do catálogo na 3.3.1.\n- **Erros** (\\`autoServiceErrorText\\`, em \\`auto-service-errors.ts\\`): o código \\`error\\` da resposta vira o texto de\n \\`autoService.groupErrors\\` no idioma ativo — \\`invalid_type\\`, \\`admin_type_reserved\\`, \\`empty_update\\`,\n \\`group_project_immutable\\` (400); \\`group_name_taken\\`, \\`admin_group_immutable\\`, \\`admin_group_protected\\`,\n \\`admin_group_last_member\\`, \\`admin_group_access_protected\\` (409; de servidor antigo — o atual responde 404 ao\n grupo de administração); \\`404\\` de grupo → \\`groupNotFound\\`. Código\n desconhecido usa o \\`detail\\` do servidor e, por último, o texto genérico (\\`groupSaveError\\`, \\`membersSaveError\\` ou\n \\`deleteError\\`). O \\`AutoServiceDeleteFeedback\\` usa a mesma função em todas as exclusões do auto-serviço.\n- Sugestões: até 8, da rota própria (ordem do servidor: mais grupos do projeto primeiro), em chips; sem \"ver mais\".\n Falha na rota deixa sem sugestões. Busca: a partir de 2 caracteres, depois de 300 ms sem digitar, \\`limit=10\\`.\n Membros atuais são retirados dos dois (as sugestões já vêm sem eles do servidor; a busca, pelos membros já\n carregados).\n- **Carga progressiva** (desde a 3.3.4): a tabela de membros e o modal pedem o grupo inteiro em páginas de 200, uma\n depois da outra (\\`MembersLoader\\`, \\`groups/members-loader.ts\\`), e funcionam desde a primeira; enquanto carrega\n aparece \\`membersLoadingProgress\\` (\"Carregando membros… 400 de 1.250\") com \\`membersPartialResults\\`. Sem paginador:\n a grade usa rolagem virtual. A busca é local e instantânea (nome, login, e-mail). Falha numa página mostra\n \\`membersLoadIncomplete\\` com \\`retryLoad\\`, que continua da página que falhou. Fechar o modal, trocar de grupo ou\n destruir a tela cancela a página pendente. \\`countChange\\` emite o total do servidor. No modal, um **Novo** que\n aparece numa página que chega depois sai das inclusões (já era membro); o número ao lado de \"Membros do grupo\" é o\n total do grupo mais os novos.\n- Funções oferecidas pela tela: Administrador e Editor; vazio grava \\`role: null\\` (membro sem função, que só vê os outros\\n membros nas configurações do app). Outro valor o servidor recusa (\\`400 invalid_role\\`).\n- **Salvar alterações** grava só a diferença, em sequência: adições, depois remoções, depois trocas de função (dos\n membros que ficaram). Ao terminar, emite \\`saved\\` e a tabela de membros recarrega. Se uma chamada falhar, o modal mostra o\n erro, emite \\`saved\\` (parte pode ter sido gravada) e recarrega os membros.\n`;\n"],"names":[],"mappings":"AAAA;AACA;AACA;AACA,uBAAe,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAyEd;;"}
@@ -67,7 +67,12 @@ grupo e só grava quando você confirma.
67
67
  (ou fechar o modal) descarta o que não foi salvo. Se uma parte falhar, o modal mostra o motivo e recarrega a
68
68
  lista com o que de fato ficou gravado.
69
69
 
70
- Depois de salvar, a tabela **Membros do grupo** é recarregada.
70
+ Em grupos grandes, a lista chega aos poucos: ela já aparece com os primeiros membros e mostra "Carregando membros… 400
71
+ de 1.250" até terminar. **Buscar membro** filtra na hora, por nome, login ou e-mail; enquanto a lista carrega, mais
72
+ gente pode aparecer na busca. Se a carga falhar no meio, **Tentar de novo** continua de onde parou.
73
+
74
+ Depois de salvar, a tabela **Membros do grupo** é recarregada. Ela também mostra o grupo inteiro, com a busca no
75
+ campo acima dela.
71
76
 
72
77
  ## O que esta tela não faz
73
78
 
@@ -78,4 +83,4 @@ Depois de salvar, a tabela **Membros do grupo** é recarregada.
78
83
  `;
79
84
 
80
85
  export { groups_usage as default };
81
- //# sourceMappingURL=trismegisto-spine-auto-service-groups.usage-OvWjNeeT.mjs.map
86
+ //# sourceMappingURL=trismegisto-spine-auto-service-groups.usage-De2MhlE7.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"trismegisto-spine-auto-service-groups.usage-OvWjNeeT.mjs","sources":["../../../projects/ui/auto-service/src/docs/groups.usage.ts"],"sourcesContent":["// Manual de uso da tela Grupos 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 `# Grupos\n\nMantenha os grupos do projeto do seu app sem depender do painel central: crie, edite e exclua grupos, veja os\nmembros de cada um, adicione e remova pessoas e defina a função de cada uma.\n\n## Antes de começar\n\nO auto-serviço administra o app em que você está logado: não há client para escolher. É preciso estar no grupo de\nadministração do projeto desse app e com o crachá **Administrador** ativo. Se aparecer o aviso de que você não\nadministra este app, falta uma dessas duas coisas: troque de crachá no menu do seu perfil, se disponível, ou peça\nacesso a quem administra o projeto.\n\n## A lista de grupos\n\nA tela abre com o botão **Novo grupo** e um cartão com dois seletores (o grupo de administração do projeto não\nentra; veja abaixo):\n\n1. **Nível de acesso**: o tipo do grupo (o crachá), do nível mais alto para o mais baixo.\n2. **Grupo**: só os grupos do nível escolhido. Trocar o nível limpa o grupo escolhido.\n\nClique em **Consultar** para abrir o grupo embaixo: um cartão com o nome, os selos do tipo (a cor acompanha o nível)\ne da situação (**Ativo** ou **Inativo**), a descrição e os botões **Editar** e **Excluir**, e a tabela **Membros do\ngrupo**.\n\n## Criar e editar\n\n- **Novo grupo** (acima dos seletores) abre o modal com **Nome** (obrigatório, até 100 caracteres), **Tipo**\n (obrigatório) e **Descrição** (opcional). **Criar** grava e já abre o grupo novo, para incluir os membros.\n- **Editar** abre o mesmo modal preenchido, com a caixa **Ativo** a mais: desmarcada, o grupo fica inativo.\n **Salvar** grava; apagar a descrição a remove.\n- O tipo **Administrador** não aparece na lista de tipos: ele é só do grupo de administração, que não se gere aqui.\n- Se o servidor recusar, a mensagem aparece no próprio modal e nada é gravado. Os casos mais comuns: já existe um\n grupo com esse nome no projeto, ou o tipo escolhido deixou de existir.\n\n## Excluir\n\n**Excluir** pede confirmação (**Excluir grupo?**, com o nome do grupo). Excluir um grupo apaga também os membros\ndele, os acessos a telas (**Cliente › Acesso**) e as permissões em aplicações (**Aplicações › Acessos**), e não\npode ser desfeito. Depois aparece **Exclusão concluída.**; se o servidor recusar, a mensagem diz o motivo e o grupo\ncontinua aberto.\n\n## O grupo de administração\n\nTodo projeto tem um, e só um, grupo de administração: quem está nele administra o app no auto-serviço. Ele é gerido\nsó no painel central (Argos) e não aparece no auto-serviço: não está nos seletores, não se edita nem se exclui aqui, e os\nmembros dele também não se gerenciam por esta tela. Para incluir ou tirar alguém da administração do app, peça a\nquem administra o Argos.\n\n## Gerenciar membros\n\nCom o grupo aberto, clique em **Gerenciar membros**. O modal **Membros — nome do grupo** junta tudo o que muda no\ngrupo e só grava quando você confirma.\n\n- **Adicionar:** em **Adicionar usuário**, digite pelo menos 2 letras do nome, do login ou do e-mail e escolha a\n pessoa na lista (quem já é membro não aparece). Se quiser, escolha a **Função** (Administrador ou Editor) e clique\n em **Adicionar**. A pessoa entra na lista com o selo **Novo**.\n- **Sugestões:** até 8 pessoas que já estão em outros grupos deste sistema e ainda não neste (primeiro quem está em\n mais grupos). Passe o mouse para ver em quais; clicar inclui direto, com a função escolhida ao lado.\n- **Mudar a função:** use a coluna **Função** de cada membro. **Membro (sem função)** deixa a pessoa como membro sem função: ela só vê os outros membros.\n- **Remover:** marque os membros na lista. Eles vão para o painel **Remoção**, ao lado (vazio, ele só mostra a dica), e a função deles fica\n travada. **Desfazer remoção** (o ícone ao lado do nome) devolve o membro. Marcar alguém com o selo **Novo**\n apenas o tira da lista, porque ele ainda não foi gravado.\n- **Salvar alterações** grava tudo de uma vez: as pessoas novas, as remoções e as funções trocadas. **Cancelar**\n (ou fechar o modal) descarta o que não foi salvo. Se uma parte falhar, o modal mostra o motivo e recarrega a\n lista com o que de fato ficou gravado.\n\nDepois de salvar, a tabela **Membros do grupo** é recarregada.\n\n## O que esta tela não faz\n\n- Não mexe em grupos de outros projetos: só aparecem, e só se alteram, os grupos do projeto deste app.\n- Não mexe no grupo de administração do projeto: ele fica só no painel central (Argos).\n- Não define o que o grupo pode acessar. As telas que cada grupo vê ficam em **Cliente › Acesso**; as operações que\n cada grupo pode chamar numa aplicação ficam em **Aplicações › Acessos**.\n`;\n"],"names":[],"mappings":"AAAA;AACA;AACA;AACA,mBAAe,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA0Ed;;"}
1
+ {"version":3,"file":"trismegisto-spine-auto-service-groups.usage-De2MhlE7.mjs","sources":["../../../projects/ui/auto-service/src/docs/groups.usage.ts"],"sourcesContent":["// Manual de uso da tela Grupos 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 `# Grupos\n\nMantenha os grupos do projeto do seu app sem depender do painel central: crie, edite e exclua grupos, veja os\nmembros de cada um, adicione e remova pessoas e defina a função de cada uma.\n\n## Antes de começar\n\nO auto-serviço administra o app em que você está logado: não há client para escolher. É preciso estar no grupo de\nadministração do projeto desse app e com o crachá **Administrador** ativo. Se aparecer o aviso de que você não\nadministra este app, falta uma dessas duas coisas: troque de crachá no menu do seu perfil, se disponível, ou peça\nacesso a quem administra o projeto.\n\n## A lista de grupos\n\nA tela abre com o botão **Novo grupo** e um cartão com dois seletores (o grupo de administração do projeto não\nentra; veja abaixo):\n\n1. **Nível de acesso**: o tipo do grupo (o crachá), do nível mais alto para o mais baixo.\n2. **Grupo**: só os grupos do nível escolhido. Trocar o nível limpa o grupo escolhido.\n\nClique em **Consultar** para abrir o grupo embaixo: um cartão com o nome, os selos do tipo (a cor acompanha o nível)\ne da situação (**Ativo** ou **Inativo**), a descrição e os botões **Editar** e **Excluir**, e a tabela **Membros do\ngrupo**.\n\n## Criar e editar\n\n- **Novo grupo** (acima dos seletores) abre o modal com **Nome** (obrigatório, até 100 caracteres), **Tipo**\n (obrigatório) e **Descrição** (opcional). **Criar** grava e já abre o grupo novo, para incluir os membros.\n- **Editar** abre o mesmo modal preenchido, com a caixa **Ativo** a mais: desmarcada, o grupo fica inativo.\n **Salvar** grava; apagar a descrição a remove.\n- O tipo **Administrador** não aparece na lista de tipos: ele é só do grupo de administração, que não se gere aqui.\n- Se o servidor recusar, a mensagem aparece no próprio modal e nada é gravado. Os casos mais comuns: já existe um\n grupo com esse nome no projeto, ou o tipo escolhido deixou de existir.\n\n## Excluir\n\n**Excluir** pede confirmação (**Excluir grupo?**, com o nome do grupo). Excluir um grupo apaga também os membros\ndele, os acessos a telas (**Cliente › Acesso**) e as permissões em aplicações (**Aplicações › Acessos**), e não\npode ser desfeito. Depois aparece **Exclusão concluída.**; se o servidor recusar, a mensagem diz o motivo e o grupo\ncontinua aberto.\n\n## O grupo de administração\n\nTodo projeto tem um, e só um, grupo de administração: quem está nele administra o app no auto-serviço. Ele é gerido\nsó no painel central (Argos) e não aparece no auto-serviço: não está nos seletores, não se edita nem se exclui aqui, e os\nmembros dele também não se gerenciam por esta tela. Para incluir ou tirar alguém da administração do app, peça a\nquem administra o Argos.\n\n## Gerenciar membros\n\nCom o grupo aberto, clique em **Gerenciar membros**. O modal **Membros — nome do grupo** junta tudo o que muda no\ngrupo e só grava quando você confirma.\n\n- **Adicionar:** em **Adicionar usuário**, digite pelo menos 2 letras do nome, do login ou do e-mail e escolha a\n pessoa na lista (quem já é membro não aparece). Se quiser, escolha a **Função** (Administrador ou Editor) e clique\n em **Adicionar**. A pessoa entra na lista com o selo **Novo**.\n- **Sugestões:** até 8 pessoas que já estão em outros grupos deste sistema e ainda não neste (primeiro quem está em\n mais grupos). Passe o mouse para ver em quais; clicar inclui direto, com a função escolhida ao lado.\n- **Mudar a função:** use a coluna **Função** de cada membro. **Membro (sem função)** deixa a pessoa como membro sem função: ela só vê os outros membros.\n- **Remover:** marque os membros na lista. Eles vão para o painel **Remoção**, ao lado (vazio, ele só mostra a dica), e a função deles fica\n travada. **Desfazer remoção** (o ícone ao lado do nome) devolve o membro. Marcar alguém com o selo **Novo**\n apenas o tira da lista, porque ele ainda não foi gravado.\n- **Salvar alterações** grava tudo de uma vez: as pessoas novas, as remoções e as funções trocadas. **Cancelar**\n (ou fechar o modal) descarta o que não foi salvo. Se uma parte falhar, o modal mostra o motivo e recarrega a\n lista com o que de fato ficou gravado.\n\nEm grupos grandes, a lista chega aos poucos: ela já aparece com os primeiros membros e mostra \"Carregando membros… 400\nde 1.250\" até terminar. **Buscar membro** filtra na hora, por nome, login ou e-mail; enquanto a lista carrega, mais\ngente pode aparecer na busca. Se a carga falhar no meio, **Tentar de novo** continua de onde parou.\n\nDepois de salvar, a tabela **Membros do grupo** é recarregada. Ela também mostra o grupo inteiro, com a busca no\ncampo acima dela.\n\n## O que esta tela não faz\n\n- Não mexe em grupos de outros projetos: só aparecem, e só se alteram, os grupos do projeto deste app.\n- Não mexe no grupo de administração do projeto: ele fica só no painel central (Argos).\n- Não define o que o grupo pode acessar. As telas que cada grupo vê ficam em **Cliente › Acesso**; as operações que\n cada grupo pode chamar numa aplicação ficam em **Aplicações › Acessos**.\n`;\n"],"names":[],"mappings":"AAAA;AACA;AACA;AACA,mBAAe,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA+Ed;;"}
@@ -61,9 +61,22 @@ Tela \`AutoServiceSuggestionsPageComponent\`, ligada ao router de template \`AUT
61
61
  conclusão, rótulos (catálogo do app; cria na hora), capa, tela com "Abrir a tela" (só quando o client administrado
62
62
  é o do app logado), apoios, criada/atualizada, "Última alteração há X por Fulano", chave com copiar, arquivar e
63
63
  excluir. Cada mudança grava na hora e o servidor devolve a tarefa inteira, que atualiza o cartão.
64
+ - **Planejamento** (pasta \`planning/\`, migration 0043 do argos): Resumo, Tarefas, Planejamento, Cronograma,
65
+ Riscos e Fluxo leem do \`SuggestionPlanningStore\` (nos \`providers\` do quadro), que carrega \`GET …/suggestions\`
66
+ sem recorte (as concluídas antigas entram no burndown; arquivadas e agrupadas são tiradas na tela), \`GET …/sprints\`,
67
+ \`GET …/milestones\` e \`GET …/risks\` ao entrar numa delas. Gravações: \`PATCH …/:id\` com \`estimate\` (0..999) e
68
+ \`sprint_id\` (arrastar no \`hm-backlog\`) ou \`start_date\`/\`due_date\` (arrastar no \`hm-gantt\`),
69
+ \`PUT\`/\`DELETE …/:id/dependencies/:dependsOnId\` (409 \`dependency_cycle\`), \`POST\`/\`PATCH\`/\`DELETE …/sprints\`
70
+ (uma ativa por app: 409 \`active_sprint_exists\`; \`state: closed\` devolve as não concluídas ao backlog),
71
+ \`…/milestones\` e \`…/risks\` (migration 0044: o risco leva \`suggestion_id\`, obrigatório ao criar; \`invalid_suggestion\`
72
+ vira o aviso de escolher a tarefa). A nota de risco da tarefa é \`risk_score\` (do servidor, junto com a tarefa) até
73
+ os riscos serem lidos; depois, \`SuggestionPlanningStore.riskScoreOf\` calcula dos riscos abertos e acompanha cada
74
+ gravação. O detalhe da tarefa lê os riscos uma vez ao abrir (\`ensureRisks\`). O burndown sai de \`taskBurndownInput\` → \`burndownSeries\` numa tabela (o spine não
75
+ depende do \`@trismegisto/charts\`); o Gantt e a carga, de \`taskGanttItems\` e \`taskWorkloadAllocations\`. O
76
+ Fluxo é o \`hm-workflow-diagram\` só leitura dos 5 status (o contrato com quem pede).
64
77
  - **Comentários**: texto simples. Interno (\`internal: true\`) só a equipe vê: não conta nem aparece como a última
65
78
  resposta em "Minhas sugestões" (\`/me/suggestions\`). Sugestão de outro client: 404 \`suggestion_not_found\`.
66
79
  `;
67
80
 
68
81
  export { suggestions_technical as default };
69
- //# sourceMappingURL=trismegisto-spine-auto-service-suggestions.technical-BtUK6sKD.mjs.map
82
+ //# sourceMappingURL=trismegisto-spine-auto-service-suggestions.technical-CGBBzAR8.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"trismegisto-spine-auto-service-suggestions.technical-BtUK6sKD.mjs","sources":["../../../projects/ui/auto-service/src/docs/suggestions.technical.ts"],"sourcesContent":["// Especificação técnica da tela Sugestõ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 bundle\n// inicial. Não importe estaticamente nem reexporte no `public-api.ts`.\nexport default `# Sugestões — especificação técnica\n\nTela \\`AutoServiceSuggestionsPageComponent\\`, ligada ao router de template \\`AUTO_SERVICE_SUGGESTIONS_TEMPLATE_ROUTER_ID\\`\n(\\`ad100007-…\\`, página \\`app-suggestions\\` na raiz do menu, migration 0036 do argos): o seletor de client\n(\\`AutoServiceClientPickerComponent\\`) e, embaixo, o painel da tela. Fala com o argos-admin-server em\n\\`{adminApi}/auto-service\\`, com o token no cabeçalho \\`x-access-token\\`.\n\n## Endpoints\n\n| Ação | Endpoint |\n| --- | --- |\n| Clients que a pessoa administra | \\`GET /auto-service\\` |\n| Quadro (\\`web.app_suggestions\\`) | \\`GET /auto-service/:clientId/suggestions?board=true\\`: sem arquivadas, recusadas e concluídas fora da janela (\\`done_days\\`, 7; \\`due_soon_days\\`, 1), com autor, responsáveis e envolvidos (com foto), rótulos, checklist e a última atividade |\n| Arquivo | \\`GET …/suggestions?archive=true\\` (\\`search\\`, \\`kind\\`, \\`status\\`, \\`limit\\`, \\`offset\\`): arquivadas, recusadas e concluídas antigas, com \\`total\\` |\n| Filtros do servidor | \\`kind\\`, \\`status\\`, \\`screen\\`, \\`search\\` (inclui a chave \\`SUG-12\\`), \\`priority\\`, \\`label\\`, \\`assignee\\` (\\`me\\`, \\`none\\` ou um id), \\`due\\` (\\`overdue\\` ou \\`soon\\`) |\n| Criar (equipe) | \\`POST …/suggestions\\` (\\`{ title, status?, kind?, priority?, start_date?, due_date?, cover?, description_html?, people?, label_ids? }\\`; \\`origin: equipe\\`) |\n| Tarefa | \\`GET …/suggestions/:id\\` (com o checklist completo); \\`GET …/suggestions/lookup?key=SUG-12\\` (o link copiado) |\n| Editar, mover, mudar status | \\`PATCH …/suggestions/:id\\` (campos da tarefa e/ou \\`{ status?, position?, comment?, internal? }\\`) |\n| Arquivar, restaurar, excluir | \\`POST …/:id/archive\\`, \\`POST …/:id/restore\\`, \\`DELETE …/:id\\` |\n| Atividades e comentários | \\`GET …/:id/events?type=comments\\` ou \\`type=activity\\` (do mais novo, paginado); \\`POST …/:id/comments\\` (\\`{ comment, internal? }\\`) |\n| Pessoas | \\`POST …/:id/people\\` (\\`{ user_id, role }\\`; \\`user_id: \"me\"\\` = atribuir a mim; \\`role\\` responsavel ou envolvido), \\`DELETE …/:id/people/:userId?role=\\`; busca em \\`GET /auto-service/:clientId/users\\` |\n| Checklist | \\`POST …/:id/checklist\\`, \\`PATCH …/:id/checklist/:itemId\\` (\\`{ text?, done?, position? }\\`), \\`DELETE …/:id/checklist/:itemId\\` |\n| Rótulos | catálogo \\`GET\\`/\\`POST …/suggestions/labels\\`, \\`PATCH\\`/\\`DELETE …/labels/:labelId\\`; na tarefa \\`PUT\\`/\\`DELETE …/:id/labels/:labelId\\` |\n\n## Regras\n\n- **Autorização** (\\`clientAdminGuard\\`): grupo de administração do projeto do client + crachá Administrador ativo. O\n \\`client_id\\` vem sempre da URL; 403 vira a mensagem de falta de acesso.\n- **Menu**: página privada, com os tipos permitidos e os guards que a tela Cliente tinha em cada client (a migration\n copia); o painel só é montado depois que o client é escolhido.\n- **Status**: toda sugestão nasce \\`em_analise\\` (não existe mais \\`nova\\`; a migration 0035 do argos move as antigas).\n O quadro tem 4 colunas (\\`em_analise\\`, \\`planejada\\`, \\`em_desenvolvimento\\`, \\`concluida\\`); \\`recusada\\` só aparece no\n arquivo. O corte da janela das concluídas é do servidor.\n- **Tela** (\\`AutoServiceSuggestionsComponent\\`, serviço próprio \\`AutoServiceSuggestionsService\\`): \\`hm-kanban\\` com os\n cartões por \\`position\\`. Os 8 indicadores (abertas, em análise, planejadas, em desenvolvimento, atribuídas a mim,\n vencidas, concluídas na janela e a mais votada) são do quadro inteiro, sem filtro; \"atribuídas a mim\" e \"vencidas\"\n também ligam o filtro. Os filtros (texto sem acento ou a chave, responsável — minhas, sem responsável ou uma pessoa\n —, rótulo, prioridade, prazo, tipo, tela, quem pediu) e a ordenação (\\`position\\`, \\`votes\\`, \\`recent\\`, prioridade,\n prazo) são da tela, com a mesma regra dos filtros do servidor. \"Eu\" é o \\`sub\\` da sessão (\\`SpineUserStorage\\`).\n- **Cartão**: capa (token da paleta do tema: \\`cat-1\\`..\\`cat-8\\`, \\`grad-1\\`..\\`grad-6\\`), chave, tipo, rótulos, título,\n trecho, tela, checklist (feitos/total; os itens marcáveis no cartão com \\`checklist_on_card\\`), prioridade, prazo\n (vencida, hoje, amanhã), comentários, apoios e até 3 responsáveis com \"+N\". O \"⋯\" (\\`hm-menu-button\\`): status e\n prioridade em submenu, atribuir a mim, rótulos, capa (\\`hm-popover\\` ancorado no cartão), copiar link\n (\\`?sugestao=SUG-12\\`, que abre a tarefa ao carregar o quadro) e chave, arquivar e excluir (\\`HermesDialogService.confirm\\`).\n- **Criar**: o \"+\" no cabeçalho de cada coluna abre a criação rápida (título e Enter, no fim da coluna); \"Nova tarefa\"\n abre a tarefa em branco (\\`SuggestionTaskDetailComponent\\` em rascunho) e, criada, vira a tarefa completa. Na ordem do quadro, o \\`moved\\` dá o índice na coluna\n FILTRADA, e a tela converte para o índice na coluna inteira pelo vizinho visível de cima (ou o de baixo; sozinho =\n fim) antes do \\`PATCH\\` -- o servidor renumera a coluna de destino 0..n; com outra ordenação, só a troca de coluna\n grava (\\`{ status }\\`, no fim da coluna) e o arrasto dentro dela volta. O movimento é aplicado na hora; falha = toast\n \\`suggestions.moveError\\` e releitura. Selo \"Mais votada\" nas 3 com mais apoios.\n- **Arquivo**: paginado no servidor (20 por página), com busca e filtros de status e tipo; **Reabrir** nas recusadas\n (\\`PATCH\\` com \\`status: em_analise\\`) e **Restaurar** nas arquivadas (\\`POST …/restore\\`).\n- **Tarefa** (\\`SuggestionTaskDetailComponent\\`, \\`hm-modal\\` xlarge em duas colunas): à esquerda título editável no\n lugar, descrição em \\`hm-rich-text\\` (o servidor saneia com a lista branca das novidades), checklist (marcar,\n renomear, subir/descer, remover, \"Mostrar no cartão\") e as abas Comentários e Atividades (\\`events\\`, do mais novo,\n \"Carregar mais\"); à direita status, responsáveis (com \"Atribuir a mim\") e envolvidos (busca de pessoas do realm do\n app, com foto; o servidor recusa quem é de fora, \\`person_not_in_realm\\`), relator e origem, prioridade, tipo, início e\n conclusão, rótulos (catálogo do app; cria na hora), capa, tela com \"Abrir a tela\" (só quando o client administrado\n é o do app logado), apoios, criada/atualizada, \"Última alteração há X por Fulano\", chave com copiar, arquivar e\n excluir. Cada mudança grava na hora e o servidor devolve a tarefa inteira, que atualiza o cartão.\n- **Comentários**: texto simples. Interno (\\`internal: true\\`) só a equipe vê: não conta nem aparece como a última\n resposta em \"Minhas sugestões\" (\\`/me/suggestions\\`). Sugestão de outro client: 404 \\`suggestion_not_found\\`.\n`;\n"],"names":[],"mappings":"AAAA;AACA;AACA;AACA,4BAAe,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA8Dd;;"}
1
+ {"version":3,"file":"trismegisto-spine-auto-service-suggestions.technical-CGBBzAR8.mjs","sources":["../../../projects/ui/auto-service/src/docs/suggestions.technical.ts"],"sourcesContent":["// Especificação técnica da tela Sugestõ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 bundle\n// inicial. Não importe estaticamente nem reexporte no `public-api.ts`.\nexport default `# Sugestões — especificação técnica\n\nTela \\`AutoServiceSuggestionsPageComponent\\`, ligada ao router de template \\`AUTO_SERVICE_SUGGESTIONS_TEMPLATE_ROUTER_ID\\`\n(\\`ad100007-…\\`, página \\`app-suggestions\\` na raiz do menu, migration 0036 do argos): o seletor de client\n(\\`AutoServiceClientPickerComponent\\`) e, embaixo, o painel da tela. Fala com o argos-admin-server em\n\\`{adminApi}/auto-service\\`, com o token no cabeçalho \\`x-access-token\\`.\n\n## Endpoints\n\n| Ação | Endpoint |\n| --- | --- |\n| Clients que a pessoa administra | \\`GET /auto-service\\` |\n| Quadro (\\`web.app_suggestions\\`) | \\`GET /auto-service/:clientId/suggestions?board=true\\`: sem arquivadas, recusadas e concluídas fora da janela (\\`done_days\\`, 7; \\`due_soon_days\\`, 1), com autor, responsáveis e envolvidos (com foto), rótulos, checklist e a última atividade |\n| Arquivo | \\`GET …/suggestions?archive=true\\` (\\`search\\`, \\`kind\\`, \\`status\\`, \\`limit\\`, \\`offset\\`): arquivadas, recusadas e concluídas antigas, com \\`total\\` |\n| Filtros do servidor | \\`kind\\`, \\`status\\`, \\`screen\\`, \\`search\\` (inclui a chave \\`SUG-12\\`), \\`priority\\`, \\`label\\`, \\`assignee\\` (\\`me\\`, \\`none\\` ou um id), \\`due\\` (\\`overdue\\` ou \\`soon\\`) |\n| Criar (equipe) | \\`POST …/suggestions\\` (\\`{ title, status?, kind?, priority?, start_date?, due_date?, cover?, description_html?, people?, label_ids? }\\`; \\`origin: equipe\\`) |\n| Tarefa | \\`GET …/suggestions/:id\\` (com o checklist completo); \\`GET …/suggestions/lookup?key=SUG-12\\` (o link copiado) |\n| Editar, mover, mudar status | \\`PATCH …/suggestions/:id\\` (campos da tarefa e/ou \\`{ status?, position?, comment?, internal? }\\`) |\n| Arquivar, restaurar, excluir | \\`POST …/:id/archive\\`, \\`POST …/:id/restore\\`, \\`DELETE …/:id\\` |\n| Atividades e comentários | \\`GET …/:id/events?type=comments\\` ou \\`type=activity\\` (do mais novo, paginado); \\`POST …/:id/comments\\` (\\`{ comment, internal? }\\`) |\n| Pessoas | \\`POST …/:id/people\\` (\\`{ user_id, role }\\`; \\`user_id: \"me\"\\` = atribuir a mim; \\`role\\` responsavel ou envolvido), \\`DELETE …/:id/people/:userId?role=\\`; busca em \\`GET /auto-service/:clientId/users\\` |\n| Checklist | \\`POST …/:id/checklist\\`, \\`PATCH …/:id/checklist/:itemId\\` (\\`{ text?, done?, position? }\\`), \\`DELETE …/:id/checklist/:itemId\\` |\n| Rótulos | catálogo \\`GET\\`/\\`POST …/suggestions/labels\\`, \\`PATCH\\`/\\`DELETE …/labels/:labelId\\`; na tarefa \\`PUT\\`/\\`DELETE …/:id/labels/:labelId\\` |\n\n## Regras\n\n- **Autorização** (\\`clientAdminGuard\\`): grupo de administração do projeto do client + crachá Administrador ativo. O\n \\`client_id\\` vem sempre da URL; 403 vira a mensagem de falta de acesso.\n- **Menu**: página privada, com os tipos permitidos e os guards que a tela Cliente tinha em cada client (a migration\n copia); o painel só é montado depois que o client é escolhido.\n- **Status**: toda sugestão nasce \\`em_analise\\` (não existe mais \\`nova\\`; a migration 0035 do argos move as antigas).\n O quadro tem 4 colunas (\\`em_analise\\`, \\`planejada\\`, \\`em_desenvolvimento\\`, \\`concluida\\`); \\`recusada\\` só aparece no\n arquivo. O corte da janela das concluídas é do servidor.\n- **Tela** (\\`AutoServiceSuggestionsComponent\\`, serviço próprio \\`AutoServiceSuggestionsService\\`): \\`hm-kanban\\` com os\n cartões por \\`position\\`. Os 8 indicadores (abertas, em análise, planejadas, em desenvolvimento, atribuídas a mim,\n vencidas, concluídas na janela e a mais votada) são do quadro inteiro, sem filtro; \"atribuídas a mim\" e \"vencidas\"\n também ligam o filtro. Os filtros (texto sem acento ou a chave, responsável — minhas, sem responsável ou uma pessoa\n —, rótulo, prioridade, prazo, tipo, tela, quem pediu) e a ordenação (\\`position\\`, \\`votes\\`, \\`recent\\`, prioridade,\n prazo) são da tela, com a mesma regra dos filtros do servidor. \"Eu\" é o \\`sub\\` da sessão (\\`SpineUserStorage\\`).\n- **Cartão**: capa (token da paleta do tema: \\`cat-1\\`..\\`cat-8\\`, \\`grad-1\\`..\\`grad-6\\`), chave, tipo, rótulos, título,\n trecho, tela, checklist (feitos/total; os itens marcáveis no cartão com \\`checklist_on_card\\`), prioridade, prazo\n (vencida, hoje, amanhã), comentários, apoios e até 3 responsáveis com \"+N\". O \"⋯\" (\\`hm-menu-button\\`): status e\n prioridade em submenu, atribuir a mim, rótulos, capa (\\`hm-popover\\` ancorado no cartão), copiar link\n (\\`?sugestao=SUG-12\\`, que abre a tarefa ao carregar o quadro) e chave, arquivar e excluir (\\`HermesDialogService.confirm\\`).\n- **Criar**: o \"+\" no cabeçalho de cada coluna abre a criação rápida (título e Enter, no fim da coluna); \"Nova tarefa\"\n abre a tarefa em branco (\\`SuggestionTaskDetailComponent\\` em rascunho) e, criada, vira a tarefa completa. Na ordem do quadro, o \\`moved\\` dá o índice na coluna\n FILTRADA, e a tela converte para o índice na coluna inteira pelo vizinho visível de cima (ou o de baixo; sozinho =\n fim) antes do \\`PATCH\\` -- o servidor renumera a coluna de destino 0..n; com outra ordenação, só a troca de coluna\n grava (\\`{ status }\\`, no fim da coluna) e o arrasto dentro dela volta. O movimento é aplicado na hora; falha = toast\n \\`suggestions.moveError\\` e releitura. Selo \"Mais votada\" nas 3 com mais apoios.\n- **Arquivo**: paginado no servidor (20 por página), com busca e filtros de status e tipo; **Reabrir** nas recusadas\n (\\`PATCH\\` com \\`status: em_analise\\`) e **Restaurar** nas arquivadas (\\`POST …/restore\\`).\n- **Tarefa** (\\`SuggestionTaskDetailComponent\\`, \\`hm-modal\\` xlarge em duas colunas): à esquerda título editável no\n lugar, descrição em \\`hm-rich-text\\` (o servidor saneia com a lista branca das novidades), checklist (marcar,\n renomear, subir/descer, remover, \"Mostrar no cartão\") e as abas Comentários e Atividades (\\`events\\`, do mais novo,\n \"Carregar mais\"); à direita status, responsáveis (com \"Atribuir a mim\") e envolvidos (busca de pessoas do realm do\n app, com foto; o servidor recusa quem é de fora, \\`person_not_in_realm\\`), relator e origem, prioridade, tipo, início e\n conclusão, rótulos (catálogo do app; cria na hora), capa, tela com \"Abrir a tela\" (só quando o client administrado\n é o do app logado), apoios, criada/atualizada, \"Última alteração há X por Fulano\", chave com copiar, arquivar e\n excluir. Cada mudança grava na hora e o servidor devolve a tarefa inteira, que atualiza o cartão.\n- **Planejamento** (pasta \\`planning/\\`, migration 0043 do argos): Resumo, Tarefas, Planejamento, Cronograma,\n Riscos e Fluxo leem do \\`SuggestionPlanningStore\\` (nos \\`providers\\` do quadro), que carrega \\`GET …/suggestions\\`\n sem recorte (as concluídas antigas entram no burndown; arquivadas e agrupadas são tiradas na tela), \\`GET …/sprints\\`,\n \\`GET …/milestones\\` e \\`GET …/risks\\` ao entrar numa delas. Gravações: \\`PATCH …/:id\\` com \\`estimate\\` (0..999) e\n \\`sprint_id\\` (arrastar no \\`hm-backlog\\`) ou \\`start_date\\`/\\`due_date\\` (arrastar no \\`hm-gantt\\`),\n \\`PUT\\`/\\`DELETE …/:id/dependencies/:dependsOnId\\` (409 \\`dependency_cycle\\`), \\`POST\\`/\\`PATCH\\`/\\`DELETE …/sprints\\`\n (uma ativa por app: 409 \\`active_sprint_exists\\`; \\`state: closed\\` devolve as não concluídas ao backlog),\n \\`…/milestones\\` e \\`…/risks\\` (migration 0044: o risco leva \\`suggestion_id\\`, obrigatório ao criar; \\`invalid_suggestion\\`\n vira o aviso de escolher a tarefa). A nota de risco da tarefa é \\`risk_score\\` (do servidor, junto com a tarefa) até\n os riscos serem lidos; depois, \\`SuggestionPlanningStore.riskScoreOf\\` calcula dos riscos abertos e acompanha cada\n gravação. O detalhe da tarefa lê os riscos uma vez ao abrir (\\`ensureRisks\\`). O burndown sai de \\`taskBurndownInput\\` → \\`burndownSeries\\` numa tabela (o spine não\n depende do \\`@trismegisto/charts\\`); o Gantt e a carga, de \\`taskGanttItems\\` e \\`taskWorkloadAllocations\\`. O\n Fluxo é o \\`hm-workflow-diagram\\` só leitura dos 5 status (o contrato com quem pede).\n- **Comentários**: texto simples. Interno (\\`internal: true\\`) só a equipe vê: não conta nem aparece como a última\n resposta em \"Minhas sugestões\" (\\`/me/suggestions\\`). Sugestão de outro client: 404 \\`suggestion_not_found\\`.\n`;\n"],"names":[],"mappings":"AAAA;AACA;AACA;AACA,4BAAe,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA2Ed;;"}
@@ -14,8 +14,31 @@ preciso estar no grupo de administração do projeto desse app e com o crachá *
14
14
  ## Como usar
15
15
 
16
16
  As pessoas pedem melhorias pelo botão **Sugerir melhoria** da barra de cada tela (tipo, título, descrição e a tela de
17
- onde vieram). Toda sugestão chega **Em análise**. No topo, escolha **Quadro** (o que está andando) ou **Arquivo** (o
18
- que já saiu do quadro).
17
+ onde vieram). Toda sugestão chega **Em análise**. No topo, escolha a visão: **Resumo**, **Tarefas**, **Quadro** (o
18
+ que está andando), **Planejamento**, **Cronograma**, **Riscos**, **Fluxo** ou **Arquivo** (o que já saiu do quadro).
19
+
20
+ ## Planejamento
21
+
22
+ - **Resumo**: a sprint em andamento (meta, datas e pontos concluídos contra o comprometido e a capacidade), as tarefas
23
+ abertas, as vencidas, **Minhas tarefas**, os prazos dos próximos 7 dias, os riscos altos em aberto e o próximo marco.
24
+ - **Tarefas**: as abertas em **Lista** (agrupada pelo status) ou em **Tabela** (chave, título, status, prioridade,
25
+ responsável, sprint, pontos e prazo; clique no título da coluna para ordenar). **Abrir** leva à tarefa.
26
+ - **Planejamento**: as sprints (**Nova sprint** com nome, meta, início, fim e capacidade em pontos; **Iniciar**, só uma
27
+ por vez; **Encerrar**, que devolve ao backlog as não concluídas; **Editar** e **Excluir**). Arraste uma tarefa do
28
+ **Backlog** para uma sprint, ou de volta. Abaixo, o andamento da sprint em curso e o burndown, dia a dia.
29
+ - **Cronograma**: as tarefas abertas com data, agrupadas pela sprint, com as setas de dependência e os marcos.
30
+ Arraste uma barra para mudar início e prazo (dependência quebrada vira aviso) ou um marco para mudar a data. Os
31
+ marcos se cadastram e se excluem ali. **Carga da equipe**: os pontos de cada pessoa nas próximas 4 semanas;
32
+ clicar numa pessoa mostra o quadro filtrado por ela.
33
+ - **Riscos**: a matriz de probabilidade e impacto (clique numa célula para filtrar) e a lista, com a tarefa ameaçada
34
+ embaixo de cada risco. Todo risco é de uma tarefa. **Novo risco**: título, tarefa, probabilidade, impacto, dono,
35
+ status (**Identificado**, **Em mitigação**, **Encerrado**) e a mitigação. No detalhe da tarefa, a seção **Riscos**
36
+ lista os dela e cadastra outros já com a tarefa preenchida. A nota de risco da tarefa (Baixo, Médio, Alto, Crítico) é
37
+ a do maior risco aberto: aparece como selo no cartão do quadro e na coluna **Risco** da tabela de Tarefas.
38
+ - **Fluxo**: os 5 status e as passagens entre eles, com quantas há em cada um. É o que quem pede acompanha em
39
+ **Minhas sugestões**, por isso não muda por app.
40
+ - Na tarefa: **Pontos**, **Sprint** e **Depende de** (as tarefas que precisam terminar antes; uma ligação que formaria
41
+ um ciclo é recusada). Uma tarefa com dependência aberta mostra **Bloqueada por** com as chaves.
19
42
 
20
43
  ## Quadro
21
44
 
@@ -69,4 +92,4 @@ Clique no **título** do cartão para abrir a tarefa:
69
92
  `;
70
93
 
71
94
  export { suggestions_usage as default };
72
- //# sourceMappingURL=trismegisto-spine-auto-service-suggestions.usage-BwO9Hjsx.mjs.map
95
+ //# sourceMappingURL=trismegisto-spine-auto-service-suggestions.usage-DnAJS-Z0.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trismegisto-spine-auto-service-suggestions.usage-DnAJS-Z0.mjs","sources":["../../../projects/ui/auto-service/src/docs/suggestions.usage.ts"],"sourcesContent":["// Manual de uso da tela Sugestões do auto-serviço (`RouteDocument.load`), em Markdown. Módulo próprio, carregado só\n// pelo `import()` de `AUTO_SERVICE_DOCUMENTS`: vira um chunk à parte no FESM e fica fora do bundle inicial. Não importe\n// estaticamente nem reexporte no `public-api.ts`.\nexport default `# Sugestões\n\nAcompanhe as melhorias que as pessoas pediram nesta aplicação, num quadro por status, e responda a quem pediu.\n\n## Antes de começar\n\nFica na raiz do menu, fora de **Administração** (antes era uma aba da tela **Cliente**). Como nas outras\ntelas do auto-serviço, o client é o do app em que você está logado; com mais de um, escolha no seletor do topo. É\npreciso estar no grupo de administração do projeto desse app e com o crachá **Administrador** ativo.\n\n## Como usar\n\nAs pessoas pedem melhorias pelo botão **Sugerir melhoria** da barra de cada tela (tipo, título, descrição e a tela de\nonde vieram). Toda sugestão chega **Em análise**. No topo, escolha a visão: **Resumo**, **Tarefas**, **Quadro** (o\nque está andando), **Planejamento**, **Cronograma**, **Riscos**, **Fluxo** ou **Arquivo** (o que já saiu do quadro).\n\n## Planejamento\n\n- **Resumo**: a sprint em andamento (meta, datas e pontos concluídos contra o comprometido e a capacidade), as tarefas\n abertas, as vencidas, **Minhas tarefas**, os prazos dos próximos 7 dias, os riscos altos em aberto e o próximo marco.\n- **Tarefas**: as abertas em **Lista** (agrupada pelo status) ou em **Tabela** (chave, título, status, prioridade,\n responsável, sprint, pontos e prazo; clique no título da coluna para ordenar). **Abrir** leva à tarefa.\n- **Planejamento**: as sprints (**Nova sprint** com nome, meta, início, fim e capacidade em pontos; **Iniciar**, só uma\n por vez; **Encerrar**, que devolve ao backlog as não concluídas; **Editar** e **Excluir**). Arraste uma tarefa do\n **Backlog** para uma sprint, ou de volta. Abaixo, o andamento da sprint em curso e o burndown, dia a dia.\n- **Cronograma**: as tarefas abertas com data, agrupadas pela sprint, com as setas de dependência e os marcos.\n Arraste uma barra para mudar início e prazo (dependência quebrada vira aviso) ou um marco para mudar a data. Os\n marcos se cadastram e se excluem ali. **Carga da equipe**: os pontos de cada pessoa nas próximas 4 semanas;\n clicar numa pessoa mostra o quadro filtrado por ela.\n- **Riscos**: a matriz de probabilidade e impacto (clique numa célula para filtrar) e a lista, com a tarefa ameaçada\n embaixo de cada risco. Todo risco é de uma tarefa. **Novo risco**: título, tarefa, probabilidade, impacto, dono,\n status (**Identificado**, **Em mitigação**, **Encerrado**) e a mitigação. No detalhe da tarefa, a seção **Riscos**\n lista os dela e cadastra outros já com a tarefa preenchida. A nota de risco da tarefa (Baixo, Médio, Alto, Crítico) é\n a do maior risco aberto: aparece como selo no cartão do quadro e na coluna **Risco** da tabela de Tarefas.\n- **Fluxo**: os 5 status e as passagens entre eles, com quantas há em cada um. É o que quem pede acompanha em\n **Minhas sugestões**, por isso não muda por app.\n- Na tarefa: **Pontos**, **Sprint** e **Depende de** (as tarefas que precisam terminar antes; uma ligação que formaria\n um ciclo é recusada). Uma tarefa com dependência aberta mostra **Bloqueada por** com as chaves.\n\n## Quadro\n\n- **Indicadores**: **Abertas** (em análise, planejadas e em desenvolvimento), quantas há em cada coluna, as\n **Atribuídas a mim**, as **Vencidas**, as **Concluídas em 7 dias** e a **Mais votada**. Contam o quadro inteiro, sem\n os filtros; clicar em **Atribuídas a mim** ou **Vencidas** filtra o quadro por elas.\n- **Criar**: **Nova tarefa** (no topo) abre a tarefa em branco: título, coluna, tipo, prioridade, datas, descrição,\n rótulos e **Atribuir a mim**. O **+** no cabeçalho de cada coluna cria rápido: escreva o título e tecle **Enter**\n (o campo fica aberto para a próxima; **Esc** fecha). Tarefas criadas pela equipe aparecem como **Criada pela equipe**.\n- **Filtros**: **Buscar sugestões** (título, descrição, tela ou a chave, como **SUG-12**, sem diferenciar acentos),\n **Responsável** (**Minhas**, **Sem responsável** ou uma pessoa), **Rótulo**, **Prioridade**, **Prazo** (**Vencidas**\n ou **Vencem hoje ou amanhã**), **Tipo**, **Tela** e **Quem pediu**; **Ordenar** pela ordem do quadro, mais votadas,\n mais recentes, prioridade ou prazo.\n- Uma coluna por status: **Em análise**, **Planejada**, **Em desenvolvimento** e **Concluída**. Concluídas saem do\n quadro 7 dias depois; recusadas e arquivadas saem na hora: todas ficam no **Arquivo**.\n- Cada cartão mostra a **capa** (se tiver), a **chave** (SUG-12), o **tipo**, os **rótulos**, o **título**, um trecho\n da descrição, a **tela**, a **prioridade**, o **prazo** (vencida em vermelho; hoje e amanhã em destaque), o\n **checklist** (feitos/total, e os itens no próprio cartão quando **Mostrar no cartão** está ligado — dá para marcar\n ali), os comentários, os **apoios** e os rostos dos responsáveis (com **+N**). As 3 com mais apoios têm o selo\n **Mais votada**.\n- O **⋯** do cartão: **Alterar status**, **Prioridade**, **Atribuir a mim**, **Rótulos**, **Selecionar capa** (cores e\n gradientes do tema, ou **Remover capa**), **Copiar link** (o link abre a tarefa), **Copiar chave**, **Arquivar** e\n **Excluir** (pede confirmação; não dá para desfazer).\n- **Arraste** o cartão para outra coluna para mudar o status, ou dentro da coluna para mudar a ordem (a de cima é a\n primeira da fila; a ordem só muda em **Ordem do quadro**). Pelo teclado: foque o cartão, **Espaço** pega, as setas\n escolhem o lugar e a coluna, **Espaço** solta e **Esc** cancela. Se a gravação falhar, aparece o aviso e o quadro é\n recarregado.\n\n## Arquivo\n\nAs arquivadas, as recusadas e as concluídas antigas, por página, com **Buscar no arquivo** e os filtros de status e\ntipo. Numa recusada, **Reabrir** a devolve ao quadro, em **Em análise**; numa arquivada, **Restaurar no quadro** a\ndevolve com o status que tinha.\n\n## Tarefa\n\nClique no **título** do cartão para abrir a tarefa:\n\n- **À esquerda**: o título (clique para editar; **Enter** salva, **Esc** desiste), a **Descrição** (**Editar\n descrição** abre o editor com negrito, listas e links; **Salvar** grava), o **Checklist** (adicione itens com\n **Enter**, marque, renomeie, suba/desça, remova; **Mostrar no cartão** põe os itens no cartão) e as abas\n **Comentários** e **Atividades** (tudo o que mudou, com quem fez e quando).\n- **Comentários**: o que você escreve aparece para quem pediu em **Minhas sugestões**, a não ser que marque **Só para a\n equipe** (interno: aparece aqui com a etiqueta **Interno** e quem pediu não vê).\n- **À direita**: **Status**, **Responsáveis** (**Atribuir a mim** ou **Adicionar responsável**, buscando pessoas do\n realm desta aplicação, com foto) e **Envolvidos**, o **Relator** (quem pediu, ou quem criou), **Prioridade**, **Tipo**,\n **Início** e **Conclusão**, **Rótulos** (escolha do catálogo do app ou crie um novo com a cor), **Capa**, a **Tela de\n origem** (com **Abrir a tela**, quando o client administrado é o deste app), os **Apoios**, quando foi criada e\n atualizada e a **última alteração**, com quem fez. A **chave** tem **Copiar**. **Arquivar** e **Excluir** ficam no\n fim. Cada mudança é gravada na hora.\n`;\n"],"names":[],"mappings":"AAAA;AACA;AACA;AACA,wBAAe,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAwFd;;"}
@@ -43,14 +43,14 @@ const AUTO_SERVICE_HOME_TEMPLATE_ROUTER_ID = '6a9a13db-f31b-494e-b51c-79af0ac28b
43
43
  */
44
44
  const AUTO_SERVICE_SCREENS = {
45
45
  home: () => import('./trismegisto-spine-auto-service-home.component-9WvXOH3l.mjs').then(m => m.HomeComponent),
46
- groups: () => import('./trismegisto-spine-auto-service-auto-service-groups.component-BYjIQ9ID.mjs').then(m => m.AutoServiceGroupsComponent),
47
- apps: () => import('./trismegisto-spine-auto-service-auto-service.component-QsIQ61w2.mjs').then(m => m.AutoServiceComponent),
48
- client: () => import('./trismegisto-spine-auto-service-auto-service-client.component-BAfeLyTB.mjs').then(m => m.AutoServiceClientComponent),
46
+ groups: () => import('./trismegisto-spine-auto-service-auto-service-groups.component-DE2QIGRH.mjs').then(m => m.AutoServiceGroupsComponent),
47
+ apps: () => import('./trismegisto-spine-auto-service-auto-service.component-D58Ht9PH.mjs').then(m => m.AutoServiceComponent),
48
+ client: () => import('./trismegisto-spine-auto-service-auto-service-client.component-kAXaCM5W.mjs').then(m => m.AutoServiceClientComponent),
49
49
  audit: () => import('./trismegisto-spine-auto-service-auto-service-audit.component-D8HUpZtA.mjs').then(m => m.AutoServiceAuditComponent),
50
50
  loginAttempts: () => import('./trismegisto-spine-auto-service-auto-service-login-attempts.component-DoyhkSYc.mjs').then(m => m.AutoServiceLoginAttemptsComponent),
51
- news: () => import('./trismegisto-spine-auto-service-auto-service-news-page.component-CBemH4hr.mjs').then(m => m.AutoServiceNewsPageComponent),
52
- suggestions: () => import('./trismegisto-spine-auto-service-auto-service-suggestions-page.component-mMjE3JOL.mjs').then(m => m.AutoServiceSuggestionsPageComponent),
53
- ratings: () => import('./trismegisto-spine-auto-service-auto-service-ratings-page.component-C_THGTkw.mjs').then(m => m.AutoServiceRatingsPageComponent),
51
+ news: () => import('./trismegisto-spine-auto-service-auto-service-news-page.component-BW7BJ0oD.mjs').then(m => m.AutoServiceNewsPageComponent),
52
+ suggestions: () => import('./trismegisto-spine-auto-service-auto-service-suggestions-page.component-CkiCTmXD.mjs').then(m => m.AutoServiceSuggestionsPageComponent),
53
+ ratings: () => import('./trismegisto-spine-auto-service-auto-service-ratings-page.component-CHPU-QLJ.mjs').then(m => m.AutoServiceRatingsPageComponent),
54
54
  };
55
55
  /**
56
56
  * Documentação das 9 telas (botão de documentação da barra da página e índice "Documentação do sistema"): o manual
@@ -66,8 +66,8 @@ const AUTO_SERVICE_DOCUMENTS = {
66
66
  loadTechnical: () => import('./trismegisto-spine-auto-service-home.technical-Ce7oYRdg.mjs').then(m => m.default),
67
67
  },
68
68
  groups: {
69
- load: () => import('./trismegisto-spine-auto-service-groups.usage-OvWjNeeT.mjs').then(m => m.default),
70
- loadTechnical: () => import('./trismegisto-spine-auto-service-groups.technical-_jQrg1Qh.mjs').then(m => m.default),
69
+ load: () => import('./trismegisto-spine-auto-service-groups.usage-De2MhlE7.mjs').then(m => m.default),
70
+ loadTechnical: () => import('./trismegisto-spine-auto-service-groups.technical-CB1D3ANC.mjs').then(m => m.default),
71
71
  },
72
72
  apps: {
73
73
  load: () => import('./trismegisto-spine-auto-service-apps.usage-C0F_MlCo.mjs').then(m => m.default),
@@ -90,8 +90,8 @@ const AUTO_SERVICE_DOCUMENTS = {
90
90
  loadTechnical: () => import('./trismegisto-spine-auto-service-news.technical-DV9UpobG.mjs').then(m => m.default),
91
91
  },
92
92
  suggestions: {
93
- load: () => import('./trismegisto-spine-auto-service-suggestions.usage-BwO9Hjsx.mjs').then(m => m.default),
94
- loadTechnical: () => import('./trismegisto-spine-auto-service-suggestions.technical-BtUK6sKD.mjs').then(m => m.default),
93
+ load: () => import('./trismegisto-spine-auto-service-suggestions.usage-DnAJS-Z0.mjs').then(m => m.default),
94
+ loadTechnical: () => import('./trismegisto-spine-auto-service-suggestions.technical-CGBBzAR8.mjs').then(m => m.default),
95
95
  },
96
96
  ratings: {
97
97
  load: () => import('./trismegisto-spine-auto-service-ratings.usage-BkteY8lz.mjs').then(m => m.default),
@@ -171,7 +171,20 @@ class AutoServiceService {
171
171
  createGroup(clientId, body) { return firstValueFrom(this.http.post(this.url `/${clientId}/groups`, body, { headers: this.headers })); }
172
172
  updateGroup(clientId, groupId, body) { return firstValueFrom(this.http.put(this.url `/${clientId}/groups/${groupId}`, body, { headers: this.headers })); }
173
173
  deleteGroup(clientId, groupId) { return firstValueFrom(this.http.delete(this.url `/${clientId}/groups/${groupId}`, { headers: this.headers })); }
174
- getGroupMembers(clientId, groupId) { return firstValueFrom(this.http.get(this.url `/${clientId}/groups/${groupId}/members`, { headers: this.headers })); }
174
+ /**
175
+ * Uma página dos membros (o servidor pagina: padrão 50, até 200 por página), pela ordem do login, com busca por nome,
176
+ * login ou e-mail. Observable (não Promise): as telas pedem as páginas até o fim e cancelam a pendente ao fechar.
177
+ */
178
+ getGroupMembers(clientId, groupId, query = {}) {
179
+ let params = new HttpParams();
180
+ if (query.page)
181
+ params = params.set('page', String(query.page));
182
+ if (query.limit)
183
+ params = params.set('limit', String(query.limit));
184
+ if (query.search?.trim())
185
+ params = params.set('search', query.search.trim());
186
+ return this.http.get(this.url `/${clientId}/groups/${groupId}/members`, { headers: this.headers, params });
187
+ }
175
188
  /** Sugestões para adicionar ao grupo: quem já está em outro grupo deste sistema e ainda não neste, com foto e os grupos. */
176
189
  getMemberSuggestions(clientId, groupId, limit = 8) {
177
190
  const params = new HttpParams().set('limit', String(limit));
@@ -1 +1 @@
1
- {"version":3,"file":"trismegisto-spine-auto-service.mjs","sources":["../../../projects/ui/auto-service/src/auto-service.tokens.ts","../../../projects/ui/auto-service/src/provide-auto-service.ts","../../../projects/ui/auto-service/src/auto-service.service.ts","../../../projects/ui/auto-service/src/public-api.ts","../../../projects/ui/auto-service/src/trismegisto-spine-auto-service.ts"],"sourcesContent":["import { InjectionToken } from '@angular/core';\n\nexport interface AutoServiceConfig {\n // Base URL do argos-admin-server (o mesmo backend central que atende\n // /admin/*) -- /auto-service/* já existe lá, escopado por client_id, servindo\n // qualquer aplicação que instale este pacote, não só o argos-admin.\n adminApi: string;\n}\n\nexport const AUTO_SERVICE_CONFIG = new InjectionToken<AutoServiceConfig>('AUTO_SERVICE_CONFIG');\n\n// router_id dos roteadores (páginas) do template \"auto-service\" (web.template_router,\n// ver apps/argos/database/argos/seed/web/04-template_router.sql) -- valores literais e\n// estáveis (mesma convenção do resto do seed: UUID fixo, nunca gerado em runtime). É\n// contra ISSO que o ComponentDistributorService casa via source_template_router_id\n// (não o router_id materializado de cada client, que varia): qualquer client\n// vinculado ao template \"auto-service\" resolve todos automaticamente, sem precisar\n// declarar nada no próprio features.routes.ts. Grupos, Aplicações e Cliente ficam no grupo\n// \"Administração\" do template e Ações e Tentativas de login no grupo \"Auditoria\"; Início,\n// Novidades, Sugestões e Avaliações são páginas soltas na raiz. Os grupos nunca precisam de\n// componente (nunca são page_id de router).\nexport const AUTO_SERVICE_GROUPS_TEMPLATE_ROUTER_ID = 'ad100001-0000-4000-8000-000000000001';\nexport const AUTO_SERVICE_APPS_TEMPLATE_ROUTER_ID = 'ad100002-0000-4000-8000-000000000001';\nexport const AUTO_SERVICE_CLIENT_TEMPLATE_ROUTER_ID = 'ad100003-0000-4000-8000-000000000001';\n// Menu \"Auditoria\" (rota AD000006, dentro de \"Administração\", migration 0012 do argos): duas páginas.\n// Ações (a leitura da auditoria, `audit.events`) -- o nome da constante ficou do tempo em que era a página \"Auditoria\".\nexport const AUTO_SERVICE_AUDIT_TEMPLATE_ROUTER_ID = 'ad100004-0000-4000-8000-000000000001';\n// Tentativas de login (`auth.auth_attempts` com o client do app).\nexport const AUTO_SERVICE_LOGIN_ATTEMPTS_TEMPLATE_ROUTER_ID = 'ad100005-0000-4000-8000-000000000001';\n// Novidades, Sugestões e Avaliações (migration 0036 do argos): páginas na raiz, fora de \"Administração\" -- eram abas\n// da tela Cliente. Cada uma é o seletor de client + o painel que ficava na aba.\nexport const AUTO_SERVICE_NEWS_TEMPLATE_ROUTER_ID = 'ad100006-0000-4000-8000-000000000001';\nexport const AUTO_SERVICE_SUGGESTIONS_TEMPLATE_ROUTER_ID = 'ad100007-0000-4000-8000-000000000001';\nexport const AUTO_SERVICE_RATINGS_TEMPLATE_ROUTER_ID = 'ad100008-0000-4000-8000-000000000001';\n// Início (\"home\", página de topo e pública do mesmo template). Todo client clonado do\n// template ganha a própria linha em web.router com source_template_router_id apontando pra cá.\nexport const AUTO_SERVICE_HOME_TEMPLATE_ROUTER_ID = '6a9a13db-f31b-494e-b51c-79af0ac28b60';\n","import { EnvironmentProviders, Type, makeEnvironmentProviders } from '@angular/core';\nimport { COMPONENT_ROUTES, ComponentRoute, RouteDocument } from '@trismegisto/spine/routing';\nimport { SPINE_ADMIN_API } from '@trismegisto/spine';\nimport {\n AUTO_SERVICE_CONFIG, AutoServiceConfig,\n AUTO_SERVICE_GROUPS_TEMPLATE_ROUTER_ID, AUTO_SERVICE_APPS_TEMPLATE_ROUTER_ID, AUTO_SERVICE_CLIENT_TEMPLATE_ROUTER_ID,\n AUTO_SERVICE_HOME_TEMPLATE_ROUTER_ID, AUTO_SERVICE_AUDIT_TEMPLATE_ROUTER_ID, AUTO_SERVICE_LOGIN_ATTEMPTS_TEMPLATE_ROUTER_ID,\n AUTO_SERVICE_NEWS_TEMPLATE_ROUTER_ID, AUTO_SERVICE_SUGGESTIONS_TEMPLATE_ROUTER_ID, AUTO_SERVICE_RATINGS_TEMPLATE_ROUTER_ID,\n} from './auto-service.tokens';\n\n/**\n * As 9 telas do auto-serviço, carregadas sob demanda. Cada `import()` relativo vira um chunk próprio no\n * FESM publicado (`trismegisto-spine-auto-service-<tela>-<hash>.mjs`), que o bundler do app mantém fora\n * do carregamento inicial. Não exporte as telas no `public-api.ts` (ver o comentário lá).\n */\nexport const AUTO_SERVICE_SCREENS: Readonly<Record<\n 'home' | 'groups' | 'apps' | 'client' | 'audit' | 'loginAttempts' | 'news' | 'suggestions' | 'ratings',\n () => Promise<Type<unknown>>\n>> = {\n home: () => import('./home/home.component').then(m => m.HomeComponent),\n groups: () => import('./groups/auto-service-groups.component').then(m => m.AutoServiceGroupsComponent),\n apps: () => import('./auto-service.component').then(m => m.AutoServiceComponent),\n client: () => import('./auto-service-client.component').then(m => m.AutoServiceClientComponent),\n audit: () => import('./audit/auto-service-audit.component').then(m => m.AutoServiceAuditComponent),\n loginAttempts: () => import('./audit/auto-service-login-attempts.component').then(m => m.AutoServiceLoginAttemptsComponent),\n news: () => import('./pages/auto-service-news-page.component').then(m => m.AutoServiceNewsPageComponent),\n suggestions: () => import('./pages/auto-service-suggestions-page.component').then(m => m.AutoServiceSuggestionsPageComponent),\n ratings: () => import('./pages/auto-service-ratings-page.component').then(m => m.AutoServiceRatingsPageComponent),\n};\n\n/**\n * Documentação das 9 telas (botão de documentação da barra da página e índice \"Documentação do sistema\"): o manual\n * de uso (`load`) e a especificação técnica (`loadTechnical`, só com `SpineConfig.technicalDocs`). O Markdown fica em\n * módulos `.ts` próprios em `./docs/` (o ng-packagr não carrega `.md` como texto), cada um atrás de um `import()`\n * relativo: vira um chunk à parte no FESM e só é baixado quando alguém abre o documento. Sem `title`/`group`: o\n * índice usa o nome da rota e o módulo da árvore do client. O `SpineDocsService` casa estas entradas pelo\n * `source_template_router_id`, como o `ComponentDistributorService` faz com as telas.\n */\nexport const AUTO_SERVICE_DOCUMENTS: Readonly<Record<keyof typeof AUTO_SERVICE_SCREENS, RouteDocument>> = {\n home: {\n load: () => import('./docs/home.usage').then(m => m.default),\n loadTechnical: () => import('./docs/home.technical').then(m => m.default),\n },\n groups: {\n load: () => import('./docs/groups.usage').then(m => m.default),\n loadTechnical: () => import('./docs/groups.technical').then(m => m.default),\n },\n apps: {\n load: () => import('./docs/apps.usage').then(m => m.default),\n loadTechnical: () => import('./docs/apps.technical').then(m => m.default),\n },\n client: {\n load: () => import('./docs/client.usage').then(m => m.default),\n loadTechnical: () => import('./docs/client.technical').then(m => m.default),\n },\n audit: {\n load: () => import('./docs/audit.usage').then(m => m.default),\n loadTechnical: () => import('./docs/audit.technical').then(m => m.default),\n },\n loginAttempts: {\n load: () => import('./docs/login-attempts.usage').then(m => m.default),\n loadTechnical: () => import('./docs/login-attempts.technical').then(m => m.default),\n },\n news: {\n load: () => import('./docs/news.usage').then(m => m.default),\n loadTechnical: () => import('./docs/news.technical').then(m => m.default),\n },\n suggestions: {\n load: () => import('./docs/suggestions.usage').then(m => m.default),\n loadTechnical: () => import('./docs/suggestions.technical').then(m => m.default),\n },\n ratings: {\n load: () => import('./docs/ratings.usage').then(m => m.default),\n loadTechnical: () => import('./docs/ratings.technical').then(m => m.default),\n },\n};\n\n// Cada app consumidora chama isso uma vez no bootstrap (mesmo padrão do\n// provideAuth do @orfeu/angular) informando só a URL do argos-admin-server --\n// o resto vem pronto: rotas/serviço (@trismegisto/spine/auto-service) E a própria\n// ligação com os itens de menu, registrada aqui via source_template_router_id (não\n// route_id -- esse varia por client, ver ComponentDistributorService). O app não\n// precisa (e não deve) declarar nada em features.routes.ts pra isso funcionar; basta\n// o client dele estar vinculado ao template \"auto-service\" (auth.clients.template_id).\n// 9 páginas (Início, Novidades, Sugestões e Avaliações na raiz + Grupos/Aplicações/Cliente em Administração +\n// Ações/Tentativas de login em Auditoria) -- o ComponentDistributorService\n// já suporta N entradas, cada uma casando pelo seu próprio source_template_router_id.\nexport function provideAutoService(config: AutoServiceConfig): EnvironmentProviders {\n const componentRoutes: ComponentRoute[] = [\n { source_template_router_id: AUTO_SERVICE_HOME_TEMPLATE_ROUTER_ID, load: AUTO_SERVICE_SCREENS.home, document: AUTO_SERVICE_DOCUMENTS.home },\n { source_template_router_id: AUTO_SERVICE_GROUPS_TEMPLATE_ROUTER_ID, load: AUTO_SERVICE_SCREENS.groups, document: AUTO_SERVICE_DOCUMENTS.groups },\n { source_template_router_id: AUTO_SERVICE_APPS_TEMPLATE_ROUTER_ID, load: AUTO_SERVICE_SCREENS.apps, document: AUTO_SERVICE_DOCUMENTS.apps },\n { source_template_router_id: AUTO_SERVICE_CLIENT_TEMPLATE_ROUTER_ID, load: AUTO_SERVICE_SCREENS.client, document: AUTO_SERVICE_DOCUMENTS.client },\n { source_template_router_id: AUTO_SERVICE_AUDIT_TEMPLATE_ROUTER_ID, load: AUTO_SERVICE_SCREENS.audit, document: AUTO_SERVICE_DOCUMENTS.audit },\n { source_template_router_id: AUTO_SERVICE_LOGIN_ATTEMPTS_TEMPLATE_ROUTER_ID, load: AUTO_SERVICE_SCREENS.loginAttempts, document: AUTO_SERVICE_DOCUMENTS.loginAttempts },\n { source_template_router_id: AUTO_SERVICE_NEWS_TEMPLATE_ROUTER_ID, load: AUTO_SERVICE_SCREENS.news, document: AUTO_SERVICE_DOCUMENTS.news },\n { source_template_router_id: AUTO_SERVICE_SUGGESTIONS_TEMPLATE_ROUTER_ID, load: AUTO_SERVICE_SCREENS.suggestions, document: AUTO_SERVICE_DOCUMENTS.suggestions },\n { source_template_router_id: AUTO_SERVICE_RATINGS_TEMPLATE_ROUTER_ID, load: AUTO_SERVICE_SCREENS.ratings, document: AUTO_SERVICE_DOCUMENTS.ratings },\n ];\n\n return makeEnvironmentProviders([\n { provide: AUTO_SERVICE_CONFIG, useValue: config },\n // Mesma URL, exposta também para o painel de configurações (tokens de aplicação em /me).\n { provide: SPINE_ADMIN_API, useValue: config.adminApi },\n { provide: COMPONENT_ROUTES, useValue: componentRoutes, multi: true },\n ]);\n}\n","import { HttpClient, HttpHeaders, HttpParams } from '@angular/common/http';\nimport { Inject, Injectable } from '@angular/core';\nimport { firstValueFrom } from 'rxjs';\nimport { AuthorizationService } from '@orfeu/angular/core';\nimport { urlPath } from '@trismegisto/primitives';\nimport { AUTO_SERVICE_CONFIG, AutoServiceConfig } from './auto-service.tokens';\n\n/** Nível de um nó na árvore do menu (`GET /routers/tree`). */\nexport type RouterOrderType = 'header' | 'navigation' | 'menu' | 'item' | 'submenu' | 'page';\n\n/** Nó da árvore do menu: uma rota num nível, com todos os routers que passam por ela. */\nexport interface RouterOrderNode {\n route_type: RouterOrderType;\n routed_id: string;\n route_name: string;\n route_display_name: string | null;\n route_icon: string | null;\n order: number;\n router_ids: string[];\n children: RouterOrderNode[];\n}\n\n/** Um item da ordem nova de um nível (`PATCH /routers/reorder`). */\nexport interface RouterOrderGroup { type: RouterOrderType; router_ids: string[] }\n\n/**\n * Grupo do projeto do client (`GET /groups`). O grupo de administração do projeto (`is_admin`) é gerido só no painel\n * central e o servidor não o devolve aqui; servidor antigo ainda devolve com `is_admin: true` e as telas descartam.\n */\nexport interface AutoServiceGroup {\n id: string;\n name: string;\n description: string | null;\n enabled: boolean;\n is_admin?: boolean;\n type: { id: string; name: string; level: number } | null;\n}\n\n/** Sugestão de membro (`GET /groups/:groupId/member-suggestions`): está em outros grupos do sistema (`groups`). */\nexport interface AutoServiceMemberSuggestion {\n id: string;\n username: string;\n email: string | null;\n name: string | null;\n picture: string | null;\n group_count: number;\n groups: string[];\n}\n\n/** Tipo de grupo (crachá) do realm (`GET /group-types`). */\nexport interface AutoServiceGroupType { id: string; name: string; level: number; assignable: boolean }\n\n/** Corpo de `POST /groups` (o projeto é sempre o do client). */\nexport interface AutoServiceGroupCreate { group_id?: string; name: string; type_id: string; description?: string }\n\n/** Corpo de `PUT /groups/:groupId`; do grupo de administração só `description`. `null` apaga a descrição. */\nexport interface AutoServiceGroupUpdate { name?: string; type_id?: string; description?: string | null; enabled?: boolean }\n\n/** Aplicação (client_credentials) do projeto do client (`GET /apps`). */\nexport interface AutoServiceApp {\n id: string;\n name: string;\n enabled: boolean;\n allowed_grants?: string[] | null;\n [key: string]: unknown;\n}\n\n/**\n * Token de API (`x-api-token`) de uma aplicação (`GET /apps/:appId/tokens`). O valor só vem na criação; aqui fica o\n * começo dele (`token_prefix`) para reconhecer. Cada token é também um consumer (`consumer_id`) com as permissões dele.\n */\nexport interface AutoServiceAppToken {\n id: string;\n consumer_id: string;\n name: string;\n description: string | null;\n token_prefix: string;\n expires_at: string;\n revoked_at: string | null;\n created_at: string;\n last_used_at: string | null;\n}\n\n/** Corpo de `POST /apps/:appId/tokens`: validade ISO (até 365 dias) e as operações protected liberadas ao token. */\nexport interface AutoServiceAppTokenCreate { name: string; description?: string; expires_at: string; operation_ids?: string[] }\n\n/** Resposta de `POST /apps/:appId/tokens`: `token` é o valor cru, devolvido uma única vez. */\nexport interface AutoServiceAppTokenCreated { id: string; consumer_id: string; name: string; token: string }\n\n@Injectable({ providedIn: 'root' })\nexport class AutoServiceService {\n\n private get baseUrl() {\n return `${this.config.adminApi}/auto-service`;\n }\n\n /** `baseUrl` + caminho com cada id interpolado codificado (`urlPath`): um id com `/`, `?`, `#` ou `..` não muda o recurso. */\n private url(strings: TemplateStringsArray, ...ids: readonly string[]): string {\n return this.baseUrl + urlPath(strings, ...ids);\n }\n\n private get headers(): HttpHeaders {\n const token = this.auth.getToken();\n return new HttpHeaders({ 'x-access-token': token ?? '' });\n }\n\n constructor(\n private http: HttpClient,\n private auth: AuthorizationService,\n @Inject(AUTO_SERVICE_CONFIG) private config: AutoServiceConfig,\n ) {}\n\n // Descoberta\n getMyClients() { return firstValueFrom(this.http.get<{ clients: any[] }>(this.baseUrl, { headers: this.headers })); }\n\n // Routes\n getWebRoutes(clientId: string) { return firstValueFrom(this.http.get<{ routes: any[] }>(this.url`/${clientId}/routes`, { headers: this.headers })); }\n createWebRoute(clientId: string, body: any) { return firstValueFrom(this.http.post<any>(this.url`/${clientId}/routes`, body, { headers: this.headers })); }\n updateWebRoute(clientId: string, id: string, body: any) { return firstValueFrom(this.http.put<any>(this.url`/${clientId}/routes/${id}`, body, { headers: this.headers })); }\n deleteWebRoute(clientId: string, id: string) { return firstValueFrom(this.http.delete<any>(this.url`/${clientId}/routes/${id}`, { headers: this.headers })); }\n\n // Routers\n getRouters(clientId: string) { return firstValueFrom(this.http.get<{ routers: any[] }>(this.url`/${clientId}/routers`, { headers: this.headers })); }\n createRouter(clientId: string, body: any) { return firstValueFrom(this.http.post<any>(this.url`/${clientId}/routers`, body, { headers: this.headers })); }\n updateRouter(clientId: string, id: string, body: any) { return firstValueFrom(this.http.put<any>(this.url`/${clientId}/routers/${id}`, body, { headers: this.headers })); }\n deleteRouter(clientId: string, id: string) { return firstValueFrom(this.http.delete<any>(this.url`/${clientId}/routers/${id}`, { headers: this.headers })); }\n /** Árvore do menu (header → … → página) com os router_ids de cada nó, já na ordem gravada. */\n getRouterTree(clientId: string) { return firstValueFrom(this.http.get<{ tree: RouterOrderNode[] }>(this.url`/${clientId}/routers/tree`, { headers: this.headers })); }\n /**\n * Grava a ordem de UM nível (irmãos): o índice do grupo é a ordem; cada grupo escreve `${type}_order`\n * em todos os seus routers. Vale também para routers de template (ordem é do client).\n */\n reorderRouters(clientId: string, groups: RouterOrderGroup[]) { return firstValueFrom(this.http.patch<any>(this.url`/${clientId}/routers/reorder`, { groups }, { headers: this.headers })); }\n\n // Groups (do projeto do client, sem o grupo de administração: editar/excluir/membros dele respondem 404)\n getGroups(clientId: string) { return firstValueFrom(this.http.get<{ groups: AutoServiceGroup[] }>(this.url`/${clientId}/groups`, { headers: this.headers })); }\n /** Tipos (crachás) do realm; `assignable: false` no Administrador, que é só do grupo de administração (painel central). */\n getGroupTypes(clientId: string) { return firstValueFrom(this.http.get<{ group_types: AutoServiceGroupType[] }>(this.url`/${clientId}/group-types`, { headers: this.headers })); }\n createGroup(clientId: string, body: AutoServiceGroupCreate) { return firstValueFrom(this.http.post<AutoServiceGroup>(this.url`/${clientId}/groups`, body, { headers: this.headers })); }\n updateGroup(clientId: string, groupId: string, body: AutoServiceGroupUpdate) { return firstValueFrom(this.http.put<AutoServiceGroup>(this.url`/${clientId}/groups/${groupId}`, body, { headers: this.headers })); }\n deleteGroup(clientId: string, groupId: string) { return firstValueFrom(this.http.delete<void>(this.url`/${clientId}/groups/${groupId}`, { headers: this.headers })); }\n getGroupMembers(clientId: string, groupId: string) { return firstValueFrom(this.http.get<{ members: any[] }>(this.url`/${clientId}/groups/${groupId}/members`, { headers: this.headers })); }\n /** Sugestões para adicionar ao grupo: quem já está em outro grupo deste sistema e ainda não neste, com foto e os grupos. */\n getMemberSuggestions(clientId: string, groupId: string, limit = 8) {\n const params = new HttpParams().set('limit', String(limit));\n return firstValueFrom(this.http.get<{ users: AutoServiceMemberSuggestion[] }>(this.url`/${clientId}/groups/${groupId}/member-suggestions`, { headers: this.headers, params }));\n }\n addGroupMember(clientId: string, groupId: string, userId: string, role: string | null) { return firstValueFrom(this.http.post<any>(this.url`/${clientId}/groups/${groupId}/members`, { user_id: userId, role }, { headers: this.headers })); }\n updateGroupMemberRole(clientId: string, groupId: string, userId: string, role: string | null) { return firstValueFrom(this.http.put<any>(this.url`/${clientId}/groups/${groupId}/members/${userId}`, { role }, { headers: this.headers })); }\n removeGroupMember(clientId: string, groupId: string, userId: string) { return firstValueFrom(this.http.delete<any>(this.url`/${clientId}/groups/${groupId}/members/${userId}`, { headers: this.headers })); }\n\n // Users (só leitura -- popular a busca de \"adicionar membro\" na aba Grupos, escopada pelo realm do próprio client)\n searchUsers(clientId: string, opts: { search?: string; limit?: number } = {}) {\n let params = new HttpParams();\n if (opts.search) params = params.set('search', opts.search);\n if (opts.limit) params = params.set('limit', String(opts.limit));\n return firstValueFrom(this.http.get<{ users: any[] }>(this.url`/${clientId}/users`, { headers: this.headers, params }));\n }\n\n // Access\n getAccess(clientId: string) { return firstValueFrom(this.http.get<{ access: any[] }>(this.url`/${clientId}/access`, { headers: this.headers })); }\n createAccess(clientId: string, groupId: string) { return firstValueFrom(this.http.post<any>(this.url`/${clientId}/access`, { group_id: groupId }, { headers: this.headers })); }\n deleteAccess(clientId: string, accessId: string) { return firstValueFrom(this.http.delete<any>(this.url`/${clientId}/access/${accessId}`, { headers: this.headers })); }\n getGuards(clientId: string, accessId: string) { return firstValueFrom(this.http.get<{ guards: any[] }>(this.url`/${clientId}/access/${accessId}/guards`, { headers: this.headers })); }\n addGuard(clientId: string, accessId: string, routerId: string) { return firstValueFrom(this.http.post<any>(this.url`/${clientId}/access/${accessId}/guards`, { router_id: routerId }, { headers: this.headers })); }\n removeGuard(clientId: string, accessId: string, guardId: string) { return firstValueFrom(this.http.delete<any>(this.url`/${clientId}/access/${accessId}/guards/${guardId}`, { headers: this.headers })); }\n\n // Apps (aplicações client_credentials no Project deste client)\n getApps(clientId: string) { return firstValueFrom(this.http.get<{ apps: AutoServiceApp[] }>(this.url`/${clientId}/apps`, { headers: this.headers })); }\n createApp(clientId: string, body: { name: string; allowed_grants?: string[] }) { return firstValueFrom(this.http.post<{ id: string; name: string; secret: string }>(this.url`/${clientId}/apps`, body, { headers: this.headers })); }\n updateApp(clientId: string, appId: string, body: any) { return firstValueFrom(this.http.put<any>(this.url`/${clientId}/apps/${appId}`, body, { headers: this.headers })); }\n /** Gera um segredo novo para a aplicação (o anterior para de valer na hora). A resposta traz o segredo uma única vez. */\n rotateAppSecret(clientId: string, appId: string) { return firstValueFrom(this.http.post<{ id: string; secret: string }>(this.url`/${clientId}/apps/${appId}/secret`, {}, { headers: this.headers })); }\n deleteApp(clientId: string, appId: string) { return firstValueFrom(this.http.delete<any>(this.url`/${clientId}/apps/${appId}`, { headers: this.headers })); }\n getAppOperations(clientId: string, appId: string) { return firstValueFrom(this.http.get<{ operations: any[] }>(this.url`/${clientId}/apps/${appId}/operations`, { headers: this.headers })); }\n\n // Tokens de API da aplicação (x-api-token)\n getAppTokens(clientId: string, appId: string) { return firstValueFrom(this.http.get<{ tokens: AutoServiceAppToken[] }>(this.url`/${clientId}/apps/${appId}/tokens`, { headers: this.headers })); }\n /** Cria o token (e o consumer dele, com as permissões escolhidas). A resposta traz o valor uma única vez. */\n createAppToken(clientId: string, appId: string, body: AutoServiceAppTokenCreate) { return firstValueFrom(this.http.post<AutoServiceAppTokenCreated>(this.url`/${clientId}/apps/${appId}/tokens`, body, { headers: this.headers })); }\n /** Revoga: o token para de valer na hora e continua na lista como revogado. */\n revokeAppToken(clientId: string, appId: string, tokenId: string) { return firstValueFrom(this.http.delete<void>(this.url`/${clientId}/apps/${appId}/tokens/${tokenId}`, { headers: this.headers })); }\n\n // Consumers (grupo ↔ aplicação), sem o do grupo de administração: o servidor não o lista e o :consumerId dele é 404\n // (servidor antigo ainda devolve com `group_is_admin: true` e a aba Acessos descarta)\n getAppConsumers(clientId: string, appId: string) { return firstValueFrom(this.http.get<{ consumers: any[] }>(this.url`/${clientId}/apps/${appId}/consumers`, { headers: this.headers })); }\n createAppConsumer(clientId: string, appId: string, groupId: string) { return firstValueFrom(this.http.post<any>(this.url`/${clientId}/apps/${appId}/consumers`, { group_id: groupId }, { headers: this.headers })); }\n deleteAppConsumer(clientId: string, consumerId: string) { return firstValueFrom(this.http.delete<any>(this.url`/${clientId}/apps/consumers/${consumerId}`, { headers: this.headers })); }\n\n // Permissions (consumer ↔ operação)\n getAppPermissions(clientId: string, consumerId: string) { return firstValueFrom(this.http.get<{ permissions: any[] }>(this.url`/${clientId}/apps/consumers/${consumerId}/permissions`, { headers: this.headers })); }\n addAppPermission(clientId: string, consumerId: string, operationId: string) { return firstValueFrom(this.http.post<any>(this.url`/${clientId}/apps/consumers/${consumerId}/permissions`, { operation_id: operationId }, { headers: this.headers })); }\n removeAppPermission(clientId: string, consumerId: string, permissionId: string) { return firstValueFrom(this.http.delete<any>(this.url`/${clientId}/apps/consumers/${consumerId}/permissions/${permissionId}`, { headers: this.headers })); }\n // Auditoria: ver `SpineAuditService` (`@trismegisto/spine/audit`), o mesmo nos escopos admin e client.\n}\n","export * from './auto-service.tokens';\nexport * from './provide-auto-service';\nexport * from './auto-service.service';\nexport type { AutoServiceClient } from './client-picker/auto-service-client-picker.component';\n// A auditoria (tipos, serviço e a tela) mora em `@trismegisto/spine/audit` — NÃO reexporte daqui: um\n// `export` estático puxaria a tela para o arquivo deste ponto de entrada (ver abaixo e check-lazy).\n// As telas (Início, Grupos, Aplicações, Cliente) e as peças delas NÃO são exportadas daqui de propósito:\n// ficam só atrás dos `import()` de `AUTO_SERVICE_SCREENS`. Qualquer `export` estático de um componente\n// delas faz o rollup do ng-packagr juntar a tela no FESM do ponto de entrada e trocar o `import()` por\n// `Promise.resolve()` — e a tela (data-grid, combobox, drawer...) vai para o bundle inicial de todo app\n// (bug da 0.9.9). `scripts/check-lazy.mjs` (no `npm run build`) falha se isso voltar.\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"trismegisto-spine-auto-service.mjs","sources":["../../../projects/ui/auto-service/src/auto-service.tokens.ts","../../../projects/ui/auto-service/src/provide-auto-service.ts","../../../projects/ui/auto-service/src/auto-service.service.ts","../../../projects/ui/auto-service/src/public-api.ts","../../../projects/ui/auto-service/src/trismegisto-spine-auto-service.ts"],"sourcesContent":["import { InjectionToken } from '@angular/core';\n\nexport interface AutoServiceConfig {\n // Base URL do argos-admin-server (o mesmo backend central que atende\n // /admin/*) -- /auto-service/* já existe lá, escopado por client_id, servindo\n // qualquer aplicação que instale este pacote, não só o argos-admin.\n adminApi: string;\n}\n\nexport const AUTO_SERVICE_CONFIG = new InjectionToken<AutoServiceConfig>('AUTO_SERVICE_CONFIG');\n\n// router_id dos roteadores (páginas) do template \"auto-service\" (web.template_router,\n// ver apps/argos/database/argos/seed/web/04-template_router.sql) -- valores literais e\n// estáveis (mesma convenção do resto do seed: UUID fixo, nunca gerado em runtime). É\n// contra ISSO que o ComponentDistributorService casa via source_template_router_id\n// (não o router_id materializado de cada client, que varia): qualquer client\n// vinculado ao template \"auto-service\" resolve todos automaticamente, sem precisar\n// declarar nada no próprio features.routes.ts. Grupos, Aplicações e Cliente ficam no grupo\n// \"Administração\" do template e Ações e Tentativas de login no grupo \"Auditoria\"; Início,\n// Novidades, Sugestões e Avaliações são páginas soltas na raiz. Os grupos nunca precisam de\n// componente (nunca são page_id de router).\nexport const AUTO_SERVICE_GROUPS_TEMPLATE_ROUTER_ID = 'ad100001-0000-4000-8000-000000000001';\nexport const AUTO_SERVICE_APPS_TEMPLATE_ROUTER_ID = 'ad100002-0000-4000-8000-000000000001';\nexport const AUTO_SERVICE_CLIENT_TEMPLATE_ROUTER_ID = 'ad100003-0000-4000-8000-000000000001';\n// Menu \"Auditoria\" (rota AD000006, dentro de \"Administração\", migration 0012 do argos): duas páginas.\n// Ações (a leitura da auditoria, `audit.events`) -- o nome da constante ficou do tempo em que era a página \"Auditoria\".\nexport const AUTO_SERVICE_AUDIT_TEMPLATE_ROUTER_ID = 'ad100004-0000-4000-8000-000000000001';\n// Tentativas de login (`auth.auth_attempts` com o client do app).\nexport const AUTO_SERVICE_LOGIN_ATTEMPTS_TEMPLATE_ROUTER_ID = 'ad100005-0000-4000-8000-000000000001';\n// Novidades, Sugestões e Avaliações (migration 0036 do argos): páginas na raiz, fora de \"Administração\" -- eram abas\n// da tela Cliente. Cada uma é o seletor de client + o painel que ficava na aba.\nexport const AUTO_SERVICE_NEWS_TEMPLATE_ROUTER_ID = 'ad100006-0000-4000-8000-000000000001';\nexport const AUTO_SERVICE_SUGGESTIONS_TEMPLATE_ROUTER_ID = 'ad100007-0000-4000-8000-000000000001';\nexport const AUTO_SERVICE_RATINGS_TEMPLATE_ROUTER_ID = 'ad100008-0000-4000-8000-000000000001';\n// Início (\"home\", página de topo e pública do mesmo template). Todo client clonado do\n// template ganha a própria linha em web.router com source_template_router_id apontando pra cá.\nexport const AUTO_SERVICE_HOME_TEMPLATE_ROUTER_ID = '6a9a13db-f31b-494e-b51c-79af0ac28b60';\n","import { EnvironmentProviders, Type, makeEnvironmentProviders } from '@angular/core';\nimport { COMPONENT_ROUTES, ComponentRoute, RouteDocument } from '@trismegisto/spine/routing';\nimport { SPINE_ADMIN_API } from '@trismegisto/spine';\nimport {\n AUTO_SERVICE_CONFIG, AutoServiceConfig,\n AUTO_SERVICE_GROUPS_TEMPLATE_ROUTER_ID, AUTO_SERVICE_APPS_TEMPLATE_ROUTER_ID, AUTO_SERVICE_CLIENT_TEMPLATE_ROUTER_ID,\n AUTO_SERVICE_HOME_TEMPLATE_ROUTER_ID, AUTO_SERVICE_AUDIT_TEMPLATE_ROUTER_ID, AUTO_SERVICE_LOGIN_ATTEMPTS_TEMPLATE_ROUTER_ID,\n AUTO_SERVICE_NEWS_TEMPLATE_ROUTER_ID, AUTO_SERVICE_SUGGESTIONS_TEMPLATE_ROUTER_ID, AUTO_SERVICE_RATINGS_TEMPLATE_ROUTER_ID,\n} from './auto-service.tokens';\n\n/**\n * As 9 telas do auto-serviço, carregadas sob demanda. Cada `import()` relativo vira um chunk próprio no\n * FESM publicado (`trismegisto-spine-auto-service-<tela>-<hash>.mjs`), que o bundler do app mantém fora\n * do carregamento inicial. Não exporte as telas no `public-api.ts` (ver o comentário lá).\n */\nexport const AUTO_SERVICE_SCREENS: Readonly<Record<\n 'home' | 'groups' | 'apps' | 'client' | 'audit' | 'loginAttempts' | 'news' | 'suggestions' | 'ratings',\n () => Promise<Type<unknown>>\n>> = {\n home: () => import('./home/home.component').then(m => m.HomeComponent),\n groups: () => import('./groups/auto-service-groups.component').then(m => m.AutoServiceGroupsComponent),\n apps: () => import('./auto-service.component').then(m => m.AutoServiceComponent),\n client: () => import('./auto-service-client.component').then(m => m.AutoServiceClientComponent),\n audit: () => import('./audit/auto-service-audit.component').then(m => m.AutoServiceAuditComponent),\n loginAttempts: () => import('./audit/auto-service-login-attempts.component').then(m => m.AutoServiceLoginAttemptsComponent),\n news: () => import('./pages/auto-service-news-page.component').then(m => m.AutoServiceNewsPageComponent),\n suggestions: () => import('./pages/auto-service-suggestions-page.component').then(m => m.AutoServiceSuggestionsPageComponent),\n ratings: () => import('./pages/auto-service-ratings-page.component').then(m => m.AutoServiceRatingsPageComponent),\n};\n\n/**\n * Documentação das 9 telas (botão de documentação da barra da página e índice \"Documentação do sistema\"): o manual\n * de uso (`load`) e a especificação técnica (`loadTechnical`, só com `SpineConfig.technicalDocs`). O Markdown fica em\n * módulos `.ts` próprios em `./docs/` (o ng-packagr não carrega `.md` como texto), cada um atrás de um `import()`\n * relativo: vira um chunk à parte no FESM e só é baixado quando alguém abre o documento. Sem `title`/`group`: o\n * índice usa o nome da rota e o módulo da árvore do client. O `SpineDocsService` casa estas entradas pelo\n * `source_template_router_id`, como o `ComponentDistributorService` faz com as telas.\n */\nexport const AUTO_SERVICE_DOCUMENTS: Readonly<Record<keyof typeof AUTO_SERVICE_SCREENS, RouteDocument>> = {\n home: {\n load: () => import('./docs/home.usage').then(m => m.default),\n loadTechnical: () => import('./docs/home.technical').then(m => m.default),\n },\n groups: {\n load: () => import('./docs/groups.usage').then(m => m.default),\n loadTechnical: () => import('./docs/groups.technical').then(m => m.default),\n },\n apps: {\n load: () => import('./docs/apps.usage').then(m => m.default),\n loadTechnical: () => import('./docs/apps.technical').then(m => m.default),\n },\n client: {\n load: () => import('./docs/client.usage').then(m => m.default),\n loadTechnical: () => import('./docs/client.technical').then(m => m.default),\n },\n audit: {\n load: () => import('./docs/audit.usage').then(m => m.default),\n loadTechnical: () => import('./docs/audit.technical').then(m => m.default),\n },\n loginAttempts: {\n load: () => import('./docs/login-attempts.usage').then(m => m.default),\n loadTechnical: () => import('./docs/login-attempts.technical').then(m => m.default),\n },\n news: {\n load: () => import('./docs/news.usage').then(m => m.default),\n loadTechnical: () => import('./docs/news.technical').then(m => m.default),\n },\n suggestions: {\n load: () => import('./docs/suggestions.usage').then(m => m.default),\n loadTechnical: () => import('./docs/suggestions.technical').then(m => m.default),\n },\n ratings: {\n load: () => import('./docs/ratings.usage').then(m => m.default),\n loadTechnical: () => import('./docs/ratings.technical').then(m => m.default),\n },\n};\n\n// Cada app consumidora chama isso uma vez no bootstrap (mesmo padrão do\n// provideAuth do @orfeu/angular) informando só a URL do argos-admin-server --\n// o resto vem pronto: rotas/serviço (@trismegisto/spine/auto-service) E a própria\n// ligação com os itens de menu, registrada aqui via source_template_router_id (não\n// route_id -- esse varia por client, ver ComponentDistributorService). O app não\n// precisa (e não deve) declarar nada em features.routes.ts pra isso funcionar; basta\n// o client dele estar vinculado ao template \"auto-service\" (auth.clients.template_id).\n// 9 páginas (Início, Novidades, Sugestões e Avaliações na raiz + Grupos/Aplicações/Cliente em Administração +\n// Ações/Tentativas de login em Auditoria) -- o ComponentDistributorService\n// já suporta N entradas, cada uma casando pelo seu próprio source_template_router_id.\nexport function provideAutoService(config: AutoServiceConfig): EnvironmentProviders {\n const componentRoutes: ComponentRoute[] = [\n { source_template_router_id: AUTO_SERVICE_HOME_TEMPLATE_ROUTER_ID, load: AUTO_SERVICE_SCREENS.home, document: AUTO_SERVICE_DOCUMENTS.home },\n { source_template_router_id: AUTO_SERVICE_GROUPS_TEMPLATE_ROUTER_ID, load: AUTO_SERVICE_SCREENS.groups, document: AUTO_SERVICE_DOCUMENTS.groups },\n { source_template_router_id: AUTO_SERVICE_APPS_TEMPLATE_ROUTER_ID, load: AUTO_SERVICE_SCREENS.apps, document: AUTO_SERVICE_DOCUMENTS.apps },\n { source_template_router_id: AUTO_SERVICE_CLIENT_TEMPLATE_ROUTER_ID, load: AUTO_SERVICE_SCREENS.client, document: AUTO_SERVICE_DOCUMENTS.client },\n { source_template_router_id: AUTO_SERVICE_AUDIT_TEMPLATE_ROUTER_ID, load: AUTO_SERVICE_SCREENS.audit, document: AUTO_SERVICE_DOCUMENTS.audit },\n { source_template_router_id: AUTO_SERVICE_LOGIN_ATTEMPTS_TEMPLATE_ROUTER_ID, load: AUTO_SERVICE_SCREENS.loginAttempts, document: AUTO_SERVICE_DOCUMENTS.loginAttempts },\n { source_template_router_id: AUTO_SERVICE_NEWS_TEMPLATE_ROUTER_ID, load: AUTO_SERVICE_SCREENS.news, document: AUTO_SERVICE_DOCUMENTS.news },\n { source_template_router_id: AUTO_SERVICE_SUGGESTIONS_TEMPLATE_ROUTER_ID, load: AUTO_SERVICE_SCREENS.suggestions, document: AUTO_SERVICE_DOCUMENTS.suggestions },\n { source_template_router_id: AUTO_SERVICE_RATINGS_TEMPLATE_ROUTER_ID, load: AUTO_SERVICE_SCREENS.ratings, document: AUTO_SERVICE_DOCUMENTS.ratings },\n ];\n\n return makeEnvironmentProviders([\n { provide: AUTO_SERVICE_CONFIG, useValue: config },\n // Mesma URL, exposta também para o painel de configurações (tokens de aplicação em /me).\n { provide: SPINE_ADMIN_API, useValue: config.adminApi },\n { provide: COMPONENT_ROUTES, useValue: componentRoutes, multi: true },\n ]);\n}\n","import { HttpClient, HttpHeaders, HttpParams } from '@angular/common/http';\nimport { Inject, Injectable } from '@angular/core';\nimport { Observable, firstValueFrom } from 'rxjs';\nimport { AuthorizationService } from '@orfeu/angular/core';\nimport { urlPath } from '@trismegisto/primitives';\nimport { AUTO_SERVICE_CONFIG, AutoServiceConfig } from './auto-service.tokens';\n\n/** Nível de um nó na árvore do menu (`GET /routers/tree`). */\nexport type RouterOrderType = 'header' | 'navigation' | 'menu' | 'item' | 'submenu' | 'page';\n\n/** Nó da árvore do menu: uma rota num nível, com todos os routers que passam por ela. */\nexport interface RouterOrderNode {\n route_type: RouterOrderType;\n routed_id: string;\n route_name: string;\n route_display_name: string | null;\n route_icon: string | null;\n order: number;\n router_ids: string[];\n children: RouterOrderNode[];\n}\n\n/** Um item da ordem nova de um nível (`PATCH /routers/reorder`). */\nexport interface RouterOrderGroup { type: RouterOrderType; router_ids: string[] }\n\n/**\n * Grupo do projeto do client (`GET /groups`). O grupo de administração do projeto (`is_admin`) é gerido só no painel\n * central e o servidor não o devolve aqui; servidor antigo ainda devolve com `is_admin: true` e as telas descartam.\n */\nexport interface AutoServiceGroup {\n id: string;\n name: string;\n description: string | null;\n enabled: boolean;\n is_admin?: boolean;\n type: { id: string; name: string; level: number } | null;\n}\n\n/** Página e filtros de `GET /groups/:groupId/members`. */\nexport interface AutoServiceMembersQuery {\n page?: number;\n limit?: number;\n search?: string;\n}\n\n/** Uma página de membros: `total` conta quem passa pela busca. */\nexport interface AutoServiceMembersPage {\n members: any[];\n total: number;\n page: number;\n limit: number;\n}\n\n/** Sugestão de membro (`GET /groups/:groupId/member-suggestions`): está em outros grupos do sistema (`groups`). */\nexport interface AutoServiceMemberSuggestion {\n id: string;\n username: string;\n email: string | null;\n name: string | null;\n picture: string | null;\n group_count: number;\n groups: string[];\n}\n\n/** Tipo de grupo (crachá) do realm (`GET /group-types`). */\nexport interface AutoServiceGroupType { id: string; name: string; level: number; assignable: boolean }\n\n/** Corpo de `POST /groups` (o projeto é sempre o do client). */\nexport interface AutoServiceGroupCreate { group_id?: string; name: string; type_id: string; description?: string }\n\n/** Corpo de `PUT /groups/:groupId`; do grupo de administração só `description`. `null` apaga a descrição. */\nexport interface AutoServiceGroupUpdate { name?: string; type_id?: string; description?: string | null; enabled?: boolean }\n\n/** Aplicação (client_credentials) do projeto do client (`GET /apps`). */\nexport interface AutoServiceApp {\n id: string;\n name: string;\n enabled: boolean;\n allowed_grants?: string[] | null;\n [key: string]: unknown;\n}\n\n/**\n * Token de API (`x-api-token`) de uma aplicação (`GET /apps/:appId/tokens`). O valor só vem na criação; aqui fica o\n * começo dele (`token_prefix`) para reconhecer. Cada token é também um consumer (`consumer_id`) com as permissões dele.\n */\nexport interface AutoServiceAppToken {\n id: string;\n consumer_id: string;\n name: string;\n description: string | null;\n token_prefix: string;\n expires_at: string;\n revoked_at: string | null;\n created_at: string;\n last_used_at: string | null;\n}\n\n/** Corpo de `POST /apps/:appId/tokens`: validade ISO (até 365 dias) e as operações protected liberadas ao token. */\nexport interface AutoServiceAppTokenCreate { name: string; description?: string; expires_at: string; operation_ids?: string[] }\n\n/** Resposta de `POST /apps/:appId/tokens`: `token` é o valor cru, devolvido uma única vez. */\nexport interface AutoServiceAppTokenCreated { id: string; consumer_id: string; name: string; token: string }\n\n@Injectable({ providedIn: 'root' })\nexport class AutoServiceService {\n\n private get baseUrl() {\n return `${this.config.adminApi}/auto-service`;\n }\n\n /** `baseUrl` + caminho com cada id interpolado codificado (`urlPath`): um id com `/`, `?`, `#` ou `..` não muda o recurso. */\n private url(strings: TemplateStringsArray, ...ids: readonly string[]): string {\n return this.baseUrl + urlPath(strings, ...ids);\n }\n\n private get headers(): HttpHeaders {\n const token = this.auth.getToken();\n return new HttpHeaders({ 'x-access-token': token ?? '' });\n }\n\n constructor(\n private http: HttpClient,\n private auth: AuthorizationService,\n @Inject(AUTO_SERVICE_CONFIG) private config: AutoServiceConfig,\n ) {}\n\n // Descoberta\n getMyClients() { return firstValueFrom(this.http.get<{ clients: any[] }>(this.baseUrl, { headers: this.headers })); }\n\n // Routes\n getWebRoutes(clientId: string) { return firstValueFrom(this.http.get<{ routes: any[] }>(this.url`/${clientId}/routes`, { headers: this.headers })); }\n createWebRoute(clientId: string, body: any) { return firstValueFrom(this.http.post<any>(this.url`/${clientId}/routes`, body, { headers: this.headers })); }\n updateWebRoute(clientId: string, id: string, body: any) { return firstValueFrom(this.http.put<any>(this.url`/${clientId}/routes/${id}`, body, { headers: this.headers })); }\n deleteWebRoute(clientId: string, id: string) { return firstValueFrom(this.http.delete<any>(this.url`/${clientId}/routes/${id}`, { headers: this.headers })); }\n\n // Routers\n getRouters(clientId: string) { return firstValueFrom(this.http.get<{ routers: any[] }>(this.url`/${clientId}/routers`, { headers: this.headers })); }\n createRouter(clientId: string, body: any) { return firstValueFrom(this.http.post<any>(this.url`/${clientId}/routers`, body, { headers: this.headers })); }\n updateRouter(clientId: string, id: string, body: any) { return firstValueFrom(this.http.put<any>(this.url`/${clientId}/routers/${id}`, body, { headers: this.headers })); }\n deleteRouter(clientId: string, id: string) { return firstValueFrom(this.http.delete<any>(this.url`/${clientId}/routers/${id}`, { headers: this.headers })); }\n /** Árvore do menu (header → … → página) com os router_ids de cada nó, já na ordem gravada. */\n getRouterTree(clientId: string) { return firstValueFrom(this.http.get<{ tree: RouterOrderNode[] }>(this.url`/${clientId}/routers/tree`, { headers: this.headers })); }\n /**\n * Grava a ordem de UM nível (irmãos): o índice do grupo é a ordem; cada grupo escreve `${type}_order`\n * em todos os seus routers. Vale também para routers de template (ordem é do client).\n */\n reorderRouters(clientId: string, groups: RouterOrderGroup[]) { return firstValueFrom(this.http.patch<any>(this.url`/${clientId}/routers/reorder`, { groups }, { headers: this.headers })); }\n\n // Groups (do projeto do client, sem o grupo de administração: editar/excluir/membros dele respondem 404)\n getGroups(clientId: string) { return firstValueFrom(this.http.get<{ groups: AutoServiceGroup[] }>(this.url`/${clientId}/groups`, { headers: this.headers })); }\n /** Tipos (crachás) do realm; `assignable: false` no Administrador, que é só do grupo de administração (painel central). */\n getGroupTypes(clientId: string) { return firstValueFrom(this.http.get<{ group_types: AutoServiceGroupType[] }>(this.url`/${clientId}/group-types`, { headers: this.headers })); }\n createGroup(clientId: string, body: AutoServiceGroupCreate) { return firstValueFrom(this.http.post<AutoServiceGroup>(this.url`/${clientId}/groups`, body, { headers: this.headers })); }\n updateGroup(clientId: string, groupId: string, body: AutoServiceGroupUpdate) { return firstValueFrom(this.http.put<AutoServiceGroup>(this.url`/${clientId}/groups/${groupId}`, body, { headers: this.headers })); }\n deleteGroup(clientId: string, groupId: string) { return firstValueFrom(this.http.delete<void>(this.url`/${clientId}/groups/${groupId}`, { headers: this.headers })); }\n /**\n * Uma página dos membros (o servidor pagina: padrão 50, até 200 por página), pela ordem do login, com busca por nome,\n * login ou e-mail. Observable (não Promise): as telas pedem as páginas até o fim e cancelam a pendente ao fechar.\n */\n getGroupMembers(clientId: string, groupId: string, query: AutoServiceMembersQuery = {}): Observable<AutoServiceMembersPage> {\n let params = new HttpParams();\n if (query.page) params = params.set('page', String(query.page));\n if (query.limit) params = params.set('limit', String(query.limit));\n if (query.search?.trim()) params = params.set('search', query.search.trim());\n return this.http.get<AutoServiceMembersPage>(this.url`/${clientId}/groups/${groupId}/members`, { headers: this.headers, params });\n }\n /** Sugestões para adicionar ao grupo: quem já está em outro grupo deste sistema e ainda não neste, com foto e os grupos. */\n getMemberSuggestions(clientId: string, groupId: string, limit = 8) {\n const params = new HttpParams().set('limit', String(limit));\n return firstValueFrom(this.http.get<{ users: AutoServiceMemberSuggestion[] }>(this.url`/${clientId}/groups/${groupId}/member-suggestions`, { headers: this.headers, params }));\n }\n addGroupMember(clientId: string, groupId: string, userId: string, role: string | null) { return firstValueFrom(this.http.post<any>(this.url`/${clientId}/groups/${groupId}/members`, { user_id: userId, role }, { headers: this.headers })); }\n updateGroupMemberRole(clientId: string, groupId: string, userId: string, role: string | null) { return firstValueFrom(this.http.put<any>(this.url`/${clientId}/groups/${groupId}/members/${userId}`, { role }, { headers: this.headers })); }\n removeGroupMember(clientId: string, groupId: string, userId: string) { return firstValueFrom(this.http.delete<any>(this.url`/${clientId}/groups/${groupId}/members/${userId}`, { headers: this.headers })); }\n\n // Users (só leitura -- popular a busca de \"adicionar membro\" na aba Grupos, escopada pelo realm do próprio client)\n searchUsers(clientId: string, opts: { search?: string; limit?: number } = {}) {\n let params = new HttpParams();\n if (opts.search) params = params.set('search', opts.search);\n if (opts.limit) params = params.set('limit', String(opts.limit));\n return firstValueFrom(this.http.get<{ users: any[] }>(this.url`/${clientId}/users`, { headers: this.headers, params }));\n }\n\n // Access\n getAccess(clientId: string) { return firstValueFrom(this.http.get<{ access: any[] }>(this.url`/${clientId}/access`, { headers: this.headers })); }\n createAccess(clientId: string, groupId: string) { return firstValueFrom(this.http.post<any>(this.url`/${clientId}/access`, { group_id: groupId }, { headers: this.headers })); }\n deleteAccess(clientId: string, accessId: string) { return firstValueFrom(this.http.delete<any>(this.url`/${clientId}/access/${accessId}`, { headers: this.headers })); }\n getGuards(clientId: string, accessId: string) { return firstValueFrom(this.http.get<{ guards: any[] }>(this.url`/${clientId}/access/${accessId}/guards`, { headers: this.headers })); }\n addGuard(clientId: string, accessId: string, routerId: string) { return firstValueFrom(this.http.post<any>(this.url`/${clientId}/access/${accessId}/guards`, { router_id: routerId }, { headers: this.headers })); }\n removeGuard(clientId: string, accessId: string, guardId: string) { return firstValueFrom(this.http.delete<any>(this.url`/${clientId}/access/${accessId}/guards/${guardId}`, { headers: this.headers })); }\n\n // Apps (aplicações client_credentials no Project deste client)\n getApps(clientId: string) { return firstValueFrom(this.http.get<{ apps: AutoServiceApp[] }>(this.url`/${clientId}/apps`, { headers: this.headers })); }\n createApp(clientId: string, body: { name: string; allowed_grants?: string[] }) { return firstValueFrom(this.http.post<{ id: string; name: string; secret: string }>(this.url`/${clientId}/apps`, body, { headers: this.headers })); }\n updateApp(clientId: string, appId: string, body: any) { return firstValueFrom(this.http.put<any>(this.url`/${clientId}/apps/${appId}`, body, { headers: this.headers })); }\n /** Gera um segredo novo para a aplicação (o anterior para de valer na hora). A resposta traz o segredo uma única vez. */\n rotateAppSecret(clientId: string, appId: string) { return firstValueFrom(this.http.post<{ id: string; secret: string }>(this.url`/${clientId}/apps/${appId}/secret`, {}, { headers: this.headers })); }\n deleteApp(clientId: string, appId: string) { return firstValueFrom(this.http.delete<any>(this.url`/${clientId}/apps/${appId}`, { headers: this.headers })); }\n getAppOperations(clientId: string, appId: string) { return firstValueFrom(this.http.get<{ operations: any[] }>(this.url`/${clientId}/apps/${appId}/operations`, { headers: this.headers })); }\n\n // Tokens de API da aplicação (x-api-token)\n getAppTokens(clientId: string, appId: string) { return firstValueFrom(this.http.get<{ tokens: AutoServiceAppToken[] }>(this.url`/${clientId}/apps/${appId}/tokens`, { headers: this.headers })); }\n /** Cria o token (e o consumer dele, com as permissões escolhidas). A resposta traz o valor uma única vez. */\n createAppToken(clientId: string, appId: string, body: AutoServiceAppTokenCreate) { return firstValueFrom(this.http.post<AutoServiceAppTokenCreated>(this.url`/${clientId}/apps/${appId}/tokens`, body, { headers: this.headers })); }\n /** Revoga: o token para de valer na hora e continua na lista como revogado. */\n revokeAppToken(clientId: string, appId: string, tokenId: string) { return firstValueFrom(this.http.delete<void>(this.url`/${clientId}/apps/${appId}/tokens/${tokenId}`, { headers: this.headers })); }\n\n // Consumers (grupo ↔ aplicação), sem o do grupo de administração: o servidor não o lista e o :consumerId dele é 404\n // (servidor antigo ainda devolve com `group_is_admin: true` e a aba Acessos descarta)\n getAppConsumers(clientId: string, appId: string) { return firstValueFrom(this.http.get<{ consumers: any[] }>(this.url`/${clientId}/apps/${appId}/consumers`, { headers: this.headers })); }\n createAppConsumer(clientId: string, appId: string, groupId: string) { return firstValueFrom(this.http.post<any>(this.url`/${clientId}/apps/${appId}/consumers`, { group_id: groupId }, { headers: this.headers })); }\n deleteAppConsumer(clientId: string, consumerId: string) { return firstValueFrom(this.http.delete<any>(this.url`/${clientId}/apps/consumers/${consumerId}`, { headers: this.headers })); }\n\n // Permissions (consumer ↔ operação)\n getAppPermissions(clientId: string, consumerId: string) { return firstValueFrom(this.http.get<{ permissions: any[] }>(this.url`/${clientId}/apps/consumers/${consumerId}/permissions`, { headers: this.headers })); }\n addAppPermission(clientId: string, consumerId: string, operationId: string) { return firstValueFrom(this.http.post<any>(this.url`/${clientId}/apps/consumers/${consumerId}/permissions`, { operation_id: operationId }, { headers: this.headers })); }\n removeAppPermission(clientId: string, consumerId: string, permissionId: string) { return firstValueFrom(this.http.delete<any>(this.url`/${clientId}/apps/consumers/${consumerId}/permissions/${permissionId}`, { headers: this.headers })); }\n // Auditoria: ver `SpineAuditService` (`@trismegisto/spine/audit`), o mesmo nos escopos admin e client.\n}\n","export * from './auto-service.tokens';\nexport * from './provide-auto-service';\nexport * from './auto-service.service';\nexport type { AutoServiceClient } from './client-picker/auto-service-client-picker.component';\n// A auditoria (tipos, serviço e a tela) mora em `@trismegisto/spine/audit` — NÃO reexporte daqui: um\n// `export` estático puxaria a tela para o arquivo deste ponto de entrada (ver abaixo e check-lazy).\n// As telas (Início, Grupos, Aplicações, Cliente) e as peças delas NÃO são exportadas daqui de propósito:\n// ficam só atrás dos `import()` de `AUTO_SERVICE_SCREENS`. Qualquer `export` estático de um componente\n// delas faz o rollup do ng-packagr juntar a tela no FESM do ponto de entrada e trocar o `import()` por\n// `Promise.resolve()` — e a tela (data-grid, combobox, drawer...) vai para o bundle inicial de todo app\n// (bug da 0.9.9). `scripts/check-lazy.mjs` (no `npm run build`) falha se isso voltar.\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}