@stiunb/unb-lib-components 18.0.28 → 18.0.30
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/esm2022/lib/services/unb-auth.service.mjs +4 -4
- package/esm2022/lib/unb-mensagem/unb-mensagem.component.mjs +4 -4
- package/esm2022/lib/unb-mensagem/unb-mensagem.module.mjs +5 -5
- package/esm2022/lib/unb-mensagem/unb-mensagem.service.mjs +4 -4
- package/esm2022/lib/unb-nav-bar/unb-nav-bar.component.mjs +4 -4
- package/esm2022/lib/unb-nav-bar/unb-nav-bar.module.mjs +5 -5
- package/esm2022/lib/unb-pessoa/unb-pessoa-crud/unb-pessoa-crud.component.mjs +100 -0
- package/esm2022/lib/unb-pessoa/unb-pessoa-crud-modal/unb-pessoa-crud-modal.component.mjs +144 -0
- package/esm2022/lib/unb-pessoa/unb-pessoa-email-form/unb-pessoa-email-form.mjs +4 -4
- package/esm2022/lib/unb-pessoa/unb-pessoa-email-form/unb-pessoa-email-list.mjs +4 -4
- package/esm2022/lib/unb-pessoa/unb-pessoa-endereco-form/unb-pessoa-endereco-form.mjs +24 -7
- package/esm2022/lib/unb-pessoa/unb-pessoa-endereco-form/unb-pessoa-endereco-list.mjs +4 -4
- package/esm2022/lib/unb-pessoa/unb-pessoa-form/unb-pessoa-form.component.mjs +54 -178
- package/esm2022/lib/unb-pessoa/unb-pessoa-form-dialog/unb-pessoa-form-dialog.component.mjs +60 -0
- package/esm2022/lib/unb-pessoa/unb-pessoa-models/unb-pessoa-config.model.mjs +35 -0
- package/esm2022/lib/unb-pessoa/unb-pessoa-pesquisar/unb-pessoa-pesquisar.component.mjs +32 -191
- package/esm2022/lib/unb-pessoa/unb-pessoa-telefone-form/unb-pessoa-telefone-form.mjs +4 -4
- package/esm2022/lib/unb-pessoa/unb-pessoa-telefone-form/unb-pessoa-telefone-list.mjs +4 -4
- package/esm2022/lib/unb-pessoa/unb-pessoa.module.mjs +61 -11
- package/esm2022/lib/unb-pessoa/unb-pessoa.service.mjs +278 -26
- package/esm2022/lib/unb-usuario/oidc-decoded-token.mjs +1 -1
- package/esm2022/lib/unb-usuario/oidc-user-data.mjs +1 -1
- package/esm2022/lib/unb-usuario/unb-usuario.component.mjs +4 -4
- package/esm2022/lib/unb-usuario/unb-usuario.module.mjs +5 -5
- package/esm2022/public-api.mjs +6 -2
- package/fesm2022/stiunb-unb-lib-components.mjs +1102 -767
- package/fesm2022/stiunb-unb-lib-components.mjs.map +1 -1
- package/lib/unb-pessoa/unb-pessoa-crud/unb-pessoa-crud.component.d.ts +33 -0
- package/lib/unb-pessoa/unb-pessoa-crud-modal/unb-pessoa-crud-modal.component.d.ts +39 -0
- package/lib/unb-pessoa/unb-pessoa-form/unb-pessoa-form.component.d.ts +13 -29
- package/lib/unb-pessoa/unb-pessoa-form-dialog/unb-pessoa-form-dialog.component.d.ts +21 -0
- package/lib/unb-pessoa/unb-pessoa-models/unb-pessoa-config.model.d.ts +26 -0
- package/lib/unb-pessoa/unb-pessoa-pesquisar/unb-pessoa-pesquisar.component.d.ts +3 -23
- package/lib/unb-pessoa/unb-pessoa.module.d.ts +51 -32
- package/lib/unb-pessoa/unb-pessoa.service.d.ts +23 -3
- package/package.json +1 -1
- package/public-api.d.ts +5 -1
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import * as i0 from '@angular/core';
|
|
2
|
-
import { Injectable, Component, Input, NgModule, ViewChild, Inject, EventEmitter,
|
|
3
|
-
import { Subject, BehaviorSubject, throwError, catchError, of,
|
|
2
|
+
import { Injectable, Component, Input, NgModule, ViewChild, Inject, EventEmitter, Output, booleanAttribute } from '@angular/core';
|
|
3
|
+
import { Subject, BehaviorSubject, throwError, map, catchError, of, forkJoin } from 'rxjs';
|
|
4
4
|
import * as i4 from '@angular/common';
|
|
5
5
|
import { CommonModule, DatePipe, CurrencyPipe } from '@angular/common';
|
|
6
6
|
import * as i5 from '@angular/material/icon';
|
|
@@ -26,7 +26,7 @@ import { BrowserModule } from '@angular/platform-browser';
|
|
|
26
26
|
import * as i6 from '@angular/forms';
|
|
27
27
|
import { FormsModule } from '@angular/forms';
|
|
28
28
|
import * as i12 from '@angular/material/core';
|
|
29
|
-
import { MatNativeDateModule } from '@angular/material/core';
|
|
29
|
+
import { NativeDateAdapter, MatNativeDateModule, MAT_DATE_LOCALE, DateAdapter, MAT_DATE_FORMATS } from '@angular/material/core';
|
|
30
30
|
import * as i15 from '@angular/material/datepicker';
|
|
31
31
|
import { MatDatepickerModule } from '@angular/material/datepicker';
|
|
32
32
|
import { MatExpansionModule } from '@angular/material/expansion';
|
|
@@ -97,10 +97,10 @@ class UnbMensagemService {
|
|
|
97
97
|
createAlertMessage(message, background_color, font_color, border_color) {
|
|
98
98
|
return { message, background_color, font_color, border_color };
|
|
99
99
|
}
|
|
100
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2
|
|
101
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2
|
|
100
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.1.2", ngImport: i0, type: UnbMensagemService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
101
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.1.2", ngImport: i0, type: UnbMensagemService, providedIn: 'root' }); }
|
|
102
102
|
}
|
|
103
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2
|
|
103
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.2", ngImport: i0, type: UnbMensagemService, decorators: [{
|
|
104
104
|
type: Injectable,
|
|
105
105
|
args: [{
|
|
106
106
|
providedIn: 'root'
|
|
@@ -162,10 +162,10 @@ class UnbMensagemComponent {
|
|
|
162
162
|
}
|
|
163
163
|
return UnbTipoMensagemEnum.INFO;
|
|
164
164
|
}
|
|
165
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2
|
|
166
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2
|
|
165
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.1.2", ngImport: i0, type: UnbMensagemComponent, deps: [{ token: UnbMensagemService }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
166
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.1.2", type: UnbMensagemComponent, selector: "unb-mensagem", inputs: { mensagem: "mensagem", tipo: "tipo", identificador: "identificador" }, ngImport: i0, template: "\r\n<div class=\"alert\" *ngIf=\"alertMessage && alertMessage.message && alertMessage.message.length > 1\" [ngStyle]=\"{background: alertMessage.background_color, 'border-color': alertMessage.border_color}\"> \r\n <div class=\"mensagem\" [ngStyle]=\"{color: alertMessage.font_color}\" [innerHtml]= \"alertMessage.message\"></div>\r\n <a class=\"close\" (click)=\"hide()\" aria-label=\"fechar\" [ngStyle]=\"{color: alertMessage.font_color}\">x</a>\r\n</div> \r\n\r\n", styles: [".alert{display:flex;text-align:center;justify-content:space-between;border-top-color:darken(1px,5%);padding:15px;margin-bottom:20px;border:1px solid transparent;border-radius:4px;font-family:Helvetica Neue,Helvetica,Arial,sans-serif;font-size:15px;line-height:1.42857143;font-weight:400;border-color:#fff}.mensagem{margin:0 auto}.close{float:right;font-size:21px;font-weight:700;line-height:1;color:#000;text-shadow:0 1px 0 #fff;opacity:.2;cursor:pointer;justify-content:flex-end}.close:hover{opacity:.7}\n"], dependencies: [{ kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i4.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }] }); }
|
|
167
167
|
}
|
|
168
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2
|
|
168
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.2", ngImport: i0, type: UnbMensagemComponent, decorators: [{
|
|
169
169
|
type: Component,
|
|
170
170
|
args: [{ selector: 'unb-mensagem', template: "\r\n<div class=\"alert\" *ngIf=\"alertMessage && alertMessage.message && alertMessage.message.length > 1\" [ngStyle]=\"{background: alertMessage.background_color, 'border-color': alertMessage.border_color}\"> \r\n <div class=\"mensagem\" [ngStyle]=\"{color: alertMessage.font_color}\" [innerHtml]= \"alertMessage.message\"></div>\r\n <a class=\"close\" (click)=\"hide()\" aria-label=\"fechar\" [ngStyle]=\"{color: alertMessage.font_color}\">x</a>\r\n</div> \r\n\r\n", styles: [".alert{display:flex;text-align:center;justify-content:space-between;border-top-color:darken(1px,5%);padding:15px;margin-bottom:20px;border:1px solid transparent;border-radius:4px;font-family:Helvetica Neue,Helvetica,Arial,sans-serif;font-size:15px;line-height:1.42857143;font-weight:400;border-color:#fff}.mensagem{margin:0 auto}.close{float:right;font-size:21px;font-weight:700;line-height:1;color:#000;text-shadow:0 1px 0 #fff;opacity:.2;cursor:pointer;justify-content:flex-end}.close:hover{opacity:.7}\n"] }]
|
|
171
171
|
}], ctorParameters: () => [{ type: UnbMensagemService }], propDecorators: { mensagem: [{
|
|
@@ -177,15 +177,15 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
177
177
|
}] } });
|
|
178
178
|
|
|
179
179
|
class UnbMensagemModule {
|
|
180
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2
|
|
181
|
-
static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "18.2
|
|
180
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.1.2", ngImport: i0, type: UnbMensagemModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
|
|
181
|
+
static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "18.1.2", ngImport: i0, type: UnbMensagemModule, declarations: [UnbMensagemComponent], imports: [CommonModule,
|
|
182
182
|
MatIconModule,
|
|
183
183
|
MatButtonModule], exports: [UnbMensagemComponent] }); }
|
|
184
|
-
static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "18.2
|
|
184
|
+
static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "18.1.2", ngImport: i0, type: UnbMensagemModule, imports: [CommonModule,
|
|
185
185
|
MatIconModule,
|
|
186
186
|
MatButtonModule] }); }
|
|
187
187
|
}
|
|
188
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2
|
|
188
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.2", ngImport: i0, type: UnbMensagemModule, decorators: [{
|
|
189
189
|
type: NgModule,
|
|
190
190
|
args: [{
|
|
191
191
|
declarations: [UnbMensagemComponent],
|
|
@@ -248,10 +248,10 @@ class UnbAuthService {
|
|
|
248
248
|
.logoff()
|
|
249
249
|
.subscribe(() => this.usuarioSubject.next(new UnbUsuarioModel()));
|
|
250
250
|
}
|
|
251
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2
|
|
252
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2
|
|
251
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.1.2", ngImport: i0, type: UnbAuthService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
252
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.1.2", ngImport: i0, type: UnbAuthService, providedIn: 'root' }); }
|
|
253
253
|
}
|
|
254
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2
|
|
254
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.2", ngImport: i0, type: UnbAuthService, decorators: [{
|
|
255
255
|
type: Injectable,
|
|
256
256
|
args: [{
|
|
257
257
|
providedIn: 'root'
|
|
@@ -276,10 +276,10 @@ class UnbUsuarioComponent {
|
|
|
276
276
|
logout() {
|
|
277
277
|
this.authService.logout();
|
|
278
278
|
}
|
|
279
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2
|
|
280
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2
|
|
279
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.1.2", ngImport: i0, type: UnbUsuarioComponent, deps: [{ token: UnbAuthService }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
280
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.1.2", type: UnbUsuarioComponent, selector: "unb-usuario", inputs: { oidcSecurityService: "oidcSecurityService" }, ngImport: i0, template: "<button mat-mini-fab color=\"primary\" aria-label=\"Login Button\" [matMenuTriggerFor]=\"menu\">\r\n <mat-icon>person</mat-icon>\r\n</button>\r\n<mat-menu #menu=\"matMenu\">\r\n <div *ngIf=\"usuario$ | async as usuario\"> \r\n <mat-card-header class=\"menuHeader\" *ngIf=\"usuario && usuario.autenticado; else notAuthenticated\">\r\n <mat-card-title>\r\n <div class=\"user-info-container\">\r\n <span>{{ usuario.usuarioNome }}</span>\r\n <mat-icon matTooltip=\"{{ usuario.perfis.join(', ') }}\" aria-label=\"Perfis de usu\u00E1rio\" *ngIf=\"usuario.perfis\">\r\n account_circle\r\n </mat-icon>\r\n </div>\r\n </mat-card-title>\r\n </mat-card-header>\r\n\r\n <ng-template #notAuthenticated>\r\n <mat-card-header class=\"menuHeader\">\r\n <button mat-menu-item (click)=\"login()\">\r\n <mat-icon>login</mat-icon>\r\n <span>Login</span>\r\n </button>\r\n </mat-card-header>\r\n </ng-template>\r\n\r\n <mat-divider *ngIf=\"usuario.autenticado\"></mat-divider>\r\n\r\n <mat-card-actions *ngIf=\"usuario.autenticado\">\r\n <button mat-menu-item (click)=\"logout()\">\r\n <mat-icon>exit_to_app</mat-icon>\r\n <span>Sair</span>\r\n </button>\r\n </mat-card-actions>\r\n </div>\r\n</mat-menu>", styles: [".sidenav-container{height:100%}.sidenav{width:200px}.sidenav .mat-toolbar{background:inherit}.mat-toolbar.mat-primary{position:sticky;top:0;z-index:1}button.login_button{outline:none;padding:0;border:none;background:none;cursor:pointer}.mat-card{background:#036;padding:5px 20px 0 0}.menu{min-width:500px;max-width:400px}.menuHeader{padding:10px}.user-info-container{display:flex;align-items:center;justify-content:center;gap:8px}\n"], dependencies: [{ kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i3.MatMenu, selector: "mat-menu", inputs: ["backdropClass", "aria-label", "aria-labelledby", "aria-describedby", "xPosition", "yPosition", "overlapTrigger", "hasBackdrop", "class", "classList"], outputs: ["closed", "close"], exportAs: ["matMenu"] }, { kind: "component", type: i3.MatMenuItem, selector: "[mat-menu-item]", inputs: ["role", "disabled", "disableRipple"], exportAs: ["matMenuItem"] }, { kind: "directive", type: i3.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", inputs: ["mat-menu-trigger-for", "matMenuTriggerFor", "matMenuTriggerData", "matMenuTriggerRestoreFocus"], outputs: ["menuOpened", "onMenuOpen", "menuClosed", "onMenuClose"], exportAs: ["matMenuTrigger"] }, { kind: "component", type: i5.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i5$1.MatDivider, selector: "mat-divider", inputs: ["vertical", "inset"] }, { kind: "component", type: i7.MatMiniFabButton, selector: "button[mat-mini-fab]", exportAs: ["matButton"] }, { kind: "directive", type: i7$1.MatCardActions, selector: "mat-card-actions", inputs: ["align"], exportAs: ["matCardActions"] }, { kind: "component", type: i7$1.MatCardHeader, selector: "mat-card-header" }, { kind: "directive", type: i7$1.MatCardTitle, selector: "mat-card-title, [mat-card-title], [matCardTitle]" }, { kind: "directive", type: i8.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "pipe", type: i4.AsyncPipe, name: "async" }] }); }
|
|
281
281
|
}
|
|
282
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2
|
|
282
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.2", ngImport: i0, type: UnbUsuarioComponent, decorators: [{
|
|
283
283
|
type: Component,
|
|
284
284
|
args: [{ selector: 'unb-usuario', template: "<button mat-mini-fab color=\"primary\" aria-label=\"Login Button\" [matMenuTriggerFor]=\"menu\">\r\n <mat-icon>person</mat-icon>\r\n</button>\r\n<mat-menu #menu=\"matMenu\">\r\n <div *ngIf=\"usuario$ | async as usuario\"> \r\n <mat-card-header class=\"menuHeader\" *ngIf=\"usuario && usuario.autenticado; else notAuthenticated\">\r\n <mat-card-title>\r\n <div class=\"user-info-container\">\r\n <span>{{ usuario.usuarioNome }}</span>\r\n <mat-icon matTooltip=\"{{ usuario.perfis.join(', ') }}\" aria-label=\"Perfis de usu\u00E1rio\" *ngIf=\"usuario.perfis\">\r\n account_circle\r\n </mat-icon>\r\n </div>\r\n </mat-card-title>\r\n </mat-card-header>\r\n\r\n <ng-template #notAuthenticated>\r\n <mat-card-header class=\"menuHeader\">\r\n <button mat-menu-item (click)=\"login()\">\r\n <mat-icon>login</mat-icon>\r\n <span>Login</span>\r\n </button>\r\n </mat-card-header>\r\n </ng-template>\r\n\r\n <mat-divider *ngIf=\"usuario.autenticado\"></mat-divider>\r\n\r\n <mat-card-actions *ngIf=\"usuario.autenticado\">\r\n <button mat-menu-item (click)=\"logout()\">\r\n <mat-icon>exit_to_app</mat-icon>\r\n <span>Sair</span>\r\n </button>\r\n </mat-card-actions>\r\n </div>\r\n</mat-menu>", styles: [".sidenav-container{height:100%}.sidenav{width:200px}.sidenav .mat-toolbar{background:inherit}.mat-toolbar.mat-primary{position:sticky;top:0;z-index:1}button.login_button{outline:none;padding:0;border:none;background:none;cursor:pointer}.mat-card{background:#036;padding:5px 20px 0 0}.menu{min-width:500px;max-width:400px}.menuHeader{padding:10px}.user-info-container{display:flex;align-items:center;justify-content:center;gap:8px}\n"] }]
|
|
285
285
|
}], ctorParameters: () => [{ type: UnbAuthService }], propDecorators: { oidcSecurityService: [{
|
|
@@ -306,10 +306,10 @@ class UnbNavBarComponent {
|
|
|
306
306
|
}
|
|
307
307
|
});
|
|
308
308
|
}
|
|
309
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2
|
|
310
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2
|
|
309
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.1.2", ngImport: i0, type: UnbNavBarComponent, deps: [{ token: i1.BreakpointObserver }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
310
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.1.2", type: UnbNavBarComponent, selector: "unb-nav-bar", inputs: { nomeSistema: "nomeSistema", menuSize: "menuSize", widthToHideMenu: "widthToHideMenu", contentBackgroundColor: "contentBackgroundColor", containerPadding: "containerPadding", oidcSecurityService: "oidcSecurityService" }, viewQueries: [{ propertyName: "sidenav", first: true, predicate: MatSidenav, descendants: true }], ngImport: i0, template: "<div class=\"example-container\" >\r\n <mat-toolbar class=\"example-toolbar\">\r\n <button mat-icon-button class=\"minifab\" type=\"button\" aria-label=\"Toggle sidenav\" color=\"accent\" (click)=\"snav.toggle()\"><mat-icon>menu</mat-icon></button> \r\n <img src=\"assets/img/unb_icon_branco.svg\" alt=\"\" style=\"width: 40px\"> \r\n <span style=\"color: white;\">{{nomeSistema}}</span>\r\n <span class=\"spacer\"></span> \r\n <unb-usuario [oidcSecurityService]=\"oidcSecurityService\"></unb-usuario>\r\n </mat-toolbar>\r\n\r\n <mat-sidenav-container class=\"example-sidenav-container\" [ngStyle]=\"{'background-color': contentBackgroundColor}\" > \r\n <mat-sidenav #snav [mode]=\"isMobile ? 'over' : 'side'\" [opened]=\"isMobile ? 'false' : 'true'\" [style.max-width.px]=\"menuSize\" > \r\n <ng-content select=\"[menu]\"></ng-content> \r\n </mat-sidenav>\r\n\r\n <mat-sidenav-content [ngStyle]=\"{'padding.px': containerPadding}\">\r\n <ng-content select=\"[body]\"></ng-content> \r\n </mat-sidenav-content>\r\n\r\n </mat-sidenav-container>\r\n</div>", styles: [".example-container{display:flex;flex-direction:column;position:absolute;inset:0}.example-is-mobile .example-toolbar{position:fixed;z-index:2}.spacer{flex:1 1 auto}.example-sidenav-container{flex:1}.example-is-mobile .example-sidenav-container{flex:1 0 auto}.minifab{margin:5px;color:#fff;fill:#fff}\n"], dependencies: [{ kind: "directive", type: i4.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: i3$1.MatToolbar, selector: "mat-toolbar", inputs: ["color"], exportAs: ["matToolbar"] }, { kind: "component", type: i4$1.MatSidenav, selector: "mat-sidenav", inputs: ["fixedInViewport", "fixedTopGap", "fixedBottomGap"], exportAs: ["matSidenav"] }, { kind: "component", type: i4$1.MatSidenavContainer, selector: "mat-sidenav-container", exportAs: ["matSidenavContainer"] }, { kind: "component", type: i4$1.MatSidenavContent, selector: "mat-sidenav-content" }, { kind: "component", type: i5.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i7.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "component", type: UnbUsuarioComponent, selector: "unb-usuario", inputs: ["oidcSecurityService"] }] }); }
|
|
311
311
|
}
|
|
312
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2
|
|
312
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.2", ngImport: i0, type: UnbNavBarComponent, decorators: [{
|
|
313
313
|
type: Component,
|
|
314
314
|
args: [{ selector: 'unb-nav-bar', template: "<div class=\"example-container\" >\r\n <mat-toolbar class=\"example-toolbar\">\r\n <button mat-icon-button class=\"minifab\" type=\"button\" aria-label=\"Toggle sidenav\" color=\"accent\" (click)=\"snav.toggle()\"><mat-icon>menu</mat-icon></button> \r\n <img src=\"assets/img/unb_icon_branco.svg\" alt=\"\" style=\"width: 40px\"> \r\n <span style=\"color: white;\">{{nomeSistema}}</span>\r\n <span class=\"spacer\"></span> \r\n <unb-usuario [oidcSecurityService]=\"oidcSecurityService\"></unb-usuario>\r\n </mat-toolbar>\r\n\r\n <mat-sidenav-container class=\"example-sidenav-container\" [ngStyle]=\"{'background-color': contentBackgroundColor}\" > \r\n <mat-sidenav #snav [mode]=\"isMobile ? 'over' : 'side'\" [opened]=\"isMobile ? 'false' : 'true'\" [style.max-width.px]=\"menuSize\" > \r\n <ng-content select=\"[menu]\"></ng-content> \r\n </mat-sidenav>\r\n\r\n <mat-sidenav-content [ngStyle]=\"{'padding.px': containerPadding}\">\r\n <ng-content select=\"[body]\"></ng-content> \r\n </mat-sidenav-content>\r\n\r\n </mat-sidenav-container>\r\n</div>", styles: [".example-container{display:flex;flex-direction:column;position:absolute;inset:0}.example-is-mobile .example-toolbar{position:fixed;z-index:2}.spacer{flex:1 1 auto}.example-sidenav-container{flex:1}.example-is-mobile .example-sidenav-container{flex:1 0 auto}.minifab{margin:5px;color:#fff;fill:#fff}\n"] }]
|
|
315
315
|
}], ctorParameters: () => [{ type: i1.BreakpointObserver }], propDecorators: { nomeSistema: [{
|
|
@@ -330,8 +330,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
330
330
|
}] } });
|
|
331
331
|
|
|
332
332
|
class UnbUsuarioModule {
|
|
333
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2
|
|
334
|
-
static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "18.2
|
|
333
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.1.2", ngImport: i0, type: UnbUsuarioModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
|
|
334
|
+
static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "18.1.2", ngImport: i0, type: UnbUsuarioModule, declarations: [UnbUsuarioComponent], imports: [BrowserModule,
|
|
335
335
|
MatToolbarModule,
|
|
336
336
|
MatSidenavModule,
|
|
337
337
|
LayoutModule,
|
|
@@ -343,7 +343,7 @@ class UnbUsuarioModule {
|
|
|
343
343
|
MatTooltipModule,
|
|
344
344
|
MatMenuModule,
|
|
345
345
|
MatDividerModule], exports: [UnbUsuarioComponent] }); }
|
|
346
|
-
static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "18.2
|
|
346
|
+
static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "18.1.2", ngImport: i0, type: UnbUsuarioModule, providers: [UnbAuthService], imports: [BrowserModule,
|
|
347
347
|
MatToolbarModule,
|
|
348
348
|
MatSidenavModule,
|
|
349
349
|
LayoutModule,
|
|
@@ -356,7 +356,7 @@ class UnbUsuarioModule {
|
|
|
356
356
|
MatMenuModule,
|
|
357
357
|
MatDividerModule] }); }
|
|
358
358
|
}
|
|
359
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2
|
|
359
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.2", ngImport: i0, type: UnbUsuarioModule, decorators: [{
|
|
360
360
|
type: NgModule,
|
|
361
361
|
args: [{
|
|
362
362
|
declarations: [UnbUsuarioComponent],
|
|
@@ -380,8 +380,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
380
380
|
}] });
|
|
381
381
|
|
|
382
382
|
class UnbNavBarModule {
|
|
383
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2
|
|
384
|
-
static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "18.2
|
|
383
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.1.2", ngImport: i0, type: UnbNavBarModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
|
|
384
|
+
static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "18.1.2", ngImport: i0, type: UnbNavBarModule, declarations: [UnbNavBarComponent], imports: [BrowserModule,
|
|
385
385
|
MatToolbarModule,
|
|
386
386
|
MatSidenavModule,
|
|
387
387
|
LayoutModule,
|
|
@@ -390,7 +390,7 @@ class UnbNavBarModule {
|
|
|
390
390
|
MatButtonModule,
|
|
391
391
|
UnbUsuarioModule,
|
|
392
392
|
MatCardModule], exports: [UnbNavBarComponent] }); }
|
|
393
|
-
static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "18.2
|
|
393
|
+
static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "18.1.2", ngImport: i0, type: UnbNavBarModule, imports: [BrowserModule,
|
|
394
394
|
MatToolbarModule,
|
|
395
395
|
MatSidenavModule,
|
|
396
396
|
LayoutModule,
|
|
@@ -400,7 +400,7 @@ class UnbNavBarModule {
|
|
|
400
400
|
UnbUsuarioModule,
|
|
401
401
|
MatCardModule] }); }
|
|
402
402
|
}
|
|
403
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2
|
|
403
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.2", ngImport: i0, type: UnbNavBarModule, decorators: [{
|
|
404
404
|
type: NgModule,
|
|
405
405
|
args: [{
|
|
406
406
|
declarations: [UnbNavBarComponent],
|
|
@@ -424,6 +424,13 @@ class UnbPessoaEmail {
|
|
|
424
424
|
class UnbPessoaEmailTipo {
|
|
425
425
|
}
|
|
426
426
|
|
|
427
|
+
/**
|
|
428
|
+
* Essa eh uma classe base, com propriedades comum a todas as outras pessoas.
|
|
429
|
+
* */
|
|
430
|
+
class UnbPessoaModel {
|
|
431
|
+
;
|
|
432
|
+
}
|
|
433
|
+
|
|
427
434
|
var UnbTipoPessoaEnum;
|
|
428
435
|
(function (UnbTipoPessoaEnum) {
|
|
429
436
|
UnbTipoPessoaEnum["FISICA"] = "FISICA";
|
|
@@ -431,6 +438,82 @@ var UnbTipoPessoaEnum;
|
|
|
431
438
|
UnbTipoPessoaEnum["ESTRANGEIRA"] = "ESTRANGEIRA";
|
|
432
439
|
})(UnbTipoPessoaEnum || (UnbTipoPessoaEnum = {}));
|
|
433
440
|
|
|
441
|
+
class UnbUtils {
|
|
442
|
+
removeNull(key, value) {
|
|
443
|
+
// Filtering out properties
|
|
444
|
+
if (value === null) {
|
|
445
|
+
return undefined;
|
|
446
|
+
}
|
|
447
|
+
return value;
|
|
448
|
+
}
|
|
449
|
+
// forma cpf
|
|
450
|
+
static formataCpf(valor) {
|
|
451
|
+
return valor.replace(/(\d{3})(\d{3})(\d{3})(\d{2})/g, "\$1.\$2.\$3\-\$4");
|
|
452
|
+
}
|
|
453
|
+
// forma cpf ou cnpj
|
|
454
|
+
static formataCnpj(valor) {
|
|
455
|
+
return valor.replace(/^(\d{2})(\d{3})(\d{3})(\d{4})(\d{2})$/, "$1.$2.$3/$4-$5");
|
|
456
|
+
}
|
|
457
|
+
static validarCPF(cpf) {
|
|
458
|
+
if (!cpf)
|
|
459
|
+
return false; // Se CPF for null, undefined ou vazio, retorna falso
|
|
460
|
+
cpf = cpf.replace(/\D/g, ''); // Remove todos os caracteres não numéricos
|
|
461
|
+
if (cpf == '')
|
|
462
|
+
return false;
|
|
463
|
+
if (cpf.length !== 11 || /^(\d)\1+$/.test(cpf)) {
|
|
464
|
+
return false; // Verifica se tem 11 dígitos e não é uma sequência repetida (ex: 11111111111)
|
|
465
|
+
}
|
|
466
|
+
let soma = 0, resto;
|
|
467
|
+
// Validação do primeiro dígito verificador
|
|
468
|
+
for (let i = 0; i < 9; i++) {
|
|
469
|
+
soma += Number(cpf[i]) * (10 - i);
|
|
470
|
+
}
|
|
471
|
+
resto = (soma * 10) % 11;
|
|
472
|
+
if (resto === 10 || resto === 11)
|
|
473
|
+
resto = 0;
|
|
474
|
+
if (resto !== Number(cpf[9]))
|
|
475
|
+
return false;
|
|
476
|
+
soma = 0;
|
|
477
|
+
// Validação do segundo dígito verificador
|
|
478
|
+
for (let i = 0; i < 10; i++) {
|
|
479
|
+
soma += Number(cpf[i]) * (11 - i);
|
|
480
|
+
}
|
|
481
|
+
resto = (soma * 10) % 11;
|
|
482
|
+
if (resto === 10 || resto === 11)
|
|
483
|
+
resto = 0;
|
|
484
|
+
return resto === Number(cpf[10]);
|
|
485
|
+
}
|
|
486
|
+
static validarCNPJ(cnpj) {
|
|
487
|
+
cnpj = cnpj.replace(/[^\d]+/g, ''); // Remove caracteres não numéricos
|
|
488
|
+
if (cnpj.length !== 14 || /^(\d)\1+$/.test(cnpj)) {
|
|
489
|
+
return false; // Verifica se tem 14 dígitos e não é uma sequência repetida
|
|
490
|
+
}
|
|
491
|
+
let tamanho = cnpj.length - 2;
|
|
492
|
+
let numeros = cnpj.substring(0, tamanho);
|
|
493
|
+
let digitos = cnpj.substring(tamanho);
|
|
494
|
+
let soma = 0, pos = tamanho - 7;
|
|
495
|
+
for (let i = tamanho; i >= 1; i--) {
|
|
496
|
+
soma += parseInt(numeros.charAt(tamanho - i)) * pos--;
|
|
497
|
+
if (pos < 2)
|
|
498
|
+
pos = 9;
|
|
499
|
+
}
|
|
500
|
+
let resultado = soma % 11 < 2 ? 0 : 11 - (soma % 11);
|
|
501
|
+
if (resultado !== parseInt(digitos.charAt(0)))
|
|
502
|
+
return false;
|
|
503
|
+
tamanho = tamanho + 1;
|
|
504
|
+
numeros = cnpj.substring(0, tamanho);
|
|
505
|
+
soma = 0;
|
|
506
|
+
pos = tamanho - 7;
|
|
507
|
+
for (let i = tamanho; i >= 1; i--) {
|
|
508
|
+
soma += parseInt(numeros.charAt(tamanho - i)) * pos--;
|
|
509
|
+
if (pos < 2)
|
|
510
|
+
pos = 9;
|
|
511
|
+
}
|
|
512
|
+
resultado = soma % 11 < 2 ? 0 : 11 - (soma % 11);
|
|
513
|
+
return resultado === parseInt(digitos.charAt(1));
|
|
514
|
+
}
|
|
515
|
+
}
|
|
516
|
+
|
|
434
517
|
class UnBPessoaService {
|
|
435
518
|
constructor(http) {
|
|
436
519
|
this.http = http;
|
|
@@ -438,6 +521,12 @@ class UnBPessoaService {
|
|
|
438
521
|
this.backendUrlSubject = new BehaviorSubject('');
|
|
439
522
|
// Exposta como Observable (caso algum componente queira se inscrever)
|
|
440
523
|
this.backendUrl$ = this.backendUrlSubject.asObservable();
|
|
524
|
+
// pra facilitar o debug, pode já passar o token. Mas isso nao pode estar na producao pq vai expor o token pro usuario no front
|
|
525
|
+
this.token = '';
|
|
526
|
+
// Cache das listas de tipos (para normalização de endereço, telefone, email)
|
|
527
|
+
this.tipoEnderecoCache = null;
|
|
528
|
+
this.tipoTelefoneCache = null;
|
|
529
|
+
this.tipoEmailCache = null;
|
|
441
530
|
// -------------------------------------------------------------------
|
|
442
531
|
// HANDLE ERROR PADRONIZADO
|
|
443
532
|
// -------------------------------------------------------------------
|
|
@@ -515,43 +604,50 @@ class UnBPessoaService {
|
|
|
515
604
|
// Setter agora recebe string direta
|
|
516
605
|
setBackendUrl(url) {
|
|
517
606
|
// Tratamento remove barra no final para padronizar
|
|
518
|
-
if (url.endsWith('/')) {
|
|
607
|
+
if (url && url.endsWith('/')) {
|
|
519
608
|
url = url.slice(0, -1);
|
|
520
609
|
}
|
|
521
610
|
this.backendUrlSubject.next(url);
|
|
522
611
|
}
|
|
612
|
+
setToken(token) {
|
|
613
|
+
this.token = token;
|
|
614
|
+
}
|
|
523
615
|
// Getter retorna string direta
|
|
524
616
|
getBackendUrl() {
|
|
525
617
|
return this.backendUrlSubject.getValue();
|
|
526
618
|
}
|
|
527
|
-
// Headers padrão
|
|
619
|
+
// Headers padrão com Content-Type e Authorization (se token existir)
|
|
528
620
|
getHeaders() {
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
|
|
621
|
+
let headers = new HttpHeaders({
|
|
622
|
+
'Content-Type': 'application/json'
|
|
623
|
+
});
|
|
624
|
+
// Se o token estiver preenchido (cenário de debug/dev), adiciona o Authorization
|
|
625
|
+
if (this.token) {
|
|
626
|
+
headers = headers.set('Authorization', `Bearer ${this.token}`);
|
|
627
|
+
}
|
|
628
|
+
// Retorna o objeto no formato esperado pelo HttpClient { headers: ... }
|
|
629
|
+
return { headers };
|
|
534
630
|
}
|
|
535
631
|
// Métodos de busca
|
|
536
632
|
findByCpf(cpf) {
|
|
537
633
|
const url = `${this.getBackendUrl()}/pessoa-api/pessoas/fisicas?cpf=${cpf}`;
|
|
538
|
-
return this.http.get(url, this.getHeaders()).pipe(catchError(this.handleError));
|
|
634
|
+
return this.http.get(url, this.getHeaders()).pipe(map(res => this.normalizePessoa(res, UnbTipoPessoaEnum.FISICA)), catchError(this.handleError));
|
|
539
635
|
}
|
|
540
636
|
findByCnpj(cnpj) {
|
|
541
637
|
const url = `${this.getBackendUrl()}/pessoa-api/pessoas/juridicas?cnpj=${cnpj}`;
|
|
542
|
-
return this.http.get(url, this.getHeaders()).pipe(catchError(this.handleError));
|
|
638
|
+
return this.http.get(url, this.getHeaders()).pipe(map(res => this.normalizePessoa(res, UnbTipoPessoaEnum.JURIDICA)), catchError(this.handleError));
|
|
543
639
|
}
|
|
544
640
|
findByPassaporte(passaporte) {
|
|
545
641
|
const url = `${this.getBackendUrl()}/pessoa-api/pessoas/fisicas?passaporte=${passaporte}`;
|
|
546
|
-
return this.http.get(url, this.getHeaders()).pipe(catchError(this.handleError));
|
|
642
|
+
return this.http.get(url, this.getHeaders()).pipe(map(res => this.normalizePessoa(res, UnbTipoPessoaEnum.ESTRANGEIRA)), catchError(this.handleError));
|
|
547
643
|
}
|
|
548
644
|
findPessoaFisicaByCodigoPessoa(id) {
|
|
549
645
|
const url = `${this.getBackendUrl()}/pessoa-api/pessoas/fisicas?codigoPessoa=${id}`;
|
|
550
|
-
return this.http.get(url, this.getHeaders()).pipe(catchError(this.handleError));
|
|
646
|
+
return this.http.get(url, this.getHeaders()).pipe(map(res => this.normalizePessoa(res, UnbTipoPessoaEnum.FISICA)), catchError(this.handleError));
|
|
551
647
|
}
|
|
552
648
|
findPessoaJuridicaByCodigoPessoa(id) {
|
|
553
649
|
const url = `${this.getBackendUrl()}/pessoa-api/pessoas/juridicas?codigoPessoa=${id}`;
|
|
554
|
-
return this.http.get(url, this.getHeaders()).pipe(catchError(this.handleError));
|
|
650
|
+
return this.http.get(url, this.getHeaders()).pipe(map(res => this.normalizePessoa(res, UnbTipoPessoaEnum.JURIDICA)), catchError(this.handleError));
|
|
555
651
|
}
|
|
556
652
|
findPessoaFisica(filtro, page, size, sort) {
|
|
557
653
|
const url = `${this.getBackendUrl()}/pessoa-api/pessoas/fisicas`;
|
|
@@ -578,7 +674,7 @@ class UnBPessoaService {
|
|
|
578
674
|
...this.getHeaders() // Tenta espalhar as propriedades se getHeaders retornar { headers: ... }
|
|
579
675
|
};
|
|
580
676
|
return this.http.get(url, options)
|
|
581
|
-
.pipe(catchError(this.handleError));
|
|
677
|
+
.pipe(map(arr => arr.map(item => this.normalizePessoa(item, UnbTipoPessoaEnum.FISICA))), catchError(this.handleError));
|
|
582
678
|
}
|
|
583
679
|
findPessoaJuridica(filtro, page, size, sort) {
|
|
584
680
|
const url = `${this.getBackendUrl()}/pessoa-api/pessoas/juridicas`;
|
|
@@ -609,7 +705,7 @@ class UnBPessoaService {
|
|
|
609
705
|
...this.getHeaders() // Tenta espalhar as propriedades se getHeaders retornar { headers: ... }
|
|
610
706
|
};
|
|
611
707
|
return this.http.get(url, options)
|
|
612
|
-
.pipe(catchError(this.handleError));
|
|
708
|
+
.pipe(map(arr => arr.map(item => this.normalizePessoa(item, UnbTipoPessoaEnum.JURIDICA))), catchError(this.handleError));
|
|
613
709
|
}
|
|
614
710
|
pesquisarCep(cep) {
|
|
615
711
|
const url = `${this.getBackendUrl()}/pessoa-api/public/busca-cep/servico-1/${cep}`;
|
|
@@ -643,6 +739,18 @@ class UnBPessoaService {
|
|
|
643
739
|
}
|
|
644
740
|
return of(null);
|
|
645
741
|
}
|
|
742
|
+
// Salvar recebendo diretamente o Model e convertendo internamente para o payload do backend
|
|
743
|
+
salvarPessoa(pessoa) {
|
|
744
|
+
if (!pessoa) {
|
|
745
|
+
return throwError(() => ({
|
|
746
|
+
status: 400,
|
|
747
|
+
mensagemSimples: 'Erro interno: Pessoa inválida (null).',
|
|
748
|
+
mensagemHtml: '<strong>Erro interno:</strong> Objeto pessoa vazio.'
|
|
749
|
+
}));
|
|
750
|
+
}
|
|
751
|
+
const payload = this.convertPessoaToPayload(pessoa);
|
|
752
|
+
return this.salvar(payload, pessoa.tipoPessoa);
|
|
753
|
+
}
|
|
646
754
|
// Salvar Pessoa Física
|
|
647
755
|
savePessoaFisica(pessoa) {
|
|
648
756
|
const url = this.getBackendUrl();
|
|
@@ -706,23 +814,32 @@ class UnBPessoaService {
|
|
|
706
814
|
denominacao: this.formatarLabel(item) // formata se quiser
|
|
707
815
|
}))), catchError(this.handleError));
|
|
708
816
|
}
|
|
709
|
-
getTipoEmail() {
|
|
710
|
-
return this.http.get(`${this.getBackendUrl()}/pessoa-api/tipos-email/public/listagem`).pipe(map(lista => lista.map((item, index) => ({
|
|
711
|
-
codigo: index, // gera um código numérico sequencial
|
|
712
|
-
denominacao: this.formatarLabel(item) // formata se quiser
|
|
713
|
-
}))), catchError(this.handleError));
|
|
714
|
-
}
|
|
715
817
|
getTipoEndereco() {
|
|
716
818
|
return this.http.get(`${this.getBackendUrl()}/pessoa-api/tipos-endereco/public/listagem`).pipe(map(lista => lista.map((item, index) => ({
|
|
717
819
|
codigo: index, // gera um código numérico sequencial
|
|
718
820
|
denominacao: this.formatarLabel(item) // formata se quiser
|
|
719
|
-
}))),
|
|
821
|
+
}))), map(lista => {
|
|
822
|
+
this.tipoEnderecoCache = lista;
|
|
823
|
+
return lista;
|
|
824
|
+
}), catchError(this.handleError));
|
|
720
825
|
}
|
|
721
826
|
getTipoTelefone() {
|
|
722
827
|
return this.http.get(`${this.getBackendUrl()}/pessoa-api/tipos-telefone/public/listagem`).pipe(map(lista => lista.map((item, index) => ({
|
|
723
828
|
codigo: index, // gera um código numérico sequencial
|
|
724
829
|
denominacao: this.formatarLabel(item) // formata se quiser
|
|
725
|
-
}))),
|
|
830
|
+
}))), map(lista => {
|
|
831
|
+
this.tipoTelefoneCache = lista;
|
|
832
|
+
return lista;
|
|
833
|
+
}), catchError(this.handleError));
|
|
834
|
+
}
|
|
835
|
+
getTipoEmail() {
|
|
836
|
+
return this.http.get(`${this.getBackendUrl()}/pessoa-api/tipos-email/public/listagem`).pipe(map(lista => lista.map((item, index) => ({
|
|
837
|
+
codigo: index, // gera um código numérico sequencial
|
|
838
|
+
denominacao: this.formatarLabel(item) // formata se quiser
|
|
839
|
+
}))), map(lista => {
|
|
840
|
+
this.tipoEmailCache = lista;
|
|
841
|
+
return lista;
|
|
842
|
+
}), catchError(this.handleError));
|
|
726
843
|
}
|
|
727
844
|
formatarLabel(text) {
|
|
728
845
|
return text
|
|
@@ -730,10 +847,226 @@ class UnBPessoaService {
|
|
|
730
847
|
.replace(/_/g, ' ')
|
|
731
848
|
.replace(/\b\w/g, l => l.toUpperCase());
|
|
732
849
|
}
|
|
733
|
-
|
|
734
|
-
|
|
850
|
+
/**
|
|
851
|
+
* Normaliza o payload retornado pelo backend para `UnbPessoaModel` pronto para UI.
|
|
852
|
+
*/
|
|
853
|
+
normalizePessoa(resultado, tipoForcado) {
|
|
854
|
+
const pessoa = (resultado || new UnbPessoaModel());
|
|
855
|
+
// Define tipoPessoa quando o endpoint não retorna
|
|
856
|
+
if (tipoForcado != null) {
|
|
857
|
+
pessoa.tipoPessoa = tipoForcado;
|
|
858
|
+
}
|
|
859
|
+
// Garante arrays
|
|
860
|
+
pessoa.enderecos = pessoa.enderecos || [];
|
|
861
|
+
pessoa.telefones = pessoa.telefones || [];
|
|
862
|
+
pessoa.emails = pessoa.emails || [];
|
|
863
|
+
// Sexo -> codigoSexo
|
|
864
|
+
if (pessoa.sexo) {
|
|
865
|
+
const sexo = pessoa.sexo.toUpperCase().trim();
|
|
866
|
+
if (sexo === 'FEMININO')
|
|
867
|
+
pessoa.codigoSexo = 2;
|
|
868
|
+
else if (sexo === 'MASCULINO')
|
|
869
|
+
pessoa.codigoSexo = 1;
|
|
870
|
+
}
|
|
871
|
+
// Datas para Date
|
|
872
|
+
pessoa.dataNascimento = this.parseData(pessoa.dataNascimento);
|
|
873
|
+
// Demais datas permanecem como string para compatibilidade com o model
|
|
874
|
+
// Campos com 'codigo - label' -> codigo
|
|
875
|
+
pessoa.codigoEstadoCivil = this.parseCodigo(pessoa.estadoCivil);
|
|
876
|
+
pessoa.codigoPaisNascimento = this.parseCodigo(pessoa.paisNascimento);
|
|
877
|
+
pessoa.escolaridade = this.parseCodigo(pessoa.escolaridade);
|
|
878
|
+
// Endereços: ordem/uf
|
|
879
|
+
pessoa.enderecos.forEach((end, i) => {
|
|
880
|
+
end.ordemEndereco = end.ordemEndereco || end.ordem || (i + 1);
|
|
881
|
+
if (!end.ufEndereco && end.uf)
|
|
882
|
+
end.ufEndereco = end.uf;
|
|
883
|
+
// Mapeia tipo string para tipoEnderecoCodigo usando o cache
|
|
884
|
+
if (!end.tipoEnderecoCodigo && end.tipo && this.tipoEnderecoCache) {
|
|
885
|
+
const tipoEncontrado = this.tipoEnderecoCache.find(t => t.denominacao?.toLowerCase() === String(end.tipo).toLowerCase());
|
|
886
|
+
if (tipoEncontrado)
|
|
887
|
+
end.tipoEnderecoCodigo = tipoEncontrado.codigo;
|
|
888
|
+
}
|
|
889
|
+
// Traduz 'pais' (string '22 - BRASIL') para 'paisEnderecoCodigo' (number)
|
|
890
|
+
if (!end.paisEnderecoCodigo && end.pais) {
|
|
891
|
+
end.paisEnderecoCodigo = this.parseCodigo(end.pais);
|
|
892
|
+
}
|
|
893
|
+
});
|
|
894
|
+
// Telefones: ordem e tipo
|
|
895
|
+
pessoa.telefones.forEach((tel, i) => {
|
|
896
|
+
tel.ordem = tel.ordem || (i + 1);
|
|
897
|
+
// Mapeia tipo string para tipoTelefoneCodigo usando o cache
|
|
898
|
+
if (!tel.tipoTelefoneCodigo && tel.tipo && this.tipoTelefoneCache) {
|
|
899
|
+
const tipoEncontrado = this.tipoTelefoneCache.find(t => t.denominacao?.toLowerCase() === String(tel.tipo).toLowerCase());
|
|
900
|
+
if (tipoEncontrado)
|
|
901
|
+
tel.tipoTelefoneCodigo = tipoEncontrado.codigo;
|
|
902
|
+
}
|
|
903
|
+
});
|
|
904
|
+
// Emails: ordem e tipo
|
|
905
|
+
pessoa.emails.forEach((email, i) => {
|
|
906
|
+
email.ordem = email.ordem || (i + 1);
|
|
907
|
+
// Mapeia tipo string para tipoEmailCodigo usando o cache
|
|
908
|
+
if (!email.tipoEmailCodigo && email.tipo && this.tipoEmailCache) {
|
|
909
|
+
const tipoEncontrado = this.tipoEmailCache.find(t => t.denominacao?.toLowerCase() === String(email.tipo).toLowerCase());
|
|
910
|
+
if (tipoEncontrado)
|
|
911
|
+
email.tipoEmailCodigo = tipoEncontrado.codigo;
|
|
912
|
+
}
|
|
913
|
+
});
|
|
914
|
+
// Formata documento para UI
|
|
915
|
+
if (pessoa.tipoPessoa === UnbTipoPessoaEnum.FISICA && pessoa.cpf) {
|
|
916
|
+
const digits = String(pessoa.cpf).replace(/\D/g, '');
|
|
917
|
+
pessoa.cpf = UnbUtils.formataCpf(digits);
|
|
918
|
+
}
|
|
919
|
+
else if (pessoa.tipoPessoa === UnbTipoPessoaEnum.JURIDICA && pessoa.cnpj) {
|
|
920
|
+
const digits = String(pessoa.cnpj).replace(/\D/g, '');
|
|
921
|
+
pessoa.cnpj = UnbUtils.formataCnpj(digits);
|
|
922
|
+
}
|
|
923
|
+
return pessoa;
|
|
924
|
+
}
|
|
925
|
+
parseCodigo(valor) {
|
|
926
|
+
if (valor == null)
|
|
927
|
+
return null;
|
|
928
|
+
if (typeof valor === 'number')
|
|
929
|
+
return valor;
|
|
930
|
+
if (typeof valor !== 'string')
|
|
931
|
+
return null;
|
|
932
|
+
const sepIndex = valor.indexOf(' - ');
|
|
933
|
+
if (sepIndex === -1) {
|
|
934
|
+
const num = parseInt(valor, 10);
|
|
935
|
+
return isNaN(num) ? null : num;
|
|
936
|
+
}
|
|
937
|
+
const codigo = parseInt(valor.substring(0, sepIndex).trim(), 10);
|
|
938
|
+
return isNaN(codigo) ? null : codigo;
|
|
939
|
+
}
|
|
940
|
+
parseData(dataString) {
|
|
941
|
+
if (!dataString)
|
|
942
|
+
return null;
|
|
943
|
+
if (dataString instanceof Date)
|
|
944
|
+
return dataString;
|
|
945
|
+
if (typeof dataString !== 'string' || !dataString.includes('/'))
|
|
946
|
+
return null;
|
|
947
|
+
const partes = dataString.split('/');
|
|
948
|
+
if (partes.length !== 3)
|
|
949
|
+
return null;
|
|
950
|
+
const dia = parseInt(partes[0], 10);
|
|
951
|
+
const mes = parseInt(partes[1], 10) - 1;
|
|
952
|
+
const ano = parseInt(partes[2], 10);
|
|
953
|
+
const dataObj = new Date(ano, mes, dia);
|
|
954
|
+
if (dataObj.getFullYear() === ano && dataObj.getMonth() === mes && dataObj.getDate() === dia) {
|
|
955
|
+
return dataObj;
|
|
956
|
+
}
|
|
957
|
+
return null;
|
|
958
|
+
}
|
|
959
|
+
/**
|
|
960
|
+
* Converte uma instância (ou objeto) de UnbPessoaModel para o payload esperado pelo backend.
|
|
961
|
+
*/
|
|
962
|
+
convertPessoaToPayload(pessoa) {
|
|
963
|
+
if (!pessoa)
|
|
964
|
+
return null;
|
|
965
|
+
const enderecosPayload = (pessoa.enderecos || []).map((end) => ({
|
|
966
|
+
ordemEndereco: end.ordemEndereco,
|
|
967
|
+
tipoEnderecoCodigo: end.tipoEnderecoCodigo,
|
|
968
|
+
municipioCodigo: end.municipioCodigo,
|
|
969
|
+
paisEnderecoCodigo: end.paisEnderecoCodigo,
|
|
970
|
+
logradouro: end.logradouro,
|
|
971
|
+
complemento: end.complemento,
|
|
972
|
+
cep: end.cep,
|
|
973
|
+
bairro: end.bairro,
|
|
974
|
+
ufEndereco: end.ufEndereco,
|
|
975
|
+
caixaPostal: end.caixaPostal,
|
|
976
|
+
correspondencia: end.correspondencia
|
|
977
|
+
}));
|
|
978
|
+
const telefonesPayload = (pessoa.telefones || []).map((tel) => ({
|
|
979
|
+
ordemTelefone: tel.ordem,
|
|
980
|
+
tipoTelefoneCodigo: tel.tipoTelefoneCodigo,
|
|
981
|
+
ddi: tel.ddi,
|
|
982
|
+
ddd: tel.ddd,
|
|
983
|
+
numeroTelefone: tel.numero,
|
|
984
|
+
ramal: tel.ramal,
|
|
985
|
+
autorizaSMS: tel.autorizaSMS
|
|
986
|
+
}));
|
|
987
|
+
const emailsPayload = (pessoa.emails || []).map((email) => ({
|
|
988
|
+
tipoEmailCodigo: email.tipoEmailCodigo,
|
|
989
|
+
ordemEmail: email.ordem,
|
|
990
|
+
email: email.email,
|
|
991
|
+
autorizacao: email.autorizacao
|
|
992
|
+
}));
|
|
993
|
+
return {
|
|
994
|
+
idPessoa: pessoa.idPessoa,
|
|
995
|
+
codigoPessoa: pessoa.codigoPessoa,
|
|
996
|
+
nome: pessoa.nome,
|
|
997
|
+
nomeSocial: pessoa.nomeSocial,
|
|
998
|
+
...(pessoa.cpf && { cpf: pessoa.cpf.replace(/\D/g, '') }),
|
|
999
|
+
codigoSexo: pessoa.codigoSexo,
|
|
1000
|
+
codigoEstadoCivil: pessoa.codigoEstadoCivil,
|
|
1001
|
+
codigoEscolaridade: pessoa.escolaridade,
|
|
1002
|
+
nomePai: pessoa.nomePai,
|
|
1003
|
+
nomeMae: pessoa.nomeMae,
|
|
1004
|
+
dataNascimento: this.formatarDataParaBackend(pessoa.dataNascimento),
|
|
1005
|
+
codigoPaisNascimento: pessoa.codigoPaisNascimento,
|
|
1006
|
+
ufNascimento: pessoa.ufNascimento,
|
|
1007
|
+
naturalidade: pessoa.naturalidade,
|
|
1008
|
+
dataChegadaBrasil: this.formatarDataParaBackend(pessoa.dataChegadaBrasil),
|
|
1009
|
+
rg: pessoa.rg,
|
|
1010
|
+
rgOrgao: pessoa.rgOrgao,
|
|
1011
|
+
rgUf: pessoa.rgUf,
|
|
1012
|
+
rgDataEmissao: this.formatarDataParaBackend(pessoa.rgDataEmissao),
|
|
1013
|
+
numeroTituloEleitor: pessoa.numeroTituloEleitor,
|
|
1014
|
+
dataEmissaoTituloEleitor: this.formatarDataParaBackend(pessoa.dataEmissaoTituloEleitor),
|
|
1015
|
+
zonaTituloEleitor: pessoa.zonaTituloEleitor,
|
|
1016
|
+
secaoTituloEleitor: pessoa.secaoTituloEleitor,
|
|
1017
|
+
ufTituloEleitor: pessoa.ufTituloEleitor,
|
|
1018
|
+
numeroReservista: pessoa.numeroReservista,
|
|
1019
|
+
serieReservista: pessoa.serieReservista,
|
|
1020
|
+
orgaoReservista: pessoa.orgaoReservista,
|
|
1021
|
+
numeroCarteiraTrabalho: pessoa.numeroCarteiraTrabalho,
|
|
1022
|
+
serieCarteiraTrabalho: pessoa.serieCarteiraTrabalho,
|
|
1023
|
+
ufCarteiraTrabalho: pessoa.ufCarteiraTrabalho,
|
|
1024
|
+
pisPasep: pessoa.pisPasep,
|
|
1025
|
+
numeroHabilitacao: pessoa.numeroHabilitacao,
|
|
1026
|
+
registroHabilitacao: pessoa.registroHabilitacao,
|
|
1027
|
+
dataEmissaoHabilitacao: this.formatarDataParaBackend(pessoa.dataEmissaoHabilitacao),
|
|
1028
|
+
dataValidadeHabilitacao: this.formatarDataParaBackend(pessoa.dataValidadeHabilitacao),
|
|
1029
|
+
categoriaHabilitacao: pessoa.categoriaHabilitacao,
|
|
1030
|
+
deficienciaFisicaHabilitacao: pessoa.deficienciaFisicaHabilitacao,
|
|
1031
|
+
primeiraHabilitacao: this.formatarDataParaBackend(pessoa.primeiraHabilitacao),
|
|
1032
|
+
passaporte: pessoa.passaporte,
|
|
1033
|
+
codigoPaisPassaporte: pessoa.codigoPaisPassaporte,
|
|
1034
|
+
...(pessoa.cnpj && { cnpj: pessoa.cnpj.replace(/\D/g, '') }),
|
|
1035
|
+
razaoSocial: pessoa.razaoSocial,
|
|
1036
|
+
nomeFantasia: pessoa.nomeFantasia,
|
|
1037
|
+
sigla: pessoa.sigla,
|
|
1038
|
+
paginaWeb: pessoa.paginaWeb,
|
|
1039
|
+
autoCadastro: pessoa.autoCadastro,
|
|
1040
|
+
enderecos: enderecosPayload,
|
|
1041
|
+
telefones: telefonesPayload,
|
|
1042
|
+
emails: emailsPayload
|
|
1043
|
+
};
|
|
1044
|
+
}
|
|
1045
|
+
/**
|
|
1046
|
+
* Formata a data no padrão DD/MM/YYYY para o backend.
|
|
1047
|
+
*/
|
|
1048
|
+
formatarDataParaBackend(data) {
|
|
1049
|
+
if (!data)
|
|
1050
|
+
return null;
|
|
1051
|
+
if (typeof data === 'string' && data.includes('/'))
|
|
1052
|
+
return data;
|
|
1053
|
+
try {
|
|
1054
|
+
const d = new Date(data);
|
|
1055
|
+
if (isNaN(d.getTime()))
|
|
1056
|
+
return null;
|
|
1057
|
+
const dia = String(d.getDate()).padStart(2, '0');
|
|
1058
|
+
const mes = String(d.getMonth() + 1).padStart(2, '0');
|
|
1059
|
+
const ano = d.getFullYear();
|
|
1060
|
+
return `${dia}/${mes}/${ano}`;
|
|
1061
|
+
}
|
|
1062
|
+
catch {
|
|
1063
|
+
return null;
|
|
1064
|
+
}
|
|
1065
|
+
}
|
|
1066
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.1.2", ngImport: i0, type: UnBPessoaService, deps: [{ token: i1$1.HttpClient }], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
1067
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.1.2", ngImport: i0, type: UnBPessoaService, providedIn: 'root' }); }
|
|
735
1068
|
}
|
|
736
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2
|
|
1069
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.2", ngImport: i0, type: UnBPessoaService, decorators: [{
|
|
737
1070
|
type: Injectable,
|
|
738
1071
|
args: [{
|
|
739
1072
|
providedIn: 'root'
|
|
@@ -888,10 +1221,10 @@ class UnbPessoaEmailFormComponent {
|
|
|
888
1221
|
duration: 5000,
|
|
889
1222
|
});
|
|
890
1223
|
}
|
|
891
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2
|
|
892
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2
|
|
1224
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.1.2", ngImport: i0, type: UnbPessoaEmailFormComponent, deps: [{ token: i1$2.MatSnackBar }, { token: UnBPessoaService }, { token: UnbMensagemService }, { token: i4$2.MatDialogRef }, { token: MAT_DIALOG_DATA }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
1225
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.1.2", type: UnbPessoaEmailFormComponent, selector: "lib-unb-pessoa-email-form", ngImport: i0, template: "<h1 mat-dialog-title>Cadastro de E-mail</h1>\r\n<form (ngSubmit)=\"salvar(form)\" #form=\"ngForm\">\r\n <mat-dialog-content>\r\n <unb-mensagem [identificador]=\"idMensagemService\"></unb-mensagem>\r\n <div class=\"form-container\">\r\n <mat-form-field class=\"form-100\" appearance=\"outline\">\r\n <mat-label>Tipo</mat-label>\r\n <mat-select [(ngModel)]=\"email.tipoEmailCodigo\" [compareWith]=\"compararTipos\" name=\"tipoEmailCodigo\" (selectionChange)=\"onTipoSelecionado($event.value)\" required>\r\n <mat-option *ngFor=\"let tipo of listaTipoEmail\" [value]=\"tipo.codigo\">\r\n {{tipo.denominacao}}\r\n </mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n\r\n <mat-form-field class=\"form-100\" appearance=\"outline\">\r\n <mat-label>E-mail</mat-label>\r\n <input type=\"text\" matInput [(ngModel)]=\"email.email\" name=\"emailValue\" #emailValue=\"ngModel\" />\r\n </mat-form-field>\r\n\r\n </div>\r\n </mat-dialog-content>\r\n\r\n <mat-dialog-actions align=\"end\">\r\n <button mat-stroked-button type=\"button\" color=\"warn\" (click)=\"close()\">Fechar</button>\r\n <button mat-flat-button type=\"submit\" color=\"primary\">Salvar</button>\r\n </mat-dialog-actions>\r\n</form>", styles: [".card-actions-buttons{display:flex;gap:5px;flex-wrap:wrap}.form-container{display:flex;flex-wrap:wrap;column-gap:10px;margin:10px}@media (max-width: 1000px){.form-container{flex-direction:column;gap:5px}}.break{flex-basis:100%;height:0}.form-5{flex:1 1 5%}.inline-table-container{display:flex;align-items:center;justify-content:space-between;padding:5px}@media (max-width: 600px){.form-5,.form-10,.form-15{flex:1 1 100%}}.form-10{flex:1 1 10%}.form-15{flex:1 1 15%}.form-20{flex:1 1 20%}.form-25{flex:1 1 25%}.form-30{flex:1 1 30%}.form-35{flex:1 1 35%}.form-40{flex:1 1 40%}.form-45{flex:1 1 45%}.form-50{flex:1 1 50%}.form-60{flex:1 1 60%}.form-70{flex:1 1 70%}.form-80{flex:1 1 80%}.form-100{flex:1 1 100%;min-width:250px}.botoes-container{display:flex;gap:5px}@media (max-width: 600px){.botoes-container{margin-bottom:10px}.botoes-container button{flex:1;max-width:50%}}\n"], dependencies: [{ kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i6.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i6.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i6.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i6.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i6.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i6.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i6.NgForm, selector: "form:not([ngNoForm]):not([formGroup]),ng-form,[ngForm]", inputs: ["ngFormOptions"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "component", type: i7.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "component", type: UnbMensagemComponent, selector: "unb-mensagem", inputs: ["mensagem", "tipo", "identificador"] }, { kind: "component", type: i9.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i9.MatLabel, selector: "mat-label" }, { kind: "directive", type: i10.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "directive", type: i4$2.MatDialogTitle, selector: "[mat-dialog-title], [matDialogTitle]", inputs: ["id"], exportAs: ["matDialogTitle"] }, { kind: "directive", type: i4$2.MatDialogActions, selector: "[mat-dialog-actions], mat-dialog-actions, [matDialogActions]", inputs: ["align"] }, { kind: "directive", type: i4$2.MatDialogContent, selector: "[mat-dialog-content], mat-dialog-content, [matDialogContent]" }, { kind: "component", type: i11.MatSelect, selector: "mat-select", inputs: ["aria-describedby", "panelClass", "disabled", "disableRipple", "tabIndex", "hideSingleSelectionIndicator", "placeholder", "required", "multiple", "disableOptionCentering", "compareWith", "value", "aria-label", "aria-labelledby", "errorStateMatcher", "typeaheadDebounceInterval", "sortComparator", "id", "panelWidth"], outputs: ["openedChange", "opened", "closed", "selectionChange", "valueChange"], exportAs: ["matSelect"] }, { kind: "component", type: i12.MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }] }); }
|
|
893
1226
|
}
|
|
894
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2
|
|
1227
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.2", ngImport: i0, type: UnbPessoaEmailFormComponent, decorators: [{
|
|
895
1228
|
type: Component,
|
|
896
1229
|
args: [{ standalone: false, selector: 'lib-unb-pessoa-email-form', template: "<h1 mat-dialog-title>Cadastro de E-mail</h1>\r\n<form (ngSubmit)=\"salvar(form)\" #form=\"ngForm\">\r\n <mat-dialog-content>\r\n <unb-mensagem [identificador]=\"idMensagemService\"></unb-mensagem>\r\n <div class=\"form-container\">\r\n <mat-form-field class=\"form-100\" appearance=\"outline\">\r\n <mat-label>Tipo</mat-label>\r\n <mat-select [(ngModel)]=\"email.tipoEmailCodigo\" [compareWith]=\"compararTipos\" name=\"tipoEmailCodigo\" (selectionChange)=\"onTipoSelecionado($event.value)\" required>\r\n <mat-option *ngFor=\"let tipo of listaTipoEmail\" [value]=\"tipo.codigo\">\r\n {{tipo.denominacao}}\r\n </mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n\r\n <mat-form-field class=\"form-100\" appearance=\"outline\">\r\n <mat-label>E-mail</mat-label>\r\n <input type=\"text\" matInput [(ngModel)]=\"email.email\" name=\"emailValue\" #emailValue=\"ngModel\" />\r\n </mat-form-field>\r\n\r\n </div>\r\n </mat-dialog-content>\r\n\r\n <mat-dialog-actions align=\"end\">\r\n <button mat-stroked-button type=\"button\" color=\"warn\" (click)=\"close()\">Fechar</button>\r\n <button mat-flat-button type=\"submit\" color=\"primary\">Salvar</button>\r\n </mat-dialog-actions>\r\n</form>", styles: [".card-actions-buttons{display:flex;gap:5px;flex-wrap:wrap}.form-container{display:flex;flex-wrap:wrap;column-gap:10px;margin:10px}@media (max-width: 1000px){.form-container{flex-direction:column;gap:5px}}.break{flex-basis:100%;height:0}.form-5{flex:1 1 5%}.inline-table-container{display:flex;align-items:center;justify-content:space-between;padding:5px}@media (max-width: 600px){.form-5,.form-10,.form-15{flex:1 1 100%}}.form-10{flex:1 1 10%}.form-15{flex:1 1 15%}.form-20{flex:1 1 20%}.form-25{flex:1 1 25%}.form-30{flex:1 1 30%}.form-35{flex:1 1 35%}.form-40{flex:1 1 40%}.form-45{flex:1 1 45%}.form-50{flex:1 1 50%}.form-60{flex:1 1 60%}.form-70{flex:1 1 70%}.form-80{flex:1 1 80%}.form-100{flex:1 1 100%;min-width:250px}.botoes-container{display:flex;gap:5px}@media (max-width: 600px){.botoes-container{margin-bottom:10px}.botoes-container button{flex:1;max-width:50%}}\n"] }]
|
|
897
1230
|
}], ctorParameters: () => [{ type: i1$2.MatSnackBar }, { type: UnBPessoaService }, { type: UnbMensagemService }, { type: i4$2.MatDialogRef }, { type: undefined, decorators: [{
|
|
@@ -1017,18 +1350,35 @@ class UnbPessoaEnderecoFormComponent {
|
|
|
1017
1350
|
if (this.endereco.cep && this.endereco.cep.trim() !== '') {
|
|
1018
1351
|
this.loading = true;
|
|
1019
1352
|
let cepFormatado = this.endereco.cep.replace(/\D/g, ''); // Remove caracteres não numéricos
|
|
1353
|
+
if (cepFormatado.length !== 8) {
|
|
1354
|
+
this.handleError('O CEP deve conter exatamente 8 números.');
|
|
1355
|
+
return;
|
|
1356
|
+
}
|
|
1020
1357
|
this.service.pesquisarCep(cepFormatado).subscribe({
|
|
1021
1358
|
next: (data) => {
|
|
1359
|
+
this.loading = false;
|
|
1360
|
+
if (data.erro === 'true' || data.erro === true) {
|
|
1361
|
+
this.handleError('CEP não encontrado.');
|
|
1362
|
+
return; // Para a execução aqui
|
|
1363
|
+
}
|
|
1022
1364
|
this.endereco.logradouro = data.logradouro;
|
|
1023
1365
|
this.endereco.bairro = data.bairro;
|
|
1024
1366
|
this.endereco.ufEndereco = data.uf;
|
|
1025
1367
|
this.endereco.uf = data.uf;
|
|
1026
1368
|
this.endereco.complemento = data.complemento;
|
|
1027
|
-
this.loading = false;
|
|
1028
1369
|
},
|
|
1029
1370
|
error: (err) => {
|
|
1030
1371
|
this.loading = false;
|
|
1031
|
-
|
|
1372
|
+
if (err.status === 400) {
|
|
1373
|
+
this.handleError('CEP inválido ou formato incorreto.');
|
|
1374
|
+
}
|
|
1375
|
+
else if (err.status === 404) {
|
|
1376
|
+
this.handleError('CEP não encontrado.');
|
|
1377
|
+
}
|
|
1378
|
+
else {
|
|
1379
|
+
// Se for 500 ou outro erro, mostra a mensagem original do service
|
|
1380
|
+
this.handleError(err);
|
|
1381
|
+
}
|
|
1032
1382
|
}
|
|
1033
1383
|
});
|
|
1034
1384
|
}
|
|
@@ -1142,12 +1492,12 @@ class UnbPessoaEnderecoFormComponent {
|
|
|
1142
1492
|
duration: 5000,
|
|
1143
1493
|
});
|
|
1144
1494
|
}
|
|
1145
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2
|
|
1146
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2
|
|
1495
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.1.2", ngImport: i0, type: UnbPessoaEnderecoFormComponent, deps: [{ token: i1$2.MatSnackBar }, { token: UnBPessoaService }, { token: UnbMensagemService }, { token: i4$2.MatDialogRef }, { token: MAT_DIALOG_DATA }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
1496
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.1.2", type: UnbPessoaEnderecoFormComponent, selector: "lib-unb-pessoa-endereco-form", ngImport: i0, template: "<h1 mat-dialog-title>Cadastro de Endere\u00E7o</h1>\r\n<form (ngSubmit)=\"salvar(form)\" #form=\"ngForm\">\r\n <mat-dialog-content>\r\n <unb-mensagem [identificador]=\"idMensagemService\"></unb-mensagem>\r\n <div class=\"form-container\">\r\n <mat-form-field class=\"form-100\" appearance=\"outline\">\r\n <mat-label>Tipo</mat-label>\r\n <mat-select [(ngModel)]=\"endereco.tipoEnderecoCodigo\" name=\"tipo\" #tipo=\"ngModel\"\r\n (selectionChange)=\"onTipoSelecionado($event.value)\" required>\r\n <mat-option *ngFor=\"let tipo of listaTipoEndereco\" [value]=\"tipo.codigo\">\r\n {{tipo.denominacao}}\r\n </mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n\r\n <mat-form-field class=\"form-10\" appearance=\"outline\">\r\n <mat-label>Pa\u00EDs</mat-label>\r\n\r\n <mat-select [(ngModel)]=\"endereco.paisEnderecoCodigo\" name=\"paisEnderecoCodigo\" #paisEnderecoCodigo=\"ngModel\">\r\n\r\n <mat-option *ngFor=\"let paises of listaPaises\" [value]=\"paises.codigo\">\r\n <span *ngIf=\"paises.denominacao === 'BRASIL'\">\uD83C\uDDE7\uD83C\uDDF7 <b>{{ paises.denominacao }}</b></span>\r\n <span *ngIf=\"paises.denominacao !== 'BRASIL'\">{{ paises.denominacao }}</span>\r\n </mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n\r\n <mat-form-field class=\"form-100\" appearance=\"outline\">\r\n <mat-label>CEP</mat-label>\r\n <input type=\"text\" matInput [(ngModel)]=\"endereco.cep\" name=\"cep\" #cep=\"ngModel\" />\r\n\r\n <button matSuffix mat-icon-button type=\"button\" aria-label=\"Pesquisar\" \r\n [disabled]=\"loading\" (click)=\"pesquisarCep()\">\r\n \r\n <ng-container *ngIf=\"!loading; else loadingIcon\">\r\n <mat-icon style=\"margin-right: 2px;\">search</mat-icon>\r\n </ng-container>\r\n\r\n <ng-template #loadingIcon>\r\n <mat-progress-spinner \r\n [diameter]=\"20\" \r\n mode=\"indeterminate\" \r\n color=\"primary\" \r\n class=\"spinner-button\">\r\n </mat-progress-spinner>\r\n </ng-template>\r\n\r\n </button>\r\n </mat-form-field>\r\n\r\n <mat-form-field class=\"form-25\" appearance=\"outline\">\r\n <mat-label>Endere\u00E7o</mat-label>\r\n <input type=\"text\" matInput [(ngModel)]=\"endereco.logradouro\" name=\"logradouro\" #logradouro=\"ngModel\" />\r\n </mat-form-field>\r\n\r\n <mat-form-field class=\"form-100\" appearance=\"outline\">\r\n <mat-label>Bairro</mat-label>\r\n <input type=\"text\" matInput [(ngModel)]=\"endereco.bairro\" name=\"bairro\" #bairro=\"ngModel\" />\r\n </mat-form-field>\r\n\r\n <mat-form-field class=\"form-100\" appearance=\"outline\">\r\n <mat-label>Complemento</mat-label>\r\n <input type=\"text\" matInput [(ngModel)]=\"endereco.complemento\" name=\"complemento\" #complemento=\"ngModel\" />\r\n </mat-form-field>\r\n\r\n <mat-form-field class=\"form-100\" appearance=\"outline\">\r\n <mat-label>UF</mat-label>\r\n <mat-select [(ngModel)]=\"endereco.uf\" name=\"uf\" #uf=\"ngModel\">\r\n <mat-option *ngFor=\"let uf of getListaEstados()\" [value]=\"uf\">\r\n {{ uf }}\r\n </mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n </div>\r\n </mat-dialog-content>\r\n\r\n <mat-dialog-actions align=\"end\">\r\n <button mat-stroked-button type=\"button\" color=\"warn\" (click)=\"close()\">Fechar</button>\r\n <button mat-flat-button type=\"submit\" color=\"primary\">Salvar</button>\r\n </mat-dialog-actions>\r\n</form>", styles: [".card-actions-buttons{display:flex;gap:5px;flex-wrap:wrap}.form-container{display:flex;flex-wrap:wrap;column-gap:10px;margin:10px}@media (max-width: 1000px){.form-container{flex-direction:column;gap:5px}}.break{flex-basis:100%;height:0}.form-5{flex:1 1 5%}.inline-table-container{display:flex;align-items:center;justify-content:space-between;padding:5px}@media (max-width: 600px){.form-5,.form-10,.form-15{flex:1 1 100%}}.form-10{flex:1 1 10%}.form-15{flex:1 1 15%}.form-20{flex:1 1 20%}.form-25{flex:1 1 25%}.form-30{flex:1 1 30%}.form-35{flex:1 1 35%}.form-40{flex:1 1 40%}.form-45{flex:1 1 45%}.form-50{flex:1 1 50%}.form-100{flex:1 1 100%;min-width:250px}.botoes-container{display:flex;gap:5px}@media (max-width: 600px){.botoes-container{margin-bottom:10px}.botoes-container button{flex:1;max-width:50%}}\n"], dependencies: [{ kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i6.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i6.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i6.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i6.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i6.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i6.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i6.NgForm, selector: "form:not([ngNoForm]):not([formGroup]),ng-form,[ngForm]", inputs: ["ngFormOptions"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "component", type: i5.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i7.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "component", type: i7.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "component", type: UnbMensagemComponent, selector: "unb-mensagem", inputs: ["mensagem", "tipo", "identificador"] }, { kind: "component", type: i9.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i9.MatLabel, selector: "mat-label" }, { kind: "directive", type: i9.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "directive", type: i10.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "directive", type: i4$2.MatDialogTitle, selector: "[mat-dialog-title], [matDialogTitle]", inputs: ["id"], exportAs: ["matDialogTitle"] }, { kind: "directive", type: i4$2.MatDialogActions, selector: "[mat-dialog-actions], mat-dialog-actions, [matDialogActions]", inputs: ["align"] }, { kind: "directive", type: i4$2.MatDialogContent, selector: "[mat-dialog-content], mat-dialog-content, [matDialogContent]" }, { kind: "component", type: i11.MatSelect, selector: "mat-select", inputs: ["aria-describedby", "panelClass", "disabled", "disableRipple", "tabIndex", "hideSingleSelectionIndicator", "placeholder", "required", "multiple", "disableOptionCentering", "compareWith", "value", "aria-label", "aria-labelledby", "errorStateMatcher", "typeaheadDebounceInterval", "sortComparator", "id", "panelWidth"], outputs: ["openedChange", "opened", "closed", "selectionChange", "valueChange"], exportAs: ["matSelect"] }, { kind: "component", type: i12.MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }, { kind: "component", type: i14.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "mode", "value", "diameter", "strokeWidth"], exportAs: ["matProgressSpinner"] }] }); }
|
|
1147
1497
|
}
|
|
1148
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2
|
|
1498
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.2", ngImport: i0, type: UnbPessoaEnderecoFormComponent, decorators: [{
|
|
1149
1499
|
type: Component,
|
|
1150
|
-
args: [{ standalone: false, selector: 'lib-unb-pessoa-endereco-form', template: "<h1 mat-dialog-title>Cadastro de
|
|
1500
|
+
args: [{ standalone: false, selector: 'lib-unb-pessoa-endereco-form', template: "<h1 mat-dialog-title>Cadastro de Endere\u00E7o</h1>\r\n<form (ngSubmit)=\"salvar(form)\" #form=\"ngForm\">\r\n <mat-dialog-content>\r\n <unb-mensagem [identificador]=\"idMensagemService\"></unb-mensagem>\r\n <div class=\"form-container\">\r\n <mat-form-field class=\"form-100\" appearance=\"outline\">\r\n <mat-label>Tipo</mat-label>\r\n <mat-select [(ngModel)]=\"endereco.tipoEnderecoCodigo\" name=\"tipo\" #tipo=\"ngModel\"\r\n (selectionChange)=\"onTipoSelecionado($event.value)\" required>\r\n <mat-option *ngFor=\"let tipo of listaTipoEndereco\" [value]=\"tipo.codigo\">\r\n {{tipo.denominacao}}\r\n </mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n\r\n <mat-form-field class=\"form-10\" appearance=\"outline\">\r\n <mat-label>Pa\u00EDs</mat-label>\r\n\r\n <mat-select [(ngModel)]=\"endereco.paisEnderecoCodigo\" name=\"paisEnderecoCodigo\" #paisEnderecoCodigo=\"ngModel\">\r\n\r\n <mat-option *ngFor=\"let paises of listaPaises\" [value]=\"paises.codigo\">\r\n <span *ngIf=\"paises.denominacao === 'BRASIL'\">\uD83C\uDDE7\uD83C\uDDF7 <b>{{ paises.denominacao }}</b></span>\r\n <span *ngIf=\"paises.denominacao !== 'BRASIL'\">{{ paises.denominacao }}</span>\r\n </mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n\r\n <mat-form-field class=\"form-100\" appearance=\"outline\">\r\n <mat-label>CEP</mat-label>\r\n <input type=\"text\" matInput [(ngModel)]=\"endereco.cep\" name=\"cep\" #cep=\"ngModel\" />\r\n\r\n <button matSuffix mat-icon-button type=\"button\" aria-label=\"Pesquisar\" \r\n [disabled]=\"loading\" (click)=\"pesquisarCep()\">\r\n \r\n <ng-container *ngIf=\"!loading; else loadingIcon\">\r\n <mat-icon style=\"margin-right: 2px;\">search</mat-icon>\r\n </ng-container>\r\n\r\n <ng-template #loadingIcon>\r\n <mat-progress-spinner \r\n [diameter]=\"20\" \r\n mode=\"indeterminate\" \r\n color=\"primary\" \r\n class=\"spinner-button\">\r\n </mat-progress-spinner>\r\n </ng-template>\r\n\r\n </button>\r\n </mat-form-field>\r\n\r\n <mat-form-field class=\"form-25\" appearance=\"outline\">\r\n <mat-label>Endere\u00E7o</mat-label>\r\n <input type=\"text\" matInput [(ngModel)]=\"endereco.logradouro\" name=\"logradouro\" #logradouro=\"ngModel\" />\r\n </mat-form-field>\r\n\r\n <mat-form-field class=\"form-100\" appearance=\"outline\">\r\n <mat-label>Bairro</mat-label>\r\n <input type=\"text\" matInput [(ngModel)]=\"endereco.bairro\" name=\"bairro\" #bairro=\"ngModel\" />\r\n </mat-form-field>\r\n\r\n <mat-form-field class=\"form-100\" appearance=\"outline\">\r\n <mat-label>Complemento</mat-label>\r\n <input type=\"text\" matInput [(ngModel)]=\"endereco.complemento\" name=\"complemento\" #complemento=\"ngModel\" />\r\n </mat-form-field>\r\n\r\n <mat-form-field class=\"form-100\" appearance=\"outline\">\r\n <mat-label>UF</mat-label>\r\n <mat-select [(ngModel)]=\"endereco.uf\" name=\"uf\" #uf=\"ngModel\">\r\n <mat-option *ngFor=\"let uf of getListaEstados()\" [value]=\"uf\">\r\n {{ uf }}\r\n </mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n </div>\r\n </mat-dialog-content>\r\n\r\n <mat-dialog-actions align=\"end\">\r\n <button mat-stroked-button type=\"button\" color=\"warn\" (click)=\"close()\">Fechar</button>\r\n <button mat-flat-button type=\"submit\" color=\"primary\">Salvar</button>\r\n </mat-dialog-actions>\r\n</form>", styles: [".card-actions-buttons{display:flex;gap:5px;flex-wrap:wrap}.form-container{display:flex;flex-wrap:wrap;column-gap:10px;margin:10px}@media (max-width: 1000px){.form-container{flex-direction:column;gap:5px}}.break{flex-basis:100%;height:0}.form-5{flex:1 1 5%}.inline-table-container{display:flex;align-items:center;justify-content:space-between;padding:5px}@media (max-width: 600px){.form-5,.form-10,.form-15{flex:1 1 100%}}.form-10{flex:1 1 10%}.form-15{flex:1 1 15%}.form-20{flex:1 1 20%}.form-25{flex:1 1 25%}.form-30{flex:1 1 30%}.form-35{flex:1 1 35%}.form-40{flex:1 1 40%}.form-45{flex:1 1 45%}.form-50{flex:1 1 50%}.form-100{flex:1 1 100%;min-width:250px}.botoes-container{display:flex;gap:5px}@media (max-width: 600px){.botoes-container{margin-bottom:10px}.botoes-container button{flex:1;max-width:50%}}\n"] }]
|
|
1151
1501
|
}], ctorParameters: () => [{ type: i1$2.MatSnackBar }, { type: UnBPessoaService }, { type: UnbMensagemService }, { type: i4$2.MatDialogRef }, { type: undefined, decorators: [{
|
|
1152
1502
|
type: Inject,
|
|
1153
1503
|
args: [MAT_DIALOG_DATA]
|
|
@@ -1184,510 +1534,37 @@ const listaEstados = [
|
|
|
1184
1534
|
];
|
|
1185
1535
|
|
|
1186
1536
|
/**
|
|
1187
|
-
* Essa eh uma classe base, com propriedades comum
|
|
1537
|
+
* Essa eh uma classe base, com propriedades comum ao componente de pesquisa de pesssoa. Porque tem vários campos que são usados para configurar o comportamento do componente.
|
|
1188
1538
|
* */
|
|
1189
|
-
class
|
|
1190
|
-
|
|
1191
|
-
|
|
1192
|
-
|
|
1193
|
-
class UnbUtils {
|
|
1194
|
-
removeNull(key, value) {
|
|
1195
|
-
// Filtering out properties
|
|
1196
|
-
if (value === null) {
|
|
1197
|
-
return undefined;
|
|
1198
|
-
}
|
|
1199
|
-
return value;
|
|
1200
|
-
}
|
|
1201
|
-
// forma cpf
|
|
1202
|
-
static formataCpf(valor) {
|
|
1203
|
-
return valor.replace(/(\d{3})(\d{3})(\d{3})(\d{2})/g, "\$1.\$2.\$3\-\$4");
|
|
1204
|
-
}
|
|
1205
|
-
// forma cpf ou cnpj
|
|
1206
|
-
static formataCnpj(valor) {
|
|
1207
|
-
return valor.replace(/^(\d{2})(\d{3})(\d{3})(\d{4})(\d{2})$/, "$1.$2.$3/$4-$5");
|
|
1208
|
-
}
|
|
1209
|
-
static validarCPF(cpf) {
|
|
1210
|
-
if (!cpf)
|
|
1211
|
-
return false; // Se CPF for null, undefined ou vazio, retorna falso
|
|
1212
|
-
cpf = cpf.replace(/\D/g, ''); // Remove todos os caracteres não numéricos
|
|
1213
|
-
if (cpf == '')
|
|
1214
|
-
return false;
|
|
1215
|
-
if (cpf.length !== 11 || /^(\d)\1+$/.test(cpf)) {
|
|
1216
|
-
return false; // Verifica se tem 11 dígitos e não é uma sequência repetida (ex: 11111111111)
|
|
1217
|
-
}
|
|
1218
|
-
let soma = 0, resto;
|
|
1219
|
-
// Validação do primeiro dígito verificador
|
|
1220
|
-
for (let i = 0; i < 9; i++) {
|
|
1221
|
-
soma += Number(cpf[i]) * (10 - i);
|
|
1222
|
-
}
|
|
1223
|
-
resto = (soma * 10) % 11;
|
|
1224
|
-
if (resto === 10 || resto === 11)
|
|
1225
|
-
resto = 0;
|
|
1226
|
-
if (resto !== Number(cpf[9]))
|
|
1227
|
-
return false;
|
|
1228
|
-
soma = 0;
|
|
1229
|
-
// Validação do segundo dígito verificador
|
|
1230
|
-
for (let i = 0; i < 10; i++) {
|
|
1231
|
-
soma += Number(cpf[i]) * (11 - i);
|
|
1232
|
-
}
|
|
1233
|
-
resto = (soma * 10) % 11;
|
|
1234
|
-
if (resto === 10 || resto === 11)
|
|
1235
|
-
resto = 0;
|
|
1236
|
-
return resto === Number(cpf[10]);
|
|
1237
|
-
}
|
|
1238
|
-
static validarCNPJ(cnpj) {
|
|
1239
|
-
cnpj = cnpj.replace(/[^\d]+/g, ''); // Remove caracteres não numéricos
|
|
1240
|
-
if (cnpj.length !== 14 || /^(\d)\1+$/.test(cnpj)) {
|
|
1241
|
-
return false; // Verifica se tem 14 dígitos e não é uma sequência repetida
|
|
1242
|
-
}
|
|
1243
|
-
let tamanho = cnpj.length - 2;
|
|
1244
|
-
let numeros = cnpj.substring(0, tamanho);
|
|
1245
|
-
let digitos = cnpj.substring(tamanho);
|
|
1246
|
-
let soma = 0, pos = tamanho - 7;
|
|
1247
|
-
for (let i = tamanho; i >= 1; i--) {
|
|
1248
|
-
soma += parseInt(numeros.charAt(tamanho - i)) * pos--;
|
|
1249
|
-
if (pos < 2)
|
|
1250
|
-
pos = 9;
|
|
1251
|
-
}
|
|
1252
|
-
let resultado = soma % 11 < 2 ? 0 : 11 - (soma % 11);
|
|
1253
|
-
if (resultado !== parseInt(digitos.charAt(0)))
|
|
1254
|
-
return false;
|
|
1255
|
-
tamanho = tamanho + 1;
|
|
1256
|
-
numeros = cnpj.substring(0, tamanho);
|
|
1257
|
-
soma = 0;
|
|
1258
|
-
pos = tamanho - 7;
|
|
1259
|
-
for (let i = tamanho; i >= 1; i--) {
|
|
1260
|
-
soma += parseInt(numeros.charAt(tamanho - i)) * pos--;
|
|
1261
|
-
if (pos < 2)
|
|
1262
|
-
pos = 9;
|
|
1263
|
-
}
|
|
1264
|
-
resultado = soma % 11 < 2 ? 0 : 11 - (soma % 11);
|
|
1265
|
-
return resultado === parseInt(digitos.charAt(1));
|
|
1266
|
-
}
|
|
1267
|
-
}
|
|
1268
|
-
|
|
1269
|
-
class UnbPessoaPesquisarComponent {
|
|
1270
|
-
constructor(pessoaService, snackBar, alertService) {
|
|
1271
|
-
this.pessoaService = pessoaService;
|
|
1272
|
-
this.snackBar = snackBar;
|
|
1273
|
-
this.alertService = alertService;
|
|
1274
|
-
this.isLoading = false;
|
|
1275
|
-
// Configuração da API. Exemplo SGI.unb.br/pessoa-api
|
|
1539
|
+
class UnbPessoaPesquisaConfig {
|
|
1540
|
+
// Construtor opcional para facilitar a criação (atalho)
|
|
1541
|
+
constructor(init) {
|
|
1276
1542
|
this.backendURL = "";
|
|
1277
|
-
|
|
1543
|
+
this.token = ""; // usado para testar autenticação no backend se necessário.
|
|
1544
|
+
// Flags com valores padrão (já resolve o booleano)
|
|
1545
|
+
this.defaultTipoPessoa = UnbTipoPessoaEnum.FISICA;
|
|
1278
1546
|
this.pesquisarPorCPF = true;
|
|
1279
1547
|
this.pesquisarPorCNPJ = true;
|
|
1280
1548
|
this.pesquisarPorEstrangeiro = false;
|
|
1281
|
-
//
|
|
1282
|
-
this.defaultTipoPessoa = UnbTipoPessoaEnum.FISICA;
|
|
1283
|
-
this.campoPesquisaMaxWidth = '400px';
|
|
1549
|
+
// UI
|
|
1284
1550
|
this.mostrarPesquisa = true;
|
|
1285
1551
|
this.limparAposPesquisa = false;
|
|
1286
|
-
// Textos
|
|
1552
|
+
// Textos
|
|
1287
1553
|
this.label = "Digite o CPF/CNPJ ou Passaporte";
|
|
1288
1554
|
this.placeholder = "";
|
|
1289
1555
|
this.hint = "";
|
|
1290
|
-
|
|
1291
|
-
|
|
1292
|
-
|
|
1293
|
-
|
|
1294
|
-
|
|
1295
|
-
this.
|
|
1296
|
-
this.
|
|
1297
|
-
this.
|
|
1298
|
-
this.
|
|
1299
|
-
|
|
1300
|
-
ngOnInit() {
|
|
1301
|
-
// 1. Validação de Inicialização da API
|
|
1302
|
-
if (!this.backendURL) {
|
|
1303
|
-
this.handleErrorPrintConsole("[UnbPessoaPesquisarComponent] ERROR: backendURL está null.");
|
|
1304
|
-
return;
|
|
1305
|
-
}
|
|
1306
|
-
this.pessoaService.setBackendUrl(this.backendURL);
|
|
1307
|
-
// 2. Carregamento de Dados de Apoio
|
|
1308
|
-
forkJoin({
|
|
1309
|
-
tiposEnd: this.pessoaService.getTipoEndereco(),
|
|
1310
|
-
tiposTel: this.pessoaService.getTipoTelefone(),
|
|
1311
|
-
tiposEmail: this.pessoaService.getTipoEmail()
|
|
1312
|
-
}).subscribe({
|
|
1313
|
-
next: ({ tiposEnd, tiposTel, tiposEmail }) => {
|
|
1314
|
-
this.listaTipoEndereco = tiposEnd;
|
|
1315
|
-
this.listaTipoTelefone = tiposTel;
|
|
1316
|
-
this.listaTipoEmail = tiposEmail;
|
|
1317
|
-
},
|
|
1318
|
-
error: (err) => {
|
|
1319
|
-
this.handleError("Falha ao carregar dados de apoio. Recarregue a página.");
|
|
1320
|
-
console.error("Erro no forkJoin:", err);
|
|
1321
|
-
}
|
|
1322
|
-
});
|
|
1323
|
-
// 3. Definição da Lógica de Exibição e Tipo Padrão
|
|
1324
|
-
const opcoesAtivas = [this.pesquisarPorCPF, this.pesquisarPorCNPJ, this.pesquisarPorEstrangeiro].filter(v => v).length;
|
|
1325
|
-
// Só mostra o rádio se houver escolha real (mais de uma opção ativa)
|
|
1326
|
-
this.mostrarTipoPessoa = opcoesAtivas > 1;
|
|
1327
|
-
if (opcoesAtivas === 0) {
|
|
1328
|
-
this.handleErrorPrintConsole("[UnbPessoaPesquisarComponent] ERROR: Nenhuma opção de pesquisa (CPF/CNPJ/Estrangeiro) está ativa.");
|
|
1329
|
-
return;
|
|
1330
|
-
}
|
|
1331
|
-
// 4. Atribuição do Tipo Inicial (Ordem de prioridade: Valor padrão -> Opção Única -> CPF)
|
|
1332
|
-
this.definirTipoPessoaInicial();
|
|
1333
|
-
}
|
|
1334
|
-
/**
|
|
1335
|
-
* Define qual tipo de pessoa estará selecionado ao carregar o componente
|
|
1336
|
-
*/
|
|
1337
|
-
definirTipoPessoaInicial() {
|
|
1338
|
-
// Verifica se o padrão passado é permitido pelas flags de pesquisa
|
|
1339
|
-
const padraoEhValido = (this.defaultTipoPessoa === UnbTipoPessoaEnum.FISICA && this.pesquisarPorCPF) ||
|
|
1340
|
-
(this.defaultTipoPessoa === UnbTipoPessoaEnum.JURIDICA && this.pesquisarPorCNPJ) ||
|
|
1341
|
-
(this.defaultTipoPessoa === UnbTipoPessoaEnum.ESTRANGEIRA && this.pesquisarPorEstrangeiro);
|
|
1342
|
-
if (padraoEhValido) {
|
|
1343
|
-
// Como o valor da string é igual ao valor do Enum, a atribuição é direta
|
|
1344
|
-
this.pessoa.tipoPessoa = this.defaultTipoPessoa;
|
|
1345
|
-
}
|
|
1346
|
-
else {
|
|
1347
|
-
if (this.defaultTipoPessoa) {
|
|
1348
|
-
console.warn(`[UnbPessoaPesquisar] O valor defaultTipoPessoa='${this.defaultTipoPessoa}' é incompatível com as opções de pesquisa ativas. Selecionando a primeira disponível.`);
|
|
1349
|
-
}
|
|
1350
|
-
// Fallback para a primeira opção ativa
|
|
1351
|
-
if (this.pesquisarPorCPF) {
|
|
1352
|
-
this.pessoa.tipoPessoa = UnbTipoPessoaEnum.FISICA;
|
|
1353
|
-
}
|
|
1354
|
-
else if (this.pesquisarPorCNPJ) {
|
|
1355
|
-
this.pessoa.tipoPessoa = UnbTipoPessoaEnum.JURIDICA;
|
|
1356
|
-
}
|
|
1357
|
-
else if (this.pesquisarPorEstrangeiro) {
|
|
1358
|
-
this.pessoa.tipoPessoa = UnbTipoPessoaEnum.ESTRANGEIRA;
|
|
1359
|
-
}
|
|
1360
|
-
}
|
|
1361
|
-
}
|
|
1362
|
-
onTipoPessoaChange() {
|
|
1363
|
-
// Cria uma nova pessoa limpa com o tipo selecionado
|
|
1364
|
-
const novaPessoa = new UnbPessoaModel();
|
|
1365
|
-
novaPessoa.tipoPessoa = this.pessoa.tipoPessoa;
|
|
1366
|
-
// Inicializa arrays vazios
|
|
1367
|
-
novaPessoa.telefones = [];
|
|
1368
|
-
novaPessoa.enderecos = [];
|
|
1369
|
-
novaPessoa.emails = [];
|
|
1370
|
-
// Substitui a pessoa atual
|
|
1371
|
-
this.pessoa = novaPessoa;
|
|
1372
|
-
// Emite a nova pessoa limpa para o componente pai (form)
|
|
1373
|
-
this.pessoaEmitted.emit(this.pessoa);
|
|
1374
|
-
}
|
|
1375
|
-
pesquisar() {
|
|
1376
|
-
if (this.validar() == false)
|
|
1377
|
-
return;
|
|
1378
|
-
this.isLoading = true;
|
|
1379
|
-
this.isLoadingChange.emit(true);
|
|
1380
|
-
let result;
|
|
1381
|
-
if (this.pessoa.tipoPessoa == UnbTipoPessoaEnum.FISICA) {
|
|
1382
|
-
let cpf = this.pessoa.cpf.match(/\d/g)?.join(""); // remove caracteres
|
|
1383
|
-
result = this.pessoaService.findByCpf(cpf);
|
|
1384
|
-
}
|
|
1385
|
-
else if (this.pessoa.tipoPessoa == UnbTipoPessoaEnum.JURIDICA) {
|
|
1386
|
-
let cnpj = this.pessoa.cnpj.match(/\d/g)?.join(""); // remove caracteres
|
|
1387
|
-
result = this.pessoaService.findByCnpj(cnpj);
|
|
1388
|
-
}
|
|
1389
|
-
else if (this.pessoa.tipoPessoa == UnbTipoPessoaEnum.ESTRANGEIRA) {
|
|
1390
|
-
result = this.pessoaService.findByPassaporte(this.pessoa.passaporte);
|
|
1391
|
-
}
|
|
1392
|
-
if (result) {
|
|
1393
|
-
result.subscribe({
|
|
1394
|
-
next: this.hadleResult.bind(this),
|
|
1395
|
-
error: this.handleError.bind(this)
|
|
1396
|
-
});
|
|
1397
|
-
}
|
|
1556
|
+
Object.assign(this, init);
|
|
1557
|
+
}
|
|
1558
|
+
}
|
|
1559
|
+
class UnbPessoaFormConfig {
|
|
1560
|
+
constructor(init) {
|
|
1561
|
+
this.backendURL = "";
|
|
1562
|
+
this.token = "";
|
|
1563
|
+
this.isReadyOnly = false;
|
|
1564
|
+
this.pessoa = new UnbPessoaModel();
|
|
1565
|
+
Object.assign(this, init);
|
|
1398
1566
|
}
|
|
1399
|
-
validar() {
|
|
1400
|
-
if (this.backendURL == "") {
|
|
1401
|
-
this.handleErrorPrintConsole("[UnbPessoaPesquisarComponent] ERROR: backendURL.url está null. Insira o parâmetro (backendURL) com o valor da URL do seu Backend!");
|
|
1402
|
-
return false;
|
|
1403
|
-
}
|
|
1404
|
-
if (this.pessoa.tipoPessoa == UnbTipoPessoaEnum.FISICA) {
|
|
1405
|
-
if (this.pessoa.cpf == null || (this.pessoa.cpf != null && this.pessoa.cpf == "")) {
|
|
1406
|
-
this.handleError("CPF é um campo obrigatório.");
|
|
1407
|
-
return false;
|
|
1408
|
-
}
|
|
1409
|
-
else if (!UnbUtils.validarCPF(this.pessoa.cpf)) {
|
|
1410
|
-
this.handleError("Digite um valor válido para o CPF");
|
|
1411
|
-
return false;
|
|
1412
|
-
}
|
|
1413
|
-
}
|
|
1414
|
-
else if (this.pessoa.tipoPessoa == UnbTipoPessoaEnum.JURIDICA) {
|
|
1415
|
-
if (this.pessoa.cnpj == null || (this.pessoa.cnpj != null && this.pessoa.cnpj == "")) {
|
|
1416
|
-
this.handleError("CNPJ é um campo obrigatório");
|
|
1417
|
-
return false;
|
|
1418
|
-
}
|
|
1419
|
-
else if (!UnbUtils.validarCNPJ(this.pessoa.cnpj)) {
|
|
1420
|
-
this.handleError("Digite um valor válido para o CNPJ!");
|
|
1421
|
-
return false;
|
|
1422
|
-
}
|
|
1423
|
-
}
|
|
1424
|
-
else if (this.pessoa.tipoPessoa == UnbTipoPessoaEnum.ESTRANGEIRA) {
|
|
1425
|
-
if (this.pessoa.passaporte == null || (this.pessoa.passaporte != null && this.pessoa.passaporte == "")) {
|
|
1426
|
-
this.handleError("Passaporte é um campo obrigatório");
|
|
1427
|
-
return false;
|
|
1428
|
-
}
|
|
1429
|
-
}
|
|
1430
|
-
else {
|
|
1431
|
-
this.handleError("Selecione um tipo de pessoa!");
|
|
1432
|
-
return false;
|
|
1433
|
-
}
|
|
1434
|
-
return true;
|
|
1435
|
-
}
|
|
1436
|
-
// Em unb-pessoa-pesquisar.component.ts
|
|
1437
|
-
hadleResult(resultado) {
|
|
1438
|
-
this.isLoading = false;
|
|
1439
|
-
this.isLoadingChange.emit(false);
|
|
1440
|
-
if (resultado) {
|
|
1441
|
-
resultado.tipoPessoa = this.pessoa.tipoPessoa; // o backend nao retorna o tipo pessoa. entao tenho que atribuir antes
|
|
1442
|
-
this.pessoa = resultado;
|
|
1443
|
-
this.pessoa.enderecos = this.pessoa.enderecos || [];
|
|
1444
|
-
this.pessoa.telefones = this.pessoa.telefones || [];
|
|
1445
|
-
this.pessoa.emails = this.pessoa.emails || [];
|
|
1446
|
-
// --- SEÇÃO DE LIMPEZA DE DADOS PRINCIPAIS (VOCÊ JÁ TINHA) ---
|
|
1447
|
-
if (this.pessoa.sexo) {
|
|
1448
|
-
if (this.pessoa.sexo.toUpperCase().trim() === 'FEMININO') {
|
|
1449
|
-
this.pessoa.codigoSexo = 2;
|
|
1450
|
-
}
|
|
1451
|
-
else if (this.pessoa.sexo.toUpperCase().trim() === 'MASCULINO') {
|
|
1452
|
-
this.pessoa.codigoSexo = 1;
|
|
1453
|
-
}
|
|
1454
|
-
}
|
|
1455
|
-
if (this.pessoa.dataNascimento) {
|
|
1456
|
-
this.pessoa.dataNascimento = this.parseData(this.pessoa.dataNascimento);
|
|
1457
|
-
}
|
|
1458
|
-
if (this.pessoa.estadoCivil) {
|
|
1459
|
-
this.pessoa.codigoEstadoCivil = this.parseCodigo(this.pessoa.estadoCivil);
|
|
1460
|
-
}
|
|
1461
|
-
if (this.pessoa.paisNascimento) {
|
|
1462
|
-
this.pessoa.codigoPaisNascimento = this.parseCodigo(this.pessoa.paisNascimento);
|
|
1463
|
-
}
|
|
1464
|
-
if (this.pessoa.escolaridade) {
|
|
1465
|
-
this.pessoa.escolaridade = this.parseCodigo(this.pessoa.escolaridade);
|
|
1466
|
-
}
|
|
1467
|
-
// 1. Processa Endereços
|
|
1468
|
-
// O payload 'salvar' espera: ordemEndereco, tipoEnderecoCodigo, paisEnderecoCodigo, ufEndereco
|
|
1469
|
-
// 1. Processa Endereços
|
|
1470
|
-
if (this.pessoa.enderecos && this.listaTipoEndereco.length > 0) {
|
|
1471
|
-
// --- CORREÇÃO: Adicionado 'i' ao forEach ---
|
|
1472
|
-
this.pessoa.enderecos.forEach((end, i) => {
|
|
1473
|
-
// Traduz o 'tipo' (string) para 'tipoEnderecoCodigo' (number)
|
|
1474
|
-
if (!end.tipoEnderecoCodigo && end.tipo) {
|
|
1475
|
-
const tipoEncontrado = this.listaTipoEndereco.find(t => t.denominacao?.toLowerCase() === end.tipo?.toLowerCase());
|
|
1476
|
-
if (tipoEncontrado)
|
|
1477
|
-
end.tipoEnderecoCodigo = tipoEncontrado.codigo;
|
|
1478
|
-
}
|
|
1479
|
-
// Traduz 'pais' (string '22 - BRASIL') para 'paisEnderecoCodigo' (number)
|
|
1480
|
-
if (!end.paisEnderecoCodigo && end.pais) {
|
|
1481
|
-
end.paisEnderecoCodigo = this.parseCodigo(end.pais);
|
|
1482
|
-
}
|
|
1483
|
-
// Mapeia 'ordem' -> 'ordemEndereco' ou usa o índice (i + 1)
|
|
1484
|
-
// O payload de salvar (no form) espera 'ordemEndereco'
|
|
1485
|
-
end.ordemEndereco = end.ordemEndereco || end.ordem || (i + 1);
|
|
1486
|
-
// Mapeia 'uf' -> 'ufEndereco'
|
|
1487
|
-
if (!end.ufEndereco && end.uf) {
|
|
1488
|
-
end.ufEndereco = end.uf;
|
|
1489
|
-
}
|
|
1490
|
-
});
|
|
1491
|
-
}
|
|
1492
|
-
// 2. Processa Telefones
|
|
1493
|
-
if (this.pessoa.telefones && this.listaTipoTelefone.length > 0) {
|
|
1494
|
-
// --- CORREÇÃO: Adicionado 'i' ao forEach ---
|
|
1495
|
-
this.pessoa.telefones.forEach((tel, i) => {
|
|
1496
|
-
if (!tel.tipoTelefoneCodigo && tel.tipo) {
|
|
1497
|
-
const tipoEncontrado = this.listaTipoTelefone.find(t => t.denominacao?.toLowerCase() === tel.tipo?.toLowerCase());
|
|
1498
|
-
if (tipoEncontrado)
|
|
1499
|
-
tel.tipoTelefoneCodigo = tipoEncontrado.codigo;
|
|
1500
|
-
}
|
|
1501
|
-
// --- CORREÇÃO: Lógica da Ordem ---
|
|
1502
|
-
// O payload de salvar (no form) lê 'tel.ordem'
|
|
1503
|
-
tel.ordem = tel.ordem || (i + 1);
|
|
1504
|
-
});
|
|
1505
|
-
}
|
|
1506
|
-
// 3. Processa Emails
|
|
1507
|
-
if (this.pessoa.emails && this.listaTipoEmail.length > 0) {
|
|
1508
|
-
// --- CORREÇÃO: Adicionado 'i' ao forEach ---
|
|
1509
|
-
this.pessoa.emails.forEach((email, i) => {
|
|
1510
|
-
if (!email.tipoEmailCodigo && email.tipo) {
|
|
1511
|
-
const tipoEncontrado = this.listaTipoEmail.find(t => t.denominacao?.toLowerCase() === email.tipo?.toLowerCase());
|
|
1512
|
-
if (tipoEncontrado)
|
|
1513
|
-
email.tipoEmailCodigo = tipoEncontrado.codigo;
|
|
1514
|
-
}
|
|
1515
|
-
// --- CORREÇÃO: Lógica da Ordem ---
|
|
1516
|
-
// O payload de salvar (no form) lê 'email.ordem'
|
|
1517
|
-
email.ordem = email.ordem || (i + 1);
|
|
1518
|
-
});
|
|
1519
|
-
}
|
|
1520
|
-
if (this.pessoa.tipoPessoa == UnbTipoPessoaEnum.FISICA) {
|
|
1521
|
-
this.pessoa.cpf = UnbUtils.formataCpf(resultado.cpf);
|
|
1522
|
-
}
|
|
1523
|
-
else if (this.pessoa.tipoPessoa == UnbTipoPessoaEnum.JURIDICA) {
|
|
1524
|
-
this.pessoa.cnpj = UnbUtils.formataCnpj(resultado.cnpj);
|
|
1525
|
-
}
|
|
1526
|
-
else if (this.pessoa.tipoPessoa == UnbTipoPessoaEnum.ESTRANGEIRA) {
|
|
1527
|
-
}
|
|
1528
|
-
}
|
|
1529
|
-
else {
|
|
1530
|
-
// se chegar aki eh pq nao encontrou... (lógica que já existe)
|
|
1531
|
-
let novaPessoa = new UnbPessoaModel();
|
|
1532
|
-
novaPessoa.tipoPessoa = this.pessoa.tipoPessoa;
|
|
1533
|
-
if (this.pessoa.tipoPessoa == UnbTipoPessoaEnum.FISICA) {
|
|
1534
|
-
novaPessoa.cpf = this.pessoa.cpf;
|
|
1535
|
-
}
|
|
1536
|
-
else if (this.pessoa.tipoPessoa == UnbTipoPessoaEnum.JURIDICA) {
|
|
1537
|
-
novaPessoa.cnpj = this.pessoa.cnpj;
|
|
1538
|
-
}
|
|
1539
|
-
else {
|
|
1540
|
-
novaPessoa.passaporte = this.pessoa.passaporte;
|
|
1541
|
-
}
|
|
1542
|
-
this.pessoa = novaPessoa;
|
|
1543
|
-
}
|
|
1544
|
-
this.pessoaEmitted.emit(this.pessoa);
|
|
1545
|
-
}
|
|
1546
|
-
parseCodigo(valorString) {
|
|
1547
|
-
if (typeof valorString === 'number') {
|
|
1548
|
-
return valorString; // Já é um número
|
|
1549
|
-
}
|
|
1550
|
-
if (typeof valorString !== 'string' || !valorString.includes(' - ')) {
|
|
1551
|
-
// Tenta converter direto, caso o backend mande só o número como string
|
|
1552
|
-
const num = parseInt(valorString, 10);
|
|
1553
|
-
return isNaN(num) ? null : num;
|
|
1554
|
-
}
|
|
1555
|
-
const partes = valorString.split(' - ');
|
|
1556
|
-
const codigo = parseInt(partes[0].trim(), 10);
|
|
1557
|
-
return isNaN(codigo) ? null : codigo;
|
|
1558
|
-
}
|
|
1559
|
-
/**
|
|
1560
|
-
* Converte uma string no formato 'dd/MM/yyyy' para um objeto Date.
|
|
1561
|
-
* Retorna null se o formato for inválido.
|
|
1562
|
-
*/
|
|
1563
|
-
parseData(dataString) {
|
|
1564
|
-
if (dataString instanceof Date) {
|
|
1565
|
-
return dataString; // Já é um objeto Date
|
|
1566
|
-
}
|
|
1567
|
-
if (typeof dataString !== 'string' || !dataString.includes('/')) {
|
|
1568
|
-
return null;
|
|
1569
|
-
}
|
|
1570
|
-
const partes = dataString.split('/'); // [dd, MM, yyyy]
|
|
1571
|
-
if (partes.length === 3) {
|
|
1572
|
-
const dia = parseInt(partes[0], 10);
|
|
1573
|
-
const mes = parseInt(partes[1], 10) - 1; // Mês no JS é 0-indexado
|
|
1574
|
-
const ano = parseInt(partes[2], 10);
|
|
1575
|
-
// Verifica se a data é válida
|
|
1576
|
-
const dataObj = new Date(ano, mes, dia);
|
|
1577
|
-
if (dataObj.getFullYear() === ano && dataObj.getMonth() === mes && dataObj.getDate() === dia) {
|
|
1578
|
-
return dataObj;
|
|
1579
|
-
}
|
|
1580
|
-
}
|
|
1581
|
-
return null; // Formato inválido
|
|
1582
|
-
}
|
|
1583
|
-
handleError(erro) {
|
|
1584
|
-
this.isLoading = false;
|
|
1585
|
-
this.isLoadingChange.emit(false);
|
|
1586
|
-
this.pessoaEncontrado = false;
|
|
1587
|
-
let erroTratado;
|
|
1588
|
-
// --- ADAPTER: Converte string para o Objeto Padrão ---
|
|
1589
|
-
if (typeof erro === 'string') {
|
|
1590
|
-
erroTratado = {
|
|
1591
|
-
status: 400, // Erro de validação local geralmente é 400
|
|
1592
|
-
mensagemSimples: erro,
|
|
1593
|
-
mensagemHtml: `<strong>${erro}</strong>`
|
|
1594
|
-
};
|
|
1595
|
-
}
|
|
1596
|
-
else {
|
|
1597
|
-
// Se já veio do Service (ou é um objeto manual), usa direto
|
|
1598
|
-
erroTratado = erro;
|
|
1599
|
-
}
|
|
1600
|
-
// --- LÓGICA DE EXIBIÇÃO ---
|
|
1601
|
-
// 1. SnackBar (Mensagem curta)
|
|
1602
|
-
if (erroTratado.mensagemSimples) {
|
|
1603
|
-
this.openSnackBar(erroTratado.mensagemSimples);
|
|
1604
|
-
}
|
|
1605
|
-
// 2. Componente de Mensagem (Mensagem HTML)
|
|
1606
|
-
if (this.alertService && erroTratado.mensagemHtml) {
|
|
1607
|
-
// Se você tiver a variável idMensagemService definida na classe:
|
|
1608
|
-
this.alertService.showMessage(erroTratado.mensagemHtml, UnbTipoMensagemEnum.DANGER, this.idMensagemService);
|
|
1609
|
-
}
|
|
1610
|
-
}
|
|
1611
|
-
handleErrorPrintConsole(erro) {
|
|
1612
|
-
console.log(erro);
|
|
1613
|
-
this.handleError(erro);
|
|
1614
|
-
}
|
|
1615
|
-
openSnackBar(message) {
|
|
1616
|
-
this.snackBar.open(message, 'x', {
|
|
1617
|
-
duration: 5000,
|
|
1618
|
-
});
|
|
1619
|
-
}
|
|
1620
|
-
tipoPessoaEnum() {
|
|
1621
|
-
return UnbTipoPessoaEnum;
|
|
1622
|
-
}
|
|
1623
|
-
/**
|
|
1624
|
-
* Formata o CPF enquanto o usuário digita
|
|
1625
|
-
*/
|
|
1626
|
-
formatarCpf(event) {
|
|
1627
|
-
let valor = event.target.value.replace(/\D/g, ''); // Remove tudo que não é dígito
|
|
1628
|
-
if (valor.length <= 11) {
|
|
1629
|
-
// Aplica máscara: 000.000.000-00
|
|
1630
|
-
valor = valor.replace(/(\d{3})(\d)/, '$1.$2');
|
|
1631
|
-
valor = valor.replace(/(\d{3})(\d)/, '$1.$2');
|
|
1632
|
-
valor = valor.replace(/(\d{3})(\d{1,2})$/, '$1-$2');
|
|
1633
|
-
this.pessoa.cpf = valor;
|
|
1634
|
-
}
|
|
1635
|
-
}
|
|
1636
|
-
/**
|
|
1637
|
-
* Formata o CNPJ enquanto o usuário digita
|
|
1638
|
-
*/
|
|
1639
|
-
formatarCnpj(event) {
|
|
1640
|
-
let valor = event.target.value.replace(/\D/g, ''); // Remove tudo que não é dígito
|
|
1641
|
-
if (valor.length <= 14) {
|
|
1642
|
-
// Aplica máscara: 00.000.000/0000-00
|
|
1643
|
-
valor = valor.replace(/(\d{2})(\d)/, '$1.$2');
|
|
1644
|
-
valor = valor.replace(/(\d{3})(\d)/, '$1.$2');
|
|
1645
|
-
valor = valor.replace(/(\d{3})(\d)/, '$1/$2');
|
|
1646
|
-
valor = valor.replace(/(\d{4})(\d{1,2})$/, '$1-$2');
|
|
1647
|
-
this.pessoa.cnpj = valor;
|
|
1648
|
-
}
|
|
1649
|
-
}
|
|
1650
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: UnbPessoaPesquisarComponent, deps: [{ token: UnBPessoaService }, { token: i1$2.MatSnackBar }, { token: UnbMensagemService }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
1651
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "16.1.0", version: "18.2.14", type: UnbPessoaPesquisarComponent, selector: "lib-unb-pessoa-pesquisar", inputs: { backendURL: "backendURL", pesquisarPorCPF: ["pesquisarPorCPF", "pesquisarPorCPF", booleanAttribute], pesquisarPorCNPJ: ["pesquisarPorCNPJ", "pesquisarPorCNPJ", booleanAttribute], pesquisarPorEstrangeiro: ["pesquisarPorEstrangeiro", "pesquisarPorEstrangeiro", booleanAttribute], defaultTipoPessoa: "defaultTipoPessoa", campoPesquisaMaxWidth: "campoPesquisaMaxWidth", mostrarPesquisa: ["mostrarPesquisa", "mostrarPesquisa", booleanAttribute], limparAposPesquisa: ["limparAposPesquisa", "limparAposPesquisa", booleanAttribute], label: "label", placeholder: "placeholder", hint: "hint", pessoa: "pessoa" }, outputs: { pessoaEmitted: "pessoaEmitted", isLoadingChange: "isLoadingChange" }, ngImport: i0, template: "<form #pessoaForm=\"ngForm\" class=\"pesquisa-container\" [ngStyle]=\"{'--tamanho-maximo': campoPesquisaMaxWidth}\"\r\n (ngSubmit)=\"pesquisar()\">\r\n <div class=\"mensagem-container\" style=\"width: 100%;\">\r\n <unb-mensagem [identificador]=\"idMensagemService\" class=\"mensagem-form\"></unb-mensagem>\r\n </div>\r\n\r\n <div class=\"form-wrapper\">\r\n <div *ngIf=\"mostrarTipoPessoa\" class=\"radio-container\">\r\n <mat-radio-group aria-label=\"Tipo de Pessoa\" [(ngModel)]=\"pessoa.tipoPessoa\" #tipoPessoa=\"ngModel\"\r\n name=\"tipoPessoa\" (change)=\"onTipoPessoaChange()\">\r\n <mat-radio-button *ngIf=\"pesquisarPorCPF\" value=\"{{ tipoPessoaEnum().FISICA}}\">Pessoa F\u00EDsica</mat-radio-button>\r\n <mat-radio-button *ngIf=\"pesquisarPorCNPJ\" value=\"{{tipoPessoaEnum().JURIDICA}}\"> Pessoa\r\n Jur\u00EDdica</mat-radio-button>\r\n <mat-radio-button *ngIf=\"pesquisarPorEstrangeiro\"\r\n value=\"{{tipoPessoaEnum().ESTRANGEIRA}}\">Estrangeiro</mat-radio-button>\r\n </mat-radio-group>\r\n </div>\r\n\r\n <div class=\"break\"></div>\r\n\r\n <ng-container *ngIf=\"pessoa.tipoPessoa === tipoPessoaEnum().FISICA\">\r\n <mat-form-field appearance=\"outline\">\r\n <mat-label>CPF</mat-label>\r\n <input type=\"text\" matInput [(ngModel)]=\"pessoa.cpf\" name=\"cpf\" #cpf=\"ngModel\" required={{true}}\r\n (input)=\"formatarCpf($event)\" maxlength=\"14\" placeholder=\"000.000.000-00\" />\r\n <button matSuffix mat-icon-button type=\"button\" aria-label=\"Pesquisar\" [disabled]=\"isLoading\"\r\n (click)=\"pesquisar()\">\r\n <ng-container *ngIf=\"!isLoading; else loadingIcon\">\r\n <mat-icon>search</mat-icon>\r\n </ng-container>\r\n <ng-template #loadingIcon>\r\n <mat-progress-spinner [diameter]=\"20\" mode=\"indeterminate\" color=\"primary\" class=\"spinner-button\">\r\n </mat-progress-spinner>\r\n </ng-template>\r\n </button>\r\n </mat-form-field>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"pessoa.tipoPessoa === tipoPessoaEnum().ESTRANGEIRA\">\r\n <mat-form-field appearance=\"outline\">\r\n <mat-label>Passaporte</mat-label>\r\n <input type=\"text\" matInput [(ngModel)]=\"pessoa.passaporte\" name=\"passaporte\" required=\"true\" />\r\n <button matSuffix mat-icon-button type=\"button\" aria-label=\"Pesquisar\" (click)=\"pesquisar()\">\r\n <ng-container *ngIf=\"!isLoading; else loadingIcon\">\r\n <mat-icon>search</mat-icon>\r\n </ng-container>\r\n <ng-template #loadingIcon>\r\n <mat-progress-spinner [diameter]=\"20\" mode=\"indeterminate\" color=\"primary\" class=\"spinner-button\">\r\n </mat-progress-spinner>\r\n </ng-template>\r\n </button>\r\n </mat-form-field>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"pessoa.tipoPessoa === tipoPessoaEnum().JURIDICA\">\r\n <mat-form-field appearance=\"outline\">\r\n <mat-label>CNPJ</mat-label>\r\n <input type=\"text\" matInput [(ngModel)]=\"pessoa.cnpj\" name=\"cnpj\" required=\"true\"\r\n (input)=\"formatarCnpj($event)\" maxlength=\"18\" placeholder=\"00.000.000/0000-00\" />\r\n <button matSuffix mat-icon-button type=\"button\" aria-label=\"Pesquisar\" (click)=\"pesquisar()\">\r\n <ng-container *ngIf=\"!isLoading; else loadingIcon\">\r\n <mat-icon>search</mat-icon>\r\n </ng-container>\r\n <ng-template #loadingIcon>\r\n <mat-progress-spinner [diameter]=\"20\" mode=\"indeterminate\" color=\"primary\" class=\"spinner-button\">\r\n </mat-progress-spinner>\r\n </ng-template>\r\n </button>\r\n </mat-form-field>\r\n </ng-container>\r\n </div>\r\n</form>", styles: [".pesquisa-container{display:flex;flex-direction:column;align-items:flex-start}.form-wrapper{display:flex;flex-direction:column;width:100%;max-width:var(--tamanho-maximo);gap:5px}.mensagem-form{display:block;width:100%}\n"], dependencies: [{ kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i4.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: i6.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i6.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i6.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i6.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i6.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i6.MaxLengthValidator, selector: "[maxlength][formControlName],[maxlength][formControl],[maxlength][ngModel]", inputs: ["maxlength"] }, { kind: "directive", type: i6.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i6.NgForm, selector: "form:not([ngNoForm]):not([formGroup]),ng-form,[ngForm]", inputs: ["ngFormOptions"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "component", type: i5.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i7.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "component", type: UnbMensagemComponent, selector: "unb-mensagem", inputs: ["mensagem", "tipo", "identificador"] }, { kind: "component", type: i9.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i9.MatLabel, selector: "mat-label" }, { kind: "directive", type: i9.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "directive", type: i10.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "component", type: i14.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "mode", "value", "diameter", "strokeWidth"], exportAs: ["matProgressSpinner"] }, { kind: "directive", type: i12$1.MatRadioGroup, selector: "mat-radio-group", inputs: ["color", "name", "labelPosition", "value", "selected", "disabled", "required", "disabledInteractive"], outputs: ["change"], exportAs: ["matRadioGroup"] }, { kind: "component", type: i12$1.MatRadioButton, selector: "mat-radio-button", inputs: ["id", "name", "aria-label", "aria-labelledby", "aria-describedby", "disableRipple", "tabIndex", "checked", "value", "labelPosition", "disabled", "required", "color", "disabledInteractive"], outputs: ["change"], exportAs: ["matRadioButton"] }] }); }
|
|
1652
1567
|
}
|
|
1653
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: UnbPessoaPesquisarComponent, decorators: [{
|
|
1654
|
-
type: Component,
|
|
1655
|
-
args: [{ selector: 'lib-unb-pessoa-pesquisar', standalone: false, template: "<form #pessoaForm=\"ngForm\" class=\"pesquisa-container\" [ngStyle]=\"{'--tamanho-maximo': campoPesquisaMaxWidth}\"\r\n (ngSubmit)=\"pesquisar()\">\r\n <div class=\"mensagem-container\" style=\"width: 100%;\">\r\n <unb-mensagem [identificador]=\"idMensagemService\" class=\"mensagem-form\"></unb-mensagem>\r\n </div>\r\n\r\n <div class=\"form-wrapper\">\r\n <div *ngIf=\"mostrarTipoPessoa\" class=\"radio-container\">\r\n <mat-radio-group aria-label=\"Tipo de Pessoa\" [(ngModel)]=\"pessoa.tipoPessoa\" #tipoPessoa=\"ngModel\"\r\n name=\"tipoPessoa\" (change)=\"onTipoPessoaChange()\">\r\n <mat-radio-button *ngIf=\"pesquisarPorCPF\" value=\"{{ tipoPessoaEnum().FISICA}}\">Pessoa F\u00EDsica</mat-radio-button>\r\n <mat-radio-button *ngIf=\"pesquisarPorCNPJ\" value=\"{{tipoPessoaEnum().JURIDICA}}\"> Pessoa\r\n Jur\u00EDdica</mat-radio-button>\r\n <mat-radio-button *ngIf=\"pesquisarPorEstrangeiro\"\r\n value=\"{{tipoPessoaEnum().ESTRANGEIRA}}\">Estrangeiro</mat-radio-button>\r\n </mat-radio-group>\r\n </div>\r\n\r\n <div class=\"break\"></div>\r\n\r\n <ng-container *ngIf=\"pessoa.tipoPessoa === tipoPessoaEnum().FISICA\">\r\n <mat-form-field appearance=\"outline\">\r\n <mat-label>CPF</mat-label>\r\n <input type=\"text\" matInput [(ngModel)]=\"pessoa.cpf\" name=\"cpf\" #cpf=\"ngModel\" required={{true}}\r\n (input)=\"formatarCpf($event)\" maxlength=\"14\" placeholder=\"000.000.000-00\" />\r\n <button matSuffix mat-icon-button type=\"button\" aria-label=\"Pesquisar\" [disabled]=\"isLoading\"\r\n (click)=\"pesquisar()\">\r\n <ng-container *ngIf=\"!isLoading; else loadingIcon\">\r\n <mat-icon>search</mat-icon>\r\n </ng-container>\r\n <ng-template #loadingIcon>\r\n <mat-progress-spinner [diameter]=\"20\" mode=\"indeterminate\" color=\"primary\" class=\"spinner-button\">\r\n </mat-progress-spinner>\r\n </ng-template>\r\n </button>\r\n </mat-form-field>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"pessoa.tipoPessoa === tipoPessoaEnum().ESTRANGEIRA\">\r\n <mat-form-field appearance=\"outline\">\r\n <mat-label>Passaporte</mat-label>\r\n <input type=\"text\" matInput [(ngModel)]=\"pessoa.passaporte\" name=\"passaporte\" required=\"true\" />\r\n <button matSuffix mat-icon-button type=\"button\" aria-label=\"Pesquisar\" (click)=\"pesquisar()\">\r\n <ng-container *ngIf=\"!isLoading; else loadingIcon\">\r\n <mat-icon>search</mat-icon>\r\n </ng-container>\r\n <ng-template #loadingIcon>\r\n <mat-progress-spinner [diameter]=\"20\" mode=\"indeterminate\" color=\"primary\" class=\"spinner-button\">\r\n </mat-progress-spinner>\r\n </ng-template>\r\n </button>\r\n </mat-form-field>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"pessoa.tipoPessoa === tipoPessoaEnum().JURIDICA\">\r\n <mat-form-field appearance=\"outline\">\r\n <mat-label>CNPJ</mat-label>\r\n <input type=\"text\" matInput [(ngModel)]=\"pessoa.cnpj\" name=\"cnpj\" required=\"true\"\r\n (input)=\"formatarCnpj($event)\" maxlength=\"18\" placeholder=\"00.000.000/0000-00\" />\r\n <button matSuffix mat-icon-button type=\"button\" aria-label=\"Pesquisar\" (click)=\"pesquisar()\">\r\n <ng-container *ngIf=\"!isLoading; else loadingIcon\">\r\n <mat-icon>search</mat-icon>\r\n </ng-container>\r\n <ng-template #loadingIcon>\r\n <mat-progress-spinner [diameter]=\"20\" mode=\"indeterminate\" color=\"primary\" class=\"spinner-button\">\r\n </mat-progress-spinner>\r\n </ng-template>\r\n </button>\r\n </mat-form-field>\r\n </ng-container>\r\n </div>\r\n</form>", styles: [".pesquisa-container{display:flex;flex-direction:column;align-items:flex-start}.form-wrapper{display:flex;flex-direction:column;width:100%;max-width:var(--tamanho-maximo);gap:5px}.mensagem-form{display:block;width:100%}\n"] }]
|
|
1656
|
-
}], ctorParameters: () => [{ type: UnBPessoaService }, { type: i1$2.MatSnackBar }, { type: UnbMensagemService }], propDecorators: { backendURL: [{
|
|
1657
|
-
type: Input,
|
|
1658
|
-
args: [{ required: true }]
|
|
1659
|
-
}], pesquisarPorCPF: [{
|
|
1660
|
-
type: Input,
|
|
1661
|
-
args: [{ transform: booleanAttribute }]
|
|
1662
|
-
}], pesquisarPorCNPJ: [{
|
|
1663
|
-
type: Input,
|
|
1664
|
-
args: [{ transform: booleanAttribute }]
|
|
1665
|
-
}], pesquisarPorEstrangeiro: [{
|
|
1666
|
-
type: Input,
|
|
1667
|
-
args: [{ transform: booleanAttribute }]
|
|
1668
|
-
}], defaultTipoPessoa: [{
|
|
1669
|
-
type: Input
|
|
1670
|
-
}], campoPesquisaMaxWidth: [{
|
|
1671
|
-
type: Input
|
|
1672
|
-
}], mostrarPesquisa: [{
|
|
1673
|
-
type: Input,
|
|
1674
|
-
args: [{ transform: booleanAttribute }]
|
|
1675
|
-
}], limparAposPesquisa: [{
|
|
1676
|
-
type: Input,
|
|
1677
|
-
args: [{ transform: booleanAttribute }]
|
|
1678
|
-
}], label: [{
|
|
1679
|
-
type: Input
|
|
1680
|
-
}], placeholder: [{
|
|
1681
|
-
type: Input
|
|
1682
|
-
}], hint: [{
|
|
1683
|
-
type: Input
|
|
1684
|
-
}], pessoa: [{
|
|
1685
|
-
type: Input
|
|
1686
|
-
}], pessoaEmitted: [{
|
|
1687
|
-
type: Output
|
|
1688
|
-
}], isLoadingChange: [{
|
|
1689
|
-
type: Output
|
|
1690
|
-
}] } });
|
|
1691
1568
|
|
|
1692
1569
|
class UnbPessoaTelefone {
|
|
1693
1570
|
constructor() {
|
|
@@ -1854,10 +1731,10 @@ class UnbPessoaTelefoneFormComponent {
|
|
|
1854
1731
|
duration: 5000,
|
|
1855
1732
|
});
|
|
1856
1733
|
}
|
|
1857
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2
|
|
1858
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2
|
|
1734
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.1.2", ngImport: i0, type: UnbPessoaTelefoneFormComponent, deps: [{ token: i1$2.MatSnackBar }, { token: UnBPessoaService }, { token: UnbMensagemService }, { token: i4$2.MatDialogRef }, { token: MAT_DIALOG_DATA }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
1735
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.1.2", type: UnbPessoaTelefoneFormComponent, selector: "lib-unb-pessoa-telefone-form", ngImport: i0, template: "<h1 mat-dialog-title>Cadastro de Telefone</h1>\r\n<form (ngSubmit)=\"salvar(form)\" #form=\"ngForm\">\r\n <mat-dialog-content>\r\n <unb-mensagem [identificador]=\"idMensagemService\"></unb-mensagem>\r\n <div class=\"form-container\">\r\n <mat-form-field class=\"form-100\" appearance=\"outline\">\r\n <mat-label>Tipo</mat-label>\r\n <mat-select [(ngModel)]=\"telefone.tipoTelefoneCodigo\" [compareWith]=\"compararTipos\" name=\"tipoTelefoneCodigo\" (selectionChange)=\"onTipoSelecionado($event.value)\" required>\r\n <mat-option *ngFor=\"let tipo of listaTipoTelefone\" [value]=\"tipo.codigo\">\r\n {{tipo.denominacao}}\r\n </mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n\r\n <mat-form-field class=\"form-100\" appearance=\"outline\">\r\n <mat-label>DDD</mat-label>\r\n <input type=\"text\" maxlength=\"3\" required matInput [(ngModel)]=\"telefone.ddd\" name=\"dddValue\" #dddValue=\"ngModel\" />\r\n </mat-form-field> \r\n \r\n <mat-form-field class=\"form-100\" appearance=\"outline\">\r\n <mat-label>N\u00FAmero</mat-label>\r\n <input type=\"text\" required maxlength=\"9\" matInput [(ngModel)]=\"telefone.numero\" name=\"telefoneValue\" #telefoneValue=\"ngModel\" />\r\n </mat-form-field>\r\n </div>\r\n </mat-dialog-content>\r\n\r\n <mat-dialog-actions align=\"end\">\r\n <button mat-stroked-button type=\"button\" color=\"warn\" (click)=\"close()\">Fechar</button>\r\n <button mat-flat-button type=\"submit\" color=\"primary\">Salvar</button>\r\n </mat-dialog-actions>\r\n</form>", styles: [".card-actions-buttons{display:flex;gap:5px;flex-wrap:wrap}.form-container{display:flex;flex-wrap:wrap;column-gap:10px;margin:10px}@media (max-width: 1000px){.form-container{flex-direction:column;gap:5px}}.break{flex-basis:100%;height:0}.form-5{flex:1 1 5%}.inline-table-container{display:flex;align-items:center;justify-content:space-between;padding:5px}@media (max-width: 600px){.form-5,.form-10,.form-15{flex:1 1 100%}}.form-10{flex:1 1 10%}.form-15{flex:1 1 15%}.form-20{flex:1 1 20%}.form-25{flex:1 1 25%}.form-30{flex:1 1 30%}.form-35{flex:1 1 35%}.form-40{flex:1 1 40%}.form-45{flex:1 1 45%}.form-50{flex:1 1 50%}.form-100{flex:1 1 100%;min-width:250px}.botoes-container{display:flex;gap:5px}@media (max-width: 600px){.botoes-container{margin-bottom:10px}.botoes-container button{flex:1;max-width:50%}}\n"], dependencies: [{ kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i6.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i6.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i6.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i6.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i6.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i6.MaxLengthValidator, selector: "[maxlength][formControlName],[maxlength][formControl],[maxlength][ngModel]", inputs: ["maxlength"] }, { kind: "directive", type: i6.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i6.NgForm, selector: "form:not([ngNoForm]):not([formGroup]),ng-form,[ngForm]", inputs: ["ngFormOptions"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "component", type: i7.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "component", type: UnbMensagemComponent, selector: "unb-mensagem", inputs: ["mensagem", "tipo", "identificador"] }, { kind: "component", type: i9.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i9.MatLabel, selector: "mat-label" }, { kind: "directive", type: i10.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "directive", type: i4$2.MatDialogTitle, selector: "[mat-dialog-title], [matDialogTitle]", inputs: ["id"], exportAs: ["matDialogTitle"] }, { kind: "directive", type: i4$2.MatDialogActions, selector: "[mat-dialog-actions], mat-dialog-actions, [matDialogActions]", inputs: ["align"] }, { kind: "directive", type: i4$2.MatDialogContent, selector: "[mat-dialog-content], mat-dialog-content, [matDialogContent]" }, { kind: "component", type: i11.MatSelect, selector: "mat-select", inputs: ["aria-describedby", "panelClass", "disabled", "disableRipple", "tabIndex", "hideSingleSelectionIndicator", "placeholder", "required", "multiple", "disableOptionCentering", "compareWith", "value", "aria-label", "aria-labelledby", "errorStateMatcher", "typeaheadDebounceInterval", "sortComparator", "id", "panelWidth"], outputs: ["openedChange", "opened", "closed", "selectionChange", "valueChange"], exportAs: ["matSelect"] }, { kind: "component", type: i12.MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }] }); }
|
|
1859
1736
|
}
|
|
1860
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2
|
|
1737
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.2", ngImport: i0, type: UnbPessoaTelefoneFormComponent, decorators: [{
|
|
1861
1738
|
type: Component,
|
|
1862
1739
|
args: [{ standalone: false, selector: 'lib-unb-pessoa-telefone-form', template: "<h1 mat-dialog-title>Cadastro de Telefone</h1>\r\n<form (ngSubmit)=\"salvar(form)\" #form=\"ngForm\">\r\n <mat-dialog-content>\r\n <unb-mensagem [identificador]=\"idMensagemService\"></unb-mensagem>\r\n <div class=\"form-container\">\r\n <mat-form-field class=\"form-100\" appearance=\"outline\">\r\n <mat-label>Tipo</mat-label>\r\n <mat-select [(ngModel)]=\"telefone.tipoTelefoneCodigo\" [compareWith]=\"compararTipos\" name=\"tipoTelefoneCodigo\" (selectionChange)=\"onTipoSelecionado($event.value)\" required>\r\n <mat-option *ngFor=\"let tipo of listaTipoTelefone\" [value]=\"tipo.codigo\">\r\n {{tipo.denominacao}}\r\n </mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n\r\n <mat-form-field class=\"form-100\" appearance=\"outline\">\r\n <mat-label>DDD</mat-label>\r\n <input type=\"text\" maxlength=\"3\" required matInput [(ngModel)]=\"telefone.ddd\" name=\"dddValue\" #dddValue=\"ngModel\" />\r\n </mat-form-field> \r\n \r\n <mat-form-field class=\"form-100\" appearance=\"outline\">\r\n <mat-label>N\u00FAmero</mat-label>\r\n <input type=\"text\" required maxlength=\"9\" matInput [(ngModel)]=\"telefone.numero\" name=\"telefoneValue\" #telefoneValue=\"ngModel\" />\r\n </mat-form-field>\r\n </div>\r\n </mat-dialog-content>\r\n\r\n <mat-dialog-actions align=\"end\">\r\n <button mat-stroked-button type=\"button\" color=\"warn\" (click)=\"close()\">Fechar</button>\r\n <button mat-flat-button type=\"submit\" color=\"primary\">Salvar</button>\r\n </mat-dialog-actions>\r\n</form>", styles: [".card-actions-buttons{display:flex;gap:5px;flex-wrap:wrap}.form-container{display:flex;flex-wrap:wrap;column-gap:10px;margin:10px}@media (max-width: 1000px){.form-container{flex-direction:column;gap:5px}}.break{flex-basis:100%;height:0}.form-5{flex:1 1 5%}.inline-table-container{display:flex;align-items:center;justify-content:space-between;padding:5px}@media (max-width: 600px){.form-5,.form-10,.form-15{flex:1 1 100%}}.form-10{flex:1 1 10%}.form-15{flex:1 1 15%}.form-20{flex:1 1 20%}.form-25{flex:1 1 25%}.form-30{flex:1 1 30%}.form-35{flex:1 1 35%}.form-40{flex:1 1 40%}.form-45{flex:1 1 45%}.form-50{flex:1 1 50%}.form-100{flex:1 1 100%;min-width:250px}.botoes-container{display:flex;gap:5px}@media (max-width: 600px){.botoes-container{margin-bottom:10px}.botoes-container button{flex:1;max-width:50%}}\n"] }]
|
|
1863
1740
|
}], ctorParameters: () => [{ type: i1$2.MatSnackBar }, { type: UnBPessoaService }, { type: UnbMensagemService }, { type: i4$2.MatDialogRef }, { type: undefined, decorators: [{
|
|
@@ -2008,10 +1885,10 @@ class UnbPessoaTelefoneListComponent {
|
|
|
2008
1885
|
// 6. Finalmente, ordene a lista completa com as ordens agora únicas
|
|
2009
1886
|
this.telefones.sort((a, b) => (a.ordem ?? 0) - (b.ordem ?? 0));
|
|
2010
1887
|
}
|
|
2011
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2
|
|
2012
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2
|
|
1888
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.1.2", ngImport: i0, type: UnbPessoaTelefoneListComponent, deps: [{ token: i1$2.MatSnackBar }, { token: UnBPessoaService }, { token: i4$2.MatDialog }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
1889
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.1.2", type: UnbPessoaTelefoneListComponent, selector: "lib-unb-pessoa-telefone-list", inputs: { podeEditar: "podeEditar", telefones: "telefones", backendURL: "backendURL" }, outputs: { telefonesEmitted: "telefonesEmitted" }, usesOnChanges: true, ngImport: i0, template: "<div class=\"mes-container\">\r\n <div class=\"header-container\">\r\n <div class=\"mes-header\">\r\n <span class=\"titulo\">\r\n {{ telefones?.length === 1 ? 'Telefone Cadastrado' : 'Telefones Cadastrados' }}\r\n </span>\r\n <span class=\"titulo\">({{ telefones?.length || 0 }})</span>\r\n </div>\r\n\r\n <button type=\"button\" matTooltip=\"Novo Telefone\" mat-flat-button color=\"primary\" (click)=\"openFormDialog(null)\">\r\n Cadastrar Novo Telefone\r\n </button>\r\n </div>\r\n\r\n\r\n <!-- Exibe a tabela de despesas somente se houver despesas -->\r\n <table class=\"my-table\" *ngIf=\"telefones && telefones.length > 0\" cdkDropList (cdkDropListDropped)=\"moverTelefone($event)\">\r\n <tr style=\"background-color: #e4e3e3cc;\">\r\n <th style=\"width: 5%; text-align: center;\">Ordem</th>\r\n <th style=\"width: 20%;\">DDD</th>\r\n <th>N\u00FAmero</th> \r\n <th>Tipo</th>\r\n <th style=\"width: 1%; text-align: center;\">A\u00E7\u00F5es</th>\r\n </tr>\r\n\r\n <tr *ngFor=\"let valor of telefones; let i = index\" class=\"my-tr\" cdkDrag>\r\n <td style=\"text-align: center;\"> \r\n <div class=\"drag-cell\" cdkDragHandle>\r\n <mat-icon>drag_indicator</mat-icon>\r\n <span>{{ i + 1 }}</span>\r\n </div>\r\n </td>\r\n <td>{{ valor.ddd }}</td> \r\n <td>{{ valor.numero }}</td> \r\n <td>{{ valor.tipo?.toUpperCase() }}</td>\r\n <td>\r\n <div class=\"actions-container\">\r\n <button type=\"button\" mat-icon-button color=\"primary\" (click)=\"editar(valor)\">\r\n <mat-icon>edit</mat-icon>\r\n </button>\r\n <button type=\"button\" mat-icon-button color=\"warn\" (click)=\"excluir(valor)\">\r\n <mat-icon>delete</mat-icon>\r\n </button>\r\n </div>\r\n </td>\r\n </tr>\r\n</table>\r\n</div>", styles: [".mes-container{padding:12px;margin-bottom:2px;border-radius:8px;box-shadow:0 2px 6px #0000001a;transition:background-color .3s ease,box-shadow .3s ease}.mes-container:nth-child(2n){background-color:#f9f9fc}.mes-container:nth-child(odd){background-color:#fff}.mes-container:hover{background-color:#f0f0f5;box-shadow:0 4px 8px #00000026}.header-container{display:flex;align-items:center;margin-bottom:2px}.header-container button{margin-left:auto}.mes-header{display:flex;align-items:center;gap:6px;font-size:1.2rem;font-weight:700;color:#333}.my-table{width:100%;border-collapse:collapse;border-radius:8px;overflow:hidden;box-shadow:0 4px 8px #0000001a;font-family:Arial,sans-serif}.my-table th,.my-table td{padding:5px;text-align:left;border-bottom:1px solid #ddd}.my-table th{background-color:#005dbb7b;color:#fff;font-weight:700}.my-table tr{transition:background-color .3s ease}.my-table tr:hover{background-color:#f1f1f1}.my-table td{background-color:#fff}.my-table td button{transition:transform .2s ease}.my-table td button:hover{transform:scale(1.1)}.my-table td:last-child{text-align:center}.order-input{width:40px;text-align:center;border:1px solid #ccc;border-radius:4px;padding:2px}.order-input:focus{border-color:#1976d2;outline:none}.drag-cell{display:inline-flex;align-items:center;justify-content:center;gap:4px;cursor:grab;-webkit-user-select:none;user-select:none}.drag-cell mat-icon{font-size:18px;line-height:1;vertical-align:middle}.cdk-drag-preview{background:#fff;border-radius:6px;box-shadow:0 4px 12px #0003;display:table;border-collapse:collapse}.cdk-drag-placeholder{opacity:0;display:table-row}.cdk-drag-animating{transition:transform .2s cubic-bezier(0,0,.2,1)}table[cdkDropList] tr{border-bottom:1px solid #e0e0e0}table[cdkDropList] td{padding:8px}.actions-container{display:flex;justify-content:flex-end;gap:4px}\n"], dependencies: [{ kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i5.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i6$1.CdkDropList, selector: "[cdkDropList], cdk-drop-list", inputs: ["cdkDropListConnectedTo", "cdkDropListData", "cdkDropListOrientation", "id", "cdkDropListLockAxis", "cdkDropListDisabled", "cdkDropListSortingDisabled", "cdkDropListEnterPredicate", "cdkDropListSortPredicate", "cdkDropListAutoScrollDisabled", "cdkDropListAutoScrollStep", "cdkDropListElementContainer"], outputs: ["cdkDropListDropped", "cdkDropListEntered", "cdkDropListExited", "cdkDropListSorted"], exportAs: ["cdkDropList"] }, { kind: "directive", type: i6$1.CdkDrag, selector: "[cdkDrag]", inputs: ["cdkDragData", "cdkDragLockAxis", "cdkDragRootElement", "cdkDragBoundary", "cdkDragStartDelay", "cdkDragFreeDragPosition", "cdkDragDisabled", "cdkDragConstrainPosition", "cdkDragPreviewClass", "cdkDragPreviewContainer", "cdkDragScale"], outputs: ["cdkDragStarted", "cdkDragReleased", "cdkDragEnded", "cdkDragEntered", "cdkDragExited", "cdkDragDropped", "cdkDragMoved"], exportAs: ["cdkDrag"] }, { kind: "directive", type: i6$1.CdkDragHandle, selector: "[cdkDragHandle]", inputs: ["cdkDragHandleDisabled"] }, { kind: "component", type: i7.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "component", type: i7.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }] }); }
|
|
2013
1890
|
}
|
|
2014
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2
|
|
1891
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.2", ngImport: i0, type: UnbPessoaTelefoneListComponent, decorators: [{
|
|
2015
1892
|
type: Component,
|
|
2016
1893
|
args: [{ standalone: false, selector: 'lib-unb-pessoa-telefone-list', template: "<div class=\"mes-container\">\r\n <div class=\"header-container\">\r\n <div class=\"mes-header\">\r\n <span class=\"titulo\">\r\n {{ telefones?.length === 1 ? 'Telefone Cadastrado' : 'Telefones Cadastrados' }}\r\n </span>\r\n <span class=\"titulo\">({{ telefones?.length || 0 }})</span>\r\n </div>\r\n\r\n <button type=\"button\" matTooltip=\"Novo Telefone\" mat-flat-button color=\"primary\" (click)=\"openFormDialog(null)\">\r\n Cadastrar Novo Telefone\r\n </button>\r\n </div>\r\n\r\n\r\n <!-- Exibe a tabela de despesas somente se houver despesas -->\r\n <table class=\"my-table\" *ngIf=\"telefones && telefones.length > 0\" cdkDropList (cdkDropListDropped)=\"moverTelefone($event)\">\r\n <tr style=\"background-color: #e4e3e3cc;\">\r\n <th style=\"width: 5%; text-align: center;\">Ordem</th>\r\n <th style=\"width: 20%;\">DDD</th>\r\n <th>N\u00FAmero</th> \r\n <th>Tipo</th>\r\n <th style=\"width: 1%; text-align: center;\">A\u00E7\u00F5es</th>\r\n </tr>\r\n\r\n <tr *ngFor=\"let valor of telefones; let i = index\" class=\"my-tr\" cdkDrag>\r\n <td style=\"text-align: center;\"> \r\n <div class=\"drag-cell\" cdkDragHandle>\r\n <mat-icon>drag_indicator</mat-icon>\r\n <span>{{ i + 1 }}</span>\r\n </div>\r\n </td>\r\n <td>{{ valor.ddd }}</td> \r\n <td>{{ valor.numero }}</td> \r\n <td>{{ valor.tipo?.toUpperCase() }}</td>\r\n <td>\r\n <div class=\"actions-container\">\r\n <button type=\"button\" mat-icon-button color=\"primary\" (click)=\"editar(valor)\">\r\n <mat-icon>edit</mat-icon>\r\n </button>\r\n <button type=\"button\" mat-icon-button color=\"warn\" (click)=\"excluir(valor)\">\r\n <mat-icon>delete</mat-icon>\r\n </button>\r\n </div>\r\n </td>\r\n </tr>\r\n</table>\r\n</div>", styles: [".mes-container{padding:12px;margin-bottom:2px;border-radius:8px;box-shadow:0 2px 6px #0000001a;transition:background-color .3s ease,box-shadow .3s ease}.mes-container:nth-child(2n){background-color:#f9f9fc}.mes-container:nth-child(odd){background-color:#fff}.mes-container:hover{background-color:#f0f0f5;box-shadow:0 4px 8px #00000026}.header-container{display:flex;align-items:center;margin-bottom:2px}.header-container button{margin-left:auto}.mes-header{display:flex;align-items:center;gap:6px;font-size:1.2rem;font-weight:700;color:#333}.my-table{width:100%;border-collapse:collapse;border-radius:8px;overflow:hidden;box-shadow:0 4px 8px #0000001a;font-family:Arial,sans-serif}.my-table th,.my-table td{padding:5px;text-align:left;border-bottom:1px solid #ddd}.my-table th{background-color:#005dbb7b;color:#fff;font-weight:700}.my-table tr{transition:background-color .3s ease}.my-table tr:hover{background-color:#f1f1f1}.my-table td{background-color:#fff}.my-table td button{transition:transform .2s ease}.my-table td button:hover{transform:scale(1.1)}.my-table td:last-child{text-align:center}.order-input{width:40px;text-align:center;border:1px solid #ccc;border-radius:4px;padding:2px}.order-input:focus{border-color:#1976d2;outline:none}.drag-cell{display:inline-flex;align-items:center;justify-content:center;gap:4px;cursor:grab;-webkit-user-select:none;user-select:none}.drag-cell mat-icon{font-size:18px;line-height:1;vertical-align:middle}.cdk-drag-preview{background:#fff;border-radius:6px;box-shadow:0 4px 12px #0003;display:table;border-collapse:collapse}.cdk-drag-placeholder{opacity:0;display:table-row}.cdk-drag-animating{transition:transform .2s cubic-bezier(0,0,.2,1)}table[cdkDropList] tr{border-bottom:1px solid #e0e0e0}table[cdkDropList] td{padding:8px}.actions-container{display:flex;justify-content:flex-end;gap:4px}\n"] }]
|
|
2017
1894
|
}], ctorParameters: () => [{ type: i1$2.MatSnackBar }, { type: UnBPessoaService }, { type: i4$2.MatDialog }], propDecorators: { podeEditar: [{
|
|
@@ -2152,10 +2029,10 @@ class UnbPessoaenderecoListComponent {
|
|
|
2152
2029
|
// 6. Finalmente, ordene a lista
|
|
2153
2030
|
this.enderecos.sort((a, b) => (a.ordemEndereco ?? 0) - (b.ordemEndereco ?? 0)); //
|
|
2154
2031
|
}
|
|
2155
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2
|
|
2156
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2
|
|
2032
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.1.2", ngImport: i0, type: UnbPessoaenderecoListComponent, deps: [{ token: i1$2.MatSnackBar }, { token: UnBPessoaService }, { token: i4$2.MatDialog }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
2033
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.1.2", type: UnbPessoaenderecoListComponent, selector: "lib-unb-pessoa-endereco-list", inputs: { podeEditar: "podeEditar", enderecos: "enderecos", backendURL: "backendURL" }, outputs: { enderecosEmitted: "enderecosEmitted" }, usesOnChanges: true, ngImport: i0, template: "<div class=\"mes-container\">\r\n <div class=\"header-container\">\r\n <div class=\"mes-header\">\r\n <span class=\"titulo\">\r\n {{ enderecos?.length === 1 ? 'Endere\u00E7o Cadastrado' : 'Endere\u00E7os Cadastrados' }}\r\n </span>\r\n <span class=\"titulo\">({{ enderecos?.length || 0 }})</span>\r\n </div>\r\n\r\n <button type=\"button\" matTooltip=\"Novo Endere\u00E7o\" mat-flat-button color=\"primary\" (click)=\"openFormDialog(null)\">\r\n Cadastrar Novo Endere\u00E7o\r\n </button>\r\n </div>\r\n\r\n <!-- Exibe a tabela de despesas somente se houver despesas -->\r\n <table class=\"my-table\" *ngIf=\"enderecos && enderecos.length > 0\" cdkDropList\r\n (cdkDropListDropped)=\"moverLinha($event)\">\r\n <tr style=\"background-color: #e4e3e3cc;\">\r\n <th style=\"width: 5%; text-align: center;\">Ordem</th>\r\n <th>Logradouro</th>\r\n <th>Bairro</th>\r\n <th>CEP</th>\r\n <th>Tipo</th>\r\n <th style=\"width: 1%; text-align: center;\">A\u00E7\u00F5es</th>\r\n </tr>\r\n\r\n <tr *ngFor=\"let valor of enderecos; let i = index\" class=\"my-tr\" cdkDrag>\r\n <td style=\"width: 5%; text-align: center;\">\r\n <div class=\"drag-cell\" cdkDragHandle>\r\n <mat-icon>drag_indicator</mat-icon>\r\n <span>{{ i + 1 }}</span>\r\n </div>\r\n </td>\r\n <td>{{ valor.logradouro }}</td>\r\n <td>{{ valor.bairro }}</td>\r\n <td>{{ valor.cep }}</td>\r\n <td>{{ valor.tipo?.toUpperCase() }}</td>\r\n <td>\r\n <div class=\"actions-container\">\r\n <button type=\"button\" mat-icon-button aria-label=\"Salvar\" color=\"primary\" (click)=\"editar(valor)\">\r\n <mat-icon>edit</mat-icon>\r\n </button>\r\n <button type=\"button\" mat-icon-button aria-label=\"Deletar\" color=\"warn\" (click)=\"excluir(valor)\">\r\n <mat-icon>delete</mat-icon>\r\n </button>\r\n </div>\r\n </td>\r\n </tr>\r\n </table>\r\n</div>", styles: [".mes-container{padding:12px;margin-bottom:2px;border-radius:8px;box-shadow:0 2px 6px #0000001a;transition:background-color .3s ease,box-shadow .3s ease}.mes-container:nth-child(2n){background-color:#f9f9fc}.mes-container:nth-child(odd){background-color:#fff}.mes-container:hover{background-color:#f0f0f5;box-shadow:0 4px 8px #00000026}.header-container{display:flex;align-items:center;margin-bottom:2px}.header-container button{margin-left:auto}.mes-header{display:flex;align-items:center;gap:6px;font-size:1.2rem;font-weight:700;color:#333}.actions-container{display:flex;justify-content:flex-end;gap:4px}.my-table{width:100%;border-collapse:collapse;border-radius:8px;overflow:hidden;box-shadow:0 4px 8px #0000001a;font-family:Arial,sans-serif}.my-table th,.my-table td{padding:5px;text-align:left;border-bottom:1px solid #ddd}.my-table th{background-color:#005dbb7b;color:#fff;font-weight:700}.my-table tr{transition:background-color .3s ease}.my-table tr:hover{background-color:#f1f1f1}.my-table td{background-color:#fff}.my-table td button{transition:transform .2s ease}.my-table td button:hover{transform:scale(1.1)}.my-table td:last-child{text-align:center}.order-input{width:40px;text-align:center;border:1px solid #ccc;border-radius:4px;padding:2px}.order-input:focus{border-color:#1976d2;outline:none}.drag-cell{display:inline-flex;align-items:center;justify-content:center;gap:4px;cursor:grab;-webkit-user-select:none;user-select:none}.drag-cell mat-icon{font-size:18px;line-height:1;vertical-align:middle}.cdk-drag-preview{background:#fff;border-radius:6px;box-shadow:0 4px 12px #0003;display:table;border-collapse:collapse}.cdk-drag-placeholder{opacity:0;display:table-row}.cdk-drag-animating{transition:transform .2s cubic-bezier(0,0,.2,1)}table[cdkDropList] tr{border-bottom:1px solid #e0e0e0}table[cdkDropList] td{padding:8px}\n"], dependencies: [{ kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i5.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i6$1.CdkDropList, selector: "[cdkDropList], cdk-drop-list", inputs: ["cdkDropListConnectedTo", "cdkDropListData", "cdkDropListOrientation", "id", "cdkDropListLockAxis", "cdkDropListDisabled", "cdkDropListSortingDisabled", "cdkDropListEnterPredicate", "cdkDropListSortPredicate", "cdkDropListAutoScrollDisabled", "cdkDropListAutoScrollStep", "cdkDropListElementContainer"], outputs: ["cdkDropListDropped", "cdkDropListEntered", "cdkDropListExited", "cdkDropListSorted"], exportAs: ["cdkDropList"] }, { kind: "directive", type: i6$1.CdkDrag, selector: "[cdkDrag]", inputs: ["cdkDragData", "cdkDragLockAxis", "cdkDragRootElement", "cdkDragBoundary", "cdkDragStartDelay", "cdkDragFreeDragPosition", "cdkDragDisabled", "cdkDragConstrainPosition", "cdkDragPreviewClass", "cdkDragPreviewContainer", "cdkDragScale"], outputs: ["cdkDragStarted", "cdkDragReleased", "cdkDragEnded", "cdkDragEntered", "cdkDragExited", "cdkDragDropped", "cdkDragMoved"], exportAs: ["cdkDrag"] }, { kind: "directive", type: i6$1.CdkDragHandle, selector: "[cdkDragHandle]", inputs: ["cdkDragHandleDisabled"] }, { kind: "component", type: i7.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "component", type: i7.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }] }); }
|
|
2157
2034
|
}
|
|
2158
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2
|
|
2035
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.2", ngImport: i0, type: UnbPessoaenderecoListComponent, decorators: [{
|
|
2159
2036
|
type: Component,
|
|
2160
2037
|
args: [{ standalone: false, selector: 'lib-unb-pessoa-endereco-list', template: "<div class=\"mes-container\">\r\n <div class=\"header-container\">\r\n <div class=\"mes-header\">\r\n <span class=\"titulo\">\r\n {{ enderecos?.length === 1 ? 'Endere\u00E7o Cadastrado' : 'Endere\u00E7os Cadastrados' }}\r\n </span>\r\n <span class=\"titulo\">({{ enderecos?.length || 0 }})</span>\r\n </div>\r\n\r\n <button type=\"button\" matTooltip=\"Novo Endere\u00E7o\" mat-flat-button color=\"primary\" (click)=\"openFormDialog(null)\">\r\n Cadastrar Novo Endere\u00E7o\r\n </button>\r\n </div>\r\n\r\n <!-- Exibe a tabela de despesas somente se houver despesas -->\r\n <table class=\"my-table\" *ngIf=\"enderecos && enderecos.length > 0\" cdkDropList\r\n (cdkDropListDropped)=\"moverLinha($event)\">\r\n <tr style=\"background-color: #e4e3e3cc;\">\r\n <th style=\"width: 5%; text-align: center;\">Ordem</th>\r\n <th>Logradouro</th>\r\n <th>Bairro</th>\r\n <th>CEP</th>\r\n <th>Tipo</th>\r\n <th style=\"width: 1%; text-align: center;\">A\u00E7\u00F5es</th>\r\n </tr>\r\n\r\n <tr *ngFor=\"let valor of enderecos; let i = index\" class=\"my-tr\" cdkDrag>\r\n <td style=\"width: 5%; text-align: center;\">\r\n <div class=\"drag-cell\" cdkDragHandle>\r\n <mat-icon>drag_indicator</mat-icon>\r\n <span>{{ i + 1 }}</span>\r\n </div>\r\n </td>\r\n <td>{{ valor.logradouro }}</td>\r\n <td>{{ valor.bairro }}</td>\r\n <td>{{ valor.cep }}</td>\r\n <td>{{ valor.tipo?.toUpperCase() }}</td>\r\n <td>\r\n <div class=\"actions-container\">\r\n <button type=\"button\" mat-icon-button aria-label=\"Salvar\" color=\"primary\" (click)=\"editar(valor)\">\r\n <mat-icon>edit</mat-icon>\r\n </button>\r\n <button type=\"button\" mat-icon-button aria-label=\"Deletar\" color=\"warn\" (click)=\"excluir(valor)\">\r\n <mat-icon>delete</mat-icon>\r\n </button>\r\n </div>\r\n </td>\r\n </tr>\r\n </table>\r\n</div>", styles: [".mes-container{padding:12px;margin-bottom:2px;border-radius:8px;box-shadow:0 2px 6px #0000001a;transition:background-color .3s ease,box-shadow .3s ease}.mes-container:nth-child(2n){background-color:#f9f9fc}.mes-container:nth-child(odd){background-color:#fff}.mes-container:hover{background-color:#f0f0f5;box-shadow:0 4px 8px #00000026}.header-container{display:flex;align-items:center;margin-bottom:2px}.header-container button{margin-left:auto}.mes-header{display:flex;align-items:center;gap:6px;font-size:1.2rem;font-weight:700;color:#333}.actions-container{display:flex;justify-content:flex-end;gap:4px}.my-table{width:100%;border-collapse:collapse;border-radius:8px;overflow:hidden;box-shadow:0 4px 8px #0000001a;font-family:Arial,sans-serif}.my-table th,.my-table td{padding:5px;text-align:left;border-bottom:1px solid #ddd}.my-table th{background-color:#005dbb7b;color:#fff;font-weight:700}.my-table tr{transition:background-color .3s ease}.my-table tr:hover{background-color:#f1f1f1}.my-table td{background-color:#fff}.my-table td button{transition:transform .2s ease}.my-table td button:hover{transform:scale(1.1)}.my-table td:last-child{text-align:center}.order-input{width:40px;text-align:center;border:1px solid #ccc;border-radius:4px;padding:2px}.order-input:focus{border-color:#1976d2;outline:none}.drag-cell{display:inline-flex;align-items:center;justify-content:center;gap:4px;cursor:grab;-webkit-user-select:none;user-select:none}.drag-cell mat-icon{font-size:18px;line-height:1;vertical-align:middle}.cdk-drag-preview{background:#fff;border-radius:6px;box-shadow:0 4px 12px #0003;display:table;border-collapse:collapse}.cdk-drag-placeholder{opacity:0;display:table-row}.cdk-drag-animating{transition:transform .2s cubic-bezier(0,0,.2,1)}table[cdkDropList] tr{border-bottom:1px solid #e0e0e0}table[cdkDropList] td{padding:8px}\n"] }]
|
|
2161
2038
|
}], ctorParameters: () => [{ type: i1$2.MatSnackBar }, { type: UnBPessoaService }, { type: i4$2.MatDialog }], propDecorators: { podeEditar: [{
|
|
@@ -2299,10 +2176,10 @@ class UnbPessoaEmailListComponent {
|
|
|
2299
2176
|
// 6. Finalmente, ordene a lista
|
|
2300
2177
|
this.emails.sort((a, b) => (a.ordem ?? 0) - (b.ordem ?? 0)); // <-- 'ordem'
|
|
2301
2178
|
}
|
|
2302
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2
|
|
2303
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2
|
|
2179
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.1.2", ngImport: i0, type: UnbPessoaEmailListComponent, deps: [{ token: i1$2.MatSnackBar }, { token: UnBPessoaService }, { token: i4$2.MatDialog }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
2180
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.1.2", type: UnbPessoaEmailListComponent, selector: "lib-unb-pessoa-email-list", inputs: { podeEditar: "podeEditar", emails: "emails", backendURL: "backendURL" }, outputs: { emailsEmitted: "emailsEmitted" }, usesOnChanges: true, ngImport: i0, template: "<div class=\"mes-container\">\r\n <div class=\"header-container\">\r\n <div class=\"mes-header\">\r\n <span class=\"titulo\">\r\n {{ emails?.length === 1 ? 'Email Cadastrado' : 'E-mails Cadastrados' }}\r\n </span>\r\n <span class=\"titulo\">({{ emails?.length || 0 }})</span>\r\n </div>\r\n\r\n <button type=\"button\" matTooltip=\"Novo Email\" mat-flat-button color=\"primary\" (click)=\"openFormDialog(null)\">\r\n Cadastrar Novo Email\r\n </button>\r\n </div>\r\n\r\n <!-- Exibe a tabela de despesas somente se houver despesas -->\r\n <table class=\"my-table\" *ngIf=\"emails && emails.length > 0\" cdkDropList (cdkDropListDropped)=\"moverLinha($event)\">\r\n\r\n <tr style=\"background-color: #e4e3e3cc;\">\r\n <th style=\"width: 5%; text-align: center;\">Ordem</th>\r\n <th>E-mail</th>\r\n <th>Tipo</th>\r\n <th style=\"width: 1%; text-align: center;\">A\u00E7\u00F5es</th>\r\n </tr>\r\n\r\n <tr *ngFor=\"let valor of emails; let i = index\" class=\"my-tr\" cdkDrag>\r\n\r\n <td style=\"text-align: center;\">\r\n <div class=\"drag-cell\" cdkDragHandle>\r\n <mat-icon>drag_indicator</mat-icon>\r\n <span>{{ i + 1 }}</span>\r\n </div>\r\n </td>\r\n\r\n <td>{{ valor.email }}</td>\r\n\r\n <td>{{ valor.tipo?.toUpperCase() }}</td>\r\n\r\n <td>\r\n <div class=\"actions-container\">\r\n <button type=\"button\" mat-icon-button aria-label=\"Salvar\" color=\"primary\" (click)=\"editar(valor)\">\r\n <mat-icon>edit</mat-icon>\r\n </button>\r\n <button type=\"button\" mat-icon-button aria-label=\"Deletar\" color=\"warn\" (click)=\"excluir(valor)\">\r\n <mat-icon>delete</mat-icon>\r\n </button>\r\n </div>\r\n </td>\r\n </tr>\r\n </table>\r\n</div>", styles: [".mes-container{padding:12px;margin-bottom:2px;border-radius:8px;box-shadow:0 2px 6px #0000001a;transition:background-color .3s ease,box-shadow .3s ease}.mes-container:nth-child(2n){background-color:#f9f9fc}.mes-container:nth-child(odd){background-color:#fff}.mes-container:hover{background-color:#f0f0f5;box-shadow:0 4px 8px #00000026}.header-container{display:flex;align-items:center;margin-bottom:2px}.header-container button{margin-left:auto}.mes-header{display:flex;align-items:center;gap:6px;font-size:1.2rem;font-weight:700;color:#333}.my-table{width:100%;border-collapse:collapse;border-radius:8px;overflow:hidden;box-shadow:0 4px 8px #0000001a;font-family:Arial,sans-serif}.my-table th,.my-table td{padding:5px;text-align:left;border-bottom:1px solid #ddd}.my-table th{background-color:#005dbb7b;color:#fff;font-weight:700}.my-table tr{transition:background-color .3s ease}.my-table tr:hover{background-color:#f1f1f1}.my-table td{background-color:#fff}.my-table td button{transition:transform .2s ease}.my-table td button:hover{transform:scale(1.1)}.my-table td:last-child{text-align:center}.order-input{width:40px;text-align:center;border:1px solid #ccc;border-radius:4px;padding:2px}.order-input:focus{border-color:#1976d2;outline:none}.drag-cell{display:inline-flex;align-items:center;justify-content:center;gap:4px;cursor:grab;-webkit-user-select:none;user-select:none}.drag-cell mat-icon{font-size:18px;line-height:1;vertical-align:middle}.cdk-drag-preview{background:#fff;border-radius:6px;box-shadow:0 4px 12px #0003;display:table;border-collapse:collapse}.cdk-drag-placeholder{opacity:0;display:table-row}.cdk-drag-animating{transition:transform .2s cubic-bezier(0,0,.2,1)}table[cdkDropList] tr{border-bottom:1px solid #e0e0e0}table[cdkDropList] td{padding:8px}.actions-container{display:flex;justify-content:flex-end;gap:4px}\n"], dependencies: [{ kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i5.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i6$1.CdkDropList, selector: "[cdkDropList], cdk-drop-list", inputs: ["cdkDropListConnectedTo", "cdkDropListData", "cdkDropListOrientation", "id", "cdkDropListLockAxis", "cdkDropListDisabled", "cdkDropListSortingDisabled", "cdkDropListEnterPredicate", "cdkDropListSortPredicate", "cdkDropListAutoScrollDisabled", "cdkDropListAutoScrollStep", "cdkDropListElementContainer"], outputs: ["cdkDropListDropped", "cdkDropListEntered", "cdkDropListExited", "cdkDropListSorted"], exportAs: ["cdkDropList"] }, { kind: "directive", type: i6$1.CdkDrag, selector: "[cdkDrag]", inputs: ["cdkDragData", "cdkDragLockAxis", "cdkDragRootElement", "cdkDragBoundary", "cdkDragStartDelay", "cdkDragFreeDragPosition", "cdkDragDisabled", "cdkDragConstrainPosition", "cdkDragPreviewClass", "cdkDragPreviewContainer", "cdkDragScale"], outputs: ["cdkDragStarted", "cdkDragReleased", "cdkDragEnded", "cdkDragEntered", "cdkDragExited", "cdkDragDropped", "cdkDragMoved"], exportAs: ["cdkDrag"] }, { kind: "directive", type: i6$1.CdkDragHandle, selector: "[cdkDragHandle]", inputs: ["cdkDragHandleDisabled"] }, { kind: "component", type: i7.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "component", type: i7.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }] }); }
|
|
2304
2181
|
}
|
|
2305
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2
|
|
2182
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.2", ngImport: i0, type: UnbPessoaEmailListComponent, decorators: [{
|
|
2306
2183
|
type: Component,
|
|
2307
2184
|
args: [{ standalone: false, selector: 'lib-unb-pessoa-email-list', template: "<div class=\"mes-container\">\r\n <div class=\"header-container\">\r\n <div class=\"mes-header\">\r\n <span class=\"titulo\">\r\n {{ emails?.length === 1 ? 'Email Cadastrado' : 'E-mails Cadastrados' }}\r\n </span>\r\n <span class=\"titulo\">({{ emails?.length || 0 }})</span>\r\n </div>\r\n\r\n <button type=\"button\" matTooltip=\"Novo Email\" mat-flat-button color=\"primary\" (click)=\"openFormDialog(null)\">\r\n Cadastrar Novo Email\r\n </button>\r\n </div>\r\n\r\n <!-- Exibe a tabela de despesas somente se houver despesas -->\r\n <table class=\"my-table\" *ngIf=\"emails && emails.length > 0\" cdkDropList (cdkDropListDropped)=\"moverLinha($event)\">\r\n\r\n <tr style=\"background-color: #e4e3e3cc;\">\r\n <th style=\"width: 5%; text-align: center;\">Ordem</th>\r\n <th>E-mail</th>\r\n <th>Tipo</th>\r\n <th style=\"width: 1%; text-align: center;\">A\u00E7\u00F5es</th>\r\n </tr>\r\n\r\n <tr *ngFor=\"let valor of emails; let i = index\" class=\"my-tr\" cdkDrag>\r\n\r\n <td style=\"text-align: center;\">\r\n <div class=\"drag-cell\" cdkDragHandle>\r\n <mat-icon>drag_indicator</mat-icon>\r\n <span>{{ i + 1 }}</span>\r\n </div>\r\n </td>\r\n\r\n <td>{{ valor.email }}</td>\r\n\r\n <td>{{ valor.tipo?.toUpperCase() }}</td>\r\n\r\n <td>\r\n <div class=\"actions-container\">\r\n <button type=\"button\" mat-icon-button aria-label=\"Salvar\" color=\"primary\" (click)=\"editar(valor)\">\r\n <mat-icon>edit</mat-icon>\r\n </button>\r\n <button type=\"button\" mat-icon-button aria-label=\"Deletar\" color=\"warn\" (click)=\"excluir(valor)\">\r\n <mat-icon>delete</mat-icon>\r\n </button>\r\n </div>\r\n </td>\r\n </tr>\r\n </table>\r\n</div>", styles: [".mes-container{padding:12px;margin-bottom:2px;border-radius:8px;box-shadow:0 2px 6px #0000001a;transition:background-color .3s ease,box-shadow .3s ease}.mes-container:nth-child(2n){background-color:#f9f9fc}.mes-container:nth-child(odd){background-color:#fff}.mes-container:hover{background-color:#f0f0f5;box-shadow:0 4px 8px #00000026}.header-container{display:flex;align-items:center;margin-bottom:2px}.header-container button{margin-left:auto}.mes-header{display:flex;align-items:center;gap:6px;font-size:1.2rem;font-weight:700;color:#333}.my-table{width:100%;border-collapse:collapse;border-radius:8px;overflow:hidden;box-shadow:0 4px 8px #0000001a;font-family:Arial,sans-serif}.my-table th,.my-table td{padding:5px;text-align:left;border-bottom:1px solid #ddd}.my-table th{background-color:#005dbb7b;color:#fff;font-weight:700}.my-table tr{transition:background-color .3s ease}.my-table tr:hover{background-color:#f1f1f1}.my-table td{background-color:#fff}.my-table td button{transition:transform .2s ease}.my-table td button:hover{transform:scale(1.1)}.my-table td:last-child{text-align:center}.order-input{width:40px;text-align:center;border:1px solid #ccc;border-radius:4px;padding:2px}.order-input:focus{border-color:#1976d2;outline:none}.drag-cell{display:inline-flex;align-items:center;justify-content:center;gap:4px;cursor:grab;-webkit-user-select:none;user-select:none}.drag-cell mat-icon{font-size:18px;line-height:1;vertical-align:middle}.cdk-drag-preview{background:#fff;border-radius:6px;box-shadow:0 4px 12px #0003;display:table;border-collapse:collapse}.cdk-drag-placeholder{opacity:0;display:table-row}.cdk-drag-animating{transition:transform .2s cubic-bezier(0,0,.2,1)}table[cdkDropList] tr{border-bottom:1px solid #e0e0e0}table[cdkDropList] td{padding:8px}.actions-container{display:flex;justify-content:flex-end;gap:4px}\n"] }]
|
|
2308
2185
|
}], ctorParameters: () => [{ type: i1$2.MatSnackBar }, { type: UnBPessoaService }, { type: i4$2.MatDialog }], propDecorators: { podeEditar: [{
|
|
@@ -2320,48 +2197,47 @@ class UnbPessoaFormComponent {
|
|
|
2320
2197
|
this.service = service;
|
|
2321
2198
|
this.snackBar = snackBar;
|
|
2322
2199
|
this.alertService = alertService;
|
|
2200
|
+
this.config = new UnbPessoaFormConfig();
|
|
2201
|
+
this.hideSalvarButton = false; // usado quando eh modal. Nao mostra botao salvar. Pq o Dialog já tem um botao salvar
|
|
2202
|
+
this.pessoaEmitted = new EventEmitter();
|
|
2203
|
+
this.isLoadingChange = new EventEmitter();
|
|
2323
2204
|
this.isLoading = false;
|
|
2324
|
-
this.buscaRealizada = false;
|
|
2325
2205
|
this.endereco = new UnbPessoaEndereco();
|
|
2326
2206
|
this.email = new UnbPessoaEmail();
|
|
2327
|
-
this.
|
|
2328
|
-
this.pessoa = new UnbPessoaModel(); // inicializa com pessoa
|
|
2207
|
+
this.isReadyOnly = false;
|
|
2329
2208
|
this.dadosSalvos = {}; // Armazena os dados ao trocar de tipo
|
|
2330
|
-
// Quando verdadeiro, o formulário e ações ficam desabilitados porque os dados
|
|
2331
|
-
// devem ser alterados apenas pelo app SouGov (matricula SIAPE presente)
|
|
2332
|
-
this.isReadonlyFromSiape = false;
|
|
2333
|
-
// Mantemos o required se este componente também não funcionar sem a URL
|
|
2334
|
-
this.backendURL = "";
|
|
2335
|
-
// Transformamos em booleanAttribute para aceitar pesquisarPorCPF="true"
|
|
2336
|
-
this.pesquisarPorCPF = true;
|
|
2337
|
-
this.pesquisarPorCNPJ = true;
|
|
2338
|
-
this.pesquisarPorEstrangeiro = false;
|
|
2339
|
-
this.campoPesquisaMaxWidth = '400px';
|
|
2340
|
-
this.pessoaEmitted = new EventEmitter();
|
|
2341
|
-
this.isLoadingChange = new EventEmitter();
|
|
2342
2209
|
this.idMensagemService = "unbPessoaForm";
|
|
2343
2210
|
// Controla se está incluindo nova pessoa ou editando existente
|
|
2344
2211
|
this.documentoPesquisado = '';
|
|
2345
2212
|
this.incluindoNovaPessoa = false;
|
|
2346
2213
|
this.editandoPessoa = false;
|
|
2214
|
+
this.pessoa = new UnbPessoaModel();
|
|
2347
2215
|
}
|
|
2348
2216
|
ngOnInit() {
|
|
2349
2217
|
this.alertService.hideMessage(this.idMensagemService);
|
|
2350
|
-
if (this.backendURL == "") {
|
|
2218
|
+
if (this.config.backendURL == "") {
|
|
2351
2219
|
this.handleErrorPrintConsole("[UnbPessoaPesquisarComponent] ERROR: apiPessoaConfig.url está null. Insira o parâmetro (apiPessoaConfig) com o valor válido!");
|
|
2352
2220
|
return;
|
|
2353
2221
|
}
|
|
2354
2222
|
else {
|
|
2355
|
-
this.service.setBackendUrl(this.backendURL);
|
|
2223
|
+
this.service.setBackendUrl(this.config.backendURL);
|
|
2224
|
+
}
|
|
2225
|
+
if (this.config.token && this.config.token != "") {
|
|
2226
|
+
this.service.setToken(this.config.token);
|
|
2356
2227
|
}
|
|
2357
2228
|
// atencao, o pessoaRecebida que inicializa esse componente
|
|
2358
2229
|
this.escolaridade = this.service.getEscolaridade();
|
|
2359
2230
|
this.paises = this.service.getPaises();
|
|
2360
2231
|
this.estadosCivil = this.service.getEstadoCivil();
|
|
2232
|
+
this.pessoaRecebida(this.config.pessoa);
|
|
2361
2233
|
}
|
|
2362
2234
|
pessoaRecebida(pessoaRecebida) {
|
|
2363
|
-
|
|
2364
|
-
|
|
2235
|
+
if (!pessoaRecebida) {
|
|
2236
|
+
this.pessoa = {};
|
|
2237
|
+
}
|
|
2238
|
+
else {
|
|
2239
|
+
this.pessoa = pessoaRecebida;
|
|
2240
|
+
}
|
|
2365
2241
|
this.alertService.hideMessage(this.idMensagemService);
|
|
2366
2242
|
// Reseta o formulário quando uma nova pessoa é recebida
|
|
2367
2243
|
if (this.pessoaForm) {
|
|
@@ -2377,7 +2253,7 @@ class UnbPessoaFormComponent {
|
|
|
2377
2253
|
// 1. Verifica se é um registro que já existe no banco
|
|
2378
2254
|
const existeRegistro = !!this.pessoa?.codigoPessoa;
|
|
2379
2255
|
// 2. Verifica se é bloqueado pelo SIAPE (Só faz sentido se o registro existir)
|
|
2380
|
-
this.
|
|
2256
|
+
this.isReadyOnly = existeRegistro && !!this.pessoa?.matriculaSiape;
|
|
2381
2257
|
// 3. Define o documento (usando aquele mapa limpo)
|
|
2382
2258
|
const docMap = {
|
|
2383
2259
|
[UnbTipoPessoaEnum.FISICA]: this.pessoa.cpf,
|
|
@@ -2386,7 +2262,7 @@ class UnbPessoaFormComponent {
|
|
|
2386
2262
|
};
|
|
2387
2263
|
this.documentoPesquisado = docMap[this.pessoa.tipoPessoa] || '';
|
|
2388
2264
|
// 4. (Opcional) Snackbar se for SIAPE
|
|
2389
|
-
if (this.
|
|
2265
|
+
if (this.isReadyOnly) {
|
|
2390
2266
|
this.openSnackBar('Dados importados do SIAPE não podem ser alterados.');
|
|
2391
2267
|
}
|
|
2392
2268
|
}
|
|
@@ -2397,9 +2273,9 @@ class UnbPessoaFormComponent {
|
|
|
2397
2273
|
return;
|
|
2398
2274
|
this.isLoading = true;
|
|
2399
2275
|
this.isLoadingChange.emit(true);
|
|
2400
|
-
|
|
2401
|
-
//
|
|
2402
|
-
this.service.
|
|
2276
|
+
// Agora o service converte internamente o Model para o payload correto
|
|
2277
|
+
// e decide o endpoint com base no tipoPessoa
|
|
2278
|
+
this.service.salvarPessoa(this.config.pessoa)
|
|
2403
2279
|
.subscribe({
|
|
2404
2280
|
next: (resposta) => {
|
|
2405
2281
|
this.isLoading = false;
|
|
@@ -2408,9 +2284,9 @@ class UnbPessoaFormComponent {
|
|
|
2408
2284
|
this.alertService.showMessage("<strong>Registro salvo com sucesso!</strong>", UnbTipoMensagemEnum.SUCCESS, this.idMensagemService);
|
|
2409
2285
|
// Atualiza dados retornados (IDs gerados)
|
|
2410
2286
|
if (resposta) {
|
|
2411
|
-
this.pessoa.codigoPessoa = resposta.codigoPessoa || this.pessoa.codigoPessoa;
|
|
2412
|
-
this.pessoa.idPessoa = resposta.idPessoa || this.pessoa.idPessoa;
|
|
2413
|
-
this.pessoaEmitted.emit(this.pessoa);
|
|
2287
|
+
this.config.pessoa.codigoPessoa = resposta.codigoPessoa || this.config.pessoa.codigoPessoa;
|
|
2288
|
+
this.config.pessoa.idPessoa = resposta.idPessoa || this.config.pessoa.idPessoa;
|
|
2289
|
+
this.pessoaEmitted.emit(this.config.pessoa);
|
|
2414
2290
|
}
|
|
2415
2291
|
},
|
|
2416
2292
|
error: (err) => {
|
|
@@ -2420,7 +2296,7 @@ class UnbPessoaFormComponent {
|
|
|
2420
2296
|
});
|
|
2421
2297
|
}
|
|
2422
2298
|
validar(form) {
|
|
2423
|
-
if (!this.pessoa) {
|
|
2299
|
+
if (!this.config.pessoa) {
|
|
2424
2300
|
this.openSnackBar("Erro ao carregar objeto pessoa");
|
|
2425
2301
|
return false;
|
|
2426
2302
|
}
|
|
@@ -2430,40 +2306,40 @@ class UnbPessoaFormComponent {
|
|
|
2430
2306
|
this.openSnackBar("Por favor, preencha os campos obrigatórios.");
|
|
2431
2307
|
return false;
|
|
2432
2308
|
}
|
|
2433
|
-
if (this.pessoa.telefones == null || (this.pessoa.telefones != null && this.pessoa.telefones.length == 0)) {
|
|
2309
|
+
if (this.config.pessoa.telefones == null || (this.config.pessoa.telefones != null && this.config.pessoa.telefones.length == 0)) {
|
|
2434
2310
|
this.openSnackBar("Cadastre pelo menos um telefone no botão Cadastrar Novo Telefone");
|
|
2435
2311
|
return false;
|
|
2436
2312
|
}
|
|
2437
|
-
if (this.pessoa.enderecos == null || (this.pessoa.enderecos != null && this.pessoa.enderecos.length == 0)) {
|
|
2313
|
+
if (this.config.pessoa.enderecos == null || (this.config.pessoa.enderecos != null && this.config.pessoa.enderecos.length == 0)) {
|
|
2438
2314
|
this.openSnackBar("Cadastre pelo menos um endereço no botão Cadastrar Novo Endereço");
|
|
2439
2315
|
return false;
|
|
2440
2316
|
}
|
|
2441
|
-
if (this.pessoa.emails == null || (this.pessoa.emails != null && this.pessoa.emails.length == 0)) {
|
|
2317
|
+
if (this.config.pessoa.emails == null || (this.config.pessoa.emails != null && this.config.pessoa.emails.length == 0)) {
|
|
2442
2318
|
this.openSnackBar("Cadastre pelo menos um e-mail no botão Cadastrar Novo Email");
|
|
2443
2319
|
return false;
|
|
2444
2320
|
}
|
|
2445
|
-
if (this.pessoa.tipoPessoa == UnbTipoPessoaEnum.FISICA) {
|
|
2446
|
-
if (!this.pessoa.nome || (this.pessoa && this.pessoa.nome == "")) {
|
|
2321
|
+
if (this.config.pessoa.tipoPessoa == UnbTipoPessoaEnum.FISICA) {
|
|
2322
|
+
if (!this.config.pessoa.nome || (this.config.pessoa && this.config.pessoa.nome == "")) {
|
|
2447
2323
|
this.openSnackBar("Nome é um campo obrigatório");
|
|
2448
2324
|
return false;
|
|
2449
2325
|
}
|
|
2450
|
-
if (!this.pessoa.dataNascimento) {
|
|
2326
|
+
if (!this.config.pessoa.dataNascimento) {
|
|
2451
2327
|
this.openSnackBar("Data de Nascimento é um campo obrigatório");
|
|
2452
2328
|
return false;
|
|
2453
2329
|
}
|
|
2454
2330
|
}
|
|
2455
|
-
if (this.pessoa.tipoPessoa == UnbTipoPessoaEnum.ESTRANGEIRA) {
|
|
2456
|
-
if (!this.pessoa.nome || (this.pessoa && this.pessoa.nome == "")) {
|
|
2331
|
+
if (this.config.pessoa.tipoPessoa == UnbTipoPessoaEnum.ESTRANGEIRA) {
|
|
2332
|
+
if (!this.config.pessoa.nome || (this.config.pessoa && this.config.pessoa.nome == "")) {
|
|
2457
2333
|
this.openSnackBar("Nome é um campo obrigatório");
|
|
2458
2334
|
return false;
|
|
2459
2335
|
}
|
|
2460
|
-
if (this.pessoa.passaporte == null || (this.pessoa.passaporte != null && this.pessoa.passaporte == "")) {
|
|
2336
|
+
if (this.config.pessoa.passaporte == null || (this.config.pessoa.passaporte != null && this.config.pessoa.passaporte == "")) {
|
|
2461
2337
|
this.openSnackBar("Passaporte é um campo obrigatório");
|
|
2462
2338
|
return false;
|
|
2463
2339
|
}
|
|
2464
2340
|
}
|
|
2465
|
-
if (this.pessoa.tipoPessoa == UnbTipoPessoaEnum.JURIDICA) {
|
|
2466
|
-
if (this.pessoa.cnpj == null || (this.pessoa.cnpj != null && this.pessoa.cnpj == "")) {
|
|
2341
|
+
if (this.config.pessoa.tipoPessoa == UnbTipoPessoaEnum.JURIDICA) {
|
|
2342
|
+
if (this.config.pessoa.cnpj == null || (this.config.pessoa.cnpj != null && this.config.pessoa.cnpj == "")) {
|
|
2467
2343
|
this.openSnackBar("CNPJ é um campo obrigatório");
|
|
2468
2344
|
return false;
|
|
2469
2345
|
}
|
|
@@ -2471,13 +2347,284 @@ class UnbPessoaFormComponent {
|
|
|
2471
2347
|
return true;
|
|
2472
2348
|
}
|
|
2473
2349
|
telefonesEmitted(telefones) {
|
|
2474
|
-
this.pessoa.telefones = telefones;
|
|
2350
|
+
this.config.pessoa.telefones = telefones;
|
|
2475
2351
|
}
|
|
2476
2352
|
enderecosEmitted(enderecos) {
|
|
2477
|
-
this.pessoa.enderecos = enderecos;
|
|
2353
|
+
this.config.pessoa.enderecos = enderecos;
|
|
2478
2354
|
}
|
|
2479
2355
|
emailsEmitted(emails) {
|
|
2480
|
-
this.pessoa.emails = emails;
|
|
2356
|
+
this.config.pessoa.emails = emails;
|
|
2357
|
+
}
|
|
2358
|
+
openSnackBar(message) {
|
|
2359
|
+
this.snackBar.open(message, 'x', {
|
|
2360
|
+
duration: 5000,
|
|
2361
|
+
});
|
|
2362
|
+
}
|
|
2363
|
+
tipoPessoaEnum() {
|
|
2364
|
+
return UnbTipoPessoaEnum;
|
|
2365
|
+
}
|
|
2366
|
+
getListaEstados() {
|
|
2367
|
+
return listaEstados;
|
|
2368
|
+
}
|
|
2369
|
+
handleErrorPrintConsole(erro) {
|
|
2370
|
+
console.log(erro);
|
|
2371
|
+
this.handleError(erro);
|
|
2372
|
+
}
|
|
2373
|
+
handleError(erro) {
|
|
2374
|
+
this.isLoading = false;
|
|
2375
|
+
this.isLoadingChange.emit(false);
|
|
2376
|
+
// 1. Mostra a mensagem curta/simples no SnackBar (Fundo da tela)
|
|
2377
|
+
// Ex: "O formulário possui erros de validação." ou "Sessão expirada."
|
|
2378
|
+
if (erro.mensagemSimples) {
|
|
2379
|
+
this.openSnackBar(erro.mensagemSimples);
|
|
2380
|
+
}
|
|
2381
|
+
// 2. Mostra a mensagem detalhada HTML no componente <unb-mensagem>
|
|
2382
|
+
// Ex: Lista com <ul><li>Campo Data inválido...</li></ul>
|
|
2383
|
+
if (this.alertService && erro.mensagemHtml) {
|
|
2384
|
+
// Se o seu alertService suportar ID do componente alvo, passe aqui.
|
|
2385
|
+
// Caso contrário, ele mostra no componente padrão.
|
|
2386
|
+
this.alertService.showMessage(erro.mensagemHtml, UnbTipoMensagemEnum.DANGER, this.idMensagemService);
|
|
2387
|
+
}
|
|
2388
|
+
}
|
|
2389
|
+
getLabelDocumento() {
|
|
2390
|
+
switch (this.config.pessoa.tipoPessoa) {
|
|
2391
|
+
case this.tipoPessoaEnum().FISICA: return 'CPF';
|
|
2392
|
+
case this.tipoPessoaEnum().JURIDICA: return 'CNPJ';
|
|
2393
|
+
case this.tipoPessoaEnum().ESTRANGEIRA: return 'Passaporte';
|
|
2394
|
+
default: return 'Documento';
|
|
2395
|
+
}
|
|
2396
|
+
}
|
|
2397
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.1.2", ngImport: i0, type: UnbPessoaFormComponent, deps: [{ token: UnBPessoaService }, { token: i1$2.MatSnackBar }, { token: UnbMensagemService }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
2398
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.1.2", type: UnbPessoaFormComponent, selector: "lib-unb-pessoa-form", inputs: { config: "config", hideSalvarButton: "hideSalvarButton" }, outputs: { pessoaEmitted: "pessoaEmitted", isLoadingChange: "isLoadingChange" }, viewQueries: [{ propertyName: "pessoaForm", first: true, predicate: ["pessoaForm"], descendants: true }], ngImport: i0, template: "<mat-progress-bar *ngIf=\"isLoading\" mode=\"indeterminate\"></mat-progress-bar>\r\n\r\n<unb-mensagem [identificador]=\"idMensagemService\"></unb-mensagem>\r\n\r\n<!-- Label indicando que est\u00E1 incluindo nova pessoa -->\r\n<div *ngIf=\"documentoPesquisado\"\r\n class=\"status-banner\" \r\n [ngClass]=\"{\r\n 'status-inclusao': !pessoa.codigoPessoa,\r\n 'status-edicao': pessoa.codigoPessoa && !isReadyOnly,\r\n 'status-bloqueado': config.isReadyOnly\r\n }\">\r\n\r\n <mat-icon>\r\n {{ !pessoa.codigoPessoa ? 'person_add' : (isReadyOnly ? 'lock' : 'edit') }}\r\n </mat-icon>\r\n\r\n <span>\r\n <ng-container *ngIf=\"!pessoa.codigoPessoa\">Incluindo nova pessoa</ng-container>\r\n <ng-container *ngIf=\"pessoa.codigoPessoa && !isReadyOnly\">Editando pessoa</ng-container>\r\n <ng-container *ngIf=\"isReadyOnly\">Registro SIAPE (Visualiza\u00E7\u00E3o)</ng-container> com <strong>{{ getLabelDocumento() }} {{ documentoPesquisado }}</strong>\r\n </span>\r\n</div>\r\n\r\n<form #pessoaForm=\"ngForm\" [class.readonly]=\"isReadyOnly || isLoading\" class=\"form-container\" (ngSubmit)=\"salvar(pessoaForm)\">\r\n <!-- Campos Pessoa F\u00EDsica e Estrangeira -->\r\n <ng-container\r\n *ngIf=\"pessoa.tipoPessoa == tipoPessoaEnum().FISICA || pessoa.tipoPessoa == tipoPessoaEnum().ESTRANGEIRA\">\r\n <mat-form-field class=\"form-25\" appearance=\"outline\">\r\n <mat-label>Nome</mat-label>\r\n <input type=\"text\" matInput [(ngModel)]=\"pessoa.nome\" name=\"nome\" #nome=\"ngModel\" required />\r\n </mat-form-field>\r\n\r\n <mat-form-field class=\"form-20\" appearance=\"outline\">\r\n <mat-label>Sexo</mat-label>\r\n <mat-select [(ngModel)]=\"pessoa.codigoSexo\" name=\"codigoSexo\" #codigoSexo=\"ngModel\" required>\r\n <mat-option [value]=\"1\">Masculino</mat-option>\r\n <mat-option [value]=\"2\">Feminino</mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n\r\n <mat-form-field class=\"form-25\" appearance=\"outline\">\r\n <mat-label>Data Nascimento</mat-label>\r\n <input matInput [matDatepicker]=\"dataNascimentoPicker\" [(ngModel)]=\"pessoa.dataNascimento\" name=\"dataNascimento\"\r\n #dataNascimento=\"ngModel\" required>\r\n <mat-datepicker-toggle matSuffix [for]=\"dataNascimentoPicker\"></mat-datepicker-toggle>\r\n <mat-datepicker #dataNascimentoPicker></mat-datepicker>\r\n </mat-form-field>\r\n\r\n <mat-form-field class=\"form-20\" appearance=\"outline\">\r\n <mat-label>Estado Civil</mat-label>\r\n <mat-select [(ngModel)]=\"pessoa.codigoEstadoCivil\" name=\"codigoEstadoCivil\" #codigoEstadoCivil=\"ngModel\">\r\n <mat-option *ngFor=\"let estado of estadosCivil | async\" [value]=\"estado.codigo\">\r\n {{ estado.denominacao }}\r\n </mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n\r\n <!--\r\n <mat-form-field class=\"form-15\" appearance=\"outline\">\r\n <mat-label>Naturalidade</mat-label>\r\n <mat-select [(ngModel)]=\"pessoa.naturalidade\" name=\"naturalidade\" #naturalidade=\"ngModel\" required>\r\n <mat-option *ngFor=\"let cidade of getListaEstados()\" [value]=\"cidade.codigo\">\r\n {{ cidade.descricao }}\r\n </mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n -->\r\n <mat-form-field class=\"form-20\" appearance=\"outline\">\r\n <mat-label>Pa\u00EDs Nascimento</mat-label>\r\n <mat-select [(ngModel)]=\"pessoa.codigoPaisNascimento\" name=\"codigoPaisNascimento\" #codigoPaisNascimento=\"ngModel\"\r\n required>\r\n <mat-option *ngFor=\"let paisNascimento of paises | async\" [value]=\"paisNascimento.codigo\">\r\n <span *ngIf=\"paisNascimento.denominacao === 'BRASIL'\">\uD83C\uDDE7\uD83C\uDDF7 <b>{{ paisNascimento.denominacao }}</b></span>\r\n <span *ngIf=\"paisNascimento.denominacao !== 'BRASIL'\">{{ paisNascimento.denominacao }}</span>\r\n </mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n\r\n <mat-form-field class=\"form-20\" appearance=\"outline\" *ngIf=\"pessoa.codigoPaisNascimento == 22\"> <!-- 22 eh Brasil-->\r\n <mat-label>UF Nascimento</mat-label>\r\n <mat-select [(ngModel)]=\"pessoa.ufNascimento\" name=\"ufNascimento\" #ufNascimento=\"ngModel\" required>\r\n <mat-option *ngFor=\"let estado of getListaEstados()\" [value]=\"estado.identificador\">\r\n {{ estado.identificador }}\r\n </mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n\r\n <mat-form-field class=\"form-20\" appearance=\"outline\" *ngIf=\"pessoa.codigoPaisNascimento == 22\">\r\n <mat-label>Naturalidade</mat-label>\r\n <input type=\"text\" matInput [(ngModel)]=\"pessoa.naturalidade\" name=\"naturalidade\" #naturalidade=\"ngModel\"\r\n required />\r\n </mat-form-field>\r\n\r\n <mat-form-field class=\"form-20\" appearance=\"outline\">\r\n <mat-label>Escolaridade</mat-label>\r\n <mat-select [(ngModel)]=\"pessoa.escolaridade\" name=\"codigoEscolaridade\" #codigoEscolaridade=\"ngModel\" required>\r\n <mat-option *ngFor=\"let escolaridade of escolaridade | async\" [value]=\"escolaridade.codigo\">\r\n {{ escolaridade.denominacao }}\r\n </mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n\r\n <mat-form-field class=\"form-25\" appearance=\"outline\">\r\n <mat-label>Nome Social</mat-label>\r\n <input type=\"text\" matInput [(ngModel)]=\"pessoa.nomeSocial\" name=\"nomeSocial\" #nomeSocial=\"ngModel\" />\r\n </mat-form-field>\r\n\r\n <mat-form-field class=\"form-25\" appearance=\"outline\">\r\n <mat-label>Nome da M\u00E3e</mat-label>\r\n <input type=\"text\" matInput [(ngModel)]=\"pessoa.nomeMae\" name=\"nomeMae\" #nomeMae=\"ngModel\" required />\r\n </mat-form-field>\r\n\r\n <mat-form-field class=\"form-25\" appearance=\"outline\">\r\n <mat-label>Nome do Pai</mat-label>\r\n <input type=\"text\" matInput [(ngModel)]=\"pessoa.nomePai\" name=\"nomePai\" #nomePai=\"ngModel\" required />\r\n </mat-form-field>\r\n </ng-container>\r\n\r\n <!-- Campos Pessoa Jur\u00EDdica -->\r\n <ng-container *ngIf=\"pessoa.tipoPessoa === tipoPessoaEnum().JURIDICA\">\r\n <mat-form-field class=\"form-25\" appearance=\"outline\">\r\n <mat-label>Raz\u00E3o Social</mat-label>\r\n <input type=\"text\" matInput [(ngModel)]=\"pessoa.razaoSocial\" name=\"razaoSocial\" />\r\n </mat-form-field>\r\n <mat-form-field class=\"form-25\" appearance=\"outline\">\r\n <mat-label>Nome Fantasia</mat-label>\r\n <input type=\"text\" matInput [(ngModel)]=\"pessoa.nomeFantasia\" name=\"nomeFantasia\" />\r\n </mat-form-field>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"pessoa.tipoPessoa == tipoPessoaEnum().FISICA\">\r\n <b style=\"flex: 1 1 100%; margin-bottom: 10px;\">Documenta\u00E7\u00E3o</b>\r\n\r\n <mat-form-field class=\"form-25\" appearance=\"outline\">\r\n <mat-label>Identidade</mat-label>\r\n <input type=\"text\" matInput [(ngModel)]=\"pessoa.rg\" name=\"rg\" #rg=\"ngModel\" required />\r\n </mat-form-field>\r\n\r\n <mat-form-field class=\"form-25\" appearance=\"outline\">\r\n <mat-label>\u00D3rg\u00E3o Emissor</mat-label>\r\n <input type=\"text\" matInput [(ngModel)]=\"pessoa.rgOrgao\" name=\"rgOrgao\" #rgOrgao=\"ngModel\" required />\r\n </mat-form-field>\r\n\r\n <mat-form-field class=\"form-25\" appearance=\"outline\">\r\n <mat-label>Unidade Federativa</mat-label>\r\n <mat-select [(ngModel)]=\"pessoa.rgUf\" name=\"rgUf\" #rgUf=\"ngModel\" required>\r\n <mat-option *ngFor=\"let estado of getListaEstados()\" [value]=\"estado.identificador\">\r\n {{ estado.identificador }}\r\n </mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n\r\n <mat-form-field class=\"form-20\" appearance=\"outline\">\r\n <mat-label>Data de Emiss\u00E3o</mat-label>\r\n <input type=\"text\" matInput [(ngModel)]=\"pessoa.rgDataEmissao\" name=\"rgDataEmissao\" #rgDataEmissao=\"ngModel\" />\r\n </mat-form-field>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"pessoa.tipoPessoa != tipoPessoaEnum().JURIDICA && (pessoa.tipoPessoa == tipoPessoaEnum().ESTRANGEIRA || pessoa.codigoPaisNascimento != 22)\">\r\n <mat-form-field appearance=\"outline\">\r\n <mat-label>Data Chegada Brasil</mat-label>\r\n <input matInput [matDatepicker]=\"dataChegadaBrasilPicker\" [(ngModel)]=\"pessoa.dataChegadaBrasil\"\r\n name=\"dataChegadaBrasil\" #dataChegadaBrasil=\"ngModel\" required>\r\n <mat-datepicker-toggle matSuffix [for]=\"dataChegadaBrasilPicker\"></mat-datepicker-toggle>\r\n <mat-datepicker #dataChegadaBrasilPicker></mat-datepicker>\r\n </mat-form-field>\r\n\r\n <mat-form-field class=\"form-10\" appearance=\"outline\">\r\n <mat-label>Pa\u00EDs Passaporte</mat-label>\r\n <mat-select [(ngModel)]=\"pessoa.codigoPaisPassaporte\" name=\"codigoPaisPassaporte\" #codigoPaisPassaporte=\"ngModel\"\r\n required>\r\n <mat-option *ngFor=\"let paisNascimento of paises | async\" [value]=\"paisNascimento.codigo\">\r\n {{ paisNascimento.denominacao }}\r\n </mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n\r\n <mat-form-field appearance=\"outline\">\r\n <mat-label>N\u00FAmero Passaporte</mat-label>\r\n <input type=\"text\" matInput [(ngModel)]=\"pessoa.passaporte\" name=\"passaporte\" #passaporte=\"ngModel\" required />\r\n </mat-form-field>\r\n </ng-container>\r\n\r\n <lib-unb-pessoa-telefone-list style=\"flex: 1 1 100%;\" [backendURL]=\"config.backendURL\" [telefones]=\"pessoa.telefones\"\r\n (telefonesEmitted)=\"telefonesEmitted($event)\"></lib-unb-pessoa-telefone-list>\r\n\r\n <lib-unb-pessoa-endereco-list style=\"flex: 1 1 100%;\" [backendURL]=\"config.backendURL\" [enderecos]=\"pessoa.enderecos\"\r\n (enderecosEmitted)=\"enderecosEmitted($event)\"></lib-unb-pessoa-endereco-list>\r\n\r\n <lib-unb-pessoa-email-list style=\"flex: 1 1 100%;\" [backendURL]=\"config.backendURL\" [emails]=\"pessoa.emails\"\r\n (emailsEmitted)=\"emailsEmitted($event)\"></lib-unb-pessoa-email-list>\r\n\r\n <div *ngIf=\"isReadyOnly\" style=\"flex:1 1 100%; margin-bottom:10px;\">\r\n <mat-card>\r\n <mat-card-content>\r\n <strong>Servidor com matr\u00EDcula SIAPE deve ter seus dados autalizados pelo aplicativo do sougov</strong>\r\n </mat-card-content>\r\n </mat-card>\r\n </div>\r\n\r\n <mat-card-actions class=\"card-actions-buttons\" *ngIf=\"!hideSalvarButton\">\r\n <button mat-flat-button [disabled]=\"isLoading || isReadyOnly\" type=\"submit\" color=\"primary\">\r\n Salvar\r\n </button>\r\n </mat-card-actions>\r\n\r\n</form>", styles: [".card-actions-buttons{display:flex;gap:5px;flex-wrap:wrap}.form-container{display:flex;flex-wrap:wrap;column-gap:10px;margin-top:5px}:host{display:block}@media (max-width: 1000px){.form-container{flex-direction:column;gap:5px}}.break{flex-basis:100%;height:0}.form-5{flex:1 1 5%}.inline-table-container{display:flex;align-items:center;justify-content:space-between;padding:5px}@media (max-width: 600px){.form-5,.form-10,.form-15{flex:1 1 100%}}.form-10{flex:1 1 10%}.form-15{flex:1 1 15%}.form-20{flex:1 1 20%}.form-25{flex:1 1 25%}.form-30{flex:1 1 30%}.form-35{flex:1 1 35%}.form-40{flex:1 1 40%}.form-45{flex:1 1 45%}.form-50{flex:1 1 50%}.form-100{flex:1 1 100%;min-width:250px}.readonly{pointer-events:none;opacity:.6}.disabled-wrapper{pointer-events:none;opacity:.6;filter:grayscale(1)}.status-banner{display:flex;align-items:center;gap:8px;padding:10px 16px;margin:2px 0 20px;border-radius:6px;font-size:14px;font-weight:500}.status-banner.status-inclusao{background-color:#e3f2fd;color:#1565c0;border:1px solid #bbdefb}.status-banner.status-edicao{background-color:#fff3e0;color:#ef6c00;border:1px solid #ffe0b2}.status-banner.status-bloqueado{background-color:#fce4ec;color:#c2185b;border:1px solid #f8bbd0}\n"], dependencies: [{ kind: "directive", type: i4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i6.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i6.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i6.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i6.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i6.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i6.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i6.NgForm, selector: "form:not([ngNoForm]):not([formGroup]),ng-form,[ngForm]", inputs: ["ngFormOptions"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "component", type: i5.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i7.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "component", type: UnbMensagemComponent, selector: "unb-mensagem", inputs: ["mensagem", "tipo", "identificador"] }, { kind: "component", type: i7$1.MatCard, selector: "mat-card", inputs: ["appearance"], exportAs: ["matCard"] }, { kind: "directive", type: i7$1.MatCardActions, selector: "mat-card-actions", inputs: ["align"], exportAs: ["matCardActions"] }, { kind: "directive", type: i7$1.MatCardContent, selector: "mat-card-content" }, { kind: "component", type: i9.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i9.MatLabel, selector: "mat-label" }, { kind: "directive", type: i9.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "directive", type: i10.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "component", type: i11.MatSelect, selector: "mat-select", inputs: ["aria-describedby", "panelClass", "disabled", "disableRipple", "tabIndex", "hideSingleSelectionIndicator", "placeholder", "required", "multiple", "disableOptionCentering", "compareWith", "value", "aria-label", "aria-labelledby", "errorStateMatcher", "typeaheadDebounceInterval", "sortComparator", "id", "panelWidth"], outputs: ["openedChange", "opened", "closed", "selectionChange", "valueChange"], exportAs: ["matSelect"] }, { kind: "component", type: i12.MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }, { kind: "component", type: i14$1.MatProgressBar, selector: "mat-progress-bar", inputs: ["color", "value", "bufferValue", "mode"], outputs: ["animationEnd"], exportAs: ["matProgressBar"] }, { kind: "component", type: i15.MatDatepicker, selector: "mat-datepicker", exportAs: ["matDatepicker"] }, { kind: "directive", type: i15.MatDatepickerInput, selector: "input[matDatepicker]", inputs: ["matDatepicker", "min", "max", "matDatepickerFilter"], exportAs: ["matDatepickerInput"] }, { kind: "component", type: i15.MatDatepickerToggle, selector: "mat-datepicker-toggle", inputs: ["for", "tabIndex", "aria-label", "disabled", "disableRipple"], exportAs: ["matDatepickerToggle"] }, { kind: "component", type: UnbPessoaTelefoneListComponent, selector: "lib-unb-pessoa-telefone-list", inputs: ["podeEditar", "telefones", "backendURL"], outputs: ["telefonesEmitted"] }, { kind: "component", type: UnbPessoaenderecoListComponent, selector: "lib-unb-pessoa-endereco-list", inputs: ["podeEditar", "enderecos", "backendURL"], outputs: ["enderecosEmitted"] }, { kind: "component", type: UnbPessoaEmailListComponent, selector: "lib-unb-pessoa-email-list", inputs: ["podeEditar", "emails", "backendURL"], outputs: ["emailsEmitted"] }, { kind: "pipe", type: i4.AsyncPipe, name: "async" }] }); }
|
|
2399
|
+
}
|
|
2400
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.2", ngImport: i0, type: UnbPessoaFormComponent, decorators: [{
|
|
2401
|
+
type: Component,
|
|
2402
|
+
args: [{ selector: 'lib-unb-pessoa-form', standalone: false, template: "<mat-progress-bar *ngIf=\"isLoading\" mode=\"indeterminate\"></mat-progress-bar>\r\n\r\n<unb-mensagem [identificador]=\"idMensagemService\"></unb-mensagem>\r\n\r\n<!-- Label indicando que est\u00E1 incluindo nova pessoa -->\r\n<div *ngIf=\"documentoPesquisado\"\r\n class=\"status-banner\" \r\n [ngClass]=\"{\r\n 'status-inclusao': !pessoa.codigoPessoa,\r\n 'status-edicao': pessoa.codigoPessoa && !isReadyOnly,\r\n 'status-bloqueado': config.isReadyOnly\r\n }\">\r\n\r\n <mat-icon>\r\n {{ !pessoa.codigoPessoa ? 'person_add' : (isReadyOnly ? 'lock' : 'edit') }}\r\n </mat-icon>\r\n\r\n <span>\r\n <ng-container *ngIf=\"!pessoa.codigoPessoa\">Incluindo nova pessoa</ng-container>\r\n <ng-container *ngIf=\"pessoa.codigoPessoa && !isReadyOnly\">Editando pessoa</ng-container>\r\n <ng-container *ngIf=\"isReadyOnly\">Registro SIAPE (Visualiza\u00E7\u00E3o)</ng-container> com <strong>{{ getLabelDocumento() }} {{ documentoPesquisado }}</strong>\r\n </span>\r\n</div>\r\n\r\n<form #pessoaForm=\"ngForm\" [class.readonly]=\"isReadyOnly || isLoading\" class=\"form-container\" (ngSubmit)=\"salvar(pessoaForm)\">\r\n <!-- Campos Pessoa F\u00EDsica e Estrangeira -->\r\n <ng-container\r\n *ngIf=\"pessoa.tipoPessoa == tipoPessoaEnum().FISICA || pessoa.tipoPessoa == tipoPessoaEnum().ESTRANGEIRA\">\r\n <mat-form-field class=\"form-25\" appearance=\"outline\">\r\n <mat-label>Nome</mat-label>\r\n <input type=\"text\" matInput [(ngModel)]=\"pessoa.nome\" name=\"nome\" #nome=\"ngModel\" required />\r\n </mat-form-field>\r\n\r\n <mat-form-field class=\"form-20\" appearance=\"outline\">\r\n <mat-label>Sexo</mat-label>\r\n <mat-select [(ngModel)]=\"pessoa.codigoSexo\" name=\"codigoSexo\" #codigoSexo=\"ngModel\" required>\r\n <mat-option [value]=\"1\">Masculino</mat-option>\r\n <mat-option [value]=\"2\">Feminino</mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n\r\n <mat-form-field class=\"form-25\" appearance=\"outline\">\r\n <mat-label>Data Nascimento</mat-label>\r\n <input matInput [matDatepicker]=\"dataNascimentoPicker\" [(ngModel)]=\"pessoa.dataNascimento\" name=\"dataNascimento\"\r\n #dataNascimento=\"ngModel\" required>\r\n <mat-datepicker-toggle matSuffix [for]=\"dataNascimentoPicker\"></mat-datepicker-toggle>\r\n <mat-datepicker #dataNascimentoPicker></mat-datepicker>\r\n </mat-form-field>\r\n\r\n <mat-form-field class=\"form-20\" appearance=\"outline\">\r\n <mat-label>Estado Civil</mat-label>\r\n <mat-select [(ngModel)]=\"pessoa.codigoEstadoCivil\" name=\"codigoEstadoCivil\" #codigoEstadoCivil=\"ngModel\">\r\n <mat-option *ngFor=\"let estado of estadosCivil | async\" [value]=\"estado.codigo\">\r\n {{ estado.denominacao }}\r\n </mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n\r\n <!--\r\n <mat-form-field class=\"form-15\" appearance=\"outline\">\r\n <mat-label>Naturalidade</mat-label>\r\n <mat-select [(ngModel)]=\"pessoa.naturalidade\" name=\"naturalidade\" #naturalidade=\"ngModel\" required>\r\n <mat-option *ngFor=\"let cidade of getListaEstados()\" [value]=\"cidade.codigo\">\r\n {{ cidade.descricao }}\r\n </mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n -->\r\n <mat-form-field class=\"form-20\" appearance=\"outline\">\r\n <mat-label>Pa\u00EDs Nascimento</mat-label>\r\n <mat-select [(ngModel)]=\"pessoa.codigoPaisNascimento\" name=\"codigoPaisNascimento\" #codigoPaisNascimento=\"ngModel\"\r\n required>\r\n <mat-option *ngFor=\"let paisNascimento of paises | async\" [value]=\"paisNascimento.codigo\">\r\n <span *ngIf=\"paisNascimento.denominacao === 'BRASIL'\">\uD83C\uDDE7\uD83C\uDDF7 <b>{{ paisNascimento.denominacao }}</b></span>\r\n <span *ngIf=\"paisNascimento.denominacao !== 'BRASIL'\">{{ paisNascimento.denominacao }}</span>\r\n </mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n\r\n <mat-form-field class=\"form-20\" appearance=\"outline\" *ngIf=\"pessoa.codigoPaisNascimento == 22\"> <!-- 22 eh Brasil-->\r\n <mat-label>UF Nascimento</mat-label>\r\n <mat-select [(ngModel)]=\"pessoa.ufNascimento\" name=\"ufNascimento\" #ufNascimento=\"ngModel\" required>\r\n <mat-option *ngFor=\"let estado of getListaEstados()\" [value]=\"estado.identificador\">\r\n {{ estado.identificador }}\r\n </mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n\r\n <mat-form-field class=\"form-20\" appearance=\"outline\" *ngIf=\"pessoa.codigoPaisNascimento == 22\">\r\n <mat-label>Naturalidade</mat-label>\r\n <input type=\"text\" matInput [(ngModel)]=\"pessoa.naturalidade\" name=\"naturalidade\" #naturalidade=\"ngModel\"\r\n required />\r\n </mat-form-field>\r\n\r\n <mat-form-field class=\"form-20\" appearance=\"outline\">\r\n <mat-label>Escolaridade</mat-label>\r\n <mat-select [(ngModel)]=\"pessoa.escolaridade\" name=\"codigoEscolaridade\" #codigoEscolaridade=\"ngModel\" required>\r\n <mat-option *ngFor=\"let escolaridade of escolaridade | async\" [value]=\"escolaridade.codigo\">\r\n {{ escolaridade.denominacao }}\r\n </mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n\r\n <mat-form-field class=\"form-25\" appearance=\"outline\">\r\n <mat-label>Nome Social</mat-label>\r\n <input type=\"text\" matInput [(ngModel)]=\"pessoa.nomeSocial\" name=\"nomeSocial\" #nomeSocial=\"ngModel\" />\r\n </mat-form-field>\r\n\r\n <mat-form-field class=\"form-25\" appearance=\"outline\">\r\n <mat-label>Nome da M\u00E3e</mat-label>\r\n <input type=\"text\" matInput [(ngModel)]=\"pessoa.nomeMae\" name=\"nomeMae\" #nomeMae=\"ngModel\" required />\r\n </mat-form-field>\r\n\r\n <mat-form-field class=\"form-25\" appearance=\"outline\">\r\n <mat-label>Nome do Pai</mat-label>\r\n <input type=\"text\" matInput [(ngModel)]=\"pessoa.nomePai\" name=\"nomePai\" #nomePai=\"ngModel\" required />\r\n </mat-form-field>\r\n </ng-container>\r\n\r\n <!-- Campos Pessoa Jur\u00EDdica -->\r\n <ng-container *ngIf=\"pessoa.tipoPessoa === tipoPessoaEnum().JURIDICA\">\r\n <mat-form-field class=\"form-25\" appearance=\"outline\">\r\n <mat-label>Raz\u00E3o Social</mat-label>\r\n <input type=\"text\" matInput [(ngModel)]=\"pessoa.razaoSocial\" name=\"razaoSocial\" />\r\n </mat-form-field>\r\n <mat-form-field class=\"form-25\" appearance=\"outline\">\r\n <mat-label>Nome Fantasia</mat-label>\r\n <input type=\"text\" matInput [(ngModel)]=\"pessoa.nomeFantasia\" name=\"nomeFantasia\" />\r\n </mat-form-field>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"pessoa.tipoPessoa == tipoPessoaEnum().FISICA\">\r\n <b style=\"flex: 1 1 100%; margin-bottom: 10px;\">Documenta\u00E7\u00E3o</b>\r\n\r\n <mat-form-field class=\"form-25\" appearance=\"outline\">\r\n <mat-label>Identidade</mat-label>\r\n <input type=\"text\" matInput [(ngModel)]=\"pessoa.rg\" name=\"rg\" #rg=\"ngModel\" required />\r\n </mat-form-field>\r\n\r\n <mat-form-field class=\"form-25\" appearance=\"outline\">\r\n <mat-label>\u00D3rg\u00E3o Emissor</mat-label>\r\n <input type=\"text\" matInput [(ngModel)]=\"pessoa.rgOrgao\" name=\"rgOrgao\" #rgOrgao=\"ngModel\" required />\r\n </mat-form-field>\r\n\r\n <mat-form-field class=\"form-25\" appearance=\"outline\">\r\n <mat-label>Unidade Federativa</mat-label>\r\n <mat-select [(ngModel)]=\"pessoa.rgUf\" name=\"rgUf\" #rgUf=\"ngModel\" required>\r\n <mat-option *ngFor=\"let estado of getListaEstados()\" [value]=\"estado.identificador\">\r\n {{ estado.identificador }}\r\n </mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n\r\n <mat-form-field class=\"form-20\" appearance=\"outline\">\r\n <mat-label>Data de Emiss\u00E3o</mat-label>\r\n <input type=\"text\" matInput [(ngModel)]=\"pessoa.rgDataEmissao\" name=\"rgDataEmissao\" #rgDataEmissao=\"ngModel\" />\r\n </mat-form-field>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"pessoa.tipoPessoa != tipoPessoaEnum().JURIDICA && (pessoa.tipoPessoa == tipoPessoaEnum().ESTRANGEIRA || pessoa.codigoPaisNascimento != 22)\">\r\n <mat-form-field appearance=\"outline\">\r\n <mat-label>Data Chegada Brasil</mat-label>\r\n <input matInput [matDatepicker]=\"dataChegadaBrasilPicker\" [(ngModel)]=\"pessoa.dataChegadaBrasil\"\r\n name=\"dataChegadaBrasil\" #dataChegadaBrasil=\"ngModel\" required>\r\n <mat-datepicker-toggle matSuffix [for]=\"dataChegadaBrasilPicker\"></mat-datepicker-toggle>\r\n <mat-datepicker #dataChegadaBrasilPicker></mat-datepicker>\r\n </mat-form-field>\r\n\r\n <mat-form-field class=\"form-10\" appearance=\"outline\">\r\n <mat-label>Pa\u00EDs Passaporte</mat-label>\r\n <mat-select [(ngModel)]=\"pessoa.codigoPaisPassaporte\" name=\"codigoPaisPassaporte\" #codigoPaisPassaporte=\"ngModel\"\r\n required>\r\n <mat-option *ngFor=\"let paisNascimento of paises | async\" [value]=\"paisNascimento.codigo\">\r\n {{ paisNascimento.denominacao }}\r\n </mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n\r\n <mat-form-field appearance=\"outline\">\r\n <mat-label>N\u00FAmero Passaporte</mat-label>\r\n <input type=\"text\" matInput [(ngModel)]=\"pessoa.passaporte\" name=\"passaporte\" #passaporte=\"ngModel\" required />\r\n </mat-form-field>\r\n </ng-container>\r\n\r\n <lib-unb-pessoa-telefone-list style=\"flex: 1 1 100%;\" [backendURL]=\"config.backendURL\" [telefones]=\"pessoa.telefones\"\r\n (telefonesEmitted)=\"telefonesEmitted($event)\"></lib-unb-pessoa-telefone-list>\r\n\r\n <lib-unb-pessoa-endereco-list style=\"flex: 1 1 100%;\" [backendURL]=\"config.backendURL\" [enderecos]=\"pessoa.enderecos\"\r\n (enderecosEmitted)=\"enderecosEmitted($event)\"></lib-unb-pessoa-endereco-list>\r\n\r\n <lib-unb-pessoa-email-list style=\"flex: 1 1 100%;\" [backendURL]=\"config.backendURL\" [emails]=\"pessoa.emails\"\r\n (emailsEmitted)=\"emailsEmitted($event)\"></lib-unb-pessoa-email-list>\r\n\r\n <div *ngIf=\"isReadyOnly\" style=\"flex:1 1 100%; margin-bottom:10px;\">\r\n <mat-card>\r\n <mat-card-content>\r\n <strong>Servidor com matr\u00EDcula SIAPE deve ter seus dados autalizados pelo aplicativo do sougov</strong>\r\n </mat-card-content>\r\n </mat-card>\r\n </div>\r\n\r\n <mat-card-actions class=\"card-actions-buttons\" *ngIf=\"!hideSalvarButton\">\r\n <button mat-flat-button [disabled]=\"isLoading || isReadyOnly\" type=\"submit\" color=\"primary\">\r\n Salvar\r\n </button>\r\n </mat-card-actions>\r\n\r\n</form>", styles: [".card-actions-buttons{display:flex;gap:5px;flex-wrap:wrap}.form-container{display:flex;flex-wrap:wrap;column-gap:10px;margin-top:5px}:host{display:block}@media (max-width: 1000px){.form-container{flex-direction:column;gap:5px}}.break{flex-basis:100%;height:0}.form-5{flex:1 1 5%}.inline-table-container{display:flex;align-items:center;justify-content:space-between;padding:5px}@media (max-width: 600px){.form-5,.form-10,.form-15{flex:1 1 100%}}.form-10{flex:1 1 10%}.form-15{flex:1 1 15%}.form-20{flex:1 1 20%}.form-25{flex:1 1 25%}.form-30{flex:1 1 30%}.form-35{flex:1 1 35%}.form-40{flex:1 1 40%}.form-45{flex:1 1 45%}.form-50{flex:1 1 50%}.form-100{flex:1 1 100%;min-width:250px}.readonly{pointer-events:none;opacity:.6}.disabled-wrapper{pointer-events:none;opacity:.6;filter:grayscale(1)}.status-banner{display:flex;align-items:center;gap:8px;padding:10px 16px;margin:2px 0 20px;border-radius:6px;font-size:14px;font-weight:500}.status-banner.status-inclusao{background-color:#e3f2fd;color:#1565c0;border:1px solid #bbdefb}.status-banner.status-edicao{background-color:#fff3e0;color:#ef6c00;border:1px solid #ffe0b2}.status-banner.status-bloqueado{background-color:#fce4ec;color:#c2185b;border:1px solid #f8bbd0}\n"] }]
|
|
2403
|
+
}], ctorParameters: () => [{ type: UnBPessoaService }, { type: i1$2.MatSnackBar }, { type: UnbMensagemService }], propDecorators: { pessoaForm: [{
|
|
2404
|
+
type: ViewChild,
|
|
2405
|
+
args: ['pessoaForm']
|
|
2406
|
+
}], config: [{
|
|
2407
|
+
type: Input
|
|
2408
|
+
}], hideSalvarButton: [{
|
|
2409
|
+
type: Input
|
|
2410
|
+
}], pessoaEmitted: [{
|
|
2411
|
+
type: Output
|
|
2412
|
+
}], isLoadingChange: [{
|
|
2413
|
+
type: Output
|
|
2414
|
+
}] } });
|
|
2415
|
+
|
|
2416
|
+
class UnbPessoaPesquisarComponent {
|
|
2417
|
+
constructor(pessoaService, snackBar, alertService) {
|
|
2418
|
+
this.pessoaService = pessoaService;
|
|
2419
|
+
this.snackBar = snackBar;
|
|
2420
|
+
this.alertService = alertService;
|
|
2421
|
+
this.isLoading = false;
|
|
2422
|
+
this.pessoa = new UnbPessoaModel();
|
|
2423
|
+
// Configuração do componente
|
|
2424
|
+
this.config = new UnbPessoaPesquisaConfig();
|
|
2425
|
+
this.pessoaEmitted = new EventEmitter();
|
|
2426
|
+
this.isLoadingChange = new EventEmitter();
|
|
2427
|
+
this.pessoaEncontrado = false;
|
|
2428
|
+
this.listaTipoEndereco = [];
|
|
2429
|
+
this.listaTipoTelefone = [];
|
|
2430
|
+
this.listaTipoEmail = [];
|
|
2431
|
+
this.idMensagemService = "UnbPessoaPesquisar";
|
|
2432
|
+
}
|
|
2433
|
+
ngOnInit() {
|
|
2434
|
+
// 1. Validação de Inicialização da API
|
|
2435
|
+
if (!this.config.backendURL) {
|
|
2436
|
+
this.handleErrorPrintConsole("[UnbPessoaPesquisarComponent] ERROR: backendURL está null.");
|
|
2437
|
+
return;
|
|
2438
|
+
}
|
|
2439
|
+
this.pessoaService.setBackendUrl(this.config.backendURL);
|
|
2440
|
+
if (this.config.token) {
|
|
2441
|
+
this.pessoaService.setToken(this.config.token);
|
|
2442
|
+
}
|
|
2443
|
+
// 2. Carregamento de Dados de Apoio
|
|
2444
|
+
forkJoin({
|
|
2445
|
+
tiposEnd: this.pessoaService.getTipoEndereco(),
|
|
2446
|
+
tiposTel: this.pessoaService.getTipoTelefone(),
|
|
2447
|
+
tiposEmail: this.pessoaService.getTipoEmail()
|
|
2448
|
+
}).subscribe({
|
|
2449
|
+
next: ({ tiposEnd, tiposTel, tiposEmail }) => {
|
|
2450
|
+
this.listaTipoEndereco = tiposEnd;
|
|
2451
|
+
this.listaTipoTelefone = tiposTel;
|
|
2452
|
+
this.listaTipoEmail = tiposEmail;
|
|
2453
|
+
},
|
|
2454
|
+
error: (err) => {
|
|
2455
|
+
this.handleError("Falha ao carregar dados de apoio. Recarregue a página.");
|
|
2456
|
+
console.error("Erro no forkJoin:", err);
|
|
2457
|
+
}
|
|
2458
|
+
});
|
|
2459
|
+
// 3. Definição da Lógica de Exibição e Tipo Padrão
|
|
2460
|
+
const opcoesAtivas = [this.config.pesquisarPorCPF, this.config.pesquisarPorCNPJ, this.config.pesquisarPorEstrangeiro].filter(v => v).length;
|
|
2461
|
+
// Só mostra o rádio se houver escolha real (mais de uma opção ativa)
|
|
2462
|
+
this.mostrarTipoPessoa = opcoesAtivas > 1;
|
|
2463
|
+
if (opcoesAtivas === 0) {
|
|
2464
|
+
this.handleErrorPrintConsole("[UnbPessoaPesquisarComponent] ERROR: Nenhuma opção de pesquisa (CPF/CNPJ/Estrangeiro) está ativa.");
|
|
2465
|
+
return;
|
|
2466
|
+
}
|
|
2467
|
+
// 4. Atribuição do Tipo Inicial (Ordem de prioridade: Valor padrão -> Opção Única -> CPF)
|
|
2468
|
+
this.definirTipoPessoaInicial();
|
|
2469
|
+
}
|
|
2470
|
+
/**
|
|
2471
|
+
* Define qual tipo de pessoa estará selecionado ao carregar o componente
|
|
2472
|
+
*/
|
|
2473
|
+
definirTipoPessoaInicial() {
|
|
2474
|
+
// Verifica se o padrão passado é permitido pelas flags de pesquisa
|
|
2475
|
+
const padraoEhValido = (this.config.defaultTipoPessoa === UnbTipoPessoaEnum.FISICA && this.config.pesquisarPorCPF) ||
|
|
2476
|
+
(this.config.defaultTipoPessoa === UnbTipoPessoaEnum.JURIDICA && this.config.pesquisarPorCNPJ) ||
|
|
2477
|
+
(this.config.defaultTipoPessoa === UnbTipoPessoaEnum.ESTRANGEIRA && this.config.pesquisarPorEstrangeiro);
|
|
2478
|
+
if (padraoEhValido) {
|
|
2479
|
+
// Como o valor da string é igual ao valor do Enum, a atribuição é direta
|
|
2480
|
+
this.pessoa.tipoPessoa = this.config.defaultTipoPessoa;
|
|
2481
|
+
}
|
|
2482
|
+
else {
|
|
2483
|
+
if (this.config.defaultTipoPessoa) {
|
|
2484
|
+
console.warn(`[UnbPessoaPesquisar] O valor defaultTipoPessoa='${this.config.defaultTipoPessoa}' é incompatível com as opções de pesquisa ativas. Selecionando a primeira disponível.`);
|
|
2485
|
+
}
|
|
2486
|
+
// Fallback para a primeira opção ativa
|
|
2487
|
+
if (this.config.pesquisarPorCPF) {
|
|
2488
|
+
this.pessoa.tipoPessoa = UnbTipoPessoaEnum.FISICA;
|
|
2489
|
+
}
|
|
2490
|
+
else if (this.config.pesquisarPorCNPJ) {
|
|
2491
|
+
this.pessoa.tipoPessoa = UnbTipoPessoaEnum.JURIDICA;
|
|
2492
|
+
}
|
|
2493
|
+
else if (this.config.pesquisarPorEstrangeiro) {
|
|
2494
|
+
this.pessoa.tipoPessoa = UnbTipoPessoaEnum.ESTRANGEIRA;
|
|
2495
|
+
}
|
|
2496
|
+
}
|
|
2497
|
+
}
|
|
2498
|
+
onTipoPessoaChange() {
|
|
2499
|
+
// Cria uma nova pessoa limpa com o tipo selecionado
|
|
2500
|
+
const novaPessoa = new UnbPessoaModel();
|
|
2501
|
+
novaPessoa.tipoPessoa = this.pessoa.tipoPessoa;
|
|
2502
|
+
// Inicializa arrays vazios
|
|
2503
|
+
novaPessoa.telefones = [];
|
|
2504
|
+
novaPessoa.enderecos = [];
|
|
2505
|
+
novaPessoa.emails = [];
|
|
2506
|
+
// Substitui a pessoa atual
|
|
2507
|
+
this.pessoa = novaPessoa;
|
|
2508
|
+
// Emite a nova pessoa limpa para o componente pai (form)
|
|
2509
|
+
this.pessoaEmitted.emit(this.pessoa);
|
|
2510
|
+
}
|
|
2511
|
+
pesquisar() {
|
|
2512
|
+
if (this.validar() == false)
|
|
2513
|
+
return;
|
|
2514
|
+
this.isLoading = true;
|
|
2515
|
+
this.isLoadingChange.emit(true);
|
|
2516
|
+
let result;
|
|
2517
|
+
if (this.pessoa.tipoPessoa == UnbTipoPessoaEnum.FISICA) {
|
|
2518
|
+
let cpf = this.pessoa.cpf.match(/\d/g)?.join(""); // remove caracteres
|
|
2519
|
+
result = this.pessoaService.findByCpf(cpf);
|
|
2520
|
+
}
|
|
2521
|
+
else if (this.pessoa.tipoPessoa == UnbTipoPessoaEnum.JURIDICA) {
|
|
2522
|
+
let cnpj = this.pessoa.cnpj.match(/\d/g)?.join(""); // remove caracteres
|
|
2523
|
+
result = this.pessoaService.findByCnpj(cnpj);
|
|
2524
|
+
}
|
|
2525
|
+
else if (this.pessoa.tipoPessoa == UnbTipoPessoaEnum.ESTRANGEIRA) {
|
|
2526
|
+
result = this.pessoaService.findByPassaporte(this.pessoa.passaporte);
|
|
2527
|
+
}
|
|
2528
|
+
if (result) {
|
|
2529
|
+
result.subscribe({
|
|
2530
|
+
next: this.hadleResult.bind(this),
|
|
2531
|
+
error: this.handleError.bind(this)
|
|
2532
|
+
});
|
|
2533
|
+
}
|
|
2534
|
+
}
|
|
2535
|
+
validar() {
|
|
2536
|
+
if (this.config.backendURL == "") {
|
|
2537
|
+
this.handleErrorPrintConsole("[UnbPessoaPesquisarComponent] ERROR: backendURL.url está null. Insira o parâmetro (backendURL) com o valor da URL do seu Backend!");
|
|
2538
|
+
return false;
|
|
2539
|
+
}
|
|
2540
|
+
if (this.pessoa.tipoPessoa == UnbTipoPessoaEnum.FISICA) {
|
|
2541
|
+
if (this.pessoa.cpf == null || (this.pessoa.cpf != null && this.pessoa.cpf == "")) {
|
|
2542
|
+
this.handleError("CPF é um campo obrigatório.");
|
|
2543
|
+
return false;
|
|
2544
|
+
}
|
|
2545
|
+
else if (!UnbUtils.validarCPF(this.pessoa.cpf)) {
|
|
2546
|
+
this.handleError("Digite um valor válido para o CPF");
|
|
2547
|
+
return false;
|
|
2548
|
+
}
|
|
2549
|
+
}
|
|
2550
|
+
else if (this.pessoa.tipoPessoa == UnbTipoPessoaEnum.JURIDICA) {
|
|
2551
|
+
if (this.pessoa.cnpj == null || (this.pessoa.cnpj != null && this.pessoa.cnpj == "")) {
|
|
2552
|
+
this.handleError("CNPJ é um campo obrigatório");
|
|
2553
|
+
return false;
|
|
2554
|
+
}
|
|
2555
|
+
else if (!UnbUtils.validarCNPJ(this.pessoa.cnpj)) {
|
|
2556
|
+
this.handleError("Digite um valor válido para o CNPJ!");
|
|
2557
|
+
return false;
|
|
2558
|
+
}
|
|
2559
|
+
}
|
|
2560
|
+
else if (this.pessoa.tipoPessoa == UnbTipoPessoaEnum.ESTRANGEIRA) {
|
|
2561
|
+
if (this.pessoa.passaporte == null || (this.pessoa.passaporte != null && this.pessoa.passaporte == "")) {
|
|
2562
|
+
this.handleError("Passaporte é um campo obrigatório");
|
|
2563
|
+
return false;
|
|
2564
|
+
}
|
|
2565
|
+
}
|
|
2566
|
+
else {
|
|
2567
|
+
this.handleError("Selecione um tipo de pessoa!");
|
|
2568
|
+
return false;
|
|
2569
|
+
}
|
|
2570
|
+
return true;
|
|
2571
|
+
}
|
|
2572
|
+
// Em unb-pessoa-pesquisar.component.ts
|
|
2573
|
+
hadleResult(resultado) {
|
|
2574
|
+
this.isLoading = false;
|
|
2575
|
+
this.isLoadingChange.emit(false);
|
|
2576
|
+
if (resultado && resultado.codigoPessoa) {
|
|
2577
|
+
// Resultado já vem normalizado pelo service (tipoPessoa, arrays, datas, códigos, CPF/CNPJ formatados)
|
|
2578
|
+
this.pessoa = resultado;
|
|
2579
|
+
}
|
|
2580
|
+
else {
|
|
2581
|
+
// Não encontrado: mantém documento e tipo selecionados
|
|
2582
|
+
const novaPessoa = new UnbPessoaModel();
|
|
2583
|
+
novaPessoa.tipoPessoa = this.pessoa.tipoPessoa;
|
|
2584
|
+
if (this.pessoa.tipoPessoa === UnbTipoPessoaEnum.FISICA) {
|
|
2585
|
+
novaPessoa.cpf = this.pessoa.cpf;
|
|
2586
|
+
}
|
|
2587
|
+
else if (this.pessoa.tipoPessoa === UnbTipoPessoaEnum.JURIDICA) {
|
|
2588
|
+
novaPessoa.cnpj = this.pessoa.cnpj;
|
|
2589
|
+
}
|
|
2590
|
+
else {
|
|
2591
|
+
novaPessoa.passaporte = this.pessoa.passaporte;
|
|
2592
|
+
}
|
|
2593
|
+
this.pessoa = novaPessoa;
|
|
2594
|
+
}
|
|
2595
|
+
this.pessoaEmitted.emit(this.pessoa);
|
|
2596
|
+
}
|
|
2597
|
+
handleError(erro) {
|
|
2598
|
+
this.isLoading = false;
|
|
2599
|
+
this.isLoadingChange.emit(false);
|
|
2600
|
+
this.pessoaEncontrado = false;
|
|
2601
|
+
let erroTratado;
|
|
2602
|
+
// --- ADAPTER: Converte string para o Objeto Padrão ---
|
|
2603
|
+
if (typeof erro === 'string') {
|
|
2604
|
+
erroTratado = {
|
|
2605
|
+
status: 400, // Erro de validação local geralmente é 400
|
|
2606
|
+
mensagemSimples: erro,
|
|
2607
|
+
mensagemHtml: `<strong>${erro}</strong>`
|
|
2608
|
+
};
|
|
2609
|
+
}
|
|
2610
|
+
else {
|
|
2611
|
+
// Se já veio do Service (ou é um objeto manual), usa direto
|
|
2612
|
+
erroTratado = erro;
|
|
2613
|
+
}
|
|
2614
|
+
// --- LÓGICA DE EXIBIÇÃO ---
|
|
2615
|
+
// 1. SnackBar (Mensagem curta)
|
|
2616
|
+
if (erroTratado.mensagemSimples) {
|
|
2617
|
+
this.openSnackBar(erroTratado.mensagemSimples);
|
|
2618
|
+
}
|
|
2619
|
+
// 2. Componente de Mensagem (Mensagem HTML)
|
|
2620
|
+
if (this.alertService && erroTratado.mensagemHtml) {
|
|
2621
|
+
// Se você tiver a variável idMensagemService definida na classe:
|
|
2622
|
+
this.alertService.showMessage(erroTratado.mensagemHtml, UnbTipoMensagemEnum.DANGER, this.idMensagemService);
|
|
2623
|
+
}
|
|
2624
|
+
}
|
|
2625
|
+
handleErrorPrintConsole(erro) {
|
|
2626
|
+
console.log(erro);
|
|
2627
|
+
this.handleError(erro);
|
|
2481
2628
|
}
|
|
2482
2629
|
openSnackBar(message) {
|
|
2483
2630
|
this.snackBar.open(message, 'x', {
|
|
@@ -2487,182 +2634,361 @@ class UnbPessoaFormComponent {
|
|
|
2487
2634
|
tipoPessoaEnum() {
|
|
2488
2635
|
return UnbTipoPessoaEnum;
|
|
2489
2636
|
}
|
|
2490
|
-
getListaEstados() {
|
|
2491
|
-
return listaEstados;
|
|
2492
|
-
}
|
|
2493
2637
|
/**
|
|
2494
|
-
|
|
2495
|
-
|
|
2496
|
-
|
|
2497
|
-
|
|
2498
|
-
|
|
2499
|
-
|
|
2500
|
-
|
|
2501
|
-
|
|
2502
|
-
|
|
2503
|
-
|
|
2504
|
-
|
|
2505
|
-
logradouro: end.logradouro,
|
|
2506
|
-
complemento: end.complemento,
|
|
2507
|
-
cep: end.cep,
|
|
2508
|
-
bairro: end.bairro,
|
|
2509
|
-
ufEndereco: end.ufEndereco,
|
|
2510
|
-
caixaPostal: end.caixaPostal,
|
|
2511
|
-
correspondencia: end.correspondencia
|
|
2512
|
-
}));
|
|
2513
|
-
const telefonesPayload = (pessoa.telefones || []).map((tel) => ({
|
|
2514
|
-
ordemTelefone: tel.ordem,
|
|
2515
|
-
tipoTelefoneCodigo: tel.tipoTelefoneCodigo,
|
|
2516
|
-
ddi: tel.ddi,
|
|
2517
|
-
ddd: tel.ddd,
|
|
2518
|
-
numeroTelefone: tel.numero,
|
|
2519
|
-
ramal: tel.ramal,
|
|
2520
|
-
autorizaSMS: tel.autorizaSMS
|
|
2521
|
-
}));
|
|
2522
|
-
const emailsPayload = (pessoa.emails || []).map((email) => ({
|
|
2523
|
-
tipoEmailCodigo: email.tipoEmailCodigo,
|
|
2524
|
-
ordemEmail: email.ordem,
|
|
2525
|
-
email: email.email,
|
|
2526
|
-
autorizacao: email.autorizacao
|
|
2527
|
-
}));
|
|
2528
|
-
// --- Monta o objeto principal ---
|
|
2529
|
-
return {
|
|
2530
|
-
idPessoa: pessoa.idPessoa,
|
|
2531
|
-
codigoPessoa: pessoa.codigoPessoa,
|
|
2532
|
-
nome: pessoa.nome,
|
|
2533
|
-
nomeSocial: pessoa.nomeSocial,
|
|
2534
|
-
// Adiciona a chave 'cpf' ao objeto SOMENTE SE pessoa.cpf for truthy
|
|
2535
|
-
...(pessoa.cpf && { cpf: pessoa.cpf.replace(/\D/g, '') }),
|
|
2536
|
-
codigoSexo: pessoa.codigoSexo,
|
|
2537
|
-
codigoEstadoCivil: pessoa.codigoEstadoCivil,
|
|
2538
|
-
codigoEscolaridade: pessoa.escolaridade,
|
|
2539
|
-
// codigoTipoSanguineo: pessoa.tipoSanguineo,
|
|
2540
|
-
nomePai: pessoa.nomePai,
|
|
2541
|
-
nomeMae: pessoa.nomeMae,
|
|
2542
|
-
dataNascimento: this.formatarDataParaBackend(pessoa.dataNascimento),
|
|
2543
|
-
codigoPaisNascimento: pessoa.codigoPaisNascimento,
|
|
2544
|
-
ufNascimento: pessoa.ufNascimento,
|
|
2545
|
-
naturalidade: pessoa.naturalidade,
|
|
2546
|
-
rg: pessoa.rg,
|
|
2547
|
-
rgOrgao: pessoa.rgOrgao,
|
|
2548
|
-
rgUf: pessoa.rgUf,
|
|
2549
|
-
rgDataEmissao: this.formatarDataParaBackend(pessoa.rgDataEmissao),
|
|
2550
|
-
numeroTituloEleitor: pessoa.numeroTituloEleitor,
|
|
2551
|
-
dataEmissaoTituloEleitor: this.formatarDataParaBackend(pessoa.dataEmissaoTituloEleitor),
|
|
2552
|
-
zonaTituloEleitor: pessoa.zonaTituloEleitor,
|
|
2553
|
-
secaoTituloEleitor: pessoa.secaoTituloEleitor,
|
|
2554
|
-
ufTituloEleitor: pessoa.ufTituloEleitor,
|
|
2555
|
-
numeroReservista: pessoa.numeroReservista,
|
|
2556
|
-
serieReservista: pessoa.serieReservista,
|
|
2557
|
-
orgaoReservista: pessoa.orgaoReservista,
|
|
2558
|
-
numeroCarteiraTrabalho: pessoa.numeroCarteiraTrabalho,
|
|
2559
|
-
serieCarteiraTrabalho: pessoa.serieCarteiraTrabalho,
|
|
2560
|
-
ufCarteiraTrabalho: pessoa.ufCarteiraTrabalho,
|
|
2561
|
-
pisPasep: pessoa.pisPasep,
|
|
2562
|
-
numeroHabilitacao: pessoa.numeroHabilitacao,
|
|
2563
|
-
registroHabilitacao: pessoa.registroHabilitacao,
|
|
2564
|
-
dataEmissaoHabilitacao: this.formatarDataParaBackend(pessoa.dataEmissaoHabilitacao),
|
|
2565
|
-
dataValidadeHabilitacao: this.formatarDataParaBackend(pessoa.dataValidadeHabilitacao),
|
|
2566
|
-
categoriaHabilitacao: pessoa.categoriaHabilitacao,
|
|
2567
|
-
deficienciaFisicaHabilitacao: pessoa.deficienciaFisicaHabilitacao,
|
|
2568
|
-
primeiraHabilitacao: this.formatarDataParaBackend(pessoa.primeiraHabilitacao),
|
|
2569
|
-
passaporte: pessoa.passaporte,
|
|
2570
|
-
codigoPaisPassaporte: pessoa.codigoPaisPassaporte,
|
|
2571
|
-
// Adiciona a chave 'cnpj' ao objeto SOMENTE SE pessoa.cnpj for truthy
|
|
2572
|
-
...(pessoa.cnpj && { cnpj: pessoa.cnpj.replace(/\D/g, '') }),
|
|
2573
|
-
razaoSocial: pessoa.razaoSocial,
|
|
2574
|
-
nomeFantasia: pessoa.nomeFantasia,
|
|
2575
|
-
sigla: pessoa.sigla,
|
|
2576
|
-
paginaWeb: pessoa.paginaWeb,
|
|
2577
|
-
autoCadastro: pessoa.autoCadastro,
|
|
2578
|
-
enderecos: enderecosPayload,
|
|
2579
|
-
telefones: telefonesPayload,
|
|
2580
|
-
emails: emailsPayload
|
|
2581
|
-
};
|
|
2638
|
+
* Formata o CPF enquanto o usuário digita
|
|
2639
|
+
*/
|
|
2640
|
+
formatarCpf(event) {
|
|
2641
|
+
let valor = event.target.value.replace(/\D/g, ''); // Remove tudo que não é dígito
|
|
2642
|
+
if (valor.length <= 11) {
|
|
2643
|
+
// Aplica máscara: 000.000.000-00
|
|
2644
|
+
valor = valor.replace(/(\d{3})(\d)/, '$1.$2');
|
|
2645
|
+
valor = valor.replace(/(\d{3})(\d)/, '$1.$2');
|
|
2646
|
+
valor = valor.replace(/(\d{3})(\d{1,2})$/, '$1-$2');
|
|
2647
|
+
this.pessoa.cpf = valor;
|
|
2648
|
+
}
|
|
2582
2649
|
}
|
|
2583
2650
|
/**
|
|
2584
|
-
* Formata
|
|
2651
|
+
* Formata o CNPJ enquanto o usuário digita
|
|
2585
2652
|
*/
|
|
2586
|
-
|
|
2587
|
-
|
|
2588
|
-
|
|
2589
|
-
|
|
2590
|
-
|
|
2591
|
-
|
|
2592
|
-
|
|
2593
|
-
|
|
2594
|
-
|
|
2595
|
-
const dia = String(d.getDate()).padStart(2, '0');
|
|
2596
|
-
const mes = String(d.getMonth() + 1).padStart(2, '0');
|
|
2597
|
-
const ano = d.getFullYear();
|
|
2598
|
-
return `${dia}/${mes}/${ano}`;
|
|
2653
|
+
formatarCnpj(event) {
|
|
2654
|
+
let valor = event.target.value.replace(/\D/g, ''); // Remove tudo que não é dígito
|
|
2655
|
+
if (valor.length <= 14) {
|
|
2656
|
+
// Aplica máscara: 00.000.000/0000-00
|
|
2657
|
+
valor = valor.replace(/(\d{2})(\d)/, '$1.$2');
|
|
2658
|
+
valor = valor.replace(/(\d{3})(\d)/, '$1.$2');
|
|
2659
|
+
valor = valor.replace(/(\d{3})(\d)/, '$1/$2');
|
|
2660
|
+
valor = valor.replace(/(\d{4})(\d{1,2})$/, '$1-$2');
|
|
2661
|
+
this.pessoa.cnpj = valor;
|
|
2599
2662
|
}
|
|
2600
|
-
|
|
2601
|
-
|
|
2663
|
+
}
|
|
2664
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.1.2", ngImport: i0, type: UnbPessoaPesquisarComponent, deps: [{ token: UnBPessoaService }, { token: i1$2.MatSnackBar }, { token: UnbMensagemService }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
2665
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.1.2", type: UnbPessoaPesquisarComponent, selector: "lib-unb-pessoa-pesquisar", inputs: { config: "config" }, outputs: { pessoaEmitted: "pessoaEmitted", isLoadingChange: "isLoadingChange" }, ngImport: i0, template: "<form #pessoaForm=\"ngForm\" class=\"pesquisa-container\" (ngSubmit)=\"pesquisar()\">\r\n\r\n <div class=\"mensagem-container\">\r\n <unb-mensagem [identificador]=\"idMensagemService\" class=\"mensagem-form\"></unb-mensagem>\r\n </div>\r\n\r\n <div class=\"form-wrapper\">\r\n <div *ngIf=\"mostrarTipoPessoa\" class=\"radio-container\">\r\n <mat-radio-group aria-label=\"Tipo de Pessoa\" [(ngModel)]=\"pessoa.tipoPessoa\" #tipoPessoa=\"ngModel\"\r\n name=\"tipoPessoa\" (change)=\"onTipoPessoaChange()\">\r\n <mat-radio-button *ngIf=\"config.pesquisarPorCPF\" [value]=\"tipoPessoaEnum().FISICA\">Pessoa\r\n F\u00EDsica</mat-radio-button>\r\n <mat-radio-button *ngIf=\"config.pesquisarPorCNPJ\" [value]=\"tipoPessoaEnum().JURIDICA\">Pessoa\r\n Jur\u00EDdica</mat-radio-button>\r\n <mat-radio-button *ngIf=\"config.pesquisarPorEstrangeiro\"\r\n [value]=\"tipoPessoaEnum().ESTRANGEIRA\">Estrangeiro</mat-radio-button>\r\n </mat-radio-group>\r\n </div>\r\n\r\n <ng-container *ngIf=\"pessoa.tipoPessoa === tipoPessoaEnum().FISICA\">\r\n <mat-form-field appearance=\"outline\">\r\n <mat-label>CPF</mat-label>\r\n <input type=\"text\" matInput [(ngModel)]=\"pessoa.cpf\" name=\"cpf\" #cpf=\"ngModel\" [required]=\"true\"\r\n (input)=\"formatarCpf($event)\" maxlength=\"14\" placeholder=\"000.000.000-00\" />\r\n\r\n <button matSuffix mat-icon-button type=\"button\" aria-label=\"Pesquisar\" [disabled]=\"isLoading\"\r\n (click)=\"pesquisar()\">\r\n <ng-container *ngIf=\"!isLoading; else loadingIcon\">\r\n <mat-icon>search</mat-icon>\r\n </ng-container>\r\n <ng-template #loadingIcon>\r\n <mat-progress-spinner [diameter]=\"20\" mode=\"indeterminate\" color=\"primary\"></mat-progress-spinner>\r\n </ng-template>\r\n </button>\r\n </mat-form-field>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"pessoa.tipoPessoa === tipoPessoaEnum().JURIDICA\">\r\n <mat-form-field appearance=\"outline\">\r\n <mat-label>CNPJ</mat-label>\r\n <input type=\"text\" matInput [(ngModel)]=\"pessoa.cnpj\" name=\"cnpj\" [required]=\"true\"\r\n (input)=\"formatarCnpj($event)\" maxlength=\"18\" placeholder=\"00.000.000/0000-00\" /> <button matSuffix mat-icon-button type=\"button\" aria-label=\"Pesquisar\" (click)=\"pesquisar()\">\r\n <mat-icon>search</mat-icon>\r\n </button>\r\n <ng-template #loadingIcon>\r\n <mat-progress-spinner\r\n [diameter]=\"20\"\r\n mode=\"indeterminate\"\r\n color=\"primary\"\r\n class=\"spinner-button\">\r\n </mat-progress-spinner>\r\n </ng-template>\r\n </mat-form-field>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"pessoa.tipoPessoa === tipoPessoaEnum().ESTRANGEIRA\">\r\n <mat-form-field appearance=\"outline\">\r\n <mat-label>Passaporte</mat-label>\r\n <input type=\"text\" matInput [(ngModel)]=\"pessoa.passaporte\" name=\"passaporte\" required=\"true\" />\r\n <button matSuffix mat-icon-button type=\"button\" aria-label=\"Pesquisar\" (click)=\"pesquisar()\">\r\n <ng-container *ngIf=\"!isLoading; else loadingIcon\">\r\n <mat-icon>search</mat-icon>\r\n </ng-container>\r\n <ng-template #loadingIcon>\r\n <mat-progress-spinner\r\n [diameter]=\"20\"\r\n mode=\"indeterminate\"\r\n color=\"primary\"\r\n class=\"spinner-button\">\r\n </mat-progress-spinner>\r\n </ng-template>\r\n </button>\r\n </mat-form-field>\r\n </ng-container>\r\n\r\n </div>\r\n</form>", styles: [":host{display:block;width:100%}.pesquisa-container{display:flex;flex-direction:column;width:100%}.form-wrapper{display:flex;flex-direction:column;width:100%;gap:8px}mat-form-field{width:100%}.mensagem-container{width:100%;margin-bottom:10px}\n"], dependencies: [{ kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i6.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i6.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i6.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i6.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i6.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i6.MaxLengthValidator, selector: "[maxlength][formControlName],[maxlength][formControl],[maxlength][ngModel]", inputs: ["maxlength"] }, { kind: "directive", type: i6.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i6.NgForm, selector: "form:not([ngNoForm]):not([formGroup]),ng-form,[ngForm]", inputs: ["ngFormOptions"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "component", type: i5.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i7.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "component", type: UnbMensagemComponent, selector: "unb-mensagem", inputs: ["mensagem", "tipo", "identificador"] }, { kind: "component", type: i9.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i9.MatLabel, selector: "mat-label" }, { kind: "directive", type: i9.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "directive", type: i10.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "component", type: i14.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "mode", "value", "diameter", "strokeWidth"], exportAs: ["matProgressSpinner"] }, { kind: "directive", type: i12$1.MatRadioGroup, selector: "mat-radio-group", inputs: ["color", "name", "labelPosition", "value", "selected", "disabled", "required"], outputs: ["change"], exportAs: ["matRadioGroup"] }, { kind: "component", type: i12$1.MatRadioButton, selector: "mat-radio-button", inputs: ["id", "name", "aria-label", "aria-labelledby", "aria-describedby", "disableRipple", "tabIndex", "checked", "value", "labelPosition", "disabled", "required", "color"], outputs: ["change"], exportAs: ["matRadioButton"] }] }); }
|
|
2666
|
+
}
|
|
2667
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.2", ngImport: i0, type: UnbPessoaPesquisarComponent, decorators: [{
|
|
2668
|
+
type: Component,
|
|
2669
|
+
args: [{ selector: 'lib-unb-pessoa-pesquisar', standalone: false, template: "<form #pessoaForm=\"ngForm\" class=\"pesquisa-container\" (ngSubmit)=\"pesquisar()\">\r\n\r\n <div class=\"mensagem-container\">\r\n <unb-mensagem [identificador]=\"idMensagemService\" class=\"mensagem-form\"></unb-mensagem>\r\n </div>\r\n\r\n <div class=\"form-wrapper\">\r\n <div *ngIf=\"mostrarTipoPessoa\" class=\"radio-container\">\r\n <mat-radio-group aria-label=\"Tipo de Pessoa\" [(ngModel)]=\"pessoa.tipoPessoa\" #tipoPessoa=\"ngModel\"\r\n name=\"tipoPessoa\" (change)=\"onTipoPessoaChange()\">\r\n <mat-radio-button *ngIf=\"config.pesquisarPorCPF\" [value]=\"tipoPessoaEnum().FISICA\">Pessoa\r\n F\u00EDsica</mat-radio-button>\r\n <mat-radio-button *ngIf=\"config.pesquisarPorCNPJ\" [value]=\"tipoPessoaEnum().JURIDICA\">Pessoa\r\n Jur\u00EDdica</mat-radio-button>\r\n <mat-radio-button *ngIf=\"config.pesquisarPorEstrangeiro\"\r\n [value]=\"tipoPessoaEnum().ESTRANGEIRA\">Estrangeiro</mat-radio-button>\r\n </mat-radio-group>\r\n </div>\r\n\r\n <ng-container *ngIf=\"pessoa.tipoPessoa === tipoPessoaEnum().FISICA\">\r\n <mat-form-field appearance=\"outline\">\r\n <mat-label>CPF</mat-label>\r\n <input type=\"text\" matInput [(ngModel)]=\"pessoa.cpf\" name=\"cpf\" #cpf=\"ngModel\" [required]=\"true\"\r\n (input)=\"formatarCpf($event)\" maxlength=\"14\" placeholder=\"000.000.000-00\" />\r\n\r\n <button matSuffix mat-icon-button type=\"button\" aria-label=\"Pesquisar\" [disabled]=\"isLoading\"\r\n (click)=\"pesquisar()\">\r\n <ng-container *ngIf=\"!isLoading; else loadingIcon\">\r\n <mat-icon>search</mat-icon>\r\n </ng-container>\r\n <ng-template #loadingIcon>\r\n <mat-progress-spinner [diameter]=\"20\" mode=\"indeterminate\" color=\"primary\"></mat-progress-spinner>\r\n </ng-template>\r\n </button>\r\n </mat-form-field>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"pessoa.tipoPessoa === tipoPessoaEnum().JURIDICA\">\r\n <mat-form-field appearance=\"outline\">\r\n <mat-label>CNPJ</mat-label>\r\n <input type=\"text\" matInput [(ngModel)]=\"pessoa.cnpj\" name=\"cnpj\" [required]=\"true\"\r\n (input)=\"formatarCnpj($event)\" maxlength=\"18\" placeholder=\"00.000.000/0000-00\" /> <button matSuffix mat-icon-button type=\"button\" aria-label=\"Pesquisar\" (click)=\"pesquisar()\">\r\n <mat-icon>search</mat-icon>\r\n </button>\r\n <ng-template #loadingIcon>\r\n <mat-progress-spinner\r\n [diameter]=\"20\"\r\n mode=\"indeterminate\"\r\n color=\"primary\"\r\n class=\"spinner-button\">\r\n </mat-progress-spinner>\r\n </ng-template>\r\n </mat-form-field>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"pessoa.tipoPessoa === tipoPessoaEnum().ESTRANGEIRA\">\r\n <mat-form-field appearance=\"outline\">\r\n <mat-label>Passaporte</mat-label>\r\n <input type=\"text\" matInput [(ngModel)]=\"pessoa.passaporte\" name=\"passaporte\" required=\"true\" />\r\n <button matSuffix mat-icon-button type=\"button\" aria-label=\"Pesquisar\" (click)=\"pesquisar()\">\r\n <ng-container *ngIf=\"!isLoading; else loadingIcon\">\r\n <mat-icon>search</mat-icon>\r\n </ng-container>\r\n <ng-template #loadingIcon>\r\n <mat-progress-spinner\r\n [diameter]=\"20\"\r\n mode=\"indeterminate\"\r\n color=\"primary\"\r\n class=\"spinner-button\">\r\n </mat-progress-spinner>\r\n </ng-template>\r\n </button>\r\n </mat-form-field>\r\n </ng-container>\r\n\r\n </div>\r\n</form>", styles: [":host{display:block;width:100%}.pesquisa-container{display:flex;flex-direction:column;width:100%}.form-wrapper{display:flex;flex-direction:column;width:100%;gap:8px}mat-form-field{width:100%}.mensagem-container{width:100%;margin-bottom:10px}\n"] }]
|
|
2670
|
+
}], ctorParameters: () => [{ type: UnBPessoaService }, { type: i1$2.MatSnackBar }, { type: UnbMensagemService }], propDecorators: { config: [{
|
|
2671
|
+
type: Input,
|
|
2672
|
+
args: [{ required: true }]
|
|
2673
|
+
}], pessoaEmitted: [{
|
|
2674
|
+
type: Output
|
|
2675
|
+
}], isLoadingChange: [{
|
|
2676
|
+
type: Output
|
|
2677
|
+
}] } });
|
|
2678
|
+
|
|
2679
|
+
/**
|
|
2680
|
+
* Esse é um componente Wrapper utilitário. Ele encapsula a logica de procurar e exibir o formulario de cadastro/alteração inline.
|
|
2681
|
+
* Isso economiza o ciclo de mostrar a pesquisa do pessoa, e depois mostrar o formulário.
|
|
2682
|
+
*/
|
|
2683
|
+
class UnbPessoaCrudComponent {
|
|
2684
|
+
constructor(snackBar, pessoaService, alertService, dialog) {
|
|
2685
|
+
this.snackBar = snackBar;
|
|
2686
|
+
this.pessoaService = pessoaService;
|
|
2687
|
+
this.alertService = alertService;
|
|
2688
|
+
this.dialog = dialog;
|
|
2689
|
+
this.isLoading = false;
|
|
2690
|
+
// Configuração do componente
|
|
2691
|
+
this.pesquisaConfig = new UnbPessoaPesquisaConfig();
|
|
2692
|
+
this.showFormOnModal = false;
|
|
2693
|
+
this.maxWidthPesquisa = '450px'; // Input para controlar a largura da área de pesquisa
|
|
2694
|
+
this.pessoaEmitted = new EventEmitter();
|
|
2695
|
+
this.pessoaSelecionada = new UnbPessoaModel();
|
|
2696
|
+
this.pessoaEncontrada = false;
|
|
2697
|
+
this.formConfig = new UnbPessoaFormConfig(); // o formCOnfig a gente monta conforme o pesquisaConfig
|
|
2698
|
+
}
|
|
2699
|
+
ngOnInit() {
|
|
2700
|
+
if (this.pesquisaConfig.token) {
|
|
2701
|
+
this.pessoaService.setToken(this.pesquisaConfig.token);
|
|
2702
|
+
}
|
|
2703
|
+
if (this.pesquisaConfig.backendURL) {
|
|
2704
|
+
this.pessoaService.setBackendUrl(this.pesquisaConfig.backendURL);
|
|
2705
|
+
}
|
|
2706
|
+
else {
|
|
2707
|
+
this.openSnackBar('Backend URL não informada na configuração do componente UnbPessoaCrudComponent!');
|
|
2708
|
+
}
|
|
2709
|
+
this.formConfig = new UnbPessoaFormConfig();
|
|
2710
|
+
this.formConfig.pessoa = this.pessoaSelecionada;
|
|
2711
|
+
this.formConfig.backendURL = this.pesquisaConfig.backendURL;
|
|
2712
|
+
this.formConfig.token = this.pesquisaConfig.token;
|
|
2713
|
+
}
|
|
2714
|
+
loadingPesquisa($event) {
|
|
2715
|
+
this.isLoading = $event;
|
|
2716
|
+
}
|
|
2717
|
+
pessoaPesquisaRecebida(pessoa) {
|
|
2718
|
+
// 1. Verifica se a pessoa é nula ou se é um objeto "vazio" (sem ID e sem documentos)
|
|
2719
|
+
const isVazio = !pessoa || (!pessoa.codigoPessoa && // Não tem ID
|
|
2720
|
+
!pessoa.cpf && // Não tem CPF
|
|
2721
|
+
!pessoa.cnpj && // Não tem CNPJ
|
|
2722
|
+
!pessoa.passaporte // Não tem Passaporte
|
|
2723
|
+
);
|
|
2724
|
+
if (isVazio) {
|
|
2725
|
+
// Se for vazio, limpamos a seleção para esconder o formulário
|
|
2726
|
+
// (O *ngIf="pessoaSelecionada" no HTML vai remover o componente da tela)
|
|
2727
|
+
this.pessoaSelecionada = new UnbPessoaModel(); // ou undefined, dependendo da tipagem
|
|
2728
|
+
this.pessoaEncontrada = false;
|
|
2729
|
+
}
|
|
2730
|
+
else {
|
|
2731
|
+
// Se tiver algum dado (CPF digitado ou pessoa encontrada), atualiza
|
|
2732
|
+
this.pessoaSelecionada = pessoa;
|
|
2733
|
+
this.pessoaEncontrada = true;
|
|
2734
|
+
}
|
|
2735
|
+
// 2. Atualiza a configuração do formulário
|
|
2736
|
+
// Importante: Só tenta acessar 'pessoa' se formConfig existir
|
|
2737
|
+
if (this.formConfig) {
|
|
2738
|
+
// Usamos o spread operator (...) para forçar o Angular a detectar a mudança,
|
|
2739
|
+
// caso o componente filho use ngOnChanges
|
|
2740
|
+
this.formConfig = {
|
|
2741
|
+
...this.formConfig,
|
|
2742
|
+
pessoa: this.pessoaSelecionada || new UnbPessoaModel() // Evita passar null pro form se não quiser
|
|
2743
|
+
};
|
|
2602
2744
|
}
|
|
2603
2745
|
}
|
|
2604
|
-
|
|
2605
|
-
|
|
2606
|
-
|
|
2746
|
+
openSnackBar(message) {
|
|
2747
|
+
this.snackBar.open(message, 'x', {
|
|
2748
|
+
duration: 5000,
|
|
2749
|
+
});
|
|
2607
2750
|
}
|
|
2608
|
-
|
|
2751
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.1.2", ngImport: i0, type: UnbPessoaCrudComponent, deps: [{ token: i1$2.MatSnackBar }, { token: UnBPessoaService }, { token: UnbMensagemService }, { token: i4$2.MatDialog }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
2752
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.1.2", type: UnbPessoaCrudComponent, selector: "lib-unb-pessoa-crud", inputs: { pesquisaConfig: "pesquisaConfig", showFormOnModal: "showFormOnModal", maxWidthPesquisa: "maxWidthPesquisa" }, outputs: { pessoaEmitted: "pessoaEmitted" }, ngImport: i0, template: "<div class=\"area-pesquisa\" [style.max-width]=\"maxWidthPesquisa\" [class.disabled-wrapper]=\"isLoading\">\r\n <lib-unb-pessoa-pesquisar \r\n [config]=\"pesquisaConfig\"\r\n (isLoadingChange)=\"loadingPesquisa($event)\"\r\n (pessoaEmitted)=\"pessoaPesquisaRecebida($event)\">\r\n </lib-unb-pessoa-pesquisar>\r\n</div>\r\n\r\n<div *ngIf=\"pessoaEncontrada && !isLoading\" class=\"area-formulario\">\r\n <lib-unb-pessoa-form \r\n [config]=\"formConfig\">\r\n </lib-unb-pessoa-form>\r\n</div>", styles: [".area-pesquisa{width:100%;margin-bottom:10px}.area-formulario{width:100%}@media (max-width: 600px){.area-pesquisa{max-width:100%}}\n"], dependencies: [{ kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: UnbPessoaFormComponent, selector: "lib-unb-pessoa-form", inputs: ["config", "hideSalvarButton"], outputs: ["pessoaEmitted", "isLoadingChange"] }, { kind: "component", type: UnbPessoaPesquisarComponent, selector: "lib-unb-pessoa-pesquisar", inputs: ["config"], outputs: ["pessoaEmitted", "isLoadingChange"] }] }); }
|
|
2753
|
+
}
|
|
2754
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.2", ngImport: i0, type: UnbPessoaCrudComponent, decorators: [{
|
|
2755
|
+
type: Component,
|
|
2756
|
+
args: [{ selector: 'lib-unb-pessoa-crud', standalone: false, template: "<div class=\"area-pesquisa\" [style.max-width]=\"maxWidthPesquisa\" [class.disabled-wrapper]=\"isLoading\">\r\n <lib-unb-pessoa-pesquisar \r\n [config]=\"pesquisaConfig\"\r\n (isLoadingChange)=\"loadingPesquisa($event)\"\r\n (pessoaEmitted)=\"pessoaPesquisaRecebida($event)\">\r\n </lib-unb-pessoa-pesquisar>\r\n</div>\r\n\r\n<div *ngIf=\"pessoaEncontrada && !isLoading\" class=\"area-formulario\">\r\n <lib-unb-pessoa-form \r\n [config]=\"formConfig\">\r\n </lib-unb-pessoa-form>\r\n</div>", styles: [".area-pesquisa{width:100%;margin-bottom:10px}.area-formulario{width:100%}@media (max-width: 600px){.area-pesquisa{max-width:100%}}\n"] }]
|
|
2757
|
+
}], ctorParameters: () => [{ type: i1$2.MatSnackBar }, { type: UnBPessoaService }, { type: UnbMensagemService }, { type: i4$2.MatDialog }], propDecorators: { pesquisaConfig: [{
|
|
2758
|
+
type: Input,
|
|
2759
|
+
args: [{ required: true }]
|
|
2760
|
+
}], showFormOnModal: [{
|
|
2761
|
+
type: Input
|
|
2762
|
+
}], maxWidthPesquisa: [{
|
|
2763
|
+
type: Input
|
|
2764
|
+
}], pessoaEmitted: [{
|
|
2765
|
+
type: Output
|
|
2766
|
+
}] } });
|
|
2767
|
+
|
|
2768
|
+
class UnbPessoaFormDialogComponent {
|
|
2769
|
+
constructor(dialogRef, data) {
|
|
2770
|
+
this.dialogRef = dialogRef;
|
|
2771
|
+
this.config = new UnbPessoaFormConfig();
|
|
2772
|
+
this.pessoaEmitted = new EventEmitter();
|
|
2609
2773
|
this.isLoading = false;
|
|
2610
|
-
this.
|
|
2611
|
-
|
|
2612
|
-
|
|
2613
|
-
|
|
2614
|
-
this.
|
|
2615
|
-
|
|
2616
|
-
|
|
2617
|
-
|
|
2618
|
-
|
|
2619
|
-
|
|
2620
|
-
// Caso contrário, ele mostra no componente padrão.
|
|
2621
|
-
this.alertService.showMessage(erro.mensagemHtml, UnbTipoMensagemEnum.DANGER, this.idMensagemService);
|
|
2774
|
+
this.titulo = 'Cadastro de Pessoa';
|
|
2775
|
+
if (data && data.config) {
|
|
2776
|
+
this.config = data.config;
|
|
2777
|
+
// Ajusta o título dependendo se é edição ou inclusão
|
|
2778
|
+
if (this.config.pessoa && this.config.pessoa.codigoPessoa) {
|
|
2779
|
+
this.titulo = 'Editando Pessoa';
|
|
2780
|
+
}
|
|
2781
|
+
else {
|
|
2782
|
+
this.titulo = 'Nova Pessoa';
|
|
2783
|
+
}
|
|
2622
2784
|
}
|
|
2623
2785
|
}
|
|
2624
|
-
|
|
2625
|
-
|
|
2626
|
-
|
|
2627
|
-
|
|
2628
|
-
|
|
2629
|
-
|
|
2786
|
+
onLoadingChange($event) {
|
|
2787
|
+
this.isLoading = $event;
|
|
2788
|
+
}
|
|
2789
|
+
fechar() {
|
|
2790
|
+
this.dialogRef.close();
|
|
2791
|
+
}
|
|
2792
|
+
// se salvar, jah fecha emite o valor salvo. Nao posso deixar aberto, senao vai emitir o close vazio. E o dono nao vai receber a pessoa
|
|
2793
|
+
onSalvarSucesso($event) {
|
|
2794
|
+
this.dialogRef.close($event);
|
|
2795
|
+
}
|
|
2796
|
+
submitForm() {
|
|
2797
|
+
// chama o salvar lah do form.
|
|
2798
|
+
if (this.pessoaFormComponent && this.pessoaFormComponent.pessoaForm) {
|
|
2799
|
+
this.pessoaFormComponent.salvar(this.pessoaFormComponent.pessoaForm);
|
|
2630
2800
|
}
|
|
2631
2801
|
}
|
|
2632
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2
|
|
2633
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "16.1.0", version: "18.2.14", type: UnbPessoaFormComponent, selector: "lib-unb-pessoa-form", inputs: { backendURL: "backendURL", pesquisarPorCPF: ["pesquisarPorCPF", "pesquisarPorCPF", booleanAttribute], pesquisarPorCNPJ: ["pesquisarPorCNPJ", "pesquisarPorCNPJ", booleanAttribute], pesquisarPorEstrangeiro: ["pesquisarPorEstrangeiro", "pesquisarPorEstrangeiro", booleanAttribute], defaultTipoPessoa: "defaultTipoPessoa", campoPesquisaMaxWidth: "campoPesquisaMaxWidth" }, outputs: { pessoaEmitted: "pessoaEmitted", isLoadingChange: "isLoadingChange" }, viewQueries: [{ propertyName: "pessoaForm", first: true, predicate: ["pessoaForm"], descendants: true }], ngImport: i0, template: "<mat-progress-bar *ngIf=\"isLoading\" mode=\"indeterminate\"></mat-progress-bar>\r\n\r\n<div class=\"form-container\" [class.disabled-wrapper]=\"isLoading\">\r\n <lib-unb-pessoa-pesquisar \r\n [backendURL]=\"backendURL\" \r\n [defaultTipoPessoa]=\"defaultTipoPessoa\"\r\n [pesquisarPorCNPJ]=\"pesquisarPorCNPJ\" \r\n [pesquisarPorCPF]=\"pesquisarPorCPF\"\r\n [pesquisarPorEstrangeiro]=\"pesquisarPorEstrangeiro\" \r\n [campoPesquisaMaxWidth]=\"campoPesquisaMaxWidth\"\r\n (pessoaEmitted)=\"pessoaRecebida($event)\">\r\n </lib-unb-pessoa-pesquisar>\r\n</div>\r\n\r\n<unb-mensagem [identificador]=\"idMensagemService\"></unb-mensagem>\r\n\r\n<!-- Label indicando que est\u00E1 incluindo nova pessoa -->\r\n<div *ngIf=\"documentoPesquisado\"\r\n class=\"status-banner\" \r\n [ngClass]=\"{\r\n 'status-inclusao': !pessoa.codigoPessoa,\r\n 'status-edicao': pessoa.codigoPessoa && !isReadonlyFromSiape,\r\n 'status-bloqueado': isReadonlyFromSiape\r\n }\">\r\n\r\n <mat-icon>\r\n {{ !pessoa.codigoPessoa ? 'person_add' : (isReadonlyFromSiape ? 'lock' : 'edit') }}\r\n </mat-icon>\r\n\r\n <span>\r\n <ng-container *ngIf=\"!pessoa.codigoPessoa\">Incluindo nova pessoa</ng-container>\r\n <ng-container *ngIf=\"pessoa.codigoPessoa && !isReadonlyFromSiape\">Editando pessoa</ng-container>\r\n <ng-container *ngIf=\"isReadonlyFromSiape\">Registro SIAPE (Visualiza\u00E7\u00E3o)</ng-container>\r\n\r\n com <strong>{{ getLabelDocumento() }} {{ documentoPesquisado }}</strong>\r\n </span>\r\n\r\n</div>\r\n\r\n\r\n<form #pessoaForm=\"ngForm\" [class.readonly]=\"isReadonlyFromSiape || isLoading\" class=\"form-container mt-2\"\r\n *ngIf=\"buscaRealizada\" (ngSubmit)=\"salvar(pessoaForm)\">\r\n\r\n <!-- Campos Pessoa F\u00EDsica e Estrangeira -->\r\n <ng-container\r\n *ngIf=\"pessoa.tipoPessoa == tipoPessoaEnum().FISICA || pessoa.tipoPessoa == tipoPessoaEnum().ESTRANGEIRA\">\r\n <mat-form-field class=\"form-25\" appearance=\"outline\">\r\n <mat-label>Nome</mat-label>\r\n <input type=\"text\" matInput [(ngModel)]=\"pessoa.nome\" name=\"nome\" #nome=\"ngModel\" required />\r\n </mat-form-field>\r\n\r\n <mat-form-field class=\"form-10\" appearance=\"outline\">\r\n <mat-label>Sexo</mat-label>\r\n <mat-select [(ngModel)]=\"pessoa.codigoSexo\" name=\"codigoSexo\" #codigoSexo=\"ngModel\" required>\r\n <mat-option [value]=\"1\">Masculino</mat-option>\r\n <mat-option [value]=\"2\">Feminino</mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n\r\n <mat-form-field class=\"form-15\" appearance=\"outline\">\r\n <mat-label>Data Nascimento</mat-label>\r\n <input matInput [matDatepicker]=\"dataNascimentoPicker\" [(ngModel)]=\"pessoa.dataNascimento\" name=\"dataNascimento\"\r\n #dataNascimento=\"ngModel\" required>\r\n <mat-datepicker-toggle matSuffix [for]=\"dataNascimentoPicker\"></mat-datepicker-toggle>\r\n <mat-datepicker #dataNascimentoPicker></mat-datepicker>\r\n </mat-form-field>\r\n\r\n <mat-form-field class=\"form-10\" appearance=\"outline\">\r\n <mat-label>Estado Civil</mat-label>\r\n <mat-select [(ngModel)]=\"pessoa.codigoEstadoCivil\" name=\"codigoEstadoCivil\" #codigoEstadoCivil=\"ngModel\">\r\n <mat-option *ngFor=\"let estado of estadosCivil | async\" [value]=\"estado.codigo\">\r\n {{ estado.denominacao }}\r\n </mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n\r\n <!--\r\n <mat-form-field class=\"form-15\" appearance=\"outline\">\r\n <mat-label>Naturalidade</mat-label>\r\n <mat-select [(ngModel)]=\"pessoa.naturalidade\" name=\"naturalidade\" #naturalidade=\"ngModel\" required>\r\n <mat-option *ngFor=\"let cidade of getListaEstados()\" [value]=\"cidade.codigo\">\r\n {{ cidade.descricao }}\r\n </mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n -->\r\n <mat-form-field class=\"form-10\" appearance=\"outline\">\r\n <mat-label>Pa\u00EDs Nascimento</mat-label>\r\n <mat-select [(ngModel)]=\"pessoa.codigoPaisNascimento\" name=\"codigoPaisNascimento\" #codigoPaisNascimento=\"ngModel\"\r\n required>\r\n <mat-option *ngFor=\"let paisNascimento of paises | async\" [value]=\"paisNascimento.codigo\">\r\n <span *ngIf=\"paisNascimento.denominacao === 'BRASIL'\">\uD83C\uDDE7\uD83C\uDDF7 <b>{{ paisNascimento.denominacao }}</b></span>\r\n <span *ngIf=\"paisNascimento.denominacao !== 'BRASIL'\">{{ paisNascimento.denominacao }}</span>\r\n </mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n\r\n <mat-form-field class=\"form-10\" appearance=\"outline\" *ngIf=\"pessoa.codigoPaisNascimento == 22\"> <!-- 22 eh Brasil-->\r\n <mat-label>UF Nascimento</mat-label>\r\n <mat-select [(ngModel)]=\"pessoa.ufNascimento\" name=\"ufNascimento\" #ufNascimento=\"ngModel\" required>\r\n <mat-option *ngFor=\"let estado of getListaEstados()\" [value]=\"estado.identificador\">\r\n {{ estado.identificador }}\r\n </mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n\r\n <mat-form-field class=\"form-15\" appearance=\"outline\" *ngIf=\"pessoa.codigoPaisNascimento == 22\">\r\n <mat-label>Naturalidade</mat-label>\r\n <input type=\"text\" matInput [(ngModel)]=\"pessoa.naturalidade\" name=\"naturalidade\" #naturalidade=\"ngModel\"\r\n required />\r\n </mat-form-field>\r\n\r\n <mat-form-field class=\"form-10\" appearance=\"outline\">\r\n <mat-label>Escolaridade</mat-label>\r\n <mat-select [(ngModel)]=\"pessoa.escolaridade\" name=\"codigoEscolaridade\" #codigoEscolaridade=\"ngModel\" required>\r\n <mat-option *ngFor=\"let escolaridade of escolaridade | async\" [value]=\"escolaridade.codigo\">\r\n {{ escolaridade.denominacao }}\r\n </mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n\r\n <mat-form-field class=\"form-25\" appearance=\"outline\">\r\n <mat-label>Nome Social</mat-label>\r\n <input type=\"text\" matInput [(ngModel)]=\"pessoa.nomeSocial\" name=\"nomeSocial\" #nomeSocial=\"ngModel\" />\r\n </mat-form-field>\r\n\r\n <mat-form-field class=\"form-25\" appearance=\"outline\">\r\n <mat-label>Nome da M\u00E3e</mat-label>\r\n <input type=\"text\" matInput [(ngModel)]=\"pessoa.nomeMae\" name=\"nomeMae\" #nomeMae=\"ngModel\" required />\r\n </mat-form-field>\r\n\r\n <mat-form-field class=\"form-25\" appearance=\"outline\">\r\n <mat-label>Nome do Pai</mat-label>\r\n <input type=\"text\" matInput [(ngModel)]=\"pessoa.nomePai\" name=\"nomePai\" #nomePai=\"ngModel\" required />\r\n </mat-form-field>\r\n </ng-container>\r\n\r\n <!-- Campos Pessoa Jur\u00EDdica -->\r\n <ng-container *ngIf=\"pessoa.tipoPessoa === tipoPessoaEnum().JURIDICA\">\r\n <mat-form-field class=\"form-25\" appearance=\"outline\">\r\n <mat-label>Raz\u00E3o Social</mat-label>\r\n <input type=\"text\" matInput [(ngModel)]=\"pessoa.razaoSocial\" name=\"razaoSocial\" />\r\n </mat-form-field>\r\n <mat-form-field class=\"form-25\" appearance=\"outline\">\r\n <mat-label>Nome Fantasia</mat-label>\r\n <input type=\"text\" matInput [(ngModel)]=\"pessoa.nomeFantasia\" name=\"nomeFantasia\" />\r\n </mat-form-field>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"pessoa.tipoPessoa == tipoPessoaEnum().FISICA\">\r\n <b style=\"flex: 1 1 100%; margin-bottom: 10px;\">Documenta\u00E7\u00E3o</b>\r\n\r\n <mat-form-field class=\"form-25\" appearance=\"outline\">\r\n <mat-label>Identidade</mat-label>\r\n <input type=\"text\" matInput [(ngModel)]=\"pessoa.rg\" name=\"rg\" #rg=\"ngModel\" required />\r\n </mat-form-field>\r\n\r\n <mat-form-field class=\"form-25\" appearance=\"outline\">\r\n <mat-label>\u00D3rg\u00E3o Emissor</mat-label>\r\n <input type=\"text\" matInput [(ngModel)]=\"pessoa.rgOrgao\" name=\"rgOrgao\" #rgOrgao=\"ngModel\" required />\r\n </mat-form-field>\r\n\r\n <mat-form-field class=\"form-25\" appearance=\"outline\">\r\n <mat-label>Unidade Federativa</mat-label>\r\n <mat-select [(ngModel)]=\"pessoa.rgUf\" name=\"rgUf\" #rgUf=\"ngModel\" required>\r\n <mat-option *ngFor=\"let estado of getListaEstados()\" [value]=\"estado.identificador\">\r\n {{ estado.identificador }}\r\n </mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n\r\n <mat-form-field class=\"form-20\" appearance=\"outline\">\r\n <mat-label>Data de Emiss\u00E3o</mat-label>\r\n <input type=\"text\" matInput [(ngModel)]=\"pessoa.rgDataEmissao\" name=\"rgDataEmissao\" #rgDataEmissao=\"ngModel\" />\r\n </mat-form-field>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"pessoa.tipoPessoa == tipoPessoaEnum().ESTRANGEIRA \">\r\n <mat-form-field appearance=\"outline\">\r\n <mat-label>Data Chegada Brasil</mat-label>\r\n <input matInput [matDatepicker]=\"dataChegadaBrasilPicker\" [(ngModel)]=\"pessoa.dataChegadaBrasil\"\r\n name=\"dataChegadaBrasil\" #dataChegadaBrasil=\"ngModel\" required>\r\n <mat-datepicker-toggle matSuffix [for]=\"dataChegadaBrasilPicker\"></mat-datepicker-toggle>\r\n <mat-datepicker #dataChegadaBrasilPicker></mat-datepicker>\r\n </mat-form-field>\r\n\r\n <mat-form-field class=\"form-10\" appearance=\"outline\">\r\n <mat-label>Pa\u00EDs Passaporte</mat-label>\r\n <mat-select [(ngModel)]=\"pessoa.codigoPaisPassaporte\" name=\"codigoPaisPassaporte\" #codigoPaisPassaporte=\"ngModel\"\r\n required>\r\n <mat-option *ngFor=\"let paisNascimento of paises | async\" [value]=\"paisNascimento.codigo\">\r\n {{ paisNascimento.denominacao }}\r\n </mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n\r\n <mat-form-field appearance=\"outline\">\r\n <mat-label>N\u00FAmero Passaporte</mat-label>\r\n <input type=\"text\" matInput [(ngModel)]=\"pessoa.passaporte\" name=\"passaporte\" #passaporte=\"ngModel\" required />\r\n </mat-form-field>\r\n </ng-container>\r\n\r\n <lib-unb-pessoa-telefone-list style=\"flex: 1 1 100%;\" [backendURL]=\"backendURL\" [telefones]=\"pessoa.telefones\"\r\n (telefonesEmitted)=\"telefonesEmitted($event)\"></lib-unb-pessoa-telefone-list>\r\n\r\n <lib-unb-pessoa-endereco-list style=\"flex: 1 1 100%;\" [backendURL]=\"backendURL\" [enderecos]=\"pessoa.enderecos\"\r\n (enderecosEmitted)=\"enderecosEmitted($event)\"></lib-unb-pessoa-endereco-list>\r\n\r\n <lib-unb-pessoa-email-list style=\"flex: 1 1 100%;\" [backendURL]=\"backendURL\" [emails]=\"pessoa.emails\"\r\n (emailsEmitted)=\"emailsEmitted($event)\"></lib-unb-pessoa-email-list>\r\n\r\n <div *ngIf=\"isReadonlyFromSiape\" style=\"flex:1 1 100%; margin-bottom:10px;\">\r\n <mat-card>\r\n <mat-card-content>\r\n <strong>Servidor com matr\u00EDcula SIAPE deve ter seus dados autalizados pelo aplicativo do sougov</strong>\r\n </mat-card-content>\r\n </mat-card>\r\n </div>\r\n\r\n <mat-card-actions class=\"card-actions-buttons\" *ngIf=\"buscaRealizada\">\r\n <button mat-flat-button [disabled]=\"isLoading || isReadonlyFromSiape\" type=\"submit\" color=\"primary\">\r\n Salvar\r\n </button>\r\n </mat-card-actions>\r\n\r\n</form>", styles: [".card-actions-buttons{display:flex;gap:5px;flex-wrap:wrap}.form-container{display:flex;flex-wrap:wrap;column-gap:10px}:host{display:block}@media (max-width: 1000px){.form-container{flex-direction:column;gap:5px}}.break{flex-basis:100%;height:0}.form-5{flex:1 1 5%}.inline-table-container{display:flex;align-items:center;justify-content:space-between;padding:5px}@media (max-width: 600px){.form-5,.form-10,.form-15{flex:1 1 100%}}.form-10{flex:1 1 10%}.form-15{flex:1 1 15%}.form-20{flex:1 1 20%}.form-25{flex:1 1 25%}.form-30{flex:1 1 30%}.form-35{flex:1 1 35%}.form-40{flex:1 1 40%}.form-45{flex:1 1 45%}.form-50{flex:1 1 50%}.form-100{flex:1 1 100%;min-width:250px}.readonly{pointer-events:none;opacity:.6}.disabled-wrapper{pointer-events:none;opacity:.6;filter:grayscale(1)}.status-banner{display:flex;align-items:center;gap:8px;padding:10px 16px;margin:2px 0;border-radius:6px;font-size:14px;font-weight:500;&.status-inclusao{background-color:#e3f2fd;color:#1565c0;border:1px solid #bbdefb}&.status-edicao{background-color:#fff3e0;color:#ef6c00;border:1px solid #ffe0b2}&.status-bloqueado{background-color:#fce4ec;color:#c2185b;border:1px solid #f8bbd0}}\n"], dependencies: [{ kind: "directive", type: i4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i6.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i6.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i6.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i6.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i6.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i6.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i6.NgForm, selector: "form:not([ngNoForm]):not([formGroup]),ng-form,[ngForm]", inputs: ["ngFormOptions"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "component", type: i5.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i7.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "component", type: UnbMensagemComponent, selector: "unb-mensagem", inputs: ["mensagem", "tipo", "identificador"] }, { kind: "component", type: i7$1.MatCard, selector: "mat-card", inputs: ["appearance"], exportAs: ["matCard"] }, { kind: "directive", type: i7$1.MatCardActions, selector: "mat-card-actions", inputs: ["align"], exportAs: ["matCardActions"] }, { kind: "directive", type: i7$1.MatCardContent, selector: "mat-card-content" }, { kind: "component", type: i9.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i9.MatLabel, selector: "mat-label" }, { kind: "directive", type: i9.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "directive", type: i10.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "component", type: i11.MatSelect, selector: "mat-select", inputs: ["aria-describedby", "panelClass", "disabled", "disableRipple", "tabIndex", "hideSingleSelectionIndicator", "placeholder", "required", "multiple", "disableOptionCentering", "compareWith", "value", "aria-label", "aria-labelledby", "errorStateMatcher", "typeaheadDebounceInterval", "sortComparator", "id", "panelWidth"], outputs: ["openedChange", "opened", "closed", "selectionChange", "valueChange"], exportAs: ["matSelect"] }, { kind: "component", type: i12.MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }, { kind: "component", type: i14$1.MatProgressBar, selector: "mat-progress-bar", inputs: ["color", "value", "bufferValue", "mode"], outputs: ["animationEnd"], exportAs: ["matProgressBar"] }, { kind: "component", type: i15.MatDatepicker, selector: "mat-datepicker", exportAs: ["matDatepicker"] }, { kind: "directive", type: i15.MatDatepickerInput, selector: "input[matDatepicker]", inputs: ["matDatepicker", "min", "max", "matDatepickerFilter"], exportAs: ["matDatepickerInput"] }, { kind: "component", type: i15.MatDatepickerToggle, selector: "mat-datepicker-toggle", inputs: ["for", "tabIndex", "aria-label", "disabled", "disableRipple"], exportAs: ["matDatepickerToggle"] }, { kind: "component", type: UnbPessoaPesquisarComponent, selector: "lib-unb-pessoa-pesquisar", inputs: ["backendURL", "pesquisarPorCPF", "pesquisarPorCNPJ", "pesquisarPorEstrangeiro", "defaultTipoPessoa", "campoPesquisaMaxWidth", "mostrarPesquisa", "limparAposPesquisa", "label", "placeholder", "hint", "pessoa"], outputs: ["pessoaEmitted", "isLoadingChange"] }, { kind: "component", type: UnbPessoaTelefoneListComponent, selector: "lib-unb-pessoa-telefone-list", inputs: ["podeEditar", "telefones", "backendURL"], outputs: ["telefonesEmitted"] }, { kind: "component", type: UnbPessoaenderecoListComponent, selector: "lib-unb-pessoa-endereco-list", inputs: ["podeEditar", "enderecos", "backendURL"], outputs: ["enderecosEmitted"] }, { kind: "component", type: UnbPessoaEmailListComponent, selector: "lib-unb-pessoa-email-list", inputs: ["podeEditar", "emails", "backendURL"], outputs: ["emailsEmitted"] }, { kind: "pipe", type: i4.AsyncPipe, name: "async" }] }); }
|
|
2802
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.1.2", ngImport: i0, type: UnbPessoaFormDialogComponent, deps: [{ token: i4$2.MatDialogRef }, { token: MAT_DIALOG_DATA }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
2803
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.1.2", type: UnbPessoaFormDialogComponent, selector: "lib-unb-pessoa-form-dialog", inputs: { config: "config" }, outputs: { pessoaEmitted: "pessoaEmitted" }, viewQueries: [{ propertyName: "pessoaFormComponent", first: true, predicate: UnbPessoaFormComponent, descendants: true }], ngImport: i0, template: "<h2 mat-dialog-title>{{ titulo }}</h2>\r\n\r\n<mat-dialog-content class=\"mat-typography\">\r\n <lib-unb-pessoa-form\r\n [config]=\"config\"\r\n [hideSalvarButton]=true\r\n (pessoaEmitted)=\"onSalvarSucesso($event)\"\r\n (isLoadingChange)=\"onLoadingChange($event)\">\r\n </lib-unb-pessoa-form>\r\n</mat-dialog-content>\r\n\r\n<mat-dialog-actions align=\"end\">\r\n <button mat-stroked-button color=\"warn\" [disabled]=\"isLoading\" (click)=\"fechar()\">\r\n Fechar\r\n </button>\r\n\r\n <button [disabled]=\"isLoading\" mat-flat-button color=\"primary\" (click)=\"submitForm()\">\r\n Salvar\r\n </button>\r\n</mat-dialog-actions>\r\n", styles: [":host{display:flex;flex-direction:column;height:100%;max-height:100%}h2[mat-dialog-title]{flex:0 0 auto;margin:0;padding:16px 24px}mat-dialog-content{flex-grow:1;overflow-y:auto;max-height:unset!important;display:flex;flex-direction:column}mat-dialog-actions{flex:0 0 auto;border-top:1px solid #ddd;padding:8px 16px!important;margin-bottom:0!important;min-height:52px}\n"], dependencies: [{ kind: "component", type: i7.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "directive", type: i4$2.MatDialogTitle, selector: "[mat-dialog-title], [matDialogTitle]", inputs: ["id"], exportAs: ["matDialogTitle"] }, { kind: "directive", type: i4$2.MatDialogActions, selector: "[mat-dialog-actions], mat-dialog-actions, [matDialogActions]", inputs: ["align"] }, { kind: "directive", type: i4$2.MatDialogContent, selector: "[mat-dialog-content], mat-dialog-content, [matDialogContent]" }, { kind: "component", type: UnbPessoaFormComponent, selector: "lib-unb-pessoa-form", inputs: ["config", "hideSalvarButton"], outputs: ["pessoaEmitted", "isLoadingChange"] }] }); }
|
|
2634
2804
|
}
|
|
2635
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2
|
|
2805
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.2", ngImport: i0, type: UnbPessoaFormDialogComponent, decorators: [{
|
|
2636
2806
|
type: Component,
|
|
2637
|
-
args: [{ selector: 'lib-unb-pessoa-form', standalone: false, template: "<mat-progress-bar *ngIf=\"isLoading\" mode=\"indeterminate\"></mat-progress-bar>\r\n\r\n<div class=\"form-container\" [class.disabled-wrapper]=\"isLoading\">\r\n <lib-unb-pessoa-pesquisar \r\n [backendURL]=\"backendURL\" \r\n [defaultTipoPessoa]=\"defaultTipoPessoa\"\r\n [pesquisarPorCNPJ]=\"pesquisarPorCNPJ\" \r\n [pesquisarPorCPF]=\"pesquisarPorCPF\"\r\n [pesquisarPorEstrangeiro]=\"pesquisarPorEstrangeiro\" \r\n [campoPesquisaMaxWidth]=\"campoPesquisaMaxWidth\"\r\n (pessoaEmitted)=\"pessoaRecebida($event)\">\r\n </lib-unb-pessoa-pesquisar>\r\n</div>\r\n\r\n<unb-mensagem [identificador]=\"idMensagemService\"></unb-mensagem>\r\n\r\n<!-- Label indicando que est\u00E1 incluindo nova pessoa -->\r\n<div *ngIf=\"documentoPesquisado\"\r\n class=\"status-banner\" \r\n [ngClass]=\"{\r\n 'status-inclusao': !pessoa.codigoPessoa,\r\n 'status-edicao': pessoa.codigoPessoa && !isReadonlyFromSiape,\r\n 'status-bloqueado': isReadonlyFromSiape\r\n }\">\r\n\r\n <mat-icon>\r\n {{ !pessoa.codigoPessoa ? 'person_add' : (isReadonlyFromSiape ? 'lock' : 'edit') }}\r\n </mat-icon>\r\n\r\n <span>\r\n <ng-container *ngIf=\"!pessoa.codigoPessoa\">Incluindo nova pessoa</ng-container>\r\n <ng-container *ngIf=\"pessoa.codigoPessoa && !isReadonlyFromSiape\">Editando pessoa</ng-container>\r\n <ng-container *ngIf=\"isReadonlyFromSiape\">Registro SIAPE (Visualiza\u00E7\u00E3o)</ng-container>\r\n\r\n com <strong>{{ getLabelDocumento() }} {{ documentoPesquisado }}</strong>\r\n </span>\r\n\r\n</div>\r\n\r\n\r\n<form #pessoaForm=\"ngForm\" [class.readonly]=\"isReadonlyFromSiape || isLoading\" class=\"form-container mt-2\"\r\n *ngIf=\"buscaRealizada\" (ngSubmit)=\"salvar(pessoaForm)\">\r\n\r\n <!-- Campos Pessoa F\u00EDsica e Estrangeira -->\r\n <ng-container\r\n *ngIf=\"pessoa.tipoPessoa == tipoPessoaEnum().FISICA || pessoa.tipoPessoa == tipoPessoaEnum().ESTRANGEIRA\">\r\n <mat-form-field class=\"form-25\" appearance=\"outline\">\r\n <mat-label>Nome</mat-label>\r\n <input type=\"text\" matInput [(ngModel)]=\"pessoa.nome\" name=\"nome\" #nome=\"ngModel\" required />\r\n </mat-form-field>\r\n\r\n <mat-form-field class=\"form-10\" appearance=\"outline\">\r\n <mat-label>Sexo</mat-label>\r\n <mat-select [(ngModel)]=\"pessoa.codigoSexo\" name=\"codigoSexo\" #codigoSexo=\"ngModel\" required>\r\n <mat-option [value]=\"1\">Masculino</mat-option>\r\n <mat-option [value]=\"2\">Feminino</mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n\r\n <mat-form-field class=\"form-15\" appearance=\"outline\">\r\n <mat-label>Data Nascimento</mat-label>\r\n <input matInput [matDatepicker]=\"dataNascimentoPicker\" [(ngModel)]=\"pessoa.dataNascimento\" name=\"dataNascimento\"\r\n #dataNascimento=\"ngModel\" required>\r\n <mat-datepicker-toggle matSuffix [for]=\"dataNascimentoPicker\"></mat-datepicker-toggle>\r\n <mat-datepicker #dataNascimentoPicker></mat-datepicker>\r\n </mat-form-field>\r\n\r\n <mat-form-field class=\"form-10\" appearance=\"outline\">\r\n <mat-label>Estado Civil</mat-label>\r\n <mat-select [(ngModel)]=\"pessoa.codigoEstadoCivil\" name=\"codigoEstadoCivil\" #codigoEstadoCivil=\"ngModel\">\r\n <mat-option *ngFor=\"let estado of estadosCivil | async\" [value]=\"estado.codigo\">\r\n {{ estado.denominacao }}\r\n </mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n\r\n <!--\r\n <mat-form-field class=\"form-15\" appearance=\"outline\">\r\n <mat-label>Naturalidade</mat-label>\r\n <mat-select [(ngModel)]=\"pessoa.naturalidade\" name=\"naturalidade\" #naturalidade=\"ngModel\" required>\r\n <mat-option *ngFor=\"let cidade of getListaEstados()\" [value]=\"cidade.codigo\">\r\n {{ cidade.descricao }}\r\n </mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n -->\r\n <mat-form-field class=\"form-10\" appearance=\"outline\">\r\n <mat-label>Pa\u00EDs Nascimento</mat-label>\r\n <mat-select [(ngModel)]=\"pessoa.codigoPaisNascimento\" name=\"codigoPaisNascimento\" #codigoPaisNascimento=\"ngModel\"\r\n required>\r\n <mat-option *ngFor=\"let paisNascimento of paises | async\" [value]=\"paisNascimento.codigo\">\r\n <span *ngIf=\"paisNascimento.denominacao === 'BRASIL'\">\uD83C\uDDE7\uD83C\uDDF7 <b>{{ paisNascimento.denominacao }}</b></span>\r\n <span *ngIf=\"paisNascimento.denominacao !== 'BRASIL'\">{{ paisNascimento.denominacao }}</span>\r\n </mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n\r\n <mat-form-field class=\"form-10\" appearance=\"outline\" *ngIf=\"pessoa.codigoPaisNascimento == 22\"> <!-- 22 eh Brasil-->\r\n <mat-label>UF Nascimento</mat-label>\r\n <mat-select [(ngModel)]=\"pessoa.ufNascimento\" name=\"ufNascimento\" #ufNascimento=\"ngModel\" required>\r\n <mat-option *ngFor=\"let estado of getListaEstados()\" [value]=\"estado.identificador\">\r\n {{ estado.identificador }}\r\n </mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n\r\n <mat-form-field class=\"form-15\" appearance=\"outline\" *ngIf=\"pessoa.codigoPaisNascimento == 22\">\r\n <mat-label>Naturalidade</mat-label>\r\n <input type=\"text\" matInput [(ngModel)]=\"pessoa.naturalidade\" name=\"naturalidade\" #naturalidade=\"ngModel\"\r\n required />\r\n </mat-form-field>\r\n\r\n <mat-form-field class=\"form-10\" appearance=\"outline\">\r\n <mat-label>Escolaridade</mat-label>\r\n <mat-select [(ngModel)]=\"pessoa.escolaridade\" name=\"codigoEscolaridade\" #codigoEscolaridade=\"ngModel\" required>\r\n <mat-option *ngFor=\"let escolaridade of escolaridade | async\" [value]=\"escolaridade.codigo\">\r\n {{ escolaridade.denominacao }}\r\n </mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n\r\n <mat-form-field class=\"form-25\" appearance=\"outline\">\r\n <mat-label>Nome Social</mat-label>\r\n <input type=\"text\" matInput [(ngModel)]=\"pessoa.nomeSocial\" name=\"nomeSocial\" #nomeSocial=\"ngModel\" />\r\n </mat-form-field>\r\n\r\n <mat-form-field class=\"form-25\" appearance=\"outline\">\r\n <mat-label>Nome da M\u00E3e</mat-label>\r\n <input type=\"text\" matInput [(ngModel)]=\"pessoa.nomeMae\" name=\"nomeMae\" #nomeMae=\"ngModel\" required />\r\n </mat-form-field>\r\n\r\n <mat-form-field class=\"form-25\" appearance=\"outline\">\r\n <mat-label>Nome do Pai</mat-label>\r\n <input type=\"text\" matInput [(ngModel)]=\"pessoa.nomePai\" name=\"nomePai\" #nomePai=\"ngModel\" required />\r\n </mat-form-field>\r\n </ng-container>\r\n\r\n <!-- Campos Pessoa Jur\u00EDdica -->\r\n <ng-container *ngIf=\"pessoa.tipoPessoa === tipoPessoaEnum().JURIDICA\">\r\n <mat-form-field class=\"form-25\" appearance=\"outline\">\r\n <mat-label>Raz\u00E3o Social</mat-label>\r\n <input type=\"text\" matInput [(ngModel)]=\"pessoa.razaoSocial\" name=\"razaoSocial\" />\r\n </mat-form-field>\r\n <mat-form-field class=\"form-25\" appearance=\"outline\">\r\n <mat-label>Nome Fantasia</mat-label>\r\n <input type=\"text\" matInput [(ngModel)]=\"pessoa.nomeFantasia\" name=\"nomeFantasia\" />\r\n </mat-form-field>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"pessoa.tipoPessoa == tipoPessoaEnum().FISICA\">\r\n <b style=\"flex: 1 1 100%; margin-bottom: 10px;\">Documenta\u00E7\u00E3o</b>\r\n\r\n <mat-form-field class=\"form-25\" appearance=\"outline\">\r\n <mat-label>Identidade</mat-label>\r\n <input type=\"text\" matInput [(ngModel)]=\"pessoa.rg\" name=\"rg\" #rg=\"ngModel\" required />\r\n </mat-form-field>\r\n\r\n <mat-form-field class=\"form-25\" appearance=\"outline\">\r\n <mat-label>\u00D3rg\u00E3o Emissor</mat-label>\r\n <input type=\"text\" matInput [(ngModel)]=\"pessoa.rgOrgao\" name=\"rgOrgao\" #rgOrgao=\"ngModel\" required />\r\n </mat-form-field>\r\n\r\n <mat-form-field class=\"form-25\" appearance=\"outline\">\r\n <mat-label>Unidade Federativa</mat-label>\r\n <mat-select [(ngModel)]=\"pessoa.rgUf\" name=\"rgUf\" #rgUf=\"ngModel\" required>\r\n <mat-option *ngFor=\"let estado of getListaEstados()\" [value]=\"estado.identificador\">\r\n {{ estado.identificador }}\r\n </mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n\r\n <mat-form-field class=\"form-20\" appearance=\"outline\">\r\n <mat-label>Data de Emiss\u00E3o</mat-label>\r\n <input type=\"text\" matInput [(ngModel)]=\"pessoa.rgDataEmissao\" name=\"rgDataEmissao\" #rgDataEmissao=\"ngModel\" />\r\n </mat-form-field>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"pessoa.tipoPessoa == tipoPessoaEnum().ESTRANGEIRA \">\r\n <mat-form-field appearance=\"outline\">\r\n <mat-label>Data Chegada Brasil</mat-label>\r\n <input matInput [matDatepicker]=\"dataChegadaBrasilPicker\" [(ngModel)]=\"pessoa.dataChegadaBrasil\"\r\n name=\"dataChegadaBrasil\" #dataChegadaBrasil=\"ngModel\" required>\r\n <mat-datepicker-toggle matSuffix [for]=\"dataChegadaBrasilPicker\"></mat-datepicker-toggle>\r\n <mat-datepicker #dataChegadaBrasilPicker></mat-datepicker>\r\n </mat-form-field>\r\n\r\n <mat-form-field class=\"form-10\" appearance=\"outline\">\r\n <mat-label>Pa\u00EDs Passaporte</mat-label>\r\n <mat-select [(ngModel)]=\"pessoa.codigoPaisPassaporte\" name=\"codigoPaisPassaporte\" #codigoPaisPassaporte=\"ngModel\"\r\n required>\r\n <mat-option *ngFor=\"let paisNascimento of paises | async\" [value]=\"paisNascimento.codigo\">\r\n {{ paisNascimento.denominacao }}\r\n </mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n\r\n <mat-form-field appearance=\"outline\">\r\n <mat-label>N\u00FAmero Passaporte</mat-label>\r\n <input type=\"text\" matInput [(ngModel)]=\"pessoa.passaporte\" name=\"passaporte\" #passaporte=\"ngModel\" required />\r\n </mat-form-field>\r\n </ng-container>\r\n\r\n <lib-unb-pessoa-telefone-list style=\"flex: 1 1 100%;\" [backendURL]=\"backendURL\" [telefones]=\"pessoa.telefones\"\r\n (telefonesEmitted)=\"telefonesEmitted($event)\"></lib-unb-pessoa-telefone-list>\r\n\r\n <lib-unb-pessoa-endereco-list style=\"flex: 1 1 100%;\" [backendURL]=\"backendURL\" [enderecos]=\"pessoa.enderecos\"\r\n (enderecosEmitted)=\"enderecosEmitted($event)\"></lib-unb-pessoa-endereco-list>\r\n\r\n <lib-unb-pessoa-email-list style=\"flex: 1 1 100%;\" [backendURL]=\"backendURL\" [emails]=\"pessoa.emails\"\r\n (emailsEmitted)=\"emailsEmitted($event)\"></lib-unb-pessoa-email-list>\r\n\r\n <div *ngIf=\"isReadonlyFromSiape\" style=\"flex:1 1 100%; margin-bottom:10px;\">\r\n <mat-card>\r\n <mat-card-content>\r\n <strong>Servidor com matr\u00EDcula SIAPE deve ter seus dados autalizados pelo aplicativo do sougov</strong>\r\n </mat-card-content>\r\n </mat-card>\r\n </div>\r\n\r\n <mat-card-actions class=\"card-actions-buttons\" *ngIf=\"buscaRealizada\">\r\n <button mat-flat-button [disabled]=\"isLoading || isReadonlyFromSiape\" type=\"submit\" color=\"primary\">\r\n Salvar\r\n </button>\r\n </mat-card-actions>\r\n\r\n</form>", styles: [".card-actions-buttons{display:flex;gap:5px;flex-wrap:wrap}.form-container{display:flex;flex-wrap:wrap;column-gap:10px}:host{display:block}@media (max-width: 1000px){.form-container{flex-direction:column;gap:5px}}.break{flex-basis:100%;height:0}.form-5{flex:1 1 5%}.inline-table-container{display:flex;align-items:center;justify-content:space-between;padding:5px}@media (max-width: 600px){.form-5,.form-10,.form-15{flex:1 1 100%}}.form-10{flex:1 1 10%}.form-15{flex:1 1 15%}.form-20{flex:1 1 20%}.form-25{flex:1 1 25%}.form-30{flex:1 1 30%}.form-35{flex:1 1 35%}.form-40{flex:1 1 40%}.form-45{flex:1 1 45%}.form-50{flex:1 1 50%}.form-100{flex:1 1 100%;min-width:250px}.readonly{pointer-events:none;opacity:.6}.disabled-wrapper{pointer-events:none;opacity:.6;filter:grayscale(1)}.status-banner{display:flex;align-items:center;gap:8px;padding:10px 16px;margin:2px 0;border-radius:6px;font-size:14px;font-weight:500;&.status-inclusao{background-color:#e3f2fd;color:#1565c0;border:1px solid #bbdefb}&.status-edicao{background-color:#fff3e0;color:#ef6c00;border:1px solid #ffe0b2}&.status-bloqueado{background-color:#fce4ec;color:#c2185b;border:1px solid #f8bbd0}}\n"] }]
|
|
2638
|
-
}], ctorParameters: () => [{ type:
|
|
2807
|
+
args: [{ selector: 'lib-unb-pessoa-form-dialog', template: "<h2 mat-dialog-title>{{ titulo }}</h2>\r\n\r\n<mat-dialog-content class=\"mat-typography\">\r\n <lib-unb-pessoa-form\r\n [config]=\"config\"\r\n [hideSalvarButton]=true\r\n (pessoaEmitted)=\"onSalvarSucesso($event)\"\r\n (isLoadingChange)=\"onLoadingChange($event)\">\r\n </lib-unb-pessoa-form>\r\n</mat-dialog-content>\r\n\r\n<mat-dialog-actions align=\"end\">\r\n <button mat-stroked-button color=\"warn\" [disabled]=\"isLoading\" (click)=\"fechar()\">\r\n Fechar\r\n </button>\r\n\r\n <button [disabled]=\"isLoading\" mat-flat-button color=\"primary\" (click)=\"submitForm()\">\r\n Salvar\r\n </button>\r\n</mat-dialog-actions>\r\n", styles: [":host{display:flex;flex-direction:column;height:100%;max-height:100%}h2[mat-dialog-title]{flex:0 0 auto;margin:0;padding:16px 24px}mat-dialog-content{flex-grow:1;overflow-y:auto;max-height:unset!important;display:flex;flex-direction:column}mat-dialog-actions{flex:0 0 auto;border-top:1px solid #ddd;padding:8px 16px!important;margin-bottom:0!important;min-height:52px}\n"] }]
|
|
2808
|
+
}], ctorParameters: () => [{ type: i4$2.MatDialogRef }, { type: undefined, decorators: [{
|
|
2809
|
+
type: Inject,
|
|
2810
|
+
args: [MAT_DIALOG_DATA]
|
|
2811
|
+
}] }], propDecorators: { config: [{
|
|
2812
|
+
type: Input
|
|
2813
|
+
}], pessoaEmitted: [{
|
|
2814
|
+
type: Output
|
|
2815
|
+
}], pessoaFormComponent: [{
|
|
2639
2816
|
type: ViewChild,
|
|
2640
|
-
args: [
|
|
2641
|
-
}]
|
|
2817
|
+
args: [UnbPessoaFormComponent]
|
|
2818
|
+
}] } });
|
|
2819
|
+
|
|
2820
|
+
/**
|
|
2821
|
+
* Esse é um componetne Wrapper utilitário. Ele encapsula a logica de procurar e se nao achar iniciar o formulario de cadastro em um modal.
|
|
2822
|
+
* Também, se achar, ele permite alterar a pessoa encontrada.
|
|
2823
|
+
* O SGI usa para cadastro de Inquilino no formulario. La tem a pesquisa de Pessoa, se nao achar, abre o formulario de cadastro em modal. Assim, nao precisa ir em outra tela pra cadastrar
|
|
2824
|
+
* Eh possivel configurar se quer mostrar o botao de Novo (se nao achar) e Alterar (se achar). No SGI, por exemplo eu soh deixo incluir novo, pq nao faz sentido alterar a pessoa no meio do cadastro do inquilino.
|
|
2825
|
+
*/
|
|
2826
|
+
class UnbPessoaCrudModalComponent {
|
|
2827
|
+
constructor(snackBar, pessoaService, alertService, dialog) {
|
|
2828
|
+
this.snackBar = snackBar;
|
|
2829
|
+
this.pessoaService = pessoaService;
|
|
2830
|
+
this.alertService = alertService;
|
|
2831
|
+
this.dialog = dialog;
|
|
2832
|
+
this.isLoading = false;
|
|
2833
|
+
// Configuração do componente
|
|
2834
|
+
this.pesquisaConfig = new UnbPessoaPesquisaConfig();
|
|
2835
|
+
this.incluirBotaoNovo = true; // se pesquisou e nao achou, mostra botao novo
|
|
2836
|
+
this.incluirBotaoAlterar = true; // se pesquisou e achou, mostra botao alterar
|
|
2837
|
+
this.pessoaEmitted = new EventEmitter();
|
|
2838
|
+
this.pessoaSelecionada = new UnbPessoaModel();
|
|
2839
|
+
this.mostrarBotaoNovo = false;
|
|
2840
|
+
this.formConfig = new UnbPessoaFormConfig(); // o formCOnfig a gente monta conforme o pesquisaConfig
|
|
2841
|
+
}
|
|
2842
|
+
ngOnInit() {
|
|
2843
|
+
if (this.pesquisaConfig.token) {
|
|
2844
|
+
this.pessoaService.setToken(this.pesquisaConfig.token);
|
|
2845
|
+
}
|
|
2846
|
+
if (this.pesquisaConfig.backendURL) {
|
|
2847
|
+
this.pessoaService.setBackendUrl(this.pesquisaConfig.backendURL);
|
|
2848
|
+
}
|
|
2849
|
+
else {
|
|
2850
|
+
this.openSnackBar('Backend URL não informada na configuração do componente UnbPessoaCrudComponent!');
|
|
2851
|
+
}
|
|
2852
|
+
this.formConfig = new UnbPessoaFormConfig();
|
|
2853
|
+
this.formConfig.pessoa = this.pessoaSelecionada;
|
|
2854
|
+
this.formConfig.backendURL = this.pesquisaConfig.backendURL;
|
|
2855
|
+
this.formConfig.token = this.pesquisaConfig.token;
|
|
2856
|
+
}
|
|
2857
|
+
pessoaPesquisaRecebida(pessoa) {
|
|
2858
|
+
// 1. Verifica se a pessoa é nula ou se é um objeto "vazio" (sem ID e sem documentos)
|
|
2859
|
+
const isVazio = !pessoa || (!pessoa.codigoPessoa && // Não tem ID
|
|
2860
|
+
!pessoa.cpf && // Não tem CPF
|
|
2861
|
+
!pessoa.cnpj && // Não tem CNPJ
|
|
2862
|
+
!pessoa.passaporte // Não tem Passaporte
|
|
2863
|
+
);
|
|
2864
|
+
if (isVazio) {
|
|
2865
|
+
// Se for vazio, limpamos a seleção para esconder o formulário
|
|
2866
|
+
// (O *ngIf="pessoaSelecionada" no HTML vai remover o componente da tela)
|
|
2867
|
+
this.pessoaSelecionada = new UnbPessoaModel(); // ou undefined, dependendo da tipagem
|
|
2868
|
+
this.mostrarBotaoNovo = false;
|
|
2869
|
+
}
|
|
2870
|
+
else {
|
|
2871
|
+
// Se tiver algum dado (CPF digitado ou pessoa encontrada), atualiza
|
|
2872
|
+
this.pessoaSelecionada = pessoa;
|
|
2873
|
+
if (this.pessoaSelecionada.codigoPessoa) {
|
|
2874
|
+
// joga pra cima pra falar que uma pessoa foi encontrada
|
|
2875
|
+
this.pessoaEmitted.emit(pessoa);
|
|
2876
|
+
}
|
|
2877
|
+
else if (this.incluirBotaoNovo) {
|
|
2878
|
+
this.mostrarBotaoNovo = true;
|
|
2879
|
+
}
|
|
2880
|
+
}
|
|
2881
|
+
// 2. Atualiza a configuração do formulário
|
|
2882
|
+
// Importante: Só tenta acessar 'pessoa' se formConfig existir
|
|
2883
|
+
if (this.formConfig) {
|
|
2884
|
+
// Usamos o spread operator (...) para forçar o Angular a detectar a mudança,
|
|
2885
|
+
// caso o componente filho use ngOnChanges
|
|
2886
|
+
this.formConfig = {
|
|
2887
|
+
...this.formConfig,
|
|
2888
|
+
pessoa: this.pessoaSelecionada || new UnbPessoaModel() // Evita passar null pro form se não quiser
|
|
2889
|
+
};
|
|
2890
|
+
}
|
|
2891
|
+
}
|
|
2892
|
+
limparSelecao() {
|
|
2893
|
+
this.pessoaSelecionada = new UnbPessoaModel(); // ou new UnbPessoaModel()
|
|
2894
|
+
// Talvez precise avisar o componente filho para limpar o input também
|
|
2895
|
+
}
|
|
2896
|
+
getDocumentoFormatado(pessoa) {
|
|
2897
|
+
if (pessoa.cpf && pessoa.cpf.trim() !== '') {
|
|
2898
|
+
return pessoa.cpf;
|
|
2899
|
+
}
|
|
2900
|
+
else if (pessoa.cnpj && pessoa.cnpj.trim() !== '') {
|
|
2901
|
+
return pessoa.cnpj;
|
|
2902
|
+
}
|
|
2903
|
+
else if (pessoa.passaporte && pessoa.passaporte.trim() !== '') {
|
|
2904
|
+
return pessoa.passaporte;
|
|
2905
|
+
}
|
|
2906
|
+
}
|
|
2907
|
+
openModal() {
|
|
2908
|
+
const dialogRef = this.dialog.open(UnbPessoaFormDialogComponent, {
|
|
2909
|
+
// 1. Defina um painel de classe para controlar tudo no CSS
|
|
2910
|
+
panelClass: 'dialog-pessoa-fullscreen',
|
|
2911
|
+
// 2. Largura padrão para Desktop (o CSS vai sobrescrever no mobile)
|
|
2912
|
+
width: '90vw',
|
|
2913
|
+
maxWidth: '1200px', // Trava para não ficar gigante em monitores ultrawide
|
|
2914
|
+
// 3. Altura automática ou máxima (CSS controla o esticar)
|
|
2915
|
+
maxHeight: '95vh',
|
|
2916
|
+
data: {
|
|
2917
|
+
config: this.formConfig
|
|
2918
|
+
},
|
|
2919
|
+
autoFocus: 'first-tabbable'
|
|
2920
|
+
});
|
|
2921
|
+
dialogRef.afterClosed().subscribe((pessoaSalva) => {
|
|
2922
|
+
if (pessoaSalva?.codigoPessoa) {
|
|
2923
|
+
this.pessoaEmitted.emit(pessoaSalva);
|
|
2924
|
+
}
|
|
2925
|
+
});
|
|
2926
|
+
}
|
|
2927
|
+
openSnackBar(message) {
|
|
2928
|
+
this.snackBar.open(message, 'x', {
|
|
2929
|
+
duration: 5000,
|
|
2930
|
+
});
|
|
2931
|
+
}
|
|
2932
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.1.2", ngImport: i0, type: UnbPessoaCrudModalComponent, deps: [{ token: i1$2.MatSnackBar }, { token: UnBPessoaService }, { token: UnbMensagemService }, { token: i4$2.MatDialog }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
2933
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "16.1.0", version: "18.1.2", type: UnbPessoaCrudModalComponent, selector: "lib-unb-pessoa-crud-modal", inputs: { pesquisaConfig: "pesquisaConfig", incluirBotaoNovo: ["incluirBotaoNovo", "incluirBotaoNovo", booleanAttribute], incluirBotaoAlterar: ["incluirBotaoAlterar", "incluirBotaoAlterar", booleanAttribute] }, outputs: { pessoaEmitted: "pessoaEmitted" }, ngImport: i0, template: "<div class=\"search-wrapper\" [class.disabled-wrapper]=\"isLoading\">\r\n\r\n <div class=\"search-input-area\">\r\n <lib-unb-pessoa-pesquisar \r\n [config]=\"pesquisaConfig\" \r\n (pessoaEmitted)=\"pessoaPesquisaRecebida($event)\">\r\n </lib-unb-pessoa-pesquisar>\r\n </div>\r\n\r\n <div class=\"search-button-area\">\r\n\r\n <button *ngIf=\"incluirBotaoNovo && mostrarBotaoNovo && !pessoaSelecionada.codigoPessoa\" \r\n mat-stroked-button \r\n color=\"accent\"\r\n (click)=\"openModal()\" \r\n type=\"button\" \r\n style=\"white-space: nowrap;\">\r\n <mat-icon>add</mat-icon> Incluir Nova Pessoa\r\n </button>\r\n\r\n <div *ngIf=\"incluirBotaoAlterar && pessoaSelecionada.codigoPessoa\" class=\"mini-card-selected\">\r\n <div class=\"card-avatar\"><mat-icon>person</mat-icon></div>\r\n <div class=\"card-info\">\r\n <div class=\"card-name\">{{ pessoaSelecionada.nome }}</div>\r\n <div class=\"card-doc\">{{ getDocumentoFormatado(pessoaSelecionada) }}</div>\r\n </div>\r\n <div class=\"card-actions\">\r\n <button mat-stroked-button color=\"primary\" (click)=\"openModal()\" type=\"button\">\r\n <mat-icon>edit</mat-icon> Editar\r\n </button>\r\n </div>\r\n </div>\r\n\r\n </div>\r\n</div>", styles: ["::ng-deep .dialog-pessoa-fullscreen .mat-mdc-dialog-container{min-width:600px}@media (max-width: 768px){::ng-deep .dialog-pessoa-fullscreen{max-width:100vw!important;width:100vw!important;height:100vh!important}::ng-deep .dialog-pessoa-fullscreen .mat-mdc-dialog-container{max-width:100vw!important;height:100%!important;max-height:100vh!important}::ng-deep .dialog-pessoa-fullscreen .mat-mdc-dialog-surface{border-radius:0!important;height:100%!important;display:flex;flex-direction:column}}.form-container{display:flex;flex-wrap:wrap;align-items:baseline;gap:16px;width:100%}.mini-card-selected{display:flex;align-items:center;gap:12px;background-color:#fff;border:1px solid #e0e0e0;border-radius:8px;padding:8px 16px;box-shadow:0 1px 3px #00000014;white-space:nowrap;margin-bottom:22px}.card-avatar{display:flex;align-items:center;justify-content:center;width:40px;height:40px;background-color:#f5f5f5;border-radius:50%;color:#757575}.card-info{display:flex;flex-direction:column;line-height:1.3;margin-right:8px}.card-name{font-weight:600;font-size:14px;color:#333;max-width:200px;overflow:hidden;text-overflow:ellipsis}.card-doc{font-size:12px;color:#666}.card-actions{flex-shrink:0}@media (max-width: 600px){.mini-card-selected{width:100%;justify-content:space-between}.card-name{max-width:140px}}.search-wrapper{display:flex;flex-wrap:wrap;align-items:flex-end;gap:16px;width:100%}.search-input-area{flex:1;min-width:250px;max-width:400px}.search-button-area{flex-shrink:0;margin-bottom:22px}@media (max-width: 600px){.search-input-area{max-width:100%}.search-button-area{width:100%;margin-bottom:0}.search-button-area button{width:100%}}\n"], dependencies: [{ kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i5.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i7.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "component", type: UnbPessoaPesquisarComponent, selector: "lib-unb-pessoa-pesquisar", inputs: ["config"], outputs: ["pessoaEmitted", "isLoadingChange"] }] }); }
|
|
2934
|
+
}
|
|
2935
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.2", ngImport: i0, type: UnbPessoaCrudModalComponent, decorators: [{
|
|
2936
|
+
type: Component,
|
|
2937
|
+
args: [{ selector: 'lib-unb-pessoa-crud-modal', standalone: false, template: "<div class=\"search-wrapper\" [class.disabled-wrapper]=\"isLoading\">\r\n\r\n <div class=\"search-input-area\">\r\n <lib-unb-pessoa-pesquisar \r\n [config]=\"pesquisaConfig\" \r\n (pessoaEmitted)=\"pessoaPesquisaRecebida($event)\">\r\n </lib-unb-pessoa-pesquisar>\r\n </div>\r\n\r\n <div class=\"search-button-area\">\r\n\r\n <button *ngIf=\"incluirBotaoNovo && mostrarBotaoNovo && !pessoaSelecionada.codigoPessoa\" \r\n mat-stroked-button \r\n color=\"accent\"\r\n (click)=\"openModal()\" \r\n type=\"button\" \r\n style=\"white-space: nowrap;\">\r\n <mat-icon>add</mat-icon> Incluir Nova Pessoa\r\n </button>\r\n\r\n <div *ngIf=\"incluirBotaoAlterar && pessoaSelecionada.codigoPessoa\" class=\"mini-card-selected\">\r\n <div class=\"card-avatar\"><mat-icon>person</mat-icon></div>\r\n <div class=\"card-info\">\r\n <div class=\"card-name\">{{ pessoaSelecionada.nome }}</div>\r\n <div class=\"card-doc\">{{ getDocumentoFormatado(pessoaSelecionada) }}</div>\r\n </div>\r\n <div class=\"card-actions\">\r\n <button mat-stroked-button color=\"primary\" (click)=\"openModal()\" type=\"button\">\r\n <mat-icon>edit</mat-icon> Editar\r\n </button>\r\n </div>\r\n </div>\r\n\r\n </div>\r\n</div>", styles: ["::ng-deep .dialog-pessoa-fullscreen .mat-mdc-dialog-container{min-width:600px}@media (max-width: 768px){::ng-deep .dialog-pessoa-fullscreen{max-width:100vw!important;width:100vw!important;height:100vh!important}::ng-deep .dialog-pessoa-fullscreen .mat-mdc-dialog-container{max-width:100vw!important;height:100%!important;max-height:100vh!important}::ng-deep .dialog-pessoa-fullscreen .mat-mdc-dialog-surface{border-radius:0!important;height:100%!important;display:flex;flex-direction:column}}.form-container{display:flex;flex-wrap:wrap;align-items:baseline;gap:16px;width:100%}.mini-card-selected{display:flex;align-items:center;gap:12px;background-color:#fff;border:1px solid #e0e0e0;border-radius:8px;padding:8px 16px;box-shadow:0 1px 3px #00000014;white-space:nowrap;margin-bottom:22px}.card-avatar{display:flex;align-items:center;justify-content:center;width:40px;height:40px;background-color:#f5f5f5;border-radius:50%;color:#757575}.card-info{display:flex;flex-direction:column;line-height:1.3;margin-right:8px}.card-name{font-weight:600;font-size:14px;color:#333;max-width:200px;overflow:hidden;text-overflow:ellipsis}.card-doc{font-size:12px;color:#666}.card-actions{flex-shrink:0}@media (max-width: 600px){.mini-card-selected{width:100%;justify-content:space-between}.card-name{max-width:140px}}.search-wrapper{display:flex;flex-wrap:wrap;align-items:flex-end;gap:16px;width:100%}.search-input-area{flex:1;min-width:250px;max-width:400px}.search-button-area{flex-shrink:0;margin-bottom:22px}@media (max-width: 600px){.search-input-area{max-width:100%}.search-button-area{width:100%;margin-bottom:0}.search-button-area button{width:100%}}\n"] }]
|
|
2938
|
+
}], ctorParameters: () => [{ type: i1$2.MatSnackBar }, { type: UnBPessoaService }, { type: UnbMensagemService }, { type: i4$2.MatDialog }], propDecorators: { pesquisaConfig: [{
|
|
2642
2939
|
type: Input,
|
|
2643
2940
|
args: [{ required: true }]
|
|
2644
|
-
}],
|
|
2941
|
+
}], incluirBotaoNovo: [{
|
|
2645
2942
|
type: Input,
|
|
2646
2943
|
args: [{ transform: booleanAttribute }]
|
|
2647
|
-
}],
|
|
2944
|
+
}], incluirBotaoAlterar: [{
|
|
2648
2945
|
type: Input,
|
|
2649
2946
|
args: [{ transform: booleanAttribute }]
|
|
2650
|
-
}], pesquisarPorEstrangeiro: [{
|
|
2651
|
-
type: Input,
|
|
2652
|
-
args: [{ transform: booleanAttribute }]
|
|
2653
|
-
}], defaultTipoPessoa: [{
|
|
2654
|
-
type: Input
|
|
2655
|
-
}], campoPesquisaMaxWidth: [{
|
|
2656
|
-
type: Input
|
|
2657
2947
|
}], pessoaEmitted: [{
|
|
2658
2948
|
type: Output
|
|
2659
|
-
}], isLoadingChange: [{
|
|
2660
|
-
type: Output
|
|
2661
2949
|
}] } });
|
|
2662
2950
|
|
|
2951
|
+
// Força o datepicker a usar o formato dd/MM/yyyy, incluindo parse manual quando o usuário digita.
|
|
2952
|
+
class PtBrDateAdapter extends NativeDateAdapter {
|
|
2953
|
+
parse(value) {
|
|
2954
|
+
if (typeof value === 'string') {
|
|
2955
|
+
const cleaned = value.trim();
|
|
2956
|
+
const parts = cleaned.split('/');
|
|
2957
|
+
if (parts.length === 3) {
|
|
2958
|
+
const day = Number(parts[0]);
|
|
2959
|
+
const month = Number(parts[1]) - 1;
|
|
2960
|
+
const year = Number(parts[2]);
|
|
2961
|
+
if (!isNaN(day) && !isNaN(month) && !isNaN(year)) {
|
|
2962
|
+
const parsed = new Date(year, month, day);
|
|
2963
|
+
// Garantimos que o browser não ajuste para outro mês/dia por overflow.
|
|
2964
|
+
if (parsed.getFullYear() === year && parsed.getMonth() === month && parsed.getDate() === day) {
|
|
2965
|
+
return parsed;
|
|
2966
|
+
}
|
|
2967
|
+
}
|
|
2968
|
+
}
|
|
2969
|
+
}
|
|
2970
|
+
const timestamp = typeof value === 'number' ? value : Date.parse(value);
|
|
2971
|
+
return isNaN(timestamp) ? null : new Date(timestamp);
|
|
2972
|
+
}
|
|
2973
|
+
format(date) {
|
|
2974
|
+
const day = String(date.getDate()).padStart(2, '0');
|
|
2975
|
+
const month = String(date.getMonth() + 1).padStart(2, '0');
|
|
2976
|
+
const year = date.getFullYear();
|
|
2977
|
+
return `${day}/${month}/${year}`;
|
|
2978
|
+
}
|
|
2979
|
+
}
|
|
2980
|
+
const PT_BR_DATE_FORMATS = {
|
|
2981
|
+
parse: { dateInput: 'dd/MM/yyyy' },
|
|
2982
|
+
display: {
|
|
2983
|
+
dateInput: 'dd/MM/yyyy',
|
|
2984
|
+
monthYearLabel: 'MMM yyyy',
|
|
2985
|
+
dateA11yLabel: 'dd/MM/yyyy',
|
|
2986
|
+
monthYearA11yLabel: 'MMMM yyyy'
|
|
2987
|
+
}
|
|
2988
|
+
};
|
|
2663
2989
|
class UnbPessoaModule {
|
|
2664
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2
|
|
2665
|
-
static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "18.2
|
|
2990
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.1.2", ngImport: i0, type: UnbPessoaModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
|
|
2991
|
+
static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "18.1.2", ngImport: i0, type: UnbPessoaModule, declarations: [UnbPessoaFormDialogComponent, UnbPessoaCrudComponent, UnbPessoaCrudModalComponent, UnbPessoaFormComponent, UnbPessoaPesquisarComponent, UnbPessoaEnderecoFormComponent, UnbPessoaTelefoneListComponent, UnbPessoaenderecoListComponent, UnbPessoaTelefoneFormComponent, UnbPessoaEmailFormComponent, UnbPessoaEmailListComponent], imports: [CommonModule,
|
|
2666
2992
|
FormsModule,
|
|
2667
2993
|
BrowserModule,
|
|
2668
2994
|
MatIconModule,
|
|
@@ -2682,17 +3008,21 @@ class UnbPessoaModule {
|
|
|
2682
3008
|
MatProgressBarModule,
|
|
2683
3009
|
MatNativeDateModule,
|
|
2684
3010
|
MatListModule,
|
|
3011
|
+
MatDialogModule,
|
|
2685
3012
|
MatPaginatorModule,
|
|
2686
3013
|
MatExpansionModule,
|
|
2687
3014
|
MatSnackBarModule,
|
|
2688
3015
|
MatDatepickerModule,
|
|
2689
3016
|
MatRadioModule,
|
|
2690
3017
|
MatCardModule,
|
|
2691
|
-
MatDividerModule], exports: [UnbPessoaFormComponent, UnbPessoaPesquisarComponent, UnbPessoaEnderecoFormComponent, UnbPessoaTelefoneListComponent, UnbPessoaenderecoListComponent, UnbPessoaTelefoneFormComponent, UnbPessoaEmailFormComponent] }); }
|
|
2692
|
-
static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "18.2
|
|
3018
|
+
MatDividerModule], exports: [UnbPessoaFormDialogComponent, UnbPessoaCrudComponent, UnbPessoaCrudModalComponent, UnbPessoaFormComponent, UnbPessoaPesquisarComponent, UnbPessoaEnderecoFormComponent, UnbPessoaTelefoneListComponent, UnbPessoaenderecoListComponent, UnbPessoaTelefoneFormComponent, UnbPessoaEmailFormComponent] }); }
|
|
3019
|
+
static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "18.1.2", ngImport: i0, type: UnbPessoaModule, providers: [
|
|
2693
3020
|
MatDatepickerModule,
|
|
2694
3021
|
DatePipe,
|
|
2695
|
-
CurrencyPipe
|
|
3022
|
+
CurrencyPipe,
|
|
3023
|
+
{ provide: MAT_DATE_LOCALE, useValue: 'pt-BR' },
|
|
3024
|
+
{ provide: DateAdapter, useClass: PtBrDateAdapter, deps: [MAT_DATE_LOCALE] },
|
|
3025
|
+
{ provide: MAT_DATE_FORMATS, useValue: PT_BR_DATE_FORMATS }
|
|
2696
3026
|
], imports: [CommonModule,
|
|
2697
3027
|
FormsModule,
|
|
2698
3028
|
BrowserModule,
|
|
@@ -2713,6 +3043,7 @@ class UnbPessoaModule {
|
|
|
2713
3043
|
MatProgressBarModule,
|
|
2714
3044
|
MatNativeDateModule,
|
|
2715
3045
|
MatListModule,
|
|
3046
|
+
MatDialogModule,
|
|
2716
3047
|
MatPaginatorModule,
|
|
2717
3048
|
MatExpansionModule,
|
|
2718
3049
|
MatSnackBarModule,
|
|
@@ -2721,10 +3052,10 @@ class UnbPessoaModule {
|
|
|
2721
3052
|
MatCardModule,
|
|
2722
3053
|
MatDividerModule] }); }
|
|
2723
3054
|
}
|
|
2724
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2
|
|
3055
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.2", ngImport: i0, type: UnbPessoaModule, decorators: [{
|
|
2725
3056
|
type: NgModule,
|
|
2726
3057
|
args: [{
|
|
2727
|
-
declarations: [UnbPessoaFormComponent, UnbPessoaPesquisarComponent, UnbPessoaEnderecoFormComponent, UnbPessoaTelefoneListComponent, UnbPessoaenderecoListComponent, UnbPessoaTelefoneFormComponent, UnbPessoaEmailFormComponent, UnbPessoaEmailListComponent],
|
|
3058
|
+
declarations: [UnbPessoaFormDialogComponent, UnbPessoaCrudComponent, UnbPessoaCrudModalComponent, UnbPessoaFormComponent, UnbPessoaPesquisarComponent, UnbPessoaEnderecoFormComponent, UnbPessoaTelefoneListComponent, UnbPessoaenderecoListComponent, UnbPessoaTelefoneFormComponent, UnbPessoaEmailFormComponent, UnbPessoaEmailListComponent],
|
|
2728
3059
|
imports: [
|
|
2729
3060
|
CommonModule,
|
|
2730
3061
|
FormsModule,
|
|
@@ -2746,6 +3077,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
2746
3077
|
MatProgressBarModule,
|
|
2747
3078
|
MatNativeDateModule,
|
|
2748
3079
|
MatListModule,
|
|
3080
|
+
MatDialogModule,
|
|
2749
3081
|
MatPaginatorModule,
|
|
2750
3082
|
MatExpansionModule,
|
|
2751
3083
|
MatSnackBarModule,
|
|
@@ -2754,11 +3086,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
2754
3086
|
MatCardModule,
|
|
2755
3087
|
MatDividerModule
|
|
2756
3088
|
],
|
|
2757
|
-
exports: [UnbPessoaFormComponent, UnbPessoaPesquisarComponent, UnbPessoaEnderecoFormComponent, UnbPessoaTelefoneListComponent, UnbPessoaenderecoListComponent, UnbPessoaTelefoneFormComponent, UnbPessoaEmailFormComponent],
|
|
3089
|
+
exports: [UnbPessoaFormDialogComponent, UnbPessoaCrudComponent, UnbPessoaCrudModalComponent, UnbPessoaFormComponent, UnbPessoaPesquisarComponent, UnbPessoaEnderecoFormComponent, UnbPessoaTelefoneListComponent, UnbPessoaenderecoListComponent, UnbPessoaTelefoneFormComponent, UnbPessoaEmailFormComponent],
|
|
2758
3090
|
providers: [
|
|
2759
3091
|
MatDatepickerModule,
|
|
2760
3092
|
DatePipe,
|
|
2761
|
-
CurrencyPipe
|
|
3093
|
+
CurrencyPipe,
|
|
3094
|
+
{ provide: MAT_DATE_LOCALE, useValue: 'pt-BR' },
|
|
3095
|
+
{ provide: DateAdapter, useClass: PtBrDateAdapter, deps: [MAT_DATE_LOCALE] },
|
|
3096
|
+
{ provide: MAT_DATE_FORMATS, useValue: PT_BR_DATE_FORMATS }
|
|
2762
3097
|
]
|
|
2763
3098
|
}]
|
|
2764
3099
|
}] });
|
|
@@ -2792,5 +3127,5 @@ class UnbPessoaRacaCor {
|
|
|
2792
3127
|
* Generated bundle index. Do not edit.
|
|
2793
3128
|
*/
|
|
2794
3129
|
|
|
2795
|
-
export { UnBPessoaService, UnbAuthService, UnbMensagemComponent, UnbMensagemModule, UnbMensagemService, UnbNavBarComponent, UnbNavBarModule, UnbPessoaEmail, UnbPessoaEmailFormComponent, UnbPessoaEmailListComponent, UnbPessoaEmailTipo, UnbPessoaEndereco, UnbPessoaEnderecoFormComponent, UnbPessoaEnderecoTipo, UnbPessoaEscolaridade, UnbPessoaEstadoCivil, UnbPessoaFormComponent, UnbPessoaModel, UnbPessoaModule, UnbPessoaMunincipio, UnbPessoaPais, UnbPessoaPesquisarComponent, UnbPessoaRacaCor, UnbPessoaTelefone, UnbPessoaTelefoneFormComponent, UnbPessoaTelefoneListComponent, UnbPessoaTelefoneTipo, UnbPessoaenderecoListComponent, UnbTipoMensagemEnum, UnbTipoPessoaEnum, UnbUsuarioModel, listaEstados };
|
|
3130
|
+
export { PT_BR_DATE_FORMATS, PtBrDateAdapter, UnBPessoaService, UnbAuthService, UnbMensagemComponent, UnbMensagemModule, UnbMensagemService, UnbNavBarComponent, UnbNavBarModule, UnbPessoaCrudComponent, UnbPessoaCrudModalComponent, UnbPessoaEmail, UnbPessoaEmailFormComponent, UnbPessoaEmailListComponent, UnbPessoaEmailTipo, UnbPessoaEndereco, UnbPessoaEnderecoFormComponent, UnbPessoaEnderecoTipo, UnbPessoaEscolaridade, UnbPessoaEstadoCivil, UnbPessoaFormComponent, UnbPessoaFormConfig, UnbPessoaFormDialogComponent, UnbPessoaModel, UnbPessoaModule, UnbPessoaMunincipio, UnbPessoaPais, UnbPessoaPesquisaConfig, UnbPessoaPesquisarComponent, UnbPessoaRacaCor, UnbPessoaTelefone, UnbPessoaTelefoneFormComponent, UnbPessoaTelefoneListComponent, UnbPessoaTelefoneTipo, UnbPessoaenderecoListComponent, UnbTipoMensagemEnum, UnbTipoPessoaEnum, UnbUsuarioModel, listaEstados };
|
|
2796
3131
|
//# sourceMappingURL=stiunb-unb-lib-components.mjs.map
|