mapa-library-ui 1.0.1 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/fesm2022/mapa-library-ui-src-lib-components-benchmarking.mjs +6 -6
- package/fesm2022/mapa-library-ui-src-lib-components-breadcrumb.mjs +3 -3
- package/fesm2022/mapa-library-ui-src-lib-components-button-icon.mjs +3 -3
- package/fesm2022/mapa-library-ui-src-lib-components-button.mjs +3 -3
- package/fesm2022/mapa-library-ui-src-lib-components-capability.mjs +81 -73
- package/fesm2022/mapa-library-ui-src-lib-components-capability.mjs.map +1 -1
- package/fesm2022/mapa-library-ui-src-lib-components-chart.mjs +32 -24
- package/fesm2022/mapa-library-ui-src-lib-components-chart.mjs.map +1 -1
- package/fesm2022/mapa-library-ui-src-lib-components-checkbox.mjs +3 -3
- package/fesm2022/mapa-library-ui-src-lib-components-datepicker-range.mjs +394 -0
- package/fesm2022/mapa-library-ui-src-lib-components-datepicker-range.mjs.map +1 -0
- package/fesm2022/mapa-library-ui-src-lib-components-datepicker.mjs +215 -117
- package/fesm2022/mapa-library-ui-src-lib-components-datepicker.mjs.map +1 -1
- package/fesm2022/mapa-library-ui-src-lib-components-dialog.mjs +15 -15
- package/fesm2022/mapa-library-ui-src-lib-components-dropdown-tree.mjs +34 -24
- package/fesm2022/mapa-library-ui-src-lib-components-dropdown-tree.mjs.map +1 -1
- package/fesm2022/mapa-library-ui-src-lib-components-dropdown.mjs +31 -21
- package/fesm2022/mapa-library-ui-src-lib-components-dropdown.mjs.map +1 -1
- package/fesm2022/mapa-library-ui-src-lib-components-empty.mjs +13 -9
- package/fesm2022/mapa-library-ui-src-lib-components-empty.mjs.map +1 -1
- package/fesm2022/mapa-library-ui-src-lib-components-filters.mjs +44 -36
- package/fesm2022/mapa-library-ui-src-lib-components-filters.mjs.map +1 -1
- package/fesm2022/mapa-library-ui-src-lib-components-form.mjs +402 -49
- package/fesm2022/mapa-library-ui-src-lib-components-form.mjs.map +1 -1
- package/fesm2022/mapa-library-ui-src-lib-components-group-report.mjs +3 -3
- package/fesm2022/mapa-library-ui-src-lib-components-icon.mjs +3 -3
- package/fesm2022/mapa-library-ui-src-lib-components-input.mjs +26 -18
- package/fesm2022/mapa-library-ui-src-lib-components-input.mjs.map +1 -1
- package/fesm2022/mapa-library-ui-src-lib-components-menu.mjs +3 -3
- package/fesm2022/mapa-library-ui-src-lib-components-nav-list.mjs +3 -3
- package/fesm2022/mapa-library-ui-src-lib-components-radio-button.mjs +3 -3
- package/fesm2022/mapa-library-ui-src-lib-components-report-item.mjs +3 -3
- package/fesm2022/mapa-library-ui-src-lib-components-scale-parameterization.mjs +79 -71
- package/fesm2022/mapa-library-ui-src-lib-components-scale-parameterization.mjs.map +1 -1
- package/fesm2022/mapa-library-ui-src-lib-components-scale.mjs +76 -68
- package/fesm2022/mapa-library-ui-src-lib-components-scale.mjs.map +1 -1
- package/fesm2022/mapa-library-ui-src-lib-components-slide-toggle.mjs +3 -3
- package/fesm2022/mapa-library-ui-src-lib-components-svg-icon.mjs +9 -9
- package/fesm2022/mapa-library-ui-src-lib-components-table.mjs +78 -23
- package/fesm2022/mapa-library-ui-src-lib-components-table.mjs.map +1 -1
- package/fesm2022/mapa-library-ui-src-lib-components-tag.mjs +3 -3
- package/fesm2022/mapa-library-ui-src-lib-components-textarea.mjs +20 -12
- package/fesm2022/mapa-library-ui-src-lib-components-textarea.mjs.map +1 -1
- package/fesm2022/mapa-library-ui-src-lib-components-tooltip.mjs +6 -6
- package/fesm2022/mapa-library-ui-src-lib-components-warning.mjs +3 -3
- package/fesm2022/mapa-library-ui-src-lib-core-guards-authorize-guard.mjs +3 -3
- package/fesm2022/mapa-library-ui-src-lib-core-services.mjs +3 -3
- package/fesm2022/mapa-library-ui.mjs +425 -199
- package/fesm2022/mapa-library-ui.mjs.map +1 -1
- package/index.d.ts +101 -22
- package/mapa-library-ui-1.1.0.tgz +0 -0
- package/package.json +9 -1
- package/src/lib/components/capability/index.d.ts +8 -0
- package/src/lib/components/chart/index.d.ts +4 -0
- package/src/lib/components/datepicker/index.d.ts +136 -99
- package/src/lib/components/datepicker-range/index.d.ts +255 -0
- package/src/lib/components/dropdown/index.d.ts +8 -0
- package/src/lib/components/dropdown-tree/index.d.ts +4 -0
- package/src/lib/components/empty/index.d.ts +2 -2
- package/src/lib/components/filters/index.d.ts +8 -0
- package/src/lib/components/form/index.d.ts +4 -0
- package/src/lib/components/input/index.d.ts +4 -0
- package/src/lib/components/radio-button/index.d.ts +4 -0
- package/src/lib/components/scale/index.d.ts +4 -0
- package/src/lib/components/scale-parameterization/index.d.ts +4 -0
- package/src/lib/components/slide-toggle/index.d.ts +4 -0
- package/src/lib/components/table/index.d.ts +22 -2
- package/src/lib/components/textarea/index.d.ts +4 -0
- package/mapa-library-ui-1.0.1.tgz +0 -0
|
@@ -0,0 +1,394 @@
|
|
|
1
|
+
import { CommonModule } from '@angular/common';
|
|
2
|
+
import * as i0 from '@angular/core';
|
|
3
|
+
import { InjectionToken, inject, Injector, signal, Optional, Inject, Injectable, DestroyRef, Input, ChangeDetectionStrategy, Component } from '@angular/core';
|
|
4
|
+
import { toObservable, takeUntilDestroyed } from '@angular/core/rxjs-interop';
|
|
5
|
+
import * as i2 from '@angular/forms';
|
|
6
|
+
import { FormGroup, FormControl, ReactiveFormsModule } from '@angular/forms';
|
|
7
|
+
import { provideNativeDateAdapter } from '@angular/material/core';
|
|
8
|
+
import * as i3 from '@angular/material/datepicker';
|
|
9
|
+
import { MatDatepickerModule } from '@angular/material/datepicker';
|
|
10
|
+
import * as i4 from '@angular/material/form-field';
|
|
11
|
+
import { MatFormFieldModule } from '@angular/material/form-field';
|
|
12
|
+
import * as i5 from '@angular/material/icon';
|
|
13
|
+
import { MatIconModule } from '@angular/material/icon';
|
|
14
|
+
import * as i6 from '@angular/material/input';
|
|
15
|
+
import { MatInputModule } from '@angular/material/input';
|
|
16
|
+
import { NgxMaskDirective, provideNgxMask } from 'ngx-mask';
|
|
17
|
+
|
|
18
|
+
const DAY_MONTH_YEAR_PATTERN = /^(\d{2})\/(\d{2})\/(\d{4})$/;
|
|
19
|
+
function isValidDate(date) {
|
|
20
|
+
return !Number.isNaN(date.getTime());
|
|
21
|
+
}
|
|
22
|
+
function formatDateAsDayMonthYear(date) {
|
|
23
|
+
const day = `${date.getDate()}`.padStart(2, "0");
|
|
24
|
+
const month = `${date.getMonth() + 1}`.padStart(2, "0");
|
|
25
|
+
const year = `${date.getFullYear()}`;
|
|
26
|
+
return `${day}/${month}/${year}`;
|
|
27
|
+
}
|
|
28
|
+
function parseDateValue(value) {
|
|
29
|
+
if (value instanceof Date) {
|
|
30
|
+
return isValidDate(value) ? new Date(value.getTime()) : null;
|
|
31
|
+
}
|
|
32
|
+
if (typeof value === "number") {
|
|
33
|
+
const parsedDate = new Date(value);
|
|
34
|
+
return isValidDate(parsedDate) ? parsedDate : null;
|
|
35
|
+
}
|
|
36
|
+
if (typeof value !== "string") {
|
|
37
|
+
return null;
|
|
38
|
+
}
|
|
39
|
+
const trimmedValue = value.trim();
|
|
40
|
+
if (!trimmedValue) {
|
|
41
|
+
return null;
|
|
42
|
+
}
|
|
43
|
+
const dayMonthYearMatch = DAY_MONTH_YEAR_PATTERN.exec(trimmedValue);
|
|
44
|
+
if (dayMonthYearMatch) {
|
|
45
|
+
const [, dayValue, monthValue, yearValue] = dayMonthYearMatch;
|
|
46
|
+
const day = Number(dayValue);
|
|
47
|
+
const month = Number(monthValue);
|
|
48
|
+
const year = Number(yearValue);
|
|
49
|
+
const parsedDate = new Date(year, month - 1, day);
|
|
50
|
+
if (parsedDate.getFullYear() === year &&
|
|
51
|
+
parsedDate.getMonth() === month - 1 &&
|
|
52
|
+
parsedDate.getDate() === day) {
|
|
53
|
+
return parsedDate;
|
|
54
|
+
}
|
|
55
|
+
return null;
|
|
56
|
+
}
|
|
57
|
+
const parsedDate = new Date(trimmedValue);
|
|
58
|
+
return isValidDate(parsedDate) ? parsedDate : null;
|
|
59
|
+
}
|
|
60
|
+
function isDateValue(value) {
|
|
61
|
+
return parseDateValue(value) !== null;
|
|
62
|
+
}
|
|
63
|
+
function getRelativeDateRange(daysBack) {
|
|
64
|
+
const endDate = new Date();
|
|
65
|
+
endDate.setHours(23, 59, 59, 999);
|
|
66
|
+
const startDate = new Date();
|
|
67
|
+
startDate.setHours(0, 0, 0, 0);
|
|
68
|
+
startDate.setDate(startDate.getDate() - daysBack);
|
|
69
|
+
return { startDate, endDate };
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
const MAPA_UI_TEXTS = new InjectionToken("MAPA_UI_TEXTS");
|
|
73
|
+
const MAPA_UI_DEFAULT_TEXTS = {
|
|
74
|
+
common: {
|
|
75
|
+
selectAll: "Selecionar todos",
|
|
76
|
+
},
|
|
77
|
+
filters: {
|
|
78
|
+
clear: "Limpar filtros",
|
|
79
|
+
submit: "Filtrar",
|
|
80
|
+
},
|
|
81
|
+
datepicker: {
|
|
82
|
+
startDatePlaceholder: "Data inicial",
|
|
83
|
+
endDatePlaceholder: "Data final",
|
|
84
|
+
},
|
|
85
|
+
capability: {
|
|
86
|
+
groupAverageTitle: "Média geral do grupo",
|
|
87
|
+
individualAverageTitle: "Média geral do indivíduo",
|
|
88
|
+
conceptTitle: "Conceito",
|
|
89
|
+
resultTitle: "Resultado",
|
|
90
|
+
positiveIndicatorsTitle: "Indicadores positivos",
|
|
91
|
+
negativeIndicatorsTitle: "Indicadores negativos",
|
|
92
|
+
riskIndicatorsTitle: "Indicadores de risco",
|
|
93
|
+
precipitationRiskTitle: "Risco de acidente por precipitação",
|
|
94
|
+
negligenceRiskTitle: "Risco de acidente por negligência",
|
|
95
|
+
negativeDirectionLabel: "Direção Negativa |",
|
|
96
|
+
positiveDirectionLabel: "Direção Positiva |",
|
|
97
|
+
},
|
|
98
|
+
paginator: {
|
|
99
|
+
itemsPerPage: "Itens por página",
|
|
100
|
+
nextPage: "Próxima página",
|
|
101
|
+
previousPage: "Página anterior",
|
|
102
|
+
rangeLabel: (page, pageSize, length) => {
|
|
103
|
+
if (length === 0 || pageSize === 0) {
|
|
104
|
+
return `0 de ${length}`;
|
|
105
|
+
}
|
|
106
|
+
const startIndex = page * pageSize;
|
|
107
|
+
const endIndex = startIndex < length
|
|
108
|
+
? Math.min(startIndex + pageSize, length)
|
|
109
|
+
: startIndex + pageSize;
|
|
110
|
+
return `${startIndex + 1} - ${endIndex} de ${length}`;
|
|
111
|
+
},
|
|
112
|
+
showingRangeLabel: (page, pageSize, length) => {
|
|
113
|
+
if (length === 0) {
|
|
114
|
+
return "Mostrando 0 - 0 de 0 item";
|
|
115
|
+
}
|
|
116
|
+
const startIndex = page * pageSize;
|
|
117
|
+
const endIndex = startIndex < length
|
|
118
|
+
? Math.min(startIndex + pageSize, length)
|
|
119
|
+
: startIndex + pageSize;
|
|
120
|
+
const itemLabel = length === 1 ? "item" : "itens";
|
|
121
|
+
return `Mostrando ${startIndex + 1} - ${endIndex} de ${length} ${itemLabel}`;
|
|
122
|
+
},
|
|
123
|
+
},
|
|
124
|
+
table: {
|
|
125
|
+
emptyTitle: "Nao foram encontrados resultados",
|
|
126
|
+
emptySubtitle: "",
|
|
127
|
+
},
|
|
128
|
+
validation: {
|
|
129
|
+
cnpj: "CNPJ inválido",
|
|
130
|
+
cpf: "CPF inválido",
|
|
131
|
+
email: "E-mail inválido",
|
|
132
|
+
max: (context) => `O valor máximo permitido é ${context?.max ?? ""}`.trim(),
|
|
133
|
+
maxLength: (context) => `O máximo permitido é ${context?.requiredLength ?? ""} caracteres`.trim(),
|
|
134
|
+
min: (context) => `O valor minimo permitido é ${context?.min ?? ""}`.trim(),
|
|
135
|
+
minLength: (context) => `O mínimo permitido é ${context?.requiredLength ?? ""} caracteres`.trim(),
|
|
136
|
+
pattern: "Formato inválido",
|
|
137
|
+
required: "Campo obrigatório",
|
|
138
|
+
},
|
|
139
|
+
};
|
|
140
|
+
function mergeMapaUiTexts(customTexts) {
|
|
141
|
+
return {
|
|
142
|
+
common: {
|
|
143
|
+
...MAPA_UI_DEFAULT_TEXTS.common,
|
|
144
|
+
...(customTexts?.common ?? {}),
|
|
145
|
+
},
|
|
146
|
+
filters: {
|
|
147
|
+
...MAPA_UI_DEFAULT_TEXTS.filters,
|
|
148
|
+
...(customTexts?.filters ?? {}),
|
|
149
|
+
},
|
|
150
|
+
datepicker: {
|
|
151
|
+
...MAPA_UI_DEFAULT_TEXTS.datepicker,
|
|
152
|
+
...(customTexts?.datepicker ?? {}),
|
|
153
|
+
},
|
|
154
|
+
capability: {
|
|
155
|
+
...MAPA_UI_DEFAULT_TEXTS.capability,
|
|
156
|
+
...(customTexts?.capability ?? {}),
|
|
157
|
+
},
|
|
158
|
+
paginator: {
|
|
159
|
+
...MAPA_UI_DEFAULT_TEXTS.paginator,
|
|
160
|
+
...(customTexts?.paginator ?? {}),
|
|
161
|
+
},
|
|
162
|
+
table: {
|
|
163
|
+
...MAPA_UI_DEFAULT_TEXTS.table,
|
|
164
|
+
...(customTexts?.table ?? {}),
|
|
165
|
+
},
|
|
166
|
+
validation: {
|
|
167
|
+
...MAPA_UI_DEFAULT_TEXTS.validation,
|
|
168
|
+
...(customTexts?.validation ?? {}),
|
|
169
|
+
},
|
|
170
|
+
};
|
|
171
|
+
}
|
|
172
|
+
function provideMapaUiTexts(texts) {
|
|
173
|
+
return {
|
|
174
|
+
provide: MAPA_UI_TEXTS,
|
|
175
|
+
useValue: texts,
|
|
176
|
+
};
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
class MapaI18nService {
|
|
180
|
+
constructor(customTexts) {
|
|
181
|
+
this.injector = inject(Injector);
|
|
182
|
+
this.textsState = signal(mergeMapaUiTexts(), ...(ngDevMode ? [{ debugName: "textsState" }] : []));
|
|
183
|
+
this.textsSignal = this.textsState.asReadonly();
|
|
184
|
+
this.texts$ = toObservable(this.textsSignal, { injector: this.injector });
|
|
185
|
+
if (customTexts) {
|
|
186
|
+
this.textsState.set(mergeMapaUiTexts(customTexts));
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
get texts() {
|
|
190
|
+
return this.textsState();
|
|
191
|
+
}
|
|
192
|
+
setTexts(texts) {
|
|
193
|
+
this.textsState.set(mergeMapaUiTexts(texts));
|
|
194
|
+
}
|
|
195
|
+
resolveValidationText(key, context) {
|
|
196
|
+
return this.resolveText(this.texts.validation[key], context);
|
|
197
|
+
}
|
|
198
|
+
resolveText(value, context) {
|
|
199
|
+
return typeof value === "function" ? value(context) : value;
|
|
200
|
+
}
|
|
201
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.19", ngImport: i0, type: MapaI18nService, deps: [{ token: MAPA_UI_TEXTS, optional: true }], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
202
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.19", ngImport: i0, type: MapaI18nService, providedIn: "root" }); }
|
|
203
|
+
}
|
|
204
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.19", ngImport: i0, type: MapaI18nService, decorators: [{
|
|
205
|
+
type: Injectable,
|
|
206
|
+
args: [{
|
|
207
|
+
providedIn: "root",
|
|
208
|
+
}]
|
|
209
|
+
}], ctorParameters: () => [{ type: undefined, decorators: [{
|
|
210
|
+
type: Optional
|
|
211
|
+
}, {
|
|
212
|
+
type: Inject,
|
|
213
|
+
args: [MAPA_UI_TEXTS]
|
|
214
|
+
}] }] });
|
|
215
|
+
|
|
216
|
+
const MAPA_DATEPICKER_RANGE_FORMATS = {
|
|
217
|
+
parse: {
|
|
218
|
+
dateInput: "DD/MM/YYYY",
|
|
219
|
+
},
|
|
220
|
+
display: {
|
|
221
|
+
dateInput: "DD/MM/YYYY",
|
|
222
|
+
monthYearLabel: "MMM YYYY",
|
|
223
|
+
dateA11yLabel: "LL",
|
|
224
|
+
monthYearA11yLabel: "MMMM YYYY",
|
|
225
|
+
},
|
|
226
|
+
};
|
|
227
|
+
class MapaDatepickerRange {
|
|
228
|
+
constructor(i18n, cdr) {
|
|
229
|
+
this.i18n = i18n;
|
|
230
|
+
this.cdr = cdr;
|
|
231
|
+
this.destroyRef = inject(DestroyRef);
|
|
232
|
+
this.defaultDaysBack = 60;
|
|
233
|
+
this.emptyValue = {
|
|
234
|
+
startDate: null,
|
|
235
|
+
endDate: null,
|
|
236
|
+
};
|
|
237
|
+
this.formDatepicker = new FormGroup({
|
|
238
|
+
startDate: new FormControl(null),
|
|
239
|
+
endDate: new FormControl(null),
|
|
240
|
+
});
|
|
241
|
+
this.formDisplay = new FormGroup({
|
|
242
|
+
startDate: new FormControl(null),
|
|
243
|
+
endDate: new FormControl(null),
|
|
244
|
+
});
|
|
245
|
+
}
|
|
246
|
+
get texts() {
|
|
247
|
+
return this.i18n.textsSignal();
|
|
248
|
+
}
|
|
249
|
+
ngOnInit() {
|
|
250
|
+
if (!this.element?.key) {
|
|
251
|
+
throw new Error("mapa-datepicker-range requires element.key to resolve the target control.");
|
|
252
|
+
}
|
|
253
|
+
this.rangeControl = this.formGroup.get(this.element.key);
|
|
254
|
+
if (!this.rangeControl) {
|
|
255
|
+
throw new Error(`mapa-datepicker-range could not find control '${this.element.key}' in formGroup.`);
|
|
256
|
+
}
|
|
257
|
+
this.syncFromExternal(this.rangeControl.value);
|
|
258
|
+
this.rangeControl.valueChanges
|
|
259
|
+
.pipe(takeUntilDestroyed(this.destroyRef))
|
|
260
|
+
.subscribe((value) => {
|
|
261
|
+
this.syncFromExternal(value);
|
|
262
|
+
});
|
|
263
|
+
this.formDisplay.valueChanges
|
|
264
|
+
.pipe(takeUntilDestroyed(this.destroyRef))
|
|
265
|
+
.subscribe((value) => {
|
|
266
|
+
this.updateExternalFromDisplay(value);
|
|
267
|
+
});
|
|
268
|
+
this.formDatepicker.valueChanges
|
|
269
|
+
.pipe(takeUntilDestroyed(this.destroyRef))
|
|
270
|
+
.subscribe((value) => {
|
|
271
|
+
this.updateExternalFromDatepicker(value);
|
|
272
|
+
});
|
|
273
|
+
}
|
|
274
|
+
get startDatePlaceholder() {
|
|
275
|
+
return this.texts.datepicker.startDatePlaceholder;
|
|
276
|
+
}
|
|
277
|
+
get endDatePlaceholder() {
|
|
278
|
+
return this.texts.datepicker.endDatePlaceholder;
|
|
279
|
+
}
|
|
280
|
+
syncFromExternal(value) {
|
|
281
|
+
const nextValue = value ?? this.emptyValue;
|
|
282
|
+
const displayValue = {
|
|
283
|
+
startDate: nextValue.startDate,
|
|
284
|
+
endDate: nextValue.endDate,
|
|
285
|
+
};
|
|
286
|
+
const datepickerValue = {
|
|
287
|
+
startDate: parseDateValue(nextValue.startDate),
|
|
288
|
+
endDate: parseDateValue(nextValue.endDate),
|
|
289
|
+
};
|
|
290
|
+
const currentDisplay = this.formDisplay.getRawValue();
|
|
291
|
+
if (currentDisplay.startDate !== displayValue.startDate ||
|
|
292
|
+
currentDisplay.endDate !== displayValue.endDate) {
|
|
293
|
+
this.formDisplay.patchValue(displayValue, { emitEvent: false });
|
|
294
|
+
}
|
|
295
|
+
const currentDatepicker = this.formDatepicker.getRawValue();
|
|
296
|
+
if (!this.areDatesEqual(currentDatepicker.startDate, datepickerValue.startDate) ||
|
|
297
|
+
!this.areDatesEqual(currentDatepicker.endDate, datepickerValue.endDate)) {
|
|
298
|
+
this.formDatepicker.patchValue(datepickerValue, { emitEvent: false });
|
|
299
|
+
}
|
|
300
|
+
this.cdr.markForCheck();
|
|
301
|
+
}
|
|
302
|
+
updateExternalFromDisplay(value) {
|
|
303
|
+
const nextValue = {
|
|
304
|
+
startDate: value.startDate ?? null,
|
|
305
|
+
endDate: value.endDate ?? null,
|
|
306
|
+
};
|
|
307
|
+
this.patchExternalValue(nextValue);
|
|
308
|
+
const nextDatepickerValue = {
|
|
309
|
+
startDate: parseDateValue(nextValue.startDate),
|
|
310
|
+
endDate: parseDateValue(nextValue.endDate),
|
|
311
|
+
};
|
|
312
|
+
this.formDatepicker.patchValue(nextDatepickerValue, { emitEvent: false });
|
|
313
|
+
this.cdr.markForCheck();
|
|
314
|
+
}
|
|
315
|
+
updateExternalFromDatepicker(value) {
|
|
316
|
+
if (!value.startDate || !value.endDate) {
|
|
317
|
+
return;
|
|
318
|
+
}
|
|
319
|
+
const nextValue = {
|
|
320
|
+
startDate: formatDateAsDayMonthYear(value.startDate),
|
|
321
|
+
endDate: formatDateAsDayMonthYear(value.endDate),
|
|
322
|
+
};
|
|
323
|
+
this.patchExternalValue(nextValue);
|
|
324
|
+
this.formDisplay.patchValue(nextValue, { emitEvent: false });
|
|
325
|
+
this.cdr.markForCheck();
|
|
326
|
+
}
|
|
327
|
+
patchExternalValue(nextValue) {
|
|
328
|
+
const currentValue = this.rangeControl.value;
|
|
329
|
+
if (currentValue?.startDate === nextValue.startDate &&
|
|
330
|
+
currentValue?.endDate === nextValue.endDate) {
|
|
331
|
+
return;
|
|
332
|
+
}
|
|
333
|
+
this.rangeControl.patchValue(nextValue);
|
|
334
|
+
}
|
|
335
|
+
areDatesEqual(first, second) {
|
|
336
|
+
if (first === second) {
|
|
337
|
+
return true;
|
|
338
|
+
}
|
|
339
|
+
if (!first || !second) {
|
|
340
|
+
return false;
|
|
341
|
+
}
|
|
342
|
+
return first.getTime() === second.getTime();
|
|
343
|
+
}
|
|
344
|
+
cleanDatepicker() {
|
|
345
|
+
const defaultRange = getRelativeDateRange(this.defaultDaysBack);
|
|
346
|
+
const nextValue = {
|
|
347
|
+
startDate: formatDateAsDayMonthYear(defaultRange.startDate),
|
|
348
|
+
endDate: formatDateAsDayMonthYear(defaultRange.endDate),
|
|
349
|
+
};
|
|
350
|
+
this.formDatepicker.patchValue(defaultRange, { emitEvent: false });
|
|
351
|
+
this.formDisplay.patchValue(nextValue, { emitEvent: false });
|
|
352
|
+
this.patchExternalValue(nextValue);
|
|
353
|
+
this.cdr.markForCheck();
|
|
354
|
+
}
|
|
355
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.19", ngImport: i0, type: MapaDatepickerRange, deps: [{ token: MapaI18nService }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
356
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.19", type: MapaDatepickerRange, isStandalone: true, selector: "mapa-datepicker-range", inputs: { formGroup: "formGroup", element: "element" }, providers: [
|
|
357
|
+
provideNgxMask(),
|
|
358
|
+
provideNativeDateAdapter(MAPA_DATEPICKER_RANGE_FORMATS),
|
|
359
|
+
], ngImport: i0, template: "@if (element.label) {\n <div class=\"mapa-datepicker-range__label\">\n {{ element.label }}\n </div>\n}\n<section class=\"mapa-datepicker-range\" [formGroup]=\"formDisplay\">\n <mat-form-field\n appearance=\"outline\"\n subscriptSizing=\"dynamic\"\n class=\"mapa-datepicker-range__start-date\"\n >\n <input\n matInput\n formControlName=\"startDate\"\n [placeholder]=\"startDatePlaceholder\"\n mask=\"00/00/0000\"\n />\n </mat-form-field>\n <div class=\"mapa-datepicker-range__divider\">–</div>\n <mat-form-field\n appearance=\"outline\"\n subscriptSizing=\"dynamic\"\n class=\"mapa-datepicker-range__end-date\"\n >\n <input\n matInput\n formControlName=\"endDate\"\n [placeholder]=\"endDatePlaceholder\"\n mask=\"00/00/0000\"\n />\n <mat-icon matSuffix (click)=\"cleanDatepicker()\">close</mat-icon>\n <mat-datepicker-toggle matSuffix [for]=\"picker\"></mat-datepicker-toggle>\n <mat-date-range-picker touchUi=\"true\" #picker></mat-date-range-picker>\n </mat-form-field>\n</section>\n<section class=\"mapa--hidden\">\n <mat-form-field [formGroup]=\"formDatepicker\">\n <mat-date-range-input [rangePicker]=\"picker\">\n <input matStartDate formControlName=\"startDate\" />\n <input matEndDate formControlName=\"endDate\" />\n </mat-date-range-input>\n </mat-form-field>\n</section>\n", styles: [":host ::ng-deep .mat-mdc-form-field-type-mat-date-range-input .mdc-text-field--outlined{background-color:#fff}:host ::ng-deep .mat-mdc-form-field-type-mat-date-range-input .mat-mdc-text-field-wrapper{min-height:48px!important;height:48px!important}:host ::ng-deep .mat-mdc-form-field-type-mat-date-range-input .mat-mdc-text-field-wrapper.mdc-text-field--outlined{padding-left:unset!important;padding-right:unset!important}:host ::ng-deep .mapa-datepicker-range{display:flex;align-items:center;justify-content:flex-start;background-color:#fff;border:2px solid #a7aaad;border-radius:8px;padding:0 .75em;min-height:48px;height:48px;width:310px}:host ::ng-deep .mapa-datepicker-range__label{font-family:var(--mapa-font-heading, \"Asap\", \"Inter\", sans-serif);display:block;font-size:12px;font-style:normal;font-weight:600;line-height:16px;text-transform:uppercase;margin-bottom:16px}:host ::ng-deep .mapa-datepicker-range__start-date{width:100px!important;display:flex;align-items:center;align-self:stretch}:host ::ng-deep .mapa-datepicker-range__start-date .mat-mdc-input-element,:host ::ng-deep .mapa-datepicker-range__start-date .mat-mdc-text-field-wrapper{width:100px!important}:host ::ng-deep .mapa-datepicker-range__end-date{width:100px!important;min-width:100px!important;display:flex;align-items:center;align-self:stretch}:host ::ng-deep .mapa-datepicker-range__end-date .mat-mdc-input-element,:host ::ng-deep .mapa-datepicker-range__end-date .mat-mdc-text-field-wrapper{width:100px!important;min-width:100px!important}:host ::ng-deep .mapa-datepicker-range__divider{margin:0 8px}:host ::ng-deep .mapa-datepicker-range .mat-mdc-form-field-icon-suffix{display:flex;align-items:center;gap:4px;margin-left:96px;padding:unset!important}:host ::ng-deep .mapa-datepicker-range .mat-mdc-form-field-icon-suffix .mat-icon,:host ::ng-deep .mapa-datepicker-range .mat-mdc-form-field-icon-suffix .mat-datepicker-toggle{margin:0}:host ::ng-deep .mapa-datepicker-range .mat-mdc-form-field-flex{display:flex;align-items:center;min-height:100%}:host ::ng-deep .mapa-datepicker-range .mat-mdc-text-field-wrapper{padding:0!important;align-items:center!important;display:flex;background:#fff;min-height:100%}:host ::ng-deep .mapa-datepicker-range .mdc-notched-outline{display:none}:host ::ng-deep .mapa-datepicker-range .mat-mdc-form-field-infix{padding:0!important;min-height:unset!important;border-top:unset!important;display:flex;align-items:center;height:100%}:host ::ng-deep .mapa-datepicker-range .mat-mdc-form-field-subscript-wrapper{display:none}:host ::ng-deep .mapa-datepicker-range .mat-mdc-input-element{align-self:center;height:100%;line-height:24px;margin:0!important;padding:0 8px 0 0!important;text-align:center;vertical-align:middle}:host ::ng-deep .mapa--hidden{display:none}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i2.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: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: NgxMaskDirective, selector: "input[mask], textarea[mask]", inputs: ["mask", "specialCharacters", "patterns", "prefix", "suffix", "thousandSeparator", "decimalMarker", "dropSpecialCharacters", "hiddenInput", "showMaskTyped", "placeHolderCharacter", "shownMaskExpression", "clearIfNotMatch", "validation", "separatorLimit", "allowNegativeNumbers", "leadZeroDateTime", "leadZero", "triggerOnMaskChange", "apm", "inputTransformFn", "outputTransformFn", "keepCharacterPositions", "instantPrefix"], outputs: ["maskFilled"], exportAs: ["mask", "ngxMask"] }, { kind: "ngmodule", type: MatDatepickerModule }, { kind: "component", type: i3.MatDatepickerToggle, selector: "mat-datepicker-toggle", inputs: ["for", "tabIndex", "aria-label", "disabled", "disableRipple"], exportAs: ["matDatepickerToggle"] }, { kind: "component", type: i3.MatDateRangeInput, selector: "mat-date-range-input", inputs: ["rangePicker", "required", "dateFilter", "min", "max", "disabled", "separator", "comparisonStart", "comparisonEnd"], exportAs: ["matDateRangeInput"] }, { kind: "directive", type: i3.MatStartDate, selector: "input[matStartDate]", outputs: ["dateChange", "dateInput"] }, { kind: "directive", type: i3.MatEndDate, selector: "input[matEndDate]", outputs: ["dateChange", "dateInput"] }, { kind: "component", type: i3.MatDateRangePicker, selector: "mat-date-range-picker", exportAs: ["matDateRangePicker"] }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "component", type: i4.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i4.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i5.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i6.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly", "disabledInteractive"], exportAs: ["matInput"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
360
|
+
}
|
|
361
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.19", ngImport: i0, type: MapaDatepickerRange, decorators: [{
|
|
362
|
+
type: Component,
|
|
363
|
+
args: [{ selector: "mapa-datepicker-range", changeDetection: ChangeDetectionStrategy.OnPush, imports: [
|
|
364
|
+
CommonModule,
|
|
365
|
+
ReactiveFormsModule,
|
|
366
|
+
NgxMaskDirective,
|
|
367
|
+
MatDatepickerModule,
|
|
368
|
+
MatFormFieldModule,
|
|
369
|
+
MatIconModule,
|
|
370
|
+
MatInputModule,
|
|
371
|
+
], providers: [
|
|
372
|
+
provideNgxMask(),
|
|
373
|
+
provideNativeDateAdapter(MAPA_DATEPICKER_RANGE_FORMATS),
|
|
374
|
+
], standalone: true, template: "@if (element.label) {\n <div class=\"mapa-datepicker-range__label\">\n {{ element.label }}\n </div>\n}\n<section class=\"mapa-datepicker-range\" [formGroup]=\"formDisplay\">\n <mat-form-field\n appearance=\"outline\"\n subscriptSizing=\"dynamic\"\n class=\"mapa-datepicker-range__start-date\"\n >\n <input\n matInput\n formControlName=\"startDate\"\n [placeholder]=\"startDatePlaceholder\"\n mask=\"00/00/0000\"\n />\n </mat-form-field>\n <div class=\"mapa-datepicker-range__divider\">–</div>\n <mat-form-field\n appearance=\"outline\"\n subscriptSizing=\"dynamic\"\n class=\"mapa-datepicker-range__end-date\"\n >\n <input\n matInput\n formControlName=\"endDate\"\n [placeholder]=\"endDatePlaceholder\"\n mask=\"00/00/0000\"\n />\n <mat-icon matSuffix (click)=\"cleanDatepicker()\">close</mat-icon>\n <mat-datepicker-toggle matSuffix [for]=\"picker\"></mat-datepicker-toggle>\n <mat-date-range-picker touchUi=\"true\" #picker></mat-date-range-picker>\n </mat-form-field>\n</section>\n<section class=\"mapa--hidden\">\n <mat-form-field [formGroup]=\"formDatepicker\">\n <mat-date-range-input [rangePicker]=\"picker\">\n <input matStartDate formControlName=\"startDate\" />\n <input matEndDate formControlName=\"endDate\" />\n </mat-date-range-input>\n </mat-form-field>\n</section>\n", styles: [":host ::ng-deep .mat-mdc-form-field-type-mat-date-range-input .mdc-text-field--outlined{background-color:#fff}:host ::ng-deep .mat-mdc-form-field-type-mat-date-range-input .mat-mdc-text-field-wrapper{min-height:48px!important;height:48px!important}:host ::ng-deep .mat-mdc-form-field-type-mat-date-range-input .mat-mdc-text-field-wrapper.mdc-text-field--outlined{padding-left:unset!important;padding-right:unset!important}:host ::ng-deep .mapa-datepicker-range{display:flex;align-items:center;justify-content:flex-start;background-color:#fff;border:2px solid #a7aaad;border-radius:8px;padding:0 .75em;min-height:48px;height:48px;width:310px}:host ::ng-deep .mapa-datepicker-range__label{font-family:var(--mapa-font-heading, \"Asap\", \"Inter\", sans-serif);display:block;font-size:12px;font-style:normal;font-weight:600;line-height:16px;text-transform:uppercase;margin-bottom:16px}:host ::ng-deep .mapa-datepicker-range__start-date{width:100px!important;display:flex;align-items:center;align-self:stretch}:host ::ng-deep .mapa-datepicker-range__start-date .mat-mdc-input-element,:host ::ng-deep .mapa-datepicker-range__start-date .mat-mdc-text-field-wrapper{width:100px!important}:host ::ng-deep .mapa-datepicker-range__end-date{width:100px!important;min-width:100px!important;display:flex;align-items:center;align-self:stretch}:host ::ng-deep .mapa-datepicker-range__end-date .mat-mdc-input-element,:host ::ng-deep .mapa-datepicker-range__end-date .mat-mdc-text-field-wrapper{width:100px!important;min-width:100px!important}:host ::ng-deep .mapa-datepicker-range__divider{margin:0 8px}:host ::ng-deep .mapa-datepicker-range .mat-mdc-form-field-icon-suffix{display:flex;align-items:center;gap:4px;margin-left:96px;padding:unset!important}:host ::ng-deep .mapa-datepicker-range .mat-mdc-form-field-icon-suffix .mat-icon,:host ::ng-deep .mapa-datepicker-range .mat-mdc-form-field-icon-suffix .mat-datepicker-toggle{margin:0}:host ::ng-deep .mapa-datepicker-range .mat-mdc-form-field-flex{display:flex;align-items:center;min-height:100%}:host ::ng-deep .mapa-datepicker-range .mat-mdc-text-field-wrapper{padding:0!important;align-items:center!important;display:flex;background:#fff;min-height:100%}:host ::ng-deep .mapa-datepicker-range .mdc-notched-outline{display:none}:host ::ng-deep .mapa-datepicker-range .mat-mdc-form-field-infix{padding:0!important;min-height:unset!important;border-top:unset!important;display:flex;align-items:center;height:100%}:host ::ng-deep .mapa-datepicker-range .mat-mdc-form-field-subscript-wrapper{display:none}:host ::ng-deep .mapa-datepicker-range .mat-mdc-input-element{align-self:center;height:100%;line-height:24px;margin:0!important;padding:0 8px 0 0!important;text-align:center;vertical-align:middle}:host ::ng-deep .mapa--hidden{display:none}\n"] }]
|
|
375
|
+
}], ctorParameters: () => [{ type: MapaI18nService }, { type: i0.ChangeDetectorRef }], propDecorators: { formGroup: [{
|
|
376
|
+
type: Input
|
|
377
|
+
}], element: [{
|
|
378
|
+
type: Input
|
|
379
|
+
}] } });
|
|
380
|
+
|
|
381
|
+
/*
|
|
382
|
+
* Public API Surface of mapa-library-ui datepicker-range
|
|
383
|
+
*/
|
|
384
|
+
|
|
385
|
+
/*
|
|
386
|
+
* Public API Surface of mapa-library-ui datepicker-range
|
|
387
|
+
*/
|
|
388
|
+
|
|
389
|
+
/**
|
|
390
|
+
* Generated bundle index. Do not edit.
|
|
391
|
+
*/
|
|
392
|
+
|
|
393
|
+
export { MAPA_DATEPICKER_RANGE_FORMATS, MapaDatepickerRange };
|
|
394
|
+
//# sourceMappingURL=mapa-library-ui-src-lib-components-datepicker-range.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mapa-library-ui-src-lib-components-datepicker-range.mjs","sources":["../../../projects/mapa-library-ui/src/lib/core/utils/date.util.ts","../../../projects/mapa-library-ui/src/lib/core/i18n/mapa-ui-texts.ts","../../../projects/mapa-library-ui/src/lib/core/services/mapa-i18n.service.ts","../../../projects/mapa-library-ui/src/lib/components/datepicker-range/src/datepicker-range.component.ts","../../../projects/mapa-library-ui/src/lib/components/datepicker-range/src/datepicker-range.component.html","../../../projects/mapa-library-ui/src/lib/components/datepicker-range/public-api.ts","../../../projects/mapa-library-ui/src/datepicker-range.ts","../../../projects/mapa-library-ui/src/mapa-library-ui-src-lib-components-datepicker-range.ts"],"sourcesContent":["const DAY_MONTH_YEAR_PATTERN = /^(\\d{2})\\/(\\d{2})\\/(\\d{4})$/;\n\nfunction isValidDate(date: Date): boolean {\n return !Number.isNaN(date.getTime());\n}\n\nexport function formatDateAsDayMonthYear(date: Date): string {\n const day = `${date.getDate()}`.padStart(2, \"0\");\n const month = `${date.getMonth() + 1}`.padStart(2, \"0\");\n const year = `${date.getFullYear()}`;\n\n return `${day}/${month}/${year}`;\n}\n\nexport function parseDateValue(value: unknown): Date | null {\n if (value instanceof Date) {\n return isValidDate(value) ? new Date(value.getTime()) : null;\n }\n\n if (typeof value === \"number\") {\n const parsedDate = new Date(value);\n return isValidDate(parsedDate) ? parsedDate : null;\n }\n\n if (typeof value !== \"string\") {\n return null;\n }\n\n const trimmedValue = value.trim();\n if (!trimmedValue) {\n return null;\n }\n\n const dayMonthYearMatch = DAY_MONTH_YEAR_PATTERN.exec(trimmedValue);\n if (dayMonthYearMatch) {\n const [, dayValue, monthValue, yearValue] = dayMonthYearMatch;\n const day = Number(dayValue);\n const month = Number(monthValue);\n const year = Number(yearValue);\n const parsedDate = new Date(year, month - 1, day);\n\n if (\n parsedDate.getFullYear() === year &&\n parsedDate.getMonth() === month - 1 &&\n parsedDate.getDate() === day\n ) {\n return parsedDate;\n }\n\n return null;\n }\n\n const parsedDate = new Date(trimmedValue);\n return isValidDate(parsedDate) ? parsedDate : null;\n}\n\nexport function isDateValue(value: unknown): boolean {\n return parseDateValue(value) !== null;\n}\n\nexport function getRelativeDateRange(daysBack: number): {\n startDate: Date;\n endDate: Date;\n} {\n const endDate = new Date();\n endDate.setHours(23, 59, 59, 999);\n\n const startDate = new Date();\n startDate.setHours(0, 0, 0, 0);\n startDate.setDate(startDate.getDate() - daysBack);\n\n return { startDate, endDate };\n}\n","import { InjectionToken, Provider } from \"@angular/core\";\n\nexport interface ValidationMessageContext {\n actualLength?: number;\n max?: number;\n min?: number;\n requiredLength?: number;\n}\n\nexport type ValidationTextResolver =\n | string\n | ((context?: ValidationMessageContext) => string);\n\nexport interface MapaUiTexts {\n common: {\n selectAll: string;\n };\n filters: {\n clear: string;\n submit: string;\n };\n datepicker: {\n startDatePlaceholder: string;\n endDatePlaceholder: string;\n };\n capability: {\n groupAverageTitle: string;\n individualAverageTitle: string;\n conceptTitle: string;\n resultTitle: string;\n positiveIndicatorsTitle: string;\n negativeIndicatorsTitle: string;\n riskIndicatorsTitle: string;\n precipitationRiskTitle: string;\n negligenceRiskTitle: string;\n negativeDirectionLabel: string;\n positiveDirectionLabel: string;\n };\n paginator: {\n itemsPerPage: string;\n nextPage: string;\n previousPage: string;\n rangeLabel: (page: number, pageSize: number, length: number) => string;\n showingRangeLabel: (\n page: number,\n pageSize: number,\n length: number\n ) => string;\n };\n table: {\n emptyTitle: string;\n emptySubtitle: string;\n };\n validation: {\n cnpj: ValidationTextResolver;\n cpf: ValidationTextResolver;\n email: ValidationTextResolver;\n max: ValidationTextResolver;\n maxLength: ValidationTextResolver;\n min: ValidationTextResolver;\n minLength: ValidationTextResolver;\n pattern: ValidationTextResolver;\n required: ValidationTextResolver;\n };\n}\n\nexport type PartialMapaUiTexts = Partial<{\n [K in keyof MapaUiTexts]: Partial<MapaUiTexts[K]>;\n}>;\n\nexport const MAPA_UI_TEXTS = new InjectionToken<PartialMapaUiTexts>(\n \"MAPA_UI_TEXTS\"\n);\n\nexport const MAPA_UI_DEFAULT_TEXTS: MapaUiTexts = {\n common: {\n selectAll: \"Selecionar todos\",\n },\n filters: {\n clear: \"Limpar filtros\",\n submit: \"Filtrar\",\n },\n datepicker: {\n startDatePlaceholder: \"Data inicial\",\n endDatePlaceholder: \"Data final\",\n },\n capability: {\n groupAverageTitle: \"Média geral do grupo\",\n individualAverageTitle: \"Média geral do indivíduo\",\n conceptTitle: \"Conceito\",\n resultTitle: \"Resultado\",\n positiveIndicatorsTitle: \"Indicadores positivos\",\n negativeIndicatorsTitle: \"Indicadores negativos\",\n riskIndicatorsTitle: \"Indicadores de risco\",\n precipitationRiskTitle: \"Risco de acidente por precipitação\",\n negligenceRiskTitle: \"Risco de acidente por negligência\",\n negativeDirectionLabel: \"Direção Negativa |\",\n positiveDirectionLabel: \"Direção Positiva |\",\n },\n paginator: {\n itemsPerPage: \"Itens por página\",\n nextPage: \"Próxima página\",\n previousPage: \"Página anterior\",\n rangeLabel: (page: number, pageSize: number, length: number) => {\n if (length === 0 || pageSize === 0) {\n return `0 de ${length}`;\n }\n\n const startIndex = page * pageSize;\n const endIndex =\n startIndex < length\n ? Math.min(startIndex + pageSize, length)\n : startIndex + pageSize;\n\n return `${startIndex + 1} - ${endIndex} de ${length}`;\n },\n showingRangeLabel: (page: number, pageSize: number, length: number) => {\n if (length === 0) {\n return \"Mostrando 0 - 0 de 0 item\";\n }\n\n const startIndex = page * pageSize;\n const endIndex =\n startIndex < length\n ? Math.min(startIndex + pageSize, length)\n : startIndex + pageSize;\n const itemLabel = length === 1 ? \"item\" : \"itens\";\n\n return `Mostrando ${startIndex + 1} - ${endIndex} de ${length} ${itemLabel}`;\n },\n },\n table: {\n emptyTitle: \"Nao foram encontrados resultados\",\n emptySubtitle: \"\",\n },\n validation: {\n cnpj: \"CNPJ inválido\",\n cpf: \"CPF inválido\",\n email: \"E-mail inválido\",\n max: (context?: ValidationMessageContext) =>\n `O valor máximo permitido é ${context?.max ?? \"\"}`.trim(),\n maxLength: (context?: ValidationMessageContext) =>\n `O máximo permitido é ${context?.requiredLength ?? \"\"} caracteres`.trim(),\n min: (context?: ValidationMessageContext) =>\n `O valor minimo permitido é ${context?.min ?? \"\"}`.trim(),\n minLength: (context?: ValidationMessageContext) =>\n `O mínimo permitido é ${context?.requiredLength ?? \"\"} caracteres`.trim(),\n pattern: \"Formato inválido\",\n required: \"Campo obrigatório\",\n },\n};\n\nexport function mergeMapaUiTexts(\n customTexts?: PartialMapaUiTexts | null\n): MapaUiTexts {\n return {\n common: {\n ...MAPA_UI_DEFAULT_TEXTS.common,\n ...(customTexts?.common ?? {}),\n },\n filters: {\n ...MAPA_UI_DEFAULT_TEXTS.filters,\n ...(customTexts?.filters ?? {}),\n },\n datepicker: {\n ...MAPA_UI_DEFAULT_TEXTS.datepicker,\n ...(customTexts?.datepicker ?? {}),\n },\n capability: {\n ...MAPA_UI_DEFAULT_TEXTS.capability,\n ...(customTexts?.capability ?? {}),\n },\n paginator: {\n ...MAPA_UI_DEFAULT_TEXTS.paginator,\n ...(customTexts?.paginator ?? {}),\n },\n table: {\n ...MAPA_UI_DEFAULT_TEXTS.table,\n ...(customTexts?.table ?? {}),\n },\n validation: {\n ...MAPA_UI_DEFAULT_TEXTS.validation,\n ...(customTexts?.validation ?? {}),\n },\n };\n}\n\nexport function provideMapaUiTexts(texts: PartialMapaUiTexts): Provider {\n return {\n provide: MAPA_UI_TEXTS,\n useValue: texts,\n };\n}\n","import { Inject, Injectable, Injector, Optional, inject, signal } from \"@angular/core\";\nimport { toObservable } from \"@angular/core/rxjs-interop\";\nimport {\n MAPA_UI_TEXTS,\n MapaUiTexts,\n PartialMapaUiTexts,\n ValidationMessageContext,\n ValidationTextResolver,\n mergeMapaUiTexts,\n} from \"../i18n/mapa-ui-texts\";\n\n@Injectable({\n providedIn: \"root\",\n})\nexport class MapaI18nService {\n private readonly injector = inject(Injector);\n private readonly textsState = signal<MapaUiTexts>(mergeMapaUiTexts());\n\n readonly textsSignal = this.textsState.asReadonly();\n readonly texts$ = toObservable(this.textsSignal, { injector: this.injector });\n\n constructor(\n @Optional() @Inject(MAPA_UI_TEXTS) customTexts: PartialMapaUiTexts | null\n ) {\n if (customTexts) {\n this.textsState.set(mergeMapaUiTexts(customTexts));\n }\n }\n\n get texts(): MapaUiTexts {\n return this.textsState();\n }\n\n setTexts(texts: PartialMapaUiTexts): void {\n this.textsState.set(mergeMapaUiTexts(texts));\n }\n\n resolveValidationText(\n key: keyof MapaUiTexts[\"validation\"],\n context?: ValidationMessageContext\n ): string {\n return this.resolveText(this.texts.validation[key], context);\n }\n\n private resolveText(\n value: ValidationTextResolver,\n context?: ValidationMessageContext\n ): string {\n return typeof value === \"function\" ? value(context) : value;\n }\n}\n","import { CommonModule } from \"@angular/common\";\nimport {\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n DestroyRef,\n Input,\n OnInit,\n inject,\n} from \"@angular/core\";\nimport { takeUntilDestroyed } from \"@angular/core/rxjs-interop\";\nimport {\n FormControl,\n FormGroup,\n ReactiveFormsModule,\n} from \"@angular/forms\";\nimport { provideNativeDateAdapter } from \"@angular/material/core\";\nimport { MatDatepickerModule } from \"@angular/material/datepicker\";\nimport { MatFormFieldModule } from \"@angular/material/form-field\";\nimport { MatIconModule } from \"@angular/material/icon\";\nimport { MatInputModule } from \"@angular/material/input\";\nimport { NgxMaskDirective, provideNgxMask } from \"ngx-mask\";\nimport { MapaI18nService } from \"../../../core/services/mapa-i18n.service\";\nimport {\n formatDateAsDayMonthYear,\n getRelativeDateRange,\n parseDateValue,\n} from \"../../../core/utils/date.util\";\nimport { DatepickerRange } from \"../../../core/elements/datepicker-range\";\n\nexport interface MapaDatepickerRangeControlValue {\n startDate: string | null;\n endDate: string | null;\n}\n\nexport type MapaDatepickerRangeFormGroup = FormGroup;\n\ntype MapaDatepickerInternalRangeValue = {\n startDate: Date | null;\n endDate: Date | null;\n};\n\ntype MapaDatepickerInternalRangeFormGroup = FormGroup<{\n startDate: FormControl<MapaDatepickerInternalRangeValue[\"startDate\"]>;\n endDate: FormControl<MapaDatepickerInternalRangeValue[\"endDate\"]>;\n}>;\n\ntype MapaDatepickerRangeDisplayFormGroup = FormGroup<{\n startDate: FormControl<string | null>;\n endDate: FormControl<string | null>;\n}>;\n\nexport const MAPA_DATEPICKER_RANGE_FORMATS = {\n parse: {\n dateInput: \"DD/MM/YYYY\",\n },\n display: {\n dateInput: \"DD/MM/YYYY\",\n monthYearLabel: \"MMM YYYY\",\n dateA11yLabel: \"LL\",\n monthYearA11yLabel: \"MMMM YYYY\",\n },\n};\n\n@Component({\n selector: \"mapa-datepicker-range\",\n templateUrl: \"./datepicker-range.component.html\",\n styleUrl: \"./datepicker-range.component.scss\",\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [\n CommonModule,\n ReactiveFormsModule,\n NgxMaskDirective,\n MatDatepickerModule,\n MatFormFieldModule,\n MatIconModule,\n MatInputModule,\n ],\n providers: [\n provideNgxMask(),\n provideNativeDateAdapter(MAPA_DATEPICKER_RANGE_FORMATS),\n ],\n standalone: true,\n})\nexport class MapaDatepickerRange implements OnInit {\n @Input() formGroup!: FormGroup;\n @Input() element!: DatepickerRange;\n\n private readonly destroyRef = inject(DestroyRef);\n private readonly defaultDaysBack = 60;\n private readonly emptyValue: MapaDatepickerRangeControlValue = {\n startDate: null,\n endDate: null,\n };\n\n readonly formDatepicker: MapaDatepickerInternalRangeFormGroup = new FormGroup({\n startDate: new FormControl<Date | null>(null),\n endDate: new FormControl<Date | null>(null),\n });\n\n readonly formDisplay: MapaDatepickerRangeDisplayFormGroup = new FormGroup({\n startDate: new FormControl<string | null>(null),\n endDate: new FormControl<string | null>(null),\n });\n\n rangeControl!: FormControl<MapaDatepickerRangeControlValue | null>;\n\n constructor(\n private readonly i18n: MapaI18nService,\n private readonly cdr: ChangeDetectorRef\n ) {}\n\n get texts() {\n return this.i18n.textsSignal();\n }\n\n ngOnInit(): void {\n if (!this.element?.key) {\n throw new Error(\"mapa-datepicker-range requires element.key to resolve the target control.\");\n }\n\n this.rangeControl = this.formGroup.get(this.element.key) as FormControl<\n MapaDatepickerRangeControlValue | null\n >;\n\n if (!this.rangeControl) {\n throw new Error(\n `mapa-datepicker-range could not find control '${this.element.key}' in formGroup.`\n );\n }\n\n this.syncFromExternal(this.rangeControl.value);\n\n this.rangeControl.valueChanges\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe((value) => {\n this.syncFromExternal(value);\n });\n\n this.formDisplay.valueChanges\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe((value) => {\n this.updateExternalFromDisplay(value);\n });\n\n this.formDatepicker.valueChanges\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe((value) => {\n this.updateExternalFromDatepicker(value);\n });\n }\n\n get startDatePlaceholder(): string {\n return this.texts.datepicker.startDatePlaceholder;\n }\n\n get endDatePlaceholder(): string {\n return this.texts.datepicker.endDatePlaceholder;\n }\n\n private syncFromExternal(value: MapaDatepickerRangeControlValue | null): void {\n const nextValue = value ?? this.emptyValue;\n const displayValue: MapaDatepickerRangeControlValue = {\n startDate: nextValue.startDate,\n endDate: nextValue.endDate,\n };\n const datepickerValue: MapaDatepickerInternalRangeValue = {\n startDate: parseDateValue(nextValue.startDate),\n endDate: parseDateValue(nextValue.endDate),\n };\n\n const currentDisplay = this.formDisplay.getRawValue();\n if (\n currentDisplay.startDate !== displayValue.startDate ||\n currentDisplay.endDate !== displayValue.endDate\n ) {\n this.formDisplay.patchValue(displayValue, { emitEvent: false });\n }\n\n const currentDatepicker = this.formDatepicker.getRawValue();\n if (\n !this.areDatesEqual(currentDatepicker.startDate, datepickerValue.startDate) ||\n !this.areDatesEqual(currentDatepicker.endDate, datepickerValue.endDate)\n ) {\n this.formDatepicker.patchValue(datepickerValue, { emitEvent: false });\n }\n\n this.cdr.markForCheck();\n }\n\n private updateExternalFromDisplay(\n value: Partial<MapaDatepickerRangeControlValue>\n ): void {\n const nextValue: MapaDatepickerRangeControlValue = {\n startDate: value.startDate ?? null,\n endDate: value.endDate ?? null,\n };\n\n this.patchExternalValue(nextValue);\n\n const nextDatepickerValue: MapaDatepickerInternalRangeValue = {\n startDate: parseDateValue(nextValue.startDate),\n endDate: parseDateValue(nextValue.endDate),\n };\n this.formDatepicker.patchValue(nextDatepickerValue, { emitEvent: false });\n this.cdr.markForCheck();\n }\n\n private updateExternalFromDatepicker(\n value: Partial<MapaDatepickerInternalRangeValue>\n ): void {\n if (!value.startDate || !value.endDate) {\n return;\n }\n\n const nextValue: MapaDatepickerRangeControlValue = {\n startDate: formatDateAsDayMonthYear(value.startDate),\n endDate: formatDateAsDayMonthYear(value.endDate),\n };\n\n this.patchExternalValue(nextValue);\n this.formDisplay.patchValue(nextValue, { emitEvent: false });\n this.cdr.markForCheck();\n }\n\n private patchExternalValue(nextValue: MapaDatepickerRangeControlValue): void {\n const currentValue = this.rangeControl.value;\n\n if (\n currentValue?.startDate === nextValue.startDate &&\n currentValue?.endDate === nextValue.endDate\n ) {\n return;\n }\n\n this.rangeControl.patchValue(nextValue);\n }\n\n private areDatesEqual(first: Date | null, second: Date | null): boolean {\n if (first === second) {\n return true;\n }\n\n if (!first || !second) {\n return false;\n }\n\n return first.getTime() === second.getTime();\n }\n\n cleanDatepicker() {\n const defaultRange = getRelativeDateRange(this.defaultDaysBack);\n const nextValue: MapaDatepickerRangeControlValue = {\n startDate: formatDateAsDayMonthYear(defaultRange.startDate),\n endDate: formatDateAsDayMonthYear(defaultRange.endDate),\n };\n\n this.formDatepicker.patchValue(defaultRange, { emitEvent: false });\n this.formDisplay.patchValue(nextValue, { emitEvent: false });\n this.patchExternalValue(nextValue);\n this.cdr.markForCheck();\n }\n}\n\nexport type MapaDatepickerRangeComponent = MapaDatepickerRange;\n","@if (element.label) {\n <div class=\"mapa-datepicker-range__label\">\n {{ element.label }}\n </div>\n}\n<section class=\"mapa-datepicker-range\" [formGroup]=\"formDisplay\">\n <mat-form-field\n appearance=\"outline\"\n subscriptSizing=\"dynamic\"\n class=\"mapa-datepicker-range__start-date\"\n >\n <input\n matInput\n formControlName=\"startDate\"\n [placeholder]=\"startDatePlaceholder\"\n mask=\"00/00/0000\"\n />\n </mat-form-field>\n <div class=\"mapa-datepicker-range__divider\">–</div>\n <mat-form-field\n appearance=\"outline\"\n subscriptSizing=\"dynamic\"\n class=\"mapa-datepicker-range__end-date\"\n >\n <input\n matInput\n formControlName=\"endDate\"\n [placeholder]=\"endDatePlaceholder\"\n mask=\"00/00/0000\"\n />\n <mat-icon matSuffix (click)=\"cleanDatepicker()\">close</mat-icon>\n <mat-datepicker-toggle matSuffix [for]=\"picker\"></mat-datepicker-toggle>\n <mat-date-range-picker touchUi=\"true\" #picker></mat-date-range-picker>\n </mat-form-field>\n</section>\n<section class=\"mapa--hidden\">\n <mat-form-field [formGroup]=\"formDatepicker\">\n <mat-date-range-input [rangePicker]=\"picker\">\n <input matStartDate formControlName=\"startDate\" />\n <input matEndDate formControlName=\"endDate\" />\n </mat-date-range-input>\n </mat-form-field>\n</section>\n","/*\n * Public API Surface of mapa-library-ui datepicker-range\n */\n\nexport * from './src/datepicker-range.component';","/*\n * Public API Surface of mapa-library-ui datepicker-range\n */\n\nexport * from './lib/components/datepicker-range/public-api';","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './datepicker-range';\n"],"names":["i1.MapaI18nService"],"mappings":"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"}
|