@seniorsistemas/components-ai 1.1.0 → 1.1.1-master-e6e3fa22
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/components/dynamic-form/dynamic-form.component.mjs +15 -13
- package/esm2022/lib/components/dynamic-form/fields/dynamic-field-date.component.mjs +26 -10
- package/esm2022/lib/config/primeng.config.mjs +10 -2
- package/esm2022/lib/pipes/date-format.pipe.mjs +81 -0
- package/esm2022/lib/services/entity.service.mjs +29 -3
- package/esm2022/lib/services/locale.service.mjs +200 -0
- package/esm2022/public-api.mjs +3 -1
- package/fesm2022/seniorsistemas-components-ai.mjs +365 -42
- package/fesm2022/seniorsistemas-components-ai.mjs.map +1 -1
- package/lib/components/dynamic-form/dynamic-form.component.d.ts +3 -1
- package/lib/components/dynamic-form/fields/dynamic-field-date.component.d.ts +10 -2
- package/lib/pipes/date-format.pipe.d.ts +29 -0
- package/lib/services/entity.service.d.ts +6 -0
- package/lib/services/locale.service.d.ts +29 -0
- package/package.json +1 -1
- package/public-api.d.ts +2 -0
|
@@ -1,18 +1,20 @@
|
|
|
1
1
|
import * as i0 from '@angular/core';
|
|
2
|
-
import { NgModule, Injectable, Optional, Inject, Pipe, EventEmitter, Component, Input, Output, Directive, HostListener, ViewEncapsulation, makeEnvironmentProviders, inject
|
|
2
|
+
import { NgModule, Injectable, Optional, Inject, Pipe, EventEmitter, Component, Input, Output, Directive, HostListener, ViewEncapsulation, APP_INITIALIZER, Injector, makeEnvironmentProviders, inject } from '@angular/core';
|
|
3
3
|
import * as i2 from '@angular/common';
|
|
4
4
|
import { CommonModule, DOCUMENT } from '@angular/common';
|
|
5
5
|
import * as i1 from '@angular/common/http';
|
|
6
6
|
import { HttpParams } from '@angular/common/http';
|
|
7
7
|
import { throwError, BehaviorSubject, of, from, concatMap, catchError as catchError$1 } from 'rxjs';
|
|
8
8
|
import { catchError, map, filter } from 'rxjs/operators';
|
|
9
|
-
import * as
|
|
9
|
+
import * as i1$1 from 'primeng/config';
|
|
10
|
+
import { providePrimeNG } from 'primeng/config';
|
|
11
|
+
import * as i3 from '@angular/forms';
|
|
10
12
|
import { FormsModule, ReactiveFormsModule } from '@angular/forms';
|
|
11
|
-
import * as
|
|
13
|
+
import * as i4 from 'primeng/dialog';
|
|
12
14
|
import { DialogModule } from 'primeng/dialog';
|
|
13
|
-
import * as i4 from 'primeng/button';
|
|
15
|
+
import * as i4$1 from 'primeng/button';
|
|
14
16
|
import { ButtonModule } from 'primeng/button';
|
|
15
|
-
import * as i7
|
|
17
|
+
import * as i7 from 'primeng/radiobutton';
|
|
16
18
|
import { RadioButtonModule } from 'primeng/radiobutton';
|
|
17
19
|
import * as i8 from 'primeng/checkbox';
|
|
18
20
|
import { CheckboxModule } from 'primeng/checkbox';
|
|
@@ -20,23 +22,23 @@ import { DividerModule } from 'primeng/divider';
|
|
|
20
22
|
import * as XLSX from 'xlsx';
|
|
21
23
|
import jsPDF from 'jspdf';
|
|
22
24
|
import 'jspdf-autotable';
|
|
23
|
-
import * as i2$
|
|
25
|
+
import * as i2$1 from 'primeng/api';
|
|
24
26
|
import { ConfirmationService, MessageService } from 'primeng/api';
|
|
25
27
|
import * as i5 from 'primeng/progressbar';
|
|
26
28
|
import { ProgressBarModule } from 'primeng/progressbar';
|
|
27
29
|
import * as i6 from 'primeng/tag';
|
|
28
30
|
import { TagModule } from 'primeng/tag';
|
|
29
|
-
import * as i1$
|
|
31
|
+
import * as i1$2 from '@angular/router';
|
|
30
32
|
import { NavigationEnd, Router } from '@angular/router';
|
|
31
|
-
import * as
|
|
33
|
+
import * as i6$1 from 'primeng/panel';
|
|
32
34
|
import { PanelModule } from 'primeng/panel';
|
|
33
|
-
import * as
|
|
35
|
+
import * as i9$1 from 'primeng/drawer';
|
|
34
36
|
import { DrawerModule } from 'primeng/drawer';
|
|
35
|
-
import * as i4$
|
|
37
|
+
import * as i4$2 from 'primeng/inputtext';
|
|
36
38
|
import { InputTextModule } from 'primeng/inputtext';
|
|
37
|
-
import * as i3 from 'primeng/inputnumber';
|
|
39
|
+
import * as i3$1 from 'primeng/inputnumber';
|
|
38
40
|
import { InputNumberModule } from 'primeng/inputnumber';
|
|
39
|
-
import * as
|
|
41
|
+
import * as i4$3 from 'primeng/calendar';
|
|
40
42
|
import { CalendarModule } from 'primeng/calendar';
|
|
41
43
|
import * as i3$2 from 'primeng/dropdown';
|
|
42
44
|
import { DropdownModule } from 'primeng/dropdown';
|
|
@@ -45,7 +47,6 @@ import { TableModule } from 'primeng/table';
|
|
|
45
47
|
import * as i9 from 'primeng/tooltip';
|
|
46
48
|
import { TooltipModule } from 'primeng/tooltip';
|
|
47
49
|
import { InputTextarea } from 'primeng/inputtextarea';
|
|
48
|
-
import { providePrimeNG } from 'primeng/config';
|
|
49
50
|
import Aura from '@primeuix/themes/aura';
|
|
50
51
|
import { definePreset } from '@primeuix/themes';
|
|
51
52
|
|
|
@@ -169,18 +170,44 @@ class EntityService {
|
|
|
169
170
|
return this.http.get(`${this.entityUrl}/${id}`)
|
|
170
171
|
.pipe(catchError(this.handleError));
|
|
171
172
|
}
|
|
173
|
+
/**
|
|
174
|
+
* Sanitiza uma entidade antes de enviar para a API.
|
|
175
|
+
* Objetos aninhados com `id` são reduzidos a `{ id }` para evitar
|
|
176
|
+
* problemas com referências circulares ($ref) e dados desnecessários.
|
|
177
|
+
*/
|
|
178
|
+
sanitizeEntity(entity) {
|
|
179
|
+
if (!entity || typeof entity !== 'object')
|
|
180
|
+
return entity;
|
|
181
|
+
const sanitized = {};
|
|
182
|
+
for (const key of Object.keys(entity)) {
|
|
183
|
+
const value = entity[key];
|
|
184
|
+
if (value === null || value === undefined) {
|
|
185
|
+
sanitized[key] = value;
|
|
186
|
+
}
|
|
187
|
+
else if (Array.isArray(value)) {
|
|
188
|
+
sanitized[key] = value.map((item) => item && typeof item === 'object' && item.id ? { id: item.id } : item);
|
|
189
|
+
}
|
|
190
|
+
else if (typeof value === 'object' && value.id && key !== '_discriminator') {
|
|
191
|
+
sanitized[key] = { id: value.id };
|
|
192
|
+
}
|
|
193
|
+
else {
|
|
194
|
+
sanitized[key] = value;
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
return sanitized;
|
|
198
|
+
}
|
|
172
199
|
/**
|
|
173
200
|
* Create new entity
|
|
174
201
|
*/
|
|
175
202
|
insert(entity) {
|
|
176
|
-
return this.http.post(this.entityUrl, entity)
|
|
203
|
+
return this.http.post(this.entityUrl, this.sanitizeEntity(entity))
|
|
177
204
|
.pipe(catchError(this.handleError));
|
|
178
205
|
}
|
|
179
206
|
/**
|
|
180
207
|
* Update existing entity
|
|
181
208
|
*/
|
|
182
209
|
update(id, entity) {
|
|
183
|
-
return this.http.put(`${this.entityUrl}/${id}`, entity)
|
|
210
|
+
return this.http.put(`${this.entityUrl}/${id}`, this.sanitizeEntity(entity))
|
|
184
211
|
.pipe(catchError(this.handleError));
|
|
185
212
|
}
|
|
186
213
|
/**
|
|
@@ -1708,6 +1735,202 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
1708
1735
|
}]
|
|
1709
1736
|
}], ctorParameters: () => [{ type: TranslationService }] });
|
|
1710
1737
|
|
|
1738
|
+
/**
|
|
1739
|
+
* Mapa de traduções do PrimeNG Calendar por idioma
|
|
1740
|
+
*/
|
|
1741
|
+
const PRIMENG_LOCALE = {
|
|
1742
|
+
'pt-BR': {
|
|
1743
|
+
dayNames: ['Domingo', 'Segunda', 'Terça', 'Quarta', 'Quinta', 'Sexta', 'Sábado'],
|
|
1744
|
+
dayNamesShort: ['Dom', 'Seg', 'Ter', 'Qua', 'Qui', 'Sex', 'Sáb'],
|
|
1745
|
+
dayNamesMin: ['Do', 'Se', 'Te', 'Qa', 'Qi', 'Sx', 'Sa'],
|
|
1746
|
+
monthNames: ['Janeiro', 'Fevereiro', 'Março', 'Abril', 'Maio', 'Junho', 'Julho', 'Agosto', 'Setembro', 'Outubro', 'Novembro', 'Dezembro'],
|
|
1747
|
+
monthNamesShort: ['Jan', 'Fev', 'Mar', 'Abr', 'Mai', 'Jun', 'Jul', 'Ago', 'Set', 'Out', 'Nov', 'Dez'],
|
|
1748
|
+
today: 'Hoje',
|
|
1749
|
+
clear: 'Limpar',
|
|
1750
|
+
weekHeader: 'Sm',
|
|
1751
|
+
firstDayOfWeek: 0,
|
|
1752
|
+
dateFormat: 'dd/mm/yy',
|
|
1753
|
+
accept: 'Sim',
|
|
1754
|
+
reject: 'Não',
|
|
1755
|
+
choose: 'Escolher',
|
|
1756
|
+
upload: 'Enviar',
|
|
1757
|
+
cancel: 'Cancelar',
|
|
1758
|
+
pending: 'Pendente',
|
|
1759
|
+
emptyMessage: 'Nenhum resultado encontrado',
|
|
1760
|
+
emptyFilterMessage: 'Nenhum resultado encontrado',
|
|
1761
|
+
chooseYear: 'Escolher ano',
|
|
1762
|
+
chooseMonth: 'Escolher mês',
|
|
1763
|
+
chooseDate: 'Escolher data',
|
|
1764
|
+
prevDecade: 'Década anterior',
|
|
1765
|
+
nextDecade: 'Próxima década',
|
|
1766
|
+
prevYear: 'Ano anterior',
|
|
1767
|
+
nextYear: 'Próximo ano',
|
|
1768
|
+
prevMonth: 'Mês anterior',
|
|
1769
|
+
nextMonth: 'Próximo mês',
|
|
1770
|
+
prevHour: 'Hora anterior',
|
|
1771
|
+
nextHour: 'Próxima hora',
|
|
1772
|
+
prevMinute: 'Minuto anterior',
|
|
1773
|
+
nextMinute: 'Próximo minuto',
|
|
1774
|
+
prevSecond: 'Segundo anterior',
|
|
1775
|
+
nextSecond: 'Próximo segundo',
|
|
1776
|
+
am: 'AM',
|
|
1777
|
+
pm: 'PM'
|
|
1778
|
+
},
|
|
1779
|
+
'en-US': {
|
|
1780
|
+
dayNames: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],
|
|
1781
|
+
dayNamesShort: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],
|
|
1782
|
+
dayNamesMin: ['Su', 'Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa'],
|
|
1783
|
+
monthNames: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],
|
|
1784
|
+
monthNamesShort: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],
|
|
1785
|
+
today: 'Today',
|
|
1786
|
+
clear: 'Clear',
|
|
1787
|
+
weekHeader: 'Wk',
|
|
1788
|
+
firstDayOfWeek: 0,
|
|
1789
|
+
dateFormat: 'mm/dd/yy',
|
|
1790
|
+
accept: 'Yes',
|
|
1791
|
+
reject: 'No',
|
|
1792
|
+
choose: 'Choose',
|
|
1793
|
+
upload: 'Upload',
|
|
1794
|
+
cancel: 'Cancel',
|
|
1795
|
+
pending: 'Pending',
|
|
1796
|
+
emptyMessage: 'No results found',
|
|
1797
|
+
emptyFilterMessage: 'No results found',
|
|
1798
|
+
chooseYear: 'Choose Year',
|
|
1799
|
+
chooseMonth: 'Choose Month',
|
|
1800
|
+
chooseDate: 'Choose Date',
|
|
1801
|
+
prevDecade: 'Previous Decade',
|
|
1802
|
+
nextDecade: 'Next Decade',
|
|
1803
|
+
prevYear: 'Previous Year',
|
|
1804
|
+
nextYear: 'Next Year',
|
|
1805
|
+
prevMonth: 'Previous Month',
|
|
1806
|
+
nextMonth: 'Next Month',
|
|
1807
|
+
prevHour: 'Previous Hour',
|
|
1808
|
+
nextHour: 'Next Hour',
|
|
1809
|
+
prevMinute: 'Previous Minute',
|
|
1810
|
+
nextMinute: 'Next Minute',
|
|
1811
|
+
prevSecond: 'Previous Second',
|
|
1812
|
+
nextSecond: 'Next Second',
|
|
1813
|
+
am: 'AM',
|
|
1814
|
+
pm: 'PM'
|
|
1815
|
+
},
|
|
1816
|
+
'es-ES': {
|
|
1817
|
+
dayNames: ['Domingo', 'Lunes', 'Martes', 'Miércoles', 'Jueves', 'Viernes', 'Sábado'],
|
|
1818
|
+
dayNamesShort: ['Dom', 'Lun', 'Mar', 'Mié', 'Jue', 'Vie', 'Sáb'],
|
|
1819
|
+
dayNamesMin: ['Do', 'Lu', 'Ma', 'Mi', 'Ju', 'Vi', 'Sa'],
|
|
1820
|
+
monthNames: ['Enero', 'Febrero', 'Marzo', 'Abril', 'Mayo', 'Junio', 'Julio', 'Agosto', 'Septiembre', 'Octubre', 'Noviembre', 'Diciembre'],
|
|
1821
|
+
monthNamesShort: ['Ene', 'Feb', 'Mar', 'Abr', 'May', 'Jun', 'Jul', 'Ago', 'Sep', 'Oct', 'Nov', 'Dic'],
|
|
1822
|
+
today: 'Hoy',
|
|
1823
|
+
clear: 'Limpiar',
|
|
1824
|
+
weekHeader: 'Sm',
|
|
1825
|
+
firstDayOfWeek: 1,
|
|
1826
|
+
dateFormat: 'dd/mm/yy',
|
|
1827
|
+
accept: 'Sí',
|
|
1828
|
+
reject: 'No',
|
|
1829
|
+
choose: 'Elegir',
|
|
1830
|
+
upload: 'Subir',
|
|
1831
|
+
cancel: 'Cancelar',
|
|
1832
|
+
pending: 'Pendiente',
|
|
1833
|
+
emptyMessage: 'No se encontraron resultados',
|
|
1834
|
+
emptyFilterMessage: 'No se encontraron resultados',
|
|
1835
|
+
chooseYear: 'Elegir año',
|
|
1836
|
+
chooseMonth: 'Elegir mes',
|
|
1837
|
+
chooseDate: 'Elegir fecha',
|
|
1838
|
+
prevDecade: 'Década anterior',
|
|
1839
|
+
nextDecade: 'Siguiente década',
|
|
1840
|
+
prevYear: 'Año anterior',
|
|
1841
|
+
nextYear: 'Siguiente año',
|
|
1842
|
+
prevMonth: 'Mes anterior',
|
|
1843
|
+
nextMonth: 'Siguiente mes',
|
|
1844
|
+
prevHour: 'Hora anterior',
|
|
1845
|
+
nextHour: 'Siguiente hora',
|
|
1846
|
+
prevMinute: 'Minuto anterior',
|
|
1847
|
+
nextMinute: 'Siguiente minuto',
|
|
1848
|
+
prevSecond: 'Segundo anterior',
|
|
1849
|
+
nextSecond: 'Siguiente segundo',
|
|
1850
|
+
am: 'AM',
|
|
1851
|
+
pm: 'PM'
|
|
1852
|
+
}
|
|
1853
|
+
};
|
|
1854
|
+
/**
|
|
1855
|
+
* Formatos de data por idioma para uso em pipes e formatação
|
|
1856
|
+
*/
|
|
1857
|
+
const DATE_FORMATS = {
|
|
1858
|
+
'pt-BR': 'dd/MM/yyyy',
|
|
1859
|
+
'en-US': 'MM/dd/yyyy',
|
|
1860
|
+
'es-ES': 'dd/MM/yyyy'
|
|
1861
|
+
};
|
|
1862
|
+
/**
|
|
1863
|
+
* Locales do Intl por idioma
|
|
1864
|
+
*/
|
|
1865
|
+
const INTL_LOCALES = {
|
|
1866
|
+
'pt-BR': 'pt-BR',
|
|
1867
|
+
'en-US': 'en-US',
|
|
1868
|
+
'es-ES': 'es-ES'
|
|
1869
|
+
};
|
|
1870
|
+
class LocaleService {
|
|
1871
|
+
primeNG;
|
|
1872
|
+
translationService;
|
|
1873
|
+
initialized = false;
|
|
1874
|
+
constructor(primeNG, translationService) {
|
|
1875
|
+
this.primeNG = primeNG;
|
|
1876
|
+
this.translationService = translationService;
|
|
1877
|
+
this.init();
|
|
1878
|
+
}
|
|
1879
|
+
init() {
|
|
1880
|
+
if (this.initialized)
|
|
1881
|
+
return;
|
|
1882
|
+
this.initialized = true;
|
|
1883
|
+
// Aplicar locale inicial
|
|
1884
|
+
this.applyLocale(this.translationService.getCurrentLanguage());
|
|
1885
|
+
// Reagir a mudanças de idioma
|
|
1886
|
+
this.translationService.currentLanguage$.subscribe((language) => {
|
|
1887
|
+
this.applyLocale(language);
|
|
1888
|
+
});
|
|
1889
|
+
}
|
|
1890
|
+
applyLocale(language) {
|
|
1891
|
+
const locale = PRIMENG_LOCALE[language] || PRIMENG_LOCALE['pt-BR'];
|
|
1892
|
+
this.primeNG.setTranslation(locale);
|
|
1893
|
+
}
|
|
1894
|
+
/**
|
|
1895
|
+
* Retorna o formato de data PrimeNG (p-calendar) para o idioma atual
|
|
1896
|
+
*/
|
|
1897
|
+
getPrimeNGDateFormat() {
|
|
1898
|
+
const language = this.translationService.getCurrentLanguage();
|
|
1899
|
+
return PRIMENG_LOCALE[language]?.dateFormat || 'dd/mm/yy';
|
|
1900
|
+
}
|
|
1901
|
+
/**
|
|
1902
|
+
* Retorna o formato de data Angular (DatePipe) para o idioma atual
|
|
1903
|
+
*/
|
|
1904
|
+
getDateFormat() {
|
|
1905
|
+
return DATE_FORMATS[this.translationService.getCurrentLanguage()] || DATE_FORMATS['pt-BR'];
|
|
1906
|
+
}
|
|
1907
|
+
/**
|
|
1908
|
+
* Retorna o locale Intl para o idioma atual
|
|
1909
|
+
*/
|
|
1910
|
+
getIntlLocale() {
|
|
1911
|
+
return INTL_LOCALES[this.translationService.getCurrentLanguage()] || INTL_LOCALES['pt-BR'];
|
|
1912
|
+
}
|
|
1913
|
+
/**
|
|
1914
|
+
* Formata uma data string (yyyy-MM-dd ou ISO) para o formato do idioma atual
|
|
1915
|
+
*/
|
|
1916
|
+
formatDate(value) {
|
|
1917
|
+
if (!value)
|
|
1918
|
+
return '';
|
|
1919
|
+
const date = typeof value === 'string' ? new Date(value + (value.length === 10 ? 'T00:00:00' : '')) : value;
|
|
1920
|
+
if (isNaN(date.getTime()))
|
|
1921
|
+
return String(value);
|
|
1922
|
+
return date.toLocaleDateString(this.getIntlLocale());
|
|
1923
|
+
}
|
|
1924
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: LocaleService, deps: [{ token: i1$1.PrimeNG }, { token: TranslationService }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
1925
|
+
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: LocaleService, providedIn: 'root' });
|
|
1926
|
+
}
|
|
1927
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: LocaleService, decorators: [{
|
|
1928
|
+
type: Injectable,
|
|
1929
|
+
args: [{
|
|
1930
|
+
providedIn: 'root'
|
|
1931
|
+
}]
|
|
1932
|
+
}], ctorParameters: () => [{ type: i1$1.PrimeNG }, { type: TranslationService }] });
|
|
1933
|
+
|
|
1711
1934
|
class TranslatePipe {
|
|
1712
1935
|
translationService;
|
|
1713
1936
|
cdr;
|
|
@@ -1939,7 +2162,7 @@ class ExportDialogComponent {
|
|
|
1939
2162
|
doc.save(fileName);
|
|
1940
2163
|
}
|
|
1941
2164
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ExportDialogComponent, deps: [{ token: TranslationService }], target: i0.ɵɵFactoryTarget.Component });
|
|
1942
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: ExportDialogComponent, isStandalone: true, selector: "sia-export-dialog", inputs: { visible: "visible", allRecords: "allRecords", selectedRecords: "selectedRecords", statusLabels: "statusLabels", translationPrefix: "translationPrefix", availableColumns: "availableColumns" }, outputs: { visibleChange: "visibleChange" }, usesOnChanges: true, ngImport: i0, template: "<p-dialog\n [(visible)]=\"visible\"\n (onHide)=\"onHide()\"\n [modal]=\"true\"\n [draggable]=\"false\"\n [resizable]=\"false\"\n [style]=\"{ width: '700px' }\"\n styleClass=\"export-dialog\"\n>\n <ng-template pTemplate=\"header\">\n <div class=\"custom-header\">\n <i class=\"pi pi-download header-icon\"></i>\n <span>{{ 'design.components_ai.export_data_title' | translate }}</span>\n </div>\n </ng-template>\n\n <div class=\"export-content\">\n <!-- Formato de Exporta\u00E7\u00E3o -->\n <div class=\"export-section\">\n <div class=\"section-header\">\n <div class=\"section-icon\">\n <i class=\"pi pi-file\"></i>\n </div>\n <h3>{{ 'design.components_ai.export_format_title' | translate }}</h3>\n </div>\n <div class=\"format-options\">\n <div\n *ngFor=\"let format of formats\"\n class=\"format-card\"\n [class.selected]=\"exportFormat === format.value\"\n (click)=\"exportFormat = format.value\"\n >\n <div class=\"card-radio\">\n <p-radioButton\n [value]=\"format.value\"\n [(ngModel)]=\"exportFormat\"\n [inputId]=\"format.value\"\n ></p-radioButton>\n </div>\n <div class=\"card-icon\" [class.excel]=\"format.value === 'xlsx'\" [class.pdf]=\"format.value === 'pdf'\">\n <i class=\"pi\" [ngClass]=\"format.icon\"></i>\n </div>\n <div class=\"card-info\">\n <label [for]=\"format.value\" class=\"card-label\">{{ format.label }}</label>\n <span class=\"card-description\">{{ format.description }}</span>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Escopo de Exporta\u00E7\u00E3o -->\n <div class=\"export-section\">\n <div class=\"section-header\">\n <div class=\"section-icon\">\n <i class=\"pi pi-filter\"></i>\n </div>\n <h3>{{ 'design.components_ai.export_scope_title' | translate }}</h3>\n </div>\n <div class=\"scope-options\">\n <div\n *ngFor=\"let scope of scopes\"\n class=\"scope-card\"\n [class.selected]=\"exportScope === scope.value\"\n [class.disabled]=\"scope.value === 'selected' && selectedRecords.length === 0\"\n (click)=\"scope.value === 'selected' && selectedRecords.length === 0 ? null : exportScope = scope.value\"\n >\n <div class=\"card-radio\">\n <p-radioButton\n [value]=\"scope.value\"\n [(ngModel)]=\"exportScope\"\n [inputId]=\"scope.value\"\n [disabled]=\"scope.value === 'selected' && selectedRecords.length === 0\"\n ></p-radioButton>\n </div>\n <div class=\"card-icon\">\n <i class=\"pi\" [ngClass]=\"scope.icon\"></i>\n </div>\n <div class=\"card-info\">\n <label [for]=\"scope.value\" class=\"card-label\">{{ scope.label }}</label>\n <span class=\"card-description\">{{ scope.description }}</span>\n <span class=\"card-count\">\n <i class=\"pi pi-circle-fill\"></i>\n {{ scope.value === 'all' ? allRecords.length : selectedRecords.length }} {{ 'design.components_ai.export_records_count' | translate }}\n </span>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Sele\u00E7\u00E3o de Colunas -->\n <div class=\"export-section\">\n <div class=\"section-header\">\n <div class=\"section-icon\">\n <i class=\"pi pi-table\"></i>\n </div>\n <h3>{{ 'design.components_ai.export_columns_title' | translate }}</h3>\n <div class=\"column-actions\">\n <button type=\"button\" class=\"action-link\" (click)=\"selectAllColumns()\">\n {{ 'design.components_ai.export_select_all_columns' | translate }}\n </button>\n <span class=\"separator\">|</span>\n <button type=\"button\" class=\"action-link\" (click)=\"deselectAllColumns()\">\n {{ 'design.components_ai.export_clear_selection' | translate }}\n </button>\n </div>\n </div>\n <div class=\"columns-grid\">\n <div\n *ngFor=\"let column of columns\"\n class=\"column-item\"\n [class.selected]=\"column.selected\"\n (click)=\"column.selected = !column.selected\"\n >\n <p-checkbox\n [(ngModel)]=\"column.selected\"\n [binary]=\"true\"\n [inputId]=\"column.field\"\n ></p-checkbox>\n <label [for]=\"column.field\" class=\"column-label\">\n {{ column.header }}\n </label>\n </div>\n </div>\n <div class=\"columns-summary\">\n <i class=\"pi pi-info-circle\"></i>\n <span>{{ selectedColumnsCount }} {{ 'design.components_ai.export_columns_summary' | translate }} {{ columns.length }} {{ 'design.components_ai.export_columns_selected' | translate }}</span>\n </div>\n </div>\n </div>\n\n <ng-template pTemplate=\"footer\">\n <p-button\n [label]=\"'design.components_ai.cancel' | translate\"\n icon=\"pi pi-times\"\n severity=\"secondary\"\n [text]=\"true\"\n (onClick)=\"onHide()\"\n ></p-button>\n <p-button\n [label]=\"'design.components_ai.export_button' | translate\"\n icon=\"pi pi-download\"\n [disabled]=\"!canExport\"\n (onClick)=\"export()\"\n ></p-button>\n </ng-template>\n</p-dialog>\n", styles: ["::ng-deep .export-dialog .p-dialog{border-radius:16px;overflow:hidden;box-shadow:0 20px 60px #0000004d}::ng-deep .export-dialog .p-dialog-content{padding:0;background:#fff;max-height:70vh;overflow-y:auto}.custom-header{display:flex;align-items:center;gap:12px;font-size:18px;font-weight:600}.custom-header .header-icon{font-size:22px;color:var(--p-primary-500)}.export-content{padding:28px 32px}.export-section{margin-bottom:32px}.export-section:last-child{margin-bottom:0}.export-section .section-header{display:flex;align-items:center;gap:12px;margin-bottom:20px}.export-section .section-header .section-icon{width:36px;height:36px;display:flex;align-items:center;justify-content:center;background:linear-gradient(135deg,rgba(var(--p-primary-rgb),.1),rgba(var(--p-primary-rgb),.15));border-radius:10px}.export-section .section-header .section-icon i{font-size:18px;color:var(--p-primary-500)}.export-section .section-header h3{margin:0;font-size:17px;font-weight:700;color:var(--neutral-color-800);flex:1}.export-section .section-header .column-actions{display:flex;align-items:center;gap:10px;font-size:13px}.export-section .section-header .column-actions .action-link{background:none;border:none;color:var(--p-primary-500);cursor:pointer;font-weight:600;padding:0;transition:all .2s;font-size:13px}.export-section .section-header .column-actions .action-link:hover{color:var(--p-primary-500)}.export-section .section-header .column-actions .separator{color:var(--neutral-color-300);font-weight:400}.format-options{display:grid;grid-template-columns:repeat(2,1fr);gap:16px}.format-card{display:flex;align-items:center;gap:16px;padding:20px;border:2px solid #e5e7eb;border-radius:12px;cursor:pointer;transition:all .3s cubic-bezier(.4,0,.2,1);background:#fff;position:relative;overflow:hidden}.format-card:before{content:\"\";position:absolute;inset:0;background:linear-gradient(135deg,rgba(var(--p-primary-rgb),.03),rgba(var(--p-primary-rgb),.06));opacity:0;transition:opacity .3s}.format-card:hover{border-color:var(--p-primary-500);transform:translateY(-2px);box-shadow:0 8px 24px rgba(var(--p-primary-rgb),.15)}.format-card:hover:before{opacity:1}.format-card.selected{border-color:var(--p-primary-500);background:linear-gradient(135deg,rgba(var(--p-primary-rgb),.05),rgba(var(--p-primary-rgb),.08));box-shadow:0 0 0 4px rgba(var(--p-primary-rgb),.1)}.format-card.selected .card-icon{background:linear-gradient(135deg,var(--p-primary-500) 0%,var(--p-primary-500) 100%);transform:scale(1.05)}.format-card.selected .card-icon i{color:#fff}.format-card .card-radio ::ng-deep .p-radiobutton .p-radiobutton-box{width:20px;height:20px;border-width:2px}.format-card .card-icon{width:52px;height:52px;display:flex;align-items:center;justify-content:center;border-radius:12px;transition:all .3s;position:relative;z-index:1}.format-card .card-icon.excel{background:linear-gradient(135deg,var(--p-primary-50) 0%,var(--p-primary-100) 100%)}.format-card .card-icon.excel i{color:#107c41;font-size:26px}.format-card .card-icon.pdf{background:linear-gradient(135deg,#fee8e8,#fdd4d4)}.format-card .card-icon.pdf i{color:#dc2626;font-size:26px}.format-card .card-info{flex:1;display:flex;flex-direction:column;gap:4px;position:relative;z-index:1}.format-card .card-label{font-size:16px;font-weight:700;color:var(--neutral-color-800);cursor:pointer;margin:0}.format-card .card-description{font-size:13px;color:var(--neutral-color-600);line-height:1.4}.scope-options{display:flex;flex-direction:column;gap:14px}.scope-card{display:flex;align-items:center;gap:16px;padding:20px;border:2px solid #e5e7eb;border-radius:12px;cursor:pointer;transition:all .3s cubic-bezier(.4,0,.2,1);background:#fff;position:relative;overflow:hidden}.scope-card:before{content:\"\";position:absolute;inset:0;background:linear-gradient(135deg,rgba(var(--p-primary-rgb),.03),rgba(var(--p-primary-rgb),.06));opacity:0;transition:opacity .3s}.scope-card:hover:not(.disabled){border-color:var(--p-primary-500);box-shadow:0 4px 16px rgba(var(--p-primary-rgb),.12)}.scope-card:hover:not(.disabled):before{opacity:1}.scope-card.selected{border-color:var(--p-primary-500);background:linear-gradient(135deg,rgba(var(--p-primary-rgb),.05),rgba(var(--p-primary-rgb),.08));box-shadow:0 0 0 4px rgba(var(--p-primary-rgb),.1)}.scope-card.selected .card-icon{background:linear-gradient(135deg,var(--p-primary-500) 0%,var(--p-primary-500) 100%);transform:scale(1.05)}.scope-card.selected .card-icon i{color:#fff}.scope-card.disabled{opacity:.5;cursor:not-allowed;background:#f9fafb}.scope-card.disabled:hover{border-color:#e5e7eb;box-shadow:none}.scope-card .card-radio ::ng-deep .p-radiobutton .p-radiobutton-box{width:20px;height:20px;border-width:2px}.scope-card .card-icon{width:48px;height:48px;display:flex;align-items:center;justify-content:center;background:linear-gradient(135deg,var(--p-primary-50) 0%,var(--p-primary-100) 100%);border-radius:12px;transition:all .3s;position:relative;z-index:1}.scope-card .card-icon i{font-size:22px;color:var(--p-primary-500);transition:all .3s}.scope-card .card-info{flex:1;display:flex;flex-direction:column;gap:4px;position:relative;z-index:1}.scope-card .card-label{font-size:16px;font-weight:700;color:var(--neutral-color-800);cursor:pointer;margin:0}.scope-card .card-description{font-size:13px;color:var(--neutral-color-600);line-height:1.4}.scope-card .card-count{font-size:13px;font-weight:600;color:var(--p-primary-500);margin-top:6px;display:inline-flex;align-items:center;gap:6px}.scope-card .card-count i{font-size:6px}.columns-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:12px;margin-bottom:16px}.column-item{display:flex;align-items:center;gap:12px;padding:16px;border:2px solid #e5e7eb;border-radius:10px;transition:all .2s;background:#fff;cursor:pointer}.column-item:hover{border-color:var(--p-primary-500);background:rgba(var(--p-primary-rgb),.03)}.column-item.selected{border-color:var(--p-primary-500);background:linear-gradient(135deg,rgba(var(--p-primary-rgb),.05),rgba(var(--p-primary-rgb),.08))}.column-item ::ng-deep .p-checkbox .p-checkbox-box{width:20px;height:20px;border-width:2px}.column-item .column-label{font-size:14px;font-weight:600;color:var(--neutral-color-800);cursor:pointer;margin:0;-webkit-user-select:none;user-select:none}.columns-summary{display:flex;align-items:center;gap:10px;padding:14px 18px;background:linear-gradient(135deg,var(--p-primary-50) 0%,var(--p-primary-100) 100%);border-radius:10px;font-size:14px;color:var(--neutral-color-700);font-weight:600}.columns-summary i{color:var(--p-primary-500);font-size:18px}@media (max-width: 768px){::ng-deep .export-dialog .p-dialog{width:95vw!important;margin:0}.dialog-header{padding:28px 24px}.dialog-header .header-icon-wrapper{width:56px;height:56px}.dialog-header .header-icon-wrapper i{font-size:28px}.dialog-header .header-text h2{font-size:24px}.export-content{padding:24px}.format-options,.columns-grid{grid-template-columns:1fr}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2$1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: DialogModule }, { kind: "component", type: i7.Dialog, selector: "p-dialog", inputs: ["header", "draggable", "resizable", "positionLeft", "positionTop", "contentStyle", "contentStyleClass", "modal", "closeOnEscape", "dismissableMask", "rtl", "closable", "responsive", "appendTo", "breakpoints", "styleClass", "maskStyleClass", "maskStyle", "showHeader", "breakpoint", "blockScroll", "autoZIndex", "baseZIndex", "minX", "minY", "focusOnShow", "maximizable", "keepInViewport", "focusTrap", "transitionOptions", "closeIcon", "closeAriaLabel", "closeTabindex", "minimizeIcon", "maximizeIcon", "closeButtonProps", "maximizeButtonProps", "visible", "style", "position", "role", "content", "contentTemplate", "footerTemplate", "closeIconTemplate", "maximizeIconTemplate", "minimizeIconTemplate", "headlessTemplate"], outputs: ["onShow", "onHide", "visibleChange", "onResizeInit", "onResizeEnd", "onDragEnd", "onMaximize"] }, { kind: "directive", type: i2$2.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { kind: "ngmodule", type: ButtonModule }, { kind: "component", type: i4.Button, selector: "p-button", inputs: ["type", "iconPos", "icon", "badge", "label", "disabled", "loading", "loadingIcon", "raised", "rounded", "text", "plain", "severity", "outlined", "link", "tabindex", "size", "variant", "style", "styleClass", "badgeClass", "badgeSeverity", "ariaLabel", "autofocus", "fluid", "buttonProps"], outputs: ["onClick", "onFocus", "onBlur"] }, { kind: "ngmodule", type: RadioButtonModule }, { kind: "component", type: i7$1.RadioButton, selector: "p-radioButton, p-radiobutton, p-radio-button", inputs: ["value", "formControlName", "name", "disabled", "variant", "size", "tabindex", "inputId", "ariaLabelledBy", "ariaLabel", "style", "styleClass", "autofocus", "binary"], outputs: ["onClick", "onFocus", "onBlur"] }, { kind: "ngmodule", type: CheckboxModule }, { kind: "component", type: i8.Checkbox, selector: "p-checkbox, p-checkBox, p-check-box", inputs: ["value", "name", "disabled", "binary", "ariaLabelledBy", "ariaLabel", "tabindex", "inputId", "style", "inputStyle", "styleClass", "inputClass", "indeterminate", "size", "formControl", "checkboxIcon", "readonly", "required", "autofocus", "trueValue", "falseValue", "variant"], outputs: ["onChange", "onFocus", "onBlur"] }, { kind: "ngmodule", type: DividerModule }, { kind: "pipe", type: TranslatePipe, name: "translate" }] });
|
|
2165
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: ExportDialogComponent, isStandalone: true, selector: "sia-export-dialog", inputs: { visible: "visible", allRecords: "allRecords", selectedRecords: "selectedRecords", statusLabels: "statusLabels", translationPrefix: "translationPrefix", availableColumns: "availableColumns" }, outputs: { visibleChange: "visibleChange" }, usesOnChanges: true, ngImport: i0, template: "<p-dialog\n [(visible)]=\"visible\"\n (onHide)=\"onHide()\"\n [modal]=\"true\"\n [draggable]=\"false\"\n [resizable]=\"false\"\n [style]=\"{ width: '700px' }\"\n styleClass=\"export-dialog\"\n>\n <ng-template pTemplate=\"header\">\n <div class=\"custom-header\">\n <i class=\"pi pi-download header-icon\"></i>\n <span>{{ 'design.components_ai.export_data_title' | translate }}</span>\n </div>\n </ng-template>\n\n <div class=\"export-content\">\n <!-- Formato de Exporta\u00E7\u00E3o -->\n <div class=\"export-section\">\n <div class=\"section-header\">\n <div class=\"section-icon\">\n <i class=\"pi pi-file\"></i>\n </div>\n <h3>{{ 'design.components_ai.export_format_title' | translate }}</h3>\n </div>\n <div class=\"format-options\">\n <div\n *ngFor=\"let format of formats\"\n class=\"format-card\"\n [class.selected]=\"exportFormat === format.value\"\n (click)=\"exportFormat = format.value\"\n >\n <div class=\"card-radio\">\n <p-radioButton\n [value]=\"format.value\"\n [(ngModel)]=\"exportFormat\"\n [inputId]=\"format.value\"\n ></p-radioButton>\n </div>\n <div class=\"card-icon\" [class.excel]=\"format.value === 'xlsx'\" [class.pdf]=\"format.value === 'pdf'\">\n <i class=\"pi\" [ngClass]=\"format.icon\"></i>\n </div>\n <div class=\"card-info\">\n <label [for]=\"format.value\" class=\"card-label\">{{ format.label }}</label>\n <span class=\"card-description\">{{ format.description }}</span>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Escopo de Exporta\u00E7\u00E3o -->\n <div class=\"export-section\">\n <div class=\"section-header\">\n <div class=\"section-icon\">\n <i class=\"pi pi-filter\"></i>\n </div>\n <h3>{{ 'design.components_ai.export_scope_title' | translate }}</h3>\n </div>\n <div class=\"scope-options\">\n <div\n *ngFor=\"let scope of scopes\"\n class=\"scope-card\"\n [class.selected]=\"exportScope === scope.value\"\n [class.disabled]=\"scope.value === 'selected' && selectedRecords.length === 0\"\n (click)=\"scope.value === 'selected' && selectedRecords.length === 0 ? null : exportScope = scope.value\"\n >\n <div class=\"card-radio\">\n <p-radioButton\n [value]=\"scope.value\"\n [(ngModel)]=\"exportScope\"\n [inputId]=\"scope.value\"\n [disabled]=\"scope.value === 'selected' && selectedRecords.length === 0\"\n ></p-radioButton>\n </div>\n <div class=\"card-icon\">\n <i class=\"pi\" [ngClass]=\"scope.icon\"></i>\n </div>\n <div class=\"card-info\">\n <label [for]=\"scope.value\" class=\"card-label\">{{ scope.label }}</label>\n <span class=\"card-description\">{{ scope.description }}</span>\n <span class=\"card-count\">\n <i class=\"pi pi-circle-fill\"></i>\n {{ scope.value === 'all' ? allRecords.length : selectedRecords.length }} {{ 'design.components_ai.export_records_count' | translate }}\n </span>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Sele\u00E7\u00E3o de Colunas -->\n <div class=\"export-section\">\n <div class=\"section-header\">\n <div class=\"section-icon\">\n <i class=\"pi pi-table\"></i>\n </div>\n <h3>{{ 'design.components_ai.export_columns_title' | translate }}</h3>\n <div class=\"column-actions\">\n <button type=\"button\" class=\"action-link\" (click)=\"selectAllColumns()\">\n {{ 'design.components_ai.export_select_all_columns' | translate }}\n </button>\n <span class=\"separator\">|</span>\n <button type=\"button\" class=\"action-link\" (click)=\"deselectAllColumns()\">\n {{ 'design.components_ai.export_clear_selection' | translate }}\n </button>\n </div>\n </div>\n <div class=\"columns-grid\">\n <div\n *ngFor=\"let column of columns\"\n class=\"column-item\"\n [class.selected]=\"column.selected\"\n (click)=\"column.selected = !column.selected\"\n >\n <p-checkbox\n [(ngModel)]=\"column.selected\"\n [binary]=\"true\"\n [inputId]=\"column.field\"\n ></p-checkbox>\n <label [for]=\"column.field\" class=\"column-label\">\n {{ column.header }}\n </label>\n </div>\n </div>\n <div class=\"columns-summary\">\n <i class=\"pi pi-info-circle\"></i>\n <span>{{ selectedColumnsCount }} {{ 'design.components_ai.export_columns_summary' | translate }} {{ columns.length }} {{ 'design.components_ai.export_columns_selected' | translate }}</span>\n </div>\n </div>\n </div>\n\n <ng-template pTemplate=\"footer\">\n <p-button\n [label]=\"'design.components_ai.cancel' | translate\"\n icon=\"pi pi-times\"\n severity=\"secondary\"\n [text]=\"true\"\n (onClick)=\"onHide()\"\n ></p-button>\n <p-button\n [label]=\"'design.components_ai.export_button' | translate\"\n icon=\"pi pi-download\"\n [disabled]=\"!canExport\"\n (onClick)=\"export()\"\n ></p-button>\n </ng-template>\n</p-dialog>\n", styles: ["::ng-deep .export-dialog .p-dialog{border-radius:16px;overflow:hidden;box-shadow:0 20px 60px #0000004d}::ng-deep .export-dialog .p-dialog-content{padding:0;background:#fff;max-height:70vh;overflow-y:auto}.custom-header{display:flex;align-items:center;gap:12px;font-size:18px;font-weight:600}.custom-header .header-icon{font-size:22px;color:var(--p-primary-500)}.export-content{padding:28px 32px}.export-section{margin-bottom:32px}.export-section:last-child{margin-bottom:0}.export-section .section-header{display:flex;align-items:center;gap:12px;margin-bottom:20px}.export-section .section-header .section-icon{width:36px;height:36px;display:flex;align-items:center;justify-content:center;background:linear-gradient(135deg,rgba(var(--p-primary-rgb),.1),rgba(var(--p-primary-rgb),.15));border-radius:10px}.export-section .section-header .section-icon i{font-size:18px;color:var(--p-primary-500)}.export-section .section-header h3{margin:0;font-size:17px;font-weight:700;color:var(--neutral-color-800);flex:1}.export-section .section-header .column-actions{display:flex;align-items:center;gap:10px;font-size:13px}.export-section .section-header .column-actions .action-link{background:none;border:none;color:var(--p-primary-500);cursor:pointer;font-weight:600;padding:0;transition:all .2s;font-size:13px}.export-section .section-header .column-actions .action-link:hover{color:var(--p-primary-500)}.export-section .section-header .column-actions .separator{color:var(--neutral-color-300);font-weight:400}.format-options{display:grid;grid-template-columns:repeat(2,1fr);gap:16px}.format-card{display:flex;align-items:center;gap:16px;padding:20px;border:2px solid #e5e7eb;border-radius:12px;cursor:pointer;transition:all .3s cubic-bezier(.4,0,.2,1);background:#fff;position:relative;overflow:hidden}.format-card:before{content:\"\";position:absolute;inset:0;background:linear-gradient(135deg,rgba(var(--p-primary-rgb),.03),rgba(var(--p-primary-rgb),.06));opacity:0;transition:opacity .3s}.format-card:hover{border-color:var(--p-primary-500);transform:translateY(-2px);box-shadow:0 8px 24px rgba(var(--p-primary-rgb),.15)}.format-card:hover:before{opacity:1}.format-card.selected{border-color:var(--p-primary-500);background:linear-gradient(135deg,rgba(var(--p-primary-rgb),.05),rgba(var(--p-primary-rgb),.08));box-shadow:0 0 0 4px rgba(var(--p-primary-rgb),.1)}.format-card.selected .card-icon{background:linear-gradient(135deg,var(--p-primary-500) 0%,var(--p-primary-500) 100%);transform:scale(1.05)}.format-card.selected .card-icon i{color:#fff}.format-card .card-radio ::ng-deep .p-radiobutton .p-radiobutton-box{width:20px;height:20px;border-width:2px}.format-card .card-icon{width:52px;height:52px;display:flex;align-items:center;justify-content:center;border-radius:12px;transition:all .3s;position:relative;z-index:1}.format-card .card-icon.excel{background:linear-gradient(135deg,var(--p-primary-50) 0%,var(--p-primary-100) 100%)}.format-card .card-icon.excel i{color:#107c41;font-size:26px}.format-card .card-icon.pdf{background:linear-gradient(135deg,#fee8e8,#fdd4d4)}.format-card .card-icon.pdf i{color:#dc2626;font-size:26px}.format-card .card-info{flex:1;display:flex;flex-direction:column;gap:4px;position:relative;z-index:1}.format-card .card-label{font-size:16px;font-weight:700;color:var(--neutral-color-800);cursor:pointer;margin:0}.format-card .card-description{font-size:13px;color:var(--neutral-color-600);line-height:1.4}.scope-options{display:flex;flex-direction:column;gap:14px}.scope-card{display:flex;align-items:center;gap:16px;padding:20px;border:2px solid #e5e7eb;border-radius:12px;cursor:pointer;transition:all .3s cubic-bezier(.4,0,.2,1);background:#fff;position:relative;overflow:hidden}.scope-card:before{content:\"\";position:absolute;inset:0;background:linear-gradient(135deg,rgba(var(--p-primary-rgb),.03),rgba(var(--p-primary-rgb),.06));opacity:0;transition:opacity .3s}.scope-card:hover:not(.disabled){border-color:var(--p-primary-500);box-shadow:0 4px 16px rgba(var(--p-primary-rgb),.12)}.scope-card:hover:not(.disabled):before{opacity:1}.scope-card.selected{border-color:var(--p-primary-500);background:linear-gradient(135deg,rgba(var(--p-primary-rgb),.05),rgba(var(--p-primary-rgb),.08));box-shadow:0 0 0 4px rgba(var(--p-primary-rgb),.1)}.scope-card.selected .card-icon{background:linear-gradient(135deg,var(--p-primary-500) 0%,var(--p-primary-500) 100%);transform:scale(1.05)}.scope-card.selected .card-icon i{color:#fff}.scope-card.disabled{opacity:.5;cursor:not-allowed;background:#f9fafb}.scope-card.disabled:hover{border-color:#e5e7eb;box-shadow:none}.scope-card .card-radio ::ng-deep .p-radiobutton .p-radiobutton-box{width:20px;height:20px;border-width:2px}.scope-card .card-icon{width:48px;height:48px;display:flex;align-items:center;justify-content:center;background:linear-gradient(135deg,var(--p-primary-50) 0%,var(--p-primary-100) 100%);border-radius:12px;transition:all .3s;position:relative;z-index:1}.scope-card .card-icon i{font-size:22px;color:var(--p-primary-500);transition:all .3s}.scope-card .card-info{flex:1;display:flex;flex-direction:column;gap:4px;position:relative;z-index:1}.scope-card .card-label{font-size:16px;font-weight:700;color:var(--neutral-color-800);cursor:pointer;margin:0}.scope-card .card-description{font-size:13px;color:var(--neutral-color-600);line-height:1.4}.scope-card .card-count{font-size:13px;font-weight:600;color:var(--p-primary-500);margin-top:6px;display:inline-flex;align-items:center;gap:6px}.scope-card .card-count i{font-size:6px}.columns-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:12px;margin-bottom:16px}.column-item{display:flex;align-items:center;gap:12px;padding:16px;border:2px solid #e5e7eb;border-radius:10px;transition:all .2s;background:#fff;cursor:pointer}.column-item:hover{border-color:var(--p-primary-500);background:rgba(var(--p-primary-rgb),.03)}.column-item.selected{border-color:var(--p-primary-500);background:linear-gradient(135deg,rgba(var(--p-primary-rgb),.05),rgba(var(--p-primary-rgb),.08))}.column-item ::ng-deep .p-checkbox .p-checkbox-box{width:20px;height:20px;border-width:2px}.column-item .column-label{font-size:14px;font-weight:600;color:var(--neutral-color-800);cursor:pointer;margin:0;-webkit-user-select:none;user-select:none}.columns-summary{display:flex;align-items:center;gap:10px;padding:14px 18px;background:linear-gradient(135deg,var(--p-primary-50) 0%,var(--p-primary-100) 100%);border-radius:10px;font-size:14px;color:var(--neutral-color-700);font-weight:600}.columns-summary i{color:var(--p-primary-500);font-size:18px}@media (max-width: 768px){::ng-deep .export-dialog .p-dialog{width:95vw!important;margin:0}.dialog-header{padding:28px 24px}.dialog-header .header-icon-wrapper{width:56px;height:56px}.dialog-header .header-icon-wrapper i{font-size:28px}.dialog-header .header-text h2{font-size:24px}.export-content{padding:24px}.format-options,.columns-grid{grid-template-columns:1fr}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: DialogModule }, { kind: "component", type: i4.Dialog, selector: "p-dialog", inputs: ["header", "draggable", "resizable", "positionLeft", "positionTop", "contentStyle", "contentStyleClass", "modal", "closeOnEscape", "dismissableMask", "rtl", "closable", "responsive", "appendTo", "breakpoints", "styleClass", "maskStyleClass", "maskStyle", "showHeader", "breakpoint", "blockScroll", "autoZIndex", "baseZIndex", "minX", "minY", "focusOnShow", "maximizable", "keepInViewport", "focusTrap", "transitionOptions", "closeIcon", "closeAriaLabel", "closeTabindex", "minimizeIcon", "maximizeIcon", "closeButtonProps", "maximizeButtonProps", "visible", "style", "position", "role", "content", "contentTemplate", "footerTemplate", "closeIconTemplate", "maximizeIconTemplate", "minimizeIconTemplate", "headlessTemplate"], outputs: ["onShow", "onHide", "visibleChange", "onResizeInit", "onResizeEnd", "onDragEnd", "onMaximize"] }, { kind: "directive", type: i2$1.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { kind: "ngmodule", type: ButtonModule }, { kind: "component", type: i4$1.Button, selector: "p-button", inputs: ["type", "iconPos", "icon", "badge", "label", "disabled", "loading", "loadingIcon", "raised", "rounded", "text", "plain", "severity", "outlined", "link", "tabindex", "size", "variant", "style", "styleClass", "badgeClass", "badgeSeverity", "ariaLabel", "autofocus", "fluid", "buttonProps"], outputs: ["onClick", "onFocus", "onBlur"] }, { kind: "ngmodule", type: RadioButtonModule }, { kind: "component", type: i7.RadioButton, selector: "p-radioButton, p-radiobutton, p-radio-button", inputs: ["value", "formControlName", "name", "disabled", "variant", "size", "tabindex", "inputId", "ariaLabelledBy", "ariaLabel", "style", "styleClass", "autofocus", "binary"], outputs: ["onClick", "onFocus", "onBlur"] }, { kind: "ngmodule", type: CheckboxModule }, { kind: "component", type: i8.Checkbox, selector: "p-checkbox, p-checkBox, p-check-box", inputs: ["value", "name", "disabled", "binary", "ariaLabelledBy", "ariaLabel", "tabindex", "inputId", "style", "inputStyle", "styleClass", "inputClass", "indeterminate", "size", "formControl", "checkboxIcon", "readonly", "required", "autofocus", "trueValue", "falseValue", "variant"], outputs: ["onChange", "onFocus", "onBlur"] }, { kind: "ngmodule", type: DividerModule }, { kind: "pipe", type: TranslatePipe, name: "translate" }] });
|
|
1943
2166
|
}
|
|
1944
2167
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ExportDialogComponent, decorators: [{
|
|
1945
2168
|
type: Component,
|
|
@@ -2084,7 +2307,7 @@ class BulkDeleteDialogComponent {
|
|
|
2084
2307
|
}
|
|
2085
2308
|
}
|
|
2086
2309
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: BulkDeleteDialogComponent, deps: [{ token: TranslationService }], target: i0.ɵɵFactoryTarget.Component });
|
|
2087
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: BulkDeleteDialogComponent, isStandalone: true, selector: "sia-bulk-delete-dialog", inputs: { visible: "visible", stages: "stages", service: "service", entityNameField: "entityNameField", entityCodeField: "entityCodeField", translationPrefix: "translationPrefix" }, outputs: { visibleChange: "visibleChange", onComplete: "onComplete" }, usesOnChanges: true, ngImport: i0, template: "<p-dialog\n [(visible)]=\"visible\"\n [modal]=\"true\"\n [closable]=\"canClose\"\n [closeOnEscape]=\"canClose\"\n [dismissableMask]=\"false\"\n [style]=\"{ width: '700px', maxWidth: '90vw' }\"\n (onHide)=\"onHide()\"\n>\n <ng-template pTemplate=\"header\">\n <div class=\"dialog-header\">\n <i class=\"pi pi-trash header-icon\"></i>\n <h2>{{ 'design.components_ai.bulk_delete_title' | translate }}</h2>\n </div>\n </ng-template>\n\n <div class=\"dialog-content\">\n <!-- Summary -->\n @if (!isProcessing && !isCompleted) {\n <div class=\"summary-section\">\n <p class=\"summary-text\">\n <i class=\"pi pi-exclamation-triangle warning-icon\"></i>\n <span [innerHTML]=\"'design.components_ai.bulk_delete_warning' | translate:{ count: stages.length }\"></span>\n </p>\n <p class=\"summary-description\">\n {{ 'design.components_ai.bulk_delete_description' | translate }}\n </p>\n </div>\n }\n\n <!-- Progress Bar -->\n @if (isProcessing || isCompleted) {\n <div class=\"progress-section\">\n <div class=\"progress-info\">\n <span class=\"progress-label\">{{ 'design.components_ai.bulk_delete_progress' | translate }}</span>\n <span class=\"progress-count\">{{ currentIndex }} / {{ deleteStatuses.length }}</span>\n </div>\n <p-progressBar \n [value]=\"progress\" \n [showValue]=\"false\"\n styleClass=\"custom-progress\"\n ></p-progressBar>\n \n <div class=\"progress-stats\">\n <div class=\"stat success\">\n <i class=\"pi pi-check-circle\"></i>\n <span>{{ successCount }} {{ 'design.components_ai.bulk_delete_success_count' | translate }}</span>\n </div>\n @if (errorCount > 0) {\n <div class=\"stat error\">\n <i class=\"pi pi-times-circle\"></i>\n <span>{{ errorCount }} {{ 'design.components_ai.bulk_delete_error_count' | translate }}</span>\n </div>\n }\n </div>\n </div>\n }\n\n <!-- Status List -->\n @if (isProcessing || isCompleted) {\n <div class=\"status-list\">\n @for (item of deleteStatuses; track item.entity) {\n <div class=\"status-item\">\n <div class=\"status-info\">\n <i [class]=\"getStatusIcon(item.status)\" class=\"status-icon\"></i>\n <div class=\"status-details\">\n <span class=\"stage-name\">{{ item.entity[entityNameField] }}</span>\n @if (item.entity[entityCodeField]) {\n <span class=\"stage-code\">{{ 'design.components_ai.bulk_delete_code_label' | translate }}: {{ item.entity[entityCodeField] }}</span>\n }\n </div>\n </div>\n <div class=\"status-badge\">\n <p-tag \n [value]=\"getStatusLabel(item.status)\" \n [severity]=\"getStatusSeverity(item.status)\"\n >\n @if (item.status === 'processing') {\n <i class=\"pi pi-spin pi-spinner\"></i>\n }\n </p-tag>\n @if (item.status === 'error' && item.errorMessage) {\n <small class=\"error-message\">\n {{ item.errorMessage }}\n </small>\n }\n </div>\n </div>\n }\n </div>\n }\n\n <!-- Completion Message -->\n @if (isCompleted) {\n <div class=\"completion-section\">\n <div class=\"completion-message\" [class.has-errors]=\"errorCount > 0\">\n <i [class]=\"errorCount > 0 ? 'pi pi-exclamation-circle' : 'pi pi-check-circle'\" class=\"completion-icon\"></i>\n @if (errorCount === 0) {\n <p>\n {{ 'design.components_ai.bulk_delete_success_message' | translate }}\n </p>\n }\n @if (errorCount > 0) {\n <p>\n {{ 'design.components_ai.bulk_delete_completed_with_errors' | translate:{ count: errorCount } }}\n </p>\n }\n </div>\n </div>\n }\n </div>\n\n <ng-template pTemplate=\"footer\">\n <div class=\"dialog-footer\">\n @if (!isProcessing && !isCompleted) {\n <p-button\n [label]=\"'design.components_ai.cancel' | translate\"\n icon=\"pi pi-times\"\n severity=\"secondary\"\n [outlined]=\"true\"\n (onClick)=\"onClose()\"\n ></p-button>\n <p-button\n [label]=\"'design.components_ai.bulk_delete_confirm' | translate\"\n icon=\"pi pi-trash\"\n severity=\"danger\"\n (onClick)=\"startDeletion()\"\n ></p-button>\n }\n @if (isCompleted) {\n <p-button\n [label]=\"'design.components_ai.close' | translate\"\n icon=\"pi pi-check\"\n (onClick)=\"onClose()\"\n ></p-button>\n }\n </div>\n </ng-template>\n</p-dialog>\n", styles: [".dialog-header{display:flex;align-items:center;gap:12px}.dialog-header .header-icon{font-size:24px;color:#ef4444}.dialog-header h2{margin:0;font-size:20px;font-weight:700;color:var(--neutral-color-800)}.dialog-content{padding:8px 0}.summary-section{padding:20px;background:linear-gradient(135deg,#fef3c7,#fde68a);border-radius:12px;border:1px solid #fbbf24;margin-bottom:24px}.summary-section .summary-text{display:flex;align-items:center;gap:12px;margin:0 0 12px;font-size:16px;color:var(--neutral-color-800)}.summary-section .summary-text .warning-icon{font-size:24px;color:#f59e0b}.summary-section .summary-text strong{color:#d97706}.summary-section .summary-description{margin:0;font-size:14px;color:var(--neutral-color-600);padding-left:36px}.progress-section{margin-bottom:24px}.progress-section .progress-info{display:flex;justify-content:space-between;align-items:center;margin-bottom:12px}.progress-section .progress-info .progress-label{font-weight:600;font-size:14px;color:var(--neutral-color-800)}.progress-section .progress-info .progress-count{font-size:14px;color:var(--neutral-color-600);font-weight:500}.progress-section .progress-stats{display:flex;gap:20px;margin-top:12px}.progress-section .progress-stats .stat{display:flex;align-items:center;gap:8px;font-size:14px;font-weight:500}.progress-section .progress-stats .stat.success{color:#10b981}.progress-section .progress-stats .stat.success i{font-size:18px}.progress-section .progress-stats .stat.error{color:#ef4444}.progress-section .progress-stats .stat.error i{font-size:18px}.status-list{max-height:400px;overflow-y:auto;border:1px solid var(--p-surface-200);border-radius:12px;padding:12px;background-color:#fafafa}.status-list .status-item{display:flex;justify-content:space-between;align-items:center;padding:12px;background-color:#fff;border-radius:8px;margin-bottom:8px;transition:all .2s ease}.status-list .status-item:last-child{margin-bottom:0}.status-list .status-item:hover{box-shadow:0 2px 8px #00000014}.status-list .status-item .status-info{display:flex;align-items:center;gap:12px;flex:1}.status-list .status-item .status-info .status-icon{font-size:20px}.status-list .status-item .status-info .status-icon.pi-clock{color:var(--neutral-color-400)}.status-list .status-item .status-info .status-icon.pi-spinner{color:#3b82f6}.status-list .status-item .status-info .status-icon.pi-check{color:#10b981}.status-list .status-item .status-info .status-icon.pi-times{color:#ef4444}.status-list .status-item .status-info .status-details{display:flex;flex-direction:column;gap:4px}.status-list .status-item .status-info .status-details .stage-name{font-weight:600;font-size:14px;color:var(--neutral-color-800)}.status-list .status-item .status-info .status-details .stage-code{font-size:12px;color:var(--neutral-color-500)}.status-list .status-item .status-badge{display:flex;flex-direction:column;align-items:flex-end;gap:4px}.status-list .status-item .status-badge .error-message{font-size:11px;color:#ef4444;max-width:200px;text-align:right}.completion-section{margin-top:24px}.completion-section .completion-message{padding:20px;background:linear-gradient(135deg,#d1fae5,#a7f3d0);border-radius:12px;border:1px solid #10b981;display:flex;align-items:center;gap:16px}.completion-section .completion-message.has-errors{background:linear-gradient(135deg,#fee2e2,#fecaca);border-color:#ef4444}.completion-section .completion-message.has-errors .completion-icon{color:#ef4444}.completion-section .completion-message .completion-icon{font-size:32px;color:#10b981}.completion-section .completion-message p{margin:0;font-size:16px;font-weight:600;color:var(--neutral-color-800)}.dialog-footer{display:flex;justify-content:flex-end;gap:12px}::ng-deep .custom-progress{height:12px;border-radius:6px}::ng-deep .custom-progress .p-progressbar-value{background:linear-gradient(90deg,var(--p-primary-500) 0%,var(--p-primary-500) 100%);border-radius:6px}.status-list::-webkit-scrollbar{width:8px}.status-list::-webkit-scrollbar-track{background:var(--p-surface-100);border-radius:4px}.status-list::-webkit-scrollbar-thumb{background:var(--neutral-color-400);border-radius:4px}.status-list::-webkit-scrollbar-thumb:hover{background:var(--neutral-color-500)}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: DialogModule }, { kind: "component", type: i7.Dialog, selector: "p-dialog", inputs: ["header", "draggable", "resizable", "positionLeft", "positionTop", "contentStyle", "contentStyleClass", "modal", "closeOnEscape", "dismissableMask", "rtl", "closable", "responsive", "appendTo", "breakpoints", "styleClass", "maskStyleClass", "maskStyle", "showHeader", "breakpoint", "blockScroll", "autoZIndex", "baseZIndex", "minX", "minY", "focusOnShow", "maximizable", "keepInViewport", "focusTrap", "transitionOptions", "closeIcon", "closeAriaLabel", "closeTabindex", "minimizeIcon", "maximizeIcon", "closeButtonProps", "maximizeButtonProps", "visible", "style", "position", "role", "content", "contentTemplate", "footerTemplate", "closeIconTemplate", "maximizeIconTemplate", "minimizeIconTemplate", "headlessTemplate"], outputs: ["onShow", "onHide", "visibleChange", "onResizeInit", "onResizeEnd", "onDragEnd", "onMaximize"] }, { kind: "directive", type: i2$2.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { kind: "ngmodule", type: ButtonModule }, { kind: "component", type: i4.Button, selector: "p-button", inputs: ["type", "iconPos", "icon", "badge", "label", "disabled", "loading", "loadingIcon", "raised", "rounded", "text", "plain", "severity", "outlined", "link", "tabindex", "size", "variant", "style", "styleClass", "badgeClass", "badgeSeverity", "ariaLabel", "autofocus", "fluid", "buttonProps"], outputs: ["onClick", "onFocus", "onBlur"] }, { kind: "ngmodule", type: ProgressBarModule }, { kind: "component", type: i5.ProgressBar, selector: "p-progressBar, p-progressbar, p-progress-bar", inputs: ["value", "showValue", "styleClass", "valueStyleClass", "style", "unit", "mode", "color"] }, { kind: "ngmodule", type: TagModule }, { kind: "component", type: i6.Tag, selector: "p-tag", inputs: ["style", "styleClass", "severity", "value", "icon", "rounded"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }] });
|
|
2310
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: BulkDeleteDialogComponent, isStandalone: true, selector: "sia-bulk-delete-dialog", inputs: { visible: "visible", stages: "stages", service: "service", entityNameField: "entityNameField", entityCodeField: "entityCodeField", translationPrefix: "translationPrefix" }, outputs: { visibleChange: "visibleChange", onComplete: "onComplete" }, usesOnChanges: true, ngImport: i0, template: "<p-dialog\n [(visible)]=\"visible\"\n [modal]=\"true\"\n [closable]=\"canClose\"\n [closeOnEscape]=\"canClose\"\n [dismissableMask]=\"false\"\n [style]=\"{ width: '700px', maxWidth: '90vw' }\"\n (onHide)=\"onHide()\"\n>\n <ng-template pTemplate=\"header\">\n <div class=\"dialog-header\">\n <i class=\"pi pi-trash header-icon\"></i>\n <h2>{{ 'design.components_ai.bulk_delete_title' | translate }}</h2>\n </div>\n </ng-template>\n\n <div class=\"dialog-content\">\n <!-- Summary -->\n @if (!isProcessing && !isCompleted) {\n <div class=\"summary-section\">\n <p class=\"summary-text\">\n <i class=\"pi pi-exclamation-triangle warning-icon\"></i>\n <span [innerHTML]=\"'design.components_ai.bulk_delete_warning' | translate:{ count: stages.length }\"></span>\n </p>\n <p class=\"summary-description\">\n {{ 'design.components_ai.bulk_delete_description' | translate }}\n </p>\n </div>\n }\n\n <!-- Progress Bar -->\n @if (isProcessing || isCompleted) {\n <div class=\"progress-section\">\n <div class=\"progress-info\">\n <span class=\"progress-label\">{{ 'design.components_ai.bulk_delete_progress' | translate }}</span>\n <span class=\"progress-count\">{{ currentIndex }} / {{ deleteStatuses.length }}</span>\n </div>\n <p-progressBar \n [value]=\"progress\" \n [showValue]=\"false\"\n styleClass=\"custom-progress\"\n ></p-progressBar>\n \n <div class=\"progress-stats\">\n <div class=\"stat success\">\n <i class=\"pi pi-check-circle\"></i>\n <span>{{ successCount }} {{ 'design.components_ai.bulk_delete_success_count' | translate }}</span>\n </div>\n @if (errorCount > 0) {\n <div class=\"stat error\">\n <i class=\"pi pi-times-circle\"></i>\n <span>{{ errorCount }} {{ 'design.components_ai.bulk_delete_error_count' | translate }}</span>\n </div>\n }\n </div>\n </div>\n }\n\n <!-- Status List -->\n @if (isProcessing || isCompleted) {\n <div class=\"status-list\">\n @for (item of deleteStatuses; track item.entity) {\n <div class=\"status-item\">\n <div class=\"status-info\">\n <i [class]=\"getStatusIcon(item.status)\" class=\"status-icon\"></i>\n <div class=\"status-details\">\n <span class=\"stage-name\">{{ item.entity[entityNameField] }}</span>\n @if (item.entity[entityCodeField]) {\n <span class=\"stage-code\">{{ 'design.components_ai.bulk_delete_code_label' | translate }}: {{ item.entity[entityCodeField] }}</span>\n }\n </div>\n </div>\n <div class=\"status-badge\">\n <p-tag \n [value]=\"getStatusLabel(item.status)\" \n [severity]=\"getStatusSeverity(item.status)\"\n >\n @if (item.status === 'processing') {\n <i class=\"pi pi-spin pi-spinner\"></i>\n }\n </p-tag>\n @if (item.status === 'error' && item.errorMessage) {\n <small class=\"error-message\">\n {{ item.errorMessage }}\n </small>\n }\n </div>\n </div>\n }\n </div>\n }\n\n <!-- Completion Message -->\n @if (isCompleted) {\n <div class=\"completion-section\">\n <div class=\"completion-message\" [class.has-errors]=\"errorCount > 0\">\n <i [class]=\"errorCount > 0 ? 'pi pi-exclamation-circle' : 'pi pi-check-circle'\" class=\"completion-icon\"></i>\n @if (errorCount === 0) {\n <p>\n {{ 'design.components_ai.bulk_delete_success_message' | translate }}\n </p>\n }\n @if (errorCount > 0) {\n <p>\n {{ 'design.components_ai.bulk_delete_completed_with_errors' | translate:{ count: errorCount } }}\n </p>\n }\n </div>\n </div>\n }\n </div>\n\n <ng-template pTemplate=\"footer\">\n <div class=\"dialog-footer\">\n @if (!isProcessing && !isCompleted) {\n <p-button\n [label]=\"'design.components_ai.cancel' | translate\"\n icon=\"pi pi-times\"\n severity=\"secondary\"\n [outlined]=\"true\"\n (onClick)=\"onClose()\"\n ></p-button>\n <p-button\n [label]=\"'design.components_ai.bulk_delete_confirm' | translate\"\n icon=\"pi pi-trash\"\n severity=\"danger\"\n (onClick)=\"startDeletion()\"\n ></p-button>\n }\n @if (isCompleted) {\n <p-button\n [label]=\"'design.components_ai.close' | translate\"\n icon=\"pi pi-check\"\n (onClick)=\"onClose()\"\n ></p-button>\n }\n </div>\n </ng-template>\n</p-dialog>\n", styles: [".dialog-header{display:flex;align-items:center;gap:12px}.dialog-header .header-icon{font-size:24px;color:#ef4444}.dialog-header h2{margin:0;font-size:20px;font-weight:700;color:var(--neutral-color-800)}.dialog-content{padding:8px 0}.summary-section{padding:20px;background:linear-gradient(135deg,#fef3c7,#fde68a);border-radius:12px;border:1px solid #fbbf24;margin-bottom:24px}.summary-section .summary-text{display:flex;align-items:center;gap:12px;margin:0 0 12px;font-size:16px;color:var(--neutral-color-800)}.summary-section .summary-text .warning-icon{font-size:24px;color:#f59e0b}.summary-section .summary-text strong{color:#d97706}.summary-section .summary-description{margin:0;font-size:14px;color:var(--neutral-color-600);padding-left:36px}.progress-section{margin-bottom:24px}.progress-section .progress-info{display:flex;justify-content:space-between;align-items:center;margin-bottom:12px}.progress-section .progress-info .progress-label{font-weight:600;font-size:14px;color:var(--neutral-color-800)}.progress-section .progress-info .progress-count{font-size:14px;color:var(--neutral-color-600);font-weight:500}.progress-section .progress-stats{display:flex;gap:20px;margin-top:12px}.progress-section .progress-stats .stat{display:flex;align-items:center;gap:8px;font-size:14px;font-weight:500}.progress-section .progress-stats .stat.success{color:#10b981}.progress-section .progress-stats .stat.success i{font-size:18px}.progress-section .progress-stats .stat.error{color:#ef4444}.progress-section .progress-stats .stat.error i{font-size:18px}.status-list{max-height:400px;overflow-y:auto;border:1px solid var(--p-surface-200);border-radius:12px;padding:12px;background-color:#fafafa}.status-list .status-item{display:flex;justify-content:space-between;align-items:center;padding:12px;background-color:#fff;border-radius:8px;margin-bottom:8px;transition:all .2s ease}.status-list .status-item:last-child{margin-bottom:0}.status-list .status-item:hover{box-shadow:0 2px 8px #00000014}.status-list .status-item .status-info{display:flex;align-items:center;gap:12px;flex:1}.status-list .status-item .status-info .status-icon{font-size:20px}.status-list .status-item .status-info .status-icon.pi-clock{color:var(--neutral-color-400)}.status-list .status-item .status-info .status-icon.pi-spinner{color:#3b82f6}.status-list .status-item .status-info .status-icon.pi-check{color:#10b981}.status-list .status-item .status-info .status-icon.pi-times{color:#ef4444}.status-list .status-item .status-info .status-details{display:flex;flex-direction:column;gap:4px}.status-list .status-item .status-info .status-details .stage-name{font-weight:600;font-size:14px;color:var(--neutral-color-800)}.status-list .status-item .status-info .status-details .stage-code{font-size:12px;color:var(--neutral-color-500)}.status-list .status-item .status-badge{display:flex;flex-direction:column;align-items:flex-end;gap:4px}.status-list .status-item .status-badge .error-message{font-size:11px;color:#ef4444;max-width:200px;text-align:right}.completion-section{margin-top:24px}.completion-section .completion-message{padding:20px;background:linear-gradient(135deg,#d1fae5,#a7f3d0);border-radius:12px;border:1px solid #10b981;display:flex;align-items:center;gap:16px}.completion-section .completion-message.has-errors{background:linear-gradient(135deg,#fee2e2,#fecaca);border-color:#ef4444}.completion-section .completion-message.has-errors .completion-icon{color:#ef4444}.completion-section .completion-message .completion-icon{font-size:32px;color:#10b981}.completion-section .completion-message p{margin:0;font-size:16px;font-weight:600;color:var(--neutral-color-800)}.dialog-footer{display:flex;justify-content:flex-end;gap:12px}::ng-deep .custom-progress{height:12px;border-radius:6px}::ng-deep .custom-progress .p-progressbar-value{background:linear-gradient(90deg,var(--p-primary-500) 0%,var(--p-primary-500) 100%);border-radius:6px}.status-list::-webkit-scrollbar{width:8px}.status-list::-webkit-scrollbar-track{background:var(--p-surface-100);border-radius:4px}.status-list::-webkit-scrollbar-thumb{background:var(--neutral-color-400);border-radius:4px}.status-list::-webkit-scrollbar-thumb:hover{background:var(--neutral-color-500)}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: DialogModule }, { kind: "component", type: i4.Dialog, selector: "p-dialog", inputs: ["header", "draggable", "resizable", "positionLeft", "positionTop", "contentStyle", "contentStyleClass", "modal", "closeOnEscape", "dismissableMask", "rtl", "closable", "responsive", "appendTo", "breakpoints", "styleClass", "maskStyleClass", "maskStyle", "showHeader", "breakpoint", "blockScroll", "autoZIndex", "baseZIndex", "minX", "minY", "focusOnShow", "maximizable", "keepInViewport", "focusTrap", "transitionOptions", "closeIcon", "closeAriaLabel", "closeTabindex", "minimizeIcon", "maximizeIcon", "closeButtonProps", "maximizeButtonProps", "visible", "style", "position", "role", "content", "contentTemplate", "footerTemplate", "closeIconTemplate", "maximizeIconTemplate", "minimizeIconTemplate", "headlessTemplate"], outputs: ["onShow", "onHide", "visibleChange", "onResizeInit", "onResizeEnd", "onDragEnd", "onMaximize"] }, { kind: "directive", type: i2$1.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { kind: "ngmodule", type: ButtonModule }, { kind: "component", type: i4$1.Button, selector: "p-button", inputs: ["type", "iconPos", "icon", "badge", "label", "disabled", "loading", "loadingIcon", "raised", "rounded", "text", "plain", "severity", "outlined", "link", "tabindex", "size", "variant", "style", "styleClass", "badgeClass", "badgeSeverity", "ariaLabel", "autofocus", "fluid", "buttonProps"], outputs: ["onClick", "onFocus", "onBlur"] }, { kind: "ngmodule", type: ProgressBarModule }, { kind: "component", type: i5.ProgressBar, selector: "p-progressBar, p-progressbar, p-progress-bar", inputs: ["value", "showValue", "styleClass", "valueStyleClass", "style", "unit", "mode", "color"] }, { kind: "ngmodule", type: TagModule }, { kind: "component", type: i6.Tag, selector: "p-tag", inputs: ["style", "styleClass", "severity", "value", "icon", "rounded"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }] });
|
|
2088
2311
|
}
|
|
2089
2312
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: BulkDeleteDialogComponent, decorators: [{
|
|
2090
2313
|
type: Component,
|
|
@@ -2195,7 +2418,7 @@ class BreadcrumbComponent {
|
|
|
2195
2418
|
t(key) {
|
|
2196
2419
|
return this.translationService.translate(key);
|
|
2197
2420
|
}
|
|
2198
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: BreadcrumbComponent, deps: [{ token: i1$
|
|
2421
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: BreadcrumbComponent, deps: [{ token: i1$2.Router }, { token: i1$2.ActivatedRoute }, { token: TranslationService }], target: i0.ɵɵFactoryTarget.Component });
|
|
2199
2422
|
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: BreadcrumbComponent, isStandalone: true, selector: "sia-breadcrumb", inputs: { translationPrefix: "translationPrefix", isProduction: "isProduction" }, ngImport: i0, template: `
|
|
2200
2423
|
<nav class="breadcrumb-container" aria-label="breadcrumb">
|
|
2201
2424
|
<ol class="breadcrumb-list">
|
|
@@ -2267,7 +2490,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
2267
2490
|
</ol>
|
|
2268
2491
|
</nav>
|
|
2269
2492
|
`, styles: [".breadcrumb-container{background:transparent;padding:0;margin-bottom:1rem}.breadcrumb-list{display:flex;align-items:center;list-style:none;padding:0;margin:0;flex-wrap:wrap}.breadcrumb-item{display:flex;align-items:center}.breadcrumb-link{color:var(--p-text-secondary-color, #64748b);text-decoration:none;font-size:14px;font-weight:500;padding:8px 12px;border-radius:6px;transition:all .2s ease;display:flex;align-items:center;gap:8px}.breadcrumb-link:hover{background:var(--p-primary-50, #eff6ff);color:var(--p-primary-600, #2563eb)}.breadcrumb-text{color:var(--p-text-secondary-color, #64748b);font-size:14px;font-weight:500;padding:8px 12px;display:flex;align-items:center;gap:8px}.breadcrumb-item.active .breadcrumb-text,.breadcrumb-item.active .breadcrumb-link{color:var(--p-primary-600, #2563eb);font-weight:600;background:var(--p-primary-50, #eff6ff)}.breadcrumb-item.disabled{opacity:.6;cursor:not-allowed}.breadcrumb-separator{color:var(--p-text-muted-color, #94a3b8);margin:0 8px;font-size:14px}.breadcrumb-link i,.breadcrumb-text i{font-size:16px}\n"] }]
|
|
2270
|
-
}], ctorParameters: () => [{ type: i1$
|
|
2493
|
+
}], ctorParameters: () => [{ type: i1$2.Router }, { type: i1$2.ActivatedRoute }, { type: TranslationService }], propDecorators: { translationPrefix: [{
|
|
2271
2494
|
type: Input
|
|
2272
2495
|
}], isProduction: [{
|
|
2273
2496
|
type: Input
|
|
@@ -2495,12 +2718,12 @@ class EntityListBaseComponent {
|
|
|
2495
2718
|
return 'danger';
|
|
2496
2719
|
return 'warn';
|
|
2497
2720
|
}
|
|
2498
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: EntityListBaseComponent, deps: [{ token: EntityService }, { token: i2$
|
|
2721
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: EntityListBaseComponent, deps: [{ token: EntityService }, { token: i2$1.MessageService }, { token: i2$1.ConfirmationService }, { token: TranslationService }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Directive });
|
|
2499
2722
|
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.2.14", type: EntityListBaseComponent, ngImport: i0 });
|
|
2500
2723
|
}
|
|
2501
2724
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: EntityListBaseComponent, decorators: [{
|
|
2502
2725
|
type: Directive
|
|
2503
|
-
}], ctorParameters: () => [{ type: EntityService }, { type: i2$
|
|
2726
|
+
}], ctorParameters: () => [{ type: EntityService }, { type: i2$1.MessageService }, { type: i2$1.ConfirmationService }, { type: TranslationService }, { type: i0.ChangeDetectorRef }] });
|
|
2504
2727
|
|
|
2505
2728
|
/**
|
|
2506
2729
|
* Directive para máscara de código postal
|
|
@@ -2685,7 +2908,7 @@ class DocumentMaskDirective {
|
|
|
2685
2908
|
this.control.control?.setValue(masked, { emitEvent: false });
|
|
2686
2909
|
this.el.nativeElement.value = masked;
|
|
2687
2910
|
}
|
|
2688
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: DocumentMaskDirective, deps: [{ token: i0.ElementRef }, { token:
|
|
2911
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: DocumentMaskDirective, deps: [{ token: i0.ElementRef }, { token: i3.NgControl }, { token: MaskService }], target: i0.ɵɵFactoryTarget.Directive });
|
|
2689
2912
|
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.2.14", type: DocumentMaskDirective, isStandalone: true, selector: "[siaDocumentMask]", inputs: { documentType: "documentType", typePerson: "typePerson", typePersonField: "typePersonField", parentForm: "parentForm" }, host: { listeners: { "input": "onInput($event)", "blur": "onBlur($event)" } }, usesOnChanges: true, ngImport: i0 });
|
|
2690
2913
|
}
|
|
2691
2914
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: DocumentMaskDirective, decorators: [{
|
|
@@ -2694,7 +2917,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
2694
2917
|
selector: '[siaDocumentMask]',
|
|
2695
2918
|
standalone: true
|
|
2696
2919
|
}]
|
|
2697
|
-
}], ctorParameters: () => [{ type: i0.ElementRef }, { type:
|
|
2920
|
+
}], ctorParameters: () => [{ type: i0.ElementRef }, { type: i3.NgControl }, { type: MaskService }], propDecorators: { documentType: [{
|
|
2698
2921
|
type: Input
|
|
2699
2922
|
}], typePerson: [{
|
|
2700
2923
|
type: Input
|
|
@@ -2959,7 +3182,7 @@ class DynamicFieldTextComponent extends DynamicFieldBaseComponent {
|
|
|
2959
3182
|
[class.ng-dirty]="isFieldDirty()" />
|
|
2960
3183
|
</div>
|
|
2961
3184
|
</sia-dynamic-field-wrapper>
|
|
2962
|
-
`, isInline: true, styles: ["input{width:100%}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type:
|
|
3185
|
+
`, isInline: true, styles: ["input{width:100%}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i3.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: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i3.MaxLengthValidator, selector: "[maxlength][formControlName],[maxlength][formControl],[maxlength][ngModel]", inputs: ["maxlength"] }, { kind: "directive", type: i3.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i3.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "ngmodule", type: InputTextModule }, { kind: "directive", type: i4$2.InputText, selector: "[pInputText]", inputs: ["variant", "fluid", "pSize"] }, { kind: "directive", type: PostalCodeMaskDirective, selector: "[siaPostalCodeMask]", inputs: ["postalCodeLocale"] }, { kind: "directive", type: PhoneMaskDirective, selector: "[siaPhoneMask]", inputs: ["phoneMaskLocale"] }, { kind: "directive", type: DocumentMaskDirective, selector: "[siaDocumentMask]", inputs: ["documentType", "typePerson", "typePersonField", "parentForm"] }, { kind: "component", type: DynamicFieldWrapperComponent, selector: "sia-dynamic-field-wrapper", inputs: ["field", "form", "mode"] }] });
|
|
2963
3186
|
}
|
|
2964
3187
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: DynamicFieldTextComponent, decorators: [{
|
|
2965
3188
|
type: Component,
|
|
@@ -3077,7 +3300,7 @@ class DynamicFieldNumberComponent extends DynamicFieldBaseComponent {
|
|
|
3077
3300
|
</p-inputNumber>
|
|
3078
3301
|
</div>
|
|
3079
3302
|
</sia-dynamic-field-wrapper>
|
|
3080
|
-
`, isInline: true, styles: ["::ng-deep p-inputNumber{width:100%;.p-inputnumber,input{width:100%}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type:
|
|
3303
|
+
`, isInline: true, styles: ["::ng-deep p-inputNumber{width:100%;.p-inputnumber,input{width:100%}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i3.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i3.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "ngmodule", type: InputNumberModule }, { kind: "component", type: i3$1.InputNumber, selector: "p-inputNumber, p-inputnumber, p-input-number", inputs: ["showButtons", "format", "buttonLayout", "inputId", "styleClass", "style", "placeholder", "size", "maxlength", "tabindex", "title", "ariaLabelledBy", "ariaLabel", "ariaRequired", "name", "required", "autocomplete", "min", "max", "incrementButtonClass", "decrementButtonClass", "incrementButtonIcon", "decrementButtonIcon", "readonly", "step", "allowEmpty", "locale", "localeMatcher", "mode", "currency", "currencyDisplay", "useGrouping", "variant", "minFractionDigits", "maxFractionDigits", "prefix", "suffix", "inputStyle", "inputStyleClass", "showClear", "autofocus", "disabled", "fluid"], outputs: ["onInput", "onFocus", "onBlur", "onKeyDown", "onClear"] }, { kind: "component", type: DynamicFieldWrapperComponent, selector: "sia-dynamic-field-wrapper", inputs: ["field", "form", "mode"] }] });
|
|
3081
3304
|
}
|
|
3082
3305
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: DynamicFieldNumberComponent, decorators: [{
|
|
3083
3306
|
type: Component,
|
|
@@ -3110,14 +3333,29 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
3110
3333
|
}], ctorParameters: () => [{ type: TranslationService }] });
|
|
3111
3334
|
|
|
3112
3335
|
class DynamicFieldDateComponent extends DynamicFieldBaseComponent {
|
|
3113
|
-
|
|
3336
|
+
localeService;
|
|
3337
|
+
currentDateFormat = 'dd/mm/yy';
|
|
3338
|
+
langSub;
|
|
3339
|
+
constructor(translationService, localeService) {
|
|
3114
3340
|
super(translationService);
|
|
3341
|
+
this.localeService = localeService;
|
|
3342
|
+
}
|
|
3343
|
+
ngOnInit() {
|
|
3344
|
+
this.updateDateFormat();
|
|
3345
|
+
this.langSub = this.translationService.currentLanguage$.subscribe(() => {
|
|
3346
|
+
this.updateDateFormat();
|
|
3347
|
+
});
|
|
3348
|
+
}
|
|
3349
|
+
ngOnDestroy() {
|
|
3350
|
+
this.langSub?.unsubscribe();
|
|
3351
|
+
}
|
|
3352
|
+
updateDateFormat() {
|
|
3353
|
+
this.currentDateFormat = this.field?.dateFormat || this.localeService.getPrimeNGDateFormat();
|
|
3115
3354
|
}
|
|
3116
|
-
// Override para passar isSelect=true
|
|
3117
3355
|
getPlaceholder() {
|
|
3118
3356
|
return super.getPlaceholder(true);
|
|
3119
3357
|
}
|
|
3120
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: DynamicFieldDateComponent, deps: [{ token: TranslationService }], target: i0.ɵɵFactoryTarget.Component });
|
|
3358
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: DynamicFieldDateComponent, deps: [{ token: TranslationService }, { token: LocaleService }], target: i0.ɵɵFactoryTarget.Component });
|
|
3121
3359
|
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: DynamicFieldDateComponent, isStandalone: true, selector: "sia-dynamic-field-date", usesInheritance: true, ngImport: i0, template: `
|
|
3122
3360
|
<sia-dynamic-field-wrapper [field]="field" [form]="form" [mode]="mode">
|
|
3123
3361
|
<div [formGroup]="form">
|
|
@@ -3125,7 +3363,7 @@ class DynamicFieldDateComponent extends DynamicFieldBaseComponent {
|
|
|
3125
3363
|
[inputId]="field.field"
|
|
3126
3364
|
[formControlName]="field.field"
|
|
3127
3365
|
[placeholder]="getPlaceholder()"
|
|
3128
|
-
[dateFormat]="
|
|
3366
|
+
[dateFormat]="currentDateFormat"
|
|
3129
3367
|
[showIcon]="true"
|
|
3130
3368
|
[showButtonBar]="true"
|
|
3131
3369
|
[class.ng-invalid]="isFieldInvalid()"
|
|
@@ -3135,7 +3373,7 @@ class DynamicFieldDateComponent extends DynamicFieldBaseComponent {
|
|
|
3135
3373
|
</p-calendar>
|
|
3136
3374
|
</div>
|
|
3137
3375
|
</sia-dynamic-field-wrapper>
|
|
3138
|
-
`, isInline: true, styles: ["::ng-deep p-calendar{width:100%;.p-calendar,input{width:100%}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type:
|
|
3376
|
+
`, isInline: true, styles: ["::ng-deep p-calendar{width:100%;.p-calendar,input{width:100%}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i3.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i3.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "ngmodule", type: CalendarModule }, { kind: "component", type: i4$3.Calendar, selector: "p-calendar", inputs: ["iconDisplay", "style", "styleClass", "inputStyle", "inputId", "name", "inputStyleClass", "placeholder", "ariaLabelledBy", "ariaLabel", "iconAriaLabel", "disabled", "dateFormat", "multipleSeparator", "rangeSeparator", "inline", "showOtherMonths", "selectOtherMonths", "showIcon", "fluid", "icon", "appendTo", "readonlyInput", "shortYearCutoff", "monthNavigator", "yearNavigator", "hourFormat", "timeOnly", "stepHour", "stepMinute", "stepSecond", "showSeconds", "required", "showOnFocus", "showWeek", "startWeekFromFirstDayOfYear", "showClear", "dataType", "selectionMode", "maxDateCount", "showButtonBar", "todayButtonStyleClass", "clearButtonStyleClass", "autofocus", "autoZIndex", "baseZIndex", "panelStyleClass", "panelStyle", "keepInvalid", "hideOnDateTimeSelect", "touchUI", "timeSeparator", "focusTrap", "showTransitionOptions", "hideTransitionOptions", "tabindex", "variant", "minDate", "maxDate", "disabledDates", "disabledDays", "yearRange", "showTime", "responsiveOptions", "numberOfMonths", "firstDayOfWeek", "locale", "view", "defaultDate"], outputs: ["onFocus", "onBlur", "onClose", "onSelect", "onClear", "onInput", "onTodayClick", "onClearClick", "onMonthChange", "onYearChange", "onClickOutside", "onShow"] }, { kind: "component", type: DynamicFieldWrapperComponent, selector: "sia-dynamic-field-wrapper", inputs: ["field", "form", "mode"] }] });
|
|
3139
3377
|
}
|
|
3140
3378
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: DynamicFieldDateComponent, decorators: [{
|
|
3141
3379
|
type: Component,
|
|
@@ -3151,7 +3389,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
3151
3389
|
[inputId]="field.field"
|
|
3152
3390
|
[formControlName]="field.field"
|
|
3153
3391
|
[placeholder]="getPlaceholder()"
|
|
3154
|
-
[dateFormat]="
|
|
3392
|
+
[dateFormat]="currentDateFormat"
|
|
3155
3393
|
[showIcon]="true"
|
|
3156
3394
|
[showButtonBar]="true"
|
|
3157
3395
|
[class.ng-invalid]="isFieldInvalid()"
|
|
@@ -3162,7 +3400,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
3162
3400
|
</div>
|
|
3163
3401
|
</sia-dynamic-field-wrapper>
|
|
3164
3402
|
`, styles: ["::ng-deep p-calendar{width:100%;.p-calendar,input{width:100%}}\n"] }]
|
|
3165
|
-
}], ctorParameters: () => [{ type: TranslationService }] });
|
|
3403
|
+
}], ctorParameters: () => [{ type: TranslationService }, { type: LocaleService }] });
|
|
3166
3404
|
|
|
3167
3405
|
class DynamicFieldDropdownComponent extends DynamicFieldBaseComponent {
|
|
3168
3406
|
constructor(translationService) {
|
|
@@ -3209,7 +3447,7 @@ class DynamicFieldDropdownComponent extends DynamicFieldBaseComponent {
|
|
|
3209
3447
|
</p-dropdown>
|
|
3210
3448
|
</div>
|
|
3211
3449
|
</sia-dynamic-field-wrapper>
|
|
3212
|
-
`, isInline: true, styles: ["::ng-deep p-dropdown{width:100%;.p-dropdown{width:100%}}.dynamic-form-dropdown-panel{min-width:100%!important}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type:
|
|
3450
|
+
`, isInline: true, styles: ["::ng-deep p-dropdown{width:100%;.p-dropdown{width:100%}}.dynamic-form-dropdown-panel{min-width:100%!important}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i3.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i3.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "ngmodule", type: DropdownModule }, { kind: "component", type: i3$2.Dropdown, selector: "p-dropdown", inputs: ["id", "scrollHeight", "filter", "name", "style", "panelStyle", "styleClass", "panelStyleClass", "readonly", "required", "editable", "appendTo", "tabindex", "placeholder", "loadingIcon", "filterPlaceholder", "filterLocale", "variant", "inputId", "dataKey", "filterBy", "filterFields", "autofocus", "resetFilterOnHide", "checkmark", "dropdownIcon", "loading", "optionLabel", "optionValue", "optionDisabled", "optionGroupLabel", "optionGroupChildren", "autoDisplayFirst", "group", "showClear", "emptyFilterMessage", "emptyMessage", "lazy", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "overlayOptions", "ariaFilterLabel", "ariaLabel", "ariaLabelledBy", "filterMatchMode", "maxlength", "tooltip", "tooltipPosition", "tooltipPositionStyle", "tooltipStyleClass", "focusOnHover", "selectOnFocus", "autoOptionFocus", "autofocusFilter", "fluid", "disabled", "itemSize", "autoZIndex", "baseZIndex", "showTransitionOptions", "hideTransitionOptions", "filterValue", "options"], outputs: ["onChange", "onFilter", "onFocus", "onBlur", "onClick", "onShow", "onHide", "onClear", "onLazyLoad"] }, { kind: "component", type: DynamicFieldWrapperComponent, selector: "sia-dynamic-field-wrapper", inputs: ["field", "form", "mode"] }], encapsulation: i0.ViewEncapsulation.None });
|
|
3213
3451
|
}
|
|
3214
3452
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: DynamicFieldDropdownComponent, decorators: [{
|
|
3215
3453
|
type: Component,
|
|
@@ -3641,7 +3879,7 @@ class DynamicFieldLookupComponent {
|
|
|
3641
3879
|
</div>
|
|
3642
3880
|
</p-dialog>
|
|
3643
3881
|
</sia-dynamic-field-wrapper>
|
|
3644
|
-
`, isInline: true, styles: [".lookup-field{width:100%;position:relative}.lookup-input-group{position:relative;width:100%;.lookup-display{width:100%;cursor:pointer;height:2.857rem;padding:.75rem 4rem .75rem .75rem;font-size:1rem;line-height:1.5;box-sizing:border-box;display:flex;align-items:center;&:focus{outline:none}&:hover{background:transparent}}.lookup-buttons{position:absolute;right:4px;top:50%;transform:translateY(-50%);display:flex;gap:2px;z-index:10}::ng-deep .p-button{width:2rem!important;height:2rem!important;min-width:2rem!important;min-height:2rem!important;padding:0!important;margin:0!important;display:flex!important;align-items:center!important;justify-content:center!important;box-sizing:border-box!important;.p-button-icon{margin:0!important;font-size:.875rem!important}.p-button-label{display:none!important}}}.lookup-dialog-content{height:100%;display:flex;flex-direction:column;padding:0;.search-wrapper{position:relative;margin-bottom:16px;width:100%;.search-input-full{width:100%;padding-right:5.5rem}.search-buttons-inside{position:absolute;right:4px;top:50%;transform:translateY(-50%);display:flex;gap:2px;::ng-deep .p-button{width:2.5rem!important;height:2.5rem!important}}}.lookup-table{flex:1;.empty-state{text-align:center;padding:32px;color:var(--p-text-color-secondary);i{font-size:48px;margin-bottom:16px;display:block}p{margin:8px 0;font-size:16px}small{font-size:14px}}}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type:
|
|
3882
|
+
`, isInline: true, styles: [".lookup-field{width:100%;position:relative}.lookup-input-group{position:relative;width:100%;.lookup-display{width:100%;cursor:pointer;height:2.857rem;padding:.75rem 4rem .75rem .75rem;font-size:1rem;line-height:1.5;box-sizing:border-box;display:flex;align-items:center;&:focus{outline:none}&:hover{background:transparent}}.lookup-buttons{position:absolute;right:4px;top:50%;transform:translateY(-50%);display:flex;gap:2px;z-index:10}::ng-deep .p-button{width:2rem!important;height:2rem!important;min-width:2rem!important;min-height:2rem!important;padding:0!important;margin:0!important;display:flex!important;align-items:center!important;justify-content:center!important;box-sizing:border-box!important;.p-button-icon{margin:0!important;font-size:.875rem!important}.p-button-label{display:none!important}}}.lookup-dialog-content{height:100%;display:flex;flex-direction:column;padding:0;.search-wrapper{position:relative;margin-bottom:16px;width:100%;.search-input-full{width:100%;padding-right:5.5rem}.search-buttons-inside{position:absolute;right:4px;top:50%;transform:translateY(-50%);display:flex;gap:2px;::ng-deep .p-button{width:2.5rem!important;height:2.5rem!important}}}.lookup-table{flex:1;.empty-state{text-align:center;padding:32px;color:var(--p-text-color-secondary);i{font-size:48px;margin-bottom:16px;display:block}p{margin:8px 0;font-size:16px}small{font-size:14px}}}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i3.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: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i3.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i3.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i3.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: ButtonModule }, { kind: "component", type: i4$1.Button, selector: "p-button", inputs: ["type", "iconPos", "icon", "badge", "label", "disabled", "loading", "loadingIcon", "raised", "rounded", "text", "plain", "severity", "outlined", "link", "tabindex", "size", "variant", "style", "styleClass", "badgeClass", "badgeSeverity", "ariaLabel", "autofocus", "fluid", "buttonProps"], outputs: ["onClick", "onFocus", "onBlur"] }, { kind: "directive", type: i2$1.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { kind: "ngmodule", type: InputTextModule }, { kind: "directive", type: i4$2.InputText, selector: "[pInputText]", inputs: ["variant", "fluid", "pSize"] }, { kind: "ngmodule", type: DialogModule }, { kind: "component", type: i4.Dialog, selector: "p-dialog", inputs: ["header", "draggable", "resizable", "positionLeft", "positionTop", "contentStyle", "contentStyleClass", "modal", "closeOnEscape", "dismissableMask", "rtl", "closable", "responsive", "appendTo", "breakpoints", "styleClass", "maskStyleClass", "maskStyle", "showHeader", "breakpoint", "blockScroll", "autoZIndex", "baseZIndex", "minX", "minY", "focusOnShow", "maximizable", "keepInViewport", "focusTrap", "transitionOptions", "closeIcon", "closeAriaLabel", "closeTabindex", "minimizeIcon", "maximizeIcon", "closeButtonProps", "maximizeButtonProps", "visible", "style", "position", "role", "content", "contentTemplate", "footerTemplate", "closeIconTemplate", "maximizeIconTemplate", "minimizeIconTemplate", "headlessTemplate"], outputs: ["onShow", "onHide", "visibleChange", "onResizeInit", "onResizeEnd", "onDragEnd", "onMaximize"] }, { kind: "ngmodule", type: TableModule }, { kind: "component", type: i8$1.Table, selector: "p-table", inputs: ["frozenColumns", "frozenValue", "style", "styleClass", "tableStyle", "tableStyleClass", "paginator", "pageLinks", "rowsPerPageOptions", "alwaysShowPaginator", "paginatorPosition", "paginatorStyleClass", "paginatorDropdownAppendTo", "paginatorDropdownScrollHeight", "currentPageReportTemplate", "showCurrentPageReport", "showJumpToPageDropdown", "showJumpToPageInput", "showFirstLastIcon", "showPageLinks", "defaultSortOrder", "sortMode", "resetPageOnSort", "selectionMode", "selectionPageOnly", "contextMenuSelection", "contextMenuSelectionMode", "dataKey", "metaKeySelection", "rowSelectable", "rowTrackBy", "lazy", "lazyLoadOnInit", "compareSelectionBy", "csvSeparator", "exportFilename", "filters", "globalFilterFields", "filterDelay", "filterLocale", "expandedRowKeys", "editingRowKeys", "rowExpandMode", "scrollable", "scrollDirection", "rowGroupMode", "scrollHeight", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "virtualScrollDelay", "frozenWidth", "responsive", "contextMenu", "resizableColumns", "columnResizeMode", "reorderableColumns", "loading", "loadingIcon", "showLoader", "rowHover", "customSort", "showInitialSortBadge", "autoLayout", "exportFunction", "exportHeader", "stateKey", "stateStorage", "editMode", "groupRowsBy", "size", "showGridlines", "stripedRows", "groupRowsByOrder", "responsiveLayout", "breakpoint", "paginatorLocale", "value", "columns", "first", "rows", "totalRecords", "sortField", "sortOrder", "multiSortMeta", "selection", "virtualRowHeight", "selectAll"], outputs: ["contextMenuSelectionChange", "selectAllChange", "selectionChange", "onRowSelect", "onRowUnselect", "onPage", "onSort", "onFilter", "onLazyLoad", "onRowExpand", "onRowCollapse", "onContextMenuSelect", "onColResize", "onColReorder", "onRowReorder", "onEditInit", "onEditComplete", "onEditCancel", "onHeaderCheckboxToggle", "sortFunction", "firstChange", "rowsChange", "onStateSave", "onStateRestore"] }, { kind: "directive", type: i8$1.SelectableRow, selector: "[pSelectableRow]", inputs: ["pSelectableRow", "pSelectableRowIndex", "pSelectableRowDisabled"] }, { kind: "ngmodule", type: TooltipModule }, { kind: "directive", type: i9.Tooltip, selector: "[pTooltip]", inputs: ["tooltipPosition", "tooltipEvent", "appendTo", "positionStyle", "tooltipStyleClass", "tooltipZIndex", "escape", "showDelay", "hideDelay", "life", "positionTop", "positionLeft", "autoHide", "fitContent", "hideOnEscape", "pTooltip", "tooltipDisabled", "tooltipOptions"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }, { kind: "component", type: DynamicFieldWrapperComponent, selector: "sia-dynamic-field-wrapper", inputs: ["field", "form", "mode"] }] });
|
|
3645
3883
|
}
|
|
3646
3884
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: DynamicFieldLookupComponent, decorators: [{
|
|
3647
3885
|
type: Component,
|
|
@@ -3829,7 +4067,7 @@ class DynamicFieldTextareaComponent extends DynamicFieldBaseComponent {
|
|
|
3829
4067
|
</textarea>
|
|
3830
4068
|
</div>
|
|
3831
4069
|
</sia-dynamic-field-wrapper>
|
|
3832
|
-
`, isInline: true, styles: ["textarea{width:100%;resize:vertical}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type:
|
|
4070
|
+
`, isInline: true, styles: ["textarea{width:100%;resize:vertical}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i3.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: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i3.MaxLengthValidator, selector: "[maxlength][formControlName],[maxlength][formControl],[maxlength][ngModel]", inputs: ["maxlength"] }, { kind: "directive", type: i3.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i3.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: InputTextarea, selector: "[pInputTextarea]", inputs: ["autoResize", "variant", "fluid"], outputs: ["onResize"] }, { kind: "component", type: DynamicFieldWrapperComponent, selector: "sia-dynamic-field-wrapper", inputs: ["field", "form", "mode"] }] });
|
|
3833
4071
|
}
|
|
3834
4072
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: DynamicFieldTextareaComponent, decorators: [{
|
|
3835
4073
|
type: Component,
|
|
@@ -3860,6 +4098,7 @@ class DynamicFormComponent {
|
|
|
3860
4098
|
fb;
|
|
3861
4099
|
translationService;
|
|
3862
4100
|
maskService;
|
|
4101
|
+
localeService;
|
|
3863
4102
|
formFields = [];
|
|
3864
4103
|
formSections = [];
|
|
3865
4104
|
fixedFilters = []; // Filtros fixos (sempre visíveis no topo)
|
|
@@ -3988,10 +4227,11 @@ class DynamicFormComponent {
|
|
|
3988
4227
|
get cancelLabel() {
|
|
3989
4228
|
return this.cancelButtonLabel || this.translationService.translate('design.components_ai.cancel');
|
|
3990
4229
|
}
|
|
3991
|
-
constructor(fb, translationService, maskService) {
|
|
4230
|
+
constructor(fb, translationService, maskService, localeService) {
|
|
3992
4231
|
this.fb = fb;
|
|
3993
4232
|
this.translationService = translationService;
|
|
3994
4233
|
this.maskService = maskService;
|
|
4234
|
+
this.localeService = localeService;
|
|
3995
4235
|
}
|
|
3996
4236
|
ngOnInit() {
|
|
3997
4237
|
this.initForm();
|
|
@@ -4421,8 +4661,7 @@ class DynamicFormComponent {
|
|
|
4421
4661
|
}
|
|
4422
4662
|
// For date fields, format as date
|
|
4423
4663
|
if (field?.type === 'date' && value) {
|
|
4424
|
-
|
|
4425
|
-
return date.toLocaleDateString('pt-BR');
|
|
4664
|
+
return this.localeService.formatDate(value);
|
|
4426
4665
|
}
|
|
4427
4666
|
// For text fields with document mask, format the value
|
|
4428
4667
|
if (field?.type === 'text' && field.mask === 'document' && value) {
|
|
@@ -4438,8 +4677,8 @@ class DynamicFormComponent {
|
|
|
4438
4677
|
}
|
|
4439
4678
|
return String(value);
|
|
4440
4679
|
}
|
|
4441
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: DynamicFormComponent, deps: [{ token:
|
|
4442
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: DynamicFormComponent, isStandalone: true, selector: "sia-dynamic-form", inputs: { formFields: "formFields", formSections: "formSections", fixedFilters: "fixedFilters", filterSections: "filterSections", entityData: "entityData", mode: "mode", displayMode: "displayMode", visible: "visible", dialogConfig: "dialogConfig", drawerConfig: "drawerConfig", showSubmitButton: "showSubmitButton", showCancelButton: "showCancelButton", submitButtonLabel: "submitButtonLabel", cancelButtonLabel: "cancelButtonLabel", submitButtonIcon: "submitButtonIcon", cancelButtonIcon: "cancelButtonIcon" }, outputs: { formReady: "formReady", formSubmit: "formSubmit", visibleChange: "visibleChange", onCancel: "onCancel", fieldSave: "fieldSave" }, usesOnChanges: true, ngImport: i0, template: "<!-- Modo Inline (padr\u00E3o) -->\n<ng-container *ngIf=\"isInlineMode\">\n <ng-container *ngTemplateOutlet=\"formContent\"></ng-container>\n</ng-container>\n\n<!-- Modo Dialog -->\n<p-dialog\n *ngIf=\"isDialogMode\"\n [(visible)]=\"visible\"\n [header]=\"dialogHeader | translate\"\n [modal]=\"true\"\n [style]=\"{ width: dialogWidth }\"\n [draggable]=\"dialogDraggable\"\n [resizable]=\"dialogResizable\"\n [maximizable]=\"dialogMaximizable\"\n [closeOnEscape]=\"dialogCloseOnEscape\"\n [dismissableMask]=\"dialogDismissableMask\"\n (onHide)=\"close()\">\n \n <ng-container *ngTemplateOutlet=\"formContent\"></ng-container>\n \n <ng-template pTemplate=\"footer\" *ngIf=\"showSubmitButton || showCancelButton\">\n <div class=\"dialog-footer\">\n <p-button\n *ngIf=\"showCancelButton\"\n [label]=\"cancelLabel | translate\"\n [icon]=\"cancelButtonIcon\"\n severity=\"secondary\"\n (onClick)=\"handleCancel()\"\n [disabled]=\"loading\">\n </p-button>\n <p-button\n *ngIf=\"showSubmitButton\"\n [label]=\"submitLabel | translate\"\n [icon]=\"submitButtonIcon\"\n (onClick)=\"handleSubmit()\"\n [loading]=\"loading\"\n [disabled]=\"form.invalid\">\n </p-button>\n </div>\n </ng-template>\n</p-dialog>\n\n<!-- Modo Drawer -->\n<p-drawer\n *ngIf=\"isDrawerMode\"\n [(visible)]=\"visible\"\n [header]=\"drawerHeader | translate\"\n [position]=\"drawerPosition\"\n [style]=\"drawerStyle\"\n [showCloseIcon]=\"drawerShowCloseIcon\"\n [closeOnEscape]=\"drawerCloseOnEscape\"\n [modal]=\"drawerDismissable\"\n (onHide)=\"close()\">\n \n <ng-container *ngTemplateOutlet=\"formContent\"></ng-container>\n \n <ng-template pTemplate=\"footer\" *ngIf=\"showSubmitButton || showCancelButton\">\n <div class=\"drawer-footer\">\n <p-button\n *ngIf=\"showCancelButton\"\n [label]=\"cancelLabel | translate\"\n [icon]=\"cancelButtonIcon\"\n severity=\"secondary\"\n (onClick)=\"handleCancel()\"\n [disabled]=\"loading\">\n </p-button>\n <p-button\n *ngIf=\"showSubmitButton\"\n [label]=\"submitLabel | translate\"\n [icon]=\"submitButtonIcon\"\n (onClick)=\"handleSubmit()\"\n [loading]=\"loading\"\n [disabled]=\"form.invalid\">\n </p-button>\n </div>\n </ng-template>\n</p-drawer>\n\n<!-- Template do Formul\u00E1rio (reutiliz\u00E1vel) -->\n<ng-template #formContent>\n <form [formGroup]=\"form\" class=\"dynamic-form\">\n \n <!-- Filtros Fixos (apenas no modo filter) -->\n <div *ngIf=\"mode === 'filter' && hasFixedFilters\" class=\"fixed-filters-section\">\n <div class=\"grid\">\n <ng-container *ngFor=\"let field of fixedFilters\">\n <div *ngIf=\"isFieldVisible(field)\" [ngClass]=\"getFieldGridClass(field)\">\n <ng-container *ngTemplateOutlet=\"fieldTemplate; context: { field: field }\"></ng-container>\n </div>\n </ng-container>\n </div>\n </div>\n\n <!-- Campos Diretos (sem se\u00E7\u00E3o) -->\n <div *ngIf=\"hasFields\">\n <!-- Modo Inline Edit -->\n <div *ngIf=\"isInlineEditMode\" class=\"inline-edit-fields\">\n <ng-container *ngFor=\"let field of formFields\">\n <div *ngIf=\"isFieldVisible(field)\" class=\"inline-edit-field\">\n <ng-container *ngTemplateOutlet=\"inlineEditFieldTemplate; context: { field: field }\"></ng-container>\n </div>\n </ng-container>\n </div>\n\n <!-- Modo Form Normal -->\n <div *ngIf=\"!isInlineEditMode\" class=\"grid\">\n <ng-container *ngFor=\"let field of formFields\">\n <div *ngIf=\"isFieldVisible(field)\" [ngClass]=\"getFieldGridClass(field)\">\n <ng-container *ngTemplateOutlet=\"fieldTemplate; context: { field: field }\"></ng-container>\n </div>\n </ng-container>\n </div>\n </div>\n\n <!-- Se\u00E7\u00F5es de Campos (modo form) -->\n <div *ngIf=\"hasSections\" class=\"sections-container\">\n <p-panel \n *ngFor=\"let section of formSections\"\n [toggleable]=\"section.toggleable !== false\"\n [collapsed]=\"section.collapsed || false\"\n [styleClass]=\"'section-panel'\">\n \n <ng-template pTemplate=\"header\">\n <div class=\"section-header\">\n <i *ngIf=\"section.icon\" [class]=\"section.icon + ' section-icon'\"></i>\n <span class=\"section-title\">{{ section.title }}</span>\n </div>\n </ng-template>\n\n <!-- Modo Inline Edit -->\n <div *ngIf=\"isInlineEditMode\" class=\"inline-edit-fields\">\n <ng-container *ngFor=\"let field of section.fields\">\n <div *ngIf=\"isFieldVisible(field)\" class=\"inline-edit-field\">\n <ng-container *ngTemplateOutlet=\"inlineEditFieldTemplate; context: { field: field }\"></ng-container>\n </div>\n </ng-container>\n </div>\n\n <!-- Modo Form Normal -->\n <div *ngIf=\"!isInlineEditMode\" class=\"grid\">\n <ng-container *ngFor=\"let field of section.fields\">\n <div *ngIf=\"isFieldVisible(field)\" [ngClass]=\"getFieldGridClass(field)\">\n <ng-container *ngTemplateOutlet=\"fieldTemplate; context: { field: field }\"></ng-container>\n </div>\n </ng-container>\n </div>\n </p-panel>\n </div>\n\n <!-- Se\u00E7\u00F5es de Filtros (apenas no modo filter) -->\n <div *ngIf=\"mode === 'filter' && hasFilterSections\" class=\"filter-sections-container\">\n <p-panel \n *ngFor=\"let section of filterSections\"\n [header]=\"section.title\"\n [toggleable]=\"true\"\n [collapsed]=\"true\">\n\n <div class=\"grid\">\n <ng-container *ngFor=\"let field of section.fields\">\n <div *ngIf=\"isFieldVisible(field)\" [ngClass]=\"getFieldGridClass(field)\">\n <ng-container *ngTemplateOutlet=\"fieldTemplate; context: { field: field }\"></ng-container>\n </div>\n </ng-container>\n </div>\n </p-panel>\n </div>\n\n <!-- Bot\u00F5es inline (apenas para modo inline) -->\n <div *ngIf=\"isInlineMode && (showSubmitButton || showCancelButton)\" class=\"form-actions\">\n <p-button\n *ngIf=\"showCancelButton\"\n [label]=\"cancelLabel | translate\"\n [icon]=\"cancelButtonIcon\"\n severity=\"secondary\"\n (onClick)=\"handleCancel()\"\n [disabled]=\"loading\">\n </p-button>\n <p-button\n *ngIf=\"showSubmitButton\"\n [label]=\"submitLabel | translate\"\n [icon]=\"submitButtonIcon\"\n (onClick)=\"handleSubmit()\"\n [loading]=\"loading\"\n [disabled]=\"form.invalid\">\n </p-button>\n </div>\n\n </form>\n</ng-template>\n\n<!-- Template de Campo (reutiliz\u00E1vel) -->\n<ng-template #fieldTemplate let-field=\"field\">\n <!-- Text Field -->\n <sia-dynamic-field-text\n *ngIf=\"field.type === 'text'\"\n [field]=\"field\"\n [form]=\"form\"\n [mode]=\"fieldMode\">\n </sia-dynamic-field-text>\n\n <!-- Textarea Field -->\n <sia-dynamic-field-textarea\n *ngIf=\"field.type === 'textarea'\"\n [field]=\"field\"\n [form]=\"form\"\n [mode]=\"fieldMode\">\n </sia-dynamic-field-textarea>\n\n <!-- Number Field -->\n <sia-dynamic-field-number\n *ngIf=\"field.type === 'number'\"\n [field]=\"field\"\n [form]=\"form\"\n [mode]=\"fieldMode\">\n </sia-dynamic-field-number>\n\n <!-- Date Field -->\n <sia-dynamic-field-date\n *ngIf=\"field.type === 'date'\"\n [field]=\"field\"\n [form]=\"form\"\n [mode]=\"fieldMode\">\n </sia-dynamic-field-date>\n\n <!-- Dropdown/Enum Field -->\n <sia-dynamic-field-dropdown\n *ngIf=\"field.type === 'dropdown' || field.type === 'enum'\"\n [field]=\"field\"\n [form]=\"form\"\n [mode]=\"fieldMode\">\n </sia-dynamic-field-dropdown>\n\n <!-- Lookup Field -->\n <sia-dynamic-field-lookup\n *ngIf=\"field.type === 'lookup'\"\n [field]=\"field\"\n [form]=\"form\"\n [formGroup]=\"form\"\n [mode]=\"fieldMode\">\n </sia-dynamic-field-lookup>\n</ng-template>\n\n\n<!-- Template de Campo Inline Edit -->\n<ng-template #inlineEditFieldTemplate let-field=\"field\">\n <div class=\"edit-inline-field\">\n <label class=\"field-label\">{{ field.label | translate }}</label>\n \n <!-- Display Mode -->\n <div class=\"field-display\" \n *ngIf=\"!isFieldEditing(field.field)\" \n (click)=\"startEditField(field.field)\"\n [class.disabled]=\"field.disabled\">\n <span class=\"display-value\" \n [attr.data-placeholder]=\"field.placeholder || ('crmx.business.not_informed' | translate)\">\n {{ getFieldDisplayValue(field.field) }}\n </span>\n <i class=\"pi pi-pencil edit-icon\" *ngIf=\"!field.disabled\"></i>\n </div>\n \n <!-- Edit Mode -->\n <div class=\"field-edit\" *ngIf=\"isFieldEditing(field.field)\">\n <div class=\"input-container\">\n <ng-container *ngTemplateOutlet=\"fieldTemplate; context: { field: field }\"></ng-container>\n </div>\n \n <!-- Action Buttons -->\n <div class=\"edit-actions\">\n <p-button \n type=\"button\" \n icon=\"pi pi-check\" \n [rounded]=\"true\"\n severity=\"primary\"\n (onClick)=\"saveInlineField(field.field)\" \n [loading]=\"savingField\"\n [disabled]=\"form.get(field.field)?.invalid\">\n </p-button>\n <p-button \n type=\"button\" \n icon=\"pi pi-times\" \n [rounded]=\"true\"\n severity=\"secondary\"\n (onClick)=\"cancelInlineEdit()\"\n [disabled]=\"savingField\">\n </p-button>\n </div>\n \n <!-- Error Message -->\n <div class=\"field-error\" *ngIf=\"form.get(field.field)?.invalid && form.get(field.field)?.touched\">\n <small class=\"p-error\">\n {{ form.get(field.field)?.errors?.['required'] ? ('crmx.business.required_field' | translate) : '' }}\n </small>\n </div>\n </div>\n </div>\n</ng-template>\n", styles: [".dynamic-form{width:100%}.dynamic-form .grid{display:grid;grid-template-columns:repeat(12,1fr);gap:1rem}.dynamic-form .grid>div.col-1{grid-column:span 1}.dynamic-form .grid>div.col-2{grid-column:span 2}.dynamic-form .grid>div.col-3{grid-column:span 3}.dynamic-form .grid>div.col-4{grid-column:span 4}.dynamic-form .grid>div.col-5{grid-column:span 5}.dynamic-form .grid>div.col-6{grid-column:span 6}.dynamic-form .grid>div.col-7{grid-column:span 7}.dynamic-form .grid>div.col-8{grid-column:span 8}.dynamic-form .grid>div.col-9{grid-column:span 9}.dynamic-form .grid>div.col-10{grid-column:span 10}.dynamic-form .grid>div.col-11{grid-column:span 11}.dynamic-form .grid>div.col-12{grid-column:span 12}@media (max-width: 575.98px){.dynamic-form .grid>div.col-xs-1{grid-column:span 1}.dynamic-form .grid>div.col-xs-2{grid-column:span 2}.dynamic-form .grid>div.col-xs-3{grid-column:span 3}.dynamic-form .grid>div.col-xs-4{grid-column:span 4}.dynamic-form .grid>div.col-xs-5{grid-column:span 5}.dynamic-form .grid>div.col-xs-6{grid-column:span 6}.dynamic-form .grid>div.col-xs-7{grid-column:span 7}.dynamic-form .grid>div.col-xs-8{grid-column:span 8}.dynamic-form .grid>div.col-xs-9{grid-column:span 9}.dynamic-form .grid>div.col-xs-10{grid-column:span 10}.dynamic-form .grid>div.col-xs-11{grid-column:span 11}.dynamic-form .grid>div.col-xs-12{grid-column:span 12}}@media (min-width: 576px){.dynamic-form .grid>div.col-sm-1{grid-column:span 1}.dynamic-form .grid>div.col-sm-2{grid-column:span 2}.dynamic-form .grid>div.col-sm-3{grid-column:span 3}.dynamic-form .grid>div.col-sm-4{grid-column:span 4}.dynamic-form .grid>div.col-sm-5{grid-column:span 5}.dynamic-form .grid>div.col-sm-6{grid-column:span 6}.dynamic-form .grid>div.col-sm-7{grid-column:span 7}.dynamic-form .grid>div.col-sm-8{grid-column:span 8}.dynamic-form .grid>div.col-sm-9{grid-column:span 9}.dynamic-form .grid>div.col-sm-10{grid-column:span 10}.dynamic-form .grid>div.col-sm-11{grid-column:span 11}.dynamic-form .grid>div.col-sm-12{grid-column:span 12}}@media (min-width: 768px){.dynamic-form .grid>div.col-md-1{grid-column:span 1}.dynamic-form .grid>div.col-md-2{grid-column:span 2}.dynamic-form .grid>div.col-md-3{grid-column:span 3}.dynamic-form .grid>div.col-md-4{grid-column:span 4}.dynamic-form .grid>div.col-md-5{grid-column:span 5}.dynamic-form .grid>div.col-md-6{grid-column:span 6}.dynamic-form .grid>div.col-md-7{grid-column:span 7}.dynamic-form .grid>div.col-md-8{grid-column:span 8}.dynamic-form .grid>div.col-md-9{grid-column:span 9}.dynamic-form .grid>div.col-md-10{grid-column:span 10}.dynamic-form .grid>div.col-md-11{grid-column:span 11}.dynamic-form .grid>div.col-md-12{grid-column:span 12}}@media (min-width: 992px){.dynamic-form .grid>div.col-lg-1{grid-column:span 1}.dynamic-form .grid>div.col-lg-2{grid-column:span 2}.dynamic-form .grid>div.col-lg-3{grid-column:span 3}.dynamic-form .grid>div.col-lg-4{grid-column:span 4}.dynamic-form .grid>div.col-lg-5{grid-column:span 5}.dynamic-form .grid>div.col-lg-6{grid-column:span 6}.dynamic-form .grid>div.col-lg-7{grid-column:span 7}.dynamic-form .grid>div.col-lg-8{grid-column:span 8}.dynamic-form .grid>div.col-lg-9{grid-column:span 9}.dynamic-form .grid>div.col-lg-10{grid-column:span 10}.dynamic-form .grid>div.col-lg-11{grid-column:span 11}.dynamic-form .grid>div.col-lg-12{grid-column:span 12}}@media (min-width: 1200px){.dynamic-form .grid>div.col-xl-1{grid-column:span 1}.dynamic-form .grid>div.col-xl-2{grid-column:span 2}.dynamic-form .grid>div.col-xl-3{grid-column:span 3}.dynamic-form .grid>div.col-xl-4{grid-column:span 4}.dynamic-form .grid>div.col-xl-5{grid-column:span 5}.dynamic-form .grid>div.col-xl-6{grid-column:span 6}.dynamic-form .grid>div.col-xl-7{grid-column:span 7}.dynamic-form .grid>div.col-xl-8{grid-column:span 8}.dynamic-form .grid>div.col-xl-9{grid-column:span 9}.dynamic-form .grid>div.col-xl-10{grid-column:span 10}.dynamic-form .grid>div.col-xl-11{grid-column:span 11}.dynamic-form .grid>div.col-xl-12{grid-column:span 12}}.dynamic-form .sections-container{display:flex;flex-direction:column;gap:1rem;margin-top:1rem}.dynamic-form .sections-container ::ng-deep .section-panel .p-panel-header{background-color:var(--surface-50);border-color:var(--surface-200)}.dynamic-form .sections-container ::ng-deep .section-panel .p-panel-header .section-header{display:flex;align-items:center;gap:.5rem;width:100%}.dynamic-form .sections-container ::ng-deep .section-panel .p-panel-header .section-header .section-icon{font-size:1.1rem;color:var(--primary-color)}.dynamic-form .sections-container ::ng-deep .section-panel .p-panel-header .section-header .section-title{font-weight:600;color:var(--text-color)}.dynamic-form .sections-container ::ng-deep .section-panel .p-panel-content{padding:1.5rem}.dynamic-form .fixed-filters-section{margin-bottom:1rem;padding-bottom:1rem;border-bottom:1px solid var(--surface-200)}.dynamic-form .filter-sections-container{display:flex;flex-direction:column;gap:1rem;margin-top:1rem}.dynamic-form .form-actions{display:flex;justify-content:flex-end;gap:.5rem;margin-top:1.5rem;padding-top:1rem;border-top:1px solid var(--surface-200)}.dialog-footer{display:flex;justify-content:flex-end;gap:.5rem}.drawer-footer{display:flex;justify-content:flex-end;gap:.5rem;padding:1rem;border-top:1px solid var(--surface-200)}.inline-edit-fields{display:flex;flex-direction:column;gap:1rem}.inline-edit-fields .inline-edit-field{display:flex;flex-direction:column;gap:.25rem}.inline-edit-fields .inline-edit-field .field-label{font-weight:500;font-size:.875rem;color:var(--text-color-secondary);margin-bottom:.25rem}.inline-edit-fields .inline-edit-field .field-display{display:flex;align-items:center;justify-content:space-between;padding:.75rem;background-color:var(--surface-50);border:1px solid var(--surface-200);border-radius:var(--border-radius);cursor:pointer;transition:all .2s ease;min-height:42px}.inline-edit-fields .inline-edit-field .field-display:hover:not(.disabled){background-color:var(--surface-100);border-color:var(--primary-color)}.inline-edit-fields .inline-edit-field .field-display:hover:not(.disabled) .edit-icon{opacity:1}.inline-edit-fields .inline-edit-field .field-display.disabled{cursor:not-allowed;opacity:.6}.inline-edit-fields .inline-edit-field .field-display .display-value{flex:1;color:var(--text-color)}.inline-edit-fields .inline-edit-field .field-display .display-value:empty:before{content:attr(data-placeholder);color:var(--text-color-secondary);font-style:italic}.inline-edit-fields .inline-edit-field .field-display .edit-icon{color:var(--primary-color);font-size:.875rem;opacity:.5;transition:opacity .2s ease}.inline-edit-fields .inline-edit-field .field-edit{display:flex;flex-direction:column;gap:.5rem}.inline-edit-fields .inline-edit-field .field-edit .input-container{flex:1}.inline-edit-fields .inline-edit-field .field-edit .input-container ::ng-deep .field{gap:0}.inline-edit-fields .inline-edit-field .field-edit .input-container ::ng-deep .field label{display:none}.inline-edit-fields .inline-edit-field .field-edit .input-container ::ng-deep .field small.p-error{display:none}.inline-edit-fields .inline-edit-field .field-edit .edit-actions{display:flex;gap:.5rem;justify-content:flex-end}.inline-edit-fields .inline-edit-field .field-edit .field-error small.p-error{color:var(--p-red-500);font-size:.875rem}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i2$1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i2$1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i2$1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "ngmodule", type: PanelModule }, { kind: "component", type: i5$1.Panel, selector: "p-panel", inputs: ["toggleable", "header", "collapsed", "style", "styleClass", "iconPos", "expandIcon", "collapseIcon", "showHeader", "toggler", "transitionOptions", "toggleButtonProps"], outputs: ["collapsedChange", "onBeforeToggle", "onAfterToggle"] }, { kind: "directive", type: i2$2.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { kind: "ngmodule", type: DialogModule }, { kind: "component", type: i7.Dialog, selector: "p-dialog", inputs: ["header", "draggable", "resizable", "positionLeft", "positionTop", "contentStyle", "contentStyleClass", "modal", "closeOnEscape", "dismissableMask", "rtl", "closable", "responsive", "appendTo", "breakpoints", "styleClass", "maskStyleClass", "maskStyle", "showHeader", "breakpoint", "blockScroll", "autoZIndex", "baseZIndex", "minX", "minY", "focusOnShow", "maximizable", "keepInViewport", "focusTrap", "transitionOptions", "closeIcon", "closeAriaLabel", "closeTabindex", "minimizeIcon", "maximizeIcon", "closeButtonProps", "maximizeButtonProps", "visible", "style", "position", "role", "content", "contentTemplate", "footerTemplate", "closeIconTemplate", "maximizeIconTemplate", "minimizeIconTemplate", "headlessTemplate"], outputs: ["onShow", "onHide", "visibleChange", "onResizeInit", "onResizeEnd", "onDragEnd", "onMaximize"] }, { kind: "ngmodule", type: DrawerModule }, { kind: "component", type: i8$2.Drawer, selector: "p-drawer", inputs: ["appendTo", "blockScroll", "style", "styleClass", "ariaCloseLabel", "autoZIndex", "baseZIndex", "modal", "closeButtonProps", "dismissible", "showCloseIcon", "closeOnEscape", "transitionOptions", "visible", "position", "fullScreen", "header", "maskStyle", "closable"], outputs: ["onShow", "onHide", "visibleChange"] }, { kind: "ngmodule", type: ButtonModule }, { kind: "component", type: i4.Button, selector: "p-button", inputs: ["type", "iconPos", "icon", "badge", "label", "disabled", "loading", "loadingIcon", "raised", "rounded", "text", "plain", "severity", "outlined", "link", "tabindex", "size", "variant", "style", "styleClass", "badgeClass", "badgeSeverity", "ariaLabel", "autofocus", "fluid", "buttonProps"], outputs: ["onClick", "onFocus", "onBlur"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }, { kind: "component", type: DynamicFieldTextComponent, selector: "sia-dynamic-field-text" }, { kind: "component", type: DynamicFieldNumberComponent, selector: "sia-dynamic-field-number" }, { kind: "component", type: DynamicFieldDateComponent, selector: "sia-dynamic-field-date" }, { kind: "component", type: DynamicFieldDropdownComponent, selector: "sia-dynamic-field-dropdown" }, { kind: "component", type: DynamicFieldLookupComponent, selector: "sia-dynamic-field-lookup", inputs: ["field", "form", "formGroup", "mode"] }, { kind: "component", type: DynamicFieldTextareaComponent, selector: "sia-dynamic-field-textarea" }] });
|
|
4680
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: DynamicFormComponent, deps: [{ token: i3.FormBuilder }, { token: TranslationService }, { token: MaskService }, { token: LocaleService }], target: i0.ɵɵFactoryTarget.Component });
|
|
4681
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: DynamicFormComponent, isStandalone: true, selector: "sia-dynamic-form", inputs: { formFields: "formFields", formSections: "formSections", fixedFilters: "fixedFilters", filterSections: "filterSections", entityData: "entityData", mode: "mode", displayMode: "displayMode", visible: "visible", dialogConfig: "dialogConfig", drawerConfig: "drawerConfig", showSubmitButton: "showSubmitButton", showCancelButton: "showCancelButton", submitButtonLabel: "submitButtonLabel", cancelButtonLabel: "cancelButtonLabel", submitButtonIcon: "submitButtonIcon", cancelButtonIcon: "cancelButtonIcon" }, outputs: { formReady: "formReady", formSubmit: "formSubmit", visibleChange: "visibleChange", onCancel: "onCancel", fieldSave: "fieldSave" }, usesOnChanges: true, ngImport: i0, template: "<!-- Modo Inline (padr\u00E3o) -->\n<ng-container *ngIf=\"isInlineMode\">\n <ng-container *ngTemplateOutlet=\"formContent\"></ng-container>\n</ng-container>\n\n<!-- Modo Dialog -->\n<p-dialog\n *ngIf=\"isDialogMode\"\n [(visible)]=\"visible\"\n [header]=\"dialogHeader | translate\"\n [modal]=\"true\"\n [style]=\"{ width: dialogWidth }\"\n [draggable]=\"dialogDraggable\"\n [resizable]=\"dialogResizable\"\n [maximizable]=\"dialogMaximizable\"\n [closeOnEscape]=\"dialogCloseOnEscape\"\n [dismissableMask]=\"dialogDismissableMask\"\n (onHide)=\"close()\">\n \n <ng-container *ngTemplateOutlet=\"formContent\"></ng-container>\n \n <ng-template pTemplate=\"footer\" *ngIf=\"showSubmitButton || showCancelButton\">\n <div class=\"dialog-footer\">\n <p-button\n *ngIf=\"showCancelButton\"\n [label]=\"cancelLabel | translate\"\n [icon]=\"cancelButtonIcon\"\n severity=\"secondary\"\n (onClick)=\"handleCancel()\"\n [disabled]=\"loading\">\n </p-button>\n <p-button\n *ngIf=\"showSubmitButton\"\n [label]=\"submitLabel | translate\"\n [icon]=\"submitButtonIcon\"\n (onClick)=\"handleSubmit()\"\n [loading]=\"loading\"\n [disabled]=\"form.invalid\">\n </p-button>\n </div>\n </ng-template>\n</p-dialog>\n\n<!-- Modo Drawer -->\n<p-drawer\n *ngIf=\"isDrawerMode\"\n [(visible)]=\"visible\"\n [header]=\"drawerHeader | translate\"\n [position]=\"drawerPosition\"\n [style]=\"drawerStyle\"\n [showCloseIcon]=\"drawerShowCloseIcon\"\n [closeOnEscape]=\"drawerCloseOnEscape\"\n [modal]=\"drawerDismissable\"\n (onHide)=\"close()\">\n \n <ng-container *ngTemplateOutlet=\"formContent\"></ng-container>\n \n <ng-template pTemplate=\"footer\" *ngIf=\"showSubmitButton || showCancelButton\">\n <div class=\"drawer-footer\">\n <p-button\n *ngIf=\"showCancelButton\"\n [label]=\"cancelLabel | translate\"\n [icon]=\"cancelButtonIcon\"\n severity=\"secondary\"\n (onClick)=\"handleCancel()\"\n [disabled]=\"loading\">\n </p-button>\n <p-button\n *ngIf=\"showSubmitButton\"\n [label]=\"submitLabel | translate\"\n [icon]=\"submitButtonIcon\"\n (onClick)=\"handleSubmit()\"\n [loading]=\"loading\"\n [disabled]=\"form.invalid\">\n </p-button>\n </div>\n </ng-template>\n</p-drawer>\n\n<!-- Template do Formul\u00E1rio (reutiliz\u00E1vel) -->\n<ng-template #formContent>\n <form [formGroup]=\"form\" class=\"dynamic-form\">\n \n <!-- Filtros Fixos (apenas no modo filter) -->\n <div *ngIf=\"mode === 'filter' && hasFixedFilters\" class=\"fixed-filters-section\">\n <div class=\"grid\">\n <ng-container *ngFor=\"let field of fixedFilters\">\n <div *ngIf=\"isFieldVisible(field)\" [ngClass]=\"getFieldGridClass(field)\">\n <ng-container *ngTemplateOutlet=\"fieldTemplate; context: { field: field }\"></ng-container>\n </div>\n </ng-container>\n </div>\n </div>\n\n <!-- Campos Diretos (sem se\u00E7\u00E3o) -->\n <div *ngIf=\"hasFields\">\n <!-- Modo Inline Edit -->\n <div *ngIf=\"isInlineEditMode\" class=\"inline-edit-fields\">\n <ng-container *ngFor=\"let field of formFields\">\n <div *ngIf=\"isFieldVisible(field)\" class=\"inline-edit-field\">\n <ng-container *ngTemplateOutlet=\"inlineEditFieldTemplate; context: { field: field }\"></ng-container>\n </div>\n </ng-container>\n </div>\n\n <!-- Modo Form Normal -->\n <div *ngIf=\"!isInlineEditMode\" class=\"grid\">\n <ng-container *ngFor=\"let field of formFields\">\n <div *ngIf=\"isFieldVisible(field)\" [ngClass]=\"getFieldGridClass(field)\">\n <ng-container *ngTemplateOutlet=\"fieldTemplate; context: { field: field }\"></ng-container>\n </div>\n </ng-container>\n </div>\n </div>\n\n <!-- Se\u00E7\u00F5es de Campos (modo form) -->\n <div *ngIf=\"hasSections\" class=\"sections-container\">\n <p-panel \n *ngFor=\"let section of formSections\"\n [toggleable]=\"section.toggleable !== false\"\n [collapsed]=\"section.collapsed || false\"\n [styleClass]=\"'section-panel'\">\n \n <ng-template pTemplate=\"header\">\n <div class=\"section-header\">\n <i *ngIf=\"section.icon\" [class]=\"section.icon + ' section-icon'\"></i>\n <span class=\"section-title\">{{ section.title }}</span>\n </div>\n </ng-template>\n\n <!-- Modo Inline Edit -->\n <div *ngIf=\"isInlineEditMode\" class=\"inline-edit-fields\">\n <ng-container *ngFor=\"let field of section.fields\">\n <div *ngIf=\"isFieldVisible(field)\" class=\"inline-edit-field\">\n <ng-container *ngTemplateOutlet=\"inlineEditFieldTemplate; context: { field: field }\"></ng-container>\n </div>\n </ng-container>\n </div>\n\n <!-- Modo Form Normal -->\n <div *ngIf=\"!isInlineEditMode\" class=\"grid\">\n <ng-container *ngFor=\"let field of section.fields\">\n <div *ngIf=\"isFieldVisible(field)\" [ngClass]=\"getFieldGridClass(field)\">\n <ng-container *ngTemplateOutlet=\"fieldTemplate; context: { field: field }\"></ng-container>\n </div>\n </ng-container>\n </div>\n </p-panel>\n </div>\n\n <!-- Se\u00E7\u00F5es de Filtros (apenas no modo filter) -->\n <div *ngIf=\"mode === 'filter' && hasFilterSections\" class=\"filter-sections-container\">\n <p-panel \n *ngFor=\"let section of filterSections\"\n [header]=\"section.title\"\n [toggleable]=\"true\"\n [collapsed]=\"true\">\n\n <div class=\"grid\">\n <ng-container *ngFor=\"let field of section.fields\">\n <div *ngIf=\"isFieldVisible(field)\" [ngClass]=\"getFieldGridClass(field)\">\n <ng-container *ngTemplateOutlet=\"fieldTemplate; context: { field: field }\"></ng-container>\n </div>\n </ng-container>\n </div>\n </p-panel>\n </div>\n\n <!-- Bot\u00F5es inline (apenas para modo inline) -->\n <div *ngIf=\"isInlineMode && (showSubmitButton || showCancelButton)\" class=\"form-actions\">\n <p-button\n *ngIf=\"showCancelButton\"\n [label]=\"cancelLabel | translate\"\n [icon]=\"cancelButtonIcon\"\n severity=\"secondary\"\n (onClick)=\"handleCancel()\"\n [disabled]=\"loading\">\n </p-button>\n <p-button\n *ngIf=\"showSubmitButton\"\n [label]=\"submitLabel | translate\"\n [icon]=\"submitButtonIcon\"\n (onClick)=\"handleSubmit()\"\n [loading]=\"loading\"\n [disabled]=\"form.invalid\">\n </p-button>\n </div>\n\n </form>\n</ng-template>\n\n<!-- Template de Campo (reutiliz\u00E1vel) -->\n<ng-template #fieldTemplate let-field=\"field\">\n <!-- Text Field -->\n <sia-dynamic-field-text\n *ngIf=\"field.type === 'text'\"\n [field]=\"field\"\n [form]=\"form\"\n [mode]=\"fieldMode\">\n </sia-dynamic-field-text>\n\n <!-- Textarea Field -->\n <sia-dynamic-field-textarea\n *ngIf=\"field.type === 'textarea'\"\n [field]=\"field\"\n [form]=\"form\"\n [mode]=\"fieldMode\">\n </sia-dynamic-field-textarea>\n\n <!-- Number Field -->\n <sia-dynamic-field-number\n *ngIf=\"field.type === 'number'\"\n [field]=\"field\"\n [form]=\"form\"\n [mode]=\"fieldMode\">\n </sia-dynamic-field-number>\n\n <!-- Date Field -->\n <sia-dynamic-field-date\n *ngIf=\"field.type === 'date'\"\n [field]=\"field\"\n [form]=\"form\"\n [mode]=\"fieldMode\">\n </sia-dynamic-field-date>\n\n <!-- Dropdown/Enum Field -->\n <sia-dynamic-field-dropdown\n *ngIf=\"field.type === 'dropdown' || field.type === 'enum'\"\n [field]=\"field\"\n [form]=\"form\"\n [mode]=\"fieldMode\">\n </sia-dynamic-field-dropdown>\n\n <!-- Lookup Field -->\n <sia-dynamic-field-lookup\n *ngIf=\"field.type === 'lookup'\"\n [field]=\"field\"\n [form]=\"form\"\n [formGroup]=\"form\"\n [mode]=\"fieldMode\">\n </sia-dynamic-field-lookup>\n</ng-template>\n\n\n<!-- Template de Campo Inline Edit -->\n<ng-template #inlineEditFieldTemplate let-field=\"field\">\n <div class=\"edit-inline-field\">\n <label class=\"field-label\">{{ field.label | translate }}</label>\n \n <!-- Display Mode -->\n <div class=\"field-display\" \n *ngIf=\"!isFieldEditing(field.field)\" \n (click)=\"startEditField(field.field)\"\n [class.disabled]=\"field.disabled\">\n <span class=\"display-value\" \n [attr.data-placeholder]=\"field.placeholder || ('crmx.business.not_informed' | translate)\">\n {{ getFieldDisplayValue(field.field) }}\n </span>\n <i class=\"pi pi-pencil edit-icon\" *ngIf=\"!field.disabled\"></i>\n </div>\n \n <!-- Edit Mode -->\n <div class=\"field-edit\" *ngIf=\"isFieldEditing(field.field)\">\n <div class=\"input-container\">\n <ng-container *ngTemplateOutlet=\"fieldTemplate; context: { field: field }\"></ng-container>\n </div>\n \n <!-- Action Buttons -->\n <div class=\"edit-actions\">\n <p-button \n type=\"button\" \n icon=\"pi pi-check\" \n [rounded]=\"true\"\n severity=\"primary\"\n (onClick)=\"saveInlineField(field.field)\" \n [loading]=\"savingField\"\n [disabled]=\"form.get(field.field)?.invalid\">\n </p-button>\n <p-button \n type=\"button\" \n icon=\"pi pi-times\" \n [rounded]=\"true\"\n severity=\"secondary\"\n (onClick)=\"cancelInlineEdit()\"\n [disabled]=\"savingField\">\n </p-button>\n </div>\n \n <!-- Error Message -->\n <div class=\"field-error\" *ngIf=\"form.get(field.field)?.invalid && form.get(field.field)?.touched\">\n <small class=\"p-error\">\n {{ form.get(field.field)?.errors?.['required'] ? ('crmx.business.required_field' | translate) : '' }}\n </small>\n </div>\n </div>\n </div>\n</ng-template>\n", styles: [".dynamic-form{width:100%}.dynamic-form .grid{display:grid;grid-template-columns:repeat(12,1fr);gap:1rem}.dynamic-form .grid>div.col-1{grid-column:span 1}.dynamic-form .grid>div.col-2{grid-column:span 2}.dynamic-form .grid>div.col-3{grid-column:span 3}.dynamic-form .grid>div.col-4{grid-column:span 4}.dynamic-form .grid>div.col-5{grid-column:span 5}.dynamic-form .grid>div.col-6{grid-column:span 6}.dynamic-form .grid>div.col-7{grid-column:span 7}.dynamic-form .grid>div.col-8{grid-column:span 8}.dynamic-form .grid>div.col-9{grid-column:span 9}.dynamic-form .grid>div.col-10{grid-column:span 10}.dynamic-form .grid>div.col-11{grid-column:span 11}.dynamic-form .grid>div.col-12{grid-column:span 12}@media (max-width: 575.98px){.dynamic-form .grid>div.col-xs-1{grid-column:span 1}.dynamic-form .grid>div.col-xs-2{grid-column:span 2}.dynamic-form .grid>div.col-xs-3{grid-column:span 3}.dynamic-form .grid>div.col-xs-4{grid-column:span 4}.dynamic-form .grid>div.col-xs-5{grid-column:span 5}.dynamic-form .grid>div.col-xs-6{grid-column:span 6}.dynamic-form .grid>div.col-xs-7{grid-column:span 7}.dynamic-form .grid>div.col-xs-8{grid-column:span 8}.dynamic-form .grid>div.col-xs-9{grid-column:span 9}.dynamic-form .grid>div.col-xs-10{grid-column:span 10}.dynamic-form .grid>div.col-xs-11{grid-column:span 11}.dynamic-form .grid>div.col-xs-12{grid-column:span 12}}@media (min-width: 576px){.dynamic-form .grid>div.col-sm-1{grid-column:span 1}.dynamic-form .grid>div.col-sm-2{grid-column:span 2}.dynamic-form .grid>div.col-sm-3{grid-column:span 3}.dynamic-form .grid>div.col-sm-4{grid-column:span 4}.dynamic-form .grid>div.col-sm-5{grid-column:span 5}.dynamic-form .grid>div.col-sm-6{grid-column:span 6}.dynamic-form .grid>div.col-sm-7{grid-column:span 7}.dynamic-form .grid>div.col-sm-8{grid-column:span 8}.dynamic-form .grid>div.col-sm-9{grid-column:span 9}.dynamic-form .grid>div.col-sm-10{grid-column:span 10}.dynamic-form .grid>div.col-sm-11{grid-column:span 11}.dynamic-form .grid>div.col-sm-12{grid-column:span 12}}@media (min-width: 768px){.dynamic-form .grid>div.col-md-1{grid-column:span 1}.dynamic-form .grid>div.col-md-2{grid-column:span 2}.dynamic-form .grid>div.col-md-3{grid-column:span 3}.dynamic-form .grid>div.col-md-4{grid-column:span 4}.dynamic-form .grid>div.col-md-5{grid-column:span 5}.dynamic-form .grid>div.col-md-6{grid-column:span 6}.dynamic-form .grid>div.col-md-7{grid-column:span 7}.dynamic-form .grid>div.col-md-8{grid-column:span 8}.dynamic-form .grid>div.col-md-9{grid-column:span 9}.dynamic-form .grid>div.col-md-10{grid-column:span 10}.dynamic-form .grid>div.col-md-11{grid-column:span 11}.dynamic-form .grid>div.col-md-12{grid-column:span 12}}@media (min-width: 992px){.dynamic-form .grid>div.col-lg-1{grid-column:span 1}.dynamic-form .grid>div.col-lg-2{grid-column:span 2}.dynamic-form .grid>div.col-lg-3{grid-column:span 3}.dynamic-form .grid>div.col-lg-4{grid-column:span 4}.dynamic-form .grid>div.col-lg-5{grid-column:span 5}.dynamic-form .grid>div.col-lg-6{grid-column:span 6}.dynamic-form .grid>div.col-lg-7{grid-column:span 7}.dynamic-form .grid>div.col-lg-8{grid-column:span 8}.dynamic-form .grid>div.col-lg-9{grid-column:span 9}.dynamic-form .grid>div.col-lg-10{grid-column:span 10}.dynamic-form .grid>div.col-lg-11{grid-column:span 11}.dynamic-form .grid>div.col-lg-12{grid-column:span 12}}@media (min-width: 1200px){.dynamic-form .grid>div.col-xl-1{grid-column:span 1}.dynamic-form .grid>div.col-xl-2{grid-column:span 2}.dynamic-form .grid>div.col-xl-3{grid-column:span 3}.dynamic-form .grid>div.col-xl-4{grid-column:span 4}.dynamic-form .grid>div.col-xl-5{grid-column:span 5}.dynamic-form .grid>div.col-xl-6{grid-column:span 6}.dynamic-form .grid>div.col-xl-7{grid-column:span 7}.dynamic-form .grid>div.col-xl-8{grid-column:span 8}.dynamic-form .grid>div.col-xl-9{grid-column:span 9}.dynamic-form .grid>div.col-xl-10{grid-column:span 10}.dynamic-form .grid>div.col-xl-11{grid-column:span 11}.dynamic-form .grid>div.col-xl-12{grid-column:span 12}}.dynamic-form .sections-container{display:flex;flex-direction:column;gap:1rem;margin-top:1rem}.dynamic-form .sections-container ::ng-deep .section-panel .p-panel-header{background-color:var(--surface-50);border-color:var(--surface-200)}.dynamic-form .sections-container ::ng-deep .section-panel .p-panel-header .section-header{display:flex;align-items:center;gap:.5rem;width:100%}.dynamic-form .sections-container ::ng-deep .section-panel .p-panel-header .section-header .section-icon{font-size:1.1rem;color:var(--primary-color)}.dynamic-form .sections-container ::ng-deep .section-panel .p-panel-header .section-header .section-title{font-weight:600;color:var(--text-color)}.dynamic-form .sections-container ::ng-deep .section-panel .p-panel-content{padding:1.5rem}.dynamic-form .fixed-filters-section{margin-bottom:1rem;padding-bottom:1rem;border-bottom:1px solid var(--surface-200)}.dynamic-form .filter-sections-container{display:flex;flex-direction:column;gap:1rem;margin-top:1rem}.dynamic-form .form-actions{display:flex;justify-content:flex-end;gap:.5rem;margin-top:1.5rem;padding-top:1rem;border-top:1px solid var(--surface-200)}.dialog-footer{display:flex;justify-content:flex-end;gap:.5rem}.drawer-footer{display:flex;justify-content:flex-end;gap:.5rem;padding:1rem;border-top:1px solid var(--surface-200)}.inline-edit-fields{display:flex;flex-direction:column;gap:1rem}.inline-edit-fields .inline-edit-field{display:flex;flex-direction:column;gap:.25rem}.inline-edit-fields .inline-edit-field .field-label{font-weight:500;font-size:.875rem;color:var(--text-color-secondary);margin-bottom:.25rem}.inline-edit-fields .inline-edit-field .field-display{display:flex;align-items:center;justify-content:space-between;padding:.75rem;background-color:var(--surface-50);border:1px solid var(--surface-200);border-radius:var(--border-radius);cursor:pointer;transition:all .2s ease;min-height:42px}.inline-edit-fields .inline-edit-field .field-display:hover:not(.disabled){background-color:var(--surface-100);border-color:var(--primary-color)}.inline-edit-fields .inline-edit-field .field-display:hover:not(.disabled) .edit-icon{opacity:1}.inline-edit-fields .inline-edit-field .field-display.disabled{cursor:not-allowed;opacity:.6}.inline-edit-fields .inline-edit-field .field-display .display-value{flex:1;color:var(--text-color)}.inline-edit-fields .inline-edit-field .field-display .display-value:empty:before{content:attr(data-placeholder);color:var(--text-color-secondary);font-style:italic}.inline-edit-fields .inline-edit-field .field-display .edit-icon{color:var(--primary-color);font-size:.875rem;opacity:.5;transition:opacity .2s ease}.inline-edit-fields .inline-edit-field .field-edit{display:flex;flex-direction:column;gap:.5rem}.inline-edit-fields .inline-edit-field .field-edit .input-container{flex:1}.inline-edit-fields .inline-edit-field .field-edit .input-container ::ng-deep .field{gap:0}.inline-edit-fields .inline-edit-field .field-edit .input-container ::ng-deep .field label{display:none}.inline-edit-fields .inline-edit-field .field-edit .input-container ::ng-deep .field small.p-error{display:none}.inline-edit-fields .inline-edit-field .field-edit .edit-actions{display:flex;gap:.5rem;justify-content:flex-end}.inline-edit-fields .inline-edit-field .field-edit .field-error small.p-error{color:var(--p-red-500);font-size:.875rem}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i3.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i3.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i3.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "ngmodule", type: PanelModule }, { kind: "component", type: i6$1.Panel, selector: "p-panel", inputs: ["toggleable", "header", "collapsed", "style", "styleClass", "iconPos", "expandIcon", "collapseIcon", "showHeader", "toggler", "transitionOptions", "toggleButtonProps"], outputs: ["collapsedChange", "onBeforeToggle", "onAfterToggle"] }, { kind: "directive", type: i2$1.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { kind: "ngmodule", type: DialogModule }, { kind: "component", type: i4.Dialog, selector: "p-dialog", inputs: ["header", "draggable", "resizable", "positionLeft", "positionTop", "contentStyle", "contentStyleClass", "modal", "closeOnEscape", "dismissableMask", "rtl", "closable", "responsive", "appendTo", "breakpoints", "styleClass", "maskStyleClass", "maskStyle", "showHeader", "breakpoint", "blockScroll", "autoZIndex", "baseZIndex", "minX", "minY", "focusOnShow", "maximizable", "keepInViewport", "focusTrap", "transitionOptions", "closeIcon", "closeAriaLabel", "closeTabindex", "minimizeIcon", "maximizeIcon", "closeButtonProps", "maximizeButtonProps", "visible", "style", "position", "role", "content", "contentTemplate", "footerTemplate", "closeIconTemplate", "maximizeIconTemplate", "minimizeIconTemplate", "headlessTemplate"], outputs: ["onShow", "onHide", "visibleChange", "onResizeInit", "onResizeEnd", "onDragEnd", "onMaximize"] }, { kind: "ngmodule", type: DrawerModule }, { kind: "component", type: i9$1.Drawer, selector: "p-drawer", inputs: ["appendTo", "blockScroll", "style", "styleClass", "ariaCloseLabel", "autoZIndex", "baseZIndex", "modal", "closeButtonProps", "dismissible", "showCloseIcon", "closeOnEscape", "transitionOptions", "visible", "position", "fullScreen", "header", "maskStyle", "closable"], outputs: ["onShow", "onHide", "visibleChange"] }, { kind: "ngmodule", type: ButtonModule }, { kind: "component", type: i4$1.Button, selector: "p-button", inputs: ["type", "iconPos", "icon", "badge", "label", "disabled", "loading", "loadingIcon", "raised", "rounded", "text", "plain", "severity", "outlined", "link", "tabindex", "size", "variant", "style", "styleClass", "badgeClass", "badgeSeverity", "ariaLabel", "autofocus", "fluid", "buttonProps"], outputs: ["onClick", "onFocus", "onBlur"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }, { kind: "component", type: DynamicFieldTextComponent, selector: "sia-dynamic-field-text" }, { kind: "component", type: DynamicFieldNumberComponent, selector: "sia-dynamic-field-number" }, { kind: "component", type: DynamicFieldDateComponent, selector: "sia-dynamic-field-date" }, { kind: "component", type: DynamicFieldDropdownComponent, selector: "sia-dynamic-field-dropdown" }, { kind: "component", type: DynamicFieldLookupComponent, selector: "sia-dynamic-field-lookup", inputs: ["field", "form", "formGroup", "mode"] }, { kind: "component", type: DynamicFieldTextareaComponent, selector: "sia-dynamic-field-textarea" }] });
|
|
4443
4682
|
}
|
|
4444
4683
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: DynamicFormComponent, decorators: [{
|
|
4445
4684
|
type: Component,
|
|
@@ -4458,7 +4697,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
4458
4697
|
DynamicFieldLookupComponent,
|
|
4459
4698
|
DynamicFieldTextareaComponent
|
|
4460
4699
|
], template: "<!-- Modo Inline (padr\u00E3o) -->\n<ng-container *ngIf=\"isInlineMode\">\n <ng-container *ngTemplateOutlet=\"formContent\"></ng-container>\n</ng-container>\n\n<!-- Modo Dialog -->\n<p-dialog\n *ngIf=\"isDialogMode\"\n [(visible)]=\"visible\"\n [header]=\"dialogHeader | translate\"\n [modal]=\"true\"\n [style]=\"{ width: dialogWidth }\"\n [draggable]=\"dialogDraggable\"\n [resizable]=\"dialogResizable\"\n [maximizable]=\"dialogMaximizable\"\n [closeOnEscape]=\"dialogCloseOnEscape\"\n [dismissableMask]=\"dialogDismissableMask\"\n (onHide)=\"close()\">\n \n <ng-container *ngTemplateOutlet=\"formContent\"></ng-container>\n \n <ng-template pTemplate=\"footer\" *ngIf=\"showSubmitButton || showCancelButton\">\n <div class=\"dialog-footer\">\n <p-button\n *ngIf=\"showCancelButton\"\n [label]=\"cancelLabel | translate\"\n [icon]=\"cancelButtonIcon\"\n severity=\"secondary\"\n (onClick)=\"handleCancel()\"\n [disabled]=\"loading\">\n </p-button>\n <p-button\n *ngIf=\"showSubmitButton\"\n [label]=\"submitLabel | translate\"\n [icon]=\"submitButtonIcon\"\n (onClick)=\"handleSubmit()\"\n [loading]=\"loading\"\n [disabled]=\"form.invalid\">\n </p-button>\n </div>\n </ng-template>\n</p-dialog>\n\n<!-- Modo Drawer -->\n<p-drawer\n *ngIf=\"isDrawerMode\"\n [(visible)]=\"visible\"\n [header]=\"drawerHeader | translate\"\n [position]=\"drawerPosition\"\n [style]=\"drawerStyle\"\n [showCloseIcon]=\"drawerShowCloseIcon\"\n [closeOnEscape]=\"drawerCloseOnEscape\"\n [modal]=\"drawerDismissable\"\n (onHide)=\"close()\">\n \n <ng-container *ngTemplateOutlet=\"formContent\"></ng-container>\n \n <ng-template pTemplate=\"footer\" *ngIf=\"showSubmitButton || showCancelButton\">\n <div class=\"drawer-footer\">\n <p-button\n *ngIf=\"showCancelButton\"\n [label]=\"cancelLabel | translate\"\n [icon]=\"cancelButtonIcon\"\n severity=\"secondary\"\n (onClick)=\"handleCancel()\"\n [disabled]=\"loading\">\n </p-button>\n <p-button\n *ngIf=\"showSubmitButton\"\n [label]=\"submitLabel | translate\"\n [icon]=\"submitButtonIcon\"\n (onClick)=\"handleSubmit()\"\n [loading]=\"loading\"\n [disabled]=\"form.invalid\">\n </p-button>\n </div>\n </ng-template>\n</p-drawer>\n\n<!-- Template do Formul\u00E1rio (reutiliz\u00E1vel) -->\n<ng-template #formContent>\n <form [formGroup]=\"form\" class=\"dynamic-form\">\n \n <!-- Filtros Fixos (apenas no modo filter) -->\n <div *ngIf=\"mode === 'filter' && hasFixedFilters\" class=\"fixed-filters-section\">\n <div class=\"grid\">\n <ng-container *ngFor=\"let field of fixedFilters\">\n <div *ngIf=\"isFieldVisible(field)\" [ngClass]=\"getFieldGridClass(field)\">\n <ng-container *ngTemplateOutlet=\"fieldTemplate; context: { field: field }\"></ng-container>\n </div>\n </ng-container>\n </div>\n </div>\n\n <!-- Campos Diretos (sem se\u00E7\u00E3o) -->\n <div *ngIf=\"hasFields\">\n <!-- Modo Inline Edit -->\n <div *ngIf=\"isInlineEditMode\" class=\"inline-edit-fields\">\n <ng-container *ngFor=\"let field of formFields\">\n <div *ngIf=\"isFieldVisible(field)\" class=\"inline-edit-field\">\n <ng-container *ngTemplateOutlet=\"inlineEditFieldTemplate; context: { field: field }\"></ng-container>\n </div>\n </ng-container>\n </div>\n\n <!-- Modo Form Normal -->\n <div *ngIf=\"!isInlineEditMode\" class=\"grid\">\n <ng-container *ngFor=\"let field of formFields\">\n <div *ngIf=\"isFieldVisible(field)\" [ngClass]=\"getFieldGridClass(field)\">\n <ng-container *ngTemplateOutlet=\"fieldTemplate; context: { field: field }\"></ng-container>\n </div>\n </ng-container>\n </div>\n </div>\n\n <!-- Se\u00E7\u00F5es de Campos (modo form) -->\n <div *ngIf=\"hasSections\" class=\"sections-container\">\n <p-panel \n *ngFor=\"let section of formSections\"\n [toggleable]=\"section.toggleable !== false\"\n [collapsed]=\"section.collapsed || false\"\n [styleClass]=\"'section-panel'\">\n \n <ng-template pTemplate=\"header\">\n <div class=\"section-header\">\n <i *ngIf=\"section.icon\" [class]=\"section.icon + ' section-icon'\"></i>\n <span class=\"section-title\">{{ section.title }}</span>\n </div>\n </ng-template>\n\n <!-- Modo Inline Edit -->\n <div *ngIf=\"isInlineEditMode\" class=\"inline-edit-fields\">\n <ng-container *ngFor=\"let field of section.fields\">\n <div *ngIf=\"isFieldVisible(field)\" class=\"inline-edit-field\">\n <ng-container *ngTemplateOutlet=\"inlineEditFieldTemplate; context: { field: field }\"></ng-container>\n </div>\n </ng-container>\n </div>\n\n <!-- Modo Form Normal -->\n <div *ngIf=\"!isInlineEditMode\" class=\"grid\">\n <ng-container *ngFor=\"let field of section.fields\">\n <div *ngIf=\"isFieldVisible(field)\" [ngClass]=\"getFieldGridClass(field)\">\n <ng-container *ngTemplateOutlet=\"fieldTemplate; context: { field: field }\"></ng-container>\n </div>\n </ng-container>\n </div>\n </p-panel>\n </div>\n\n <!-- Se\u00E7\u00F5es de Filtros (apenas no modo filter) -->\n <div *ngIf=\"mode === 'filter' && hasFilterSections\" class=\"filter-sections-container\">\n <p-panel \n *ngFor=\"let section of filterSections\"\n [header]=\"section.title\"\n [toggleable]=\"true\"\n [collapsed]=\"true\">\n\n <div class=\"grid\">\n <ng-container *ngFor=\"let field of section.fields\">\n <div *ngIf=\"isFieldVisible(field)\" [ngClass]=\"getFieldGridClass(field)\">\n <ng-container *ngTemplateOutlet=\"fieldTemplate; context: { field: field }\"></ng-container>\n </div>\n </ng-container>\n </div>\n </p-panel>\n </div>\n\n <!-- Bot\u00F5es inline (apenas para modo inline) -->\n <div *ngIf=\"isInlineMode && (showSubmitButton || showCancelButton)\" class=\"form-actions\">\n <p-button\n *ngIf=\"showCancelButton\"\n [label]=\"cancelLabel | translate\"\n [icon]=\"cancelButtonIcon\"\n severity=\"secondary\"\n (onClick)=\"handleCancel()\"\n [disabled]=\"loading\">\n </p-button>\n <p-button\n *ngIf=\"showSubmitButton\"\n [label]=\"submitLabel | translate\"\n [icon]=\"submitButtonIcon\"\n (onClick)=\"handleSubmit()\"\n [loading]=\"loading\"\n [disabled]=\"form.invalid\">\n </p-button>\n </div>\n\n </form>\n</ng-template>\n\n<!-- Template de Campo (reutiliz\u00E1vel) -->\n<ng-template #fieldTemplate let-field=\"field\">\n <!-- Text Field -->\n <sia-dynamic-field-text\n *ngIf=\"field.type === 'text'\"\n [field]=\"field\"\n [form]=\"form\"\n [mode]=\"fieldMode\">\n </sia-dynamic-field-text>\n\n <!-- Textarea Field -->\n <sia-dynamic-field-textarea\n *ngIf=\"field.type === 'textarea'\"\n [field]=\"field\"\n [form]=\"form\"\n [mode]=\"fieldMode\">\n </sia-dynamic-field-textarea>\n\n <!-- Number Field -->\n <sia-dynamic-field-number\n *ngIf=\"field.type === 'number'\"\n [field]=\"field\"\n [form]=\"form\"\n [mode]=\"fieldMode\">\n </sia-dynamic-field-number>\n\n <!-- Date Field -->\n <sia-dynamic-field-date\n *ngIf=\"field.type === 'date'\"\n [field]=\"field\"\n [form]=\"form\"\n [mode]=\"fieldMode\">\n </sia-dynamic-field-date>\n\n <!-- Dropdown/Enum Field -->\n <sia-dynamic-field-dropdown\n *ngIf=\"field.type === 'dropdown' || field.type === 'enum'\"\n [field]=\"field\"\n [form]=\"form\"\n [mode]=\"fieldMode\">\n </sia-dynamic-field-dropdown>\n\n <!-- Lookup Field -->\n <sia-dynamic-field-lookup\n *ngIf=\"field.type === 'lookup'\"\n [field]=\"field\"\n [form]=\"form\"\n [formGroup]=\"form\"\n [mode]=\"fieldMode\">\n </sia-dynamic-field-lookup>\n</ng-template>\n\n\n<!-- Template de Campo Inline Edit -->\n<ng-template #inlineEditFieldTemplate let-field=\"field\">\n <div class=\"edit-inline-field\">\n <label class=\"field-label\">{{ field.label | translate }}</label>\n \n <!-- Display Mode -->\n <div class=\"field-display\" \n *ngIf=\"!isFieldEditing(field.field)\" \n (click)=\"startEditField(field.field)\"\n [class.disabled]=\"field.disabled\">\n <span class=\"display-value\" \n [attr.data-placeholder]=\"field.placeholder || ('crmx.business.not_informed' | translate)\">\n {{ getFieldDisplayValue(field.field) }}\n </span>\n <i class=\"pi pi-pencil edit-icon\" *ngIf=\"!field.disabled\"></i>\n </div>\n \n <!-- Edit Mode -->\n <div class=\"field-edit\" *ngIf=\"isFieldEditing(field.field)\">\n <div class=\"input-container\">\n <ng-container *ngTemplateOutlet=\"fieldTemplate; context: { field: field }\"></ng-container>\n </div>\n \n <!-- Action Buttons -->\n <div class=\"edit-actions\">\n <p-button \n type=\"button\" \n icon=\"pi pi-check\" \n [rounded]=\"true\"\n severity=\"primary\"\n (onClick)=\"saveInlineField(field.field)\" \n [loading]=\"savingField\"\n [disabled]=\"form.get(field.field)?.invalid\">\n </p-button>\n <p-button \n type=\"button\" \n icon=\"pi pi-times\" \n [rounded]=\"true\"\n severity=\"secondary\"\n (onClick)=\"cancelInlineEdit()\"\n [disabled]=\"savingField\">\n </p-button>\n </div>\n \n <!-- Error Message -->\n <div class=\"field-error\" *ngIf=\"form.get(field.field)?.invalid && form.get(field.field)?.touched\">\n <small class=\"p-error\">\n {{ form.get(field.field)?.errors?.['required'] ? ('crmx.business.required_field' | translate) : '' }}\n </small>\n </div>\n </div>\n </div>\n</ng-template>\n", styles: [".dynamic-form{width:100%}.dynamic-form .grid{display:grid;grid-template-columns:repeat(12,1fr);gap:1rem}.dynamic-form .grid>div.col-1{grid-column:span 1}.dynamic-form .grid>div.col-2{grid-column:span 2}.dynamic-form .grid>div.col-3{grid-column:span 3}.dynamic-form .grid>div.col-4{grid-column:span 4}.dynamic-form .grid>div.col-5{grid-column:span 5}.dynamic-form .grid>div.col-6{grid-column:span 6}.dynamic-form .grid>div.col-7{grid-column:span 7}.dynamic-form .grid>div.col-8{grid-column:span 8}.dynamic-form .grid>div.col-9{grid-column:span 9}.dynamic-form .grid>div.col-10{grid-column:span 10}.dynamic-form .grid>div.col-11{grid-column:span 11}.dynamic-form .grid>div.col-12{grid-column:span 12}@media (max-width: 575.98px){.dynamic-form .grid>div.col-xs-1{grid-column:span 1}.dynamic-form .grid>div.col-xs-2{grid-column:span 2}.dynamic-form .grid>div.col-xs-3{grid-column:span 3}.dynamic-form .grid>div.col-xs-4{grid-column:span 4}.dynamic-form .grid>div.col-xs-5{grid-column:span 5}.dynamic-form .grid>div.col-xs-6{grid-column:span 6}.dynamic-form .grid>div.col-xs-7{grid-column:span 7}.dynamic-form .grid>div.col-xs-8{grid-column:span 8}.dynamic-form .grid>div.col-xs-9{grid-column:span 9}.dynamic-form .grid>div.col-xs-10{grid-column:span 10}.dynamic-form .grid>div.col-xs-11{grid-column:span 11}.dynamic-form .grid>div.col-xs-12{grid-column:span 12}}@media (min-width: 576px){.dynamic-form .grid>div.col-sm-1{grid-column:span 1}.dynamic-form .grid>div.col-sm-2{grid-column:span 2}.dynamic-form .grid>div.col-sm-3{grid-column:span 3}.dynamic-form .grid>div.col-sm-4{grid-column:span 4}.dynamic-form .grid>div.col-sm-5{grid-column:span 5}.dynamic-form .grid>div.col-sm-6{grid-column:span 6}.dynamic-form .grid>div.col-sm-7{grid-column:span 7}.dynamic-form .grid>div.col-sm-8{grid-column:span 8}.dynamic-form .grid>div.col-sm-9{grid-column:span 9}.dynamic-form .grid>div.col-sm-10{grid-column:span 10}.dynamic-form .grid>div.col-sm-11{grid-column:span 11}.dynamic-form .grid>div.col-sm-12{grid-column:span 12}}@media (min-width: 768px){.dynamic-form .grid>div.col-md-1{grid-column:span 1}.dynamic-form .grid>div.col-md-2{grid-column:span 2}.dynamic-form .grid>div.col-md-3{grid-column:span 3}.dynamic-form .grid>div.col-md-4{grid-column:span 4}.dynamic-form .grid>div.col-md-5{grid-column:span 5}.dynamic-form .grid>div.col-md-6{grid-column:span 6}.dynamic-form .grid>div.col-md-7{grid-column:span 7}.dynamic-form .grid>div.col-md-8{grid-column:span 8}.dynamic-form .grid>div.col-md-9{grid-column:span 9}.dynamic-form .grid>div.col-md-10{grid-column:span 10}.dynamic-form .grid>div.col-md-11{grid-column:span 11}.dynamic-form .grid>div.col-md-12{grid-column:span 12}}@media (min-width: 992px){.dynamic-form .grid>div.col-lg-1{grid-column:span 1}.dynamic-form .grid>div.col-lg-2{grid-column:span 2}.dynamic-form .grid>div.col-lg-3{grid-column:span 3}.dynamic-form .grid>div.col-lg-4{grid-column:span 4}.dynamic-form .grid>div.col-lg-5{grid-column:span 5}.dynamic-form .grid>div.col-lg-6{grid-column:span 6}.dynamic-form .grid>div.col-lg-7{grid-column:span 7}.dynamic-form .grid>div.col-lg-8{grid-column:span 8}.dynamic-form .grid>div.col-lg-9{grid-column:span 9}.dynamic-form .grid>div.col-lg-10{grid-column:span 10}.dynamic-form .grid>div.col-lg-11{grid-column:span 11}.dynamic-form .grid>div.col-lg-12{grid-column:span 12}}@media (min-width: 1200px){.dynamic-form .grid>div.col-xl-1{grid-column:span 1}.dynamic-form .grid>div.col-xl-2{grid-column:span 2}.dynamic-form .grid>div.col-xl-3{grid-column:span 3}.dynamic-form .grid>div.col-xl-4{grid-column:span 4}.dynamic-form .grid>div.col-xl-5{grid-column:span 5}.dynamic-form .grid>div.col-xl-6{grid-column:span 6}.dynamic-form .grid>div.col-xl-7{grid-column:span 7}.dynamic-form .grid>div.col-xl-8{grid-column:span 8}.dynamic-form .grid>div.col-xl-9{grid-column:span 9}.dynamic-form .grid>div.col-xl-10{grid-column:span 10}.dynamic-form .grid>div.col-xl-11{grid-column:span 11}.dynamic-form .grid>div.col-xl-12{grid-column:span 12}}.dynamic-form .sections-container{display:flex;flex-direction:column;gap:1rem;margin-top:1rem}.dynamic-form .sections-container ::ng-deep .section-panel .p-panel-header{background-color:var(--surface-50);border-color:var(--surface-200)}.dynamic-form .sections-container ::ng-deep .section-panel .p-panel-header .section-header{display:flex;align-items:center;gap:.5rem;width:100%}.dynamic-form .sections-container ::ng-deep .section-panel .p-panel-header .section-header .section-icon{font-size:1.1rem;color:var(--primary-color)}.dynamic-form .sections-container ::ng-deep .section-panel .p-panel-header .section-header .section-title{font-weight:600;color:var(--text-color)}.dynamic-form .sections-container ::ng-deep .section-panel .p-panel-content{padding:1.5rem}.dynamic-form .fixed-filters-section{margin-bottom:1rem;padding-bottom:1rem;border-bottom:1px solid var(--surface-200)}.dynamic-form .filter-sections-container{display:flex;flex-direction:column;gap:1rem;margin-top:1rem}.dynamic-form .form-actions{display:flex;justify-content:flex-end;gap:.5rem;margin-top:1.5rem;padding-top:1rem;border-top:1px solid var(--surface-200)}.dialog-footer{display:flex;justify-content:flex-end;gap:.5rem}.drawer-footer{display:flex;justify-content:flex-end;gap:.5rem;padding:1rem;border-top:1px solid var(--surface-200)}.inline-edit-fields{display:flex;flex-direction:column;gap:1rem}.inline-edit-fields .inline-edit-field{display:flex;flex-direction:column;gap:.25rem}.inline-edit-fields .inline-edit-field .field-label{font-weight:500;font-size:.875rem;color:var(--text-color-secondary);margin-bottom:.25rem}.inline-edit-fields .inline-edit-field .field-display{display:flex;align-items:center;justify-content:space-between;padding:.75rem;background-color:var(--surface-50);border:1px solid var(--surface-200);border-radius:var(--border-radius);cursor:pointer;transition:all .2s ease;min-height:42px}.inline-edit-fields .inline-edit-field .field-display:hover:not(.disabled){background-color:var(--surface-100);border-color:var(--primary-color)}.inline-edit-fields .inline-edit-field .field-display:hover:not(.disabled) .edit-icon{opacity:1}.inline-edit-fields .inline-edit-field .field-display.disabled{cursor:not-allowed;opacity:.6}.inline-edit-fields .inline-edit-field .field-display .display-value{flex:1;color:var(--text-color)}.inline-edit-fields .inline-edit-field .field-display .display-value:empty:before{content:attr(data-placeholder);color:var(--text-color-secondary);font-style:italic}.inline-edit-fields .inline-edit-field .field-display .edit-icon{color:var(--primary-color);font-size:.875rem;opacity:.5;transition:opacity .2s ease}.inline-edit-fields .inline-edit-field .field-edit{display:flex;flex-direction:column;gap:.5rem}.inline-edit-fields .inline-edit-field .field-edit .input-container{flex:1}.inline-edit-fields .inline-edit-field .field-edit .input-container ::ng-deep .field{gap:0}.inline-edit-fields .inline-edit-field .field-edit .input-container ::ng-deep .field label{display:none}.inline-edit-fields .inline-edit-field .field-edit .input-container ::ng-deep .field small.p-error{display:none}.inline-edit-fields .inline-edit-field .field-edit .edit-actions{display:flex;gap:.5rem;justify-content:flex-end}.inline-edit-fields .inline-edit-field .field-edit .field-error small.p-error{color:var(--p-red-500);font-size:.875rem}\n"] }]
|
|
4461
|
-
}], ctorParameters: () => [{ type:
|
|
4700
|
+
}], ctorParameters: () => [{ type: i3.FormBuilder }, { type: TranslationService }, { type: MaskService }, { type: LocaleService }], propDecorators: { formFields: [{
|
|
4462
4701
|
type: Input
|
|
4463
4702
|
}], formSections: [{
|
|
4464
4703
|
type: Input
|
|
@@ -4634,6 +4873,13 @@ function provideSeniorPrimeNG(config) {
|
|
|
4634
4873
|
if (includeServices) {
|
|
4635
4874
|
providers.push(ConfirmationService, MessageService);
|
|
4636
4875
|
}
|
|
4876
|
+
// Inicializar LocaleService para configurar locale do PrimeNG automaticamente
|
|
4877
|
+
providers.push({
|
|
4878
|
+
provide: APP_INITIALIZER,
|
|
4879
|
+
useFactory: (injector) => () => { injector.get(LocaleService); },
|
|
4880
|
+
deps: [Injector],
|
|
4881
|
+
multi: true
|
|
4882
|
+
});
|
|
4637
4883
|
return makeEnvironmentProviders(providers);
|
|
4638
4884
|
}
|
|
4639
4885
|
|
|
@@ -4939,6 +5185,83 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
4939
5185
|
args: [{ name: 'money', standalone: true }]
|
|
4940
5186
|
}], ctorParameters: () => [{ type: MaskService }] });
|
|
4941
5187
|
|
|
5188
|
+
/**
|
|
5189
|
+
* Pipe para formatar datas respeitando o idioma configurado
|
|
5190
|
+
*
|
|
5191
|
+
* Uso: {{ '2026-03-04' | dateFormat }} -> 04/03/2026 (pt-BR)
|
|
5192
|
+
* Uso: {{ dateObj | dateFormat }} -> 04/03/2026 (pt-BR)
|
|
5193
|
+
* Uso: {{ '2026-03-04' | dateFormat:'short' }} -> 04/03/26 (pt-BR)
|
|
5194
|
+
* Uso: {{ '2026-03-04' | dateFormat:'long' }} -> 4 de março de 2026 (pt-BR)
|
|
5195
|
+
*/
|
|
5196
|
+
class DateFormatPipe {
|
|
5197
|
+
localeService;
|
|
5198
|
+
translationService;
|
|
5199
|
+
cdr;
|
|
5200
|
+
subscription;
|
|
5201
|
+
lastValue;
|
|
5202
|
+
lastFormat;
|
|
5203
|
+
lastResult = '';
|
|
5204
|
+
constructor(localeService, translationService, cdr) {
|
|
5205
|
+
this.localeService = localeService;
|
|
5206
|
+
this.translationService = translationService;
|
|
5207
|
+
this.cdr = cdr;
|
|
5208
|
+
}
|
|
5209
|
+
transform(value, format) {
|
|
5210
|
+
if (!value)
|
|
5211
|
+
return '';
|
|
5212
|
+
if (this.shouldUpdate(value, format)) {
|
|
5213
|
+
this.updateResult(value, format);
|
|
5214
|
+
}
|
|
5215
|
+
return this.lastResult;
|
|
5216
|
+
}
|
|
5217
|
+
ngOnDestroy() {
|
|
5218
|
+
this.subscription?.unsubscribe();
|
|
5219
|
+
}
|
|
5220
|
+
shouldUpdate(value, format) {
|
|
5221
|
+
const valueStr = value instanceof Date ? value.toISOString() : value;
|
|
5222
|
+
const lastStr = this.lastValue instanceof Date ? this.lastValue.toISOString() : this.lastValue;
|
|
5223
|
+
return valueStr !== lastStr || format !== this.lastFormat || !this.subscription;
|
|
5224
|
+
}
|
|
5225
|
+
updateResult(value, format) {
|
|
5226
|
+
this.lastValue = value;
|
|
5227
|
+
this.lastFormat = format;
|
|
5228
|
+
this.subscription?.unsubscribe();
|
|
5229
|
+
this.subscription = this.translationService.currentLanguage$.subscribe(() => {
|
|
5230
|
+
this.lastResult = this.formatValue(value, format);
|
|
5231
|
+
this.cdr.markForCheck();
|
|
5232
|
+
});
|
|
5233
|
+
}
|
|
5234
|
+
formatValue(value, format) {
|
|
5235
|
+
if (!value)
|
|
5236
|
+
return '';
|
|
5237
|
+
const date = typeof value === 'string'
|
|
5238
|
+
? new Date(value + (value.length === 10 ? 'T00:00:00' : ''))
|
|
5239
|
+
: value;
|
|
5240
|
+
if (isNaN(date.getTime()))
|
|
5241
|
+
return String(value);
|
|
5242
|
+
const locale = this.localeService.getIntlLocale();
|
|
5243
|
+
switch (format) {
|
|
5244
|
+
case 'short':
|
|
5245
|
+
return date.toLocaleDateString(locale, { day: '2-digit', month: '2-digit', year: '2-digit' });
|
|
5246
|
+
case 'long':
|
|
5247
|
+
return date.toLocaleDateString(locale, { day: 'numeric', month: 'long', year: 'numeric' });
|
|
5248
|
+
case 'medium':
|
|
5249
|
+
default:
|
|
5250
|
+
return date.toLocaleDateString(locale);
|
|
5251
|
+
}
|
|
5252
|
+
}
|
|
5253
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: DateFormatPipe, deps: [{ token: LocaleService }, { token: TranslationService }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Pipe });
|
|
5254
|
+
static ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "18.2.14", ngImport: i0, type: DateFormatPipe, isStandalone: true, name: "dateFormat", pure: false });
|
|
5255
|
+
}
|
|
5256
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: DateFormatPipe, decorators: [{
|
|
5257
|
+
type: Pipe,
|
|
5258
|
+
args: [{
|
|
5259
|
+
name: 'dateFormat',
|
|
5260
|
+
pure: false,
|
|
5261
|
+
standalone: true
|
|
5262
|
+
}]
|
|
5263
|
+
}], ctorParameters: () => [{ type: LocaleService }, { type: TranslationService }, { type: i0.ChangeDetectorRef }] });
|
|
5264
|
+
|
|
4942
5265
|
var FieldType;
|
|
4943
5266
|
(function (FieldType) {
|
|
4944
5267
|
FieldType["String"] = "String";
|
|
@@ -5280,5 +5603,5 @@ const throttle = (func, limit) => {
|
|
|
5280
5603
|
* Generated bundle index. Do not edit.
|
|
5281
5604
|
*/
|
|
5282
5605
|
|
|
5283
|
-
export { AngularComponentsModule, AuthService, BreadcrumbComponent, BulkDeleteDialogComponent, CnpjPipe, CookieService, CpfPipe, DEFAULT_LANGUAGE, DocumentMaskDirective, DocumentPipe, DynamicFieldDateComponent, DynamicFieldDropdownComponent, DynamicFieldLookupComponent, DynamicFieldNumberComponent, DynamicFieldTextComponent, DynamicFieldTextareaComponent, DynamicFieldWrapperComponent, DynamicFormComponent, EntityListBaseComponent, EntityService, ExportDialogComponent, FieldType, MaskService, MoneyMaskDirective, MoneyPipe, PermissionService, PhoneMaskDirective, PhonePipe, PostalCodeMaskDirective, PostalCodePipe, SUPPORTED_LANGUAGES, SeniorPreset, SeniorTokenService, TRANSLATION_CONFIG, ThemeService, TranslatePipe, TranslationHelper, TranslationService, apiInterceptor, createFilterString, createFilterTokens, debounce, deepClone, deepEqual, escapeFilterValue, getEnumQuery, getLabelValueRequest, getLanguageInfo, getProp, getSuggestionValue, getTypeInformation, isValidFilter, mapTokenLocaleToLanguage, mergeUnique, provideSeniorPrimeNG, resolveRefs, setProp, throttle };
|
|
5606
|
+
export { AngularComponentsModule, AuthService, BreadcrumbComponent, BulkDeleteDialogComponent, CnpjPipe, CookieService, CpfPipe, DEFAULT_LANGUAGE, DateFormatPipe, DocumentMaskDirective, DocumentPipe, DynamicFieldDateComponent, DynamicFieldDropdownComponent, DynamicFieldLookupComponent, DynamicFieldNumberComponent, DynamicFieldTextComponent, DynamicFieldTextareaComponent, DynamicFieldWrapperComponent, DynamicFormComponent, EntityListBaseComponent, EntityService, ExportDialogComponent, FieldType, LocaleService, MaskService, MoneyMaskDirective, MoneyPipe, PermissionService, PhoneMaskDirective, PhonePipe, PostalCodeMaskDirective, PostalCodePipe, SUPPORTED_LANGUAGES, SeniorPreset, SeniorTokenService, TRANSLATION_CONFIG, ThemeService, TranslatePipe, TranslationHelper, TranslationService, apiInterceptor, createFilterString, createFilterTokens, debounce, deepClone, deepEqual, escapeFilterValue, getEnumQuery, getLabelValueRequest, getLanguageInfo, getProp, getSuggestionValue, getTypeInformation, isValidFilter, mapTokenLocaleToLanguage, mergeUnique, provideSeniorPrimeNG, resolveRefs, setProp, throttle };
|
|
5284
5607
|
//# sourceMappingURL=seniorsistemas-components-ai.mjs.map
|