@trismegisto/spine 2.0.1 → 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.
- package/README.md +35 -5
- package/fesm2022/trismegisto-spine-audit.mjs +1 -1
- package/fesm2022/trismegisto-spine-audit.mjs.map +1 -1
- package/fesm2022/trismegisto-spine-auto-service-apps.technical-ClMKB9cK.mjs +48 -0
- package/fesm2022/trismegisto-spine-auto-service-apps.technical-ClMKB9cK.mjs.map +1 -0
- package/fesm2022/trismegisto-spine-auto-service-apps.usage-Cf5SG-oQ.mjs +55 -0
- package/fesm2022/trismegisto-spine-auto-service-apps.usage-Cf5SG-oQ.mjs.map +1 -0
- package/fesm2022/trismegisto-spine-auto-service-audit.technical-C901aIIQ.mjs +42 -0
- package/fesm2022/trismegisto-spine-auto-service-audit.technical-C901aIIQ.mjs.map +1 -0
- package/fesm2022/trismegisto-spine-auto-service-audit.usage-GIJ2RwuH.mjs +63 -0
- package/fesm2022/trismegisto-spine-auto-service-audit.usage-GIJ2RwuH.mjs.map +1 -0
- package/fesm2022/trismegisto-spine-auto-service-auto-service-client.component-C7SPavrX.mjs +784 -0
- package/fesm2022/trismegisto-spine-auto-service-auto-service-client.component-C7SPavrX.mjs.map +1 -0
- package/fesm2022/trismegisto-spine-auto-service-auto-service-delete-6Bk46MOf.mjs +39 -0
- package/fesm2022/trismegisto-spine-auto-service-auto-service-delete-6Bk46MOf.mjs.map +1 -0
- package/fesm2022/{trismegisto-spine-auto-service-auto-service.component-B5tyJ2zY.mjs → trismegisto-spine-auto-service-auto-service.component-BLN49F4a.mjs} +32 -7
- package/fesm2022/trismegisto-spine-auto-service-auto-service.component-BLN49F4a.mjs.map +1 -0
- package/fesm2022/trismegisto-spine-auto-service-client.technical-BHWhpyWv.mjs +46 -0
- package/fesm2022/trismegisto-spine-auto-service-client.technical-BHWhpyWv.mjs.map +1 -0
- package/fesm2022/trismegisto-spine-auto-service-client.usage-CM2WB2e2.mjs +80 -0
- package/fesm2022/trismegisto-spine-auto-service-client.usage-CM2WB2e2.mjs.map +1 -0
- package/fesm2022/trismegisto-spine-auto-service-groups.technical-jQlwaQPn.mjs +39 -0
- package/fesm2022/trismegisto-spine-auto-service-groups.technical-jQlwaQPn.mjs.map +1 -0
- package/fesm2022/trismegisto-spine-auto-service-groups.usage-Bh7ig2zZ.mjs +54 -0
- package/fesm2022/trismegisto-spine-auto-service-groups.usage-Bh7ig2zZ.mjs.map +1 -0
- package/fesm2022/trismegisto-spine-auto-service-home.technical-BrVhcgDO.mjs +35 -0
- package/fesm2022/trismegisto-spine-auto-service-home.technical-BrVhcgDO.mjs.map +1 -0
- package/fesm2022/trismegisto-spine-auto-service-home.usage-D6cb4B3Z.mjs +43 -0
- package/fesm2022/trismegisto-spine-auto-service-home.usage-D6cb4B3Z.mjs.map +1 -0
- package/fesm2022/trismegisto-spine-auto-service.mjs +82 -40
- package/fesm2022/trismegisto-spine-auto-service.mjs.map +1 -1
- package/fesm2022/trismegisto-spine-layout.mjs +988 -46
- package/fesm2022/trismegisto-spine-layout.mjs.map +1 -1
- package/fesm2022/trismegisto-spine-shell.mjs +3 -1
- package/fesm2022/trismegisto-spine-shell.mjs.map +1 -1
- package/fesm2022/trismegisto-spine.mjs +591 -16
- package/fesm2022/trismegisto-spine.mjs.map +1 -1
- package/package.json +7 -7
- package/types/trismegisto-spine-auto-service.d.ts +41 -2
- package/types/trismegisto-spine-auto-service.d.ts.map +1 -1
- package/types/trismegisto-spine-layout.d.ts +214 -13
- package/types/trismegisto-spine-layout.d.ts.map +1 -1
- package/types/trismegisto-spine-shell.d.ts +1 -0
- package/types/trismegisto-spine-shell.d.ts.map +1 -1
- package/types/trismegisto-spine.d.ts +214 -8
- package/types/trismegisto-spine.d.ts.map +1 -1
- package/fesm2022/trismegisto-spine-auto-service-auto-service-client.component-BYkUOwWL.mjs +0 -595
- package/fesm2022/trismegisto-spine-auto-service-auto-service-client.component-BYkUOwWL.mjs.map +0 -1
- package/fesm2022/trismegisto-spine-auto-service-auto-service.component-B5tyJ2zY.mjs.map +0 -1
package/README.md
CHANGED
|
@@ -7,7 +7,7 @@ configurações (tema, família, densidade, fonte, atalhos), tour de boas-vindas
|
|
|
7
7
|
tela.
|
|
8
8
|
|
|
9
9
|
Na cadeia de camadas (`tokens ← icons ← primitives ← core ← angular ← maps · charts · spine`) é a ponta: monta
|
|
10
|
-
peças grandes sobre o `@trismegisto/angular` e é o que os apps
|
|
10
|
+
peças grandes sobre o `@trismegisto/angular` e é o que os apps usam como esqueleto. Ao contrário
|
|
11
11
|
dos outros pacotes, é acoplado à autenticação (`@orfeu/angular` ≥ 0.9.9, OIDC + PKCE contra o Argos): serve a
|
|
12
12
|
apps que se autenticam nesse servidor. O app e o spine precisam usar a **mesma** cópia do `@orfeu/angular` — com o
|
|
13
13
|
app ainda no SDK antigo (`@caronte-sdk/angular`) os serviços seriam outros e o shell quebraria
|
|
@@ -51,7 +51,12 @@ export const appConfig: ApplicationConfig = {
|
|
|
51
51
|
o tema no `<body>` e usa `clientId` como prefixo de **todas** as chaves salvas (tema, menu lateral, abas):
|
|
52
52
|
apps diferentes na mesma origem não misturam preferências. Opções: `clientId`, `appName` (nome ao lado do
|
|
53
53
|
logo no cabeçalho), `logo`, `showAppName` e `favicon` (ver "Logo e favicon" abaixo), `technicalDocs` (mostra a
|
|
54
|
-
especificação técnica das telas; padrão
|
|
54
|
+
especificação técnica das telas e o botão "Copiar token de acesso" do painel de configurações; padrão
|
|
55
|
+
`isDevMode()`).
|
|
56
|
+
- **Recentes, buscas recentes e favoritos** ficam no `localStorage` por usuário (`SpineUserStorage`: chave
|
|
57
|
+
`<clientId>_<lista>_<sub>`, com o `sub` do token). No logout (pelo spine ou vindo de outra aba, via `isAuth$`) os
|
|
58
|
+
históricos são apagados; os favoritos ficam. Logout próprio do app: chame `SpineUserStorage.clearHistory()` antes
|
|
59
|
+
de `AuthorizationService.logout()`.
|
|
55
60
|
- **`APP_ROUTES`** traz login, callback, saída e as rotas privadas sob o `spine-layout`
|
|
56
61
|
(`LayoutComponent`). O `/callback` usa o `handleCallback()` do `@orfeu/angular`: confere state/verifier, volta
|
|
57
62
|
para a URL pedida antes do login e, no `login_required` da reautorização silenciosa, segue sozinho para o login
|
|
@@ -112,6 +117,27 @@ provideUi({
|
|
|
112
117
|
- **Marca em componente:** `{ provide: SPINE_BRAND, useValue: MarcaComponent }` (`@trismegisto/spine/layout`) tem
|
|
113
118
|
prioridade sobre a imagem (ex.: SVG inline com `currentColor`). Ele fica dentro do link — sem link/botão dentro.
|
|
114
119
|
|
|
120
|
+
## Conta e segurança (painel de configurações)
|
|
121
|
+
|
|
122
|
+
A seção **Conta e segurança** do painel (`?settings=seguranca`) gerencia a conta da pessoa no Argos sem sair do app:
|
|
123
|
+
**Verificação em duas etapas** (adicionar o aplicativo autenticador com QR Code, adicionar o e-mail, trocar o aparelho,
|
|
124
|
+
remover), **Códigos de recuperação** (gerar um lote novo, mostrado uma vez, com copiar e baixar) e **Sessões e
|
|
125
|
+
dispositivos** (encerrar uma sessão ou todas as outras; a deste login vem marcada). Antes de qualquer alteração a
|
|
126
|
+
pessoa confirma a identidade (senha, código do autenticador, código no e-mail cadastrado ou código de recuperação); o
|
|
127
|
+
Argos guarda essa prova por 5 minutos.
|
|
128
|
+
|
|
129
|
+
- **API**: a área da conta do Argos com Bearer, `{authority}/api/realms/{realmId}/account/*` (`security`, `reauth`,
|
|
130
|
+
`mfa/*`, `recovery-codes`, `sessions`), com o access token da sessão do `@orfeu/angular` no `Authorization` — o
|
|
131
|
+
mesmo `{authority}/api` que o Orfeu usa no OIDC (a `authority` já traz o `/argos`). Sem cookie: o Argos reconhece
|
|
132
|
+
a sessão pelo `sid` do token. Token vencido renova uma vez e repete.
|
|
133
|
+
- **Configuração**: nenhuma além do `provideAuth`. A origem do app precisa estar nas `redirect_uris` do client no
|
|
134
|
+
Argos (é o que o CORS do Argos libera — o login já exige isso). Sem `authority`/`realmId` (ou com `CHANGE_ME`) a
|
|
135
|
+
seção não aparece.
|
|
136
|
+
- **Versão do Argos**: precisa da área da conta por Bearer (`/realms/{realm}/account`). Num Argos anterior a seção
|
|
137
|
+
mostra o erro de carregamento.
|
|
138
|
+
- A mesma API sai de `SpineAccountSecurityService` / `argosAccountApi(authority, realm)` (`@trismegisto/spine/layout`),
|
|
139
|
+
para outra tela do app.
|
|
140
|
+
|
|
115
141
|
## Pontos de entrada
|
|
116
142
|
|
|
117
143
|
| Import | Conteúdo |
|
|
@@ -123,7 +149,7 @@ provideUi({
|
|
|
123
149
|
| `@trismegisto/spine/modal` | `ModalService` (`open(config)` devolve um `Observable` com o resultado), `ModalContent` |
|
|
124
150
|
| `@trismegisto/spine/side-panel` | `SidePanelService`, `SidePanelContent` |
|
|
125
151
|
| `@trismegisto/spine/notification` | `NotificationService` (`addNotification`) |
|
|
126
|
-
| `@trismegisto/spine/auto-service` | `provideAutoService({ adminApi })`: telas prontas de autosserviço (início, grupos, aplicações, cliente, auditoria), sempre carregadas sob demanda (`AUTO_SERVICE_SCREENS`); as classes das telas não são exportadas. `AutoServiceService` e o tipo `AutoServiceClient` são |
|
|
152
|
+
| `@trismegisto/spine/auto-service` | `provideAutoService({ adminApi })`: telas prontas de autosserviço (início, grupos, aplicações, cliente, auditoria), sempre carregadas sob demanda (`AUTO_SERVICE_SCREENS`); as classes das telas não são exportadas. Cada tela já vem com a documentação (manual de uso e especificação técnica, em `AUTO_SERVICE_DOCUMENTS`, também sob demanda) no botão de documentação da página. `AutoServiceService` e o tipo `AutoServiceClient` são exportados |
|
|
127
153
|
| `@trismegisto/spine/audit` | A tela de Auditoria (`SpineAuditComponent`, `spine-audit`), a mesma para o painel central (`scope="admin"`) e o auto-serviço (`scope="client"`), + `SpineAuditService` e os tipos/funções puras (`AuditEvent`, `AuditQuery`, `buildAuditQuery`, `auditApiBase`…). **Exporta o componente: importe só de código lazy** |
|
|
128
154
|
| `@trismegisto/spine/graphql` | `provideGraphql({ endpoints })`: um cliente Apollo nomeado por backend |
|
|
129
155
|
|
|
@@ -174,7 +200,10 @@ component: async () => (await import('./admin-audit-page.component')).AdminAudit
|
|
|
174
200
|
`provideAutoService`) pelo deles. Nunca forneça o token sem `multi: true`. Um `id` igual ao de uma tela
|
|
175
201
|
base do shell faz o `provideShell` lançar erro.
|
|
176
202
|
- **Documentação de tela** (`document.load`) é markdown cru importado como texto: configure o loader
|
|
177
|
-
`".md": "text"` no `angular.json` do app. O
|
|
203
|
+
`".md": "text"` no `angular.json` do app. O `spine-markdown` limpa o HTML com um perfil restrito do DOMPurify
|
|
204
|
+
(`SPINE_MARKDOWN_PURIFY_CONFIG`): sem `<style>`/`style`, formulários e `<iframe>`; link externo abre em outra aba
|
|
205
|
+
com `rel="noopener noreferrer"`. Formatação além do Markdown (cor, layout) não passa. O texto vai no chunk lazy da tela. (As telas do auto-serviço não
|
|
206
|
+
dependem disso: o pacote publica o Markdown delas em módulos `.ts` próprios, cada um num chunk lazy.)
|
|
178
207
|
- **Idioma:** os textos do spine seguem `HermesI18nService.setLocale` (o idioma em si se configura com
|
|
179
208
|
`provideHermesI18n` do `@trismegisto/angular`). `provideSpineMessages({ override, catalogs })` só sobrescreve
|
|
180
209
|
textos ou acrescenta idiomas.
|
|
@@ -198,7 +227,8 @@ O código fica em `projects/ui/` (um ponto de entrada por pasta). `npm run build
|
|
|
198
227
|
empacota com ng-packagr em `dist/ui/` (o que vai publicado) e copia este README para lá
|
|
199
228
|
(`scripts/copy-readme.mjs`); `npm run check-strings` sozinho confere que
|
|
200
229
|
nenhum texto de interface está fora do catálogo. O build termina com `scripts/check-lazy.mjs`, que falha se uma
|
|
201
|
-
tela carregada por `import()` (as do auto-serviço)
|
|
230
|
+
tela carregada por `import()` (as do auto-serviço) ou o texto da documentação delas acabar colado no arquivo do
|
|
231
|
+
ponto de entrada, ou se o ponto
|
|
202
232
|
principal/`auto-service` importar `@trismegisto/spine/audit` estaticamente — acontece quando
|
|
203
233
|
ela é exportada no `public-api.ts` (o rollup troca o `import()` por `Promise.resolve()` e a tela vai para o bundle
|
|
204
234
|
inicial do app).
|
|
@@ -299,7 +299,7 @@ class SpineAuditService {
|
|
|
299
299
|
}
|
|
300
300
|
/** Um ranking paginado (`apps` | `operations` | `users`) com os mesmos filtros/janela do resumo. */
|
|
301
301
|
tops(base, kind, query, page) {
|
|
302
|
-
return firstValueFrom(this.http.get(`${base}/tops/${kind}`, { headers: this.headers, params: auditParams(query, page) }));
|
|
302
|
+
return firstValueFrom(this.http.get(`${base}/tops/${encodeURIComponent(kind)}`, { headers: this.headers, params: auditParams(query, page) }));
|
|
303
303
|
}
|
|
304
304
|
/** Apps para o filtro (`{ apps: [{ id, name }] }` — `/admin/apps` ou `/auto-service/:clientId/apps`). */
|
|
305
305
|
apps(url) {
|