@trismegisto/spine 3.3.5 → 3.3.6
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 +4 -2
- package/fesm2022/trismegisto-spine-audit.mjs +20 -2
- package/fesm2022/trismegisto-spine-audit.mjs.map +1 -1
- package/fesm2022/{trismegisto-spine-auto-service-auto-service-audit.component-D8HUpZtA.mjs → trismegisto-spine-auto-service-auto-service-audit.component-CszXNvSs.mjs} +2 -2
- package/fesm2022/{trismegisto-spine-auto-service-auto-service-audit.component-D8HUpZtA.mjs.map → trismegisto-spine-auto-service-auto-service-audit.component-CszXNvSs.mjs.map} +1 -1
- package/fesm2022/{trismegisto-spine-auto-service-auto-service-client-picker.component-NawbfdLW.mjs → trismegisto-spine-auto-service-auto-service-client-picker.component-CknHYd_P.mjs} +7 -3
- package/fesm2022/trismegisto-spine-auto-service-auto-service-client-picker.component-CknHYd_P.mjs.map +1 -0
- package/fesm2022/{trismegisto-spine-auto-service-auto-service-client.component-kAXaCM5W.mjs → trismegisto-spine-auto-service-auto-service-client.component-Dg3mJrpz.mjs} +24 -5
- package/fesm2022/trismegisto-spine-auto-service-auto-service-client.component-Dg3mJrpz.mjs.map +1 -0
- package/fesm2022/{trismegisto-spine-auto-service-auto-service-delete-CV_t9vxm.mjs → trismegisto-spine-auto-service-auto-service-delete-BWY5G-xe.mjs} +2 -2
- package/fesm2022/trismegisto-spine-auto-service-auto-service-delete-BWY5G-xe.mjs.map +1 -0
- package/fesm2022/{trismegisto-spine-auto-service-auto-service-groups.component-DE2QIGRH.mjs → trismegisto-spine-auto-service-auto-service-groups.component-DQqzfq0M.mjs} +21 -5
- package/fesm2022/trismegisto-spine-auto-service-auto-service-groups.component-DQqzfq0M.mjs.map +1 -0
- package/fesm2022/{trismegisto-spine-auto-service-auto-service-login-attempts.component-DoyhkSYc.mjs → trismegisto-spine-auto-service-auto-service-login-attempts.component-CjxKYv-y.mjs} +2 -2
- package/fesm2022/{trismegisto-spine-auto-service-auto-service-login-attempts.component-DoyhkSYc.mjs.map → trismegisto-spine-auto-service-auto-service-login-attempts.component-CjxKYv-y.mjs.map} +1 -1
- package/fesm2022/{trismegisto-spine-auto-service-auto-service-news-page.component-BW7BJ0oD.mjs → trismegisto-spine-auto-service-auto-service-news-page.component-Cbaszx4F.mjs} +21 -5
- package/fesm2022/trismegisto-spine-auto-service-auto-service-news-page.component-Cbaszx4F.mjs.map +1 -0
- package/fesm2022/{trismegisto-spine-auto-service-auto-service-ratings-page.component-CHPU-QLJ.mjs → trismegisto-spine-auto-service-auto-service-ratings-page.component-CJRIDWXi.mjs} +22 -4
- package/fesm2022/trismegisto-spine-auto-service-auto-service-ratings-page.component-CJRIDWXi.mjs.map +1 -0
- package/fesm2022/{trismegisto-spine-auto-service-auto-service-suggestions-page.component-CkiCTmXD.mjs → trismegisto-spine-auto-service-auto-service-suggestions-page.component-Bu8YX554.mjs} +46 -4
- package/fesm2022/trismegisto-spine-auto-service-auto-service-suggestions-page.component-Bu8YX554.mjs.map +1 -0
- package/fesm2022/{trismegisto-spine-auto-service-auto-service.component-D58Ht9PH.mjs → trismegisto-spine-auto-service-auto-service.component-BLkLHp6J.mjs} +23 -5
- package/fesm2022/trismegisto-spine-auto-service-auto-service.component-BLkLHp6J.mjs.map +1 -0
- package/fesm2022/{trismegisto-spine-auto-service-home.component-9WvXOH3l.mjs → trismegisto-spine-auto-service-home.component-BYMiTZp6.mjs} +6 -3
- package/fesm2022/trismegisto-spine-auto-service-home.component-BYMiTZp6.mjs.map +1 -0
- package/fesm2022/trismegisto-spine-auto-service.mjs +10 -10
- package/fesm2022/trismegisto-spine-auto-service.mjs.map +1 -1
- package/fesm2022/trismegisto-spine-layout-ai-agent-chat.component-C5JljPYD.mjs +294 -0
- package/fesm2022/trismegisto-spine-layout-ai-agent-chat.component-C5JljPYD.mjs.map +1 -0
- package/fesm2022/{trismegisto-spine-layout-suggestions-page.component-CEKMqera.mjs → trismegisto-spine-layout-suggestions-page.component-Bh3VGlOR.mjs} +18 -4
- package/fesm2022/trismegisto-spine-layout-suggestions-page.component-Bh3VGlOR.mjs.map +1 -0
- package/fesm2022/{trismegisto-spine-layout-trismegisto-spine-layout-DiAfxIGP.mjs → trismegisto-spine-layout-trismegisto-spine-layout-B47sMo_4.mjs} +1012 -57
- package/fesm2022/trismegisto-spine-layout-trismegisto-spine-layout-B47sMo_4.mjs.map +1 -0
- package/fesm2022/trismegisto-spine-layout.mjs +1 -1
- package/fesm2022/trismegisto-spine-modal.mjs +4 -1
- package/fesm2022/trismegisto-spine-modal.mjs.map +1 -1
- package/fesm2022/trismegisto-spine-notification.mjs +1 -1
- package/fesm2022/trismegisto-spine-notification.mjs.map +1 -1
- package/fesm2022/trismegisto-spine-routing.mjs +2 -2
- package/fesm2022/trismegisto-spine-routing.mjs.map +1 -1
- package/fesm2022/trismegisto-spine-shell.mjs +2 -1
- package/fesm2022/trismegisto-spine-shell.mjs.map +1 -1
- package/fesm2022/trismegisto-spine-side-panel.mjs +4 -1
- package/fesm2022/trismegisto-spine-side-panel.mjs.map +1 -1
- package/fesm2022/trismegisto-spine.mjs +200 -69
- package/fesm2022/trismegisto-spine.mjs.map +1 -1
- package/package.json +6 -6
- package/types/trismegisto-spine-audit.d.ts +11 -4
- package/types/trismegisto-spine-audit.d.ts.map +1 -1
- package/types/trismegisto-spine-auto-service.d.ts.map +1 -1
- package/types/trismegisto-spine-layout.d.ts +124 -105
- package/types/trismegisto-spine-layout.d.ts.map +1 -1
- package/types/trismegisto-spine-modal.d.ts +2 -1
- package/types/trismegisto-spine-modal.d.ts.map +1 -1
- package/types/trismegisto-spine-shell.d.ts.map +1 -1
- package/types/trismegisto-spine-side-panel.d.ts +2 -1
- package/types/trismegisto-spine-side-panel.d.ts.map +1 -1
- package/types/trismegisto-spine.d.ts +104 -28
- package/types/trismegisto-spine.d.ts.map +1 -1
- package/fesm2022/trismegisto-spine-auto-service-auto-service-client-picker.component-NawbfdLW.mjs.map +0 -1
- package/fesm2022/trismegisto-spine-auto-service-auto-service-client.component-kAXaCM5W.mjs.map +0 -1
- package/fesm2022/trismegisto-spine-auto-service-auto-service-delete-CV_t9vxm.mjs.map +0 -1
- package/fesm2022/trismegisto-spine-auto-service-auto-service-groups.component-DE2QIGRH.mjs.map +0 -1
- package/fesm2022/trismegisto-spine-auto-service-auto-service-news-page.component-BW7BJ0oD.mjs.map +0 -1
- package/fesm2022/trismegisto-spine-auto-service-auto-service-ratings-page.component-CHPU-QLJ.mjs.map +0 -1
- package/fesm2022/trismegisto-spine-auto-service-auto-service-suggestions-page.component-CkiCTmXD.mjs.map +0 -1
- package/fesm2022/trismegisto-spine-auto-service-auto-service.component-D58Ht9PH.mjs.map +0 -1
- package/fesm2022/trismegisto-spine-auto-service-home.component-9WvXOH3l.mjs.map +0 -1
- package/fesm2022/trismegisto-spine-layout-suggestions-page.component-CEKMqera.mjs.map +0 -1
- package/fesm2022/trismegisto-spine-layout-trismegisto-spine-layout-DiAfxIGP.mjs.map +0 -1
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export { A as
|
|
1
|
+
export { A as AppLauncherComponent, H as HeaderComponent, L as LayoutComponent, M as McpConnectComponent, N as NEW_SCREEN_VALUE, x as SPINE_BRAND, y as SPINE_GLOBAL_PREFERENCE_KEYS, z as SPINE_IDLE_WARNING_SECONDS, B as SPINE_INBOX_POLL_MS, C as SPINE_INBOX_SOURCES, D as SPINE_MARKDOWN_PURIFY_CONFIG, E as SPINE_PREFERENCES_SAVE_DELAY_MS, F as SPINE_RATING_COMMENT_MAX, G as SPINE_RATING_SCORE_MAX, I as SPINE_SETTINGS_ALIASES, J as SPINE_SETTINGS_KEYS, K as SPINE_SETTINGS_SECTIONS, O as SPINE_SUGGESTIONS_PAGE_ID, r as SPINE_SUGGESTIONS_PAGE_PATH, j as SPINE_SUGGESTION_KINDS, d as SPINE_SUGGESTION_KIND_COLORS, e as SPINE_SUGGESTION_KIND_ICONS, P as SPINE_SUGGESTION_LIMITS, m as SPINE_SUGGESTION_PAGE_PARAM, Q as SPINE_SUGGESTION_PUBLIC_SORTS, R as SPINE_SUGGESTION_PUBLIC_STATUSES, h as SPINE_SUGGESTION_REASONS, i as SPINE_SUGGESTION_STATUSES, c as SPINE_SUGGESTION_STATUS_COLORS, T as SPINE_SUGGESTION_STATUS_ICONS, o as SPINE_SUGGESTION_TAB_CONVERSATION, n as SPINE_SUGGESTION_TAB_PARAM, g as SPINE_SUGGESTION_VISIBLE_SORTS, k as SPINE_SUGGESTION_WAITING, f as SPINE_SUGGESTION_WAITING_COLORS, l as SPINE_TAB, U as SPINE_WORKSPACE_LIMITS, V as SettingsPanelComponent, W as ShortcutService, X as ShortcutsCheatsheetComponent, Y as SidebarComponent, Z as SpineAccountPreferencesService, _ as SpineAccountSecurityService, $ as SpineAppTokensService, a0 as SpineBrandComponent, a1 as SpineConnectionBannerComponent, a2 as SpineDocsComponent, a3 as SpineDocsService, a4 as SpineIdleService, a5 as SpineIdleWarningComponent, a6 as SpineInboxButtonComponent, a as SpineInboxService, a7 as SpineInitialSetupComponent, a8 as SpineInitialSetupService, a9 as SpineLogoutService, w as SpineMarkdownComponent, aa as SpineMyGroupsService, ab as SpineNewsComponent, ac as SpineNewsService, ad as SpineNoticesService, ae as SpinePageActionsDirective, af as SpinePageActionsSlot, ag as SpineRatingStarsComponent, ah as SpineRatingsService, ai as SpineSettingsService, aj as SpineStartPageService, b as SpineSuggestionChatComponent, S as SpineSuggestionsService, u as SpineTagRowComponent, ak as SpineUnsavedChangesService, al as SpineWorkspaceNavService, am as accountErrorCode, an as argosAccountApi, ao as buildMcpConfig, ap as effectiveIdleMinutes, aq as idleLimits, ar as isInternalPath, as as provideSettingsSection, at as provideSpineInboxSource, au as provideSpineSuggestionsPage, av as ratingTargetKey, aw as registerSpineUnsavedChanges, ax as resolveSettingsSection, ay as sanitizeSpineMarkdownHtml, q as screenModule, p as screenName, az as spineNormalizeUrl, aA as spineParamsOf, aB as spinePathOf, aC as spineScoreBand, aD as spineStarFills, aE as spineSuggestionsEnabled, aF as spineTagColor, aG as stable, s as suggestionScreens } from './trismegisto-spine-layout-trismegisto-spine-layout-B47sMo_4.mjs';
|
|
2
2
|
//# sourceMappingURL=trismegisto-spine-layout.mjs.map
|
|
@@ -1,11 +1,14 @@
|
|
|
1
1
|
import * as i0 from '@angular/core';
|
|
2
2
|
import { Injectable, inject, DestroyRef, ViewContainerRef, ViewChild, ChangeDetectionStrategy, Component } from '@angular/core';
|
|
3
|
-
import { HermesLoadingState
|
|
3
|
+
import { HermesLoadingState } from '@trismegisto/primitives/loading-state';
|
|
4
4
|
import { BehaviorSubject, Subject } from 'rxjs';
|
|
5
5
|
import { take } from 'rxjs/operators';
|
|
6
6
|
import * as i2 from '@angular/common';
|
|
7
7
|
import { CommonModule } from '@angular/common';
|
|
8
8
|
import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
|
|
9
|
+
import { ButtonComponent } from '@trismegisto/angular/button';
|
|
10
|
+
import { HERMES_MESSAGES } from '@trismegisto/angular/i18n';
|
|
11
|
+
import { ModalComponent as ModalComponent$1 } from '@trismegisto/angular/modal';
|
|
9
12
|
|
|
10
13
|
class ModalService {
|
|
11
14
|
constructor() {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"trismegisto-spine-modal.mjs","sources":["../../../projects/ui/modal/src/modal.service.ts","../../../projects/ui/modal/src/modal.component.ts","../../../projects/ui/modal/src/modal.component.html","../../../projects/ui/modal/src/trismegisto-spine-modal.ts"],"sourcesContent":["import { Injectable } from '@angular/core';\nimport { HermesLoadingState } from '@trismegisto/angular';\nimport { BehaviorSubject, Observable, Subject } from 'rxjs';\nimport { take } from 'rxjs/operators';\nimport { ModalConfig } from './modal.types';\n\n@Injectable({ providedIn: 'root' })\nexport class ModalService {\n private _visible = new BehaviorSubject<boolean>(false);\n public readonly visible$: Observable<boolean> = this._visible.asObservable();\n\n private _state = new BehaviorSubject<HermesLoadingState>(HermesLoadingState.DEFAULT);\n public readonly state$: Observable<HermesLoadingState> = this._state.asObservable();\n\n private _config: ModalConfig | null = null;\n public get config(): ModalConfig | null {\n return this._config;\n }\n\n private _result$: Subject<any> | null = null;\n\n open<TResult = any, TData = any>(config: ModalConfig<TData>): Observable<TResult | null> {\n // Abrir outro antes de responder o anterior cancela o anterior: quem o abriu recebe `null` (como no\n // `close`) e o observable completa, em vez de ficar pendurado para sempre.\n this._result$?.next(null);\n this._result$?.complete();\n this._config = config;\n this._state.next(HermesLoadingState.DEFAULT);\n this._result$ = new Subject<TResult | null>();\n this._visible.next(true);\n return this._result$.asObservable().pipe(take(1));\n }\n\n confirm(result: any): void {\n this._result$?.next(result);\n this._result$?.complete();\n this.dismiss();\n }\n\n close(): void {\n this._result$?.next(null);\n this._result$?.complete();\n this.dismiss();\n }\n\n setState(state: HermesLoadingState): void {\n this._state.next(state);\n }\n\n private dismiss(): void {\n this._visible.next(false);\n this._config = null;\n this._result$ = null;\n this._state.next(HermesLoadingState.DEFAULT); // evita vazar LOADING pro próximo modal\n }\n}\n","import { CommonModule } from '@angular/common';\nimport { ChangeDetectorRef, Component, ComponentRef, DestroyRef, OnInit, ViewChild, ViewContainerRef, ChangeDetectionStrategy, inject } from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { ButtonComponent, HERMES_MESSAGES, HermesLoadingState, ModalComponent as HermesModalComponent, ModalSize } from '@trismegisto/angular';\nimport { ModalConfig, ModalContent } from './modal.types';\nimport { ModalService } from './modal.service';\n\n/** `ModalConfig.size` manteve os valores do spine antigo (sm/md/lg/xl) por compatibilidade\n * de API com quem já chama `modalService.open(...)`; o DS novo só tem 3 tamanhos. */\nfunction toHermesSize(size: ModalConfig['size']): ModalSize {\n switch (size) {\n case 'sm': return 'small';\n case 'lg':\n case 'xl': return 'large';\n default: return 'medium';\n }\n}\n\n@Component({\n selector: 'spine-modal',\n imports: [CommonModule, HermesModalComponent, ButtonComponent],\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: './modal.component.html',\n})\nexport class ModalComponent implements OnInit {\n /** Rótulos dos botões padrão, do catálogo do Hermes (pt-BR/en/es). */\n protected readonly dialogText = inject(HERMES_MESSAGES).dialog;\n\n @ViewChild('content', { read: ViewContainerRef }) private content!: ViewContainerRef;\n\n visible = false;\n config: ModalConfig | null = null;\n state: HermesLoadingState = HermesLoadingState.DEFAULT;\n\n protected readonly HermesLoadingState = HermesLoadingState;\n protected readonly toHermesSize = toHermesSize;\n\n private contentRef: ComponentRef<ModalContent> | null = null;\n private readonly destroyRef = inject(DestroyRef);\n\n constructor(private modalService: ModalService, private cdr: ChangeDetectorRef) {}\n\n ngOnInit(): void {\n this.modalService.visible$.pipe(takeUntilDestroyed(this.destroyRef)).subscribe((visible) => {\n this.visible = visible;\n this.config = this.modalService.config;\n if (visible) {\n this.loadComponent();\n } else {\n this.content?.clear();\n this.contentRef = null;\n }\n this.cdr.markForCheck();\n });\n\n this.modalService.state$.pipe(takeUntilDestroyed(this.destroyRef)).subscribe((state) => {\n this.state = state;\n this.cdr.markForCheck();\n });\n }\n\n get canConfirm(): boolean {\n const instance = this.contentRef?.instance;\n return !instance?.isValid || instance.isValid();\n }\n\n private loadComponent(): void {\n this.content.clear();\n if (this.config?.component) {\n this.contentRef = this.content.createComponent(this.config.component);\n if (this.config.data !== undefined) {\n this.contentRef.setInput('data', this.config.data);\n }\n }\n }\n\n confirm(): void {\n if (!this.canConfirm) return;\n const result = this.contentRef?.instance?.getResult ? this.contentRef.instance.getResult() : true;\n this.modalService.confirm(result);\n }\n\n dismiss(): void {\n this.modalService.close();\n }\n\n onLoadingStateChange(state: HermesLoadingState): void {\n this.modalService.setState(state);\n }\n}\n","<hm-modal\n [open]=\"visible\"\n [heading]=\"config?.title || ''\"\n [size]=\"toHermesSize(config?.size)\"\n [closable]=\"config?.closable ?? true\"\n (closed)=\"dismiss()\"\n>\n <ng-container #content />\n <div *ngIf=\"config?.text && !config?.component\">{{ config?.text }}</div>\n\n <ng-container footer *ngIf=\"config?.showActions !== false\">\n <hm-button emphasis=\"medium\" (clicked)=\"dismiss()\">{{ dialogText.cancel }}</hm-button>\n <hm-button\n intent=\"success\"\n [disabled]=\"!canConfirm\"\n [loadingState]=\"state\"\n (loadingStateChange)=\"onLoadingStateChange($event)\"\n (clicked)=\"confirm()\"\n >{{ dialogText.confirm }}</hm-button>\n </ng-container>\n</hm-modal>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1.ModalService","HermesModalComponent"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"trismegisto-spine-modal.mjs","sources":["../../../projects/ui/modal/src/modal.service.ts","../../../projects/ui/modal/src/modal.component.ts","../../../projects/ui/modal/src/modal.component.html","../../../projects/ui/modal/src/trismegisto-spine-modal.ts"],"sourcesContent":["import { Injectable } from '@angular/core';\nimport { HermesLoadingState } from '@trismegisto/primitives/loading-state';\nimport { BehaviorSubject, Observable, Subject } from 'rxjs';\nimport { take } from 'rxjs/operators';\nimport { ModalConfig } from './modal.types';\n\n@Injectable({ providedIn: 'root' })\nexport class ModalService {\n private _visible = new BehaviorSubject<boolean>(false);\n public readonly visible$: Observable<boolean> = this._visible.asObservable();\n\n private _state = new BehaviorSubject<HermesLoadingState>(HermesLoadingState.DEFAULT);\n public readonly state$: Observable<HermesLoadingState> = this._state.asObservable();\n\n private _config: ModalConfig | null = null;\n public get config(): ModalConfig | null {\n return this._config;\n }\n\n private _result$: Subject<any> | null = null;\n\n open<TResult = any, TData = any>(config: ModalConfig<TData>): Observable<TResult | null> {\n // Abrir outro antes de responder o anterior cancela o anterior: quem o abriu recebe `null` (como no\n // `close`) e o observable completa, em vez de ficar pendurado para sempre.\n this._result$?.next(null);\n this._result$?.complete();\n this._config = config;\n this._state.next(HermesLoadingState.DEFAULT);\n this._result$ = new Subject<TResult | null>();\n this._visible.next(true);\n return this._result$.asObservable().pipe(take(1));\n }\n\n confirm(result: any): void {\n this._result$?.next(result);\n this._result$?.complete();\n this.dismiss();\n }\n\n close(): void {\n this._result$?.next(null);\n this._result$?.complete();\n this.dismiss();\n }\n\n setState(state: HermesLoadingState): void {\n this._state.next(state);\n }\n\n private dismiss(): void {\n this._visible.next(false);\n this._config = null;\n this._result$ = null;\n this._state.next(HermesLoadingState.DEFAULT); // evita vazar LOADING pro próximo modal\n }\n}\n","import { CommonModule } from '@angular/common';\nimport { ChangeDetectorRef, Component, ComponentRef, DestroyRef, OnInit, ViewChild, ViewContainerRef, ChangeDetectionStrategy, inject } from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { ButtonComponent } from '@trismegisto/angular/button';\nimport { HERMES_MESSAGES } from '@trismegisto/angular/i18n';\nimport { ModalComponent as HermesModalComponent } from '@trismegisto/angular/modal';\nimport { ModalSize } from '@trismegisto/primitives/classes';\nimport { HermesLoadingState } from '@trismegisto/primitives/loading-state';\nimport { ModalConfig, ModalContent } from './modal.types';\nimport { ModalService } from './modal.service';\n\n/** `ModalConfig.size` manteve os valores do spine antigo (sm/md/lg/xl) por compatibilidade\n * de API com quem já chama `modalService.open(...)`; o DS novo só tem 3 tamanhos. */\nfunction toHermesSize(size: ModalConfig['size']): ModalSize {\n switch (size) {\n case 'sm': return 'small';\n case 'lg':\n case 'xl': return 'large';\n default: return 'medium';\n }\n}\n\n@Component({\n selector: 'spine-modal',\n imports: [CommonModule, HermesModalComponent, ButtonComponent],\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: './modal.component.html',\n})\nexport class ModalComponent implements OnInit {\n /** Rótulos dos botões padrão, do catálogo do Hermes (pt-BR/en/es). */\n protected readonly dialogText = inject(HERMES_MESSAGES).dialog;\n\n @ViewChild('content', { read: ViewContainerRef }) private content!: ViewContainerRef;\n\n visible = false;\n config: ModalConfig | null = null;\n state: HermesLoadingState = HermesLoadingState.DEFAULT;\n\n protected readonly HermesLoadingState = HermesLoadingState;\n protected readonly toHermesSize = toHermesSize;\n\n private contentRef: ComponentRef<ModalContent> | null = null;\n private readonly destroyRef = inject(DestroyRef);\n\n constructor(private modalService: ModalService, private cdr: ChangeDetectorRef) {}\n\n ngOnInit(): void {\n this.modalService.visible$.pipe(takeUntilDestroyed(this.destroyRef)).subscribe((visible) => {\n this.visible = visible;\n this.config = this.modalService.config;\n if (visible) {\n this.loadComponent();\n } else {\n this.content?.clear();\n this.contentRef = null;\n }\n this.cdr.markForCheck();\n });\n\n this.modalService.state$.pipe(takeUntilDestroyed(this.destroyRef)).subscribe((state) => {\n this.state = state;\n this.cdr.markForCheck();\n });\n }\n\n get canConfirm(): boolean {\n const instance = this.contentRef?.instance;\n return !instance?.isValid || instance.isValid();\n }\n\n private loadComponent(): void {\n this.content.clear();\n if (this.config?.component) {\n this.contentRef = this.content.createComponent(this.config.component);\n if (this.config.data !== undefined) {\n this.contentRef.setInput('data', this.config.data);\n }\n }\n }\n\n confirm(): void {\n if (!this.canConfirm) return;\n const result = this.contentRef?.instance?.getResult ? this.contentRef.instance.getResult() : true;\n this.modalService.confirm(result);\n }\n\n dismiss(): void {\n this.modalService.close();\n }\n\n onLoadingStateChange(state: HermesLoadingState): void {\n this.modalService.setState(state);\n }\n}\n","<hm-modal\n [open]=\"visible\"\n [heading]=\"config?.title || ''\"\n [size]=\"toHermesSize(config?.size)\"\n [closable]=\"config?.closable ?? true\"\n (closed)=\"dismiss()\"\n>\n <ng-container #content />\n <div *ngIf=\"config?.text && !config?.component\">{{ config?.text }}</div>\n\n <ng-container footer *ngIf=\"config?.showActions !== false\">\n <hm-button emphasis=\"medium\" (clicked)=\"dismiss()\">{{ dialogText.cancel }}</hm-button>\n <hm-button\n intent=\"success\"\n [disabled]=\"!canConfirm\"\n [loadingState]=\"state\"\n (loadingStateChange)=\"onLoadingStateChange($event)\"\n (clicked)=\"confirm()\"\n >{{ dialogText.confirm }}</hm-button>\n </ng-container>\n</hm-modal>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1.ModalService","HermesModalComponent"],"mappings":"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"}
|
|
@@ -2,7 +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 { HermesToastService, ToastStackComponent } from '@trismegisto/angular';
|
|
5
|
+
import { HermesToastService, ToastStackComponent } from '@trismegisto/angular/toast';
|
|
6
6
|
|
|
7
7
|
var AlertType;
|
|
8
8
|
(function (AlertType) {
|
|
@@ -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/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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"}
|
|
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/alert';\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/toast';\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/toast';\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":";;;;;;IAAY;AAAZ,CAAA,UAAY,SAAS,EAAA;AACnB,IAAA,SAAA,CAAA,MAAA,CAAA,GAAA,MAAa;AACb,IAAA,SAAA,CAAA,SAAA,CAAA,GAAA,SAAmB;AACnB,IAAA,SAAA,CAAA,SAAA,CAAA,GAAA,SAAmB;AACnB,IAAA,SAAA,CAAA,QAAA,CAAA,GAAA,QAAiB;AACnB,CAAC,EALW,SAAS,KAAT,SAAS,GAAA,EAAA,CAAA,CAAA;;ACArB,MAAM,MAAM,GAAG,6DAA6D;AAC5E,MAAM,aAAa,GAAG,8CAA8C;AACpE,MAAM,SAAS,GAAG,8BAA8B;AAE1C,SAAU,aAAa,CAAC,IAAa,EAAA;AACzC,IAAA,OAAO,MAAM,CAAC,IAAI,IAAI,EAAE;AACrB,SAAA,OAAO,CAAC,MAAM,EAAE,KAAK;AACrB,SAAA,OAAO,CAAC,aAAa,EAAE,OAAO;AAC9B,SAAA,OAAO,CAAC,SAAS,EAAE,OAAO,CAAC;AAChC;;ACDA;AACA,SAAS,cAAc,CAAC,IAAe,EAAA;AACrC,IAAA,OAAO,IAAI,KAAK,SAAS,CAAC,MAAM,GAAG,OAAO,GAAG,IAAI;AACnD;AAMA;;;;;AAKG;MAEU,mBAAmB,CAAA;AAU9B,IAAA,WAAA,GAAA;AATiB,QAAA,IAAA,CAAA,IAAI,GAAG,MAAM,CAAC,cAAc,CAAC,CAAC,YAAY;QAC1C,IAAA,CAAA,KAAK,GAAG,MAAM,CAAC,kBAAkB,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;AAC/D,QAAA,IAAA,CAAA,cAAc,GAAG,IAAI,eAAe,CAAiB,EAAE,CAAC;AAChD,QAAA,IAAA,CAAA,cAAc,GAA+B,IAAI,CAAC,cAAc,CAAC,YAAY,EAAE;AAE/F;AAC+E;QACvE,IAAA,CAAA,KAAK,GAA0C,IAAI;AAGzD,QAAA,MAAM,CAAC,UAAU,CAAC,CAAC,SAAS,CAAC,MAAM,IAAI,CAAC,SAAS,EAAE,CAAC;IACtD;AAEA;;;;AAIG;AACH,IAAA,gBAAgB,CAAC,MAAc,EAAA;AAC7B,QAAA,IAAI,MAAM,IAAI,GAAG,IAAI,MAAM,GAAG,GAAG;YAAE,OAAO,SAAS,CAAC,OAAO;AAC3D,QAAA,IAAI,MAAM,IAAI,GAAG,IAAI,MAAM,GAAG,GAAG;YAAE,OAAO,SAAS,CAAC,OAAO;AAC3D,QAAA,IAAI,MAAM,IAAI,GAAG,IAAI,MAAM,GAAG,GAAG;YAAE,OAAO,SAAS,CAAC,MAAM;QAC1D,OAAO,SAAS,CAAC,IAAI;IACvB;AAEA,IAAA,eAAe,CAAC,YAA+B,EAAA;QAC7C,MAAM,OAAO,GAAG,aAAa,CAAC,YAAY,CAAC,OAAO,CAAC;AACnD,QAAA,MAAM,eAAe,GACnB,OAAO,YAAY,CAAC,eAAe,KAAK;cACpC,IAAI,CAAC,gBAAgB,CAAC,YAAY,CAAC,eAAe;AACpD,cAAE,YAAY,CAAC,eAAe;AAElC,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,YAAY,CAAC,KAAK,GAAG,IAAI;AACtD,QAAA,MAAM,IAAI,GAAiB,EAAE,GAAG,YAAY,EAAE,OAAO,EAAE,eAAe,EAAE,OAAO,EAAE;AACjF,QAAA,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;AAC9D,QAAA,IAAI,CAAC,KAAK,KAAK,WAAW,CAAC,MAAM,IAAI,CAAC,mBAAmB,EAAE,EAAE,IAAI,CAAC;AAClE,QAAA,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,cAAc,CAAC,eAAe,CAAC,EAAE,OAAO,EAAE,YAAY,CAAC,KAAK,GAAG,CAAC,GAAG,EAAE,QAAQ,EAAE,YAAY,CAAC,KAAK,GAAG,IAAI,EAAE,GAAG,SAAS,CAAC;IAC1I;IAEA,wBAAwB,GAAA;QACtB,IAAI,CAAC,eAAe,CAAC;AACnB,YAAA,KAAK,EAAE,CAAC;YACR,eAAe,EAAE,SAAS,CAAC,MAAM;AACjC,YAAA,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,YAAY;AAC/B,YAAA,mBAAmB,EAAE,KAAK;AAC3B,SAAA,CAAC;IACJ;IAEQ,mBAAmB,GAAA;AACzB,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE;QACtB,MAAM,SAAS,GAAG,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,IAAI,CAAC,KAAK,GAAG,CAAC;AAClF,QAAA,IAAI,SAAS,CAAC,MAAM,KAAK,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,MAAM,EAAE;AACzD,YAAA,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,SAAS,CAAC;QACrC;AACA,QAAA,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC;YAAE,IAAI,CAAC,SAAS,EAAE;IAC9C;IAEQ,SAAS,GAAA;AACf,QAAA,IAAI,IAAI,CAAC,KAAK,KAAK,IAAI;AAAE,YAAA,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC;AAClD,QAAA,IAAI,CAAC,KAAK,GAAG,IAAI;IACnB;+GA7DW,mBAAmB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;AAAnB,IAAA,SAAA,IAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,mBAAmB,cADN,MAAM,EAAA,CAAA,CAAA;;4FACnB,mBAAmB,EAAA,UAAA,EAAA,CAAA;kBAD/B,UAAU;mBAAC,EAAE,UAAU,EAAE,MAAM,EAAE;;;ACpBlC;;;;AAIG;MAOU,qBAAqB,CAAA;+GAArB,qBAAqB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;mGAArB,qBAAqB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,oBAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAHtB,CAAA,kBAAA,CAAoB,EAAA,QAAA,EAAA,IAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EADpB,mBAAmB,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,QAAA,EAAA,eAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA,CAAA;;4FAIlB,qBAAqB,EAAA,UAAA,EAAA,CAAA;kBANjC,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,oBAAoB;oBAC9B,OAAO,EAAE,CAAC,mBAAmB,CAAC;AAC9B,oBAAA,QAAQ,EAAE,CAAA,kBAAA,CAAoB;oBAC9B,eAAe,EAAE,uBAAuB,CAAC,MAAM;AAChD,iBAAA;;;ACbD;;AAEG;;"}
|
|
@@ -5,8 +5,8 @@ import { routerIdOf, SPINE_CONFIG, spineBuiltinPageAt, spineRoutesOf, SPINE_MESS
|
|
|
5
5
|
import * as i1 from '@angular/router';
|
|
6
6
|
import { Router } from '@angular/router';
|
|
7
7
|
import * as i2 from '@orfeu/angular/core';
|
|
8
|
-
import { StatePageComponent } from '@trismegisto/angular';
|
|
9
|
-
import { formatMessage } from '@trismegisto/primitives';
|
|
8
|
+
import { StatePageComponent } from '@trismegisto/angular/state-page';
|
|
9
|
+
import { formatMessage } from '@trismegisto/primitives/i18n';
|
|
10
10
|
|
|
11
11
|
class LoggerService {
|
|
12
12
|
constructor() {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"trismegisto-spine-routing.mjs","sources":["../../../projects/ui/routing/src/logger.service.ts","../../../projects/ui/routing/src/route-id.interceptor.ts","../../../projects/ui/routing/src/route-chain.ts","../../../projects/ui/routing/src/view.guard.ts","../../../projects/ui/routing/src/component-routes.token.ts","../../../projects/ui/routing/src/component-distributor.service.ts","../../../projects/ui/routing/src/resolve-route.ts","../../../projects/ui/routing/src/public-api.ts","../../../projects/ui/routing/src/trismegisto-spine-routing.ts"],"sourcesContent":["import { Injectable } from '@angular/core';\nimport { BehaviorSubject } from 'rxjs';\nimport { Route, routerIdOf } from '@trismegisto/spine';\n\n@Injectable({ providedIn: 'root' })\nexport class LoggerService {\n\n private _logger = new BehaviorSubject<Route[]>([]);\n\n get logger(): Route[] { return this._logger.value; }\n\n setLogger(logger: Route[]) { this._logger.next(logger); }\n\n /** A página atual (último nó da cadeia do painel focado). */\n get page(): Route | null {\n const entries = this.logger;\n return entries[entries.length - 1] ?? null;\n }\n\n /** `router_id` da página atual -- a identidade da TELA no spine (componente, documento, descrição). */\n get routerId(): string | null {\n return routerIdOf(this.page);\n }\n\n /**\n * A ROTA da página atual (`web.routes.route_id`, o `routed_id` do nó) -- o que vai em `x-route-id`\n * e vira `audit.events.route_id`/`route_name`. Só quando o último nó é uma página de verdade (tem\n * router): grupo puramente organizacional não é tela. Antes de 2026-10-05 ia o router_id aqui, e a\n * auditoria não achava o nome (o argos-auth-server ainda traduz router_id → rota, por compatibilidade).\n */\n get routeId(): string | null {\n const page = this.page;\n return page && routerIdOf(page) ? page.routed_id ?? null : null;\n }\n}\n","import { Injectable, inject } from '@angular/core';\nimport { HttpEvent, HttpHandler, HttpInterceptor, HttpRequest } from '@angular/common/http';\nimport { Observable } from 'rxjs';\nimport { SPINE_CONFIG } from '@trismegisto/spine';\nimport { LoggerService } from './logger.service';\n\n/** Must match `@orfeu/node`/`orfeu` (Python)'s `ROUTE_ID_HEADER` (`x-route-id`). */\nexport const ROUTE_ID_HEADER = 'X-Route-Id';\n/** Must match `@orfeu/node`/`orfeu` (Python)'s `CLIENT_ID_HEADER` (`x-client-id`): which app (client) the action came from. */\nexport const CLIENT_ID_HEADER = 'X-Client-Id';\n\n/**\n * Attaches the current screen's ROUTE id — `web.routes.route_id` of the page node (`routed_id`), NOT the\n * `router_id` the spine uses to identify the screen (see `LoggerService.routeId`) — and the app's `clientId`\n * from `SpineConfig` as headers on every outgoing HTTP\n * request, read from `LoggerService` (updated by `ViewGuard` on every\n * navigation — see view.guard.ts). This is a caller-supplied correlation tag\n * consumed by Orfeu's structured operation logs to correlate an\n * operation_id with the route that triggered it; it is never verified\n * server-side and never used for permission checks.\n *\n * Applied globally (registered once by `provideShell`, not per-service) so\n * every app gets the correlation for free — an extra header a third-party\n * API doesn't recognize is harmless, so there's no need to scope this to\n * only Orfeu-guarded backends.\n */\n@Injectable()\nexport class RouteIdInterceptor implements HttpInterceptor {\n private readonly clientId = inject(SPINE_CONFIG, { optional: true })?.clientId;\n\n constructor(private loggerService: LoggerService) {}\n\n intercept(req: HttpRequest<unknown>, next: HttpHandler): Observable<HttpEvent<unknown>> {\n const setHeaders: Record<string, string> = {};\n if (!req.headers.has(ROUTE_ID_HEADER)) {\n const routeId = this.loggerService.routeId;\n if (routeId) setHeaders[ROUTE_ID_HEADER] = routeId;\n }\n if (this.clientId && !req.headers.has(CLIENT_ID_HEADER)) setHeaders[CLIENT_ID_HEADER] = this.clientId;\n\n return Object.keys(setHeaders).length ? next.handle(req.clone({ setHeaders })) : next.handle(req);\n }\n}\n","import { Route, spineBuiltinPageAt } from '@trismegisto/spine';\n\n/**\n * Lógica pura de resolução da árvore de rotas vinda do backend (`ViewService.currentView`) —\n * compartilhada entre `ViewGuard` (gate de navegação real) e `resolveSpineRoute` (resolução por\n * painel do workspace, sem depender do `Router`). Extraída daqui porque as duas precisavam do\n * mesmo algoritmo de busca e tinham cópias divergentes antes desta reescrita.\n */\n\n/** Acha uma rota cujo `route_redirect` bate com `urlAtLevel`, atravessando ancestrais\n * \"transparentes\" (sem `route_redirect` próprio — só agrupam os filhos). */\nexport function findRouteThrough(routes: Route[], urlAtLevel: string): Route | null {\n const direct = routes.find((r) => r.route_redirect === urlAtLevel);\n if (direct) return direct;\n\n for (const transparent of routes.filter((r) => !r.route_redirect)) {\n const found = findRouteThrough(transparent.routes ?? [], urlAtLevel);\n if (found) return found;\n }\n\n return null;\n}\n\n/** Primeira rota navegável (DFS), atravessando grupos transparentes — usada como fallback\n * quando a URL alvo não bate com nada na view atual. */\nexport function findFirstNavigable(routes: Route[]): 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 = findFirstNavigable(r.routes);\n if (found) return found;\n }\n }\n return null;\n}\n\n/**\n * Resolve a cadeia INTEIRA de rotas (header→navigation→menu→item→submenu→page, até onde a URL\n * for funda) pra uma URL qualquer, lendo só `currentRoutes`/`getLevel`/`getUrlAtLevel` — as\n * mesmas três primitivas que `ViewGuard` já usava, sem tocar no `Router`. `chain[0]` é o nível 1\n * (header), não existe nível 0 — mantém a mesma convenção 1-based do `ViewGuard` original.\n */\nexport function resolveRouteChain(\n currentRoutes: Route[],\n getLevel: (url: string) => number,\n getUrlAtLevel: (url: string, level: number) => string,\n url: string,\n): Route[] | null {\n if (!currentRoutes.length) return null;\n // Só o caminho decide a tela: a query (os parâmetros de uma aba) e o fragmento não entram, qualquer que seja o\n // ViewService (o do Orfeu já tira; aqui não depende disso).\n const path = url.split(/[?#]/)[0] || url;\n return walkRouteChain(currentRoutes, getLevel, getUrlAtLevel, path) ?? builtinChain(path);\n}\n\nfunction walkRouteChain(\n currentRoutes: Route[],\n getLevel: (url: string) => number,\n getUrlAtLevel: (url: string, level: number) => string,\n url: string,\n): Route[] | null {\n const levels = getLevel(url);\n const chain: Route[] = [];\n let pool = currentRoutes;\n\n for (let level = 1; level <= levels; level++) {\n const urlAtLevel = getUrlAtLevel(url, level);\n const found = findRouteThrough(pool, urlAtLevel);\n if (!found) return null;\n chain.push(found);\n pool = found.routes ?? [];\n }\n\n return chain;\n}\n\n/** Página do próprio spine (`registerSpineBuiltinPage`) quando a árvore do app não tem o endereço: cadeia de um nó. */\nfunction builtinChain(url: string): Route[] | null {\n const page = spineBuiltinPageAt(url);\n return page ? [page.route] : null;\n}\n\n/** Teto de redirecionamentos em cascata antes de desistir. */\nconst MAX_CASCADE_REDIRECTS = 8;\n\n/**\n * `resolveRouteChain`, mas descendo sozinho quando o nó final tem filhos e nenhum conteúdo\n * próprio — o mesmo comportamento que o `RouterComponent` antigo tinha (cada nível, ao pousar\n * numa rota com `routes.length > 0`, `router.navigate([routes[0].route_redirect])`), perdido na\n * reescrita porque não existe mais uma cadeia de guardas por nível. Sem isto, clicar num nó\n * puramente organizacional (ex.: \"Solicitações\", que só agrupa Configuração/Inventário/etc. e não\n * tem `route_id` de página nenhuma) cai em \"Nenhum conteúdo disponível\" — achado real, 2026-09-28.\n */\nexport function resolveEffectiveRouteChain(\n currentRoutes: Route[],\n getLevel: (url: string) => number,\n getUrlAtLevel: (url: string, level: number) => string,\n url: string,\n): Route[] | null {\n let target = url;\n\n for (let hop = 0; hop <= MAX_CASCADE_REDIRECTS; hop++) {\n const chain = resolveRouteChain(currentRoutes, getLevel, getUrlAtLevel, target);\n if (!chain) return null;\n\n // Primeiro descendente navegável, atravessando grupos transparentes (mesma regra do\n // `findRouteThrough`). Com só `routes[0].route_redirect`, um nó cujo primeiro filho é um grupo\n // sem endereço parava em si mesmo — e o `ViewGuard` redirecionava para a própria URL, em laço.\n const next = findFirstNavigable(chain.at(-1)?.routes ?? []);\n if (!next) return chain;\n\n target = next;\n }\n\n return null;\n}\n","import { Injectable } from '@angular/core';\nimport { ActivatedRouteSnapshot, CanActivate, Route as NgRoute, Router, RouterStateSnapshot } from '@angular/router';\nimport { AuthorizationService, ViewService } from '@orfeu/angular/core';\nimport { spineRoutesOf } from '@trismegisto/spine';\nimport { findFirstNavigable, resolveEffectiveRouteChain, resolveRouteChain } from './route-chain';\n\n/**\n * Gate de navegação REAL (deep link, F5, `router.navigateByUrl` do painel focado — ver\n * `SpineWorkspaceNavService`). Não desenha mais nada nem alimenta breadcrumb/sidebar: isso agora\n * é responsabilidade de cada painel do workspace (`resolveSpineRoute`, chamado direto por quem\n * precisa da cadeia). O guard só confirma que a URL resolve contra a view atual — senão redireciona\n * pro fallback navegável ou pra `/no-permission` — e existe numa única rota coringa (ver\n * `private.routes.ts`), não mais em 6 níveis de rota aninhada.\n *\n * Duas saídas de acesso, nesta ordem:\n * - **`/blocked`** — autenticado, mas sem nenhum grupo vinculado a esta aplicação (o token sai\n * com `badges` vazio: o argos só dá crachá por grupo do project do client). Vale mesmo que o\n * app tenha rotas públicas: quem não é de nenhum grupo do app não entra nele;\n * - **`/no-permission`** — tem grupo, mas a view não trouxe rota nenhuma (os grupos não têm\n * permissão e o app não tem rota pública).\n */\n@Injectable({ providedIn: 'root' })\nexport class ViewGuard implements CanActivate {\n constructor(\n private router: Router,\n private viewService: ViewService,\n private auth: AuthorizationService,\n ) { }\n\n canActivate(_route: ActivatedRouteSnapshot, state: RouterStateSnapshot): boolean {\n return this.checkRoute(state.url);\n }\n\n canActivateChild(_route: ActivatedRouteSnapshot, state: RouterStateSnapshot): boolean {\n return this.checkRoute(state.url);\n }\n\n canLoad(route: NgRoute): boolean {\n return this.checkRoute('/' + (route.path || ''));\n }\n\n private checkRoute(url: string): boolean {\n // Árvore com irmãos de mesmo endereço já fundidos (header + navigation \"laboratorio\") — ver `mergeRouteTree`.\n const currentRoutes = spineRoutesOf(this.viewService.currentView);\n\n if (this.auth.authenticated && !this.auth.badges.length) {\n this.router.navigate(['/blocked']);\n return false;\n }\n\n if (!currentRoutes.length) {\n this.router.navigate(['/no-permission']);\n return false;\n }\n\n const chain = resolveRouteChain(\n currentRoutes,\n (u) => this.viewService.getLevel(u),\n (u, level) => this.viewService.getUrlAtLevel(u, level),\n url,\n );\n\n if (!chain) {\n const fallback = findFirstNavigable(currentRoutes);\n this.router.navigate([fallback ?? '/no-permission']);\n return false;\n }\n\n // Pousou num nó puramente organizacional (tem filhos, nenhum conteúdo próprio — ex.:\n // \"Solicitações\", que só agrupa Configuração/Inventário/etc.) — encaminha pro primeiro filho\n // navegável, recursivamente, mesmo comportamento em cascata que o `RouterComponent` antigo\n // tinha por nível (achado real, 2026-09-28: sem isto, cai em \"Nenhum conteúdo disponível\").\n if ((chain.at(-1)?.routes?.length ?? 0) > 0) {\n const effective = resolveEffectiveRouteChain(\n currentRoutes,\n (u) => this.viewService.getLevel(u),\n (u, level) => this.viewService.getUrlAtLevel(u, level),\n url,\n );\n const target = effective?.at(-1)?.route_redirect;\n this.router.navigate([target ?? '/no-permission']);\n return false;\n }\n\n return true;\n }\n}\n","import { InjectionToken, Type } from '@angular/core';\n\n/**\n * Manual de uma tela, declarado no `document` da própria `ComponentRoute` (mesma chave, o router_id).\n * Os textos são Markdown buscado só quando alguém abre a documentação: nos apps, um `import()` do `.md`\n * com o loader `text`, de modo que o conteúdo vai no chunk lazy da tela e não no carregamento inicial.\n */\nexport interface RouteDocument {\n /** Nome da tela no índice da documentação; se faltar, usa-se o rótulo da rota na árvore do usuário. */\n title?: string;\n /** Seção do índice em que a tela aparece; se faltar, usa-se o módulo de topo que a contém. */\n group?: string;\n /** Texto para quem usa a tela no dia a dia (normalmente o `README.md` dela). */\n load: () => Promise<string>;\n /**\n * Especificação técnica, para desenvolvimento (normalmente o `ESPECIFICACAO.md`). Só aparece com\n * `SpineConfig.technicalDocs` ativo — por padrão, apenas em `isDevMode()`.\n */\n loadTechnical?: () => Promise<string>;\n}\n\n/**\n * Uma tela do app. A chave é o ROUTER (`web.router.router_id` do client -- a posição da tela na\n * navegação, o `router_id` do nó 'page' da view), nunca o `web.routes.route_id` (a rota é só\n * nome/ícone/path, reaproveitável em vários routers). Tela de template (ex.: auto-serviço) usa\n * `source_template_router_id` -- o router do TEMPLATE, igual em todos os clients vinculados.\n */\nexport interface ComponentRoute {\n /** `router_id` (web.router do client) da tela. */\n id?: string;\n /** Componente da tela, via `import()` dinâmico (code-splitting por tela). */\n load?: () => Promise<Type<any>>;\n /** Documentação da tela, exibida pelo botão de documentação da barra da página. */\n document?: RouteDocument;\n\n // Alternativa a `id`: source_template_router_id casa com QUALQUER client vinculado ao\n // template de origem daquele router (uso por pacotes plugáveis tipo @trismegisto/spine/auto-service,\n // que não conhecem o router_id materializado de cada client -- só o router_id do próprio\n // template, estável). Ver ComponentDistributorService.getComponent.\n source_template_router_id?: string;\n}\n\n/** `id` (router_id) da entrada. O formato antigo (`route_id`) saiu na 3.3.1. */\nexport function componentRouterId(route: ComponentRoute): string | undefined {\n return route.id;\n}\n\n/** Carregador da entrada. O formato antigo (`component`) saiu na 3.3.1. */\nexport function componentRouteLoader(route: ComponentRoute): (() => Promise<Type<any>>) | undefined {\n return route.load;\n}\n\n// multi: true -- vários providers (o app via provideShell + pacotes plugáveis via\n// provideAutoService e afins) contribuem cada um com seu próprio array, combinados\n// pelo ComponentDistributorService.\nexport const COMPONENT_ROUTES = new InjectionToken<ComponentRoute[]>('COMPONENT_ROUTES');\n","import { Component, Inject, Injectable, Optional, Type, ChangeDetectionStrategy, computed, inject, signal } from '@angular/core';\nimport { Router } from '@angular/router';\nimport { StatePageComponent } from '@trismegisto/angular';\nimport { ComponentRoute, COMPONENT_ROUTES, componentRouterId, componentRouteLoader } from './component-routes.token';\nimport { SPINE_MESSAGES, spineBuiltinPageById } from '@trismegisto/spine';\nimport { formatMessage } from '@trismegisto/primitives';\n\n/**\n * Componente devolvido por `getComponent` quando não há entrada registrada pro `router_id` (ou o\n * import dela falhou) — nasce via `createComponent`/`ngComponentOutlet` em `SpinePagePanelComponent`,\n * então roda **fora** do encapsulamento de estilo de quem o monta e precisa do próprio CSS (as\n * custom properties `--hm-*` herdam normalmente pela árvore, encapsulamento não bloqueia isso).\n *\n * Aqui a rota EXISTE na árvore (por isso chegou um `router_id`), só falta a tela publicada por trás — o\n * código dela vai na descrição pra quem opera saber o que registrar, e o botão devolve pra raiz do\n * app. A ilustração é a `IllustrationNotFoundComponent` (ver o componente pra origem/licenciamento do\n * desenho).\n */\n@Component({\n selector: 'spine-no-content',\n // Página pronta do hermes (`hm-state-page`, tipo \"no-content\"): título, ilustração e ação vêm de\n // lá; aqui só entra a descrição com o código da rota pra quem opera saber o que registrar.\n template: `<hm-state-page kind=\"no-content\" [description]=\"description()\" (actionTriggered)=\"irParaInicio()\" />`,\n // O painel do workspace é coluna flex: o host cresce pra ocupar a área toda e centralizar.\n styles: [`:host { display: flex; flex-direction: column; flex: 1; min-block-size: 100%; }`],\n imports: [StatePageComponent],\n changeDetection: ChangeDetectionStrategy.OnPush,\n standalone: true,\n})\nclass NoContentComponent {\n private readonly distributor = inject(ComponentDistributorService);\n private readonly text = inject(SPINE_MESSAGES).routing;\n private readonly router = inject(Router);\n\n protected readonly description = computed(() => {\n const routerId = this.distributor.lastMissingRouterId();\n return routerId ? formatMessage(this.text.notPublishedCode, { code: routerId }) : this.text.notPublished;\n });\n\n protected irParaInicio(): void {\n void this.router.navigateByUrl('/');\n }\n}\n\n/**\n * O import dinâmico falhou porque o arquivo da tela não existe mais no servidor — saiu um build novo\n * enquanto a aba estava aberta e os chunks antigos foram trocados. Mensagens dos navegadores:\n * Chrome/Edge \"Failed to fetch dynamically imported module\", Firefox \"error loading dynamically\n * imported module\", Safari \"Importing a module script failed\", webpack \"Loading chunk N failed\" /\n * `ChunkLoadError`.\n */\nexport function isChunkLoadError(err: unknown): boolean {\n const e = err as { name?: string; message?: string } | null;\n if (e?.name === 'ChunkLoadError') return true;\n return /dynamically imported module|importing a module script failed|loading (css )?chunk [\\w-]+ failed/i.test(e?.message ?? '');\n}\n\n/**\n * Componente devolvido por `getComponent` quando a tela não carrega porque a aplicação foi atualizada\n * (ver `isChunkLoadError`): em vez de \"tela não publicada\", a página pronta `outdated` do hermes, cujo\n * botão recarrega a página — a versão nova vem com os arquivos certos.\n */\n@Component({\n selector: 'spine-outdated',\n template: `<hm-state-page kind=\"outdated\" (actionTriggered)=\"recarregar()\" />`,\n styles: [`:host { display: flex; flex-direction: column; flex: 1; min-block-size: 100%; }`],\n imports: [StatePageComponent],\n changeDetection: ChangeDetectionStrategy.OnPush,\n standalone: true,\n})\nclass OutdatedComponent {\n protected recarregar(): void {\n window.location.reload();\n }\n}\n\n@Injectable({ providedIn: 'root' })\nexport class ComponentDistributorService {\n\n private components: ComponentRoute[];\n\n /**\n * `router_id` da última falha (sem entrada registrada ou import quebrado) — lido por\n * `NoContentComponent` pra montar a descrição (ver comentário dela). Sinal só, não por\n * instância: se dois painéis erram ao mesmo tempo, o texto de um pode piscar o código do\n * outro por um instante — aceitável, é só o que a mensagem de suporte mostra, nenhuma decisão\n * de roteamento depende disto.\n */\n readonly lastMissingRouterId = signal('');\n\n // COMPONENT_ROUTES é multi: true -- cada provider (provideShell, provideAutoService,\n // etc.) contribui com seu próprio ComponentRoute[], injetado aqui como\n // ComponentRoute[][] (um array por provider). Achata numa lista só.\n constructor(@Optional() @Inject(COMPONENT_ROUTES) routes: ComponentRoute[][] | null) {\n this.components = (routes ?? []).flat();\n }\n\n /** Todas as entradas registradas (app + pacotes plugáveis) -- lidas pela documentação. */\n get entries(): readonly ComponentRoute[] {\n return this.components;\n }\n\n // A tela é identificada pelo ROUTER: primeiro o router_id do client (entrada `id` do app), depois\n // o source_template_router_id (router do template, igual em todos os clients vinculados -- é o\n // que pacotes plugáveis como o auto-serviço registram, já que o router_id da cópia muda por\n // client). Nessa ordem, uma customização feita direto no client sempre vence o componente\n // genérico do pacote.\n async getComponent(routerId: string, source_template_router_id?: string | null): Promise<Type<any>> {\n const target = routerId?.toLowerCase();\n let entry = target ? this.components.find(c => componentRouterId(c)?.toLowerCase() === target) : undefined;\n\n if (!entry && source_template_router_id) {\n const templateTarget = source_template_router_id.toLowerCase();\n entry = this.components.find(c => c.source_template_router_id?.toLowerCase() === templateTarget);\n }\n\n // Página do próprio spine (ver `registerSpineBuiltinPage`): só quando nenhuma entrada do app/pacote casou.\n const builtin = entry ? null : spineBuiltinPageById(routerId);\n if (!entry && !builtin) {\n this.lastMissingRouterId.set(routerId);\n return NoContentComponent;\n }\n try {\n const load = builtin ? builtin.load : componentRouteLoader(entry!);\n if (!load) throw new Error('[hermes-spine] entrada de COMPONENT_ROUTES sem `load`');\n return await load();\n } catch (err) {\n console.error(`Erro ao carregar componente para ${routerId}:`, err);\n if (isChunkLoadError(err)) return OutdatedComponent;\n this.lastMissingRouterId.set(routerId);\n return NoContentComponent;\n }\n }\n}\n","import { Type } from '@angular/core';\nimport { Route, routerIdOf } from '@trismegisto/spine';\nimport { resolveRouteChain } from './route-chain';\nimport { ComponentDistributorService } from './component-distributor.service';\n\n/**\n * Traduz uma URL na cadeia de rotas do backend (header→navigation→menu→item→submenu→page) e no\n * componente da folha — sem passar pelo `Router` do Angular. É o que torna o painel do workspace\n * possível — o `Router` tem uma URL só; um painel não-focado precisa resolver a dele de forma\n * independente. Anda-se na árvore `Route[]` que o backend manda (`ViewService.currentView`), a\n * mesma que `ViewGuard` lia.\n */\nexport interface ResolvedSpineRoute {\n /** A cadeia inteira, nível 1 (header) até onde a URL alcançar. `chain.at(-1)` é sempre o nível\n * 'page' — é dele que `component` vem. Níveis intermediários (`item`/`submenu`) com mais de um\n * irmão são o que vira aba de submenu/multipágina no painel. */\n readonly chain: Route[];\n readonly component: Type<unknown>;\n}\n\nexport async function resolveSpineRoute(\n currentRoutes: Route[],\n getLevel: (url: string) => number,\n getUrlAtLevel: (url: string, level: number) => string,\n distributor: ComponentDistributorService,\n url: string,\n): Promise<ResolvedSpineRoute | null> {\n const chain = resolveRouteChain(currentRoutes, getLevel, getUrlAtLevel, url);\n if (!chain || !chain.length) return null;\n\n const leaf = chain[chain.length - 1];\n const component = await distributor.getComponent(routerIdOf(leaf) ?? '', leaf.source_template_router_id);\n return { chain, component };\n}\n","export * from './logger.service';\nexport * from './route-id.interceptor';\nexport * from './view.guard';\nexport * from './component-routes.token';\nexport * from './component-distributor.service';\nexport * from './route-chain';\nexport * from './resolve-route';\n\n// `router/`, `navigation/submenus/`, `navigation/multipages/` e `component-factory/` (a rota aninhada de 6\n// níveis do Angular, trocada pela resolução por painel do workspace: resolve-route.ts + layout/src/workspace/)\n// eram órfãos sem export e saíram na 3.3.1.\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1.LoggerService"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"trismegisto-spine-routing.mjs","sources":["../../../projects/ui/routing/src/logger.service.ts","../../../projects/ui/routing/src/route-id.interceptor.ts","../../../projects/ui/routing/src/route-chain.ts","../../../projects/ui/routing/src/view.guard.ts","../../../projects/ui/routing/src/component-routes.token.ts","../../../projects/ui/routing/src/component-distributor.service.ts","../../../projects/ui/routing/src/resolve-route.ts","../../../projects/ui/routing/src/public-api.ts","../../../projects/ui/routing/src/trismegisto-spine-routing.ts"],"sourcesContent":["import { Injectable } from '@angular/core';\nimport { BehaviorSubject } from 'rxjs';\nimport { Route, routerIdOf } from '@trismegisto/spine';\n\n@Injectable({ providedIn: 'root' })\nexport class LoggerService {\n\n private _logger = new BehaviorSubject<Route[]>([]);\n\n get logger(): Route[] { return this._logger.value; }\n\n setLogger(logger: Route[]) { this._logger.next(logger); }\n\n /** A página atual (último nó da cadeia do painel focado). */\n get page(): Route | null {\n const entries = this.logger;\n return entries[entries.length - 1] ?? null;\n }\n\n /** `router_id` da página atual -- a identidade da TELA no spine (componente, documento, descrição). */\n get routerId(): string | null {\n return routerIdOf(this.page);\n }\n\n /**\n * A ROTA da página atual (`web.routes.route_id`, o `routed_id` do nó) -- o que vai em `x-route-id`\n * e vira `audit.events.route_id`/`route_name`. Só quando o último nó é uma página de verdade (tem\n * router): grupo puramente organizacional não é tela. Antes de 2026-10-05 ia o router_id aqui, e a\n * auditoria não achava o nome (o argos-auth-server ainda traduz router_id → rota, por compatibilidade).\n */\n get routeId(): string | null {\n const page = this.page;\n return page && routerIdOf(page) ? page.routed_id ?? null : null;\n }\n}\n","import { Injectable, inject } from '@angular/core';\nimport { HttpEvent, HttpHandler, HttpInterceptor, HttpRequest } from '@angular/common/http';\nimport { Observable } from 'rxjs';\nimport { SPINE_CONFIG } from '@trismegisto/spine';\nimport { LoggerService } from './logger.service';\n\n/** Must match `@orfeu/node`/`orfeu` (Python)'s `ROUTE_ID_HEADER` (`x-route-id`). */\nexport const ROUTE_ID_HEADER = 'X-Route-Id';\n/** Must match `@orfeu/node`/`orfeu` (Python)'s `CLIENT_ID_HEADER` (`x-client-id`): which app (client) the action came from. */\nexport const CLIENT_ID_HEADER = 'X-Client-Id';\n\n/**\n * Attaches the current screen's ROUTE id — `web.routes.route_id` of the page node (`routed_id`), NOT the\n * `router_id` the spine uses to identify the screen (see `LoggerService.routeId`) — and the app's `clientId`\n * from `SpineConfig` as headers on every outgoing HTTP\n * request, read from `LoggerService` (updated by `ViewGuard` on every\n * navigation — see view.guard.ts). This is a caller-supplied correlation tag\n * consumed by Orfeu's structured operation logs to correlate an\n * operation_id with the route that triggered it; it is never verified\n * server-side and never used for permission checks.\n *\n * Applied globally (registered once by `provideShell`, not per-service) so\n * every app gets the correlation for free — an extra header a third-party\n * API doesn't recognize is harmless, so there's no need to scope this to\n * only Orfeu-guarded backends.\n */\n@Injectable()\nexport class RouteIdInterceptor implements HttpInterceptor {\n private readonly clientId = inject(SPINE_CONFIG, { optional: true })?.clientId;\n\n constructor(private loggerService: LoggerService) {}\n\n intercept(req: HttpRequest<unknown>, next: HttpHandler): Observable<HttpEvent<unknown>> {\n const setHeaders: Record<string, string> = {};\n if (!req.headers.has(ROUTE_ID_HEADER)) {\n const routeId = this.loggerService.routeId;\n if (routeId) setHeaders[ROUTE_ID_HEADER] = routeId;\n }\n if (this.clientId && !req.headers.has(CLIENT_ID_HEADER)) setHeaders[CLIENT_ID_HEADER] = this.clientId;\n\n return Object.keys(setHeaders).length ? next.handle(req.clone({ setHeaders })) : next.handle(req);\n }\n}\n","import { Route, spineBuiltinPageAt } from '@trismegisto/spine';\n\n/**\n * Lógica pura de resolução da árvore de rotas vinda do backend (`ViewService.currentView`) —\n * compartilhada entre `ViewGuard` (gate de navegação real) e `resolveSpineRoute` (resolução por\n * painel do workspace, sem depender do `Router`). Extraída daqui porque as duas precisavam do\n * mesmo algoritmo de busca e tinham cópias divergentes antes desta reescrita.\n */\n\n/** Acha uma rota cujo `route_redirect` bate com `urlAtLevel`, atravessando ancestrais\n * \"transparentes\" (sem `route_redirect` próprio — só agrupam os filhos). */\nexport function findRouteThrough(routes: Route[], urlAtLevel: string): Route | null {\n const direct = routes.find((r) => r.route_redirect === urlAtLevel);\n if (direct) return direct;\n\n for (const transparent of routes.filter((r) => !r.route_redirect)) {\n const found = findRouteThrough(transparent.routes ?? [], urlAtLevel);\n if (found) return found;\n }\n\n return null;\n}\n\n/** Primeira rota navegável (DFS), atravessando grupos transparentes — usada como fallback\n * quando a URL alvo não bate com nada na view atual. */\nexport function findFirstNavigable(routes: Route[]): 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 = findFirstNavigable(r.routes);\n if (found) return found;\n }\n }\n return null;\n}\n\n/**\n * Resolve a cadeia INTEIRA de rotas (header→navigation→menu→item→submenu→page, até onde a URL\n * for funda) pra uma URL qualquer, lendo só `currentRoutes`/`getLevel`/`getUrlAtLevel` — as\n * mesmas três primitivas que `ViewGuard` já usava, sem tocar no `Router`. `chain[0]` é o nível 1\n * (header), não existe nível 0 — mantém a mesma convenção 1-based do `ViewGuard` original.\n */\nexport function resolveRouteChain(\n currentRoutes: Route[],\n getLevel: (url: string) => number,\n getUrlAtLevel: (url: string, level: number) => string,\n url: string,\n): Route[] | null {\n if (!currentRoutes.length) return null;\n // Só o caminho decide a tela: a query (os parâmetros de uma aba) e o fragmento não entram, qualquer que seja o\n // ViewService (o do Orfeu já tira; aqui não depende disso).\n const path = url.split(/[?#]/)[0] || url;\n return walkRouteChain(currentRoutes, getLevel, getUrlAtLevel, path) ?? builtinChain(path);\n}\n\nfunction walkRouteChain(\n currentRoutes: Route[],\n getLevel: (url: string) => number,\n getUrlAtLevel: (url: string, level: number) => string,\n url: string,\n): Route[] | null {\n const levels = getLevel(url);\n const chain: Route[] = [];\n let pool = currentRoutes;\n\n for (let level = 1; level <= levels; level++) {\n const urlAtLevel = getUrlAtLevel(url, level);\n const found = findRouteThrough(pool, urlAtLevel);\n if (!found) return null;\n chain.push(found);\n pool = found.routes ?? [];\n }\n\n return chain;\n}\n\n/** Página do próprio spine (`registerSpineBuiltinPage`) quando a árvore do app não tem o endereço: cadeia de um nó. */\nfunction builtinChain(url: string): Route[] | null {\n const page = spineBuiltinPageAt(url);\n return page ? [page.route] : null;\n}\n\n/** Teto de redirecionamentos em cascata antes de desistir. */\nconst MAX_CASCADE_REDIRECTS = 8;\n\n/**\n * `resolveRouteChain`, mas descendo sozinho quando o nó final tem filhos e nenhum conteúdo\n * próprio — o mesmo comportamento que o `RouterComponent` antigo tinha (cada nível, ao pousar\n * numa rota com `routes.length > 0`, `router.navigate([routes[0].route_redirect])`), perdido na\n * reescrita porque não existe mais uma cadeia de guardas por nível. Sem isto, clicar num nó\n * puramente organizacional (ex.: \"Solicitações\", que só agrupa Configuração/Inventário/etc. e não\n * tem `route_id` de página nenhuma) cai em \"Nenhum conteúdo disponível\" — achado real, 2026-09-28.\n */\nexport function resolveEffectiveRouteChain(\n currentRoutes: Route[],\n getLevel: (url: string) => number,\n getUrlAtLevel: (url: string, level: number) => string,\n url: string,\n): Route[] | null {\n let target = url;\n\n for (let hop = 0; hop <= MAX_CASCADE_REDIRECTS; hop++) {\n const chain = resolveRouteChain(currentRoutes, getLevel, getUrlAtLevel, target);\n if (!chain) return null;\n\n // Primeiro descendente navegável, atravessando grupos transparentes (mesma regra do\n // `findRouteThrough`). Com só `routes[0].route_redirect`, um nó cujo primeiro filho é um grupo\n // sem endereço parava em si mesmo — e o `ViewGuard` redirecionava para a própria URL, em laço.\n const next = findFirstNavigable(chain.at(-1)?.routes ?? []);\n if (!next) return chain;\n\n target = next;\n }\n\n return null;\n}\n","import { Injectable } from '@angular/core';\nimport { ActivatedRouteSnapshot, CanActivate, Route as NgRoute, Router, RouterStateSnapshot } from '@angular/router';\nimport { AuthorizationService, ViewService } from '@orfeu/angular/core';\nimport { spineRoutesOf } from '@trismegisto/spine';\nimport { findFirstNavigable, resolveEffectiveRouteChain, resolveRouteChain } from './route-chain';\n\n/**\n * Gate de navegação REAL (deep link, F5, `router.navigateByUrl` do painel focado — ver\n * `SpineWorkspaceNavService`). Não desenha mais nada nem alimenta breadcrumb/sidebar: isso agora\n * é responsabilidade de cada painel do workspace (`resolveSpineRoute`, chamado direto por quem\n * precisa da cadeia). O guard só confirma que a URL resolve contra a view atual — senão redireciona\n * pro fallback navegável ou pra `/no-permission` — e existe numa única rota coringa (ver\n * `private.routes.ts`), não mais em 6 níveis de rota aninhada.\n *\n * Duas saídas de acesso, nesta ordem:\n * - **`/blocked`** — autenticado, mas sem nenhum grupo vinculado a esta aplicação (o token sai\n * com `badges` vazio: o argos só dá crachá por grupo do project do client). Vale mesmo que o\n * app tenha rotas públicas: quem não é de nenhum grupo do app não entra nele;\n * - **`/no-permission`** — tem grupo, mas a view não trouxe rota nenhuma (os grupos não têm\n * permissão e o app não tem rota pública).\n */\n@Injectable({ providedIn: 'root' })\nexport class ViewGuard implements CanActivate {\n constructor(\n private router: Router,\n private viewService: ViewService,\n private auth: AuthorizationService,\n ) { }\n\n canActivate(_route: ActivatedRouteSnapshot, state: RouterStateSnapshot): boolean {\n return this.checkRoute(state.url);\n }\n\n canActivateChild(_route: ActivatedRouteSnapshot, state: RouterStateSnapshot): boolean {\n return this.checkRoute(state.url);\n }\n\n canLoad(route: NgRoute): boolean {\n return this.checkRoute('/' + (route.path || ''));\n }\n\n private checkRoute(url: string): boolean {\n // Árvore com irmãos de mesmo endereço já fundidos (header + navigation \"laboratorio\") — ver `mergeRouteTree`.\n const currentRoutes = spineRoutesOf(this.viewService.currentView);\n\n if (this.auth.authenticated && !this.auth.badges.length) {\n this.router.navigate(['/blocked']);\n return false;\n }\n\n if (!currentRoutes.length) {\n this.router.navigate(['/no-permission']);\n return false;\n }\n\n const chain = resolveRouteChain(\n currentRoutes,\n (u) => this.viewService.getLevel(u),\n (u, level) => this.viewService.getUrlAtLevel(u, level),\n url,\n );\n\n if (!chain) {\n const fallback = findFirstNavigable(currentRoutes);\n this.router.navigate([fallback ?? '/no-permission']);\n return false;\n }\n\n // Pousou num nó puramente organizacional (tem filhos, nenhum conteúdo próprio — ex.:\n // \"Solicitações\", que só agrupa Configuração/Inventário/etc.) — encaminha pro primeiro filho\n // navegável, recursivamente, mesmo comportamento em cascata que o `RouterComponent` antigo\n // tinha por nível (achado real, 2026-09-28: sem isto, cai em \"Nenhum conteúdo disponível\").\n if ((chain.at(-1)?.routes?.length ?? 0) > 0) {\n const effective = resolveEffectiveRouteChain(\n currentRoutes,\n (u) => this.viewService.getLevel(u),\n (u, level) => this.viewService.getUrlAtLevel(u, level),\n url,\n );\n const target = effective?.at(-1)?.route_redirect;\n this.router.navigate([target ?? '/no-permission']);\n return false;\n }\n\n return true;\n }\n}\n","import { InjectionToken, Type } from '@angular/core';\n\n/**\n * Manual de uma tela, declarado no `document` da própria `ComponentRoute` (mesma chave, o router_id).\n * Os textos são Markdown buscado só quando alguém abre a documentação: nos apps, um `import()` do `.md`\n * com o loader `text`, de modo que o conteúdo vai no chunk lazy da tela e não no carregamento inicial.\n */\nexport interface RouteDocument {\n /** Nome da tela no índice da documentação; se faltar, usa-se o rótulo da rota na árvore do usuário. */\n title?: string;\n /** Seção do índice em que a tela aparece; se faltar, usa-se o módulo de topo que a contém. */\n group?: string;\n /** Texto para quem usa a tela no dia a dia (normalmente o `README.md` dela). */\n load: () => Promise<string>;\n /**\n * Especificação técnica, para desenvolvimento (normalmente o `ESPECIFICACAO.md`). Só aparece com\n * `SpineConfig.technicalDocs` ativo — por padrão, apenas em `isDevMode()`.\n */\n loadTechnical?: () => Promise<string>;\n}\n\n/**\n * Uma tela do app. A chave é o ROUTER (`web.router.router_id` do client -- a posição da tela na\n * navegação, o `router_id` do nó 'page' da view), nunca o `web.routes.route_id` (a rota é só\n * nome/ícone/path, reaproveitável em vários routers). Tela de template (ex.: auto-serviço) usa\n * `source_template_router_id` -- o router do TEMPLATE, igual em todos os clients vinculados.\n */\nexport interface ComponentRoute {\n /** `router_id` (web.router do client) da tela. */\n id?: string;\n /** Componente da tela, via `import()` dinâmico (code-splitting por tela). */\n load?: () => Promise<Type<any>>;\n /** Documentação da tela, exibida pelo botão de documentação da barra da página. */\n document?: RouteDocument;\n\n // Alternativa a `id`: source_template_router_id casa com QUALQUER client vinculado ao\n // template de origem daquele router (uso por pacotes plugáveis tipo @trismegisto/spine/auto-service,\n // que não conhecem o router_id materializado de cada client -- só o router_id do próprio\n // template, estável). Ver ComponentDistributorService.getComponent.\n source_template_router_id?: string;\n}\n\n/** `id` (router_id) da entrada. O formato antigo (`route_id`) saiu na 3.3.1. */\nexport function componentRouterId(route: ComponentRoute): string | undefined {\n return route.id;\n}\n\n/** Carregador da entrada. O formato antigo (`component`) saiu na 3.3.1. */\nexport function componentRouteLoader(route: ComponentRoute): (() => Promise<Type<any>>) | undefined {\n return route.load;\n}\n\n// multi: true -- vários providers (o app via provideShell + pacotes plugáveis via\n// provideAutoService e afins) contribuem cada um com seu próprio array, combinados\n// pelo ComponentDistributorService.\nexport const COMPONENT_ROUTES = new InjectionToken<ComponentRoute[]>('COMPONENT_ROUTES');\n","import { Component, Inject, Injectable, Optional, Type, ChangeDetectionStrategy, computed, inject, signal } from '@angular/core';\nimport { Router } from '@angular/router';\nimport { StatePageComponent } from '@trismegisto/angular/state-page';\nimport { ComponentRoute, COMPONENT_ROUTES, componentRouterId, componentRouteLoader } from './component-routes.token';\nimport { SPINE_MESSAGES, spineBuiltinPageById } from '@trismegisto/spine';\nimport { formatMessage } from '@trismegisto/primitives/i18n';\n\n/**\n * Componente devolvido por `getComponent` quando não há entrada registrada pro `router_id` (ou o\n * import dela falhou) — nasce via `createComponent`/`ngComponentOutlet` em `SpinePagePanelComponent`,\n * então roda **fora** do encapsulamento de estilo de quem o monta e precisa do próprio CSS (as\n * custom properties `--hm-*` herdam normalmente pela árvore, encapsulamento não bloqueia isso).\n *\n * Aqui a rota EXISTE na árvore (por isso chegou um `router_id`), só falta a tela publicada por trás — o\n * código dela vai na descrição pra quem opera saber o que registrar, e o botão devolve pra raiz do\n * app. A ilustração é a `IllustrationNotFoundComponent` (ver o componente pra origem/licenciamento do\n * desenho).\n */\n@Component({\n selector: 'spine-no-content',\n // Página pronta do hermes (`hm-state-page`, tipo \"no-content\"): título, ilustração e ação vêm de\n // lá; aqui só entra a descrição com o código da rota pra quem opera saber o que registrar.\n template: `<hm-state-page kind=\"no-content\" [description]=\"description()\" (actionTriggered)=\"irParaInicio()\" />`,\n // O painel do workspace é coluna flex: o host cresce pra ocupar a área toda e centralizar.\n styles: [`:host { display: flex; flex-direction: column; flex: 1; min-block-size: 100%; }`],\n imports: [StatePageComponent],\n changeDetection: ChangeDetectionStrategy.OnPush,\n standalone: true,\n})\nclass NoContentComponent {\n private readonly distributor = inject(ComponentDistributorService);\n private readonly text = inject(SPINE_MESSAGES).routing;\n private readonly router = inject(Router);\n\n protected readonly description = computed(() => {\n const routerId = this.distributor.lastMissingRouterId();\n return routerId ? formatMessage(this.text.notPublishedCode, { code: routerId }) : this.text.notPublished;\n });\n\n protected irParaInicio(): void {\n void this.router.navigateByUrl('/');\n }\n}\n\n/**\n * O import dinâmico falhou porque o arquivo da tela não existe mais no servidor — saiu um build novo\n * enquanto a aba estava aberta e os chunks antigos foram trocados. Mensagens dos navegadores:\n * Chrome/Edge \"Failed to fetch dynamically imported module\", Firefox \"error loading dynamically\n * imported module\", Safari \"Importing a module script failed\", webpack \"Loading chunk N failed\" /\n * `ChunkLoadError`.\n */\nexport function isChunkLoadError(err: unknown): boolean {\n const e = err as { name?: string; message?: string } | null;\n if (e?.name === 'ChunkLoadError') return true;\n return /dynamically imported module|importing a module script failed|loading (css )?chunk [\\w-]+ failed/i.test(e?.message ?? '');\n}\n\n/**\n * Componente devolvido por `getComponent` quando a tela não carrega porque a aplicação foi atualizada\n * (ver `isChunkLoadError`): em vez de \"tela não publicada\", a página pronta `outdated` do hermes, cujo\n * botão recarrega a página — a versão nova vem com os arquivos certos.\n */\n@Component({\n selector: 'spine-outdated',\n template: `<hm-state-page kind=\"outdated\" (actionTriggered)=\"recarregar()\" />`,\n styles: [`:host { display: flex; flex-direction: column; flex: 1; min-block-size: 100%; }`],\n imports: [StatePageComponent],\n changeDetection: ChangeDetectionStrategy.OnPush,\n standalone: true,\n})\nclass OutdatedComponent {\n protected recarregar(): void {\n window.location.reload();\n }\n}\n\n@Injectable({ providedIn: 'root' })\nexport class ComponentDistributorService {\n\n private components: ComponentRoute[];\n\n /**\n * `router_id` da última falha (sem entrada registrada ou import quebrado) — lido por\n * `NoContentComponent` pra montar a descrição (ver comentário dela). Sinal só, não por\n * instância: se dois painéis erram ao mesmo tempo, o texto de um pode piscar o código do\n * outro por um instante — aceitável, é só o que a mensagem de suporte mostra, nenhuma decisão\n * de roteamento depende disto.\n */\n readonly lastMissingRouterId = signal('');\n\n // COMPONENT_ROUTES é multi: true -- cada provider (provideShell, provideAutoService,\n // etc.) contribui com seu próprio ComponentRoute[], injetado aqui como\n // ComponentRoute[][] (um array por provider). Achata numa lista só.\n constructor(@Optional() @Inject(COMPONENT_ROUTES) routes: ComponentRoute[][] | null) {\n this.components = (routes ?? []).flat();\n }\n\n /** Todas as entradas registradas (app + pacotes plugáveis) -- lidas pela documentação. */\n get entries(): readonly ComponentRoute[] {\n return this.components;\n }\n\n // A tela é identificada pelo ROUTER: primeiro o router_id do client (entrada `id` do app), depois\n // o source_template_router_id (router do template, igual em todos os clients vinculados -- é o\n // que pacotes plugáveis como o auto-serviço registram, já que o router_id da cópia muda por\n // client). Nessa ordem, uma customização feita direto no client sempre vence o componente\n // genérico do pacote.\n async getComponent(routerId: string, source_template_router_id?: string | null): Promise<Type<any>> {\n const target = routerId?.toLowerCase();\n let entry = target ? this.components.find(c => componentRouterId(c)?.toLowerCase() === target) : undefined;\n\n if (!entry && source_template_router_id) {\n const templateTarget = source_template_router_id.toLowerCase();\n entry = this.components.find(c => c.source_template_router_id?.toLowerCase() === templateTarget);\n }\n\n // Página do próprio spine (ver `registerSpineBuiltinPage`): só quando nenhuma entrada do app/pacote casou.\n const builtin = entry ? null : spineBuiltinPageById(routerId);\n if (!entry && !builtin) {\n this.lastMissingRouterId.set(routerId);\n return NoContentComponent;\n }\n try {\n const load = builtin ? builtin.load : componentRouteLoader(entry!);\n if (!load) throw new Error('[hermes-spine] entrada de COMPONENT_ROUTES sem `load`');\n return await load();\n } catch (err) {\n console.error(`Erro ao carregar componente para ${routerId}:`, err);\n if (isChunkLoadError(err)) return OutdatedComponent;\n this.lastMissingRouterId.set(routerId);\n return NoContentComponent;\n }\n }\n}\n","import { Type } from '@angular/core';\nimport { Route, routerIdOf } from '@trismegisto/spine';\nimport { resolveRouteChain } from './route-chain';\nimport { ComponentDistributorService } from './component-distributor.service';\n\n/**\n * Traduz uma URL na cadeia de rotas do backend (header→navigation→menu→item→submenu→page) e no\n * componente da folha — sem passar pelo `Router` do Angular. É o que torna o painel do workspace\n * possível — o `Router` tem uma URL só; um painel não-focado precisa resolver a dele de forma\n * independente. Anda-se na árvore `Route[]` que o backend manda (`ViewService.currentView`), a\n * mesma que `ViewGuard` lia.\n */\nexport interface ResolvedSpineRoute {\n /** A cadeia inteira, nível 1 (header) até onde a URL alcançar. `chain.at(-1)` é sempre o nível\n * 'page' — é dele que `component` vem. Níveis intermediários (`item`/`submenu`) com mais de um\n * irmão são o que vira aba de submenu/multipágina no painel. */\n readonly chain: Route[];\n readonly component: Type<unknown>;\n}\n\nexport async function resolveSpineRoute(\n currentRoutes: Route[],\n getLevel: (url: string) => number,\n getUrlAtLevel: (url: string, level: number) => string,\n distributor: ComponentDistributorService,\n url: string,\n): Promise<ResolvedSpineRoute | null> {\n const chain = resolveRouteChain(currentRoutes, getLevel, getUrlAtLevel, url);\n if (!chain || !chain.length) return null;\n\n const leaf = chain[chain.length - 1];\n const component = await distributor.getComponent(routerIdOf(leaf) ?? '', leaf.source_template_router_id);\n return { chain, component };\n}\n","export * from './logger.service';\nexport * from './route-id.interceptor';\nexport * from './view.guard';\nexport * from './component-routes.token';\nexport * from './component-distributor.service';\nexport * from './route-chain';\nexport * from './resolve-route';\n\n// `router/`, `navigation/submenus/`, `navigation/multipages/` e `component-factory/` (a rota aninhada de 6\n// níveis do Angular, trocada pela resolução por painel do workspace: resolve-route.ts + layout/src/workspace/)\n// eram órfãos sem export e saíram na 3.3.1.\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1.LoggerService"],"mappings":"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"}
|
|
@@ -8,8 +8,9 @@ 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
|
|
11
|
+
import { StatePageComponent } from '@trismegisto/angular/state-page';
|
|
12
12
|
import { HTTP_INTERCEPTORS } from '@angular/common/http';
|
|
13
|
+
import { ToastStackComponent } from '@trismegisto/angular/toast';
|
|
13
14
|
|
|
14
15
|
// Movido para o pacote raiz (ver package-info.token.ts) — reexportado aqui para não quebrar
|
|
15
16
|
// quem importa `APP_PACKAGE_INFO`/`PackageInfo` de '@trismegisto/spine/shell'.
|
|
@@ -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/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 // Mesma regra do `isSafeReturnUrl` do `@orfeu/angular`: só caminho relativo ao app. `//host` e `/\\host`\n // (o navegador trata a barra invertida como `/`) seriam endereço de outra origem.\n return url && url.startsWith('/') && !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.OnPush,\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.OnPush,\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 { EnvironmentProviders, makeEnvironmentProviders } from '@angular/core';\nimport { HTTP_INTERCEPTORS } from '@angular/common/http';\nimport { COMPONENT_ROUTES, ComponentRoute, RouteIdInterceptor } from '@trismegisto/spine/routing';\nimport { provideSpineSuggestionsPage } from '@trismegisto/spine/layout';\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\n // multi: true -- este provider é só UMA das fontes de COMPONENT_ROUTES (a do próprio\n // app). 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: appComponents, multi: true },\n { provide: HTTP_INTERCEPTORS, useClass: RouteIdInterceptor, multi: true },\n // Páginas do próprio spine, fora da árvore do backend (só com o recurso ligado).\n provideSpineSuggestionsPage(),\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.OnPush,\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.OnPush,\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/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/state-page';\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 // Mesma regra do `isSafeReturnUrl` do `@orfeu/angular`: só caminho relativo ao app. `//host` e `/\\host`\n // (o navegador trata a barra invertida como `/`) seriam endereço de outra origem.\n return url && url.startsWith('/') && !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/state-page';\n\n@Component({\n selector: 'loggedout',\n imports: [StatePageComponent],\n templateUrl: './loggedout.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\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.OnPush,\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 { EnvironmentProviders, makeEnvironmentProviders } from '@angular/core';\nimport { HTTP_INTERCEPTORS } from '@angular/common/http';\nimport { COMPONENT_ROUTES, ComponentRoute, RouteIdInterceptor } from '@trismegisto/spine/routing';\nimport { provideSpineSuggestionsPage } from '@trismegisto/spine/layout';\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\n // multi: true -- este provider é só UMA das fontes de COMPONENT_ROUTES (a do próprio\n // app). 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: appComponents, multi: true },\n { provide: HTTP_INTERCEPTORS, useClass: RouteIdInterceptor, multi: true },\n // Páginas do próprio spine, fora da árvore do backend (só com o recurso ligado).\n provideSpineSuggestionsPage(),\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/state-page';\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.OnPush,\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/state-page';\nimport { ToastStackComponent } from '@trismegisto/angular/toast';\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.OnPush,\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,11 +1,14 @@
|
|
|
1
1
|
import * as i0 from '@angular/core';
|
|
2
2
|
import { Injectable, inject, DestroyRef, ViewContainerRef, ViewChild, ChangeDetectionStrategy, Component } from '@angular/core';
|
|
3
|
-
import { HermesLoadingState
|
|
3
|
+
import { HermesLoadingState } from '@trismegisto/primitives/loading-state';
|
|
4
4
|
import { BehaviorSubject, Subject } from 'rxjs';
|
|
5
5
|
import { take } from 'rxjs/operators';
|
|
6
6
|
import * as i2 from '@angular/common';
|
|
7
7
|
import { CommonModule } from '@angular/common';
|
|
8
8
|
import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
|
|
9
|
+
import { ButtonComponent } from '@trismegisto/angular/button';
|
|
10
|
+
import { DrawerComponent } from '@trismegisto/angular/drawer';
|
|
11
|
+
import { HERMES_MESSAGES } from '@trismegisto/angular/i18n';
|
|
9
12
|
|
|
10
13
|
class SidePanelService {
|
|
11
14
|
constructor() {
|