@dev-tcloud/tcloud-ui 7.7.5 → 7.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/fesm2022/dev-tcloud-tcloud-ui.mjs +331 -35
- package/fesm2022/dev-tcloud-tcloud-ui.mjs.map +1 -1
- package/js/tcloud-ui-app.js +57 -58
- package/package.json +1 -1
- package/scss/tcloud/themes/_classic-standard.scss +0 -1
- package/scss/tcloud/themes/_dark.scss +0 -1
- package/types/dev-tcloud-tcloud-ui.d.ts +186 -10
|
@@ -2,16 +2,31 @@ import * as i0 from '@angular/core';
|
|
|
2
2
|
import { Injectable, Component, EventEmitter, Input, Output, InjectionToken, Optional, Inject, inject, signal, Pipe, forwardRef, ViewChild, input, effect, Directive, ViewEncapsulation, HostListener, HostBinding, SkipSelf, ChangeDetectionStrategy, ChangeDetectorRef, computed, ApplicationRef, output, model, numberAttribute, booleanAttribute, ContentChildren, viewChild, EnvironmentInjector, createComponent, ViewContainerRef, NgModule, makeEnvironmentProviders, DOCUMENT } from '@angular/core';
|
|
3
3
|
import * as i1$1 from '@angular/common';
|
|
4
4
|
import { DatePipe, CommonModule } from '@angular/common';
|
|
5
|
-
import { Subject, Subscription, BehaviorSubject, debounceTime, distinctUntilChanged, map } from 'rxjs';
|
|
5
|
+
import { Subject, Subscription, BehaviorSubject, firstValueFrom, debounceTime, distinctUntilChanged, map, catchError, switchMap, throwError } from 'rxjs';
|
|
6
6
|
import * as i1 from '@angular/forms';
|
|
7
7
|
import { NG_VALUE_ACCESSOR, FormsModule, FormControl, ReactiveFormsModule, NG_VALIDATORS, Validators, FormGroup } from '@angular/forms';
|
|
8
8
|
import * as i1$2 from '@angular/router';
|
|
9
9
|
import { Router, RouterModule } from '@angular/router';
|
|
10
|
+
import * as i1$3 from '@angular/common/http';
|
|
11
|
+
import { HttpClient, HttpErrorResponse, provideHttpClient, withInterceptorsFromDi, withInterceptors } from '@angular/common/http';
|
|
10
12
|
import hljs from 'highlight.js';
|
|
11
13
|
import * as i2 from 'ngx-markdown';
|
|
12
14
|
import { MarkdownModule, provideMarkdown } from 'ngx-markdown';
|
|
13
|
-
import
|
|
14
|
-
|
|
15
|
+
import { map as map$1 } from 'rxjs/operators';
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* Aplica os defaults da configuração de auth. Centraliza as chaves padrão
|
|
19
|
+
* (`currentUser`/`currentEnv`/versão 2) para os serviços lerem sem repetir lógica.
|
|
20
|
+
*/
|
|
21
|
+
function withAuthDefaults(config) {
|
|
22
|
+
return {
|
|
23
|
+
host: '',
|
|
24
|
+
...(config ?? {}),
|
|
25
|
+
localStorageName: config?.localStorageName ?? 'currentUser',
|
|
26
|
+
sessionStorageName: config?.sessionStorageName ?? 'currentEnv',
|
|
27
|
+
userInfoVersion: config?.userInfoVersion ?? 2,
|
|
28
|
+
};
|
|
29
|
+
}
|
|
15
30
|
|
|
16
31
|
class TCloudUiAccordionService {
|
|
17
32
|
constructor() {
|
|
@@ -192,6 +207,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImpo
|
|
|
192
207
|
* Token de injeção para a configuração do TCloud UI
|
|
193
208
|
*/
|
|
194
209
|
const TCLOUD_UI_CONFIG = new InjectionToken('TCLOUD_UI_CONFIG');
|
|
210
|
+
/**
|
|
211
|
+
* Token de injeção para a configuração do núcleo de autenticação.
|
|
212
|
+
* Alimentado pelo projeto consumidor via `provideTCloudUi({ auth: {...} })`
|
|
213
|
+
* ou `TCloudUiModule.forRoot({ auth: {...} })`.
|
|
214
|
+
*/
|
|
215
|
+
const TCLOUD_UI_AUTH_CONFIG = new InjectionToken('TCLOUD_UI_AUTH_CONFIG');
|
|
195
216
|
/**
|
|
196
217
|
* Token de injeção para o serviço de usuário customizado
|
|
197
218
|
*/
|
|
@@ -3748,14 +3769,14 @@ class TCloudUiModalComponent {
|
|
|
3748
3769
|
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.17", type: TCloudUiModalComponent, isStandalone: true, selector: "tcloud-ui-modal", inputs: { confirm: "confirm", confirmText: "confirmText", confirmInput: "confirmInput", autoClose: "autoClose", title: "title", maxWidth: "maxWidth", position: "position", sticky: "sticky", window: "window", open: "open", loading: "loading" }, outputs: { openChange: "openChange", toConfirm: "toConfirm", toCancel: "toCancel", toAction: "toAction" }, providers: [
|
|
3749
3770
|
TcloudModalService,
|
|
3750
3771
|
TCloudUiLayoutService
|
|
3751
|
-
], ngImport: i0, template: "@if (control_open) {\n <div class=\"tc-background-modal\" >{{ checkIsOpen() }}</div>\n}\n\n@if (open) {\n <div class=\"tcloud-ui-modal base-modal tcloud-ui-modal-layout-{{ layout }} tcloud-ui-modal-postition-{{ position }}\" [attr.data-layout]=\"layout\">\n <div class=\"sub-modal\" [ngClass]=\"['position-' + position, sticky ? 'is-sticky' : '']\" animate.enter=\"modal-fade-enter\" animate.leave=\"modal-fade-leave\">\n <div class=\"tc-modal tc-modal-shadow\" [style.max-width.px]=\"maxWidth\" [class.tcloud-ui-modal-sticky]=\"sticky\">\n <div class=\"area-top-actions tc-ui-modal-{{mode}}\">\n @if( layout === 'classic'){\n <button type=\"button\" class=\"tc-btn-action-close-ui-modal\" [class.no-use-header]=\"title\" (click)=\"toClose()\" [disabled]=\"loading\">\n @if (!loading) {\n <i class=\"fas fa-times\"></i>\n }\n @if (loading) {\n <i class=\"fas fa-spinner fa-spin\"></i>\n }\n </button>\n }@else{\n <button type=\"button\" class=\"tc-rev-btn-square tc-btn-x\" [class.no-use-header]=\"title\" (click)=\"toClose()\" [disabled]=\"loading\">\n @if (!loading) {\n <i class=\"fas fa-times\"></i>\n }\n @if (loading) {\n <i class=\"fas fa-spinner fa-spin\"></i>\n }\n </button>\n }\n </div>\n @if (title) {\n <h4 [innerHTML]=\"title\"></h4>\n }\n <ng-content></ng-content>\n </div>\n </div>\n </div>\n}\n\n<!-- Ex: Modal -->\n<!--\n<tcloud-ui-modal [(open)]=\"open\">\n\n <tcloud-ui-modal-header title=\"T\u00EDtulo do Modal\" ></tcloud-ui-modal-header>\n\n <tcloud-ui-modal-body>\n Conte\u00FAdo do modal aqui\n </tcloud-ui-modal-body>\n\n <tcloud-ui-modal-footer></tcloud-ui-modal-footer>\n\n</tcloud-ui-modal>\n\n<button type=\"button\" (click)=\"open = !open\">open modal {{ open }}</button>\n-->\n\n<!-- ****** -->\n<!-- ****** -->\n<!-- ****** -->\n<!-- ****** -->\n\n<!-- Ex: Confirm Modal -->\n<!--\n<tcloud-ui-modal [(open)]=\"open_confirm\" [title]=\"'Aten\u00E7\u00E3o'\" [confirmText]=\"'Aceito'\" [confirm]=\"true\" (toAction)=\"$event\" >\n\n <tcloud-ui-modal-body>Deseja realmente executar esta a\u00E7\u00E3o?</tcloud-ui-modal-body>\n\n <tcloud-ui-modal-footer></tcloud-ui-modal-footer>\n\n</tcloud-ui-modal>\n\n<button type=\"button\" (click)=\"open_confirm = !open_confirm\">open_confirm modal {{ open_confirm }}</button>\n-->", styles: [".tc-background-modal{position:fixed;width:100%;left:0;top:0;background-color
|
|
3772
|
+
], ngImport: i0, template: "@if (control_open) {\n <div class=\"tc-background-modal\" >{{ checkIsOpen() }}</div>\n}\n\n@if (open) {\n <div class=\"tcloud-ui-modal base-modal tcloud-ui-modal-layout-{{ layout }} tcloud-ui-modal-postition-{{ position }}\" [attr.data-layout]=\"layout\">\n <div class=\"sub-modal\" [ngClass]=\"['position-' + position, sticky ? 'is-sticky' : '']\" animate.enter=\"modal-fade-enter\" animate.leave=\"modal-fade-leave\">\n <div class=\"tc-modal tc-modal-shadow\" [style.max-width.px]=\"maxWidth\" [class.tcloud-ui-modal-sticky]=\"sticky\">\n <div class=\"area-top-actions tc-ui-modal-{{mode}}\">\n @if( layout === 'classic'){\n <button type=\"button\" class=\"tc-btn-action-close-ui-modal\" [class.no-use-header]=\"title\" (click)=\"toClose()\" [disabled]=\"loading\">\n @if (!loading) {\n <i class=\"fas fa-times\"></i>\n }\n @if (loading) {\n <i class=\"fas fa-spinner fa-spin\"></i>\n }\n </button>\n }@else{\n <button type=\"button\" class=\"tc-rev-btn-square tc-btn-x\" [class.no-use-header]=\"title\" (click)=\"toClose()\" [disabled]=\"loading\">\n @if (!loading) {\n <i class=\"fas fa-times\"></i>\n }\n @if (loading) {\n <i class=\"fas fa-spinner fa-spin\"></i>\n }\n </button>\n }\n </div>\n @if (title) {\n <h4 [innerHTML]=\"title\"></h4>\n }\n <ng-content></ng-content>\n </div>\n </div>\n </div>\n}\n\n<!-- Ex: Modal -->\n<!--\n<tcloud-ui-modal [(open)]=\"open\">\n\n <tcloud-ui-modal-header title=\"T\u00EDtulo do Modal\" ></tcloud-ui-modal-header>\n\n <tcloud-ui-modal-body>\n Conte\u00FAdo do modal aqui\n </tcloud-ui-modal-body>\n\n <tcloud-ui-modal-footer></tcloud-ui-modal-footer>\n\n</tcloud-ui-modal>\n\n<button type=\"button\" (click)=\"open = !open\">open modal {{ open }}</button>\n-->\n\n<!-- ****** -->\n<!-- ****** -->\n<!-- ****** -->\n<!-- ****** -->\n\n<!-- Ex: Confirm Modal -->\n<!--\n<tcloud-ui-modal [(open)]=\"open_confirm\" [title]=\"'Aten\u00E7\u00E3o'\" [confirmText]=\"'Aceito'\" [confirm]=\"true\" (toAction)=\"$event\" >\n\n <tcloud-ui-modal-body>Deseja realmente executar esta a\u00E7\u00E3o?</tcloud-ui-modal-body>\n\n <tcloud-ui-modal-footer></tcloud-ui-modal-footer>\n\n</tcloud-ui-modal>\n\n<button type=\"button\" (click)=\"open_confirm = !open_confirm\">open_confirm modal {{ open_confirm }}</button>\n-->", styles: [".tc-background-modal{border:1px solid var(--c-neutral-300);position:fixed;width:100%;left:0;top:0;background-color:#000;z-index:4005;height:100%;opacity:.3}.base-modal{height:100%;overflow:scroll;position:fixed;width:100%;z-index:4005;left:0;top:0;text-align:left!important}.sub-modal{padding:30px;position:absolute;width:100%;display:flex;justify-content:center;align-items:flex-start}.sub-modal.position-left{justify-content:flex-start}.sub-modal.position-right{justify-content:flex-end}.sub-modal.position-bottom{align-items:flex-end}.sub-modal{--modal-enter-from: translateY(-38%);--modal-leave-to: translateY(-38%)}.sub-modal.position-left{--modal-enter-from: translateX(-30%);--modal-leave-to: translateX(-30%)}.sub-modal.position-right{--modal-enter-from: translateX(30%);--modal-leave-to: translateX(30%)}.sub-modal.position-bottom{--modal-enter-from: translateY(30%);--modal-leave-to: translateY(30%)}.sub-modal.modal-fade-enter{animation:tcModalFadeIn .3s ease-out}.sub-modal.modal-fade-leave{animation:tcModalFadeOut .3s ease-out}@keyframes tcModalFadeIn{0%{opacity:0;transform:var(--modal-enter-from)}to{opacity:1;transform:translate(0)}}@keyframes tcModalFadeOut{0%{opacity:1;transform:translate(0)}to{opacity:0;transform:var(--modal-leave-to)}}@media(prefers-reduced-motion:reduce){.sub-modal.modal-fade-enter,.sub-modal.modal-fade-leave{animation:none}}.tc-modal{position:relative;background-color:var(--c-neutral-50);border:1px solid var(--c-neutral-200);padding:12px;border-radius:8px;margin:auto;width:100%;transition:max-width .3s ease-out}@media(prefers-reduced-motion:reduce){.tc-modal{transition:none}}.sub-modal.is-sticky{padding:0}.sub-modal.is-sticky>.tc-modal{border-radius:0}.sub-modal.is-sticky.position-left>.tc-modal{margin:0 auto 0 0}.sub-modal.is-sticky.position-right>.tc-modal{margin:0 0 0 auto}.sub-modal.is-sticky.position-bottom>.tc-modal{margin:auto 0 0}.sub-modal.is-sticky.position-center>.tc-modal,.sub-modal.is-sticky.position-bottom>.tc-modal{max-width:100%!important;width:100%!important}.tc-modal-shadow{-webkit-box-shadow:2px 2px 10px 0px rgba(0,0,0,.368627451);box-shadow:2px 2px 10px #0000005e}.tc-btn-x{min-height:25px!important;min-width:25px!important;height:25px;width:25px;margin-top:8px}.area-top-actions{position:absolute;top:2px;right:5px;z-index:1}.area-top-actions.tc-ui-modal-colorless button.tc-btn-action-close-ui-modal i{color:var(--c-neutral-600)!important}.area-top-actions button.tc-btn-action-close-ui-modal{cursor:pointer;background-color:transparent;border:none;font-size:15px;padding:5px 7px}.area-top-actions button.tc-btn-action-close-ui-modal i{font-size:17px;color:#fff;transition:all .25s;opacity:.7}.area-top-actions button.tc-btn-action-close-ui-modal i:hover{opacity:1!important}h4{font-size:16px;margin:5px 30px 10px 0;font-weight:700}.no-use-header i{color:var(--c-neutral-500)!important}.tcloud-ui-modal-sticky{height:100vh;overflow:hidden}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }] }); }
|
|
3752
3773
|
}
|
|
3753
3774
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: TCloudUiModalComponent, decorators: [{
|
|
3754
3775
|
type: Component,
|
|
3755
3776
|
args: [{ selector: 'tcloud-ui-modal', providers: [
|
|
3756
3777
|
TcloudModalService,
|
|
3757
3778
|
TCloudUiLayoutService
|
|
3758
|
-
], standalone: true, imports: [CommonModule], template: "@if (control_open) {\n <div class=\"tc-background-modal\" >{{ checkIsOpen() }}</div>\n}\n\n@if (open) {\n <div class=\"tcloud-ui-modal base-modal tcloud-ui-modal-layout-{{ layout }} tcloud-ui-modal-postition-{{ position }}\" [attr.data-layout]=\"layout\">\n <div class=\"sub-modal\" [ngClass]=\"['position-' + position, sticky ? 'is-sticky' : '']\" animate.enter=\"modal-fade-enter\" animate.leave=\"modal-fade-leave\">\n <div class=\"tc-modal tc-modal-shadow\" [style.max-width.px]=\"maxWidth\" [class.tcloud-ui-modal-sticky]=\"sticky\">\n <div class=\"area-top-actions tc-ui-modal-{{mode}}\">\n @if( layout === 'classic'){\n <button type=\"button\" class=\"tc-btn-action-close-ui-modal\" [class.no-use-header]=\"title\" (click)=\"toClose()\" [disabled]=\"loading\">\n @if (!loading) {\n <i class=\"fas fa-times\"></i>\n }\n @if (loading) {\n <i class=\"fas fa-spinner fa-spin\"></i>\n }\n </button>\n }@else{\n <button type=\"button\" class=\"tc-rev-btn-square tc-btn-x\" [class.no-use-header]=\"title\" (click)=\"toClose()\" [disabled]=\"loading\">\n @if (!loading) {\n <i class=\"fas fa-times\"></i>\n }\n @if (loading) {\n <i class=\"fas fa-spinner fa-spin\"></i>\n }\n </button>\n }\n </div>\n @if (title) {\n <h4 [innerHTML]=\"title\"></h4>\n }\n <ng-content></ng-content>\n </div>\n </div>\n </div>\n}\n\n<!-- Ex: Modal -->\n<!--\n<tcloud-ui-modal [(open)]=\"open\">\n\n <tcloud-ui-modal-header title=\"T\u00EDtulo do Modal\" ></tcloud-ui-modal-header>\n\n <tcloud-ui-modal-body>\n Conte\u00FAdo do modal aqui\n </tcloud-ui-modal-body>\n\n <tcloud-ui-modal-footer></tcloud-ui-modal-footer>\n\n</tcloud-ui-modal>\n\n<button type=\"button\" (click)=\"open = !open\">open modal {{ open }}</button>\n-->\n\n<!-- ****** -->\n<!-- ****** -->\n<!-- ****** -->\n<!-- ****** -->\n\n<!-- Ex: Confirm Modal -->\n<!--\n<tcloud-ui-modal [(open)]=\"open_confirm\" [title]=\"'Aten\u00E7\u00E3o'\" [confirmText]=\"'Aceito'\" [confirm]=\"true\" (toAction)=\"$event\" >\n\n <tcloud-ui-modal-body>Deseja realmente executar esta a\u00E7\u00E3o?</tcloud-ui-modal-body>\n\n <tcloud-ui-modal-footer></tcloud-ui-modal-footer>\n\n</tcloud-ui-modal>\n\n<button type=\"button\" (click)=\"open_confirm = !open_confirm\">open_confirm modal {{ open_confirm }}</button>\n-->", styles: [".tc-background-modal{position:fixed;width:100%;left:0;top:0;background-color
|
|
3779
|
+
], standalone: true, imports: [CommonModule], template: "@if (control_open) {\n <div class=\"tc-background-modal\" >{{ checkIsOpen() }}</div>\n}\n\n@if (open) {\n <div class=\"tcloud-ui-modal base-modal tcloud-ui-modal-layout-{{ layout }} tcloud-ui-modal-postition-{{ position }}\" [attr.data-layout]=\"layout\">\n <div class=\"sub-modal\" [ngClass]=\"['position-' + position, sticky ? 'is-sticky' : '']\" animate.enter=\"modal-fade-enter\" animate.leave=\"modal-fade-leave\">\n <div class=\"tc-modal tc-modal-shadow\" [style.max-width.px]=\"maxWidth\" [class.tcloud-ui-modal-sticky]=\"sticky\">\n <div class=\"area-top-actions tc-ui-modal-{{mode}}\">\n @if( layout === 'classic'){\n <button type=\"button\" class=\"tc-btn-action-close-ui-modal\" [class.no-use-header]=\"title\" (click)=\"toClose()\" [disabled]=\"loading\">\n @if (!loading) {\n <i class=\"fas fa-times\"></i>\n }\n @if (loading) {\n <i class=\"fas fa-spinner fa-spin\"></i>\n }\n </button>\n }@else{\n <button type=\"button\" class=\"tc-rev-btn-square tc-btn-x\" [class.no-use-header]=\"title\" (click)=\"toClose()\" [disabled]=\"loading\">\n @if (!loading) {\n <i class=\"fas fa-times\"></i>\n }\n @if (loading) {\n <i class=\"fas fa-spinner fa-spin\"></i>\n }\n </button>\n }\n </div>\n @if (title) {\n <h4 [innerHTML]=\"title\"></h4>\n }\n <ng-content></ng-content>\n </div>\n </div>\n </div>\n}\n\n<!-- Ex: Modal -->\n<!--\n<tcloud-ui-modal [(open)]=\"open\">\n\n <tcloud-ui-modal-header title=\"T\u00EDtulo do Modal\" ></tcloud-ui-modal-header>\n\n <tcloud-ui-modal-body>\n Conte\u00FAdo do modal aqui\n </tcloud-ui-modal-body>\n\n <tcloud-ui-modal-footer></tcloud-ui-modal-footer>\n\n</tcloud-ui-modal>\n\n<button type=\"button\" (click)=\"open = !open\">open modal {{ open }}</button>\n-->\n\n<!-- ****** -->\n<!-- ****** -->\n<!-- ****** -->\n<!-- ****** -->\n\n<!-- Ex: Confirm Modal -->\n<!--\n<tcloud-ui-modal [(open)]=\"open_confirm\" [title]=\"'Aten\u00E7\u00E3o'\" [confirmText]=\"'Aceito'\" [confirm]=\"true\" (toAction)=\"$event\" >\n\n <tcloud-ui-modal-body>Deseja realmente executar esta a\u00E7\u00E3o?</tcloud-ui-modal-body>\n\n <tcloud-ui-modal-footer></tcloud-ui-modal-footer>\n\n</tcloud-ui-modal>\n\n<button type=\"button\" (click)=\"open_confirm = !open_confirm\">open_confirm modal {{ open_confirm }}</button>\n-->", styles: [".tc-background-modal{border:1px solid var(--c-neutral-300);position:fixed;width:100%;left:0;top:0;background-color:#000;z-index:4005;height:100%;opacity:.3}.base-modal{height:100%;overflow:scroll;position:fixed;width:100%;z-index:4005;left:0;top:0;text-align:left!important}.sub-modal{padding:30px;position:absolute;width:100%;display:flex;justify-content:center;align-items:flex-start}.sub-modal.position-left{justify-content:flex-start}.sub-modal.position-right{justify-content:flex-end}.sub-modal.position-bottom{align-items:flex-end}.sub-modal{--modal-enter-from: translateY(-38%);--modal-leave-to: translateY(-38%)}.sub-modal.position-left{--modal-enter-from: translateX(-30%);--modal-leave-to: translateX(-30%)}.sub-modal.position-right{--modal-enter-from: translateX(30%);--modal-leave-to: translateX(30%)}.sub-modal.position-bottom{--modal-enter-from: translateY(30%);--modal-leave-to: translateY(30%)}.sub-modal.modal-fade-enter{animation:tcModalFadeIn .3s ease-out}.sub-modal.modal-fade-leave{animation:tcModalFadeOut .3s ease-out}@keyframes tcModalFadeIn{0%{opacity:0;transform:var(--modal-enter-from)}to{opacity:1;transform:translate(0)}}@keyframes tcModalFadeOut{0%{opacity:1;transform:translate(0)}to{opacity:0;transform:var(--modal-leave-to)}}@media(prefers-reduced-motion:reduce){.sub-modal.modal-fade-enter,.sub-modal.modal-fade-leave{animation:none}}.tc-modal{position:relative;background-color:var(--c-neutral-50);border:1px solid var(--c-neutral-200);padding:12px;border-radius:8px;margin:auto;width:100%;transition:max-width .3s ease-out}@media(prefers-reduced-motion:reduce){.tc-modal{transition:none}}.sub-modal.is-sticky{padding:0}.sub-modal.is-sticky>.tc-modal{border-radius:0}.sub-modal.is-sticky.position-left>.tc-modal{margin:0 auto 0 0}.sub-modal.is-sticky.position-right>.tc-modal{margin:0 0 0 auto}.sub-modal.is-sticky.position-bottom>.tc-modal{margin:auto 0 0}.sub-modal.is-sticky.position-center>.tc-modal,.sub-modal.is-sticky.position-bottom>.tc-modal{max-width:100%!important;width:100%!important}.tc-modal-shadow{-webkit-box-shadow:2px 2px 10px 0px rgba(0,0,0,.368627451);box-shadow:2px 2px 10px #0000005e}.tc-btn-x{min-height:25px!important;min-width:25px!important;height:25px;width:25px;margin-top:8px}.area-top-actions{position:absolute;top:2px;right:5px;z-index:1}.area-top-actions.tc-ui-modal-colorless button.tc-btn-action-close-ui-modal i{color:var(--c-neutral-600)!important}.area-top-actions button.tc-btn-action-close-ui-modal{cursor:pointer;background-color:transparent;border:none;font-size:15px;padding:5px 7px}.area-top-actions button.tc-btn-action-close-ui-modal i{font-size:17px;color:#fff;transition:all .25s;opacity:.7}.area-top-actions button.tc-btn-action-close-ui-modal i:hover{opacity:1!important}h4{font-size:16px;margin:5px 30px 10px 0;font-weight:700}.no-use-header i{color:var(--c-neutral-500)!important}.tcloud-ui-modal-sticky{height:100vh;overflow:hidden}\n"] }]
|
|
3759
3780
|
}], ctorParameters: () => [{ type: TCloudUiLayoutService }, { type: TcloudModalService }], propDecorators: { confirm: [{
|
|
3760
3781
|
type: Input
|
|
3761
3782
|
}], confirmText: [{
|
|
@@ -7561,11 +7582,158 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImpo
|
|
|
7561
7582
|
type: Input
|
|
7562
7583
|
}] } });
|
|
7563
7584
|
|
|
7585
|
+
/**
|
|
7586
|
+
* Wrapper simples de localStorage/sessionStorage em texto plano, compartilhado
|
|
7587
|
+
* pelo núcleo de autenticação. Portado do `storage.service.ts` do front-tcloud.
|
|
7588
|
+
*
|
|
7589
|
+
* Mantém a detecção de dados legados cifrados (prefixo OpenSSL "Salted__" em
|
|
7590
|
+
* base64) apenas para descartá-los — a cifragem AES foi removida.
|
|
7591
|
+
*/
|
|
7592
|
+
class TCloudUiStorageService {
|
|
7593
|
+
constructor() {
|
|
7594
|
+
this.legacyEncryptedPrefix = 'U2FsdGVkX1';
|
|
7595
|
+
}
|
|
7596
|
+
/**
|
|
7597
|
+
* Lê o valor em texto plano. Se encontrar um dado legado cifrado, descarta-o
|
|
7598
|
+
* e retorna null, para o consumidor tratar como ausente (ex.: re-login).
|
|
7599
|
+
*/
|
|
7600
|
+
read(storage, key) {
|
|
7601
|
+
const data = storage.getItem(key);
|
|
7602
|
+
if (!data) {
|
|
7603
|
+
return null;
|
|
7604
|
+
}
|
|
7605
|
+
if (data.startsWith(this.legacyEncryptedPrefix)) {
|
|
7606
|
+
storage.removeItem(key);
|
|
7607
|
+
return null;
|
|
7608
|
+
}
|
|
7609
|
+
return data;
|
|
7610
|
+
}
|
|
7611
|
+
setLocalStorage(key, data) {
|
|
7612
|
+
localStorage.setItem(key, data);
|
|
7613
|
+
}
|
|
7614
|
+
getLocalStorage(key) {
|
|
7615
|
+
return this.read(localStorage, key);
|
|
7616
|
+
}
|
|
7617
|
+
removeLocalStorage(key) {
|
|
7618
|
+
localStorage.removeItem(key);
|
|
7619
|
+
}
|
|
7620
|
+
setSessionStorage(key, data) {
|
|
7621
|
+
sessionStorage.setItem(key, data);
|
|
7622
|
+
}
|
|
7623
|
+
getSessionStorage(key) {
|
|
7624
|
+
return this.read(sessionStorage, key);
|
|
7625
|
+
}
|
|
7626
|
+
removeSessionStorage(key) {
|
|
7627
|
+
sessionStorage.removeItem(key);
|
|
7628
|
+
}
|
|
7629
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: TCloudUiStorageService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
7630
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: TCloudUiStorageService, providedIn: 'root' }); }
|
|
7631
|
+
}
|
|
7632
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: TCloudUiStorageService, decorators: [{
|
|
7633
|
+
type: Injectable,
|
|
7634
|
+
args: [{
|
|
7635
|
+
providedIn: 'root'
|
|
7636
|
+
}]
|
|
7637
|
+
}] });
|
|
7638
|
+
|
|
7639
|
+
/**
|
|
7640
|
+
* Núcleo de gestão da sessão do usuário, compartilhado entre os apps.
|
|
7641
|
+
* Portado do subset de autenticação do `user.service.ts` do front-tcloud —
|
|
7642
|
+
* sem as regras de negócio (billing/tss/topologias/alertify/controllers).
|
|
7643
|
+
*/
|
|
7644
|
+
class TCloudUiUserService {
|
|
7645
|
+
constructor() {
|
|
7646
|
+
this.http = inject(HttpClient);
|
|
7647
|
+
this.storageService = inject(TCloudUiStorageService);
|
|
7648
|
+
this.config = withAuthDefaults(inject(TCLOUD_UI_AUTH_CONFIG, { optional: true }));
|
|
7649
|
+
}
|
|
7650
|
+
get localStorageName() { return this.config.localStorageName; }
|
|
7651
|
+
get sessionStorageName() { return this.config.sessionStorageName; }
|
|
7652
|
+
/** Retorna o usuário logado do localStorage (ou null se ausente). */
|
|
7653
|
+
getUser() {
|
|
7654
|
+
const raw = this.storageService.getLocalStorage(this.localStorageName);
|
|
7655
|
+
return raw ? JSON.parse(raw) : null;
|
|
7656
|
+
}
|
|
7657
|
+
/** Retorna o base64 do email do usuário logado. */
|
|
7658
|
+
getUserHash() {
|
|
7659
|
+
const email = this.getUser()?.user?.email ?? '';
|
|
7660
|
+
return btoa(email);
|
|
7661
|
+
}
|
|
7662
|
+
/** Guarda o usuário logado no localStorage, carimbando o timestamp. */
|
|
7663
|
+
storeUser(user) {
|
|
7664
|
+
user.timestamp = new Date();
|
|
7665
|
+
this.storageService.setLocalStorage(this.localStorageName, JSON.stringify(user));
|
|
7666
|
+
}
|
|
7667
|
+
/** Retorna informações do ambiente da aba atual (sessionStorage). */
|
|
7668
|
+
getCurrentEnv() {
|
|
7669
|
+
const env = this.storageService.getSessionStorage(this.sessionStorageName);
|
|
7670
|
+
return env ? JSON.parse(env) : {};
|
|
7671
|
+
}
|
|
7672
|
+
/** Guarda informações do ambiente da aba atual (sessionStorage). */
|
|
7673
|
+
setCurrentEnv(env) {
|
|
7674
|
+
this.storageService.setSessionStorage(this.sessionStorageName, JSON.stringify(env));
|
|
7675
|
+
}
|
|
7676
|
+
/** Busca as informações do usuário na API (`/user/info?version=N`). */
|
|
7677
|
+
async asyncInfo() {
|
|
7678
|
+
const env = this.getCurrentEnv();
|
|
7679
|
+
const version = this.config.userInfoVersion;
|
|
7680
|
+
let url = `${this.config.host}/user/info?version=${version}`;
|
|
7681
|
+
if (env?.currentCloudID?.t_code && env?.currentCloudID?.cloud_id) {
|
|
7682
|
+
url += `&t_code=${env.currentCloudID.t_code}&cloud_id=${env.currentCloudID.cloud_id}`;
|
|
7683
|
+
}
|
|
7684
|
+
return await firstValueFrom(this.http.get(url));
|
|
7685
|
+
}
|
|
7686
|
+
/**
|
|
7687
|
+
* Hidrata o perfil básico do usuário logado com os dados de `/user/info`.
|
|
7688
|
+
* Versão enxuta (apenas campos de identidade/perfil) para uso compartilhado.
|
|
7689
|
+
* @returns `true` se hidratou com sucesso; `false` se não há usuário em sessão.
|
|
7690
|
+
*/
|
|
7691
|
+
async getInfo() {
|
|
7692
|
+
const currentUser = this.getUser();
|
|
7693
|
+
if (!currentUser) {
|
|
7694
|
+
return false;
|
|
7695
|
+
}
|
|
7696
|
+
const info = await this.asyncInfo();
|
|
7697
|
+
currentUser.user.firstName = info?.given_name;
|
|
7698
|
+
currentUser.user.lastName = info?.middle_name;
|
|
7699
|
+
currentUser.user.fullName = `${info?.given_name ?? ''} ${info?.middle_name ?? ''}`.trim();
|
|
7700
|
+
currentUser.user.email = info?.email;
|
|
7701
|
+
currentUser.user.profile = info?.profile;
|
|
7702
|
+
currentUser.user.type_home = info?.type_home?.toLowerCase() ?? 'default';
|
|
7703
|
+
currentUser.user.user_role = info?.type_home ?? 'default';
|
|
7704
|
+
if (info?.url_logout) {
|
|
7705
|
+
currentUser.logoutUrl = info.url_logout;
|
|
7706
|
+
}
|
|
7707
|
+
this.storeUser(currentUser);
|
|
7708
|
+
// Persiste no ambiente da aba os dados de acesso vindos do login. É o que as
|
|
7709
|
+
// diretivas `*ngTCCheckAccess` / `*ngTCFeatureFlags` consomem via
|
|
7710
|
+
// `getCurrentEnv().ui` e `getCurrentEnv().feature_flags`.
|
|
7711
|
+
const currentEnv = this.getCurrentEnv();
|
|
7712
|
+
currentEnv.ui = info?.ui;
|
|
7713
|
+
currentEnv.features = info?.features;
|
|
7714
|
+
currentEnv.feature_flags = info?.feature_flags ?? [];
|
|
7715
|
+
this.setCurrentEnv(currentEnv);
|
|
7716
|
+
return true;
|
|
7717
|
+
}
|
|
7718
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: TCloudUiUserService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
7719
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: TCloudUiUserService, providedIn: 'root' }); }
|
|
7720
|
+
}
|
|
7721
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: TCloudUiUserService, decorators: [{
|
|
7722
|
+
type: Injectable,
|
|
7723
|
+
args: [{
|
|
7724
|
+
providedIn: 'root'
|
|
7725
|
+
}]
|
|
7726
|
+
}] });
|
|
7727
|
+
|
|
7564
7728
|
class TCloudUiCheckAccessService {
|
|
7565
|
-
constructor(_UserService) {
|
|
7729
|
+
constructor(_UserService, _sharedUserService) {
|
|
7566
7730
|
this._UserService = _UserService;
|
|
7731
|
+
this._sharedUserService = _sharedUserService;
|
|
7567
7732
|
this.userService = {};
|
|
7568
|
-
|
|
7733
|
+
// Prioriza o user service legado do app (token string 'UserService'); se o app
|
|
7734
|
+
// não fornecer um, usa o núcleo de auth compartilhado da própria lib. Assim as
|
|
7735
|
+
// diretivas de acesso funcionam out-of-the-box quando a app usa a auth da lib.
|
|
7736
|
+
this.userService = this._UserService ?? this._sharedUserService;
|
|
7569
7737
|
}
|
|
7570
7738
|
check(checkAccess) {
|
|
7571
7739
|
const temp_user = this.getImpersonalizeUserInfo();
|
|
@@ -7714,7 +7882,7 @@ class TCloudUiCheckAccessService {
|
|
|
7714
7882
|
removeLocalStorage() {
|
|
7715
7883
|
localStorage.removeItem('temp_user_info');
|
|
7716
7884
|
}
|
|
7717
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: TCloudUiCheckAccessService, deps: [{ token: 'UserService', optional: true }], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
7885
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: TCloudUiCheckAccessService, deps: [{ token: 'UserService', optional: true }, { token: TCloudUiUserService }], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
7718
7886
|
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: TCloudUiCheckAccessService, providedIn: 'root' }); }
|
|
7719
7887
|
}
|
|
7720
7888
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: TCloudUiCheckAccessService, decorators: [{
|
|
@@ -7727,7 +7895,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImpo
|
|
|
7727
7895
|
}, {
|
|
7728
7896
|
type: Inject,
|
|
7729
7897
|
args: ['UserService']
|
|
7730
|
-
}] }] });
|
|
7898
|
+
}] }, { type: TCloudUiUserService }] });
|
|
7731
7899
|
|
|
7732
7900
|
class TCloudUiCheckAccessDirective {
|
|
7733
7901
|
set TCCheckAccess(checkAccess) {
|
|
@@ -10644,9 +10812,6 @@ class TCloudUiMarkReadmeComponent {
|
|
|
10644
10812
|
this.open = false;
|
|
10645
10813
|
this._pathName = '';
|
|
10646
10814
|
this._description = '';
|
|
10647
|
-
// Permite injetar o Markdown diretamente, sem buscar um arquivo via pathName.
|
|
10648
|
-
// Quando content estiver preenchido, ele tem prioridade e o pathName e ignorado.
|
|
10649
|
-
this._content = '';
|
|
10650
10815
|
}
|
|
10651
10816
|
ngAfterViewInit() {
|
|
10652
10817
|
// Configurar highlight.js quando o componente for inicializado
|
|
@@ -10672,25 +10837,7 @@ class TCloudUiMarkReadmeComponent {
|
|
|
10672
10837
|
get description() {
|
|
10673
10838
|
return this._description;
|
|
10674
10839
|
}
|
|
10675
|
-
set content(v) {
|
|
10676
|
-
this._content = v ?? '';
|
|
10677
|
-
if (this._content !== '') {
|
|
10678
|
-
this.changelogContent = this._content;
|
|
10679
|
-
this.loading = false;
|
|
10680
|
-
this.message = '';
|
|
10681
|
-
}
|
|
10682
|
-
}
|
|
10683
|
-
get content() {
|
|
10684
|
-
return this._content;
|
|
10685
|
-
}
|
|
10686
10840
|
loadChangelog() {
|
|
10687
|
-
// content tem prioridade sobre pathName; sem pathName nao ha o que buscar.
|
|
10688
|
-
if (this._content !== '') {
|
|
10689
|
-
return;
|
|
10690
|
-
}
|
|
10691
|
-
if (this._pathName === '') {
|
|
10692
|
-
return;
|
|
10693
|
-
}
|
|
10694
10841
|
this.message = '';
|
|
10695
10842
|
this.loading = true;
|
|
10696
10843
|
this.http.get(`${this.pathName}`, { responseType: 'text' }).subscribe({
|
|
@@ -10738,7 +10885,7 @@ class TCloudUiMarkReadmeComponent {
|
|
|
10738
10885
|
});
|
|
10739
10886
|
}
|
|
10740
10887
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: TCloudUiMarkReadmeComponent, deps: [{ token: i1$3.HttpClient }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
10741
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.17", type: TCloudUiMarkReadmeComponent, isStandalone: true, selector: "tcloud-ui-mark-readme", inputs: { useAccordion: "useAccordion", open: "open", pathName: "pathName", description: "description"
|
|
10888
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.17", type: TCloudUiMarkReadmeComponent, isStandalone: true, selector: "tcloud-ui-mark-readme", inputs: { useAccordion: "useAccordion", open: "open", pathName: "pathName", description: "description" }, ngImport: i0, template: "@if (message) {\n <div [innerHTML]=\"message\"></div>\n}\n\n@if (useAccordion) {\n <br><div><hr></div><br>\n <tcloud-ui-accordion [show]=\"open\">\n <tcloud-ui-accordion-title>\n {{ description }}\n </tcloud-ui-accordion-title>\n <tcloud-ui-accordion-body>\n <div>\n <tcloud-ui-loading [loading]=\"loading\" [mode]=\"'inline'\"></tcloud-ui-loading>\n <markdown\n [id]=\"ID\"\n [data]=\"changelogContent\"\n (ready)=\"onMarkdownReady()\">\n </markdown>\n </div>\n </tcloud-ui-accordion-body>\n </tcloud-ui-accordion>\n}\n\n@if (!useAccordion) {\n <div>\n @if (description) {\n <h3 [innerHTML]=\"description\"></h3>\n }\n <tcloud-ui-loading [loading]=\"loading\" [mode]=\"'inline'\"></tcloud-ui-loading>\n <markdown\n [id]=\"ID\"\n [data]=\"changelogContent\"\n (ready)=\"onMarkdownReady()\">\n </markdown>\n </div>\n}\n\n\n", styles: [".hljs{color:var(--c-neutral-700);background:var(--c-neutral-100)}.hljs-attr,.hljs-attribute,.hljs-literal,.hljs-meta,.hljs-number,.hljs-operator,.hljs-variable,.hljs-selector-attr,.hljs-selector-class,.hljs-selector-id{color:#e45649}.hljs-built_in,.hljs-builtin-name,.hljs-class,.hljs-title{color:#c18401}.hljs-comment,.hljs-quote,.hljs-deletion{color:#a0a1a7;font-style:italic}.hljs-keyword,.hljs-selector-tag,.hljs-section,.hljs-link,.hljs-emphasis{color:#a626a4}.hljs-addition,.hljs-string,.hljs-symbol{color:#50a14f}.hljs-code{color:#383a42}.hljs-meta-string{color:#50a14f}.hljs-regexp{color:#0184bc}.hljs-name{color:#4078f2}.hljs-type,.hljs-attr-name,.hljs-selector-pseudo{color:#e45649}.hljs-subst{color:var(--c-neutral-700)}.hljs-tag{color:#e45649}.hljs-tag .hljs-name,.hljs-tag .hljs-attr{color:var(--c-neutral-700)}.hljs-template-tag,.hljs-template-variable{color:#a626a4}body.tc-dark .hljs-attr,body.tc-dark .hljs-attribute,body.tc-dark .hljs-literal,body.tc-dark .hljs-meta,body.tc-dark .hljs-number,body.tc-dark .hljs-operator,body.tc-dark .hljs-variable,body.tc-dark .hljs-selector-attr,body.tc-dark .hljs-selector-class,body.tc-dark .hljs-selector-id,body.tc-dark .hljs-type,body.tc-dark .hljs-attr-name,body.tc-dark .hljs-selector-pseudo,body.tc-dark .hljs-tag{color:#e06c75}body.tc-dark .hljs-built_in,body.tc-dark .hljs-builtin-name,body.tc-dark .hljs-class,body.tc-dark .hljs-title{color:#e6c07b}body.tc-dark .hljs-comment,body.tc-dark .hljs-quote,body.tc-dark .hljs-deletion{color:#7f848e}body.tc-dark .hljs-keyword,body.tc-dark .hljs-selector-tag,body.tc-dark .hljs-section,body.tc-dark .hljs-link,body.tc-dark .hljs-emphasis,body.tc-dark .hljs-template-tag,body.tc-dark .hljs-template-variable{color:#c678dd}body.tc-dark .hljs-addition,body.tc-dark .hljs-string,body.tc-dark .hljs-symbol,body.tc-dark .hljs-meta-string{color:#98c379}body.tc-dark .hljs-regexp{color:#56b6c2}body.tc-dark .hljs-name{color:#61afef}#mark-readme-content{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,Fira Sans,Droid Sans,Helvetica Neue,sans-serif;line-height:1.6;color:var(--c-neutral-700)}#mark-readme-content h1,#mark-readme-content h2,#mark-readme-content h3,#mark-readme-content h4,#mark-readme-content h5,#mark-readme-content h6{margin-top:1.5em;margin-bottom:.5em;font-weight:600;line-height:1.25}#mark-readme-content h1{font-size:2em;border-bottom:1px solid var(--c-neutral-200);padding-bottom:.3em}#mark-readme-content h2{font-size:1.5em;border-bottom:1px solid var(--c-neutral-200);padding-bottom:.3em}#mark-readme-content h3{font-size:1.25em}#mark-readme-content p{margin:.5em 0}#mark-readme-content ul,#mark-readme-content ol{padding-left:2em;margin:.5em 0}#mark-readme-content ul li,#mark-readme-content ol li{margin:.25em 0}#mark-readme-content a{color:var(--c-primary-500);text-decoration:none}#mark-readme-content a:hover{text-decoration:underline}#mark-readme-content code{background-color:var(--c-neutral-100);border-radius:3px;padding:.2em .4em;font-family:Courier New,Courier,monospace;font-size:.9em;color:var(--c-neutral-700);white-space:normal}#mark-readme-content pre{background-color:var(--c-neutral-100)!important;border:1px solid var(--c-neutral-300)!important;border-radius:6px!important;overflow:auto!important;padding:16px!important;margin:1em 0!important;font-family:Courier New,Courier,monospace!important;font-size:.9em!important;line-height:1.45!important;white-space:pre-wrap!important;word-wrap:break-word!important;overflow-wrap:break-word!important;display:block!important}#mark-readme-content pre code{background-color:transparent!important;padding:0!important;margin:0!important;border-radius:0!important;color:inherit!important;display:block!important;white-space:pre-wrap!important;word-break:break-word!important;word-spacing:normal!important;overflow-wrap:break-word!important;tab-size:4!important;-moz-tab-size:4!important;border:none!important;font-family:Courier New,Courier,monospace!important;font-size:.9em!important;line-height:1.45!important}#mark-readme-content pre code.language-typescript,#mark-readme-content pre code.language-html,#mark-readme-content pre code.language-css,#mark-readme-content pre code.language-scss,#mark-readme-content pre code.language-javascript,#mark-readme-content pre code.language-json,#mark-readme-content pre code.language-bash{color:inherit!important}#mark-readme-content table{border-collapse:collapse;width:100%;margin:1em 0}#mark-readme-content table thead{background-color:var(--c-neutral-100);font-weight:600}#mark-readme-content table th,#mark-readme-content table td{border:1px solid var(--c-neutral-300);padding:12px;text-align:left}#mark-readme-content table tr:nth-child(odd){background-color:var(--c-neutral-50)}#mark-readme-content table tr:nth-child(2n){background-color:var(--c-neutral-100)}#mark-readme-content table tr:hover{background-color:var(--c-neutral-200)}#mark-readme-content blockquote{border-left:4px solid var(--c-neutral-300);color:var(--c-neutral-500);padding:.5em 1em;margin:1em 0}#mark-readme-content hr{border:none;border-top:2px solid var(--c-neutral-200);margin:2em 0}#mark-readme-content img{max-width:100%;height:auto}.p-relative{position:relative}\n"], dependencies: [{ kind: "ngmodule", type: MarkdownModule }, { kind: "component", type: i2.MarkdownComponent, selector: "markdown, [markdown]", inputs: ["data", "src", "disableSanitizer", "inline", "clipboard", "clipboardButtonComponent", "clipboardButtonTemplate", "emoji", "katex", "katexOptions", "mermaid", "mermaidOptions", "lineHighlight", "line", "lineOffset", "lineNumbers", "start", "commandLine", "filterOutput", "host", "prompt", "output", "user"], outputs: ["error", "load", "ready"] }, { kind: "component", type: TCloudUiAccordionComponent, selector: "tcloud-ui-accordion", inputs: ["disabled", "show", "loading"], outputs: ["onAction"] }, { kind: "component", type: TCloudUiAccordionTitleComponent, selector: "tcloud-ui-accordion-title" }, { kind: "component", type: TCloudUiAccordionBodyComponent, selector: "tcloud-ui-accordion-body" }, { kind: "component", type: TCloudUiLoadingComponent, selector: "tcloud-ui-loading", inputs: ["gif", "mode", "onlyInline", "onlyIcon", "full", "loading"] }], encapsulation: i0.ViewEncapsulation.None }); }
|
|
10742
10889
|
}
|
|
10743
10890
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: TCloudUiMarkReadmeComponent, decorators: [{
|
|
10744
10891
|
type: Component,
|
|
@@ -10757,8 +10904,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImpo
|
|
|
10757
10904
|
type: Input
|
|
10758
10905
|
}], description: [{
|
|
10759
10906
|
type: Input
|
|
10760
|
-
}], content: [{
|
|
10761
|
-
type: Input
|
|
10762
10907
|
}] } });
|
|
10763
10908
|
|
|
10764
10909
|
const COMPONENTS = [
|
|
@@ -10881,6 +11026,10 @@ class TCloudUiModule {
|
|
|
10881
11026
|
const providers = [
|
|
10882
11027
|
// Configuração principal
|
|
10883
11028
|
{ provide: TCLOUD_UI_CONFIG, useValue: config?.data ?? {} },
|
|
11029
|
+
// Configuração do núcleo de autenticação (URLs/chaves vindas do app consumidor).
|
|
11030
|
+
// Obs.: em apps NgModule, registre o interceptor com
|
|
11031
|
+
// `provideHttpClient(withInterceptors([tcloudUiJwtInterceptor]))` nos providers do app.
|
|
11032
|
+
{ provide: TCLOUD_UI_AUTH_CONFIG, useValue: config?.auth ?? {} },
|
|
10884
11033
|
DatePipe,
|
|
10885
11034
|
StatusInfoPipe
|
|
10886
11035
|
];
|
|
@@ -11165,6 +11314,151 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImpo
|
|
|
11165
11314
|
}]
|
|
11166
11315
|
}] });
|
|
11167
11316
|
|
|
11317
|
+
/**
|
|
11318
|
+
* Modelos do núcleo de autenticação compartilhado.
|
|
11319
|
+
* Contém apenas os campos usados pelo fluxo de auth/sessão — regras de negócio
|
|
11320
|
+
* (billing, tss, topologias, etc.) ficam fora da lib.
|
|
11321
|
+
*/
|
|
11322
|
+
|
|
11323
|
+
/**
|
|
11324
|
+
* Núcleo de autenticação compartilhado: login/token/refresh/logout e checagem de sessão.
|
|
11325
|
+
* Portado do `authentication.service.ts` do front-tcloud, desacoplado de analytics/genesys
|
|
11326
|
+
* e lendo as URLs via `TCLOUD_UI_AUTH_CONFIG` (fornecido pelo app consumidor).
|
|
11327
|
+
*/
|
|
11328
|
+
class TCloudUiAuthenticationService {
|
|
11329
|
+
constructor() {
|
|
11330
|
+
this.http = inject(HttpClient);
|
|
11331
|
+
this.userService = inject(TCloudUiUserService);
|
|
11332
|
+
this.storageService = inject(TCloudUiStorageService);
|
|
11333
|
+
this.config = withAuthDefaults(inject(TCLOUD_UI_AUTH_CONFIG, { optional: true }));
|
|
11334
|
+
/** Emite quando o token é renovado (consumidores podem reagir, ex.: Genesys). */
|
|
11335
|
+
this.tokenRefreshed = new BehaviorSubject(false);
|
|
11336
|
+
}
|
|
11337
|
+
/** Verifica se o usuário está logado (possui token em sessão). */
|
|
11338
|
+
isLoggedIn() {
|
|
11339
|
+
return !!this.userService.getUser()?.user?.token;
|
|
11340
|
+
}
|
|
11341
|
+
/** Verifica se há dados de usuário carregados. */
|
|
11342
|
+
hasUserData() {
|
|
11343
|
+
return !!this.userService.getUser();
|
|
11344
|
+
}
|
|
11345
|
+
/** Retorna o token de autenticação do usuário logado. */
|
|
11346
|
+
getAuthToken() {
|
|
11347
|
+
return this.userService.getUser()?.user?.token ?? '';
|
|
11348
|
+
}
|
|
11349
|
+
/** Guarda o novo par de tokens na sessão. */
|
|
11350
|
+
storeNewToken(authToken, refreshToken) {
|
|
11351
|
+
const storageUser = this.userService.getUser();
|
|
11352
|
+
if (!storageUser) {
|
|
11353
|
+
return;
|
|
11354
|
+
}
|
|
11355
|
+
storageUser.user.token = authToken;
|
|
11356
|
+
storageUser.user.refresh_token = refreshToken;
|
|
11357
|
+
this.userService.storeUser(storageUser);
|
|
11358
|
+
this.tokenRefreshed.next(true);
|
|
11359
|
+
}
|
|
11360
|
+
/** Solicita token de autenticação (troca do código Cognito). */
|
|
11361
|
+
requestToken(queryParams) {
|
|
11362
|
+
const url = `${this.config.host}/cognito/authorization`;
|
|
11363
|
+
return this.http.get(url, { params: queryParams });
|
|
11364
|
+
}
|
|
11365
|
+
/** Solicita novo token de segurança quando o atual expira; atualiza a sessão. */
|
|
11366
|
+
refreshToken() {
|
|
11367
|
+
const storedUser = this.userService.getUser();
|
|
11368
|
+
const refreshAuth = storedUser?.user?.refresh_token ?? '';
|
|
11369
|
+
const app = this.config.appToken ?? '';
|
|
11370
|
+
const url = `${this.config.host}/cognito/refresh?app=${app}`;
|
|
11371
|
+
return this.http.post(url, refreshAuth).pipe(map$1((response) => {
|
|
11372
|
+
this.storeNewToken(response.token, response.refresh_token);
|
|
11373
|
+
return response.token;
|
|
11374
|
+
}));
|
|
11375
|
+
}
|
|
11376
|
+
/**
|
|
11377
|
+
* Realiza logout: registra o signout (best-effort), limpa a sessão e redireciona.
|
|
11378
|
+
* Destino: `logoutUrl` do usuário > `logoutRedirectUrl` da config > `loginUrl`.
|
|
11379
|
+
*/
|
|
11380
|
+
logout() {
|
|
11381
|
+
const cleanupAndRedirect = () => {
|
|
11382
|
+
const storedUrl = this.userService.getUser()?.logoutUrl;
|
|
11383
|
+
this.storageService.removeLocalStorage(this.config.localStorageName);
|
|
11384
|
+
this.storageService.removeSessionStorage(this.config.sessionStorageName);
|
|
11385
|
+
const target = storedUrl || this.config.logoutRedirectUrl || this.config.loginUrl;
|
|
11386
|
+
if (target) {
|
|
11387
|
+
window.location.href = target;
|
|
11388
|
+
}
|
|
11389
|
+
};
|
|
11390
|
+
if (this.isLoggedIn()) {
|
|
11391
|
+
const body = { token: this.getAuthToken() };
|
|
11392
|
+
this.http.post(`${this.config.host}/audit/cognito/signout`, body).subscribe({
|
|
11393
|
+
next: () => cleanupAndRedirect(),
|
|
11394
|
+
error: () => cleanupAndRedirect(),
|
|
11395
|
+
});
|
|
11396
|
+
}
|
|
11397
|
+
else {
|
|
11398
|
+
cleanupAndRedirect();
|
|
11399
|
+
}
|
|
11400
|
+
}
|
|
11401
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: TCloudUiAuthenticationService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
11402
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: TCloudUiAuthenticationService, providedIn: 'root' }); }
|
|
11403
|
+
}
|
|
11404
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: TCloudUiAuthenticationService, decorators: [{
|
|
11405
|
+
type: Injectable,
|
|
11406
|
+
args: [{
|
|
11407
|
+
providedIn: 'root'
|
|
11408
|
+
}]
|
|
11409
|
+
}] });
|
|
11410
|
+
|
|
11411
|
+
/**
|
|
11412
|
+
* Interceptor funcional do núcleo de autenticação.
|
|
11413
|
+
* - Injeta o header `Authorization` em requisições destinadas à API configurada (`host`).
|
|
11414
|
+
* - Em respostas 401, tenta `refreshToken()` e refaz a requisição uma vez; se o refresh
|
|
11415
|
+
* falhar, dispara `logout()`.
|
|
11416
|
+
*
|
|
11417
|
+
* Registre no app consumidor via `withInterceptors([tcloudUiJwtInterceptor])` ou deixe
|
|
11418
|
+
* que `provideTCloudUi()`/`TCloudUiModule.forRoot()` o registrem.
|
|
11419
|
+
*/
|
|
11420
|
+
const tcloudUiJwtInterceptor = (req, next) => {
|
|
11421
|
+
const auth = inject(TCloudUiAuthenticationService);
|
|
11422
|
+
const config = withAuthDefaults(inject(TCLOUD_UI_AUTH_CONFIG, { optional: true }));
|
|
11423
|
+
// Só anexa o token em chamadas para a própria API, evitando vazar credencial a terceiros.
|
|
11424
|
+
const targetsApi = !!config.host && req.url.startsWith(config.host);
|
|
11425
|
+
const withAuth = (request) => {
|
|
11426
|
+
const token = auth.getAuthToken();
|
|
11427
|
+
if (!targetsApi || !token) {
|
|
11428
|
+
return request;
|
|
11429
|
+
}
|
|
11430
|
+
return request.clone({ setHeaders: { Authorization: token } });
|
|
11431
|
+
};
|
|
11432
|
+
return next(withAuth(req)).pipe(catchError((error) => {
|
|
11433
|
+
if (error instanceof HttpErrorResponse && error.status === 401 && targetsApi) {
|
|
11434
|
+
return auth.refreshToken().pipe(switchMap(() => next(withAuth(req))), catchError((refreshError) => {
|
|
11435
|
+
auth.logout();
|
|
11436
|
+
return throwError(() => refreshError);
|
|
11437
|
+
}));
|
|
11438
|
+
}
|
|
11439
|
+
return throwError(() => error);
|
|
11440
|
+
}));
|
|
11441
|
+
};
|
|
11442
|
+
|
|
11443
|
+
/**
|
|
11444
|
+
* Guard de rota do núcleo de autenticação.
|
|
11445
|
+
* Libera a navegação se o usuário estiver logado; caso contrário redireciona
|
|
11446
|
+
* para `loginUrl` (quando configurado) e bloqueia a rota.
|
|
11447
|
+
*
|
|
11448
|
+
* Uso: `{ path: 'x', canActivate: [tcloudUiAuthGuard], component: ... }`
|
|
11449
|
+
*/
|
|
11450
|
+
const tcloudUiAuthGuard = () => {
|
|
11451
|
+
const auth = inject(TCloudUiAuthenticationService);
|
|
11452
|
+
const config = withAuthDefaults(inject(TCLOUD_UI_AUTH_CONFIG, { optional: true }));
|
|
11453
|
+
if (auth.isLoggedIn()) {
|
|
11454
|
+
return true;
|
|
11455
|
+
}
|
|
11456
|
+
if (config.loginUrl) {
|
|
11457
|
+
window.location.href = config.loginUrl;
|
|
11458
|
+
}
|
|
11459
|
+
return false;
|
|
11460
|
+
};
|
|
11461
|
+
|
|
11168
11462
|
/**
|
|
11169
11463
|
* Função provider para configurar o TCloud UI em aplicações standalone do Angular.
|
|
11170
11464
|
* Use esta função no `main.ts` ou em `app.config.ts` com `bootstrapApplication`.
|
|
@@ -11198,6 +11492,8 @@ function provideTCloudUi(config) {
|
|
|
11198
11492
|
const providers = [
|
|
11199
11493
|
// Configuração principal
|
|
11200
11494
|
{ provide: TCLOUD_UI_CONFIG, useValue: config?.data ?? {} },
|
|
11495
|
+
// Configuração do núcleo de autenticação (URLs/chaves vindas do app consumidor)
|
|
11496
|
+
{ provide: TCLOUD_UI_AUTH_CONFIG, useValue: config?.auth ?? {} },
|
|
11201
11497
|
// Pipes necessários para os serviços
|
|
11202
11498
|
DatePipe,
|
|
11203
11499
|
StatusInfoPipe
|
|
@@ -11216,7 +11512,7 @@ function provideTCloudUi(config) {
|
|
|
11216
11512
|
providers.push({ provide: TCLOUD_UI_VIEWPORT_SERVICE, useClass: config.services.viewportService });
|
|
11217
11513
|
}
|
|
11218
11514
|
return makeEnvironmentProviders([
|
|
11219
|
-
provideHttpClient(withInterceptorsFromDi()),
|
|
11515
|
+
provideHttpClient(withInterceptorsFromDi(), withInterceptors([tcloudUiJwtInterceptor])),
|
|
11220
11516
|
provideMarkdown(),
|
|
11221
11517
|
...providers
|
|
11222
11518
|
]);
|
|
@@ -13165,5 +13461,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImpo
|
|
|
13165
13461
|
* Generated bundle index. Do not edit.
|
|
13166
13462
|
*/
|
|
13167
13463
|
|
|
13168
|
-
export { AcceptedFileType, BytesPipe, CNPJPipe, CPFPipe, CUSTOM_INPUT_CONTROL_VALUE_ACCESSOR$2 as CUSTOM_INPUT_CONTROL_VALUE_ACCESSOR, DateBRPipe, DropdownGroupedSize, DropdownMultiSize$1 as DropdownMultiSize, DropdownSize$1 as DropdownSize, MonthNamePipe, MultiLevelDropdownSize$1 as MultiLevelDropdownSize, ProductActionPipe, ProgressStatusBarGradientStatus$1 as ProgressStatusBarGradientStatus, RespectivePipe, StatusInfoPipe, TCCondition, TCFiltersType, TCLOUD_UI_CONFIG, TCLOUD_UI_LAYOUT_SERVICE, TCLOUD_UI_LOCALE_SERVICE, TCLOUD_UI_USER_SERVICE, TCLOUD_UI_VIEWPORT_SERVICE, TCloudUiAccordionBodyComponent, TCloudUiAccordionComponent, TCloudUiAccordionTitleComponent, TCloudUiAlertBannerComponent, TCloudUiAlignDirective, TCloudUiBreadcrumbComponent, TCloudUiBreadcrumbService, TCloudUiButtonDirective, TCloudUiCalendarComponent, TCloudUiCardAccordionComponent, TCloudUiCardComponent, TCloudUiCardTitleComponent, TCloudUiCarouselComponent, TCloudUiCheckAccessDirective, TCloudUiCheckAccessService, TCloudUiCheckboxDirective, TCloudUiChoiceIssuesComponent, TCloudUiContainerColComponent, TCloudUiContainerComponent, TCloudUiContainerContentComponent, TCloudUiCubesComponent, TCloudUiCurrencyDirective, TCloudUiDataListComponent, TCloudUiDataListOptionComponent, TCloudUiDatepickerComponent, TCloudUiDatepickerTimeComponent, TCloudUiDialogComponent, TCloudUiDialogEventsEnum, TCloudUiDialogHostComponent, TCloudUiDialogModel, TCloudUiDialogService, TCloudUiDialogStatusEnum, TCloudUiDialogTextConfirmationEnum, TCloudUiDigitOnlyDirective, TCloudUiDropdownComponent, TCloudUiDropdownMultiComponent, TCloudUiDropdownMultiLevelComponent, TCloudUiEditorComponent, TCloudUiEditorDiffComponent, TCloudUiElCopyDirective, TCloudUiEmptyContentComponent, TCloudUiFaqComponent, TCloudUiFilterBarComponent, TCloudUiFiltersComponent, TCloudUiFooterComponent, TCloudUiFormDirective, TCloudUiHighLightDirective, TCloudUiHoverParentDirective, TCloudUiIconButtonDirective, TCloudUiInputContainerComponent, TCloudUiInputDirective, TCloudUiInputPasswordComponent, TCloudUiInputSearchComponent, TCloudUiIpMaskDirective, TCloudUiLabelTokenComponent, TCloudUiLegendComponent, TCloudUiLineStepCircleComponent, TCloudUiLineStepTitleComponent, TCloudUiLinhaLogoComponent, TCloudUiLoadingComponent, TCloudUiLoadingTransitionsService, TCloudUiMarkReadmeComponent, TCloudUiMessageComponent, TCloudUiModalBodyComponent, TCloudUiModalComponent, TCloudUiModalFooterComponent, TCloudUiModalHeaderComponent, TCloudUiModule, TCloudUiMultiInputComponent, TCloudUiMultiSelectComponent, TCloudUiMultiplesValuesComponent, TCloudUiNavbarComponent, TCloudUiNavbarFooterComponent, TCloudUiNavbarItemComponent, TCloudUiNgCheckAccessDirective, TCloudUiNgFeatureFlagsDirective, TCloudUiNotFoundComponent, TCloudUiNumberStepComponent, TCloudUiPaginationComponent, TCloudUiPaginationPipe, TCloudUiPopoverComponent, TCloudUiProgressBarComponent, TCloudUiProgressStatusBarComponent, TCloudUiRadioDirective, TCloudUiRangeDateComponent, TCloudUiReorderItemsComponent, TCloudUiScrollBoxComponent, TCloudUiSearchBarComponent, TCloudUiSearchInObjectService, TCloudUiSearchInputComponent, TCloudUiSkeletonLoadingComponent, TCloudUiSkeletonLoadingComponentStyle, TCloudUiSlideToggleDirective, TCloudUiSubNavbarComponent, TCloudUiSubNavbarGroupComponent, TCloudUiSubNavbarItemComponent, TCloudUiTabContentComponent, TCloudUiTabGroupComponent, TCloudUiTabHeadComponent, TCloudUiTabItemComponent, TCloudUiTabMenuComponent, TCloudUiTabOptionComponent, TCloudUiTabSubtitleComponent, TCloudUiTabTitleComponent, TCloudUiTableComponent, TCloudUiTagComponent, TCloudUiToastComponent, TCloudUiTooltipDirective, TCloudUiTopNavigationComponent, TCloudUiUploadAreaComponent, TCloudUiWelcomeComponent, TCloudUiWizardStepsComponent, TagColorsEnum, TcRevButtonDirective, TcRevCalendarComponent, TcRevCardAccordionComponent, TcRevCardComponent, TcRevCardTitleComponent, TcRevCheckboxDirective, TcRevComponentsLibModule, TcRevDropdownComponent, TcRevDropdownGroupedComponent, TcRevDropdownMultiComponent, TcRevDropdownMultiLevelComponent, TcRevEmptyContentComponent, TcRevFaqComponent, TcRevIconButtonDirective, TcRevInputContainerComponent, TcRevInputDirective, TcRevLoadingComponent, TcRevMessageComponent, TcRevMultiInputComponent, TcRevPaginationComponent, TcRevProgressStatusBarComponent, TcRevRadioDirective, TcRevSearchInputComponent, TcRevSideDrawerComponent, TcRevSkeletonLoadingComponent, TcRevSkeletonLoadingComponentStyle, TcRevSlideToggleDirective, TcRevSmallLoadingComponent, TcRevSmallLoadingComponentStyle, TcRevSubNavbarComponent, TcRevSubNavbarItemComponent, TcRevTabGroupComponent, TcRevTabItemComponent, TcRevTagComponent, TcRevToastComponent, TcRevTooltipDirective, TcRevWizardStepsComponent, ToTextPipe, TopologyEnvironmentPipe, TopologyProductPipe, TopologyRegionPipe, TopologyStatusPipe, echartBarConfig, isTextEllipsed, provideTCloudUi };
|
|
13464
|
+
export { AcceptedFileType, BytesPipe, CNPJPipe, CPFPipe, CUSTOM_INPUT_CONTROL_VALUE_ACCESSOR$2 as CUSTOM_INPUT_CONTROL_VALUE_ACCESSOR, DateBRPipe, DropdownGroupedSize, DropdownMultiSize$1 as DropdownMultiSize, DropdownSize$1 as DropdownSize, MonthNamePipe, MultiLevelDropdownSize$1 as MultiLevelDropdownSize, ProductActionPipe, ProgressStatusBarGradientStatus$1 as ProgressStatusBarGradientStatus, RespectivePipe, StatusInfoPipe, TCCondition, TCFiltersType, TCLOUD_UI_AUTH_CONFIG, TCLOUD_UI_CONFIG, TCLOUD_UI_LAYOUT_SERVICE, TCLOUD_UI_LOCALE_SERVICE, TCLOUD_UI_USER_SERVICE, TCLOUD_UI_VIEWPORT_SERVICE, TCloudUiAccordionBodyComponent, TCloudUiAccordionComponent, TCloudUiAccordionTitleComponent, TCloudUiAlertBannerComponent, TCloudUiAlignDirective, TCloudUiAuthenticationService, TCloudUiBreadcrumbComponent, TCloudUiBreadcrumbService, TCloudUiButtonDirective, TCloudUiCalendarComponent, TCloudUiCardAccordionComponent, TCloudUiCardComponent, TCloudUiCardTitleComponent, TCloudUiCarouselComponent, TCloudUiCheckAccessDirective, TCloudUiCheckAccessService, TCloudUiCheckboxDirective, TCloudUiChoiceIssuesComponent, TCloudUiContainerColComponent, TCloudUiContainerComponent, TCloudUiContainerContentComponent, TCloudUiCubesComponent, TCloudUiCurrencyDirective, TCloudUiDataListComponent, TCloudUiDataListOptionComponent, TCloudUiDatepickerComponent, TCloudUiDatepickerTimeComponent, TCloudUiDialogComponent, TCloudUiDialogEventsEnum, TCloudUiDialogHostComponent, TCloudUiDialogModel, TCloudUiDialogService, TCloudUiDialogStatusEnum, TCloudUiDialogTextConfirmationEnum, TCloudUiDigitOnlyDirective, TCloudUiDropdownComponent, TCloudUiDropdownMultiComponent, TCloudUiDropdownMultiLevelComponent, TCloudUiEditorComponent, TCloudUiEditorDiffComponent, TCloudUiElCopyDirective, TCloudUiEmptyContentComponent, TCloudUiFaqComponent, TCloudUiFilterBarComponent, TCloudUiFiltersComponent, TCloudUiFooterComponent, TCloudUiFormDirective, TCloudUiHighLightDirective, TCloudUiHoverParentDirective, TCloudUiIconButtonDirective, TCloudUiInputContainerComponent, TCloudUiInputDirective, TCloudUiInputPasswordComponent, TCloudUiInputSearchComponent, TCloudUiIpMaskDirective, TCloudUiLabelTokenComponent, TCloudUiLegendComponent, TCloudUiLineStepCircleComponent, TCloudUiLineStepTitleComponent, TCloudUiLinhaLogoComponent, TCloudUiLoadingComponent, TCloudUiLoadingTransitionsService, TCloudUiMarkReadmeComponent, TCloudUiMessageComponent, TCloudUiModalBodyComponent, TCloudUiModalComponent, TCloudUiModalFooterComponent, TCloudUiModalHeaderComponent, TCloudUiModule, TCloudUiMultiInputComponent, TCloudUiMultiSelectComponent, TCloudUiMultiplesValuesComponent, TCloudUiNavbarComponent, TCloudUiNavbarFooterComponent, TCloudUiNavbarItemComponent, TCloudUiNgCheckAccessDirective, TCloudUiNgFeatureFlagsDirective, TCloudUiNotFoundComponent, TCloudUiNumberStepComponent, TCloudUiPaginationComponent, TCloudUiPaginationPipe, TCloudUiPopoverComponent, TCloudUiProgressBarComponent, TCloudUiProgressStatusBarComponent, TCloudUiRadioDirective, TCloudUiRangeDateComponent, TCloudUiReorderItemsComponent, TCloudUiScrollBoxComponent, TCloudUiSearchBarComponent, TCloudUiSearchInObjectService, TCloudUiSearchInputComponent, TCloudUiSkeletonLoadingComponent, TCloudUiSkeletonLoadingComponentStyle, TCloudUiSlideToggleDirective, TCloudUiStorageService, TCloudUiSubNavbarComponent, TCloudUiSubNavbarGroupComponent, TCloudUiSubNavbarItemComponent, TCloudUiTabContentComponent, TCloudUiTabGroupComponent, TCloudUiTabHeadComponent, TCloudUiTabItemComponent, TCloudUiTabMenuComponent, TCloudUiTabOptionComponent, TCloudUiTabSubtitleComponent, TCloudUiTabTitleComponent, TCloudUiTableComponent, TCloudUiTagComponent, TCloudUiToastComponent, TCloudUiTooltipDirective, TCloudUiTopNavigationComponent, TCloudUiUploadAreaComponent, TCloudUiUserService, TCloudUiWelcomeComponent, TCloudUiWizardStepsComponent, TagColorsEnum, TcRevButtonDirective, TcRevCalendarComponent, TcRevCardAccordionComponent, TcRevCardComponent, TcRevCardTitleComponent, TcRevCheckboxDirective, TcRevComponentsLibModule, TcRevDropdownComponent, TcRevDropdownGroupedComponent, TcRevDropdownMultiComponent, TcRevDropdownMultiLevelComponent, TcRevEmptyContentComponent, TcRevFaqComponent, TcRevIconButtonDirective, TcRevInputContainerComponent, TcRevInputDirective, TcRevLoadingComponent, TcRevMessageComponent, TcRevMultiInputComponent, TcRevPaginationComponent, TcRevProgressStatusBarComponent, TcRevRadioDirective, TcRevSearchInputComponent, TcRevSideDrawerComponent, TcRevSkeletonLoadingComponent, TcRevSkeletonLoadingComponentStyle, TcRevSlideToggleDirective, TcRevSmallLoadingComponent, TcRevSmallLoadingComponentStyle, TcRevSubNavbarComponent, TcRevSubNavbarItemComponent, TcRevTabGroupComponent, TcRevTabItemComponent, TcRevTagComponent, TcRevToastComponent, TcRevTooltipDirective, TcRevWizardStepsComponent, ToTextPipe, TopologyEnvironmentPipe, TopologyProductPipe, TopologyRegionPipe, TopologyStatusPipe, echartBarConfig, isTextEllipsed, provideTCloudUi, tcloudUiAuthGuard, tcloudUiJwtInterceptor, withAuthDefaults };
|
|
13169
13465
|
//# sourceMappingURL=dev-tcloud-tcloud-ui.mjs.map
|