@trismegisto/spine 2.0.0 → 2.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (49) hide show
  1. package/README.md +35 -5
  2. package/fesm2022/trismegisto-spine-audit.mjs +1 -1
  3. package/fesm2022/trismegisto-spine-audit.mjs.map +1 -1
  4. package/fesm2022/trismegisto-spine-auto-service-apps.technical-ClMKB9cK.mjs +48 -0
  5. package/fesm2022/trismegisto-spine-auto-service-apps.technical-ClMKB9cK.mjs.map +1 -0
  6. package/fesm2022/trismegisto-spine-auto-service-apps.usage-Cf5SG-oQ.mjs +55 -0
  7. package/fesm2022/trismegisto-spine-auto-service-apps.usage-Cf5SG-oQ.mjs.map +1 -0
  8. package/fesm2022/trismegisto-spine-auto-service-audit.technical-C901aIIQ.mjs +42 -0
  9. package/fesm2022/trismegisto-spine-auto-service-audit.technical-C901aIIQ.mjs.map +1 -0
  10. package/fesm2022/trismegisto-spine-auto-service-audit.usage-GIJ2RwuH.mjs +63 -0
  11. package/fesm2022/trismegisto-spine-auto-service-audit.usage-GIJ2RwuH.mjs.map +1 -0
  12. package/fesm2022/trismegisto-spine-auto-service-auto-service-client.component-C7SPavrX.mjs +784 -0
  13. package/fesm2022/trismegisto-spine-auto-service-auto-service-client.component-C7SPavrX.mjs.map +1 -0
  14. package/fesm2022/trismegisto-spine-auto-service-auto-service-delete-6Bk46MOf.mjs +39 -0
  15. package/fesm2022/trismegisto-spine-auto-service-auto-service-delete-6Bk46MOf.mjs.map +1 -0
  16. package/fesm2022/{trismegisto-spine-auto-service-auto-service.component-B5tyJ2zY.mjs → trismegisto-spine-auto-service-auto-service.component-BLN49F4a.mjs} +32 -7
  17. package/fesm2022/trismegisto-spine-auto-service-auto-service.component-BLN49F4a.mjs.map +1 -0
  18. package/fesm2022/trismegisto-spine-auto-service-client.technical-BHWhpyWv.mjs +46 -0
  19. package/fesm2022/trismegisto-spine-auto-service-client.technical-BHWhpyWv.mjs.map +1 -0
  20. package/fesm2022/trismegisto-spine-auto-service-client.usage-CM2WB2e2.mjs +80 -0
  21. package/fesm2022/trismegisto-spine-auto-service-client.usage-CM2WB2e2.mjs.map +1 -0
  22. package/fesm2022/trismegisto-spine-auto-service-groups.technical-jQlwaQPn.mjs +39 -0
  23. package/fesm2022/trismegisto-spine-auto-service-groups.technical-jQlwaQPn.mjs.map +1 -0
  24. package/fesm2022/trismegisto-spine-auto-service-groups.usage-Bh7ig2zZ.mjs +54 -0
  25. package/fesm2022/trismegisto-spine-auto-service-groups.usage-Bh7ig2zZ.mjs.map +1 -0
  26. package/fesm2022/trismegisto-spine-auto-service-home.technical-BrVhcgDO.mjs +35 -0
  27. package/fesm2022/trismegisto-spine-auto-service-home.technical-BrVhcgDO.mjs.map +1 -0
  28. package/fesm2022/trismegisto-spine-auto-service-home.usage-D6cb4B3Z.mjs +43 -0
  29. package/fesm2022/trismegisto-spine-auto-service-home.usage-D6cb4B3Z.mjs.map +1 -0
  30. package/fesm2022/trismegisto-spine-auto-service.mjs +82 -40
  31. package/fesm2022/trismegisto-spine-auto-service.mjs.map +1 -1
  32. package/fesm2022/trismegisto-spine-layout.mjs +988 -46
  33. package/fesm2022/trismegisto-spine-layout.mjs.map +1 -1
  34. package/fesm2022/trismegisto-spine-shell.mjs +3 -1
  35. package/fesm2022/trismegisto-spine-shell.mjs.map +1 -1
  36. package/fesm2022/trismegisto-spine.mjs +591 -16
  37. package/fesm2022/trismegisto-spine.mjs.map +1 -1
  38. package/package.json +7 -7
  39. package/types/trismegisto-spine-auto-service.d.ts +41 -2
  40. package/types/trismegisto-spine-auto-service.d.ts.map +1 -1
  41. package/types/trismegisto-spine-layout.d.ts +214 -13
  42. package/types/trismegisto-spine-layout.d.ts.map +1 -1
  43. package/types/trismegisto-spine-shell.d.ts +1 -0
  44. package/types/trismegisto-spine-shell.d.ts.map +1 -1
  45. package/types/trismegisto-spine.d.ts +214 -8
  46. package/types/trismegisto-spine.d.ts.map +1 -1
  47. package/fesm2022/trismegisto-spine-auto-service-auto-service-client.component-BYkUOwWL.mjs +0 -595
  48. package/fesm2022/trismegisto-spine-auto-service-auto-service-client.component-BYkUOwWL.mjs.map +0 -1
  49. package/fesm2022/trismegisto-spine-auto-service-auto-service.component-B5tyJ2zY.mjs.map +0 -1
@@ -0,0 +1,80 @@
1
+ // Manual de uso da tela Cliente do auto-serviço (`RouteDocument.load`), em Markdown. Módulo próprio,
2
+ // carregado só pelo `import()` de `AUTO_SERVICE_DOCUMENTS`: vira um chunk à parte no FESM e fica fora do
3
+ // bundle inicial. Não importe estaticamente nem reexporte no `public-api.ts`.
4
+ var client_usage = `# Cliente
5
+
6
+ Gerencie a navegação do seu client sem depender do painel central: as rotas (os itens do menu), os roteadores
7
+ (onde cada tela aparece e se ela é privada) e o acesso (quais grupos veem quais telas privadas).
8
+
9
+ ## Antes de começar
10
+
11
+ A escolha do client funciona como nas outras telas do auto-serviço: com um client só, ele já vem escolhido; com
12
+ mais de um, escolha em **Selecione o client que deseja administrar**. É preciso estar com o crachá
13
+ **Administrador** ativo. Depois de escolher, a tela mostra as abas **Rotas**, **Roteadores** e **Acesso**.
14
+
15
+ ## Como as peças se encaixam
16
+
17
+ - **Rota:** um item com nome, nome de exibição, ícone e um trecho do endereço. Sozinha, ela não vira tela.
18
+ - **Roteador:** coloca uma rota como **página** e diz em que ponto do menu ela fica (Header › Navegação › Menu ›
19
+ Item › Submenu, todos opcionais). O endereço final da tela é a soma dos trechos das rotas dessa cadeia.
20
+ - **Acesso:** libera o client para um grupo. Em cada acesso você escolhe quais roteadores **privados** aquele grupo
21
+ enxerga.
22
+
23
+ ## Selos e travas
24
+
25
+ - **Template:** o item veio do template da aplicação. Só a administração central do Argos edita ou exclui; aqui a
26
+ linha aparece sem o menu de ações. A ordem e o acesso desses itens continuam sendo seus.
27
+ - **Rota protegida** (**Excluível: Não**): não pode ser excluída. Ao editá-la, a caixa **Excluível** fica travada:
28
+ só a administração central libera a exclusão.
29
+
30
+ ## Aba Rotas
31
+
32
+ A tabela mostra **Nome**, **Exibição**, **Ícone**, **Path** e **Excluível**.
33
+
34
+ - **Nova rota** abre o formulário:
35
+ - **Nome interno** (obrigatório) e **Nome de exibição** (o texto que aparece no menu).
36
+ - **Ícone**: escolha no catálogo; dá para digitar para filtrar, e cada opção mostra o próprio ícone.
37
+ - **Caminho (path)**: um trecho só do endereço, com letras minúsculas e hífen (por exemplo, \`ordens-servico\`),
38
+ sem \`/\`, espaço, número ou acento, e sem hífen no início ou no fim. O \`/\` entre os níveis quem monta é o
39
+ roteador. Deixe vazio numa rota que só agrupa itens do menu.
40
+ - **Info** e **Excluível**.
41
+ - No menu de cada linha: **Editar** e **Excluir** (este só em rota excluível). **Excluir** pede confirmação
42
+ (**Excluir rota?**, com o nome dela) e só apaga depois de **Excluir** no diálogo.
43
+ - **Reordenar:** define a ordem dos itens no menu de navegação. A ordem é do seu client: vale também para itens do
44
+ template, e a sincronização do template não a desfaz.
45
+
46
+ ## Aba Roteadores
47
+
48
+ A tabela mostra **Página**, **Caminho montado** (o endereço final), **Descrição** e **Visibilidade** (**Privado** ou
49
+ **Público**).
50
+
51
+ - **Novo roteador** (habilitado quando já existe alguma rota) abre o formulário:
52
+ - **Página** (obrigatório): a rota que vira a tela.
53
+ - **Descrição**: o que a tela faz, em uma frase. Aparece abaixo do título, na barra da página.
54
+ - **Hierarquia (opcional)**: as rotas de **Header**, **Navegação**, **Menu**, **Item** e **Submenu** acima da página.
55
+ - **Privado** (já vem marcado): a tela só fica visível para os grupos que receberem acesso a ela na aba **Acesso**.
56
+ Desmarcado, o roteador é **Público** e não depende dessa liberação.
57
+ - No menu de cada linha: **Editar** e **Excluir**. **Excluir** pede confirmação (**Excluir roteador?**, com o caminho
58
+ montado) e só apaga depois de **Excluir** no diálogo; a página sai do menu.
59
+
60
+ ## Aba Acesso
61
+
62
+ A tabela mostra os grupos com acesso ao client: **Grupo** e **Crachá** (o tipo do grupo).
63
+
64
+ - **Novo acesso**: escolha o **Grupo** e clique em **Criar**.
65
+ - No menu de cada linha:
66
+ - **Gerenciar rotas** abre o painel **Rotas de nome do grupo**, com a árvore dos roteadores privados: as pastas
67
+ são os níveis do menu e cada página tem uma caixa de seleção. Só aparecem os roteadores privados sem restrição
68
+ de crachá ou cujo crachá permitido inclua o do grupo. Marque as telas que o grupo pode ver, desmarque as que não
69
+ pode e clique em **Confirmar alterações** (o botão só habilita quando algo mudou).
70
+ - **Remover** pede confirmação (**Remover acesso?**, com o nome do grupo) e só então tira o acesso do grupo ao
71
+ client.
72
+
73
+ Depois de cada exclusão aparece **Exclusão concluída.**; se o servidor recusar, a mensagem de erro diz o motivo e o
74
+ item continua na tabela.
75
+
76
+ > Quem participa de cada grupo se gerencia na tela **Grupos**.
77
+ `;
78
+
79
+ export { client_usage as default };
80
+ //# sourceMappingURL=trismegisto-spine-auto-service-client.usage-CM2WB2e2.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trismegisto-spine-auto-service-client.usage-CM2WB2e2.mjs","sources":["../../../projects/ui/auto-service/src/docs/client.usage.ts"],"sourcesContent":["// Manual de uso da tela Cliente 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 `# Cliente\n\nGerencie a navegação do seu client sem depender do painel central: as rotas (os itens do menu), os roteadores\n(onde cada tela aparece e se ela é privada) e o acesso (quais grupos veem quais telas privadas).\n\n## Antes de começar\n\nA escolha do client funciona como nas outras telas do auto-serviço: com um client só, ele já vem escolhido; com\nmais de um, escolha em **Selecione o client que deseja administrar**. É preciso estar com o crachá\n**Administrador** ativo. Depois de escolher, a tela mostra as abas **Rotas**, **Roteadores** e **Acesso**.\n\n## Como as peças se encaixam\n\n- **Rota:** um item com nome, nome de exibição, ícone e um trecho do endereço. Sozinha, ela não vira tela.\n- **Roteador:** coloca uma rota como **página** e diz em que ponto do menu ela fica (Header › Navegação › Menu ›\n Item › Submenu, todos opcionais). O endereço final da tela é a soma dos trechos das rotas dessa cadeia.\n- **Acesso:** libera o client para um grupo. Em cada acesso você escolhe quais roteadores **privados** aquele grupo\n enxerga.\n\n## Selos e travas\n\n- **Template:** o item veio do template da aplicação. Só a administração central do Argos edita ou exclui; aqui a\n linha aparece sem o menu de ações. A ordem e o acesso desses itens continuam sendo seus.\n- **Rota protegida** (**Excluível: Não**): não pode ser excluída. Ao editá-la, a caixa **Excluível** fica travada:\n só a administração central libera a exclusão.\n\n## Aba Rotas\n\nA tabela mostra **Nome**, **Exibição**, **Ícone**, **Path** e **Excluível**.\n\n- **Nova rota** abre o formulário:\n - **Nome interno** (obrigatório) e **Nome de exibição** (o texto que aparece no menu).\n - **Ícone**: escolha no catálogo; dá para digitar para filtrar, e cada opção mostra o próprio ícone.\n - **Caminho (path)**: um trecho só do endereço, com letras minúsculas e hífen (por exemplo, \\`ordens-servico\\`),\n sem \\`/\\`, espaço, número ou acento, e sem hífen no início ou no fim. O \\`/\\` entre os níveis quem monta é o\n roteador. Deixe vazio numa rota que só agrupa itens do menu.\n - **Info** e **Excluível**.\n- No menu de cada linha: **Editar** e **Excluir** (este só em rota excluível). **Excluir** pede confirmação\n (**Excluir rota?**, com o nome dela) e só apaga depois de **Excluir** no diálogo.\n- **Reordenar:** define a ordem dos itens no menu de navegação. A ordem é do seu client: vale também para itens do\n template, e a sincronização do template não a desfaz.\n\n## Aba Roteadores\n\nA tabela mostra **Página**, **Caminho montado** (o endereço final), **Descrição** e **Visibilidade** (**Privado** ou\n**Público**).\n\n- **Novo roteador** (habilitado quando já existe alguma rota) abre o formulário:\n - **Página** (obrigatório): a rota que vira a tela.\n - **Descrição**: o que a tela faz, em uma frase. Aparece abaixo do título, na barra da página.\n - **Hierarquia (opcional)**: as rotas de **Header**, **Navegação**, **Menu**, **Item** e **Submenu** acima da página.\n - **Privado** (já vem marcado): a tela só fica visível para os grupos que receberem acesso a ela na aba **Acesso**.\n Desmarcado, o roteador é **Público** e não depende dessa liberação.\n- No menu de cada linha: **Editar** e **Excluir**. **Excluir** pede confirmação (**Excluir roteador?**, com o caminho\n montado) e só apaga depois de **Excluir** no diálogo; a página sai do menu.\n\n## Aba Acesso\n\nA tabela mostra os grupos com acesso ao client: **Grupo** e **Crachá** (o tipo do grupo).\n\n- **Novo acesso**: escolha o **Grupo** e clique em **Criar**.\n- No menu de cada linha:\n - **Gerenciar rotas** abre o painel **Rotas de nome do grupo**, com a árvore dos roteadores privados: as pastas\n são os níveis do menu e cada página tem uma caixa de seleção. Só aparecem os roteadores privados sem restrição\n de crachá ou cujo crachá permitido inclua o do grupo. Marque as telas que o grupo pode ver, desmarque as que não\n pode e clique em **Confirmar alterações** (o botão só habilita quando algo mudou).\n - **Remover** pede confirmação (**Remover acesso?**, com o nome do grupo) e só então tira o acesso do grupo ao\n client.\n\nDepois de cada exclusão aparece **Exclusão concluída.**; se o servidor recusar, a mensagem de erro diz o motivo e o\nitem continua na tabela.\n\n> Quem participa de cada grupo se gerencia na tela **Grupos**.\n`;\n"],"names":[],"mappings":"AAAA;AACA;AACA;AACA,mBAAe,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAyEd;;"}
@@ -0,0 +1,39 @@
1
+ // Especificação técnica da tela Grupos do auto-serviço (`RouteDocument.loadTechnical`), em Markdown. Módulo próprio,
2
+ // carregado só pelo `import()` de `AUTO_SERVICE_DOCUMENTS`: vira um chunk à parte no FESM e fica fora do
3
+ // bundle inicial. Não importe estaticamente nem reexporte no `public-api.ts`.
4
+ var groups_technical = `# Grupos — especificação técnica
5
+
6
+ Tela \`AutoServiceGroupsComponent\`, ligada ao router de template \`AUTO_SERVICE_GROUPS_TEMPLATE_ROUTER_ID\`
7
+ (\`ad100001-…\`). Fala com o argos-admin-server em \`{adminApi}/auto-service\` (\`AutoServiceService\`), com o token no
8
+ cabeçalho \`x-access-token\`.
9
+
10
+ ## Endpoints
11
+
12
+ | Ação | Endpoint |
13
+ | --- | --- |
14
+ | Clients que a pessoa administra (seletor) | \`GET /auto-service\` |
15
+ | Grupos do client | \`GET /auto-service/:clientId/groups\` |
16
+ | Membros do grupo | \`GET /auto-service/:clientId/groups/:groupId/members\` |
17
+ | Sugestões e busca de usuários | \`GET /auto-service/:clientId/users?search=&limit=\` |
18
+ | Adicionar membro | \`POST /auto-service/:clientId/groups/:groupId/members\` (\`{ user_id, role }\`) |
19
+ | Trocar a função | \`PUT /auto-service/:clientId/groups/:groupId/members/:userId\` (\`{ role }\`) |
20
+ | Remover membro | \`DELETE /auto-service/:clientId/groups/:groupId/members/:userId\` |
21
+
22
+ ## Regras
23
+
24
+ - **Autorização** (\`clientAdminGuard\` no servidor): a pessoa precisa estar num grupo que administra o projeto do
25
+ client (\`auth.group_projects\`) **e** com o crachá Administrador ativo no token. Sem isso, 401/403; grupo que não
26
+ é do projeto do client responde 404 (\`assertGroupBelongsToClient\`).
27
+ - Com um client só, o seletor escolhe sozinho e não aparece; sem nenhum, mostra \`autoService.noClients\`.
28
+ - Grupos ordenados por \`type.level\`, do maior para o menor. **Consultar** só escolhe o grupo já carregado (não há
29
+ chamada extra).
30
+ - Sugestões: \`limit=30\` sem \`search\`, mostradas de 3 em 3. Busca: a partir de 2 caracteres, depois de 300 ms sem
31
+ digitar, \`limit=10\`. Membros atuais são retirados dos dois.
32
+ - Funções oferecidas pela tela: Administrador, Editor, Leitor; vazio grava \`role: null\`.
33
+ - **Salvar alterações** grava só a diferença, em sequência: adições, depois remoções, depois trocas de função (dos
34
+ membros que ficaram). Ao terminar, emite \`saved\` e a tabela recarrega.
35
+ - A tela não cria, renomeia nem exclui grupos (não há endpoint para isso em \`/auto-service\`).
36
+ `;
37
+
38
+ export { groups_technical as default };
39
+ //# sourceMappingURL=trismegisto-spine-auto-service-groups.technical-jQlwaQPn.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trismegisto-spine-auto-service-groups.technical-jQlwaQPn.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\\`.\n\n## Endpoints\n\n| Ação | Endpoint |\n| --- | --- |\n| Clients que a pessoa administra (seletor) | \\`GET /auto-service\\` |\n| Grupos do client | \\`GET /auto-service/:clientId/groups\\` |\n| Membros do grupo | \\`GET /auto-service/:clientId/groups/:groupId/members\\` |\n| Sugestões e busca de usuários | \\`GET /auto-service/:clientId/users?search=&limit=\\` |\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): a pessoa precisa estar num grupo que administra o projeto do\n client (\\`auth.group_projects\\`) **e** com o crachá Administrador ativo no token. Sem isso, 401/403; grupo que não\n é do projeto do client responde 404 (\\`assertGroupBelongsToClient\\`).\n- Com um client só, o seletor escolhe sozinho e não aparece; sem nenhum, mostra \\`autoService.noClients\\`.\n- Grupos ordenados por \\`type.level\\`, do maior para o menor. **Consultar** só escolhe o grupo já carregado (não há\n chamada extra).\n- Sugestões: \\`limit=30\\` sem \\`search\\`, mostradas de 3 em 3. Busca: a partir de 2 caracteres, depois de 300 ms sem\n digitar, \\`limit=10\\`. Membros atuais são retirados dos dois.\n- Funções oferecidas pela tela: Administrador, Editor, Leitor; vazio grava \\`role: null\\`.\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 recarrega.\n- A tela não cria, renomeia nem exclui grupos (não há endpoint para isso em \\`/auto-service\\`).\n`;\n"],"names":[],"mappings":"AAAA;AACA;AACA;AACA,uBAAe,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAgCd;;"}
@@ -0,0 +1,54 @@
1
+ // Manual de uso da tela Grupos do auto-serviço (`RouteDocument.load`), em Markdown. Módulo próprio,
2
+ // carregado só pelo `import()` de `AUTO_SERVICE_DOCUMENTS`: vira um chunk à parte no FESM e fica fora do
3
+ // bundle inicial. Não importe estaticamente nem reexporte no `public-api.ts`.
4
+ var groups_usage = `# Grupos
5
+
6
+ Gerencie quem faz parte dos grupos do seu client, sem depender do painel central: consulte um grupo, veja os
7
+ membros, adicione e remova pessoas e defina a função de cada uma.
8
+
9
+ ## Antes de começar
10
+
11
+ No topo da tela fica a escolha do client:
12
+
13
+ - Se você administra **um client só**, ele já vem escolhido e a escolha nem aparece.
14
+ - Se administra **mais de um**, escolha em **Selecione o client que deseja administrar**.
15
+ - Se aparecer o aviso de que você ainda não administra nenhum client, faltam uma destas duas coisas: ter acesso
16
+ concedido a um client e estar com o crachá **Administrador** ativo. Troque de crachá no menu do seu perfil, se
17
+ disponível, ou peça acesso a um administrador central.
18
+
19
+ ## Como usar
20
+
21
+ 1. Em **Selecione um grupo**, escolha o grupo e clique em **Consultar**. A lista mostra o nome e, entre
22
+ parênteses, o tipo do grupo, do tipo de nível mais alto para o mais baixo.
23
+ 2. O cartão do grupo mostra o nome, um selo com o tipo (a cor acompanha o nível) e a descrição.
24
+ 3. A tabela **Membros do grupo** lista cada pessoa com nome, situação (**Ativo** ou **Inativo**), login e e-mail,
25
+ e a data em que entrou no grupo (**Membro desde**).
26
+ 4. Para mudar a composição do grupo, clique em **Gerenciar membros**.
27
+
28
+ ## Gerenciar membros
29
+
30
+ O modal **Membros — nome do grupo** junta tudo o que muda no grupo e só grava quando você confirma.
31
+
32
+ - **Adicionar:** em **Adicionar usuário**, digite pelo menos 2 letras do nome, do login ou do e-mail e escolha a
33
+ pessoa na lista (quem já é membro não aparece). Também dá para clicar numa das **Sugestões**; **Ver mais
34
+ sugestões** mostra mais três. Se quiser, escolha a **Função** (Administrador, Editor ou Leitor) e clique em
35
+ **Adicionar**. A pessoa entra na lista com o selo **Novo**.
36
+ - **Mudar a função:** use a coluna **Função** de cada membro. O traço (—) deixa o membro sem função.
37
+ - **Remover:** marque os membros na lista. Eles vão para o painel **Remoção**, ao lado, e a função deles fica
38
+ travada. **Desfazer remoção** (o ícone ao lado do nome) devolve o membro. Marcar alguém com o selo **Novo**
39
+ apenas o tira da lista, porque ele ainda não foi gravado.
40
+ - **Salvar alterações** grava tudo de uma vez: as pessoas novas, as remoções e as funções trocadas. **Cancelar**
41
+ (ou fechar o modal) descarta o que não foi salvo.
42
+
43
+ Depois de salvar, a tabela **Membros do grupo** é recarregada.
44
+
45
+ ## O que esta tela não faz
46
+
47
+ - Não cria, renomeia nem exclui grupos, e não muda o tipo de um grupo: isso fica com a administração central do
48
+ Argos.
49
+ - Não define o que o grupo pode acessar. As telas que cada grupo vê ficam em **Cliente › Acesso**; as operações que
50
+ cada grupo pode chamar numa aplicação ficam em **Aplicações › Acessos**.
51
+ `;
52
+
53
+ export { groups_usage as default };
54
+ //# sourceMappingURL=trismegisto-spine-auto-service-groups.usage-Bh7ig2zZ.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trismegisto-spine-auto-service-groups.usage-Bh7ig2zZ.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\nGerencie quem faz parte dos grupos do seu client, sem depender do painel central: consulte um grupo, veja os\nmembros, adicione e remova pessoas e defina a função de cada uma.\n\n## Antes de começar\n\nNo topo da tela fica a escolha do client:\n\n- Se você administra **um client só**, ele já vem escolhido e a escolha nem aparece.\n- Se administra **mais de um**, escolha em **Selecione o client que deseja administrar**.\n- Se aparecer o aviso de que você ainda não administra nenhum client, faltam uma destas duas coisas: ter acesso\n concedido a um client e estar com o crachá **Administrador** ativo. Troque de crachá no menu do seu perfil, se\n disponível, ou peça acesso a um administrador central.\n\n## Como usar\n\n1. Em **Selecione um grupo**, escolha o grupo e clique em **Consultar**. A lista mostra o nome e, entre\n parênteses, o tipo do grupo, do tipo de nível mais alto para o mais baixo.\n2. O cartão do grupo mostra o nome, um selo com o tipo (a cor acompanha o nível) e a descrição.\n3. A tabela **Membros do grupo** lista cada pessoa com nome, situação (**Ativo** ou **Inativo**), login e e-mail,\n e a data em que entrou no grupo (**Membro desde**).\n4. Para mudar a composição do grupo, clique em **Gerenciar membros**.\n\n## Gerenciar membros\n\nO modal **Membros — nome do grupo** junta tudo o que muda no grupo 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). Também dá para clicar numa das **Sugestões**; **Ver mais\n sugestões** mostra mais três. Se quiser, escolha a **Função** (Administrador, Editor ou Leitor) e clique em\n **Adicionar**. A pessoa entra na lista com o selo **Novo**.\n- **Mudar a função:** use a coluna **Função** de cada membro. O traço (—) deixa o membro sem função.\n- **Remover:** marque os membros na lista. Eles vão para o painel **Remoção**, ao lado, 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.\n\nDepois de salvar, a tabela **Membros do grupo** é recarregada.\n\n## O que esta tela não faz\n\n- Não cria, renomeia nem exclui grupos, e não muda o tipo de um grupo: isso fica com a administração central do\n 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+Cd;;"}
@@ -0,0 +1,35 @@
1
+ // Especificação técnica da tela Início do auto-serviço (`RouteDocument.loadTechnical`), em Markdown. Módulo próprio,
2
+ // carregado só pelo `import()` de `AUTO_SERVICE_DOCUMENTS`: vira um chunk à parte no FESM e fica fora do
3
+ // bundle inicial. Não importe estaticamente nem reexporte no `public-api.ts`.
4
+ var home_technical = `# Início — especificação técnica
5
+
6
+ Tela \`HomeComponent\` do \`@trismegisto/spine/auto-service\`, ligada ao router de template
7
+ \`AUTO_SERVICE_HOME_TEMPLATE_ROUTER_ID\` (\`6a9a13db-…\`, página de topo e pública do template \`auto-service\`).
8
+
9
+ ## Origem dos dados
10
+
11
+ | Dado | Fonte |
12
+ | --- | --- |
13
+ | Atalhos, áreas e "Onde fica" | Árvore da view do Orfeu (\`ViewService.currentView$\`, via \`spineRoutesOf\`); nenhuma chamada HTTP própria |
14
+ | Abertos recentemente e favoritos | \`SpineQuickAccessService\` (\`localStorage\` por usuário: \`SpineUserStorage\`, chave \`<clientId>_nav_*_<sub>\`; recentes apagados no logout) |
15
+ | Configurações | \`SpineSettingsService.open()\` |
16
+ | Documentação do sistema | \`SpineDocsService.openIndex()\` |
17
+
18
+ ## Regras
19
+
20
+ - **Módulos × áreas:** nó de topo que é o próprio Início (template \`6a9a13db-…\` ou página com \`route_path\` \`home\`)
21
+ vai para **Navegar**; os demais são módulos.
22
+ - **Atalhos** (\`entryShortcuts\`): parte dos módulos e desce um nível enquanto houver menos de 3 candidatos e algum
23
+ deles tiver filhos navegáveis; com 2 candidatos, não desce se o próximo nível passar de 12 atalhos.
24
+ - **Acesso privilegiado:** atalho cujo nó (ou algum descendente) vem dos templates de Grupos, Aplicações, Cliente
25
+ ou Auditoria (\`ad100001…\` a \`ad100004…\`).
26
+ - **Recentes:** os 4 primeiros do \`SpineQuickAccessService\`. Recentes e favoritos somem quando todo atalho já é uma
27
+ tela final (nenhum agrupa telas).
28
+ - **Redirecionamento:** com exatamente 1 destino de trabalho, navega para ele com \`replaceUrl\`, uma vez por
29
+ carregamento do app (\`HomeAutoRedirect\`, \`providedIn: 'root'\`).
30
+ - **Sem acesso:** árvore com nós, mas nenhum módulo → \`hm-state-page\` \`no-rights\`.
31
+ - Textos em \`SpineMessages.home\` (pt-BR/en/es).
32
+ `;
33
+
34
+ export { home_technical as default };
35
+ //# sourceMappingURL=trismegisto-spine-auto-service-home.technical-BrVhcgDO.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trismegisto-spine-auto-service-home.technical-BrVhcgDO.mjs","sources":["../../../projects/ui/auto-service/src/docs/home.technical.ts"],"sourcesContent":["// Especificação técnica da tela Início 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 `# Início — especificação técnica\n\nTela \\`HomeComponent\\` do \\`@trismegisto/spine/auto-service\\`, ligada ao router de template\n\\`AUTO_SERVICE_HOME_TEMPLATE_ROUTER_ID\\` (\\`6a9a13db-…\\`, página de topo e pública do template \\`auto-service\\`).\n\n## Origem dos dados\n\n| Dado | Fonte |\n| --- | --- |\n| Atalhos, áreas e \"Onde fica\" | Árvore da view do Orfeu (\\`ViewService.currentView$\\`, via \\`spineRoutesOf\\`); nenhuma chamada HTTP própria |\n| Abertos recentemente e favoritos | \\`SpineQuickAccessService\\` (\\`localStorage\\` por usuário: \\`SpineUserStorage\\`, chave \\`<clientId>_nav_*_<sub>\\`; recentes apagados no logout) |\n| Configurações | \\`SpineSettingsService.open()\\` |\n| Documentação do sistema | \\`SpineDocsService.openIndex()\\` |\n\n## Regras\n\n- **Módulos × áreas:** nó de topo que é o próprio Início (template \\`6a9a13db-…\\` ou página com \\`route_path\\` \\`home\\`)\n vai para **Navegar**; os demais são módulos.\n- **Atalhos** (\\`entryShortcuts\\`): parte dos módulos e desce um nível enquanto houver menos de 3 candidatos e algum\n deles tiver filhos navegáveis; com 2 candidatos, não desce se o próximo nível passar de 12 atalhos.\n- **Acesso privilegiado:** atalho cujo nó (ou algum descendente) vem dos templates de Grupos, Aplicações, Cliente\n ou Auditoria (\\`ad100001…\\` a \\`ad100004…\\`).\n- **Recentes:** os 4 primeiros do \\`SpineQuickAccessService\\`. Recentes e favoritos somem quando todo atalho já é uma\n tela final (nenhum agrupa telas).\n- **Redirecionamento:** com exatamente 1 destino de trabalho, navega para ele com \\`replaceUrl\\`, uma vez por\n carregamento do app (\\`HomeAutoRedirect\\`, \\`providedIn: 'root'\\`).\n- **Sem acesso:** árvore com nós, mas nenhum módulo → \\`hm-state-page\\` \\`no-rights\\`.\n- Textos em \\`SpineMessages.home\\` (pt-BR/en/es).\n`;\n"],"names":[],"mappings":"AAAA;AACA;AACA;AACA,qBAAe,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA4Bd;;"}
@@ -0,0 +1,43 @@
1
+ // Manual de uso da tela Início do auto-serviço (`RouteDocument.load`), em Markdown. Módulo próprio,
2
+ // carregado só pelo `import()` de `AUTO_SERVICE_DOCUMENTS`: vira um chunk à parte no FESM e fica fora do
3
+ // bundle inicial. Não importe estaticamente nem reexporte no `public-api.ts`.
4
+ var home_usage = `# Início
5
+
6
+ Ponto de partida do sistema: atalhos para as telas que você pode abrir, as que você abriu por último, os seus
7
+ favoritos e o caminho para as configurações e para a documentação.
8
+
9
+ ## Como usar
10
+
11
+ 1. Os blocos grandes levam às telas. O título do bloco é **Módulos** quando os atalhos são os módulos do menu e
12
+ **Suas telas** quando o Início já desceu para as telas de dentro deles (isso acontece quando há só um ou dois
13
+ módulos: em vez de um bloco que só abre outro menu, você vê direto as telas). Abaixo do nome, o atalho mostra
14
+ quantas telas reúne (por exemplo, "3 telas") ou o caminho no menu onde a tela fica.
15
+ 2. **Acesso privilegiado** reúne, à parte, os atalhos das telas de administração do auto-serviço (**Grupos**,
16
+ **Aplicações**, **Cliente** e **Auditoria**), para não se misturarem às telas de trabalho do dia a dia.
17
+ 3. **Abertos recentemente** lista as últimas telas abertas (até 4), da mais recente para a mais antiga, com a
18
+ coluna **Onde fica** (o caminho no menu). Clique no nome para abrir; o coração da coluna **Favoritar** adiciona ou
19
+ remove a tela dos favoritos.
20
+ 4. **Favoritos** mostra as telas favoritadas como botões. Passe o mouse sobre um deles para ver onde a tela fica.
21
+ 5. **Navegar** traz as áreas de topo do sistema (como o próprio Início) e **Configurações**, que abre o painel de
22
+ configurações (tema, densidade, atalhos e o resto das preferências).
23
+ 6. **Ferramentas › Documentação do sistema** abre o índice da documentação: o manual de cada tela que você pode
24
+ abrir e que tem documentação.
25
+
26
+ Recentes e favoritos ficam guardados neste navegador, separados por pessoa: quem entrar depois no mesmo computador
27
+ não vê os seus. Ao sair do sistema, os abertos recentemente são apagados; os favoritos ficam para a próxima vez. Quando todos os atalhos já abrem uma tela final, as seções
28
+ **Abertos recentemente** e **Favoritos** não aparecem: elas não poupariam nenhum clique.
29
+
30
+ ## Situações especiais
31
+
32
+ - **Uma tela só:** se você tem acesso a uma única tela de trabalho, o Início abre essa tela direto. Isso acontece uma
33
+ vez por carregamento do sistema; se você voltar ao Início depois, ele aparece normalmente.
34
+ - **Sem acesso:** se a sua conta ainda não tem nenhuma tela liberada, aparece o aviso "Você ainda não tem acesso a
35
+ nenhuma tela". O acesso é liberado pelo gestor da sua área; se ele já aprovou, saia e entre de novo, ou abra um
36
+ chamado para a equipe responsável.
37
+
38
+ > O que aparece no Início vem da sua árvore de navegação (as telas que os seus grupos e o seu crachá ativo
39
+ > liberam). Trocar de crachá no menu do perfil pode mudar os atalhos.
40
+ `;
41
+
42
+ export { home_usage as default };
43
+ //# sourceMappingURL=trismegisto-spine-auto-service-home.usage-D6cb4B3Z.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trismegisto-spine-auto-service-home.usage-D6cb4B3Z.mjs","sources":["../../../projects/ui/auto-service/src/docs/home.usage.ts"],"sourcesContent":["// Manual de uso da tela Início 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 `# Início\n\nPonto de partida do sistema: atalhos para as telas que você pode abrir, as que você abriu por último, os seus\nfavoritos e o caminho para as configurações e para a documentação.\n\n## Como usar\n\n1. Os blocos grandes levam às telas. O título do bloco é **Módulos** quando os atalhos são os módulos do menu e\n **Suas telas** quando o Início já desceu para as telas de dentro deles (isso acontece quando há só um ou dois\n módulos: em vez de um bloco que só abre outro menu, você vê direto as telas). Abaixo do nome, o atalho mostra\n quantas telas reúne (por exemplo, \"3 telas\") ou o caminho no menu onde a tela fica.\n2. **Acesso privilegiado** reúne, à parte, os atalhos das telas de administração do auto-serviço (**Grupos**,\n **Aplicações**, **Cliente** e **Auditoria**), para não se misturarem às telas de trabalho do dia a dia.\n3. **Abertos recentemente** lista as últimas telas abertas (até 4), da mais recente para a mais antiga, com a\n coluna **Onde fica** (o caminho no menu). Clique no nome para abrir; o coração da coluna **Favoritar** adiciona ou\n remove a tela dos favoritos.\n4. **Favoritos** mostra as telas favoritadas como botões. Passe o mouse sobre um deles para ver onde a tela fica.\n5. **Navegar** traz as áreas de topo do sistema (como o próprio Início) e **Configurações**, que abre o painel de\n configurações (tema, densidade, atalhos e o resto das preferências).\n6. **Ferramentas › Documentação do sistema** abre o índice da documentação: o manual de cada tela que você pode\n abrir e que tem documentação.\n\nRecentes e favoritos ficam guardados neste navegador, separados por pessoa: quem entrar depois no mesmo computador\nnão vê os seus. Ao sair do sistema, os abertos recentemente são apagados; os favoritos ficam para a próxima vez. Quando todos os atalhos já abrem uma tela final, as seções\n**Abertos recentemente** e **Favoritos** não aparecem: elas não poupariam nenhum clique.\n\n## Situações especiais\n\n- **Uma tela só:** se você tem acesso a uma única tela de trabalho, o Início abre essa tela direto. Isso acontece uma\n vez por carregamento do sistema; se você voltar ao Início depois, ele aparece normalmente.\n- **Sem acesso:** se a sua conta ainda não tem nenhuma tela liberada, aparece o aviso \"Você ainda não tem acesso a\n nenhuma tela\". O acesso é liberado pelo gestor da sua área; se ele já aprovou, saia e entre de novo, ou abra um\n chamado para a equipe responsável.\n\n> O que aparece no Início vem da sua árvore de navegação (as telas que os seus grupos e o seu crachá ativo\n> liberam). Trocar de crachá no menu do perfil pode mudar os atalhos.\n`;\n"],"names":[],"mappings":"AAAA;AACA;AACA;AACA,iBAAe,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAoCd;;"}
@@ -5,6 +5,7 @@ import { SPINE_ADMIN_API } from '@trismegisto/spine';
5
5
  import * as i1 from '@angular/common/http';
6
6
  import { HttpHeaders, HttpParams } from '@angular/common/http';
7
7
  import { firstValueFrom } from 'rxjs';
8
+ import { urlPath } from '@trismegisto/primitives';
8
9
  import * as i2 from '@orfeu/angular/core';
9
10
 
10
11
  const AUTO_SERVICE_CONFIG = new InjectionToken('AUTO_SERVICE_CONFIG');
@@ -37,10 +38,40 @@ const AUTO_SERVICE_HOME_TEMPLATE_ROUTER_ID = '6a9a13db-f31b-494e-b51c-79af0ac28b
37
38
  const AUTO_SERVICE_SCREENS = {
38
39
  home: () => import('./trismegisto-spine-auto-service-home.component-vl3BPFnk.mjs').then(m => m.HomeComponent),
39
40
  groups: () => import('./trismegisto-spine-auto-service-auto-service-groups.component-CqIVe2LU.mjs').then(m => m.AutoServiceGroupsComponent),
40
- apps: () => import('./trismegisto-spine-auto-service-auto-service.component-B5tyJ2zY.mjs').then(m => m.AutoServiceComponent),
41
- client: () => import('./trismegisto-spine-auto-service-auto-service-client.component-BYkUOwWL.mjs').then(m => m.AutoServiceClientComponent),
41
+ apps: () => import('./trismegisto-spine-auto-service-auto-service.component-BLN49F4a.mjs').then(m => m.AutoServiceComponent),
42
+ client: () => import('./trismegisto-spine-auto-service-auto-service-client.component-C7SPavrX.mjs').then(m => m.AutoServiceClientComponent),
42
43
  audit: () => import('./trismegisto-spine-auto-service-auto-service-audit.component-CCiz-q8o.mjs').then(m => m.AutoServiceAuditComponent),
43
44
  };
45
+ /**
46
+ * Documentação das 5 telas (botão de documentação da barra da página e índice "Documentação do sistema"): o manual
47
+ * de uso (`load`) e a especificação técnica (`loadTechnical`, só com `SpineConfig.technicalDocs`). O Markdown fica em
48
+ * módulos `.ts` próprios em `./docs/` (o ng-packagr não carrega `.md` como texto), cada um atrás de um `import()`
49
+ * relativo: vira um chunk à parte no FESM e só é baixado quando alguém abre o documento. Sem `title`/`group`: o
50
+ * índice usa o nome da rota e o módulo da árvore do client. O `SpineDocsService` casa estas entradas pelo
51
+ * `source_template_router_id`, como o `ComponentDistributorService` faz com as telas.
52
+ */
53
+ const AUTO_SERVICE_DOCUMENTS = {
54
+ home: {
55
+ load: () => import('./trismegisto-spine-auto-service-home.usage-D6cb4B3Z.mjs').then(m => m.default),
56
+ loadTechnical: () => import('./trismegisto-spine-auto-service-home.technical-BrVhcgDO.mjs').then(m => m.default),
57
+ },
58
+ groups: {
59
+ load: () => import('./trismegisto-spine-auto-service-groups.usage-Bh7ig2zZ.mjs').then(m => m.default),
60
+ loadTechnical: () => import('./trismegisto-spine-auto-service-groups.technical-jQlwaQPn.mjs').then(m => m.default),
61
+ },
62
+ apps: {
63
+ load: () => import('./trismegisto-spine-auto-service-apps.usage-Cf5SG-oQ.mjs').then(m => m.default),
64
+ loadTechnical: () => import('./trismegisto-spine-auto-service-apps.technical-ClMKB9cK.mjs').then(m => m.default),
65
+ },
66
+ client: {
67
+ load: () => import('./trismegisto-spine-auto-service-client.usage-CM2WB2e2.mjs').then(m => m.default),
68
+ loadTechnical: () => import('./trismegisto-spine-auto-service-client.technical-BHWhpyWv.mjs').then(m => m.default),
69
+ },
70
+ audit: {
71
+ load: () => import('./trismegisto-spine-auto-service-audit.usage-GIJ2RwuH.mjs').then(m => m.default),
72
+ loadTechnical: () => import('./trismegisto-spine-auto-service-audit.technical-C901aIIQ.mjs').then(m => m.default),
73
+ },
74
+ };
44
75
  // Cada app consumidora chama isso uma vez no bootstrap (mesmo padrão do
45
76
  // provideAuth do @orfeu/angular) informando só a URL do argos-admin-server --
46
77
  // o resto vem pronto: rotas/serviço (@trismegisto/spine/auto-service) E a própria
@@ -52,11 +83,11 @@ const AUTO_SERVICE_SCREENS = {
52
83
  // já suporta N entradas, cada uma casando pelo seu próprio source_template_router_id.
53
84
  function provideAutoService(config) {
54
85
  const componentRoutes = [
55
- { source_template_router_id: AUTO_SERVICE_HOME_TEMPLATE_ROUTER_ID, load: AUTO_SERVICE_SCREENS.home },
56
- { source_template_router_id: AUTO_SERVICE_GROUPS_TEMPLATE_ROUTER_ID, load: AUTO_SERVICE_SCREENS.groups },
57
- { source_template_router_id: AUTO_SERVICE_APPS_TEMPLATE_ROUTER_ID, load: AUTO_SERVICE_SCREENS.apps },
58
- { source_template_router_id: AUTO_SERVICE_CLIENT_TEMPLATE_ROUTER_ID, load: AUTO_SERVICE_SCREENS.client },
59
- { source_template_router_id: AUTO_SERVICE_AUDIT_TEMPLATE_ROUTER_ID, load: AUTO_SERVICE_SCREENS.audit },
86
+ { source_template_router_id: AUTO_SERVICE_HOME_TEMPLATE_ROUTER_ID, load: AUTO_SERVICE_SCREENS.home, document: AUTO_SERVICE_DOCUMENTS.home },
87
+ { source_template_router_id: AUTO_SERVICE_GROUPS_TEMPLATE_ROUTER_ID, load: AUTO_SERVICE_SCREENS.groups, document: AUTO_SERVICE_DOCUMENTS.groups },
88
+ { source_template_router_id: AUTO_SERVICE_APPS_TEMPLATE_ROUTER_ID, load: AUTO_SERVICE_SCREENS.apps, document: AUTO_SERVICE_DOCUMENTS.apps },
89
+ { source_template_router_id: AUTO_SERVICE_CLIENT_TEMPLATE_ROUTER_ID, load: AUTO_SERVICE_SCREENS.client, document: AUTO_SERVICE_DOCUMENTS.client },
90
+ { source_template_router_id: AUTO_SERVICE_AUDIT_TEMPLATE_ROUTER_ID, load: AUTO_SERVICE_SCREENS.audit, document: AUTO_SERVICE_DOCUMENTS.audit },
60
91
  ];
61
92
  return makeEnvironmentProviders([
62
93
  { provide: AUTO_SERVICE_CONFIG, useValue: config },
@@ -70,6 +101,10 @@ class AutoServiceService {
70
101
  get baseUrl() {
71
102
  return `${this.config.adminApi}/auto-service`;
72
103
  }
104
+ /** `baseUrl` + caminho com cada id interpolado codificado (`urlPath`): um id com `/`, `?`, `#` ou `..` não muda o recurso. */
105
+ url(strings, ...ids) {
106
+ return this.baseUrl + urlPath(strings, ...ids);
107
+ }
73
108
  get headers() {
74
109
  const token = this.auth.getToken();
75
110
  return new HttpHeaders({ 'x-access-token': token ?? '' });
@@ -80,23 +115,30 @@ class AutoServiceService {
80
115
  this.config = config;
81
116
  }
82
117
  // Descoberta
83
- getMyClients() { return firstValueFrom(this.http.get(`${this.baseUrl}`, { headers: this.headers })); }
118
+ getMyClients() { return firstValueFrom(this.http.get(this.baseUrl, { headers: this.headers })); }
84
119
  // Routes
85
- getWebRoutes(clientId) { return firstValueFrom(this.http.get(`${this.baseUrl}/${clientId}/routes`, { headers: this.headers })); }
86
- createWebRoute(clientId, body) { return firstValueFrom(this.http.post(`${this.baseUrl}/${clientId}/routes`, body, { headers: this.headers })); }
87
- updateWebRoute(clientId, id, body) { return firstValueFrom(this.http.put(`${this.baseUrl}/${clientId}/routes/${id}`, body, { headers: this.headers })); }
88
- deleteWebRoute(clientId, id) { return firstValueFrom(this.http.delete(`${this.baseUrl}/${clientId}/routes/${id}`, { headers: this.headers })); }
120
+ getWebRoutes(clientId) { return firstValueFrom(this.http.get(this.url `/${clientId}/routes`, { headers: this.headers })); }
121
+ createWebRoute(clientId, body) { return firstValueFrom(this.http.post(this.url `/${clientId}/routes`, body, { headers: this.headers })); }
122
+ updateWebRoute(clientId, id, body) { return firstValueFrom(this.http.put(this.url `/${clientId}/routes/${id}`, body, { headers: this.headers })); }
123
+ deleteWebRoute(clientId, id) { return firstValueFrom(this.http.delete(this.url `/${clientId}/routes/${id}`, { headers: this.headers })); }
89
124
  // Routers
90
- getRouters(clientId) { return firstValueFrom(this.http.get(`${this.baseUrl}/${clientId}/routers`, { headers: this.headers })); }
91
- createRouter(clientId, body) { return firstValueFrom(this.http.post(`${this.baseUrl}/${clientId}/routers`, body, { headers: this.headers })); }
92
- updateRouter(clientId, id, body) { return firstValueFrom(this.http.put(`${this.baseUrl}/${clientId}/routers/${id}`, body, { headers: this.headers })); }
93
- deleteRouter(clientId, id) { return firstValueFrom(this.http.delete(`${this.baseUrl}/${clientId}/routers/${id}`, { headers: this.headers })); }
125
+ getRouters(clientId) { return firstValueFrom(this.http.get(this.url `/${clientId}/routers`, { headers: this.headers })); }
126
+ createRouter(clientId, body) { return firstValueFrom(this.http.post(this.url `/${clientId}/routers`, body, { headers: this.headers })); }
127
+ updateRouter(clientId, id, body) { return firstValueFrom(this.http.put(this.url `/${clientId}/routers/${id}`, body, { headers: this.headers })); }
128
+ deleteRouter(clientId, id) { return firstValueFrom(this.http.delete(this.url `/${clientId}/routers/${id}`, { headers: this.headers })); }
129
+ /** Árvore do menu (header → … → página) com os router_ids de cada nó, já na ordem gravada. */
130
+ getRouterTree(clientId) { return firstValueFrom(this.http.get(this.url `/${clientId}/routers/tree`, { headers: this.headers })); }
131
+ /**
132
+ * Grava a ordem de UM nível (irmãos): o índice do grupo é a ordem; cada grupo escreve `${type}_order`
133
+ * em todos os seus routers. Vale também para routers de template (ordem é do client).
134
+ */
135
+ reorderRouters(clientId, groups) { return firstValueFrom(this.http.patch(this.url `/${clientId}/routers/reorder`, { groups }, { headers: this.headers })); }
94
136
  // Groups
95
- getGroups(clientId) { return firstValueFrom(this.http.get(`${this.baseUrl}/${clientId}/groups`, { headers: this.headers })); }
96
- getGroupMembers(clientId, groupId) { return firstValueFrom(this.http.get(`${this.baseUrl}/${clientId}/groups/${groupId}/members`, { headers: this.headers })); }
97
- addGroupMember(clientId, groupId, userId, role) { return firstValueFrom(this.http.post(`${this.baseUrl}/${clientId}/groups/${groupId}/members`, { user_id: userId, role }, { headers: this.headers })); }
98
- updateGroupMemberRole(clientId, groupId, userId, role) { return firstValueFrom(this.http.put(`${this.baseUrl}/${clientId}/groups/${groupId}/members/${userId}`, { role }, { headers: this.headers })); }
99
- removeGroupMember(clientId, groupId, userId) { return firstValueFrom(this.http.delete(`${this.baseUrl}/${clientId}/groups/${groupId}/members/${userId}`, { headers: this.headers })); }
137
+ getGroups(clientId) { return firstValueFrom(this.http.get(this.url `/${clientId}/groups`, { headers: this.headers })); }
138
+ getGroupMembers(clientId, groupId) { return firstValueFrom(this.http.get(this.url `/${clientId}/groups/${groupId}/members`, { headers: this.headers })); }
139
+ addGroupMember(clientId, groupId, userId, role) { return firstValueFrom(this.http.post(this.url `/${clientId}/groups/${groupId}/members`, { user_id: userId, role }, { headers: this.headers })); }
140
+ updateGroupMemberRole(clientId, groupId, userId, role) { return firstValueFrom(this.http.put(this.url `/${clientId}/groups/${groupId}/members/${userId}`, { role }, { headers: this.headers })); }
141
+ removeGroupMember(clientId, groupId, userId) { return firstValueFrom(this.http.delete(this.url `/${clientId}/groups/${groupId}/members/${userId}`, { headers: this.headers })); }
100
142
  // Users (só leitura -- popular a busca de "adicionar membro" na aba Grupos, escopada pelo realm do próprio client)
101
143
  searchUsers(clientId, opts = {}) {
102
144
  let params = new HttpParams();
@@ -104,29 +146,29 @@ class AutoServiceService {
104
146
  params = params.set('search', opts.search);
105
147
  if (opts.limit)
106
148
  params = params.set('limit', String(opts.limit));
107
- return firstValueFrom(this.http.get(`${this.baseUrl}/${clientId}/users`, { headers: this.headers, params }));
149
+ return firstValueFrom(this.http.get(this.url `/${clientId}/users`, { headers: this.headers, params }));
108
150
  }
109
151
  // Access
110
- getAccess(clientId) { return firstValueFrom(this.http.get(`${this.baseUrl}/${clientId}/access`, { headers: this.headers })); }
111
- createAccess(clientId, groupId) { return firstValueFrom(this.http.post(`${this.baseUrl}/${clientId}/access`, { group_id: groupId }, { headers: this.headers })); }
112
- deleteAccess(clientId, accessId) { return firstValueFrom(this.http.delete(`${this.baseUrl}/${clientId}/access/${accessId}`, { headers: this.headers })); }
113
- getGuards(clientId, accessId) { return firstValueFrom(this.http.get(`${this.baseUrl}/${clientId}/access/${accessId}/guards`, { headers: this.headers })); }
114
- addGuard(clientId, accessId, routerId) { return firstValueFrom(this.http.post(`${this.baseUrl}/${clientId}/access/${accessId}/guards`, { router_id: routerId }, { headers: this.headers })); }
115
- removeGuard(clientId, accessId, guardId) { return firstValueFrom(this.http.delete(`${this.baseUrl}/${clientId}/access/${accessId}/guards/${guardId}`, { headers: this.headers })); }
152
+ getAccess(clientId) { return firstValueFrom(this.http.get(this.url `/${clientId}/access`, { headers: this.headers })); }
153
+ createAccess(clientId, groupId) { return firstValueFrom(this.http.post(this.url `/${clientId}/access`, { group_id: groupId }, { headers: this.headers })); }
154
+ deleteAccess(clientId, accessId) { return firstValueFrom(this.http.delete(this.url `/${clientId}/access/${accessId}`, { headers: this.headers })); }
155
+ getGuards(clientId, accessId) { return firstValueFrom(this.http.get(this.url `/${clientId}/access/${accessId}/guards`, { headers: this.headers })); }
156
+ addGuard(clientId, accessId, routerId) { return firstValueFrom(this.http.post(this.url `/${clientId}/access/${accessId}/guards`, { router_id: routerId }, { headers: this.headers })); }
157
+ removeGuard(clientId, accessId, guardId) { return firstValueFrom(this.http.delete(this.url `/${clientId}/access/${accessId}/guards/${guardId}`, { headers: this.headers })); }
116
158
  // Apps (aplicações client_credentials no Project deste client)
117
- getApps(clientId) { return firstValueFrom(this.http.get(`${this.baseUrl}/${clientId}/apps`, { headers: this.headers })); }
118
- createApp(clientId, body) { return firstValueFrom(this.http.post(`${this.baseUrl}/${clientId}/apps`, body, { headers: this.headers })); }
119
- updateApp(clientId, appId, body) { return firstValueFrom(this.http.put(`${this.baseUrl}/${clientId}/apps/${appId}`, body, { headers: this.headers })); }
120
- deleteApp(clientId, appId) { return firstValueFrom(this.http.delete(`${this.baseUrl}/${clientId}/apps/${appId}`, { headers: this.headers })); }
121
- getAppOperations(clientId, appId) { return firstValueFrom(this.http.get(`${this.baseUrl}/${clientId}/apps/${appId}/operations`, { headers: this.headers })); }
159
+ getApps(clientId) { return firstValueFrom(this.http.get(this.url `/${clientId}/apps`, { headers: this.headers })); }
160
+ createApp(clientId, body) { return firstValueFrom(this.http.post(this.url `/${clientId}/apps`, body, { headers: this.headers })); }
161
+ updateApp(clientId, appId, body) { return firstValueFrom(this.http.put(this.url `/${clientId}/apps/${appId}`, body, { headers: this.headers })); }
162
+ deleteApp(clientId, appId) { return firstValueFrom(this.http.delete(this.url `/${clientId}/apps/${appId}`, { headers: this.headers })); }
163
+ getAppOperations(clientId, appId) { return firstValueFrom(this.http.get(this.url `/${clientId}/apps/${appId}/operations`, { headers: this.headers })); }
122
164
  // Consumers (grupo ↔ aplicação)
123
- getAppConsumers(clientId, appId) { return firstValueFrom(this.http.get(`${this.baseUrl}/${clientId}/apps/${appId}/consumers`, { headers: this.headers })); }
124
- createAppConsumer(clientId, appId, groupId) { return firstValueFrom(this.http.post(`${this.baseUrl}/${clientId}/apps/${appId}/consumers`, { group_id: groupId }, { headers: this.headers })); }
125
- deleteAppConsumer(clientId, consumerId) { return firstValueFrom(this.http.delete(`${this.baseUrl}/${clientId}/apps/consumers/${consumerId}`, { headers: this.headers })); }
165
+ getAppConsumers(clientId, appId) { return firstValueFrom(this.http.get(this.url `/${clientId}/apps/${appId}/consumers`, { headers: this.headers })); }
166
+ createAppConsumer(clientId, appId, groupId) { return firstValueFrom(this.http.post(this.url `/${clientId}/apps/${appId}/consumers`, { group_id: groupId }, { headers: this.headers })); }
167
+ deleteAppConsumer(clientId, consumerId) { return firstValueFrom(this.http.delete(this.url `/${clientId}/apps/consumers/${consumerId}`, { headers: this.headers })); }
126
168
  // Permissions (consumer ↔ operação)
127
- getAppPermissions(clientId, consumerId) { return firstValueFrom(this.http.get(`${this.baseUrl}/${clientId}/apps/consumers/${consumerId}/permissions`, { headers: this.headers })); }
128
- addAppPermission(clientId, consumerId, operationId) { return firstValueFrom(this.http.post(`${this.baseUrl}/${clientId}/apps/consumers/${consumerId}/permissions`, { operation_id: operationId }, { headers: this.headers })); }
129
- removeAppPermission(clientId, consumerId, permissionId) { return firstValueFrom(this.http.delete(`${this.baseUrl}/${clientId}/apps/consumers/${consumerId}/permissions/${permissionId}`, { headers: this.headers })); }
169
+ getAppPermissions(clientId, consumerId) { return firstValueFrom(this.http.get(this.url `/${clientId}/apps/consumers/${consumerId}/permissions`, { headers: this.headers })); }
170
+ addAppPermission(clientId, consumerId, operationId) { return firstValueFrom(this.http.post(this.url `/${clientId}/apps/consumers/${consumerId}/permissions`, { operation_id: operationId }, { headers: this.headers })); }
171
+ removeAppPermission(clientId, consumerId, permissionId) { return firstValueFrom(this.http.delete(this.url `/${clientId}/apps/consumers/${consumerId}/permissions/${permissionId}`, { headers: this.headers })); }
130
172
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.24", ngImport: i0, type: AutoServiceService, deps: [{ token: i1.HttpClient }, { token: i2.AuthorizationService }, { token: AUTO_SERVICE_CONFIG }], target: i0.ɵɵFactoryTarget.Injectable }); }
131
173
  static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.24", ngImport: i0, type: AutoServiceService, providedIn: 'root' }); }
132
174
  }
@@ -150,5 +192,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.24", ngImpo
150
192
  * Generated bundle index. Do not edit.
151
193
  */
152
194
 
153
- export { AUTO_SERVICE_APPS_TEMPLATE_ROUTER_ID, AUTO_SERVICE_AUDIT_TEMPLATE_ROUTER_ID, AUTO_SERVICE_CLIENT_TEMPLATE_ROUTER_ID, AUTO_SERVICE_CONFIG, AUTO_SERVICE_GROUPS_TEMPLATE_ROUTER_ID, AUTO_SERVICE_HOME_TEMPLATE_ROUTER_ID, AUTO_SERVICE_SCREENS, AutoServiceService, provideAutoService };
195
+ export { AUTO_SERVICE_APPS_TEMPLATE_ROUTER_ID, AUTO_SERVICE_AUDIT_TEMPLATE_ROUTER_ID, AUTO_SERVICE_CLIENT_TEMPLATE_ROUTER_ID, AUTO_SERVICE_CONFIG, AUTO_SERVICE_DOCUMENTS, AUTO_SERVICE_GROUPS_TEMPLATE_ROUTER_ID, AUTO_SERVICE_HOME_TEMPLATE_ROUTER_ID, AUTO_SERVICE_SCREENS, AutoServiceService, provideAutoService };
154
196
  //# sourceMappingURL=trismegisto-spine-auto-service.mjs.map