ng-firebase-table-kxp 1.2.0 → 1.2.2

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.
Files changed (48) hide show
  1. package/{fesm2020 → fesm2022}/ng-firebase-table-kxp.mjs +2762 -2744
  2. package/fesm2022/ng-firebase-table-kxp.mjs.map +1 -0
  3. package/index.d.ts +665 -5
  4. package/package.json +3 -11
  5. package/esm2020/lib/components/table/table.component.mjs +0 -710
  6. package/esm2020/lib/components/table-tabs/table-tabs.component.mjs +0 -73
  7. package/esm2020/lib/components/table-tooltip/table-tooltip.component.mjs +0 -34
  8. package/esm2020/lib/ng-firebase-table-kxp.component.mjs +0 -11
  9. package/esm2020/lib/ng-firebase-table-kxp.module.mjs +0 -98
  10. package/esm2020/lib/ng-firebase-table-kxp.service.mjs +0 -14
  11. package/esm2020/lib/services/filter.service.mjs +0 -416
  12. package/esm2020/lib/services/pagination.service.mjs +0 -115
  13. package/esm2020/lib/services/table.service.mjs +0 -1140
  14. package/esm2020/lib/services/tooltip.service.mjs +0 -141
  15. package/esm2020/lib/types/Table.mjs +0 -9
  16. package/esm2020/lib/utils/table.utils.mjs +0 -75
  17. package/esm2020/ng-firebase-table-kxp.mjs +0 -5
  18. package/esm2020/public-api.mjs +0 -22
  19. package/fesm2015/ng-firebase-table-kxp.mjs +0 -2869
  20. package/fesm2015/ng-firebase-table-kxp.mjs.map +0 -1
  21. package/fesm2020/ng-firebase-table-kxp.mjs.map +0 -1
  22. package/lib/components/table/table.component.d.ts +0 -132
  23. package/lib/components/table/table.component.d.ts.map +0 -1
  24. package/lib/components/table-tabs/table-tabs.component.d.ts +0 -34
  25. package/lib/components/table-tabs/table-tabs.component.d.ts.map +0 -1
  26. package/lib/components/table-tooltip/table-tooltip.component.d.ts +0 -18
  27. package/lib/components/table-tooltip/table-tooltip.component.d.ts.map +0 -1
  28. package/lib/ng-firebase-table-kxp.component.d.ts +0 -5
  29. package/lib/ng-firebase-table-kxp.component.d.ts.map +0 -1
  30. package/lib/ng-firebase-table-kxp.module.d.ts +0 -23
  31. package/lib/ng-firebase-table-kxp.module.d.ts.map +0 -1
  32. package/lib/ng-firebase-table-kxp.service.d.ts +0 -6
  33. package/lib/ng-firebase-table-kxp.service.d.ts.map +0 -1
  34. package/lib/services/filter.service.d.ts +0 -88
  35. package/lib/services/filter.service.d.ts.map +0 -1
  36. package/lib/services/pagination.service.d.ts +0 -34
  37. package/lib/services/pagination.service.d.ts.map +0 -1
  38. package/lib/services/table.service.d.ts +0 -80
  39. package/lib/services/table.service.d.ts.map +0 -1
  40. package/lib/services/tooltip.service.d.ts +0 -73
  41. package/lib/services/tooltip.service.d.ts.map +0 -1
  42. package/lib/types/Table.d.ts +0 -162
  43. package/lib/types/Table.d.ts.map +0 -1
  44. package/lib/utils/table.utils.d.ts +0 -25
  45. package/lib/utils/table.utils.d.ts.map +0 -1
  46. package/ng-firebase-table-kxp.d.ts.map +0 -1
  47. package/public-api.d.ts +0 -12
  48. package/public-api.d.ts.map +0 -1
@@ -1,416 +0,0 @@
1
- import { Injectable } from '@angular/core';
2
- import { FormControl, FormGroup } from '@angular/forms';
3
- import * as i0 from "@angular/core";
4
- import * as i1 from "./table.service";
5
- export class FilterService {
6
- constructor(tableService) {
7
- this.tableService = tableService;
8
- }
9
- /**
10
- * Cria um novo FormGroup para um filtro
11
- */
12
- createFilterGroup() {
13
- const dateValidator = this.tableService.dateFormatValidator();
14
- return new FormGroup({
15
- selectFilter: new FormControl(''),
16
- typeFilter: new FormControl(''),
17
- selectItem: new FormControl(''),
18
- initialDate: new FormControl('', [dateValidator]),
19
- finalDate: new FormControl('', [dateValidator]),
20
- });
21
- }
22
- /**
23
- * Adiciona um novo filtro ao FormArray
24
- */
25
- addFilter(filtersForm, isPaginated, filterData) {
26
- if (isPaginated &&
27
- this.hasActiveDateFilter(filtersForm) &&
28
- filterData?.selectFilter?.arrange === 'filterByDate') {
29
- return;
30
- }
31
- const newFilterGroup = this.createFilterGroup();
32
- if (filterData) {
33
- if (filterData.selectFilter) {
34
- newFilterGroup.get('selectFilter')?.setValue(filterData.selectFilter);
35
- }
36
- if (filterData.typeFilter) {
37
- newFilterGroup.get('typeFilter')?.setValue(filterData.typeFilter);
38
- }
39
- if (filterData.selectItem) {
40
- newFilterGroup.get('selectItem')?.setValue(filterData.selectItem);
41
- }
42
- if (filterData.initialDate) {
43
- newFilterGroup.get('initialDate')?.setValue(filterData.initialDate);
44
- }
45
- if (filterData.finalDate) {
46
- newFilterGroup.get('finalDate')?.setValue(filterData.finalDate);
47
- }
48
- }
49
- filtersForm.push(newFilterGroup);
50
- }
51
- /**
52
- * Verifica se há um filtro de data ativo
53
- */
54
- hasActiveDateFilter(filtersForm) {
55
- return filtersForm.controls.some((control) => {
56
- const group = control;
57
- const selectedFilter = group.get('selectFilter')?.value;
58
- return selectedFilter?.arrange === 'filterByDate';
59
- });
60
- }
61
- /**
62
- * Retorna as opções de filtro disponíveis
63
- */
64
- getAvailableFilterOptions(dropdownItems, isPaginated, filtersForm) {
65
- if (isPaginated && this.hasActiveDateFilter(filtersForm)) {
66
- return dropdownItems.filter((item) => item.arrange !== 'filterByDate');
67
- }
68
- return dropdownItems;
69
- }
70
- /**
71
- * Remove um filtro do FormArray
72
- */
73
- removeFilter(filtersForm, index) {
74
- filtersForm.removeAt(index);
75
- if (filtersForm.length === 0) {
76
- this.addFilter(filtersForm, false);
77
- }
78
- }
79
- /**
80
- * Remove todos os filtros do FormArray
81
- */
82
- removeAllFilters(filtersForm) {
83
- filtersForm.clear();
84
- this.addFilter(filtersForm, false);
85
- }
86
- /**
87
- * Aplica máscara de data (DD/MM/AAAA)
88
- */
89
- applyDateMask(event, controlName, filterGroup) {
90
- const input = event.target;
91
- let value = input.value.replace(/\D/g, '');
92
- if (value.length > 8) {
93
- value = value.slice(0, 8);
94
- }
95
- if (value.length <= 2) {
96
- // mantém como está
97
- }
98
- else if (value.length <= 4) {
99
- value = value.slice(0, 2) + '/' + value.slice(2);
100
- }
101
- else {
102
- value =
103
- value.slice(0, 2) + '/' + value.slice(2, 4) + '/' + value.slice(4, 8);
104
- }
105
- filterGroup.get(controlName)?.setValue(value, { emitEvent: false });
106
- }
107
- /**
108
- * Aplica filtros client-side aos itens
109
- */
110
- applyClientSideFilters(items, filtersForm, sortBy) {
111
- let filteredItems = [...items];
112
- const dateFiltersByProperty = {};
113
- const otherFilters = [];
114
- filtersForm.controls.forEach((control) => {
115
- const group = control;
116
- const selectedFilter = group.get('selectFilter')?.value;
117
- if (!selectedFilter)
118
- return;
119
- const arrange = selectedFilter.arrange;
120
- if (arrange === 'filterByDate') {
121
- const initial = group.get('initialDate')?.value;
122
- const final = group.get('finalDate')?.value;
123
- if (initial && final && initial.trim() && final.trim()) {
124
- try {
125
- const datePattern = /^(\d{1,2})\/(\d{1,2})\/(\d{4})$/;
126
- if (!datePattern.test(initial) || !datePattern.test(final)) {
127
- return;
128
- }
129
- const [dayI, monthI, yearI] = initial.split('/');
130
- const initialDate = new Date(`${monthI}/${dayI}/${yearI}`);
131
- const [dayF, monthF, yearF] = final.split('/');
132
- const finalDate = new Date(`${monthF}/${dayF}/${yearF}`);
133
- finalDate.setHours(23, 59, 59);
134
- if (isNaN(initialDate.getTime()) || isNaN(finalDate.getTime())) {
135
- return;
136
- }
137
- const dateField = selectedFilter.property || sortBy.field;
138
- if (!dateFiltersByProperty[dateField]) {
139
- dateFiltersByProperty[dateField] = [];
140
- }
141
- dateFiltersByProperty[dateField].push({
142
- initial: initialDate,
143
- final: finalDate,
144
- });
145
- }
146
- catch (error) {
147
- console.warn('Erro ao processar datas do filtro:', error);
148
- }
149
- }
150
- }
151
- else {
152
- otherFilters.push({ group, selectedFilter, arrange });
153
- }
154
- });
155
- // Aplicar filtros de data
156
- Object.keys(dateFiltersByProperty).forEach((dateField) => {
157
- const intervals = dateFiltersByProperty[dateField];
158
- filteredItems = filteredItems.filter((item) => {
159
- try {
160
- const fieldValue = item[dateField];
161
- if (!fieldValue) {
162
- return false;
163
- }
164
- let itemDate;
165
- if (typeof fieldValue.toDate === 'function') {
166
- itemDate = fieldValue.toDate();
167
- }
168
- else if (fieldValue instanceof Date) {
169
- itemDate = fieldValue;
170
- }
171
- else if (typeof fieldValue === 'string') {
172
- itemDate = new Date(fieldValue);
173
- if (isNaN(itemDate.getTime())) {
174
- return false;
175
- }
176
- }
177
- else if (typeof fieldValue === 'number') {
178
- itemDate = new Date(fieldValue);
179
- }
180
- else {
181
- return false;
182
- }
183
- return intervals.some((interval) => itemDate >= interval.initial && itemDate <= interval.final);
184
- }
185
- catch (error) {
186
- console.warn('Erro ao processar filtro de data para o item:', item.id, error);
187
- return false;
188
- }
189
- });
190
- });
191
- // Aplicar outros filtros
192
- otherFilters.forEach(({ group, selectedFilter, arrange }) => {
193
- if (arrange === 'filter') {
194
- const filterValue = group.get('typeFilter')?.value;
195
- if (filterValue && filterValue.trim()) {
196
- const property = selectedFilter.property;
197
- filteredItems = filteredItems.filter((item) => {
198
- const value = String(item[property] || '')
199
- .trim()
200
- .toLocaleLowerCase();
201
- return value.includes(filterValue.trim().toLocaleLowerCase());
202
- });
203
- }
204
- }
205
- else if (selectedFilter.hasOwnProperty('items') &&
206
- arrange === 'equals') {
207
- const selectedItems = group.get('selectItem')?.value;
208
- if (Array.isArray(selectedItems) && selectedItems.length > 0) {
209
- filteredItems = filteredItems.filter((item) => {
210
- return selectedItems.some((selectedItem) => {
211
- const itemValue = item[selectedItem.property];
212
- return itemValue === selectedItem.value;
213
- });
214
- });
215
- }
216
- }
217
- });
218
- return filteredItems;
219
- }
220
- /**
221
- * Constrói o objeto Arrange a partir dos filtros ativos
222
- */
223
- buildArrangeFromFilters(filtersForm, sortBy) {
224
- const activeFilters = filtersForm.controls
225
- .flatMap((control) => {
226
- const group = control;
227
- const selectedFilter = group.get('selectFilter')?.value;
228
- if (!selectedFilter)
229
- return [];
230
- const arrange = selectedFilter.arrange;
231
- if (arrange === 'filter') {
232
- const filterValue = group.get('typeFilter')?.value;
233
- if (!filterValue)
234
- return [];
235
- return {
236
- arrange,
237
- filter: {
238
- property: selectedFilter.property,
239
- filtering: filterValue,
240
- },
241
- dateFilter: undefined,
242
- };
243
- }
244
- if (arrange === 'filterByDate') {
245
- const initial = group.get('initialDate')?.value;
246
- const final = group.get('finalDate')?.value;
247
- if (initial && final) {
248
- try {
249
- const [dayI, monthI, yearI] = initial.split('/');
250
- const initialDate = new Date(`${monthI}/${dayI}/${yearI}`);
251
- const [dayF, monthF, yearF] = final.split('/');
252
- const finalDate = new Date(`${monthF}/${dayF}/${yearF}`);
253
- finalDate.setHours(23, 59, 59);
254
- return {
255
- arrange,
256
- filter: undefined,
257
- dateFilter: {
258
- initial: initialDate,
259
- final: finalDate,
260
- },
261
- };
262
- }
263
- catch (error) {
264
- return [];
265
- }
266
- }
267
- return [];
268
- }
269
- if (selectedFilter.hasOwnProperty('items') && arrange === 'equals') {
270
- const selectedItems = group.get('selectItem')?.value;
271
- if (Array.isArray(selectedItems) && selectedItems.length > 0) {
272
- return selectedItems.map((item) => ({
273
- arrange,
274
- filter: {
275
- property: item.property,
276
- filtering: item.value,
277
- },
278
- dateFilter: undefined,
279
- }));
280
- }
281
- }
282
- return [];
283
- })
284
- .filter((f) => f && (f.filter?.filtering !== undefined || f.dateFilter));
285
- return {
286
- filters: activeFilters,
287
- sortBy: sortBy,
288
- };
289
- }
290
- /**
291
- * Extrai filtros ativos para paginação
292
- */
293
- extractActiveFilters(filtersForm) {
294
- return filtersForm.controls
295
- .flatMap((control) => {
296
- const group = control;
297
- const selectedFilter = group.get('selectFilter')?.value;
298
- if (!selectedFilter)
299
- return [];
300
- const arrange = selectedFilter.arrange;
301
- if (arrange === 'filter') {
302
- const filterValue = group.get('typeFilter')?.value;
303
- if (!filterValue)
304
- return [];
305
- return {
306
- arrange,
307
- filter: {
308
- property: selectedFilter.property,
309
- filtering: filterValue,
310
- },
311
- dateFilter: undefined,
312
- };
313
- }
314
- if (arrange === 'filterByDate') {
315
- const initial = group.get('initialDate')?.value;
316
- const final = group.get('finalDate')?.value;
317
- if (initial && final) {
318
- const [dayI, monthI, yearI] = initial.split('/');
319
- const initialDate = new Date(`${monthI}/${dayI}/${yearI}`);
320
- const [dayF, monthF, yearF] = final.split('/');
321
- const finalDate = new Date(`${monthF}/${dayF}/${yearF}`);
322
- finalDate.setHours(23, 59, 59);
323
- return {
324
- arrange,
325
- filter: undefined,
326
- dateFilter: {
327
- initial: initialDate,
328
- final: finalDate,
329
- },
330
- };
331
- }
332
- return [];
333
- }
334
- if (selectedFilter.hasOwnProperty('items') && arrange === 'equals') {
335
- const selectedItems = group.get('selectItem')?.value;
336
- if (Array.isArray(selectedItems) && selectedItems.length > 0) {
337
- return selectedItems.map((item) => ({
338
- arrange,
339
- filter: {
340
- property: item.property,
341
- filtering: item.value,
342
- },
343
- dateFilter: undefined,
344
- }));
345
- }
346
- }
347
- return [];
348
- })
349
- .filter((f) => f && (f.filter?.filtering !== undefined || f.dateFilter));
350
- }
351
- /**
352
- * Inicializa os dropdownItems baseado nas colunas
353
- */
354
- initializeDropdownItems(displayedColumns) {
355
- const dropdownItems = [];
356
- const sortableDropdownItems = [];
357
- let hasFilterableColumn = false;
358
- let hasSortableColumn = false;
359
- displayedColumns.forEach((col) => {
360
- if (col.isFilterable) {
361
- hasFilterableColumn = true;
362
- dropdownItems.push({
363
- ...col,
364
- arrange: 'filter',
365
- title: col.title,
366
- });
367
- }
368
- if (col.isSortable) {
369
- hasSortableColumn = true;
370
- sortableDropdownItems.push({
371
- ...col,
372
- arrange: 'ascending',
373
- title: col.title + ': crescente',
374
- });
375
- sortableDropdownItems.push({
376
- ...col,
377
- arrange: 'descending',
378
- title: col.title + ': decrescente',
379
- });
380
- }
381
- if (col.isFilterableByDate) {
382
- dropdownItems.push({
383
- ...col,
384
- arrange: 'filterByDate',
385
- title: col.title + ': filtro por data',
386
- });
387
- }
388
- });
389
- return {
390
- dropdownItems,
391
- sortableDropdownItems,
392
- hasFilterableColumn,
393
- hasSortableColumn,
394
- };
395
- }
396
- /**
397
- * Adiciona opções de filtro customizadas
398
- */
399
- addFilterableOptions(dropdownItems, filterableOptions) {
400
- if (filterableOptions &&
401
- Array.isArray(filterableOptions) &&
402
- filterableOptions.length > 0) {
403
- filterableOptions.forEach((option) => dropdownItems.push({ ...option, arrange: 'equals' }));
404
- }
405
- return dropdownItems;
406
- }
407
- }
408
- FilterService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: FilterService, deps: [{ token: i1.TableService }], target: i0.ɵɵFactoryTarget.Injectable });
409
- FilterService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: FilterService, providedIn: 'root' });
410
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: FilterService, decorators: [{
411
- type: Injectable,
412
- args: [{
413
- providedIn: 'root',
414
- }]
415
- }], ctorParameters: function () { return [{ type: i1.TableService }]; } });
416
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsdGVyLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZy1maXJlYmFzZS10YWJsZS1reHAvc3JjL2xpYi9zZXJ2aWNlcy9maWx0ZXIuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNDLE9BQU8sRUFBYSxXQUFXLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7OztBQTBCbkUsTUFBTSxPQUFPLGFBQWE7SUFDeEIsWUFBb0IsWUFBMEI7UUFBMUIsaUJBQVksR0FBWixZQUFZLENBQWM7SUFBRyxDQUFDO0lBRWxEOztPQUVHO0lBQ0gsaUJBQWlCO1FBQ2YsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1FBRTlELE9BQU8sSUFBSSxTQUFTLENBQUM7WUFDbkIsWUFBWSxFQUFFLElBQUksV0FBVyxDQUFDLEVBQUUsQ0FBQztZQUNqQyxVQUFVLEVBQUUsSUFBSSxXQUFXLENBQUMsRUFBRSxDQUFDO1lBQy9CLFVBQVUsRUFBRSxJQUFJLFdBQVcsQ0FBQyxFQUFFLENBQUM7WUFDL0IsV0FBVyxFQUFFLElBQUksV0FBVyxDQUFDLEVBQUUsRUFBRSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1lBQ2pELFNBQVMsRUFBRSxJQUFJLFdBQVcsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxhQUFhLENBQUMsQ0FBQztTQUNoRCxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxTQUFTLENBQ1AsV0FBc0IsRUFDdEIsV0FBb0IsRUFDcEIsVUFBeUI7UUFFekIsSUFDRSxXQUFXO1lBQ1gsSUFBSSxDQUFDLG1CQUFtQixDQUFDLFdBQVcsQ0FBQztZQUNyQyxVQUFVLEVBQUUsWUFBWSxFQUFFLE9BQU8sS0FBSyxjQUFjLEVBQ3BEO1lBQ0EsT0FBTztTQUNSO1FBRUQs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QUssRUFBRSxHQUFHLENBQUMsS0FBSyxHQUFHLGVBQWU7aUJBQ25DLENBQUMsQ0FBQzthQUNKO1lBQ0QsSUFBSSxHQUFHLENBQUMsa0JBQWtCLEVBQUU7Z0JBQzFCLGFBQWEsQ0FBQyxJQUFJLENBQUM7b0JBQ2pCLEdBQUcsR0FBRztvQkFDTixPQUFPLEVBQUUsY0FBYztvQkFDdkIsS0FBSyxFQUFFLEdBQUcsQ0FBQyxLQUFLLEdBQUcsbUJBQW1CO2lCQUN2QyxDQUFDLENBQUM7YUFDSjtRQUNILENBQUMsQ0FBQyxDQUFDO1FBRUgsT0FBTztZQUNMLGFBQWE7WUFDYixxQkFBcUI7WUFDckIsbUJBQW1CO1lBQ25CLGlCQUFpQjtTQUNsQixDQUFDO0lBQ0osQ0FBQztJQUVEOztPQUVHO0lBQ0gsb0JBQW9CLENBQUMsYUFBb0IsRUFBRSxpQkFBd0I7UUFDakUsSUFDRSxpQkFBaUI7WUFDakIsS0FBSyxDQUFDLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQztZQUNoQyxpQkFBaUIsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUM1QjtZQUNBLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQ25DLGFBQWEsQ0FBQyxJQUFJLENBQUMsRUFBRSxHQUFHLE1BQU0sRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FDckQsQ0FBQztTQUNIO1FBQ0QsT0FBTyxhQUFhLENBQUM7SUFDdkIsQ0FBQzs7MkdBdmRVLGFBQWE7K0dBQWIsYUFBYSxjQUZaLE1BQU07NEZBRVAsYUFBYTtrQkFIekIsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEZvcm1BcnJheSwgRm9ybUNvbnRyb2wsIEZvcm1Hcm91cCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuaW1wb3J0IHsgQXJyYW5nZSwgQ29sdW1uLCBUQUJMRV9ERUZBVUxUUyB9IGZyb20gJy4uL3R5cGVzL1RhYmxlJztcclxuaW1wb3J0IHsgVGFibGVTZXJ2aWNlIH0gZnJvbSAnLi90YWJsZS5zZXJ2aWNlJztcclxuaW1wb3J0IHsgT3JkZXJCeURpcmVjdGlvbiB9IGZyb20gJ2ZpcmViYXNlL2ZpcmVzdG9yZSc7XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIEZpbHRlckNvbmZpZyB7XHJcbiAgc2VsZWN0RmlsdGVyOiBhbnk7XHJcbiAgdHlwZUZpbHRlcj86IHN0cmluZztcclxuICBzZWxlY3RJdGVtPzogYW55W107XHJcbiAgaW5pdGlhbERhdGU/OiBzdHJpbmc7XHJcbiAgZmluYWxEYXRlPzogc3RyaW5nO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIERhdGVGaWx0ZXJzQnlQcm9wZXJ0eSB7XHJcbiAgW3Byb3BlcnR5OiBzdHJpbmddOiBBcnJheTx7IGluaXRpYWw6IERhdGU7IGZpbmFsOiBEYXRlIH0+O1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIFByb2Nlc3NlZEZpbHRlciB7XHJcbiAgZ3JvdXA6IEZvcm1Hcm91cDtcclxuICBzZWxlY3RlZEZpbHRlcjogYW55O1xyXG4gIGFycmFuZ2U6IHN0cmluZztcclxufVxyXG5cclxuQEluamVjdGFibGUoe1xyXG4gIHByb3ZpZGVkSW46ICdyb290JyxcclxufSlcclxuZXhwb3J0IGNsYXNzIEZpbHRlclNlcnZpY2Uge1xyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgdGFibGVTZXJ2aWNlOiBUYWJsZVNlcnZpY2UpIHt9XHJcblxyXG4gIC8qKlxyXG4gICAqIENyaWEgdW0gbm92byBGb3JtR3JvdXAgcGFyYSB1bSBmaWx0cm9cclxuICAgKi9cclxuICBjcmVhdGVGaWx0ZXJHcm91cCgpOiBGb3JtR3JvdXAge1xyXG4gICAgY29uc3QgZGF0ZVZhbGlkYXRvciA9IHRoaXMudGFibGVTZXJ2aWNlLmRhdGVGb3JtYXRWYWxpZGF0b3IoKTtcclxuXHJcbiAgICByZXR1cm4gbmV3IEZvcm1Hcm91cCh7XHJcbiAgICAgIHNlbGVjdEZpbHRlcjogbmV3IEZvcm1Db250cm9sKCcnKSxcclxuICAgICAgdHlwZUZpbHRlcjogbmV3IEZvcm1Db250cm9sKCcnKSxcclxuICAgICAgc2VsZWN0SXRlbTogbmV3IEZvcm1Db250cm9sKCcnKSxcclxuICAgICAgaW5pdGlhbERhdGU6IG5ldyBGb3JtQ29udHJvbCgnJywgW2RhdGVWYWxpZGF0b3JdKSxcclxuICAgICAgZmluYWxEYXRlOiBuZXcgRm9ybUNvbnRyb2woJycsIFtkYXRlVmFsaWRhdG9yXSksXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEFkaWNpb25hIHVtIG5vdm8gZmlsdHJvIGFvIEZvcm1BcnJheVxyXG4gICAqL1xyXG4gIGFkZEZpbHRlcihcclxuICAgIGZpbHRlcnNGb3JtOiBGb3JtQXJyYXksXHJcbiAgICBpc1BhZ2luYXRlZDogYm9vbGVhbixcclxuICAgIGZpbHRlckRhdGE/OiBGaWx0ZXJDb25maWdcclxuICApOiB2b2lkIHtcclxuICAgIGlmIChcclxuICAgICAgaXNQYWdpbmF0ZWQgJiZcclxuICAgICAgdGhpcy5oYXNBY3RpdmVEYXRlRmlsdGVyKGZpbHRlcnNGb3JtKSAmJlxyXG4gICAgICBmaWx0ZXJEYXRhPy5zZWxlY3RGaWx0ZXI/LmFycmFuZ2UgPT09ICdmaWx0ZXJCeURhdGUnXHJcbiAgICApIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IG5ld0ZpbHRlckdyb3VwID0gdGhpcy5jcmVhdGVGaWx0ZXJHcm91cCgpO1xyXG5cclxuICAgIGlmIChmaWx0ZXJEYXRhKSB7XHJcbiAgICAgIGlmIChmaWx0ZXJEYXRhLnNlbGVjdEZpbHRlcikge1xyXG4gICAgICAgIG5ld0ZpbHRlckdyb3VwLmdldCgnc2VsZWN0RmlsdGVyJyk/LnNldFZhbHVlKGZpbHRlckRhdGEuc2VsZWN0RmlsdGVyKTtcclxuICAgICAgfVxyXG4gICAgICBpZiAoZmlsdGVyRGF0YS50eXBlRmlsdGVyKSB7XHJcbiAgICAgICAgbmV3RmlsdGVyR3JvdXAuZ2V0KCd0eXBlRmlsdGVyJyk/LnNldFZhbHVlKGZpbHRlckRhdGEudHlwZUZpbHRlcik7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKGZpbHRlckRhdGEuc2VsZWN0SXRlbSkge1xyXG4gICAgICAgIG5ld0ZpbHRlckdyb3VwLmdldCgnc2VsZWN0SXRlbScpPy5zZXRWYWx1ZShmaWx0ZXJEYXRhLnNlbGVjdEl0ZW0pO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChmaWx0ZXJEYXRhLmluaXRpYWxEYXRlKSB7XHJcbiAgICAgICAgbmV3RmlsdGVyR3JvdXAuZ2V0KCdpbml0aWFsRGF0ZScpPy5zZXRWYWx1ZShmaWx0ZXJEYXRhLmluaXRpYWxEYXRlKTtcclxuICAgICAgfVxyXG4gICAgICBpZiAoZmlsdGVyRGF0YS5maW5hbERhdGUpIHtcclxuICAgICAgICBuZXdGaWx0ZXJHcm91cC5nZXQoJ2ZpbmFsRGF0ZScpPy5zZXRWYWx1ZShmaWx0ZXJEYXRhLmZpbmFsRGF0ZSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBmaWx0ZXJzRm9ybS5wdXNoKG5ld0ZpbHRlckdyb3VwKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFZlcmlmaWNhIHNlIGjDoSB1bSBmaWx0cm8gZGUgZGF0YSBhdGl2b1xyXG4gICAqL1xyXG4gIGhhc0FjdGl2ZURhdGVGaWx0ZXIoZmlsdGVyc0Zvcm06IEZvcm1BcnJheSk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIGZpbHRlcnNGb3JtLmNvbnRyb2xzLnNvbWUoKGNvbnRyb2wpID0+IHtcclxuICAgICAgY29uc3QgZ3JvdXAgPSBjb250cm9sIGFzIEZvcm1Hcm91cDtcclxuICAgICAgY29uc3Qgc2VsZWN0ZWRGaWx0ZXIgPSBncm91cC5nZXQoJ3NlbGVjdEZpbHRlcicpPy52YWx1ZTtcclxuICAgICAgcmV0dXJuIHNlbGVjdGVkRmlsdGVyPy5hcnJhbmdlID09PSAnZmlsdGVyQnlEYXRlJztcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmV0b3JuYSBhcyBvcMOnw7VlcyBkZSBmaWx0cm8gZGlzcG9uw612ZWlzXHJcbiAgICovXHJcbiAgZ2V0QXZhaWxhYmxlRmlsdGVyT3B0aW9ucyhcclxuICAgIGRyb3Bkb3duSXRlbXM6IGFueVtdLFxyXG4gICAgaXNQYWdpbmF0ZWQ6IGJvb2xlYW4sXHJcbiAgICBmaWx0ZXJzRm9ybTogRm9ybUFycmF5XHJcbiAgKTogYW55W10ge1xyXG4gICAgaWYgKGlzUGFnaW5hdGVkICYmIHRoaXMuaGFzQWN0aXZlRGF0ZUZpbHRlcihmaWx0ZXJzRm9ybSkpIHtcclxuICAgICAgcmV0dXJuIGRyb3Bkb3duSXRlbXMuZmlsdGVyKChpdGVtKSA9PiBpdGVtLmFycmFuZ2UgIT09ICdmaWx0ZXJCeURhdGUnKTtcclxuICAgIH1cclxuICAgIHJldHVybiBkcm9wZG93bkl0ZW1zO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmVtb3ZlIHVtIGZpbHRybyBkbyBGb3JtQXJyYXlcclxuICAgKi9cclxuICByZW1vdmVGaWx0ZXIoZmlsdGVyc0Zvcm06IEZvcm1BcnJheSwgaW5kZXg6IG51bWJlcik6IHZvaWQge1xyXG4gICAgZmlsdGVyc0Zvcm0ucmVtb3ZlQXQoaW5kZXgpO1xyXG4gICAgaWYgKGZpbHRlcnNGb3JtLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICB0aGlzLmFkZEZpbHRlcihmaWx0ZXJzRm9ybSwgZmFsc2UpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmVtb3ZlIHRvZG9zIG9zIGZpbHRyb3MgZG8gRm9ybUFycmF5XHJcbiAgICovXHJcbiAgcmVtb3ZlQWxsRmlsdGVycyhmaWx0ZXJzRm9ybTogRm9ybUFycmF5KTogdm9pZCB7XHJcbiAgICBmaWx0ZXJzRm9ybS5jbGVhcigpO1xyXG4gICAgdGhpcy5hZGRGaWx0ZXIoZmlsdGVyc0Zvcm0sIGZhbHNlKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEFwbGljYSBtw6FzY2FyYSBkZSBkYXRhIChERC9NTS9BQUFBKVxyXG4gICAqL1xyXG4gIGFwcGx5RGF0ZU1hc2soXHJcbiAgICBldmVudDogYW55LFxyXG4gICAgY29udHJvbE5hbWU6ICdpbml0aWFsRGF0ZScgfCAnZmluYWxEYXRlJyxcclxuICAgIGZpbHRlckdyb3VwOiBGb3JtR3JvdXBcclxuICApOiB2b2lkIHtcclxuICAgIGNvbnN0IGlucHV0ID0gZXZlbnQudGFyZ2V0O1xyXG4gICAgbGV0IHZhbHVlID0gaW5wdXQudmFsdWUucmVwbGFjZSgvXFxEL2csICcnKTtcclxuXHJcbiAgICBpZiAodmFsdWUubGVuZ3RoID4gOCkge1xyXG4gICAgICB2YWx1ZSA9IHZhbHVlLnNsaWNlKDAsIDgpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh2YWx1ZS5sZW5ndGggPD0gMikge1xyXG4gICAgICAvLyBtYW50w6ltIGNvbW8gZXN0w6FcclxuICAgIH0gZWxzZSBpZiAodmFsdWUubGVuZ3RoIDw9IDQpIHtcclxuICAgICAgdmFsdWUgPSB2YWx1ZS5zbGljZSgwLCAyKSArICcvJyArIHZhbHVlLnNsaWNlKDIpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdmFsdWUgPVxyXG4gICAgICAgIHZhbHVlLnNsaWNlKDAsIDIpICsgJy8nICsgdmFsdWUuc2xpY2UoMiwgNCkgKyAnLycgKyB2YWx1ZS5zbGljZSg0LCA4KTtcclxuICAgIH1cclxuXHJcbiAgICBmaWx0ZXJHcm91cC5nZXQoY29udHJvbE5hbWUpPy5zZXRWYWx1ZSh2YWx1ZSwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQXBsaWNhIGZpbHRyb3MgY2xpZW50LXNpZGUgYW9zIGl0ZW5zXHJcbiAgICovXHJcbiAgYXBwbHlDbGllbnRTaWRlRmlsdGVyczxUID0gYW55PihcclxuICAgIGl0ZW1zOiBUW10sXHJcbiAgICBmaWx0ZXJzRm9ybTogRm9ybUFycmF5LFxyXG4gICAgc29ydEJ5OiB7IGZpZWxkOiBzdHJpbmc7IG9yZGVyOiBPcmRlckJ5RGlyZWN0aW9uIH1cclxuICApOiBUW10ge1xyXG4gICAgbGV0IGZpbHRlcmVkSXRlbXMgPSBbLi4uaXRlbXNdO1xyXG5cclxuICAgIGNvbnN0IGRhdGVGaWx0ZXJzQnlQcm9wZXJ0eTogRGF0ZUZpbHRlcnNCeVByb3BlcnR5ID0ge307XHJcbiAgICBjb25zdCBvdGhlckZpbHRlcnM6IFByb2Nlc3NlZEZpbHRlcltdID0gW107XHJcblxyXG4gICAgZmlsdGVyc0Zvcm0uY29udHJvbHMuZm9yRWFjaCgoY29udHJvbCkgPT4ge1xyXG4gICAgICBjb25zdCBncm91cCA9IGNvbnRyb2wgYXMgRm9ybUdyb3VwO1xyXG4gICAgICBjb25zdCBzZWxlY3RlZEZpbHRlciA9IGdyb3VwLmdldCgnc2VsZWN0RmlsdGVyJyk/LnZhbHVlO1xyXG4gICAgICBpZiAoIXNlbGVjdGVkRmlsdGVyKSByZXR1cm47XHJcblxyXG4gICAgICBjb25zdCBhcnJhbmdlID0gc2VsZWN0ZWRGaWx0ZXIuYXJyYW5nZTtcclxuXHJcbiAgICAgIGlmIChhcnJhbmdlID09PSAnZmlsdGVyQnlEYXRlJykge1xyXG4gICAgICAgIGNvbnN0IGluaXRpYWwgPSBncm91cC5nZXQoJ2luaXRpYWxEYXRlJyk/LnZhbHVlO1xyXG4gICAgICAgIGNvbnN0IGZpbmFsID0gZ3JvdXAuZ2V0KCdmaW5hbERhdGUnKT8udmFsdWU7XHJcblxyXG4gICAgICAgIGlmIChpbml0aWFsICYmIGZpbmFsICYmIGluaXRpYWwudHJpbSgpICYmIGZpbmFsLnRyaW0oKSkge1xyXG4gICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgY29uc3QgZGF0ZVBhdHRlcm4gPSAvXihcXGR7MSwyfSlcXC8oXFxkezEsMn0pXFwvKFxcZHs0fSkkLztcclxuICAgICAgICAgICAgaWYgKCFkYXRlUGF0dGVybi50ZXN0KGluaXRpYWwpIHx8ICFkYXRlUGF0dGVybi50ZXN0KGZpbmFsKSkge1xyXG4gICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgY29uc3QgW2RheUksIG1vbnRoSSwgeWVhckldID0gaW5pdGlhbC5zcGxpdCgnLycpO1xyXG4gICAgICAgICAgICBjb25zdCBpbml0aWFsRGF0ZSA9IG5ldyBEYXRlKGAke21vbnRoSX0vJHtkYXlJfS8ke3llYXJJfWApO1xyXG4gICAgICAgICAgICBjb25zdCBbZGF5RiwgbW9udGhGLCB5ZWFyRl0gPSBmaW5hbC5zcGxpdCgnLycpO1xyXG4gICAgICAgICAgICBjb25zdCBmaW5hbERhdGUgPSBuZXcgRGF0ZShgJHttb250aEZ9LyR7ZGF5Rn0vJHt5ZWFyRn1gKTtcclxuICAgICAgICAgICAgZmluYWxEYXRlLnNldEhvdXJzKDIzLCA1OSwgNTkpO1xyXG5cclxuICAgICAgICAgICAgaWYgKGlzTmFOKGluaXRpYWxEYXRlLmdldFRpbWUoKSkgfHwgaXNOYU4oZmluYWxEYXRlLmdldFRpbWUoKSkpIHtcclxuICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGNvbnN0IGRhdGVGaWVsZCA9IHNlbGVjdGVkRmlsdGVyLnByb3BlcnR5IHx8IHNvcnRCeS5maWVsZDtcclxuXHJcbiAgICAgICAgICAgIGlmICghZGF0ZUZpbHRlcnNCeVByb3BlcnR5W2RhdGVGaWVsZF0pIHtcclxuICAgICAgICAgICAgICBkYXRlRmlsdGVyc0J5UHJvcGVydHlbZGF0ZUZpZWxkXSA9IFtdO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBkYXRlRmlsdGVyc0J5UHJvcGVydHlbZGF0ZUZpZWxkXS5wdXNoKHtcclxuICAgICAgICAgICAgICBpbml0aWFsOiBpbml0aWFsRGF0ZSxcclxuICAgICAgICAgICAgICBmaW5hbDogZmluYWxEYXRlLFxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUud2FybignRXJybyBhbyBwcm9jZXNzYXIgZGF0YXMgZG8gZmlsdHJvOicsIGVycm9yKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgb3RoZXJGaWx0ZXJzLnB1c2goeyBncm91cCwgc2VsZWN0ZWRGaWx0ZXIsIGFycmFuZ2UgfSk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIC8vIEFwbGljYXIgZmlsdHJvcyBkZSBkYXRhXHJcbiAgICBPYmplY3Qua2V5cyhkYXRlRmlsdGVyc0J5UHJvcGVydHkpLmZvckVhY2goKGRhdGVGaWVsZCkgPT4ge1xyXG4gICAgICBjb25zdCBpbnRlcnZhbHMgPSBkYXRlRmlsdGVyc0J5UHJvcGVydHlbZGF0ZUZpZWxkXTtcclxuXHJcbiAgICAgIGZpbHRlcmVkSXRlbXMgPSBmaWx0ZXJlZEl0ZW1zLmZpbHRlcigoaXRlbTogYW55KSA9PiB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgIGNvbnN0IGZpZWxkVmFsdWUgPSBpdGVtW2RhdGVGaWVsZF07XHJcblxyXG4gICAgICAgICAgaWYgKCFmaWVsZFZhbHVlKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBsZXQgaXRlbURhdGU6IERhdGU7XHJcbiAgICAgICAgICBpZiAodHlwZW9mIGZpZWxkVmFsdWUudG9EYXRlID09PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgICAgICAgIGl0ZW1EYXRlID0gZmllbGRWYWx1ZS50b0RhdGUoKTtcclxuICAgICAgICAgIH0gZWxzZSBpZiAoZmllbGRWYWx1ZSBpbnN0YW5jZW9mIERhdGUpIHtcclxuICAgICAgICAgICAgaXRlbURhdGUgPSBmaWVsZFZhbHVlO1xyXG4gICAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgZmllbGRWYWx1ZSA9PT0gJ3N0cmluZycpIHtcclxuICAgICAgICAgICAgaXRlbURhdGUgPSBuZXcgRGF0ZShmaWVsZFZhbHVlKTtcclxuICAgICAgICAgICAgaWYgKGlzTmFOKGl0ZW1EYXRlLmdldFRpbWUoKSkpIHtcclxuICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGZpZWxkVmFsdWUgPT09ICdudW1iZXInKSB7XHJcbiAgICAgICAgICAgIGl0ZW1EYXRlID0gbmV3IERhdGUoZmllbGRWYWx1ZSk7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgcmV0dXJuIGludGVydmFscy5zb21lKFxyXG4gICAgICAgICAgICAoaW50ZXJ2YWwpID0+XHJcbiAgICAgICAgICAgICAgaXRlbURhdGUgPj0gaW50ZXJ2YWwuaW5pdGlhbCAmJiBpdGVtRGF0ZSA8PSBpbnRlcnZhbC5maW5hbFxyXG4gICAgICAgICAgKTtcclxuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICAgICAgY29uc29sZS53YXJuKFxyXG4gICAgICAgICAgICAnRXJybyBhbyBwcm9jZXNzYXIgZmlsdHJvIGRlIGRhdGEgcGFyYSBvIGl0ZW06JyxcclxuICAgICAgICAgICAgaXRlbS5pZCxcclxuICAgICAgICAgICAgZXJyb3JcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG5cclxuICAgIC8vIEFwbGljYXIgb3V0cm9zIGZpbHRyb3NcclxuICAgIG90aGVyRmlsdGVycy5mb3JFYWNoKCh7IGdyb3VwLCBzZWxlY3RlZEZpbHRlciwgYXJyYW5nZSB9KSA9PiB7XHJcbiAgICAgIGlmIChhcnJhbmdlID09PSAnZmlsdGVyJykge1xyXG4gICAgICAgIGNvbnN0IGZpbHRlclZhbHVlID0gZ3JvdXAuZ2V0KCd0eXBlRmlsdGVyJyk/LnZhbHVlO1xyXG4gICAgICAgIGlmIChmaWx0ZXJWYWx1ZSAmJiBmaWx0ZXJWYWx1ZS50cmltKCkpIHtcclxuICAgICAgICAgIGNvbnN0IHByb3BlcnR5ID0gc2VsZWN0ZWRGaWx0ZXIucHJvcGVydHk7XHJcbiAgICAgICAgICBmaWx0ZXJlZEl0ZW1zID0gZmlsdGVyZWRJdGVtcy5maWx0ZXIoKGl0ZW06IGFueSkgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IFN0cmluZyhpdGVtW3Byb3BlcnR5XSB8fCAnJylcclxuICAgICAgICAgICAgICAudHJpbSgpXHJcbiAgICAgICAgICAgICAgLnRvTG9jYWxlTG93ZXJDYXNlKCk7XHJcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZS5pbmNsdWRlcyhmaWx0ZXJWYWx1ZS50cmltKCkudG9Mb2NhbGVMb3dlckNhc2UoKSk7XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgIH0gZWxzZSBpZiAoXHJcbiAgICAgICAgc2VsZWN0ZWRGaWx0ZXIuaGFzT3duUHJvcGVydHkoJ2l0ZW1zJykgJiZcclxuICAgICAgICBhcnJhbmdlID09PSAnZXF1YWxzJ1xyXG4gICAgICApIHtcclxuICAgICAgICBjb25zdCBzZWxlY3RlZEl0ZW1zID0gZ3JvdXAuZ2V0KCdzZWxlY3RJdGVtJyk/LnZhbHVlO1xyXG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHNlbGVjdGVkSXRlbXMpICYmIHNlbGVjdGVkSXRlbXMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgZmlsdGVyZWRJdGVtcyA9IGZpbHRlcmVkSXRlbXMuZmlsdGVyKChpdGVtOiBhbnkpID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuIHNlbGVjdGVkSXRlbXMuc29tZSgoc2VsZWN0ZWRJdGVtOiBhbnkpID0+IHtcclxuICAgICAgICAgICAgICBjb25zdCBpdGVtVmFsdWUgPSBpdGVtW3NlbGVjdGVkSXRlbS5wcm9wZXJ0eV07XHJcbiAgICAgICAgICAgICAgcmV0dXJuIGl0ZW1WYWx1ZSA9PT0gc2VsZWN0ZWRJdGVtLnZhbHVlO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgcmV0dXJuIGZpbHRlcmVkSXRlbXM7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDb25zdHLDs2kgbyBvYmpldG8gQXJyYW5nZSBhIHBhcnRpciBkb3MgZmlsdHJvcyBhdGl2b3NcclxuICAgKi9cclxuICBidWlsZEFycmFuZ2VGcm9tRmlsdGVycyhcclxuICAgIGZpbHRlcnNGb3JtOiBGb3JtQXJyYXksXHJcbiAgICBzb3J0Qnk6IHsgZmllbGQ6IHN0cmluZzsgb3JkZXI6IE9yZGVyQnlEaXJlY3Rpb24gfVxyXG4gICk6IEFycmFuZ2Uge1xyXG4gICAgY29uc3QgYWN0aXZlRmlsdGVycyA9IGZpbHRlcnNGb3JtLmNvbnRyb2xzXHJcbiAgICAgIC5mbGF0TWFwKChjb250cm9sKSA9PiB7XHJcbiAgICAgICAgY29uc3QgZ3JvdXAgPSBjb250cm9sIGFzIEZvcm1Hcm91cDtcclxuICAgICAgICBjb25zdCBzZWxlY3RlZEZpbHRlciA9IGdyb3VwLmdldCgnc2VsZWN0RmlsdGVyJyk/LnZhbHVlO1xyXG4gICAgICAgIGlmICghc2VsZWN0ZWRGaWx0ZXIpIHJldHVybiBbXTtcclxuXHJcbiAgICAgICAgY29uc3QgYXJyYW5nZSA9IHNlbGVjdGVkRmlsdGVyLmFycmFuZ2U7XHJcblxyXG4gICAgICAgIGlmIChhcnJhbmdlID09PSAnZmlsdGVyJykge1xyXG4gICAgICAgICAgY29uc3QgZmlsdGVyVmFsdWUgPSBncm91cC5nZXQoJ3R5cGVGaWx0ZXInKT8udmFsdWU7XHJcbiAgICAgICAgICBpZiAoIWZpbHRlclZhbHVlKSByZXR1cm4gW107XHJcbiAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICBhcnJhbmdlLFxyXG4gICAgICAgICAgICBmaWx0ZXI6IHtcclxuICAgICAgICAgICAgICBwcm9wZXJ0eTogc2VsZWN0ZWRGaWx0ZXIucHJvcGVydHksXHJcbiAgICAgICAgICAgICAgZmlsdGVyaW5nOiBmaWx0ZXJWYWx1ZSxcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgZGF0ZUZpbHRlcjogdW5kZWZpbmVkLFxyXG4gICAgICAgICAgfTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChhcnJhbmdlID09PSAnZmlsdGVyQnlEYXRlJykge1xyXG4gICAgICAgICAgY29uc3QgaW5pdGlhbCA9IGdyb3VwLmdldCgnaW5pdGlhbERhdGUnKT8udmFsdWU7XHJcbiAgICAgICAgICBjb25zdCBmaW5hbCA9IGdyb3VwLmdldCgnZmluYWxEYXRlJyk/LnZhbHVlO1xyXG4gICAgICAgICAgaWYgKGluaXRpYWwgJiYgZmluYWwpIHtcclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICBjb25zdCBbZGF5SSwgbW9udGhJLCB5ZWFySV0gPSBpbml0aWFsLnNwbGl0KCcvJyk7XHJcbiAgICAgICAgICAgICAgY29uc3QgaW5pdGlhbERhdGUgPSBuZXcgRGF0ZShgJHttb250aEl9LyR7ZGF5SX0vJHt5ZWFySX1gKTtcclxuICAgICAgICAgICAgICBjb25zdCBbZGF5RiwgbW9udGhGLCB5ZWFyRl0gPSBmaW5hbC5zcGxpdCgnLycpO1xyXG4gICAgICAgICAgICAgIGNvbnN0IGZpbmFsRGF0ZSA9IG5ldyBEYXRlKGAke21vbnRoRn0vJHtkYXlGfS8ke3llYXJGfWApO1xyXG4gICAgICAgICAgICAgIGZpbmFsRGF0ZS5zZXRIb3VycygyMywgNTksIDU5KTtcclxuICAgICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgYXJyYW5nZSxcclxuICAgICAgICAgICAgICAgIGZpbHRlcjogdW5kZWZpbmVkLFxyXG4gICAgICAgICAgICAgICAgZGF0ZUZpbHRlcjoge1xyXG4gICAgICAgICAgICAgICAgICBpbml0aWFsOiBpbml0aWFsRGF0ZSxcclxuICAgICAgICAgICAgICAgICAgZmluYWw6IGZpbmFsRGF0ZSxcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgICAgICAgICByZXR1cm4gW107XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHJldHVybiBbXTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChzZWxlY3RlZEZpbHRlci5oYXNPd25Qcm9wZXJ0eSgnaXRlbXMnKSAmJiBhcnJhbmdlID09PSAnZXF1YWxzJykge1xyXG4gICAgICAgICAgY29uc3Qgc2VsZWN0ZWRJdGVtcyA9IGdyb3VwLmdldCgnc2VsZWN0SXRlbScpPy52YWx1ZTtcclxuICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHNlbGVjdGVkSXRlbXMpICYmIHNlbGVjdGVkSXRlbXMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICByZXR1cm4gc2VsZWN0ZWRJdGVtcy5tYXAoKGl0ZW0pID0+ICh7XHJcbiAgICAgICAgICAgICAgYXJyYW5nZSxcclxuICAgICAgICAgICAgICBmaWx0ZXI6IHtcclxuICAgICAgICAgICAgICAgIHByb3BlcnR5OiBpdGVtLnByb3BlcnR5LFxyXG4gICAgICAgICAgICAgICAgZmlsdGVyaW5nOiBpdGVtLnZhbHVlLFxyXG4gICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgZGF0ZUZpbHRlcjogdW5kZWZpbmVkLFxyXG4gICAgICAgICAgICB9KSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gW107XHJcbiAgICAgIH0pXHJcbiAgICAgIC5maWx0ZXIoKGYpID0+IGYgJiYgKGYuZmlsdGVyPy5maWx0ZXJpbmcgIT09IHVuZGVmaW5lZCB8fCBmLmRhdGVGaWx0ZXIpKTtcclxuXHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBmaWx0ZXJzOiBhY3RpdmVGaWx0ZXJzLFxyXG4gICAgICBzb3J0Qnk6IHNvcnRCeSxcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBFeHRyYWkgZmlsdHJvcyBhdGl2b3MgcGFyYSBwYWdpbmHDp8Ojb1xyXG4gICAqL1xyXG4gIGV4dHJhY3RBY3RpdmVGaWx0ZXJzKGZpbHRlcnNGb3JtOiBGb3JtQXJyYXkpOiBhbnlbXSB7XHJcbiAgICByZXR1cm4gZmlsdGVyc0Zvcm0uY29udHJvbHNcclxuICAgICAgLmZsYXRNYXAoKGNvbnRyb2wpID0+IHtcclxuICAgICAgICBjb25zdCBncm91cCA9IGNvbnRyb2wgYXMgRm9ybUdyb3VwO1xyXG4gICAgICAgIGNvbnN0IHNlbGVjdGVkRmlsdGVyID0gZ3JvdXAuZ2V0KCdzZWxlY3RGaWx0ZXInKT8udmFsdWU7XHJcbiAgICAgICAgaWYgKCFzZWxlY3RlZEZpbHRlcikgcmV0dXJuIFtdO1xyXG5cclxuICAgICAgICBjb25zdCBhcnJhbmdlID0gc2VsZWN0ZWRGaWx0ZXIuYXJyYW5nZTtcclxuXHJcbiAgICAgICAgaWYgKGFycmFuZ2UgPT09ICdmaWx0ZXInKSB7XHJcbiAgICAgICAgICBjb25zdCBmaWx0ZXJWYWx1ZSA9IGdyb3VwLmdldCgndHlwZUZpbHRlcicpPy52YWx1ZTtcclxuICAgICAgICAgIGlmICghZmlsdGVyVmFsdWUpIHJldHVybiBbXTtcclxuICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIGFycmFuZ2UsXHJcbiAgICAgICAgICAgIGZpbHRlcjoge1xyXG4gICAgICAgICAgICAgIHByb3BlcnR5OiBzZWxlY3RlZEZpbHRlci5wcm9wZXJ0eSxcclxuICAgICAgICAgICAgICBmaWx0ZXJpbmc6IGZpbHRlclZhbHVlLFxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBkYXRlRmlsdGVyOiB1bmRlZmluZWQsXHJcbiAgICAgICAgICB9O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGFycmFuZ2UgPT09ICdmaWx0ZXJCeURhdGUnKSB7XHJcbiAgICAgICAgICBjb25zdCBpbml0aWFsID0gZ3JvdXAuZ2V0KCdpbml0aWFsRGF0ZScpPy52YWx1ZTtcclxuICAgICAgICAgIGNvbnN0IGZpbmFsID0gZ3JvdXAuZ2V0KCdmaW5hbERhdGUnKT8udmFsdWU7XHJcbiAgICAgICAgICBpZiAoaW5pdGlhbCAmJiBmaW5hbCkge1xyXG4gICAgICAgICAgICBjb25zdCBbZGF5SSwgbW9udGhJLCB5ZWFySV0gPSBpbml0aWFsLnNwbGl0KCcvJyk7XHJcbiAgICAgICAgICAgIGNvbnN0IGluaXRpYWxEYXRlID0gbmV3IERhdGUoYCR7bW9udGhJfS8ke2RheUl9LyR7eWVhckl9YCk7XHJcbiAgICAgICAgICAgIGNvbnN0IFtkYXlGLCBtb250aEYsIHllYXJGXSA9IGZpbmFsLnNwbGl0KCcvJyk7XHJcbiAgICAgICAgICAgIGNvbnN0IGZpbmFsRGF0ZSA9IG5ldyBEYXRlKGAke21vbnRoRn0vJHtkYXlGfS8ke3llYXJGfWApO1xyXG4gICAgICAgICAgICBmaW5hbERhdGUuc2V0SG91cnMoMjMsIDU5LCA1OSk7XHJcbiAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgYXJyYW5nZSxcclxuICAgICAgICAgICAgICBmaWx0ZXI6IHVuZGVmaW5lZCxcclxuICAgICAgICAgICAgICBkYXRlRmlsdGVyOiB7XHJcbiAgICAgICAgICAgICAgICBpbml0aWFsOiBpbml0aWFsRGF0ZSxcclxuICAgICAgICAgICAgICAgIGZpbmFsOiBmaW5hbERhdGUsXHJcbiAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHJldHVybiBbXTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChzZWxlY3RlZEZpbHRlci5oYXNPd25Qcm9wZXJ0eSgnaXRlbXMnKSAmJiBhcnJhbmdlID09PSAnZXF1YWxzJykge1xyXG4gICAgICAgICAgY29uc3Qgc2VsZWN0ZWRJdGVtcyA9IGdyb3VwLmdldCgnc2VsZWN0SXRlbScpPy52YWx1ZTtcclxuICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHNlbGVjdGVkSXRlbXMpICYmIHNlbGVjdGVkSXRlbXMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICByZXR1cm4gc2VsZWN0ZWRJdGVtcy5tYXAoKGl0ZW0pID0+ICh7XHJcbiAgICAgICAgICAgICAgYXJyYW5nZSxcclxuICAgICAgICAgICAgICBmaWx0ZXI6IHtcclxuICAgICAgICAgICAgICAgIHByb3BlcnR5OiBpdGVtLnByb3BlcnR5LFxyXG4gICAgICAgICAgICAgICAgZmlsdGVyaW5nOiBpdGVtLnZhbHVlLFxyXG4gICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgZGF0ZUZpbHRlcjogdW5kZWZpbmVkLFxyXG4gICAgICAgICAgICB9KSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gW107XHJcbiAgICAgIH0pXHJcbiAgICAgIC5maWx0ZXIoKGYpID0+IGYgJiYgKGYuZmlsdGVyPy5maWx0ZXJpbmcgIT09IHVuZGVmaW5lZCB8fCBmLmRhdGVGaWx0ZXIpKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEluaWNpYWxpemEgb3MgZHJvcGRvd25JdGVtcyBiYXNlYWRvIG5hcyBjb2x1bmFzXHJcbiAgICovXHJcbiAgaW5pdGlhbGl6ZURyb3Bkb3duSXRlbXMoZGlzcGxheWVkQ29sdW1uczogQ29sdW1uW10pOiB7XHJcbiAgICBkcm9wZG93bkl0ZW1zOiBhbnlbXTtcclxuICAgIHNvcnRhYmxlRHJvcGRvd25JdGVtczogYW55W107XHJcbiAgICBoYXNGaWx0ZXJhYmxlQ29sdW1uOiBib29sZWFuO1xyXG4gICAgaGFzU29ydGFibGVDb2x1bW46IGJvb2xlYW47XHJcbiAgfSB7XHJcbiAgICBjb25zdCBkcm9wZG93bkl0ZW1zOiBhbnlbXSA9IFtdO1xyXG4gICAgY29uc3Qgc29ydGFibGVEcm9wZG93bkl0ZW1zOiBhbnlbXSA9IFtdO1xyXG4gICAgbGV0IGhhc0ZpbHRlcmFibGVDb2x1bW4gPSBmYWxzZTtcclxuICAgIGxldCBoYXNTb3J0YWJsZUNvbHVtbiA9IGZhbHNlO1xyXG5cclxuICAgIGRpc3BsYXllZENvbHVtbnMuZm9yRWFjaCgoY29sKSA9PiB7XHJcbiAgICAgIGlmIChjb2wuaXNGaWx0ZXJhYmxlKSB7XHJcbiAgICAgICAgaGFzRmlsdGVyYWJsZUNvbHVtbiA9IHRydWU7XHJcbiAgICAgICAgZHJvcGRvd25JdGVtcy5wdXNoKHtcclxuICAgICAgICAgIC4uLmNvbCxcclxuICAgICAgICAgIGFycmFuZ2U6ICdmaWx0ZXInLFxyXG4gICAgICAgICAgdGl0bGU6IGNvbC50aXRsZSxcclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgICBpZiAoY29sLmlzU29ydGFibGUpIHtcclxuICAgICAgICBoYXNTb3J0YWJsZUNvbHVtbiA9IHRydWU7XHJcbiAgICAgICAgc29ydGFibGVEcm9wZG93bkl0ZW1zLnB1c2goe1xyXG4gICAgICAgICAgLi4uY29sLFxyXG4gICAgICAgICAgYXJyYW5nZTogJ2FzY2VuZGluZycsXHJcbiAgICAgICAgICB0aXRsZTogY29sLnRpdGxlICsgJzogY3Jlc2NlbnRlJyxcclxuICAgICAgICB9KTtcclxuICAgICAgICBzb3J0YWJsZURyb3Bkb3duSXRlbXMucHVzaCh7XHJcbiAgICAgICAgICAuLi5jb2wsXHJcbiAgICAgICAgICBhcnJhbmdlOiAnZGVzY2VuZGluZycsXHJcbiAgICAgICAgICB0aXRsZTogY29sLnRpdGxlICsgJzogZGVjcmVzY2VudGUnLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChjb2wuaXNGaWx0ZXJhYmxlQnlEYXRlKSB7XHJcbiAgICAgICAgZHJvcGRvd25JdGVtcy5wdXNoKHtcclxuICAgICAgICAgIC4uLmNvbCxcclxuICAgICAgICAgIGFycmFuZ2U6ICdmaWx0ZXJCeURhdGUnLFxyXG4gICAgICAgICAgdGl0bGU6IGNvbC50aXRsZSArICc6IGZpbHRybyBwb3IgZGF0YScsXHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIHJldHVybiB7XHJcbiAgICAgIGRyb3Bkb3duSXRlbXMsXHJcbiAgICAgIHNvcnRhYmxlRHJvcGRvd25JdGVtcyxcclxuICAgICAgaGFzRmlsdGVyYWJsZUNvbHVtbixcclxuICAgICAgaGFzU29ydGFibGVDb2x1bW4sXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQWRpY2lvbmEgb3DDp8O1ZXMgZGUgZmlsdHJvIGN1c3RvbWl6YWRhc1xyXG4gICAqL1xyXG4gIGFkZEZpbHRlcmFibGVPcHRpb25zKGRyb3Bkb3duSXRlbXM6IGFueVtdLCBmaWx0ZXJhYmxlT3B0aW9uczogYW55W10pOiBhbnlbXSB7XHJcbiAgICBpZiAoXHJcbiAgICAgIGZpbHRlcmFibGVPcHRpb25zICYmXHJcbiAgICAgIEFycmF5LmlzQXJyYXkoZmlsdGVyYWJsZU9wdGlvbnMpICYmXHJcbiAgICAgIGZpbHRlcmFibGVPcHRpb25zLmxlbmd0aCA+IDBcclxuICAgICkge1xyXG4gICAgICBmaWx0ZXJhYmxlT3B0aW9ucy5mb3JFYWNoKChvcHRpb24pID0+XHJcbiAgICAgICAgZHJvcGRvd25JdGVtcy5wdXNoKHsgLi4ub3B0aW9uLCBhcnJhbmdlOiAnZXF1YWxzJyB9KVxyXG4gICAgICApO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGRyb3Bkb3duSXRlbXM7XHJcbiAgfVxyXG59XHJcbiJdfQ==
@@ -1,115 +0,0 @@
1
- import { Injectable } from '@angular/core';
2
- import * as i0 from "@angular/core";
3
- export class PaginationService {
4
- calculateNavigation(event, currentState) {
5
- const previousPageIndex = event.previousPageIndex ?? 0;
6
- const pageIndex = event.pageIndex;
7
- const eventPageSize = event.pageSize;
8
- const totalItems = currentState.totalItems;
9
- const currentComponentPageSize = currentState.pageSize;
10
- let navigationDirection = 'reload';
11
- let resetDocs = false;
12
- let originalPageSize = null;
13
- let shouldNavigate = true;
14
- let newClientPageIndex = pageIndex;
15
- let newPageNumber = currentState.currentPageNumber;
16
- const lastPageIndex = Math.max(0, Math.ceil(totalItems / eventPageSize) - 1);
17
- // Atualizar número da página
18
- if (previousPageIndex !== undefined && pageIndex > previousPageIndex) {
19
- newPageNumber++;
20
- }
21
- else if (previousPageIndex !== undefined &&
22
- pageIndex < previousPageIndex) {
23
- newPageNumber = Math.max(1, newPageNumber - 1);
24
- }
25
- // Mudança de tamanho de página
26
- if (eventPageSize !== currentComponentPageSize) {
27
- navigationDirection = 'forward';
28
- resetDocs = true;
29
- newClientPageIndex = 0;
30
- }
31
- // Indo para primeira página
32
- else if (pageIndex === 0 &&
33
- previousPageIndex !== undefined &&
34
- pageIndex < previousPageIndex) {
35
- navigationDirection = 'forward';
36
- newPageNumber = 1;
37
- newClientPageIndex = 0;
38
- resetDocs = true;
39
- }
40
- // Indo para última página (salto)
41
- else if (pageIndex === lastPageIndex &&
42
- previousPageIndex !== undefined &&
43
- pageIndex > previousPageIndex &&
44
- pageIndex - previousPageIndex > 1) {
45
- navigationDirection = 'backward';
46
- resetDocs = true;
47
- const itemsExpectedInLastPage = totalItems - lastPageIndex * eventPageSize;
48
- if (itemsExpectedInLastPage > 0 &&
49
- itemsExpectedInLastPage < eventPageSize) {
50
- originalPageSize = currentComponentPageSize;
51
- }
52
- }
53
- // Próxima página
54
- else if (previousPageIndex !== undefined && pageIndex > previousPageIndex) {
55
- navigationDirection = 'forward';
56
- resetDocs = false;
57
- }
58
- // Página anterior
59
- else if (previousPageIndex !== undefined && pageIndex < previousPageIndex) {
60
- navigationDirection = 'backward';
61
- resetDocs = false;
62
- }
63
- // Mesma página (reload)
64
- else if (previousPageIndex !== undefined &&
65
- pageIndex === previousPageIndex) {
66
- navigationDirection = 'reload';
67
- resetDocs = false;
68
- }
69
- // Caso inicial (primeira carga)
70
- else if (previousPageIndex === undefined && pageIndex === 0) {
71
- shouldNavigate = false;
72
- }
73
- // Caso não tratado
74
- else {
75
- console.warn('Condição de navegação não tratada:', event);
76
- shouldNavigate = false;
77
- }
78
- return {
79
- direction: navigationDirection,
80
- resetDocs,
81
- originalPageSize,
82
- shouldNavigate,
83
- newClientPageIndex,
84
- newPageNumber,
85
- };
86
- }
87
- /**
88
- * Calcula o número de itens esperados na última página
89
- */
90
- calculateLastPageItemCount(totalItems, pageSize) {
91
- const lastPageIndex = Math.max(0, Math.ceil(totalItems / pageSize) - 1);
92
- return totalItems - lastPageIndex * pageSize;
93
- }
94
- /**
95
- * Calcula o índice da última página
96
- */
97
- calculateLastPageIndex(totalItems, pageSize) {
98
- return Math.max(0, Math.ceil(totalItems / pageSize) - 1);
99
- }
100
- /**
101
- * Verifica se deve mostrar o botão de próxima página
102
- */
103
- shouldShowNextButton(hasNextPage, isPaginated) {
104
- return hasNextPage || !isPaginated;
105
- }
106
- }
107
- PaginationService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: PaginationService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
108
- PaginationService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: PaginationService, providedIn: 'root' });
109
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: PaginationService, decorators: [{
110
- type: Injectable,
111
- args: [{
112
- providedIn: 'root',
113
- }]
114
- }] });
115
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFnaW5hdGlvbi5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmctZmlyZWJhc2UtdGFibGUta3hwL3NyYy9saWIvc2VydmljZXMvcGFnaW5hdGlvbi5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7O0FBdUIzQyxNQUFNLE9BQU8saUJBQWlCO0lBQzVCLG1CQUFtQixDQUNqQixLQUFnQixFQUNoQixZQUE2QjtRQUU3QixNQUFNLGlCQUFpQixHQUFHLEtBQUssQ0FBQyxpQkFBaUIsSUFBSSxDQUFDLENBQUM7UUFDdkQsTUFBTSxTQUFTLEdBQUcsS0FBSyxDQUFDLFNBQVMsQ0FBQztRQUNsQyxNQUFNLGFBQWEsR0FBRyxLQUFLLENBQUMsUUFBUSxDQUFDO1FBQ3JDLE1BQU0sVUFBVSxHQUFHLFlBQVksQ0FBQyxVQUFVLENBQUM7UUFDM0MsTUFBTSx3QkFBd0IsR0FBRyxZQUFZLENBQUMsUUFBUSxDQUFDO1FBRXZELElBQUksbUJBQW1CLEdBQXNDLFFBQVEsQ0FBQztRQUN0RSxJQUFJLFNBQVMsR0FBRyxLQUFLLENBQUM7UUFDdEIsSUFBSSxnQkFBZ0IsR0FBa0IsSUFBSSxDQUFDO1FBQzNDLElBQUksY0FBYyxHQUFHLElBQUksQ0FBQztRQUMxQixJQUFJLGtCQUFrQixHQUFHLFNBQVMsQ0FBQztRQUNuQyxJQUFJLGFBQWEsR0FBRyxZQUFZLENBQUMsaUJBQWlCLENBQUM7UUFFbkQsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FDNUIsQ0FBQyxFQUNELElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxHQUFHLGFBQWEsQ0FBQyxHQUFHLENBQUMsQ0FDMUMsQ0FBQztRQUVGLDZCQUE2QjtRQUM3QixJQUFJLGlCQUFpQixLQUFLLFNBQVMsSUFBSSxTQUFTLEdBQUcsaUJBQWlCLEVBQUU7WUFDcEUsYUFB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Q0FBQyxJQUFJLENBQUMsVUFBVSxHQUFHLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQzNELENBQUM7SUFFRDs7T0FFRztJQUNILG9CQUFvQixDQUFDLFdBQW9CLEVBQUUsV0FBb0I7UUFDN0QsT0FBTyxXQUFXLElBQUksQ0FBQyxXQUFXLENBQUM7SUFDckMsQ0FBQzs7K0dBaElVLGlCQUFpQjttSEFBakIsaUJBQWlCLGNBRmhCLE1BQU07NEZBRVAsaUJBQWlCO2tCQUg3QixVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgUGFnZUV2ZW50IH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvcGFnaW5hdG9yJztcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgUGFnaW5hdGlvblN0YXRlIHtcclxuICBjdXJyZW50UGFnZU51bWJlcjogbnVtYmVyO1xyXG4gIGN1cnJlbnRDbGllbnRQYWdlSW5kZXg6IG51bWJlcjtcclxuICBwYWdlU2l6ZTogbnVtYmVyO1xyXG4gIHRvdGFsSXRlbXM6IG51bWJlcjtcclxuICBoYXNOZXh0UGFnZTogYm9vbGVhbjtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBOYXZpZ2F0aW9uUmVzdWx0IHtcclxuICBkaXJlY3Rpb246ICdmb3J3YXJkJyB8ICdiYWNrd2FyZCcgfCAncmVsb2FkJztcclxuICByZXNldERvY3M6IGJvb2xlYW47XHJcbiAgb3JpZ2luYWxQYWdlU2l6ZTogbnVtYmVyIHwgbnVsbDtcclxuICBzaG91bGROYXZpZ2F0ZTogYm9vbGVhbjtcclxuICBuZXdDbGllbnRQYWdlSW5kZXg6IG51bWJlcjtcclxuICBuZXdQYWdlTnVtYmVyOiBudW1iZXI7XHJcbn1cclxuXHJcbkBJbmplY3RhYmxlKHtcclxuICBwcm92aWRlZEluOiAncm9vdCcsXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBQYWdpbmF0aW9uU2VydmljZSB7XHJcbiAgY2FsY3VsYXRlTmF2aWdhdGlvbihcclxuICAgIGV2ZW50OiBQYWdlRXZlbnQsXHJcbiAgICBjdXJyZW50U3RhdGU6IFBhZ2luYXRpb25TdGF0ZVxyXG4gICk6IE5hdmlnYXRpb25SZXN1bHQge1xyXG4gICAgY29uc3QgcHJldmlvdXNQYWdlSW5kZXggPSBldmVudC5wcmV2aW91c1BhZ2VJbmRleCA/PyAwO1xyXG4gICAgY29uc3QgcGFnZUluZGV4ID0gZXZlbnQucGFnZUluZGV4O1xyXG4gICAgY29uc3QgZXZlbnRQYWdlU2l6ZSA9IGV2ZW50LnBhZ2VTaXplO1xyXG4gICAgY29uc3QgdG90YWxJdGVtcyA9IGN1cnJlbnRTdGF0ZS50b3RhbEl0ZW1zO1xyXG4gICAgY29uc3QgY3VycmVudENvbXBvbmVudFBhZ2VTaXplID0gY3VycmVudFN0YXRlLnBhZ2VTaXplO1xyXG5cclxuICAgIGxldCBuYXZpZ2F0aW9uRGlyZWN0aW9uOiAnZm9yd2FyZCcgfCAnYmFja3dhcmQnIHwgJ3JlbG9hZCcgPSAncmVsb2FkJztcclxuICAgIGxldCByZXNldERvY3MgPSBmYWxzZTtcclxuICAgIGxldCBvcmlnaW5hbFBhZ2VTaXplOiBudW1iZXIgfCBudWxsID0gbnVsbDtcclxuICAgIGxldCBzaG91bGROYXZpZ2F0ZSA9IHRydWU7XHJcbiAgICBsZXQgbmV3Q2xpZW50UGFnZUluZGV4ID0gcGFnZUluZGV4O1xyXG4gICAgbGV0IG5ld1BhZ2VOdW1iZXIgPSBjdXJyZW50U3RhdGUuY3VycmVudFBhZ2VOdW1iZXI7XHJcblxyXG4gICAgY29uc3QgbGFzdFBhZ2VJbmRleCA9IE1hdGgubWF4KFxyXG4gICAgICAwLFxyXG4gICAgICBNYXRoLmNlaWwodG90YWxJdGVtcyAvIGV2ZW50UGFnZVNpemUpIC0gMVxyXG4gICAgKTtcclxuXHJcbiAgICAvLyBBdHVhbGl6YXIgbsO6bWVybyBkYSBww6FnaW5hXHJcbiAgICBpZiAocHJldmlvdXNQYWdlSW5kZXggIT09IHVuZGVmaW5lZCAmJiBwYWdlSW5kZXggPiBwcmV2aW91c1BhZ2VJbmRleCkge1xyXG4gICAgICBuZXdQYWdlTnVtYmVyKys7XHJcbiAgICB9IGVsc2UgaWYgKFxyXG4gICAgICBwcmV2aW91c1BhZ2VJbmRleCAhPT0gdW5kZWZpbmVkICYmXHJcbiAgICAgIHBhZ2VJbmRleCA8IHByZXZpb3VzUGFnZUluZGV4XHJcbiAgICApIHtcclxuICAgICAgbmV3UGFnZU51bWJlciA9IE1hdGgubWF4KDEsIG5ld1BhZ2VOdW1iZXIgLSAxKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBNdWRhbsOnYSBkZSB0YW1hbmhvIGRlIHDDoWdpbmFcclxuICAgIGlmIChldmVudFBhZ2VTaXplICE9PSBjdXJyZW50Q29tcG9uZW50UGFnZVNpemUpIHtcclxuICAgICAgbmF2aWdhdGlvbkRpcmVjdGlvbiA9ICdmb3J3YXJkJztcclxuICAgICAgcmVzZXREb2NzID0gdHJ1ZTtcclxuICAgICAgbmV3Q2xpZW50UGFnZUluZGV4ID0gMDtcclxuICAgIH1cclxuICAgIC8vIEluZG8gcGFyYSBwcmltZWlyYSBww6FnaW5hXHJcbiAgICBlbHNlIGlmIChcclxuICAgICAgcGFnZUluZGV4ID09PSAwICYmXHJcbiAgICAgIHByZXZpb3VzUGFnZUluZGV4ICE9PSB1bmRlZmluZWQgJiZcclxuICAgICAgcGFnZUluZGV4IDwgcHJldmlvdXNQYWdlSW5kZXhcclxuICAgICkge1xyXG4gICAgICBuYXZpZ2F0aW9uRGlyZWN0aW9uID0gJ2ZvcndhcmQnO1xyXG4gICAgICBuZXdQYWdlTnVtYmVyID0gMTtcclxuICAgICAgbmV3Q2xpZW50UGFnZUluZGV4ID0gMDtcclxuICAgICAgcmVzZXREb2NzID0gdHJ1ZTtcclxuICAgIH1cclxuICAgIC8vIEluZG8gcGFyYSDDumx0aW1hIHDDoWdpbmEgKHNhbHRvKVxyXG4gICAgZWxzZSBpZiAoXHJcbiAgICAgIHBhZ2VJbmRleCA9PT0gbGFzdFBhZ2VJbmRleCAmJlxyXG4gICAgICBwcmV2aW91c1BhZ2VJbmRleCAhPT0gdW5kZWZpbmVkICYmXHJcbiAgICAgIHBhZ2VJbmRleCA+IHByZXZpb3VzUGFnZUluZGV4ICYmXHJcbiAgICAgIHBhZ2VJbmRleCAtIHByZXZpb3VzUGFnZUluZGV4ID4gMVxyXG4gICAgKSB7XHJcbiAgICAgIG5hdmlnYXRpb25EaXJlY3Rpb24gPSAnYmFja3dhcmQnO1xyXG4gICAgICByZXNldERvY3MgPSB0cnVlO1xyXG5cclxuICAgICAgY29uc3QgaXRlbXNFeHBlY3RlZEluTGFzdFBhZ2UgPVxyXG4gICAgICAgIHRvdGFsSXRlbXMgLSBsYXN0UGFnZUluZGV4ICogZXZlbnRQYWdlU2l6ZTtcclxuXHJcbiAgICAgIGlmIChcclxuICAgICAgICBpdGVtc0V4cGVjdGVkSW5MYXN0UGFnZSA+IDAgJiZcclxuICAgICAgICBpdGVtc0V4cGVjdGVkSW5MYXN0UGFnZSA8IGV2ZW50UGFnZVNpemVcclxuICAgICAgKSB7XHJcbiAgICAgICAgb3JpZ2luYWxQYWdlU2l6ZSA9IGN1cnJlbnRDb21wb25lbnRQYWdlU2l6ZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgLy8gUHLDs3hpbWEgcMOhZ2luYVxyXG4gICAgZWxzZSBpZiAocHJldmlvdXNQYWdlSW5kZXggIT09IHVuZGVmaW5lZCAmJiBwYWdlSW5kZXggPiBwcmV2aW91c1BhZ2VJbmRleCkge1xyXG4gICAgICBuYXZpZ2F0aW9uRGlyZWN0aW9uID0gJ2ZvcndhcmQnO1xyXG4gICAgICByZXNldERvY3MgPSBmYWxzZTtcclxuICAgIH1cclxuICAgIC8vIFDDoWdpbmEgYW50ZXJpb3JcclxuICAgIGVsc2UgaWYgKHByZXZpb3VzUGFnZUluZGV4ICE9PSB1bmRlZmluZWQgJiYgcGFnZUluZGV4IDwgcHJldmlvdXNQYWdlSW5kZXgpIHtcclxuICAgICAgbmF2aWdhdGlvbkRpcmVjdGlvbiA9ICdiYWNrd2FyZCc7XHJcbiAgICAgIHJlc2V0RG9jcyA9IGZhbHNlO1xyXG4gICAgfVxyXG4gICAgLy8gTWVzbWEgcMOhZ2luYSAocmVsb2FkKVxyXG4gICAgZWxzZSBpZiAoXHJcbiAgICAgIHByZXZpb3VzUGFnZUluZGV4ICE9PSB1bmRlZmluZWQgJiZcclxuICAgICAgcGFnZUluZGV4ID09PSBwcmV2aW91c1BhZ2VJbmRleFxyXG4gICAgKSB7XHJcbiAgICAgIG5hdmlnYXRpb25EaXJlY3Rpb24gPSAncmVsb2FkJztcclxuICAgICAgcmVzZXREb2NzID0gZmFsc2U7XHJcbiAgICB9XHJcbiAgICAvLyBDYXNvIGluaWNpYWwgKHByaW1laXJhIGNhcmdhKVxyXG4gICAgZWxzZSBpZiAocHJldmlvdXNQYWdlSW5kZXggPT09IHVuZGVmaW5lZCAmJiBwYWdlSW5kZXggPT09IDApIHtcclxuICAgICAgc2hvdWxkTmF2aWdhdGUgPSBmYWxzZTtcclxuICAgIH1cclxuICAgIC8vIENhc28gbsOjbyB0cmF0YWRvXHJcbiAgICBlbHNlIHtcclxuICAgICAgY29uc29sZS53YXJuKCdDb25kacOnw6NvIGRlIG5hdmVnYcOnw6NvIG7Do28gdHJhdGFkYTonLCBldmVudCk7XHJcbiAgICAgIHNob3VsZE5hdmlnYXRlID0gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHtcclxuICAgICAgZGlyZWN0aW9uOiBuYXZpZ2F0aW9uRGlyZWN0aW9uLFxyXG4gICAgICByZXNldERvY3MsXHJcbiAgICAgIG9yaWdpbmFsUGFnZVNpemUsXHJcbiAgICAgIHNob3VsZE5hdmlnYXRlLFxyXG4gICAgICBuZXdDbGllbnRQYWdlSW5kZXgsXHJcbiAgICAgIG5ld1BhZ2VOdW1iZXIsXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ2FsY3VsYSBvIG7Dum1lcm8gZGUgaXRlbnMgZXNwZXJhZG9zIG5hIMO6bHRpbWEgcMOhZ2luYVxyXG4gICAqL1xyXG4gIGNhbGN1bGF0ZUxhc3RQYWdlSXRlbUNvdW50KHRvdGFsSXRlbXM6IG51bWJlciwgcGFnZVNpemU6IG51bWJlcik6IG51bWJlciB7XHJcbiAgICBjb25zdCBsYXN0UGFnZUluZGV4ID0gTWF0aC5tYXgoMCwgTWF0aC5jZWlsKHRvdGFsSXRlbXMgLyBwYWdlU2l6ZSkgLSAxKTtcclxuICAgIHJldHVybiB0b3RhbEl0ZW1zIC0gbGFzdFBhZ2VJbmRleCAqIHBhZ2VTaXplO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ2FsY3VsYSBvIMOtbmRpY2UgZGEgw7psdGltYSBww6FnaW5hXHJcbiAgICovXHJcbiAgY2FsY3VsYXRlTGFzdFBhZ2VJbmRleCh0b3RhbEl0ZW1zOiBudW1iZXIsIHBhZ2VTaXplOiBudW1iZXIpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIE1hdGgubWF4KDAsIE1hdGguY2VpbCh0b3RhbEl0ZW1zIC8gcGFnZVNpemUpIC0gMSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBWZXJpZmljYSBzZSBkZXZlIG1vc3RyYXIgbyBib3TDo28gZGUgcHLDs3hpbWEgcMOhZ2luYVxyXG4gICAqL1xyXG4gIHNob3VsZFNob3dOZXh0QnV0dG9uKGhhc05leHRQYWdlOiBib29sZWFuLCBpc1BhZ2luYXRlZDogYm9vbGVhbik6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIGhhc05leHRQYWdlIHx8ICFpc1BhZ2luYXRlZDtcclxuICB9XHJcbn1cclxuIl19