@trismegisto/spine 3.1.0 → 3.3.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 +16 -0
- package/fesm2022/{trismegisto-spine-auto-service-apps.usage-po9Ds_SU.mjs → trismegisto-spine-auto-service-apps.usage-C0F_MlCo.mjs} +3 -3
- package/fesm2022/{trismegisto-spine-auto-service-apps.usage-po9Ds_SU.mjs.map → trismegisto-spine-auto-service-apps.usage-C0F_MlCo.mjs.map} +1 -1
- package/fesm2022/{trismegisto-spine-auto-service-auto-service-client.component-DzmlpLPu.mjs → trismegisto-spine-auto-service-auto-service-client.component-IATeedbr.mjs} +8 -3
- package/fesm2022/trismegisto-spine-auto-service-auto-service-client.component-IATeedbr.mjs.map +1 -0
- package/fesm2022/{trismegisto-spine-auto-service-auto-service-groups.component-2xCG_wS9.mjs → trismegisto-spine-auto-service-auto-service-groups.component-D6L0gTmd.mjs} +3 -2
- package/fesm2022/trismegisto-spine-auto-service-auto-service-groups.component-D6L0gTmd.mjs.map +1 -0
- package/fesm2022/{trismegisto-spine-auto-service-auto-service.component-C4FBAefe.mjs → trismegisto-spine-auto-service-auto-service.component-DGrs_Jvw.mjs} +8 -3
- package/fesm2022/trismegisto-spine-auto-service-auto-service.component-DGrs_Jvw.mjs.map +1 -0
- package/fesm2022/{trismegisto-spine-auto-service-client.usage-B16r3IHk.mjs → trismegisto-spine-auto-service-client.usage-C_2zBCRN.mjs} +3 -2
- package/fesm2022/{trismegisto-spine-auto-service-client.usage-B16r3IHk.mjs.map → trismegisto-spine-auto-service-client.usage-C_2zBCRN.mjs.map} +1 -1
- package/fesm2022/{trismegisto-spine-auto-service-groups.technical-D05838rU.mjs → trismegisto-spine-auto-service-groups.technical-9aPPulhy.mjs} +2 -2
- package/fesm2022/{trismegisto-spine-auto-service-groups.technical-D05838rU.mjs.map → trismegisto-spine-auto-service-groups.technical-9aPPulhy.mjs.map} +1 -1
- package/fesm2022/{trismegisto-spine-auto-service-groups.usage-ChGMgYU3.mjs → trismegisto-spine-auto-service-groups.usage-CYh61LFL.mjs} +3 -3
- package/fesm2022/{trismegisto-spine-auto-service-groups.usage-ChGMgYU3.mjs.map → trismegisto-spine-auto-service-groups.usage-CYh61LFL.mjs.map} +1 -1
- package/fesm2022/{trismegisto-spine-auto-service-home.usage-D6cb4B3Z.mjs → trismegisto-spine-auto-service-home.usage-DWYGtngX.mjs} +3 -3
- package/fesm2022/{trismegisto-spine-auto-service-home.usage-D6cb4B3Z.mjs.map → trismegisto-spine-auto-service-home.usage-DWYGtngX.mjs.map} +1 -1
- package/fesm2022/trismegisto-spine-auto-service.mjs +8 -8
- package/fesm2022/trismegisto-spine-layout.mjs +367 -27
- package/fesm2022/trismegisto-spine-layout.mjs.map +1 -1
- package/fesm2022/trismegisto-spine-notification.mjs +27 -24
- package/fesm2022/trismegisto-spine-notification.mjs.map +1 -1
- package/fesm2022/trismegisto-spine-shell.mjs +5 -6
- package/fesm2022/trismegisto-spine-shell.mjs.map +1 -1
- package/fesm2022/trismegisto-spine.mjs +123 -3
- package/fesm2022/trismegisto-spine.mjs.map +1 -1
- package/package.json +6 -6
- package/types/trismegisto-spine-layout.d.ts +89 -5
- package/types/trismegisto-spine-layout.d.ts.map +1 -1
- package/types/trismegisto-spine-notification.d.ts +13 -12
- package/types/trismegisto-spine-notification.d.ts.map +1 -1
- package/types/trismegisto-spine-shell.d.ts.map +1 -1
- package/types/trismegisto-spine.d.ts +57 -0
- package/types/trismegisto-spine.d.ts.map +1 -1
- package/fesm2022/trismegisto-spine-auto-service-auto-service-client.component-DzmlpLPu.mjs.map +0 -1
- package/fesm2022/trismegisto-spine-auto-service-auto-service-groups.component-2xCG_wS9.mjs.map +0 -1
- package/fesm2022/trismegisto-spine-auto-service-auto-service.component-C4FBAefe.mjs.map +0 -1
|
@@ -2,9 +2,7 @@ import * as i0 from '@angular/core';
|
|
|
2
2
|
import { inject, DestroyRef, Injectable, ChangeDetectionStrategy, Component } from '@angular/core';
|
|
3
3
|
import { BehaviorSubject } from 'rxjs';
|
|
4
4
|
import { SPINE_MESSAGES } from '@trismegisto/spine';
|
|
5
|
-
import
|
|
6
|
-
import { CommonModule } from '@angular/common';
|
|
7
|
-
import { AlertComponent } from '@trismegisto/angular';
|
|
5
|
+
import { HermesToastService, ToastStackComponent } from '@trismegisto/angular';
|
|
8
6
|
|
|
9
7
|
var AlertType;
|
|
10
8
|
(function (AlertType) {
|
|
@@ -24,9 +22,20 @@ function redactSecrets(text) {
|
|
|
24
22
|
.replace(BEARER_RE, '$1***');
|
|
25
23
|
}
|
|
26
24
|
|
|
25
|
+
/** `AlertType.DANGER` (nome antigo, preservado na API pública) é o `'error'` do toast; os outros coincidem. */
|
|
26
|
+
function toToastVariant(type) {
|
|
27
|
+
return type === AlertType.DANGER ? 'error' : type;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Avisos de resposta (envelope `{ status, message }` dos GraphQL, falha do logout...). Desde a 3.3.0 eles aparecem no
|
|
31
|
+
* mesmo `hm-toast-stack` do `HermesToastService`, junto com os avisos do app (`SpineNoticesService`): antes o
|
|
32
|
+
* `spine-notification` desenhava uma coluna própria de `hm-alert` no mesmo canto, por cima dos toasts.
|
|
33
|
+
* `notifications$` continua publicando a lista (com a expiração de cada um) para quem já lia.
|
|
34
|
+
*/
|
|
27
35
|
class NotificationService {
|
|
28
36
|
constructor() {
|
|
29
37
|
this.text = inject(SPINE_MESSAGES).notification;
|
|
38
|
+
this.toast = inject(HermesToastService, { optional: true });
|
|
30
39
|
this._notifications = new BehaviorSubject([]);
|
|
31
40
|
this.notifications$ = this._notifications.asObservable();
|
|
32
41
|
/** Relógio da expiração: só corre enquanto há notificação na tela (antes era um `setInterval` eterno,
|
|
@@ -57,6 +66,7 @@ class NotificationService {
|
|
|
57
66
|
const next = { ...notification, message, hermesAlertType, expirer };
|
|
58
67
|
this._notifications.next([...this._notifications.value, next]);
|
|
59
68
|
this.timer ??= setInterval(() => this.expireNotifications(), 1000);
|
|
69
|
+
this.toast?.push(toToastVariant(hermesAlertType), message, notification.timer > 0 ? { duration: notification.timer * 1000 } : undefined);
|
|
60
70
|
}
|
|
61
71
|
processErrorNotification() {
|
|
62
72
|
this.addNotification({
|
|
@@ -88,31 +98,24 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.24", ngImpo
|
|
|
88
98
|
args: [{ providedIn: 'root' }]
|
|
89
99
|
}], ctorParameters: () => [] });
|
|
90
100
|
|
|
91
|
-
/**
|
|
92
|
-
*
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
101
|
+
/**
|
|
102
|
+
* Compatibilidade: os avisos do `NotificationService` saem no `hm-toast-stack` do `HermesToastService` (3.3.0).
|
|
103
|
+
* `<spine-notification>` só monta uma pilha de toasts; se já houver outra na tela (a do `spine-layout`), o serviço
|
|
104
|
+
* escolhe uma e nada aparece em dobro. Em tela nova, use `<hm-toast-stack />` direto.
|
|
105
|
+
*/
|
|
96
106
|
class NotificationComponent {
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
this.cdr = cdr;
|
|
100
|
-
this.notifications = [];
|
|
101
|
-
this.toAlertVariant = toAlertVariant;
|
|
102
|
-
}
|
|
103
|
-
ngOnInit() {
|
|
104
|
-
this.notificationService.notifications$.subscribe((notifications) => {
|
|
105
|
-
this.notifications = notifications;
|
|
106
|
-
this.cdr.markForCheck();
|
|
107
|
-
});
|
|
108
|
-
}
|
|
109
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.24", ngImport: i0, type: NotificationComponent, deps: [{ token: NotificationService }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
110
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.2.24", type: NotificationComponent, isStandalone: true, selector: "spine-notification", ngImport: i0, template: "<hm-alert *ngFor=\"let notification of notifications\" [variant]=\"toAlertVariant(notification.hermesAlertType)\" [closable]=\"notification.hermesAlertClosable ?? true\">\n <span class=\"alert-text\">{{ notification.message }}</span>\n</hm-alert>\n", styles: [":host{position:fixed;top:calc(var(--hm-header-height, 3rem) + 1rem);right:1rem;z-index:1030;display:flex;flex-direction:column;gap:.5rem;max-width:380px;pointer-events:none}:host ::ng-deep hm-alert{pointer-events:auto}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "component", type: AlertComponent, selector: "hm-alert", inputs: ["variant", "appearance", "heading", "closable", "size", "showIcon", "link", "linkLabel", "linkTarget", "dismissKey", "duration"], outputs: ["closed"] }], changeDetection: i0.ChangeDetectionStrategy.Eager }); }
|
|
107
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.24", ngImport: i0, type: NotificationComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
108
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.2.24", type: NotificationComponent, isStandalone: true, selector: "spine-notification", ngImport: i0, template: `<hm-toast-stack />`, isInline: true, dependencies: [{ kind: "component", type: ToastStackComponent, selector: "hm-toast-stack" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
111
109
|
}
|
|
112
110
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.24", ngImport: i0, type: NotificationComponent, decorators: [{
|
|
113
111
|
type: Component,
|
|
114
|
-
args: [{
|
|
115
|
-
|
|
112
|
+
args: [{
|
|
113
|
+
selector: 'spine-notification',
|
|
114
|
+
imports: [ToastStackComponent],
|
|
115
|
+
template: `<hm-toast-stack />`,
|
|
116
|
+
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
117
|
+
}]
|
|
118
|
+
}] });
|
|
116
119
|
|
|
117
120
|
/**
|
|
118
121
|
* Generated bundle index. Do not edit.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"trismegisto-spine-notification.mjs","sources":["../../../projects/ui/notification/src/notification.types.ts","../../../projects/ui/notification/src/redact-secrets.ts","../../../projects/ui/notification/src/notification.service.ts","../../../projects/ui/notification/src/notification.component.ts","../../../projects/ui/notification/src/notification.component.html","../../../projects/ui/notification/src/trismegisto-spine-notification.ts"],"sourcesContent":["export enum AlertType {\n INFO = 'info',\n WARNING = 'warning',\n SUCCESS = 'success',\n DANGER = 'danger',\n}\n\nexport interface Notification {\n timer: number;\n expirer?: number;\n hermesAlertType: AlertType;\n message: string;\n hermesAlertAppLevel?: boolean;\n hermesAlertClosable?: boolean;\n}\n","const JWT_RE = /eyJ[A-Za-z0-9_-]{6,}\\.[A-Za-z0-9_-]{6,}\\.[A-Za-z0-9_-]{6,}/g;\nconst TOKEN_FLAG_RE = /(--token=|--password=|token=|password=)\\S+/gi;\nconst BEARER_RE = /(bearer\\s+)[A-Za-z0-9._-]+/gi;\n\nexport function redactSecrets(text: unknown): string {\n return String(text ?? '')\n .replace(JWT_RE, '***')\n .replace(TOKEN_FLAG_RE, '$1***')\n .replace(BEARER_RE, '$1***');\n}\n","import { DestroyRef, Injectable, inject } from '@angular/core';\nimport { BehaviorSubject, Observable } from 'rxjs';\nimport { redactSecrets } from './redact-secrets';\nimport { AlertType, Notification } from './notification.types';\nimport { SPINE_MESSAGES } from '@trismegisto/spine';\n\nexport type NotificationInput = Omit<Notification, 'hermesAlertType' | 'expirer'> & {\n hermesAlertType: AlertType | number;\n};\n\n@Injectable({ providedIn: 'root' })\nexport class NotificationService {\n private readonly text = inject(SPINE_MESSAGES).notification;\n private _notifications = new BehaviorSubject<Notification[]>([]);\n public readonly notifications$: Observable<Notification[]> = this._notifications.asObservable();\n\n /** Relógio da expiração: só corre enquanto há notificação na tela (antes era um `setInterval` eterno,\n * nunca limpo — acordava a página a cada segundo e sobrevivia ao injetor). */\n private timer: ReturnType<typeof setInterval> | null = null;\n\n constructor() {\n inject(DestroyRef).onDestroy(() => this.stopClock());\n }\n\n /**\n * O `status` do envelope `{ status, message, data }` dos GraphQL decide o tipo do toast — o mesmo\n * contrato em todo app: 2xx sucesso, 3xx atenção (concluiu com ressalva), 4xx/5xx erro, o resto\n * informação. Por faixa (antes era só 200/300/400/500 exatos — continuam dando o mesmo resultado).\n */\n resolveAlertType(status: number): AlertType {\n if (status >= 200 && status < 300) return AlertType.SUCCESS;\n if (status >= 300 && status < 400) return AlertType.WARNING;\n if (status >= 400 && status < 600) return AlertType.DANGER;\n return AlertType.INFO;\n }\n\n addNotification(notification: NotificationInput): void {\n const message = redactSecrets(notification.message);\n const hermesAlertType =\n typeof notification.hermesAlertType === 'number'\n ? this.resolveAlertType(notification.hermesAlertType)\n : notification.hermesAlertType;\n\n const expirer = Date.now() + notification.timer * 1000;\n const next: Notification = { ...notification, message, hermesAlertType, expirer };\n this._notifications.next([...this._notifications.value, next]);\n this.timer ??= setInterval(() => this.expireNotifications(), 1000);\n }\n\n processErrorNotification(): void {\n this.addNotification({\n timer: 5,\n hermesAlertType: AlertType.DANGER,\n message: this.text.genericError,\n hermesAlertClosable: false,\n });\n }\n\n private expireNotifications(): void {\n const now = Date.now();\n const remaining = this._notifications.value.filter((n) => (n.expirer ?? 0) >= now);\n if (remaining.length !== this._notifications.value.length) {\n this._notifications.next(remaining);\n }\n if (remaining.length === 0) this.stopClock();\n }\n\n private stopClock(): void {\n if (this.timer !== null) clearInterval(this.timer);\n this.timer = null;\n }\n}\n","import { CommonModule } from '@angular/common';\nimport { ChangeDetectorRef, Component, OnInit, ChangeDetectionStrategy } from '@angular/core';\nimport { AlertComponent, AlertVariant } from '@trismegisto/angular';\nimport { AlertType, Notification } from './notification.types';\nimport { NotificationService } from './notification.service';\n\n/** `AlertType.DANGER` (nome do spine antigo, preservado na API pública) mapeia pra `'error'`\n * no `AlertVariant` do DS novo — os outros 3 valores já coincidem 1:1. */\nfunction toAlertVariant(type: AlertType): AlertVariant {\n return type === AlertType.DANGER ? 'error' : type;\n}\n\n@Component({\n selector: 'spine-notification',\n imports: [CommonModule, AlertComponent],\n templateUrl: './notification.component.html',\n changeDetection: ChangeDetectionStrategy.Eager,\n styleUrl: './notification.component.scss',\n})\nexport class NotificationComponent implements OnInit {\n notifications: Notification[] = [];\n\n protected readonly toAlertVariant = toAlertVariant;\n\n constructor(public notificationService: NotificationService, private cdr: ChangeDetectorRef) {}\n\n ngOnInit(): void {\n this.notificationService.notifications$.subscribe((notifications) => {\n this.notifications = notifications;\n this.cdr.markForCheck();\n });\n }\n}\n","<hm-alert *ngFor=\"let notification of notifications\" [variant]=\"toAlertVariant(notification.hermesAlertType)\" [closable]=\"notification.hermesAlertClosable ?? true\">\n <span class=\"alert-text\">{{ notification.message }}</span>\n</hm-alert>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1.NotificationService"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"trismegisto-spine-notification.mjs","sources":["../../../projects/ui/notification/src/notification.types.ts","../../../projects/ui/notification/src/redact-secrets.ts","../../../projects/ui/notification/src/notification.service.ts","../../../projects/ui/notification/src/notification.component.ts","../../../projects/ui/notification/src/trismegisto-spine-notification.ts"],"sourcesContent":["export enum AlertType {\n INFO = 'info',\n WARNING = 'warning',\n SUCCESS = 'success',\n DANGER = 'danger',\n}\n\nexport interface Notification {\n timer: number;\n expirer?: number;\n hermesAlertType: AlertType;\n message: string;\n hermesAlertAppLevel?: boolean;\n hermesAlertClosable?: boolean;\n}\n","const JWT_RE = /eyJ[A-Za-z0-9_-]{6,}\\.[A-Za-z0-9_-]{6,}\\.[A-Za-z0-9_-]{6,}/g;\nconst TOKEN_FLAG_RE = /(--token=|--password=|token=|password=)\\S+/gi;\nconst BEARER_RE = /(bearer\\s+)[A-Za-z0-9._-]+/gi;\n\nexport function redactSecrets(text: unknown): string {\n return String(text ?? '')\n .replace(JWT_RE, '***')\n .replace(TOKEN_FLAG_RE, '$1***')\n .replace(BEARER_RE, '$1***');\n}\n","import { DestroyRef, Injectable, inject } from '@angular/core';\nimport type { AlertVariant } from '@trismegisto/primitives';\nimport { BehaviorSubject, Observable } from 'rxjs';\nimport { redactSecrets } from './redact-secrets';\nimport { AlertType, Notification } from './notification.types';\nimport { SPINE_MESSAGES } from '@trismegisto/spine';\nimport { HermesToastService } from '@trismegisto/angular';\n\n/** `AlertType.DANGER` (nome antigo, preservado na API pública) é o `'error'` do toast; os outros coincidem. */\nfunction toToastVariant(type: AlertType): AlertVariant {\n return type === AlertType.DANGER ? 'error' : type;\n}\n\nexport type NotificationInput = Omit<Notification, 'hermesAlertType' | 'expirer'> & {\n hermesAlertType: AlertType | number;\n};\n\n/**\n * Avisos de resposta (envelope `{ status, message }` dos GraphQL, falha do logout...). Desde a 3.3.0 eles aparecem no\n * mesmo `hm-toast-stack` do `HermesToastService`, junto com os avisos do app (`SpineNoticesService`): antes o\n * `spine-notification` desenhava uma coluna própria de `hm-alert` no mesmo canto, por cima dos toasts.\n * `notifications$` continua publicando a lista (com a expiração de cada um) para quem já lia.\n */\n@Injectable({ providedIn: 'root' })\nexport class NotificationService {\n private readonly text = inject(SPINE_MESSAGES).notification;\n private readonly toast = inject(HermesToastService, { optional: true });\n private _notifications = new BehaviorSubject<Notification[]>([]);\n public readonly notifications$: Observable<Notification[]> = this._notifications.asObservable();\n\n /** Relógio da expiração: só corre enquanto há notificação na tela (antes era um `setInterval` eterno,\n * nunca limpo — acordava a página a cada segundo e sobrevivia ao injetor). */\n private timer: ReturnType<typeof setInterval> | null = null;\n\n constructor() {\n inject(DestroyRef).onDestroy(() => this.stopClock());\n }\n\n /**\n * O `status` do envelope `{ status, message, data }` dos GraphQL decide o tipo do toast — o mesmo\n * contrato em todo app: 2xx sucesso, 3xx atenção (concluiu com ressalva), 4xx/5xx erro, o resto\n * informação. Por faixa (antes era só 200/300/400/500 exatos — continuam dando o mesmo resultado).\n */\n resolveAlertType(status: number): AlertType {\n if (status >= 200 && status < 300) return AlertType.SUCCESS;\n if (status >= 300 && status < 400) return AlertType.WARNING;\n if (status >= 400 && status < 600) return AlertType.DANGER;\n return AlertType.INFO;\n }\n\n addNotification(notification: NotificationInput): void {\n const message = redactSecrets(notification.message);\n const hermesAlertType =\n typeof notification.hermesAlertType === 'number'\n ? this.resolveAlertType(notification.hermesAlertType)\n : notification.hermesAlertType;\n\n const expirer = Date.now() + notification.timer * 1000;\n const next: Notification = { ...notification, message, hermesAlertType, expirer };\n this._notifications.next([...this._notifications.value, next]);\n this.timer ??= setInterval(() => this.expireNotifications(), 1000);\n this.toast?.push(toToastVariant(hermesAlertType), message, notification.timer > 0 ? { duration: notification.timer * 1000 } : undefined);\n }\n\n processErrorNotification(): void {\n this.addNotification({\n timer: 5,\n hermesAlertType: AlertType.DANGER,\n message: this.text.genericError,\n hermesAlertClosable: false,\n });\n }\n\n private expireNotifications(): void {\n const now = Date.now();\n const remaining = this._notifications.value.filter((n) => (n.expirer ?? 0) >= now);\n if (remaining.length !== this._notifications.value.length) {\n this._notifications.next(remaining);\n }\n if (remaining.length === 0) this.stopClock();\n }\n\n private stopClock(): void {\n if (this.timer !== null) clearInterval(this.timer);\n this.timer = null;\n }\n}\n","import { ChangeDetectionStrategy, Component } from '@angular/core';\nimport { ToastStackComponent } from '@trismegisto/angular';\n\n/**\n * Compatibilidade: os avisos do `NotificationService` saem no `hm-toast-stack` do `HermesToastService` (3.3.0).\n * `<spine-notification>` só monta uma pilha de toasts; se já houver outra na tela (a do `spine-layout`), o serviço\n * escolhe uma e nada aparece em dobro. Em tela nova, use `<hm-toast-stack />` direto.\n */\n@Component({\n selector: 'spine-notification',\n imports: [ToastStackComponent],\n template: `<hm-toast-stack />`,\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class NotificationComponent {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
|
|
@@ -8,9 +8,8 @@ import * as i0 from '@angular/core';
|
|
|
8
8
|
import { ChangeDetectionStrategy, Component, inject, signal, makeEnvironmentProviders, DestroyRef } from '@angular/core';
|
|
9
9
|
import * as i1 from '@angular/router';
|
|
10
10
|
import { ActivatedRoute, Router } from '@angular/router';
|
|
11
|
-
import { StatePageComponent } from '@trismegisto/angular';
|
|
11
|
+
import { StatePageComponent, ToastStackComponent } from '@trismegisto/angular';
|
|
12
12
|
import { HTTP_INTERCEPTORS } from '@angular/common/http';
|
|
13
|
-
import { NotificationComponent } from '@trismegisto/spine/notification';
|
|
14
13
|
|
|
15
14
|
// Movido para o pacote raiz (ver package-info.token.ts) — reexportado aqui para não quebrar
|
|
16
15
|
// quem importa `APP_PACKAGE_INFO`/`PackageInfo` de '@trismegisto/spine/shell'.
|
|
@@ -389,12 +388,12 @@ class BlockedComponent {
|
|
|
389
388
|
/>
|
|
390
389
|
</main>
|
|
391
390
|
<!-- Fora do layout: o aviso de falha do logout precisa de onde aparecer. -->
|
|
392
|
-
<
|
|
393
|
-
`, isInline: true, styles: [".blocked{display:flex;min-block-size:100dvh;flex-direction:column;background:var(--hm-surface)}\n"], dependencies: [{ kind: "component", type: StatePageComponent, selector: "hm-state-page", inputs: ["kind", "heading", "description", "action", "actionIcon"], outputs: ["actionTriggered"] }, { kind: "component", type:
|
|
391
|
+
<hm-toast-stack />
|
|
392
|
+
`, isInline: true, styles: [".blocked{display:flex;min-block-size:100dvh;flex-direction:column;background:var(--hm-surface)}\n"], dependencies: [{ kind: "component", type: StatePageComponent, selector: "hm-state-page", inputs: ["kind", "heading", "description", "action", "actionIcon"], outputs: ["actionTriggered"] }, { kind: "component", type: ToastStackComponent, selector: "hm-toast-stack" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
394
393
|
}
|
|
395
394
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.24", ngImport: i0, type: BlockedComponent, decorators: [{
|
|
396
395
|
type: Component,
|
|
397
|
-
args: [{ selector: 'blocked', imports: [StatePageComponent,
|
|
396
|
+
args: [{ selector: 'blocked', imports: [StatePageComponent, ToastStackComponent], template: `
|
|
398
397
|
<main class="blocked">
|
|
399
398
|
<hm-state-page
|
|
400
399
|
kind="blocked"
|
|
@@ -405,7 +404,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.24", ngImpo
|
|
|
405
404
|
/>
|
|
406
405
|
</main>
|
|
407
406
|
<!-- Fora do layout: o aviso de falha do logout precisa de onde aparecer. -->
|
|
408
|
-
<
|
|
407
|
+
<hm-toast-stack />
|
|
409
408
|
`, changeDetection: ChangeDetectionStrategy.OnPush, styles: [".blocked{display:flex;min-block-size:100dvh;flex-direction:column;background:var(--hm-surface)}\n"] }]
|
|
410
409
|
}], ctorParameters: () => [] });
|
|
411
410
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"trismegisto-spine-shell.mjs","sources":["../../../projects/ui/shell/src/tokens.ts","../../../projects/ui/shell/src/empty-route.component.ts","../../../projects/ui/shell/src/private.routes.ts","../../../projects/ui/shell/src/public/callback.component.ts","../../../projects/ui/shell/src/public/loggedout/loggedout.component.ts","../../../projects/ui/shell/src/public/loggedout/loggedout.component.html","../../../projects/ui/shell/src/public/login.component.ts","../../../projects/ui/shell/src/public.routes.ts","../../../projects/ui/shell/src/app.routes.ts","../../../projects/ui/shell/src/base-components.ts","../../../projects/ui/shell/src/provide-shell.ts","../../../projects/ui/shell/src/templates/access-recovery.ts","../../../projects/ui/shell/src/templates/no-rights/no-rights.component.ts","../../../projects/ui/shell/src/templates/no-rights/no-rights.component.html","../../../projects/ui/shell/src/templates/blocked/blocked.component.ts","../../../projects/ui/shell/src/templates/loading-page/loading-page.component.ts","../../../projects/ui/shell/src/templates/loading-page/loading-page.component.html","../../../projects/ui/shell/src/trismegisto-spine-shell.ts"],"sourcesContent":["// Movido para o pacote raiz (ver package-info.token.ts) — reexportado aqui para não quebrar\n// quem importa `APP_PACKAGE_INFO`/`PackageInfo` de '@trismegisto/spine/shell'.\nexport { APP_PACKAGE_INFO, type PackageInfo } from '@trismegisto/spine';\n","import { ChangeDetectionStrategy, Component } from '@angular/core';\n\n/**\n * Componente vazio pra rota `**` (ver `private.routes.ts`) — o Angular Router EXIGE\n * `component`/`loadComponent`/`redirectTo`/`children`/`loadChildren` em toda rota (`NG04014` se\n * nenhum for dado), mas quem desenha o conteúdo aqui é o `hm-workspace`\n * (`SpinePagePanelComponent`, resolvido por `resolveSpineRoute`, sem passar pelo `Router`), não um\n * `<router-outlet>`. Este componente só satisfaz a validação do Router — nunca renderiza nada de\n * visível (o `<router-outlet>` real que sobra em `LayoutComponent` fica escondido via `[hidden]`\n * sempre que a rota ativa não é `/no-permission`, a única com conteúdo de verdade).\n */\n@Component({\n selector: 'spine-empty-route',\n template: '',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class EmptyRouteComponent {}\n","import { Routes } from '@angular/router';\nimport { ViewGuard } from '@trismegisto/spine/routing';\nimport { EmptyRouteComponent } from './empty-route.component';\n\n/**\n * Quem desenha o conteúdo agora é o `hm-workspace` (ver `LayoutComponent`/\n * `layout/src/workspace/`), nunca um `<router-outlet>` aninhado — a árvore de 6 níveis\n * (header/navigation/menu/item/submenu/page) que existia aqui foi substituída por\n * `resolveSpineRoute`, chamada por painel. Estas rotas só precisam existir pro `Router` real\n * \"reconhecer\" a URL (deep link, F5, `router.navigateByUrl` do painel focado) e pro `ViewGuard`\n * confirmar que ela resolve contra a view atual antes do painel tentar renderizá-la — `component`\n * é só `EmptyRouteComponent` (o Angular exige um dos cinco em toda rota, `NG04014` senão; o\n * `<router-outlet>` que o recebe fica escondido, ver `LayoutComponent`).\n */\nexport const PRIVATE_ROUTES: Routes = [\n {\n path: 'no-permission',\n loadComponent: () => import('./templates/no-rights/no-rights.component').then(m => m.NoRightsComponent),\n },\n { path: '', pathMatch: 'full', redirectTo: 'home' },\n { path: '**', canActivate: [ViewGuard], component: EmptyRouteComponent },\n];\n","import { ChangeDetectionStrategy, Component, inject, signal } from '@angular/core';\nimport { ActivatedRoute, Router } from '@angular/router';\nimport { AuthorizationService } from '@orfeu/angular/core';\nimport { StatePageComponent } from '@trismegisto/angular';\nimport { SPINE_MESSAGES } from '@trismegisto/spine';\nimport { SpineAccountPreferencesService, SpineStartPageService } from '@trismegisto/spine/layout';\n\n/** Chave do `@orfeu/angular` com a URL pedida antes do login (documentada no MIGRATION da lib). */\nconst RETURN_URL_KEY = 'orfeu_return_url';\n\n/**\n * Rota de retorno do Argos (`/callback?code&state` ou `?error`). Tudo passa pelo `handleCallback()` do\n * `@orfeu/angular`, que confere state e verifier, troca o code e navega para a URL pedida antes do login\n * (ou para a 1ª rota do `/view`).\n *\n * - `?error=login_required` (e afins) da reautorização silenciosa (`prompt=none`): o próprio\n * `handleCallback()` segue para o login interativo, mantendo a URL de retorno — a pessoa não fica parada aqui.\n * - Callback inválido (state/nonce divergente, `?error`, sem code): NUNCA desloga. Com uma sessão viva\n * (callback repetido, voltar do navegador), segue para a URL de retorno; sem sessão, mostra a página de\n * erro com \"Entrar novamente\".\n */\n@Component({\n selector: 'app-callback',\n imports: [StatePageComponent],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n @if (failed()) {\n <main class=\"callback\">\n <hm-state-page\n kind=\"error\"\n [heading]=\"text.callbackFailedHeading\"\n [description]=\"text.callbackFailedText\"\n [action]=\"text.signInAgain\"\n actionIcon=\"login\"\n (actionTriggered)=\"signIn()\"\n />\n </main>\n }\n `,\n styles: [`.callback { display: flex; min-block-size: 100dvh; flex-direction: column; background: var(--hm-surface); }`],\n})\nexport class CallbackComponent {\n protected readonly text = inject(SPINE_MESSAGES).session;\n private readonly route = inject(ActivatedRoute);\n private readonly router = inject(Router);\n private readonly auth = inject(AuthorizationService);\n private readonly startPage = inject(SpineStartPageService);\n private readonly accountPreferences = inject(SpineAccountPreferencesService);\n\n /** `true` quando o callback falhou e não há sessão para onde voltar. */\n protected readonly failed = signal(false);\n /** Promessa do tratamento em andamento (exposta para os testes aguardarem). */\n readonly done: Promise<void>;\n\n constructor() {\n this.done = this.handle();\n }\n\n private async handle(): Promise<void> {\n const q = this.route.snapshot.queryParamMap;\n const returnUrl = readReturnUrl();\n try {\n await this.auth.handleCallback({\n code: q.get('code') ?? undefined,\n state: q.get('state') ?? undefined,\n error: q.get('error') ?? undefined,\n error_description: q.get('error_description') ?? undefined,\n });\n await this.goToStartPage(returnUrl);\n } catch (e) {\n console.warn('[hermes-spine] callback de login recusado:', e);\n if (this.auth.authenticated) {\n // Sessão viva (de outra aba ou anterior): segue para onde a pessoa ia, sem tocar na sessão.\n await this.router.navigateByUrl(returnUrl ?? '/');\n return;\n }\n this.failed.set(true);\n }\n }\n\n /**\n * Tela inicial (`SpineFeatures.startPage`): sem URL pedida antes do login, abre o favorito ou a última tela\n * escolhidos em Configurações › Conta. Com as preferências na conta, espera a conta responder (até 2 s), para\n * valer a escolha feita em outro navegador.\n */\n private async goToStartPage(returnUrl: string | null): Promise<void> {\n if (!this.startPage.enabled || !this.auth.authenticated || !SpineStartPageService.isDefaultReturn(returnUrl)) return;\n await this.accountPreferences.ready();\n const target = this.startPage.target();\n if (target) await this.router.navigateByUrl(target, { replaceUrl: true });\n }\n\n protected signIn(): void {\n void this.auth.authorize(readReturnUrl() ?? undefined);\n }\n}\n\nfunction readReturnUrl(): string | null {\n try {\n const url = globalThis.sessionStorage?.getItem(RETURN_URL_KEY) ?? null;\n return url && url.startsWith('/') && !url.startsWith('//') ? url : null;\n } catch {\n return null;\n }\n}\n","import { Component, ChangeDetectionStrategy } from '@angular/core';\nimport { AuthorizationService } from '@orfeu/angular/core';\nimport { StatePageComponent } from '@trismegisto/angular';\n\n@Component({\n selector: 'loggedout',\n imports: [StatePageComponent],\n templateUrl: './loggedout.component.html',\n changeDetection: ChangeDetectionStrategy.Eager,\n styleUrl: './loggedout.component.scss'\n})\nexport class LoggedOutComponent {\n constructor(private authorizationService: AuthorizationService) {}\n goToLogin() { this.authorizationService.authorize(); }\n}\n","<!-- Tela pública (fora do layout): ocupa a janela inteira. Página pronta do hermes, tipo \"logged-out\". -->\n<main class=\"loggedout\">\n <hm-state-page kind=\"logged-out\" (actionTriggered)=\"goToLogin()\" />\n</main>\n","import { Component, OnInit, ChangeDetectionStrategy } from '@angular/core';\nimport { Router } from '@angular/router';\nimport { AuthorizationService, ViewService } from '@orfeu/angular/core';\n\n@Component({\n selector: 'app-login',\n imports: [],\n changeDetection: ChangeDetectionStrategy.Eager,\n template: ``\n})\nexport class LoginComponent implements OnInit {\n constructor(\n private router: Router,\n private auth: AuthorizationService,\n private view: ViewService\n ) {}\n\n ngOnInit(): void { this.bootstrap(); }\n\n async bootstrap() {\n await this.auth.reauthorize();\n if (this.auth.authenticated) {\n const views = await this.view.update(this.auth.getToken());\n const firstRoute = this.findFirstNavigable(views?.routes || []);\n // Sem grupo nenhum no app (token sem crachá) vence \"sem rota\": ver ViewGuard.\n if (!this.auth.badges.length) this.router.navigate(['/blocked']);\n else this.router.navigate([firstRoute ?? '/no-permission']);\n }\n }\n\n /** Primeira rota navegável (DFS), atravessando grupos \"transparentes\" sem route_redirect. */\n private findFirstNavigable(routes: any[]): string | null {\n for (const r of routes || []) {\n if (!r) continue;\n if (r.route_redirect) return r.route_redirect;\n if (r.routes?.length) {\n const found = this.findFirstNavigable(r.routes);\n if (found) return found;\n }\n }\n return null;\n }\n}\n","import { Routes } from '@angular/router';\nimport { PrivateGuard } from '@orfeu/angular/core';\nimport { CallbackComponent } from './public/callback.component';\nimport { LoggedOutComponent } from './public/loggedout/loggedout.component';\nimport { LoginComponent } from './public/login.component';\n\nexport const PUBLIC_ROUTES: Routes = [\n { path: 'login', component: LoginComponent },\n { path: 'callback', component: CallbackComponent },\n { path: 'logoff', component: LoggedOutComponent },\n // Sem nenhum grupo vinculado ao app (ver `ViewGuard`): tela cheia, FORA do layout — sem\n // header nem sidebar, só a informação. Aqui (e não nas privadas) justamente pra não montar o\n // `LayoutComponent`; o `PrivateGuard` garante que só chega quem está autenticado.\n {\n path: 'blocked',\n canActivate: [PrivateGuard],\n loadComponent: () => import('./templates/blocked/blocked.component').then(m => m.BlockedComponent),\n },\n { path: '', redirectTo: 'login', pathMatch: 'full' },\n];\n","import { Routes } from '@angular/router';\nimport { PrivateGuard } from '@orfeu/angular/core';\nimport { LayoutComponent } from '@trismegisto/spine/layout';\nimport { PRIVATE_ROUTES } from './private.routes';\nimport { PUBLIC_ROUTES } from './public.routes';\n\nexport const APP_ROUTES: Routes = [\n ...PUBLIC_ROUTES,\n {\n path: '',\n component: LayoutComponent,\n canActivate: [PrivateGuard],\n canActivateChild: [PrivateGuard],\n children: PRIVATE_ROUTES,\n },\n { path: '**', redirectTo: '' },\n];\n","import { ComponentRoute } from '@trismegisto/spine/routing';\n\n/**\n * Componentes que o próprio shell traz, ligados pelo `router_id` (web.router) da árvore de rotas do argos.\n *\n * As telas do antigo módulo \"Sistema\" (Sobre › Recursos/Informações; Preferências › Geral,\n * Autenticação, Exibição, Notificações) saíram em 2026-09-29: viraram o painel de configurações\n * (`@trismegisto/spine/layout` › `SettingsPanelComponent`, menu do perfil ou Ctrl+,). Os router_ids delas\n * (d6a30f9c, 86b87583, 2d71fb9b, 48ebca20, 662a7a61, e7d9982b, bf8a9f69) não têm mais componente —\n * o módulo precisa sair da árvore de rotas no seed do argos.\n *\n * O Início (`HomeComponent`) mudou pra `@trismegisto/spine/auto-service` -- ver a entrada legada abaixo.\n */\nexport const BASE_COMPONENTS: ComponentRoute[] = [\n {\n // LEGADO: o Início agora vem do template Auto-Serviço (`provideAutoService`, casando por\n // source_template_router_id). Esta entrada só cobre o Início do Hefesto em banco cujo router\n // (b06c2784) ainda não aponta pro template -- remover quando todos os ambientes tiverem.\n id: 'b06c2784-eb29-4747-b118-53687c382cf7',\n load: async () => (await import('@trismegisto/spine/auto-service')).AUTO_SERVICE_SCREENS.home(),\n },\n];\n","import { EnvironmentProviders, makeEnvironmentProviders } from '@angular/core';\nimport { HTTP_INTERCEPTORS } from '@angular/common/http';\nimport { COMPONENT_ROUTES, ComponentRoute, RouteIdInterceptor, componentRouterId } from '@trismegisto/spine/routing';\nimport { BASE_COMPONENTS } from './base-components';\nimport { APP_PACKAGE_INFO, PackageInfo } from './tokens';\n\nexport interface ShellOptions {\n appComponents?: ComponentRoute[];\n packageInfo?: PackageInfo;\n}\n\nexport function provideShell(options: ShellOptions = {}): EnvironmentProviders {\n const appComponents = options.appComponents ?? [];\n const baseIds = new Set(BASE_COMPONENTS.map(componentRouterId));\n const conflicts = appComponents.filter(c => componentRouterId(c) && baseIds.has(componentRouterId(c)));\n\n if (conflicts.length > 0) {\n throw new Error(\n `[hermes-spine] provideShell: router_ids em conflito com BASE_COMPONENTS: ${conflicts.map(componentRouterId).join(', ')}`\n );\n }\n\n // multi: true -- este provider é só UMA das fontes de COMPONENT_ROUTES (a do próprio\n // app + os componentes base do shell). Pacotes plugáveis (ex.: provideAutoService)\n // contribuem com os deles via outro provider do mesmo token, combinados no\n // ComponentDistributorService -- nunca use { provide: COMPONENT_ROUTES, useValue: ... }\n // sem multi: true em outro lugar, ou o Angular lança erro de provider inconsistente.\n return makeEnvironmentProviders([\n { provide: COMPONENT_ROUTES, useValue: [...BASE_COMPONENTS, ...appComponents], multi: true },\n { provide: HTTP_INTERCEPTORS, useClass: RouteIdInterceptor, multi: true },\n ...(options.packageInfo ? [{ provide: APP_PACKAGE_INFO, useValue: options.packageInfo }] : []),\n ]);\n}\n","import { DestroyRef, inject } from '@angular/core';\nimport { Router } from '@angular/router';\nimport { AuthorizationService, ViewService } from '@orfeu/angular/core';\nimport { Route, spineRoutesOf } from '@trismegisto/spine';\nimport { findFirstNavigable } from '@trismegisto/spine/routing';\n\n/**\n * As telas de acesso (`/blocked` e `/no-permission`) saem sozinhas quando a situação muda — no F5\n * (o token e a view são refeitos na inicialização) ou com a tela aberta (renovação do token, troca\n * de crachá): quem ganhou grupo/permissão não fica preso numa tela que já não vale.\n *\n * Mesma decisão do `ViewGuard`/login, na mesma ordem:\n * - sem crachá nenhum no app (token sem `badges`) → `/blocked`;\n * - com crachá, mas a view sem rota → `/no-permission`;\n * - com rota → a primeira navegável.\n *\n * Só redireciona quando o destino é OUTRO que a tela atual, e com `replaceUrl`: voltar no navegador\n * não devolve pra tela de bloqueio que já não se aplica.\n *\n * Chamar no construtor (contexto de injeção) da tela.\n */\nexport function watchAccessRecovery(current: '/blocked' | '/no-permission'): void {\n const router = inject(Router);\n const auth = inject(AuthorizationService);\n const viewService = inject(ViewService);\n\n const check = (view: { routes?: Route[] | null } | null | undefined): void => {\n // Sem sessão (ainda) não há o que decidir: quem cuida disso é o PrivateGuard/login.\n if (!auth.authenticated || !view) return;\n const target = !auth.badges.length\n ? '/blocked'\n : (findFirstNavigable(spineRoutesOf(view)) ?? '/no-permission');\n if (target !== current) void router.navigateByUrl(target, { replaceUrl: true });\n };\n\n // O valor atual primeiro (F5 com o token já renovado pelo initialize()) e depois cada atualização\n // da view — ela é sempre refeita depois do token (`view.update`), então o crachá lido aqui já é o novo.\n check(viewService.currentView as any);\n const sub = viewService.currentView$.subscribe((view: any) => check(view));\n inject(DestroyRef).onDestroy(() => sub.unsubscribe());\n}\n","import { Component, OnInit, ChangeDetectionStrategy, inject } from '@angular/core';\nimport { ViewService } from '@orfeu/angular/core';\nimport { StatePageComponent } from '@trismegisto/angular';\nimport { SPINE_MESSAGES } from '@trismegisto/spine';\nimport { watchAccessRecovery } from '../access-recovery';\n\n@Component({\n selector: 'no-rights',\n imports: [StatePageComponent],\n templateUrl: './no-rights.component.html',\n changeDetection: ChangeDetectionStrategy.Eager,\n styleUrl: './no-rights.component.scss'\n})\nexport class NoRightsComponent implements OnInit {\n protected readonly text = inject(SPINE_MESSAGES).access;\n\n constructor(private viewService: ViewService) {\n // F5 (ou token renovado) com rota liberada → sai daqui pra primeira rota; sem crachá → /blocked.\n watchAccessRecovery('/no-permission');\n }\n\n ngOnInit(): void {\n // /no-permission fica fora da árvore guardada pelo ViewGuard (não tem\n // canActivate), então logControl$/breadCrumb$ nunca são atualizados ao\n // chegar aqui — sem isso, sidebar e breadcrumb continuam mostrando o\n // menu/trilha da última rota válida por baixo da tela de sem-permissão.\n this.viewService.updateBreadcrumb([{}]);\n }\n}\n","<!-- Página pronta do hermes (`hm-state-page`, tipo \"no-rights\"). Sem botão: quem chega aqui não tem\n nenhuma página liberada, então \"ir para o início\" só voltaria pra cá. -->\n<hm-state-page\n kind=\"no-rights\"\n [description]=\"text.noRightsText\"\n action=\"\"\n/>\n","import { ChangeDetectionStrategy, Component, OnInit, inject } from '@angular/core';\nimport { ViewService } from '@orfeu/angular/core';\nimport { StatePageComponent } from '@trismegisto/angular';\nimport { SPINE_MESSAGES } from '@trismegisto/spine';\nimport { SpineLogoutService } from '@trismegisto/spine/layout';\nimport { NotificationComponent } from '@trismegisto/spine/notification';\nimport { watchAccessRecovery } from '../access-recovery';\n\n/**\n * \"Acesso bloqueado\" (`/blocked`): a pessoa entrou, mas não faz parte de nenhum grupo vinculado a\n * esta aplicação — o `ViewGuard` manda pra cá quando o token vem sem nenhum crachá (`badges`\n * vazio), mesmo que o app tenha rotas públicas.\n *\n * Diferente de `/no-permission` (tem grupo, mas nenhuma rota liberada). A única ação útil aqui é\n * sair — pra entrar com outra conta, ou depois que o administrador incluir a pessoa num grupo.\n */\n@Component({\n selector: 'blocked',\n imports: [StatePageComponent, NotificationComponent],\n template: `\n <main class=\"blocked\">\n <hm-state-page\n kind=\"blocked\"\n [description]=\"text.blockedText\"\n [action]=\"text.blockedAction\"\n actionIcon=\"logout\"\n (actionTriggered)=\"logout()\"\n />\n </main>\n <!-- Fora do layout: o aviso de falha do logout precisa de onde aparecer. -->\n <spine-notification />\n `,\n // Tela cheia, fora do layout (rota pública com PrivateGuard): ocupa a janela, como o /logoff.\n styles: [`.blocked { display: flex; min-block-size: 100dvh; flex-direction: column; background: var(--hm-surface); }`],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class BlockedComponent implements OnInit {\n protected readonly text = inject(SPINE_MESSAGES).access;\n private readonly viewService = inject(ViewService);\n\n constructor() {\n // F5 (ou token renovado) já com grupo no app → sai daqui pra primeira rota (ou /no-permission).\n watchAccessRecovery('/blocked');\n }\n\n ngOnInit(): void {\n // Zera a trilha da última rota válida (mesmo motivo do NoRightsComponent), pra quem voltar ao\n // layout depois não herdar o breadcrumb de antes do bloqueio.\n this.viewService.updateBreadcrumb([{}]);\n }\n\n private readonly logoutService = inject(SpineLogoutService);\n\n /** Com falha no Argos, a pessoa fica aqui, com o aviso de erro. */\n protected logout(): void {\n void this.logoutService.logout();\n }\n}\n","import { Component, ChangeDetectionStrategy } from '@angular/core';\n\n@Component({\n selector: 'loading-page',\n imports: [],\n templateUrl: './loading-page.component.html',\n changeDetection: ChangeDetectionStrategy.Eager,\n styleUrl: './loading-page.component.scss'\n})\nexport class LoadingPageComponent {}\n","<p>loading-page works!</p>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"trismegisto-spine-shell.mjs","sources":["../../../projects/ui/shell/src/tokens.ts","../../../projects/ui/shell/src/empty-route.component.ts","../../../projects/ui/shell/src/private.routes.ts","../../../projects/ui/shell/src/public/callback.component.ts","../../../projects/ui/shell/src/public/loggedout/loggedout.component.ts","../../../projects/ui/shell/src/public/loggedout/loggedout.component.html","../../../projects/ui/shell/src/public/login.component.ts","../../../projects/ui/shell/src/public.routes.ts","../../../projects/ui/shell/src/app.routes.ts","../../../projects/ui/shell/src/base-components.ts","../../../projects/ui/shell/src/provide-shell.ts","../../../projects/ui/shell/src/templates/access-recovery.ts","../../../projects/ui/shell/src/templates/no-rights/no-rights.component.ts","../../../projects/ui/shell/src/templates/no-rights/no-rights.component.html","../../../projects/ui/shell/src/templates/blocked/blocked.component.ts","../../../projects/ui/shell/src/templates/loading-page/loading-page.component.ts","../../../projects/ui/shell/src/templates/loading-page/loading-page.component.html","../../../projects/ui/shell/src/trismegisto-spine-shell.ts"],"sourcesContent":["// Movido para o pacote raiz (ver package-info.token.ts) — reexportado aqui para não quebrar\n// quem importa `APP_PACKAGE_INFO`/`PackageInfo` de '@trismegisto/spine/shell'.\nexport { APP_PACKAGE_INFO, type PackageInfo } from '@trismegisto/spine';\n","import { ChangeDetectionStrategy, Component } from '@angular/core';\n\n/**\n * Componente vazio pra rota `**` (ver `private.routes.ts`) — o Angular Router EXIGE\n * `component`/`loadComponent`/`redirectTo`/`children`/`loadChildren` em toda rota (`NG04014` se\n * nenhum for dado), mas quem desenha o conteúdo aqui é o `hm-workspace`\n * (`SpinePagePanelComponent`, resolvido por `resolveSpineRoute`, sem passar pelo `Router`), não um\n * `<router-outlet>`. Este componente só satisfaz a validação do Router — nunca renderiza nada de\n * visível (o `<router-outlet>` real que sobra em `LayoutComponent` fica escondido via `[hidden]`\n * sempre que a rota ativa não é `/no-permission`, a única com conteúdo de verdade).\n */\n@Component({\n selector: 'spine-empty-route',\n template: '',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class EmptyRouteComponent {}\n","import { Routes } from '@angular/router';\nimport { ViewGuard } from '@trismegisto/spine/routing';\nimport { EmptyRouteComponent } from './empty-route.component';\n\n/**\n * Quem desenha o conteúdo agora é o `hm-workspace` (ver `LayoutComponent`/\n * `layout/src/workspace/`), nunca um `<router-outlet>` aninhado — a árvore de 6 níveis\n * (header/navigation/menu/item/submenu/page) que existia aqui foi substituída por\n * `resolveSpineRoute`, chamada por painel. Estas rotas só precisam existir pro `Router` real\n * \"reconhecer\" a URL (deep link, F5, `router.navigateByUrl` do painel focado) e pro `ViewGuard`\n * confirmar que ela resolve contra a view atual antes do painel tentar renderizá-la — `component`\n * é só `EmptyRouteComponent` (o Angular exige um dos cinco em toda rota, `NG04014` senão; o\n * `<router-outlet>` que o recebe fica escondido, ver `LayoutComponent`).\n */\nexport const PRIVATE_ROUTES: Routes = [\n {\n path: 'no-permission',\n loadComponent: () => import('./templates/no-rights/no-rights.component').then(m => m.NoRightsComponent),\n },\n { path: '', pathMatch: 'full', redirectTo: 'home' },\n { path: '**', canActivate: [ViewGuard], component: EmptyRouteComponent },\n];\n","import { ChangeDetectionStrategy, Component, inject, signal } from '@angular/core';\nimport { ActivatedRoute, Router } from '@angular/router';\nimport { AuthorizationService } from '@orfeu/angular/core';\nimport { StatePageComponent } from '@trismegisto/angular';\nimport { SPINE_MESSAGES } from '@trismegisto/spine';\nimport { SpineAccountPreferencesService, SpineStartPageService } from '@trismegisto/spine/layout';\n\n/** Chave do `@orfeu/angular` com a URL pedida antes do login (documentada no MIGRATION da lib). */\nconst RETURN_URL_KEY = 'orfeu_return_url';\n\n/**\n * Rota de retorno do Argos (`/callback?code&state` ou `?error`). Tudo passa pelo `handleCallback()` do\n * `@orfeu/angular`, que confere state e verifier, troca o code e navega para a URL pedida antes do login\n * (ou para a 1ª rota do `/view`).\n *\n * - `?error=login_required` (e afins) da reautorização silenciosa (`prompt=none`): o próprio\n * `handleCallback()` segue para o login interativo, mantendo a URL de retorno — a pessoa não fica parada aqui.\n * - Callback inválido (state/nonce divergente, `?error`, sem code): NUNCA desloga. Com uma sessão viva\n * (callback repetido, voltar do navegador), segue para a URL de retorno; sem sessão, mostra a página de\n * erro com \"Entrar novamente\".\n */\n@Component({\n selector: 'app-callback',\n imports: [StatePageComponent],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n @if (failed()) {\n <main class=\"callback\">\n <hm-state-page\n kind=\"error\"\n [heading]=\"text.callbackFailedHeading\"\n [description]=\"text.callbackFailedText\"\n [action]=\"text.signInAgain\"\n actionIcon=\"login\"\n (actionTriggered)=\"signIn()\"\n />\n </main>\n }\n `,\n styles: [`.callback { display: flex; min-block-size: 100dvh; flex-direction: column; background: var(--hm-surface); }`],\n})\nexport class CallbackComponent {\n protected readonly text = inject(SPINE_MESSAGES).session;\n private readonly route = inject(ActivatedRoute);\n private readonly router = inject(Router);\n private readonly auth = inject(AuthorizationService);\n private readonly startPage = inject(SpineStartPageService);\n private readonly accountPreferences = inject(SpineAccountPreferencesService);\n\n /** `true` quando o callback falhou e não há sessão para onde voltar. */\n protected readonly failed = signal(false);\n /** Promessa do tratamento em andamento (exposta para os testes aguardarem). */\n readonly done: Promise<void>;\n\n constructor() {\n this.done = this.handle();\n }\n\n private async handle(): Promise<void> {\n const q = this.route.snapshot.queryParamMap;\n const returnUrl = readReturnUrl();\n try {\n await this.auth.handleCallback({\n code: q.get('code') ?? undefined,\n state: q.get('state') ?? undefined,\n error: q.get('error') ?? undefined,\n error_description: q.get('error_description') ?? undefined,\n });\n await this.goToStartPage(returnUrl);\n } catch (e) {\n console.warn('[hermes-spine] callback de login recusado:', e);\n if (this.auth.authenticated) {\n // Sessão viva (de outra aba ou anterior): segue para onde a pessoa ia, sem tocar na sessão.\n await this.router.navigateByUrl(returnUrl ?? '/');\n return;\n }\n this.failed.set(true);\n }\n }\n\n /**\n * Tela inicial (`SpineFeatures.startPage`): sem URL pedida antes do login, abre o favorito ou a última tela\n * escolhidos em Configurações › Conta. Com as preferências na conta, espera a conta responder (até 2 s), para\n * valer a escolha feita em outro navegador.\n */\n private async goToStartPage(returnUrl: string | null): Promise<void> {\n if (!this.startPage.enabled || !this.auth.authenticated || !SpineStartPageService.isDefaultReturn(returnUrl)) return;\n await this.accountPreferences.ready();\n const target = this.startPage.target();\n if (target) await this.router.navigateByUrl(target, { replaceUrl: true });\n }\n\n protected signIn(): void {\n void this.auth.authorize(readReturnUrl() ?? undefined);\n }\n}\n\nfunction readReturnUrl(): string | null {\n try {\n const url = globalThis.sessionStorage?.getItem(RETURN_URL_KEY) ?? null;\n return url && url.startsWith('/') && !url.startsWith('//') ? url : null;\n } catch {\n return null;\n }\n}\n","import { Component, ChangeDetectionStrategy } from '@angular/core';\nimport { AuthorizationService } from '@orfeu/angular/core';\nimport { StatePageComponent } from '@trismegisto/angular';\n\n@Component({\n selector: 'loggedout',\n imports: [StatePageComponent],\n templateUrl: './loggedout.component.html',\n changeDetection: ChangeDetectionStrategy.Eager,\n styleUrl: './loggedout.component.scss'\n})\nexport class LoggedOutComponent {\n constructor(private authorizationService: AuthorizationService) {}\n goToLogin() { this.authorizationService.authorize(); }\n}\n","<!-- Tela pública (fora do layout): ocupa a janela inteira. Página pronta do hermes, tipo \"logged-out\". -->\n<main class=\"loggedout\">\n <hm-state-page kind=\"logged-out\" (actionTriggered)=\"goToLogin()\" />\n</main>\n","import { Component, OnInit, ChangeDetectionStrategy } from '@angular/core';\nimport { Router } from '@angular/router';\nimport { AuthorizationService, ViewService } from '@orfeu/angular/core';\n\n@Component({\n selector: 'app-login',\n imports: [],\n changeDetection: ChangeDetectionStrategy.Eager,\n template: ``\n})\nexport class LoginComponent implements OnInit {\n constructor(\n private router: Router,\n private auth: AuthorizationService,\n private view: ViewService\n ) {}\n\n ngOnInit(): void { this.bootstrap(); }\n\n async bootstrap() {\n await this.auth.reauthorize();\n if (this.auth.authenticated) {\n const views = await this.view.update(this.auth.getToken());\n const firstRoute = this.findFirstNavigable(views?.routes || []);\n // Sem grupo nenhum no app (token sem crachá) vence \"sem rota\": ver ViewGuard.\n if (!this.auth.badges.length) this.router.navigate(['/blocked']);\n else this.router.navigate([firstRoute ?? '/no-permission']);\n }\n }\n\n /** Primeira rota navegável (DFS), atravessando grupos \"transparentes\" sem route_redirect. */\n private findFirstNavigable(routes: any[]): string | null {\n for (const r of routes || []) {\n if (!r) continue;\n if (r.route_redirect) return r.route_redirect;\n if (r.routes?.length) {\n const found = this.findFirstNavigable(r.routes);\n if (found) return found;\n }\n }\n return null;\n }\n}\n","import { Routes } from '@angular/router';\nimport { PrivateGuard } from '@orfeu/angular/core';\nimport { CallbackComponent } from './public/callback.component';\nimport { LoggedOutComponent } from './public/loggedout/loggedout.component';\nimport { LoginComponent } from './public/login.component';\n\nexport const PUBLIC_ROUTES: Routes = [\n { path: 'login', component: LoginComponent },\n { path: 'callback', component: CallbackComponent },\n { path: 'logoff', component: LoggedOutComponent },\n // Sem nenhum grupo vinculado ao app (ver `ViewGuard`): tela cheia, FORA do layout — sem\n // header nem sidebar, só a informação. Aqui (e não nas privadas) justamente pra não montar o\n // `LayoutComponent`; o `PrivateGuard` garante que só chega quem está autenticado.\n {\n path: 'blocked',\n canActivate: [PrivateGuard],\n loadComponent: () => import('./templates/blocked/blocked.component').then(m => m.BlockedComponent),\n },\n { path: '', redirectTo: 'login', pathMatch: 'full' },\n];\n","import { Routes } from '@angular/router';\nimport { PrivateGuard } from '@orfeu/angular/core';\nimport { LayoutComponent } from '@trismegisto/spine/layout';\nimport { PRIVATE_ROUTES } from './private.routes';\nimport { PUBLIC_ROUTES } from './public.routes';\n\nexport const APP_ROUTES: Routes = [\n ...PUBLIC_ROUTES,\n {\n path: '',\n component: LayoutComponent,\n canActivate: [PrivateGuard],\n canActivateChild: [PrivateGuard],\n children: PRIVATE_ROUTES,\n },\n { path: '**', redirectTo: '' },\n];\n","import { ComponentRoute } from '@trismegisto/spine/routing';\n\n/**\n * Componentes que o próprio shell traz, ligados pelo `router_id` (web.router) da árvore de rotas do argos.\n *\n * As telas do antigo módulo \"Sistema\" (Sobre › Recursos/Informações; Preferências › Geral,\n * Autenticação, Exibição, Notificações) saíram em 2026-09-29: viraram o painel de configurações\n * (`@trismegisto/spine/layout` › `SettingsPanelComponent`, menu do perfil ou Ctrl+,). Os router_ids delas\n * (d6a30f9c, 86b87583, 2d71fb9b, 48ebca20, 662a7a61, e7d9982b, bf8a9f69) não têm mais componente —\n * o módulo precisa sair da árvore de rotas no seed do argos.\n *\n * O Início (`HomeComponent`) mudou pra `@trismegisto/spine/auto-service` -- ver a entrada legada abaixo.\n */\nexport const BASE_COMPONENTS: ComponentRoute[] = [\n {\n // LEGADO: o Início agora vem do template Auto-Serviço (`provideAutoService`, casando por\n // source_template_router_id). Esta entrada só cobre o Início do Hefesto em banco cujo router\n // (b06c2784) ainda não aponta pro template -- remover quando todos os ambientes tiverem.\n id: 'b06c2784-eb29-4747-b118-53687c382cf7',\n load: async () => (await import('@trismegisto/spine/auto-service')).AUTO_SERVICE_SCREENS.home(),\n },\n];\n","import { EnvironmentProviders, makeEnvironmentProviders } from '@angular/core';\nimport { HTTP_INTERCEPTORS } from '@angular/common/http';\nimport { COMPONENT_ROUTES, ComponentRoute, RouteIdInterceptor, componentRouterId } from '@trismegisto/spine/routing';\nimport { BASE_COMPONENTS } from './base-components';\nimport { APP_PACKAGE_INFO, PackageInfo } from './tokens';\n\nexport interface ShellOptions {\n appComponents?: ComponentRoute[];\n packageInfo?: PackageInfo;\n}\n\nexport function provideShell(options: ShellOptions = {}): EnvironmentProviders {\n const appComponents = options.appComponents ?? [];\n const baseIds = new Set(BASE_COMPONENTS.map(componentRouterId));\n const conflicts = appComponents.filter(c => componentRouterId(c) && baseIds.has(componentRouterId(c)));\n\n if (conflicts.length > 0) {\n throw new Error(\n `[hermes-spine] provideShell: router_ids em conflito com BASE_COMPONENTS: ${conflicts.map(componentRouterId).join(', ')}`\n );\n }\n\n // multi: true -- este provider é só UMA das fontes de COMPONENT_ROUTES (a do próprio\n // app + os componentes base do shell). Pacotes plugáveis (ex.: provideAutoService)\n // contribuem com os deles via outro provider do mesmo token, combinados no\n // ComponentDistributorService -- nunca use { provide: COMPONENT_ROUTES, useValue: ... }\n // sem multi: true em outro lugar, ou o Angular lança erro de provider inconsistente.\n return makeEnvironmentProviders([\n { provide: COMPONENT_ROUTES, useValue: [...BASE_COMPONENTS, ...appComponents], multi: true },\n { provide: HTTP_INTERCEPTORS, useClass: RouteIdInterceptor, multi: true },\n ...(options.packageInfo ? [{ provide: APP_PACKAGE_INFO, useValue: options.packageInfo }] : []),\n ]);\n}\n","import { DestroyRef, inject } from '@angular/core';\nimport { Router } from '@angular/router';\nimport { AuthorizationService, ViewService } from '@orfeu/angular/core';\nimport { Route, spineRoutesOf } from '@trismegisto/spine';\nimport { findFirstNavigable } from '@trismegisto/spine/routing';\n\n/**\n * As telas de acesso (`/blocked` e `/no-permission`) saem sozinhas quando a situação muda — no F5\n * (o token e a view são refeitos na inicialização) ou com a tela aberta (renovação do token, troca\n * de crachá): quem ganhou grupo/permissão não fica preso numa tela que já não vale.\n *\n * Mesma decisão do `ViewGuard`/login, na mesma ordem:\n * - sem crachá nenhum no app (token sem `badges`) → `/blocked`;\n * - com crachá, mas a view sem rota → `/no-permission`;\n * - com rota → a primeira navegável.\n *\n * Só redireciona quando o destino é OUTRO que a tela atual, e com `replaceUrl`: voltar no navegador\n * não devolve pra tela de bloqueio que já não se aplica.\n *\n * Chamar no construtor (contexto de injeção) da tela.\n */\nexport function watchAccessRecovery(current: '/blocked' | '/no-permission'): void {\n const router = inject(Router);\n const auth = inject(AuthorizationService);\n const viewService = inject(ViewService);\n\n const check = (view: { routes?: Route[] | null } | null | undefined): void => {\n // Sem sessão (ainda) não há o que decidir: quem cuida disso é o PrivateGuard/login.\n if (!auth.authenticated || !view) return;\n const target = !auth.badges.length\n ? '/blocked'\n : (findFirstNavigable(spineRoutesOf(view)) ?? '/no-permission');\n if (target !== current) void router.navigateByUrl(target, { replaceUrl: true });\n };\n\n // O valor atual primeiro (F5 com o token já renovado pelo initialize()) e depois cada atualização\n // da view — ela é sempre refeita depois do token (`view.update`), então o crachá lido aqui já é o novo.\n check(viewService.currentView as any);\n const sub = viewService.currentView$.subscribe((view: any) => check(view));\n inject(DestroyRef).onDestroy(() => sub.unsubscribe());\n}\n","import { Component, OnInit, ChangeDetectionStrategy, inject } from '@angular/core';\nimport { ViewService } from '@orfeu/angular/core';\nimport { StatePageComponent } from '@trismegisto/angular';\nimport { SPINE_MESSAGES } from '@trismegisto/spine';\nimport { watchAccessRecovery } from '../access-recovery';\n\n@Component({\n selector: 'no-rights',\n imports: [StatePageComponent],\n templateUrl: './no-rights.component.html',\n changeDetection: ChangeDetectionStrategy.Eager,\n styleUrl: './no-rights.component.scss'\n})\nexport class NoRightsComponent implements OnInit {\n protected readonly text = inject(SPINE_MESSAGES).access;\n\n constructor(private viewService: ViewService) {\n // F5 (ou token renovado) com rota liberada → sai daqui pra primeira rota; sem crachá → /blocked.\n watchAccessRecovery('/no-permission');\n }\n\n ngOnInit(): void {\n // /no-permission fica fora da árvore guardada pelo ViewGuard (não tem\n // canActivate), então logControl$/breadCrumb$ nunca são atualizados ao\n // chegar aqui — sem isso, sidebar e breadcrumb continuam mostrando o\n // menu/trilha da última rota válida por baixo da tela de sem-permissão.\n this.viewService.updateBreadcrumb([{}]);\n }\n}\n","<!-- Página pronta do hermes (`hm-state-page`, tipo \"no-rights\"). Sem botão: quem chega aqui não tem\n nenhuma página liberada, então \"ir para o início\" só voltaria pra cá. -->\n<hm-state-page\n kind=\"no-rights\"\n [description]=\"text.noRightsText\"\n action=\"\"\n/>\n","import { ChangeDetectionStrategy, Component, OnInit, inject } from '@angular/core';\nimport { ViewService } from '@orfeu/angular/core';\nimport { StatePageComponent, ToastStackComponent } from '@trismegisto/angular';\nimport { SPINE_MESSAGES } from '@trismegisto/spine';\nimport { SpineLogoutService } from '@trismegisto/spine/layout';\nimport { watchAccessRecovery } from '../access-recovery';\n\n/**\n * \"Acesso bloqueado\" (`/blocked`): a pessoa entrou, mas não faz parte de nenhum grupo vinculado a\n * esta aplicação — o `ViewGuard` manda pra cá quando o token vem sem nenhum crachá (`badges`\n * vazio), mesmo que o app tenha rotas públicas.\n *\n * Diferente de `/no-permission` (tem grupo, mas nenhuma rota liberada). A única ação útil aqui é\n * sair — pra entrar com outra conta, ou depois que o administrador incluir a pessoa num grupo.\n */\n@Component({\n selector: 'blocked',\n imports: [StatePageComponent, ToastStackComponent],\n template: `\n <main class=\"blocked\">\n <hm-state-page\n kind=\"blocked\"\n [description]=\"text.blockedText\"\n [action]=\"text.blockedAction\"\n actionIcon=\"logout\"\n (actionTriggered)=\"logout()\"\n />\n </main>\n <!-- Fora do layout: o aviso de falha do logout precisa de onde aparecer. -->\n <hm-toast-stack />\n `,\n // Tela cheia, fora do layout (rota pública com PrivateGuard): ocupa a janela, como o /logoff.\n styles: [`.blocked { display: flex; min-block-size: 100dvh; flex-direction: column; background: var(--hm-surface); }`],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class BlockedComponent implements OnInit {\n protected readonly text = inject(SPINE_MESSAGES).access;\n private readonly viewService = inject(ViewService);\n\n constructor() {\n // F5 (ou token renovado) já com grupo no app → sai daqui pra primeira rota (ou /no-permission).\n watchAccessRecovery('/blocked');\n }\n\n ngOnInit(): void {\n // Zera a trilha da última rota válida (mesmo motivo do NoRightsComponent), pra quem voltar ao\n // layout depois não herdar o breadcrumb de antes do bloqueio.\n this.viewService.updateBreadcrumb([{}]);\n }\n\n private readonly logoutService = inject(SpineLogoutService);\n\n /** Com falha no Argos, a pessoa fica aqui, com o aviso de erro. */\n protected logout(): void {\n void this.logoutService.logout();\n }\n}\n","import { Component, ChangeDetectionStrategy } from '@angular/core';\n\n@Component({\n selector: 'loading-page',\n imports: [],\n templateUrl: './loading-page.component.html',\n changeDetection: ChangeDetectionStrategy.Eager,\n styleUrl: './loading-page.component.scss'\n})\nexport class LoadingPageComponent {}\n","<p>loading-page works!</p>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1"],"mappings":"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"}
|
|
@@ -1267,6 +1267,11 @@ const SPINE_MESSAGES_PT_BR = {
|
|
|
1267
1267
|
appTokensDescription: 'Para usar a aplicação fora da interface: um MCP, um script.',
|
|
1268
1268
|
appTokensKeywords: 'token app mcp api chave pat x-app-token automação script integração',
|
|
1269
1269
|
appTokensHelp: 'O token vale só para esta aplicação, com as permissões do nível de acesso escolhido, e expira em no máximo 1 ano. Envie no cabeçalho x-app-token.',
|
|
1270
|
+
groups: 'Grupos',
|
|
1271
|
+
groupsDescription: 'Os grupos desta aplicação de que você participa. Escolha um para ver os membros.',
|
|
1272
|
+
groupsKeywords: 'grupo grupos membros equipe pessoas função administrador editor membro incluir remover acesso',
|
|
1273
|
+
groupRole: 'Sua função: {role} · Crachá: {badge}',
|
|
1274
|
+
groupRoleDisabled: 'Sua função: {role} · Grupo desativado',
|
|
1270
1275
|
logout: 'Sair',
|
|
1271
1276
|
logoutDescription: 'Encerra a sessão neste navegador.',
|
|
1272
1277
|
logoutKeywords: 'logout desconectar',
|
|
@@ -1364,6 +1369,41 @@ const SPINE_MESSAGES_PT_BR = {
|
|
|
1364
1369
|
revoked: 'Token "{name}" revogado. Pode levar até 2 minutos para parar de funcionar em todos os sistemas.',
|
|
1365
1370
|
revokeError: 'Não foi possível revogar o token.',
|
|
1366
1371
|
},
|
|
1372
|
+
myGroups: {
|
|
1373
|
+
loading: 'Carregando…',
|
|
1374
|
+
loadError: 'Não foi possível carregar os membros do grupo.',
|
|
1375
|
+
roleAdministrator: 'Administrador',
|
|
1376
|
+
roleEditor: 'Editor',
|
|
1377
|
+
roleMember: 'Membro',
|
|
1378
|
+
listLabel: 'Seus grupos',
|
|
1379
|
+
back: 'Voltar aos grupos',
|
|
1380
|
+
you: 'você',
|
|
1381
|
+
membersCount: { zero: 'Nenhum membro', one: '{count} membro', other: '{count} membros' },
|
|
1382
|
+
empty: 'Nenhum membro neste grupo.',
|
|
1383
|
+
readOnly: 'Como membro, você só vê quem está no grupo.',
|
|
1384
|
+
addMember: 'Incluir membro',
|
|
1385
|
+
addHeading: 'Incluir em {group}',
|
|
1386
|
+
search: 'Pessoa',
|
|
1387
|
+
searchPlaceholder: 'Nome, login ou e-mail',
|
|
1388
|
+
searchHint: 'Digite ao menos 2 letras.',
|
|
1389
|
+
searching: 'Buscando…',
|
|
1390
|
+
noResults: 'Ninguém encontrado.',
|
|
1391
|
+
searchError: 'Não foi possível buscar pessoas.',
|
|
1392
|
+
alreadyMember: 'já é membro',
|
|
1393
|
+
role: 'Função',
|
|
1394
|
+
editorAddsMembers: 'Como Editor, você inclui pessoas como Membro.',
|
|
1395
|
+
add: 'Incluir',
|
|
1396
|
+
cancel: 'Cancelar',
|
|
1397
|
+
added: '{name} entrou no grupo.',
|
|
1398
|
+
addError: 'Não foi possível incluir o membro.',
|
|
1399
|
+
roleOf: 'Função de {name}',
|
|
1400
|
+
roleChanged: 'Função de {name}: {role}.',
|
|
1401
|
+
roleError: 'Não foi possível trocar a função.',
|
|
1402
|
+
remove: 'Remover',
|
|
1403
|
+
confirmRemove: 'Confirmar remoção',
|
|
1404
|
+
removed: '{name} saiu do grupo.',
|
|
1405
|
+
removeError: 'Não foi possível remover o membro.',
|
|
1406
|
+
},
|
|
1367
1407
|
accountSecurity: {
|
|
1368
1408
|
loading: 'Carregando…',
|
|
1369
1409
|
loadError: 'Não foi possível carregar a sua conta no Argos.',
|
|
@@ -1503,7 +1543,7 @@ const SPINE_MESSAGES_PT_BR = {
|
|
|
1503
1543
|
},
|
|
1504
1544
|
home: {
|
|
1505
1545
|
noAccessTitle: 'Você ainda não tem acesso a nenhuma tela',
|
|
1506
|
-
noAccessText: 'O acesso é liberado pelo
|
|
1546
|
+
noAccessText: 'O acesso é liberado pelo administrador da aplicação ou pelo administrador de um grupo com acesso a ela. Se ele já liberou, saia e entre de novo.',
|
|
1507
1547
|
yourScreens: 'Suas telas',
|
|
1508
1548
|
modules: 'Módulos',
|
|
1509
1549
|
privileged: 'Acesso privilegiado',
|
|
@@ -2347,6 +2387,11 @@ const SPINE_MESSAGES_EN = {
|
|
|
2347
2387
|
appTokensDescription: 'To use the application outside the interface: an MCP, a script.',
|
|
2348
2388
|
appTokensKeywords: 'token app mcp api key pat x-app-token automation script integration',
|
|
2349
2389
|
appTokensHelp: 'The token is valid only for this application, with the permissions of the chosen access level, and expires in at most 1 year. Send it in the x-app-token header.',
|
|
2390
|
+
groups: 'Groups',
|
|
2391
|
+
groupsDescription: 'The groups of this application you belong to. Pick one to see its members.',
|
|
2392
|
+
groupsKeywords: 'group groups members team people role administrator editor member add remove access',
|
|
2393
|
+
groupRole: 'Your role: {role} · Badge: {badge}',
|
|
2394
|
+
groupRoleDisabled: 'Your role: {role} · Group disabled',
|
|
2350
2395
|
logout: 'Sign out',
|
|
2351
2396
|
logoutDescription: 'Ends the session in this browser.',
|
|
2352
2397
|
logoutKeywords: 'logout disconnect',
|
|
@@ -2444,6 +2489,41 @@ const SPINE_MESSAGES_EN = {
|
|
|
2444
2489
|
revoked: 'Token "{name}" revoked. It may take up to 2 minutes to stop working in every system.',
|
|
2445
2490
|
revokeError: "Couldn't revoke the token.",
|
|
2446
2491
|
},
|
|
2492
|
+
myGroups: {
|
|
2493
|
+
loading: 'Loading…',
|
|
2494
|
+
loadError: "Couldn't load the group members.",
|
|
2495
|
+
roleAdministrator: 'Administrator',
|
|
2496
|
+
roleEditor: 'Editor',
|
|
2497
|
+
roleMember: 'Member',
|
|
2498
|
+
listLabel: 'Your groups',
|
|
2499
|
+
back: 'Back to groups',
|
|
2500
|
+
you: 'you',
|
|
2501
|
+
membersCount: { zero: 'No members', one: '{count} member', other: '{count} members' },
|
|
2502
|
+
empty: 'No members in this group.',
|
|
2503
|
+
readOnly: 'As a member, you can only see who is in the group.',
|
|
2504
|
+
addMember: 'Add member',
|
|
2505
|
+
addHeading: 'Add to {group}',
|
|
2506
|
+
search: 'Person',
|
|
2507
|
+
searchPlaceholder: 'Name, login or email',
|
|
2508
|
+
searchHint: 'Type at least 2 letters.',
|
|
2509
|
+
searching: 'Searching…',
|
|
2510
|
+
noResults: 'No one found.',
|
|
2511
|
+
searchError: "Couldn't search for people.",
|
|
2512
|
+
alreadyMember: 'already a member',
|
|
2513
|
+
role: 'Role',
|
|
2514
|
+
editorAddsMembers: 'As an Editor, you add people as Members.',
|
|
2515
|
+
add: 'Add',
|
|
2516
|
+
cancel: 'Cancel',
|
|
2517
|
+
added: '{name} joined the group.',
|
|
2518
|
+
addError: "Couldn't add the member.",
|
|
2519
|
+
roleOf: "{name}'s role",
|
|
2520
|
+
roleChanged: "{name}'s role: {role}.",
|
|
2521
|
+
roleError: "Couldn't change the role.",
|
|
2522
|
+
remove: 'Remove',
|
|
2523
|
+
confirmRemove: 'Confirm removal',
|
|
2524
|
+
removed: '{name} left the group.',
|
|
2525
|
+
removeError: "Couldn't remove the member.",
|
|
2526
|
+
},
|
|
2447
2527
|
accountSecurity: {
|
|
2448
2528
|
loading: 'Loading…',
|
|
2449
2529
|
loadError: "Couldn't load your Argos account.",
|
|
@@ -2583,7 +2663,7 @@ const SPINE_MESSAGES_EN = {
|
|
|
2583
2663
|
},
|
|
2584
2664
|
home: {
|
|
2585
2665
|
noAccessTitle: "You don't have access to any screen yet",
|
|
2586
|
-
noAccessText: "Access is granted by
|
|
2666
|
+
noAccessText: "Access is granted by the application's administrator or by the administrator of a group with access to it. If they've already granted it, sign out and sign in again.",
|
|
2587
2667
|
yourScreens: 'Your screens',
|
|
2588
2668
|
modules: 'Modules',
|
|
2589
2669
|
privileged: 'Privileged access',
|
|
@@ -3427,6 +3507,11 @@ const SPINE_MESSAGES_ES = {
|
|
|
3427
3507
|
appTokensDescription: 'Para usar la aplicación fuera de la interfaz: un MCP, un script.',
|
|
3428
3508
|
appTokensKeywords: 'token app mcp api clave pat x-app-token automatización script integración',
|
|
3429
3509
|
appTokensHelp: 'El token vale solo para esta aplicación, con los permisos del nivel de acceso elegido, y vence en como máximo 1 año. Envíalo en el encabezado x-app-token.',
|
|
3510
|
+
groups: 'Grupos',
|
|
3511
|
+
groupsDescription: 'Los grupos de esta aplicación de los que participas. Elige uno para ver los miembros.',
|
|
3512
|
+
groupsKeywords: 'grupo grupos miembros equipo personas función administrador editor miembro incluir quitar acceso',
|
|
3513
|
+
groupRole: 'Tu función: {role} · Credencial: {badge}',
|
|
3514
|
+
groupRoleDisabled: 'Tu función: {role} · Grupo desactivado',
|
|
3430
3515
|
logout: 'Salir',
|
|
3431
3516
|
logoutDescription: 'Cierra la sesión en este navegador.',
|
|
3432
3517
|
logoutKeywords: 'logout desconectar',
|
|
@@ -3524,6 +3609,41 @@ const SPINE_MESSAGES_ES = {
|
|
|
3524
3609
|
revoked: 'Token "{name}" revocado. Puede tardar hasta 2 minutos en dejar de funcionar en todos los sistemas.',
|
|
3525
3610
|
revokeError: 'No se pudo revocar el token.',
|
|
3526
3611
|
},
|
|
3612
|
+
myGroups: {
|
|
3613
|
+
loading: 'Cargando…',
|
|
3614
|
+
loadError: 'No se pudieron cargar los miembros del grupo.',
|
|
3615
|
+
roleAdministrator: 'Administrador',
|
|
3616
|
+
roleEditor: 'Editor',
|
|
3617
|
+
roleMember: 'Miembro',
|
|
3618
|
+
listLabel: 'Tus grupos',
|
|
3619
|
+
back: 'Volver a los grupos',
|
|
3620
|
+
you: 'tú',
|
|
3621
|
+
membersCount: { zero: 'Ningún miembro', one: '{count} miembro', other: '{count} miembros' },
|
|
3622
|
+
empty: 'Ningún miembro en este grupo.',
|
|
3623
|
+
readOnly: 'Como miembro, solo ves quién está en el grupo.',
|
|
3624
|
+
addMember: 'Incluir miembro',
|
|
3625
|
+
addHeading: 'Incluir en {group}',
|
|
3626
|
+
search: 'Persona',
|
|
3627
|
+
searchPlaceholder: 'Nombre, login o correo',
|
|
3628
|
+
searchHint: 'Escribe al menos 2 letras.',
|
|
3629
|
+
searching: 'Buscando…',
|
|
3630
|
+
noResults: 'No se encontró a nadie.',
|
|
3631
|
+
searchError: 'No se pudo buscar personas.',
|
|
3632
|
+
alreadyMember: 'ya es miembro',
|
|
3633
|
+
role: 'Función',
|
|
3634
|
+
editorAddsMembers: 'Como Editor, incluyes personas como Miembro.',
|
|
3635
|
+
add: 'Incluir',
|
|
3636
|
+
cancel: 'Cancelar',
|
|
3637
|
+
added: '{name} entró al grupo.',
|
|
3638
|
+
addError: 'No se pudo incluir el miembro.',
|
|
3639
|
+
roleOf: 'Función de {name}',
|
|
3640
|
+
roleChanged: 'Función de {name}: {role}.',
|
|
3641
|
+
roleError: 'No se pudo cambiar la función.',
|
|
3642
|
+
remove: 'Quitar',
|
|
3643
|
+
confirmRemove: 'Confirmar',
|
|
3644
|
+
removed: '{name} salió del grupo.',
|
|
3645
|
+
removeError: 'No se pudo quitar el miembro.',
|
|
3646
|
+
},
|
|
3527
3647
|
accountSecurity: {
|
|
3528
3648
|
loading: 'Cargando…',
|
|
3529
3649
|
loadError: 'No se pudo cargar tu cuenta de Argos.',
|
|
@@ -3663,7 +3783,7 @@ const SPINE_MESSAGES_ES = {
|
|
|
3663
3783
|
},
|
|
3664
3784
|
home: {
|
|
3665
3785
|
noAccessTitle: 'Todavía no tienes acceso a ninguna pantalla',
|
|
3666
|
-
noAccessText: 'El acceso lo concede el
|
|
3786
|
+
noAccessText: 'El acceso lo concede el administrador de la aplicación o el administrador de un grupo con acceso a ella. Si ya lo concedió, sal y vuelve a entrar.',
|
|
3667
3787
|
yourScreens: 'Tus pantallas',
|
|
3668
3788
|
modules: 'Módulos',
|
|
3669
3789
|
privileged: 'Acceso privilegiado',
|