ngx-sp-infra 6.5.22 → 6.5.24
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.
|
@@ -16,7 +16,7 @@ import { NgxCurrencyDirective } from 'ngx-currency';
|
|
|
16
16
|
import { NgxMaskDirective, NgxMaskPipe } from 'ngx-mask';
|
|
17
17
|
import * as i3 from 'ngx-pagination';
|
|
18
18
|
import { NgxPaginationModule } from 'ngx-pagination';
|
|
19
|
-
import { Subject, debounceTime, distinctUntilChanged, BehaviorSubject, map, takeUntil, Subscription, take, tap, firstValueFrom, filter } from 'rxjs';
|
|
19
|
+
import { Subject, debounceTime, distinctUntilChanged, BehaviorSubject, combineLatest, map, takeUntil, Subscription, take, tap, firstValueFrom, filter } from 'rxjs';
|
|
20
20
|
import * as i1$2 from '@angular/platform-browser';
|
|
21
21
|
import { cloneDeep, escapeRegExp } from 'lodash';
|
|
22
22
|
import * as i2$1 from 'ngx-drag-drop';
|
|
@@ -6486,14 +6486,13 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.15", ngImpo
|
|
|
6486
6486
|
class LibComboboxReworkComponent {
|
|
6487
6487
|
// #endregion PRIVATE
|
|
6488
6488
|
// #region PUBLIC
|
|
6489
|
-
get list() { return this._list; }
|
|
6489
|
+
get list() { return this._list$.value; }
|
|
6490
6490
|
set list(value) {
|
|
6491
|
-
this._list = value;
|
|
6491
|
+
// this._list = value;
|
|
6492
|
+
this._list$.next(value);
|
|
6492
6493
|
// Re-resolve the current value when the list changes
|
|
6493
6494
|
if (this._value)
|
|
6494
6495
|
this.writeValue(this._value);
|
|
6495
|
-
const search = this.searchControl.value;
|
|
6496
|
-
this.searchControl.setValue(search == '' ? '' : search, { emitEvent: true });
|
|
6497
6496
|
}
|
|
6498
6497
|
// Getter/Setter para o valor
|
|
6499
6498
|
get value() { return this._value; }
|
|
@@ -6532,8 +6531,10 @@ class LibComboboxReworkComponent {
|
|
|
6532
6531
|
this._cdr = _cdr;
|
|
6533
6532
|
this._elementRef = _elementRef;
|
|
6534
6533
|
/** Valor interno do componente */
|
|
6535
|
-
|
|
6534
|
+
// private _list: T[] = [];
|
|
6536
6535
|
this._value = null;
|
|
6536
|
+
// BehaviorSubject para a lista
|
|
6537
|
+
this._list$ = new BehaviorSubject([]);
|
|
6537
6538
|
this._search$ = new BehaviorSubject("");
|
|
6538
6539
|
this._onTouched = () => { };
|
|
6539
6540
|
this._onChange = (_) => { };
|
|
@@ -6553,7 +6554,8 @@ class LibComboboxReworkComponent {
|
|
|
6553
6554
|
this.invalid = false;
|
|
6554
6555
|
this.isOpen = false;
|
|
6555
6556
|
this.searchControl = new FormControl("");
|
|
6556
|
-
this.filteredItems$ = this._search
|
|
6557
|
+
this.filteredItems$ = combineLatest([this._search$, this._list$])
|
|
6558
|
+
.pipe(debounceTime(150), map(([term, list]) => this.filterItems(term, list)));
|
|
6557
6559
|
this.compare = (a, b) => {
|
|
6558
6560
|
if (!a || !b)
|
|
6559
6561
|
return false;
|
|
@@ -6596,8 +6598,6 @@ class LibComboboxReworkComponent {
|
|
|
6596
6598
|
}
|
|
6597
6599
|
ngOnChanges(changes) {
|
|
6598
6600
|
if (changes['list'] && changes['list'].currentValue) {
|
|
6599
|
-
const search = this.searchControl.value;
|
|
6600
|
-
this.searchControl.setValue(search == '' ? '' : search, { emitEvent: true });
|
|
6601
6601
|
}
|
|
6602
6602
|
}
|
|
6603
6603
|
ngOnDestroy() {
|
|
@@ -6608,16 +6608,17 @@ class LibComboboxReworkComponent {
|
|
|
6608
6608
|
// O que fazer quando o evento de redimensionamento da tela ocorrer
|
|
6609
6609
|
onResize() { this.setMaxWidth(); }
|
|
6610
6610
|
// #region ==========> UTILS <==========
|
|
6611
|
-
filterItems(term) {
|
|
6611
|
+
filterItems(term, list) {
|
|
6612
6612
|
if (!term)
|
|
6613
|
-
return
|
|
6613
|
+
return list;
|
|
6614
6614
|
const t = term.toLowerCase();
|
|
6615
|
-
|
|
6615
|
+
const filtered = list.filter((item) => {
|
|
6616
6616
|
const label = typeof item === 'object'
|
|
6617
6617
|
? item[this.customLabel] ?? ''
|
|
6618
6618
|
: String(item);
|
|
6619
6619
|
return label.toLowerCase().includes(t);
|
|
6620
6620
|
});
|
|
6621
|
+
return filtered;
|
|
6621
6622
|
}
|
|
6622
6623
|
// #region Seleção
|
|
6623
6624
|
select(item) {
|
|
@@ -6786,7 +6787,7 @@ class LibComboboxReworkComponent {
|
|
|
6786
6787
|
useExisting: forwardRef(() => LibComboboxReworkComponent),
|
|
6787
6788
|
multi: true
|
|
6788
6789
|
}
|
|
6789
|
-
], queries: [{ propertyName: "optionTemplate", first: true, predicate: ["optionTemplate"], descendants: true, read: TemplateRef }, { propertyName: "leftButtonTemplate", first: true, predicate: ["leftButtonTemplate"], descendants: true, read: TemplateRef }, { propertyName: "rightButtonTemplate", first: true, predicate: ["rightButtonTemplate"], descendants: true, read: TemplateRef }], viewQueries: [{ propertyName: "toggleButton", first: true, predicate: ["toggleButton"], descendants: true, static: true }], usesOnChanges: true, ngImport: i0, template: "<div class=\"reusable-combobox input-group\" [class.show]=\"isOpen\" (focusout)=\"onBlurOutside($event)\" >\n @if (leftButtonTemplate) { <ng-container *ngTemplateOutlet=\"leftButtonTemplate\"></ng-container> }\n\n <div class=\"dropdown w-100\">\n\n <input #toggleButton id=\"toggle-button\" class=\"form-select d-flex align-items-center text-start w-100 overflow-hidden text-truncate\" data-bs-toggle=\"dropdown\"\n data-bs-auto-close=\"outside\" [attr.aria-expanded]=\"isOpen\" [attr.aria-haspopup]=\"true\" [attr.aria-label]=\"placeholder\" [class.disabled]=\"disabled\"\n [class.is-invalid]=\"invalid\" (click)=\"toggleDropdown()\" [value]=\"displayValue()\" [placeholder]=\"placeholder\" readonly\n [ngClass]=\"{\n 'rounded-start-0': leftButtonTemplate,\n 'rounded-end-0': rightButtonTemplate,\n }\" />\n\n <div class=\"dropdown-menu p-2 w-100\" [class.show]=\"isOpen\" style=\"max-height: 320px; overflow-y: auto;\" >\n <div class=\"dropdown-search input-group mb-2\">\n <input class=\"form-control form-control-sm\" type=\"search\" [placeholder]=\"searchPlaceholder\" [formControl]=\"searchControl\" aria-label=\"Pesquisar op\u00E7\u00F5es\" (keyup.enter)=\"filterButtonClick.emit(searchControl.value)\" />\n <button class=\"btn btn-sm btn-primary\" type=\"button\" (click)=\"filterButtonClick.emit(searchControl.value)\"> <lib-icon iconName=\"lupa\" iconSize=\"medium-small\" /> </button>\n </div>\n\n @if (multiple && selectedValues?.length) {\n <div class=\"d-flex flex-row gap-2 flex-wrap my-2\">\n <span *ngFor=\"let value of selectedValues; trackBy: trackByFn\" class=\"px-3 badge rounded-pill text-primary bg-primary-subtle\">\n {{ value[customLabel] }} <lib-icon class=\"glb-cursor-pointer\" iconName=\"fechar\" iconSize=\"small\" (click)=\"select(value)\" />\n </span>\n </div>\n }\n\n <!-- Se utilizar o filtro interno utiliza a propriedade de lista filteredItems$, caso contr\u00E1rio usa a pr\u00F3pria list pois ela ser\u00E1 filtrada pelo componente pai -->\n <ng-container *ngIf=\"(innerFilter ? (filteredItems$ | async) : list) as items\">\n @if (items.length === 0) { <div class=\"py-2 px-3 text-muted small\">{{ noResultsText }}</div> }\n\n @if (value !== '' && value !== null) {\n <button type=\"button\" class=\"dropdown-item d-flex align-items-center\" (click)=\"writeValue(null)\">\n <span class=\"fw-bold\">Limpar {{ multiple ? 'op\u00E7\u00F5es selecionadas' : 'op\u00E7\u00E3o selecionada' }}</span>\n </button>\n }\n\n <button *ngFor=\"let item of items; trackBy: trackByFn\" class=\"dropdown-item d-flex align-items-center\" type=\"button\"\n (click)=\"select(item)\" [attr.aria-selected]=\"isSelected(item)\" >\n\n @if (optionTemplate) {\n <ng-container *ngTemplateOutlet=\"optionTemplate; context: { $implicit: item, selected: isSelected(item) }\"></ng-container>\n }\n @else {\n <div class=\"w-100 original\">\n <div class=\"d-flex justify-content-between\">\n <div [ngClass]=\"{ 'text-primary fw-bold': isSelected(item) }\">\n <!-- Se o valor do ID e do LABEL for vazio exibe apenas um risquinho para identificar que h\u00E1 uma op\u00E7\u00E3o ali -->\n @if ((item[customLabel] ?? item[customValue]) === '') {\n <span class=\"fst-italic text-muted\">Nenhum t\u00EDtulo informado para esta op\u00E7\u00E3o</span>\n }\n @else {\n {{ (item[customLabel] ?? item[customValue]) }}\n }\n </div>\n </div>\n </div>\n }\n </button>\n </ng-container>\n </div>\n </div>\n\n @if (rightButtonTemplate) { <ng-container *ngTemplateOutlet=\"rightButtonTemplate\"></ng-container> }\n</div
|
|
6790
|
+
], queries: [{ propertyName: "optionTemplate", first: true, predicate: ["optionTemplate"], descendants: true, read: TemplateRef }, { propertyName: "leftButtonTemplate", first: true, predicate: ["leftButtonTemplate"], descendants: true, read: TemplateRef }, { propertyName: "rightButtonTemplate", first: true, predicate: ["rightButtonTemplate"], descendants: true, read: TemplateRef }], viewQueries: [{ propertyName: "toggleButton", first: true, predicate: ["toggleButton"], descendants: true, static: true }], usesOnChanges: true, ngImport: i0, template: "<div class=\"reusable-combobox input-group\" [class.show]=\"isOpen\" (focusout)=\"onBlurOutside($event)\" >\n @if (leftButtonTemplate) { <ng-container *ngTemplateOutlet=\"leftButtonTemplate\"></ng-container> }\n\n <div class=\"dropdown w-100\">\n\n <input #toggleButton id=\"toggle-button\" class=\"form-select d-flex align-items-center text-start w-100 overflow-hidden text-truncate\" data-bs-toggle=\"dropdown\"\n data-bs-auto-close=\"outside\" [attr.aria-expanded]=\"isOpen\" [attr.aria-haspopup]=\"true\" [attr.aria-label]=\"placeholder\" [class.disabled]=\"disabled\"\n [class.is-invalid]=\"invalid\" (click)=\"toggleDropdown()\" [value]=\"displayValue()\" [placeholder]=\"placeholder\" readonly\n [ngClass]=\"{\n 'rounded-start-0': leftButtonTemplate,\n 'rounded-end-0': rightButtonTemplate,\n }\" />\n\n <div class=\"dropdown-menu p-2 w-100\" [class.show]=\"isOpen\" style=\"max-height: 320px; overflow-y: auto;\" >\n <div class=\"dropdown-search input-group mb-2\">\n <input class=\"form-control form-control-sm\" type=\"search\" [placeholder]=\"searchPlaceholder\" [formControl]=\"searchControl\" aria-label=\"Pesquisar op\u00E7\u00F5es\" (keyup.enter)=\"filterButtonClick.emit(searchControl.value)\" />\n <button class=\"btn btn-sm btn-primary\" type=\"button\" (click)=\"filterButtonClick.emit(searchControl.value)\"> <lib-icon iconName=\"lupa\" iconSize=\"medium-small\" /> </button>\n </div>\n\n @if (multiple && selectedValues?.length) {\n <div class=\"d-flex flex-row gap-2 flex-wrap my-2\">\n <span *ngFor=\"let value of selectedValues; trackBy: trackByFn\" class=\"px-3 badge rounded-pill text-primary bg-primary-subtle\">\n {{ value[customLabel] }} <lib-icon class=\"glb-cursor-pointer\" iconName=\"fechar\" iconSize=\"small\" (click)=\"select(value)\" />\n </span>\n </div>\n }\n\n <!-- Se utilizar o filtro interno utiliza a propriedade de lista filteredItems$, caso contr\u00E1rio usa a pr\u00F3pria list pois ela ser\u00E1 filtrada pelo componente pai -->\n <ng-container *ngIf=\"(innerFilter ? (filteredItems$ | async) : list) as items\">\n @if (items.length === 0) { <div class=\"py-2 px-3 text-muted small\">{{ noResultsText }}</div> }\n\n @if (value !== '' && value !== null) {\n <button type=\"button\" class=\"dropdown-item d-flex align-items-center\" (click)=\"writeValue(null)\">\n <span class=\"fw-bold\">Limpar {{ multiple ? 'op\u00E7\u00F5es selecionadas' : 'op\u00E7\u00E3o selecionada' }}</span>\n </button>\n }\n\n <button *ngFor=\"let item of items; trackBy: trackByFn\" class=\"dropdown-item d-flex align-items-center\" type=\"button\"\n (click)=\"select(item)\" [attr.aria-selected]=\"isSelected(item)\" >\n\n @if (optionTemplate) {\n <ng-container *ngTemplateOutlet=\"optionTemplate; context: { $implicit: item, selected: isSelected(item) }\"></ng-container>\n }\n @else {\n <div class=\"w-100 original\">\n <div class=\"d-flex justify-content-between\">\n <div [ngClass]=\"{ 'text-primary fw-bold': isSelected(item) }\">\n <!-- Se o valor do ID e do LABEL for vazio exibe apenas um risquinho para identificar que h\u00E1 uma op\u00E7\u00E3o ali -->\n @if ((item[customLabel] ?? item[customValue]) === '') {\n <span class=\"fst-italic text-muted\">Nenhum t\u00EDtulo informado para esta op\u00E7\u00E3o</span>\n }\n @else {\n {{ (item[customLabel] ?? item[customValue]) }}\n }\n </div>\n </div>\n </div>\n }\n </button>\n </ng-container>\n </div>\n </div>\n\n @if (rightButtonTemplate) { <ng-container *ngTemplateOutlet=\"rightButtonTemplate\"></ng-container> }\n</div>", styles: [".reusable-combobox{position:relative;display:flex;flex-wrap:nowrap;width:100%;max-width:100%}.reusable-combobox #toggle-button{box-sizing:border-box}.reusable-combobox .dropdown-menu{width:100%;box-shadow:0 6px 18px #00000014;border-radius:.5rem}.reusable-combobox .dropdown-item{cursor:pointer;border-radius:6px;transition:all .3s ease}.reusable-combobox .dropdown-item:hover:not(:focus){background-color:#f1f5f9}.reusable-combobox.compact .dropdown-menu{max-height:200px}.bg-primary-subtle{background-color:#d1dfe7!important}::-webkit-scrollbar{width:4px;background:transparent}::-webkit-scrollbar-thumb{background:#bbb;border-radius:16px}.disabled{background-color:#e9ecef!important}.dropdown-item{min-height:32px!important}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$5.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1$5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1$5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1$5.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "pipe", type: i1$5.AsyncPipe, name: "async" }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.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: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "component", type: LibIconsComponent, selector: "lib-icon", inputs: ["iconName", "iconColor", "iconSize", "iconFill"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
6790
6791
|
}
|
|
6791
6792
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.15", ngImport: i0, type: LibComboboxReworkComponent, decorators: [{
|
|
6792
6793
|
type: Component,
|
|
@@ -6801,7 +6802,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.15", ngImpo
|
|
|
6801
6802
|
useExisting: forwardRef(() => LibComboboxReworkComponent),
|
|
6802
6803
|
multi: true
|
|
6803
6804
|
}
|
|
6804
|
-
], template: "<div class=\"reusable-combobox input-group\" [class.show]=\"isOpen\" (focusout)=\"onBlurOutside($event)\" >\n @if (leftButtonTemplate) { <ng-container *ngTemplateOutlet=\"leftButtonTemplate\"></ng-container> }\n\n <div class=\"dropdown w-100\">\n\n <input #toggleButton id=\"toggle-button\" class=\"form-select d-flex align-items-center text-start w-100 overflow-hidden text-truncate\" data-bs-toggle=\"dropdown\"\n data-bs-auto-close=\"outside\" [attr.aria-expanded]=\"isOpen\" [attr.aria-haspopup]=\"true\" [attr.aria-label]=\"placeholder\" [class.disabled]=\"disabled\"\n [class.is-invalid]=\"invalid\" (click)=\"toggleDropdown()\" [value]=\"displayValue()\" [placeholder]=\"placeholder\" readonly\n [ngClass]=\"{\n 'rounded-start-0': leftButtonTemplate,\n 'rounded-end-0': rightButtonTemplate,\n }\" />\n\n <div class=\"dropdown-menu p-2 w-100\" [class.show]=\"isOpen\" style=\"max-height: 320px; overflow-y: auto;\" >\n <div class=\"dropdown-search input-group mb-2\">\n <input class=\"form-control form-control-sm\" type=\"search\" [placeholder]=\"searchPlaceholder\" [formControl]=\"searchControl\" aria-label=\"Pesquisar op\u00E7\u00F5es\" (keyup.enter)=\"filterButtonClick.emit(searchControl.value)\" />\n <button class=\"btn btn-sm btn-primary\" type=\"button\" (click)=\"filterButtonClick.emit(searchControl.value)\"> <lib-icon iconName=\"lupa\" iconSize=\"medium-small\" /> </button>\n </div>\n\n @if (multiple && selectedValues?.length) {\n <div class=\"d-flex flex-row gap-2 flex-wrap my-2\">\n <span *ngFor=\"let value of selectedValues; trackBy: trackByFn\" class=\"px-3 badge rounded-pill text-primary bg-primary-subtle\">\n {{ value[customLabel] }} <lib-icon class=\"glb-cursor-pointer\" iconName=\"fechar\" iconSize=\"small\" (click)=\"select(value)\" />\n </span>\n </div>\n }\n\n <!-- Se utilizar o filtro interno utiliza a propriedade de lista filteredItems$, caso contr\u00E1rio usa a pr\u00F3pria list pois ela ser\u00E1 filtrada pelo componente pai -->\n <ng-container *ngIf=\"(innerFilter ? (filteredItems$ | async) : list) as items\">\n @if (items.length === 0) { <div class=\"py-2 px-3 text-muted small\">{{ noResultsText }}</div> }\n\n @if (value !== '' && value !== null) {\n <button type=\"button\" class=\"dropdown-item d-flex align-items-center\" (click)=\"writeValue(null)\">\n <span class=\"fw-bold\">Limpar {{ multiple ? 'op\u00E7\u00F5es selecionadas' : 'op\u00E7\u00E3o selecionada' }}</span>\n </button>\n }\n\n <button *ngFor=\"let item of items; trackBy: trackByFn\" class=\"dropdown-item d-flex align-items-center\" type=\"button\"\n (click)=\"select(item)\" [attr.aria-selected]=\"isSelected(item)\" >\n\n @if (optionTemplate) {\n <ng-container *ngTemplateOutlet=\"optionTemplate; context: { $implicit: item, selected: isSelected(item) }\"></ng-container>\n }\n @else {\n <div class=\"w-100 original\">\n <div class=\"d-flex justify-content-between\">\n <div [ngClass]=\"{ 'text-primary fw-bold': isSelected(item) }\">\n <!-- Se o valor do ID e do LABEL for vazio exibe apenas um risquinho para identificar que h\u00E1 uma op\u00E7\u00E3o ali -->\n @if ((item[customLabel] ?? item[customValue]) === '') {\n <span class=\"fst-italic text-muted\">Nenhum t\u00EDtulo informado para esta op\u00E7\u00E3o</span>\n }\n @else {\n {{ (item[customLabel] ?? item[customValue]) }}\n }\n </div>\n </div>\n </div>\n }\n </button>\n </ng-container>\n </div>\n </div>\n\n @if (rightButtonTemplate) { <ng-container *ngTemplateOutlet=\"rightButtonTemplate\"></ng-container> }\n</div
|
|
6805
|
+
], template: "<div class=\"reusable-combobox input-group\" [class.show]=\"isOpen\" (focusout)=\"onBlurOutside($event)\" >\n @if (leftButtonTemplate) { <ng-container *ngTemplateOutlet=\"leftButtonTemplate\"></ng-container> }\n\n <div class=\"dropdown w-100\">\n\n <input #toggleButton id=\"toggle-button\" class=\"form-select d-flex align-items-center text-start w-100 overflow-hidden text-truncate\" data-bs-toggle=\"dropdown\"\n data-bs-auto-close=\"outside\" [attr.aria-expanded]=\"isOpen\" [attr.aria-haspopup]=\"true\" [attr.aria-label]=\"placeholder\" [class.disabled]=\"disabled\"\n [class.is-invalid]=\"invalid\" (click)=\"toggleDropdown()\" [value]=\"displayValue()\" [placeholder]=\"placeholder\" readonly\n [ngClass]=\"{\n 'rounded-start-0': leftButtonTemplate,\n 'rounded-end-0': rightButtonTemplate,\n }\" />\n\n <div class=\"dropdown-menu p-2 w-100\" [class.show]=\"isOpen\" style=\"max-height: 320px; overflow-y: auto;\" >\n <div class=\"dropdown-search input-group mb-2\">\n <input class=\"form-control form-control-sm\" type=\"search\" [placeholder]=\"searchPlaceholder\" [formControl]=\"searchControl\" aria-label=\"Pesquisar op\u00E7\u00F5es\" (keyup.enter)=\"filterButtonClick.emit(searchControl.value)\" />\n <button class=\"btn btn-sm btn-primary\" type=\"button\" (click)=\"filterButtonClick.emit(searchControl.value)\"> <lib-icon iconName=\"lupa\" iconSize=\"medium-small\" /> </button>\n </div>\n\n @if (multiple && selectedValues?.length) {\n <div class=\"d-flex flex-row gap-2 flex-wrap my-2\">\n <span *ngFor=\"let value of selectedValues; trackBy: trackByFn\" class=\"px-3 badge rounded-pill text-primary bg-primary-subtle\">\n {{ value[customLabel] }} <lib-icon class=\"glb-cursor-pointer\" iconName=\"fechar\" iconSize=\"small\" (click)=\"select(value)\" />\n </span>\n </div>\n }\n\n <!-- Se utilizar o filtro interno utiliza a propriedade de lista filteredItems$, caso contr\u00E1rio usa a pr\u00F3pria list pois ela ser\u00E1 filtrada pelo componente pai -->\n <ng-container *ngIf=\"(innerFilter ? (filteredItems$ | async) : list) as items\">\n @if (items.length === 0) { <div class=\"py-2 px-3 text-muted small\">{{ noResultsText }}</div> }\n\n @if (value !== '' && value !== null) {\n <button type=\"button\" class=\"dropdown-item d-flex align-items-center\" (click)=\"writeValue(null)\">\n <span class=\"fw-bold\">Limpar {{ multiple ? 'op\u00E7\u00F5es selecionadas' : 'op\u00E7\u00E3o selecionada' }}</span>\n </button>\n }\n\n <button *ngFor=\"let item of items; trackBy: trackByFn\" class=\"dropdown-item d-flex align-items-center\" type=\"button\"\n (click)=\"select(item)\" [attr.aria-selected]=\"isSelected(item)\" >\n\n @if (optionTemplate) {\n <ng-container *ngTemplateOutlet=\"optionTemplate; context: { $implicit: item, selected: isSelected(item) }\"></ng-container>\n }\n @else {\n <div class=\"w-100 original\">\n <div class=\"d-flex justify-content-between\">\n <div [ngClass]=\"{ 'text-primary fw-bold': isSelected(item) }\">\n <!-- Se o valor do ID e do LABEL for vazio exibe apenas um risquinho para identificar que h\u00E1 uma op\u00E7\u00E3o ali -->\n @if ((item[customLabel] ?? item[customValue]) === '') {\n <span class=\"fst-italic text-muted\">Nenhum t\u00EDtulo informado para esta op\u00E7\u00E3o</span>\n }\n @else {\n {{ (item[customLabel] ?? item[customValue]) }}\n }\n </div>\n </div>\n </div>\n }\n </button>\n </ng-container>\n </div>\n </div>\n\n @if (rightButtonTemplate) { <ng-container *ngTemplateOutlet=\"rightButtonTemplate\"></ng-container> }\n</div>", styles: [".reusable-combobox{position:relative;display:flex;flex-wrap:nowrap;width:100%;max-width:100%}.reusable-combobox #toggle-button{box-sizing:border-box}.reusable-combobox .dropdown-menu{width:100%;box-shadow:0 6px 18px #00000014;border-radius:.5rem}.reusable-combobox .dropdown-item{cursor:pointer;border-radius:6px;transition:all .3s ease}.reusable-combobox .dropdown-item:hover:not(:focus){background-color:#f1f5f9}.reusable-combobox.compact .dropdown-menu{max-height:200px}.bg-primary-subtle{background-color:#d1dfe7!important}::-webkit-scrollbar{width:4px;background:transparent}::-webkit-scrollbar-thumb{background:#bbb;border-radius:16px}.disabled{background-color:#e9ecef!important}.dropdown-item{min-height:32px!important}\n"] }]
|
|
6805
6806
|
}], ctorParameters: () => [{ type: i0.ChangeDetectorRef }, { type: i0.ElementRef }], propDecorators: { list: [{
|
|
6806
6807
|
type: Input,
|
|
6807
6808
|
args: [{ required: true }]
|
|
@@ -12031,27 +12032,84 @@ class CpfCnpjValidator {
|
|
|
12031
12032
|
/**
|
|
12032
12033
|
* Valida um CPF ou CNPJ de acordo com seu dígito verificador.
|
|
12033
12034
|
*/
|
|
12035
|
+
// static validate(c: AbstractControl): ValidationErrors | null {
|
|
12036
|
+
// let cpfCnpj: any = "";
|
|
12037
|
+
// if (c.value) cpfCnpj = c.value.replace(/\D/g, '');
|
|
12038
|
+
// if (cpfCnpj === '') {
|
|
12039
|
+
// return null;
|
|
12040
|
+
// }
|
|
12041
|
+
// // Verifica o tamanho da string.
|
|
12042
|
+
// if ([CpfCnpjValidator.cpfLength, CpfCnpjValidator.cnpjLength].indexOf(cpfCnpj.length) < 0) {
|
|
12043
|
+
// return { cpcnpjInvalid: true };
|
|
12044
|
+
// }
|
|
12045
|
+
// // Verifica se todos os dígitos são iguais, exceto para CPF com dígitos zerados.
|
|
12046
|
+
// if (/^([0-9])\1*$/.test(cpfCnpj) && cpfCnpj !== '00000000000') {
|
|
12047
|
+
// return { cpcnpjInvalid: true };
|
|
12048
|
+
// }
|
|
12049
|
+
// // A seguir é realizado o cálculo verificador.
|
|
12050
|
+
// const cpfCnpjArr: number[] = cpfCnpj.split('').reverse().slice(2);
|
|
12051
|
+
// cpfCnpjArr.unshift(CpfCnpjValidator.buildDigit(cpfCnpjArr));
|
|
12052
|
+
// cpfCnpjArr.unshift(CpfCnpjValidator.buildDigit(cpfCnpjArr));
|
|
12053
|
+
// if (cpfCnpj !== cpfCnpjArr.reverse().join('')) {
|
|
12054
|
+
// // Dígito verificador não é válido, resultando em falha.
|
|
12055
|
+
// return { cpcnpjInvalidDigit: true };
|
|
12056
|
+
// }
|
|
12057
|
+
// return null;
|
|
12058
|
+
// }
|
|
12034
12059
|
static validate(c) {
|
|
12035
|
-
let
|
|
12036
|
-
if (
|
|
12037
|
-
cpfCnpj = c.value.replace(/\D/g, '');
|
|
12038
|
-
if (cpfCnpj === '') {
|
|
12060
|
+
let valor = (c.value || "").toUpperCase().replace(/[^A-Z0-9]/g, "");
|
|
12061
|
+
if (!valor)
|
|
12039
12062
|
return null;
|
|
12040
|
-
|
|
12041
|
-
|
|
12042
|
-
if (
|
|
12063
|
+
const isCPF = valor.length === 11;
|
|
12064
|
+
const isCNPJ = valor.length === 14;
|
|
12065
|
+
if (!isCPF && !isCNPJ) {
|
|
12043
12066
|
return { cpcnpjInvalid: true };
|
|
12044
12067
|
}
|
|
12045
|
-
//
|
|
12046
|
-
if (
|
|
12068
|
+
// CPF ===========================================
|
|
12069
|
+
if (isCPF) {
|
|
12070
|
+
if (/^(\d)\1+$/.test(valor))
|
|
12071
|
+
return { cpcnpjInvalid: true };
|
|
12072
|
+
const calcDV = (base) => {
|
|
12073
|
+
let soma = 0;
|
|
12074
|
+
for (let i = 0; i < base.length; i++) {
|
|
12075
|
+
soma += parseInt(base[i], 10) * (base.length + 1 - i);
|
|
12076
|
+
}
|
|
12077
|
+
const resto = soma % 11;
|
|
12078
|
+
return resto < 2 ? 0 : 11 - resto;
|
|
12079
|
+
};
|
|
12080
|
+
const dv1 = calcDV(valor.substring(0, 9));
|
|
12081
|
+
const dv2 = calcDV(valor.substring(0, 9) + dv1);
|
|
12082
|
+
if (valor !== valor.substring(0, 9) + dv1.toString() + dv2.toString()) {
|
|
12083
|
+
return { cpcnpjInvalidDigit: true };
|
|
12084
|
+
}
|
|
12085
|
+
return null;
|
|
12086
|
+
}
|
|
12087
|
+
// CNPJ ALFANUMÉRICO ===========================================
|
|
12088
|
+
// Rejeita todos iguais
|
|
12089
|
+
if (/^([A-Z0-9])\1*$/.test(valor)) {
|
|
12047
12090
|
return { cpcnpjInvalid: true };
|
|
12048
12091
|
}
|
|
12049
|
-
//
|
|
12050
|
-
const
|
|
12051
|
-
|
|
12052
|
-
|
|
12053
|
-
|
|
12054
|
-
|
|
12092
|
+
// Converte as letras para numeros
|
|
12093
|
+
const valores = valor.split('').map((c) => {
|
|
12094
|
+
return c.charCodeAt(0) - 48;
|
|
12095
|
+
});
|
|
12096
|
+
const peso1 = [5, 4, 3, 2, 9, 8, 7, 6, 5, 4, 3, 2];
|
|
12097
|
+
const peso2 = [6, 5, 4, 3, 2, 9, 8, 7, 6, 5, 4, 3, 2];
|
|
12098
|
+
// DV1
|
|
12099
|
+
let soma1 = 0;
|
|
12100
|
+
for (let i = 0; i < 12; i++)
|
|
12101
|
+
soma1 += valores[i] * peso1[i];
|
|
12102
|
+
const resto1 = soma1 % 11;
|
|
12103
|
+
const dv1 = resto1 < 2 ? 0 : 11 - resto1;
|
|
12104
|
+
// DV2
|
|
12105
|
+
let soma2 = 0;
|
|
12106
|
+
for (let i = 0; i < 12; i++)
|
|
12107
|
+
soma2 += valores[i] * peso2[i];
|
|
12108
|
+
soma2 += dv1 * peso2[12];
|
|
12109
|
+
const resto2 = soma2 % 11;
|
|
12110
|
+
const dv2 = resto2 < 2 ? 0 : 11 - resto2;
|
|
12111
|
+
// Verifica os DVs
|
|
12112
|
+
if (valores[12] !== dv1 || valores[13] !== dv2) {
|
|
12055
12113
|
return { cpcnpjInvalidDigit: true };
|
|
12056
12114
|
}
|
|
12057
12115
|
return null;
|